{"version":3,"file":"main.js","sources":["../node_modules/three/build/three.module.js","../module/libs/ThinFilmFresnelMap.js","../module/ShaderUtils.js","../module/DicePreset.js","../module/DiceDefaultPresets.js","../module/DiceColors.js","../module/DiceModels.js","../node_modules/three/examples/jsm/loaders/GLTFLoader.js","../module/DiceFactory.js","../module/DiceSFX.js","../module/sfx/PlaySoundEpicFail.js","../module/sfx/PlaySoundEpicWin.js","../module/libs/three.proton.js","../module/sfx/PlayAnimationParticleSpiral.js","../module/sfx/PlayAnimationParticleSparkles.js","../module/sfx/PlayAnimationParticleVortex.js","../module/sfx/PlayAnimationBright.js","../module/sfx/PlayAnimationDark.js","../module/sfx/PlayAnimationThormund.js","../module/sfx/PlayAnimationImpact.js","../module/DiceSFXManager.js","../module/sfx/PlayConfettiStrength1.js","../module/sfx/PlayConfettiStrength2.js","../module/sfx/PlayConfettiStrength3.js","../module/sfx/PlaySoundCustom.js","../module/sfx/PlayMacro.js","../node_modules/three/examples/jsm/loaders/RGBELoader.js","../node_modules/three/examples/jsm/shaders/CopyShader.js","../node_modules/three/examples/jsm/postprocessing/Pass.js","../node_modules/three/examples/jsm/postprocessing/ShaderPass.js","../node_modules/three/examples/jsm/postprocessing/MaskPass.js","../node_modules/three/examples/jsm/postprocessing/EffectComposer.js","../node_modules/three/examples/jsm/postprocessing/RenderPass.js","../node_modules/three/examples/jsm/shaders/SMAAShader.js","../module/libs/SMAAPass.js","../node_modules/three/examples/jsm/shaders/GammaCorrectionShader.js","../node_modules/three/examples/jsm/shaders/LuminosityHighPassShader.js","../module/libs/TransparentUnrealBloomPass.js","../module/DiceBox.js","../module/DiceNotation.js","../module/Accumulator.js","../module/Utils.js","../module/tours/DiceTour.js","../module/tours/DiceTourMain.js","../module/Dice3D.js","../module/DiceConfig.js","../module/RollableAreaConfig.js","../module/main.js"],"sourcesContent":["/**\n * @license\n * Copyright 2010-2022 Three.js Authors\n * SPDX-License-Identifier: MIT\n */\nconst REVISION = '143';\nconst MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2, ROTATE: 0, DOLLY: 1, PAN: 2 };\nconst TOUCH = { ROTATE: 0, PAN: 1, DOLLY_PAN: 2, DOLLY_ROTATE: 3 };\nconst CullFaceNone = 0;\nconst CullFaceBack = 1;\nconst CullFaceFront = 2;\nconst CullFaceFrontBack = 3;\nconst BasicShadowMap = 0;\nconst PCFShadowMap = 1;\nconst PCFSoftShadowMap = 2;\nconst VSMShadowMap = 3;\nconst FrontSide = 0;\nconst BackSide = 1;\nconst DoubleSide = 2;\nconst FlatShading = 1;\nconst SmoothShading = 2;\nconst NoBlending = 0;\nconst NormalBlending = 1;\nconst AdditiveBlending = 2;\nconst SubtractiveBlending = 3;\nconst MultiplyBlending = 4;\nconst CustomBlending = 5;\nconst AddEquation = 100;\nconst SubtractEquation = 101;\nconst ReverseSubtractEquation = 102;\nconst MinEquation = 103;\nconst MaxEquation = 104;\nconst ZeroFactor = 200;\nconst OneFactor = 201;\nconst SrcColorFactor = 202;\nconst OneMinusSrcColorFactor = 203;\nconst SrcAlphaFactor = 204;\nconst OneMinusSrcAlphaFactor = 205;\nconst DstAlphaFactor = 206;\nconst OneMinusDstAlphaFactor = 207;\nconst DstColorFactor = 208;\nconst OneMinusDstColorFactor = 209;\nconst SrcAlphaSaturateFactor = 210;\nconst NeverDepth = 0;\nconst AlwaysDepth = 1;\nconst LessDepth = 2;\nconst LessEqualDepth = 3;\nconst EqualDepth = 4;\nconst GreaterEqualDepth = 5;\nconst GreaterDepth = 6;\nconst NotEqualDepth = 7;\nconst MultiplyOperation = 0;\nconst MixOperation = 1;\nconst AddOperation = 2;\nconst NoToneMapping = 0;\nconst LinearToneMapping = 1;\nconst ReinhardToneMapping = 2;\nconst CineonToneMapping = 3;\nconst ACESFilmicToneMapping = 4;\nconst CustomToneMapping = 5;\n\nconst UVMapping = 300;\nconst CubeReflectionMapping = 301;\nconst CubeRefractionMapping = 302;\nconst EquirectangularReflectionMapping = 303;\nconst EquirectangularRefractionMapping = 304;\nconst CubeUVReflectionMapping = 306;\nconst RepeatWrapping = 1000;\nconst ClampToEdgeWrapping = 1001;\nconst MirroredRepeatWrapping = 1002;\nconst NearestFilter = 1003;\nconst NearestMipmapNearestFilter = 1004;\nconst NearestMipMapNearestFilter = 1004;\nconst NearestMipmapLinearFilter = 1005;\nconst NearestMipMapLinearFilter = 1005;\nconst LinearFilter = 1006;\nconst LinearMipmapNearestFilter = 1007;\nconst LinearMipMapNearestFilter = 1007;\nconst LinearMipmapLinearFilter = 1008;\nconst LinearMipMapLinearFilter = 1008;\nconst UnsignedByteType = 1009;\nconst ByteType = 1010;\nconst ShortType = 1011;\nconst UnsignedShortType = 1012;\nconst IntType = 1013;\nconst UnsignedIntType = 1014;\nconst FloatType = 1015;\nconst HalfFloatType = 1016;\nconst UnsignedShort4444Type = 1017;\nconst UnsignedShort5551Type = 1018;\nconst UnsignedInt248Type = 1020;\nconst AlphaFormat = 1021;\nconst RGBFormat = 1022;\nconst RGBAFormat = 1023;\nconst LuminanceFormat = 1024;\nconst LuminanceAlphaFormat = 1025;\nconst DepthFormat = 1026;\nconst DepthStencilFormat = 1027;\nconst RedFormat = 1028;\nconst RedIntegerFormat = 1029;\nconst RGFormat = 1030;\nconst RGIntegerFormat = 1031;\nconst RGBAIntegerFormat = 1033;\n\nconst RGB_S3TC_DXT1_Format = 33776;\nconst RGBA_S3TC_DXT1_Format = 33777;\nconst RGBA_S3TC_DXT3_Format = 33778;\nconst RGBA_S3TC_DXT5_Format = 33779;\nconst RGB_PVRTC_4BPPV1_Format = 35840;\nconst RGB_PVRTC_2BPPV1_Format = 35841;\nconst RGBA_PVRTC_4BPPV1_Format = 35842;\nconst RGBA_PVRTC_2BPPV1_Format = 35843;\nconst RGB_ETC1_Format = 36196;\nconst RGB_ETC2_Format = 37492;\nconst RGBA_ETC2_EAC_Format = 37496;\nconst RGBA_ASTC_4x4_Format = 37808;\nconst RGBA_ASTC_5x4_Format = 37809;\nconst RGBA_ASTC_5x5_Format = 37810;\nconst RGBA_ASTC_6x5_Format = 37811;\nconst RGBA_ASTC_6x6_Format = 37812;\nconst RGBA_ASTC_8x5_Format = 37813;\nconst RGBA_ASTC_8x6_Format = 37814;\nconst RGBA_ASTC_8x8_Format = 37815;\nconst RGBA_ASTC_10x5_Format = 37816;\nconst RGBA_ASTC_10x6_Format = 37817;\nconst RGBA_ASTC_10x8_Format = 37818;\nconst RGBA_ASTC_10x10_Format = 37819;\nconst RGBA_ASTC_12x10_Format = 37820;\nconst RGBA_ASTC_12x12_Format = 37821;\nconst RGBA_BPTC_Format = 36492;\nconst LoopOnce = 2200;\nconst LoopRepeat = 2201;\nconst LoopPingPong = 2202;\nconst InterpolateDiscrete = 2300;\nconst InterpolateLinear = 2301;\nconst InterpolateSmooth = 2302;\nconst ZeroCurvatureEnding = 2400;\nconst ZeroSlopeEnding = 2401;\nconst WrapAroundEnding = 2402;\nconst NormalAnimationBlendMode = 2500;\nconst AdditiveAnimationBlendMode = 2501;\nconst TrianglesDrawMode = 0;\nconst TriangleStripDrawMode = 1;\nconst TriangleFanDrawMode = 2;\nconst LinearEncoding = 3000;\nconst sRGBEncoding = 3001;\nconst BasicDepthPacking = 3200;\nconst RGBADepthPacking = 3201;\nconst TangentSpaceNormalMap = 0;\nconst ObjectSpaceNormalMap = 1;\n\n// Color space string identifiers, matching CSS Color Module Level 4 and WebGPU names where available.\nconst NoColorSpace = '';\nconst SRGBColorSpace = 'srgb';\nconst LinearSRGBColorSpace = 'srgb-linear';\n\nconst ZeroStencilOp = 0;\nconst KeepStencilOp = 7680;\nconst ReplaceStencilOp = 7681;\nconst IncrementStencilOp = 7682;\nconst DecrementStencilOp = 7683;\nconst IncrementWrapStencilOp = 34055;\nconst DecrementWrapStencilOp = 34056;\nconst InvertStencilOp = 5386;\n\nconst NeverStencilFunc = 512;\nconst LessStencilFunc = 513;\nconst EqualStencilFunc = 514;\nconst LessEqualStencilFunc = 515;\nconst GreaterStencilFunc = 516;\nconst NotEqualStencilFunc = 517;\nconst GreaterEqualStencilFunc = 518;\nconst AlwaysStencilFunc = 519;\n\nconst StaticDrawUsage = 35044;\nconst DynamicDrawUsage = 35048;\nconst StreamDrawUsage = 35040;\nconst StaticReadUsage = 35045;\nconst DynamicReadUsage = 35049;\nconst StreamReadUsage = 35041;\nconst StaticCopyUsage = 35046;\nconst DynamicCopyUsage = 35050;\nconst StreamCopyUsage = 35042;\n\nconst GLSL1 = '100';\nconst GLSL3 = '300 es';\n\nconst _SRGBAFormat = 1035; // fallback for WebGL 1\n\n/**\n * https://github.com/mrdoob/eventdispatcher.js/\n */\n\nclass EventDispatcher {\n\n\taddEventListener( type, listener ) {\n\n\t\tif ( this._listeners === undefined ) this._listeners = {};\n\n\t\tconst listeners = this._listeners;\n\n\t\tif ( listeners[ type ] === undefined ) {\n\n\t\t\tlisteners[ type ] = [];\n\n\t\t}\n\n\t\tif ( listeners[ type ].indexOf( listener ) === - 1 ) {\n\n\t\t\tlisteners[ type ].push( listener );\n\n\t\t}\n\n\t}\n\n\thasEventListener( type, listener ) {\n\n\t\tif ( this._listeners === undefined ) return false;\n\n\t\tconst listeners = this._listeners;\n\n\t\treturn listeners[ type ] !== undefined && listeners[ type ].indexOf( listener ) !== - 1;\n\n\t}\n\n\tremoveEventListener( type, listener ) {\n\n\t\tif ( this._listeners === undefined ) return;\n\n\t\tconst listeners = this._listeners;\n\t\tconst listenerArray = listeners[ type ];\n\n\t\tif ( listenerArray !== undefined ) {\n\n\t\t\tconst index = listenerArray.indexOf( listener );\n\n\t\t\tif ( index !== - 1 ) {\n\n\t\t\t\tlistenerArray.splice( index, 1 );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tdispatchEvent( event ) {\n\n\t\tif ( this._listeners === undefined ) return;\n\n\t\tconst listeners = this._listeners;\n\t\tconst listenerArray = listeners[ event.type ];\n\n\t\tif ( listenerArray !== undefined ) {\n\n\t\t\tevent.target = this;\n\n\t\t\t// Make a copy, in case listeners are removed while iterating.\n\t\t\tconst array = listenerArray.slice( 0 );\n\n\t\t\tfor ( let i = 0, l = array.length; i < l; i ++ ) {\n\n\t\t\t\tarray[ i ].call( this, event );\n\n\t\t\t}\n\n\t\t\tevent.target = null;\n\n\t\t}\n\n\t}\n\n}\n\nconst _lut = [ '00', '01', '02', '03', '04', '05', '06', '07', '08', '09', '0a', '0b', '0c', '0d', '0e', '0f', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '1a', '1b', '1c', '1d', '1e', '1f', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '2a', '2b', '2c', '2d', '2e', '2f', '30', '31', '32', '33', '34', '35', '36', '37', '38', '39', '3a', '3b', '3c', '3d', '3e', '3f', '40', '41', '42', '43', '44', '45', '46', '47', '48', '49', '4a', '4b', '4c', '4d', '4e', '4f', '50', '51', '52', '53', '54', '55', '56', '57', '58', '59', '5a', '5b', '5c', '5d', '5e', '5f', '60', '61', '62', '63', '64', '65', '66', '67', '68', '69', '6a', '6b', '6c', '6d', '6e', '6f', '70', '71', '72', '73', '74', '75', '76', '77', '78', '79', '7a', '7b', '7c', '7d', '7e', '7f', '80', '81', '82', '83', '84', '85', '86', '87', '88', '89', '8a', '8b', '8c', '8d', '8e', '8f', '90', '91', '92', '93', '94', '95', '96', '97', '98', '99', '9a', '9b', '9c', '9d', '9e', '9f', 'a0', 'a1', 'a2', 'a3', 'a4', 'a5', 'a6', 'a7', 'a8', 'a9', 'aa', 'ab', 'ac', 'ad', 'ae', 'af', 'b0', 'b1', 'b2', 'b3', 'b4', 'b5', 'b6', 'b7', 'b8', 'b9', 'ba', 'bb', 'bc', 'bd', 'be', 'bf', 'c0', 'c1', 'c2', 'c3', 'c4', 'c5', 'c6', 'c7', 'c8', 'c9', 'ca', 'cb', 'cc', 'cd', 'ce', 'cf', 'd0', 'd1', 'd2', 'd3', 'd4', 'd5', 'd6', 'd7', 'd8', 'd9', 'da', 'db', 'dc', 'dd', 'de', 'df', 'e0', 'e1', 'e2', 'e3', 'e4', 'e5', 'e6', 'e7', 'e8', 'e9', 'ea', 'eb', 'ec', 'ed', 'ee', 'ef', 'f0', 'f1', 'f2', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9', 'fa', 'fb', 'fc', 'fd', 'fe', 'ff' ];\n\nlet _seed = 1234567;\n\n\nconst DEG2RAD = Math.PI / 180;\nconst RAD2DEG = 180 / Math.PI;\n\n// http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/21963136#21963136\nfunction generateUUID() {\n\n\tconst d0 = Math.random() * 0xffffffff | 0;\n\tconst d1 = Math.random() * 0xffffffff | 0;\n\tconst d2 = Math.random() * 0xffffffff | 0;\n\tconst d3 = Math.random() * 0xffffffff | 0;\n\tconst uuid = _lut[ d0 & 0xff ] + _lut[ d0 >> 8 & 0xff ] + _lut[ d0 >> 16 & 0xff ] + _lut[ d0 >> 24 & 0xff ] + '-' +\n\t\t\t_lut[ d1 & 0xff ] + _lut[ d1 >> 8 & 0xff ] + '-' + _lut[ d1 >> 16 & 0x0f | 0x40 ] + _lut[ d1 >> 24 & 0xff ] + '-' +\n\t\t\t_lut[ d2 & 0x3f | 0x80 ] + _lut[ d2 >> 8 & 0xff ] + '-' + _lut[ d2 >> 16 & 0xff ] + _lut[ d2 >> 24 & 0xff ] +\n\t\t\t_lut[ d3 & 0xff ] + _lut[ d3 >> 8 & 0xff ] + _lut[ d3 >> 16 & 0xff ] + _lut[ d3 >> 24 & 0xff ];\n\n\t// .toLowerCase() here flattens concatenated strings to save heap memory space.\n\treturn uuid.toLowerCase();\n\n}\n\nfunction clamp( value, min, max ) {\n\n\treturn Math.max( min, Math.min( max, value ) );\n\n}\n\n// compute euclidean modulo of m % n\n// https://en.wikipedia.org/wiki/Modulo_operation\nfunction euclideanModulo( n, m ) {\n\n\treturn ( ( n % m ) + m ) % m;\n\n}\n\n// Linear mapping from range to range \nfunction mapLinear( x, a1, a2, b1, b2 ) {\n\n\treturn b1 + ( x - a1 ) * ( b2 - b1 ) / ( a2 - a1 );\n\n}\n\n// https://www.gamedev.net/tutorials/programming/general-and-gameplay-programming/inverse-lerp-a-super-useful-yet-often-overlooked-function-r5230/\nfunction inverseLerp( x, y, value ) {\n\n\tif ( x !== y ) {\n\n\t\treturn ( value - x ) / ( y - x );\n\n\t} else {\n\n\t\treturn 0;\n\n\t}\n\n}\n\n// https://en.wikipedia.org/wiki/Linear_interpolation\nfunction lerp( x, y, t ) {\n\n\treturn ( 1 - t ) * x + t * y;\n\n}\n\n// http://www.rorydriscoll.com/2016/03/07/frame-rate-independent-damping-using-lerp/\nfunction damp( x, y, lambda, dt ) {\n\n\treturn lerp( x, y, 1 - Math.exp( - lambda * dt ) );\n\n}\n\n// https://www.desmos.com/calculator/vcsjnyz7x4\nfunction pingpong( x, length = 1 ) {\n\n\treturn length - Math.abs( euclideanModulo( x, length * 2 ) - length );\n\n}\n\n// http://en.wikipedia.org/wiki/Smoothstep\nfunction smoothstep( x, min, max ) {\n\n\tif ( x <= min ) return 0;\n\tif ( x >= max ) return 1;\n\n\tx = ( x - min ) / ( max - min );\n\n\treturn x * x * ( 3 - 2 * x );\n\n}\n\nfunction smootherstep( x, min, max ) {\n\n\tif ( x <= min ) return 0;\n\tif ( x >= max ) return 1;\n\n\tx = ( x - min ) / ( max - min );\n\n\treturn x * x * x * ( x * ( x * 6 - 15 ) + 10 );\n\n}\n\n// Random integer from interval\nfunction randInt( low, high ) {\n\n\treturn low + Math.floor( Math.random() * ( high - low + 1 ) );\n\n}\n\n// Random float from interval\nfunction randFloat( low, high ) {\n\n\treturn low + Math.random() * ( high - low );\n\n}\n\n// Random float from <-range/2, range/2> interval\nfunction randFloatSpread( range ) {\n\n\treturn range * ( 0.5 - Math.random() );\n\n}\n\n// Deterministic pseudo-random float in the interval [ 0, 1 ]\nfunction seededRandom( s ) {\n\n\tif ( s !== undefined ) _seed = s;\n\n\t// Mulberry32 generator\n\n\tlet t = _seed += 0x6D2B79F5;\n\n\tt = Math.imul( t ^ t >>> 15, t | 1 );\n\n\tt ^= t + Math.imul( t ^ t >>> 7, t | 61 );\n\n\treturn ( ( t ^ t >>> 14 ) >>> 0 ) / 4294967296;\n\n}\n\nfunction degToRad( degrees ) {\n\n\treturn degrees * DEG2RAD;\n\n}\n\nfunction radToDeg( radians ) {\n\n\treturn radians * RAD2DEG;\n\n}\n\nfunction isPowerOfTwo( value ) {\n\n\treturn ( value & ( value - 1 ) ) === 0 && value !== 0;\n\n}\n\nfunction ceilPowerOfTwo( value ) {\n\n\treturn Math.pow( 2, Math.ceil( Math.log( value ) / Math.LN2 ) );\n\n}\n\nfunction floorPowerOfTwo( value ) {\n\n\treturn Math.pow( 2, Math.floor( Math.log( value ) / Math.LN2 ) );\n\n}\n\nfunction setQuaternionFromProperEuler( q, a, b, c, order ) {\n\n\t// Intrinsic Proper Euler Angles - see https://en.wikipedia.org/wiki/Euler_angles\n\n\t// rotations are applied to the axes in the order specified by 'order'\n\t// rotation by angle 'a' is applied first, then by angle 'b', then by angle 'c'\n\t// angles are in radians\n\n\tconst cos = Math.cos;\n\tconst sin = Math.sin;\n\n\tconst c2 = cos( b / 2 );\n\tconst s2 = sin( b / 2 );\n\n\tconst c13 = cos( ( a + c ) / 2 );\n\tconst s13 = sin( ( a + c ) / 2 );\n\n\tconst c1_3 = cos( ( a - c ) / 2 );\n\tconst s1_3 = sin( ( a - c ) / 2 );\n\n\tconst c3_1 = cos( ( c - a ) / 2 );\n\tconst s3_1 = sin( ( c - a ) / 2 );\n\n\tswitch ( order ) {\n\n\t\tcase 'XYX':\n\t\t\tq.set( c2 * s13, s2 * c1_3, s2 * s1_3, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'YZY':\n\t\t\tq.set( s2 * s1_3, c2 * s13, s2 * c1_3, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'ZXZ':\n\t\t\tq.set( s2 * c1_3, s2 * s1_3, c2 * s13, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'XZX':\n\t\t\tq.set( c2 * s13, s2 * s3_1, s2 * c3_1, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'YXY':\n\t\t\tq.set( s2 * c3_1, c2 * s13, s2 * s3_1, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'ZYZ':\n\t\t\tq.set( s2 * s3_1, s2 * c3_1, c2 * s13, c2 * c13 );\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tconsole.warn( 'THREE.MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: ' + order );\n\n\t}\n\n}\n\nfunction denormalize$1( value, array ) {\n\n\tswitch ( array.constructor ) {\n\n\t\tcase Float32Array:\n\n\t\t\treturn value;\n\n\t\tcase Uint16Array:\n\n\t\t\treturn value / 65535.0;\n\n\t\tcase Uint8Array:\n\n\t\t\treturn value / 255.0;\n\n\t\tcase Int16Array:\n\n\t\t\treturn Math.max( value / 32767.0, - 1.0 );\n\n\t\tcase Int8Array:\n\n\t\t\treturn Math.max( value / 127.0, - 1.0 );\n\n\t\tdefault:\n\n\t\t\tthrow new Error( 'Invalid component type.' );\n\n\t}\n\n}\n\nfunction normalize( value, array ) {\n\n\tswitch ( array.constructor ) {\n\n\t\tcase Float32Array:\n\n\t\t\treturn value;\n\n\t\tcase Uint16Array:\n\n\t\t\treturn Math.round( value * 65535.0 );\n\n\t\tcase Uint8Array:\n\n\t\t\treturn Math.round( value * 255.0 );\n\n\t\tcase Int16Array:\n\n\t\t\treturn Math.round( value * 32767.0 );\n\n\t\tcase Int8Array:\n\n\t\t\treturn Math.round( value * 127.0 );\n\n\t\tdefault:\n\n\t\t\tthrow new Error( 'Invalid component type.' );\n\n\t}\n\n}\n\nvar MathUtils = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tDEG2RAD: DEG2RAD,\n\tRAD2DEG: RAD2DEG,\n\tgenerateUUID: generateUUID,\n\tclamp: clamp,\n\teuclideanModulo: euclideanModulo,\n\tmapLinear: mapLinear,\n\tinverseLerp: inverseLerp,\n\tlerp: lerp,\n\tdamp: damp,\n\tpingpong: pingpong,\n\tsmoothstep: smoothstep,\n\tsmootherstep: smootherstep,\n\trandInt: randInt,\n\trandFloat: randFloat,\n\trandFloatSpread: randFloatSpread,\n\tseededRandom: seededRandom,\n\tdegToRad: degToRad,\n\tradToDeg: radToDeg,\n\tisPowerOfTwo: isPowerOfTwo,\n\tceilPowerOfTwo: ceilPowerOfTwo,\n\tfloorPowerOfTwo: floorPowerOfTwo,\n\tsetQuaternionFromProperEuler: setQuaternionFromProperEuler,\n\tnormalize: normalize,\n\tdenormalize: denormalize$1\n});\n\nclass Vector2 {\n\n\tconstructor( x = 0, y = 0 ) {\n\n\t\tVector2.prototype.isVector2 = true;\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\n\t}\n\n\tget width() {\n\n\t\treturn this.x;\n\n\t}\n\n\tset width( value ) {\n\n\t\tthis.x = value;\n\n\t}\n\n\tget height() {\n\n\t\treturn this.y;\n\n\t}\n\n\tset height( value ) {\n\n\t\tthis.y = value;\n\n\t}\n\n\tset( x, y ) {\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\tsetScalar( scalar ) {\n\n\t\tthis.x = scalar;\n\t\tthis.y = scalar;\n\n\t\treturn this;\n\n\t}\n\n\tsetX( x ) {\n\n\t\tthis.x = x;\n\n\t\treturn this;\n\n\t}\n\n\tsetY( y ) {\n\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\tsetComponent( index, value ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: this.x = value; break;\n\t\t\tcase 1: this.y = value; break;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tgetComponent( index ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: return this.x;\n\t\t\tcase 1: return this.y;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this.x, this.y );\n\n\t}\n\n\tcopy( v ) {\n\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\n\t\treturn this;\n\n\t}\n\n\tadd( v ) {\n\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\n\t\treturn this;\n\n\t}\n\n\taddScalar( s ) {\n\n\t\tthis.x += s;\n\t\tthis.y += s;\n\n\t\treturn this;\n\n\t}\n\n\taddVectors( a, b ) {\n\n\t\tthis.x = a.x + b.x;\n\t\tthis.y = a.y + b.y;\n\n\t\treturn this;\n\n\t}\n\n\taddScaledVector( v, s ) {\n\n\t\tthis.x += v.x * s;\n\t\tthis.y += v.y * s;\n\n\t\treturn this;\n\n\t}\n\n\tsub( v ) {\n\n\t\tthis.x -= v.x;\n\t\tthis.y -= v.y;\n\n\t\treturn this;\n\n\t}\n\n\tsubScalar( s ) {\n\n\t\tthis.x -= s;\n\t\tthis.y -= s;\n\n\t\treturn this;\n\n\t}\n\n\tsubVectors( a, b ) {\n\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\n\t\treturn this;\n\n\t}\n\n\tmultiply( v ) {\n\n\t\tthis.x *= v.x;\n\t\tthis.y *= v.y;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyScalar( scalar ) {\n\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\n\t\treturn this;\n\n\t}\n\n\tdivide( v ) {\n\n\t\tthis.x /= v.x;\n\t\tthis.y /= v.y;\n\n\t\treturn this;\n\n\t}\n\n\tdivideScalar( scalar ) {\n\n\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t}\n\n\tapplyMatrix3( m ) {\n\n\t\tconst x = this.x, y = this.y;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ];\n\t\tthis.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ];\n\n\t\treturn this;\n\n\t}\n\n\tmin( v ) {\n\n\t\tthis.x = Math.min( this.x, v.x );\n\t\tthis.y = Math.min( this.y, v.y );\n\n\t\treturn this;\n\n\t}\n\n\tmax( v ) {\n\n\t\tthis.x = Math.max( this.x, v.x );\n\t\tthis.y = Math.max( this.y, v.y );\n\n\t\treturn this;\n\n\t}\n\n\tclamp( min, max ) {\n\n\t\t// assumes min < max, componentwise\n\n\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\n\t\treturn this;\n\n\t}\n\n\tclampScalar( minVal, maxVal ) {\n\n\t\tthis.x = Math.max( minVal, Math.min( maxVal, this.x ) );\n\t\tthis.y = Math.max( minVal, Math.min( maxVal, this.y ) );\n\n\t\treturn this;\n\n\t}\n\n\tclampLength( min, max ) {\n\n\t\tconst length = this.length();\n\n\t\treturn this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) );\n\n\t}\n\n\tfloor() {\n\n\t\tthis.x = Math.floor( this.x );\n\t\tthis.y = Math.floor( this.y );\n\n\t\treturn this;\n\n\t}\n\n\tceil() {\n\n\t\tthis.x = Math.ceil( this.x );\n\t\tthis.y = Math.ceil( this.y );\n\n\t\treturn this;\n\n\t}\n\n\tround() {\n\n\t\tthis.x = Math.round( this.x );\n\t\tthis.y = Math.round( this.y );\n\n\t\treturn this;\n\n\t}\n\n\troundToZero() {\n\n\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\n\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\n\n\t\treturn this;\n\n\t}\n\n\tnegate() {\n\n\t\tthis.x = - this.x;\n\t\tthis.y = - this.y;\n\n\t\treturn this;\n\n\t}\n\n\tdot( v ) {\n\n\t\treturn this.x * v.x + this.y * v.y;\n\n\t}\n\n\tcross( v ) {\n\n\t\treturn this.x * v.y - this.y * v.x;\n\n\t}\n\n\tlengthSq() {\n\n\t\treturn this.x * this.x + this.y * this.y;\n\n\t}\n\n\tlength() {\n\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y );\n\n\t}\n\n\tmanhattanLength() {\n\n\t\treturn Math.abs( this.x ) + Math.abs( this.y );\n\n\t}\n\n\tnormalize() {\n\n\t\treturn this.divideScalar( this.length() || 1 );\n\n\t}\n\n\tangle() {\n\n\t\t// computes the angle in radians with respect to the positive x-axis\n\n\t\tconst angle = Math.atan2( - this.y, - this.x ) + Math.PI;\n\n\t\treturn angle;\n\n\t}\n\n\tdistanceTo( v ) {\n\n\t\treturn Math.sqrt( this.distanceToSquared( v ) );\n\n\t}\n\n\tdistanceToSquared( v ) {\n\n\t\tconst dx = this.x - v.x, dy = this.y - v.y;\n\t\treturn dx * dx + dy * dy;\n\n\t}\n\n\tmanhattanDistanceTo( v ) {\n\n\t\treturn Math.abs( this.x - v.x ) + Math.abs( this.y - v.y );\n\n\t}\n\n\tsetLength( length ) {\n\n\t\treturn this.normalize().multiplyScalar( length );\n\n\t}\n\n\tlerp( v, alpha ) {\n\n\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\tthis.y += ( v.y - this.y ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tlerpVectors( v1, v2, alpha ) {\n\n\t\tthis.x = v1.x + ( v2.x - v1.x ) * alpha;\n\t\tthis.y = v1.y + ( v2.y - v1.y ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tequals( v ) {\n\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) );\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.x = array[ offset ];\n\t\tthis.y = array[ offset + 1 ];\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.x;\n\t\tarray[ offset + 1 ] = this.y;\n\n\t\treturn array;\n\n\t}\n\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis.x = attribute.getX( index );\n\t\tthis.y = attribute.getY( index );\n\n\t\treturn this;\n\n\t}\n\n\trotateAround( center, angle ) {\n\n\t\tconst c = Math.cos( angle ), s = Math.sin( angle );\n\n\t\tconst x = this.x - center.x;\n\t\tconst y = this.y - center.y;\n\n\t\tthis.x = x * c - y * s + center.x;\n\t\tthis.y = x * s + y * c + center.y;\n\n\t\treturn this;\n\n\t}\n\n\trandom() {\n\n\t\tthis.x = Math.random();\n\t\tthis.y = Math.random();\n\n\t\treturn this;\n\n\t}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this.x;\n\t\tyield this.y;\n\n\t}\n\n}\n\nclass Matrix3 {\n\n\tconstructor() {\n\n\t\tMatrix3.prototype.isMatrix3 = true;\n\n\t\tthis.elements = [\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}\n\n\tset( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] = n11; te[ 1 ] = n21; te[ 2 ] = n31;\n\t\tte[ 3 ] = n12; te[ 4 ] = n22; te[ 5 ] = n32;\n\t\tte[ 6 ] = n13; te[ 7 ] = n23; te[ 8 ] = n33;\n\n\t\treturn this;\n\n\t}\n\n\tidentity() {\n\n\t\tthis.set(\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\treturn this;\n\n\t}\n\n\tcopy( m ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = m.elements;\n\n\t\tte[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ];\n\t\tte[ 3 ] = me[ 3 ]; te[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ];\n\t\tte[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ]; te[ 8 ] = me[ 8 ];\n\n\t\treturn this;\n\n\t}\n\n\textractBasis( xAxis, yAxis, zAxis ) {\n\n\t\txAxis.setFromMatrix3Column( this, 0 );\n\t\tyAxis.setFromMatrix3Column( this, 1 );\n\t\tzAxis.setFromMatrix3Column( this, 2 );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromMatrix4( m ) {\n\n\t\tconst me = m.elements;\n\n\t\tthis.set(\n\n\t\t\tme[ 0 ], me[ 4 ], me[ 8 ],\n\t\t\tme[ 1 ], me[ 5 ], me[ 9 ],\n\t\t\tme[ 2 ], me[ 6 ], me[ 10 ]\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmultiply( m ) {\n\n\t\treturn this.multiplyMatrices( this, m );\n\n\t}\n\n\tpremultiply( m ) {\n\n\t\treturn this.multiplyMatrices( m, this );\n\n\t}\n\n\tmultiplyMatrices( a, b ) {\n\n\t\tconst ae = a.elements;\n\t\tconst be = b.elements;\n\t\tconst te = this.elements;\n\n\t\tconst a11 = ae[ 0 ], a12 = ae[ 3 ], a13 = ae[ 6 ];\n\t\tconst a21 = ae[ 1 ], a22 = ae[ 4 ], a23 = ae[ 7 ];\n\t\tconst a31 = ae[ 2 ], a32 = ae[ 5 ], a33 = ae[ 8 ];\n\n\t\tconst b11 = be[ 0 ], b12 = be[ 3 ], b13 = be[ 6 ];\n\t\tconst b21 = be[ 1 ], b22 = be[ 4 ], b23 = be[ 7 ];\n\t\tconst b31 = be[ 2 ], b32 = be[ 5 ], b33 = be[ 8 ];\n\n\t\tte[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31;\n\t\tte[ 3 ] = a11 * b12 + a12 * b22 + a13 * b32;\n\t\tte[ 6 ] = a11 * b13 + a12 * b23 + a13 * b33;\n\n\t\tte[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31;\n\t\tte[ 4 ] = a21 * b12 + a22 * b22 + a23 * b32;\n\t\tte[ 7 ] = a21 * b13 + a22 * b23 + a23 * b33;\n\n\t\tte[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31;\n\t\tte[ 5 ] = a31 * b12 + a32 * b22 + a33 * b32;\n\t\tte[ 8 ] = a31 * b13 + a32 * b23 + a33 * b33;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyScalar( s ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] *= s; te[ 3 ] *= s; te[ 6 ] *= s;\n\t\tte[ 1 ] *= s; te[ 4 ] *= s; te[ 7 ] *= s;\n\t\tte[ 2 ] *= s; te[ 5 ] *= s; te[ 8 ] *= s;\n\n\t\treturn this;\n\n\t}\n\n\tdeterminant() {\n\n\t\tconst te = this.elements;\n\n\t\tconst a = te[ 0 ], b = te[ 1 ], c = te[ 2 ],\n\t\t\td = te[ 3 ], e = te[ 4 ], f = te[ 5 ],\n\t\t\tg = te[ 6 ], h = te[ 7 ], i = te[ 8 ];\n\n\t\treturn a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g;\n\n\t}\n\n\tinvert() {\n\n\t\tconst te = this.elements,\n\n\t\t\tn11 = te[ 0 ], n21 = te[ 1 ], n31 = te[ 2 ],\n\t\t\tn12 = te[ 3 ], n22 = te[ 4 ], n32 = te[ 5 ],\n\t\t\tn13 = te[ 6 ], n23 = te[ 7 ], n33 = te[ 8 ],\n\n\t\t\tt11 = n33 * n22 - n32 * n23,\n\t\t\tt12 = n32 * n13 - n33 * n12,\n\t\t\tt13 = n23 * n12 - n22 * n13,\n\n\t\t\tdet = n11 * t11 + n21 * t12 + n31 * t13;\n\n\t\tif ( det === 0 ) return this.set( 0, 0, 0, 0, 0, 0, 0, 0, 0 );\n\n\t\tconst detInv = 1 / det;\n\n\t\tte[ 0 ] = t11 * detInv;\n\t\tte[ 1 ] = ( n31 * n23 - n33 * n21 ) * detInv;\n\t\tte[ 2 ] = ( n32 * n21 - n31 * n22 ) * detInv;\n\n\t\tte[ 3 ] = t12 * detInv;\n\t\tte[ 4 ] = ( n33 * n11 - n31 * n13 ) * detInv;\n\t\tte[ 5 ] = ( n31 * n12 - n32 * n11 ) * detInv;\n\n\t\tte[ 6 ] = t13 * detInv;\n\t\tte[ 7 ] = ( n21 * n13 - n23 * n11 ) * detInv;\n\t\tte[ 8 ] = ( n22 * n11 - n21 * n12 ) * detInv;\n\n\t\treturn this;\n\n\t}\n\n\ttranspose() {\n\n\t\tlet tmp;\n\t\tconst m = this.elements;\n\n\t\ttmp = m[ 1 ]; m[ 1 ] = m[ 3 ]; m[ 3 ] = tmp;\n\t\ttmp = m[ 2 ]; m[ 2 ] = m[ 6 ]; m[ 6 ] = tmp;\n\t\ttmp = m[ 5 ]; m[ 5 ] = m[ 7 ]; m[ 7 ] = tmp;\n\n\t\treturn this;\n\n\t}\n\n\tgetNormalMatrix( matrix4 ) {\n\n\t\treturn this.setFromMatrix4( matrix4 ).invert().transpose();\n\n\t}\n\n\ttransposeIntoArray( r ) {\n\n\t\tconst m = this.elements;\n\n\t\tr[ 0 ] = m[ 0 ];\n\t\tr[ 1 ] = m[ 3 ];\n\t\tr[ 2 ] = m[ 6 ];\n\t\tr[ 3 ] = m[ 1 ];\n\t\tr[ 4 ] = m[ 4 ];\n\t\tr[ 5 ] = m[ 7 ];\n\t\tr[ 6 ] = m[ 2 ];\n\t\tr[ 7 ] = m[ 5 ];\n\t\tr[ 8 ] = m[ 8 ];\n\n\t\treturn this;\n\n\t}\n\n\tsetUvTransform( tx, ty, sx, sy, rotation, cx, cy ) {\n\n\t\tconst c = Math.cos( rotation );\n\t\tconst s = Math.sin( rotation );\n\n\t\tthis.set(\n\t\t\tsx * c, sx * s, - sx * ( c * cx + s * cy ) + cx + tx,\n\t\t\t- sy * s, sy * c, - sy * ( - s * cx + c * cy ) + cy + ty,\n\t\t\t0, 0, 1\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tscale( sx, sy ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] *= sx; te[ 3 ] *= sx; te[ 6 ] *= sx;\n\t\tte[ 1 ] *= sy; te[ 4 ] *= sy; te[ 7 ] *= sy;\n\n\t\treturn this;\n\n\t}\n\n\trotate( theta ) {\n\n\t\tconst c = Math.cos( theta );\n\t\tconst s = Math.sin( theta );\n\n\t\tconst te = this.elements;\n\n\t\tconst a11 = te[ 0 ], a12 = te[ 3 ], a13 = te[ 6 ];\n\t\tconst a21 = te[ 1 ], a22 = te[ 4 ], a23 = te[ 7 ];\n\n\t\tte[ 0 ] = c * a11 + s * a21;\n\t\tte[ 3 ] = c * a12 + s * a22;\n\t\tte[ 6 ] = c * a13 + s * a23;\n\n\t\tte[ 1 ] = - s * a11 + c * a21;\n\t\tte[ 4 ] = - s * a12 + c * a22;\n\t\tte[ 7 ] = - s * a13 + c * a23;\n\n\t\treturn this;\n\n\t}\n\n\ttranslate( tx, ty ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] += tx * te[ 2 ]; te[ 3 ] += tx * te[ 5 ]; te[ 6 ] += tx * te[ 8 ];\n\t\tte[ 1 ] += ty * te[ 2 ]; te[ 4 ] += ty * te[ 5 ]; te[ 7 ] += ty * te[ 8 ];\n\n\t\treturn this;\n\n\t}\n\n\tequals( matrix ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = matrix.elements;\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tif ( te[ i ] !== me[ i ] ) return false;\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tconst te = this.elements;\n\n\t\tarray[ offset ] = te[ 0 ];\n\t\tarray[ offset + 1 ] = te[ 1 ];\n\t\tarray[ offset + 2 ] = te[ 2 ];\n\n\t\tarray[ offset + 3 ] = te[ 3 ];\n\t\tarray[ offset + 4 ] = te[ 4 ];\n\t\tarray[ offset + 5 ] = te[ 5 ];\n\n\t\tarray[ offset + 6 ] = te[ 6 ];\n\t\tarray[ offset + 7 ] = te[ 7 ];\n\t\tarray[ offset + 8 ] = te[ 8 ];\n\n\t\treturn array;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().fromArray( this.elements );\n\n\t}\n\n}\n\nfunction arrayNeedsUint32( array ) {\n\n\t// assumes larger values usually on last\n\n\tfor ( let i = array.length - 1; i >= 0; -- i ) {\n\n\t\tif ( array[ i ] > 65535 ) return true;\n\n\t}\n\n\treturn false;\n\n}\n\nconst TYPED_ARRAYS = {\n\tInt8Array: Int8Array,\n\tUint8Array: Uint8Array,\n\tUint8ClampedArray: Uint8ClampedArray,\n\tInt16Array: Int16Array,\n\tUint16Array: Uint16Array,\n\tInt32Array: Int32Array,\n\tUint32Array: Uint32Array,\n\tFloat32Array: Float32Array,\n\tFloat64Array: Float64Array\n};\n\nfunction getTypedArray( type, buffer ) {\n\n\treturn new TYPED_ARRAYS[ type ]( buffer );\n\n}\n\nfunction createElementNS( name ) {\n\n\treturn document.createElementNS( 'http://www.w3.org/1999/xhtml', name );\n\n}\n\nfunction SRGBToLinear( c ) {\n\n\treturn ( c < 0.04045 ) ? c * 0.0773993808 : Math.pow( c * 0.9478672986 + 0.0521327014, 2.4 );\n\n}\n\nfunction LinearToSRGB( c ) {\n\n\treturn ( c < 0.0031308 ) ? c * 12.92 : 1.055 * ( Math.pow( c, 0.41666 ) ) - 0.055;\n\n}\n\n// JavaScript RGB-to-RGB transforms, defined as\n// FN[InputColorSpace][OutputColorSpace] callback functions.\nconst FN = {\n\t[ SRGBColorSpace ]: { [ LinearSRGBColorSpace ]: SRGBToLinear },\n\t[ LinearSRGBColorSpace ]: { [ SRGBColorSpace ]: LinearToSRGB },\n};\n\nconst ColorManagement = {\n\n\tlegacyMode: true,\n\n\tget workingColorSpace() {\n\n\t\treturn LinearSRGBColorSpace;\n\n\t},\n\n\tset workingColorSpace( colorSpace ) {\n\n\t\tconsole.warn( 'THREE.ColorManagement: .workingColorSpace is readonly.' );\n\n\t},\n\n\tconvert: function ( color, sourceColorSpace, targetColorSpace ) {\n\n\t\tif ( this.legacyMode || sourceColorSpace === targetColorSpace || ! sourceColorSpace || ! targetColorSpace ) {\n\n\t\t\treturn color;\n\n\t\t}\n\n\t\tif ( FN[ sourceColorSpace ] && FN[ sourceColorSpace ][ targetColorSpace ] !== undefined ) {\n\n\t\t\tconst fn = FN[ sourceColorSpace ][ targetColorSpace ];\n\n\t\t\tcolor.r = fn( color.r );\n\t\t\tcolor.g = fn( color.g );\n\t\t\tcolor.b = fn( color.b );\n\n\t\t\treturn color;\n\n\t\t}\n\n\t\tthrow new Error( 'Unsupported color space conversion.' );\n\n\t},\n\n\tfromWorkingColorSpace: function ( color, targetColorSpace ) {\n\n\t\treturn this.convert( color, this.workingColorSpace, targetColorSpace );\n\n\t},\n\n\ttoWorkingColorSpace: function ( color, sourceColorSpace ) {\n\n\t\treturn this.convert( color, sourceColorSpace, this.workingColorSpace );\n\n\t},\n\n};\n\nconst _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, 'rebeccapurple': 0x663399, '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\nconst _rgb = { r: 0, g: 0, b: 0 };\nconst _hslA = { h: 0, s: 0, l: 0 };\nconst _hslB = { h: 0, s: 0, l: 0 };\n\nfunction hue2rgb( p, q, t ) {\n\n\tif ( t < 0 ) t += 1;\n\tif ( t > 1 ) t -= 1;\n\tif ( t < 1 / 6 ) return p + ( q - p ) * 6 * t;\n\tif ( t < 1 / 2 ) return q;\n\tif ( t < 2 / 3 ) return p + ( q - p ) * 6 * ( 2 / 3 - t );\n\treturn p;\n\n}\n\nfunction toComponents( source, target ) {\n\n\ttarget.r = source.r;\n\ttarget.g = source.g;\n\ttarget.b = source.b;\n\n\treturn target;\n\n}\n\nclass Color {\n\n\tconstructor( r, g, b ) {\n\n\t\tthis.isColor = true;\n\n\t\tthis.r = 1;\n\t\tthis.g = 1;\n\t\tthis.b = 1;\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\tset( value ) {\n\n\t\tif ( value && value.isColor ) {\n\n\t\t\tthis.copy( value );\n\n\t\t} else if ( typeof value === 'number' ) {\n\n\t\t\tthis.setHex( value );\n\n\t\t} else if ( typeof value === 'string' ) {\n\n\t\t\tthis.setStyle( value );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetScalar( scalar ) {\n\n\t\tthis.r = scalar;\n\t\tthis.g = scalar;\n\t\tthis.b = scalar;\n\n\t\treturn this;\n\n\t}\n\n\tsetHex( hex, colorSpace = SRGBColorSpace ) {\n\n\t\thex = Math.floor( hex );\n\n\t\tthis.r = ( hex >> 16 & 255 ) / 255;\n\t\tthis.g = ( hex >> 8 & 255 ) / 255;\n\t\tthis.b = ( hex & 255 ) / 255;\n\n\t\tColorManagement.toWorkingColorSpace( this, colorSpace );\n\n\t\treturn this;\n\n\t}\n\n\tsetRGB( r, g, b, colorSpace = LinearSRGBColorSpace ) {\n\n\t\tthis.r = r;\n\t\tthis.g = g;\n\t\tthis.b = b;\n\n\t\tColorManagement.toWorkingColorSpace( this, colorSpace );\n\n\t\treturn this;\n\n\t}\n\n\tsetHSL( h, s, l, colorSpace = LinearSRGBColorSpace ) {\n\n\t\t// h,s,l ranges are in 0.0 - 1.0\n\t\th = euclideanModulo( h, 1 );\n\t\ts = clamp( s, 0, 1 );\n\t\tl = clamp( l, 0, 1 );\n\n\t\tif ( s === 0 ) {\n\n\t\t\tthis.r = this.g = this.b = l;\n\n\t\t} else {\n\n\t\t\tconst p = l <= 0.5 ? l * ( 1 + s ) : l + s - ( l * s );\n\t\t\tconst q = ( 2 * l ) - p;\n\n\t\t\tthis.r = hue2rgb( q, p, h + 1 / 3 );\n\t\t\tthis.g = hue2rgb( q, p, h );\n\t\t\tthis.b = hue2rgb( q, p, h - 1 / 3 );\n\n\t\t}\n\n\t\tColorManagement.toWorkingColorSpace( this, colorSpace );\n\n\t\treturn this;\n\n\t}\n\n\tsetStyle( style, colorSpace = SRGBColorSpace ) {\n\n\t\tfunction handleAlpha( string ) {\n\n\t\t\tif ( string === undefined ) return;\n\n\t\t\tif ( parseFloat( string ) < 1 ) {\n\n\t\t\t\tconsole.warn( 'THREE.Color: Alpha component of ' + style + ' will be ignored.' );\n\n\t\t\t}\n\n\t\t}\n\n\n\t\tlet m;\n\n\t\tif ( m = /^((?:rgb|hsl)a?)\\(([^\\)]*)\\)/.exec( style ) ) {\n\n\t\t\t// rgb / hsl\n\n\t\t\tlet color;\n\t\t\tconst name = m[ 1 ];\n\t\t\tconst components = m[ 2 ];\n\n\t\t\tswitch ( name ) {\n\n\t\t\t\tcase 'rgb':\n\t\t\t\tcase 'rgba':\n\n\t\t\t\t\tif ( color = /^\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t// rgb(255,0,0) rgba(255,0,0,0.5)\n\t\t\t\t\t\tthis.r = Math.min( 255, parseInt( color[ 1 ], 10 ) ) / 255;\n\t\t\t\t\t\tthis.g = Math.min( 255, parseInt( color[ 2 ], 10 ) ) / 255;\n\t\t\t\t\t\tthis.b = Math.min( 255, parseInt( color[ 3 ], 10 ) ) / 255;\n\n\t\t\t\t\t\tColorManagement.toWorkingColorSpace( this, colorSpace );\n\n\t\t\t\t\t\thandleAlpha( color[ 4 ] );\n\n\t\t\t\t\t\treturn this;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( color = /^\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t// rgb(100%,0%,0%) rgba(100%,0%,0%,0.5)\n\t\t\t\t\t\tthis.r = Math.min( 100, parseInt( color[ 1 ], 10 ) ) / 100;\n\t\t\t\t\t\tthis.g = Math.min( 100, parseInt( color[ 2 ], 10 ) ) / 100;\n\t\t\t\t\t\tthis.b = Math.min( 100, parseInt( color[ 3 ], 10 ) ) / 100;\n\n\t\t\t\t\t\tColorManagement.toWorkingColorSpace( this, colorSpace );\n\n\t\t\t\t\t\thandleAlpha( color[ 4 ] );\n\n\t\t\t\t\t\treturn this;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'hsl':\n\t\t\t\tcase 'hsla':\n\n\t\t\t\t\tif ( color = /^\\s*(\\d*\\.?\\d+)\\s*,\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t// hsl(120,50%,50%) hsla(120,50%,50%,0.5)\n\t\t\t\t\t\tconst h = parseFloat( color[ 1 ] ) / 360;\n\t\t\t\t\t\tconst s = parseInt( color[ 2 ], 10 ) / 100;\n\t\t\t\t\t\tconst l = parseInt( color[ 3 ], 10 ) / 100;\n\n\t\t\t\t\t\thandleAlpha( color[ 4 ] );\n\n\t\t\t\t\t\treturn this.setHSL( h, s, l, colorSpace );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t} else if ( m = /^\\#([A-Fa-f\\d]+)$/.exec( style ) ) {\n\n\t\t\t// hex color\n\n\t\t\tconst hex = m[ 1 ];\n\t\t\tconst size = hex.length;\n\n\t\t\tif ( size === 3 ) {\n\n\t\t\t\t// #ff0\n\t\t\t\tthis.r = parseInt( hex.charAt( 0 ) + hex.charAt( 0 ), 16 ) / 255;\n\t\t\t\tthis.g = parseInt( hex.charAt( 1 ) + hex.charAt( 1 ), 16 ) / 255;\n\t\t\t\tthis.b = parseInt( hex.charAt( 2 ) + hex.charAt( 2 ), 16 ) / 255;\n\n\t\t\t\tColorManagement.toWorkingColorSpace( this, colorSpace );\n\n\t\t\t\treturn this;\n\n\t\t\t} else if ( size === 6 ) {\n\n\t\t\t\t// #ff0000\n\t\t\t\tthis.r = parseInt( hex.charAt( 0 ) + hex.charAt( 1 ), 16 ) / 255;\n\t\t\t\tthis.g = parseInt( hex.charAt( 2 ) + hex.charAt( 3 ), 16 ) / 255;\n\t\t\t\tthis.b = parseInt( hex.charAt( 4 ) + hex.charAt( 5 ), 16 ) / 255;\n\n\t\t\t\tColorManagement.toWorkingColorSpace( this, colorSpace );\n\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( style && style.length > 0 ) {\n\n\t\t\treturn this.setColorName( style, colorSpace );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetColorName( style, colorSpace = SRGBColorSpace ) {\n\n\t\t// color keywords\n\t\tconst hex = _colorKeywords[ style.toLowerCase() ];\n\n\t\tif ( hex !== undefined ) {\n\n\t\t\t// red\n\t\t\tthis.setHex( hex, colorSpace );\n\n\t\t} else {\n\n\t\t\t// unknown color\n\t\t\tconsole.warn( 'THREE.Color: Unknown color ' + style );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this.r, this.g, this.b );\n\n\t}\n\n\tcopy( color ) {\n\n\t\tthis.r = color.r;\n\t\tthis.g = color.g;\n\t\tthis.b = color.b;\n\n\t\treturn this;\n\n\t}\n\n\tcopySRGBToLinear( color ) {\n\n\t\tthis.r = SRGBToLinear( color.r );\n\t\tthis.g = SRGBToLinear( color.g );\n\t\tthis.b = SRGBToLinear( color.b );\n\n\t\treturn this;\n\n\t}\n\n\tcopyLinearToSRGB( color ) {\n\n\t\tthis.r = LinearToSRGB( color.r );\n\t\tthis.g = LinearToSRGB( color.g );\n\t\tthis.b = LinearToSRGB( color.b );\n\n\t\treturn this;\n\n\t}\n\n\tconvertSRGBToLinear() {\n\n\t\tthis.copySRGBToLinear( this );\n\n\t\treturn this;\n\n\t}\n\n\tconvertLinearToSRGB() {\n\n\t\tthis.copyLinearToSRGB( this );\n\n\t\treturn this;\n\n\t}\n\n\tgetHex( colorSpace = SRGBColorSpace ) {\n\n\t\tColorManagement.fromWorkingColorSpace( toComponents( this, _rgb ), colorSpace );\n\n\t\treturn clamp( _rgb.r * 255, 0, 255 ) << 16 ^ clamp( _rgb.g * 255, 0, 255 ) << 8 ^ clamp( _rgb.b * 255, 0, 255 ) << 0;\n\n\t}\n\n\tgetHexString( colorSpace = SRGBColorSpace ) {\n\n\t\treturn ( '000000' + this.getHex( colorSpace ).toString( 16 ) ).slice( - 6 );\n\n\t}\n\n\tgetHSL( target, colorSpace = LinearSRGBColorSpace ) {\n\n\t\t// h,s,l ranges are in 0.0 - 1.0\n\n\t\tColorManagement.fromWorkingColorSpace( toComponents( this, _rgb ), colorSpace );\n\n\t\tconst r = _rgb.r, g = _rgb.g, b = _rgb.b;\n\n\t\tconst max = Math.max( r, g, b );\n\t\tconst min = Math.min( r, g, b );\n\n\t\tlet hue, saturation;\n\t\tconst lightness = ( min + max ) / 2.0;\n\n\t\tif ( min === max ) {\n\n\t\t\thue = 0;\n\t\t\tsaturation = 0;\n\n\t\t} else {\n\n\t\t\tconst delta = max - min;\n\n\t\t\tsaturation = lightness <= 0.5 ? delta / ( max + min ) : delta / ( 2 - max - min );\n\n\t\t\tswitch ( max ) {\n\n\t\t\t\tcase r: hue = ( g - b ) / delta + ( g < b ? 6 : 0 ); break;\n\t\t\t\tcase g: hue = ( b - r ) / delta + 2; break;\n\t\t\t\tcase b: hue = ( r - g ) / delta + 4; break;\n\n\t\t\t}\n\n\t\t\thue /= 6;\n\n\t\t}\n\n\t\ttarget.h = hue;\n\t\ttarget.s = saturation;\n\t\ttarget.l = lightness;\n\n\t\treturn target;\n\n\t}\n\n\tgetRGB( target, colorSpace = LinearSRGBColorSpace ) {\n\n\t\tColorManagement.fromWorkingColorSpace( toComponents( this, _rgb ), colorSpace );\n\n\t\ttarget.r = _rgb.r;\n\t\ttarget.g = _rgb.g;\n\t\ttarget.b = _rgb.b;\n\n\t\treturn target;\n\n\t}\n\n\tgetStyle( colorSpace = SRGBColorSpace ) {\n\n\t\tColorManagement.fromWorkingColorSpace( toComponents( this, _rgb ), colorSpace );\n\n\t\tif ( colorSpace !== SRGBColorSpace ) {\n\n\t\t\t// Requires CSS Color Module Level 4 (https://www.w3.org/TR/css-color-4/).\n\t\t\treturn `color(${ colorSpace } ${ _rgb.r } ${ _rgb.g } ${ _rgb.b })`;\n\n\t\t}\n\n\t\treturn `rgb(${( _rgb.r * 255 ) | 0},${( _rgb.g * 255 ) | 0},${( _rgb.b * 255 ) | 0})`;\n\n\t}\n\n\toffsetHSL( h, s, l ) {\n\n\t\tthis.getHSL( _hslA );\n\n\t\t_hslA.h += h; _hslA.s += s; _hslA.l += l;\n\n\t\tthis.setHSL( _hslA.h, _hslA.s, _hslA.l );\n\n\t\treturn this;\n\n\t}\n\n\tadd( color ) {\n\n\t\tthis.r += color.r;\n\t\tthis.g += color.g;\n\t\tthis.b += color.b;\n\n\t\treturn this;\n\n\t}\n\n\taddColors( color1, color2 ) {\n\n\t\tthis.r = color1.r + color2.r;\n\t\tthis.g = color1.g + color2.g;\n\t\tthis.b = color1.b + color2.b;\n\n\t\treturn this;\n\n\t}\n\n\taddScalar( s ) {\n\n\t\tthis.r += s;\n\t\tthis.g += s;\n\t\tthis.b += s;\n\n\t\treturn this;\n\n\t}\n\n\tsub( color ) {\n\n\t\tthis.r = Math.max( 0, this.r - color.r );\n\t\tthis.g = Math.max( 0, this.g - color.g );\n\t\tthis.b = Math.max( 0, this.b - color.b );\n\n\t\treturn this;\n\n\t}\n\n\tmultiply( color ) {\n\n\t\tthis.r *= color.r;\n\t\tthis.g *= color.g;\n\t\tthis.b *= color.b;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyScalar( s ) {\n\n\t\tthis.r *= s;\n\t\tthis.g *= s;\n\t\tthis.b *= s;\n\n\t\treturn this;\n\n\t}\n\n\tlerp( color, alpha ) {\n\n\t\tthis.r += ( color.r - this.r ) * alpha;\n\t\tthis.g += ( color.g - this.g ) * alpha;\n\t\tthis.b += ( color.b - this.b ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tlerpColors( color1, color2, alpha ) {\n\n\t\tthis.r = color1.r + ( color2.r - color1.r ) * alpha;\n\t\tthis.g = color1.g + ( color2.g - color1.g ) * alpha;\n\t\tthis.b = color1.b + ( color2.b - color1.b ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tlerpHSL( color, alpha ) {\n\n\t\tthis.getHSL( _hslA );\n\t\tcolor.getHSL( _hslB );\n\n\t\tconst h = lerp( _hslA.h, _hslB.h, alpha );\n\t\tconst s = lerp( _hslA.s, _hslB.s, alpha );\n\t\tconst l = lerp( _hslA.l, _hslB.l, alpha );\n\n\t\tthis.setHSL( h, s, l );\n\n\t\treturn this;\n\n\t}\n\n\tequals( c ) {\n\n\t\treturn ( c.r === this.r ) && ( c.g === this.g ) && ( c.b === this.b );\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.r = array[ offset ];\n\t\tthis.g = array[ offset + 1 ];\n\t\tthis.b = array[ offset + 2 ];\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.r;\n\t\tarray[ offset + 1 ] = this.g;\n\t\tarray[ offset + 2 ] = this.b;\n\n\t\treturn array;\n\n\t}\n\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis.r = attribute.getX( index );\n\t\tthis.g = attribute.getY( index );\n\t\tthis.b = attribute.getZ( index );\n\n\t\tif ( attribute.normalized === true ) {\n\n\t\t\t// assuming Uint8Array\n\n\t\t\tthis.r /= 255;\n\t\t\tthis.g /= 255;\n\t\t\tthis.b /= 255;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\treturn this.getHex();\n\n\t}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this.r;\n\t\tyield this.g;\n\t\tyield this.b;\n\n\t}\n\n}\n\nColor.NAMES = _colorKeywords;\n\nlet _canvas;\n\nclass ImageUtils {\n\n\tstatic getDataURL( image ) {\n\n\t\tif ( /^data:/i.test( image.src ) ) {\n\n\t\t\treturn image.src;\n\n\t\t}\n\n\t\tif ( typeof HTMLCanvasElement == 'undefined' ) {\n\n\t\t\treturn image.src;\n\n\t\t}\n\n\t\tlet canvas;\n\n\t\tif ( image instanceof HTMLCanvasElement ) {\n\n\t\t\tcanvas = image;\n\n\t\t} else {\n\n\t\t\tif ( _canvas === undefined ) _canvas = createElementNS( 'canvas' );\n\n\t\t\t_canvas.width = image.width;\n\t\t\t_canvas.height = image.height;\n\n\t\t\tconst context = _canvas.getContext( '2d' );\n\n\t\t\tif ( image instanceof ImageData ) {\n\n\t\t\t\tcontext.putImageData( image, 0, 0 );\n\n\t\t\t} else {\n\n\t\t\t\tcontext.drawImage( image, 0, 0, image.width, image.height );\n\n\t\t\t}\n\n\t\t\tcanvas = _canvas;\n\n\t\t}\n\n\t\tif ( canvas.width > 2048 || canvas.height > 2048 ) {\n\n\t\t\tconsole.warn( 'THREE.ImageUtils.getDataURL: Image converted to jpg for performance reasons', image );\n\n\t\t\treturn canvas.toDataURL( 'image/jpeg', 0.6 );\n\n\t\t} else {\n\n\t\t\treturn canvas.toDataURL( 'image/png' );\n\n\t\t}\n\n\t}\n\n\tstatic sRGBToLinear( image ) {\n\n\t\tif ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) ||\n\t\t\t( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) ||\n\t\t\t( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ) {\n\n\t\t\tconst canvas = createElementNS( 'canvas' );\n\n\t\t\tcanvas.width = image.width;\n\t\t\tcanvas.height = image.height;\n\n\t\t\tconst context = canvas.getContext( '2d' );\n\t\t\tcontext.drawImage( image, 0, 0, image.width, image.height );\n\n\t\t\tconst imageData = context.getImageData( 0, 0, image.width, image.height );\n\t\t\tconst data = imageData.data;\n\n\t\t\tfor ( let i = 0; i < data.length; i ++ ) {\n\n\t\t\t\tdata[ i ] = SRGBToLinear( data[ i ] / 255 ) * 255;\n\n\t\t\t}\n\n\t\t\tcontext.putImageData( imageData, 0, 0 );\n\n\t\t\treturn canvas;\n\n\t\t} else if ( image.data ) {\n\n\t\t\tconst data = image.data.slice( 0 );\n\n\t\t\tfor ( let i = 0; i < data.length; i ++ ) {\n\n\t\t\t\tif ( data instanceof Uint8Array || data instanceof Uint8ClampedArray ) {\n\n\t\t\t\t\tdata[ i ] = Math.floor( SRGBToLinear( data[ i ] / 255 ) * 255 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// assuming float\n\n\t\t\t\t\tdata[ i ] = SRGBToLinear( data[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tdata: data,\n\t\t\t\twidth: image.width,\n\t\t\t\theight: image.height\n\t\t\t};\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.ImageUtils.sRGBToLinear(): Unsupported image type. No color space conversion applied.' );\n\t\t\treturn image;\n\n\t\t}\n\n\t}\n\n}\n\nclass Source {\n\n\tconstructor( data = null ) {\n\n\t\tthis.isSource = true;\n\n\t\tthis.uuid = generateUUID();\n\n\t\tthis.data = data;\n\n\t\tthis.version = 0;\n\n\t}\n\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tif ( ! isRootObject && meta.images[ this.uuid ] !== undefined ) {\n\n\t\t\treturn meta.images[ this.uuid ];\n\n\t\t}\n\n\t\tconst output = {\n\t\t\tuuid: this.uuid,\n\t\t\turl: ''\n\t\t};\n\n\t\tconst data = this.data;\n\n\t\tif ( data !== null ) {\n\n\t\t\tlet url;\n\n\t\t\tif ( Array.isArray( data ) ) {\n\n\t\t\t\t// cube texture\n\n\t\t\t\turl = [];\n\n\t\t\t\tfor ( let i = 0, l = data.length; i < l; i ++ ) {\n\n\t\t\t\t\tif ( data[ i ].isDataTexture ) {\n\n\t\t\t\t\t\turl.push( serializeImage( data[ i ].image ) );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\turl.push( serializeImage( data[ i ] ) );\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// texture\n\n\t\t\t\turl = serializeImage( data );\n\n\t\t\t}\n\n\t\t\toutput.url = url;\n\n\t\t}\n\n\t\tif ( ! isRootObject ) {\n\n\t\t\tmeta.images[ this.uuid ] = output;\n\n\t\t}\n\n\t\treturn output;\n\n\t}\n\n}\n\nfunction serializeImage( image ) {\n\n\tif ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) ||\n\t\t( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) ||\n\t\t( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ) {\n\n\t\t// default images\n\n\t\treturn ImageUtils.getDataURL( image );\n\n\t} else {\n\n\t\tif ( image.data ) {\n\n\t\t\t// images of DataTexture\n\n\t\t\treturn {\n\t\t\t\tdata: Array.from( image.data ),\n\t\t\t\twidth: image.width,\n\t\t\t\theight: image.height,\n\t\t\t\ttype: image.data.constructor.name\n\t\t\t};\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.Texture: Unable to serialize Texture.' );\n\t\t\treturn {};\n\n\t\t}\n\n\t}\n\n}\n\nlet textureId = 0;\n\nclass Texture extends EventDispatcher {\n\n\tconstructor( image = Texture.DEFAULT_IMAGE, mapping = Texture.DEFAULT_MAPPING, wrapS = ClampToEdgeWrapping, wrapT = ClampToEdgeWrapping, magFilter = LinearFilter, minFilter = LinearMipmapLinearFilter, format = RGBAFormat, type = UnsignedByteType, anisotropy = 1, encoding = LinearEncoding ) {\n\n\t\tsuper();\n\n\t\tthis.isTexture = true;\n\n\t\tObject.defineProperty( this, 'id', { value: textureId ++ } );\n\n\t\tthis.uuid = generateUUID();\n\n\t\tthis.name = '';\n\n\t\tthis.source = new Source( image );\n\t\tthis.mipmaps = [];\n\n\t\tthis.mapping = mapping;\n\n\t\tthis.wrapS = wrapS;\n\t\tthis.wrapT = wrapT;\n\n\t\tthis.magFilter = magFilter;\n\t\tthis.minFilter = minFilter;\n\n\t\tthis.anisotropy = anisotropy;\n\n\t\tthis.format = format;\n\t\tthis.internalFormat = null;\n\t\tthis.type = type;\n\n\t\tthis.offset = new Vector2( 0, 0 );\n\t\tthis.repeat = new Vector2( 1, 1 );\n\t\tthis.center = new Vector2( 0, 0 );\n\t\tthis.rotation = 0;\n\n\t\tthis.matrixAutoUpdate = true;\n\t\tthis.matrix = new Matrix3();\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\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;\n\n\t\tthis.userData = {};\n\n\t\tthis.version = 0;\n\t\tthis.onUpdate = null;\n\n\t\tthis.isRenderTargetTexture = false; // indicates whether a texture belongs to a render target or not\n\t\tthis.needsPMREMUpdate = false; // indicates whether this texture should be processed by PMREMGenerator or not (only relevant for render target textures)\n\n\t}\n\n\tget image() {\n\n\t\treturn this.source.data;\n\n\t}\n\n\tset image( value ) {\n\n\t\tthis.source.data = value;\n\n\t}\n\n\tupdateMatrix() {\n\n\t\tthis.matrix.setUvTransform( this.offset.x, this.offset.y, this.repeat.x, this.repeat.y, this.rotation, this.center.x, this.center.y );\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.name = source.name;\n\n\t\tthis.source = source.source;\n\t\tthis.mipmaps = source.mipmaps.slice( 0 );\n\n\t\tthis.mapping = source.mapping;\n\n\t\tthis.wrapS = source.wrapS;\n\t\tthis.wrapT = source.wrapT;\n\n\t\tthis.magFilter = source.magFilter;\n\t\tthis.minFilter = source.minFilter;\n\n\t\tthis.anisotropy = source.anisotropy;\n\n\t\tthis.format = source.format;\n\t\tthis.internalFormat = source.internalFormat;\n\t\tthis.type = source.type;\n\n\t\tthis.offset.copy( source.offset );\n\t\tthis.repeat.copy( source.repeat );\n\t\tthis.center.copy( source.center );\n\t\tthis.rotation = source.rotation;\n\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\t\tthis.matrix.copy( source.matrix );\n\n\t\tthis.generateMipmaps = source.generateMipmaps;\n\t\tthis.premultiplyAlpha = source.premultiplyAlpha;\n\t\tthis.flipY = source.flipY;\n\t\tthis.unpackAlignment = source.unpackAlignment;\n\t\tthis.encoding = source.encoding;\n\n\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\tthis.needsUpdate = true;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tif ( ! isRootObject && meta.textures[ this.uuid ] !== undefined ) {\n\n\t\t\treturn meta.textures[ this.uuid ];\n\n\t\t}\n\n\t\tconst output = {\n\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.5,\n\t\t\t\ttype: 'Texture',\n\t\t\t\tgenerator: 'Texture.toJSON'\n\t\t\t},\n\n\t\t\tuuid: this.uuid,\n\t\t\tname: this.name,\n\n\t\t\timage: this.source.toJSON( meta ).uuid,\n\n\t\t\tmapping: this.mapping,\n\n\t\t\trepeat: [ this.repeat.x, this.repeat.y ],\n\t\t\toffset: [ this.offset.x, this.offset.y ],\n\t\t\tcenter: [ this.center.x, this.center.y ],\n\t\t\trotation: this.rotation,\n\n\t\t\twrap: [ this.wrapS, this.wrapT ],\n\n\t\t\tformat: this.format,\n\t\t\ttype: this.type,\n\t\t\tencoding: this.encoding,\n\n\t\t\tminFilter: this.minFilter,\n\t\t\tmagFilter: this.magFilter,\n\t\t\tanisotropy: this.anisotropy,\n\n\t\t\tflipY: this.flipY,\n\n\t\t\tpremultiplyAlpha: this.premultiplyAlpha,\n\t\t\tunpackAlignment: this.unpackAlignment\n\n\t\t};\n\n\t\tif ( JSON.stringify( this.userData ) !== '{}' ) output.userData = this.userData;\n\n\t\tif ( ! isRootObject ) {\n\n\t\t\tmeta.textures[ this.uuid ] = output;\n\n\t\t}\n\n\t\treturn output;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n\ttransformUv( uv ) {\n\n\t\tif ( this.mapping !== UVMapping ) return uv;\n\n\t\tuv.applyMatrix3( this.matrix );\n\n\t\tif ( uv.x < 0 || uv.x > 1 ) {\n\n\t\t\tswitch ( this.wrapS ) {\n\n\t\t\t\tcase RepeatWrapping:\n\n\t\t\t\t\tuv.x = uv.x - Math.floor( uv.x );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase ClampToEdgeWrapping:\n\n\t\t\t\t\tuv.x = uv.x < 0 ? 0 : 1;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MirroredRepeatWrapping:\n\n\t\t\t\t\tif ( Math.abs( Math.floor( uv.x ) % 2 ) === 1 ) {\n\n\t\t\t\t\t\tuv.x = Math.ceil( uv.x ) - uv.x;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tuv.x = uv.x - Math.floor( uv.x );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( uv.y < 0 || uv.y > 1 ) {\n\n\t\t\tswitch ( this.wrapT ) {\n\n\t\t\t\tcase RepeatWrapping:\n\n\t\t\t\t\tuv.y = uv.y - Math.floor( uv.y );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase ClampToEdgeWrapping:\n\n\t\t\t\t\tuv.y = uv.y < 0 ? 0 : 1;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MirroredRepeatWrapping:\n\n\t\t\t\t\tif ( Math.abs( Math.floor( uv.y ) % 2 ) === 1 ) {\n\n\t\t\t\t\t\tuv.y = Math.ceil( uv.y ) - uv.y;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tuv.y = uv.y - Math.floor( uv.y );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.flipY ) {\n\n\t\t\tuv.y = 1 - uv.y;\n\n\t\t}\n\n\t\treturn uv;\n\n\t}\n\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) {\n\n\t\t\tthis.version ++;\n\t\t\tthis.source.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n}\n\nTexture.DEFAULT_IMAGE = null;\nTexture.DEFAULT_MAPPING = UVMapping;\n\nclass Vector4 {\n\n\tconstructor( x = 0, y = 0, z = 0, w = 1 ) {\n\n\t\tVector4.prototype.isVector4 = true;\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\t\tthis.w = w;\n\n\t}\n\n\tget width() {\n\n\t\treturn this.z;\n\n\t}\n\n\tset width( value ) {\n\n\t\tthis.z = value;\n\n\t}\n\n\tget height() {\n\n\t\treturn this.w;\n\n\t}\n\n\tset height( value ) {\n\n\t\tthis.w = value;\n\n\t}\n\n\tset( x, y, z, w ) {\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\t\tthis.w = w;\n\n\t\treturn this;\n\n\t}\n\n\tsetScalar( scalar ) {\n\n\t\tthis.x = scalar;\n\t\tthis.y = scalar;\n\t\tthis.z = scalar;\n\t\tthis.w = scalar;\n\n\t\treturn this;\n\n\t}\n\n\tsetX( x ) {\n\n\t\tthis.x = x;\n\n\t\treturn this;\n\n\t}\n\n\tsetY( y ) {\n\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\tsetZ( z ) {\n\n\t\tthis.z = z;\n\n\t\treturn this;\n\n\t}\n\n\tsetW( w ) {\n\n\t\tthis.w = w;\n\n\t\treturn this;\n\n\t}\n\n\tsetComponent( index, value ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: this.x = value; break;\n\t\t\tcase 1: this.y = value; break;\n\t\t\tcase 2: this.z = value; break;\n\t\t\tcase 3: this.w = value; break;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tgetComponent( index ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: return this.x;\n\t\t\tcase 1: return this.y;\n\t\t\tcase 2: return this.z;\n\t\t\tcase 3: return this.w;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this.x, this.y, this.z, this.w );\n\n\t}\n\n\tcopy( v ) {\n\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\t\tthis.z = v.z;\n\t\tthis.w = ( v.w !== undefined ) ? v.w : 1;\n\n\t\treturn this;\n\n\t}\n\n\tadd( v ) {\n\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\t\tthis.z += v.z;\n\t\tthis.w += v.w;\n\n\t\treturn this;\n\n\t}\n\n\taddScalar( s ) {\n\n\t\tthis.x += s;\n\t\tthis.y += s;\n\t\tthis.z += s;\n\t\tthis.w += s;\n\n\t\treturn this;\n\n\t}\n\n\taddVectors( a, b ) {\n\n\t\tthis.x = a.x + b.x;\n\t\tthis.y = a.y + b.y;\n\t\tthis.z = a.z + b.z;\n\t\tthis.w = a.w + b.w;\n\n\t\treturn this;\n\n\t}\n\n\taddScaledVector( v, s ) {\n\n\t\tthis.x += v.x * s;\n\t\tthis.y += v.y * s;\n\t\tthis.z += v.z * s;\n\t\tthis.w += v.w * s;\n\n\t\treturn this;\n\n\t}\n\n\tsub( v ) {\n\n\t\tthis.x -= v.x;\n\t\tthis.y -= v.y;\n\t\tthis.z -= v.z;\n\t\tthis.w -= v.w;\n\n\t\treturn this;\n\n\t}\n\n\tsubScalar( s ) {\n\n\t\tthis.x -= s;\n\t\tthis.y -= s;\n\t\tthis.z -= s;\n\t\tthis.w -= s;\n\n\t\treturn this;\n\n\t}\n\n\tsubVectors( a, b ) {\n\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\t\tthis.z = a.z - b.z;\n\t\tthis.w = a.w - b.w;\n\n\t\treturn this;\n\n\t}\n\n\tmultiply( v ) {\n\n\t\tthis.x *= v.x;\n\t\tthis.y *= v.y;\n\t\tthis.z *= v.z;\n\t\tthis.w *= v.w;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyScalar( scalar ) {\n\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\t\tthis.z *= scalar;\n\t\tthis.w *= scalar;\n\n\t\treturn this;\n\n\t}\n\n\tapplyMatrix4( m ) {\n\n\t\tconst x = this.x, y = this.y, z = this.z, w = this.w;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] * w;\n\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] * w;\n\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] * w;\n\t\tthis.w = e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] * w;\n\n\t\treturn this;\n\n\t}\n\n\tdivideScalar( scalar ) {\n\n\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t}\n\n\tsetAxisAngleFromQuaternion( q ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm\n\n\t\t// q is assumed to be normalized\n\n\t\tthis.w = 2 * Math.acos( q.w );\n\n\t\tconst s = Math.sqrt( 1 - q.w * q.w );\n\n\t\tif ( s < 0.0001 ) {\n\n\t\t\tthis.x = 1;\n\t\t\tthis.y = 0;\n\t\t\tthis.z = 0;\n\n\t\t} else {\n\n\t\t\tthis.x = q.x / s;\n\t\t\tthis.y = q.y / s;\n\t\t\tthis.z = q.z / s;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetAxisAngleFromRotationMatrix( m ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToAngle/index.htm\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tlet angle, x, y, z; // variables for result\n\t\tconst epsilon = 0.01,\t\t// margin to allow for rounding errors\n\t\t\tepsilon2 = 0.1,\t\t// margin to distinguish between 0 and 180 degrees\n\n\t\t\tte = m.elements,\n\n\t\t\tm11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],\n\t\t\tm21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],\n\t\t\tm31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\n\n\t\tif ( ( Math.abs( m12 - m21 ) < epsilon ) &&\n\t\t ( Math.abs( m13 - m31 ) < epsilon ) &&\n\t\t ( Math.abs( m23 - m32 ) < epsilon ) ) {\n\n\t\t\t// singularity found\n\t\t\t// first check for identity matrix which must have +1 for all terms\n\t\t\t// in leading diagonal and zero in other terms\n\n\t\t\tif ( ( Math.abs( m12 + m21 ) < epsilon2 ) &&\n\t\t\t ( Math.abs( m13 + m31 ) < epsilon2 ) &&\n\t\t\t ( Math.abs( m23 + m32 ) < epsilon2 ) &&\n\t\t\t ( Math.abs( m11 + m22 + m33 - 3 ) < epsilon2 ) ) {\n\n\t\t\t\t// this singularity is identity matrix so angle = 0\n\n\t\t\t\tthis.set( 1, 0, 0, 0 );\n\n\t\t\t\treturn this; // zero angle, arbitrary axis\n\n\t\t\t}\n\n\t\t\t// otherwise this singularity is angle = 180\n\n\t\t\tangle = Math.PI;\n\n\t\t\tconst xx = ( m11 + 1 ) / 2;\n\t\t\tconst yy = ( m22 + 1 ) / 2;\n\t\t\tconst zz = ( m33 + 1 ) / 2;\n\t\t\tconst xy = ( m12 + m21 ) / 4;\n\t\t\tconst xz = ( m13 + m31 ) / 4;\n\t\t\tconst yz = ( m23 + m32 ) / 4;\n\n\t\t\tif ( ( xx > yy ) && ( xx > zz ) ) {\n\n\t\t\t\t// m11 is the largest diagonal term\n\n\t\t\t\tif ( xx < epsilon ) {\n\n\t\t\t\t\tx = 0;\n\t\t\t\t\ty = 0.707106781;\n\t\t\t\t\tz = 0.707106781;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tx = Math.sqrt( xx );\n\t\t\t\t\ty = xy / x;\n\t\t\t\t\tz = xz / x;\n\n\t\t\t\t}\n\n\t\t\t} else if ( yy > zz ) {\n\n\t\t\t\t// m22 is the largest diagonal term\n\n\t\t\t\tif ( yy < epsilon ) {\n\n\t\t\t\t\tx = 0.707106781;\n\t\t\t\t\ty = 0;\n\t\t\t\t\tz = 0.707106781;\n\n\t\t\t\t} else {\n\n\t\t\t\t\ty = Math.sqrt( yy );\n\t\t\t\t\tx = xy / y;\n\t\t\t\t\tz = yz / y;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// m33 is the largest diagonal term so base result on this\n\n\t\t\t\tif ( zz < epsilon ) {\n\n\t\t\t\t\tx = 0.707106781;\n\t\t\t\t\ty = 0.707106781;\n\t\t\t\t\tz = 0;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tz = Math.sqrt( zz );\n\t\t\t\t\tx = xz / z;\n\t\t\t\t\ty = yz / z;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.set( x, y, z, angle );\n\n\t\t\treturn this; // return 180 deg rotation\n\n\t\t}\n\n\t\t// as we have reached here there are no singularities so we can handle normally\n\n\t\tlet 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\tif ( Math.abs( s ) < 0.001 ) s = 1;\n\n\t\t// prevent divide by zero, should not happen if matrix is orthogonal and should be\n\t\t// caught by singularity test above, but I've left it in just in case\n\n\t\tthis.x = ( m32 - m23 ) / s;\n\t\tthis.y = ( m13 - m31 ) / s;\n\t\tthis.z = ( m21 - m12 ) / s;\n\t\tthis.w = Math.acos( ( m11 + m22 + m33 - 1 ) / 2 );\n\n\t\treturn this;\n\n\t}\n\n\tmin( v ) {\n\n\t\tthis.x = Math.min( this.x, v.x );\n\t\tthis.y = Math.min( this.y, v.y );\n\t\tthis.z = Math.min( this.z, v.z );\n\t\tthis.w = Math.min( this.w, v.w );\n\n\t\treturn this;\n\n\t}\n\n\tmax( v ) {\n\n\t\tthis.x = Math.max( this.x, v.x );\n\t\tthis.y = Math.max( this.y, v.y );\n\t\tthis.z = Math.max( this.z, v.z );\n\t\tthis.w = Math.max( this.w, v.w );\n\n\t\treturn this;\n\n\t}\n\n\tclamp( min, max ) {\n\n\t\t// assumes min < max, componentwise\n\n\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\t\tthis.z = Math.max( min.z, Math.min( max.z, this.z ) );\n\t\tthis.w = Math.max( min.w, Math.min( max.w, this.w ) );\n\n\t\treturn this;\n\n\t}\n\n\tclampScalar( minVal, maxVal ) {\n\n\t\tthis.x = Math.max( minVal, Math.min( maxVal, this.x ) );\n\t\tthis.y = Math.max( minVal, Math.min( maxVal, this.y ) );\n\t\tthis.z = Math.max( minVal, Math.min( maxVal, this.z ) );\n\t\tthis.w = Math.max( minVal, Math.min( maxVal, this.w ) );\n\n\t\treturn this;\n\n\t}\n\n\tclampLength( min, max ) {\n\n\t\tconst length = this.length();\n\n\t\treturn this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) );\n\n\t}\n\n\tfloor() {\n\n\t\tthis.x = Math.floor( this.x );\n\t\tthis.y = Math.floor( this.y );\n\t\tthis.z = Math.floor( this.z );\n\t\tthis.w = Math.floor( this.w );\n\n\t\treturn this;\n\n\t}\n\n\tceil() {\n\n\t\tthis.x = Math.ceil( this.x );\n\t\tthis.y = Math.ceil( this.y );\n\t\tthis.z = Math.ceil( this.z );\n\t\tthis.w = Math.ceil( this.w );\n\n\t\treturn this;\n\n\t}\n\n\tround() {\n\n\t\tthis.x = Math.round( this.x );\n\t\tthis.y = Math.round( this.y );\n\t\tthis.z = Math.round( this.z );\n\t\tthis.w = Math.round( this.w );\n\n\t\treturn this;\n\n\t}\n\n\troundToZero() {\n\n\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\n\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\n\t\tthis.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z );\n\t\tthis.w = ( this.w < 0 ) ? Math.ceil( this.w ) : Math.floor( this.w );\n\n\t\treturn this;\n\n\t}\n\n\tnegate() {\n\n\t\tthis.x = - this.x;\n\t\tthis.y = - this.y;\n\t\tthis.z = - this.z;\n\t\tthis.w = - this.w;\n\n\t\treturn this;\n\n\t}\n\n\tdot( v ) {\n\n\t\treturn this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w;\n\n\t}\n\n\tlengthSq() {\n\n\t\treturn this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w;\n\n\t}\n\n\tlength() {\n\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w );\n\n\t}\n\n\tmanhattanLength() {\n\n\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ) + Math.abs( this.w );\n\n\t}\n\n\tnormalize() {\n\n\t\treturn this.divideScalar( this.length() || 1 );\n\n\t}\n\n\tsetLength( length ) {\n\n\t\treturn this.normalize().multiplyScalar( length );\n\n\t}\n\n\tlerp( v, alpha ) {\n\n\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\tthis.y += ( v.y - this.y ) * alpha;\n\t\tthis.z += ( v.z - this.z ) * alpha;\n\t\tthis.w += ( v.w - this.w ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tlerpVectors( v1, v2, alpha ) {\n\n\t\tthis.x = v1.x + ( v2.x - v1.x ) * alpha;\n\t\tthis.y = v1.y + ( v2.y - v1.y ) * alpha;\n\t\tthis.z = v1.z + ( v2.z - v1.z ) * alpha;\n\t\tthis.w = v1.w + ( v2.w - v1.w ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tequals( v ) {\n\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) && ( v.w === this.w ) );\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.x = array[ offset ];\n\t\tthis.y = array[ offset + 1 ];\n\t\tthis.z = array[ offset + 2 ];\n\t\tthis.w = array[ offset + 3 ];\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.x;\n\t\tarray[ offset + 1 ] = this.y;\n\t\tarray[ offset + 2 ] = this.z;\n\t\tarray[ offset + 3 ] = this.w;\n\n\t\treturn array;\n\n\t}\n\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis.x = attribute.getX( index );\n\t\tthis.y = attribute.getY( index );\n\t\tthis.z = attribute.getZ( index );\n\t\tthis.w = attribute.getW( index );\n\n\t\treturn this;\n\n\t}\n\n\trandom() {\n\n\t\tthis.x = Math.random();\n\t\tthis.y = Math.random();\n\t\tthis.z = Math.random();\n\t\tthis.w = Math.random();\n\n\t\treturn this;\n\n\t}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this.x;\n\t\tyield this.y;\n\t\tyield this.z;\n\t\tyield this.w;\n\n\t}\n\n}\n\n/*\n In options, we can specify:\n * Texture parameters for an auto-generated target texture\n * depthBuffer/stencilBuffer: Booleans to indicate if we should generate these buffers\n*/\nclass WebGLRenderTarget extends EventDispatcher {\n\n\tconstructor( width, height, options = {} ) {\n\n\t\tsuper();\n\n\t\tthis.isWebGLRenderTarget = true;\n\n\t\tthis.width = width;\n\t\tthis.height = height;\n\t\tthis.depth = 1;\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\tconst image = { width: width, height: height, depth: 1 };\n\n\t\tthis.texture = new Texture( image, options.mapping, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.encoding );\n\t\tthis.texture.isRenderTargetTexture = true;\n\n\t\tthis.texture.flipY = false;\n\t\tthis.texture.generateMipmaps = options.generateMipmaps !== undefined ? options.generateMipmaps : false;\n\t\tthis.texture.internalFormat = options.internalFormat !== undefined ? options.internalFormat : null;\n\t\tthis.texture.minFilter = options.minFilter !== undefined ? options.minFilter : LinearFilter;\n\n\t\tthis.depthBuffer = options.depthBuffer !== undefined ? options.depthBuffer : true;\n\t\tthis.stencilBuffer = options.stencilBuffer !== undefined ? options.stencilBuffer : false;\n\n\t\tthis.depthTexture = options.depthTexture !== undefined ? options.depthTexture : null;\n\n\t\tthis.samples = options.samples !== undefined ? options.samples : 0;\n\n\t}\n\n\tsetSize( width, height, depth = 1 ) {\n\n\t\tif ( this.width !== width || this.height !== height || this.depth !== depth ) {\n\n\t\t\tthis.width = width;\n\t\t\tthis.height = height;\n\t\t\tthis.depth = depth;\n\n\t\t\tthis.texture.image.width = width;\n\t\t\tthis.texture.image.height = height;\n\t\t\tthis.texture.image.depth = depth;\n\n\t\t\tthis.dispose();\n\n\t\t}\n\n\t\tthis.viewport.set( 0, 0, width, height );\n\t\tthis.scissor.set( 0, 0, width, height );\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.width = source.width;\n\t\tthis.height = source.height;\n\t\tthis.depth = source.depth;\n\n\t\tthis.viewport.copy( source.viewport );\n\n\t\tthis.texture = source.texture.clone();\n\t\tthis.texture.isRenderTargetTexture = true;\n\n\t\t// ensure image object is not shared, see #20328\n\n\t\tconst image = Object.assign( {}, source.texture.image );\n\t\tthis.texture.source = new Source( image );\n\n\t\tthis.depthBuffer = source.depthBuffer;\n\t\tthis.stencilBuffer = source.stencilBuffer;\n\n\t\tif ( source.depthTexture !== null ) this.depthTexture = source.depthTexture.clone();\n\n\t\tthis.samples = source.samples;\n\n\t\treturn this;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n}\n\nclass DataArrayTexture extends Texture {\n\n\tconstructor( data = null, width = 1, height = 1, depth = 1 ) {\n\n\t\tsuper( null );\n\n\t\tthis.isDataArrayTexture = true;\n\n\t\tthis.image = { data, width, height, depth };\n\n\t\tthis.magFilter = NearestFilter;\n\t\tthis.minFilter = NearestFilter;\n\n\t\tthis.wrapR = ClampToEdgeWrapping;\n\n\t\tthis.generateMipmaps = false;\n\t\tthis.flipY = false;\n\t\tthis.unpackAlignment = 1;\n\n\t}\n\n}\n\nclass WebGLArrayRenderTarget extends WebGLRenderTarget {\n\n\tconstructor( width, height, depth ) {\n\n\t\tsuper( width, height );\n\n\t\tthis.isWebGLArrayRenderTarget = true;\n\n\t\tthis.depth = depth;\n\n\t\tthis.texture = new DataArrayTexture( null, width, height, depth );\n\n\t\tthis.texture.isRenderTargetTexture = true;\n\n\t}\n\n}\n\nclass Data3DTexture extends Texture {\n\n\tconstructor( data = null, width = 1, height = 1, depth = 1 ) {\n\n\t\t// We're going to add .setXXX() methods for setting properties later.\n\t\t// Users can still set in DataTexture3D directly.\n\t\t//\n\t\t//\tconst texture = new THREE.DataTexture3D( data, width, height, depth );\n\t\t// \ttexture.anisotropy = 16;\n\t\t//\n\t\t// See #14839\n\n\t\tsuper( null );\n\n\t\tthis.isData3DTexture = true;\n\n\t\tthis.image = { data, width, height, depth };\n\n\t\tthis.magFilter = NearestFilter;\n\t\tthis.minFilter = NearestFilter;\n\n\t\tthis.wrapR = ClampToEdgeWrapping;\n\n\t\tthis.generateMipmaps = false;\n\t\tthis.flipY = false;\n\t\tthis.unpackAlignment = 1;\n\n\t}\n\n}\n\nclass WebGL3DRenderTarget extends WebGLRenderTarget {\n\n\tconstructor( width, height, depth ) {\n\n\t\tsuper( width, height );\n\n\t\tthis.isWebGL3DRenderTarget = true;\n\n\t\tthis.depth = depth;\n\n\t\tthis.texture = new Data3DTexture( null, width, height, depth );\n\n\t\tthis.texture.isRenderTargetTexture = true;\n\n\t}\n\n}\n\nclass WebGLMultipleRenderTargets extends WebGLRenderTarget {\n\n\tconstructor( width, height, count, options = {} ) {\n\n\t\tsuper( width, height, options );\n\n\t\tthis.isWebGLMultipleRenderTargets = true;\n\n\t\tconst texture = this.texture;\n\n\t\tthis.texture = [];\n\n\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\tthis.texture[ i ] = texture.clone();\n\t\t\tthis.texture[ i ].isRenderTargetTexture = true;\n\n\t\t}\n\n\t}\n\n\tsetSize( width, height, depth = 1 ) {\n\n\t\tif ( this.width !== width || this.height !== height || this.depth !== depth ) {\n\n\t\t\tthis.width = width;\n\t\t\tthis.height = height;\n\t\t\tthis.depth = depth;\n\n\t\t\tfor ( let i = 0, il = this.texture.length; i < il; i ++ ) {\n\n\t\t\t\tthis.texture[ i ].image.width = width;\n\t\t\t\tthis.texture[ i ].image.height = height;\n\t\t\t\tthis.texture[ i ].image.depth = depth;\n\n\t\t\t}\n\n\t\t\tthis.dispose();\n\n\t\t}\n\n\t\tthis.viewport.set( 0, 0, width, height );\n\t\tthis.scissor.set( 0, 0, width, height );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.dispose();\n\n\t\tthis.width = source.width;\n\t\tthis.height = source.height;\n\t\tthis.depth = source.depth;\n\n\t\tthis.viewport.set( 0, 0, this.width, this.height );\n\t\tthis.scissor.set( 0, 0, this.width, this.height );\n\n\t\tthis.depthBuffer = source.depthBuffer;\n\t\tthis.stencilBuffer = source.stencilBuffer;\n\n\t\tif ( source.depthTexture !== null ) this.depthTexture = source.depthTexture.clone();\n\n\t\tthis.texture.length = 0;\n\n\t\tfor ( let i = 0, il = source.texture.length; i < il; i ++ ) {\n\n\t\t\tthis.texture[ i ] = source.texture[ i ].clone();\n\t\t\tthis.texture[ i ].isRenderTargetTexture = true;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass Quaternion {\n\n\tconstructor( x = 0, y = 0, z = 0, w = 1 ) {\n\n\t\tthis.isQuaternion = true;\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._w = w;\n\n\t}\n\n\tstatic slerpFlat( dst, dstOffset, src0, srcOffset0, src1, srcOffset1, t ) {\n\n\t\t// fuzz-free, array-based Quaternion SLERP operation\n\n\t\tlet x0 = src0[ srcOffset0 + 0 ],\n\t\t\ty0 = src0[ srcOffset0 + 1 ],\n\t\t\tz0 = src0[ srcOffset0 + 2 ],\n\t\t\tw0 = src0[ srcOffset0 + 3 ];\n\n\t\tconst x1 = src1[ srcOffset1 + 0 ],\n\t\t\ty1 = src1[ srcOffset1 + 1 ],\n\t\t\tz1 = src1[ srcOffset1 + 2 ],\n\t\t\tw1 = src1[ srcOffset1 + 3 ];\n\n\t\tif ( t === 0 ) {\n\n\t\t\tdst[ dstOffset + 0 ] = x0;\n\t\t\tdst[ dstOffset + 1 ] = y0;\n\t\t\tdst[ dstOffset + 2 ] = z0;\n\t\t\tdst[ dstOffset + 3 ] = w0;\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( t === 1 ) {\n\n\t\t\tdst[ dstOffset + 0 ] = x1;\n\t\t\tdst[ dstOffset + 1 ] = y1;\n\t\t\tdst[ dstOffset + 2 ] = z1;\n\t\t\tdst[ dstOffset + 3 ] = w1;\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1 ) {\n\n\t\t\tlet s = 1 - t;\n\t\t\tconst cos = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1,\n\t\t\t\tdir = ( cos >= 0 ? 1 : - 1 ),\n\t\t\t\tsqrSin = 1 - cos * cos;\n\n\t\t\t// Skip the Slerp for tiny steps to avoid numeric problems:\n\t\t\tif ( sqrSin > Number.EPSILON ) {\n\n\t\t\t\tconst sin = Math.sqrt( sqrSin ),\n\t\t\t\t\tlen = Math.atan2( sin, cos * dir );\n\n\t\t\t\ts = Math.sin( s * len ) / sin;\n\t\t\t\tt = Math.sin( t * len ) / sin;\n\n\t\t\t}\n\n\t\t\tconst tDir = t * dir;\n\n\t\t\tx0 = x0 * s + x1 * tDir;\n\t\t\ty0 = y0 * s + y1 * tDir;\n\t\t\tz0 = z0 * s + z1 * tDir;\n\t\t\tw0 = w0 * s + w1 * tDir;\n\n\t\t\t// Normalize in case we just did a lerp:\n\t\t\tif ( s === 1 - t ) {\n\n\t\t\t\tconst f = 1 / Math.sqrt( x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0 );\n\n\t\t\t\tx0 *= f;\n\t\t\t\ty0 *= f;\n\t\t\t\tz0 *= f;\n\t\t\t\tw0 *= f;\n\n\t\t\t}\n\n\t\t}\n\n\t\tdst[ dstOffset ] = x0;\n\t\tdst[ dstOffset + 1 ] = y0;\n\t\tdst[ dstOffset + 2 ] = z0;\n\t\tdst[ dstOffset + 3 ] = w0;\n\n\t}\n\n\tstatic multiplyQuaternionsFlat( dst, dstOffset, src0, srcOffset0, src1, srcOffset1 ) {\n\n\t\tconst x0 = src0[ srcOffset0 ];\n\t\tconst y0 = src0[ srcOffset0 + 1 ];\n\t\tconst z0 = src0[ srcOffset0 + 2 ];\n\t\tconst w0 = src0[ srcOffset0 + 3 ];\n\n\t\tconst x1 = src1[ srcOffset1 ];\n\t\tconst y1 = src1[ srcOffset1 + 1 ];\n\t\tconst z1 = src1[ srcOffset1 + 2 ];\n\t\tconst w1 = src1[ srcOffset1 + 3 ];\n\n\t\tdst[ dstOffset ] = x0 * w1 + w0 * x1 + y0 * z1 - z0 * y1;\n\t\tdst[ dstOffset + 1 ] = y0 * w1 + w0 * y1 + z0 * x1 - x0 * z1;\n\t\tdst[ dstOffset + 2 ] = z0 * w1 + w0 * z1 + x0 * y1 - y0 * x1;\n\t\tdst[ dstOffset + 3 ] = w0 * w1 - x0 * x1 - y0 * y1 - z0 * z1;\n\n\t\treturn dst;\n\n\t}\n\n\tget x() {\n\n\t\treturn this._x;\n\n\t}\n\n\tset x( value ) {\n\n\t\tthis._x = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tget y() {\n\n\t\treturn this._y;\n\n\t}\n\n\tset y( value ) {\n\n\t\tthis._y = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tget z() {\n\n\t\treturn this._z;\n\n\t}\n\n\tset z( value ) {\n\n\t\tthis._z = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tget w() {\n\n\t\treturn this._w;\n\n\t}\n\n\tset w( value ) {\n\n\t\tthis._w = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tset( x, y, z, w ) {\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._w = w;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this._x, this._y, this._z, this._w );\n\n\t}\n\n\tcopy( quaternion ) {\n\n\t\tthis._x = quaternion.x;\n\t\tthis._y = quaternion.y;\n\t\tthis._z = quaternion.z;\n\t\tthis._w = quaternion.w;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tsetFromEuler( euler, update ) {\n\n\t\tif ( ! ( euler && euler.isEuler ) ) {\n\n\t\t\tthrow new Error( 'THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.' );\n\n\t\t}\n\n\t\tconst x = euler._x, y = euler._y, z = euler._z, order = euler._order;\n\n\t\t// http://www.mathworks.com/matlabcentral/fileexchange/\n\t\t// \t20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/\n\t\t//\tcontent/SpinCalc.m\n\n\t\tconst cos = Math.cos;\n\t\tconst sin = Math.sin;\n\n\t\tconst c1 = cos( x / 2 );\n\t\tconst c2 = cos( y / 2 );\n\t\tconst c3 = cos( z / 2 );\n\n\t\tconst s1 = sin( x / 2 );\n\t\tconst s2 = sin( y / 2 );\n\t\tconst s3 = sin( z / 2 );\n\n\t\tswitch ( order ) {\n\n\t\t\tcase 'XYZ':\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'YXZ':\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZXY':\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZYX':\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'YZX':\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'XZY':\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tconsole.warn( 'THREE.Quaternion: .setFromEuler() encountered an unknown order: ' + order );\n\n\t\t}\n\n\t\tif ( update !== false ) this._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tsetFromAxisAngle( axis, angle ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm\n\n\t\t// assumes axis is normalized\n\n\t\tconst halfAngle = angle / 2, s = Math.sin( halfAngle );\n\n\t\tthis._x = axis.x * s;\n\t\tthis._y = axis.y * s;\n\t\tthis._z = axis.z * s;\n\t\tthis._w = Math.cos( halfAngle );\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tsetFromRotationMatrix( m ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tconst te = m.elements,\n\n\t\t\tm11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],\n\t\t\tm21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],\n\t\t\tm31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ],\n\n\t\t\ttrace = m11 + m22 + m33;\n\n\t\tif ( trace > 0 ) {\n\n\t\t\tconst s = 0.5 / Math.sqrt( trace + 1.0 );\n\n\t\t\tthis._w = 0.25 / s;\n\t\t\tthis._x = ( m32 - m23 ) * s;\n\t\t\tthis._y = ( m13 - m31 ) * s;\n\t\t\tthis._z = ( m21 - m12 ) * s;\n\n\t\t} else if ( m11 > m22 && m11 > m33 ) {\n\n\t\t\tconst s = 2.0 * Math.sqrt( 1.0 + m11 - m22 - m33 );\n\n\t\t\tthis._w = ( m32 - m23 ) / s;\n\t\t\tthis._x = 0.25 * s;\n\t\t\tthis._y = ( m12 + m21 ) / s;\n\t\t\tthis._z = ( m13 + m31 ) / s;\n\n\t\t} else if ( m22 > m33 ) {\n\n\t\t\tconst s = 2.0 * Math.sqrt( 1.0 + m22 - m11 - m33 );\n\n\t\t\tthis._w = ( m13 - m31 ) / s;\n\t\t\tthis._x = ( m12 + m21 ) / s;\n\t\t\tthis._y = 0.25 * s;\n\t\t\tthis._z = ( m23 + m32 ) / s;\n\n\t\t} else {\n\n\t\t\tconst s = 2.0 * Math.sqrt( 1.0 + m33 - m11 - m22 );\n\n\t\t\tthis._w = ( m21 - m12 ) / s;\n\t\t\tthis._x = ( m13 + m31 ) / s;\n\t\t\tthis._y = ( m23 + m32 ) / s;\n\t\t\tthis._z = 0.25 * s;\n\n\t\t}\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tsetFromUnitVectors( vFrom, vTo ) {\n\n\t\t// assumes direction vectors vFrom and vTo are normalized\n\n\t\tlet r = vFrom.dot( vTo ) + 1;\n\n\t\tif ( r < Number.EPSILON ) {\n\n\t\t\t// vFrom and vTo point in opposite directions\n\n\t\t\tr = 0;\n\n\t\t\tif ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) {\n\n\t\t\t\tthis._x = - vFrom.y;\n\t\t\t\tthis._y = vFrom.x;\n\t\t\t\tthis._z = 0;\n\t\t\t\tthis._w = r;\n\n\t\t\t} else {\n\n\t\t\t\tthis._x = 0;\n\t\t\t\tthis._y = - vFrom.z;\n\t\t\t\tthis._z = vFrom.y;\n\t\t\t\tthis._w = r;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// crossVectors( vFrom, vTo ); // inlined to avoid cyclic dependency on Vector3\n\n\t\t\tthis._x = vFrom.y * vTo.z - vFrom.z * vTo.y;\n\t\t\tthis._y = vFrom.z * vTo.x - vFrom.x * vTo.z;\n\t\t\tthis._z = vFrom.x * vTo.y - vFrom.y * vTo.x;\n\t\t\tthis._w = r;\n\n\t\t}\n\n\t\treturn this.normalize();\n\n\t}\n\n\tangleTo( q ) {\n\n\t\treturn 2 * Math.acos( Math.abs( clamp( this.dot( q ), - 1, 1 ) ) );\n\n\t}\n\n\trotateTowards( q, step ) {\n\n\t\tconst angle = this.angleTo( q );\n\n\t\tif ( angle === 0 ) return this;\n\n\t\tconst t = Math.min( 1, step / angle );\n\n\t\tthis.slerp( q, t );\n\n\t\treturn this;\n\n\t}\n\n\tidentity() {\n\n\t\treturn this.set( 0, 0, 0, 1 );\n\n\t}\n\n\tinvert() {\n\n\t\t// quaternion is assumed to have unit length\n\n\t\treturn this.conjugate();\n\n\t}\n\n\tconjugate() {\n\n\t\tthis._x *= - 1;\n\t\tthis._y *= - 1;\n\t\tthis._z *= - 1;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tdot( v ) {\n\n\t\treturn this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w;\n\n\t}\n\n\tlengthSq() {\n\n\t\treturn this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w;\n\n\t}\n\n\tlength() {\n\n\t\treturn Math.sqrt( this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w );\n\n\t}\n\n\tnormalize() {\n\n\t\tlet l = this.length();\n\n\t\tif ( l === 0 ) {\n\n\t\t\tthis._x = 0;\n\t\t\tthis._y = 0;\n\t\t\tthis._z = 0;\n\t\t\tthis._w = 1;\n\n\t\t} else {\n\n\t\t\tl = 1 / l;\n\n\t\t\tthis._x = this._x * l;\n\t\t\tthis._y = this._y * l;\n\t\t\tthis._z = this._z * l;\n\t\t\tthis._w = this._w * l;\n\n\t\t}\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tmultiply( q ) {\n\n\t\treturn this.multiplyQuaternions( this, q );\n\n\t}\n\n\tpremultiply( q ) {\n\n\t\treturn this.multiplyQuaternions( q, this );\n\n\t}\n\n\tmultiplyQuaternions( a, b ) {\n\n\t\t// from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm\n\n\t\tconst qax = a._x, qay = a._y, qaz = a._z, qaw = a._w;\n\t\tconst qbx = b._x, qby = b._y, qbz = b._z, qbw = b._w;\n\n\t\tthis._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby;\n\t\tthis._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz;\n\t\tthis._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx;\n\t\tthis._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tslerp( qb, t ) {\n\n\t\tif ( t === 0 ) return this;\n\t\tif ( t === 1 ) return this.copy( qb );\n\n\t\tconst x = this._x, y = this._y, z = this._z, w = this._w;\n\n\t\t// http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/\n\n\t\tlet cosHalfTheta = w * qb._w + x * qb._x + y * qb._y + z * qb._z;\n\n\t\tif ( cosHalfTheta < 0 ) {\n\n\t\t\tthis._w = - qb._w;\n\t\t\tthis._x = - qb._x;\n\t\t\tthis._y = - qb._y;\n\t\t\tthis._z = - qb._z;\n\n\t\t\tcosHalfTheta = - cosHalfTheta;\n\n\t\t} else {\n\n\t\t\tthis.copy( qb );\n\n\t\t}\n\n\t\tif ( cosHalfTheta >= 1.0 ) {\n\n\t\t\tthis._w = w;\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\tconst sqrSinHalfTheta = 1.0 - cosHalfTheta * cosHalfTheta;\n\n\t\tif ( sqrSinHalfTheta <= Number.EPSILON ) {\n\n\t\t\tconst s = 1 - t;\n\t\t\tthis._w = s * w + t * this._w;\n\t\t\tthis._x = s * x + t * this._x;\n\t\t\tthis._y = s * y + t * this._y;\n\t\t\tthis._z = s * z + t * this._z;\n\n\t\t\tthis.normalize();\n\t\t\tthis._onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tconst sinHalfTheta = Math.sqrt( sqrSinHalfTheta );\n\t\tconst halfTheta = Math.atan2( sinHalfTheta, cosHalfTheta );\n\t\tconst ratioA = Math.sin( ( 1 - t ) * halfTheta ) / sinHalfTheta,\n\t\t\tratioB = Math.sin( t * halfTheta ) / sinHalfTheta;\n\n\t\tthis._w = ( w * ratioA + this._w * ratioB );\n\t\tthis._x = ( x * ratioA + this._x * ratioB );\n\t\tthis._y = ( y * ratioA + this._y * ratioB );\n\t\tthis._z = ( z * ratioA + this._z * ratioB );\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tslerpQuaternions( qa, qb, t ) {\n\n\t\treturn this.copy( qa ).slerp( qb, t );\n\n\t}\n\n\trandom() {\n\n\t\t// Derived from http://planning.cs.uiuc.edu/node198.html\n\t\t// Note, this source uses w, x, y, z ordering,\n\t\t// so we swap the order below.\n\n\t\tconst u1 = Math.random();\n\t\tconst sqrt1u1 = Math.sqrt( 1 - u1 );\n\t\tconst sqrtu1 = Math.sqrt( u1 );\n\n\t\tconst u2 = 2 * Math.PI * Math.random();\n\n\t\tconst u3 = 2 * Math.PI * Math.random();\n\n\t\treturn this.set(\n\t\t\tsqrt1u1 * Math.cos( u2 ),\n\t\t\tsqrtu1 * Math.sin( u3 ),\n\t\t\tsqrtu1 * Math.cos( u3 ),\n\t\t\tsqrt1u1 * Math.sin( u2 ),\n\t\t);\n\n\t}\n\n\tequals( quaternion ) {\n\n\t\treturn ( quaternion._x === this._x ) && ( quaternion._y === this._y ) && ( quaternion._z === this._z ) && ( quaternion._w === this._w );\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis._x = array[ offset ];\n\t\tthis._y = array[ offset + 1 ];\n\t\tthis._z = array[ offset + 2 ];\n\t\tthis._w = array[ offset + 3 ];\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this._x;\n\t\tarray[ offset + 1 ] = this._y;\n\t\tarray[ offset + 2 ] = this._z;\n\t\tarray[ offset + 3 ] = this._w;\n\n\t\treturn array;\n\n\t}\n\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis._x = attribute.getX( index );\n\t\tthis._y = attribute.getY( index );\n\t\tthis._z = attribute.getZ( index );\n\t\tthis._w = attribute.getW( index );\n\n\t\treturn this;\n\n\t}\n\n\t_onChange( callback ) {\n\n\t\tthis._onChangeCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\t_onChangeCallback() {}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this._x;\n\t\tyield this._y;\n\t\tyield this._z;\n\t\tyield this._w;\n\n\t}\n\n}\n\nclass Vector3 {\n\n\tconstructor( x = 0, y = 0, z = 0 ) {\n\n\t\tVector3.prototype.isVector3 = true;\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\n\t}\n\n\tset( x, y, z ) {\n\n\t\tif ( z === undefined ) z = this.z; // sprite.scale.set(x,y)\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\n\t\treturn this;\n\n\t}\n\n\tsetScalar( scalar ) {\n\n\t\tthis.x = scalar;\n\t\tthis.y = scalar;\n\t\tthis.z = scalar;\n\n\t\treturn this;\n\n\t}\n\n\tsetX( x ) {\n\n\t\tthis.x = x;\n\n\t\treturn this;\n\n\t}\n\n\tsetY( y ) {\n\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\tsetZ( z ) {\n\n\t\tthis.z = z;\n\n\t\treturn this;\n\n\t}\n\n\tsetComponent( index, value ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: this.x = value; break;\n\t\t\tcase 1: this.y = value; break;\n\t\t\tcase 2: this.z = value; break;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tgetComponent( index ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: return this.x;\n\t\t\tcase 1: return this.y;\n\t\t\tcase 2: return this.z;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this.x, this.y, this.z );\n\n\t}\n\n\tcopy( v ) {\n\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\t\tthis.z = v.z;\n\n\t\treturn this;\n\n\t}\n\n\tadd( v ) {\n\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\t\tthis.z += v.z;\n\n\t\treturn this;\n\n\t}\n\n\taddScalar( s ) {\n\n\t\tthis.x += s;\n\t\tthis.y += s;\n\t\tthis.z += s;\n\n\t\treturn this;\n\n\t}\n\n\taddVectors( a, b ) {\n\n\t\tthis.x = a.x + b.x;\n\t\tthis.y = a.y + b.y;\n\t\tthis.z = a.z + b.z;\n\n\t\treturn this;\n\n\t}\n\n\taddScaledVector( v, s ) {\n\n\t\tthis.x += v.x * s;\n\t\tthis.y += v.y * s;\n\t\tthis.z += v.z * s;\n\n\t\treturn this;\n\n\t}\n\n\tsub( v ) {\n\n\t\tthis.x -= v.x;\n\t\tthis.y -= v.y;\n\t\tthis.z -= v.z;\n\n\t\treturn this;\n\n\t}\n\n\tsubScalar( s ) {\n\n\t\tthis.x -= s;\n\t\tthis.y -= s;\n\t\tthis.z -= s;\n\n\t\treturn this;\n\n\t}\n\n\tsubVectors( a, b ) {\n\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\t\tthis.z = a.z - b.z;\n\n\t\treturn this;\n\n\t}\n\n\tmultiply( v ) {\n\n\t\tthis.x *= v.x;\n\t\tthis.y *= v.y;\n\t\tthis.z *= v.z;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyScalar( scalar ) {\n\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\t\tthis.z *= scalar;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyVectors( a, b ) {\n\n\t\tthis.x = a.x * b.x;\n\t\tthis.y = a.y * b.y;\n\t\tthis.z = a.z * b.z;\n\n\t\treturn this;\n\n\t}\n\n\tapplyEuler( euler ) {\n\n\t\treturn this.applyQuaternion( _quaternion$4.setFromEuler( euler ) );\n\n\t}\n\n\tapplyAxisAngle( axis, angle ) {\n\n\t\treturn this.applyQuaternion( _quaternion$4.setFromAxisAngle( axis, angle ) );\n\n\t}\n\n\tapplyMatrix3( m ) {\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ] * z;\n\t\tthis.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ] * z;\n\t\tthis.z = e[ 2 ] * x + e[ 5 ] * y + e[ 8 ] * z;\n\n\t\treturn this;\n\n\t}\n\n\tapplyNormalMatrix( m ) {\n\n\t\treturn this.applyMatrix3( m ).normalize();\n\n\t}\n\n\tapplyMatrix4( m ) {\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst e = m.elements;\n\n\t\tconst w = 1 / ( e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] );\n\n\t\tthis.x = ( e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] ) * w;\n\t\tthis.y = ( e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] ) * w;\n\t\tthis.z = ( e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] ) * w;\n\n\t\treturn this;\n\n\t}\n\n\tapplyQuaternion( q ) {\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst qx = q.x, qy = q.y, qz = q.z, qw = q.w;\n\n\t\t// calculate quat * vector\n\n\t\tconst ix = qw * x + qy * z - qz * y;\n\t\tconst iy = qw * y + qz * x - qx * z;\n\t\tconst iz = qw * z + qx * y - qy * x;\n\t\tconst iw = - qx * x - qy * y - qz * z;\n\n\t\t// calculate result * inverse quat\n\n\t\tthis.x = ix * qw + iw * - qx + iy * - qz - iz * - qy;\n\t\tthis.y = iy * qw + iw * - qy + iz * - qx - ix * - qz;\n\t\tthis.z = iz * qw + iw * - qz + ix * - qy - iy * - qx;\n\n\t\treturn this;\n\n\t}\n\n\tproject( camera ) {\n\n\t\treturn this.applyMatrix4( camera.matrixWorldInverse ).applyMatrix4( camera.projectionMatrix );\n\n\t}\n\n\tunproject( camera ) {\n\n\t\treturn this.applyMatrix4( camera.projectionMatrixInverse ).applyMatrix4( camera.matrixWorld );\n\n\t}\n\n\ttransformDirection( m ) {\n\n\t\t// input: THREE.Matrix4 affine matrix\n\t\t// vector interpreted as a direction\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z;\n\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z;\n\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z;\n\n\t\treturn this.normalize();\n\n\t}\n\n\tdivide( v ) {\n\n\t\tthis.x /= v.x;\n\t\tthis.y /= v.y;\n\t\tthis.z /= v.z;\n\n\t\treturn this;\n\n\t}\n\n\tdivideScalar( scalar ) {\n\n\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t}\n\n\tmin( v ) {\n\n\t\tthis.x = Math.min( this.x, v.x );\n\t\tthis.y = Math.min( this.y, v.y );\n\t\tthis.z = Math.min( this.z, v.z );\n\n\t\treturn this;\n\n\t}\n\n\tmax( v ) {\n\n\t\tthis.x = Math.max( this.x, v.x );\n\t\tthis.y = Math.max( this.y, v.y );\n\t\tthis.z = Math.max( this.z, v.z );\n\n\t\treturn this;\n\n\t}\n\n\tclamp( min, max ) {\n\n\t\t// assumes min < max, componentwise\n\n\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\t\tthis.z = Math.max( min.z, Math.min( max.z, this.z ) );\n\n\t\treturn this;\n\n\t}\n\n\tclampScalar( minVal, maxVal ) {\n\n\t\tthis.x = Math.max( minVal, Math.min( maxVal, this.x ) );\n\t\tthis.y = Math.max( minVal, Math.min( maxVal, this.y ) );\n\t\tthis.z = Math.max( minVal, Math.min( maxVal, this.z ) );\n\n\t\treturn this;\n\n\t}\n\n\tclampLength( min, max ) {\n\n\t\tconst length = this.length();\n\n\t\treturn this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) );\n\n\t}\n\n\tfloor() {\n\n\t\tthis.x = Math.floor( this.x );\n\t\tthis.y = Math.floor( this.y );\n\t\tthis.z = Math.floor( this.z );\n\n\t\treturn this;\n\n\t}\n\n\tceil() {\n\n\t\tthis.x = Math.ceil( this.x );\n\t\tthis.y = Math.ceil( this.y );\n\t\tthis.z = Math.ceil( this.z );\n\n\t\treturn this;\n\n\t}\n\n\tround() {\n\n\t\tthis.x = Math.round( this.x );\n\t\tthis.y = Math.round( this.y );\n\t\tthis.z = Math.round( this.z );\n\n\t\treturn this;\n\n\t}\n\n\troundToZero() {\n\n\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\n\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\n\t\tthis.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z );\n\n\t\treturn this;\n\n\t}\n\n\tnegate() {\n\n\t\tthis.x = - this.x;\n\t\tthis.y = - this.y;\n\t\tthis.z = - this.z;\n\n\t\treturn this;\n\n\t}\n\n\tdot( v ) {\n\n\t\treturn this.x * v.x + this.y * v.y + this.z * v.z;\n\n\t}\n\n\t// TODO lengthSquared?\n\n\tlengthSq() {\n\n\t\treturn this.x * this.x + this.y * this.y + this.z * this.z;\n\n\t}\n\n\tlength() {\n\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z );\n\n\t}\n\n\tmanhattanLength() {\n\n\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z );\n\n\t}\n\n\tnormalize() {\n\n\t\treturn this.divideScalar( this.length() || 1 );\n\n\t}\n\n\tsetLength( length ) {\n\n\t\treturn this.normalize().multiplyScalar( length );\n\n\t}\n\n\tlerp( v, alpha ) {\n\n\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\tthis.y += ( v.y - this.y ) * alpha;\n\t\tthis.z += ( v.z - this.z ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tlerpVectors( v1, v2, alpha ) {\n\n\t\tthis.x = v1.x + ( v2.x - v1.x ) * alpha;\n\t\tthis.y = v1.y + ( v2.y - v1.y ) * alpha;\n\t\tthis.z = v1.z + ( v2.z - v1.z ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tcross( v ) {\n\n\t\treturn this.crossVectors( this, v );\n\n\t}\n\n\tcrossVectors( a, b ) {\n\n\t\tconst ax = a.x, ay = a.y, az = a.z;\n\t\tconst bx = b.x, by = b.y, bz = b.z;\n\n\t\tthis.x = ay * bz - az * by;\n\t\tthis.y = az * bx - ax * bz;\n\t\tthis.z = ax * by - ay * bx;\n\n\t\treturn this;\n\n\t}\n\n\tprojectOnVector( v ) {\n\n\t\tconst denominator = v.lengthSq();\n\n\t\tif ( denominator === 0 ) return this.set( 0, 0, 0 );\n\n\t\tconst scalar = v.dot( this ) / denominator;\n\n\t\treturn this.copy( v ).multiplyScalar( scalar );\n\n\t}\n\n\tprojectOnPlane( planeNormal ) {\n\n\t\t_vector$c.copy( this ).projectOnVector( planeNormal );\n\n\t\treturn this.sub( _vector$c );\n\n\t}\n\n\treflect( normal ) {\n\n\t\t// reflect incident vector off plane orthogonal to normal\n\t\t// normal is assumed to have unit length\n\n\t\treturn this.sub( _vector$c.copy( normal ).multiplyScalar( 2 * this.dot( normal ) ) );\n\n\t}\n\n\tangleTo( v ) {\n\n\t\tconst denominator = Math.sqrt( this.lengthSq() * v.lengthSq() );\n\n\t\tif ( denominator === 0 ) return Math.PI / 2;\n\n\t\tconst theta = this.dot( v ) / denominator;\n\n\t\t// clamp, to handle numerical problems\n\n\t\treturn Math.acos( clamp( theta, - 1, 1 ) );\n\n\t}\n\n\tdistanceTo( v ) {\n\n\t\treturn Math.sqrt( this.distanceToSquared( v ) );\n\n\t}\n\n\tdistanceToSquared( v ) {\n\n\t\tconst dx = this.x - v.x, dy = this.y - v.y, dz = this.z - v.z;\n\n\t\treturn dx * dx + dy * dy + dz * dz;\n\n\t}\n\n\tmanhattanDistanceTo( v ) {\n\n\t\treturn Math.abs( this.x - v.x ) + Math.abs( this.y - v.y ) + Math.abs( this.z - v.z );\n\n\t}\n\n\tsetFromSpherical( s ) {\n\n\t\treturn this.setFromSphericalCoords( s.radius, s.phi, s.theta );\n\n\t}\n\n\tsetFromSphericalCoords( radius, phi, theta ) {\n\n\t\tconst sinPhiRadius = Math.sin( phi ) * radius;\n\n\t\tthis.x = sinPhiRadius * Math.sin( theta );\n\t\tthis.y = Math.cos( phi ) * radius;\n\t\tthis.z = sinPhiRadius * Math.cos( theta );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromCylindrical( c ) {\n\n\t\treturn this.setFromCylindricalCoords( c.radius, c.theta, c.y );\n\n\t}\n\n\tsetFromCylindricalCoords( radius, theta, y ) {\n\n\t\tthis.x = radius * Math.sin( theta );\n\t\tthis.y = y;\n\t\tthis.z = radius * Math.cos( theta );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromMatrixPosition( m ) {\n\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 12 ];\n\t\tthis.y = e[ 13 ];\n\t\tthis.z = e[ 14 ];\n\n\t\treturn this;\n\n\t}\n\n\tsetFromMatrixScale( m ) {\n\n\t\tconst sx = this.setFromMatrixColumn( m, 0 ).length();\n\t\tconst sy = this.setFromMatrixColumn( m, 1 ).length();\n\t\tconst sz = this.setFromMatrixColumn( m, 2 ).length();\n\n\t\tthis.x = sx;\n\t\tthis.y = sy;\n\t\tthis.z = sz;\n\n\t\treturn this;\n\n\t}\n\n\tsetFromMatrixColumn( m, index ) {\n\n\t\treturn this.fromArray( m.elements, index * 4 );\n\n\t}\n\n\tsetFromMatrix3Column( m, index ) {\n\n\t\treturn this.fromArray( m.elements, index * 3 );\n\n\t}\n\n\tsetFromEuler( e ) {\n\n\t\tthis.x = e._x;\n\t\tthis.y = e._y;\n\t\tthis.z = e._z;\n\n\t\treturn this;\n\n\t}\n\n\tequals( v ) {\n\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) );\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.x = array[ offset ];\n\t\tthis.y = array[ offset + 1 ];\n\t\tthis.z = array[ offset + 2 ];\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.x;\n\t\tarray[ offset + 1 ] = this.y;\n\t\tarray[ offset + 2 ] = this.z;\n\n\t\treturn array;\n\n\t}\n\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis.x = attribute.getX( index );\n\t\tthis.y = attribute.getY( index );\n\t\tthis.z = attribute.getZ( index );\n\n\t\treturn this;\n\n\t}\n\n\trandom() {\n\n\t\tthis.x = Math.random();\n\t\tthis.y = Math.random();\n\t\tthis.z = Math.random();\n\n\t\treturn this;\n\n\t}\n\n\trandomDirection() {\n\n\t\t// Derived from https://mathworld.wolfram.com/SpherePointPicking.html\n\n\t\tconst u = ( Math.random() - 0.5 ) * 2;\n\t\tconst t = Math.random() * Math.PI * 2;\n\t\tconst f = Math.sqrt( 1 - u ** 2 );\n\n\t\tthis.x = f * Math.cos( t );\n\t\tthis.y = f * Math.sin( t );\n\t\tthis.z = u;\n\n\t\treturn this;\n\n\t}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this.x;\n\t\tyield this.y;\n\t\tyield this.z;\n\n\t}\n\n}\n\nconst _vector$c = /*@__PURE__*/ new Vector3();\nconst _quaternion$4 = /*@__PURE__*/ new Quaternion();\n\nclass Box3 {\n\n\tconstructor( min = new Vector3( + Infinity, + Infinity, + Infinity ), max = new Vector3( - Infinity, - Infinity, - Infinity ) ) {\n\n\t\tthis.isBox3 = true;\n\n\t\tthis.min = min;\n\t\tthis.max = max;\n\n\t}\n\n\tset( min, max ) {\n\n\t\tthis.min.copy( min );\n\t\tthis.max.copy( max );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromArray( array ) {\n\n\t\tlet minX = + Infinity;\n\t\tlet minY = + Infinity;\n\t\tlet minZ = + Infinity;\n\n\t\tlet maxX = - Infinity;\n\t\tlet maxY = - Infinity;\n\t\tlet maxZ = - Infinity;\n\n\t\tfor ( let i = 0, l = array.length; i < l; i += 3 ) {\n\n\t\t\tconst x = array[ i ];\n\t\t\tconst y = array[ i + 1 ];\n\t\t\tconst z = array[ i + 2 ];\n\n\t\t\tif ( x < minX ) minX = x;\n\t\t\tif ( y < minY ) minY = y;\n\t\t\tif ( z < minZ ) minZ = z;\n\n\t\t\tif ( x > maxX ) maxX = x;\n\t\t\tif ( y > maxY ) maxY = y;\n\t\t\tif ( z > maxZ ) maxZ = z;\n\n\t\t}\n\n\t\tthis.min.set( minX, minY, minZ );\n\t\tthis.max.set( maxX, maxY, maxZ );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromBufferAttribute( attribute ) {\n\n\t\tlet minX = + Infinity;\n\t\tlet minY = + Infinity;\n\t\tlet minZ = + Infinity;\n\n\t\tlet maxX = - Infinity;\n\t\tlet maxY = - Infinity;\n\t\tlet maxZ = - Infinity;\n\n\t\tfor ( let i = 0, l = attribute.count; i < l; i ++ ) {\n\n\t\t\tconst x = attribute.getX( i );\n\t\t\tconst y = attribute.getY( i );\n\t\t\tconst z = attribute.getZ( i );\n\n\t\t\tif ( x < minX ) minX = x;\n\t\t\tif ( y < minY ) minY = y;\n\t\t\tif ( z < minZ ) minZ = z;\n\n\t\t\tif ( x > maxX ) maxX = x;\n\t\t\tif ( y > maxY ) maxY = y;\n\t\t\tif ( z > maxZ ) maxZ = z;\n\n\t\t}\n\n\t\tthis.min.set( minX, minY, minZ );\n\t\tthis.max.set( maxX, maxY, maxZ );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromPoints( points ) {\n\n\t\tthis.makeEmpty();\n\n\t\tfor ( let i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\tthis.expandByPoint( points[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetFromCenterAndSize( center, size ) {\n\n\t\tconst halfSize = _vector$b.copy( size ).multiplyScalar( 0.5 );\n\n\t\tthis.min.copy( center ).sub( halfSize );\n\t\tthis.max.copy( center ).add( halfSize );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromObject( object, precise = false ) {\n\n\t\tthis.makeEmpty();\n\n\t\treturn this.expandByObject( object, precise );\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( box ) {\n\n\t\tthis.min.copy( box.min );\n\t\tthis.max.copy( box.max );\n\n\t\treturn this;\n\n\t}\n\n\tmakeEmpty() {\n\n\t\tthis.min.x = this.min.y = this.min.z = + Infinity;\n\t\tthis.max.x = this.max.y = this.max.z = - Infinity;\n\n\t\treturn this;\n\n\t}\n\n\tisEmpty() {\n\n\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\treturn ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ) || ( this.max.z < this.min.z );\n\n\t}\n\n\tgetCenter( target ) {\n\n\t\treturn this.isEmpty() ? target.set( 0, 0, 0 ) : target.addVectors( this.min, this.max ).multiplyScalar( 0.5 );\n\n\t}\n\n\tgetSize( target ) {\n\n\t\treturn this.isEmpty() ? target.set( 0, 0, 0 ) : target.subVectors( this.max, this.min );\n\n\t}\n\n\texpandByPoint( point ) {\n\n\t\tthis.min.min( point );\n\t\tthis.max.max( point );\n\n\t\treturn this;\n\n\t}\n\n\texpandByVector( vector ) {\n\n\t\tthis.min.sub( vector );\n\t\tthis.max.add( vector );\n\n\t\treturn this;\n\n\t}\n\n\texpandByScalar( scalar ) {\n\n\t\tthis.min.addScalar( - scalar );\n\t\tthis.max.addScalar( scalar );\n\n\t\treturn this;\n\n\t}\n\n\texpandByObject( object, precise = false ) {\n\n\t\t// Computes the world-axis-aligned bounding box of an object (including its children),\n\t\t// accounting for both the object's, and children's, world transforms\n\n\t\tobject.updateWorldMatrix( false, false );\n\n\t\tconst geometry = object.geometry;\n\n\t\tif ( geometry !== undefined ) {\n\n\t\t\tif ( precise && geometry.attributes != undefined && geometry.attributes.position !== undefined ) {\n\n\t\t\t\tconst position = geometry.attributes.position;\n\t\t\t\tfor ( let i = 0, l = position.count; i < l; i ++ ) {\n\n\t\t\t\t\t_vector$b.fromBufferAttribute( position, i ).applyMatrix4( object.matrixWorld );\n\t\t\t\t\tthis.expandByPoint( _vector$b );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( geometry.boundingBox === null ) {\n\n\t\t\t\t\tgeometry.computeBoundingBox();\n\n\t\t\t\t}\n\n\t\t\t\t_box$3.copy( geometry.boundingBox );\n\t\t\t\t_box$3.applyMatrix4( object.matrixWorld );\n\n\t\t\t\tthis.union( _box$3 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst children = object.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tthis.expandByObject( children[ i ], precise );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tcontainsPoint( point ) {\n\n\t\treturn point.x < this.min.x || point.x > this.max.x ||\n\t\t\tpoint.y < this.min.y || point.y > this.max.y ||\n\t\t\tpoint.z < this.min.z || point.z > this.max.z ? false : true;\n\n\t}\n\n\tcontainsBox( box ) {\n\n\t\treturn this.min.x <= box.min.x && box.max.x <= this.max.x &&\n\t\t\tthis.min.y <= box.min.y && box.max.y <= this.max.y &&\n\t\t\tthis.min.z <= box.min.z && box.max.z <= this.max.z;\n\n\t}\n\n\tgetParameter( point, target ) {\n\n\t\t// This can potentially have a divide by zero if the box\n\t\t// has a size dimension of 0.\n\n\t\treturn target.set(\n\t\t\t( point.x - this.min.x ) / ( this.max.x - this.min.x ),\n\t\t\t( point.y - this.min.y ) / ( this.max.y - this.min.y ),\n\t\t\t( point.z - this.min.z ) / ( this.max.z - this.min.z )\n\t\t);\n\n\t}\n\n\tintersectsBox( box ) {\n\n\t\t// using 6 splitting planes to rule out intersections.\n\t\treturn box.max.x < this.min.x || box.min.x > this.max.x ||\n\t\t\tbox.max.y < this.min.y || box.min.y > this.max.y ||\n\t\t\tbox.max.z < this.min.z || box.min.z > this.max.z ? false : true;\n\n\t}\n\n\tintersectsSphere( sphere ) {\n\n\t\t// Find the point on the AABB closest to the sphere center.\n\t\tthis.clampPoint( sphere.center, _vector$b );\n\n\t\t// If that point is inside the sphere, the AABB and sphere intersect.\n\t\treturn _vector$b.distanceToSquared( sphere.center ) <= ( sphere.radius * sphere.radius );\n\n\t}\n\n\tintersectsPlane( plane ) {\n\n\t\t// We compute the minimum and maximum dot product values. If those values\n\t\t// are on the same side (back or front) of the plane, then there is no intersection.\n\n\t\tlet min, max;\n\n\t\tif ( plane.normal.x > 0 ) {\n\n\t\t\tmin = plane.normal.x * this.min.x;\n\t\t\tmax = plane.normal.x * this.max.x;\n\n\t\t} else {\n\n\t\t\tmin = plane.normal.x * this.max.x;\n\t\t\tmax = plane.normal.x * this.min.x;\n\n\t\t}\n\n\t\tif ( plane.normal.y > 0 ) {\n\n\t\t\tmin += plane.normal.y * this.min.y;\n\t\t\tmax += plane.normal.y * this.max.y;\n\n\t\t} else {\n\n\t\t\tmin += plane.normal.y * this.max.y;\n\t\t\tmax += plane.normal.y * this.min.y;\n\n\t\t}\n\n\t\tif ( plane.normal.z > 0 ) {\n\n\t\t\tmin += plane.normal.z * this.min.z;\n\t\t\tmax += plane.normal.z * this.max.z;\n\n\t\t} else {\n\n\t\t\tmin += plane.normal.z * this.max.z;\n\t\t\tmax += plane.normal.z * this.min.z;\n\n\t\t}\n\n\t\treturn ( min <= - plane.constant && max >= - plane.constant );\n\n\t}\n\n\tintersectsTriangle( triangle ) {\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// compute box center and extents\n\t\tthis.getCenter( _center );\n\t\t_extents.subVectors( this.max, _center );\n\n\t\t// translate triangle to aabb origin\n\t\t_v0$2.subVectors( triangle.a, _center );\n\t\t_v1$7.subVectors( triangle.b, _center );\n\t\t_v2$3.subVectors( triangle.c, _center );\n\n\t\t// compute edge vectors for triangle\n\t\t_f0.subVectors( _v1$7, _v0$2 );\n\t\t_f1.subVectors( _v2$3, _v1$7 );\n\t\t_f2.subVectors( _v0$2, _v2$3 );\n\n\t\t// test against axes that are given by cross product combinations of the edges of the triangle and the edges of the aabb\n\t\t// make an axis testing of each of the 3 sides of the aabb against each of the 3 sides of the triangle = 9 axis of separation\n\t\t// axis_ij = u_i x f_j (u0, u1, u2 = face normals of aabb = x,y,z axes vectors since aabb is axis aligned)\n\t\tlet axes = [\n\t\t\t0, - _f0.z, _f0.y, 0, - _f1.z, _f1.y, 0, - _f2.z, _f2.y,\n\t\t\t_f0.z, 0, - _f0.x, _f1.z, 0, - _f1.x, _f2.z, 0, - _f2.x,\n\t\t\t- _f0.y, _f0.x, 0, - _f1.y, _f1.x, 0, - _f2.y, _f2.x, 0\n\t\t];\n\t\tif ( ! satForAxes( axes, _v0$2, _v1$7, _v2$3, _extents ) ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// test 3 face normals from the aabb\n\t\taxes = [ 1, 0, 0, 0, 1, 0, 0, 0, 1 ];\n\t\tif ( ! satForAxes( axes, _v0$2, _v1$7, _v2$3, _extents ) ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// finally testing the face normal of the triangle\n\t\t// use already existing triangle edge vectors here\n\t\t_triangleNormal.crossVectors( _f0, _f1 );\n\t\taxes = [ _triangleNormal.x, _triangleNormal.y, _triangleNormal.z ];\n\n\t\treturn satForAxes( axes, _v0$2, _v1$7, _v2$3, _extents );\n\n\t}\n\n\tclampPoint( point, target ) {\n\n\t\treturn target.copy( point ).clamp( this.min, this.max );\n\n\t}\n\n\tdistanceToPoint( point ) {\n\n\t\tconst clampedPoint = _vector$b.copy( point ).clamp( this.min, this.max );\n\n\t\treturn clampedPoint.sub( point ).length();\n\n\t}\n\n\tgetBoundingSphere( target ) {\n\n\t\tthis.getCenter( target.center );\n\n\t\ttarget.radius = this.getSize( _vector$b ).length() * 0.5;\n\n\t\treturn target;\n\n\t}\n\n\tintersect( box ) {\n\n\t\tthis.min.max( box.min );\n\t\tthis.max.min( box.max );\n\n\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\tif ( this.isEmpty() ) this.makeEmpty();\n\n\t\treturn this;\n\n\t}\n\n\tunion( box ) {\n\n\t\tthis.min.min( box.min );\n\t\tthis.max.max( box.max );\n\n\t\treturn this;\n\n\t}\n\n\tapplyMatrix4( matrix ) {\n\n\t\t// transform of empty box is an empty box.\n\t\tif ( this.isEmpty() ) return this;\n\n\t\t// NOTE: I am using a binary pattern to specify all 2^3 combinations below\n\t\t_points[ 0 ].set( this.min.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 000\n\t\t_points[ 1 ].set( this.min.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 001\n\t\t_points[ 2 ].set( this.min.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 010\n\t\t_points[ 3 ].set( this.min.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 011\n\t\t_points[ 4 ].set( this.max.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 100\n\t\t_points[ 5 ].set( this.max.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 101\n\t\t_points[ 6 ].set( this.max.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 110\n\t\t_points[ 7 ].set( this.max.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 111\n\n\t\tthis.setFromPoints( _points );\n\n\t\treturn this;\n\n\t}\n\n\ttranslate( offset ) {\n\n\t\tthis.min.add( offset );\n\t\tthis.max.add( offset );\n\n\t\treturn this;\n\n\t}\n\n\tequals( box ) {\n\n\t\treturn box.min.equals( this.min ) && box.max.equals( this.max );\n\n\t}\n\n}\n\nconst _points = [\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3()\n];\n\nconst _vector$b = /*@__PURE__*/ new Vector3();\n\nconst _box$3 = /*@__PURE__*/ new Box3();\n\n// triangle centered vertices\n\nconst _v0$2 = /*@__PURE__*/ new Vector3();\nconst _v1$7 = /*@__PURE__*/ new Vector3();\nconst _v2$3 = /*@__PURE__*/ new Vector3();\n\n// triangle edge vectors\n\nconst _f0 = /*@__PURE__*/ new Vector3();\nconst _f1 = /*@__PURE__*/ new Vector3();\nconst _f2 = /*@__PURE__*/ new Vector3();\n\nconst _center = /*@__PURE__*/ new Vector3();\nconst _extents = /*@__PURE__*/ new Vector3();\nconst _triangleNormal = /*@__PURE__*/ new Vector3();\nconst _testAxis = /*@__PURE__*/ new Vector3();\n\nfunction satForAxes( axes, v0, v1, v2, extents ) {\n\n\tfor ( let i = 0, j = axes.length - 3; i <= j; i += 3 ) {\n\n\t\t_testAxis.fromArray( axes, i );\n\t\t// project the aabb onto the separating axis\n\t\tconst r = extents.x * Math.abs( _testAxis.x ) + extents.y * Math.abs( _testAxis.y ) + extents.z * Math.abs( _testAxis.z );\n\t\t// project all 3 vertices of the triangle onto the separating axis\n\t\tconst p0 = v0.dot( _testAxis );\n\t\tconst p1 = v1.dot( _testAxis );\n\t\tconst p2 = v2.dot( _testAxis );\n\t\t// actual test, basically see if either of the most extreme of the triangle points intersects r\n\t\tif ( Math.max( - Math.max( p0, p1, p2 ), Math.min( p0, p1, p2 ) ) > r ) {\n\n\t\t\t// points of the projected triangle are outside the projected half-length of the aabb\n\t\t\t// the axis is separating and we can exit\n\t\t\treturn false;\n\n\t\t}\n\n\t}\n\n\treturn true;\n\n}\n\nconst _box$2 = /*@__PURE__*/ new Box3();\nconst _v1$6 = /*@__PURE__*/ new Vector3();\nconst _toFarthestPoint = /*@__PURE__*/ new Vector3();\nconst _toPoint = /*@__PURE__*/ new Vector3();\n\nclass Sphere {\n\n\tconstructor( center = new Vector3(), radius = - 1 ) {\n\n\t\tthis.center = center;\n\t\tthis.radius = radius;\n\n\t}\n\n\tset( center, radius ) {\n\n\t\tthis.center.copy( center );\n\t\tthis.radius = radius;\n\n\t\treturn this;\n\n\t}\n\n\tsetFromPoints( points, optionalCenter ) {\n\n\t\tconst center = this.center;\n\n\t\tif ( optionalCenter !== undefined ) {\n\n\t\t\tcenter.copy( optionalCenter );\n\n\t\t} else {\n\n\t\t\t_box$2.setFromPoints( points ).getCenter( center );\n\n\t\t}\n\n\t\tlet maxRadiusSq = 0;\n\n\t\tfor ( let i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( points[ i ] ) );\n\n\t\t}\n\n\t\tthis.radius = Math.sqrt( maxRadiusSq );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( sphere ) {\n\n\t\tthis.center.copy( sphere.center );\n\t\tthis.radius = sphere.radius;\n\n\t\treturn this;\n\n\t}\n\n\tisEmpty() {\n\n\t\treturn ( this.radius < 0 );\n\n\t}\n\n\tmakeEmpty() {\n\n\t\tthis.center.set( 0, 0, 0 );\n\t\tthis.radius = - 1;\n\n\t\treturn this;\n\n\t}\n\n\tcontainsPoint( point ) {\n\n\t\treturn ( point.distanceToSquared( this.center ) <= ( this.radius * this.radius ) );\n\n\t}\n\n\tdistanceToPoint( point ) {\n\n\t\treturn ( point.distanceTo( this.center ) - this.radius );\n\n\t}\n\n\tintersectsSphere( sphere ) {\n\n\t\tconst radiusSum = this.radius + sphere.radius;\n\n\t\treturn sphere.center.distanceToSquared( this.center ) <= ( radiusSum * radiusSum );\n\n\t}\n\n\tintersectsBox( box ) {\n\n\t\treturn box.intersectsSphere( this );\n\n\t}\n\n\tintersectsPlane( plane ) {\n\n\t\treturn Math.abs( plane.distanceToPoint( this.center ) ) <= this.radius;\n\n\t}\n\n\tclampPoint( point, target ) {\n\n\t\tconst deltaLengthSq = this.center.distanceToSquared( point );\n\n\t\ttarget.copy( point );\n\n\t\tif ( deltaLengthSq > ( this.radius * this.radius ) ) {\n\n\t\t\ttarget.sub( this.center ).normalize();\n\t\t\ttarget.multiplyScalar( this.radius ).add( this.center );\n\n\t\t}\n\n\t\treturn target;\n\n\t}\n\n\tgetBoundingBox( target ) {\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\t// Empty sphere produces empty bounding box\n\t\t\ttarget.makeEmpty();\n\t\t\treturn target;\n\n\t\t}\n\n\t\ttarget.set( this.center, this.center );\n\t\ttarget.expandByScalar( this.radius );\n\n\t\treturn target;\n\n\t}\n\n\tapplyMatrix4( matrix ) {\n\n\t\tthis.center.applyMatrix4( matrix );\n\t\tthis.radius = this.radius * matrix.getMaxScaleOnAxis();\n\n\t\treturn this;\n\n\t}\n\n\ttranslate( offset ) {\n\n\t\tthis.center.add( offset );\n\n\t\treturn this;\n\n\t}\n\n\texpandByPoint( point ) {\n\n\t\t// from https://github.com/juj/MathGeoLib/blob/2940b99b99cfe575dd45103ef20f4019dee15b54/src/Geometry/Sphere.cpp#L649-L671\n\n\t\t_toPoint.subVectors( point, this.center );\n\n\t\tconst lengthSq = _toPoint.lengthSq();\n\n\t\tif ( lengthSq > ( this.radius * this.radius ) ) {\n\n\t\t\tconst length = Math.sqrt( lengthSq );\n\t\t\tconst missingRadiusHalf = ( length - this.radius ) * 0.5;\n\n\t\t\t// Nudge this sphere towards the target point. Add half the missing distance to radius,\n\t\t\t// and the other half to position. This gives a tighter enclosure, instead of if\n\t\t\t// the whole missing distance were just added to radius.\n\n\t\t\tthis.center.add( _toPoint.multiplyScalar( missingRadiusHalf / length ) );\n\t\t\tthis.radius += missingRadiusHalf;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tunion( sphere ) {\n\n\t\t// from https://github.com/juj/MathGeoLib/blob/2940b99b99cfe575dd45103ef20f4019dee15b54/src/Geometry/Sphere.cpp#L759-L769\n\n\t\t// To enclose another sphere into this sphere, we only need to enclose two points:\n\t\t// 1) Enclose the farthest point on the other sphere into this sphere.\n\t\t// 2) Enclose the opposite point of the farthest point into this sphere.\n\n\t\t if ( this.center.equals( sphere.center ) === true ) {\n\n\t\t\t _toFarthestPoint.set( 0, 0, 1 ).multiplyScalar( sphere.radius );\n\n\n\t\t} else {\n\n\t\t\t_toFarthestPoint.subVectors( sphere.center, this.center ).normalize().multiplyScalar( sphere.radius );\n\n\t\t}\n\n\t\tthis.expandByPoint( _v1$6.copy( sphere.center ).add( _toFarthestPoint ) );\n\t\tthis.expandByPoint( _v1$6.copy( sphere.center ).sub( _toFarthestPoint ) );\n\n\t\treturn this;\n\n\t}\n\n\tequals( sphere ) {\n\n\t\treturn sphere.center.equals( this.center ) && ( sphere.radius === this.radius );\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nconst _vector$a = /*@__PURE__*/ new Vector3();\nconst _segCenter = /*@__PURE__*/ new Vector3();\nconst _segDir = /*@__PURE__*/ new Vector3();\nconst _diff = /*@__PURE__*/ new Vector3();\n\nconst _edge1 = /*@__PURE__*/ new Vector3();\nconst _edge2 = /*@__PURE__*/ new Vector3();\nconst _normal$1 = /*@__PURE__*/ new Vector3();\n\nclass Ray {\n\n\tconstructor( origin = new Vector3(), direction = new Vector3( 0, 0, - 1 ) ) {\n\n\t\tthis.origin = origin;\n\t\tthis.direction = direction;\n\n\t}\n\n\tset( origin, direction ) {\n\n\t\tthis.origin.copy( origin );\n\t\tthis.direction.copy( direction );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( ray ) {\n\n\t\tthis.origin.copy( ray.origin );\n\t\tthis.direction.copy( ray.direction );\n\n\t\treturn this;\n\n\t}\n\n\tat( t, target ) {\n\n\t\treturn target.copy( this.direction ).multiplyScalar( t ).add( this.origin );\n\n\t}\n\n\tlookAt( v ) {\n\n\t\tthis.direction.copy( v ).sub( this.origin ).normalize();\n\n\t\treturn this;\n\n\t}\n\n\trecast( t ) {\n\n\t\tthis.origin.copy( this.at( t, _vector$a ) );\n\n\t\treturn this;\n\n\t}\n\n\tclosestPointToPoint( point, target ) {\n\n\t\ttarget.subVectors( point, this.origin );\n\n\t\tconst directionDistance = target.dot( this.direction );\n\n\t\tif ( directionDistance < 0 ) {\n\n\t\t\treturn target.copy( this.origin );\n\n\t\t}\n\n\t\treturn target.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin );\n\n\t}\n\n\tdistanceToPoint( point ) {\n\n\t\treturn Math.sqrt( this.distanceSqToPoint( point ) );\n\n\t}\n\n\tdistanceSqToPoint( point ) {\n\n\t\tconst directionDistance = _vector$a.subVectors( point, this.origin ).dot( this.direction );\n\n\t\t// point behind the ray\n\n\t\tif ( directionDistance < 0 ) {\n\n\t\t\treturn this.origin.distanceToSquared( point );\n\n\t\t}\n\n\t\t_vector$a.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin );\n\n\t\treturn _vector$a.distanceToSquared( point );\n\n\t}\n\n\tdistanceSqToSegment( v0, v1, optionalPointOnRay, optionalPointOnSegment ) {\n\n\t\t// from https://github.com/pmjoniak/GeometricTools/blob/master/GTEngine/Include/Mathematics/GteDistRaySegment.h\n\t\t// It returns the min distance between the ray and the segment\n\t\t// defined by v0 and v1\n\t\t// It can also set two optional targets :\n\t\t// - The closest point on the ray\n\t\t// - The closest point on the segment\n\n\t\t_segCenter.copy( v0 ).add( v1 ).multiplyScalar( 0.5 );\n\t\t_segDir.copy( v1 ).sub( v0 ).normalize();\n\t\t_diff.copy( this.origin ).sub( _segCenter );\n\n\t\tconst segExtent = v0.distanceTo( v1 ) * 0.5;\n\t\tconst a01 = - this.direction.dot( _segDir );\n\t\tconst b0 = _diff.dot( this.direction );\n\t\tconst b1 = - _diff.dot( _segDir );\n\t\tconst c = _diff.lengthSq();\n\t\tconst det = Math.abs( 1 - a01 * a01 );\n\t\tlet s0, s1, sqrDist, extDet;\n\n\t\tif ( det > 0 ) {\n\n\t\t\t// The ray and segment are not parallel.\n\n\t\t\ts0 = a01 * b1 - b0;\n\t\t\ts1 = a01 * b0 - b1;\n\t\t\textDet = segExtent * det;\n\n\t\t\tif ( s0 >= 0 ) {\n\n\t\t\t\tif ( s1 >= - extDet ) {\n\n\t\t\t\t\tif ( s1 <= extDet ) {\n\n\t\t\t\t\t\t// region 0\n\t\t\t\t\t\t// Minimum at interior points of ray and segment.\n\n\t\t\t\t\t\tconst invDet = 1 / det;\n\t\t\t\t\t\ts0 *= invDet;\n\t\t\t\t\t\ts1 *= invDet;\n\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} else {\n\n\t\t\t\t\t\t// region 1\n\n\t\t\t\t\t\ts1 = segExtent;\n\t\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// region 5\n\n\t\t\t\t\ts1 = - 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} else {\n\n\t\t\t\tif ( s1 <= - extDet ) {\n\n\t\t\t\t\t// region 4\n\n\t\t\t\t\ts0 = Math.max( 0, - ( - a01 * segExtent + b0 ) );\n\t\t\t\t\ts1 = ( s0 > 0 ) ? - segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t} else if ( s1 <= extDet ) {\n\n\t\t\t\t\t// region 3\n\n\t\t\t\t\ts0 = 0;\n\t\t\t\t\ts1 = Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\tsqrDist = s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// region 2\n\n\t\t\t\t\ts0 = Math.max( 0, - ( a01 * segExtent + b0 ) );\n\t\t\t\t\ts1 = ( s0 > 0 ) ? segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// Ray and segment are parallel.\n\n\t\t\ts1 = ( a01 > 0 ) ? - segExtent : segExtent;\n\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t}\n\n\t\tif ( optionalPointOnRay ) {\n\n\t\t\toptionalPointOnRay.copy( this.direction ).multiplyScalar( s0 ).add( this.origin );\n\n\t\t}\n\n\t\tif ( optionalPointOnSegment ) {\n\n\t\t\toptionalPointOnSegment.copy( _segDir ).multiplyScalar( s1 ).add( _segCenter );\n\n\t\t}\n\n\t\treturn sqrDist;\n\n\t}\n\n\tintersectSphere( sphere, target ) {\n\n\t\t_vector$a.subVectors( sphere.center, this.origin );\n\t\tconst tca = _vector$a.dot( this.direction );\n\t\tconst d2 = _vector$a.dot( _vector$a ) - tca * tca;\n\t\tconst radius2 = sphere.radius * sphere.radius;\n\n\t\tif ( d2 > radius2 ) return null;\n\n\t\tconst thc = Math.sqrt( radius2 - d2 );\n\n\t\t// t0 = first intersect point - entrance on front of sphere\n\t\tconst t0 = tca - thc;\n\n\t\t// t1 = second intersect point - exit point on back of sphere\n\t\tconst t1 = tca + thc;\n\n\t\t// test to see if both t0 and t1 are behind the ray - if so, return null\n\t\tif ( t0 < 0 && t1 < 0 ) return null;\n\n\t\t// test to see if t0 is behind the ray:\n\t\t// if it is, the ray is inside the sphere, so return the second exit point scaled by t1,\n\t\t// in order to always return an intersect point that is in front of the ray.\n\t\tif ( t0 < 0 ) return this.at( t1, target );\n\n\t\t// else t0 is in front of the ray, so return the first collision point scaled by t0\n\t\treturn this.at( t0, target );\n\n\t}\n\n\tintersectsSphere( sphere ) {\n\n\t\treturn this.distanceSqToPoint( sphere.center ) <= ( sphere.radius * sphere.radius );\n\n\t}\n\n\tdistanceToPlane( plane ) {\n\n\t\tconst denominator = plane.normal.dot( this.direction );\n\n\t\tif ( denominator === 0 ) {\n\n\t\t\t// line is coplanar, return origin\n\t\t\tif ( plane.distanceToPoint( this.origin ) === 0 ) {\n\n\t\t\t\treturn 0;\n\n\t\t\t}\n\n\t\t\t// Null is preferable to undefined since undefined means.... it is undefined\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst t = - ( this.origin.dot( plane.normal ) + plane.constant ) / denominator;\n\n\t\t// Return if the ray never intersects the plane\n\n\t\treturn t >= 0 ? t : null;\n\n\t}\n\n\tintersectPlane( plane, target ) {\n\n\t\tconst t = this.distanceToPlane( plane );\n\n\t\tif ( t === null ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\treturn this.at( t, target );\n\n\t}\n\n\tintersectsPlane( plane ) {\n\n\t\t// check if the ray lies on the plane first\n\n\t\tconst distToPoint = plane.distanceToPoint( this.origin );\n\n\t\tif ( distToPoint === 0 ) {\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\tconst denominator = plane.normal.dot( this.direction );\n\n\t\tif ( denominator * distToPoint < 0 ) {\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\t// ray origin is behind the plane (and is pointing behind it)\n\n\t\treturn false;\n\n\t}\n\n\tintersectBox( box, target ) {\n\n\t\tlet tmin, tmax, tymin, tymax, tzmin, tzmax;\n\n\t\tconst invdirx = 1 / this.direction.x,\n\t\t\tinvdiry = 1 / this.direction.y,\n\t\t\tinvdirz = 1 / this.direction.z;\n\n\t\tconst origin = this.origin;\n\n\t\tif ( invdirx >= 0 ) {\n\n\t\t\ttmin = ( box.min.x - origin.x ) * invdirx;\n\t\t\ttmax = ( box.max.x - origin.x ) * invdirx;\n\n\t\t} else {\n\n\t\t\ttmin = ( box.max.x - origin.x ) * invdirx;\n\t\t\ttmax = ( box.min.x - origin.x ) * invdirx;\n\n\t\t}\n\n\t\tif ( invdiry >= 0 ) {\n\n\t\t\ttymin = ( box.min.y - origin.y ) * invdiry;\n\t\t\ttymax = ( box.max.y - origin.y ) * invdiry;\n\n\t\t} else {\n\n\t\t\ttymin = ( box.max.y - origin.y ) * invdiry;\n\t\t\ttymax = ( box.min.y - origin.y ) * invdiry;\n\n\t\t}\n\n\t\tif ( ( tmin > tymax ) || ( tymin > tmax ) ) return null;\n\n\t\t// These lines also handle the case where tmin or tmax is NaN\n\t\t// (result of 0 * Infinity). x !== x returns true if x is NaN\n\n\t\tif ( tymin > tmin || tmin !== tmin ) tmin = tymin;\n\n\t\tif ( tymax < tmax || tmax !== tmax ) tmax = tymax;\n\n\t\tif ( invdirz >= 0 ) {\n\n\t\t\ttzmin = ( box.min.z - origin.z ) * invdirz;\n\t\t\ttzmax = ( box.max.z - origin.z ) * invdirz;\n\n\t\t} else {\n\n\t\t\ttzmin = ( box.max.z - origin.z ) * invdirz;\n\t\t\ttzmax = ( box.min.z - origin.z ) * invdirz;\n\n\t\t}\n\n\t\tif ( ( tmin > tzmax ) || ( tzmin > tmax ) ) return null;\n\n\t\tif ( tzmin > tmin || tmin !== tmin ) tmin = tzmin;\n\n\t\tif ( tzmax < tmax || tmax !== tmax ) tmax = tzmax;\n\n\t\t//return point closest to the ray (positive side)\n\n\t\tif ( tmax < 0 ) return null;\n\n\t\treturn this.at( tmin >= 0 ? tmin : tmax, target );\n\n\t}\n\n\tintersectsBox( box ) {\n\n\t\treturn this.intersectBox( box, _vector$a ) !== null;\n\n\t}\n\n\tintersectTriangle( a, b, c, backfaceCulling, target ) {\n\n\t\t// Compute the offset origin, edges, and normal.\n\n\t\t// from https://github.com/pmjoniak/GeometricTools/blob/master/GTEngine/Include/Mathematics/GteIntrRay3Triangle3.h\n\n\t\t_edge1.subVectors( b, a );\n\t\t_edge2.subVectors( c, a );\n\t\t_normal$1.crossVectors( _edge1, _edge2 );\n\n\t\t// Solve Q + t*D = b1*E1 + b2*E2 (Q = kDiff, D = ray direction,\n\t\t// E1 = kEdge1, E2 = kEdge2, N = Cross(E1,E2)) by\n\t\t// |Dot(D,N)|*b1 = sign(Dot(D,N))*Dot(D,Cross(Q,E2))\n\t\t// |Dot(D,N)|*b2 = sign(Dot(D,N))*Dot(D,Cross(E1,Q))\n\t\t// |Dot(D,N)|*t = -sign(Dot(D,N))*Dot(Q,N)\n\t\tlet DdN = this.direction.dot( _normal$1 );\n\t\tlet sign;\n\n\t\tif ( DdN > 0 ) {\n\n\t\t\tif ( backfaceCulling ) return null;\n\t\t\tsign = 1;\n\n\t\t} else if ( DdN < 0 ) {\n\n\t\t\tsign = - 1;\n\t\t\tDdN = - DdN;\n\n\t\t} else {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t_diff.subVectors( this.origin, a );\n\t\tconst DdQxE2 = sign * this.direction.dot( _edge2.crossVectors( _diff, _edge2 ) );\n\n\t\t// b1 < 0, no intersection\n\t\tif ( DdQxE2 < 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst DdE1xQ = sign * this.direction.dot( _edge1.cross( _diff ) );\n\n\t\t// b2 < 0, no intersection\n\t\tif ( DdE1xQ < 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// b1+b2 > 1, no intersection\n\t\tif ( DdQxE2 + DdE1xQ > DdN ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// Line intersects triangle, check if ray does.\n\t\tconst QdN = - sign * _diff.dot( _normal$1 );\n\n\t\t// t < 0, no intersection\n\t\tif ( QdN < 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// Ray intersects triangle.\n\t\treturn this.at( QdN / DdN, target );\n\n\t}\n\n\tapplyMatrix4( matrix4 ) {\n\n\t\tthis.origin.applyMatrix4( matrix4 );\n\t\tthis.direction.transformDirection( matrix4 );\n\n\t\treturn this;\n\n\t}\n\n\tequals( ray ) {\n\n\t\treturn ray.origin.equals( this.origin ) && ray.direction.equals( this.direction );\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nclass Matrix4 {\n\n\tconstructor() {\n\n\t\tMatrix4.prototype.isMatrix4 = true;\n\n\t\tthis.elements = [\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}\n\n\tset( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] = n11; te[ 4 ] = n12; te[ 8 ] = n13; te[ 12 ] = n14;\n\t\tte[ 1 ] = n21; te[ 5 ] = n22; te[ 9 ] = n23; te[ 13 ] = n24;\n\t\tte[ 2 ] = n31; te[ 6 ] = n32; te[ 10 ] = n33; te[ 14 ] = n34;\n\t\tte[ 3 ] = n41; te[ 7 ] = n42; te[ 11 ] = n43; te[ 15 ] = n44;\n\n\t\treturn this;\n\n\t}\n\n\tidentity() {\n\n\t\tthis.set(\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\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new Matrix4().fromArray( this.elements );\n\n\t}\n\n\tcopy( m ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = m.elements;\n\n\t\tte[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ]; te[ 3 ] = me[ 3 ];\n\t\tte[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ]; te[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ];\n\t\tte[ 8 ] = me[ 8 ]; te[ 9 ] = me[ 9 ]; te[ 10 ] = me[ 10 ]; te[ 11 ] = me[ 11 ];\n\t\tte[ 12 ] = me[ 12 ]; te[ 13 ] = me[ 13 ]; te[ 14 ] = me[ 14 ]; te[ 15 ] = me[ 15 ];\n\n\t\treturn this;\n\n\t}\n\n\tcopyPosition( m ) {\n\n\t\tconst te = this.elements, me = m.elements;\n\n\t\tte[ 12 ] = me[ 12 ];\n\t\tte[ 13 ] = me[ 13 ];\n\t\tte[ 14 ] = me[ 14 ];\n\n\t\treturn this;\n\n\t}\n\n\tsetFromMatrix3( m ) {\n\n\t\tconst me = m.elements;\n\n\t\tthis.set(\n\n\t\t\tme[ 0 ], me[ 3 ], me[ 6 ], 0,\n\t\t\tme[ 1 ], me[ 4 ], me[ 7 ], 0,\n\t\t\tme[ 2 ], me[ 5 ], me[ 8 ], 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\textractBasis( xAxis, yAxis, zAxis ) {\n\n\t\txAxis.setFromMatrixColumn( this, 0 );\n\t\tyAxis.setFromMatrixColumn( this, 1 );\n\t\tzAxis.setFromMatrixColumn( this, 2 );\n\n\t\treturn this;\n\n\t}\n\n\tmakeBasis( xAxis, yAxis, zAxis ) {\n\n\t\tthis.set(\n\t\t\txAxis.x, yAxis.x, zAxis.x, 0,\n\t\t\txAxis.y, yAxis.y, zAxis.y, 0,\n\t\t\txAxis.z, yAxis.z, zAxis.z, 0,\n\t\t\t0, 0, 0, 1\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\textractRotation( m ) {\n\n\t\t// this method does not support reflection matrices\n\n\t\tconst te = this.elements;\n\t\tconst me = m.elements;\n\n\t\tconst scaleX = 1 / _v1$5.setFromMatrixColumn( m, 0 ).length();\n\t\tconst scaleY = 1 / _v1$5.setFromMatrixColumn( m, 1 ).length();\n\t\tconst scaleZ = 1 / _v1$5.setFromMatrixColumn( m, 2 ).length();\n\n\t\tte[ 0 ] = me[ 0 ] * scaleX;\n\t\tte[ 1 ] = me[ 1 ] * scaleX;\n\t\tte[ 2 ] = me[ 2 ] * scaleX;\n\t\tte[ 3 ] = 0;\n\n\t\tte[ 4 ] = me[ 4 ] * scaleY;\n\t\tte[ 5 ] = me[ 5 ] * scaleY;\n\t\tte[ 6 ] = me[ 6 ] * scaleY;\n\t\tte[ 7 ] = 0;\n\n\t\tte[ 8 ] = me[ 8 ] * scaleZ;\n\t\tte[ 9 ] = me[ 9 ] * scaleZ;\n\t\tte[ 10 ] = me[ 10 ] * scaleZ;\n\t\tte[ 11 ] = 0;\n\n\t\tte[ 12 ] = 0;\n\t\tte[ 13 ] = 0;\n\t\tte[ 14 ] = 0;\n\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\tmakeRotationFromEuler( euler ) {\n\n\t\tconst te = this.elements;\n\n\t\tconst x = euler.x, y = euler.y, z = euler.z;\n\t\tconst a = Math.cos( x ), b = Math.sin( x );\n\t\tconst c = Math.cos( y ), d = Math.sin( y );\n\t\tconst e = Math.cos( z ), f = Math.sin( z );\n\n\t\tif ( euler.order === 'XYZ' ) {\n\n\t\t\tconst ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = - c * f;\n\t\t\tte[ 8 ] = d;\n\n\t\t\tte[ 1 ] = af + be * d;\n\t\t\tte[ 5 ] = ae - bf * d;\n\t\t\tte[ 9 ] = - b * c;\n\n\t\t\tte[ 2 ] = bf - ae * d;\n\t\t\tte[ 6 ] = be + af * d;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'YXZ' ) {\n\n\t\t\tconst ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\tte[ 0 ] = ce + df * b;\n\t\t\tte[ 4 ] = de * b - cf;\n\t\t\tte[ 8 ] = a * d;\n\n\t\t\tte[ 1 ] = a * f;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = - b;\n\n\t\t\tte[ 2 ] = cf * b - de;\n\t\t\tte[ 6 ] = df + ce * b;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'ZXY' ) {\n\n\t\t\tconst ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\tte[ 0 ] = ce - df * b;\n\t\t\tte[ 4 ] = - a * f;\n\t\t\tte[ 8 ] = de + cf * b;\n\n\t\t\tte[ 1 ] = cf + de * b;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = df - ce * b;\n\n\t\t\tte[ 2 ] = - a * d;\n\t\t\tte[ 6 ] = b;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'ZYX' ) {\n\n\t\t\tconst ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = be * d - af;\n\t\t\tte[ 8 ] = ae * d + bf;\n\n\t\t\tte[ 1 ] = c * f;\n\t\t\tte[ 5 ] = bf * d + ae;\n\t\t\tte[ 9 ] = af * d - be;\n\n\t\t\tte[ 2 ] = - d;\n\t\t\tte[ 6 ] = b * c;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'YZX' ) {\n\n\t\t\tconst ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = bd - ac * f;\n\t\t\tte[ 8 ] = bc * f + ad;\n\n\t\t\tte[ 1 ] = f;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = - b * e;\n\n\t\t\tte[ 2 ] = - d * e;\n\t\t\tte[ 6 ] = ad * f + bc;\n\t\t\tte[ 10 ] = ac - bd * f;\n\n\t\t} else if ( euler.order === 'XZY' ) {\n\n\t\t\tconst ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = - f;\n\t\t\tte[ 8 ] = d * e;\n\n\t\t\tte[ 1 ] = ac * f + bd;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = ad * f - bc;\n\n\t\t\tte[ 2 ] = bc * f - ad;\n\t\t\tte[ 6 ] = b * e;\n\t\t\tte[ 10 ] = bd * f + ac;\n\n\t\t}\n\n\t\t// bottom row\n\t\tte[ 3 ] = 0;\n\t\tte[ 7 ] = 0;\n\t\tte[ 11 ] = 0;\n\n\t\t// last column\n\t\tte[ 12 ] = 0;\n\t\tte[ 13 ] = 0;\n\t\tte[ 14 ] = 0;\n\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\tmakeRotationFromQuaternion( q ) {\n\n\t\treturn this.compose( _zero, q, _one );\n\n\t}\n\n\tlookAt( eye, target, up ) {\n\n\t\tconst te = this.elements;\n\n\t\t_z.subVectors( eye, target );\n\n\t\tif ( _z.lengthSq() === 0 ) {\n\n\t\t\t// eye and target are in the same position\n\n\t\t\t_z.z = 1;\n\n\t\t}\n\n\t\t_z.normalize();\n\t\t_x.crossVectors( up, _z );\n\n\t\tif ( _x.lengthSq() === 0 ) {\n\n\t\t\t// up and z are parallel\n\n\t\t\tif ( Math.abs( up.z ) === 1 ) {\n\n\t\t\t\t_z.x += 0.0001;\n\n\t\t\t} else {\n\n\t\t\t\t_z.z += 0.0001;\n\n\t\t\t}\n\n\t\t\t_z.normalize();\n\t\t\t_x.crossVectors( up, _z );\n\n\t\t}\n\n\t\t_x.normalize();\n\t\t_y.crossVectors( _z, _x );\n\n\t\tte[ 0 ] = _x.x; te[ 4 ] = _y.x; te[ 8 ] = _z.x;\n\t\tte[ 1 ] = _x.y; te[ 5 ] = _y.y; te[ 9 ] = _z.y;\n\t\tte[ 2 ] = _x.z; te[ 6 ] = _y.z; te[ 10 ] = _z.z;\n\n\t\treturn this;\n\n\t}\n\n\tmultiply( m ) {\n\n\t\treturn this.multiplyMatrices( this, m );\n\n\t}\n\n\tpremultiply( m ) {\n\n\t\treturn this.multiplyMatrices( m, this );\n\n\t}\n\n\tmultiplyMatrices( a, b ) {\n\n\t\tconst ae = a.elements;\n\t\tconst be = b.elements;\n\t\tconst te = this.elements;\n\n\t\tconst a11 = ae[ 0 ], a12 = ae[ 4 ], a13 = ae[ 8 ], a14 = ae[ 12 ];\n\t\tconst a21 = ae[ 1 ], a22 = ae[ 5 ], a23 = ae[ 9 ], a24 = ae[ 13 ];\n\t\tconst a31 = ae[ 2 ], a32 = ae[ 6 ], a33 = ae[ 10 ], a34 = ae[ 14 ];\n\t\tconst a41 = ae[ 3 ], a42 = ae[ 7 ], a43 = ae[ 11 ], a44 = ae[ 15 ];\n\n\t\tconst b11 = be[ 0 ], b12 = be[ 4 ], b13 = be[ 8 ], b14 = be[ 12 ];\n\t\tconst b21 = be[ 1 ], b22 = be[ 5 ], b23 = be[ 9 ], b24 = be[ 13 ];\n\t\tconst b31 = be[ 2 ], b32 = be[ 6 ], b33 = be[ 10 ], b34 = be[ 14 ];\n\t\tconst b41 = be[ 3 ], b42 = be[ 7 ], b43 = be[ 11 ], b44 = be[ 15 ];\n\n\t\tte[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41;\n\t\tte[ 4 ] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42;\n\t\tte[ 8 ] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43;\n\t\tte[ 12 ] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44;\n\n\t\tte[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41;\n\t\tte[ 5 ] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42;\n\t\tte[ 9 ] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43;\n\t\tte[ 13 ] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44;\n\n\t\tte[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41;\n\t\tte[ 6 ] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42;\n\t\tte[ 10 ] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43;\n\t\tte[ 14 ] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44;\n\n\t\tte[ 3 ] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41;\n\t\tte[ 7 ] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42;\n\t\tte[ 11 ] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43;\n\t\tte[ 15 ] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyScalar( s ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] *= s; te[ 4 ] *= s; te[ 8 ] *= s; te[ 12 ] *= s;\n\t\tte[ 1 ] *= s; te[ 5 ] *= s; te[ 9 ] *= s; te[ 13 ] *= s;\n\t\tte[ 2 ] *= s; te[ 6 ] *= s; te[ 10 ] *= s; te[ 14 ] *= s;\n\t\tte[ 3 ] *= s; te[ 7 ] *= s; te[ 11 ] *= s; te[ 15 ] *= s;\n\n\t\treturn this;\n\n\t}\n\n\tdeterminant() {\n\n\t\tconst te = this.elements;\n\n\t\tconst n11 = te[ 0 ], n12 = te[ 4 ], n13 = te[ 8 ], n14 = te[ 12 ];\n\t\tconst n21 = te[ 1 ], n22 = te[ 5 ], n23 = te[ 9 ], n24 = te[ 13 ];\n\t\tconst n31 = te[ 2 ], n32 = te[ 6 ], n33 = te[ 10 ], n34 = te[ 14 ];\n\t\tconst n41 = te[ 3 ], n42 = te[ 7 ], n43 = te[ 11 ], n44 = te[ 15 ];\n\n\t\t//TODO: make this more efficient\n\t\t//( based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm )\n\n\t\treturn (\n\t\t\tn41 * (\n\t\t\t\t+ n14 * n23 * n32\n\t\t\t\t - n13 * n24 * n32\n\t\t\t\t - n14 * n22 * n33\n\t\t\t\t + n12 * n24 * n33\n\t\t\t\t + n13 * n22 * n34\n\t\t\t\t - n12 * n23 * n34\n\t\t\t) +\n\t\t\tn42 * (\n\t\t\t\t+ n11 * n23 * n34\n\t\t\t\t - n11 * n24 * n33\n\t\t\t\t + n14 * n21 * n33\n\t\t\t\t - n13 * n21 * n34\n\t\t\t\t + n13 * n24 * n31\n\t\t\t\t - n14 * n23 * n31\n\t\t\t) +\n\t\t\tn43 * (\n\t\t\t\t+ n11 * n24 * n32\n\t\t\t\t - n11 * n22 * n34\n\t\t\t\t - n14 * n21 * n32\n\t\t\t\t + n12 * n21 * n34\n\t\t\t\t + n14 * n22 * n31\n\t\t\t\t - n12 * n24 * n31\n\t\t\t) +\n\t\t\tn44 * (\n\t\t\t\t- n13 * n22 * n31\n\t\t\t\t - n11 * n23 * n32\n\t\t\t\t + n11 * n22 * n33\n\t\t\t\t + n13 * n21 * n32\n\t\t\t\t - n12 * n21 * n33\n\t\t\t\t + n12 * n23 * n31\n\t\t\t)\n\n\t\t);\n\n\t}\n\n\ttranspose() {\n\n\t\tconst te = this.elements;\n\t\tlet tmp;\n\n\t\ttmp = te[ 1 ]; te[ 1 ] = te[ 4 ]; te[ 4 ] = tmp;\n\t\ttmp = te[ 2 ]; te[ 2 ] = te[ 8 ]; te[ 8 ] = tmp;\n\t\ttmp = te[ 6 ]; te[ 6 ] = te[ 9 ]; te[ 9 ] = tmp;\n\n\t\ttmp = te[ 3 ]; te[ 3 ] = te[ 12 ]; te[ 12 ] = tmp;\n\t\ttmp = te[ 7 ]; te[ 7 ] = te[ 13 ]; te[ 13 ] = tmp;\n\t\ttmp = te[ 11 ]; te[ 11 ] = te[ 14 ]; te[ 14 ] = tmp;\n\n\t\treturn this;\n\n\t}\n\n\tsetPosition( x, y, z ) {\n\n\t\tconst te = this.elements;\n\n\t\tif ( x.isVector3 ) {\n\n\t\t\tte[ 12 ] = x.x;\n\t\t\tte[ 13 ] = x.y;\n\t\t\tte[ 14 ] = x.z;\n\n\t\t} else {\n\n\t\t\tte[ 12 ] = x;\n\t\t\tte[ 13 ] = y;\n\t\t\tte[ 14 ] = z;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tinvert() {\n\n\t\t// based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm\n\t\tconst te = this.elements,\n\n\t\t\tn11 = te[ 0 ], n21 = te[ 1 ], n31 = te[ 2 ], n41 = te[ 3 ],\n\t\t\tn12 = te[ 4 ], n22 = te[ 5 ], n32 = te[ 6 ], n42 = te[ 7 ],\n\t\t\tn13 = te[ 8 ], n23 = te[ 9 ], n33 = te[ 10 ], n43 = te[ 11 ],\n\t\t\tn14 = te[ 12 ], n24 = te[ 13 ], n34 = te[ 14 ], n44 = te[ 15 ],\n\n\t\t\tt11 = n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44,\n\t\t\tt12 = n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44,\n\t\t\tt13 = n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44,\n\t\t\tt14 = n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34;\n\n\t\tconst det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14;\n\n\t\tif ( det === 0 ) return this.set( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 );\n\n\t\tconst detInv = 1 / det;\n\n\t\tte[ 0 ] = t11 * detInv;\n\t\tte[ 1 ] = ( n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44 ) * detInv;\n\t\tte[ 2 ] = ( n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44 ) * detInv;\n\t\tte[ 3 ] = ( n23 * n32 * n41 - n22 * n33 * n41 - n23 * n31 * n42 + n21 * n33 * n42 + n22 * n31 * n43 - n21 * n32 * n43 ) * detInv;\n\n\t\tte[ 4 ] = t12 * detInv;\n\t\tte[ 5 ] = ( n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44 ) * detInv;\n\t\tte[ 6 ] = ( n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44 ) * detInv;\n\t\tte[ 7 ] = ( n12 * n33 * n41 - n13 * n32 * n41 + n13 * n31 * n42 - n11 * n33 * n42 - n12 * n31 * n43 + n11 * n32 * n43 ) * detInv;\n\n\t\tte[ 8 ] = t13 * detInv;\n\t\tte[ 9 ] = ( n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44 ) * detInv;\n\t\tte[ 10 ] = ( n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44 ) * detInv;\n\t\tte[ 11 ] = ( n13 * n22 * n41 - n12 * n23 * n41 - n13 * n21 * n42 + n11 * n23 * n42 + n12 * n21 * n43 - n11 * n22 * n43 ) * detInv;\n\n\t\tte[ 12 ] = t14 * detInv;\n\t\tte[ 13 ] = ( n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34 ) * detInv;\n\t\tte[ 14 ] = ( n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34 ) * detInv;\n\t\tte[ 15 ] = ( n12 * n23 * n31 - n13 * n22 * n31 + n13 * n21 * n32 - n11 * n23 * n32 - n12 * n21 * n33 + n11 * n22 * n33 ) * detInv;\n\n\t\treturn this;\n\n\t}\n\n\tscale( v ) {\n\n\t\tconst te = this.elements;\n\t\tconst x = v.x, y = v.y, z = v.z;\n\n\t\tte[ 0 ] *= x; te[ 4 ] *= y; te[ 8 ] *= z;\n\t\tte[ 1 ] *= x; te[ 5 ] *= y; te[ 9 ] *= z;\n\t\tte[ 2 ] *= x; te[ 6 ] *= y; te[ 10 ] *= z;\n\t\tte[ 3 ] *= x; te[ 7 ] *= y; te[ 11 ] *= z;\n\n\t\treturn this;\n\n\t}\n\n\tgetMaxScaleOnAxis() {\n\n\t\tconst te = this.elements;\n\n\t\tconst scaleXSq = te[ 0 ] * te[ 0 ] + te[ 1 ] * te[ 1 ] + te[ 2 ] * te[ 2 ];\n\t\tconst scaleYSq = te[ 4 ] * te[ 4 ] + te[ 5 ] * te[ 5 ] + te[ 6 ] * te[ 6 ];\n\t\tconst scaleZSq = te[ 8 ] * te[ 8 ] + te[ 9 ] * te[ 9 ] + te[ 10 ] * te[ 10 ];\n\n\t\treturn Math.sqrt( Math.max( scaleXSq, scaleYSq, scaleZSq ) );\n\n\t}\n\n\tmakeTranslation( x, y, z ) {\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0, x,\n\t\t\t0, 1, 0, y,\n\t\t\t0, 0, 1, z,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmakeRotationX( theta ) {\n\n\t\tconst c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0, 0,\n\t\t\t0, c, - s, 0,\n\t\t\t0, s, c, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmakeRotationY( theta ) {\n\n\t\tconst c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\t c, 0, s, 0,\n\t\t\t 0, 1, 0, 0,\n\t\t\t- s, 0, c, 0,\n\t\t\t 0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmakeRotationZ( theta ) {\n\n\t\tconst c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\tc, - s, 0, 0,\n\t\t\ts, c, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmakeRotationAxis( axis, angle ) {\n\n\t\t// Based on http://www.gamedev.net/reference/articles/article1199.asp\n\n\t\tconst c = Math.cos( angle );\n\t\tconst s = Math.sin( angle );\n\t\tconst t = 1 - c;\n\t\tconst x = axis.x, y = axis.y, z = axis.z;\n\t\tconst tx = t * x, ty = t * y;\n\n\t\tthis.set(\n\n\t\t\ttx * x + c, tx * y - s * z, tx * z + s * y, 0,\n\t\t\ttx * y + s * z, ty * y + c, ty * z - s * x, 0,\n\t\t\ttx * z - s * y, ty * z + s * x, t * z * z + c, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmakeScale( x, y, z ) {\n\n\t\tthis.set(\n\n\t\t\tx, 0, 0, 0,\n\t\t\t0, y, 0, 0,\n\t\t\t0, 0, z, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmakeShear( xy, xz, yx, yz, zx, zy ) {\n\n\t\tthis.set(\n\n\t\t\t1, yx, zx, 0,\n\t\t\txy, 1, zy, 0,\n\t\t\txz, yz, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tcompose( position, quaternion, scale ) {\n\n\t\tconst te = this.elements;\n\n\t\tconst x = quaternion._x, y = quaternion._y, z = quaternion._z, w = quaternion._w;\n\t\tconst x2 = x + x,\ty2 = y + y, z2 = z + z;\n\t\tconst xx = x * x2, xy = x * y2, xz = x * z2;\n\t\tconst yy = y * y2, yz = y * z2, zz = z * z2;\n\t\tconst wx = w * x2, wy = w * y2, wz = w * z2;\n\n\t\tconst sx = scale.x, sy = scale.y, sz = scale.z;\n\n\t\tte[ 0 ] = ( 1 - ( yy + zz ) ) * sx;\n\t\tte[ 1 ] = ( xy + wz ) * sx;\n\t\tte[ 2 ] = ( xz - wy ) * sx;\n\t\tte[ 3 ] = 0;\n\n\t\tte[ 4 ] = ( xy - wz ) * sy;\n\t\tte[ 5 ] = ( 1 - ( xx + zz ) ) * sy;\n\t\tte[ 6 ] = ( yz + wx ) * sy;\n\t\tte[ 7 ] = 0;\n\n\t\tte[ 8 ] = ( xz + wy ) * sz;\n\t\tte[ 9 ] = ( yz - wx ) * sz;\n\t\tte[ 10 ] = ( 1 - ( xx + yy ) ) * sz;\n\t\tte[ 11 ] = 0;\n\n\t\tte[ 12 ] = position.x;\n\t\tte[ 13 ] = position.y;\n\t\tte[ 14 ] = position.z;\n\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\tdecompose( position, quaternion, scale ) {\n\n\t\tconst te = this.elements;\n\n\t\tlet sx = _v1$5.set( te[ 0 ], te[ 1 ], te[ 2 ] ).length();\n\t\tconst sy = _v1$5.set( te[ 4 ], te[ 5 ], te[ 6 ] ).length();\n\t\tconst sz = _v1$5.set( te[ 8 ], te[ 9 ], te[ 10 ] ).length();\n\n\t\t// if determine is negative, we need to invert one scale\n\t\tconst det = this.determinant();\n\t\tif ( det < 0 ) sx = - sx;\n\n\t\tposition.x = te[ 12 ];\n\t\tposition.y = te[ 13 ];\n\t\tposition.z = te[ 14 ];\n\n\t\t// scale the rotation part\n\t\t_m1$2.copy( this );\n\n\t\tconst invSX = 1 / sx;\n\t\tconst invSY = 1 / sy;\n\t\tconst invSZ = 1 / sz;\n\n\t\t_m1$2.elements[ 0 ] *= invSX;\n\t\t_m1$2.elements[ 1 ] *= invSX;\n\t\t_m1$2.elements[ 2 ] *= invSX;\n\n\t\t_m1$2.elements[ 4 ] *= invSY;\n\t\t_m1$2.elements[ 5 ] *= invSY;\n\t\t_m1$2.elements[ 6 ] *= invSY;\n\n\t\t_m1$2.elements[ 8 ] *= invSZ;\n\t\t_m1$2.elements[ 9 ] *= invSZ;\n\t\t_m1$2.elements[ 10 ] *= invSZ;\n\n\t\tquaternion.setFromRotationMatrix( _m1$2 );\n\n\t\tscale.x = sx;\n\t\tscale.y = sy;\n\t\tscale.z = sz;\n\n\t\treturn this;\n\n\t}\n\n\tmakePerspective( left, right, top, bottom, near, far ) {\n\n\t\tconst te = this.elements;\n\t\tconst x = 2 * near / ( right - left );\n\t\tconst y = 2 * near / ( top - bottom );\n\n\t\tconst a = ( right + left ) / ( right - left );\n\t\tconst b = ( top + bottom ) / ( top - bottom );\n\t\tconst c = - ( far + near ) / ( far - near );\n\t\tconst d = - 2 * far * near / ( far - near );\n\n\t\tte[ 0 ] = x;\tte[ 4 ] = 0;\tte[ 8 ] = a;\tte[ 12 ] = 0;\n\t\tte[ 1 ] = 0;\tte[ 5 ] = y;\tte[ 9 ] = b;\tte[ 13 ] = 0;\n\t\tte[ 2 ] = 0;\tte[ 6 ] = 0;\tte[ 10 ] = c;\tte[ 14 ] = d;\n\t\tte[ 3 ] = 0;\tte[ 7 ] = 0;\tte[ 11 ] = - 1;\tte[ 15 ] = 0;\n\n\t\treturn this;\n\n\t}\n\n\tmakeOrthographic( left, right, top, bottom, near, far ) {\n\n\t\tconst te = this.elements;\n\t\tconst w = 1.0 / ( right - left );\n\t\tconst h = 1.0 / ( top - bottom );\n\t\tconst p = 1.0 / ( far - near );\n\n\t\tconst x = ( right + left ) * w;\n\t\tconst y = ( top + bottom ) * h;\n\t\tconst z = ( far + near ) * p;\n\n\t\tte[ 0 ] = 2 * w;\tte[ 4 ] = 0;\tte[ 8 ] = 0;\tte[ 12 ] = - x;\n\t\tte[ 1 ] = 0;\tte[ 5 ] = 2 * h;\tte[ 9 ] = 0;\tte[ 13 ] = - y;\n\t\tte[ 2 ] = 0;\tte[ 6 ] = 0;\tte[ 10 ] = - 2 * p;\tte[ 14 ] = - z;\n\t\tte[ 3 ] = 0;\tte[ 7 ] = 0;\tte[ 11 ] = 0;\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\tequals( matrix ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = matrix.elements;\n\n\t\tfor ( let i = 0; i < 16; i ++ ) {\n\n\t\t\tif ( te[ i ] !== me[ i ] ) return false;\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tfor ( let i = 0; i < 16; i ++ ) {\n\n\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tconst te = this.elements;\n\n\t\tarray[ offset ] = te[ 0 ];\n\t\tarray[ offset + 1 ] = te[ 1 ];\n\t\tarray[ offset + 2 ] = te[ 2 ];\n\t\tarray[ offset + 3 ] = te[ 3 ];\n\n\t\tarray[ offset + 4 ] = te[ 4 ];\n\t\tarray[ offset + 5 ] = te[ 5 ];\n\t\tarray[ offset + 6 ] = te[ 6 ];\n\t\tarray[ offset + 7 ] = te[ 7 ];\n\n\t\tarray[ offset + 8 ] = te[ 8 ];\n\t\tarray[ offset + 9 ] = te[ 9 ];\n\t\tarray[ offset + 10 ] = te[ 10 ];\n\t\tarray[ offset + 11 ] = te[ 11 ];\n\n\t\tarray[ offset + 12 ] = te[ 12 ];\n\t\tarray[ offset + 13 ] = te[ 13 ];\n\t\tarray[ offset + 14 ] = te[ 14 ];\n\t\tarray[ offset + 15 ] = te[ 15 ];\n\n\t\treturn array;\n\n\t}\n\n}\n\nconst _v1$5 = /*@__PURE__*/ new Vector3();\nconst _m1$2 = /*@__PURE__*/ new Matrix4();\nconst _zero = /*@__PURE__*/ new Vector3( 0, 0, 0 );\nconst _one = /*@__PURE__*/ new Vector3( 1, 1, 1 );\nconst _x = /*@__PURE__*/ new Vector3();\nconst _y = /*@__PURE__*/ new Vector3();\nconst _z = /*@__PURE__*/ new Vector3();\n\nconst _matrix$1 = /*@__PURE__*/ new Matrix4();\nconst _quaternion$3 = /*@__PURE__*/ new Quaternion();\n\nclass Euler {\n\n\tconstructor( x = 0, y = 0, z = 0, order = Euler.DefaultOrder ) {\n\n\t\tthis.isEuler = true;\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._order = order;\n\n\t}\n\n\tget x() {\n\n\t\treturn this._x;\n\n\t}\n\n\tset x( value ) {\n\n\t\tthis._x = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tget y() {\n\n\t\treturn this._y;\n\n\t}\n\n\tset y( value ) {\n\n\t\tthis._y = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tget z() {\n\n\t\treturn this._z;\n\n\t}\n\n\tset z( value ) {\n\n\t\tthis._z = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tget order() {\n\n\t\treturn this._order;\n\n\t}\n\n\tset order( value ) {\n\n\t\tthis._order = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tset( x, y, z, order = this._order ) {\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._order = order;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this._x, this._y, this._z, this._order );\n\n\t}\n\n\tcopy( euler ) {\n\n\t\tthis._x = euler._x;\n\t\tthis._y = euler._y;\n\t\tthis._z = euler._z;\n\t\tthis._order = euler._order;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tsetFromRotationMatrix( m, order = this._order, update = true ) {\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tconst te = m.elements;\n\t\tconst m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ];\n\t\tconst m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ];\n\t\tconst m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\n\n\t\tswitch ( order ) {\n\n\t\t\tcase 'XYZ':\n\n\t\t\t\tthis._y = Math.asin( clamp( m13, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m13 ) < 0.9999999 ) {\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\tbreak;\n\n\t\t\tcase 'YXZ':\n\n\t\t\t\tthis._x = Math.asin( - clamp( m23, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m23 ) < 0.9999999 ) {\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\tbreak;\n\n\t\t\tcase 'ZXY':\n\n\t\t\t\tthis._x = Math.asin( clamp( m32, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m32 ) < 0.9999999 ) {\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\tbreak;\n\n\t\t\tcase 'ZYX':\n\n\t\t\t\tthis._y = Math.asin( - clamp( m31, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m31 ) < 0.9999999 ) {\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\tbreak;\n\n\t\t\tcase 'YZX':\n\n\t\t\t\tthis._z = Math.asin( clamp( m21, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m21 ) < 0.9999999 ) {\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\tbreak;\n\n\t\t\tcase 'XZY':\n\n\t\t\t\tthis._z = Math.asin( - clamp( m12, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m12 ) < 0.9999999 ) {\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\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tconsole.warn( 'THREE.Euler: .setFromRotationMatrix() encountered an unknown order: ' + order );\n\n\t\t}\n\n\t\tthis._order = order;\n\n\t\tif ( update === true ) this._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tsetFromQuaternion( q, order, update ) {\n\n\t\t_matrix$1.makeRotationFromQuaternion( q );\n\n\t\treturn this.setFromRotationMatrix( _matrix$1, order, update );\n\n\t}\n\n\tsetFromVector3( v, order = this._order ) {\n\n\t\treturn this.set( v.x, v.y, v.z, order );\n\n\t}\n\n\treorder( newOrder ) {\n\n\t\t// WARNING: this discards revolution information -bhouston\n\n\t\t_quaternion$3.setFromEuler( this );\n\n\t\treturn this.setFromQuaternion( _quaternion$3, newOrder );\n\n\t}\n\n\tequals( euler ) {\n\n\t\treturn ( euler._x === this._x ) && ( euler._y === this._y ) && ( euler._z === this._z ) && ( euler._order === this._order );\n\n\t}\n\n\tfromArray( array ) {\n\n\t\tthis._x = array[ 0 ];\n\t\tthis._y = array[ 1 ];\n\t\tthis._z = array[ 2 ];\n\t\tif ( array[ 3 ] !== undefined ) this._order = array[ 3 ];\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this._x;\n\t\tarray[ offset + 1 ] = this._y;\n\t\tarray[ offset + 2 ] = this._z;\n\t\tarray[ offset + 3 ] = this._order;\n\n\t\treturn array;\n\n\t}\n\n\t_onChange( callback ) {\n\n\t\tthis._onChangeCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\t_onChangeCallback() {}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this._x;\n\t\tyield this._y;\n\t\tyield this._z;\n\t\tyield this._order;\n\n\t}\n\n\t// @deprecated since r138, 02cf0df1cb4575d5842fef9c85bb5a89fe020d53\n\n\ttoVector3() {\n\n\t\tconsole.error( 'THREE.Euler: .toVector3() has been removed. Use Vector3.setFromEuler() instead' );\n\n\t}\n\n}\n\nEuler.DefaultOrder = 'XYZ';\nEuler.RotationOrders = [ 'XYZ', 'YZX', 'ZXY', 'XZY', 'YXZ', 'ZYX' ];\n\nclass Layers {\n\n\tconstructor() {\n\n\t\tthis.mask = 1 | 0;\n\n\t}\n\n\tset( channel ) {\n\n\t\tthis.mask = ( 1 << channel | 0 ) >>> 0;\n\n\t}\n\n\tenable( channel ) {\n\n\t\tthis.mask |= 1 << channel | 0;\n\n\t}\n\n\tenableAll() {\n\n\t\tthis.mask = 0xffffffff | 0;\n\n\t}\n\n\ttoggle( channel ) {\n\n\t\tthis.mask ^= 1 << channel | 0;\n\n\t}\n\n\tdisable( channel ) {\n\n\t\tthis.mask &= ~ ( 1 << channel | 0 );\n\n\t}\n\n\tdisableAll() {\n\n\t\tthis.mask = 0;\n\n\t}\n\n\ttest( layers ) {\n\n\t\treturn ( this.mask & layers.mask ) !== 0;\n\n\t}\n\n\tisEnabled( channel ) {\n\n\t\treturn ( this.mask & ( 1 << channel | 0 ) ) !== 0;\n\n\t}\n\n}\n\nlet _object3DId = 0;\n\nconst _v1$4 = /*@__PURE__*/ new Vector3();\nconst _q1 = /*@__PURE__*/ new Quaternion();\nconst _m1$1 = /*@__PURE__*/ new Matrix4();\nconst _target = /*@__PURE__*/ new Vector3();\n\nconst _position$3 = /*@__PURE__*/ new Vector3();\nconst _scale$2 = /*@__PURE__*/ new Vector3();\nconst _quaternion$2 = /*@__PURE__*/ new Quaternion();\n\nconst _xAxis = /*@__PURE__*/ new Vector3( 1, 0, 0 );\nconst _yAxis = /*@__PURE__*/ new Vector3( 0, 1, 0 );\nconst _zAxis = /*@__PURE__*/ new Vector3( 0, 0, 1 );\n\nconst _addedEvent = { type: 'added' };\nconst _removedEvent = { type: 'removed' };\n\nclass Object3D extends EventDispatcher {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.isObject3D = true;\n\n\t\tObject.defineProperty( this, 'id', { value: _object3DId ++ } );\n\n\t\tthis.uuid = 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\tconst position = new Vector3();\n\t\tconst rotation = new Euler();\n\t\tconst quaternion = new Quaternion();\n\t\tconst 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\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: position\n\t\t\t},\n\t\t\trotation: {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: rotation\n\t\t\t},\n\t\t\tquaternion: {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: quaternion\n\t\t\t},\n\t\t\tscale: {\n\t\t\t\tconfigurable: true,\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.animations = [];\n\n\t\tthis.userData = {};\n\n\t}\n\n\tonBeforeRender( /* renderer, scene, camera, geometry, material, group */ ) {}\n\n\tonAfterRender( /* renderer, scene, camera, geometry, material, group */ ) {}\n\n\tapplyMatrix4( matrix ) {\n\n\t\tif ( this.matrixAutoUpdate ) this.updateMatrix();\n\n\t\tthis.matrix.premultiply( matrix );\n\n\t\tthis.matrix.decompose( this.position, this.quaternion, this.scale );\n\n\t}\n\n\tapplyQuaternion( q ) {\n\n\t\tthis.quaternion.premultiply( q );\n\n\t\treturn this;\n\n\t}\n\n\tsetRotationFromAxisAngle( axis, angle ) {\n\n\t\t// assumes axis is normalized\n\n\t\tthis.quaternion.setFromAxisAngle( axis, angle );\n\n\t}\n\n\tsetRotationFromEuler( euler ) {\n\n\t\tthis.quaternion.setFromEuler( euler, true );\n\n\t}\n\n\tsetRotationFromMatrix( m ) {\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tthis.quaternion.setFromRotationMatrix( m );\n\n\t}\n\n\tsetRotationFromQuaternion( q ) {\n\n\t\t// assumes q is normalized\n\n\t\tthis.quaternion.copy( q );\n\n\t}\n\n\trotateOnAxis( axis, angle ) {\n\n\t\t// rotate object on axis in object space\n\t\t// axis is assumed to be normalized\n\n\t\t_q1.setFromAxisAngle( axis, angle );\n\n\t\tthis.quaternion.multiply( _q1 );\n\n\t\treturn this;\n\n\t}\n\n\trotateOnWorldAxis( axis, angle ) {\n\n\t\t// rotate object on axis in world space\n\t\t// axis is assumed to be normalized\n\t\t// method assumes no rotated parent\n\n\t\t_q1.setFromAxisAngle( axis, angle );\n\n\t\tthis.quaternion.premultiply( _q1 );\n\n\t\treturn this;\n\n\t}\n\n\trotateX( angle ) {\n\n\t\treturn this.rotateOnAxis( _xAxis, angle );\n\n\t}\n\n\trotateY( angle ) {\n\n\t\treturn this.rotateOnAxis( _yAxis, angle );\n\n\t}\n\n\trotateZ( angle ) {\n\n\t\treturn this.rotateOnAxis( _zAxis, angle );\n\n\t}\n\n\ttranslateOnAxis( axis, distance ) {\n\n\t\t// translate object by distance along axis in object space\n\t\t// axis is assumed to be normalized\n\n\t\t_v1$4.copy( axis ).applyQuaternion( this.quaternion );\n\n\t\tthis.position.add( _v1$4.multiplyScalar( distance ) );\n\n\t\treturn this;\n\n\t}\n\n\ttranslateX( distance ) {\n\n\t\treturn this.translateOnAxis( _xAxis, distance );\n\n\t}\n\n\ttranslateY( distance ) {\n\n\t\treturn this.translateOnAxis( _yAxis, distance );\n\n\t}\n\n\ttranslateZ( distance ) {\n\n\t\treturn this.translateOnAxis( _zAxis, distance );\n\n\t}\n\n\tlocalToWorld( vector ) {\n\n\t\treturn vector.applyMatrix4( this.matrixWorld );\n\n\t}\n\n\tworldToLocal( vector ) {\n\n\t\treturn vector.applyMatrix4( _m1$1.copy( this.matrixWorld ).invert() );\n\n\t}\n\n\tlookAt( x, y, z ) {\n\n\t\t// This method does not support objects having non-uniformly-scaled parent(s)\n\n\t\tif ( x.isVector3 ) {\n\n\t\t\t_target.copy( x );\n\n\t\t} else {\n\n\t\t\t_target.set( x, y, z );\n\n\t\t}\n\n\t\tconst parent = this.parent;\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\t_position$3.setFromMatrixPosition( this.matrixWorld );\n\n\t\tif ( this.isCamera || this.isLight ) {\n\n\t\t\t_m1$1.lookAt( _position$3, _target, this.up );\n\n\t\t} else {\n\n\t\t\t_m1$1.lookAt( _target, _position$3, this.up );\n\n\t\t}\n\n\t\tthis.quaternion.setFromRotationMatrix( _m1$1 );\n\n\t\tif ( parent ) {\n\n\t\t\t_m1$1.extractRotation( parent.matrixWorld );\n\t\t\t_q1.setFromRotationMatrix( _m1$1 );\n\t\t\tthis.quaternion.premultiply( _q1.invert() );\n\n\t\t}\n\n\t}\n\n\tadd( object ) {\n\n\t\tif ( arguments.length > 1 ) {\n\n\t\t\tfor ( let i = 0; i < arguments.length; i ++ ) {\n\n\t\t\t\tthis.add( arguments[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tif ( object === this ) {\n\n\t\t\tconsole.error( 'THREE.Object3D.add: object can\\'t be added as a child of itself.', object );\n\t\t\treturn this;\n\n\t\t}\n\n\t\tif ( object && object.isObject3D ) {\n\n\t\t\tif ( object.parent !== null ) {\n\n\t\t\t\tobject.parent.remove( object );\n\n\t\t\t}\n\n\t\t\tobject.parent = this;\n\t\t\tthis.children.push( object );\n\n\t\t\tobject.dispatchEvent( _addedEvent );\n\n\t\t} else {\n\n\t\t\tconsole.error( 'THREE.Object3D.add: object not an instance of THREE.Object3D.', object );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tremove( object ) {\n\n\t\tif ( arguments.length > 1 ) {\n\n\t\t\tfor ( let i = 0; i < arguments.length; i ++ ) {\n\n\t\t\t\tthis.remove( arguments[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tconst index = this.children.indexOf( object );\n\n\t\tif ( index !== - 1 ) {\n\n\t\t\tobject.parent = null;\n\t\t\tthis.children.splice( index, 1 );\n\n\t\t\tobject.dispatchEvent( _removedEvent );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tremoveFromParent() {\n\n\t\tconst parent = this.parent;\n\n\t\tif ( parent !== null ) {\n\n\t\t\tparent.remove( this );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tclear() {\n\n\t\tfor ( let i = 0; i < this.children.length; i ++ ) {\n\n\t\t\tconst object = this.children[ i ];\n\n\t\t\tobject.parent = null;\n\n\t\t\tobject.dispatchEvent( _removedEvent );\n\n\t\t}\n\n\t\tthis.children.length = 0;\n\n\t\treturn this;\n\n\n\t}\n\n\tattach( object ) {\n\n\t\t// adds object as a child of this, while maintaining the object's world transform\n\n\t\t// Note: This method does not support scene graphs having non-uniformly-scaled nodes(s)\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\t_m1$1.copy( this.matrixWorld ).invert();\n\n\t\tif ( object.parent !== null ) {\n\n\t\t\tobject.parent.updateWorldMatrix( true, false );\n\n\t\t\t_m1$1.multiply( object.parent.matrixWorld );\n\n\t\t}\n\n\t\tobject.applyMatrix4( _m1$1 );\n\n\t\tthis.add( object );\n\n\t\tobject.updateWorldMatrix( false, true );\n\n\t\treturn this;\n\n\t}\n\n\tgetObjectById( id ) {\n\n\t\treturn this.getObjectByProperty( 'id', id );\n\n\t}\n\n\tgetObjectByName( name ) {\n\n\t\treturn this.getObjectByProperty( 'name', name );\n\n\t}\n\n\tgetObjectByProperty( name, value ) {\n\n\t\tif ( this[ name ] === value ) return this;\n\n\t\tfor ( let i = 0, l = this.children.length; i < l; i ++ ) {\n\n\t\t\tconst child = this.children[ i ];\n\t\t\tconst object = child.getObjectByProperty( name, value );\n\n\t\t\tif ( object !== undefined ) {\n\n\t\t\t\treturn object;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn undefined;\n\n\t}\n\n\tgetWorldPosition( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\treturn target.setFromMatrixPosition( this.matrixWorld );\n\n\t}\n\n\tgetWorldQuaternion( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\tthis.matrixWorld.decompose( _position$3, target, _scale$2 );\n\n\t\treturn target;\n\n\t}\n\n\tgetWorldScale( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\tthis.matrixWorld.decompose( _position$3, _quaternion$2, target );\n\n\t\treturn target;\n\n\t}\n\n\tgetWorldDirection( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\tconst e = this.matrixWorld.elements;\n\n\t\treturn target.set( e[ 8 ], e[ 9 ], e[ 10 ] ).normalize();\n\n\t}\n\n\traycast( /* raycaster, intersects */ ) {}\n\n\ttraverse( callback ) {\n\n\t\tcallback( this );\n\n\t\tconst children = this.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tchildren[ i ].traverse( callback );\n\n\t\t}\n\n\t}\n\n\ttraverseVisible( callback ) {\n\n\t\tif ( this.visible === false ) return;\n\n\t\tcallback( this );\n\n\t\tconst children = this.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tchildren[ i ].traverseVisible( callback );\n\n\t\t}\n\n\t}\n\n\ttraverseAncestors( callback ) {\n\n\t\tconst parent = this.parent;\n\n\t\tif ( parent !== null ) {\n\n\t\t\tcallback( parent );\n\n\t\t\tparent.traverseAncestors( callback );\n\n\t\t}\n\n\t}\n\n\tupdateMatrix() {\n\n\t\tthis.matrix.compose( this.position, this.quaternion, this.scale );\n\n\t\tthis.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tif ( this.matrixAutoUpdate ) this.updateMatrix();\n\n\t\tif ( this.matrixWorldNeedsUpdate || force ) {\n\n\t\t\tif ( this.parent === null ) {\n\n\t\t\t\tthis.matrixWorld.copy( this.matrix );\n\n\t\t\t} else {\n\n\t\t\t\tthis.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix );\n\n\t\t\t}\n\n\t\t\tthis.matrixWorldNeedsUpdate = false;\n\n\t\t\tforce = true;\n\n\t\t}\n\n\t\t// update children\n\n\t\tconst children = this.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tchildren[ i ].updateMatrixWorld( force );\n\n\t\t}\n\n\t}\n\n\tupdateWorldMatrix( updateParents, updateChildren ) {\n\n\t\tconst parent = this.parent;\n\n\t\tif ( updateParents === true && parent !== null ) {\n\n\t\t\tparent.updateWorldMatrix( true, false );\n\n\t\t}\n\n\t\tif ( this.matrixAutoUpdate ) this.updateMatrix();\n\n\t\tif ( this.parent === null ) {\n\n\t\t\tthis.matrixWorld.copy( this.matrix );\n\n\t\t} else {\n\n\t\t\tthis.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix );\n\n\t\t}\n\n\t\t// update children\n\n\t\tif ( updateChildren === true ) {\n\n\t\t\tconst children = this.children;\n\n\t\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tchildren[ i ].updateWorldMatrix( false, true );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\t// meta is a string when called from JSON.stringify\n\t\tconst isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tconst output = {};\n\n\t\t// meta is a hash used to collect geometries, materials.\n\t\t// not providing it implies that this is the root object\n\t\t// being serialized.\n\t\tif ( isRootObject ) {\n\n\t\t\t// initialize meta obj\n\t\t\tmeta = {\n\t\t\t\tgeometries: {},\n\t\t\t\tmaterials: {},\n\t\t\t\ttextures: {},\n\t\t\t\timages: {},\n\t\t\t\tshapes: {},\n\t\t\t\tskeletons: {},\n\t\t\t\tanimations: {},\n\t\t\t\tnodes: {}\n\t\t\t};\n\n\t\t\toutput.metadata = {\n\t\t\t\tversion: 4.5,\n\t\t\t\ttype: 'Object',\n\t\t\t\tgenerator: 'Object3D.toJSON'\n\t\t\t};\n\n\t\t}\n\n\t\t// standard Object3D serialization\n\n\t\tconst object = {};\n\n\t\tobject.uuid = this.uuid;\n\t\tobject.type = this.type;\n\n\t\tif ( this.name !== '' ) object.name = this.name;\n\t\tif ( this.castShadow === true ) object.castShadow = true;\n\t\tif ( this.receiveShadow === true ) object.receiveShadow = true;\n\t\tif ( this.visible === false ) object.visible = false;\n\t\tif ( this.frustumCulled === false ) object.frustumCulled = false;\n\t\tif ( this.renderOrder !== 0 ) object.renderOrder = this.renderOrder;\n\t\tif ( JSON.stringify( this.userData ) !== '{}' ) object.userData = this.userData;\n\n\t\tobject.layers = this.layers.mask;\n\t\tobject.matrix = this.matrix.toArray();\n\n\t\tif ( this.matrixAutoUpdate === false ) object.matrixAutoUpdate = false;\n\n\t\t// object specific properties\n\n\t\tif ( this.isInstancedMesh ) {\n\n\t\t\tobject.type = 'InstancedMesh';\n\t\t\tobject.count = this.count;\n\t\t\tobject.instanceMatrix = this.instanceMatrix.toJSON();\n\t\t\tif ( this.instanceColor !== null ) object.instanceColor = this.instanceColor.toJSON();\n\n\t\t}\n\n\t\t//\n\n\t\tfunction serialize( library, element ) {\n\n\t\t\tif ( library[ element.uuid ] === undefined ) {\n\n\t\t\t\tlibrary[ element.uuid ] = element.toJSON( meta );\n\n\t\t\t}\n\n\t\t\treturn element.uuid;\n\n\t\t}\n\n\t\tif ( this.isScene ) {\n\n\t\t\tif ( this.background ) {\n\n\t\t\t\tif ( this.background.isColor ) {\n\n\t\t\t\t\tobject.background = this.background.toJSON();\n\n\t\t\t\t} else if ( this.background.isTexture ) {\n\n\t\t\t\t\tobject.background = this.background.toJSON( meta ).uuid;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.environment && this.environment.isTexture && this.environment.isRenderTargetTexture !== true ) {\n\n\t\t\t\tobject.environment = this.environment.toJSON( meta ).uuid;\n\n\t\t\t}\n\n\t\t} else if ( this.isMesh || this.isLine || this.isPoints ) {\n\n\t\t\tobject.geometry = serialize( meta.geometries, this.geometry );\n\n\t\t\tconst parameters = this.geometry.parameters;\n\n\t\t\tif ( parameters !== undefined && parameters.shapes !== undefined ) {\n\n\t\t\t\tconst shapes = parameters.shapes;\n\n\t\t\t\tif ( Array.isArray( shapes ) ) {\n\n\t\t\t\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tconst shape = shapes[ i ];\n\n\t\t\t\t\t\tserialize( meta.shapes, shape );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tserialize( meta.shapes, shapes );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.isSkinnedMesh ) {\n\n\t\t\tobject.bindMode = this.bindMode;\n\t\t\tobject.bindMatrix = this.bindMatrix.toArray();\n\n\t\t\tif ( this.skeleton !== undefined ) {\n\n\t\t\t\tserialize( meta.skeletons, this.skeleton );\n\n\t\t\t\tobject.skeleton = this.skeleton.uuid;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.material !== undefined ) {\n\n\t\t\tif ( Array.isArray( this.material ) ) {\n\n\t\t\t\tconst uuids = [];\n\n\t\t\t\tfor ( let i = 0, l = this.material.length; i < l; i ++ ) {\n\n\t\t\t\t\tuuids.push( serialize( meta.materials, this.material[ i ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tobject.material = uuids;\n\n\t\t\t} else {\n\n\t\t\t\tobject.material = serialize( meta.materials, this.material );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tif ( this.children.length > 0 ) {\n\n\t\t\tobject.children = [];\n\n\t\t\tfor ( let i = 0; i < this.children.length; i ++ ) {\n\n\t\t\t\tobject.children.push( this.children[ i ].toJSON( meta ).object );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tif ( this.animations.length > 0 ) {\n\n\t\t\tobject.animations = [];\n\n\t\t\tfor ( let i = 0; i < this.animations.length; i ++ ) {\n\n\t\t\t\tconst animation = this.animations[ i ];\n\n\t\t\t\tobject.animations.push( serialize( meta.animations, animation ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( isRootObject ) {\n\n\t\t\tconst geometries = extractFromCache( meta.geometries );\n\t\t\tconst materials = extractFromCache( meta.materials );\n\t\t\tconst textures = extractFromCache( meta.textures );\n\t\t\tconst images = extractFromCache( meta.images );\n\t\t\tconst shapes = extractFromCache( meta.shapes );\n\t\t\tconst skeletons = extractFromCache( meta.skeletons );\n\t\t\tconst animations = extractFromCache( meta.animations );\n\t\t\tconst nodes = extractFromCache( meta.nodes );\n\n\t\t\tif ( geometries.length > 0 ) output.geometries = geometries;\n\t\t\tif ( materials.length > 0 ) output.materials = materials;\n\t\t\tif ( textures.length > 0 ) output.textures = textures;\n\t\t\tif ( images.length > 0 ) output.images = images;\n\t\t\tif ( shapes.length > 0 ) output.shapes = shapes;\n\t\t\tif ( skeletons.length > 0 ) output.skeletons = skeletons;\n\t\t\tif ( animations.length > 0 ) output.animations = animations;\n\t\t\tif ( nodes.length > 0 ) output.nodes = nodes;\n\n\t\t}\n\n\t\toutput.object = object;\n\n\t\treturn output;\n\n\t\t// extract data from the cache hash\n\t\t// remove metadata on each item\n\t\t// and return as array\n\t\tfunction extractFromCache( cache ) {\n\n\t\t\tconst values = [];\n\t\t\tfor ( const key in cache ) {\n\n\t\t\t\tconst data = cache[ key ];\n\t\t\t\tdelete data.metadata;\n\t\t\t\tvalues.push( data );\n\n\t\t\t}\n\n\t\t\treturn values;\n\n\t\t}\n\n\t}\n\n\tclone( recursive ) {\n\n\t\treturn new this.constructor().copy( this, recursive );\n\n\t}\n\n\tcopy( source, recursive = true ) {\n\n\t\tthis.name = source.name;\n\n\t\tthis.up.copy( source.up );\n\n\t\tthis.position.copy( source.position );\n\t\tthis.rotation.order = source.rotation.order;\n\t\tthis.quaternion.copy( source.quaternion );\n\t\tthis.scale.copy( source.scale );\n\n\t\tthis.matrix.copy( source.matrix );\n\t\tthis.matrixWorld.copy( source.matrixWorld );\n\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\t\tthis.matrixWorldNeedsUpdate = source.matrixWorldNeedsUpdate;\n\n\t\tthis.layers.mask = source.layers.mask;\n\t\tthis.visible = source.visible;\n\n\t\tthis.castShadow = source.castShadow;\n\t\tthis.receiveShadow = source.receiveShadow;\n\n\t\tthis.frustumCulled = source.frustumCulled;\n\t\tthis.renderOrder = source.renderOrder;\n\n\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\tif ( recursive === true ) {\n\n\t\t\tfor ( let i = 0; i < source.children.length; i ++ ) {\n\n\t\t\t\tconst child = source.children[ i ];\n\t\t\t\tthis.add( child.clone() );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\nObject3D.DefaultUp = /*@__PURE__*/ new Vector3( 0, 1, 0 );\nObject3D.DefaultMatrixAutoUpdate = true;\n\nconst _v0$1 = /*@__PURE__*/ new Vector3();\nconst _v1$3 = /*@__PURE__*/ new Vector3();\nconst _v2$2 = /*@__PURE__*/ new Vector3();\nconst _v3$1 = /*@__PURE__*/ new Vector3();\n\nconst _vab = /*@__PURE__*/ new Vector3();\nconst _vac = /*@__PURE__*/ new Vector3();\nconst _vbc = /*@__PURE__*/ new Vector3();\nconst _vap = /*@__PURE__*/ new Vector3();\nconst _vbp = /*@__PURE__*/ new Vector3();\nconst _vcp = /*@__PURE__*/ new Vector3();\n\nclass Triangle {\n\n\tconstructor( a = new Vector3(), b = new Vector3(), c = new Vector3() ) {\n\n\t\tthis.a = a;\n\t\tthis.b = b;\n\t\tthis.c = c;\n\n\t}\n\n\tstatic getNormal( a, b, c, target ) {\n\n\t\ttarget.subVectors( c, b );\n\t\t_v0$1.subVectors( a, b );\n\t\ttarget.cross( _v0$1 );\n\n\t\tconst targetLengthSq = target.lengthSq();\n\t\tif ( targetLengthSq > 0 ) {\n\n\t\t\treturn target.multiplyScalar( 1 / Math.sqrt( targetLengthSq ) );\n\n\t\t}\n\n\t\treturn target.set( 0, 0, 0 );\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\tstatic getBarycoord( point, a, b, c, target ) {\n\n\t\t_v0$1.subVectors( c, a );\n\t\t_v1$3.subVectors( b, a );\n\t\t_v2$2.subVectors( point, a );\n\n\t\tconst dot00 = _v0$1.dot( _v0$1 );\n\t\tconst dot01 = _v0$1.dot( _v1$3 );\n\t\tconst dot02 = _v0$1.dot( _v2$2 );\n\t\tconst dot11 = _v1$3.dot( _v1$3 );\n\t\tconst dot12 = _v1$3.dot( _v2$2 );\n\n\t\tconst denom = ( dot00 * dot11 - dot01 * dot01 );\n\n\t\t// collinear or singular triangle\n\t\tif ( denom === 0 ) {\n\n\t\t\t// arbitrary location outside of triangle?\n\t\t\t// not sure if this is the best idea, maybe should be returning undefined\n\t\t\treturn target.set( - 2, - 1, - 1 );\n\n\t\t}\n\n\t\tconst invDenom = 1 / denom;\n\t\tconst u = ( dot11 * dot02 - dot01 * dot12 ) * invDenom;\n\t\tconst v = ( dot00 * dot12 - dot01 * dot02 ) * invDenom;\n\n\t\t// barycentric coordinates must always sum to 1\n\t\treturn target.set( 1 - u - v, v, u );\n\n\t}\n\n\tstatic containsPoint( point, a, b, c ) {\n\n\t\tthis.getBarycoord( point, a, b, c, _v3$1 );\n\n\t\treturn ( _v3$1.x >= 0 ) && ( _v3$1.y >= 0 ) && ( ( _v3$1.x + _v3$1.y ) <= 1 );\n\n\t}\n\n\tstatic getUV( point, p1, p2, p3, uv1, uv2, uv3, target ) {\n\n\t\tthis.getBarycoord( point, p1, p2, p3, _v3$1 );\n\n\t\ttarget.set( 0, 0 );\n\t\ttarget.addScaledVector( uv1, _v3$1.x );\n\t\ttarget.addScaledVector( uv2, _v3$1.y );\n\t\ttarget.addScaledVector( uv3, _v3$1.z );\n\n\t\treturn target;\n\n\t}\n\n\tstatic isFrontFacing( a, b, c, direction ) {\n\n\t\t_v0$1.subVectors( c, b );\n\t\t_v1$3.subVectors( a, b );\n\n\t\t// strictly front facing\n\t\treturn ( _v0$1.cross( _v1$3 ).dot( direction ) < 0 ) ? true : false;\n\n\t}\n\n\tset( a, b, c ) {\n\n\t\tthis.a.copy( a );\n\t\tthis.b.copy( b );\n\t\tthis.c.copy( c );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromPointsAndIndices( points, i0, i1, i2 ) {\n\n\t\tthis.a.copy( points[ i0 ] );\n\t\tthis.b.copy( points[ i1 ] );\n\t\tthis.c.copy( points[ i2 ] );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromAttributeAndIndices( attribute, i0, i1, i2 ) {\n\n\t\tthis.a.fromBufferAttribute( attribute, i0 );\n\t\tthis.b.fromBufferAttribute( attribute, i1 );\n\t\tthis.c.fromBufferAttribute( attribute, i2 );\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( triangle ) {\n\n\t\tthis.a.copy( triangle.a );\n\t\tthis.b.copy( triangle.b );\n\t\tthis.c.copy( triangle.c );\n\n\t\treturn this;\n\n\t}\n\n\tgetArea() {\n\n\t\t_v0$1.subVectors( this.c, this.b );\n\t\t_v1$3.subVectors( this.a, this.b );\n\n\t\treturn _v0$1.cross( _v1$3 ).length() * 0.5;\n\n\t}\n\n\tgetMidpoint( target ) {\n\n\t\treturn target.addVectors( this.a, this.b ).add( this.c ).multiplyScalar( 1 / 3 );\n\n\t}\n\n\tgetNormal( target ) {\n\n\t\treturn Triangle.getNormal( this.a, this.b, this.c, target );\n\n\t}\n\n\tgetPlane( target ) {\n\n\t\treturn target.setFromCoplanarPoints( this.a, this.b, this.c );\n\n\t}\n\n\tgetBarycoord( point, target ) {\n\n\t\treturn Triangle.getBarycoord( point, this.a, this.b, this.c, target );\n\n\t}\n\n\tgetUV( point, uv1, uv2, uv3, target ) {\n\n\t\treturn Triangle.getUV( point, this.a, this.b, this.c, uv1, uv2, uv3, target );\n\n\t}\n\n\tcontainsPoint( point ) {\n\n\t\treturn Triangle.containsPoint( point, this.a, this.b, this.c );\n\n\t}\n\n\tisFrontFacing( direction ) {\n\n\t\treturn Triangle.isFrontFacing( this.a, this.b, this.c, direction );\n\n\t}\n\n\tintersectsBox( box ) {\n\n\t\treturn box.intersectsTriangle( this );\n\n\t}\n\n\tclosestPointToPoint( p, target ) {\n\n\t\tconst a = this.a, b = this.b, c = this.c;\n\t\tlet v, w;\n\n\t\t// algorithm thanks to Real-Time Collision Detection by Christer Ericson,\n\t\t// published by Morgan Kaufmann Publishers, (c) 2005 Elsevier Inc.,\n\t\t// under the accompanying license; see chapter 5.1.5 for detailed explanation.\n\t\t// basically, we're distinguishing which of the voronoi regions of the triangle\n\t\t// the point lies in with the minimum amount of redundant computation.\n\n\t\t_vab.subVectors( b, a );\n\t\t_vac.subVectors( c, a );\n\t\t_vap.subVectors( p, a );\n\t\tconst d1 = _vab.dot( _vap );\n\t\tconst d2 = _vac.dot( _vap );\n\t\tif ( d1 <= 0 && d2 <= 0 ) {\n\n\t\t\t// vertex region of A; barycentric coords (1, 0, 0)\n\t\t\treturn target.copy( a );\n\n\t\t}\n\n\t\t_vbp.subVectors( p, b );\n\t\tconst d3 = _vab.dot( _vbp );\n\t\tconst d4 = _vac.dot( _vbp );\n\t\tif ( d3 >= 0 && d4 <= d3 ) {\n\n\t\t\t// vertex region of B; barycentric coords (0, 1, 0)\n\t\t\treturn target.copy( b );\n\n\t\t}\n\n\t\tconst vc = d1 * d4 - d3 * d2;\n\t\tif ( vc <= 0 && d1 >= 0 && d3 <= 0 ) {\n\n\t\t\tv = d1 / ( d1 - d3 );\n\t\t\t// edge region of AB; barycentric coords (1-v, v, 0)\n\t\t\treturn target.copy( a ).addScaledVector( _vab, v );\n\n\t\t}\n\n\t\t_vcp.subVectors( p, c );\n\t\tconst d5 = _vab.dot( _vcp );\n\t\tconst d6 = _vac.dot( _vcp );\n\t\tif ( d6 >= 0 && d5 <= d6 ) {\n\n\t\t\t// vertex region of C; barycentric coords (0, 0, 1)\n\t\t\treturn target.copy( c );\n\n\t\t}\n\n\t\tconst vb = d5 * d2 - d1 * d6;\n\t\tif ( vb <= 0 && d2 >= 0 && d6 <= 0 ) {\n\n\t\t\tw = d2 / ( d2 - d6 );\n\t\t\t// edge region of AC; barycentric coords (1-w, 0, w)\n\t\t\treturn target.copy( a ).addScaledVector( _vac, w );\n\n\t\t}\n\n\t\tconst va = d3 * d6 - d5 * d4;\n\t\tif ( va <= 0 && ( d4 - d3 ) >= 0 && ( d5 - d6 ) >= 0 ) {\n\n\t\t\t_vbc.subVectors( c, b );\n\t\t\tw = ( d4 - d3 ) / ( ( d4 - d3 ) + ( d5 - d6 ) );\n\t\t\t// edge region of BC; barycentric coords (0, 1-w, w)\n\t\t\treturn target.copy( b ).addScaledVector( _vbc, w ); // edge region of BC\n\n\t\t}\n\n\t\t// face region\n\t\tconst denom = 1 / ( va + vb + vc );\n\t\t// u = va * denom\n\t\tv = vb * denom;\n\t\tw = vc * denom;\n\n\t\treturn target.copy( a ).addScaledVector( _vab, v ).addScaledVector( _vac, w );\n\n\t}\n\n\tequals( triangle ) {\n\n\t\treturn triangle.a.equals( this.a ) && triangle.b.equals( this.b ) && triangle.c.equals( this.c );\n\n\t}\n\n}\n\nlet materialId = 0;\n\nclass Material extends EventDispatcher {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.isMaterial = true;\n\n\t\tObject.defineProperty( this, 'id', { value: materialId ++ } );\n\n\t\tthis.uuid = generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'Material';\n\n\t\tthis.blending = NormalBlending;\n\t\tthis.side = FrontSide;\n\t\tthis.vertexColors = false;\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.stencilWriteMask = 0xff;\n\t\tthis.stencilFunc = AlwaysStencilFunc;\n\t\tthis.stencilRef = 0;\n\t\tthis.stencilFuncMask = 0xff;\n\t\tthis.stencilFail = KeepStencilOp;\n\t\tthis.stencilZFail = KeepStencilOp;\n\t\tthis.stencilZPass = KeepStencilOp;\n\t\tthis.stencilWrite = false;\n\n\t\tthis.clippingPlanes = null;\n\t\tthis.clipIntersection = false;\n\t\tthis.clipShadows = false;\n\n\t\tthis.shadowSide = null;\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.dithering = false;\n\n\t\tthis.alphaToCoverage = false;\n\t\tthis.premultipliedAlpha = false;\n\n\t\tthis.visible = true;\n\n\t\tthis.toneMapped = true;\n\n\t\tthis.userData = {};\n\n\t\tthis.version = 0;\n\n\t\tthis._alphaTest = 0;\n\n\t}\n\n\tget alphaTest() {\n\n\t\treturn this._alphaTest;\n\n\t}\n\n\tset alphaTest( value ) {\n\n\t\tif ( this._alphaTest > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._alphaTest = value;\n\n\t}\n\n\tonBuild( /* shaderobject, renderer */ ) {}\n\n\tonBeforeRender( /* renderer, scene, camera, geometry, object, group */ ) {}\n\n\tonBeforeCompile( /* shaderobject, renderer */ ) {}\n\n\tcustomProgramCacheKey() {\n\n\t\treturn this.onBeforeCompile.toString();\n\n\t}\n\n\tsetValues( values ) {\n\n\t\tif ( values === undefined ) return;\n\n\t\tfor ( const key in values ) {\n\n\t\t\tconst newValue = values[ key ];\n\n\t\t\tif ( newValue === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Material: \\'' + key + '\\' parameter is undefined.' );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\t// for backward compatibility if shading is set in the constructor\n\t\t\tif ( key === 'shading' ) {\n\n\t\t\t\tconsole.warn( 'THREE.' + this.type + ': .shading has been removed. Use the boolean .flatShading instead.' );\n\t\t\t\tthis.flatShading = ( newValue === FlatShading ) ? true : false;\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tconst currentValue = this[ key ];\n\n\t\t\tif ( currentValue === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.' + this.type + ': \\'' + key + '\\' is not a property of this material.' );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tif ( currentValue && currentValue.isColor ) {\n\n\t\t\t\tcurrentValue.set( newValue );\n\n\t\t\t} else if ( ( currentValue && currentValue.isVector3 ) && ( newValue && newValue.isVector3 ) ) {\n\n\t\t\t\tcurrentValue.copy( newValue );\n\n\t\t\t} else {\n\n\t\t\t\tthis[ key ] = newValue;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tif ( isRootObject ) {\n\n\t\t\tmeta = {\n\t\t\t\ttextures: {},\n\t\t\t\timages: {}\n\t\t\t};\n\n\t\t}\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.5,\n\t\t\t\ttype: 'Material',\n\t\t\t\tgenerator: 'Material.toJSON'\n\t\t\t}\n\t\t};\n\n\t\t// standard Material serialization\n\t\tdata.uuid = this.uuid;\n\t\tdata.type = this.type;\n\n\t\tif ( this.name !== '' ) data.name = this.name;\n\n\t\tif ( this.color && this.color.isColor ) data.color = this.color.getHex();\n\n\t\tif ( this.roughness !== undefined ) data.roughness = this.roughness;\n\t\tif ( this.metalness !== undefined ) data.metalness = this.metalness;\n\n\t\tif ( this.sheen !== undefined ) data.sheen = this.sheen;\n\t\tif ( this.sheenColor && this.sheenColor.isColor ) data.sheenColor = this.sheenColor.getHex();\n\t\tif ( this.sheenRoughness !== undefined ) data.sheenRoughness = this.sheenRoughness;\n\t\tif ( this.emissive && this.emissive.isColor ) data.emissive = this.emissive.getHex();\n\t\tif ( this.emissiveIntensity && this.emissiveIntensity !== 1 ) data.emissiveIntensity = this.emissiveIntensity;\n\n\t\tif ( this.specular && this.specular.isColor ) data.specular = this.specular.getHex();\n\t\tif ( this.specularIntensity !== undefined ) data.specularIntensity = this.specularIntensity;\n\t\tif ( this.specularColor && this.specularColor.isColor ) data.specularColor = this.specularColor.getHex();\n\t\tif ( this.shininess !== undefined ) data.shininess = this.shininess;\n\t\tif ( this.clearcoat !== undefined ) data.clearcoat = this.clearcoat;\n\t\tif ( this.clearcoatRoughness !== undefined ) data.clearcoatRoughness = this.clearcoatRoughness;\n\n\t\tif ( this.clearcoatMap && this.clearcoatMap.isTexture ) {\n\n\t\t\tdata.clearcoatMap = this.clearcoatMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.clearcoatRoughnessMap && this.clearcoatRoughnessMap.isTexture ) {\n\n\t\t\tdata.clearcoatRoughnessMap = this.clearcoatRoughnessMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.clearcoatNormalMap && this.clearcoatNormalMap.isTexture ) {\n\n\t\t\tdata.clearcoatNormalMap = this.clearcoatNormalMap.toJSON( meta ).uuid;\n\t\t\tdata.clearcoatNormalScale = this.clearcoatNormalScale.toArray();\n\n\t\t}\n\n\t\tif ( this.iridescence !== undefined ) data.iridescence = this.iridescence;\n\t\tif ( this.iridescenceIOR !== undefined ) data.iridescenceIOR = this.iridescenceIOR;\n\t\tif ( this.iridescenceThicknessRange !== undefined ) data.iridescenceThicknessRange = this.iridescenceThicknessRange;\n\n\t\tif ( this.iridescenceMap && this.iridescenceMap.isTexture ) {\n\n\t\t\tdata.iridescenceMap = this.iridescenceMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.iridescenceThicknessMap && this.iridescenceThicknessMap.isTexture ) {\n\n\t\t\tdata.iridescenceThicknessMap = this.iridescenceThicknessMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.map && this.map.isTexture ) data.map = this.map.toJSON( meta ).uuid;\n\t\tif ( this.matcap && this.matcap.isTexture ) data.matcap = this.matcap.toJSON( meta ).uuid;\n\t\tif ( this.alphaMap && this.alphaMap.isTexture ) data.alphaMap = this.alphaMap.toJSON( meta ).uuid;\n\n\t\tif ( this.lightMap && this.lightMap.isTexture ) {\n\n\t\t\tdata.lightMap = this.lightMap.toJSON( meta ).uuid;\n\t\t\tdata.lightMapIntensity = this.lightMapIntensity;\n\n\t\t}\n\n\t\tif ( this.aoMap && this.aoMap.isTexture ) {\n\n\t\t\tdata.aoMap = this.aoMap.toJSON( meta ).uuid;\n\t\t\tdata.aoMapIntensity = this.aoMapIntensity;\n\n\t\t}\n\n\t\tif ( this.bumpMap && this.bumpMap.isTexture ) {\n\n\t\t\tdata.bumpMap = this.bumpMap.toJSON( meta ).uuid;\n\t\t\tdata.bumpScale = this.bumpScale;\n\n\t\t}\n\n\t\tif ( this.normalMap && this.normalMap.isTexture ) {\n\n\t\t\tdata.normalMap = this.normalMap.toJSON( meta ).uuid;\n\t\t\tdata.normalMapType = this.normalMapType;\n\t\t\tdata.normalScale = this.normalScale.toArray();\n\n\t\t}\n\n\t\tif ( this.displacementMap && this.displacementMap.isTexture ) {\n\n\t\t\tdata.displacementMap = this.displacementMap.toJSON( meta ).uuid;\n\t\t\tdata.displacementScale = this.displacementScale;\n\t\t\tdata.displacementBias = this.displacementBias;\n\n\t\t}\n\n\t\tif ( this.roughnessMap && this.roughnessMap.isTexture ) data.roughnessMap = this.roughnessMap.toJSON( meta ).uuid;\n\t\tif ( this.metalnessMap && this.metalnessMap.isTexture ) data.metalnessMap = this.metalnessMap.toJSON( meta ).uuid;\n\n\t\tif ( this.emissiveMap && this.emissiveMap.isTexture ) data.emissiveMap = this.emissiveMap.toJSON( meta ).uuid;\n\t\tif ( this.specularMap && this.specularMap.isTexture ) data.specularMap = this.specularMap.toJSON( meta ).uuid;\n\t\tif ( this.specularIntensityMap && this.specularIntensityMap.isTexture ) data.specularIntensityMap = this.specularIntensityMap.toJSON( meta ).uuid;\n\t\tif ( this.specularColorMap && this.specularColorMap.isTexture ) data.specularColorMap = this.specularColorMap.toJSON( meta ).uuid;\n\n\t\tif ( this.envMap && this.envMap.isTexture ) {\n\n\t\t\tdata.envMap = this.envMap.toJSON( meta ).uuid;\n\n\t\t\tif ( this.combine !== undefined ) data.combine = this.combine;\n\n\t\t}\n\n\t\tif ( this.envMapIntensity !== undefined ) data.envMapIntensity = this.envMapIntensity;\n\t\tif ( this.reflectivity !== undefined ) data.reflectivity = this.reflectivity;\n\t\tif ( this.refractionRatio !== undefined ) data.refractionRatio = this.refractionRatio;\n\n\t\tif ( this.gradientMap && this.gradientMap.isTexture ) {\n\n\t\t\tdata.gradientMap = this.gradientMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.transmission !== undefined ) data.transmission = this.transmission;\n\t\tif ( this.transmissionMap && this.transmissionMap.isTexture ) data.transmissionMap = this.transmissionMap.toJSON( meta ).uuid;\n\t\tif ( this.thickness !== undefined ) data.thickness = this.thickness;\n\t\tif ( this.thicknessMap && this.thicknessMap.isTexture ) data.thicknessMap = this.thicknessMap.toJSON( meta ).uuid;\n\t\tif ( this.attenuationDistance !== undefined ) data.attenuationDistance = this.attenuationDistance;\n\t\tif ( this.attenuationColor !== undefined ) data.attenuationColor = this.attenuationColor.getHex();\n\n\t\tif ( this.size !== undefined ) data.size = this.size;\n\t\tif ( this.shadowSide !== null ) data.shadowSide = this.shadowSide;\n\t\tif ( this.sizeAttenuation !== undefined ) data.sizeAttenuation = this.sizeAttenuation;\n\n\t\tif ( this.blending !== NormalBlending ) data.blending = this.blending;\n\t\tif ( this.side !== FrontSide ) data.side = this.side;\n\t\tif ( this.vertexColors ) data.vertexColors = true;\n\n\t\tif ( this.opacity < 1 ) data.opacity = this.opacity;\n\t\tif ( this.transparent === true ) data.transparent = this.transparent;\n\n\t\tdata.depthFunc = this.depthFunc;\n\t\tdata.depthTest = this.depthTest;\n\t\tdata.depthWrite = this.depthWrite;\n\t\tdata.colorWrite = this.colorWrite;\n\n\t\tdata.stencilWrite = this.stencilWrite;\n\t\tdata.stencilWriteMask = this.stencilWriteMask;\n\t\tdata.stencilFunc = this.stencilFunc;\n\t\tdata.stencilRef = this.stencilRef;\n\t\tdata.stencilFuncMask = this.stencilFuncMask;\n\t\tdata.stencilFail = this.stencilFail;\n\t\tdata.stencilZFail = this.stencilZFail;\n\t\tdata.stencilZPass = this.stencilZPass;\n\n\t\t// rotation (SpriteMaterial)\n\t\tif ( this.rotation !== undefined && this.rotation !== 0 ) data.rotation = this.rotation;\n\n\t\tif ( this.polygonOffset === true ) data.polygonOffset = true;\n\t\tif ( this.polygonOffsetFactor !== 0 ) data.polygonOffsetFactor = this.polygonOffsetFactor;\n\t\tif ( this.polygonOffsetUnits !== 0 ) data.polygonOffsetUnits = this.polygonOffsetUnits;\n\n\t\tif ( this.linewidth !== undefined && this.linewidth !== 1 ) data.linewidth = this.linewidth;\n\t\tif ( this.dashSize !== undefined ) data.dashSize = this.dashSize;\n\t\tif ( this.gapSize !== undefined ) data.gapSize = this.gapSize;\n\t\tif ( this.scale !== undefined ) data.scale = this.scale;\n\n\t\tif ( this.dithering === true ) data.dithering = true;\n\n\t\tif ( this.alphaTest > 0 ) data.alphaTest = this.alphaTest;\n\t\tif ( this.alphaToCoverage === true ) data.alphaToCoverage = this.alphaToCoverage;\n\t\tif ( this.premultipliedAlpha === true ) data.premultipliedAlpha = this.premultipliedAlpha;\n\n\t\tif ( this.wireframe === true ) data.wireframe = this.wireframe;\n\t\tif ( this.wireframeLinewidth > 1 ) data.wireframeLinewidth = this.wireframeLinewidth;\n\t\tif ( this.wireframeLinecap !== 'round' ) data.wireframeLinecap = this.wireframeLinecap;\n\t\tif ( this.wireframeLinejoin !== 'round' ) data.wireframeLinejoin = this.wireframeLinejoin;\n\n\t\tif ( this.flatShading === true ) data.flatShading = this.flatShading;\n\n\t\tif ( this.visible === false ) data.visible = false;\n\n\t\tif ( this.toneMapped === false ) data.toneMapped = false;\n\n\t\tif ( this.fog === false ) data.fog = false;\n\n\t\tif ( JSON.stringify( this.userData ) !== '{}' ) data.userData = this.userData;\n\n\t\t// TODO: Copied from Object3D.toJSON\n\n\t\tfunction extractFromCache( cache ) {\n\n\t\t\tconst values = [];\n\n\t\t\tfor ( const key in cache ) {\n\n\t\t\t\tconst data = cache[ key ];\n\t\t\t\tdelete data.metadata;\n\t\t\t\tvalues.push( data );\n\n\t\t\t}\n\n\t\t\treturn values;\n\n\t\t}\n\n\t\tif ( isRootObject ) {\n\n\t\t\tconst textures = extractFromCache( meta.textures );\n\t\t\tconst images = extractFromCache( meta.images );\n\n\t\t\tif ( textures.length > 0 ) data.textures = textures;\n\t\t\tif ( images.length > 0 ) data.images = images;\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.name = source.name;\n\n\t\tthis.blending = source.blending;\n\t\tthis.side = source.side;\n\t\tthis.vertexColors = source.vertexColors;\n\n\t\tthis.opacity = source.opacity;\n\t\tthis.transparent = source.transparent;\n\n\t\tthis.blendSrc = source.blendSrc;\n\t\tthis.blendDst = source.blendDst;\n\t\tthis.blendEquation = source.blendEquation;\n\t\tthis.blendSrcAlpha = source.blendSrcAlpha;\n\t\tthis.blendDstAlpha = source.blendDstAlpha;\n\t\tthis.blendEquationAlpha = source.blendEquationAlpha;\n\n\t\tthis.depthFunc = source.depthFunc;\n\t\tthis.depthTest = source.depthTest;\n\t\tthis.depthWrite = source.depthWrite;\n\n\t\tthis.stencilWriteMask = source.stencilWriteMask;\n\t\tthis.stencilFunc = source.stencilFunc;\n\t\tthis.stencilRef = source.stencilRef;\n\t\tthis.stencilFuncMask = source.stencilFuncMask;\n\t\tthis.stencilFail = source.stencilFail;\n\t\tthis.stencilZFail = source.stencilZFail;\n\t\tthis.stencilZPass = source.stencilZPass;\n\t\tthis.stencilWrite = source.stencilWrite;\n\n\t\tconst srcPlanes = source.clippingPlanes;\n\t\tlet dstPlanes = null;\n\n\t\tif ( srcPlanes !== null ) {\n\n\t\t\tconst n = srcPlanes.length;\n\t\t\tdstPlanes = new Array( n );\n\n\t\t\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\t\t\tdstPlanes[ i ] = srcPlanes[ i ].clone();\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.clippingPlanes = dstPlanes;\n\t\tthis.clipIntersection = source.clipIntersection;\n\t\tthis.clipShadows = source.clipShadows;\n\n\t\tthis.shadowSide = source.shadowSide;\n\n\t\tthis.colorWrite = source.colorWrite;\n\n\t\tthis.precision = source.precision;\n\n\t\tthis.polygonOffset = source.polygonOffset;\n\t\tthis.polygonOffsetFactor = source.polygonOffsetFactor;\n\t\tthis.polygonOffsetUnits = source.polygonOffsetUnits;\n\n\t\tthis.dithering = source.dithering;\n\n\t\tthis.alphaTest = source.alphaTest;\n\t\tthis.alphaToCoverage = source.alphaToCoverage;\n\t\tthis.premultipliedAlpha = source.premultipliedAlpha;\n\n\t\tthis.visible = source.visible;\n\n\t\tthis.toneMapped = source.toneMapped;\n\n\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\treturn this;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n}\n\nclass MeshBasicMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isMeshBasicMaterial = true;\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.lightMap = null;\n\t\tthis.lightMapIntensity = 1.0;\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.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( 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.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.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _vector$9 = /*@__PURE__*/ new Vector3();\nconst _vector2$1 = /*@__PURE__*/ new Vector2();\n\nclass BufferAttribute {\n\n\tconstructor( 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.isBufferAttribute = true;\n\n\t\tthis.name = '';\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.usage = StaticDrawUsage;\n\t\tthis.updateRange = { offset: 0, count: - 1 };\n\n\t\tthis.version = 0;\n\n\t}\n\n\tonUploadCallback() {}\n\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n\tsetUsage( value ) {\n\n\t\tthis.usage = value;\n\n\t\treturn this;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.name = source.name;\n\t\tthis.array = new source.array.constructor( source.array );\n\t\tthis.itemSize = source.itemSize;\n\t\tthis.count = source.count;\n\t\tthis.normalized = source.normalized;\n\n\t\tthis.usage = source.usage;\n\n\t\treturn this;\n\n\t}\n\n\tcopyAt( index1, attribute, index2 ) {\n\n\t\tindex1 *= this.itemSize;\n\t\tindex2 *= attribute.itemSize;\n\n\t\tfor ( let i = 0, l = this.itemSize; i < l; i ++ ) {\n\n\t\t\tthis.array[ index1 + i ] = attribute.array[ index2 + i ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tcopyArray( array ) {\n\n\t\tthis.array.set( array );\n\n\t\treturn this;\n\n\t}\n\n\tcopyColorsArray( colors ) {\n\n\t\tconst array = this.array;\n\t\tlet offset = 0;\n\n\t\tfor ( let i = 0, l = colors.length; i < l; i ++ ) {\n\n\t\t\tlet color = colors[ i ];\n\n\t\t\tif ( color === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyColorsArray(): color is undefined', i );\n\t\t\t\tcolor = new Color();\n\n\t\t\t}\n\n\t\t\tarray[ offset ++ ] = color.r;\n\t\t\tarray[ offset ++ ] = color.g;\n\t\t\tarray[ offset ++ ] = color.b;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tcopyVector2sArray( vectors ) {\n\n\t\tconst array = this.array;\n\t\tlet offset = 0;\n\n\t\tfor ( let i = 0, l = vectors.length; i < l; i ++ ) {\n\n\t\t\tlet vector = vectors[ i ];\n\n\t\t\tif ( vector === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyVector2sArray(): vector is undefined', i );\n\t\t\t\tvector = new Vector2();\n\n\t\t\t}\n\n\t\t\tarray[ offset ++ ] = vector.x;\n\t\t\tarray[ offset ++ ] = vector.y;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tcopyVector3sArray( vectors ) {\n\n\t\tconst array = this.array;\n\t\tlet offset = 0;\n\n\t\tfor ( let i = 0, l = vectors.length; i < l; i ++ ) {\n\n\t\t\tlet vector = vectors[ i ];\n\n\t\t\tif ( vector === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyVector3sArray(): vector is undefined', i );\n\t\t\t\tvector = new Vector3();\n\n\t\t\t}\n\n\t\t\tarray[ offset ++ ] = vector.x;\n\t\t\tarray[ offset ++ ] = vector.y;\n\t\t\tarray[ offset ++ ] = vector.z;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tcopyVector4sArray( vectors ) {\n\n\t\tconst array = this.array;\n\t\tlet offset = 0;\n\n\t\tfor ( let i = 0, l = vectors.length; i < l; i ++ ) {\n\n\t\t\tlet vector = vectors[ i ];\n\n\t\t\tif ( vector === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyVector4sArray(): vector is undefined', i );\n\t\t\t\tvector = new Vector4();\n\n\t\t\t}\n\n\t\t\tarray[ offset ++ ] = vector.x;\n\t\t\tarray[ offset ++ ] = vector.y;\n\t\t\tarray[ offset ++ ] = vector.z;\n\t\t\tarray[ offset ++ ] = vector.w;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tapplyMatrix3( m ) {\n\n\t\tif ( this.itemSize === 2 ) {\n\n\t\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t\t_vector2$1.fromBufferAttribute( this, i );\n\t\t\t\t_vector2$1.applyMatrix3( m );\n\n\t\t\t\tthis.setXY( i, _vector2$1.x, _vector2$1.y );\n\n\t\t\t}\n\n\t\t} else if ( this.itemSize === 3 ) {\n\n\t\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t\t_vector$9.fromBufferAttribute( this, i );\n\t\t\t\t_vector$9.applyMatrix3( m );\n\n\t\t\t\tthis.setXYZ( i, _vector$9.x, _vector$9.y, _vector$9.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tapplyMatrix4( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$9.fromBufferAttribute( this, i );\n\n\t\t\t_vector$9.applyMatrix4( m );\n\n\t\t\tthis.setXYZ( i, _vector$9.x, _vector$9.y, _vector$9.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tapplyNormalMatrix( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$9.fromBufferAttribute( this, i );\n\n\t\t\t_vector$9.applyNormalMatrix( m );\n\n\t\t\tthis.setXYZ( i, _vector$9.x, _vector$9.y, _vector$9.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttransformDirection( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$9.fromBufferAttribute( this, i );\n\n\t\t\t_vector$9.transformDirection( m );\n\n\t\t\tthis.setXYZ( i, _vector$9.x, _vector$9.y, _vector$9.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tset( value, offset = 0 ) {\n\n\t\tthis.array.set( value, offset );\n\n\t\treturn this;\n\n\t}\n\n\tgetX( index ) {\n\n\t\treturn this.array[ index * this.itemSize ];\n\n\t}\n\n\tsetX( index, x ) {\n\n\t\tthis.array[ index * this.itemSize ] = x;\n\n\t\treturn this;\n\n\t}\n\n\tgetY( index ) {\n\n\t\treturn this.array[ index * this.itemSize + 1 ];\n\n\t}\n\n\tsetY( index, y ) {\n\n\t\tthis.array[ index * this.itemSize + 1 ] = y;\n\n\t\treturn this;\n\n\t}\n\n\tgetZ( index ) {\n\n\t\treturn this.array[ index * this.itemSize + 2 ];\n\n\t}\n\n\tsetZ( index, z ) {\n\n\t\tthis.array[ index * this.itemSize + 2 ] = z;\n\n\t\treturn this;\n\n\t}\n\n\tgetW( index ) {\n\n\t\treturn this.array[ index * this.itemSize + 3 ];\n\n\t}\n\n\tsetW( index, w ) {\n\n\t\tthis.array[ index * this.itemSize + 3 ] = w;\n\n\t\treturn this;\n\n\t}\n\n\tsetXY( index, x, y ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tthis.array[ index + 0 ] = x;\n\t\tthis.array[ index + 1 ] = y;\n\n\t\treturn this;\n\n\t}\n\n\tsetXYZ( index, x, y, z ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tthis.array[ index + 0 ] = x;\n\t\tthis.array[ index + 1 ] = y;\n\t\tthis.array[ index + 2 ] = z;\n\n\t\treturn this;\n\n\t}\n\n\tsetXYZW( index, x, y, z, w ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tthis.array[ index + 0 ] = x;\n\t\tthis.array[ index + 1 ] = y;\n\t\tthis.array[ index + 2 ] = z;\n\t\tthis.array[ index + 3 ] = w;\n\n\t\treturn this;\n\n\t}\n\n\tonUpload( callback ) {\n\n\t\tthis.onUploadCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this.array, this.itemSize ).copy( this );\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = {\n\t\t\titemSize: this.itemSize,\n\t\t\ttype: this.array.constructor.name,\n\t\t\tarray: Array.from( this.array ),\n\t\t\tnormalized: this.normalized\n\t\t};\n\n\t\tif ( this.name !== '' ) data.name = this.name;\n\t\tif ( this.usage !== StaticDrawUsage ) data.usage = this.usage;\n\t\tif ( this.updateRange.offset !== 0 || this.updateRange.count !== - 1 ) data.updateRange = this.updateRange;\n\n\t\treturn data;\n\n\t}\n\n}\n\n//\n\nclass Int8BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Int8Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Uint8BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint8Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Uint8ClampedBufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint8ClampedArray( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Int16BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Int16Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Uint16BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint16Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Int32BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Int32Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Uint32BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint32Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Float16BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint16Array( array ), itemSize, normalized );\n\n\t\tthis.isFloat16BufferAttribute = true;\n\n\t}\n\n}\n\n\nclass Float32BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Float32Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Float64BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Float64Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nlet _id$1 = 0;\n\nconst _m1 = /*@__PURE__*/ new Matrix4();\nconst _obj = /*@__PURE__*/ new Object3D();\nconst _offset = /*@__PURE__*/ new Vector3();\nconst _box$1 = /*@__PURE__*/ new Box3();\nconst _boxMorphTargets = /*@__PURE__*/ new Box3();\nconst _vector$8 = /*@__PURE__*/ new Vector3();\n\nclass BufferGeometry extends EventDispatcher {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.isBufferGeometry = true;\n\n\t\tObject.defineProperty( this, 'id', { value: _id$1 ++ } );\n\n\t\tthis.uuid = 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\t\tthis.morphTargetsRelative = false;\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\tthis.userData = {};\n\n\t}\n\n\tgetIndex() {\n\n\t\treturn this.index;\n\n\t}\n\n\tsetIndex( index ) {\n\n\t\tif ( Array.isArray( index ) ) {\n\n\t\t\tthis.index = new ( arrayNeedsUint32( index ) ? Uint32BufferAttribute : Uint16BufferAttribute )( index, 1 );\n\n\t\t} else {\n\n\t\t\tthis.index = index;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tgetAttribute( name ) {\n\n\t\treturn this.attributes[ name ];\n\n\t}\n\n\tsetAttribute( name, attribute ) {\n\n\t\tthis.attributes[ name ] = attribute;\n\n\t\treturn this;\n\n\t}\n\n\tdeleteAttribute( name ) {\n\n\t\tdelete this.attributes[ name ];\n\n\t\treturn this;\n\n\t}\n\n\thasAttribute( name ) {\n\n\t\treturn this.attributes[ name ] !== undefined;\n\n\t}\n\n\taddGroup( start, count, materialIndex = 0 ) {\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\tclearGroups() {\n\n\t\tthis.groups = [];\n\n\t}\n\n\tsetDrawRange( start, count ) {\n\n\t\tthis.drawRange.start = start;\n\t\tthis.drawRange.count = count;\n\n\t}\n\n\tapplyMatrix4( matrix ) {\n\n\t\tconst position = this.attributes.position;\n\n\t\tif ( position !== undefined ) {\n\n\t\t\tposition.applyMatrix4( matrix );\n\n\t\t\tposition.needsUpdate = true;\n\n\t\t}\n\n\t\tconst normal = this.attributes.normal;\n\n\t\tif ( normal !== undefined ) {\n\n\t\t\tconst normalMatrix = new Matrix3().getNormalMatrix( matrix );\n\n\t\t\tnormal.applyNormalMatrix( normalMatrix );\n\n\t\t\tnormal.needsUpdate = true;\n\n\t\t}\n\n\t\tconst tangent = this.attributes.tangent;\n\n\t\tif ( tangent !== undefined ) {\n\n\t\t\ttangent.transformDirection( matrix );\n\n\t\t\ttangent.needsUpdate = true;\n\n\t\t}\n\n\t\tif ( this.boundingBox !== null ) {\n\n\t\t\tthis.computeBoundingBox();\n\n\t\t}\n\n\t\tif ( this.boundingSphere !== null ) {\n\n\t\t\tthis.computeBoundingSphere();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tapplyQuaternion( q ) {\n\n\t\t_m1.makeRotationFromQuaternion( q );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\trotateX( angle ) {\n\n\t\t// rotate geometry around world x-axis\n\n\t\t_m1.makeRotationX( angle );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\trotateY( angle ) {\n\n\t\t// rotate geometry around world y-axis\n\n\t\t_m1.makeRotationY( angle );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\trotateZ( angle ) {\n\n\t\t// rotate geometry around world z-axis\n\n\t\t_m1.makeRotationZ( angle );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\ttranslate( x, y, z ) {\n\n\t\t// translate geometry\n\n\t\t_m1.makeTranslation( x, y, z );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\tscale( x, y, z ) {\n\n\t\t// scale geometry\n\n\t\t_m1.makeScale( x, y, z );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\tlookAt( vector ) {\n\n\t\t_obj.lookAt( vector );\n\n\t\t_obj.updateMatrix();\n\n\t\tthis.applyMatrix4( _obj.matrix );\n\n\t\treturn this;\n\n\t}\n\n\tcenter() {\n\n\t\tthis.computeBoundingBox();\n\n\t\tthis.boundingBox.getCenter( _offset ).negate();\n\n\t\tthis.translate( _offset.x, _offset.y, _offset.z );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromPoints( points ) {\n\n\t\tconst position = [];\n\n\t\tfor ( let i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\tconst point = points[ i ];\n\t\t\tposition.push( point.x, point.y, point.z || 0 );\n\n\t\t}\n\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( position, 3 ) );\n\n\t\treturn this;\n\n\t}\n\n\tcomputeBoundingBox() {\n\n\t\tif ( this.boundingBox === null ) {\n\n\t\t\tthis.boundingBox = new Box3();\n\n\t\t}\n\n\t\tconst position = this.attributes.position;\n\t\tconst morphAttributesPosition = this.morphAttributes.position;\n\n\t\tif ( position && position.isGLBufferAttribute ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingBox(): GLBufferAttribute requires a manual bounding box. Alternatively set \"mesh.frustumCulled\" to \"false\".', this );\n\n\t\t\tthis.boundingBox.set(\n\t\t\t\tnew Vector3( - Infinity, - Infinity, - Infinity ),\n\t\t\t\tnew Vector3( + Infinity, + Infinity, + Infinity )\n\t\t\t);\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( position !== undefined ) {\n\n\t\t\tthis.boundingBox.setFromBufferAttribute( position );\n\n\t\t\t// process morph attributes if present\n\n\t\t\tif ( morphAttributesPosition ) {\n\n\t\t\t\tfor ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst morphAttribute = morphAttributesPosition[ i ];\n\t\t\t\t\t_box$1.setFromBufferAttribute( morphAttribute );\n\n\t\t\t\t\tif ( this.morphTargetsRelative ) {\n\n\t\t\t\t\t\t_vector$8.addVectors( this.boundingBox.min, _box$1.min );\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _vector$8 );\n\n\t\t\t\t\t\t_vector$8.addVectors( this.boundingBox.max, _box$1.max );\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _vector$8 );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _box$1.min );\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _box$1.max );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tthis.boundingBox.makeEmpty();\n\n\t\t}\n\n\t\tif ( isNaN( this.boundingBox.min.x ) || isNaN( this.boundingBox.min.y ) || isNaN( this.boundingBox.min.z ) ) {\n\n\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}\n\n\t}\n\n\tcomputeBoundingSphere() {\n\n\t\tif ( this.boundingSphere === null ) {\n\n\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tconst position = this.attributes.position;\n\t\tconst morphAttributesPosition = this.morphAttributes.position;\n\n\t\tif ( position && position.isGLBufferAttribute ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingSphere(): GLBufferAttribute requires a manual bounding sphere. Alternatively set \"mesh.frustumCulled\" to \"false\".', this );\n\n\t\t\tthis.boundingSphere.set( new Vector3(), Infinity );\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( position ) {\n\n\t\t\t// first, find the center of the bounding sphere\n\n\t\t\tconst center = this.boundingSphere.center;\n\n\t\t\t_box$1.setFromBufferAttribute( position );\n\n\t\t\t// process morph attributes if present\n\n\t\t\tif ( morphAttributesPosition ) {\n\n\t\t\t\tfor ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst morphAttribute = morphAttributesPosition[ i ];\n\t\t\t\t\t_boxMorphTargets.setFromBufferAttribute( morphAttribute );\n\n\t\t\t\t\tif ( this.morphTargetsRelative ) {\n\n\t\t\t\t\t\t_vector$8.addVectors( _box$1.min, _boxMorphTargets.min );\n\t\t\t\t\t\t_box$1.expandByPoint( _vector$8 );\n\n\t\t\t\t\t\t_vector$8.addVectors( _box$1.max, _boxMorphTargets.max );\n\t\t\t\t\t\t_box$1.expandByPoint( _vector$8 );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_box$1.expandByPoint( _boxMorphTargets.min );\n\t\t\t\t\t\t_box$1.expandByPoint( _boxMorphTargets.max );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_box$1.getCenter( center );\n\n\t\t\t// second, try to find a boundingSphere with a radius smaller than the\n\t\t\t// boundingSphere of the boundingBox: sqrt(3) smaller in the best case\n\n\t\t\tlet maxRadiusSq = 0;\n\n\t\t\tfor ( let i = 0, il = position.count; i < il; i ++ ) {\n\n\t\t\t\t_vector$8.fromBufferAttribute( position, i );\n\n\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( _vector$8 ) );\n\n\t\t\t}\n\n\t\t\t// process morph attributes if present\n\n\t\t\tif ( morphAttributesPosition ) {\n\n\t\t\t\tfor ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst morphAttribute = morphAttributesPosition[ i ];\n\t\t\t\t\tconst morphTargetsRelative = this.morphTargetsRelative;\n\n\t\t\t\t\tfor ( let j = 0, jl = morphAttribute.count; j < jl; j ++ ) {\n\n\t\t\t\t\t\t_vector$8.fromBufferAttribute( morphAttribute, j );\n\n\t\t\t\t\t\tif ( morphTargetsRelative ) {\n\n\t\t\t\t\t\t\t_offset.fromBufferAttribute( position, j );\n\t\t\t\t\t\t\t_vector$8.add( _offset );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( _vector$8 ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.boundingSphere.radius = Math.sqrt( maxRadiusSq );\n\n\t\t\tif ( isNaN( this.boundingSphere.radius ) ) {\n\n\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}\n\n\t\t}\n\n\t}\n\n\tcomputeTangents() {\n\n\t\tconst index = this.index;\n\t\tconst attributes = this.attributes;\n\n\t\t// based on http://www.terathon.com/code/tangent.html\n\t\t// (per vertex tangents)\n\n\t\tif ( index === null ||\n\t\t\t attributes.position === undefined ||\n\t\t\t attributes.normal === undefined ||\n\t\t\t attributes.uv === undefined ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometry: .computeTangents() failed. Missing required attributes (index, position, normal or uv)' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst indices = index.array;\n\t\tconst positions = attributes.position.array;\n\t\tconst normals = attributes.normal.array;\n\t\tconst uvs = attributes.uv.array;\n\n\t\tconst nVertices = positions.length / 3;\n\n\t\tif ( this.hasAttribute( 'tangent' ) === false ) {\n\n\t\t\tthis.setAttribute( 'tangent', new BufferAttribute( new Float32Array( 4 * nVertices ), 4 ) );\n\n\t\t}\n\n\t\tconst tangents = this.getAttribute( 'tangent' ).array;\n\n\t\tconst tan1 = [], tan2 = [];\n\n\t\tfor ( let i = 0; i < nVertices; i ++ ) {\n\n\t\t\ttan1[ i ] = new Vector3();\n\t\t\ttan2[ i ] = new Vector3();\n\n\t\t}\n\n\t\tconst vA = new Vector3(),\n\t\t\tvB = new Vector3(),\n\t\t\tvC = new Vector3(),\n\n\t\t\tuvA = new Vector2(),\n\t\t\tuvB = new Vector2(),\n\t\t\tuvC = new Vector2(),\n\n\t\t\tsdir = new Vector3(),\n\t\t\ttdir = new Vector3();\n\n\t\tfunction handleTriangle( a, b, c ) {\n\n\t\t\tvA.fromArray( positions, a * 3 );\n\t\t\tvB.fromArray( positions, b * 3 );\n\t\t\tvC.fromArray( positions, c * 3 );\n\n\t\t\tuvA.fromArray( uvs, a * 2 );\n\t\t\tuvB.fromArray( uvs, b * 2 );\n\t\t\tuvC.fromArray( uvs, c * 2 );\n\n\t\t\tvB.sub( vA );\n\t\t\tvC.sub( vA );\n\n\t\t\tuvB.sub( uvA );\n\t\t\tuvC.sub( uvA );\n\n\t\t\tconst r = 1.0 / ( uvB.x * uvC.y - uvC.x * uvB.y );\n\n\t\t\t// silently ignore degenerate uv triangles having coincident or colinear vertices\n\n\t\t\tif ( ! isFinite( r ) ) return;\n\n\t\t\tsdir.copy( vB ).multiplyScalar( uvC.y ).addScaledVector( vC, - uvB.y ).multiplyScalar( r );\n\t\t\ttdir.copy( vC ).multiplyScalar( uvB.x ).addScaledVector( vB, - uvC.x ).multiplyScalar( r );\n\n\t\t\ttan1[ a ].add( sdir );\n\t\t\ttan1[ b ].add( sdir );\n\t\t\ttan1[ c ].add( sdir );\n\n\t\t\ttan2[ a ].add( tdir );\n\t\t\ttan2[ b ].add( tdir );\n\t\t\ttan2[ c ].add( tdir );\n\n\t\t}\n\n\t\tlet groups = this.groups;\n\n\t\tif ( groups.length === 0 ) {\n\n\t\t\tgroups = [ {\n\t\t\t\tstart: 0,\n\t\t\t\tcount: indices.length\n\t\t\t} ];\n\n\t\t}\n\n\t\tfor ( let i = 0, il = groups.length; i < il; ++ i ) {\n\n\t\t\tconst group = groups[ i ];\n\n\t\t\tconst start = group.start;\n\t\t\tconst count = group.count;\n\n\t\t\tfor ( let j = start, jl = start + count; j < jl; j += 3 ) {\n\n\t\t\t\thandleTriangle(\n\t\t\t\t\tindices[ j + 0 ],\n\t\t\t\t\tindices[ j + 1 ],\n\t\t\t\t\tindices[ j + 2 ]\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst tmp = new Vector3(), tmp2 = new Vector3();\n\t\tconst n = new Vector3(), n2 = new Vector3();\n\n\t\tfunction handleVertex( v ) {\n\n\t\t\tn.fromArray( normals, v * 3 );\n\t\t\tn2.copy( n );\n\n\t\t\tconst t = tan1[ v ];\n\n\t\t\t// Gram-Schmidt orthogonalize\n\n\t\t\ttmp.copy( t );\n\t\t\ttmp.sub( n.multiplyScalar( n.dot( t ) ) ).normalize();\n\n\t\t\t// Calculate handedness\n\n\t\t\ttmp2.crossVectors( n2, t );\n\t\t\tconst test = tmp2.dot( tan2[ v ] );\n\t\t\tconst w = ( test < 0.0 ) ? - 1.0 : 1.0;\n\n\t\t\ttangents[ v * 4 ] = tmp.x;\n\t\t\ttangents[ v * 4 + 1 ] = tmp.y;\n\t\t\ttangents[ v * 4 + 2 ] = tmp.z;\n\t\t\ttangents[ v * 4 + 3 ] = w;\n\n\t\t}\n\n\t\tfor ( let i = 0, il = groups.length; i < il; ++ i ) {\n\n\t\t\tconst group = groups[ i ];\n\n\t\t\tconst start = group.start;\n\t\t\tconst count = group.count;\n\n\t\t\tfor ( let j = start, jl = start + count; j < jl; j += 3 ) {\n\n\t\t\t\thandleVertex( indices[ j + 0 ] );\n\t\t\t\thandleVertex( indices[ j + 1 ] );\n\t\t\t\thandleVertex( indices[ j + 2 ] );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tcomputeVertexNormals() {\n\n\t\tconst index = this.index;\n\t\tconst positionAttribute = this.getAttribute( 'position' );\n\n\t\tif ( positionAttribute !== undefined ) {\n\n\t\t\tlet normalAttribute = this.getAttribute( 'normal' );\n\n\t\t\tif ( normalAttribute === undefined ) {\n\n\t\t\t\tnormalAttribute = new BufferAttribute( new Float32Array( positionAttribute.count * 3 ), 3 );\n\t\t\t\tthis.setAttribute( 'normal', normalAttribute );\n\n\t\t\t} else {\n\n\t\t\t\t// reset existing normals to zero\n\n\t\t\t\tfor ( let i = 0, il = normalAttribute.count; i < il; i ++ ) {\n\n\t\t\t\t\tnormalAttribute.setXYZ( i, 0, 0, 0 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst pA = new Vector3(), pB = new Vector3(), pC = new Vector3();\n\t\t\tconst nA = new Vector3(), nB = new Vector3(), nC = new Vector3();\n\t\t\tconst cb = new Vector3(), ab = new Vector3();\n\n\t\t\t// indexed elements\n\n\t\t\tif ( index ) {\n\n\t\t\t\tfor ( let i = 0, il = index.count; i < il; i += 3 ) {\n\n\t\t\t\t\tconst vA = index.getX( i + 0 );\n\t\t\t\t\tconst vB = index.getX( i + 1 );\n\t\t\t\t\tconst vC = index.getX( i + 2 );\n\n\t\t\t\t\tpA.fromBufferAttribute( positionAttribute, vA );\n\t\t\t\t\tpB.fromBufferAttribute( positionAttribute, vB );\n\t\t\t\t\tpC.fromBufferAttribute( positionAttribute, vC );\n\n\t\t\t\t\tcb.subVectors( pC, pB );\n\t\t\t\t\tab.subVectors( pA, pB );\n\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\tnA.fromBufferAttribute( normalAttribute, vA );\n\t\t\t\t\tnB.fromBufferAttribute( normalAttribute, vB );\n\t\t\t\t\tnC.fromBufferAttribute( normalAttribute, vC );\n\n\t\t\t\t\tnA.add( cb );\n\t\t\t\t\tnB.add( cb );\n\t\t\t\t\tnC.add( cb );\n\n\t\t\t\t\tnormalAttribute.setXYZ( vA, nA.x, nA.y, nA.z );\n\t\t\t\t\tnormalAttribute.setXYZ( vB, nB.x, nB.y, nB.z );\n\t\t\t\t\tnormalAttribute.setXYZ( vC, nC.x, nC.y, nC.z );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// non-indexed elements (unconnected triangle soup)\n\n\t\t\t\tfor ( let i = 0, il = positionAttribute.count; i < il; i += 3 ) {\n\n\t\t\t\t\tpA.fromBufferAttribute( positionAttribute, i + 0 );\n\t\t\t\t\tpB.fromBufferAttribute( positionAttribute, i + 1 );\n\t\t\t\t\tpC.fromBufferAttribute( positionAttribute, i + 2 );\n\n\t\t\t\t\tcb.subVectors( pC, pB );\n\t\t\t\t\tab.subVectors( pA, pB );\n\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\tnormalAttribute.setXYZ( i + 0, cb.x, cb.y, cb.z );\n\t\t\t\t\tnormalAttribute.setXYZ( i + 1, cb.x, cb.y, cb.z );\n\t\t\t\t\tnormalAttribute.setXYZ( i + 2, cb.x, cb.y, cb.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.normalizeNormals();\n\n\t\t\tnormalAttribute.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n\tmerge( geometry, offset ) {\n\n\t\tif ( ! ( geometry && geometry.isBufferGeometry ) ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.', geometry );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( offset === undefined ) {\n\n\t\t\toffset = 0;\n\n\t\t\tconsole.warn(\n\t\t\t\t'THREE.BufferGeometry.merge(): Overwriting original geometry, starting at offset=0. '\n\t\t\t\t+ 'Use BufferGeometryUtils.mergeBufferGeometries() for lossless merge.'\n\t\t\t);\n\n\t\t}\n\n\t\tconst attributes = this.attributes;\n\n\t\tfor ( const key in attributes ) {\n\n\t\t\tif ( geometry.attributes[ key ] === undefined ) continue;\n\n\t\t\tconst attribute1 = attributes[ key ];\n\t\t\tconst attributeArray1 = attribute1.array;\n\n\t\t\tconst attribute2 = geometry.attributes[ key ];\n\t\t\tconst attributeArray2 = attribute2.array;\n\n\t\t\tconst attributeOffset = attribute2.itemSize * offset;\n\t\t\tconst length = Math.min( attributeArray2.length, attributeArray1.length - attributeOffset );\n\n\t\t\tfor ( let i = 0, j = attributeOffset; i < length; i ++, j ++ ) {\n\n\t\t\t\tattributeArray1[ j ] = attributeArray2[ i ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tnormalizeNormals() {\n\n\t\tconst normals = this.attributes.normal;\n\n\t\tfor ( let i = 0, il = normals.count; i < il; i ++ ) {\n\n\t\t\t_vector$8.fromBufferAttribute( normals, i );\n\n\t\t\t_vector$8.normalize();\n\n\t\t\tnormals.setXYZ( i, _vector$8.x, _vector$8.y, _vector$8.z );\n\n\t\t}\n\n\t}\n\n\ttoNonIndexed() {\n\n\t\tfunction convertBufferAttribute( attribute, indices ) {\n\n\t\t\tconst array = attribute.array;\n\t\t\tconst itemSize = attribute.itemSize;\n\t\t\tconst normalized = attribute.normalized;\n\n\t\t\tconst array2 = new array.constructor( indices.length * itemSize );\n\n\t\t\tlet index = 0, index2 = 0;\n\n\t\t\tfor ( let i = 0, l = indices.length; i < l; i ++ ) {\n\n\t\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\t\tindex = indices[ i ] * attribute.data.stride + attribute.offset;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tindex = indices[ i ] * itemSize;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let j = 0; j < itemSize; j ++ ) {\n\n\t\t\t\t\tarray2[ index2 ++ ] = array[ index ++ ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new BufferAttribute( array2, itemSize, normalized );\n\n\t\t}\n\n\t\t//\n\n\t\tif ( this.index === null ) {\n\n\t\t\tconsole.warn( 'THREE.BufferGeometry.toNonIndexed(): BufferGeometry is already non-indexed.' );\n\t\t\treturn this;\n\n\t\t}\n\n\t\tconst geometry2 = new BufferGeometry();\n\n\t\tconst indices = this.index.array;\n\t\tconst attributes = this.attributes;\n\n\t\t// attributes\n\n\t\tfor ( const name in attributes ) {\n\n\t\t\tconst attribute = attributes[ name ];\n\n\t\t\tconst newAttribute = convertBufferAttribute( attribute, indices );\n\n\t\t\tgeometry2.setAttribute( name, newAttribute );\n\n\t\t}\n\n\t\t// morph attributes\n\n\t\tconst morphAttributes = this.morphAttributes;\n\n\t\tfor ( const name in morphAttributes ) {\n\n\t\t\tconst morphArray = [];\n\t\t\tconst morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes\n\n\t\t\tfor ( let i = 0, il = morphAttribute.length; i < il; i ++ ) {\n\n\t\t\t\tconst attribute = morphAttribute[ i ];\n\n\t\t\t\tconst newAttribute = convertBufferAttribute( attribute, indices );\n\n\t\t\t\tmorphArray.push( newAttribute );\n\n\t\t\t}\n\n\t\t\tgeometry2.morphAttributes[ name ] = morphArray;\n\n\t\t}\n\n\t\tgeometry2.morphTargetsRelative = this.morphTargetsRelative;\n\n\t\t// groups\n\n\t\tconst groups = this.groups;\n\n\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\tconst group = groups[ i ];\n\t\t\tgeometry2.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t}\n\n\t\treturn geometry2;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.5,\n\t\t\t\ttype: 'BufferGeometry',\n\t\t\t\tgenerator: 'BufferGeometry.toJSON'\n\t\t\t}\n\t\t};\n\n\t\t// standard BufferGeometry serialization\n\n\t\tdata.uuid = this.uuid;\n\t\tdata.type = this.type;\n\t\tif ( this.name !== '' ) data.name = this.name;\n\t\tif ( Object.keys( this.userData ).length > 0 ) data.userData = this.userData;\n\n\t\tif ( this.parameters !== undefined ) {\n\n\t\t\tconst parameters = this.parameters;\n\n\t\t\tfor ( const key in parameters ) {\n\n\t\t\t\tif ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ];\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\t// for simplicity the code assumes attributes are not shared across geometries, see #15811\n\n\t\tdata.data = { attributes: {} };\n\n\t\tconst index = this.index;\n\n\t\tif ( index !== null ) {\n\n\t\t\tdata.data.index = {\n\t\t\t\ttype: index.array.constructor.name,\n\t\t\t\tarray: Array.prototype.slice.call( index.array )\n\t\t\t};\n\n\t\t}\n\n\t\tconst attributes = this.attributes;\n\n\t\tfor ( const key in attributes ) {\n\n\t\t\tconst attribute = attributes[ key ];\n\n\t\t\tdata.data.attributes[ key ] = attribute.toJSON( data.data );\n\n\t\t}\n\n\t\tconst morphAttributes = {};\n\t\tlet hasMorphAttributes = false;\n\n\t\tfor ( const key in this.morphAttributes ) {\n\n\t\t\tconst attributeArray = this.morphAttributes[ key ];\n\n\t\t\tconst array = [];\n\n\t\t\tfor ( let i = 0, il = attributeArray.length; i < il; i ++ ) {\n\n\t\t\t\tconst attribute = attributeArray[ i ];\n\n\t\t\t\tarray.push( attribute.toJSON( data.data ) );\n\n\t\t\t}\n\n\t\t\tif ( array.length > 0 ) {\n\n\t\t\t\tmorphAttributes[ key ] = array;\n\n\t\t\t\thasMorphAttributes = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( hasMorphAttributes ) {\n\n\t\t\tdata.data.morphAttributes = morphAttributes;\n\t\t\tdata.data.morphTargetsRelative = this.morphTargetsRelative;\n\n\t\t}\n\n\t\tconst groups = this.groups;\n\n\t\tif ( groups.length > 0 ) {\n\n\t\t\tdata.data.groups = JSON.parse( JSON.stringify( groups ) );\n\n\t\t}\n\n\t\tconst boundingSphere = this.boundingSphere;\n\n\t\tif ( boundingSphere !== null ) {\n\n\t\t\tdata.data.boundingSphere = {\n\t\t\t\tcenter: boundingSphere.center.toArray(),\n\t\t\t\tradius: boundingSphere.radius\n\t\t\t};\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\tclone() {\n\n\t\t return new this.constructor().copy( this );\n\n\t}\n\n\tcopy( source ) {\n\n\t\t// reset\n\n\t\tthis.index = null;\n\t\tthis.attributes = {};\n\t\tthis.morphAttributes = {};\n\t\tthis.groups = [];\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\t// used for storing cloned, shared data\n\n\t\tconst data = {};\n\n\t\t// name\n\n\t\tthis.name = source.name;\n\n\t\t// index\n\n\t\tconst index = source.index;\n\n\t\tif ( index !== null ) {\n\n\t\t\tthis.setIndex( index.clone( data ) );\n\n\t\t}\n\n\t\t// attributes\n\n\t\tconst attributes = source.attributes;\n\n\t\tfor ( const name in attributes ) {\n\n\t\t\tconst attribute = attributes[ name ];\n\t\t\tthis.setAttribute( name, attribute.clone( data ) );\n\n\t\t}\n\n\t\t// morph attributes\n\n\t\tconst morphAttributes = source.morphAttributes;\n\n\t\tfor ( const name in morphAttributes ) {\n\n\t\t\tconst array = [];\n\t\t\tconst morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes\n\n\t\t\tfor ( let i = 0, l = morphAttribute.length; i < l; i ++ ) {\n\n\t\t\t\tarray.push( morphAttribute[ i ].clone( data ) );\n\n\t\t\t}\n\n\t\t\tthis.morphAttributes[ name ] = array;\n\n\t\t}\n\n\t\tthis.morphTargetsRelative = source.morphTargetsRelative;\n\n\t\t// groups\n\n\t\tconst groups = source.groups;\n\n\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\tconst group = groups[ i ];\n\t\t\tthis.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t}\n\n\t\t// bounding box\n\n\t\tconst boundingBox = source.boundingBox;\n\n\t\tif ( boundingBox !== null ) {\n\n\t\t\tthis.boundingBox = boundingBox.clone();\n\n\t\t}\n\n\t\t// bounding sphere\n\n\t\tconst boundingSphere = source.boundingSphere;\n\n\t\tif ( boundingSphere !== null ) {\n\n\t\t\tthis.boundingSphere = boundingSphere.clone();\n\n\t\t}\n\n\t\t// draw range\n\n\t\tthis.drawRange.start = source.drawRange.start;\n\t\tthis.drawRange.count = source.drawRange.count;\n\n\t\t// user data\n\n\t\tthis.userData = source.userData;\n\n\t\t// geometry generator parameters\n\n\t\tif ( source.parameters !== undefined ) this.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n}\n\nconst _inverseMatrix$2 = /*@__PURE__*/ new Matrix4();\nconst _ray$2 = /*@__PURE__*/ new Ray();\nconst _sphere$3 = /*@__PURE__*/ new Sphere();\n\nconst _vA$1 = /*@__PURE__*/ new Vector3();\nconst _vB$1 = /*@__PURE__*/ new Vector3();\nconst _vC$1 = /*@__PURE__*/ new Vector3();\n\nconst _tempA = /*@__PURE__*/ new Vector3();\nconst _tempB = /*@__PURE__*/ new Vector3();\nconst _tempC = /*@__PURE__*/ new Vector3();\n\nconst _morphA = /*@__PURE__*/ new Vector3();\nconst _morphB = /*@__PURE__*/ new Vector3();\nconst _morphC = /*@__PURE__*/ new Vector3();\n\nconst _uvA$1 = /*@__PURE__*/ new Vector2();\nconst _uvB$1 = /*@__PURE__*/ new Vector2();\nconst _uvC$1 = /*@__PURE__*/ new Vector2();\n\nconst _intersectionPoint = /*@__PURE__*/ new Vector3();\nconst _intersectionPointWorld = /*@__PURE__*/ new Vector3();\n\nclass Mesh extends Object3D {\n\n\tconstructor( geometry = new BufferGeometry(), material = new MeshBasicMaterial() ) {\n\n\t\tsuper();\n\n\t\tthis.isMesh = true;\n\n\t\tthis.type = 'Mesh';\n\n\t\tthis.geometry = geometry;\n\t\tthis.material = material;\n\n\t\tthis.updateMorphTargets();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tif ( source.morphTargetInfluences !== undefined ) {\n\n\t\t\tthis.morphTargetInfluences = source.morphTargetInfluences.slice();\n\n\t\t}\n\n\t\tif ( source.morphTargetDictionary !== undefined ) {\n\n\t\t\tthis.morphTargetDictionary = Object.assign( {}, source.morphTargetDictionary );\n\n\t\t}\n\n\t\tthis.material = source.material;\n\t\tthis.geometry = source.geometry;\n\n\t\treturn this;\n\n\t}\n\n\tupdateMorphTargets() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tconst morphAttributes = geometry.morphAttributes;\n\t\tconst keys = Object.keys( morphAttributes );\n\n\t\tif ( keys.length > 0 ) {\n\n\t\t\tconst morphAttribute = morphAttributes[ keys[ 0 ] ];\n\n\t\t\tif ( morphAttribute !== undefined ) {\n\n\t\t\t\tthis.morphTargetInfluences = [];\n\t\t\t\tthis.morphTargetDictionary = {};\n\n\t\t\t\tfor ( let m = 0, ml = morphAttribute.length; m < ml; m ++ ) {\n\n\t\t\t\t\tconst name = morphAttribute[ m ].name || String( m );\n\n\t\t\t\t\tthis.morphTargetInfluences.push( 0 );\n\t\t\t\t\tthis.morphTargetDictionary[ name ] = m;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst material = this.material;\n\t\tconst matrixWorld = this.matrixWorld;\n\n\t\tif ( material === undefined ) return;\n\n\t\t// Checking boundingSphere distance to ray\n\n\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t_sphere$3.copy( geometry.boundingSphere );\n\t\t_sphere$3.applyMatrix4( matrixWorld );\n\n\t\tif ( raycaster.ray.intersectsSphere( _sphere$3 ) === false ) return;\n\n\t\t//\n\n\t\t_inverseMatrix$2.copy( matrixWorld ).invert();\n\t\t_ray$2.copy( raycaster.ray ).applyMatrix4( _inverseMatrix$2 );\n\n\t\t// Check boundingBox before continuing\n\n\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\tif ( _ray$2.intersectsBox( geometry.boundingBox ) === false ) return;\n\n\t\t}\n\n\t\tlet intersection;\n\n\t\tconst index = geometry.index;\n\t\tconst position = geometry.attributes.position;\n\t\tconst morphPosition = geometry.morphAttributes.position;\n\t\tconst morphTargetsRelative = geometry.morphTargetsRelative;\n\t\tconst uv = geometry.attributes.uv;\n\t\tconst uv2 = geometry.attributes.uv2;\n\t\tconst groups = geometry.groups;\n\t\tconst drawRange = geometry.drawRange;\n\n\t\tif ( index !== null ) {\n\n\t\t\t// indexed buffer geometry\n\n\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\tfor ( let i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst group = groups[ i ];\n\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\tconst start = Math.max( group.start, drawRange.start );\n\t\t\t\t\tconst end = Math.min( index.count, Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) ) );\n\n\t\t\t\t\tfor ( let j = start, jl = end; j < jl; j += 3 ) {\n\n\t\t\t\t\t\tconst a = index.getX( j );\n\t\t\t\t\t\tconst b = index.getX( j + 1 );\n\t\t\t\t\t\tconst c = index.getX( j + 2 );\n\n\t\t\t\t\t\tintersection = checkBufferGeometryIntersection( this, groupMaterial, raycaster, _ray$2, position, morphPosition, morphTargetsRelative, uv, uv2, a, b, c );\n\n\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\tintersection.faceIndex = Math.floor( j / 3 ); // triangle number in indexed buffer semantics\n\t\t\t\t\t\t\tintersection.face.materialIndex = group.materialIndex;\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} else {\n\n\t\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\t\tconst end = Math.min( index.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\t\tfor ( let i = start, il = end; i < il; i += 3 ) {\n\n\t\t\t\t\tconst a = index.getX( i );\n\t\t\t\t\tconst b = index.getX( i + 1 );\n\t\t\t\t\tconst c = index.getX( i + 2 );\n\n\t\t\t\t\tintersection = checkBufferGeometryIntersection( this, material, raycaster, _ray$2, position, morphPosition, morphTargetsRelative, uv, uv2, a, b, c );\n\n\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\tintersection.faceIndex = Math.floor( i / 3 ); // triangle number in indexed buffer semantics\n\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else if ( position !== undefined ) {\n\n\t\t\t// non-indexed buffer geometry\n\n\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\tfor ( let i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst group = groups[ i ];\n\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\tconst start = Math.max( group.start, drawRange.start );\n\t\t\t\t\tconst end = Math.min( position.count, Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) ) );\n\n\t\t\t\t\tfor ( let j = start, jl = end; j < jl; j += 3 ) {\n\n\t\t\t\t\t\tconst a = j;\n\t\t\t\t\t\tconst b = j + 1;\n\t\t\t\t\t\tconst c = j + 2;\n\n\t\t\t\t\t\tintersection = checkBufferGeometryIntersection( this, groupMaterial, raycaster, _ray$2, position, morphPosition, morphTargetsRelative, uv, uv2, a, b, c );\n\n\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\tintersection.faceIndex = Math.floor( j / 3 ); // triangle number in non-indexed buffer semantics\n\t\t\t\t\t\t\tintersection.face.materialIndex = group.materialIndex;\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} else {\n\n\t\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\t\tconst end = Math.min( position.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\t\tfor ( let i = start, il = end; i < il; i += 3 ) {\n\n\t\t\t\t\tconst a = i;\n\t\t\t\t\tconst b = i + 1;\n\t\t\t\t\tconst c = i + 2;\n\n\t\t\t\t\tintersection = checkBufferGeometryIntersection( this, material, raycaster, _ray$2, position, morphPosition, morphTargetsRelative, uv, uv2, a, b, c );\n\n\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\tintersection.faceIndex = Math.floor( i / 3 ); // triangle number in non-indexed buffer semantics\n\t\t\t\t\t\tintersects.push( intersection );\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}\n\n}\n\nfunction checkIntersection( object, material, raycaster, ray, pA, pB, pC, point ) {\n\n\tlet intersect;\n\n\tif ( material.side === BackSide ) {\n\n\t\tintersect = ray.intersectTriangle( pC, pB, pA, true, point );\n\n\t} else {\n\n\t\tintersect = ray.intersectTriangle( pA, pB, pC, material.side !== DoubleSide, point );\n\n\t}\n\n\tif ( intersect === null ) return null;\n\n\t_intersectionPointWorld.copy( point );\n\t_intersectionPointWorld.applyMatrix4( object.matrixWorld );\n\n\tconst distance = raycaster.ray.origin.distanceTo( _intersectionPointWorld );\n\n\tif ( distance < raycaster.near || distance > raycaster.far ) return null;\n\n\treturn {\n\t\tdistance: distance,\n\t\tpoint: _intersectionPointWorld.clone(),\n\t\tobject: object\n\t};\n\n}\n\nfunction checkBufferGeometryIntersection( object, material, raycaster, ray, position, morphPosition, morphTargetsRelative, uv, uv2, a, b, c ) {\n\n\t_vA$1.fromBufferAttribute( position, a );\n\t_vB$1.fromBufferAttribute( position, b );\n\t_vC$1.fromBufferAttribute( position, c );\n\n\tconst morphInfluences = object.morphTargetInfluences;\n\n\tif ( morphPosition && morphInfluences ) {\n\n\t\t_morphA.set( 0, 0, 0 );\n\t\t_morphB.set( 0, 0, 0 );\n\t\t_morphC.set( 0, 0, 0 );\n\n\t\tfor ( let i = 0, il = morphPosition.length; i < il; i ++ ) {\n\n\t\t\tconst influence = morphInfluences[ i ];\n\t\t\tconst morphAttribute = morphPosition[ i ];\n\n\t\t\tif ( influence === 0 ) continue;\n\n\t\t\t_tempA.fromBufferAttribute( morphAttribute, a );\n\t\t\t_tempB.fromBufferAttribute( morphAttribute, b );\n\t\t\t_tempC.fromBufferAttribute( morphAttribute, c );\n\n\t\t\tif ( morphTargetsRelative ) {\n\n\t\t\t\t_morphA.addScaledVector( _tempA, influence );\n\t\t\t\t_morphB.addScaledVector( _tempB, influence );\n\t\t\t\t_morphC.addScaledVector( _tempC, influence );\n\n\t\t\t} else {\n\n\t\t\t\t_morphA.addScaledVector( _tempA.sub( _vA$1 ), influence );\n\t\t\t\t_morphB.addScaledVector( _tempB.sub( _vB$1 ), influence );\n\t\t\t\t_morphC.addScaledVector( _tempC.sub( _vC$1 ), influence );\n\n\t\t\t}\n\n\t\t}\n\n\t\t_vA$1.add( _morphA );\n\t\t_vB$1.add( _morphB );\n\t\t_vC$1.add( _morphC );\n\n\t}\n\n\tif ( object.isSkinnedMesh ) {\n\n\t\tobject.boneTransform( a, _vA$1 );\n\t\tobject.boneTransform( b, _vB$1 );\n\t\tobject.boneTransform( c, _vC$1 );\n\n\t}\n\n\tconst intersection = checkIntersection( object, material, raycaster, ray, _vA$1, _vB$1, _vC$1, _intersectionPoint );\n\n\tif ( intersection ) {\n\n\t\tif ( uv ) {\n\n\t\t\t_uvA$1.fromBufferAttribute( uv, a );\n\t\t\t_uvB$1.fromBufferAttribute( uv, b );\n\t\t\t_uvC$1.fromBufferAttribute( uv, c );\n\n\t\t\tintersection.uv = Triangle.getUV( _intersectionPoint, _vA$1, _vB$1, _vC$1, _uvA$1, _uvB$1, _uvC$1, new Vector2() );\n\n\t\t}\n\n\t\tif ( uv2 ) {\n\n\t\t\t_uvA$1.fromBufferAttribute( uv2, a );\n\t\t\t_uvB$1.fromBufferAttribute( uv2, b );\n\t\t\t_uvC$1.fromBufferAttribute( uv2, c );\n\n\t\t\tintersection.uv2 = Triangle.getUV( _intersectionPoint, _vA$1, _vB$1, _vC$1, _uvA$1, _uvB$1, _uvC$1, new Vector2() );\n\n\t\t}\n\n\t\tconst face = {\n\t\t\ta: a,\n\t\t\tb: b,\n\t\t\tc: c,\n\t\t\tnormal: new Vector3(),\n\t\t\tmaterialIndex: 0\n\t\t};\n\n\t\tTriangle.getNormal( _vA$1, _vB$1, _vC$1, face.normal );\n\n\t\tintersection.face = face;\n\n\t}\n\n\treturn intersection;\n\n}\n\nclass BoxGeometry extends BufferGeometry {\n\n\tconstructor( width = 1, height = 1, depth = 1, widthSegments = 1, heightSegments = 1, depthSegments = 1 ) {\n\n\t\tsuper();\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\tconst scope = this;\n\n\t\t// segments\n\n\t\twidthSegments = Math.floor( widthSegments );\n\t\theightSegments = Math.floor( heightSegments );\n\t\tdepthSegments = Math.floor( depthSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tlet numberOfVertices = 0;\n\t\tlet groupStart = 0;\n\n\t\t// build each side of the box geometry\n\n\t\tbuildPlane( 'z', 'y', 'x', - 1, - 1, depth, height, width, depthSegments, heightSegments, 0 ); // px\n\t\tbuildPlane( 'z', 'y', 'x', 1, - 1, depth, height, - width, depthSegments, heightSegments, 1 ); // nx\n\t\tbuildPlane( 'x', 'z', 'y', 1, 1, width, depth, height, widthSegments, depthSegments, 2 ); // py\n\t\tbuildPlane( 'x', 'z', 'y', 1, - 1, width, depth, - height, widthSegments, depthSegments, 3 ); // ny\n\t\tbuildPlane( 'x', 'y', 'z', 1, - 1, width, height, depth, widthSegments, heightSegments, 4 ); // pz\n\t\tbuildPlane( 'x', 'y', 'z', - 1, - 1, width, height, - depth, widthSegments, heightSegments, 5 ); // nz\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\tfunction buildPlane( u, v, w, udir, vdir, width, height, depth, gridX, gridY, materialIndex ) {\n\n\t\t\tconst segmentWidth = width / gridX;\n\t\t\tconst segmentHeight = height / gridY;\n\n\t\t\tconst widthHalf = width / 2;\n\t\t\tconst heightHalf = height / 2;\n\t\t\tconst depthHalf = depth / 2;\n\n\t\t\tconst gridX1 = gridX + 1;\n\t\t\tconst gridY1 = gridY + 1;\n\n\t\t\tlet vertexCounter = 0;\n\t\t\tlet groupCount = 0;\n\n\t\t\tconst vector = new Vector3();\n\n\t\t\t// generate vertices, normals and uvs\n\n\t\t\tfor ( let iy = 0; iy < gridY1; iy ++ ) {\n\n\t\t\t\tconst y = iy * segmentHeight - heightHalf;\n\n\t\t\t\tfor ( let ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\t\t\tconst x = ix * segmentWidth - widthHalf;\n\n\t\t\t\t\t// set values to correct vector component\n\n\t\t\t\t\tvector[ u ] = x * udir;\n\t\t\t\t\tvector[ v ] = y * vdir;\n\t\t\t\t\tvector[ w ] = depthHalf;\n\n\t\t\t\t\t// now apply vector to vertex buffer\n\n\t\t\t\t\tvertices.push( vector.x, vector.y, vector.z );\n\n\t\t\t\t\t// set values to correct vector component\n\n\t\t\t\t\tvector[ u ] = 0;\n\t\t\t\t\tvector[ v ] = 0;\n\t\t\t\t\tvector[ w ] = depth > 0 ? 1 : - 1;\n\n\t\t\t\t\t// now apply vector to normal buffer\n\n\t\t\t\t\tnormals.push( vector.x, vector.y, vector.z );\n\n\t\t\t\t\t// uvs\n\n\t\t\t\t\tuvs.push( ix / gridX );\n\t\t\t\t\tuvs.push( 1 - ( iy / gridY ) );\n\n\t\t\t\t\t// counters\n\n\t\t\t\t\tvertexCounter += 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// indices\n\n\t\t\t// 1. you need three indices to draw a single face\n\t\t\t// 2. a single segment consists of two faces\n\t\t\t// 3. so we need to generate six (2*3) indices per segment\n\n\t\t\tfor ( let iy = 0; iy < gridY; iy ++ ) {\n\n\t\t\t\tfor ( let ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\t\t\tconst a = numberOfVertices + ix + gridX1 * iy;\n\t\t\t\t\tconst b = numberOfVertices + ix + gridX1 * ( iy + 1 );\n\t\t\t\t\tconst c = numberOfVertices + ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\t\t\tconst d = numberOfVertices + ( ix + 1 ) + gridX1 * iy;\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t\t// increase counter\n\n\t\t\t\t\tgroupCount += 6;\n\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\n\t\t\tscope.addGroup( groupStart, groupCount, materialIndex );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t\t// update total number of vertices\n\n\t\t\tnumberOfVertices += vertexCounter;\n\n\t\t}\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new BoxGeometry( data.width, data.height, data.depth, data.widthSegments, data.heightSegments, data.depthSegments );\n\n\t}\n\n}\n\n/**\n * Uniform Utilities\n */\n\nfunction cloneUniforms( src ) {\n\n\tconst dst = {};\n\n\tfor ( const u in src ) {\n\n\t\tdst[ u ] = {};\n\n\t\tfor ( const p in src[ u ] ) {\n\n\t\t\tconst property = src[ u ][ p ];\n\n\t\t\tif ( property && ( property.isColor ||\n\t\t\t\tproperty.isMatrix3 || property.isMatrix4 ||\n\t\t\t\tproperty.isVector2 || property.isVector3 || property.isVector4 ||\n\t\t\t\tproperty.isTexture || property.isQuaternion ) ) {\n\n\t\t\t\tdst[ u ][ p ] = property.clone();\n\n\t\t\t} else if ( Array.isArray( property ) ) {\n\n\t\t\t\tdst[ u ][ p ] = property.slice();\n\n\t\t\t} else {\n\n\t\t\t\tdst[ u ][ p ] = property;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn dst;\n\n}\n\nfunction mergeUniforms( uniforms ) {\n\n\tconst merged = {};\n\n\tfor ( let u = 0; u < uniforms.length; u ++ ) {\n\n\t\tconst tmp = cloneUniforms( uniforms[ u ] );\n\n\t\tfor ( const p in tmp ) {\n\n\t\t\tmerged[ p ] = tmp[ p ];\n\n\t\t}\n\n\t}\n\n\treturn merged;\n\n}\n\nfunction cloneUniformsGroups( src ) {\n\n\tconst dst = [];\n\n\tfor ( let u = 0; u < src.length; u ++ ) {\n\n\t\tdst.push( src[ u ].clone() );\n\n\t}\n\n\treturn dst;\n\n}\n\n// Legacy\n\nconst UniformsUtils = { clone: cloneUniforms, merge: mergeUniforms };\n\nvar default_vertex = \"void main() {\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\\n}\";\n\nvar default_fragment = \"void main() {\\n\\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\\n}\";\n\nclass ShaderMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isShaderMaterial = true;\n\n\t\tthis.type = 'ShaderMaterial';\n\n\t\tthis.defines = {};\n\t\tthis.uniforms = {};\n\t\tthis.uniformsGroups = [];\n\n\t\tthis.vertexShader = default_vertex;\n\t\tthis.fragmentShader = default_fragment;\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.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\t\tthis.uniformsNeedUpdate = false;\n\n\t\tthis.glslVersion = null;\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\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.fragmentShader = source.fragmentShader;\n\t\tthis.vertexShader = source.vertexShader;\n\n\t\tthis.uniforms = cloneUniforms( source.uniforms );\n\t\tthis.uniformsGroups = cloneUniformsGroups( source.uniformsGroups );\n\n\t\tthis.defines = Object.assign( {}, source.defines );\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\tthis.fog = source.fog;\n\t\tthis.lights = source.lights;\n\t\tthis.clipping = source.clipping;\n\n\t\tthis.extensions = Object.assign( {}, source.extensions );\n\n\t\tthis.glslVersion = source.glslVersion;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.glslVersion = this.glslVersion;\n\t\tdata.uniforms = {};\n\n\t\tfor ( const name in this.uniforms ) {\n\n\t\t\tconst uniform = this.uniforms[ name ];\n\t\t\tconst value = uniform.value;\n\n\t\t\tif ( value && value.isTexture ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 't',\n\t\t\t\t\tvalue: value.toJSON( meta ).uuid\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isColor ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'c',\n\t\t\t\t\tvalue: value.getHex()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isVector2 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'v2',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isVector3 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'v3',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isVector4 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'v4',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isMatrix3 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'm3',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isMatrix4 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'm4',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\tvalue: value\n\t\t\t\t};\n\n\t\t\t\t// note: the array variants v2v, v3v, v4v, m4v and tv are not supported so far\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( Object.keys( this.defines ).length > 0 ) data.defines = this.defines;\n\n\t\tdata.vertexShader = this.vertexShader;\n\t\tdata.fragmentShader = this.fragmentShader;\n\n\t\tconst extensions = {};\n\n\t\tfor ( const key in this.extensions ) {\n\n\t\t\tif ( this.extensions[ key ] === true ) extensions[ key ] = true;\n\n\t\t}\n\n\t\tif ( Object.keys( extensions ).length > 0 ) data.extensions = extensions;\n\n\t\treturn data;\n\n\t}\n\n}\n\nclass Camera extends Object3D {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.isCamera = true;\n\n\t\tthis.type = 'Camera';\n\n\t\tthis.matrixWorldInverse = new Matrix4();\n\n\t\tthis.projectionMatrix = new Matrix4();\n\t\tthis.projectionMatrixInverse = new Matrix4();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.matrixWorldInverse.copy( source.matrixWorldInverse );\n\n\t\tthis.projectionMatrix.copy( source.projectionMatrix );\n\t\tthis.projectionMatrixInverse.copy( source.projectionMatrixInverse );\n\n\t\treturn this;\n\n\t}\n\n\tgetWorldDirection( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\tconst e = this.matrixWorld.elements;\n\n\t\treturn target.set( - e[ 8 ], - e[ 9 ], - e[ 10 ] ).normalize();\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t\tthis.matrixWorldInverse.copy( this.matrixWorld ).invert();\n\n\t}\n\n\tupdateWorldMatrix( updateParents, updateChildren ) {\n\n\t\tsuper.updateWorldMatrix( updateParents, updateChildren );\n\n\t\tthis.matrixWorldInverse.copy( this.matrixWorld ).invert();\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nclass PerspectiveCamera extends Camera {\n\n\tconstructor( fov = 50, aspect = 1, near = 0.1, far = 2000 ) {\n\n\t\tsuper();\n\n\t\tthis.isPerspectiveCamera = true;\n\n\t\tthis.type = 'PerspectiveCamera';\n\n\t\tthis.fov = fov;\n\t\tthis.zoom = 1;\n\n\t\tthis.near = near;\n\t\tthis.far = far;\n\t\tthis.focus = 10;\n\n\t\tthis.aspect = aspect;\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\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.fov = source.fov;\n\t\tthis.zoom = source.zoom;\n\n\t\tthis.near = source.near;\n\t\tthis.far = source.far;\n\t\tthis.focus = source.focus;\n\n\t\tthis.aspect = source.aspect;\n\t\tthis.view = source.view === null ? null : Object.assign( {}, source.view );\n\n\t\tthis.filmGauge = source.filmGauge;\n\t\tthis.filmOffset = source.filmOffset;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the FOV by focal length in respect to the current .filmGauge.\n\t *\n\t * The default film gauge is 35, so that the focal length can be specified for\n\t * a 35mm (full frame) camera.\n\t *\n\t * Values for focal length and film gauge must have the same unit.\n\t */\n\tsetFocalLength( focalLength ) {\n\n\t\t/** see {@link http://www.bobatkins.com/photography/technical/field_of_view.html} */\n\t\tconst vExtentSlope = 0.5 * this.getFilmHeight() / focalLength;\n\n\t\tthis.fov = RAD2DEG * 2 * Math.atan( vExtentSlope );\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\t/**\n\t * Calculates the focal length from the current .fov and .filmGauge.\n\t */\n\tgetFocalLength() {\n\n\t\tconst vExtentSlope = Math.tan( DEG2RAD * 0.5 * this.fov );\n\n\t\treturn 0.5 * this.getFilmHeight() / vExtentSlope;\n\n\t}\n\n\tgetEffectiveFOV() {\n\n\t\treturn RAD2DEG * 2 * Math.atan(\n\t\t\tMath.tan( DEG2RAD * 0.5 * this.fov ) / this.zoom );\n\n\t}\n\n\tgetFilmWidth() {\n\n\t\t// film not completely covered in portrait format (aspect < 1)\n\t\treturn this.filmGauge * Math.min( this.aspect, 1 );\n\n\t}\n\n\tgetFilmHeight() {\n\n\t\t// film not completely covered in landscape format (aspect > 1)\n\t\treturn this.filmGauge / Math.max( this.aspect, 1 );\n\n\t}\n\n\t/**\n\t * Sets an offset in a larger frustum. This is useful for multi-window or\n\t * multi-monitor/multi-machine setups.\n\t *\n\t * For example, if you have 3x2 monitors and each monitor is 1920x1080 and\n\t * the monitors are in grid like this\n\t *\n\t * +---+---+---+\n\t * | A | B | C |\n\t * +---+---+---+\n\t * | D | E | F |\n\t * +---+---+---+\n\t *\n\t * then for each monitor you would call it like this\n\t *\n\t * const w = 1920;\n\t * const h = 1080;\n\t * const fullWidth = w * 3;\n\t * const fullHeight = h * 2;\n\t *\n\t * --A--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 0, h * 0, w, h );\n\t * --B--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 1, h * 0, w, h );\n\t * --C--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 2, h * 0, w, h );\n\t * --D--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 0, h * 1, w, h );\n\t * --E--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 1, h * 1, w, h );\n\t * --F--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 2, h * 1, w, h );\n\t *\n\t * Note there is no reason monitors have to be the same size or in a grid.\n\t */\n\tsetViewOffset( fullWidth, fullHeight, x, y, width, height ) {\n\n\t\tthis.aspect = fullWidth / fullHeight;\n\n\t\tif ( this.view === null ) {\n\n\t\t\tthis.view = {\n\t\t\t\tenabled: true,\n\t\t\t\tfullWidth: 1,\n\t\t\t\tfullHeight: 1,\n\t\t\t\toffsetX: 0,\n\t\t\t\toffsetY: 0,\n\t\t\t\twidth: 1,\n\t\t\t\theight: 1\n\t\t\t};\n\n\t\t}\n\n\t\tthis.view.enabled = true;\n\t\tthis.view.fullWidth = fullWidth;\n\t\tthis.view.fullHeight = fullHeight;\n\t\tthis.view.offsetX = x;\n\t\tthis.view.offsetY = y;\n\t\tthis.view.width = width;\n\t\tthis.view.height = height;\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tclearViewOffset() {\n\n\t\tif ( this.view !== null ) {\n\n\t\t\tthis.view.enabled = false;\n\n\t\t}\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tupdateProjectionMatrix() {\n\n\t\tconst near = this.near;\n\t\tlet top = near * Math.tan( DEG2RAD * 0.5 * this.fov ) / this.zoom;\n\t\tlet height = 2 * top;\n\t\tlet width = this.aspect * height;\n\t\tlet left = - 0.5 * width;\n\t\tconst view = this.view;\n\n\t\tif ( this.view !== null && this.view.enabled ) {\n\n\t\t\tconst fullWidth = view.fullWidth,\n\t\t\t\tfullHeight = view.fullHeight;\n\n\t\t\tleft += view.offsetX * width / fullWidth;\n\t\t\ttop -= view.offsetY * height / fullHeight;\n\t\t\twidth *= view.width / fullWidth;\n\t\t\theight *= view.height / fullHeight;\n\n\t\t}\n\n\t\tconst skew = this.filmOffset;\n\t\tif ( skew !== 0 ) left += near * skew / this.getFilmWidth();\n\n\t\tthis.projectionMatrix.makePerspective( left, left + width, top, top - height, near, this.far );\n\n\t\tthis.projectionMatrixInverse.copy( this.projectionMatrix ).invert();\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.fov = this.fov;\n\t\tdata.object.zoom = this.zoom;\n\n\t\tdata.object.near = this.near;\n\t\tdata.object.far = this.far;\n\t\tdata.object.focus = this.focus;\n\n\t\tdata.object.aspect = this.aspect;\n\n\t\tif ( this.view !== null ) data.object.view = Object.assign( {}, this.view );\n\n\t\tdata.object.filmGauge = this.filmGauge;\n\t\tdata.object.filmOffset = this.filmOffset;\n\n\t\treturn data;\n\n\t}\n\n}\n\nconst fov = 90, aspect = 1;\n\nclass CubeCamera extends Object3D {\n\n\tconstructor( near, far, renderTarget ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'CubeCamera';\n\n\t\tif ( renderTarget.isWebGLCubeRenderTarget !== true ) {\n\n\t\t\tconsole.error( 'THREE.CubeCamera: The constructor now expects an instance of WebGLCubeRenderTarget as third parameter.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis.renderTarget = renderTarget;\n\n\t\tconst cameraPX = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPX.layers = this.layers;\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\tconst cameraNX = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNX.layers = this.layers;\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\tconst cameraPY = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPY.layers = this.layers;\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\tconst cameraNY = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNY.layers = this.layers;\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\tconst cameraPZ = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPZ.layers = this.layers;\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\tconst cameraNZ = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNZ.layers = this.layers;\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}\n\n\tupdate( renderer, scene ) {\n\n\t\tif ( this.parent === null ) this.updateMatrixWorld();\n\n\t\tconst renderTarget = this.renderTarget;\n\n\t\tconst [ cameraPX, cameraNX, cameraPY, cameraNY, cameraPZ, cameraNZ ] = this.children;\n\n\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\n\t\tconst currentToneMapping = renderer.toneMapping;\n\t\tconst currentXrEnabled = renderer.xr.enabled;\n\n\t\trenderer.toneMapping = NoToneMapping;\n\t\trenderer.xr.enabled = false;\n\n\t\tconst generateMipmaps = renderTarget.texture.generateMipmaps;\n\n\t\trenderTarget.texture.generateMipmaps = false;\n\n\t\trenderer.setRenderTarget( renderTarget, 0 );\n\t\trenderer.render( scene, cameraPX );\n\n\t\trenderer.setRenderTarget( renderTarget, 1 );\n\t\trenderer.render( scene, cameraNX );\n\n\t\trenderer.setRenderTarget( renderTarget, 2 );\n\t\trenderer.render( scene, cameraPY );\n\n\t\trenderer.setRenderTarget( renderTarget, 3 );\n\t\trenderer.render( scene, cameraNY );\n\n\t\trenderer.setRenderTarget( renderTarget, 4 );\n\t\trenderer.render( scene, cameraPZ );\n\n\t\trenderTarget.texture.generateMipmaps = generateMipmaps;\n\n\t\trenderer.setRenderTarget( renderTarget, 5 );\n\t\trenderer.render( scene, cameraNZ );\n\n\t\trenderer.setRenderTarget( currentRenderTarget );\n\n\t\trenderer.toneMapping = currentToneMapping;\n\t\trenderer.xr.enabled = currentXrEnabled;\n\n\t\trenderTarget.texture.needsPMREMUpdate = true;\n\n\t}\n\n}\n\nclass CubeTexture extends Texture {\n\n\tconstructor( 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\tsuper( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );\n\n\t\tthis.isCubeTexture = true;\n\n\t\tthis.flipY = false;\n\n\t}\n\n\tget images() {\n\n\t\treturn this.image;\n\n\t}\n\n\tset images( value ) {\n\n\t\tthis.image = value;\n\n\t}\n\n}\n\nclass WebGLCubeRenderTarget extends WebGLRenderTarget {\n\n\tconstructor( size, options = {} ) {\n\n\t\tsuper( size, size, options );\n\n\t\tthis.isWebGLCubeRenderTarget = true;\n\n\t\tconst image = { width: size, height: size, depth: 1 };\n\t\tconst images = [ image, image, image, image, image, image ];\n\n\t\tthis.texture = new CubeTexture( images, options.mapping, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.encoding );\n\n\t\t// By convention -- likely based on the RenderMan spec from the 1990's -- cube maps are specified by WebGL (and three.js)\n\t\t// in a coordinate system in which positive-x is to the right when looking up the positive-z axis -- in other words,\n\t\t// in a left-handed coordinate system. By continuing this convention, preexisting cube maps continued to render correctly.\n\n\t\t// three.js uses a right-handed coordinate system. So environment maps used in three.js appear to have px and nx swapped\n\t\t// and the flag isRenderTargetTexture controls this conversion. The flip is not required when using WebGLCubeRenderTarget.texture\n\t\t// as a cube texture (this is detected when isRenderTargetTexture is set to true for cube textures).\n\n\t\tthis.texture.isRenderTargetTexture = true;\n\n\t\tthis.texture.generateMipmaps = options.generateMipmaps !== undefined ? options.generateMipmaps : false;\n\t\tthis.texture.minFilter = options.minFilter !== undefined ? options.minFilter : LinearFilter;\n\n\t}\n\n\tfromEquirectangularTexture( renderer, texture ) {\n\n\t\tthis.texture.type = texture.type;\n\t\tthis.texture.encoding = texture.encoding;\n\n\t\tthis.texture.generateMipmaps = texture.generateMipmaps;\n\t\tthis.texture.minFilter = texture.minFilter;\n\t\tthis.texture.magFilter = texture.magFilter;\n\n\t\tconst shader = {\n\n\t\t\tuniforms: {\n\t\t\t\ttEquirect: { value: null },\n\t\t\t},\n\n\t\t\tvertexShader: /* glsl */`\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\tvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\n\t\t\t\t\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n\n\t\t\t\t}\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvWorldDirection = transformDirection( position, modelMatrix );\n\n\t\t\t\t\t#include \n\t\t\t\t\t#include \n\n\t\t\t\t}\n\t\t\t`,\n\n\t\t\tfragmentShader: /* glsl */`\n\n\t\t\t\tuniform sampler2D tEquirect;\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\t#include \n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvec3 direction = normalize( vWorldDirection );\n\n\t\t\t\t\tvec2 sampleUV = equirectUv( direction );\n\n\t\t\t\t\tgl_FragColor = texture2D( tEquirect, sampleUV );\n\n\t\t\t\t}\n\t\t\t`\n\t\t};\n\n\t\tconst geometry = new BoxGeometry( 5, 5, 5 );\n\n\t\tconst material = new ShaderMaterial( {\n\n\t\t\tname: 'CubemapFromEquirect',\n\n\t\t\tuniforms: cloneUniforms( shader.uniforms ),\n\t\t\tvertexShader: shader.vertexShader,\n\t\t\tfragmentShader: shader.fragmentShader,\n\t\t\tside: BackSide,\n\t\t\tblending: NoBlending\n\n\t\t} );\n\n\t\tmaterial.uniforms.tEquirect.value = texture;\n\n\t\tconst mesh = new Mesh( geometry, material );\n\n\t\tconst currentMinFilter = texture.minFilter;\n\n\t\t// Avoid blurred poles\n\t\tif ( texture.minFilter === LinearMipmapLinearFilter ) texture.minFilter = LinearFilter;\n\n\t\tconst camera = new CubeCamera( 1, 10, this );\n\t\tcamera.update( renderer, mesh );\n\n\t\ttexture.minFilter = currentMinFilter;\n\n\t\tmesh.geometry.dispose();\n\t\tmesh.material.dispose();\n\n\t\treturn this;\n\n\t}\n\n\tclear( renderer, color, depth, stencil ) {\n\n\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\trenderer.setRenderTarget( this, i );\n\n\t\t\trenderer.clear( color, depth, stencil );\n\n\t\t}\n\n\t\trenderer.setRenderTarget( currentRenderTarget );\n\n\t}\n\n}\n\nconst _vector1 = /*@__PURE__*/ new Vector3();\nconst _vector2 = /*@__PURE__*/ new Vector3();\nconst _normalMatrix = /*@__PURE__*/ new Matrix3();\n\nclass Plane {\n\n\tconstructor( normal = new Vector3( 1, 0, 0 ), constant = 0 ) {\n\n\t\tthis.isPlane = true;\n\n\t\t// normal is assumed to be normalized\n\n\t\tthis.normal = normal;\n\t\tthis.constant = constant;\n\n\t}\n\n\tset( normal, constant ) {\n\n\t\tthis.normal.copy( normal );\n\t\tthis.constant = constant;\n\n\t\treturn this;\n\n\t}\n\n\tsetComponents( x, y, z, w ) {\n\n\t\tthis.normal.set( x, y, z );\n\t\tthis.constant = w;\n\n\t\treturn this;\n\n\t}\n\n\tsetFromNormalAndCoplanarPoint( normal, point ) {\n\n\t\tthis.normal.copy( normal );\n\t\tthis.constant = - point.dot( this.normal );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromCoplanarPoints( a, b, c ) {\n\n\t\tconst normal = _vector1.subVectors( c, b ).cross( _vector2.subVectors( a, b ) ).normalize();\n\n\t\t// Q: should an error be thrown if normal is zero (e.g. degenerate plane)?\n\n\t\tthis.setFromNormalAndCoplanarPoint( normal, a );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( plane ) {\n\n\t\tthis.normal.copy( plane.normal );\n\t\tthis.constant = plane.constant;\n\n\t\treturn this;\n\n\t}\n\n\tnormalize() {\n\n\t\t// Note: will lead to a divide by zero if the plane is invalid.\n\n\t\tconst inverseNormalLength = 1.0 / this.normal.length();\n\t\tthis.normal.multiplyScalar( inverseNormalLength );\n\t\tthis.constant *= inverseNormalLength;\n\n\t\treturn this;\n\n\t}\n\n\tnegate() {\n\n\t\tthis.constant *= - 1;\n\t\tthis.normal.negate();\n\n\t\treturn this;\n\n\t}\n\n\tdistanceToPoint( point ) {\n\n\t\treturn this.normal.dot( point ) + this.constant;\n\n\t}\n\n\tdistanceToSphere( sphere ) {\n\n\t\treturn this.distanceToPoint( sphere.center ) - sphere.radius;\n\n\t}\n\n\tprojectPoint( point, target ) {\n\n\t\treturn target.copy( this.normal ).multiplyScalar( - this.distanceToPoint( point ) ).add( point );\n\n\t}\n\n\tintersectLine( line, target ) {\n\n\t\tconst direction = line.delta( _vector1 );\n\n\t\tconst denominator = this.normal.dot( direction );\n\n\t\tif ( denominator === 0 ) {\n\n\t\t\t// line is coplanar, return origin\n\t\t\tif ( this.distanceToPoint( line.start ) === 0 ) {\n\n\t\t\t\treturn target.copy( line.start );\n\n\t\t\t}\n\n\t\t\t// Unsure if this is the correct method to handle this case.\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst t = - ( line.start.dot( this.normal ) + this.constant ) / denominator;\n\n\t\tif ( t < 0 || t > 1 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\treturn target.copy( direction ).multiplyScalar( t ).add( line.start );\n\n\t}\n\n\tintersectsLine( line ) {\n\n\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\tconst startSign = this.distanceToPoint( line.start );\n\t\tconst endSign = this.distanceToPoint( line.end );\n\n\t\treturn ( startSign < 0 && endSign > 0 ) || ( endSign < 0 && startSign > 0 );\n\n\t}\n\n\tintersectsBox( box ) {\n\n\t\treturn box.intersectsPlane( this );\n\n\t}\n\n\tintersectsSphere( sphere ) {\n\n\t\treturn sphere.intersectsPlane( this );\n\n\t}\n\n\tcoplanarPoint( target ) {\n\n\t\treturn target.copy( this.normal ).multiplyScalar( - this.constant );\n\n\t}\n\n\tapplyMatrix4( matrix, optionalNormalMatrix ) {\n\n\t\tconst normalMatrix = optionalNormalMatrix || _normalMatrix.getNormalMatrix( matrix );\n\n\t\tconst referencePoint = this.coplanarPoint( _vector1 ).applyMatrix4( matrix );\n\n\t\tconst normal = this.normal.applyMatrix3( normalMatrix ).normalize();\n\n\t\tthis.constant = - referencePoint.dot( normal );\n\n\t\treturn this;\n\n\t}\n\n\ttranslate( offset ) {\n\n\t\tthis.constant -= offset.dot( this.normal );\n\n\t\treturn this;\n\n\t}\n\n\tequals( plane ) {\n\n\t\treturn plane.normal.equals( this.normal ) && ( plane.constant === this.constant );\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nconst _sphere$2 = /*@__PURE__*/ new Sphere();\nconst _vector$7 = /*@__PURE__*/ new Vector3();\n\nclass Frustum {\n\n\tconstructor( p0 = new Plane(), p1 = new Plane(), p2 = new Plane(), p3 = new Plane(), p4 = new Plane(), p5 = new Plane() ) {\n\n\t\tthis.planes = [ p0, p1, p2, p3, p4, p5 ];\n\n\t}\n\n\tset( p0, p1, p2, p3, p4, p5 ) {\n\n\t\tconst planes = this.planes;\n\n\t\tplanes[ 0 ].copy( p0 );\n\t\tplanes[ 1 ].copy( p1 );\n\t\tplanes[ 2 ].copy( p2 );\n\t\tplanes[ 3 ].copy( p3 );\n\t\tplanes[ 4 ].copy( p4 );\n\t\tplanes[ 5 ].copy( p5 );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( frustum ) {\n\n\t\tconst planes = this.planes;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tplanes[ i ].copy( frustum.planes[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetFromProjectionMatrix( m ) {\n\n\t\tconst planes = this.planes;\n\t\tconst me = m.elements;\n\t\tconst me0 = me[ 0 ], me1 = me[ 1 ], me2 = me[ 2 ], me3 = me[ 3 ];\n\t\tconst me4 = me[ 4 ], me5 = me[ 5 ], me6 = me[ 6 ], me7 = me[ 7 ];\n\t\tconst me8 = me[ 8 ], me9 = me[ 9 ], me10 = me[ 10 ], me11 = me[ 11 ];\n\t\tconst me12 = me[ 12 ], me13 = me[ 13 ], me14 = me[ 14 ], me15 = me[ 15 ];\n\n\t\tplanes[ 0 ].setComponents( me3 - me0, me7 - me4, me11 - me8, me15 - me12 ).normalize();\n\t\tplanes[ 1 ].setComponents( me3 + me0, me7 + me4, me11 + me8, me15 + me12 ).normalize();\n\t\tplanes[ 2 ].setComponents( me3 + me1, me7 + me5, me11 + me9, me15 + me13 ).normalize();\n\t\tplanes[ 3 ].setComponents( me3 - me1, me7 - me5, me11 - me9, me15 - me13 ).normalize();\n\t\tplanes[ 4 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize();\n\t\tplanes[ 5 ].setComponents( me3 + me2, me7 + me6, me11 + me10, me15 + me14 ).normalize();\n\n\t\treturn this;\n\n\t}\n\n\tintersectsObject( object ) {\n\n\t\tconst geometry = object.geometry;\n\n\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t_sphere$2.copy( geometry.boundingSphere ).applyMatrix4( object.matrixWorld );\n\n\t\treturn this.intersectsSphere( _sphere$2 );\n\n\t}\n\n\tintersectsSprite( sprite ) {\n\n\t\t_sphere$2.center.set( 0, 0, 0 );\n\t\t_sphere$2.radius = 0.7071067811865476;\n\t\t_sphere$2.applyMatrix4( sprite.matrixWorld );\n\n\t\treturn this.intersectsSphere( _sphere$2 );\n\n\t}\n\n\tintersectsSphere( sphere ) {\n\n\t\tconst planes = this.planes;\n\t\tconst center = sphere.center;\n\t\tconst negRadius = - sphere.radius;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tconst distance = planes[ i ].distanceToPoint( center );\n\n\t\t\tif ( distance < negRadius ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tintersectsBox( box ) {\n\n\t\tconst planes = this.planes;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tconst plane = planes[ i ];\n\n\t\t\t// corner at max distance\n\n\t\t\t_vector$7.x = plane.normal.x > 0 ? box.max.x : box.min.x;\n\t\t\t_vector$7.y = plane.normal.y > 0 ? box.max.y : box.min.y;\n\t\t\t_vector$7.z = plane.normal.z > 0 ? box.max.z : box.min.z;\n\n\t\t\tif ( plane.distanceToPoint( _vector$7 ) < 0 ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tcontainsPoint( point ) {\n\n\t\tconst planes = this.planes;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tif ( planes[ i ].distanceToPoint( point ) < 0 ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nfunction WebGLAnimation() {\n\n\tlet context = null;\n\tlet isAnimating = false;\n\tlet animationLoop = null;\n\tlet requestId = null;\n\n\tfunction onAnimationFrame( time, frame ) {\n\n\t\tanimationLoop( time, frame );\n\n\t\trequestId = context.requestAnimationFrame( onAnimationFrame );\n\n\t}\n\n\treturn {\n\n\t\tstart: function () {\n\n\t\t\tif ( isAnimating === true ) return;\n\t\t\tif ( animationLoop === null ) return;\n\n\t\t\trequestId = context.requestAnimationFrame( onAnimationFrame );\n\n\t\t\tisAnimating = true;\n\n\t\t},\n\n\t\tstop: function () {\n\n\t\t\tcontext.cancelAnimationFrame( requestId );\n\n\t\t\tisAnimating = false;\n\n\t\t},\n\n\t\tsetAnimationLoop: function ( callback ) {\n\n\t\t\tanimationLoop = callback;\n\n\t\t},\n\n\t\tsetContext: function ( value ) {\n\n\t\t\tcontext = value;\n\n\t\t}\n\n\t};\n\n}\n\nfunction WebGLAttributes( gl, capabilities ) {\n\n\tconst isWebGL2 = capabilities.isWebGL2;\n\n\tconst buffers = new WeakMap();\n\n\tfunction createBuffer( attribute, bufferType ) {\n\n\t\tconst array = attribute.array;\n\t\tconst usage = attribute.usage;\n\n\t\tconst buffer = gl.createBuffer();\n\n\t\tgl.bindBuffer( bufferType, buffer );\n\t\tgl.bufferData( bufferType, array, usage );\n\n\t\tattribute.onUploadCallback();\n\n\t\tlet type;\n\n\t\tif ( array instanceof Float32Array ) {\n\n\t\t\ttype = 5126;\n\n\t\t} else if ( array instanceof Uint16Array ) {\n\n\t\t\tif ( attribute.isFloat16BufferAttribute ) {\n\n\t\t\t\tif ( isWebGL2 ) {\n\n\t\t\t\t\ttype = 5131;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new Error( 'THREE.WebGLAttributes: Usage of Float16BufferAttribute requires WebGL2.' );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\ttype = 5123;\n\n\t\t\t}\n\n\t\t} else if ( array instanceof Int16Array ) {\n\n\t\t\ttype = 5122;\n\n\t\t} else if ( array instanceof Uint32Array ) {\n\n\t\t\ttype = 5125;\n\n\t\t} else if ( array instanceof Int32Array ) {\n\n\t\t\ttype = 5124;\n\n\t\t} else if ( array instanceof Int8Array ) {\n\n\t\t\ttype = 5120;\n\n\t\t} else if ( array instanceof Uint8Array ) {\n\n\t\t\ttype = 5121;\n\n\t\t} else if ( array instanceof Uint8ClampedArray ) {\n\n\t\t\ttype = 5121;\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.WebGLAttributes: Unsupported buffer data format: ' + array );\n\n\t\t}\n\n\t\treturn {\n\t\t\tbuffer: buffer,\n\t\t\ttype: type,\n\t\t\tbytesPerElement: array.BYTES_PER_ELEMENT,\n\t\t\tversion: attribute.version\n\t\t};\n\n\t}\n\n\tfunction updateBuffer( buffer, attribute, bufferType ) {\n\n\t\tconst array = attribute.array;\n\t\tconst updateRange = attribute.updateRange;\n\n\t\tgl.bindBuffer( bufferType, buffer );\n\n\t\tif ( updateRange.count === - 1 ) {\n\n\t\t\t// Not using update ranges\n\n\t\t\tgl.bufferSubData( bufferType, 0, array );\n\n\t\t} else {\n\n\t\t\tif ( isWebGL2 ) {\n\n\t\t\t\tgl.bufferSubData( bufferType, updateRange.offset * array.BYTES_PER_ELEMENT,\n\t\t\t\t\tarray, updateRange.offset, updateRange.count );\n\n\t\t\t} else {\n\n\t\t\t\tgl.bufferSubData( bufferType, updateRange.offset * array.BYTES_PER_ELEMENT,\n\t\t\t\t\tarray.subarray( updateRange.offset, updateRange.offset + updateRange.count ) );\n\n\t\t\t}\n\n\t\t\tupdateRange.count = - 1; // reset range\n\n\t\t}\n\n\t}\n\n\t//\n\n\tfunction get( attribute ) {\n\n\t\tif ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;\n\n\t\treturn buffers.get( attribute );\n\n\t}\n\n\tfunction remove( attribute ) {\n\n\t\tif ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;\n\n\t\tconst data = buffers.get( attribute );\n\n\t\tif ( data ) {\n\n\t\t\tgl.deleteBuffer( data.buffer );\n\n\t\t\tbuffers.delete( attribute );\n\n\t\t}\n\n\t}\n\n\tfunction update( attribute, bufferType ) {\n\n\t\tif ( attribute.isGLBufferAttribute ) {\n\n\t\t\tconst cached = buffers.get( attribute );\n\n\t\t\tif ( ! cached || cached.version < attribute.version ) {\n\n\t\t\t\tbuffers.set( attribute, {\n\t\t\t\t\tbuffer: attribute.buffer,\n\t\t\t\t\ttype: attribute.type,\n\t\t\t\t\tbytesPerElement: attribute.elementSize,\n\t\t\t\t\tversion: attribute.version\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;\n\n\t\tconst data = buffers.get( attribute );\n\n\t\tif ( data === undefined ) {\n\n\t\t\tbuffers.set( attribute, createBuffer( attribute, bufferType ) );\n\n\t\t} else if ( data.version < attribute.version ) {\n\n\t\t\tupdateBuffer( data.buffer, attribute, bufferType );\n\n\t\t\tdata.version = attribute.version;\n\n\t\t}\n\n\t}\n\n\treturn {\n\n\t\tget: get,\n\t\tremove: remove,\n\t\tupdate: update\n\n\t};\n\n}\n\nclass PlaneGeometry extends BufferGeometry {\n\n\tconstructor( width = 1, height = 1, widthSegments = 1, heightSegments = 1 ) {\n\n\t\tsuper();\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\tconst width_half = width / 2;\n\t\tconst height_half = height / 2;\n\n\t\tconst gridX = Math.floor( widthSegments );\n\t\tconst gridY = Math.floor( heightSegments );\n\n\t\tconst gridX1 = gridX + 1;\n\t\tconst gridY1 = gridY + 1;\n\n\t\tconst segment_width = width / gridX;\n\t\tconst segment_height = height / gridY;\n\n\t\t//\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\tfor ( let iy = 0; iy < gridY1; iy ++ ) {\n\n\t\t\tconst y = iy * segment_height - height_half;\n\n\t\t\tfor ( let ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\t\tconst x = ix * segment_width - width_half;\n\n\t\t\t\tvertices.push( x, - y, 0 );\n\n\t\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t\tuvs.push( ix / gridX );\n\t\t\t\tuvs.push( 1 - ( iy / gridY ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( let iy = 0; iy < gridY; iy ++ ) {\n\n\t\t\tfor ( let ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\t\tconst a = ix + gridX1 * iy;\n\t\t\t\tconst b = ix + gridX1 * ( iy + 1 );\n\t\t\t\tconst c = ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\t\tconst d = ( ix + 1 ) + gridX1 * iy;\n\n\t\t\t\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\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new PlaneGeometry( data.width, data.height, data.widthSegments, data.heightSegments );\n\n\t}\n\n}\n\nvar alphamap_fragment = \"#ifdef USE_ALPHAMAP\\n\\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\\n#endif\";\n\nvar alphamap_pars_fragment = \"#ifdef USE_ALPHAMAP\\n\\tuniform sampler2D alphaMap;\\n#endif\";\n\nvar alphatest_fragment = \"#ifdef USE_ALPHATEST\\n\\tif ( diffuseColor.a < alphaTest ) discard;\\n#endif\";\n\nvar alphatest_pars_fragment = \"#ifdef USE_ALPHATEST\\n\\tuniform float alphaTest;\\n#endif\";\n\nvar 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( STANDARD )\\n\\t\\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\\n\\t\\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.roughness );\\n\\t#endif\\n#endif\";\n\nvar aomap_pars_fragment = \"#ifdef USE_AOMAP\\n\\tuniform sampler2D aoMap;\\n\\tuniform float aoMapIntensity;\\n#endif\";\n\nvar begin_vertex = \"vec3 transformed = vec3( position );\";\n\nvar beginnormal_vertex = \"vec3 objectNormal = vec3( normal );\\n#ifdef USE_TANGENT\\n\\tvec3 objectTangent = vec3( tangent.xyz );\\n#endif\";\n\nvar bsdfs = \"vec3 BRDF_Lambert( const in vec3 diffuseColor ) {\\n\\treturn RECIPROCAL_PI * diffuseColor;\\n}\\nvec3 F_Schlick( const in vec3 f0, const in float f90, const in float dotVH ) {\\n\\tfloat fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\\n\\treturn f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\\n}\\nfloat F_Schlick( const in float f0, const in float f90, const in float dotVH ) {\\n\\tfloat fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\\n\\treturn f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\\n}\\nvec3 Schlick_to_F0( const in vec3 f, const in float f90, const in float dotVH ) {\\n float x = clamp( 1.0 - dotVH, 0.0, 1.0 );\\n float x2 = x * x;\\n float x5 = clamp( x * x2 * x2, 0.0, 0.9999 );\\n return ( f - vec3( f90 ) * x5 ) / ( 1.0 - x5 );\\n}\\nfloat V_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_GGX( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in vec3 f0, const in float f90, const in float roughness ) {\\n\\tfloat alpha = pow2( roughness );\\n\\tvec3 halfDir = normalize( lightDir + viewDir );\\n\\tfloat dotNL = saturate( dot( normal, lightDir ) );\\n\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\tfloat dotNH = saturate( dot( normal, halfDir ) );\\n\\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\\n\\tvec3 F = F_Schlick( f0, f90, dotVH );\\n\\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\\n\\tfloat D = D_GGX( alpha, dotNH );\\n\\treturn F * ( V * D );\\n}\\n#ifdef USE_IRIDESCENCE\\n\\tvec3 BRDF_GGX_Iridescence( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in vec3 f0, const in float f90, const in float iridescence, const in vec3 iridescenceFresnel, const in float roughness ) {\\n\\t\\tfloat alpha = pow2( roughness );\\n\\t\\tvec3 halfDir = normalize( lightDir + viewDir );\\n\\t\\tfloat dotNL = saturate( dot( normal, lightDir ) );\\n\\t\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\t\\tfloat dotNH = saturate( dot( normal, halfDir ) );\\n\\t\\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\\n\\t\\tvec3 F = mix( F_Schlick( f0, f90, dotVH ), iridescenceFresnel, iridescence );\\n\\t\\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\\n\\t\\tfloat D = D_GGX( alpha, dotNH );\\n\\t\\treturn F * ( V * D );\\n\\t}\\n#endif\\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\\n\\tconst float LUT_SIZE = 64.0;\\n\\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\\n\\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\\n\\tfloat dotNV = saturate( dot( N, V ) );\\n\\tvec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\\n\\tuv = uv * LUT_SCALE + LUT_BIAS;\\n\\treturn uv;\\n}\\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\\n\\tfloat l = length( f );\\n\\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\\n}\\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\\n\\tfloat x = dot( v1, v2 );\\n\\tfloat y = abs( x );\\n\\tfloat a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\\n\\tfloat b = 3.4175940 + ( 4.1616724 + y ) * y;\\n\\tfloat v = a / b;\\n\\tfloat theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\\n\\treturn cross( v1, v2 ) * theta_sintheta;\\n}\\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\\n\\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\\n\\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\\n\\tvec3 lightNormal = cross( v1, v2 );\\n\\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\\n\\tvec3 T1, T2;\\n\\tT1 = normalize( V - N * dot( V, N ) );\\n\\tT2 = - cross( N, T1 );\\n\\tmat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) );\\n\\tvec3 coords[ 4 ];\\n\\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\\n\\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\\n\\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\\n\\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\\n\\tcoords[ 0 ] = normalize( coords[ 0 ] );\\n\\tcoords[ 1 ] = normalize( coords[ 1 ] );\\n\\tcoords[ 2 ] = normalize( coords[ 2 ] );\\n\\tcoords[ 3 ] = normalize( coords[ 3 ] );\\n\\tvec3 vectorFormFactor = vec3( 0.0 );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\\n\\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\\n\\treturn vec3( result );\\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_BlinnPhong( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in vec3 specularColor, const in float shininess ) {\\n\\tvec3 halfDir = normalize( lightDir + viewDir );\\n\\tfloat dotNH = saturate( dot( normal, halfDir ) );\\n\\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\\n\\tvec3 F = F_Schlick( specularColor, 1.0, dotVH );\\n\\tfloat G = G_BlinnPhong_Implicit( );\\n\\tfloat D = D_BlinnPhong( shininess, dotNH );\\n\\treturn F * ( G * D );\\n}\\n#if defined( USE_SHEEN )\\nfloat D_Charlie( float roughness, float dotNH ) {\\n\\tfloat alpha = pow2( roughness );\\n\\tfloat invAlpha = 1.0 / alpha;\\n\\tfloat cos2h = dotNH * dotNH;\\n\\tfloat sin2h = max( 1.0 - cos2h, 0.0078125 );\\n\\treturn ( 2.0 + invAlpha ) * pow( sin2h, invAlpha * 0.5 ) / ( 2.0 * PI );\\n}\\nfloat V_Neubelt( float dotNV, float dotNL ) {\\n\\treturn saturate( 1.0 / ( 4.0 * ( dotNL + dotNV - dotNL * dotNV ) ) );\\n}\\nvec3 BRDF_Sheen( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, vec3 sheenColor, const in float sheenRoughness ) {\\n\\tvec3 halfDir = normalize( lightDir + viewDir );\\n\\tfloat dotNL = saturate( dot( normal, lightDir ) );\\n\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\tfloat dotNH = saturate( dot( normal, halfDir ) );\\n\\tfloat D = D_Charlie( sheenRoughness, dotNH );\\n\\tfloat V = V_Neubelt( dotNV, dotNL );\\n\\treturn sheenColor * ( D * V );\\n}\\n#endif\";\n\nvar iridescence_fragment = \"#ifdef USE_IRIDESCENCE\\n\\tconst mat3 XYZ_TO_REC709 = mat3(\\n\\t\\t 3.2404542, -0.9692660, 0.0556434,\\n\\t\\t-1.5371385, 1.8760108, -0.2040259,\\n\\t\\t-0.4985314, 0.0415560, 1.0572252\\n\\t);\\n\\tvec3 Fresnel0ToIor( vec3 fresnel0 ) {\\n\\t\\tvec3 sqrtF0 = sqrt( fresnel0 );\\n\\t\\treturn ( vec3( 1.0 ) + sqrtF0 ) / ( vec3( 1.0 ) - sqrtF0 );\\n\\t}\\n\\tvec3 IorToFresnel0( vec3 transmittedIor, float incidentIor ) {\\n\\t\\treturn pow2( ( transmittedIor - vec3( incidentIor ) ) / ( transmittedIor + vec3( incidentIor ) ) );\\n\\t}\\n\\tfloat IorToFresnel0( float transmittedIor, float incidentIor ) {\\n\\t\\treturn pow2( ( transmittedIor - incidentIor ) / ( transmittedIor + incidentIor ));\\n\\t}\\n\\tvec3 evalSensitivity( float OPD, vec3 shift ) {\\n\\t\\tfloat phase = 2.0 * PI * OPD * 1.0e-9;\\n\\t\\tvec3 val = vec3( 5.4856e-13, 4.4201e-13, 5.2481e-13 );\\n\\t\\tvec3 pos = vec3( 1.6810e+06, 1.7953e+06, 2.2084e+06 );\\n\\t\\tvec3 var = vec3( 4.3278e+09, 9.3046e+09, 6.6121e+09 );\\n\\t\\tvec3 xyz = val * sqrt( 2.0 * PI * var ) * cos( pos * phase + shift ) * exp( - pow2( phase ) * var );\\n\\t\\txyz.x += 9.7470e-14 * sqrt( 2.0 * PI * 4.5282e+09 ) * cos( 2.2399e+06 * phase + shift[ 0 ] ) * exp( - 4.5282e+09 * pow2( phase ) );\\n\\t\\txyz /= 1.0685e-7;\\n\\t\\tvec3 rgb = XYZ_TO_REC709 * xyz;\\n\\t\\treturn rgb;\\n\\t}\\n\\tvec3 evalIridescence( float outsideIOR, float eta2, float cosTheta1, float thinFilmThickness, vec3 baseF0 ) {\\n\\t\\tvec3 I;\\n\\t\\tfloat iridescenceIOR = mix( outsideIOR, eta2, smoothstep( 0.0, 0.03, thinFilmThickness ) );\\n\\t\\tfloat sinTheta2Sq = pow2( outsideIOR / iridescenceIOR ) * ( 1.0 - pow2( cosTheta1 ) );\\n\\t\\tfloat cosTheta2Sq = 1.0 - sinTheta2Sq;\\n\\t\\tif ( cosTheta2Sq < 0.0 ) {\\n\\t\\t\\t return vec3( 1.0 );\\n\\t\\t}\\n\\t\\tfloat cosTheta2 = sqrt( cosTheta2Sq );\\n\\t\\tfloat R0 = IorToFresnel0( iridescenceIOR, outsideIOR );\\n\\t\\tfloat R12 = F_Schlick( R0, 1.0, cosTheta1 );\\n\\t\\tfloat R21 = R12;\\n\\t\\tfloat T121 = 1.0 - R12;\\n\\t\\tfloat phi12 = 0.0;\\n\\t\\tif ( iridescenceIOR < outsideIOR ) phi12 = PI;\\n\\t\\tfloat phi21 = PI - phi12;\\n\\t\\tvec3 baseIOR = Fresnel0ToIor( clamp( baseF0, 0.0, 0.9999 ) );\\t\\tvec3 R1 = IorToFresnel0( baseIOR, iridescenceIOR );\\n\\t\\tvec3 R23 = F_Schlick( R1, 1.0, cosTheta2 );\\n\\t\\tvec3 phi23 = vec3( 0.0 );\\n\\t\\tif ( baseIOR[ 0 ] < iridescenceIOR ) phi23[ 0 ] = PI;\\n\\t\\tif ( baseIOR[ 1 ] < iridescenceIOR ) phi23[ 1 ] = PI;\\n\\t\\tif ( baseIOR[ 2 ] < iridescenceIOR ) phi23[ 2 ] = PI;\\n\\t\\tfloat OPD = 2.0 * iridescenceIOR * thinFilmThickness * cosTheta2;\\n\\t\\tvec3 phi = vec3( phi21 ) + phi23;\\n\\t\\tvec3 R123 = clamp( R12 * R23, 1e-5, 0.9999 );\\n\\t\\tvec3 r123 = sqrt( R123 );\\n\\t\\tvec3 Rs = pow2( T121 ) * R23 / ( vec3( 1.0 ) - R123 );\\n\\t\\tvec3 C0 = R12 + Rs;\\n\\t\\tI = C0;\\n\\t\\tvec3 Cm = Rs - T121;\\n\\t\\tfor ( int m = 1; m <= 2; ++ m ) {\\n\\t\\t\\tCm *= r123;\\n\\t\\t\\tvec3 Sm = 2.0 * evalSensitivity( float( m ) * OPD, float( m ) * phi );\\n\\t\\t\\tI += Cm * Sm;\\n\\t\\t}\\n\\t\\treturn max( I, vec3( 0.0 ) );\\n\\t}\\n#endif\";\n\nvar 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, float faceDirection ) {\\n\\t\\tvec3 vSigmaX = dFdx( surf_pos.xyz );\\n\\t\\tvec3 vSigmaY = dFdy( surf_pos.xyz );\\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 ) * faceDirection;\\n\\t\\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\\n\\t\\treturn normalize( abs( fDet ) * surf_norm - vGrad );\\n\\t}\\n#endif\";\n\nvar clipping_planes_fragment = \"#if NUM_CLIPPING_PLANES > 0\\n\\tvec4 plane;\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\\n\\t\\tplane = clippingPlanes[ i ];\\n\\t\\tif ( dot( vClipPosition, plane.xyz ) > plane.w ) discard;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\\n\\t\\tbool clipped = true;\\n\\t\\t#pragma unroll_loop_start\\n\\t\\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\\n\\t\\t\\tplane = clippingPlanes[ i ];\\n\\t\\t\\tclipped = ( dot( vClipPosition, plane.xyz ) > plane.w ) && clipped;\\n\\t\\t}\\n\\t\\t#pragma unroll_loop_end\\n\\t\\tif ( clipped ) discard;\\n\\t#endif\\n#endif\";\n\nvar clipping_planes_pars_fragment = \"#if NUM_CLIPPING_PLANES > 0\\n\\tvarying vec3 vClipPosition;\\n\\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\\n#endif\";\n\nvar clipping_planes_pars_vertex = \"#if NUM_CLIPPING_PLANES > 0\\n\\tvarying vec3 vClipPosition;\\n#endif\";\n\nvar clipping_planes_vertex = \"#if NUM_CLIPPING_PLANES > 0\\n\\tvClipPosition = - mvPosition.xyz;\\n#endif\";\n\nvar color_fragment = \"#if defined( USE_COLOR_ALPHA )\\n\\tdiffuseColor *= vColor;\\n#elif defined( USE_COLOR )\\n\\tdiffuseColor.rgb *= vColor;\\n#endif\";\n\nvar color_pars_fragment = \"#if defined( USE_COLOR_ALPHA )\\n\\tvarying vec4 vColor;\\n#elif defined( USE_COLOR )\\n\\tvarying vec3 vColor;\\n#endif\";\n\nvar color_pars_vertex = \"#if defined( USE_COLOR_ALPHA )\\n\\tvarying vec4 vColor;\\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )\\n\\tvarying vec3 vColor;\\n#endif\";\n\nvar color_vertex = \"#if defined( USE_COLOR_ALPHA )\\n\\tvColor = vec4( 1.0 );\\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )\\n\\tvColor = vec3( 1.0 );\\n#endif\\n#ifdef USE_COLOR\\n\\tvColor *= color;\\n#endif\\n#ifdef USE_INSTANCING_COLOR\\n\\tvColor.xyz *= instanceColor.xyz;\\n#endif\";\n\nvar common = \"#define PI 3.141592653589793\\n#define PI2 6.283185307179586\\n#define PI_HALF 1.5707963267948966\\n#define RECIPROCAL_PI 0.3183098861837907\\n#define RECIPROCAL_PI2 0.15915494309189535\\n#define EPSILON 1e-6\\n#ifndef saturate\\n#define saturate( a ) clamp( a, 0.0, 1.0 )\\n#endif\\n#define whiteComplement( a ) ( 1.0 - saturate( a ) )\\nfloat pow2( const in float x ) { return x*x; }\\nvec3 pow2( const in vec3 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 max3( const in vec3 v ) { return max( max( v.x, v.y ), v.z ); }\\nfloat average( const in vec3 v ) { return dot( v, vec3( 0.3333333 ) ); }\\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}\\n#ifdef HIGH_PRECISION\\n\\tfloat precisionSafeLength( vec3 v ) { return length( v ); }\\n#else\\n\\tfloat precisionSafeLength( vec3 v ) {\\n\\t\\tfloat maxComponent = max3( abs( v ) );\\n\\t\\treturn length( v / maxComponent ) * maxComponent;\\n\\t}\\n#endif\\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#ifdef USE_CLEARCOAT\\n\\tvec3 clearcoatNormal;\\n#endif\\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}\\nmat3 transposeMat3( const in mat3 m ) {\\n\\tmat3 tmp;\\n\\ttmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );\\n\\ttmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );\\n\\ttmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );\\n\\treturn tmp;\\n}\\nfloat luminance( const in vec3 rgb ) {\\n\\tconst vec3 weights = vec3( 0.2126729, 0.7151522, 0.0721750 );\\n\\treturn dot( weights, rgb );\\n}\\nbool isPerspectiveMatrix( mat4 m ) {\\n\\treturn m[ 2 ][ 3 ] == - 1.0;\\n}\\nvec2 equirectUv( in vec3 dir ) {\\n\\tfloat u = atan( dir.z, dir.x ) * RECIPROCAL_PI2 + 0.5;\\n\\tfloat v = asin( clamp( dir.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\\n\\treturn vec2( u, v );\\n}\";\n\nvar cube_uv_reflection_fragment = \"#ifdef ENVMAP_TYPE_CUBE_UV\\n\\t#define cubeUV_minMipLevel 4.0\\n\\t#define cubeUV_minTileSize 16.0\\n\\tfloat getFace( vec3 direction ) {\\n\\t\\tvec3 absDirection = abs( direction );\\n\\t\\tfloat face = - 1.0;\\n\\t\\tif ( absDirection.x > absDirection.z ) {\\n\\t\\t\\tif ( absDirection.x > absDirection.y )\\n\\t\\t\\t\\tface = direction.x > 0.0 ? 0.0 : 3.0;\\n\\t\\t\\telse\\n\\t\\t\\t\\tface = direction.y > 0.0 ? 1.0 : 4.0;\\n\\t\\t} else {\\n\\t\\t\\tif ( absDirection.z > absDirection.y )\\n\\t\\t\\t\\tface = direction.z > 0.0 ? 2.0 : 5.0;\\n\\t\\t\\telse\\n\\t\\t\\t\\tface = direction.y > 0.0 ? 1.0 : 4.0;\\n\\t\\t}\\n\\t\\treturn face;\\n\\t}\\n\\tvec2 getUV( vec3 direction, float face ) {\\n\\t\\tvec2 uv;\\n\\t\\tif ( face == 0.0 ) {\\n\\t\\t\\tuv = vec2( direction.z, direction.y ) / abs( direction.x );\\n\\t\\t} else if ( face == 1.0 ) {\\n\\t\\t\\tuv = vec2( - direction.x, - direction.z ) / abs( direction.y );\\n\\t\\t} else if ( face == 2.0 ) {\\n\\t\\t\\tuv = vec2( - direction.x, direction.y ) / abs( direction.z );\\n\\t\\t} else if ( face == 3.0 ) {\\n\\t\\t\\tuv = vec2( - direction.z, direction.y ) / abs( direction.x );\\n\\t\\t} else if ( face == 4.0 ) {\\n\\t\\t\\tuv = vec2( - direction.x, direction.z ) / abs( direction.y );\\n\\t\\t} else {\\n\\t\\t\\tuv = vec2( direction.x, direction.y ) / abs( direction.z );\\n\\t\\t}\\n\\t\\treturn 0.5 * ( uv + 1.0 );\\n\\t}\\n\\tvec3 bilinearCubeUV( sampler2D envMap, vec3 direction, float mipInt ) {\\n\\t\\tfloat face = getFace( direction );\\n\\t\\tfloat filterInt = max( cubeUV_minMipLevel - mipInt, 0.0 );\\n\\t\\tmipInt = max( mipInt, cubeUV_minMipLevel );\\n\\t\\tfloat faceSize = exp2( mipInt );\\n\\t\\tvec2 uv = getUV( direction, face ) * ( faceSize - 2.0 ) + 1.0;\\n\\t\\tif ( face > 2.0 ) {\\n\\t\\t\\tuv.y += faceSize;\\n\\t\\t\\tface -= 3.0;\\n\\t\\t}\\n\\t\\tuv.x += face * faceSize;\\n\\t\\tuv.x += filterInt * 3.0 * cubeUV_minTileSize;\\n\\t\\tuv.y += 4.0 * ( exp2( CUBEUV_MAX_MIP ) - faceSize );\\n\\t\\tuv.x *= CUBEUV_TEXEL_WIDTH;\\n\\t\\tuv.y *= CUBEUV_TEXEL_HEIGHT;\\n\\t\\t#ifdef texture2DGradEXT\\n\\t\\t\\treturn texture2DGradEXT( envMap, uv, vec2( 0.0 ), vec2( 0.0 ) ).rgb;\\n\\t\\t#else\\n\\t\\t\\treturn texture2D( envMap, uv ).rgb;\\n\\t\\t#endif\\n\\t}\\n\\t#define r0 1.0\\n\\t#define v0 0.339\\n\\t#define m0 - 2.0\\n\\t#define r1 0.8\\n\\t#define v1 0.276\\n\\t#define m1 - 1.0\\n\\t#define r4 0.4\\n\\t#define v4 0.046\\n\\t#define m4 2.0\\n\\t#define r5 0.305\\n\\t#define v5 0.016\\n\\t#define m5 3.0\\n\\t#define r6 0.21\\n\\t#define v6 0.0038\\n\\t#define m6 4.0\\n\\tfloat roughnessToMip( float roughness ) {\\n\\t\\tfloat mip = 0.0;\\n\\t\\tif ( roughness >= r1 ) {\\n\\t\\t\\tmip = ( r0 - roughness ) * ( m1 - m0 ) / ( r0 - r1 ) + m0;\\n\\t\\t} else if ( roughness >= r4 ) {\\n\\t\\t\\tmip = ( r1 - roughness ) * ( m4 - m1 ) / ( r1 - r4 ) + m1;\\n\\t\\t} else if ( roughness >= r5 ) {\\n\\t\\t\\tmip = ( r4 - roughness ) * ( m5 - m4 ) / ( r4 - r5 ) + m4;\\n\\t\\t} else if ( roughness >= r6 ) {\\n\\t\\t\\tmip = ( r5 - roughness ) * ( m6 - m5 ) / ( r5 - r6 ) + m5;\\n\\t\\t} else {\\n\\t\\t\\tmip = - 2.0 * log2( 1.16 * roughness );\\t\\t}\\n\\t\\treturn mip;\\n\\t}\\n\\tvec4 textureCubeUV( sampler2D envMap, vec3 sampleDir, float roughness ) {\\n\\t\\tfloat mip = clamp( roughnessToMip( roughness ), m0, CUBEUV_MAX_MIP );\\n\\t\\tfloat mipF = fract( mip );\\n\\t\\tfloat mipInt = floor( mip );\\n\\t\\tvec3 color0 = bilinearCubeUV( envMap, sampleDir, mipInt );\\n\\t\\tif ( mipF == 0.0 ) {\\n\\t\\t\\treturn vec4( color0, 1.0 );\\n\\t\\t} else {\\n\\t\\t\\tvec3 color1 = bilinearCubeUV( envMap, sampleDir, mipInt + 1.0 );\\n\\t\\t\\treturn vec4( mix( color0, color1, mipF ), 1.0 );\\n\\t\\t}\\n\\t}\\n#endif\";\n\nvar defaultnormal_vertex = \"vec3 transformedNormal = objectNormal;\\n#ifdef USE_INSTANCING\\n\\tmat3 m = mat3( instanceMatrix );\\n\\ttransformedNormal /= vec3( dot( m[ 0 ], m[ 0 ] ), dot( m[ 1 ], m[ 1 ] ), dot( m[ 2 ], m[ 2 ] ) );\\n\\ttransformedNormal = m * transformedNormal;\\n#endif\\ntransformedNormal = normalMatrix * transformedNormal;\\n#ifdef FLIP_SIDED\\n\\ttransformedNormal = - transformedNormal;\\n#endif\\n#ifdef USE_TANGENT\\n\\tvec3 transformedTangent = ( modelViewMatrix * vec4( objectTangent, 0.0 ) ).xyz;\\n\\t#ifdef FLIP_SIDED\\n\\t\\ttransformedTangent = - transformedTangent;\\n\\t#endif\\n#endif\";\n\nvar displacementmap_pars_vertex = \"#ifdef USE_DISPLACEMENTMAP\\n\\tuniform sampler2D displacementMap;\\n\\tuniform float displacementScale;\\n\\tuniform float displacementBias;\\n#endif\";\n\nvar displacementmap_vertex = \"#ifdef USE_DISPLACEMENTMAP\\n\\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, vUv ).x * displacementScale + displacementBias );\\n#endif\";\n\nvar emissivemap_fragment = \"#ifdef USE_EMISSIVEMAP\\n\\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\\n\\ttotalEmissiveRadiance *= emissiveColor.rgb;\\n#endif\";\n\nvar emissivemap_pars_fragment = \"#ifdef USE_EMISSIVEMAP\\n\\tuniform sampler2D emissiveMap;\\n#endif\";\n\nvar encodings_fragment = \"gl_FragColor = linearToOutputTexel( gl_FragColor );\";\n\nvar encodings_pars_fragment = \"vec4 LinearToLinear( in vec4 value ) {\\n\\treturn value;\\n}\\nvec4 LinearTosRGB( in vec4 value ) {\\n\\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a );\\n}\";\n\nvar envmap_fragment = \"#ifdef USE_ENVMAP\\n\\t#ifdef ENV_WORLDPOS\\n\\t\\tvec3 cameraToFrag;\\n\\t\\tif ( isOrthographic ) {\\n\\t\\t\\tcameraToFrag = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\\n\\t\\t} else {\\n\\t\\t\\tcameraToFrag = normalize( vWorldPosition - cameraPosition );\\n\\t\\t}\\n\\t\\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvec3 reflectVec = reflect( cameraToFrag, worldNormal );\\n\\t\\t#else\\n\\t\\t\\tvec3 reflectVec = refract( cameraToFrag, 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, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\\n\\t#elif defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\tvec4 envColor = textureCubeUV( envMap, reflectVec, 0.0 );\\n\\t#else\\n\\t\\tvec4 envColor = vec4( 0.0 );\\n\\t#endif\\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\nvar envmap_common_pars_fragment = \"#ifdef USE_ENVMAP\\n\\tuniform float envMapIntensity;\\n\\tuniform float flipEnvMap;\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tuniform samplerCube envMap;\\n\\t#else\\n\\t\\tuniform sampler2D envMap;\\n\\t#endif\\n\\t\\n#endif\";\n\nvar envmap_pars_fragment = \"#ifdef USE_ENVMAP\\n\\tuniform float reflectivity;\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\\n\\t\\t#define ENV_WORLDPOS\\n\\t#endif\\n\\t#ifdef ENV_WORLDPOS\\n\\t\\tvarying vec3 vWorldPosition;\\n\\t\\tuniform float refractionRatio;\\n\\t#else\\n\\t\\tvarying vec3 vReflect;\\n\\t#endif\\n#endif\";\n\nvar envmap_pars_vertex = \"#ifdef USE_ENVMAP\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) ||defined( PHONG )\\n\\t\\t#define ENV_WORLDPOS\\n\\t#endif\\n\\t#ifdef ENV_WORLDPOS\\n\\t\\t\\n\\t\\tvarying vec3 vWorldPosition;\\n\\t#else\\n\\t\\tvarying vec3 vReflect;\\n\\t\\tuniform float refractionRatio;\\n\\t#endif\\n#endif\";\n\nvar envmap_vertex = \"#ifdef USE_ENVMAP\\n\\t#ifdef ENV_WORLDPOS\\n\\t\\tvWorldPosition = worldPosition.xyz;\\n\\t#else\\n\\t\\tvec3 cameraToVertex;\\n\\t\\tif ( isOrthographic ) {\\n\\t\\t\\tcameraToVertex = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\\n\\t\\t} else {\\n\\t\\t\\tcameraToVertex = normalize( worldPosition.xyz - cameraPosition );\\n\\t\\t}\\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\nvar fog_vertex = \"#ifdef USE_FOG\\n\\tvFogDepth = - mvPosition.z;\\n#endif\";\n\nvar fog_pars_vertex = \"#ifdef USE_FOG\\n\\tvarying float vFogDepth;\\n#endif\";\n\nvar fog_fragment = \"#ifdef USE_FOG\\n\\t#ifdef FOG_EXP2\\n\\t\\tfloat fogFactor = 1.0 - exp( - fogDensity * fogDensity * vFogDepth * vFogDepth );\\n\\t#else\\n\\t\\tfloat fogFactor = smoothstep( fogNear, fogFar, vFogDepth );\\n\\t#endif\\n\\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\\n#endif\";\n\nvar fog_pars_fragment = \"#ifdef USE_FOG\\n\\tuniform vec3 fogColor;\\n\\tvarying float vFogDepth;\\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\nvar gradientmap_pars_fragment = \"#ifdef USE_GRADIENTMAP\\n\\tuniform sampler2D gradientMap;\\n#endif\\nvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\\n\\tfloat dotNL = dot( normal, lightDirection );\\n\\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\\n\\t#ifdef USE_GRADIENTMAP\\n\\t\\treturn vec3( texture2D( gradientMap, coord ).r );\\n\\t#else\\n\\t\\treturn ( coord.x < 0.7 ) ? vec3( 0.7 ) : vec3( 1.0 );\\n\\t#endif\\n}\";\n\nvar lightmap_fragment = \"#ifdef USE_LIGHTMAP\\n\\tvec4 lightMapTexel = texture2D( lightMap, vUv2 );\\n\\tvec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity;\\n\\treflectedLight.indirectDiffuse += lightMapIrradiance;\\n#endif\";\n\nvar lightmap_pars_fragment = \"#ifdef USE_LIGHTMAP\\n\\tuniform sampler2D lightMap;\\n\\tuniform float lightMapIntensity;\\n#endif\";\n\nvar lights_lambert_vertex = \"vec3 diffuse = vec3( 1.0 );\\nGeometricContext geometry;\\ngeometry.position = mvPosition.xyz;\\ngeometry.normal = normalize( transformedNormal );\\ngeometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( -mvPosition.xyz );\\nGeometricContext backGeometry;\\nbackGeometry.position = geometry.position;\\nbackGeometry.normal = -geometry.normal;\\nbackGeometry.viewDir = geometry.viewDir;\\nvLightFront = vec3( 0.0 );\\nvIndirectFront = vec3( 0.0 );\\n#ifdef DOUBLE_SIDED\\n\\tvLightBack = vec3( 0.0 );\\n\\tvIndirectBack = vec3( 0.0 );\\n#endif\\nIncidentLight directLight;\\nfloat dotNL;\\nvec3 directLightColor_Diffuse;\\nvIndirectFront += getAmbientLightIrradiance( ambientLightColor );\\nvIndirectFront += getLightProbeIrradiance( lightProbe, geometry.normal );\\n#ifdef DOUBLE_SIDED\\n\\tvIndirectBack += getAmbientLightIrradiance( ambientLightColor );\\n\\tvIndirectBack += getLightProbeIrradiance( lightProbe, backGeometry.normal );\\n#endif\\n#if NUM_POINT_LIGHTS > 0\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\\n\\t\\tgetPointLightInfo( pointLights[ i ], geometry, directLight );\\n\\t\\tdotNL = dot( geometry.normal, directLight.direction );\\n\\t\\tdirectLightColor_Diffuse = 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\\t#pragma unroll_loop_end\\n#endif\\n#if NUM_SPOT_LIGHTS > 0\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\\n\\t\\tgetSpotLightInfo( spotLights[ i ], geometry, directLight );\\n\\t\\tdotNL = dot( geometry.normal, directLight.direction );\\n\\t\\tdirectLightColor_Diffuse = 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\\t#pragma unroll_loop_end\\n#endif\\n#if NUM_DIR_LIGHTS > 0\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\\n\\t\\tgetDirectionalLightInfo( directionalLights[ i ], geometry, directLight );\\n\\t\\tdotNL = dot( geometry.normal, directLight.direction );\\n\\t\\tdirectLightColor_Diffuse = 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\\t#pragma unroll_loop_end\\n#endif\\n#if NUM_HEMI_LIGHTS > 0\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\\n\\t\\tvIndirectFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry.normal );\\n\\t\\t#ifdef DOUBLE_SIDED\\n\\t\\t\\tvIndirectBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry.normal );\\n\\t\\t#endif\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\";\n\nvar lights_pars_begin = \"uniform bool receiveShadow;\\nuniform vec3 ambientLightColor;\\nuniform vec3 lightProbe[ 9 ];\\nvec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) {\\n\\tfloat x = normal.x, y = normal.y, z = normal.z;\\n\\tvec3 result = shCoefficients[ 0 ] * 0.886227;\\n\\tresult += shCoefficients[ 1 ] * 2.0 * 0.511664 * y;\\n\\tresult += shCoefficients[ 2 ] * 2.0 * 0.511664 * z;\\n\\tresult += shCoefficients[ 3 ] * 2.0 * 0.511664 * x;\\n\\tresult += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y;\\n\\tresult += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z;\\n\\tresult += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 );\\n\\tresult += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z;\\n\\tresult += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y );\\n\\treturn result;\\n}\\nvec3 getLightProbeIrradiance( const in vec3 lightProbe[ 9 ], const in vec3 normal ) {\\n\\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\\n\\tvec3 irradiance = shGetIrradianceAt( worldNormal, lightProbe );\\n\\treturn irradiance;\\n}\\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\\n\\tvec3 irradiance = ambientLightColor;\\n\\treturn irradiance;\\n}\\nfloat getDistanceAttenuation( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\\n\\t#if defined ( PHYSICALLY_CORRECT_LIGHTS )\\n\\t\\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\\n\\t\\tif ( cutoffDistance > 0.0 ) {\\n\\t\\t\\tdistanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\\n\\t\\t}\\n\\t\\treturn distanceFalloff;\\n\\t#else\\n\\t\\tif ( cutoffDistance > 0.0 && decayExponent > 0.0 ) {\\n\\t\\t\\treturn pow( saturate( - lightDistance / cutoffDistance + 1.0 ), decayExponent );\\n\\t\\t}\\n\\t\\treturn 1.0;\\n\\t#endif\\n}\\nfloat getSpotAttenuation( const in float coneCosine, const in float penumbraCosine, const in float angleCosine ) {\\n\\treturn smoothstep( coneCosine, penumbraCosine, angleCosine );\\n}\\n#if NUM_DIR_LIGHTS > 0\\n\\tstruct DirectionalLight {\\n\\t\\tvec3 direction;\\n\\t\\tvec3 color;\\n\\t};\\n\\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\\n\\tvoid getDirectionalLightInfo( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight light ) {\\n\\t\\tlight.color = directionalLight.color;\\n\\t\\tlight.direction = directionalLight.direction;\\n\\t\\tlight.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};\\n\\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\\n\\tvoid getPointLightInfo( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight light ) {\\n\\t\\tvec3 lVector = pointLight.position - geometry.position;\\n\\t\\tlight.direction = normalize( lVector );\\n\\t\\tfloat lightDistance = length( lVector );\\n\\t\\tlight.color = pointLight.color;\\n\\t\\tlight.color *= getDistanceAttenuation( lightDistance, pointLight.distance, pointLight.decay );\\n\\t\\tlight.visible = ( light.color != vec3( 0.0 ) );\\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};\\n\\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\\n\\tvoid getSpotLightInfo( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight light ) {\\n\\t\\tvec3 lVector = spotLight.position - geometry.position;\\n\\t\\tlight.direction = normalize( lVector );\\n\\t\\tfloat angleCos = dot( light.direction, spotLight.direction );\\n\\t\\tfloat spotAttenuation = getSpotAttenuation( spotLight.coneCos, spotLight.penumbraCos, angleCos );\\n\\t\\tif ( spotAttenuation > 0.0 ) {\\n\\t\\t\\tfloat lightDistance = length( lVector );\\n\\t\\t\\tlight.color = spotLight.color * spotAttenuation;\\n\\t\\t\\tlight.color *= getDistanceAttenuation( lightDistance, spotLight.distance, spotLight.decay );\\n\\t\\t\\tlight.visible = ( light.color != vec3( 0.0 ) );\\n\\t\\t} else {\\n\\t\\t\\tlight.color = vec3( 0.0 );\\n\\t\\t\\tlight.visible = false;\\n\\t\\t}\\n\\t}\\n#endif\\n#if NUM_RECT_AREA_LIGHTS > 0\\n\\tstruct RectAreaLight {\\n\\t\\tvec3 color;\\n\\t\\tvec3 position;\\n\\t\\tvec3 halfWidth;\\n\\t\\tvec3 halfHeight;\\n\\t};\\n\\tuniform sampler2D ltc_1;\\tuniform sampler2D ltc_2;\\n\\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\\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 vec3 normal ) {\\n\\t\\tfloat dotNL = dot( normal, hemiLight.direction );\\n\\t\\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\\n\\t\\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\\n\\t\\treturn irradiance;\\n\\t}\\n#endif\";\n\nvar envmap_physical_pars_fragment = \"#if defined( USE_ENVMAP )\\n\\tvec3 getIBLIrradiance( const in vec3 normal ) {\\n\\t\\t#if defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\t\\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\\n\\t\\t\\tvec4 envMapColor = textureCubeUV( envMap, worldNormal, 1.0 );\\n\\t\\t\\treturn PI * envMapColor.rgb * envMapIntensity;\\n\\t\\t#else\\n\\t\\t\\treturn vec3( 0.0 );\\n\\t\\t#endif\\n\\t}\\n\\tvec3 getIBLRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness ) {\\n\\t\\t#if defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\t\\tvec3 reflectVec = reflect( - viewDir, normal );\\n\\t\\t\\treflectVec = normalize( mix( reflectVec, normal, roughness * roughness) );\\n\\t\\t\\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\\n\\t\\t\\tvec4 envMapColor = textureCubeUV( envMap, reflectVec, roughness );\\n\\t\\t\\treturn envMapColor.rgb * envMapIntensity;\\n\\t\\t#else\\n\\t\\t\\treturn vec3( 0.0 );\\n\\t\\t#endif\\n\\t}\\n#endif\";\n\nvar lights_toon_fragment = \"ToonMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb;\";\n\nvar lights_toon_pars_fragment = \"varying vec3 vViewPosition;\\nstruct ToonMaterial {\\n\\tvec3 diffuseColor;\\n};\\nvoid RE_Direct_Toon( const in IncidentLight directLight, const in GeometricContext geometry, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectDiffuse_Toon( const in vec3 irradiance, const in GeometricContext geometry, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_Toon\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_Toon\\n#define Material_LightProbeLOD( material )\\t(0)\";\n\nvar lights_phong_fragment = \"BlinnPhongMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb;\\nmaterial.specularColor = specular;\\nmaterial.specularShininess = shininess;\\nmaterial.specularStrength = specularStrength;\";\n\nvar lights_phong_pars_fragment = \"varying vec3 vViewPosition;\\nstruct BlinnPhongMaterial {\\n\\tvec3 diffuseColor;\\n\\tvec3 specularColor;\\n\\tfloat specularShininess;\\n\\tfloat specularStrength;\\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\\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n\\treflectedLight.directSpecular += irradiance * BRDF_BlinnPhong( directLight.direction, geometry.viewDir, geometry.normal, 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_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\nvar lights_physical_fragment = \"PhysicalMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\\nvec3 dxy = max( abs( dFdx( geometryNormal ) ), abs( dFdy( geometryNormal ) ) );\\nfloat geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );\\nmaterial.roughness = max( roughnessFactor, 0.0525 );material.roughness += geometryRoughness;\\nmaterial.roughness = min( material.roughness, 1.0 );\\n#ifdef IOR\\n\\t#ifdef SPECULAR\\n\\t\\tfloat specularIntensityFactor = specularIntensity;\\n\\t\\tvec3 specularColorFactor = specularColor;\\n\\t\\t#ifdef USE_SPECULARINTENSITYMAP\\n\\t\\t\\tspecularIntensityFactor *= texture2D( specularIntensityMap, vUv ).a;\\n\\t\\t#endif\\n\\t\\t#ifdef USE_SPECULARCOLORMAP\\n\\t\\t\\tspecularColorFactor *= texture2D( specularColorMap, vUv ).rgb;\\n\\t\\t#endif\\n\\t\\tmaterial.specularF90 = mix( specularIntensityFactor, 1.0, metalnessFactor );\\n\\t#else\\n\\t\\tfloat specularIntensityFactor = 1.0;\\n\\t\\tvec3 specularColorFactor = vec3( 1.0 );\\n\\t\\tmaterial.specularF90 = 1.0;\\n\\t#endif\\n\\tmaterial.specularColor = mix( min( pow2( ( ior - 1.0 ) / ( ior + 1.0 ) ) * specularColorFactor, vec3( 1.0 ) ) * specularIntensityFactor, diffuseColor.rgb, metalnessFactor );\\n#else\\n\\tmaterial.specularColor = mix( vec3( 0.04 ), diffuseColor.rgb, metalnessFactor );\\n\\tmaterial.specularF90 = 1.0;\\n#endif\\n#ifdef USE_CLEARCOAT\\n\\tmaterial.clearcoat = clearcoat;\\n\\tmaterial.clearcoatRoughness = clearcoatRoughness;\\n\\tmaterial.clearcoatF0 = vec3( 0.04 );\\n\\tmaterial.clearcoatF90 = 1.0;\\n\\t#ifdef USE_CLEARCOATMAP\\n\\t\\tmaterial.clearcoat *= texture2D( clearcoatMap, vUv ).x;\\n\\t#endif\\n\\t#ifdef USE_CLEARCOAT_ROUGHNESSMAP\\n\\t\\tmaterial.clearcoatRoughness *= texture2D( clearcoatRoughnessMap, vUv ).y;\\n\\t#endif\\n\\tmaterial.clearcoat = saturate( material.clearcoat );\\tmaterial.clearcoatRoughness = max( material.clearcoatRoughness, 0.0525 );\\n\\tmaterial.clearcoatRoughness += geometryRoughness;\\n\\tmaterial.clearcoatRoughness = min( material.clearcoatRoughness, 1.0 );\\n#endif\\n#ifdef USE_IRIDESCENCE\\n\\tmaterial.iridescence = iridescence;\\n\\tmaterial.iridescenceIOR = iridescenceIOR;\\n\\t#ifdef USE_IRIDESCENCEMAP\\n\\t\\tmaterial.iridescence *= texture2D( iridescenceMap, vUv ).r;\\n\\t#endif\\n\\t#ifdef USE_IRIDESCENCE_THICKNESSMAP\\n\\t\\tmaterial.iridescenceThickness = (iridescenceThicknessMaximum - iridescenceThicknessMinimum) * texture2D( iridescenceThicknessMap, vUv ).g + iridescenceThicknessMinimum;\\n\\t#else\\n\\t\\tmaterial.iridescenceThickness = iridescenceThicknessMaximum;\\n\\t#endif\\n#endif\\n#ifdef USE_SHEEN\\n\\tmaterial.sheenColor = sheenColor;\\n\\t#ifdef USE_SHEENCOLORMAP\\n\\t\\tmaterial.sheenColor *= texture2D( sheenColorMap, vUv ).rgb;\\n\\t#endif\\n\\tmaterial.sheenRoughness = clamp( sheenRoughness, 0.07, 1.0 );\\n\\t#ifdef USE_SHEENROUGHNESSMAP\\n\\t\\tmaterial.sheenRoughness *= texture2D( sheenRoughnessMap, vUv ).a;\\n\\t#endif\\n#endif\";\n\nvar lights_physical_pars_fragment = \"struct PhysicalMaterial {\\n\\tvec3 diffuseColor;\\n\\tfloat roughness;\\n\\tvec3 specularColor;\\n\\tfloat specularF90;\\n\\t#ifdef USE_CLEARCOAT\\n\\t\\tfloat clearcoat;\\n\\t\\tfloat clearcoatRoughness;\\n\\t\\tvec3 clearcoatF0;\\n\\t\\tfloat clearcoatF90;\\n\\t#endif\\n\\t#ifdef USE_IRIDESCENCE\\n\\t\\tfloat iridescence;\\n\\t\\tfloat iridescenceIOR;\\n\\t\\tfloat iridescenceThickness;\\n\\t\\tvec3 iridescenceFresnel;\\n\\t\\tvec3 iridescenceF0;\\n\\t#endif\\n\\t#ifdef USE_SHEEN\\n\\t\\tvec3 sheenColor;\\n\\t\\tfloat sheenRoughness;\\n\\t#endif\\n};\\nvec3 clearcoatSpecular = vec3( 0.0 );\\nvec3 sheenSpecular = vec3( 0.0 );\\nfloat IBLSheenBRDF( const in vec3 normal, const in vec3 viewDir, const in float roughness) {\\n\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\tfloat r2 = roughness * roughness;\\n\\tfloat a = roughness < 0.25 ? -339.2 * r2 + 161.4 * roughness - 25.9 : -8.48 * r2 + 14.3 * roughness - 9.95;\\n\\tfloat b = roughness < 0.25 ? 44.0 * r2 - 23.7 * roughness + 3.26 : 1.97 * r2 - 3.27 * roughness + 0.72;\\n\\tfloat DG = exp( a * dotNV + b ) + ( roughness < 0.25 ? 0.0 : 0.1 * ( roughness - 0.25 ) );\\n\\treturn saturate( DG * RECIPROCAL_PI );\\n}\\nvec2 DFGApprox( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\\n\\tfloat dotNV = saturate( dot( normal, 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 fab = vec2( - 1.04, 1.04 ) * a004 + r.zw;\\n\\treturn fab;\\n}\\nvec3 EnvironmentBRDF( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness ) {\\n\\tvec2 fab = DFGApprox( normal, viewDir, roughness );\\n\\treturn specularColor * fab.x + specularF90 * fab.y;\\n}\\n#ifdef USE_IRIDESCENCE\\nvoid computeMultiscatteringIridescence( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float iridescence, const in vec3 iridescenceF0, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\\n#else\\nvoid computeMultiscattering( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\\n#endif\\n\\tvec2 fab = DFGApprox( normal, viewDir, roughness );\\n\\t#ifdef USE_IRIDESCENCE\\n\\t\\tvec3 Fr = mix( specularColor, iridescenceF0, iridescence );\\n\\t#else\\n\\t\\tvec3 Fr = specularColor;\\n\\t#endif\\n\\tvec3 FssEss = Fr * fab.x + specularF90 * fab.y;\\n\\tfloat Ess = fab.x + fab.y;\\n\\tfloat Ems = 1.0 - Ess;\\n\\tvec3 Favg = Fr + ( 1.0 - Fr ) * 0.047619;\\tvec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );\\n\\tsingleScatter += FssEss;\\n\\tmultiScatter += Fms * Ems;\\n}\\n#if NUM_RECT_AREA_LIGHTS > 0\\n\\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\t\\tvec3 normal = geometry.normal;\\n\\t\\tvec3 viewDir = geometry.viewDir;\\n\\t\\tvec3 position = geometry.position;\\n\\t\\tvec3 lightPos = rectAreaLight.position;\\n\\t\\tvec3 halfWidth = rectAreaLight.halfWidth;\\n\\t\\tvec3 halfHeight = rectAreaLight.halfHeight;\\n\\t\\tvec3 lightColor = rectAreaLight.color;\\n\\t\\tfloat roughness = material.roughness;\\n\\t\\tvec3 rectCoords[ 4 ];\\n\\t\\trectCoords[ 0 ] = lightPos + halfWidth - halfHeight;\\t\\trectCoords[ 1 ] = lightPos - halfWidth - halfHeight;\\n\\t\\trectCoords[ 2 ] = lightPos - halfWidth + halfHeight;\\n\\t\\trectCoords[ 3 ] = lightPos + halfWidth + halfHeight;\\n\\t\\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\\n\\t\\tvec4 t1 = texture2D( ltc_1, uv );\\n\\t\\tvec4 t2 = texture2D( ltc_2, uv );\\n\\t\\tmat3 mInv = mat3(\\n\\t\\t\\tvec3( t1.x, 0, t1.y ),\\n\\t\\t\\tvec3( 0, 1, 0 ),\\n\\t\\t\\tvec3( t1.z, 0, t1.w )\\n\\t\\t);\\n\\t\\tvec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\\n\\t\\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\\n\\t\\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\\n\\t}\\n#endif\\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#ifdef USE_CLEARCOAT\\n\\t\\tfloat dotNLcc = saturate( dot( geometry.clearcoatNormal, directLight.direction ) );\\n\\t\\tvec3 ccIrradiance = dotNLcc * directLight.color;\\n\\t\\tclearcoatSpecular += ccIrradiance * BRDF_GGX( directLight.direction, geometry.viewDir, geometry.clearcoatNormal, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\\n\\t#endif\\n\\t#ifdef USE_SHEEN\\n\\t\\tsheenSpecular += irradiance * BRDF_Sheen( directLight.direction, geometry.viewDir, geometry.normal, material.sheenColor, material.sheenRoughness );\\n\\t#endif\\n\\t#ifdef USE_IRIDESCENCE\\n\\t\\treflectedLight.directSpecular += irradiance * BRDF_GGX_Iridescence( directLight.direction, geometry.viewDir, geometry.normal, material.specularColor, material.specularF90, material.iridescence, material.iridescenceFresnel, material.roughness );\\n\\t#else\\n\\t\\treflectedLight.directSpecular += irradiance * BRDF_GGX( directLight.direction, geometry.viewDir, geometry.normal, material.specularColor, material.specularF90, material.roughness );\\n\\t#endif\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\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_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearcoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {\\n\\t#ifdef USE_CLEARCOAT\\n\\t\\tclearcoatSpecular += clearcoatRadiance * EnvironmentBRDF( geometry.clearcoatNormal, geometry.viewDir, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\\n\\t#endif\\n\\t#ifdef USE_SHEEN\\n\\t\\tsheenSpecular += irradiance * material.sheenColor * IBLSheenBRDF( geometry.normal, geometry.viewDir, material.sheenRoughness );\\n\\t#endif\\n\\tvec3 singleScattering = vec3( 0.0 );\\n\\tvec3 multiScattering = vec3( 0.0 );\\n\\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\\n\\t#ifdef USE_IRIDESCENCE\\n\\t\\tcomputeMultiscatteringIridescence( geometry.normal, geometry.viewDir, material.specularColor, material.specularF90, material.iridescence, material.iridescenceFresnel, material.roughness, singleScattering, multiScattering );\\n\\t#else\\n\\t\\tcomputeMultiscattering( geometry.normal, geometry.viewDir, material.specularColor, material.specularF90, material.roughness, singleScattering, multiScattering );\\n\\t#endif\\n\\tvec3 totalScattering = singleScattering + multiScattering;\\n\\tvec3 diffuse = material.diffuseColor * ( 1.0 - max( max( totalScattering.r, totalScattering.g ), totalScattering.b ) );\\n\\treflectedLight.indirectSpecular += radiance * singleScattering;\\n\\treflectedLight.indirectSpecular += multiScattering * cosineWeightedIrradiance;\\n\\treflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance;\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_Physical\\n#define RE_Direct_RectArea\\t\\tRE_Direct_RectArea_Physical\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_Physical\\n#define RE_IndirectSpecular\\t\\tRE_IndirectSpecular_Physical\\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\nvar lights_fragment_begin = \"\\nGeometricContext geometry;\\ngeometry.position = - vViewPosition;\\ngeometry.normal = normal;\\ngeometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\\n#ifdef USE_CLEARCOAT\\n\\tgeometry.clearcoatNormal = clearcoatNormal;\\n#endif\\n#ifdef USE_IRIDESCENCE\\n\\tfloat dotNVi = saturate( dot( normal, geometry.viewDir ) );\\n\\tif ( material.iridescenceThickness == 0.0 ) {\\n\\t\\tmaterial.iridescence = 0.0;\\n\\t} else {\\n\\t\\tmaterial.iridescence = saturate( material.iridescence );\\n\\t}\\n\\tif ( material.iridescence > 0.0 ) {\\n\\t\\tmaterial.iridescenceFresnel = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.specularColor );\\n\\t\\tmaterial.iridescenceF0 = Schlick_to_F0( material.iridescenceFresnel, 1.0, dotNVi );\\n\\t}\\n#endif\\nIncidentLight directLight;\\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tPointLight pointLight;\\n\\t#if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\\n\\tPointLightShadow pointLightShadow;\\n\\t#endif\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\\n\\t\\tpointLight = pointLights[ i ];\\n\\t\\tgetPointLightInfo( pointLight, geometry, directLight );\\n\\t\\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS )\\n\\t\\tpointLightShadow = pointLightShadows[ i ];\\n\\t\\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometry, material, reflectedLight );\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tSpotLight spotLight;\\n\\t#if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\\n\\tSpotLightShadow spotLightShadow;\\n\\t#endif\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\\n\\t\\tspotLight = spotLights[ i ];\\n\\t\\tgetSpotLightInfo( spotLight, geometry, directLight );\\n\\t\\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\\n\\t\\tspotLightShadow = spotLightShadows[ i ];\\n\\t\\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometry, material, reflectedLight );\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tDirectionalLight directionalLight;\\n\\t#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\\n\\tDirectionalLightShadow directionalLightShadow;\\n\\t#endif\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\\n\\t\\tdirectionalLight = directionalLights[ i ];\\n\\t\\tgetDirectionalLightInfo( directionalLight, geometry, directLight );\\n\\t\\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\\n\\t\\tdirectionalLightShadow = directionalLightShadows[ i ];\\n\\t\\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometry, material, reflectedLight );\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\\n\\tRectAreaLight rectAreaLight;\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\\n\\t\\trectAreaLight = rectAreaLights[ i ];\\n\\t\\tRE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if defined( RE_IndirectDiffuse )\\n\\tvec3 iblIrradiance = vec3( 0.0 );\\n\\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\\n\\tirradiance += getLightProbeIrradiance( lightProbe, geometry.normal );\\n\\t#if ( NUM_HEMI_LIGHTS > 0 )\\n\\t\\t#pragma unroll_loop_start\\n\\t\\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\\n\\t\\t\\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry.normal );\\n\\t\\t}\\n\\t\\t#pragma unroll_loop_end\\n\\t#endif\\n#endif\\n#if defined( RE_IndirectSpecular )\\n\\tvec3 radiance = vec3( 0.0 );\\n\\tvec3 clearcoatRadiance = vec3( 0.0 );\\n#endif\";\n\nvar lights_fragment_maps = \"#if defined( RE_IndirectDiffuse )\\n\\t#ifdef USE_LIGHTMAP\\n\\t\\tvec4 lightMapTexel = texture2D( lightMap, vUv2 );\\n\\t\\tvec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity;\\n\\t\\tirradiance += lightMapIrradiance;\\n\\t#endif\\n\\t#if defined( USE_ENVMAP ) && defined( STANDARD ) && defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\tiblIrradiance += getIBLIrradiance( geometry.normal );\\n\\t#endif\\n#endif\\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\\n\\tradiance += getIBLRadiance( geometry.viewDir, geometry.normal, material.roughness );\\n\\t#ifdef USE_CLEARCOAT\\n\\t\\tclearcoatRadiance += getIBLRadiance( geometry.viewDir, geometry.clearcoatNormal, material.clearcoatRoughness );\\n\\t#endif\\n#endif\";\n\nvar lights_fragment_end = \"#if defined( RE_IndirectDiffuse )\\n\\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\\n#endif\\n#if defined( RE_IndirectSpecular )\\n\\tRE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometry, material, reflectedLight );\\n#endif\";\n\nvar logdepthbuf_fragment = \"#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\\n\\tgl_FragDepthEXT = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\\n#endif\";\n\nvar logdepthbuf_pars_fragment = \"#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\\n\\tuniform float logDepthBufFC;\\n\\tvarying float vFragDepth;\\n\\tvarying float vIsPerspective;\\n#endif\";\n\nvar logdepthbuf_pars_vertex = \"#ifdef USE_LOGDEPTHBUF\\n\\t#ifdef USE_LOGDEPTHBUF_EXT\\n\\t\\tvarying float vFragDepth;\\n\\t\\tvarying float vIsPerspective;\\n\\t#else\\n\\t\\tuniform float logDepthBufFC;\\n\\t#endif\\n#endif\";\n\nvar logdepthbuf_vertex = \"#ifdef USE_LOGDEPTHBUF\\n\\t#ifdef USE_LOGDEPTHBUF_EXT\\n\\t\\tvFragDepth = 1.0 + gl_Position.w;\\n\\t\\tvIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) );\\n\\t#else\\n\\t\\tif ( isPerspectiveMatrix( projectionMatrix ) ) {\\n\\t\\t\\tgl_Position.z = log2( max( EPSILON, gl_Position.w + 1.0 ) ) * logDepthBufFC - 1.0;\\n\\t\\t\\tgl_Position.z *= gl_Position.w;\\n\\t\\t}\\n\\t#endif\\n#endif\";\n\nvar map_fragment = \"#ifdef USE_MAP\\n\\tvec4 sampledDiffuseColor = texture2D( map, vUv );\\n\\t#ifdef DECODE_VIDEO_TEXTURE\\n\\t\\tsampledDiffuseColor = vec4( mix( pow( sampledDiffuseColor.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), sampledDiffuseColor.rgb * 0.0773993808, vec3( lessThanEqual( sampledDiffuseColor.rgb, vec3( 0.04045 ) ) ) ), sampledDiffuseColor.w );\\n\\t#endif\\n\\tdiffuseColor *= sampledDiffuseColor;\\n#endif\";\n\nvar map_pars_fragment = \"#ifdef USE_MAP\\n\\tuniform sampler2D map;\\n#endif\";\n\nvar map_particle_fragment = \"#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\\n\\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\\n#endif\\n#ifdef USE_MAP\\n\\tdiffuseColor *= texture2D( map, uv );\\n#endif\\n#ifdef USE_ALPHAMAP\\n\\tdiffuseColor.a *= texture2D( alphaMap, uv ).g;\\n#endif\";\n\nvar map_particle_pars_fragment = \"#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\\n\\tuniform mat3 uvTransform;\\n#endif\\n#ifdef USE_MAP\\n\\tuniform sampler2D map;\\n#endif\\n#ifdef USE_ALPHAMAP\\n\\tuniform sampler2D alphaMap;\\n#endif\";\n\nvar metalnessmap_fragment = \"float metalnessFactor = metalness;\\n#ifdef USE_METALNESSMAP\\n\\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\\n\\tmetalnessFactor *= texelMetalness.b;\\n#endif\";\n\nvar metalnessmap_pars_fragment = \"#ifdef USE_METALNESSMAP\\n\\tuniform sampler2D metalnessMap;\\n#endif\";\n\nvar morphcolor_vertex = \"#if defined( USE_MORPHCOLORS ) && defined( MORPHTARGETS_TEXTURE )\\n\\tvColor *= morphTargetBaseInfluence;\\n\\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\\n\\t\\t#if defined( USE_COLOR_ALPHA )\\n\\t\\t\\tif ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ) * morphTargetInfluences[ i ];\\n\\t\\t#elif defined( USE_COLOR )\\n\\t\\t\\tif ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ).rgb * morphTargetInfluences[ i ];\\n\\t\\t#endif\\n\\t}\\n#endif\";\n\nvar morphnormal_vertex = \"#ifdef USE_MORPHNORMALS\\n\\tobjectNormal *= morphTargetBaseInfluence;\\n\\t#ifdef MORPHTARGETS_TEXTURE\\n\\t\\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\\n\\t\\t\\tif ( morphTargetInfluences[ i ] != 0.0 ) objectNormal += getMorph( gl_VertexID, i, 1 ).xyz * morphTargetInfluences[ i ];\\n\\t\\t}\\n\\t#else\\n\\t\\tobjectNormal += morphNormal0 * morphTargetInfluences[ 0 ];\\n\\t\\tobjectNormal += morphNormal1 * morphTargetInfluences[ 1 ];\\n\\t\\tobjectNormal += morphNormal2 * morphTargetInfluences[ 2 ];\\n\\t\\tobjectNormal += morphNormal3 * morphTargetInfluences[ 3 ];\\n\\t#endif\\n#endif\";\n\nvar morphtarget_pars_vertex = \"#ifdef USE_MORPHTARGETS\\n\\tuniform float morphTargetBaseInfluence;\\n\\t#ifdef MORPHTARGETS_TEXTURE\\n\\t\\tuniform float morphTargetInfluences[ MORPHTARGETS_COUNT ];\\n\\t\\tuniform sampler2DArray morphTargetsTexture;\\n\\t\\tuniform ivec2 morphTargetsTextureSize;\\n\\t\\tvec4 getMorph( const in int vertexIndex, const in int morphTargetIndex, const in int offset ) {\\n\\t\\t\\tint texelIndex = vertexIndex * MORPHTARGETS_TEXTURE_STRIDE + offset;\\n\\t\\t\\tint y = texelIndex / morphTargetsTextureSize.x;\\n\\t\\t\\tint x = texelIndex - y * morphTargetsTextureSize.x;\\n\\t\\t\\tivec3 morphUV = ivec3( x, y, morphTargetIndex );\\n\\t\\t\\treturn texelFetch( morphTargetsTexture, morphUV, 0 );\\n\\t\\t}\\n\\t#else\\n\\t\\t#ifndef USE_MORPHNORMALS\\n\\t\\t\\tuniform float morphTargetInfluences[ 8 ];\\n\\t\\t#else\\n\\t\\t\\tuniform float morphTargetInfluences[ 4 ];\\n\\t\\t#endif\\n\\t#endif\\n#endif\";\n\nvar morphtarget_vertex = \"#ifdef USE_MORPHTARGETS\\n\\ttransformed *= morphTargetBaseInfluence;\\n\\t#ifdef MORPHTARGETS_TEXTURE\\n\\t\\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\\n\\t\\t\\tif ( morphTargetInfluences[ i ] != 0.0 ) transformed += getMorph( gl_VertexID, i, 0 ).xyz * morphTargetInfluences[ i ];\\n\\t\\t}\\n\\t#else\\n\\t\\ttransformed += morphTarget0 * morphTargetInfluences[ 0 ];\\n\\t\\ttransformed += morphTarget1 * morphTargetInfluences[ 1 ];\\n\\t\\ttransformed += morphTarget2 * morphTargetInfluences[ 2 ];\\n\\t\\ttransformed += morphTarget3 * morphTargetInfluences[ 3 ];\\n\\t\\t#ifndef USE_MORPHNORMALS\\n\\t\\t\\ttransformed += morphTarget4 * morphTargetInfluences[ 4 ];\\n\\t\\t\\ttransformed += morphTarget5 * morphTargetInfluences[ 5 ];\\n\\t\\t\\ttransformed += morphTarget6 * morphTargetInfluences[ 6 ];\\n\\t\\t\\ttransformed += morphTarget7 * morphTargetInfluences[ 7 ];\\n\\t\\t#endif\\n\\t#endif\\n#endif\";\n\nvar normal_fragment_begin = \"float faceDirection = gl_FrontFacing ? 1.0 : - 1.0;\\n#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 );\\n\\t#ifdef DOUBLE_SIDED\\n\\t\\tnormal = normal * faceDirection;\\n\\t#endif\\n\\t#ifdef USE_TANGENT\\n\\t\\tvec3 tangent = normalize( vTangent );\\n\\t\\tvec3 bitangent = normalize( vBitangent );\\n\\t\\t#ifdef DOUBLE_SIDED\\n\\t\\t\\ttangent = tangent * faceDirection;\\n\\t\\t\\tbitangent = bitangent * faceDirection;\\n\\t\\t#endif\\n\\t\\t#if defined( TANGENTSPACE_NORMALMAP ) || defined( USE_CLEARCOAT_NORMALMAP )\\n\\t\\t\\tmat3 vTBN = mat3( tangent, bitangent, normal );\\n\\t\\t#endif\\n\\t#endif\\n#endif\\nvec3 geometryNormal = normal;\";\n\nvar normal_fragment_maps = \"#ifdef OBJECTSPACE_NORMALMAP\\n\\tnormal = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\\n\\t#ifdef FLIP_SIDED\\n\\t\\tnormal = - normal;\\n\\t#endif\\n\\t#ifdef DOUBLE_SIDED\\n\\t\\tnormal = normal * faceDirection;\\n\\t#endif\\n\\tnormal = normalize( normalMatrix * normal );\\n#elif defined( TANGENTSPACE_NORMALMAP )\\n\\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\\n\\tmapN.xy *= normalScale;\\n\\t#ifdef USE_TANGENT\\n\\t\\tnormal = normalize( vTBN * mapN );\\n\\t#else\\n\\t\\tnormal = perturbNormal2Arb( - vViewPosition, normal, mapN, faceDirection );\\n\\t#endif\\n#elif defined( USE_BUMPMAP )\\n\\tnormal = perturbNormalArb( - vViewPosition, normal, dHdxy_fwd(), faceDirection );\\n#endif\";\n\nvar normal_pars_fragment = \"#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n\\t#ifdef USE_TANGENT\\n\\t\\tvarying vec3 vTangent;\\n\\t\\tvarying vec3 vBitangent;\\n\\t#endif\\n#endif\";\n\nvar normal_pars_vertex = \"#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n\\t#ifdef USE_TANGENT\\n\\t\\tvarying vec3 vTangent;\\n\\t\\tvarying vec3 vBitangent;\\n\\t#endif\\n#endif\";\n\nvar normal_vertex = \"#ifndef FLAT_SHADED\\n\\tvNormal = normalize( transformedNormal );\\n\\t#ifdef USE_TANGENT\\n\\t\\tvTangent = normalize( transformedTangent );\\n\\t\\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\\n\\t#endif\\n#endif\";\n\nvar normalmap_pars_fragment = \"#ifdef USE_NORMALMAP\\n\\tuniform sampler2D normalMap;\\n\\tuniform vec2 normalScale;\\n#endif\\n#ifdef OBJECTSPACE_NORMALMAP\\n\\tuniform mat3 normalMatrix;\\n#endif\\n#if ! defined ( USE_TANGENT ) && ( defined ( TANGENTSPACE_NORMALMAP ) || defined ( USE_CLEARCOAT_NORMALMAP ) )\\n\\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm, vec3 mapN, float faceDirection ) {\\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 N = surf_norm;\\n\\t\\tvec3 q1perp = cross( q1, N );\\n\\t\\tvec3 q0perp = cross( N, q0 );\\n\\t\\tvec3 T = q1perp * st0.x + q0perp * st1.x;\\n\\t\\tvec3 B = q1perp * st0.y + q0perp * st1.y;\\n\\t\\tfloat det = max( dot( T, T ), dot( B, B ) );\\n\\t\\tfloat scale = ( det == 0.0 ) ? 0.0 : faceDirection * inversesqrt( det );\\n\\t\\treturn normalize( T * ( mapN.x * scale ) + B * ( mapN.y * scale ) + N * mapN.z );\\n\\t}\\n#endif\";\n\nvar clearcoat_normal_fragment_begin = \"#ifdef USE_CLEARCOAT\\n\\tvec3 clearcoatNormal = geometryNormal;\\n#endif\";\n\nvar clearcoat_normal_fragment_maps = \"#ifdef USE_CLEARCOAT_NORMALMAP\\n\\tvec3 clearcoatMapN = texture2D( clearcoatNormalMap, vUv ).xyz * 2.0 - 1.0;\\n\\tclearcoatMapN.xy *= clearcoatNormalScale;\\n\\t#ifdef USE_TANGENT\\n\\t\\tclearcoatNormal = normalize( vTBN * clearcoatMapN );\\n\\t#else\\n\\t\\tclearcoatNormal = perturbNormal2Arb( - vViewPosition, clearcoatNormal, clearcoatMapN, faceDirection );\\n\\t#endif\\n#endif\";\n\nvar clearcoat_pars_fragment = \"#ifdef USE_CLEARCOATMAP\\n\\tuniform sampler2D clearcoatMap;\\n#endif\\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\\n\\tuniform sampler2D clearcoatRoughnessMap;\\n#endif\\n#ifdef USE_CLEARCOAT_NORMALMAP\\n\\tuniform sampler2D clearcoatNormalMap;\\n\\tuniform vec2 clearcoatNormalScale;\\n#endif\";\n\nvar iridescence_pars_fragment = \"#ifdef USE_IRIDESCENCEMAP\\n\\tuniform sampler2D iridescenceMap;\\n#endif\\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\\n\\tuniform sampler2D iridescenceThicknessMap;\\n#endif\";\n\nvar output_fragment = \"#ifdef OPAQUE\\ndiffuseColor.a = 1.0;\\n#endif\\n#ifdef USE_TRANSMISSION\\ndiffuseColor.a *= transmissionAlpha + 0.1;\\n#endif\\ngl_FragColor = vec4( outgoingLight, diffuseColor.a );\";\n\nvar packing = \"vec3 packNormalToRGB( const in vec3 normal ) {\\n\\treturn normalize( normal ) * 0.5 + 0.5;\\n}\\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\\n\\treturn 2.0 * rgb.xyz - 1.0;\\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}\\nvec4 pack2HalfToRGBA( vec2 v ) {\\n\\tvec4 r = vec4( v.x, fract( v.x * 255.0 ), v.y, fract( v.y * 255.0 ) );\\n\\treturn vec4( r.x - r.y / 255.0, r.y, r.z - r.w / 255.0, r.w );\\n}\\nvec2 unpackRGBATo2Half( vec4 v ) {\\n\\treturn vec2( v.x + ( v.y / 255.0 ), v.z + ( v.w / 255.0 ) );\\n}\\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\\n\\treturn ( viewZ + near ) / ( near - far );\\n}\\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\\n\\treturn linearClipZ * ( near - far ) - near;\\n}\\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\\n\\treturn ( ( near + viewZ ) * far ) / ( ( far - near ) * viewZ );\\n}\\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\\n\\treturn ( near * far ) / ( ( far - near ) * invClipZ - far );\\n}\";\n\nvar premultiplied_alpha_fragment = \"#ifdef PREMULTIPLIED_ALPHA\\n\\tgl_FragColor.rgb *= gl_FragColor.a;\\n#endif\";\n\nvar project_vertex = \"vec4 mvPosition = vec4( transformed, 1.0 );\\n#ifdef USE_INSTANCING\\n\\tmvPosition = instanceMatrix * mvPosition;\\n#endif\\nmvPosition = modelViewMatrix * mvPosition;\\ngl_Position = projectionMatrix * mvPosition;\";\n\nvar dithering_fragment = \"#ifdef DITHERING\\n\\tgl_FragColor.rgb = dithering( gl_FragColor.rgb );\\n#endif\";\n\nvar dithering_pars_fragment = \"#ifdef DITHERING\\n\\tvec3 dithering( vec3 color ) {\\n\\t\\tfloat grid_position = rand( gl_FragCoord.xy );\\n\\t\\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\\n\\t\\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\\n\\t\\treturn color + dither_shift_RGB;\\n\\t}\\n#endif\";\n\nvar roughnessmap_fragment = \"float roughnessFactor = roughness;\\n#ifdef USE_ROUGHNESSMAP\\n\\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\\n\\troughnessFactor *= texelRoughness.g;\\n#endif\";\n\nvar roughnessmap_pars_fragment = \"#ifdef USE_ROUGHNESSMAP\\n\\tuniform sampler2D roughnessMap;\\n#endif\";\n\nvar shadowmap_pars_fragment = \"#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0\\n\\t\\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t\\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t\\tstruct DirectionalLightShadow {\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t};\\n\\t\\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHT_SHADOWS > 0\\n\\t\\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\\n\\t\\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHT_SHADOWS ];\\n\\t\\tstruct SpotLightShadow {\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t};\\n\\t\\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\\n\\t#endif\\n\\t#if NUM_POINT_LIGHT_SHADOWS > 0\\n\\t\\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t\\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t\\tstruct PointLightShadow {\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t\\tfloat shadowCameraNear;\\n\\t\\t\\tfloat shadowCameraFar;\\n\\t\\t};\\n\\t\\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t#endif\\n\\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\\n\\t\\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\\n\\t}\\n\\tvec2 texture2DDistribution( sampler2D shadow, vec2 uv ) {\\n\\t\\treturn unpackRGBATo2Half( texture2D( shadow, uv ) );\\n\\t}\\n\\tfloat VSMShadow (sampler2D shadow, vec2 uv, float compare ){\\n\\t\\tfloat occlusion = 1.0;\\n\\t\\tvec2 distribution = texture2DDistribution( shadow, uv );\\n\\t\\tfloat hard_shadow = step( compare , distribution.x );\\n\\t\\tif (hard_shadow != 1.0 ) {\\n\\t\\t\\tfloat distance = compare - distribution.x ;\\n\\t\\t\\tfloat variance = max( 0.00000, distribution.y * distribution.y );\\n\\t\\t\\tfloat softness_probability = variance / (variance + distance * distance );\\t\\t\\tsoftness_probability = clamp( ( softness_probability - 0.3 ) / ( 0.95 - 0.3 ), 0.0, 1.0 );\\t\\t\\tocclusion = clamp( max( hard_shadow, softness_probability ), 0.0, 1.0 );\\n\\t\\t}\\n\\t\\treturn occlusion;\\n\\t}\\n\\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\\n\\t\\tfloat shadow = 1.0;\\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\\tfloat dx2 = dx0 / 2.0;\\n\\t\\t\\tfloat dy2 = dy0 / 2.0;\\n\\t\\t\\tfloat dx3 = dx1 / 2.0;\\n\\t\\t\\tfloat dy3 = dy1 / 2.0;\\n\\t\\t\\tshadow = (\\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( dx2, dy2 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy2 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy2 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, 0.0 ), 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( dx2, dy3 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy3 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy3 ), 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 / 17.0 );\\n\\t\\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\\n\\t\\t\\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\\n\\t\\t\\tfloat dx = texelSize.x;\\n\\t\\t\\tfloat dy = texelSize.y;\\n\\t\\t\\tvec2 uv = shadowCoord.xy;\\n\\t\\t\\tvec2 f = fract( uv * shadowMapSize + 0.5 );\\n\\t\\t\\tuv -= f * texelSize;\\n\\t\\t\\tshadow = (\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, uv, shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, uv + vec2( dx, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, uv + vec2( 0.0, dy ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, uv + texelSize, shadowCoord.z ) +\\n\\t\\t\\t\\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, 0.0 ), shadowCoord.z ), \\n\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 0.0 ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t f.x ) +\\n\\t\\t\\t\\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, dy ), shadowCoord.z ), \\n\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t f.x ) +\\n\\t\\t\\t\\tmix( texture2DCompare( shadowMap, uv + vec2( 0.0, -dy ), shadowCoord.z ), \\n\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( 0.0, 2.0 * dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t f.y ) +\\n\\t\\t\\t\\tmix( texture2DCompare( shadowMap, uv + vec2( dx, -dy ), shadowCoord.z ), \\n\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( dx, 2.0 * dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t f.y ) +\\n\\t\\t\\t\\tmix( mix( texture2DCompare( shadowMap, uv + vec2( -dx, -dy ), shadowCoord.z ), \\n\\t\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, -dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t\\t f.x ),\\n\\t\\t\\t\\t\\t mix( texture2DCompare( shadowMap, uv + vec2( -dx, 2.0 * dy ), shadowCoord.z ), \\n\\t\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 2.0 * dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t\\t f.x ),\\n\\t\\t\\t\\t\\t f.y )\\n\\t\\t\\t) * ( 1.0 / 9.0 );\\n\\t\\t#elif defined( SHADOWMAP_TYPE_VSM )\\n\\t\\t\\tshadow = VSMShadow( shadowMap, shadowCoord.xy, shadowCoord.z );\\n\\t\\t#else\\n\\t\\t\\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\\n\\t\\t#endif\\n\\t\\t}\\n\\t\\treturn shadow;\\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, float shadowCameraNear, float shadowCameraFar ) {\\n\\t\\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\\n\\t\\tvec3 lightToPosition = shadowCoord.xyz;\\n\\t\\tfloat dp = ( length( lightToPosition ) - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\\t\\tdp += shadowBias;\\n\\t\\tvec3 bd3D = normalize( lightToPosition );\\n\\t\\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT ) || defined( SHADOWMAP_TYPE_VSM )\\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\nvar shadowmap_pars_vertex = \"#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0\\n\\t\\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t\\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t\\tstruct DirectionalLightShadow {\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t};\\n\\t\\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHT_SHADOWS > 0\\n\\t\\tuniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHT_SHADOWS ];\\n\\t\\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHT_SHADOWS ];\\n\\t\\tstruct SpotLightShadow {\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t};\\n\\t\\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\\n\\t#endif\\n\\t#if NUM_POINT_LIGHT_SHADOWS > 0\\n\\t\\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t\\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t\\tstruct PointLightShadow {\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t\\tfloat shadowCameraNear;\\n\\t\\t\\tfloat shadowCameraFar;\\n\\t\\t};\\n\\t\\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t#endif\\n#endif\";\n\nvar shadowmap_vertex = \"#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0 || NUM_SPOT_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0\\n\\t\\tvec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\\n\\t\\tvec4 shadowWorldPosition;\\n\\t#endif\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\\n\\t\\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * directionalLightShadows[ i ].shadowNormalBias, 0 );\\n\\t\\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * shadowWorldPosition;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHT_SHADOWS > 0\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\\n\\t\\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * spotLightShadows[ i ].shadowNormalBias, 0 );\\n\\t\\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * shadowWorldPosition;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#if NUM_POINT_LIGHT_SHADOWS > 0\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\\n\\t\\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * pointLightShadows[ i ].shadowNormalBias, 0 );\\n\\t\\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * shadowWorldPosition;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#endif\\n#endif\";\n\nvar shadowmask_pars_fragment = \"float getShadowMask() {\\n\\tfloat shadow = 1.0;\\n\\t#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0\\n\\tDirectionalLightShadow directionalLight;\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\\n\\t\\tdirectionalLight = directionalLightShadows[ i ];\\n\\t\\tshadow *= receiveShadow ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHT_SHADOWS > 0\\n\\tSpotLightShadow spotLight;\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\\n\\t\\tspotLight = spotLightShadows[ i ];\\n\\t\\tshadow *= receiveShadow ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#if NUM_POINT_LIGHT_SHADOWS > 0\\n\\tPointLightShadow pointLight;\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\\n\\t\\tpointLight = pointLightShadows[ i ];\\n\\t\\tshadow *= receiveShadow ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#endif\\n\\treturn shadow;\\n}\";\n\nvar 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\nvar skinning_pars_vertex = \"#ifdef USE_SKINNING\\n\\tuniform mat4 bindMatrix;\\n\\tuniform mat4 bindMatrixInverse;\\n\\tuniform highp sampler2D boneTexture;\\n\\tuniform int boneTextureSize;\\n\\tmat4 getBoneMatrix( const in float i ) {\\n\\t\\tfloat j = i * 4.0;\\n\\t\\tfloat x = mod( j, float( boneTextureSize ) );\\n\\t\\tfloat y = floor( j / float( boneTextureSize ) );\\n\\t\\tfloat dx = 1.0 / float( boneTextureSize );\\n\\t\\tfloat dy = 1.0 / float( boneTextureSize );\\n\\t\\ty = dy * ( y + 0.5 );\\n\\t\\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\\n\\t\\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\\n\\t\\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\\n\\t\\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\\n\\t\\tmat4 bone = mat4( v1, v2, v3, v4 );\\n\\t\\treturn bone;\\n\\t}\\n#endif\";\n\nvar 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\\ttransformed = ( bindMatrixInverse * skinned ).xyz;\\n#endif\";\n\nvar 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\\t#ifdef USE_TANGENT\\n\\t\\tobjectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz;\\n\\t#endif\\n#endif\";\n\nvar 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\nvar specularmap_pars_fragment = \"#ifdef USE_SPECULARMAP\\n\\tuniform sampler2D specularMap;\\n#endif\";\n\nvar tonemapping_fragment = \"#if defined( TONE_MAPPING )\\n\\tgl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\\n#endif\";\n\nvar tonemapping_pars_fragment = \"#ifndef saturate\\n#define saturate( a ) clamp( a, 0.0, 1.0 )\\n#endif\\nuniform float toneMappingExposure;\\nvec3 LinearToneMapping( vec3 color ) {\\n\\treturn toneMappingExposure * color;\\n}\\nvec3 ReinhardToneMapping( vec3 color ) {\\n\\tcolor *= toneMappingExposure;\\n\\treturn saturate( color / ( vec3( 1.0 ) + color ) );\\n}\\nvec3 OptimizedCineonToneMapping( vec3 color ) {\\n\\tcolor *= toneMappingExposure;\\n\\tcolor = max( vec3( 0.0 ), color - 0.004 );\\n\\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\\n}\\nvec3 RRTAndODTFit( vec3 v ) {\\n\\tvec3 a = v * ( v + 0.0245786 ) - 0.000090537;\\n\\tvec3 b = v * ( 0.983729 * v + 0.4329510 ) + 0.238081;\\n\\treturn a / b;\\n}\\nvec3 ACESFilmicToneMapping( vec3 color ) {\\n\\tconst mat3 ACESInputMat = mat3(\\n\\t\\tvec3( 0.59719, 0.07600, 0.02840 ),\\t\\tvec3( 0.35458, 0.90834, 0.13383 ),\\n\\t\\tvec3( 0.04823, 0.01566, 0.83777 )\\n\\t);\\n\\tconst mat3 ACESOutputMat = mat3(\\n\\t\\tvec3( 1.60475, -0.10208, -0.00327 ),\\t\\tvec3( -0.53108, 1.10813, -0.07276 ),\\n\\t\\tvec3( -0.07367, -0.00605, 1.07602 )\\n\\t);\\n\\tcolor *= toneMappingExposure / 0.6;\\n\\tcolor = ACESInputMat * color;\\n\\tcolor = RRTAndODTFit( color );\\n\\tcolor = ACESOutputMat * color;\\n\\treturn saturate( color );\\n}\\nvec3 CustomToneMapping( vec3 color ) { return color; }\";\n\nvar transmission_fragment = \"#ifdef USE_TRANSMISSION\\n\\tfloat transmissionAlpha = 1.0;\\n\\tfloat transmissionFactor = transmission;\\n\\tfloat thicknessFactor = thickness;\\n\\t#ifdef USE_TRANSMISSIONMAP\\n\\t\\ttransmissionFactor *= texture2D( transmissionMap, vUv ).r;\\n\\t#endif\\n\\t#ifdef USE_THICKNESSMAP\\n\\t\\tthicknessFactor *= texture2D( thicknessMap, vUv ).g;\\n\\t#endif\\n\\tvec3 pos = vWorldPosition;\\n\\tvec3 v = normalize( cameraPosition - pos );\\n\\tvec3 n = inverseTransformDirection( normal, viewMatrix );\\n\\tvec4 transmission = getIBLVolumeRefraction(\\n\\t\\tn, v, roughnessFactor, material.diffuseColor, material.specularColor, material.specularF90,\\n\\t\\tpos, modelMatrix, viewMatrix, projectionMatrix, ior, thicknessFactor,\\n\\t\\tattenuationColor, attenuationDistance );\\n\\ttotalDiffuse = mix( totalDiffuse, transmission.rgb, transmissionFactor );\\n\\ttransmissionAlpha = mix( transmissionAlpha, transmission.a, transmissionFactor );\\n#endif\";\n\nvar transmission_pars_fragment = \"#ifdef USE_TRANSMISSION\\n\\tuniform float transmission;\\n\\tuniform float thickness;\\n\\tuniform float attenuationDistance;\\n\\tuniform vec3 attenuationColor;\\n\\t#ifdef USE_TRANSMISSIONMAP\\n\\t\\tuniform sampler2D transmissionMap;\\n\\t#endif\\n\\t#ifdef USE_THICKNESSMAP\\n\\t\\tuniform sampler2D thicknessMap;\\n\\t#endif\\n\\tuniform vec2 transmissionSamplerSize;\\n\\tuniform sampler2D transmissionSamplerMap;\\n\\tuniform mat4 modelMatrix;\\n\\tuniform mat4 projectionMatrix;\\n\\tvarying vec3 vWorldPosition;\\n\\tvec3 getVolumeTransmissionRay( const in vec3 n, const in vec3 v, const in float thickness, const in float ior, const in mat4 modelMatrix ) {\\n\\t\\tvec3 refractionVector = refract( - v, normalize( n ), 1.0 / ior );\\n\\t\\tvec3 modelScale;\\n\\t\\tmodelScale.x = length( vec3( modelMatrix[ 0 ].xyz ) );\\n\\t\\tmodelScale.y = length( vec3( modelMatrix[ 1 ].xyz ) );\\n\\t\\tmodelScale.z = length( vec3( modelMatrix[ 2 ].xyz ) );\\n\\t\\treturn normalize( refractionVector ) * thickness * modelScale;\\n\\t}\\n\\tfloat applyIorToRoughness( const in float roughness, const in float ior ) {\\n\\t\\treturn roughness * clamp( ior * 2.0 - 2.0, 0.0, 1.0 );\\n\\t}\\n\\tvec4 getTransmissionSample( const in vec2 fragCoord, const in float roughness, const in float ior ) {\\n\\t\\tfloat framebufferLod = log2( transmissionSamplerSize.x ) * applyIorToRoughness( roughness, ior );\\n\\t\\t#ifdef texture2DLodEXT\\n\\t\\t\\treturn texture2DLodEXT( transmissionSamplerMap, fragCoord.xy, framebufferLod );\\n\\t\\t#else\\n\\t\\t\\treturn texture2D( transmissionSamplerMap, fragCoord.xy, framebufferLod );\\n\\t\\t#endif\\n\\t}\\n\\tvec3 applyVolumeAttenuation( const in vec3 radiance, const in float transmissionDistance, const in vec3 attenuationColor, const in float attenuationDistance ) {\\n\\t\\tif ( attenuationDistance == 0.0 ) {\\n\\t\\t\\treturn radiance;\\n\\t\\t} else {\\n\\t\\t\\tvec3 attenuationCoefficient = -log( attenuationColor ) / attenuationDistance;\\n\\t\\t\\tvec3 transmittance = exp( - attenuationCoefficient * transmissionDistance );\\t\\t\\treturn transmittance * radiance;\\n\\t\\t}\\n\\t}\\n\\tvec4 getIBLVolumeRefraction( const in vec3 n, const in vec3 v, const in float roughness, const in vec3 diffuseColor,\\n\\t\\tconst in vec3 specularColor, const in float specularF90, const in vec3 position, const in mat4 modelMatrix,\\n\\t\\tconst in mat4 viewMatrix, const in mat4 projMatrix, const in float ior, const in float thickness,\\n\\t\\tconst in vec3 attenuationColor, const in float attenuationDistance ) {\\n\\t\\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, ior, modelMatrix );\\n\\t\\tvec3 refractedRayExit = position + transmissionRay;\\n\\t\\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\\n\\t\\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\\n\\t\\trefractionCoords += 1.0;\\n\\t\\trefractionCoords /= 2.0;\\n\\t\\tvec4 transmittedLight = getTransmissionSample( refractionCoords, roughness, ior );\\n\\t\\tvec3 attenuatedColor = applyVolumeAttenuation( transmittedLight.rgb, length( transmissionRay ), attenuationColor, attenuationDistance );\\n\\t\\tvec3 F = EnvironmentBRDF( n, v, specularColor, specularF90, roughness );\\n\\t\\treturn vec4( ( 1.0 - F ) * attenuatedColor * diffuseColor, transmittedLight.a );\\n\\t}\\n#endif\";\n\nvar uv_pars_fragment = \"#if ( defined( USE_UV ) && ! defined( UVS_VERTEX_ONLY ) )\\n\\tvarying vec2 vUv;\\n#endif\";\n\nvar uv_pars_vertex = \"#ifdef USE_UV\\n\\t#ifdef UVS_VERTEX_ONLY\\n\\t\\tvec2 vUv;\\n\\t#else\\n\\t\\tvarying vec2 vUv;\\n\\t#endif\\n\\tuniform mat3 uvTransform;\\n#endif\";\n\nvar uv_vertex = \"#ifdef USE_UV\\n\\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\\n#endif\";\n\nvar uv2_pars_fragment = \"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\\n\\tvarying vec2 vUv2;\\n#endif\";\n\nvar uv2_pars_vertex = \"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\\n\\tattribute vec2 uv2;\\n\\tvarying vec2 vUv2;\\n\\tuniform mat3 uv2Transform;\\n#endif\";\n\nvar uv2_vertex = \"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\\n\\tvUv2 = ( uv2Transform * vec3( uv2, 1 ) ).xy;\\n#endif\";\n\nvar worldpos_vertex = \"#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP ) || defined ( USE_TRANSMISSION )\\n\\tvec4 worldPosition = vec4( transformed, 1.0 );\\n\\t#ifdef USE_INSTANCING\\n\\t\\tworldPosition = instanceMatrix * worldPosition;\\n\\t#endif\\n\\tworldPosition = modelMatrix * worldPosition;\\n#endif\";\n\nconst vertex$g = \"varying vec2 vUv;\\nuniform mat3 uvTransform;\\nvoid main() {\\n\\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\\n\\tgl_Position = vec4( position.xy, 1.0, 1.0 );\\n}\";\n\nconst fragment$g = \"uniform sampler2D t2D;\\nvarying vec2 vUv;\\nvoid main() {\\n\\tgl_FragColor = texture2D( t2D, vUv );\\n\\t#ifdef DECODE_VIDEO_TEXTURE\\n\\t\\tgl_FragColor = vec4( mix( pow( gl_FragColor.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), gl_FragColor.rgb * 0.0773993808, vec3( lessThanEqual( gl_FragColor.rgb, vec3( 0.04045 ) ) ) ), gl_FragColor.w );\\n\\t#endif\\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$f = \"varying vec3 vWorldDirection;\\n#include \\nvoid main() {\\n\\tvWorldDirection = transformDirection( position, modelMatrix );\\n\\t#include \\n\\t#include \\n\\tgl_Position.z = gl_Position.w;\\n}\";\n\nconst fragment$f = \"#include \\nuniform float opacity;\\nvarying vec3 vWorldDirection;\\n#include \\nvoid main() {\\n\\tvec3 vReflect = vWorldDirection;\\n\\t#include \\n\\tgl_FragColor = envColor;\\n\\tgl_FragColor.a *= opacity;\\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$e = \"#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvarying vec2 vHighPrecisionZW;\\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#ifdef USE_DISPLACEMENTMAP\\n\\t\\t#include \\n\\t\\t#include \\n\\t\\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\\tvHighPrecisionZW = gl_Position.zw;\\n}\";\n\nconst fragment$e = \"#if DEPTH_PACKING == 3200\\n\\tuniform float opacity;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvarying vec2 vHighPrecisionZW;\\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\\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5;\\n\\t#if DEPTH_PACKING == 3200\\n\\t\\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );\\n\\t#elif DEPTH_PACKING == 3201\\n\\t\\tgl_FragColor = packDepthToRGBA( fragCoordZ );\\n\\t#endif\\n}\";\n\nconst vertex$d = \"#define DISTANCE\\nvarying vec3 vWorldPosition;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#ifdef USE_DISPLACEMENTMAP\\n\\t\\t#include \\n\\t\\t#include \\n\\t\\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\\tvWorldPosition = worldPosition.xyz;\\n}\";\n\nconst fragment$d = \"#define DISTANCE\\nuniform vec3 referencePosition;\\nuniform float nearDistance;\\nuniform float farDistance;\\nvarying vec3 vWorldPosition;\\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#include \\n\\t#include \\n\\t#include \\n\\tfloat dist = length( vWorldPosition - referencePosition );\\n\\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\\n\\tdist = saturate( dist );\\n\\tgl_FragColor = packDepthToRGBA( dist );\\n}\";\n\nconst vertex$c = \"varying vec3 vWorldDirection;\\n#include \\nvoid main() {\\n\\tvWorldDirection = transformDirection( position, modelMatrix );\\n\\t#include \\n\\t#include \\n}\";\n\nconst fragment$c = \"uniform sampler2D tEquirect;\\nvarying vec3 vWorldDirection;\\n#include \\nvoid main() {\\n\\tvec3 direction = normalize( vWorldDirection );\\n\\tvec2 sampleUV = equirectUv( direction );\\n\\tgl_FragColor = texture2D( tEquirect, sampleUV );\\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$b = \"uniform float scale;\\nattribute float lineDistance;\\nvarying float vLineDistance;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tvLineDistance = scale * lineDistance;\\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\nconst fragment$b = \"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\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$a = \"#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#if defined ( USE_ENVMAP ) || defined ( USE_SKINNING )\\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t\\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\\t#include \\n}\";\n\nconst fragment$a = \"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 \\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 = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\t#ifdef USE_LIGHTMAP\\n\\t\\tvec4 lightMapTexel = texture2D( lightMap, vUv2 );\\n\\t\\treflectedLight.indirectDiffuse += lightMapTexel.rgb * lightMapIntensity * RECIPROCAL_PI;\\n\\t#else\\n\\t\\treflectedLight.indirectDiffuse += vec3( 1.0 );\\n\\t#endif\\n\\t#include \\n\\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\\n\\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$9 = \"#define LAMBERT\\nvarying vec3 vLightFront;\\nvarying vec3 vIndirectFront;\\n#ifdef DOUBLE_SIDED\\n\\tvarying vec3 vLightBack;\\n\\tvarying vec3 vIndirectBack;\\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 \\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\\t#include \\n\\t#include \\n}\";\n\nconst fragment$9 = \"uniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float opacity;\\nvarying vec3 vLightFront;\\nvarying vec3 vIndirectFront;\\n#ifdef DOUBLE_SIDED\\n\\tvarying vec3 vLightBack;\\n\\tvarying vec3 vIndirectBack;\\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#ifdef DOUBLE_SIDED\\n\\t\\treflectedLight.indirectDiffuse += ( gl_FrontFacing ) ? vIndirectFront : vIndirectBack;\\n\\t#else\\n\\t\\treflectedLight.indirectDiffuse += vIndirectFront;\\n\\t#endif\\n\\t#include \\n\\treflectedLight.indirectDiffuse *= BRDF_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_Lambert( diffuseColor.rgb ) * getShadowMask();\\n\\t#include \\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$8 = \"#define MATCAP\\nvarying vec3 vViewPosition;\\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\\tvViewPosition = - mvPosition.xyz;\\n}\";\n\nconst fragment$8 = \"#define MATCAP\\nuniform vec3 diffuse;\\nuniform float opacity;\\nuniform sampler2D matcap;\\nvarying vec3 vViewPosition;\\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\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvec3 viewDir = normalize( vViewPosition );\\n\\tvec3 x = normalize( vec3( viewDir.z, 0.0, - viewDir.x ) );\\n\\tvec3 y = cross( viewDir, x );\\n\\tvec2 uv = vec2( dot( x, normal ), dot( y, normal ) ) * 0.495 + 0.5;\\n\\t#ifdef USE_MATCAP\\n\\t\\tvec4 matcapColor = texture2D( matcap, uv );\\n\\t#else\\n\\t\\tvec4 matcapColor = vec4( vec3( mix( 0.2, 0.8, uv.y ) ), 1.0 );\\n\\t#endif\\n\\tvec3 outgoingLight = diffuseColor.rgb * matcapColor.rgb;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$7 = \"#define NORMAL\\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\\n\\tvarying vec3 vViewPosition;\\n#endif\\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#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\\n\\tvViewPosition = - mvPosition.xyz;\\n#endif\\n}\";\n\nconst fragment$7 = \"#define NORMAL\\nuniform float opacity;\\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\\n\\tvarying vec3 vViewPosition;\\n#endif\\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\\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\\n\\t#ifdef OPAQUE\\n\\t\\tgl_FragColor.a = 1.0;\\n\\t#endif\\n}\";\n\nconst vertex$6 = \"#define PHONG\\nvarying vec3 vViewPosition;\\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\\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\\tvViewPosition = - mvPosition.xyz;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst fragment$6 = \"#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 \\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\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$5 = \"#define STANDARD\\nvarying vec3 vViewPosition;\\n#ifdef USE_TRANSMISSION\\n\\tvarying vec3 vWorldPosition;\\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\\tvViewPosition = - mvPosition.xyz;\\n\\t#include \\n\\t#include \\n\\t#include \\n#ifdef USE_TRANSMISSION\\n\\tvWorldPosition = worldPosition.xyz;\\n#endif\\n}\";\n\nconst fragment$5 = \"#define STANDARD\\n#ifdef PHYSICAL\\n\\t#define IOR\\n\\t#define SPECULAR\\n#endif\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float roughness;\\nuniform float metalness;\\nuniform float opacity;\\n#ifdef IOR\\n\\tuniform float ior;\\n#endif\\n#ifdef SPECULAR\\n\\tuniform float specularIntensity;\\n\\tuniform vec3 specularColor;\\n\\t#ifdef USE_SPECULARINTENSITYMAP\\n\\t\\tuniform sampler2D specularIntensityMap;\\n\\t#endif\\n\\t#ifdef USE_SPECULARCOLORMAP\\n\\t\\tuniform sampler2D specularColorMap;\\n\\t#endif\\n#endif\\n#ifdef USE_CLEARCOAT\\n\\tuniform float clearcoat;\\n\\tuniform float clearcoatRoughness;\\n#endif\\n#ifdef USE_IRIDESCENCE\\n\\tuniform float iridescence;\\n\\tuniform float iridescenceIOR;\\n\\tuniform float iridescenceThicknessMinimum;\\n\\tuniform float iridescenceThicknessMaximum;\\n#endif\\n#ifdef USE_SHEEN\\n\\tuniform vec3 sheenColor;\\n\\tuniform float sheenRoughness;\\n\\t#ifdef USE_SHEENCOLORMAP\\n\\t\\tuniform sampler2D sheenColorMap;\\n\\t#endif\\n\\t#ifdef USE_SHEENROUGHNESSMAP\\n\\t\\tuniform sampler2D sheenRoughnessMap;\\n\\t#endif\\n#endif\\nvarying vec3 vViewPosition;\\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 \\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\\t#include \\n\\t#include \\n\\t#include \\n\\tvec3 totalDiffuse = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse;\\n\\tvec3 totalSpecular = reflectedLight.directSpecular + reflectedLight.indirectSpecular;\\n\\t#include \\n\\tvec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;\\n\\t#ifdef USE_SHEEN\\n\\t\\tfloat sheenEnergyComp = 1.0 - 0.157 * max3( material.sheenColor );\\n\\t\\toutgoingLight = outgoingLight * sheenEnergyComp + sheenSpecular;\\n\\t#endif\\n\\t#ifdef USE_CLEARCOAT\\n\\t\\tfloat dotNVcc = saturate( dot( geometry.clearcoatNormal, geometry.viewDir ) );\\n\\t\\tvec3 Fcc = F_Schlick( material.clearcoatF0, material.clearcoatF90, dotNVcc );\\n\\t\\toutgoingLight = outgoingLight * ( 1.0 - material.clearcoat * Fcc ) + clearcoatSpecular * material.clearcoat;\\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$4 = \"#define TOON\\nvarying vec3 vViewPosition;\\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\\tvViewPosition = - mvPosition.xyz;\\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst fragment$4 = \"#define TOON\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\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 \\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\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$3 = \"uniform float size;\\nuniform float scale;\\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\\tgl_PointSize = size;\\n\\t#ifdef USE_SIZEATTENUATION\\n\\t\\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\\n\\t\\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst fragment$3 = \"uniform vec3 diffuse;\\nuniform float opacity;\\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\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$2 = \"#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}\";\n\nconst fragment$2 = \"uniform vec3 color;\\nuniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$1 = \"uniform float rotation;\\nuniform vec2 center;\\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 mvPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\\n\\tvec2 scale;\\n\\tscale.x = length( vec3( modelMatrix[ 0 ].x, modelMatrix[ 0 ].y, modelMatrix[ 0 ].z ) );\\n\\tscale.y = length( vec3( modelMatrix[ 1 ].x, modelMatrix[ 1 ].y, modelMatrix[ 1 ].z ) );\\n\\t#ifndef USE_SIZEATTENUATION\\n\\t\\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\\n\\t\\tif ( isPerspective ) scale *= - mvPosition.z;\\n\\t#endif\\n\\tvec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale;\\n\\tvec2 rotatedPosition;\\n\\trotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\\n\\trotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\\n\\tmvPosition.xy += rotatedPosition;\\n\\tgl_Position = projectionMatrix * mvPosition;\\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst fragment$1 = \"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\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst ShaderChunk = {\n\talphamap_fragment: alphamap_fragment,\n\talphamap_pars_fragment: alphamap_pars_fragment,\n\talphatest_fragment: alphatest_fragment,\n\talphatest_pars_fragment: alphatest_pars_fragment,\n\taomap_fragment: aomap_fragment,\n\taomap_pars_fragment: aomap_pars_fragment,\n\tbegin_vertex: begin_vertex,\n\tbeginnormal_vertex: beginnormal_vertex,\n\tbsdfs: bsdfs,\n\tiridescence_fragment: iridescence_fragment,\n\tbumpmap_pars_fragment: bumpmap_pars_fragment,\n\tclipping_planes_fragment: clipping_planes_fragment,\n\tclipping_planes_pars_fragment: clipping_planes_pars_fragment,\n\tclipping_planes_pars_vertex: clipping_planes_pars_vertex,\n\tclipping_planes_vertex: clipping_planes_vertex,\n\tcolor_fragment: color_fragment,\n\tcolor_pars_fragment: color_pars_fragment,\n\tcolor_pars_vertex: color_pars_vertex,\n\tcolor_vertex: color_vertex,\n\tcommon: common,\n\tcube_uv_reflection_fragment: cube_uv_reflection_fragment,\n\tdefaultnormal_vertex: defaultnormal_vertex,\n\tdisplacementmap_pars_vertex: displacementmap_pars_vertex,\n\tdisplacementmap_vertex: displacementmap_vertex,\n\temissivemap_fragment: emissivemap_fragment,\n\temissivemap_pars_fragment: emissivemap_pars_fragment,\n\tencodings_fragment: encodings_fragment,\n\tencodings_pars_fragment: encodings_pars_fragment,\n\tenvmap_fragment: envmap_fragment,\n\tenvmap_common_pars_fragment: envmap_common_pars_fragment,\n\tenvmap_pars_fragment: envmap_pars_fragment,\n\tenvmap_pars_vertex: envmap_pars_vertex,\n\tenvmap_physical_pars_fragment: envmap_physical_pars_fragment,\n\tenvmap_vertex: envmap_vertex,\n\tfog_vertex: fog_vertex,\n\tfog_pars_vertex: fog_pars_vertex,\n\tfog_fragment: fog_fragment,\n\tfog_pars_fragment: fog_pars_fragment,\n\tgradientmap_pars_fragment: gradientmap_pars_fragment,\n\tlightmap_fragment: lightmap_fragment,\n\tlightmap_pars_fragment: lightmap_pars_fragment,\n\tlights_lambert_vertex: lights_lambert_vertex,\n\tlights_pars_begin: lights_pars_begin,\n\tlights_toon_fragment: lights_toon_fragment,\n\tlights_toon_pars_fragment: lights_toon_pars_fragment,\n\tlights_phong_fragment: lights_phong_fragment,\n\tlights_phong_pars_fragment: lights_phong_pars_fragment,\n\tlights_physical_fragment: lights_physical_fragment,\n\tlights_physical_pars_fragment: lights_physical_pars_fragment,\n\tlights_fragment_begin: lights_fragment_begin,\n\tlights_fragment_maps: lights_fragment_maps,\n\tlights_fragment_end: lights_fragment_end,\n\tlogdepthbuf_fragment: logdepthbuf_fragment,\n\tlogdepthbuf_pars_fragment: logdepthbuf_pars_fragment,\n\tlogdepthbuf_pars_vertex: logdepthbuf_pars_vertex,\n\tlogdepthbuf_vertex: logdepthbuf_vertex,\n\tmap_fragment: map_fragment,\n\tmap_pars_fragment: map_pars_fragment,\n\tmap_particle_fragment: map_particle_fragment,\n\tmap_particle_pars_fragment: map_particle_pars_fragment,\n\tmetalnessmap_fragment: metalnessmap_fragment,\n\tmetalnessmap_pars_fragment: metalnessmap_pars_fragment,\n\tmorphcolor_vertex: morphcolor_vertex,\n\tmorphnormal_vertex: morphnormal_vertex,\n\tmorphtarget_pars_vertex: morphtarget_pars_vertex,\n\tmorphtarget_vertex: morphtarget_vertex,\n\tnormal_fragment_begin: normal_fragment_begin,\n\tnormal_fragment_maps: normal_fragment_maps,\n\tnormal_pars_fragment: normal_pars_fragment,\n\tnormal_pars_vertex: normal_pars_vertex,\n\tnormal_vertex: normal_vertex,\n\tnormalmap_pars_fragment: normalmap_pars_fragment,\n\tclearcoat_normal_fragment_begin: clearcoat_normal_fragment_begin,\n\tclearcoat_normal_fragment_maps: clearcoat_normal_fragment_maps,\n\tclearcoat_pars_fragment: clearcoat_pars_fragment,\n\tiridescence_pars_fragment: iridescence_pars_fragment,\n\toutput_fragment: output_fragment,\n\tpacking: packing,\n\tpremultiplied_alpha_fragment: premultiplied_alpha_fragment,\n\tproject_vertex: project_vertex,\n\tdithering_fragment: dithering_fragment,\n\tdithering_pars_fragment: dithering_pars_fragment,\n\troughnessmap_fragment: roughnessmap_fragment,\n\troughnessmap_pars_fragment: roughnessmap_pars_fragment,\n\tshadowmap_pars_fragment: shadowmap_pars_fragment,\n\tshadowmap_pars_vertex: shadowmap_pars_vertex,\n\tshadowmap_vertex: shadowmap_vertex,\n\tshadowmask_pars_fragment: shadowmask_pars_fragment,\n\tskinbase_vertex: skinbase_vertex,\n\tskinning_pars_vertex: skinning_pars_vertex,\n\tskinning_vertex: skinning_vertex,\n\tskinnormal_vertex: skinnormal_vertex,\n\tspecularmap_fragment: specularmap_fragment,\n\tspecularmap_pars_fragment: specularmap_pars_fragment,\n\ttonemapping_fragment: tonemapping_fragment,\n\ttonemapping_pars_fragment: tonemapping_pars_fragment,\n\ttransmission_fragment: transmission_fragment,\n\ttransmission_pars_fragment: transmission_pars_fragment,\n\tuv_pars_fragment: uv_pars_fragment,\n\tuv_pars_vertex: uv_pars_vertex,\n\tuv_vertex: uv_vertex,\n\tuv2_pars_fragment: uv2_pars_fragment,\n\tuv2_pars_vertex: uv2_pars_vertex,\n\tuv2_vertex: uv2_vertex,\n\tworldpos_vertex: worldpos_vertex,\n\n\tbackground_vert: vertex$g,\n\tbackground_frag: fragment$g,\n\tcube_vert: vertex$f,\n\tcube_frag: fragment$f,\n\tdepth_vert: vertex$e,\n\tdepth_frag: fragment$e,\n\tdistanceRGBA_vert: vertex$d,\n\tdistanceRGBA_frag: fragment$d,\n\tequirect_vert: vertex$c,\n\tequirect_frag: fragment$c,\n\tlinedashed_vert: vertex$b,\n\tlinedashed_frag: fragment$b,\n\tmeshbasic_vert: vertex$a,\n\tmeshbasic_frag: fragment$a,\n\tmeshlambert_vert: vertex$9,\n\tmeshlambert_frag: fragment$9,\n\tmeshmatcap_vert: vertex$8,\n\tmeshmatcap_frag: fragment$8,\n\tmeshnormal_vert: vertex$7,\n\tmeshnormal_frag: fragment$7,\n\tmeshphong_vert: vertex$6,\n\tmeshphong_frag: fragment$6,\n\tmeshphysical_vert: vertex$5,\n\tmeshphysical_frag: fragment$5,\n\tmeshtoon_vert: vertex$4,\n\tmeshtoon_frag: fragment$4,\n\tpoints_vert: vertex$3,\n\tpoints_frag: fragment$3,\n\tshadow_vert: vertex$2,\n\tshadow_frag: fragment$2,\n\tsprite_vert: vertex$1,\n\tsprite_frag: fragment$1\n};\n\n/**\n * Uniforms library for shared webgl shaders\n */\n\nconst UniformsLib = {\n\n\tcommon: {\n\n\t\tdiffuse: { value: /*@__PURE__*/ new Color( 0xffffff ) },\n\t\topacity: { value: 1.0 },\n\n\t\tmap: { value: null },\n\t\tuvTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\tuv2Transform: { value: /*@__PURE__*/ new Matrix3() },\n\n\t\talphaMap: { value: null },\n\t\talphaTest: { value: 0 }\n\n\t},\n\n\tspecularmap: {\n\n\t\tspecularMap: { value: null },\n\n\t},\n\n\tenvmap: {\n\n\t\tenvMap: { value: null },\n\t\tflipEnvMap: { value: - 1 },\n\t\treflectivity: { value: 1.0 }, // basic, lambert, phong\n\t\tior: { value: 1.5 }, // physical\n\t\trefractionRatio: { value: 0.98 } // basic, lambert, phong\n\n\t},\n\n\taomap: {\n\n\t\taoMap: { value: null },\n\t\taoMapIntensity: { value: 1 }\n\n\t},\n\n\tlightmap: {\n\n\t\tlightMap: { value: null },\n\t\tlightMapIntensity: { value: 1 }\n\n\t},\n\n\temissivemap: {\n\n\t\temissiveMap: { value: null }\n\n\t},\n\n\tbumpmap: {\n\n\t\tbumpMap: { value: null },\n\t\tbumpScale: { value: 1 }\n\n\t},\n\n\tnormalmap: {\n\n\t\tnormalMap: { value: null },\n\t\tnormalScale: { value: /*@__PURE__*/ new Vector2( 1, 1 ) }\n\n\t},\n\n\tdisplacementmap: {\n\n\t\tdisplacementMap: { value: null },\n\t\tdisplacementScale: { value: 1 },\n\t\tdisplacementBias: { value: 0 }\n\n\t},\n\n\troughnessmap: {\n\n\t\troughnessMap: { value: null }\n\n\t},\n\n\tmetalnessmap: {\n\n\t\tmetalnessMap: { value: null }\n\n\t},\n\n\tgradientmap: {\n\n\t\tgradientMap: { value: null }\n\n\t},\n\n\tfog: {\n\n\t\tfogDensity: { value: 0.00025 },\n\t\tfogNear: { value: 1 },\n\t\tfogFar: { value: 2000 },\n\t\tfogColor: { value: /*@__PURE__*/ new Color( 0xffffff ) }\n\n\t},\n\n\tlights: {\n\n\t\tambientLightColor: { value: [] },\n\n\t\tlightProbe: { value: [] },\n\n\t\tdirectionalLights: { value: [], properties: {\n\t\t\tdirection: {},\n\t\t\tcolor: {}\n\t\t} },\n\n\t\tdirectionalLightShadows: { value: [], properties: {\n\t\t\tshadowBias: {},\n\t\t\tshadowNormalBias: {},\n\t\t\tshadowRadius: {},\n\t\t\tshadowMapSize: {}\n\t\t} },\n\n\t\tdirectionalShadowMap: { value: [] },\n\t\tdirectionalShadowMatrix: { value: [] },\n\n\t\tspotLights: { value: [], properties: {\n\t\t\tcolor: {},\n\t\t\tposition: {},\n\t\t\tdirection: {},\n\t\t\tdistance: {},\n\t\t\tconeCos: {},\n\t\t\tpenumbraCos: {},\n\t\t\tdecay: {}\n\t\t} },\n\n\t\tspotLightShadows: { value: [], properties: {\n\t\t\tshadowBias: {},\n\t\t\tshadowNormalBias: {},\n\t\t\tshadowRadius: {},\n\t\t\tshadowMapSize: {}\n\t\t} },\n\n\t\tspotShadowMap: { value: [] },\n\t\tspotShadowMatrix: { value: [] },\n\n\t\tpointLights: { value: [], properties: {\n\t\t\tcolor: {},\n\t\t\tposition: {},\n\t\t\tdecay: {},\n\t\t\tdistance: {}\n\t\t} },\n\n\t\tpointLightShadows: { value: [], properties: {\n\t\t\tshadowBias: {},\n\t\t\tshadowNormalBias: {},\n\t\t\tshadowRadius: {},\n\t\t\tshadowMapSize: {},\n\t\t\tshadowCameraNear: {},\n\t\t\tshadowCameraFar: {}\n\t\t} },\n\n\t\tpointShadowMap: { value: [] },\n\t\tpointShadowMatrix: { value: [] },\n\n\t\themisphereLights: { value: [], properties: {\n\t\t\tdirection: {},\n\t\t\tskyColor: {},\n\t\t\tgroundColor: {}\n\t\t} },\n\n\t\t// TODO (abelnation): RectAreaLight BRDF data needs to be moved from example to main src\n\t\trectAreaLights: { value: [], properties: {\n\t\t\tcolor: {},\n\t\t\tposition: {},\n\t\t\twidth: {},\n\t\t\theight: {}\n\t\t} },\n\n\t\tltc_1: { value: null },\n\t\tltc_2: { value: null }\n\n\t},\n\n\tpoints: {\n\n\t\tdiffuse: { value: /*@__PURE__*/ new Color( 0xffffff ) },\n\t\topacity: { value: 1.0 },\n\t\tsize: { value: 1.0 },\n\t\tscale: { value: 1.0 },\n\t\tmap: { value: null },\n\t\talphaMap: { value: null },\n\t\talphaTest: { value: 0 },\n\t\tuvTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\tsprite: {\n\n\t\tdiffuse: { value: /*@__PURE__*/ new Color( 0xffffff ) },\n\t\topacity: { value: 1.0 },\n\t\tcenter: { value: /*@__PURE__*/ new Vector2( 0.5, 0.5 ) },\n\t\trotation: { value: 0.0 },\n\t\tmap: { value: null },\n\t\talphaMap: { value: null },\n\t\talphaTest: { value: 0 },\n\t\tuvTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t}\n\n};\n\nconst ShaderLib = {\n\n\tbasic: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.specularmap,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.fog\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshbasic_vert,\n\t\tfragmentShader: ShaderChunk.meshbasic_frag\n\n\t},\n\n\tlambert: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.specularmap,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: /*@__PURE__*/ new Color( 0x000000 ) }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshlambert_vert,\n\t\tfragmentShader: ShaderChunk.meshlambert_frag\n\n\t},\n\n\tphong: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.specularmap,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: /*@__PURE__*/ new Color( 0x000000 ) },\n\t\t\t\tspecular: { value: /*@__PURE__*/ new Color( 0x111111 ) },\n\t\t\t\tshininess: { value: 30 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshphong_vert,\n\t\tfragmentShader: ShaderChunk.meshphong_frag\n\n\t},\n\n\tstandard: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.roughnessmap,\n\t\t\tUniformsLib.metalnessmap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: /*@__PURE__*/ new Color( 0x000000 ) },\n\t\t\t\troughness: { value: 1.0 },\n\t\t\t\tmetalness: { value: 0.0 },\n\t\t\t\tenvMapIntensity: { value: 1 } // temporary\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshphysical_vert,\n\t\tfragmentShader: ShaderChunk.meshphysical_frag\n\n\t},\n\n\ttoon: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.gradientmap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: /*@__PURE__*/ new Color( 0x000000 ) }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshtoon_vert,\n\t\tfragmentShader: ShaderChunk.meshtoon_frag\n\n\t},\n\n\tmatcap: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.fog,\n\t\t\t{\n\t\t\t\tmatcap: { value: null }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshmatcap_vert,\n\t\tfragmentShader: ShaderChunk.meshmatcap_frag\n\n\t},\n\n\tpoints: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.points,\n\t\t\tUniformsLib.fog\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.points_vert,\n\t\tfragmentShader: ShaderChunk.points_frag\n\n\t},\n\n\tdashed: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.fog,\n\t\t\t{\n\t\t\t\tscale: { value: 1 },\n\t\t\t\tdashSize: { value: 1 },\n\t\t\t\ttotalSize: { value: 2 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.linedashed_vert,\n\t\tfragmentShader: ShaderChunk.linedashed_frag\n\n\t},\n\n\tdepth: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.displacementmap\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.depth_vert,\n\t\tfragmentShader: ShaderChunk.depth_frag\n\n\t},\n\n\tnormal: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\t{\n\t\t\t\topacity: { value: 1.0 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshnormal_vert,\n\t\tfragmentShader: ShaderChunk.meshnormal_frag\n\n\t},\n\n\tsprite: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.sprite,\n\t\t\tUniformsLib.fog\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.sprite_vert,\n\t\tfragmentShader: ShaderChunk.sprite_frag\n\n\t},\n\n\tbackground: {\n\n\t\tuniforms: {\n\t\t\tuvTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tt2D: { value: null },\n\t\t},\n\n\t\tvertexShader: ShaderChunk.background_vert,\n\t\tfragmentShader: ShaderChunk.background_frag\n\n\t},\n\n\tcube: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.envmap,\n\t\t\t{\n\t\t\t\topacity: { value: 1.0 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.cube_vert,\n\t\tfragmentShader: ShaderChunk.cube_frag\n\n\t},\n\n\tequirect: {\n\n\t\tuniforms: {\n\t\t\ttEquirect: { value: null },\n\t\t},\n\n\t\tvertexShader: ShaderChunk.equirect_vert,\n\t\tfragmentShader: ShaderChunk.equirect_frag\n\n\t},\n\n\tdistanceRGBA: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.displacementmap,\n\t\t\t{\n\t\t\t\treferencePosition: { value: /*@__PURE__*/ new Vector3() },\n\t\t\t\tnearDistance: { value: 1 },\n\t\t\t\tfarDistance: { value: 1000 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.distanceRGBA_vert,\n\t\tfragmentShader: ShaderChunk.distanceRGBA_frag\n\n\t},\n\n\tshadow: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.lights,\n\t\t\tUniformsLib.fog,\n\t\t\t{\n\t\t\t\tcolor: { value: /*@__PURE__*/ new Color( 0x00000 ) },\n\t\t\t\topacity: { value: 1.0 }\n\t\t\t},\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.shadow_vert,\n\t\tfragmentShader: ShaderChunk.shadow_frag\n\n\t}\n\n};\n\nShaderLib.physical = {\n\n\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\tShaderLib.standard.uniforms,\n\t\t{\n\t\t\tclearcoat: { value: 0 },\n\t\t\tclearcoatMap: { value: null },\n\t\t\tclearcoatRoughness: { value: 0 },\n\t\t\tclearcoatRoughnessMap: { value: null },\n\t\t\tclearcoatNormalScale: { value: /*@__PURE__*/ new Vector2( 1, 1 ) },\n\t\t\tclearcoatNormalMap: { value: null },\n\t\t\tiridescence: { value: 0 },\n\t\t\tiridescenceMap: { value: null },\n\t\t\tiridescenceIOR: { value: 1.3 },\n\t\t\tiridescenceThicknessMinimum: { value: 100 },\n\t\t\tiridescenceThicknessMaximum: { value: 400 },\n\t\t\tiridescenceThicknessMap: { value: null },\n\t\t\tsheen: { value: 0 },\n\t\t\tsheenColor: { value: /*@__PURE__*/ new Color( 0x000000 ) },\n\t\t\tsheenColorMap: { value: null },\n\t\t\tsheenRoughness: { value: 1 },\n\t\t\tsheenRoughnessMap: { value: null },\n\t\t\ttransmission: { value: 0 },\n\t\t\ttransmissionMap: { value: null },\n\t\t\ttransmissionSamplerSize: { value: /*@__PURE__*/ new Vector2() },\n\t\t\ttransmissionSamplerMap: { value: null },\n\t\t\tthickness: { value: 0 },\n\t\t\tthicknessMap: { value: null },\n\t\t\tattenuationDistance: { value: 0 },\n\t\t\tattenuationColor: { value: /*@__PURE__*/ new Color( 0x000000 ) },\n\t\t\tspecularIntensity: { value: 1 },\n\t\t\tspecularIntensityMap: { value: null },\n\t\t\tspecularColor: { value: /*@__PURE__*/ new Color( 1, 1, 1 ) },\n\t\t\tspecularColorMap: { value: null },\n\t\t}\n\t] ),\n\n\tvertexShader: ShaderChunk.meshphysical_vert,\n\tfragmentShader: ShaderChunk.meshphysical_frag\n\n};\n\nfunction WebGLBackground( renderer, cubemaps, state, objects, alpha, premultipliedAlpha ) {\n\n\tconst clearColor = new Color( 0x000000 );\n\tlet clearAlpha = alpha === true ? 0 : 1;\n\n\tlet planeMesh;\n\tlet boxMesh;\n\n\tlet currentBackground = null;\n\tlet currentBackgroundVersion = 0;\n\tlet currentTonemapping = null;\n\n\tfunction render( renderList, scene ) {\n\n\t\tlet forceClear = false;\n\t\tlet background = scene.isScene === true ? scene.background : null;\n\n\t\tif ( background && background.isTexture ) {\n\n\t\t\tbackground = cubemaps.get( background );\n\n\t\t}\n\n\t\t// Ignore background in AR\n\t\t// TODO: Reconsider this.\n\n\t\tconst xr = renderer.xr;\n\t\tconst session = xr.getSession && xr.getSession();\n\n\t\tif ( session && session.environmentBlendMode === 'additive' ) {\n\n\t\t\tbackground = null;\n\n\t\t}\n\n\t\tif ( background === null ) {\n\n\t\t\tsetClear( clearColor, clearAlpha );\n\n\t\t} else if ( background && background.isColor ) {\n\n\t\t\tsetClear( background, 1 );\n\t\t\tforceClear = true;\n\n\t\t}\n\n\t\tif ( renderer.autoClear || forceClear ) {\n\n\t\t\trenderer.clear( renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil );\n\n\t\t}\n\n\t\tif ( background && ( background.isCubeTexture || background.mapping === CubeUVReflectionMapping ) ) {\n\n\t\t\tif ( boxMesh === undefined ) {\n\n\t\t\t\tboxMesh = new Mesh(\n\t\t\t\t\tnew BoxGeometry( 1, 1, 1 ),\n\t\t\t\t\tnew ShaderMaterial( {\n\t\t\t\t\t\tname: 'BackgroundCubeMaterial',\n\t\t\t\t\t\tuniforms: cloneUniforms( ShaderLib.cube.uniforms ),\n\t\t\t\t\t\tvertexShader: ShaderLib.cube.vertexShader,\n\t\t\t\t\t\tfragmentShader: ShaderLib.cube.fragmentShader,\n\t\t\t\t\t\tside: BackSide,\n\t\t\t\t\t\tdepthTest: false,\n\t\t\t\t\t\tdepthWrite: false,\n\t\t\t\t\t\tfog: false\n\t\t\t\t\t} )\n\t\t\t\t);\n\n\t\t\t\tboxMesh.geometry.deleteAttribute( 'normal' );\n\t\t\t\tboxMesh.geometry.deleteAttribute( 'uv' );\n\n\t\t\t\tboxMesh.onBeforeRender = function ( renderer, scene, camera ) {\n\n\t\t\t\t\tthis.matrixWorld.copyPosition( camera.matrixWorld );\n\n\t\t\t\t};\n\n\t\t\t\t// enable code injection for non-built-in material\n\t\t\t\tObject.defineProperty( boxMesh.material, 'envMap', {\n\n\t\t\t\t\tget: function () {\n\n\t\t\t\t\t\treturn this.uniforms.envMap.value;\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\tobjects.update( boxMesh );\n\n\t\t\t}\n\n\t\t\tboxMesh.material.uniforms.envMap.value = background;\n\t\t\tboxMesh.material.uniforms.flipEnvMap.value = ( background.isCubeTexture && background.isRenderTargetTexture === false ) ? - 1 : 1;\n\n\t\t\tif ( currentBackground !== background ||\n\t\t\t\tcurrentBackgroundVersion !== background.version ||\n\t\t\t\tcurrentTonemapping !== renderer.toneMapping ) {\n\n\t\t\t\tboxMesh.material.needsUpdate = true;\n\n\t\t\t\tcurrentBackground = background;\n\t\t\t\tcurrentBackgroundVersion = background.version;\n\t\t\t\tcurrentTonemapping = renderer.toneMapping;\n\n\t\t\t}\n\n\t\t\tboxMesh.layers.enableAll();\n\n\t\t\t// push to the pre-sorted opaque render list\n\t\t\trenderList.unshift( boxMesh, boxMesh.geometry, boxMesh.material, 0, 0, null );\n\n\t\t} else if ( background && background.isTexture ) {\n\n\t\t\tif ( planeMesh === undefined ) {\n\n\t\t\t\tplaneMesh = new Mesh(\n\t\t\t\t\tnew PlaneGeometry( 2, 2 ),\n\t\t\t\t\tnew ShaderMaterial( {\n\t\t\t\t\t\tname: 'BackgroundMaterial',\n\t\t\t\t\t\tuniforms: cloneUniforms( ShaderLib.background.uniforms ),\n\t\t\t\t\t\tvertexShader: ShaderLib.background.vertexShader,\n\t\t\t\t\t\tfragmentShader: ShaderLib.background.fragmentShader,\n\t\t\t\t\t\tside: FrontSide,\n\t\t\t\t\t\tdepthTest: false,\n\t\t\t\t\t\tdepthWrite: false,\n\t\t\t\t\t\tfog: false\n\t\t\t\t\t} )\n\t\t\t\t);\n\n\t\t\t\tplaneMesh.geometry.deleteAttribute( 'normal' );\n\n\t\t\t\t// enable code injection for non-built-in material\n\t\t\t\tObject.defineProperty( planeMesh.material, 'map', {\n\n\t\t\t\t\tget: function () {\n\n\t\t\t\t\t\treturn this.uniforms.t2D.value;\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\tobjects.update( planeMesh );\n\n\t\t\t}\n\n\t\t\tplaneMesh.material.uniforms.t2D.value = background;\n\n\t\t\tif ( background.matrixAutoUpdate === true ) {\n\n\t\t\t\tbackground.updateMatrix();\n\n\t\t\t}\n\n\t\t\tplaneMesh.material.uniforms.uvTransform.value.copy( background.matrix );\n\n\t\t\tif ( currentBackground !== background ||\n\t\t\t\tcurrentBackgroundVersion !== background.version ||\n\t\t\t\tcurrentTonemapping !== renderer.toneMapping ) {\n\n\t\t\t\tplaneMesh.material.needsUpdate = true;\n\n\t\t\t\tcurrentBackground = background;\n\t\t\t\tcurrentBackgroundVersion = background.version;\n\t\t\t\tcurrentTonemapping = renderer.toneMapping;\n\n\t\t\t}\n\n\t\t\tplaneMesh.layers.enableAll();\n\n\t\t\t// push to the pre-sorted opaque render list\n\t\t\trenderList.unshift( planeMesh, planeMesh.geometry, planeMesh.material, 0, 0, null );\n\n\t\t}\n\n\t}\n\n\tfunction setClear( color, alpha ) {\n\n\t\tstate.buffers.color.setClear( color.r, color.g, color.b, alpha, premultipliedAlpha );\n\n\t}\n\n\treturn {\n\n\t\tgetClearColor: function () {\n\n\t\t\treturn clearColor;\n\n\t\t},\n\t\tsetClearColor: function ( color, alpha = 1 ) {\n\n\t\t\tclearColor.set( color );\n\t\t\tclearAlpha = alpha;\n\t\t\tsetClear( clearColor, clearAlpha );\n\n\t\t},\n\t\tgetClearAlpha: function () {\n\n\t\t\treturn clearAlpha;\n\n\t\t},\n\t\tsetClearAlpha: function ( alpha ) {\n\n\t\t\tclearAlpha = alpha;\n\t\t\tsetClear( clearColor, clearAlpha );\n\n\t\t},\n\t\trender: render\n\n\t};\n\n}\n\nfunction WebGLBindingStates( gl, extensions, attributes, capabilities ) {\n\n\tconst maxVertexAttributes = gl.getParameter( 34921 );\n\n\tconst extension = capabilities.isWebGL2 ? null : extensions.get( 'OES_vertex_array_object' );\n\tconst vaoAvailable = capabilities.isWebGL2 || extension !== null;\n\n\tconst bindingStates = {};\n\n\tconst defaultState = createBindingState( null );\n\tlet currentState = defaultState;\n\tlet forceUpdate = false;\n\n\tfunction setup( object, material, program, geometry, index ) {\n\n\t\tlet updateBuffers = false;\n\n\t\tif ( vaoAvailable ) {\n\n\t\t\tconst state = getBindingState( geometry, program, material );\n\n\t\t\tif ( currentState !== state ) {\n\n\t\t\t\tcurrentState = state;\n\t\t\t\tbindVertexArrayObject( currentState.object );\n\n\t\t\t}\n\n\t\t\tupdateBuffers = needsUpdate( object, geometry, program, index );\n\n\t\t\tif ( updateBuffers ) saveCache( object, geometry, program, index );\n\n\t\t} else {\n\n\t\t\tconst wireframe = ( material.wireframe === true );\n\n\t\t\tif ( currentState.geometry !== geometry.id ||\n\t\t\t\tcurrentState.program !== program.id ||\n\t\t\t\tcurrentState.wireframe !== wireframe ) {\n\n\t\t\t\tcurrentState.geometry = geometry.id;\n\t\t\t\tcurrentState.program = program.id;\n\t\t\t\tcurrentState.wireframe = wireframe;\n\n\t\t\t\tupdateBuffers = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( index !== null ) {\n\n\t\t\tattributes.update( index, 34963 );\n\n\t\t}\n\n\t\tif ( updateBuffers || forceUpdate ) {\n\n\t\t\tforceUpdate = false;\n\n\t\t\tsetupVertexAttributes( object, material, program, geometry );\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tgl.bindBuffer( 34963, attributes.get( index ).buffer );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction createVertexArrayObject() {\n\n\t\tif ( capabilities.isWebGL2 ) return gl.createVertexArray();\n\n\t\treturn extension.createVertexArrayOES();\n\n\t}\n\n\tfunction bindVertexArrayObject( vao ) {\n\n\t\tif ( capabilities.isWebGL2 ) return gl.bindVertexArray( vao );\n\n\t\treturn extension.bindVertexArrayOES( vao );\n\n\t}\n\n\tfunction deleteVertexArrayObject( vao ) {\n\n\t\tif ( capabilities.isWebGL2 ) return gl.deleteVertexArray( vao );\n\n\t\treturn extension.deleteVertexArrayOES( vao );\n\n\t}\n\n\tfunction getBindingState( geometry, program, material ) {\n\n\t\tconst wireframe = ( material.wireframe === true );\n\n\t\tlet programMap = bindingStates[ geometry.id ];\n\n\t\tif ( programMap === undefined ) {\n\n\t\t\tprogramMap = {};\n\t\t\tbindingStates[ geometry.id ] = programMap;\n\n\t\t}\n\n\t\tlet stateMap = programMap[ program.id ];\n\n\t\tif ( stateMap === undefined ) {\n\n\t\t\tstateMap = {};\n\t\t\tprogramMap[ program.id ] = stateMap;\n\n\t\t}\n\n\t\tlet state = stateMap[ wireframe ];\n\n\t\tif ( state === undefined ) {\n\n\t\t\tstate = createBindingState( createVertexArrayObject() );\n\t\t\tstateMap[ wireframe ] = state;\n\n\t\t}\n\n\t\treturn state;\n\n\t}\n\n\tfunction createBindingState( vao ) {\n\n\t\tconst newAttributes = [];\n\t\tconst enabledAttributes = [];\n\t\tconst attributeDivisors = [];\n\n\t\tfor ( let i = 0; i < maxVertexAttributes; i ++ ) {\n\n\t\t\tnewAttributes[ i ] = 0;\n\t\t\tenabledAttributes[ i ] = 0;\n\t\t\tattributeDivisors[ i ] = 0;\n\n\t\t}\n\n\t\treturn {\n\n\t\t\t// for backward compatibility on non-VAO support browser\n\t\t\tgeometry: null,\n\t\t\tprogram: null,\n\t\t\twireframe: false,\n\n\t\t\tnewAttributes: newAttributes,\n\t\t\tenabledAttributes: enabledAttributes,\n\t\t\tattributeDivisors: attributeDivisors,\n\t\t\tobject: vao,\n\t\t\tattributes: {},\n\t\t\tindex: null\n\n\t\t};\n\n\t}\n\n\tfunction needsUpdate( object, geometry, program, index ) {\n\n\t\tconst cachedAttributes = currentState.attributes;\n\t\tconst geometryAttributes = geometry.attributes;\n\n\t\tlet attributesNum = 0;\n\n\t\tconst programAttributes = program.getAttributes();\n\n\t\tfor ( const name in programAttributes ) {\n\n\t\t\tconst programAttribute = programAttributes[ name ];\n\n\t\t\tif ( programAttribute.location >= 0 ) {\n\n\t\t\t\tconst cachedAttribute = cachedAttributes[ name ];\n\t\t\t\tlet geometryAttribute = geometryAttributes[ name ];\n\n\t\t\t\tif ( geometryAttribute === undefined ) {\n\n\t\t\t\t\tif ( name === 'instanceMatrix' && object.instanceMatrix ) geometryAttribute = object.instanceMatrix;\n\t\t\t\t\tif ( name === 'instanceColor' && object.instanceColor ) geometryAttribute = object.instanceColor;\n\n\t\t\t\t}\n\n\t\t\t\tif ( cachedAttribute === undefined ) return true;\n\n\t\t\t\tif ( cachedAttribute.attribute !== geometryAttribute ) return true;\n\n\t\t\t\tif ( geometryAttribute && cachedAttribute.data !== geometryAttribute.data ) return true;\n\n\t\t\t\tattributesNum ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( currentState.attributesNum !== attributesNum ) return true;\n\n\t\tif ( currentState.index !== index ) return true;\n\n\t\treturn false;\n\n\t}\n\n\tfunction saveCache( object, geometry, program, index ) {\n\n\t\tconst cache = {};\n\t\tconst attributes = geometry.attributes;\n\t\tlet attributesNum = 0;\n\n\t\tconst programAttributes = program.getAttributes();\n\n\t\tfor ( const name in programAttributes ) {\n\n\t\t\tconst programAttribute = programAttributes[ name ];\n\n\t\t\tif ( programAttribute.location >= 0 ) {\n\n\t\t\t\tlet attribute = attributes[ name ];\n\n\t\t\t\tif ( attribute === undefined ) {\n\n\t\t\t\t\tif ( name === 'instanceMatrix' && object.instanceMatrix ) attribute = object.instanceMatrix;\n\t\t\t\t\tif ( name === 'instanceColor' && object.instanceColor ) attribute = object.instanceColor;\n\n\t\t\t\t}\n\n\t\t\t\tconst data = {};\n\t\t\t\tdata.attribute = attribute;\n\n\t\t\t\tif ( attribute && attribute.data ) {\n\n\t\t\t\t\tdata.data = attribute.data;\n\n\t\t\t\t}\n\n\t\t\t\tcache[ name ] = data;\n\n\t\t\t\tattributesNum ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\tcurrentState.attributes = cache;\n\t\tcurrentState.attributesNum = attributesNum;\n\n\t\tcurrentState.index = index;\n\n\t}\n\n\tfunction initAttributes() {\n\n\t\tconst newAttributes = currentState.newAttributes;\n\n\t\tfor ( let i = 0, il = newAttributes.length; i < il; i ++ ) {\n\n\t\t\tnewAttributes[ i ] = 0;\n\n\t\t}\n\n\t}\n\n\tfunction enableAttribute( attribute ) {\n\n\t\tenableAttributeAndDivisor( attribute, 0 );\n\n\t}\n\n\tfunction enableAttributeAndDivisor( attribute, meshPerAttribute ) {\n\n\t\tconst newAttributes = currentState.newAttributes;\n\t\tconst enabledAttributes = currentState.enabledAttributes;\n\t\tconst attributeDivisors = currentState.attributeDivisors;\n\n\t\tnewAttributes[ attribute ] = 1;\n\n\t\tif ( enabledAttributes[ attribute ] === 0 ) {\n\n\t\t\tgl.enableVertexAttribArray( attribute );\n\t\t\tenabledAttributes[ attribute ] = 1;\n\n\t\t}\n\n\t\tif ( attributeDivisors[ attribute ] !== meshPerAttribute ) {\n\n\t\t\tconst extension = capabilities.isWebGL2 ? gl : extensions.get( 'ANGLE_instanced_arrays' );\n\n\t\t\textension[ capabilities.isWebGL2 ? 'vertexAttribDivisor' : 'vertexAttribDivisorANGLE' ]( attribute, meshPerAttribute );\n\t\t\tattributeDivisors[ attribute ] = meshPerAttribute;\n\n\t\t}\n\n\t}\n\n\tfunction disableUnusedAttributes() {\n\n\t\tconst newAttributes = currentState.newAttributes;\n\t\tconst enabledAttributes = currentState.enabledAttributes;\n\n\t\tfor ( let i = 0, il = enabledAttributes.length; i < il; i ++ ) {\n\n\t\t\tif ( enabledAttributes[ i ] !== newAttributes[ i ] ) {\n\n\t\t\t\tgl.disableVertexAttribArray( i );\n\t\t\t\tenabledAttributes[ i ] = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction vertexAttribPointer( index, size, type, normalized, stride, offset ) {\n\n\t\tif ( capabilities.isWebGL2 === true && ( type === 5124 || type === 5125 ) ) {\n\n\t\t\tgl.vertexAttribIPointer( index, size, type, stride, offset );\n\n\t\t} else {\n\n\t\t\tgl.vertexAttribPointer( index, size, type, normalized, stride, offset );\n\n\t\t}\n\n\t}\n\n\tfunction setupVertexAttributes( object, material, program, geometry ) {\n\n\t\tif ( capabilities.isWebGL2 === false && ( object.isInstancedMesh || geometry.isInstancedBufferGeometry ) ) {\n\n\t\t\tif ( extensions.get( 'ANGLE_instanced_arrays' ) === null ) return;\n\n\t\t}\n\n\t\tinitAttributes();\n\n\t\tconst geometryAttributes = geometry.attributes;\n\n\t\tconst programAttributes = program.getAttributes();\n\n\t\tconst materialDefaultAttributeValues = material.defaultAttributeValues;\n\n\t\tfor ( const name in programAttributes ) {\n\n\t\t\tconst programAttribute = programAttributes[ name ];\n\n\t\t\tif ( programAttribute.location >= 0 ) {\n\n\t\t\t\tlet geometryAttribute = geometryAttributes[ name ];\n\n\t\t\t\tif ( geometryAttribute === undefined ) {\n\n\t\t\t\t\tif ( name === 'instanceMatrix' && object.instanceMatrix ) geometryAttribute = object.instanceMatrix;\n\t\t\t\t\tif ( name === 'instanceColor' && object.instanceColor ) geometryAttribute = object.instanceColor;\n\n\t\t\t\t}\n\n\t\t\t\tif ( geometryAttribute !== undefined ) {\n\n\t\t\t\t\tconst normalized = geometryAttribute.normalized;\n\t\t\t\t\tconst size = geometryAttribute.itemSize;\n\n\t\t\t\t\tconst attribute = attributes.get( geometryAttribute );\n\n\t\t\t\t\t// TODO Attribute may not be available on context restore\n\n\t\t\t\t\tif ( attribute === undefined ) continue;\n\n\t\t\t\t\tconst buffer = attribute.buffer;\n\t\t\t\t\tconst type = attribute.type;\n\t\t\t\t\tconst bytesPerElement = attribute.bytesPerElement;\n\n\t\t\t\t\tif ( geometryAttribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\t\t\tconst data = geometryAttribute.data;\n\t\t\t\t\t\tconst stride = data.stride;\n\t\t\t\t\t\tconst offset = geometryAttribute.offset;\n\n\t\t\t\t\t\tif ( data.isInstancedInterleavedBuffer ) {\n\n\t\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\t\tenableAttributeAndDivisor( programAttribute.location + i, data.meshPerAttribute );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( object.isInstancedMesh !== true && geometry._maxInstanceCount === undefined ) {\n\n\t\t\t\t\t\t\t\tgeometry._maxInstanceCount = data.meshPerAttribute * data.count;\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\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\t\tenableAttribute( programAttribute.location + i );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgl.bindBuffer( 34962, buffer );\n\n\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\tvertexAttribPointer(\n\t\t\t\t\t\t\t\tprogramAttribute.location + i,\n\t\t\t\t\t\t\t\tsize / programAttribute.locationSize,\n\t\t\t\t\t\t\t\ttype,\n\t\t\t\t\t\t\t\tnormalized,\n\t\t\t\t\t\t\t\tstride * bytesPerElement,\n\t\t\t\t\t\t\t\t( offset + ( size / programAttribute.locationSize ) * i ) * bytesPerElement\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\tif ( geometryAttribute.isInstancedBufferAttribute ) {\n\n\t\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\t\tenableAttributeAndDivisor( programAttribute.location + i, geometryAttribute.meshPerAttribute );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( object.isInstancedMesh !== true && geometry._maxInstanceCount === undefined ) {\n\n\t\t\t\t\t\t\t\tgeometry._maxInstanceCount = geometryAttribute.meshPerAttribute * geometryAttribute.count;\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\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\t\tenableAttribute( programAttribute.location + i );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgl.bindBuffer( 34962, buffer );\n\n\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\tvertexAttribPointer(\n\t\t\t\t\t\t\t\tprogramAttribute.location + i,\n\t\t\t\t\t\t\t\tsize / programAttribute.locationSize,\n\t\t\t\t\t\t\t\ttype,\n\t\t\t\t\t\t\t\tnormalized,\n\t\t\t\t\t\t\t\tsize * bytesPerElement,\n\t\t\t\t\t\t\t\t( size / programAttribute.locationSize ) * i * bytesPerElement\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 ( materialDefaultAttributeValues !== undefined ) {\n\n\t\t\t\t\tconst value = materialDefaultAttributeValues[ name ];\n\n\t\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\t\tswitch ( value.length ) {\n\n\t\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\t\tgl.vertexAttrib2fv( programAttribute.location, value );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\t\tgl.vertexAttrib3fv( programAttribute.location, value );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 4:\n\t\t\t\t\t\t\t\tgl.vertexAttrib4fv( programAttribute.location, value );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\tgl.vertexAttrib1fv( programAttribute.location, value );\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\tdisableUnusedAttributes();\n\n\t}\n\n\tfunction dispose() {\n\n\t\treset();\n\n\t\tfor ( const geometryId in bindingStates ) {\n\n\t\t\tconst programMap = bindingStates[ geometryId ];\n\n\t\t\tfor ( const programId in programMap ) {\n\n\t\t\t\tconst stateMap = programMap[ programId ];\n\n\t\t\t\tfor ( const wireframe in stateMap ) {\n\n\t\t\t\t\tdeleteVertexArrayObject( stateMap[ wireframe ].object );\n\n\t\t\t\t\tdelete stateMap[ wireframe ];\n\n\t\t\t\t}\n\n\t\t\t\tdelete programMap[ programId ];\n\n\t\t\t}\n\n\t\t\tdelete bindingStates[ geometryId ];\n\n\t\t}\n\n\t}\n\n\tfunction releaseStatesOfGeometry( geometry ) {\n\n\t\tif ( bindingStates[ geometry.id ] === undefined ) return;\n\n\t\tconst programMap = bindingStates[ geometry.id ];\n\n\t\tfor ( const programId in programMap ) {\n\n\t\t\tconst stateMap = programMap[ programId ];\n\n\t\t\tfor ( const wireframe in stateMap ) {\n\n\t\t\t\tdeleteVertexArrayObject( stateMap[ wireframe ].object );\n\n\t\t\t\tdelete stateMap[ wireframe ];\n\n\t\t\t}\n\n\t\t\tdelete programMap[ programId ];\n\n\t\t}\n\n\t\tdelete bindingStates[ geometry.id ];\n\n\t}\n\n\tfunction releaseStatesOfProgram( program ) {\n\n\t\tfor ( const geometryId in bindingStates ) {\n\n\t\t\tconst programMap = bindingStates[ geometryId ];\n\n\t\t\tif ( programMap[ program.id ] === undefined ) continue;\n\n\t\t\tconst stateMap = programMap[ program.id ];\n\n\t\t\tfor ( const wireframe in stateMap ) {\n\n\t\t\t\tdeleteVertexArrayObject( stateMap[ wireframe ].object );\n\n\t\t\t\tdelete stateMap[ wireframe ];\n\n\t\t\t}\n\n\t\t\tdelete programMap[ program.id ];\n\n\t\t}\n\n\t}\n\n\tfunction reset() {\n\n\t\tresetDefaultState();\n\t\tforceUpdate = true;\n\n\t\tif ( currentState === defaultState ) return;\n\n\t\tcurrentState = defaultState;\n\t\tbindVertexArrayObject( currentState.object );\n\n\t}\n\n\t// for backward-compatibility\n\n\tfunction resetDefaultState() {\n\n\t\tdefaultState.geometry = null;\n\t\tdefaultState.program = null;\n\t\tdefaultState.wireframe = false;\n\n\t}\n\n\treturn {\n\n\t\tsetup: setup,\n\t\treset: reset,\n\t\tresetDefaultState: resetDefaultState,\n\t\tdispose: dispose,\n\t\treleaseStatesOfGeometry: releaseStatesOfGeometry,\n\t\treleaseStatesOfProgram: releaseStatesOfProgram,\n\n\t\tinitAttributes: initAttributes,\n\t\tenableAttribute: enableAttribute,\n\t\tdisableUnusedAttributes: disableUnusedAttributes\n\n\t};\n\n}\n\nfunction WebGLBufferRenderer( gl, extensions, info, capabilities ) {\n\n\tconst isWebGL2 = capabilities.isWebGL2;\n\n\tlet mode;\n\n\tfunction setMode( value ) {\n\n\t\tmode = value;\n\n\t}\n\n\tfunction render( start, count ) {\n\n\t\tgl.drawArrays( mode, start, count );\n\n\t\tinfo.update( count, mode, 1 );\n\n\t}\n\n\tfunction renderInstances( start, count, primcount ) {\n\n\t\tif ( primcount === 0 ) return;\n\n\t\tlet extension, methodName;\n\n\t\tif ( isWebGL2 ) {\n\n\t\t\textension = gl;\n\t\t\tmethodName = 'drawArraysInstanced';\n\n\t\t} else {\n\n\t\t\textension = extensions.get( 'ANGLE_instanced_arrays' );\n\t\t\tmethodName = 'drawArraysInstancedANGLE';\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}\n\n\t\textension[ methodName ]( mode, start, count, primcount );\n\n\t\tinfo.update( count, mode, primcount );\n\n\t}\n\n\t//\n\n\tthis.setMode = setMode;\n\tthis.render = render;\n\tthis.renderInstances = renderInstances;\n\n}\n\nfunction WebGLCapabilities( gl, extensions, parameters ) {\n\n\tlet maxAnisotropy;\n\n\tfunction getMaxAnisotropy() {\n\n\t\tif ( maxAnisotropy !== undefined ) return maxAnisotropy;\n\n\t\tif ( extensions.has( 'EXT_texture_filter_anisotropic' ) === true ) {\n\n\t\t\tconst extension = extensions.get( 'EXT_texture_filter_anisotropic' );\n\n\t\t\tmaxAnisotropy = gl.getParameter( extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT );\n\n\t\t} else {\n\n\t\t\tmaxAnisotropy = 0;\n\n\t\t}\n\n\t\treturn maxAnisotropy;\n\n\t}\n\n\tfunction getMaxPrecision( precision ) {\n\n\t\tif ( precision === 'highp' ) {\n\n\t\t\tif ( gl.getShaderPrecisionFormat( 35633, 36338 ).precision > 0 &&\n\t\t\t\tgl.getShaderPrecisionFormat( 35632, 36338 ).precision > 0 ) {\n\n\t\t\t\treturn 'highp';\n\n\t\t\t}\n\n\t\t\tprecision = 'mediump';\n\n\t\t}\n\n\t\tif ( precision === 'mediump' ) {\n\n\t\t\tif ( gl.getShaderPrecisionFormat( 35633, 36337 ).precision > 0 &&\n\t\t\t\tgl.getShaderPrecisionFormat( 35632, 36337 ).precision > 0 ) {\n\n\t\t\t\treturn 'mediump';\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn 'lowp';\n\n\t}\n\n\tconst isWebGL2 = ( typeof WebGL2RenderingContext !== 'undefined' && gl instanceof WebGL2RenderingContext ) ||\n\t\t( typeof WebGL2ComputeRenderingContext !== 'undefined' && gl instanceof WebGL2ComputeRenderingContext );\n\n\tlet precision = parameters.precision !== undefined ? parameters.precision : 'highp';\n\tconst maxPrecision = getMaxPrecision( precision );\n\n\tif ( maxPrecision !== precision ) {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer:', precision, 'not supported, using', maxPrecision, 'instead.' );\n\t\tprecision = maxPrecision;\n\n\t}\n\n\tconst drawBuffers = isWebGL2 || extensions.has( 'WEBGL_draw_buffers' );\n\n\tconst logarithmicDepthBuffer = parameters.logarithmicDepthBuffer === true;\n\n\tconst maxTextures = gl.getParameter( 34930 );\n\tconst maxVertexTextures = gl.getParameter( 35660 );\n\tconst maxTextureSize = gl.getParameter( 3379 );\n\tconst maxCubemapSize = gl.getParameter( 34076 );\n\n\tconst maxAttributes = gl.getParameter( 34921 );\n\tconst maxVertexUniforms = gl.getParameter( 36347 );\n\tconst maxVaryings = gl.getParameter( 36348 );\n\tconst maxFragmentUniforms = gl.getParameter( 36349 );\n\n\tconst vertexTextures = maxVertexTextures > 0;\n\tconst floatFragmentTextures = isWebGL2 || extensions.has( 'OES_texture_float' );\n\tconst floatVertexTextures = vertexTextures && floatFragmentTextures;\n\n\tconst maxSamples = isWebGL2 ? gl.getParameter( 36183 ) : 0;\n\n\treturn {\n\n\t\tisWebGL2: isWebGL2,\n\n\t\tdrawBuffers: drawBuffers,\n\n\t\tgetMaxAnisotropy: getMaxAnisotropy,\n\t\tgetMaxPrecision: getMaxPrecision,\n\n\t\tprecision: precision,\n\t\tlogarithmicDepthBuffer: logarithmicDepthBuffer,\n\n\t\tmaxTextures: maxTextures,\n\t\tmaxVertexTextures: maxVertexTextures,\n\t\tmaxTextureSize: maxTextureSize,\n\t\tmaxCubemapSize: maxCubemapSize,\n\n\t\tmaxAttributes: maxAttributes,\n\t\tmaxVertexUniforms: maxVertexUniforms,\n\t\tmaxVaryings: maxVaryings,\n\t\tmaxFragmentUniforms: maxFragmentUniforms,\n\n\t\tvertexTextures: vertexTextures,\n\t\tfloatFragmentTextures: floatFragmentTextures,\n\t\tfloatVertexTextures: floatVertexTextures,\n\n\t\tmaxSamples: maxSamples\n\n\t};\n\n}\n\nfunction WebGLClipping( properties ) {\n\n\tconst scope = this;\n\n\tlet globalState = null,\n\t\tnumGlobalPlanes = 0,\n\t\tlocalClippingEnabled = false,\n\t\trenderingShadows = false;\n\n\tconst plane = new Plane(),\n\t\tviewNormalMatrix = new Matrix3(),\n\n\t\tuniform = { value: null, needsUpdate: false };\n\n\tthis.uniform = uniform;\n\tthis.numPlanes = 0;\n\tthis.numIntersection = 0;\n\n\tthis.init = function ( planes, enableLocalClipping, camera ) {\n\n\t\tconst enabled =\n\t\t\tplanes.length !== 0 ||\n\t\t\tenableLocalClipping ||\n\t\t\t// enable state of previous frame - the clipping code has to\n\t\t\t// run another frame in order to reset the state:\n\t\t\tnumGlobalPlanes !== 0 ||\n\t\t\tlocalClippingEnabled;\n\n\t\tlocalClippingEnabled = enableLocalClipping;\n\n\t\tglobalState = projectPlanes( planes, camera, 0 );\n\t\tnumGlobalPlanes = planes.length;\n\n\t\treturn enabled;\n\n\t};\n\n\tthis.beginShadows = function () {\n\n\t\trenderingShadows = true;\n\t\tprojectPlanes( null );\n\n\t};\n\n\tthis.endShadows = function () {\n\n\t\trenderingShadows = false;\n\t\tresetGlobalState();\n\n\t};\n\n\tthis.setState = function ( material, camera, useCache ) {\n\n\t\tconst planes = material.clippingPlanes,\n\t\t\tclipIntersection = material.clipIntersection,\n\t\t\tclipShadows = material.clipShadows;\n\n\t\tconst materialProperties = properties.get( material );\n\n\t\tif ( ! localClippingEnabled || planes === null || planes.length === 0 || renderingShadows && ! clipShadows ) {\n\n\t\t\t// there's no local clipping\n\n\t\t\tif ( renderingShadows ) {\n\n\t\t\t\t// there's no global clipping\n\n\t\t\t\tprojectPlanes( null );\n\n\t\t\t} else {\n\n\t\t\t\tresetGlobalState();\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst nGlobal = renderingShadows ? 0 : numGlobalPlanes,\n\t\t\t\tlGlobal = nGlobal * 4;\n\n\t\t\tlet dstArray = materialProperties.clippingState || null;\n\n\t\t\tuniform.value = dstArray; // ensure unique state\n\n\t\t\tdstArray = projectPlanes( planes, camera, lGlobal, useCache );\n\n\t\t\tfor ( let i = 0; i !== lGlobal; ++ i ) {\n\n\t\t\t\tdstArray[ i ] = globalState[ i ];\n\n\t\t\t}\n\n\t\t\tmaterialProperties.clippingState = dstArray;\n\t\t\tthis.numIntersection = clipIntersection ? this.numPlanes : 0;\n\t\t\tthis.numPlanes += nGlobal;\n\n\t\t}\n\n\n\t};\n\n\tfunction resetGlobalState() {\n\n\t\tif ( uniform.value !== globalState ) {\n\n\t\t\tuniform.value = globalState;\n\t\t\tuniform.needsUpdate = numGlobalPlanes > 0;\n\n\t\t}\n\n\t\tscope.numPlanes = numGlobalPlanes;\n\t\tscope.numIntersection = 0;\n\n\t}\n\n\tfunction projectPlanes( planes, camera, dstOffset, skipTransform ) {\n\n\t\tconst nPlanes = planes !== null ? planes.length : 0;\n\t\tlet dstArray = null;\n\n\t\tif ( nPlanes !== 0 ) {\n\n\t\t\tdstArray = uniform.value;\n\n\t\t\tif ( skipTransform !== true || dstArray === null ) {\n\n\t\t\t\tconst flatSize = dstOffset + nPlanes * 4,\n\t\t\t\t\tviewMatrix = camera.matrixWorldInverse;\n\n\t\t\t\tviewNormalMatrix.getNormalMatrix( viewMatrix );\n\n\t\t\t\tif ( dstArray === null || dstArray.length < flatSize ) {\n\n\t\t\t\t\tdstArray = new Float32Array( flatSize );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0, i4 = dstOffset; i !== nPlanes; ++ i, i4 += 4 ) {\n\n\t\t\t\t\tplane.copy( planes[ i ] ).applyMatrix4( viewMatrix, viewNormalMatrix );\n\n\t\t\t\t\tplane.normal.toArray( dstArray, i4 );\n\t\t\t\t\tdstArray[ i4 + 3 ] = plane.constant;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tuniform.value = dstArray;\n\t\t\tuniform.needsUpdate = true;\n\n\t\t}\n\n\t\tscope.numPlanes = nPlanes;\n\t\tscope.numIntersection = 0;\n\n\t\treturn dstArray;\n\n\t}\n\n}\n\nfunction WebGLCubeMaps( renderer ) {\n\n\tlet cubemaps = new WeakMap();\n\n\tfunction mapTextureMapping( texture, mapping ) {\n\n\t\tif ( mapping === EquirectangularReflectionMapping ) {\n\n\t\t\ttexture.mapping = CubeReflectionMapping;\n\n\t\t} else if ( mapping === EquirectangularRefractionMapping ) {\n\n\t\t\ttexture.mapping = CubeRefractionMapping;\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\tfunction get( texture ) {\n\n\t\tif ( texture && texture.isTexture && texture.isRenderTargetTexture === false ) {\n\n\t\t\tconst mapping = texture.mapping;\n\n\t\t\tif ( mapping === EquirectangularReflectionMapping || mapping === EquirectangularRefractionMapping ) {\n\n\t\t\t\tif ( cubemaps.has( texture ) ) {\n\n\t\t\t\t\tconst cubemap = cubemaps.get( texture ).texture;\n\t\t\t\t\treturn mapTextureMapping( cubemap, texture.mapping );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconst image = texture.image;\n\n\t\t\t\t\tif ( image && image.height > 0 ) {\n\n\t\t\t\t\t\tconst renderTarget = new WebGLCubeRenderTarget( image.height / 2 );\n\t\t\t\t\t\trenderTarget.fromEquirectangularTexture( renderer, texture );\n\t\t\t\t\t\tcubemaps.set( texture, renderTarget );\n\n\t\t\t\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t\t\t\t\treturn mapTextureMapping( renderTarget.texture, texture.mapping );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// image not yet ready. try the conversion next frame\n\n\t\t\t\t\t\treturn null;\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\treturn texture;\n\n\t}\n\n\tfunction onTextureDispose( event ) {\n\n\t\tconst texture = event.target;\n\n\t\ttexture.removeEventListener( 'dispose', onTextureDispose );\n\n\t\tconst cubemap = cubemaps.get( texture );\n\n\t\tif ( cubemap !== undefined ) {\n\n\t\t\tcubemaps.delete( texture );\n\t\t\tcubemap.dispose();\n\n\t\t}\n\n\t}\n\n\tfunction dispose() {\n\n\t\tcubemaps = new WeakMap();\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\nclass OrthographicCamera extends Camera {\n\n\tconstructor( left = - 1, right = 1, top = 1, bottom = - 1, near = 0.1, far = 2000 ) {\n\n\t\tsuper();\n\n\t\tthis.isOrthographicCamera = true;\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;\n\t\tthis.far = far;\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.left = source.left;\n\t\tthis.right = source.right;\n\t\tthis.top = source.top;\n\t\tthis.bottom = source.bottom;\n\t\tthis.near = source.near;\n\t\tthis.far = source.far;\n\n\t\tthis.zoom = source.zoom;\n\t\tthis.view = source.view === null ? null : Object.assign( {}, source.view );\n\n\t\treturn this;\n\n\t}\n\n\tsetViewOffset( fullWidth, fullHeight, x, y, width, height ) {\n\n\t\tif ( this.view === null ) {\n\n\t\t\tthis.view = {\n\t\t\t\tenabled: true,\n\t\t\t\tfullWidth: 1,\n\t\t\t\tfullHeight: 1,\n\t\t\t\toffsetX: 0,\n\t\t\t\toffsetY: 0,\n\t\t\t\twidth: 1,\n\t\t\t\theight: 1\n\t\t\t};\n\n\t\t}\n\n\t\tthis.view.enabled = true;\n\t\tthis.view.fullWidth = fullWidth;\n\t\tthis.view.fullHeight = fullHeight;\n\t\tthis.view.offsetX = x;\n\t\tthis.view.offsetY = y;\n\t\tthis.view.width = width;\n\t\tthis.view.height = height;\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tclearViewOffset() {\n\n\t\tif ( this.view !== null ) {\n\n\t\t\tthis.view.enabled = false;\n\n\t\t}\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tupdateProjectionMatrix() {\n\n\t\tconst dx = ( this.right - this.left ) / ( 2 * this.zoom );\n\t\tconst dy = ( this.top - this.bottom ) / ( 2 * this.zoom );\n\t\tconst cx = ( this.right + this.left ) / 2;\n\t\tconst cy = ( this.top + this.bottom ) / 2;\n\n\t\tlet left = cx - dx;\n\t\tlet right = cx + dx;\n\t\tlet top = cy + dy;\n\t\tlet bottom = cy - dy;\n\n\t\tif ( this.view !== null && this.view.enabled ) {\n\n\t\t\tconst scaleW = ( this.right - this.left ) / this.view.fullWidth / this.zoom;\n\t\t\tconst scaleH = ( this.top - this.bottom ) / this.view.fullHeight / this.zoom;\n\n\t\t\tleft += scaleW * this.view.offsetX;\n\t\t\tright = left + scaleW * this.view.width;\n\t\t\ttop -= scaleH * this.view.offsetY;\n\t\t\tbottom = top - scaleH * this.view.height;\n\n\t\t}\n\n\t\tthis.projectionMatrix.makeOrthographic( left, right, top, bottom, this.near, this.far );\n\n\t\tthis.projectionMatrixInverse.copy( this.projectionMatrix ).invert();\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.zoom = this.zoom;\n\t\tdata.object.left = this.left;\n\t\tdata.object.right = this.right;\n\t\tdata.object.top = this.top;\n\t\tdata.object.bottom = this.bottom;\n\t\tdata.object.near = this.near;\n\t\tdata.object.far = this.far;\n\n\t\tif ( this.view !== null ) data.object.view = Object.assign( {}, this.view );\n\n\t\treturn data;\n\n\t}\n\n}\n\nconst LOD_MIN = 4;\n\n// The standard deviations (radians) associated with the extra mips. These are\n// chosen to approximate a Trowbridge-Reitz distribution function times the\n// geometric shadowing function. These sigma values squared must match the\n// variance #defines in cube_uv_reflection_fragment.glsl.js.\nconst EXTRA_LOD_SIGMA = [ 0.125, 0.215, 0.35, 0.446, 0.526, 0.582 ];\n\n// The maximum length of the blur for loop. Smaller sigmas will use fewer\n// samples and exit early, but not recompile the shader.\nconst MAX_SAMPLES = 20;\n\nconst _flatCamera = /*@__PURE__*/ new OrthographicCamera();\nconst _clearColor = /*@__PURE__*/ new Color();\nlet _oldTarget = null;\n\n// Golden Ratio\nconst PHI = ( 1 + Math.sqrt( 5 ) ) / 2;\nconst INV_PHI = 1 / PHI;\n\n// Vertices of a dodecahedron (except the opposites, which represent the\n// same axis), used as axis directions evenly spread on a sphere.\nconst _axisDirections = [\n\t/*@__PURE__*/ new Vector3( 1, 1, 1 ),\n\t/*@__PURE__*/ new Vector3( - 1, 1, 1 ),\n\t/*@__PURE__*/ new Vector3( 1, 1, - 1 ),\n\t/*@__PURE__*/ new Vector3( - 1, 1, - 1 ),\n\t/*@__PURE__*/ new Vector3( 0, PHI, INV_PHI ),\n\t/*@__PURE__*/ new Vector3( 0, PHI, - INV_PHI ),\n\t/*@__PURE__*/ new Vector3( INV_PHI, 0, PHI ),\n\t/*@__PURE__*/ new Vector3( - INV_PHI, 0, PHI ),\n\t/*@__PURE__*/ new Vector3( PHI, INV_PHI, 0 ),\n\t/*@__PURE__*/ new Vector3( - PHI, INV_PHI, 0 ) ];\n\n/**\n * This class generates a Prefiltered, Mipmapped Radiance Environment Map\n * (PMREM) from a cubeMap environment texture. This allows different levels of\n * blur to be quickly accessed based on material roughness. It is packed into a\n * special CubeUV format that allows us to perform custom interpolation so that\n * we can support nonlinear formats such as RGBE. Unlike a traditional mipmap\n * chain, it only goes down to the LOD_MIN level (above), and then creates extra\n * even more filtered 'mips' at the same LOD_MIN resolution, associated with\n * higher roughness levels. In this way we maintain resolution to smoothly\n * interpolate diffuse lighting while limiting sampling computation.\n *\n * Paper: Fast, Accurate Image-Based Lighting\n * https://drive.google.com/file/d/15y8r_UpKlU9SvV4ILb0C3qCPecS8pvLz/view\n*/\n\nclass PMREMGenerator {\n\n\tconstructor( renderer ) {\n\n\t\tthis._renderer = renderer;\n\t\tthis._pingPongRenderTarget = null;\n\n\t\tthis._lodMax = 0;\n\t\tthis._cubeSize = 0;\n\t\tthis._lodPlanes = [];\n\t\tthis._sizeLods = [];\n\t\tthis._sigmas = [];\n\n\t\tthis._blurMaterial = null;\n\t\tthis._cubemapMaterial = null;\n\t\tthis._equirectMaterial = null;\n\n\t\tthis._compileMaterial( this._blurMaterial );\n\n\t}\n\n\t/**\n\t * Generates a PMREM from a supplied Scene, which can be faster than using an\n\t * image if networking bandwidth is low. Optional sigma specifies a blur radius\n\t * in radians to be applied to the scene before PMREM generation. Optional near\n\t * and far planes ensure the scene is rendered in its entirety (the cubeCamera\n\t * is placed at the origin).\n\t */\n\tfromScene( scene, sigma = 0, near = 0.1, far = 100 ) {\n\n\t\t_oldTarget = this._renderer.getRenderTarget();\n\n\t\tthis._setSize( 256 );\n\n\t\tconst cubeUVRenderTarget = this._allocateTargets();\n\t\tcubeUVRenderTarget.depthBuffer = true;\n\n\t\tthis._sceneToCubeUV( scene, near, far, cubeUVRenderTarget );\n\n\t\tif ( sigma > 0 ) {\n\n\t\t\tthis._blur( cubeUVRenderTarget, 0, 0, sigma );\n\n\t\t}\n\n\t\tthis._applyPMREM( cubeUVRenderTarget );\n\t\tthis._cleanup( cubeUVRenderTarget );\n\n\t\treturn cubeUVRenderTarget;\n\n\t}\n\n\t/**\n\t * Generates a PMREM from an equirectangular texture, which can be either LDR\n\t * or HDR. The ideal input image size is 1k (1024 x 512),\n\t * as this matches best with the 256 x 256 cubemap output.\n\t */\n\tfromEquirectangular( equirectangular, renderTarget = null ) {\n\n\t\treturn this._fromTexture( equirectangular, renderTarget );\n\n\t}\n\n\t/**\n\t * Generates a PMREM from an cubemap texture, which can be either LDR\n\t * or HDR. The ideal input cube size is 256 x 256,\n\t * as this matches best with the 256 x 256 cubemap output.\n\t */\n\tfromCubemap( cubemap, renderTarget = null ) {\n\n\t\treturn this._fromTexture( cubemap, renderTarget );\n\n\t}\n\n\t/**\n\t * Pre-compiles the cubemap shader. You can get faster start-up by invoking this method during\n\t * your texture's network fetch for increased concurrency.\n\t */\n\tcompileCubemapShader() {\n\n\t\tif ( this._cubemapMaterial === null ) {\n\n\t\t\tthis._cubemapMaterial = _getCubemapMaterial();\n\t\t\tthis._compileMaterial( this._cubemapMaterial );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Pre-compiles the equirectangular shader. You can get faster start-up by invoking this method during\n\t * your texture's network fetch for increased concurrency.\n\t */\n\tcompileEquirectangularShader() {\n\n\t\tif ( this._equirectMaterial === null ) {\n\n\t\t\tthis._equirectMaterial = _getEquirectMaterial();\n\t\t\tthis._compileMaterial( this._equirectMaterial );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Disposes of the PMREMGenerator's internal memory. Note that PMREMGenerator is a static class,\n\t * so you should not need more than one PMREMGenerator object. If you do, calling dispose() on\n\t * one of them will cause any others to also become unusable.\n\t */\n\tdispose() {\n\n\t\tthis._dispose();\n\n\t\tif ( this._cubemapMaterial !== null ) this._cubemapMaterial.dispose();\n\t\tif ( this._equirectMaterial !== null ) this._equirectMaterial.dispose();\n\n\t}\n\n\t// private interface\n\n\t_setSize( cubeSize ) {\n\n\t\tthis._lodMax = Math.floor( Math.log2( cubeSize ) );\n\t\tthis._cubeSize = Math.pow( 2, this._lodMax );\n\n\t}\n\n\t_dispose() {\n\n\t\tif ( this._blurMaterial !== null ) this._blurMaterial.dispose();\n\n\t\tif ( this._pingPongRenderTarget !== null ) this._pingPongRenderTarget.dispose();\n\n\t\tfor ( let i = 0; i < this._lodPlanes.length; i ++ ) {\n\n\t\t\tthis._lodPlanes[ i ].dispose();\n\n\t\t}\n\n\t}\n\n\t_cleanup( outputTarget ) {\n\n\t\tthis._renderer.setRenderTarget( _oldTarget );\n\t\toutputTarget.scissorTest = false;\n\t\t_setViewport( outputTarget, 0, 0, outputTarget.width, outputTarget.height );\n\n\t}\n\n\t_fromTexture( texture, renderTarget ) {\n\n\t\tif ( texture.mapping === CubeReflectionMapping || texture.mapping === CubeRefractionMapping ) {\n\n\t\t\tthis._setSize( texture.image.length === 0 ? 16 : ( texture.image[ 0 ].width || texture.image[ 0 ].image.width ) );\n\n\t\t} else { // Equirectangular\n\n\t\t\tthis._setSize( texture.image.width / 4 );\n\n\t\t}\n\n\t\t_oldTarget = this._renderer.getRenderTarget();\n\n\t\tconst cubeUVRenderTarget = renderTarget || this._allocateTargets();\n\t\tthis._textureToCubeUV( texture, cubeUVRenderTarget );\n\t\tthis._applyPMREM( cubeUVRenderTarget );\n\t\tthis._cleanup( cubeUVRenderTarget );\n\n\t\treturn cubeUVRenderTarget;\n\n\t}\n\n\t_allocateTargets() {\n\n\t\tconst width = 3 * Math.max( this._cubeSize, 16 * 7 );\n\t\tconst height = 4 * this._cubeSize;\n\n\t\tconst params = {\n\t\t\tmagFilter: LinearFilter,\n\t\t\tminFilter: LinearFilter,\n\t\t\tgenerateMipmaps: false,\n\t\t\ttype: HalfFloatType,\n\t\t\tformat: RGBAFormat,\n\t\t\tencoding: LinearEncoding,\n\t\t\tdepthBuffer: false\n\t\t};\n\n\t\tconst cubeUVRenderTarget = _createRenderTarget( width, height, params );\n\n\t\tif ( this._pingPongRenderTarget === null || this._pingPongRenderTarget.width !== width ) {\n\n\t\t\tif ( this._pingPongRenderTarget !== null ) {\n\n\t\t\t\tthis._dispose();\n\n\t\t\t}\n\n\t\t\tthis._pingPongRenderTarget = _createRenderTarget( width, height, params );\n\n\t\t\tconst { _lodMax } = this;\n\t\t\t( { sizeLods: this._sizeLods, lodPlanes: this._lodPlanes, sigmas: this._sigmas } = _createPlanes( _lodMax ) );\n\n\t\t\tthis._blurMaterial = _getBlurShader( _lodMax, width, height );\n\n\t\t}\n\n\t\treturn cubeUVRenderTarget;\n\n\t}\n\n\t_compileMaterial( material ) {\n\n\t\tconst tmpMesh = new Mesh( this._lodPlanes[ 0 ], material );\n\t\tthis._renderer.compile( tmpMesh, _flatCamera );\n\n\t}\n\n\t_sceneToCubeUV( scene, near, far, cubeUVRenderTarget ) {\n\n\t\tconst fov = 90;\n\t\tconst aspect = 1;\n\t\tconst cubeCamera = new PerspectiveCamera( fov, aspect, near, far );\n\t\tconst upSign = [ 1, - 1, 1, 1, 1, 1 ];\n\t\tconst forwardSign = [ 1, 1, 1, - 1, - 1, - 1 ];\n\t\tconst renderer = this._renderer;\n\n\t\tconst originalAutoClear = renderer.autoClear;\n\t\tconst toneMapping = renderer.toneMapping;\n\t\trenderer.getClearColor( _clearColor );\n\n\t\trenderer.toneMapping = NoToneMapping;\n\t\trenderer.autoClear = false;\n\n\t\tconst backgroundMaterial = new MeshBasicMaterial( {\n\t\t\tname: 'PMREM.Background',\n\t\t\tside: BackSide,\n\t\t\tdepthWrite: false,\n\t\t\tdepthTest: false,\n\t\t} );\n\n\t\tconst backgroundBox = new Mesh( new BoxGeometry(), backgroundMaterial );\n\n\t\tlet useSolidColor = false;\n\t\tconst background = scene.background;\n\n\t\tif ( background ) {\n\n\t\t\tif ( background.isColor ) {\n\n\t\t\t\tbackgroundMaterial.color.copy( background );\n\t\t\t\tscene.background = null;\n\t\t\t\tuseSolidColor = true;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tbackgroundMaterial.color.copy( _clearColor );\n\t\t\tuseSolidColor = true;\n\n\t\t}\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tconst col = i % 3;\n\n\t\t\tif ( col === 0 ) {\n\n\t\t\t\tcubeCamera.up.set( 0, upSign[ i ], 0 );\n\t\t\t\tcubeCamera.lookAt( forwardSign[ i ], 0, 0 );\n\n\t\t\t} else if ( col === 1 ) {\n\n\t\t\t\tcubeCamera.up.set( 0, 0, upSign[ i ] );\n\t\t\t\tcubeCamera.lookAt( 0, forwardSign[ i ], 0 );\n\n\t\t\t} else {\n\n\t\t\t\tcubeCamera.up.set( 0, upSign[ i ], 0 );\n\t\t\t\tcubeCamera.lookAt( 0, 0, forwardSign[ i ] );\n\n\t\t\t}\n\n\t\t\tconst size = this._cubeSize;\n\n\t\t\t_setViewport( cubeUVRenderTarget, col * size, i > 2 ? size : 0, size, size );\n\n\t\t\trenderer.setRenderTarget( cubeUVRenderTarget );\n\n\t\t\tif ( useSolidColor ) {\n\n\t\t\t\trenderer.render( backgroundBox, cubeCamera );\n\n\t\t\t}\n\n\t\t\trenderer.render( scene, cubeCamera );\n\n\t\t}\n\n\t\tbackgroundBox.geometry.dispose();\n\t\tbackgroundBox.material.dispose();\n\n\t\trenderer.toneMapping = toneMapping;\n\t\trenderer.autoClear = originalAutoClear;\n\t\tscene.background = background;\n\n\t}\n\n\t_textureToCubeUV( texture, cubeUVRenderTarget ) {\n\n\t\tconst renderer = this._renderer;\n\n\t\tconst isCubeTexture = ( texture.mapping === CubeReflectionMapping || texture.mapping === CubeRefractionMapping );\n\n\t\tif ( isCubeTexture ) {\n\n\t\t\tif ( this._cubemapMaterial === null ) {\n\n\t\t\t\tthis._cubemapMaterial = _getCubemapMaterial();\n\n\t\t\t}\n\n\t\t\tthis._cubemapMaterial.uniforms.flipEnvMap.value = ( texture.isRenderTargetTexture === false ) ? - 1 : 1;\n\n\t\t} else {\n\n\t\t\tif ( this._equirectMaterial === null ) {\n\n\t\t\t\tthis._equirectMaterial = _getEquirectMaterial();\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst material = isCubeTexture ? this._cubemapMaterial : this._equirectMaterial;\n\t\tconst mesh = new Mesh( this._lodPlanes[ 0 ], material );\n\n\t\tconst uniforms = material.uniforms;\n\n\t\tuniforms[ 'envMap' ].value = texture;\n\n\t\tconst size = this._cubeSize;\n\n\t\t_setViewport( cubeUVRenderTarget, 0, 0, 3 * size, 2 * size );\n\n\t\trenderer.setRenderTarget( cubeUVRenderTarget );\n\t\trenderer.render( mesh, _flatCamera );\n\n\t}\n\n\t_applyPMREM( cubeUVRenderTarget ) {\n\n\t\tconst renderer = this._renderer;\n\t\tconst autoClear = renderer.autoClear;\n\t\trenderer.autoClear = false;\n\n\t\tfor ( let i = 1; i < this._lodPlanes.length; i ++ ) {\n\n\t\t\tconst sigma = Math.sqrt( this._sigmas[ i ] * this._sigmas[ i ] - this._sigmas[ i - 1 ] * this._sigmas[ i - 1 ] );\n\n\t\t\tconst poleAxis = _axisDirections[ ( i - 1 ) % _axisDirections.length ];\n\n\t\t\tthis._blur( cubeUVRenderTarget, i - 1, i, sigma, poleAxis );\n\n\t\t}\n\n\t\trenderer.autoClear = autoClear;\n\n\t}\n\n\t/**\n\t * This is a two-pass Gaussian blur for a cubemap. Normally this is done\n\t * vertically and horizontally, but this breaks down on a cube. Here we apply\n\t * the blur latitudinally (around the poles), and then longitudinally (towards\n\t * the poles) to approximate the orthogonally-separable blur. It is least\n\t * accurate at the poles, but still does a decent job.\n\t */\n\t_blur( cubeUVRenderTarget, lodIn, lodOut, sigma, poleAxis ) {\n\n\t\tconst pingPongRenderTarget = this._pingPongRenderTarget;\n\n\t\tthis._halfBlur(\n\t\t\tcubeUVRenderTarget,\n\t\t\tpingPongRenderTarget,\n\t\t\tlodIn,\n\t\t\tlodOut,\n\t\t\tsigma,\n\t\t\t'latitudinal',\n\t\t\tpoleAxis );\n\n\t\tthis._halfBlur(\n\t\t\tpingPongRenderTarget,\n\t\t\tcubeUVRenderTarget,\n\t\t\tlodOut,\n\t\t\tlodOut,\n\t\t\tsigma,\n\t\t\t'longitudinal',\n\t\t\tpoleAxis );\n\n\t}\n\n\t_halfBlur( targetIn, targetOut, lodIn, lodOut, sigmaRadians, direction, poleAxis ) {\n\n\t\tconst renderer = this._renderer;\n\t\tconst blurMaterial = this._blurMaterial;\n\n\t\tif ( direction !== 'latitudinal' && direction !== 'longitudinal' ) {\n\n\t\t\tconsole.error(\n\t\t\t\t'blur direction must be either latitudinal or longitudinal!' );\n\n\t\t}\n\n\t\t// Number of standard deviations at which to cut off the discrete approximation.\n\t\tconst STANDARD_DEVIATIONS = 3;\n\n\t\tconst blurMesh = new Mesh( this._lodPlanes[ lodOut ], blurMaterial );\n\t\tconst blurUniforms = blurMaterial.uniforms;\n\n\t\tconst pixels = this._sizeLods[ lodIn ] - 1;\n\t\tconst radiansPerPixel = isFinite( sigmaRadians ) ? Math.PI / ( 2 * pixels ) : 2 * Math.PI / ( 2 * MAX_SAMPLES - 1 );\n\t\tconst sigmaPixels = sigmaRadians / radiansPerPixel;\n\t\tconst samples = isFinite( sigmaRadians ) ? 1 + Math.floor( STANDARD_DEVIATIONS * sigmaPixels ) : MAX_SAMPLES;\n\n\t\tif ( samples > MAX_SAMPLES ) {\n\n\t\t\tconsole.warn( `sigmaRadians, ${\n\t\t\t\tsigmaRadians}, is too large and will clip, as it requested ${\n\t\t\t\tsamples} samples when the maximum is set to ${MAX_SAMPLES}` );\n\n\t\t}\n\n\t\tconst weights = [];\n\t\tlet sum = 0;\n\n\t\tfor ( let i = 0; i < MAX_SAMPLES; ++ i ) {\n\n\t\t\tconst x = i / sigmaPixels;\n\t\t\tconst weight = Math.exp( - x * x / 2 );\n\t\t\tweights.push( weight );\n\n\t\t\tif ( i === 0 ) {\n\n\t\t\t\tsum += weight;\n\n\t\t\t} else if ( i < samples ) {\n\n\t\t\t\tsum += 2 * weight;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( let i = 0; i < weights.length; i ++ ) {\n\n\t\t\tweights[ i ] = weights[ i ] / sum;\n\n\t\t}\n\n\t\tblurUniforms[ 'envMap' ].value = targetIn.texture;\n\t\tblurUniforms[ 'samples' ].value = samples;\n\t\tblurUniforms[ 'weights' ].value = weights;\n\t\tblurUniforms[ 'latitudinal' ].value = direction === 'latitudinal';\n\n\t\tif ( poleAxis ) {\n\n\t\t\tblurUniforms[ 'poleAxis' ].value = poleAxis;\n\n\t\t}\n\n\t\tconst { _lodMax } = this;\n\t\tblurUniforms[ 'dTheta' ].value = radiansPerPixel;\n\t\tblurUniforms[ 'mipInt' ].value = _lodMax - lodIn;\n\n\t\tconst outputSize = this._sizeLods[ lodOut ];\n\t\tconst x = 3 * outputSize * ( lodOut > _lodMax - LOD_MIN ? lodOut - _lodMax + LOD_MIN : 0 );\n\t\tconst y = 4 * ( this._cubeSize - outputSize );\n\n\t\t_setViewport( targetOut, x, y, 3 * outputSize, 2 * outputSize );\n\t\trenderer.setRenderTarget( targetOut );\n\t\trenderer.render( blurMesh, _flatCamera );\n\n\t}\n\n}\n\n\n\nfunction _createPlanes( lodMax ) {\n\n\tconst lodPlanes = [];\n\tconst sizeLods = [];\n\tconst sigmas = [];\n\n\tlet lod = lodMax;\n\n\tconst totalLods = lodMax - LOD_MIN + 1 + EXTRA_LOD_SIGMA.length;\n\n\tfor ( let i = 0; i < totalLods; i ++ ) {\n\n\t\tconst sizeLod = Math.pow( 2, lod );\n\t\tsizeLods.push( sizeLod );\n\t\tlet sigma = 1.0 / sizeLod;\n\n\t\tif ( i > lodMax - LOD_MIN ) {\n\n\t\t\tsigma = EXTRA_LOD_SIGMA[ i - lodMax + LOD_MIN - 1 ];\n\n\t\t} else if ( i === 0 ) {\n\n\t\t\tsigma = 0;\n\n\t\t}\n\n\t\tsigmas.push( sigma );\n\n\t\tconst texelSize = 1.0 / ( sizeLod - 2 );\n\t\tconst min = - texelSize;\n\t\tconst max = 1 + texelSize;\n\t\tconst uv1 = [ min, min, max, min, max, max, min, min, max, max, min, max ];\n\n\t\tconst cubeFaces = 6;\n\t\tconst vertices = 6;\n\t\tconst positionSize = 3;\n\t\tconst uvSize = 2;\n\t\tconst faceIndexSize = 1;\n\n\t\tconst position = new Float32Array( positionSize * vertices * cubeFaces );\n\t\tconst uv = new Float32Array( uvSize * vertices * cubeFaces );\n\t\tconst faceIndex = new Float32Array( faceIndexSize * vertices * cubeFaces );\n\n\t\tfor ( let face = 0; face < cubeFaces; face ++ ) {\n\n\t\t\tconst x = ( face % 3 ) * 2 / 3 - 1;\n\t\t\tconst y = face > 2 ? 0 : - 1;\n\t\t\tconst coordinates = [\n\t\t\t\tx, y, 0,\n\t\t\t\tx + 2 / 3, y, 0,\n\t\t\t\tx + 2 / 3, y + 1, 0,\n\t\t\t\tx, y, 0,\n\t\t\t\tx + 2 / 3, y + 1, 0,\n\t\t\t\tx, y + 1, 0\n\t\t\t];\n\t\t\tposition.set( coordinates, positionSize * vertices * face );\n\t\t\tuv.set( uv1, uvSize * vertices * face );\n\t\t\tconst fill = [ face, face, face, face, face, face ];\n\t\t\tfaceIndex.set( fill, faceIndexSize * vertices * face );\n\n\t\t}\n\n\t\tconst planes = new BufferGeometry();\n\t\tplanes.setAttribute( 'position', new BufferAttribute( position, positionSize ) );\n\t\tplanes.setAttribute( 'uv', new BufferAttribute( uv, uvSize ) );\n\t\tplanes.setAttribute( 'faceIndex', new BufferAttribute( faceIndex, faceIndexSize ) );\n\t\tlodPlanes.push( planes );\n\n\t\tif ( lod > LOD_MIN ) {\n\n\t\t\tlod --;\n\n\t\t}\n\n\t}\n\n\treturn { lodPlanes, sizeLods, sigmas };\n\n}\n\nfunction _createRenderTarget( width, height, params ) {\n\n\tconst cubeUVRenderTarget = new WebGLRenderTarget( width, height, params );\n\tcubeUVRenderTarget.texture.mapping = CubeUVReflectionMapping;\n\tcubeUVRenderTarget.texture.name = 'PMREM.cubeUv';\n\tcubeUVRenderTarget.scissorTest = true;\n\treturn cubeUVRenderTarget;\n\n}\n\nfunction _setViewport( target, x, y, width, height ) {\n\n\ttarget.viewport.set( x, y, width, height );\n\ttarget.scissor.set( x, y, width, height );\n\n}\n\nfunction _getBlurShader( lodMax, width, height ) {\n\n\tconst weights = new Float32Array( MAX_SAMPLES );\n\tconst poleAxis = new Vector3( 0, 1, 0 );\n\tconst shaderMaterial = new ShaderMaterial( {\n\n\t\tname: 'SphericalGaussianBlur',\n\n\t\tdefines: {\n\t\t\t'n': MAX_SAMPLES,\n\t\t\t'CUBEUV_TEXEL_WIDTH': 1.0 / width,\n\t\t\t'CUBEUV_TEXEL_HEIGHT': 1.0 / height,\n\t\t\t'CUBEUV_MAX_MIP': `${lodMax}.0`,\n\t\t},\n\n\t\tuniforms: {\n\t\t\t'envMap': { value: null },\n\t\t\t'samples': { value: 1 },\n\t\t\t'weights': { value: weights },\n\t\t\t'latitudinal': { value: false },\n\t\t\t'dTheta': { value: 0 },\n\t\t\t'mipInt': { value: 0 },\n\t\t\t'poleAxis': { value: poleAxis }\n\t\t},\n\n\t\tvertexShader: _getCommonVertexShader(),\n\n\t\tfragmentShader: /* glsl */`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\t\t\tuniform int samples;\n\t\t\tuniform float weights[ n ];\n\t\t\tuniform bool latitudinal;\n\t\t\tuniform float dTheta;\n\t\t\tuniform float mipInt;\n\t\t\tuniform vec3 poleAxis;\n\n\t\t\t#define ENVMAP_TYPE_CUBE_UV\n\t\t\t#include \n\n\t\t\tvec3 getSample( float theta, vec3 axis ) {\n\n\t\t\t\tfloat cosTheta = cos( theta );\n\t\t\t\t// Rodrigues' axis-angle rotation\n\t\t\t\tvec3 sampleDirection = vOutputDirection * cosTheta\n\t\t\t\t\t+ cross( axis, vOutputDirection ) * sin( theta )\n\t\t\t\t\t+ axis * dot( axis, vOutputDirection ) * ( 1.0 - cosTheta );\n\n\t\t\t\treturn bilinearCubeUV( envMap, sampleDirection, mipInt );\n\n\t\t\t}\n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 axis = latitudinal ? poleAxis : cross( poleAxis, vOutputDirection );\n\n\t\t\t\tif ( all( equal( axis, vec3( 0.0 ) ) ) ) {\n\n\t\t\t\t\taxis = vec3( vOutputDirection.z, 0.0, - vOutputDirection.x );\n\n\t\t\t\t}\n\n\t\t\t\taxis = normalize( axis );\n\n\t\t\t\tgl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t\t\t\tgl_FragColor.rgb += weights[ 0 ] * getSample( 0.0, axis );\n\n\t\t\t\tfor ( int i = 1; i < n; i++ ) {\n\n\t\t\t\t\tif ( i >= samples ) {\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfloat theta = dTheta * float( i );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( -1.0 * theta, axis );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( theta, axis );\n\n\t\t\t\t}\n\n\t\t\t}\n\t\t`,\n\n\t\tblending: NoBlending,\n\t\tdepthTest: false,\n\t\tdepthWrite: false\n\n\t} );\n\n\treturn shaderMaterial;\n\n}\n\nfunction _getEquirectMaterial() {\n\n\treturn new ShaderMaterial( {\n\n\t\tname: 'EquirectangularToCubeUV',\n\n\t\tuniforms: {\n\t\t\t'envMap': { value: null }\n\t\t},\n\n\t\tvertexShader: _getCommonVertexShader(),\n\n\t\tfragmentShader: /* glsl */`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\n\t\t\t#include \n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 outputDirection = normalize( vOutputDirection );\n\t\t\t\tvec2 uv = equirectUv( outputDirection );\n\n\t\t\t\tgl_FragColor = vec4( texture2D ( envMap, uv ).rgb, 1.0 );\n\n\t\t\t}\n\t\t`,\n\n\t\tblending: NoBlending,\n\t\tdepthTest: false,\n\t\tdepthWrite: false\n\n\t} );\n\n}\n\nfunction _getCubemapMaterial() {\n\n\treturn new ShaderMaterial( {\n\n\t\tname: 'CubemapToCubeUV',\n\n\t\tuniforms: {\n\t\t\t'envMap': { value: null },\n\t\t\t'flipEnvMap': { value: - 1 }\n\t\t},\n\n\t\tvertexShader: _getCommonVertexShader(),\n\n\t\tfragmentShader: /* glsl */`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tuniform float flipEnvMap;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform samplerCube envMap;\n\n\t\t\tvoid main() {\n\n\t\t\t\tgl_FragColor = textureCube( envMap, vec3( flipEnvMap * vOutputDirection.x, vOutputDirection.yz ) );\n\n\t\t\t}\n\t\t`,\n\n\t\tblending: NoBlending,\n\t\tdepthTest: false,\n\t\tdepthWrite: false\n\n\t} );\n\n}\n\nfunction _getCommonVertexShader() {\n\n\treturn /* glsl */`\n\n\t\tprecision mediump float;\n\t\tprecision mediump int;\n\n\t\tattribute float faceIndex;\n\n\t\tvarying vec3 vOutputDirection;\n\n\t\t// RH coordinate system; PMREM face-indexing convention\n\t\tvec3 getDirection( vec2 uv, float face ) {\n\n\t\t\tuv = 2.0 * uv - 1.0;\n\n\t\t\tvec3 direction = vec3( uv, 1.0 );\n\n\t\t\tif ( face == 0.0 ) {\n\n\t\t\t\tdirection = direction.zyx; // ( 1, v, u ) pos x\n\n\t\t\t} else if ( face == 1.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xz *= -1.0; // ( -u, 1, -v ) pos y\n\n\t\t\t} else if ( face == 2.0 ) {\n\n\t\t\t\tdirection.x *= -1.0; // ( -u, v, 1 ) pos z\n\n\t\t\t} else if ( face == 3.0 ) {\n\n\t\t\t\tdirection = direction.zyx;\n\t\t\t\tdirection.xz *= -1.0; // ( -1, v, -u ) neg x\n\n\t\t\t} else if ( face == 4.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xy *= -1.0; // ( -u, -1, v ) neg y\n\n\t\t\t} else if ( face == 5.0 ) {\n\n\t\t\t\tdirection.z *= -1.0; // ( u, v, -1 ) neg z\n\n\t\t\t}\n\n\t\t\treturn direction;\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvOutputDirection = getDirection( uv, faceIndex );\n\t\t\tgl_Position = vec4( position, 1.0 );\n\n\t\t}\n\t`;\n\n}\n\nfunction WebGLCubeUVMaps( renderer ) {\n\n\tlet cubeUVmaps = new WeakMap();\n\n\tlet pmremGenerator = null;\n\n\tfunction get( texture ) {\n\n\t\tif ( texture && texture.isTexture ) {\n\n\t\t\tconst mapping = texture.mapping;\n\n\t\t\tconst isEquirectMap = ( mapping === EquirectangularReflectionMapping || mapping === EquirectangularRefractionMapping );\n\t\t\tconst isCubeMap = ( mapping === CubeReflectionMapping || mapping === CubeRefractionMapping );\n\n\t\t\t// equirect/cube map to cubeUV conversion\n\n\t\t\tif ( isEquirectMap || isCubeMap ) {\n\n\t\t\t\tif ( texture.isRenderTargetTexture && texture.needsPMREMUpdate === true ) {\n\n\t\t\t\t\ttexture.needsPMREMUpdate = false;\n\n\t\t\t\t\tlet renderTarget = cubeUVmaps.get( texture );\n\n\t\t\t\t\tif ( pmremGenerator === null ) pmremGenerator = new PMREMGenerator( renderer );\n\n\t\t\t\t\trenderTarget = isEquirectMap ? pmremGenerator.fromEquirectangular( texture, renderTarget ) : pmremGenerator.fromCubemap( texture, renderTarget );\n\t\t\t\t\tcubeUVmaps.set( texture, renderTarget );\n\n\t\t\t\t\treturn renderTarget.texture;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( cubeUVmaps.has( texture ) ) {\n\n\t\t\t\t\t\treturn cubeUVmaps.get( texture ).texture;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconst image = texture.image;\n\n\t\t\t\t\t\tif ( ( isEquirectMap && image && image.height > 0 ) || ( isCubeMap && image && isCubeTextureComplete( image ) ) ) {\n\n\t\t\t\t\t\t\tif ( pmremGenerator === null ) pmremGenerator = new PMREMGenerator( renderer );\n\n\t\t\t\t\t\t\tconst renderTarget = isEquirectMap ? pmremGenerator.fromEquirectangular( texture ) : pmremGenerator.fromCubemap( texture );\n\t\t\t\t\t\t\tcubeUVmaps.set( texture, renderTarget );\n\n\t\t\t\t\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t\t\t\t\t\treturn renderTarget.texture;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// image not yet ready. try the conversion next frame\n\n\t\t\t\t\t\t\treturn 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}\n\n\t\treturn texture;\n\n\t}\n\n\tfunction isCubeTextureComplete( image ) {\n\n\t\tlet count = 0;\n\t\tconst length = 6;\n\n\t\tfor ( let i = 0; i < length; i ++ ) {\n\n\t\t\tif ( image[ i ] !== undefined ) count ++;\n\n\t\t}\n\n\t\treturn count === length;\n\n\n\t}\n\n\tfunction onTextureDispose( event ) {\n\n\t\tconst texture = event.target;\n\n\t\ttexture.removeEventListener( 'dispose', onTextureDispose );\n\n\t\tconst cubemapUV = cubeUVmaps.get( texture );\n\n\t\tif ( cubemapUV !== undefined ) {\n\n\t\t\tcubeUVmaps.delete( texture );\n\t\t\tcubemapUV.dispose();\n\n\t\t}\n\n\t}\n\n\tfunction dispose() {\n\n\t\tcubeUVmaps = new WeakMap();\n\n\t\tif ( pmremGenerator !== null ) {\n\n\t\t\tpmremGenerator.dispose();\n\t\t\tpmremGenerator = null;\n\n\t\t}\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\nfunction WebGLExtensions( gl ) {\n\n\tconst extensions = {};\n\n\tfunction getExtension( name ) {\n\n\t\tif ( extensions[ name ] !== undefined ) {\n\n\t\t\treturn extensions[ name ];\n\n\t\t}\n\n\t\tlet extension;\n\n\t\tswitch ( name ) {\n\n\t\t\tcase 'WEBGL_depth_texture':\n\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\tbreak;\n\n\t\t\tcase 'EXT_texture_filter_anisotropic':\n\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\tbreak;\n\n\t\t\tcase 'WEBGL_compressed_texture_s3tc':\n\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\tbreak;\n\n\t\t\tcase 'WEBGL_compressed_texture_pvrtc':\n\t\t\t\textension = gl.getExtension( 'WEBGL_compressed_texture_pvrtc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_pvrtc' );\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\textension = gl.getExtension( name );\n\n\t\t}\n\n\t\textensions[ name ] = extension;\n\n\t\treturn extension;\n\n\t}\n\n\treturn {\n\n\t\thas: function ( name ) {\n\n\t\t\treturn getExtension( name ) !== null;\n\n\t\t},\n\n\t\tinit: function ( capabilities ) {\n\n\t\t\tif ( capabilities.isWebGL2 ) {\n\n\t\t\t\tgetExtension( 'EXT_color_buffer_float' );\n\n\t\t\t} else {\n\n\t\t\t\tgetExtension( 'WEBGL_depth_texture' );\n\t\t\t\tgetExtension( 'OES_texture_float' );\n\t\t\t\tgetExtension( 'OES_texture_half_float' );\n\t\t\t\tgetExtension( 'OES_texture_half_float_linear' );\n\t\t\t\tgetExtension( 'OES_standard_derivatives' );\n\t\t\t\tgetExtension( 'OES_element_index_uint' );\n\t\t\t\tgetExtension( 'OES_vertex_array_object' );\n\t\t\t\tgetExtension( 'ANGLE_instanced_arrays' );\n\n\t\t\t}\n\n\t\t\tgetExtension( 'OES_texture_float_linear' );\n\t\t\tgetExtension( 'EXT_color_buffer_half_float' );\n\t\t\tgetExtension( 'WEBGL_multisampled_render_to_texture' );\n\n\t\t},\n\n\t\tget: function ( name ) {\n\n\t\t\tconst extension = getExtension( name );\n\n\t\t\tif ( extension === null ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: ' + name + ' extension not supported.' );\n\n\t\t\t}\n\n\t\t\treturn extension;\n\n\t\t}\n\n\t};\n\n}\n\nfunction WebGLGeometries( gl, attributes, info, bindingStates ) {\n\n\tconst geometries = {};\n\tconst wireframeAttributes = new WeakMap();\n\n\tfunction onGeometryDispose( event ) {\n\n\t\tconst geometry = event.target;\n\n\t\tif ( geometry.index !== null ) {\n\n\t\t\tattributes.remove( geometry.index );\n\n\t\t}\n\n\t\tfor ( const name in geometry.attributes ) {\n\n\t\t\tattributes.remove( geometry.attributes[ name ] );\n\n\t\t}\n\n\t\tgeometry.removeEventListener( 'dispose', onGeometryDispose );\n\n\t\tdelete geometries[ geometry.id ];\n\n\t\tconst attribute = wireframeAttributes.get( geometry );\n\n\t\tif ( attribute ) {\n\n\t\t\tattributes.remove( attribute );\n\t\t\twireframeAttributes.delete( geometry );\n\n\t\t}\n\n\t\tbindingStates.releaseStatesOfGeometry( geometry );\n\n\t\tif ( geometry.isInstancedBufferGeometry === true ) {\n\n\t\t\tdelete geometry._maxInstanceCount;\n\n\t\t}\n\n\t\t//\n\n\t\tinfo.memory.geometries --;\n\n\t}\n\n\tfunction get( object, geometry ) {\n\n\t\tif ( geometries[ geometry.id ] === true ) return geometry;\n\n\t\tgeometry.addEventListener( 'dispose', onGeometryDispose );\n\n\t\tgeometries[ geometry.id ] = true;\n\n\t\tinfo.memory.geometries ++;\n\n\t\treturn geometry;\n\n\t}\n\n\tfunction update( geometry ) {\n\n\t\tconst geometryAttributes = geometry.attributes;\n\n\t\t// Updating index buffer in VAO now. See WebGLBindingStates.\n\n\t\tfor ( const name in geometryAttributes ) {\n\n\t\t\tattributes.update( geometryAttributes[ name ], 34962 );\n\n\t\t}\n\n\t\t// morph targets\n\n\t\tconst morphAttributes = geometry.morphAttributes;\n\n\t\tfor ( const name in morphAttributes ) {\n\n\t\t\tconst array = morphAttributes[ name ];\n\n\t\t\tfor ( let i = 0, l = array.length; i < l; i ++ ) {\n\n\t\t\t\tattributes.update( array[ i ], 34962 );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction updateWireframeAttribute( geometry ) {\n\n\t\tconst indices = [];\n\n\t\tconst geometryIndex = geometry.index;\n\t\tconst geometryPosition = geometry.attributes.position;\n\t\tlet version = 0;\n\n\t\tif ( geometryIndex !== null ) {\n\n\t\t\tconst array = geometryIndex.array;\n\t\t\tversion = geometryIndex.version;\n\n\t\t\tfor ( let i = 0, l = array.length; i < l; i += 3 ) {\n\n\t\t\t\tconst a = array[ i + 0 ];\n\t\t\t\tconst b = array[ i + 1 ];\n\t\t\t\tconst c = array[ i + 2 ];\n\n\t\t\t\tindices.push( a, b, b, c, c, a );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst array = geometryPosition.array;\n\t\t\tversion = geometryPosition.version;\n\n\t\t\tfor ( let i = 0, l = ( array.length / 3 ) - 1; i < l; i += 3 ) {\n\n\t\t\t\tconst a = i + 0;\n\t\t\t\tconst b = i + 1;\n\t\t\t\tconst c = i + 2;\n\n\t\t\t\tindices.push( a, b, b, c, c, a );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst attribute = new ( arrayNeedsUint32( indices ) ? Uint32BufferAttribute : Uint16BufferAttribute )( indices, 1 );\n\t\tattribute.version = version;\n\n\t\t// Updating index buffer in VAO now. See WebGLBindingStates\n\n\t\t//\n\n\t\tconst previousAttribute = wireframeAttributes.get( geometry );\n\n\t\tif ( previousAttribute ) attributes.remove( previousAttribute );\n\n\t\t//\n\n\t\twireframeAttributes.set( geometry, attribute );\n\n\t}\n\n\tfunction getWireframeAttribute( geometry ) {\n\n\t\tconst currentAttribute = wireframeAttributes.get( geometry );\n\n\t\tif ( currentAttribute ) {\n\n\t\t\tconst geometryIndex = geometry.index;\n\n\t\t\tif ( geometryIndex !== null ) {\n\n\t\t\t\t// if the attribute is obsolete, create a new one\n\n\t\t\t\tif ( currentAttribute.version < geometryIndex.version ) {\n\n\t\t\t\t\tupdateWireframeAttribute( geometry );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tupdateWireframeAttribute( geometry );\n\n\t\t}\n\n\t\treturn wireframeAttributes.get( geometry );\n\n\t}\n\n\treturn {\n\n\t\tget: get,\n\t\tupdate: update,\n\n\t\tgetWireframeAttribute: getWireframeAttribute\n\n\t};\n\n}\n\nfunction WebGLIndexedBufferRenderer( gl, extensions, info, capabilities ) {\n\n\tconst isWebGL2 = capabilities.isWebGL2;\n\n\tlet mode;\n\n\tfunction setMode( value ) {\n\n\t\tmode = value;\n\n\t}\n\n\tlet type, bytesPerElement;\n\n\tfunction setIndex( value ) {\n\n\t\ttype = value.type;\n\t\tbytesPerElement = value.bytesPerElement;\n\n\t}\n\n\tfunction render( start, count ) {\n\n\t\tgl.drawElements( mode, count, type, start * bytesPerElement );\n\n\t\tinfo.update( count, mode, 1 );\n\n\t}\n\n\tfunction renderInstances( start, count, primcount ) {\n\n\t\tif ( primcount === 0 ) return;\n\n\t\tlet extension, methodName;\n\n\t\tif ( isWebGL2 ) {\n\n\t\t\textension = gl;\n\t\t\tmethodName = 'drawElementsInstanced';\n\n\t\t} else {\n\n\t\t\textension = extensions.get( 'ANGLE_instanced_arrays' );\n\t\t\tmethodName = 'drawElementsInstancedANGLE';\n\n\t\t\tif ( extension === null ) {\n\n\t\t\t\tconsole.error( 'THREE.WebGLIndexedBufferRenderer: 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}\n\n\t\textension[ methodName ]( mode, count, type, start * bytesPerElement, primcount );\n\n\t\tinfo.update( count, mode, primcount );\n\n\t}\n\n\t//\n\n\tthis.setMode = setMode;\n\tthis.setIndex = setIndex;\n\tthis.render = render;\n\tthis.renderInstances = renderInstances;\n\n}\n\nfunction WebGLInfo( gl ) {\n\n\tconst memory = {\n\t\tgeometries: 0,\n\t\ttextures: 0\n\t};\n\n\tconst render = {\n\t\tframe: 0,\n\t\tcalls: 0,\n\t\ttriangles: 0,\n\t\tpoints: 0,\n\t\tlines: 0\n\t};\n\n\tfunction update( count, mode, instanceCount ) {\n\n\t\trender.calls ++;\n\n\t\tswitch ( mode ) {\n\n\t\t\tcase 4:\n\t\t\t\trender.triangles += instanceCount * ( count / 3 );\n\t\t\t\tbreak;\n\n\t\t\tcase 1:\n\t\t\t\trender.lines += instanceCount * ( count / 2 );\n\t\t\t\tbreak;\n\n\t\t\tcase 3:\n\t\t\t\trender.lines += instanceCount * ( count - 1 );\n\t\t\t\tbreak;\n\n\t\t\tcase 2:\n\t\t\t\trender.lines += instanceCount * count;\n\t\t\t\tbreak;\n\n\t\t\tcase 0:\n\t\t\t\trender.points += instanceCount * count;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tconsole.error( 'THREE.WebGLInfo: Unknown draw mode:', mode );\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\tfunction reset() {\n\n\t\trender.frame ++;\n\t\trender.calls = 0;\n\t\trender.triangles = 0;\n\t\trender.points = 0;\n\t\trender.lines = 0;\n\n\t}\n\n\treturn {\n\t\tmemory: memory,\n\t\trender: render,\n\t\tprograms: null,\n\t\tautoReset: true,\n\t\treset: reset,\n\t\tupdate: update\n\t};\n\n}\n\nfunction numericalSort( a, b ) {\n\n\treturn a[ 0 ] - b[ 0 ];\n\n}\n\nfunction absNumericalSort( a, b ) {\n\n\treturn Math.abs( b[ 1 ] ) - Math.abs( a[ 1 ] );\n\n}\n\nfunction denormalize( morph, attribute ) {\n\n\tlet denominator = 1;\n\tconst array = attribute.isInterleavedBufferAttribute ? attribute.data.array : attribute.array;\n\n\tif ( array instanceof Int8Array ) denominator = 127;\n\telse if ( array instanceof Uint8Array ) denominator = 255;\n\telse if ( array instanceof Uint16Array ) denominator = 65535;\n\telse if ( array instanceof Int16Array ) denominator = 32767;\n\telse if ( array instanceof Int32Array ) denominator = 2147483647;\n\telse console.error( 'THREE.WebGLMorphtargets: Unsupported morph attribute data type: ', array );\n\n\tmorph.divideScalar( denominator );\n\n}\n\nfunction WebGLMorphtargets( gl, capabilities, textures ) {\n\n\tconst influencesList = {};\n\tconst morphInfluences = new Float32Array( 8 );\n\tconst morphTextures = new WeakMap();\n\tconst morph = new Vector4();\n\n\tconst workInfluences = [];\n\n\tfor ( let i = 0; i < 8; i ++ ) {\n\n\t\tworkInfluences[ i ] = [ i, 0 ];\n\n\t}\n\n\tfunction update( object, geometry, material, program ) {\n\n\t\tconst objectInfluences = object.morphTargetInfluences;\n\n\t\tif ( capabilities.isWebGL2 === true ) {\n\n\t\t\t// instead of using attributes, the WebGL 2 code path encodes morph targets\n\t\t\t// into an array of data textures. Each layer represents a single morph target.\n\n\t\t\tconst morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color;\n\t\t\tconst morphTargetsCount = ( morphAttribute !== undefined ) ? morphAttribute.length : 0;\n\n\t\t\tlet entry = morphTextures.get( geometry );\n\n\t\t\tif ( entry === undefined || entry.count !== morphTargetsCount ) {\n\n\t\t\t\tif ( entry !== undefined ) entry.texture.dispose();\n\n\t\t\t\tconst hasMorphPosition = geometry.morphAttributes.position !== undefined;\n\t\t\t\tconst hasMorphNormals = geometry.morphAttributes.normal !== undefined;\n\t\t\t\tconst hasMorphColors = geometry.morphAttributes.color !== undefined;\n\n\t\t\t\tconst morphTargets = geometry.morphAttributes.position || [];\n\t\t\t\tconst morphNormals = geometry.morphAttributes.normal || [];\n\t\t\t\tconst morphColors = geometry.morphAttributes.color || [];\n\n\t\t\t\tlet vertexDataCount = 0;\n\n\t\t\t\tif ( hasMorphPosition === true ) vertexDataCount = 1;\n\t\t\t\tif ( hasMorphNormals === true ) vertexDataCount = 2;\n\t\t\t\tif ( hasMorphColors === true ) vertexDataCount = 3;\n\n\t\t\t\tlet width = geometry.attributes.position.count * vertexDataCount;\n\t\t\t\tlet height = 1;\n\n\t\t\t\tif ( width > capabilities.maxTextureSize ) {\n\n\t\t\t\t\theight = Math.ceil( width / capabilities.maxTextureSize );\n\t\t\t\t\twidth = capabilities.maxTextureSize;\n\n\t\t\t\t}\n\n\t\t\t\tconst buffer = new Float32Array( width * height * 4 * morphTargetsCount );\n\n\t\t\t\tconst texture = new DataArrayTexture( buffer, width, height, morphTargetsCount );\n\t\t\t\ttexture.type = FloatType;\n\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t// fill buffer\n\n\t\t\t\tconst vertexDataStride = vertexDataCount * 4;\n\n\t\t\t\tfor ( let i = 0; i < morphTargetsCount; i ++ ) {\n\n\t\t\t\t\tconst morphTarget = morphTargets[ i ];\n\t\t\t\t\tconst morphNormal = morphNormals[ i ];\n\t\t\t\t\tconst morphColor = morphColors[ i ];\n\n\t\t\t\t\tconst offset = width * height * 4 * i;\n\n\t\t\t\t\tfor ( let j = 0; j < morphTarget.count; j ++ ) {\n\n\t\t\t\t\t\tconst stride = j * vertexDataStride;\n\n\t\t\t\t\t\tif ( hasMorphPosition === true ) {\n\n\t\t\t\t\t\t\tmorph.fromBufferAttribute( morphTarget, j );\n\n\t\t\t\t\t\t\tif ( morphTarget.normalized === true ) denormalize( morph, morphTarget );\n\n\t\t\t\t\t\t\tbuffer[ offset + stride + 0 ] = morph.x;\n\t\t\t\t\t\t\tbuffer[ offset + stride + 1 ] = morph.y;\n\t\t\t\t\t\t\tbuffer[ offset + stride + 2 ] = morph.z;\n\t\t\t\t\t\t\tbuffer[ offset + stride + 3 ] = 0;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( hasMorphNormals === true ) {\n\n\t\t\t\t\t\t\tmorph.fromBufferAttribute( morphNormal, j );\n\n\t\t\t\t\t\t\tif ( morphNormal.normalized === true ) denormalize( morph, morphNormal );\n\n\t\t\t\t\t\t\tbuffer[ offset + stride + 4 ] = morph.x;\n\t\t\t\t\t\t\tbuffer[ offset + stride + 5 ] = morph.y;\n\t\t\t\t\t\t\tbuffer[ offset + stride + 6 ] = morph.z;\n\t\t\t\t\t\t\tbuffer[ offset + stride + 7 ] = 0;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( hasMorphColors === true ) {\n\n\t\t\t\t\t\t\tmorph.fromBufferAttribute( morphColor, j );\n\n\t\t\t\t\t\t\tif ( morphColor.normalized === true ) denormalize( morph, morphColor );\n\n\t\t\t\t\t\t\tbuffer[ offset + stride + 8 ] = morph.x;\n\t\t\t\t\t\t\tbuffer[ offset + stride + 9 ] = morph.y;\n\t\t\t\t\t\t\tbuffer[ offset + stride + 10 ] = morph.z;\n\t\t\t\t\t\t\tbuffer[ offset + stride + 11 ] = ( morphColor.itemSize === 4 ) ? morph.w : 1;\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\tentry = {\n\t\t\t\t\tcount: morphTargetsCount,\n\t\t\t\t\ttexture: texture,\n\t\t\t\t\tsize: new Vector2( width, height )\n\t\t\t\t};\n\n\t\t\t\tmorphTextures.set( geometry, entry );\n\n\t\t\t\tfunction disposeTexture() {\n\n\t\t\t\t\ttexture.dispose();\n\n\t\t\t\t\tmorphTextures.delete( geometry );\n\n\t\t\t\t\tgeometry.removeEventListener( 'dispose', disposeTexture );\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.addEventListener( 'dispose', disposeTexture );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tlet morphInfluencesSum = 0;\n\n\t\t\tfor ( let i = 0; i < objectInfluences.length; i ++ ) {\n\n\t\t\t\tmorphInfluencesSum += objectInfluences[ i ];\n\n\t\t\t}\n\n\t\t\tconst morphBaseInfluence = geometry.morphTargetsRelative ? 1 : 1 - morphInfluencesSum;\n\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTargetBaseInfluence', morphBaseInfluence );\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTargetInfluences', objectInfluences );\n\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTargetsTexture', entry.texture, textures );\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTargetsTextureSize', entry.size );\n\n\n\t\t} else {\n\n\t\t\t// When object doesn't have morph target influences defined, we treat it as a 0-length array\n\t\t\t// This is important to make sure we set up morphTargetBaseInfluence / morphTargetInfluences\n\n\t\t\tconst length = objectInfluences === undefined ? 0 : objectInfluences.length;\n\n\t\t\tlet influences = influencesList[ geometry.id ];\n\n\t\t\tif ( influences === undefined || influences.length !== length ) {\n\n\t\t\t\t// initialise list\n\n\t\t\t\tinfluences = [];\n\n\t\t\t\tfor ( let i = 0; i < length; i ++ ) {\n\n\t\t\t\t\tinfluences[ i ] = [ i, 0 ];\n\n\t\t\t\t}\n\n\t\t\t\tinfluencesList[ geometry.id ] = influences;\n\n\t\t\t}\n\n\t\t\t// Collect influences\n\n\t\t\tfor ( let i = 0; i < length; i ++ ) {\n\n\t\t\t\tconst influence = influences[ i ];\n\n\t\t\t\tinfluence[ 0 ] = i;\n\t\t\t\tinfluence[ 1 ] = objectInfluences[ i ];\n\n\t\t\t}\n\n\t\t\tinfluences.sort( absNumericalSort );\n\n\t\t\tfor ( let i = 0; i < 8; i ++ ) {\n\n\t\t\t\tif ( i < length && influences[ i ][ 1 ] ) {\n\n\t\t\t\t\tworkInfluences[ i ][ 0 ] = influences[ i ][ 0 ];\n\t\t\t\t\tworkInfluences[ i ][ 1 ] = influences[ i ][ 1 ];\n\n\t\t\t\t} else {\n\n\t\t\t\t\tworkInfluences[ i ][ 0 ] = Number.MAX_SAFE_INTEGER;\n\t\t\t\t\tworkInfluences[ i ][ 1 ] = 0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tworkInfluences.sort( numericalSort );\n\n\t\t\tconst morphTargets = geometry.morphAttributes.position;\n\t\t\tconst morphNormals = geometry.morphAttributes.normal;\n\n\t\t\tlet morphInfluencesSum = 0;\n\n\t\t\tfor ( let i = 0; i < 8; i ++ ) {\n\n\t\t\t\tconst influence = workInfluences[ i ];\n\t\t\t\tconst index = influence[ 0 ];\n\t\t\t\tconst value = influence[ 1 ];\n\n\t\t\t\tif ( index !== Number.MAX_SAFE_INTEGER && value ) {\n\n\t\t\t\t\tif ( morphTargets && geometry.getAttribute( 'morphTarget' + i ) !== morphTargets[ index ] ) {\n\n\t\t\t\t\t\tgeometry.setAttribute( 'morphTarget' + i, morphTargets[ index ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( morphNormals && geometry.getAttribute( 'morphNormal' + i ) !== morphNormals[ index ] ) {\n\n\t\t\t\t\t\tgeometry.setAttribute( 'morphNormal' + i, morphNormals[ index ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tmorphInfluences[ i ] = value;\n\t\t\t\t\tmorphInfluencesSum += value;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( morphTargets && geometry.hasAttribute( 'morphTarget' + i ) === true ) {\n\n\t\t\t\t\t\tgeometry.deleteAttribute( 'morphTarget' + i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( morphNormals && geometry.hasAttribute( 'morphNormal' + i ) === true ) {\n\n\t\t\t\t\t\tgeometry.deleteAttribute( 'morphNormal' + i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tmorphInfluences[ i ] = 0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// GLSL shader uses formula baseinfluence * base + sum(target * influence)\n\t\t\t// This allows us to switch between absolute morphs and relative morphs without changing shader code\n\t\t\t// When baseinfluence = 1 - sum(influence), the above is equivalent to sum((target - base) * influence)\n\t\t\tconst morphBaseInfluence = geometry.morphTargetsRelative ? 1 : 1 - morphInfluencesSum;\n\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTargetBaseInfluence', morphBaseInfluence );\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTargetInfluences', morphInfluences );\n\n\t\t}\n\n\t}\n\n\treturn {\n\n\t\tupdate: update\n\n\t};\n\n}\n\nfunction WebGLObjects( gl, geometries, attributes, info ) {\n\n\tlet updateMap = new WeakMap();\n\n\tfunction update( object ) {\n\n\t\tconst frame = info.render.frame;\n\n\t\tconst geometry = object.geometry;\n\t\tconst buffergeometry = geometries.get( object, geometry );\n\n\t\t// Update once per frame\n\n\t\tif ( updateMap.get( buffergeometry ) !== frame ) {\n\n\t\t\tgeometries.update( buffergeometry );\n\n\t\t\tupdateMap.set( buffergeometry, frame );\n\n\t\t}\n\n\t\tif ( object.isInstancedMesh ) {\n\n\t\t\tif ( object.hasEventListener( 'dispose', onInstancedMeshDispose ) === false ) {\n\n\t\t\t\tobject.addEventListener( 'dispose', onInstancedMeshDispose );\n\n\t\t\t}\n\n\t\t\tattributes.update( object.instanceMatrix, 34962 );\n\n\t\t\tif ( object.instanceColor !== null ) {\n\n\t\t\t\tattributes.update( object.instanceColor, 34962 );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn buffergeometry;\n\n\t}\n\n\tfunction dispose() {\n\n\t\tupdateMap = new WeakMap();\n\n\t}\n\n\tfunction onInstancedMeshDispose( event ) {\n\n\t\tconst instancedMesh = event.target;\n\n\t\tinstancedMesh.removeEventListener( 'dispose', onInstancedMeshDispose );\n\n\t\tattributes.remove( instancedMesh.instanceMatrix );\n\n\t\tif ( instancedMesh.instanceColor !== null ) attributes.remove( instancedMesh.instanceColor );\n\n\t}\n\n\treturn {\n\n\t\tupdate: update,\n\t\tdispose: dispose\n\n\t};\n\n}\n\n/**\n * Uniforms of a program.\n * Those form a tree structure with a special top-level container for the root,\n * which you get by calling 'new WebGLUniforms( gl, program )'.\n *\n *\n * Properties of inner nodes including the top-level container:\n *\n * .seq - array of nested uniforms\n * .map - nested uniforms by name\n *\n *\n * Methods of all nodes except the top-level container:\n *\n * .setValue( gl, value, [textures] )\n *\n * \t\tuploads a uniform value(s)\n * \tthe 'textures' parameter is needed for sampler uniforms\n *\n *\n * Static methods of the top-level container (textures factorizations):\n *\n * .upload( gl, seq, values, textures )\n *\n * \t\tsets uniforms in 'seq' to 'values[id].value'\n *\n * .seqWithValue( seq, values ) : filteredSeq\n *\n * \t\tfilters 'seq' entries with corresponding entry in values\n *\n *\n * Methods of the top-level container (textures factorizations):\n *\n * .setValue( gl, name, value, textures )\n *\n * \t\tsets uniform with name 'name' to 'value'\n *\n * .setOptional( gl, obj, prop )\n *\n * \t\tlike .set for an optional property of the object\n *\n */\n\nconst emptyTexture = /*@__PURE__*/ new Texture();\nconst emptyArrayTexture = /*@__PURE__*/ new DataArrayTexture();\nconst empty3dTexture = /*@__PURE__*/ new Data3DTexture();\nconst emptyCubeTexture = /*@__PURE__*/ new CubeTexture();\n\n// --- Utilities ---\n\n// Array Caches (provide typed arrays for temporary by size)\n\nconst arrayCacheF32 = [];\nconst arrayCacheI32 = [];\n\n// Float32Array caches used for uploading Matrix uniforms\n\nconst mat4array = new Float32Array( 16 );\nconst mat3array = new Float32Array( 9 );\nconst mat2array = new Float32Array( 4 );\n\n// Flattening for arrays of vectors and matrices\n\nfunction flatten( array, nBlocks, blockSize ) {\n\n\tconst firstElem = array[ 0 ];\n\n\tif ( firstElem <= 0 || firstElem > 0 ) return array;\n\t// unoptimized: ! isNaN( firstElem )\n\t// see http://jacksondunstan.com/articles/983\n\n\tconst n = nBlocks * blockSize;\n\tlet r = arrayCacheF32[ n ];\n\n\tif ( r === undefined ) {\n\n\t\tr = new Float32Array( n );\n\t\tarrayCacheF32[ n ] = r;\n\n\t}\n\n\tif ( nBlocks !== 0 ) {\n\n\t\tfirstElem.toArray( r, 0 );\n\n\t\tfor ( let i = 1, offset = 0; i !== nBlocks; ++ i ) {\n\n\t\t\toffset += blockSize;\n\t\t\tarray[ i ].toArray( r, offset );\n\n\t\t}\n\n\t}\n\n\treturn r;\n\n}\n\nfunction arraysEqual( a, b ) {\n\n\tif ( a.length !== b.length ) return false;\n\n\tfor ( let i = 0, l = a.length; i < l; i ++ ) {\n\n\t\tif ( a[ i ] !== b[ i ] ) return false;\n\n\t}\n\n\treturn true;\n\n}\n\nfunction copyArray( a, b ) {\n\n\tfor ( let i = 0, l = b.length; i < l; i ++ ) {\n\n\t\ta[ i ] = b[ i ];\n\n\t}\n\n}\n\n// Texture unit allocation\n\nfunction allocTexUnits( textures, n ) {\n\n\tlet r = arrayCacheI32[ n ];\n\n\tif ( r === undefined ) {\n\n\t\tr = new Int32Array( n );\n\t\tarrayCacheI32[ n ] = r;\n\n\t}\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\tr[ i ] = textures.allocateTextureUnit();\n\n\t}\n\n\treturn r;\n\n}\n\n// --- Setters ---\n\n// Note: Defining these methods externally, because they come in a bunch\n// and this way their names minify.\n\n// Single scalar\n\nfunction setValueV1f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( cache[ 0 ] === v ) return;\n\n\tgl.uniform1f( this.addr, v );\n\n\tcache[ 0 ] = v;\n\n}\n\n// Single float vector (from flat array or THREE.VectorN)\n\nfunction setValueV2f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y ) {\n\n\t\t\tgl.uniform2f( this.addr, v.x, v.y );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform2fv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV3f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z ) {\n\n\t\t\tgl.uniform3f( this.addr, v.x, v.y, v.z );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\n\t\t}\n\n\t} else if ( v.r !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.r || cache[ 1 ] !== v.g || cache[ 2 ] !== v.b ) {\n\n\t\t\tgl.uniform3f( this.addr, v.r, v.g, v.b );\n\n\t\t\tcache[ 0 ] = v.r;\n\t\t\tcache[ 1 ] = v.g;\n\t\t\tcache[ 2 ] = v.b;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform3fv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV4f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z || cache[ 3 ] !== v.w ) {\n\n\t\t\tgl.uniform4f( this.addr, v.x, v.y, v.z, v.w );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\t\t\tcache[ 3 ] = v.w;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform4fv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\n// Single matrix (from flat array or THREE.MatrixN)\n\nfunction setValueM2( gl, v ) {\n\n\tconst cache = this.cache;\n\tconst elements = v.elements;\n\n\tif ( elements === undefined ) {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniformMatrix2fv( this.addr, false, v );\n\n\t\tcopyArray( cache, v );\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, elements ) ) return;\n\n\t\tmat2array.set( elements );\n\n\t\tgl.uniformMatrix2fv( this.addr, false, mat2array );\n\n\t\tcopyArray( cache, elements );\n\n\t}\n\n}\n\nfunction setValueM3( gl, v ) {\n\n\tconst cache = this.cache;\n\tconst elements = v.elements;\n\n\tif ( elements === undefined ) {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniformMatrix3fv( this.addr, false, v );\n\n\t\tcopyArray( cache, v );\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, elements ) ) return;\n\n\t\tmat3array.set( elements );\n\n\t\tgl.uniformMatrix3fv( this.addr, false, mat3array );\n\n\t\tcopyArray( cache, elements );\n\n\t}\n\n}\n\nfunction setValueM4( gl, v ) {\n\n\tconst cache = this.cache;\n\tconst elements = v.elements;\n\n\tif ( elements === undefined ) {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniformMatrix4fv( this.addr, false, v );\n\n\t\tcopyArray( cache, v );\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, elements ) ) return;\n\n\t\tmat4array.set( elements );\n\n\t\tgl.uniformMatrix4fv( this.addr, false, mat4array );\n\n\t\tcopyArray( cache, elements );\n\n\t}\n\n}\n\n// Single integer / boolean\n\nfunction setValueV1i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( cache[ 0 ] === v ) return;\n\n\tgl.uniform1i( this.addr, v );\n\n\tcache[ 0 ] = v;\n\n}\n\n// Single integer / boolean vector (from flat array)\n\nfunction setValueV2i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( arraysEqual( cache, v ) ) return;\n\n\tgl.uniform2iv( this.addr, v );\n\n\tcopyArray( cache, v );\n\n}\n\nfunction setValueV3i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( arraysEqual( cache, v ) ) return;\n\n\tgl.uniform3iv( this.addr, v );\n\n\tcopyArray( cache, v );\n\n}\n\nfunction setValueV4i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( arraysEqual( cache, v ) ) return;\n\n\tgl.uniform4iv( this.addr, v );\n\n\tcopyArray( cache, v );\n\n}\n\n// Single unsigned integer\n\nfunction setValueV1ui( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( cache[ 0 ] === v ) return;\n\n\tgl.uniform1ui( this.addr, v );\n\n\tcache[ 0 ] = v;\n\n}\n\n// Single unsigned integer vector (from flat array)\n\nfunction setValueV2ui( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( arraysEqual( cache, v ) ) return;\n\n\tgl.uniform2uiv( this.addr, v );\n\n\tcopyArray( cache, v );\n\n}\n\nfunction setValueV3ui( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( arraysEqual( cache, v ) ) return;\n\n\tgl.uniform3uiv( this.addr, v );\n\n\tcopyArray( cache, v );\n\n}\n\nfunction setValueV4ui( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( arraysEqual( cache, v ) ) return;\n\n\tgl.uniform4uiv( this.addr, v );\n\n\tcopyArray( cache, v );\n\n}\n\n\n// Single texture (2D / Cube)\n\nfunction setValueT1( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\ttextures.setTexture2D( v || emptyTexture, unit );\n\n}\n\nfunction setValueT3D1( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\ttextures.setTexture3D( v || empty3dTexture, unit );\n\n}\n\nfunction setValueT6( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\ttextures.setTextureCube( v || emptyCubeTexture, unit );\n\n}\n\nfunction setValueT2DArray1( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\ttextures.setTexture2DArray( v || emptyArrayTexture, unit );\n\n}\n\n// Helper to pick the right setter for the singular case\n\nfunction getSingularSetter( type ) {\n\n\tswitch ( type ) {\n\n\t\tcase 0x1406: return setValueV1f; // FLOAT\n\t\tcase 0x8b50: return setValueV2f; // _VEC2\n\t\tcase 0x8b51: return setValueV3f; // _VEC3\n\t\tcase 0x8b52: return setValueV4f; // _VEC4\n\n\t\tcase 0x8b5a: return setValueM2; // _MAT2\n\t\tcase 0x8b5b: return setValueM3; // _MAT3\n\t\tcase 0x8b5c: return setValueM4; // _MAT4\n\n\t\tcase 0x1404: case 0x8b56: return setValueV1i; // INT, BOOL\n\t\tcase 0x8b53: case 0x8b57: return setValueV2i; // _VEC2\n\t\tcase 0x8b54: case 0x8b58: return setValueV3i; // _VEC3\n\t\tcase 0x8b55: case 0x8b59: return setValueV4i; // _VEC4\n\n\t\tcase 0x1405: return setValueV1ui; // UINT\n\t\tcase 0x8dc6: return setValueV2ui; // _VEC2\n\t\tcase 0x8dc7: return setValueV3ui; // _VEC3\n\t\tcase 0x8dc8: return setValueV4ui; // _VEC4\n\n\t\tcase 0x8b5e: // SAMPLER_2D\n\t\tcase 0x8d66: // SAMPLER_EXTERNAL_OES\n\t\tcase 0x8dca: // INT_SAMPLER_2D\n\t\tcase 0x8dd2: // UNSIGNED_INT_SAMPLER_2D\n\t\tcase 0x8b62: // SAMPLER_2D_SHADOW\n\t\t\treturn setValueT1;\n\n\t\tcase 0x8b5f: // SAMPLER_3D\n\t\tcase 0x8dcb: // INT_SAMPLER_3D\n\t\tcase 0x8dd3: // UNSIGNED_INT_SAMPLER_3D\n\t\t\treturn setValueT3D1;\n\n\t\tcase 0x8b60: // SAMPLER_CUBE\n\t\tcase 0x8dcc: // INT_SAMPLER_CUBE\n\t\tcase 0x8dd4: // UNSIGNED_INT_SAMPLER_CUBE\n\t\tcase 0x8dc5: // SAMPLER_CUBE_SHADOW\n\t\t\treturn setValueT6;\n\n\t\tcase 0x8dc1: // SAMPLER_2D_ARRAY\n\t\tcase 0x8dcf: // INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dd7: // UNSIGNED_INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dc4: // SAMPLER_2D_ARRAY_SHADOW\n\t\t\treturn setValueT2DArray1;\n\n\t}\n\n}\n\n\n// Array of scalars\n\nfunction setValueV1fArray( gl, v ) {\n\n\tgl.uniform1fv( this.addr, v );\n\n}\n\n// Array of vectors (from flat array or array of THREE.VectorN)\n\nfunction setValueV2fArray( gl, v ) {\n\n\tconst data = flatten( v, this.size, 2 );\n\n\tgl.uniform2fv( this.addr, data );\n\n}\n\nfunction setValueV3fArray( gl, v ) {\n\n\tconst data = flatten( v, this.size, 3 );\n\n\tgl.uniform3fv( this.addr, data );\n\n}\n\nfunction setValueV4fArray( gl, v ) {\n\n\tconst data = flatten( v, this.size, 4 );\n\n\tgl.uniform4fv( this.addr, data );\n\n}\n\n// Array of matrices (from flat array or array of THREE.MatrixN)\n\nfunction setValueM2Array( gl, v ) {\n\n\tconst data = flatten( v, this.size, 4 );\n\n\tgl.uniformMatrix2fv( this.addr, false, data );\n\n}\n\nfunction setValueM3Array( gl, v ) {\n\n\tconst data = flatten( v, this.size, 9 );\n\n\tgl.uniformMatrix3fv( this.addr, false, data );\n\n}\n\nfunction setValueM4Array( gl, v ) {\n\n\tconst data = flatten( v, this.size, 16 );\n\n\tgl.uniformMatrix4fv( this.addr, false, data );\n\n}\n\n// Array of integer / boolean\n\nfunction setValueV1iArray( gl, v ) {\n\n\tgl.uniform1iv( this.addr, v );\n\n}\n\n// Array of integer / boolean vectors (from flat array)\n\nfunction setValueV2iArray( gl, v ) {\n\n\tgl.uniform2iv( this.addr, v );\n\n}\n\nfunction setValueV3iArray( gl, v ) {\n\n\tgl.uniform3iv( this.addr, v );\n\n}\n\nfunction setValueV4iArray( gl, v ) {\n\n\tgl.uniform4iv( this.addr, v );\n\n}\n\n// Array of unsigned integer\n\nfunction setValueV1uiArray( gl, v ) {\n\n\tgl.uniform1uiv( this.addr, v );\n\n}\n\n// Array of unsigned integer vectors (from flat array)\n\nfunction setValueV2uiArray( gl, v ) {\n\n\tgl.uniform2uiv( this.addr, v );\n\n}\n\nfunction setValueV3uiArray( gl, v ) {\n\n\tgl.uniform3uiv( this.addr, v );\n\n}\n\nfunction setValueV4uiArray( gl, v ) {\n\n\tgl.uniform4uiv( this.addr, v );\n\n}\n\n\n// Array of textures (2D / 3D / Cube / 2DArray)\n\nfunction setValueT1Array( gl, v, textures ) {\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tgl.uniform1iv( this.addr, units );\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.setTexture2D( v[ i ] || emptyTexture, units[ i ] );\n\n\t}\n\n}\n\nfunction setValueT3DArray( gl, v, textures ) {\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tgl.uniform1iv( this.addr, units );\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.setTexture3D( v[ i ] || empty3dTexture, units[ i ] );\n\n\t}\n\n}\n\nfunction setValueT6Array( gl, v, textures ) {\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tgl.uniform1iv( this.addr, units );\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.setTextureCube( v[ i ] || emptyCubeTexture, units[ i ] );\n\n\t}\n\n}\n\nfunction setValueT2DArrayArray( gl, v, textures ) {\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tgl.uniform1iv( this.addr, units );\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.setTexture2DArray( v[ i ] || emptyArrayTexture, units[ i ] );\n\n\t}\n\n}\n\n\n// Helper to pick the right setter for a pure (bottom-level) array\n\nfunction getPureArraySetter( type ) {\n\n\tswitch ( type ) {\n\n\t\tcase 0x1406: return setValueV1fArray; // FLOAT\n\t\tcase 0x8b50: return setValueV2fArray; // _VEC2\n\t\tcase 0x8b51: return setValueV3fArray; // _VEC3\n\t\tcase 0x8b52: return setValueV4fArray; // _VEC4\n\n\t\tcase 0x8b5a: return setValueM2Array; // _MAT2\n\t\tcase 0x8b5b: return setValueM3Array; // _MAT3\n\t\tcase 0x8b5c: return setValueM4Array; // _MAT4\n\n\t\tcase 0x1404: case 0x8b56: return setValueV1iArray; // INT, BOOL\n\t\tcase 0x8b53: case 0x8b57: return setValueV2iArray; // _VEC2\n\t\tcase 0x8b54: case 0x8b58: return setValueV3iArray; // _VEC3\n\t\tcase 0x8b55: case 0x8b59: return setValueV4iArray; // _VEC4\n\n\t\tcase 0x1405: return setValueV1uiArray; // UINT\n\t\tcase 0x8dc6: return setValueV2uiArray; // _VEC2\n\t\tcase 0x8dc7: return setValueV3uiArray; // _VEC3\n\t\tcase 0x8dc8: return setValueV4uiArray; // _VEC4\n\n\t\tcase 0x8b5e: // SAMPLER_2D\n\t\tcase 0x8d66: // SAMPLER_EXTERNAL_OES\n\t\tcase 0x8dca: // INT_SAMPLER_2D\n\t\tcase 0x8dd2: // UNSIGNED_INT_SAMPLER_2D\n\t\tcase 0x8b62: // SAMPLER_2D_SHADOW\n\t\t\treturn setValueT1Array;\n\n\t\tcase 0x8b5f: // SAMPLER_3D\n\t\tcase 0x8dcb: // INT_SAMPLER_3D\n\t\tcase 0x8dd3: // UNSIGNED_INT_SAMPLER_3D\n\t\t\treturn setValueT3DArray;\n\n\t\tcase 0x8b60: // SAMPLER_CUBE\n\t\tcase 0x8dcc: // INT_SAMPLER_CUBE\n\t\tcase 0x8dd4: // UNSIGNED_INT_SAMPLER_CUBE\n\t\tcase 0x8dc5: // SAMPLER_CUBE_SHADOW\n\t\t\treturn setValueT6Array;\n\n\t\tcase 0x8dc1: // SAMPLER_2D_ARRAY\n\t\tcase 0x8dcf: // INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dd7: // UNSIGNED_INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dc4: // SAMPLER_2D_ARRAY_SHADOW\n\t\t\treturn setValueT2DArrayArray;\n\n\t}\n\n}\n\n// --- Uniform Classes ---\n\nclass SingleUniform {\n\n\tconstructor( id, activeInfo, addr ) {\n\n\t\tthis.id = id;\n\t\tthis.addr = addr;\n\t\tthis.cache = [];\n\t\tthis.setValue = getSingularSetter( activeInfo.type );\n\n\t\t// this.path = activeInfo.name; // DEBUG\n\n\t}\n\n}\n\nclass PureArrayUniform {\n\n\tconstructor( id, activeInfo, addr ) {\n\n\t\tthis.id = id;\n\t\tthis.addr = addr;\n\t\tthis.cache = [];\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}\n\nclass StructuredUniform {\n\n\tconstructor( id ) {\n\n\t\tthis.id = id;\n\n\t\tthis.seq = [];\n\t\tthis.map = {};\n\n\t}\n\n\tsetValue( gl, value, textures ) {\n\n\t\tconst seq = this.seq;\n\n\t\tfor ( let i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tconst u = seq[ i ];\n\t\t\tu.setValue( gl, value[ u.id ], textures );\n\n\t\t}\n\n\t}\n\n}\n\n// --- Top-level ---\n\n// Parser - builds up the property tree from the path strings\n\nconst RePathPart = /(\\w+)(\\])?(\\[|\\.)?/g;\n\n// extracts\n// \t- the identifier (member name or array index)\n// - followed by an optional right bracket (found when array index)\n// - followed by an optional left bracket or dot (type of subscript)\n//\n// Note: These portions can be read in a non-overlapping fashion and\n// allow straightforward parsing of the hierarchy that WebGL encodes\n// in the uniform names.\n\nfunction addUniform( container, uniformObject ) {\n\n\tcontainer.seq.push( uniformObject );\n\tcontainer.map[ uniformObject.id ] = uniformObject;\n\n}\n\nfunction parseUniform( activeInfo, addr, container ) {\n\n\tconst path = activeInfo.name,\n\t\tpathLength = path.length;\n\n\t// reset RegExp object, because of the early exit of a previous run\n\tRePathPart.lastIndex = 0;\n\n\twhile ( true ) {\n\n\t\tconst match = RePathPart.exec( path ),\n\t\t\tmatchEnd = RePathPart.lastIndex;\n\n\t\tlet id = match[ 1 ];\n\t\tconst idIsIndex = match[ 2 ] === ']',\n\t\t\tsubscript = match[ 3 ];\n\n\t\tif ( idIsIndex ) id = id | 0; // convert to integer\n\n\t\tif ( subscript === undefined || subscript === '[' && matchEnd + 2 === pathLength ) {\n\n\t\t\t// bare name or \"pure\" bottom-level array \"[0]\" suffix\n\n\t\t\taddUniform( container, subscript === undefined ?\n\t\t\t\tnew SingleUniform( id, activeInfo, addr ) :\n\t\t\t\tnew PureArrayUniform( id, activeInfo, addr ) );\n\n\t\t\tbreak;\n\n\t\t} else {\n\n\t\t\t// step into inner node / create it in case it doesn't exist\n\n\t\t\tconst map = container.map;\n\t\t\tlet next = map[ id ];\n\n\t\t\tif ( next === undefined ) {\n\n\t\t\t\tnext = new StructuredUniform( id );\n\t\t\t\taddUniform( container, next );\n\n\t\t\t}\n\n\t\t\tcontainer = next;\n\n\t\t}\n\n\t}\n\n}\n\n// Root Container\n\nclass WebGLUniforms {\n\n\tconstructor( gl, program ) {\n\n\t\tthis.seq = [];\n\t\tthis.map = {};\n\n\t\tconst n = gl.getProgramParameter( program, 35718 );\n\n\t\tfor ( let i = 0; i < n; ++ i ) {\n\n\t\t\tconst info = gl.getActiveUniform( program, i ),\n\t\t\t\taddr = gl.getUniformLocation( program, info.name );\n\n\t\t\tparseUniform( info, addr, this );\n\n\t\t}\n\n\t}\n\n\tsetValue( gl, name, value, textures ) {\n\n\t\tconst u = this.map[ name ];\n\n\t\tif ( u !== undefined ) u.setValue( gl, value, textures );\n\n\t}\n\n\tsetOptional( gl, object, name ) {\n\n\t\tconst v = object[ name ];\n\n\t\tif ( v !== undefined ) this.setValue( gl, name, v );\n\n\t}\n\n\tstatic upload( gl, seq, values, textures ) {\n\n\t\tfor ( let i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tconst u = seq[ i ],\n\t\t\t\tv = values[ u.id ];\n\n\t\t\tif ( v.needsUpdate !== false ) {\n\n\t\t\t\t// note: always updating when .needsUpdate is undefined\n\t\t\t\tu.setValue( gl, v.value, textures );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tstatic seqWithValue( seq, values ) {\n\n\t\tconst r = [];\n\n\t\tfor ( let i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tconst 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}\n\nfunction WebGLShader( gl, type, string ) {\n\n\tconst shader = gl.createShader( type );\n\n\tgl.shaderSource( shader, string );\n\tgl.compileShader( shader );\n\n\treturn shader;\n\n}\n\nlet programIdCount = 0;\n\nfunction handleSource( string, errorLine ) {\n\n\tconst lines = string.split( '\\n' );\n\tconst lines2 = [];\n\n\tconst from = Math.max( errorLine - 6, 0 );\n\tconst to = Math.min( errorLine + 6, lines.length );\n\n\tfor ( let i = from; i < to; i ++ ) {\n\n\t\tconst line = i + 1;\n\t\tlines2.push( `${line === errorLine ? '>' : ' '} ${line}: ${lines[ i ]}` );\n\n\t}\n\n\treturn lines2.join( '\\n' );\n\n}\n\nfunction getEncodingComponents( encoding ) {\n\n\tswitch ( encoding ) {\n\n\t\tcase LinearEncoding:\n\t\t\treturn [ 'Linear', '( value )' ];\n\t\tcase sRGBEncoding:\n\t\t\treturn [ 'sRGB', '( value )' ];\n\t\tdefault:\n\t\t\tconsole.warn( 'THREE.WebGLProgram: Unsupported encoding:', encoding );\n\t\t\treturn [ 'Linear', '( value )' ];\n\n\t}\n\n}\n\nfunction getShaderErrors( gl, shader, type ) {\n\n\tconst status = gl.getShaderParameter( shader, 35713 );\n\tconst errors = gl.getShaderInfoLog( shader ).trim();\n\n\tif ( status && errors === '' ) return '';\n\n\tconst errorMatches = /ERROR: 0:(\\d+)/.exec( errors );\n\tif ( errorMatches ) {\n\n\t\t// --enable-privileged-webgl-extension\n\t\t// console.log( '**' + type + '**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( shader ) );\n\n\t\tconst errorLine = parseInt( errorMatches[ 1 ] );\n\t\treturn type.toUpperCase() + '\\n\\n' + errors + '\\n\\n' + handleSource( gl.getShaderSource( shader ), errorLine );\n\n\t} else {\n\n\t\treturn errors;\n\n\t}\n\n}\n\nfunction getTexelEncodingFunction( functionName, encoding ) {\n\n\tconst components = getEncodingComponents( encoding );\n\treturn 'vec4 ' + functionName + '( vec4 value ) { return LinearTo' + components[ 0 ] + components[ 1 ] + '; }';\n\n}\n\nfunction getToneMappingFunction( functionName, toneMapping ) {\n\n\tlet toneMappingName;\n\n\tswitch ( toneMapping ) {\n\n\t\tcase LinearToneMapping:\n\t\t\ttoneMappingName = 'Linear';\n\t\t\tbreak;\n\n\t\tcase ReinhardToneMapping:\n\t\t\ttoneMappingName = 'Reinhard';\n\t\t\tbreak;\n\n\t\tcase CineonToneMapping:\n\t\t\ttoneMappingName = 'OptimizedCineon';\n\t\t\tbreak;\n\n\t\tcase ACESFilmicToneMapping:\n\t\t\ttoneMappingName = 'ACESFilmic';\n\t\t\tbreak;\n\n\t\tcase CustomToneMapping:\n\t\t\ttoneMappingName = 'Custom';\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tconsole.warn( 'THREE.WebGLProgram: Unsupported toneMapping:', toneMapping );\n\t\t\ttoneMappingName = 'Linear';\n\n\t}\n\n\treturn 'vec3 ' + functionName + '( vec3 color ) { return ' + toneMappingName + 'ToneMapping( color ); }';\n\n}\n\nfunction generateExtensions( parameters ) {\n\n\tconst chunks = [\n\t\t( parameters.extensionDerivatives || !! parameters.envMapCubeUVHeight || parameters.bumpMap || parameters.tangentSpaceNormalMap || parameters.clearcoatNormalMap || parameters.flatShading || parameters.shaderID === 'physical' ) ? '#extension GL_OES_standard_derivatives : enable' : '',\n\t\t( parameters.extensionFragDepth || parameters.logarithmicDepthBuffer ) && parameters.rendererExtensionFragDepth ? '#extension GL_EXT_frag_depth : enable' : '',\n\t\t( parameters.extensionDrawBuffers && parameters.rendererExtensionDrawBuffers ) ? '#extension GL_EXT_draw_buffers : require' : '',\n\t\t( parameters.extensionShaderTextureLOD || parameters.envMap || parameters.transmission ) && parameters.rendererExtensionShaderTextureLod ? '#extension GL_EXT_shader_texture_lod : enable' : ''\n\t];\n\n\treturn chunks.filter( filterEmptyLine ).join( '\\n' );\n\n}\n\nfunction generateDefines( defines ) {\n\n\tconst chunks = [];\n\n\tfor ( const name in defines ) {\n\n\t\tconst value = defines[ name ];\n\n\t\tif ( value === false ) continue;\n\n\t\tchunks.push( '#define ' + name + ' ' + value );\n\n\t}\n\n\treturn chunks.join( '\\n' );\n\n}\n\nfunction fetchAttributeLocations( gl, program ) {\n\n\tconst attributes = {};\n\n\tconst n = gl.getProgramParameter( program, 35721 );\n\n\tfor ( let i = 0; i < n; i ++ ) {\n\n\t\tconst info = gl.getActiveAttrib( program, i );\n\t\tconst name = info.name;\n\n\t\tlet locationSize = 1;\n\t\tif ( info.type === 35674 ) locationSize = 2;\n\t\tif ( info.type === 35675 ) locationSize = 3;\n\t\tif ( info.type === 35676 ) locationSize = 4;\n\n\t\t// console.log( 'THREE.WebGLProgram: ACTIVE VERTEX ATTRIBUTE:', name, i );\n\n\t\tattributes[ name ] = {\n\t\t\ttype: info.type,\n\t\t\tlocation: gl.getAttribLocation( program, name ),\n\t\t\tlocationSize: locationSize\n\t\t};\n\n\t}\n\n\treturn attributes;\n\n}\n\nfunction filterEmptyLine( string ) {\n\n\treturn string !== '';\n\n}\n\nfunction replaceLightNums( string, parameters ) {\n\n\treturn string\n\t\t.replace( /NUM_DIR_LIGHTS/g, parameters.numDirLights )\n\t\t.replace( /NUM_SPOT_LIGHTS/g, parameters.numSpotLights )\n\t\t.replace( /NUM_RECT_AREA_LIGHTS/g, parameters.numRectAreaLights )\n\t\t.replace( /NUM_POINT_LIGHTS/g, parameters.numPointLights )\n\t\t.replace( /NUM_HEMI_LIGHTS/g, parameters.numHemiLights )\n\t\t.replace( /NUM_DIR_LIGHT_SHADOWS/g, parameters.numDirLightShadows )\n\t\t.replace( /NUM_SPOT_LIGHT_SHADOWS/g, parameters.numSpotLightShadows )\n\t\t.replace( /NUM_POINT_LIGHT_SHADOWS/g, parameters.numPointLightShadows );\n\n}\n\nfunction replaceClippingPlaneNums( string, parameters ) {\n\n\treturn string\n\t\t.replace( /NUM_CLIPPING_PLANES/g, parameters.numClippingPlanes )\n\t\t.replace( /UNION_CLIPPING_PLANES/g, ( parameters.numClippingPlanes - parameters.numClipIntersection ) );\n\n}\n\n// Resolve Includes\n\nconst includePattern = /^[ \\t]*#include +<([\\w\\d./]+)>/gm;\n\nfunction resolveIncludes( string ) {\n\n\treturn string.replace( includePattern, includeReplacer );\n\n}\n\nfunction includeReplacer( match, include ) {\n\n\tconst string = ShaderChunk[ include ];\n\n\tif ( string === undefined ) {\n\n\t\tthrow new Error( 'Can not resolve #include <' + include + '>' );\n\n\t}\n\n\treturn resolveIncludes( string );\n\n}\n\n// Unroll Loops\n\nconst deprecatedUnrollLoopPattern = /#pragma unroll_loop[\\s]+?for \\( int i \\= (\\d+)\\; i < (\\d+)\\; i \\+\\+ \\) \\{([\\s\\S]+?)(?=\\})\\}/g;\nconst unrollLoopPattern = /#pragma unroll_loop_start\\s+for\\s*\\(\\s*int\\s+i\\s*=\\s*(\\d+)\\s*;\\s*i\\s*<\\s*(\\d+)\\s*;\\s*i\\s*\\+\\+\\s*\\)\\s*{([\\s\\S]+?)}\\s+#pragma unroll_loop_end/g;\n\nfunction unrollLoops( string ) {\n\n\treturn string\n\t\t.replace( unrollLoopPattern, loopReplacer )\n\t\t.replace( deprecatedUnrollLoopPattern, deprecatedLoopReplacer );\n\n}\n\nfunction deprecatedLoopReplacer( match, start, end, snippet ) {\n\n\tconsole.warn( 'WebGLProgram: #pragma unroll_loop shader syntax is deprecated. Please use #pragma unroll_loop_start syntax instead.' );\n\treturn loopReplacer( match, start, end, snippet );\n\n}\n\nfunction loopReplacer( match, start, end, snippet ) {\n\n\tlet string = '';\n\n\tfor ( let i = parseInt( start ); i < parseInt( end ); i ++ ) {\n\n\t\tstring += snippet\n\t\t\t.replace( /\\[\\s*i\\s*\\]/g, '[ ' + i + ' ]' )\n\t\t\t.replace( /UNROLLED_LOOP_INDEX/g, i );\n\n\t}\n\n\treturn string;\n\n}\n\n//\n\nfunction generatePrecision( parameters ) {\n\n\tlet precisionstring = 'precision ' + parameters.precision + ' float;\\nprecision ' + parameters.precision + ' int;';\n\n\tif ( parameters.precision === 'highp' ) {\n\n\t\tprecisionstring += '\\n#define HIGH_PRECISION';\n\n\t} else if ( parameters.precision === 'mediump' ) {\n\n\t\tprecisionstring += '\\n#define MEDIUM_PRECISION';\n\n\t} else if ( parameters.precision === 'lowp' ) {\n\n\t\tprecisionstring += '\\n#define LOW_PRECISION';\n\n\t}\n\n\treturn precisionstring;\n\n}\n\nfunction generateShadowMapTypeDefine( parameters ) {\n\n\tlet shadowMapTypeDefine = 'SHADOWMAP_TYPE_BASIC';\n\n\tif ( parameters.shadowMapType === PCFShadowMap ) {\n\n\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF';\n\n\t} else if ( parameters.shadowMapType === PCFSoftShadowMap ) {\n\n\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF_SOFT';\n\n\t} else if ( parameters.shadowMapType === VSMShadowMap ) {\n\n\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_VSM';\n\n\t}\n\n\treturn shadowMapTypeDefine;\n\n}\n\nfunction generateEnvMapTypeDefine( parameters ) {\n\n\tlet envMapTypeDefine = 'ENVMAP_TYPE_CUBE';\n\n\tif ( parameters.envMap ) {\n\n\t\tswitch ( parameters.envMapMode ) {\n\n\t\t\tcase CubeReflectionMapping:\n\t\t\tcase CubeRefractionMapping:\n\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_CUBE';\n\t\t\t\tbreak;\n\n\t\t\tcase CubeUVReflectionMapping:\n\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_CUBE_UV';\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\treturn envMapTypeDefine;\n\n}\n\nfunction generateEnvMapModeDefine( parameters ) {\n\n\tlet envMapModeDefine = 'ENVMAP_MODE_REFLECTION';\n\n\tif ( parameters.envMap ) {\n\n\t\tswitch ( parameters.envMapMode ) {\n\n\t\t\tcase CubeRefractionMapping:\n\n\t\t\t\tenvMapModeDefine = 'ENVMAP_MODE_REFRACTION';\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\treturn envMapModeDefine;\n\n}\n\nfunction generateEnvMapBlendingDefine( parameters ) {\n\n\tlet envMapBlendingDefine = 'ENVMAP_BLENDING_NONE';\n\n\tif ( parameters.envMap ) {\n\n\t\tswitch ( parameters.combine ) {\n\n\t\t\tcase MultiplyOperation:\n\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY';\n\t\t\t\tbreak;\n\n\t\t\tcase MixOperation:\n\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_MIX';\n\t\t\t\tbreak;\n\n\t\t\tcase AddOperation:\n\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_ADD';\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\treturn envMapBlendingDefine;\n\n}\n\nfunction generateCubeUVSize( parameters ) {\n\n\tconst imageHeight = parameters.envMapCubeUVHeight;\n\n\tif ( imageHeight === null ) return null;\n\n\tconst maxMip = Math.log2( imageHeight ) - 2;\n\n\tconst texelHeight = 1.0 / imageHeight;\n\n\tconst texelWidth = 1.0 / ( 3 * Math.max( Math.pow( 2, maxMip ), 7 * 16 ) );\n\n\treturn { texelWidth, texelHeight, maxMip };\n\n}\n\nfunction WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {\n\n\t// TODO Send this event to Three.js DevTools\n\t// console.log( 'WebGLProgram', cacheKey );\n\n\tconst gl = renderer.getContext();\n\n\tconst defines = parameters.defines;\n\n\tlet vertexShader = parameters.vertexShader;\n\tlet fragmentShader = parameters.fragmentShader;\n\n\tconst shadowMapTypeDefine = generateShadowMapTypeDefine( parameters );\n\tconst envMapTypeDefine = generateEnvMapTypeDefine( parameters );\n\tconst envMapModeDefine = generateEnvMapModeDefine( parameters );\n\tconst envMapBlendingDefine = generateEnvMapBlendingDefine( parameters );\n\tconst envMapCubeUVSize = generateCubeUVSize( parameters );\n\n\tconst customExtensions = parameters.isWebGL2 ? '' : generateExtensions( parameters );\n\n\tconst customDefines = generateDefines( defines );\n\n\tconst program = gl.createProgram();\n\n\tlet prefixVertex, prefixFragment;\n\tlet versionString = parameters.glslVersion ? '#version ' + parameters.glslVersion + '\\n' : '';\n\n\tif ( parameters.isRawShaderMaterial ) {\n\n\t\tprefixVertex = [\n\n\t\t\tcustomDefines\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\tif ( prefixVertex.length > 0 ) {\n\n\t\t\tprefixVertex += '\\n';\n\n\t\t}\n\n\t\tprefixFragment = [\n\n\t\t\tcustomExtensions,\n\t\t\tcustomDefines\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\tif ( prefixFragment.length > 0 ) {\n\n\t\t\tprefixFragment += '\\n';\n\n\t\t}\n\n\t} else {\n\n\t\tprefixVertex = [\n\n\t\t\tgeneratePrecision( parameters ),\n\n\t\t\t'#define SHADER_NAME ' + parameters.shaderName,\n\n\t\t\tcustomDefines,\n\n\t\t\tparameters.instancing ? '#define USE_INSTANCING' : '',\n\t\t\tparameters.instancingColor ? '#define USE_INSTANCING_COLOR' : '',\n\n\t\t\tparameters.supportsVertexTextures ? '#define VERTEX_TEXTURES' : '',\n\n\t\t\t( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '',\n\t\t\t( parameters.useFog && parameters.fogExp2 ) ? '#define FOG_EXP2' : '',\n\n\t\t\tparameters.map ? '#define USE_MAP' : '',\n\t\t\tparameters.envMap ? '#define USE_ENVMAP' : '',\n\t\t\tparameters.envMap ? '#define ' + envMapModeDefine : '',\n\t\t\tparameters.lightMap ? '#define USE_LIGHTMAP' : '',\n\t\t\tparameters.aoMap ? '#define USE_AOMAP' : '',\n\t\t\tparameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\t\t\tparameters.bumpMap ? '#define USE_BUMPMAP' : '',\n\t\t\tparameters.normalMap ? '#define USE_NORMALMAP' : '',\n\t\t\t( parameters.normalMap && parameters.objectSpaceNormalMap ) ? '#define OBJECTSPACE_NORMALMAP' : '',\n\t\t\t( parameters.normalMap && parameters.tangentSpaceNormalMap ) ? '#define TANGENTSPACE_NORMALMAP' : '',\n\n\t\t\tparameters.clearcoatMap ? '#define USE_CLEARCOATMAP' : '',\n\t\t\tparameters.clearcoatRoughnessMap ? '#define USE_CLEARCOAT_ROUGHNESSMAP' : '',\n\t\t\tparameters.clearcoatNormalMap ? '#define USE_CLEARCOAT_NORMALMAP' : '',\n\n\t\t\tparameters.iridescenceMap ? '#define USE_IRIDESCENCEMAP' : '',\n\t\t\tparameters.iridescenceThicknessMap ? '#define USE_IRIDESCENCE_THICKNESSMAP' : '',\n\n\t\t\tparameters.displacementMap && parameters.supportsVertexTextures ? '#define USE_DISPLACEMENTMAP' : '',\n\n\t\t\tparameters.specularMap ? '#define USE_SPECULARMAP' : '',\n\t\t\tparameters.specularIntensityMap ? '#define USE_SPECULARINTENSITYMAP' : '',\n\t\t\tparameters.specularColorMap ? '#define USE_SPECULARCOLORMAP' : '',\n\n\t\t\tparameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',\n\t\t\tparameters.metalnessMap ? '#define USE_METALNESSMAP' : '',\n\t\t\tparameters.alphaMap ? '#define USE_ALPHAMAP' : '',\n\n\t\t\tparameters.transmission ? '#define USE_TRANSMISSION' : '',\n\t\t\tparameters.transmissionMap ? '#define USE_TRANSMISSIONMAP' : '',\n\t\t\tparameters.thicknessMap ? '#define USE_THICKNESSMAP' : '',\n\n\t\t\tparameters.sheenColorMap ? '#define USE_SHEENCOLORMAP' : '',\n\t\t\tparameters.sheenRoughnessMap ? '#define USE_SHEENROUGHNESSMAP' : '',\n\n\t\t\tparameters.vertexTangents ? '#define USE_TANGENT' : '',\n\t\t\tparameters.vertexColors ? '#define USE_COLOR' : '',\n\t\t\tparameters.vertexAlphas ? '#define USE_COLOR_ALPHA' : '',\n\t\t\tparameters.vertexUvs ? '#define USE_UV' : '',\n\t\t\tparameters.uvsVertexOnly ? '#define UVS_VERTEX_ONLY' : '',\n\n\t\t\tparameters.flatShading ? '#define FLAT_SHADED' : '',\n\n\t\t\tparameters.skinning ? '#define USE_SKINNING' : '',\n\n\t\t\tparameters.morphTargets ? '#define USE_MORPHTARGETS' : '',\n\t\t\tparameters.morphNormals && parameters.flatShading === false ? '#define USE_MORPHNORMALS' : '',\n\t\t\t( parameters.morphColors && parameters.isWebGL2 ) ? '#define USE_MORPHCOLORS' : '',\n\t\t\t( parameters.morphTargetsCount > 0 && parameters.isWebGL2 ) ? '#define MORPHTARGETS_TEXTURE' : '',\n\t\t\t( parameters.morphTargetsCount > 0 && parameters.isWebGL2 ) ? '#define MORPHTARGETS_TEXTURE_STRIDE ' + parameters.morphTextureStride : '',\n\t\t\t( parameters.morphTargetsCount > 0 && parameters.isWebGL2 ) ? '#define MORPHTARGETS_COUNT ' + parameters.morphTargetsCount : '',\n\t\t\tparameters.doubleSided ? '#define DOUBLE_SIDED' : '',\n\t\t\tparameters.flipSided ? '#define FLIP_SIDED' : '',\n\n\t\t\tparameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',\n\t\t\tparameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',\n\n\t\t\tparameters.sizeAttenuation ? '#define USE_SIZEATTENUATION' : '',\n\n\t\t\tparameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',\n\t\t\t( parameters.logarithmicDepthBuffer && parameters.rendererExtensionFragDepth ) ? '#define USE_LOGDEPTHBUF_EXT' : '',\n\n\t\t\t'uniform mat4 modelMatrix;',\n\t\t\t'uniform mat4 modelViewMatrix;',\n\t\t\t'uniform mat4 projectionMatrix;',\n\t\t\t'uniform mat4 viewMatrix;',\n\t\t\t'uniform mat3 normalMatrix;',\n\t\t\t'uniform vec3 cameraPosition;',\n\t\t\t'uniform bool isOrthographic;',\n\n\t\t\t'#ifdef USE_INSTANCING',\n\n\t\t\t'\tattribute mat4 instanceMatrix;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_INSTANCING_COLOR',\n\n\t\t\t'\tattribute vec3 instanceColor;',\n\n\t\t\t'#endif',\n\n\t\t\t'attribute vec3 position;',\n\t\t\t'attribute vec3 normal;',\n\t\t\t'attribute vec2 uv;',\n\n\t\t\t'#ifdef USE_TANGENT',\n\n\t\t\t'\tattribute vec4 tangent;',\n\n\t\t\t'#endif',\n\n\t\t\t'#if defined( USE_COLOR_ALPHA )',\n\n\t\t\t'\tattribute vec4 color;',\n\n\t\t\t'#elif defined( USE_COLOR )',\n\n\t\t\t'\tattribute vec3 color;',\n\n\t\t\t'#endif',\n\n\t\t\t'#if ( defined( USE_MORPHTARGETS ) && ! defined( MORPHTARGETS_TEXTURE ) )',\n\n\t\t\t'\tattribute vec3 morphTarget0;',\n\t\t\t'\tattribute vec3 morphTarget1;',\n\t\t\t'\tattribute vec3 morphTarget2;',\n\t\t\t'\tattribute vec3 morphTarget3;',\n\n\t\t\t'\t#ifdef USE_MORPHNORMALS',\n\n\t\t\t'\t\tattribute vec3 morphNormal0;',\n\t\t\t'\t\tattribute vec3 morphNormal1;',\n\t\t\t'\t\tattribute vec3 morphNormal2;',\n\t\t\t'\t\tattribute vec3 morphNormal3;',\n\n\t\t\t'\t#else',\n\n\t\t\t'\t\tattribute vec3 morphTarget4;',\n\t\t\t'\t\tattribute vec3 morphTarget5;',\n\t\t\t'\t\tattribute vec3 morphTarget6;',\n\t\t\t'\t\tattribute vec3 morphTarget7;',\n\n\t\t\t'\t#endif',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_SKINNING',\n\n\t\t\t'\tattribute vec4 skinIndex;',\n\t\t\t'\tattribute vec4 skinWeight;',\n\n\t\t\t'#endif',\n\n\t\t\t'\\n'\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\tprefixFragment = [\n\n\t\t\tcustomExtensions,\n\n\t\t\tgeneratePrecision( parameters ),\n\n\t\t\t'#define SHADER_NAME ' + parameters.shaderName,\n\n\t\t\tcustomDefines,\n\n\t\t\t( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '',\n\t\t\t( parameters.useFog && parameters.fogExp2 ) ? '#define FOG_EXP2' : '',\n\n\t\t\tparameters.map ? '#define USE_MAP' : '',\n\t\t\tparameters.matcap ? '#define USE_MATCAP' : '',\n\t\t\tparameters.envMap ? '#define USE_ENVMAP' : '',\n\t\t\tparameters.envMap ? '#define ' + envMapTypeDefine : '',\n\t\t\tparameters.envMap ? '#define ' + envMapModeDefine : '',\n\t\t\tparameters.envMap ? '#define ' + envMapBlendingDefine : '',\n\t\t\tenvMapCubeUVSize ? '#define CUBEUV_TEXEL_WIDTH ' + envMapCubeUVSize.texelWidth : '',\n\t\t\tenvMapCubeUVSize ? '#define CUBEUV_TEXEL_HEIGHT ' + envMapCubeUVSize.texelHeight : '',\n\t\t\tenvMapCubeUVSize ? '#define CUBEUV_MAX_MIP ' + envMapCubeUVSize.maxMip + '.0' : '',\n\t\t\tparameters.lightMap ? '#define USE_LIGHTMAP' : '',\n\t\t\tparameters.aoMap ? '#define USE_AOMAP' : '',\n\t\t\tparameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\t\t\tparameters.bumpMap ? '#define USE_BUMPMAP' : '',\n\t\t\tparameters.normalMap ? '#define USE_NORMALMAP' : '',\n\t\t\t( parameters.normalMap && parameters.objectSpaceNormalMap ) ? '#define OBJECTSPACE_NORMALMAP' : '',\n\t\t\t( parameters.normalMap && parameters.tangentSpaceNormalMap ) ? '#define TANGENTSPACE_NORMALMAP' : '',\n\n\t\t\tparameters.clearcoat ? '#define USE_CLEARCOAT' : '',\n\t\t\tparameters.clearcoatMap ? '#define USE_CLEARCOATMAP' : '',\n\t\t\tparameters.clearcoatRoughnessMap ? '#define USE_CLEARCOAT_ROUGHNESSMAP' : '',\n\t\t\tparameters.clearcoatNormalMap ? '#define USE_CLEARCOAT_NORMALMAP' : '',\n\n\t\t\tparameters.iridescence ? '#define USE_IRIDESCENCE' : '',\n\t\t\tparameters.iridescenceMap ? '#define USE_IRIDESCENCEMAP' : '',\n\t\t\tparameters.iridescenceThicknessMap ? '#define USE_IRIDESCENCE_THICKNESSMAP' : '',\n\n\t\t\tparameters.specularMap ? '#define USE_SPECULARMAP' : '',\n\t\t\tparameters.specularIntensityMap ? '#define USE_SPECULARINTENSITYMAP' : '',\n\t\t\tparameters.specularColorMap ? '#define USE_SPECULARCOLORMAP' : '',\n\t\t\tparameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',\n\t\t\tparameters.metalnessMap ? '#define USE_METALNESSMAP' : '',\n\n\t\t\tparameters.alphaMap ? '#define USE_ALPHAMAP' : '',\n\t\t\tparameters.alphaTest ? '#define USE_ALPHATEST' : '',\n\n\t\t\tparameters.sheen ? '#define USE_SHEEN' : '',\n\t\t\tparameters.sheenColorMap ? '#define USE_SHEENCOLORMAP' : '',\n\t\t\tparameters.sheenRoughnessMap ? '#define USE_SHEENROUGHNESSMAP' : '',\n\n\t\t\tparameters.transmission ? '#define USE_TRANSMISSION' : '',\n\t\t\tparameters.transmissionMap ? '#define USE_TRANSMISSIONMAP' : '',\n\t\t\tparameters.thicknessMap ? '#define USE_THICKNESSMAP' : '',\n\n\t\t\tparameters.decodeVideoTexture ? '#define DECODE_VIDEO_TEXTURE' : '',\n\n\t\t\tparameters.vertexTangents ? '#define USE_TANGENT' : '',\n\t\t\tparameters.vertexColors || parameters.instancingColor ? '#define USE_COLOR' : '',\n\t\t\tparameters.vertexAlphas ? '#define USE_COLOR_ALPHA' : '',\n\t\t\tparameters.vertexUvs ? '#define USE_UV' : '',\n\t\t\tparameters.uvsVertexOnly ? '#define UVS_VERTEX_ONLY' : '',\n\n\t\t\tparameters.gradientMap ? '#define USE_GRADIENTMAP' : '',\n\n\t\t\tparameters.flatShading ? '#define FLAT_SHADED' : '',\n\n\t\t\tparameters.doubleSided ? '#define DOUBLE_SIDED' : '',\n\t\t\tparameters.flipSided ? '#define FLIP_SIDED' : '',\n\n\t\t\tparameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',\n\t\t\tparameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',\n\n\t\t\tparameters.premultipliedAlpha ? '#define PREMULTIPLIED_ALPHA' : '',\n\n\t\t\tparameters.physicallyCorrectLights ? '#define PHYSICALLY_CORRECT_LIGHTS' : '',\n\n\t\t\tparameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',\n\t\t\t( parameters.logarithmicDepthBuffer && parameters.rendererExtensionFragDepth ) ? '#define USE_LOGDEPTHBUF_EXT' : '',\n\n\t\t\t'uniform mat4 viewMatrix;',\n\t\t\t'uniform vec3 cameraPosition;',\n\t\t\t'uniform bool isOrthographic;',\n\n\t\t\t( parameters.toneMapping !== NoToneMapping ) ? '#define TONE_MAPPING' : '',\n\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( parameters.toneMapping !== NoToneMapping ) ? getToneMappingFunction( 'toneMapping', parameters.toneMapping ) : '',\n\n\t\t\tparameters.dithering ? '#define DITHERING' : '',\n\t\t\tparameters.opaque ? '#define OPAQUE' : '',\n\n\t\t\tShaderChunk[ 'encodings_pars_fragment' ], // this code is required here because it is used by the various encoding/decoding function defined below\n\t\t\tgetTexelEncodingFunction( 'linearToOutputTexel', parameters.outputEncoding ),\n\n\t\t\tparameters.useDepthPacking ? '#define DEPTH_PACKING ' + parameters.depthPacking : '',\n\n\t\t\t'\\n'\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t}\n\n\tvertexShader = resolveIncludes( vertexShader );\n\tvertexShader = replaceLightNums( vertexShader, parameters );\n\tvertexShader = replaceClippingPlaneNums( vertexShader, parameters );\n\n\tfragmentShader = resolveIncludes( fragmentShader );\n\tfragmentShader = replaceLightNums( fragmentShader, parameters );\n\tfragmentShader = replaceClippingPlaneNums( fragmentShader, parameters );\n\n\tvertexShader = unrollLoops( vertexShader );\n\tfragmentShader = unrollLoops( fragmentShader );\n\n\tif ( parameters.isWebGL2 && parameters.isRawShaderMaterial !== true ) {\n\n\t\t// GLSL 3.0 conversion for built-in materials and ShaderMaterial\n\n\t\tversionString = '#version 300 es\\n';\n\n\t\tprefixVertex = [\n\t\t\t'precision mediump sampler2DArray;',\n\t\t\t'#define attribute in',\n\t\t\t'#define varying out',\n\t\t\t'#define texture2D texture'\n\t\t].join( '\\n' ) + '\\n' + prefixVertex;\n\n\t\tprefixFragment = [\n\t\t\t'#define varying in',\n\t\t\t( parameters.glslVersion === GLSL3 ) ? '' : 'layout(location = 0) out highp vec4 pc_fragColor;',\n\t\t\t( parameters.glslVersion === GLSL3 ) ? '' : '#define gl_FragColor pc_fragColor',\n\t\t\t'#define gl_FragDepthEXT gl_FragDepth',\n\t\t\t'#define texture2D texture',\n\t\t\t'#define textureCube texture',\n\t\t\t'#define texture2DProj textureProj',\n\t\t\t'#define texture2DLodEXT textureLod',\n\t\t\t'#define texture2DProjLodEXT textureProjLod',\n\t\t\t'#define textureCubeLodEXT textureLod',\n\t\t\t'#define texture2DGradEXT textureGrad',\n\t\t\t'#define texture2DProjGradEXT textureProjGrad',\n\t\t\t'#define textureCubeGradEXT textureGrad'\n\t\t].join( '\\n' ) + '\\n' + prefixFragment;\n\n\t}\n\n\tconst vertexGlsl = versionString + prefixVertex + vertexShader;\n\tconst fragmentGlsl = versionString + prefixFragment + fragmentShader;\n\n\t// console.log( '*VERTEX*', vertexGlsl );\n\t// console.log( '*FRAGMENT*', fragmentGlsl );\n\n\tconst glVertexShader = WebGLShader( gl, 35633, vertexGlsl );\n\tconst glFragmentShader = WebGLShader( gl, 35632, fragmentGlsl );\n\n\tgl.attachShader( program, glVertexShader );\n\tgl.attachShader( program, glFragmentShader );\n\n\t// Force a particular attribute to index 0.\n\n\tif ( parameters.index0AttributeName !== undefined ) {\n\n\t\tgl.bindAttribLocation( program, 0, parameters.index0AttributeName );\n\n\t} else if ( parameters.morphTargets === true ) {\n\n\t\t// programs with morphTargets displace position out of attribute 0\n\t\tgl.bindAttribLocation( program, 0, 'position' );\n\n\t}\n\n\tgl.linkProgram( program );\n\n\t// check for link errors\n\tif ( renderer.debug.checkShaderErrors ) {\n\n\t\tconst programLog = gl.getProgramInfoLog( program ).trim();\n\t\tconst vertexLog = gl.getShaderInfoLog( glVertexShader ).trim();\n\t\tconst fragmentLog = gl.getShaderInfoLog( glFragmentShader ).trim();\n\n\t\tlet runnable = true;\n\t\tlet haveDiagnostics = true;\n\n\t\tif ( gl.getProgramParameter( program, 35714 ) === false ) {\n\n\t\t\trunnable = false;\n\n\t\t\tconst vertexErrors = getShaderErrors( gl, glVertexShader, 'vertex' );\n\t\t\tconst fragmentErrors = getShaderErrors( gl, glFragmentShader, 'fragment' );\n\n\t\t\tconsole.error(\n\t\t\t\t'THREE.WebGLProgram: Shader Error ' + gl.getError() + ' - ' +\n\t\t\t\t'VALIDATE_STATUS ' + gl.getProgramParameter( program, 35715 ) + '\\n\\n' +\n\t\t\t\t'Program Info Log: ' + programLog + '\\n' +\n\t\t\t\tvertexErrors + '\\n' +\n\t\t\t\tfragmentErrors\n\t\t\t);\n\n\t\t} else if ( programLog !== '' ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLProgram: Program Info Log:', 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\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}\n\n\t// Clean up\n\n\t// Crashes in iOS9 and iOS10. #18402\n\t// gl.detachShader( program, glVertexShader );\n\t// gl.detachShader( program, glFragmentShader );\n\n\tgl.deleteShader( glVertexShader );\n\tgl.deleteShader( glFragmentShader );\n\n\t// set up caching for uniform locations\n\n\tlet cachedUniforms;\n\n\tthis.getUniforms = function () {\n\n\t\tif ( cachedUniforms === undefined ) {\n\n\t\t\tcachedUniforms = new WebGLUniforms( gl, program );\n\n\t\t}\n\n\t\treturn cachedUniforms;\n\n\t};\n\n\t// set up caching for attribute locations\n\n\tlet cachedAttributes;\n\n\tthis.getAttributes = function () {\n\n\t\tif ( cachedAttributes === undefined ) {\n\n\t\t\tcachedAttributes = fetchAttributeLocations( gl, program );\n\n\t\t}\n\n\t\treturn cachedAttributes;\n\n\t};\n\n\t// free resource\n\n\tthis.destroy = function () {\n\n\t\tbindingStates.releaseStatesOfProgram( this );\n\n\t\tgl.deleteProgram( program );\n\t\tthis.program = undefined;\n\n\t};\n\n\t//\n\n\tthis.name = parameters.shaderName;\n\tthis.id = programIdCount ++;\n\tthis.cacheKey = cacheKey;\n\tthis.usedTimes = 1;\n\tthis.program = program;\n\tthis.vertexShader = glVertexShader;\n\tthis.fragmentShader = glFragmentShader;\n\n\treturn this;\n\n}\n\nlet _id = 0;\n\nclass WebGLShaderCache {\n\n\tconstructor() {\n\n\t\tthis.shaderCache = new Map();\n\t\tthis.materialCache = new Map();\n\n\t}\n\n\tupdate( material ) {\n\n\t\tconst vertexShader = material.vertexShader;\n\t\tconst fragmentShader = material.fragmentShader;\n\n\t\tconst vertexShaderStage = this._getShaderStage( vertexShader );\n\t\tconst fragmentShaderStage = this._getShaderStage( fragmentShader );\n\n\t\tconst materialShaders = this._getShaderCacheForMaterial( material );\n\n\t\tif ( materialShaders.has( vertexShaderStage ) === false ) {\n\n\t\t\tmaterialShaders.add( vertexShaderStage );\n\t\t\tvertexShaderStage.usedTimes ++;\n\n\t\t}\n\n\t\tif ( materialShaders.has( fragmentShaderStage ) === false ) {\n\n\t\t\tmaterialShaders.add( fragmentShaderStage );\n\t\t\tfragmentShaderStage.usedTimes ++;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tremove( material ) {\n\n\t\tconst materialShaders = this.materialCache.get( material );\n\n\t\tfor ( const shaderStage of materialShaders ) {\n\n\t\t\tshaderStage.usedTimes --;\n\n\t\t\tif ( shaderStage.usedTimes === 0 ) this.shaderCache.delete( shaderStage.code );\n\n\t\t}\n\n\t\tthis.materialCache.delete( material );\n\n\t\treturn this;\n\n\t}\n\n\tgetVertexShaderID( material ) {\n\n\t\treturn this._getShaderStage( material.vertexShader ).id;\n\n\t}\n\n\tgetFragmentShaderID( material ) {\n\n\t\treturn this._getShaderStage( material.fragmentShader ).id;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.shaderCache.clear();\n\t\tthis.materialCache.clear();\n\n\t}\n\n\t_getShaderCacheForMaterial( material ) {\n\n\t\tconst cache = this.materialCache;\n\n\t\tif ( cache.has( material ) === false ) {\n\n\t\t\tcache.set( material, new Set() );\n\n\t\t}\n\n\t\treturn cache.get( material );\n\n\t}\n\n\t_getShaderStage( code ) {\n\n\t\tconst cache = this.shaderCache;\n\n\t\tif ( cache.has( code ) === false ) {\n\n\t\t\tconst stage = new WebGLShaderStage( code );\n\t\t\tcache.set( code, stage );\n\n\t\t}\n\n\t\treturn cache.get( code );\n\n\t}\n\n}\n\nclass WebGLShaderStage {\n\n\tconstructor( code ) {\n\n\t\tthis.id = _id ++;\n\n\t\tthis.code = code;\n\t\tthis.usedTimes = 0;\n\n\t}\n\n}\n\nfunction WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities, bindingStates, clipping ) {\n\n\tconst _programLayers = new Layers();\n\tconst _customShaders = new WebGLShaderCache();\n\tconst programs = [];\n\n\tconst isWebGL2 = capabilities.isWebGL2;\n\tconst logarithmicDepthBuffer = capabilities.logarithmicDepthBuffer;\n\tconst vertexTextures = capabilities.vertexTextures;\n\tlet precision = capabilities.precision;\n\n\tconst shaderIDs = {\n\t\tMeshDepthMaterial: 'depth',\n\t\tMeshDistanceMaterial: 'distanceRGBA',\n\t\tMeshNormalMaterial: 'normal',\n\t\tMeshBasicMaterial: 'basic',\n\t\tMeshLambertMaterial: 'lambert',\n\t\tMeshPhongMaterial: 'phong',\n\t\tMeshToonMaterial: 'toon',\n\t\tMeshStandardMaterial: 'physical',\n\t\tMeshPhysicalMaterial: 'physical',\n\t\tMeshMatcapMaterial: 'matcap',\n\t\tLineBasicMaterial: 'basic',\n\t\tLineDashedMaterial: 'dashed',\n\t\tPointsMaterial: 'points',\n\t\tShadowMaterial: 'shadow',\n\t\tSpriteMaterial: 'sprite'\n\t};\n\n\tfunction getParameters( material, lights, shadows, scene, object ) {\n\n\t\tconst fog = scene.fog;\n\t\tconst geometry = object.geometry;\n\t\tconst environment = material.isMeshStandardMaterial ? scene.environment : null;\n\n\t\tconst envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || environment );\n\t\tconst envMapCubeUVHeight = ( !! envMap ) && ( envMap.mapping === CubeUVReflectionMapping ) ? envMap.image.height : null;\n\n\t\tconst shaderID = shaderIDs[ material.type ];\n\n\t\t// heuristics to create shader parameters according to lights in the scene\n\t\t// (not to blow over maxLights budget)\n\n\t\tif ( material.precision !== null ) {\n\n\t\t\tprecision = capabilities.getMaxPrecision( material.precision );\n\n\t\t\tif ( precision !== material.precision ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLProgram.getParameters:', material.precision, 'not supported, using', precision, 'instead.' );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tconst morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color;\n\t\tconst morphTargetsCount = ( morphAttribute !== undefined ) ? morphAttribute.length : 0;\n\n\t\tlet morphTextureStride = 0;\n\n\t\tif ( geometry.morphAttributes.position !== undefined ) morphTextureStride = 1;\n\t\tif ( geometry.morphAttributes.normal !== undefined ) morphTextureStride = 2;\n\t\tif ( geometry.morphAttributes.color !== undefined ) morphTextureStride = 3;\n\n\t\t//\n\n\t\tlet vertexShader, fragmentShader;\n\t\tlet customVertexShaderID, customFragmentShaderID;\n\n\t\tif ( shaderID ) {\n\n\t\t\tconst shader = ShaderLib[ shaderID ];\n\n\t\t\tvertexShader = shader.vertexShader;\n\t\t\tfragmentShader = shader.fragmentShader;\n\n\t\t} else {\n\n\t\t\tvertexShader = material.vertexShader;\n\t\t\tfragmentShader = material.fragmentShader;\n\n\t\t\t_customShaders.update( material );\n\n\t\t\tcustomVertexShaderID = _customShaders.getVertexShaderID( material );\n\t\t\tcustomFragmentShaderID = _customShaders.getFragmentShaderID( material );\n\n\t\t}\n\n\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\n\t\tconst useAlphaTest = material.alphaTest > 0;\n\t\tconst useClearcoat = material.clearcoat > 0;\n\t\tconst useIridescence = material.iridescence > 0;\n\n\t\tconst parameters = {\n\n\t\t\tisWebGL2: isWebGL2,\n\n\t\t\tshaderID: shaderID,\n\t\t\tshaderName: material.type,\n\n\t\t\tvertexShader: vertexShader,\n\t\t\tfragmentShader: fragmentShader,\n\t\t\tdefines: material.defines,\n\n\t\t\tcustomVertexShaderID: customVertexShaderID,\n\t\t\tcustomFragmentShaderID: customFragmentShaderID,\n\n\t\t\tisRawShaderMaterial: material.isRawShaderMaterial === true,\n\t\t\tglslVersion: material.glslVersion,\n\n\t\t\tprecision: precision,\n\n\t\t\tinstancing: object.isInstancedMesh === true,\n\t\t\tinstancingColor: object.isInstancedMesh === true && object.instanceColor !== null,\n\n\t\t\tsupportsVertexTextures: vertexTextures,\n\t\t\toutputEncoding: ( currentRenderTarget === null ) ? renderer.outputEncoding : ( currentRenderTarget.isXRRenderTarget === true ? currentRenderTarget.texture.encoding : LinearEncoding ),\n\t\t\tmap: !! material.map,\n\t\t\tmatcap: !! material.matcap,\n\t\t\tenvMap: !! envMap,\n\t\t\tenvMapMode: envMap && envMap.mapping,\n\t\t\tenvMapCubeUVHeight: envMapCubeUVHeight,\n\t\t\tlightMap: !! material.lightMap,\n\t\t\taoMap: !! material.aoMap,\n\t\t\temissiveMap: !! material.emissiveMap,\n\t\t\tbumpMap: !! material.bumpMap,\n\t\t\tnormalMap: !! material.normalMap,\n\t\t\tobjectSpaceNormalMap: material.normalMapType === ObjectSpaceNormalMap,\n\t\t\ttangentSpaceNormalMap: material.normalMapType === TangentSpaceNormalMap,\n\n\t\t\tdecodeVideoTexture: !! material.map && ( material.map.isVideoTexture === true ) && ( material.map.encoding === sRGBEncoding ),\n\n\t\t\tclearcoat: useClearcoat,\n\t\t\tclearcoatMap: useClearcoat && !! material.clearcoatMap,\n\t\t\tclearcoatRoughnessMap: useClearcoat && !! material.clearcoatRoughnessMap,\n\t\t\tclearcoatNormalMap: useClearcoat && !! material.clearcoatNormalMap,\n\n\t\t\tiridescence: useIridescence,\n\t\t\tiridescenceMap: useIridescence && !! material.iridescenceMap,\n\t\t\tiridescenceThicknessMap: useIridescence && !! material.iridescenceThicknessMap,\n\n\t\t\tdisplacementMap: !! material.displacementMap,\n\t\t\troughnessMap: !! material.roughnessMap,\n\t\t\tmetalnessMap: !! material.metalnessMap,\n\t\t\tspecularMap: !! material.specularMap,\n\t\t\tspecularIntensityMap: !! material.specularIntensityMap,\n\t\t\tspecularColorMap: !! material.specularColorMap,\n\n\t\t\topaque: material.transparent === false && material.blending === NormalBlending,\n\n\t\t\talphaMap: !! material.alphaMap,\n\t\t\talphaTest: useAlphaTest,\n\n\t\t\tgradientMap: !! material.gradientMap,\n\n\t\t\tsheen: material.sheen > 0,\n\t\t\tsheenColorMap: !! material.sheenColorMap,\n\t\t\tsheenRoughnessMap: !! material.sheenRoughnessMap,\n\n\t\t\ttransmission: material.transmission > 0,\n\t\t\ttransmissionMap: !! material.transmissionMap,\n\t\t\tthicknessMap: !! material.thicknessMap,\n\n\t\t\tcombine: material.combine,\n\n\t\t\tvertexTangents: ( !! material.normalMap && !! geometry.attributes.tangent ),\n\t\t\tvertexColors: material.vertexColors,\n\t\t\tvertexAlphas: material.vertexColors === true && !! geometry.attributes.color && geometry.attributes.color.itemSize === 4,\n\t\t\tvertexUvs: !! material.map || !! material.bumpMap || !! material.normalMap || !! material.specularMap || !! material.alphaMap || !! material.emissiveMap || !! material.roughnessMap || !! material.metalnessMap || !! material.clearcoatMap || !! material.clearcoatRoughnessMap || !! material.clearcoatNormalMap || !! material.iridescenceMap || !! material.iridescenceThicknessMap || !! material.displacementMap || !! material.transmissionMap || !! material.thicknessMap || !! material.specularIntensityMap || !! material.specularColorMap || !! material.sheenColorMap || !! material.sheenRoughnessMap,\n\t\t\tuvsVertexOnly: ! ( !! material.map || !! material.bumpMap || !! material.normalMap || !! material.specularMap || !! material.alphaMap || !! material.emissiveMap || !! material.roughnessMap || !! material.metalnessMap || !! material.clearcoatNormalMap || !! material.iridescenceMap || !! material.iridescenceThicknessMap || material.transmission > 0 || !! material.transmissionMap || !! material.thicknessMap || !! material.specularIntensityMap || !! material.specularColorMap || material.sheen > 0 || !! material.sheenColorMap || !! material.sheenRoughnessMap ) && !! material.displacementMap,\n\n\t\t\tfog: !! fog,\n\t\t\tuseFog: material.fog === true,\n\t\t\tfogExp2: ( fog && fog.isFogExp2 ),\n\n\t\t\tflatShading: !! material.flatShading,\n\n\t\t\tsizeAttenuation: material.sizeAttenuation,\n\t\t\tlogarithmicDepthBuffer: logarithmicDepthBuffer,\n\n\t\t\tskinning: object.isSkinnedMesh === true,\n\n\t\t\tmorphTargets: geometry.morphAttributes.position !== undefined,\n\t\t\tmorphNormals: geometry.morphAttributes.normal !== undefined,\n\t\t\tmorphColors: geometry.morphAttributes.color !== undefined,\n\t\t\tmorphTargetsCount: morphTargetsCount,\n\t\t\tmorphTextureStride: morphTextureStride,\n\n\t\t\tnumDirLights: lights.directional.length,\n\t\t\tnumPointLights: lights.point.length,\n\t\t\tnumSpotLights: lights.spot.length,\n\t\t\tnumRectAreaLights: lights.rectArea.length,\n\t\t\tnumHemiLights: lights.hemi.length,\n\n\t\t\tnumDirLightShadows: lights.directionalShadowMap.length,\n\t\t\tnumPointLightShadows: lights.pointShadowMap.length,\n\t\t\tnumSpotLightShadows: lights.spotShadowMap.length,\n\n\t\t\tnumClippingPlanes: clipping.numPlanes,\n\t\t\tnumClipIntersection: clipping.numIntersection,\n\n\t\t\tdithering: material.dithering,\n\n\t\t\tshadowMapEnabled: renderer.shadowMap.enabled && shadows.length > 0,\n\t\t\tshadowMapType: renderer.shadowMap.type,\n\n\t\t\ttoneMapping: material.toneMapped ? renderer.toneMapping : NoToneMapping,\n\t\t\tphysicallyCorrectLights: renderer.physicallyCorrectLights,\n\n\t\t\tpremultipliedAlpha: material.premultipliedAlpha,\n\n\t\t\tdoubleSided: material.side === DoubleSide,\n\t\t\tflipSided: material.side === BackSide,\n\n\t\t\tuseDepthPacking: !! material.depthPacking,\n\t\t\tdepthPacking: material.depthPacking || 0,\n\n\t\t\tindex0AttributeName: material.index0AttributeName,\n\n\t\t\textensionDerivatives: material.extensions && material.extensions.derivatives,\n\t\t\textensionFragDepth: material.extensions && material.extensions.fragDepth,\n\t\t\textensionDrawBuffers: material.extensions && material.extensions.drawBuffers,\n\t\t\textensionShaderTextureLOD: material.extensions && material.extensions.shaderTextureLOD,\n\n\t\t\trendererExtensionFragDepth: isWebGL2 || extensions.has( 'EXT_frag_depth' ),\n\t\t\trendererExtensionDrawBuffers: isWebGL2 || extensions.has( 'WEBGL_draw_buffers' ),\n\t\t\trendererExtensionShaderTextureLod: isWebGL2 || extensions.has( 'EXT_shader_texture_lod' ),\n\n\t\t\tcustomProgramCacheKey: material.customProgramCacheKey()\n\n\t\t};\n\n\t\treturn parameters;\n\n\t}\n\n\tfunction getProgramCacheKey( parameters ) {\n\n\t\tconst array = [];\n\n\t\tif ( parameters.shaderID ) {\n\n\t\t\tarray.push( parameters.shaderID );\n\n\t\t} else {\n\n\t\t\tarray.push( parameters.customVertexShaderID );\n\t\t\tarray.push( parameters.customFragmentShaderID );\n\n\t\t}\n\n\t\tif ( parameters.defines !== undefined ) {\n\n\t\t\tfor ( const name in parameters.defines ) {\n\n\t\t\t\tarray.push( name );\n\t\t\t\tarray.push( parameters.defines[ name ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( parameters.isRawShaderMaterial === false ) {\n\n\t\t\tgetProgramCacheKeyParameters( array, parameters );\n\t\t\tgetProgramCacheKeyBooleans( array, parameters );\n\t\t\tarray.push( renderer.outputEncoding );\n\n\t\t}\n\n\t\tarray.push( parameters.customProgramCacheKey );\n\n\t\treturn array.join();\n\n\t}\n\n\tfunction getProgramCacheKeyParameters( array, parameters ) {\n\n\t\tarray.push( parameters.precision );\n\t\tarray.push( parameters.outputEncoding );\n\t\tarray.push( parameters.envMapMode );\n\t\tarray.push( parameters.envMapCubeUVHeight );\n\t\tarray.push( parameters.combine );\n\t\tarray.push( parameters.vertexUvs );\n\t\tarray.push( parameters.fogExp2 );\n\t\tarray.push( parameters.sizeAttenuation );\n\t\tarray.push( parameters.morphTargetsCount );\n\t\tarray.push( parameters.morphAttributeCount );\n\t\tarray.push( parameters.numDirLights );\n\t\tarray.push( parameters.numPointLights );\n\t\tarray.push( parameters.numSpotLights );\n\t\tarray.push( parameters.numHemiLights );\n\t\tarray.push( parameters.numRectAreaLights );\n\t\tarray.push( parameters.numDirLightShadows );\n\t\tarray.push( parameters.numPointLightShadows );\n\t\tarray.push( parameters.numSpotLightShadows );\n\t\tarray.push( parameters.shadowMapType );\n\t\tarray.push( parameters.toneMapping );\n\t\tarray.push( parameters.numClippingPlanes );\n\t\tarray.push( parameters.numClipIntersection );\n\t\tarray.push( parameters.depthPacking );\n\n\t}\n\n\tfunction getProgramCacheKeyBooleans( array, parameters ) {\n\n\t\t_programLayers.disableAll();\n\n\t\tif ( parameters.isWebGL2 )\n\t\t\t_programLayers.enable( 0 );\n\t\tif ( parameters.supportsVertexTextures )\n\t\t\t_programLayers.enable( 1 );\n\t\tif ( parameters.instancing )\n\t\t\t_programLayers.enable( 2 );\n\t\tif ( parameters.instancingColor )\n\t\t\t_programLayers.enable( 3 );\n\t\tif ( parameters.map )\n\t\t\t_programLayers.enable( 4 );\n\t\tif ( parameters.matcap )\n\t\t\t_programLayers.enable( 5 );\n\t\tif ( parameters.envMap )\n\t\t\t_programLayers.enable( 6 );\n\t\tif ( parameters.lightMap )\n\t\t\t_programLayers.enable( 7 );\n\t\tif ( parameters.aoMap )\n\t\t\t_programLayers.enable( 8 );\n\t\tif ( parameters.emissiveMap )\n\t\t\t_programLayers.enable( 9 );\n\t\tif ( parameters.bumpMap )\n\t\t\t_programLayers.enable( 10 );\n\t\tif ( parameters.normalMap )\n\t\t\t_programLayers.enable( 11 );\n\t\tif ( parameters.objectSpaceNormalMap )\n\t\t\t_programLayers.enable( 12 );\n\t\tif ( parameters.tangentSpaceNormalMap )\n\t\t\t_programLayers.enable( 13 );\n\t\tif ( parameters.clearcoat )\n\t\t\t_programLayers.enable( 14 );\n\t\tif ( parameters.clearcoatMap )\n\t\t\t_programLayers.enable( 15 );\n\t\tif ( parameters.clearcoatRoughnessMap )\n\t\t\t_programLayers.enable( 16 );\n\t\tif ( parameters.clearcoatNormalMap )\n\t\t\t_programLayers.enable( 17 );\n\t\tif ( parameters.iridescence )\n\t\t\t_programLayers.enable( 18 );\n\t\tif ( parameters.iridescenceMap )\n\t\t\t_programLayers.enable( 19 );\n\t\tif ( parameters.iridescenceThicknessMap )\n\t\t\t_programLayers.enable( 20 );\n\t\tif ( parameters.displacementMap )\n\t\t\t_programLayers.enable( 21 );\n\t\tif ( parameters.specularMap )\n\t\t\t_programLayers.enable( 22 );\n\t\tif ( parameters.roughnessMap )\n\t\t\t_programLayers.enable( 23 );\n\t\tif ( parameters.metalnessMap )\n\t\t\t_programLayers.enable( 24 );\n\t\tif ( parameters.gradientMap )\n\t\t\t_programLayers.enable( 25 );\n\t\tif ( parameters.alphaMap )\n\t\t\t_programLayers.enable( 26 );\n\t\tif ( parameters.alphaTest )\n\t\t\t_programLayers.enable( 27 );\n\t\tif ( parameters.vertexColors )\n\t\t\t_programLayers.enable( 28 );\n\t\tif ( parameters.vertexAlphas )\n\t\t\t_programLayers.enable( 29 );\n\t\tif ( parameters.vertexUvs )\n\t\t\t_programLayers.enable( 30 );\n\t\tif ( parameters.vertexTangents )\n\t\t\t_programLayers.enable( 31 );\n\t\tif ( parameters.uvsVertexOnly )\n\t\t\t_programLayers.enable( 32 );\n\t\tif ( parameters.fog )\n\t\t\t_programLayers.enable( 33 );\n\n\t\tarray.push( _programLayers.mask );\n\t\t_programLayers.disableAll();\n\n\t\tif ( parameters.useFog )\n\t\t\t_programLayers.enable( 0 );\n\t\tif ( parameters.flatShading )\n\t\t\t_programLayers.enable( 1 );\n\t\tif ( parameters.logarithmicDepthBuffer )\n\t\t\t_programLayers.enable( 2 );\n\t\tif ( parameters.skinning )\n\t\t\t_programLayers.enable( 3 );\n\t\tif ( parameters.morphTargets )\n\t\t\t_programLayers.enable( 4 );\n\t\tif ( parameters.morphNormals )\n\t\t\t_programLayers.enable( 5 );\n\t\tif ( parameters.morphColors )\n\t\t\t_programLayers.enable( 6 );\n\t\tif ( parameters.premultipliedAlpha )\n\t\t\t_programLayers.enable( 7 );\n\t\tif ( parameters.shadowMapEnabled )\n\t\t\t_programLayers.enable( 8 );\n\t\tif ( parameters.physicallyCorrectLights )\n\t\t\t_programLayers.enable( 9 );\n\t\tif ( parameters.doubleSided )\n\t\t\t_programLayers.enable( 10 );\n\t\tif ( parameters.flipSided )\n\t\t\t_programLayers.enable( 11 );\n\t\tif ( parameters.useDepthPacking )\n\t\t\t_programLayers.enable( 12 );\n\t\tif ( parameters.dithering )\n\t\t\t_programLayers.enable( 13 );\n\t\tif ( parameters.specularIntensityMap )\n\t\t\t_programLayers.enable( 14 );\n\t\tif ( parameters.specularColorMap )\n\t\t\t_programLayers.enable( 15 );\n\t\tif ( parameters.transmission )\n\t\t\t_programLayers.enable( 16 );\n\t\tif ( parameters.transmissionMap )\n\t\t\t_programLayers.enable( 17 );\n\t\tif ( parameters.thicknessMap )\n\t\t\t_programLayers.enable( 18 );\n\t\tif ( parameters.sheen )\n\t\t\t_programLayers.enable( 19 );\n\t\tif ( parameters.sheenColorMap )\n\t\t\t_programLayers.enable( 20 );\n\t\tif ( parameters.sheenRoughnessMap )\n\t\t\t_programLayers.enable( 21 );\n\t\tif ( parameters.decodeVideoTexture )\n\t\t\t_programLayers.enable( 22 );\n\t\tif ( parameters.opaque )\n\t\t\t_programLayers.enable( 23 );\n\n\t\tarray.push( _programLayers.mask );\n\n\t}\n\n\tfunction getUniforms( material ) {\n\n\t\tconst shaderID = shaderIDs[ material.type ];\n\t\tlet uniforms;\n\n\t\tif ( shaderID ) {\n\n\t\t\tconst shader = ShaderLib[ shaderID ];\n\t\t\tuniforms = UniformsUtils.clone( shader.uniforms );\n\n\t\t} else {\n\n\t\t\tuniforms = material.uniforms;\n\n\t\t}\n\n\t\treturn uniforms;\n\n\t}\n\n\tfunction acquireProgram( parameters, cacheKey ) {\n\n\t\tlet program;\n\n\t\t// Check if code has been already compiled\n\t\tfor ( let p = 0, pl = programs.length; p < pl; p ++ ) {\n\n\t\t\tconst preexistingProgram = programs[ p ];\n\n\t\t\tif ( preexistingProgram.cacheKey === cacheKey ) {\n\n\t\t\t\tprogram = preexistingProgram;\n\t\t\t\t++ program.usedTimes;\n\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( program === undefined ) {\n\n\t\t\tprogram = new WebGLProgram( renderer, cacheKey, parameters, bindingStates );\n\t\t\tprograms.push( program );\n\n\t\t}\n\n\t\treturn program;\n\n\t}\n\n\tfunction releaseProgram( program ) {\n\n\t\tif ( -- program.usedTimes === 0 ) {\n\n\t\t\t// Remove from unordered set\n\t\t\tconst i = programs.indexOf( program );\n\t\t\tprograms[ i ] = programs[ programs.length - 1 ];\n\t\t\tprograms.pop();\n\n\t\t\t// Free WebGL resources\n\t\t\tprogram.destroy();\n\n\t\t}\n\n\t}\n\n\tfunction releaseShaderCache( material ) {\n\n\t\t_customShaders.remove( material );\n\n\t}\n\n\tfunction dispose() {\n\n\t\t_customShaders.dispose();\n\n\t}\n\n\treturn {\n\t\tgetParameters: getParameters,\n\t\tgetProgramCacheKey: getProgramCacheKey,\n\t\tgetUniforms: getUniforms,\n\t\tacquireProgram: acquireProgram,\n\t\treleaseProgram: releaseProgram,\n\t\treleaseShaderCache: releaseShaderCache,\n\t\t// Exposed for resource monitoring & error feedback via renderer.info:\n\t\tprograms: programs,\n\t\tdispose: dispose\n\t};\n\n}\n\nfunction WebGLProperties() {\n\n\tlet properties = new WeakMap();\n\n\tfunction get( object ) {\n\n\t\tlet map = properties.get( object );\n\n\t\tif ( map === undefined ) {\n\n\t\t\tmap = {};\n\t\t\tproperties.set( object, map );\n\n\t\t}\n\n\t\treturn map;\n\n\t}\n\n\tfunction remove( object ) {\n\n\t\tproperties.delete( object );\n\n\t}\n\n\tfunction update( object, key, value ) {\n\n\t\tproperties.get( object )[ key ] = value;\n\n\t}\n\n\tfunction dispose() {\n\n\t\tproperties = new WeakMap();\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tremove: remove,\n\t\tupdate: update,\n\t\tdispose: dispose\n\t};\n\n}\n\nfunction painterSortStable( a, b ) {\n\n\tif ( a.groupOrder !== b.groupOrder ) {\n\n\t\treturn a.groupOrder - b.groupOrder;\n\n\t} else if ( a.renderOrder !== b.renderOrder ) {\n\n\t\treturn a.renderOrder - b.renderOrder;\n\n\t} else if ( a.material.id !== b.material.id ) {\n\n\t\treturn a.material.id - b.material.id;\n\n\t} else if ( a.z !== b.z ) {\n\n\t\treturn a.z - b.z;\n\n\t} else {\n\n\t\treturn a.id - b.id;\n\n\t}\n\n}\n\nfunction reversePainterSortStable( a, b ) {\n\n\tif ( a.groupOrder !== b.groupOrder ) {\n\n\t\treturn a.groupOrder - b.groupOrder;\n\n\t} else if ( a.renderOrder !== b.renderOrder ) {\n\n\t\treturn a.renderOrder - b.renderOrder;\n\n\t} else if ( a.z !== b.z ) {\n\n\t\treturn b.z - a.z;\n\n\t} else {\n\n\t\treturn a.id - b.id;\n\n\t}\n\n}\n\n\nfunction WebGLRenderList() {\n\n\tconst renderItems = [];\n\tlet renderItemsIndex = 0;\n\n\tconst opaque = [];\n\tconst transmissive = [];\n\tconst transparent = [];\n\n\tfunction init() {\n\n\t\trenderItemsIndex = 0;\n\n\t\topaque.length = 0;\n\t\ttransmissive.length = 0;\n\t\ttransparent.length = 0;\n\n\t}\n\n\tfunction getNextRenderItem( object, geometry, material, groupOrder, z, group ) {\n\n\t\tlet renderItem = renderItems[ renderItemsIndex ];\n\n\t\tif ( renderItem === undefined ) {\n\n\t\t\trenderItem = {\n\t\t\t\tid: object.id,\n\t\t\t\tobject: object,\n\t\t\t\tgeometry: geometry,\n\t\t\t\tmaterial: material,\n\t\t\t\tgroupOrder: groupOrder,\n\t\t\t\trenderOrder: object.renderOrder,\n\t\t\t\tz: z,\n\t\t\t\tgroup: group\n\t\t\t};\n\n\t\t\trenderItems[ renderItemsIndex ] = renderItem;\n\n\t\t} else {\n\n\t\t\trenderItem.id = object.id;\n\t\t\trenderItem.object = object;\n\t\t\trenderItem.geometry = geometry;\n\t\t\trenderItem.material = material;\n\t\t\trenderItem.groupOrder = groupOrder;\n\t\t\trenderItem.renderOrder = object.renderOrder;\n\t\t\trenderItem.z = z;\n\t\t\trenderItem.group = group;\n\n\t\t}\n\n\t\trenderItemsIndex ++;\n\n\t\treturn renderItem;\n\n\t}\n\n\tfunction push( object, geometry, material, groupOrder, z, group ) {\n\n\t\tconst renderItem = getNextRenderItem( object, geometry, material, groupOrder, z, group );\n\n\t\tif ( material.transmission > 0.0 ) {\n\n\t\t\ttransmissive.push( renderItem );\n\n\t\t} else if ( material.transparent === true ) {\n\n\t\t\ttransparent.push( renderItem );\n\n\t\t} else {\n\n\t\t\topaque.push( renderItem );\n\n\t\t}\n\n\t}\n\n\tfunction unshift( object, geometry, material, groupOrder, z, group ) {\n\n\t\tconst renderItem = getNextRenderItem( object, geometry, material, groupOrder, z, group );\n\n\t\tif ( material.transmission > 0.0 ) {\n\n\t\t\ttransmissive.unshift( renderItem );\n\n\t\t} else if ( material.transparent === true ) {\n\n\t\t\ttransparent.unshift( renderItem );\n\n\t\t} else {\n\n\t\t\topaque.unshift( renderItem );\n\n\t\t}\n\n\t}\n\n\tfunction sort( customOpaqueSort, customTransparentSort ) {\n\n\t\tif ( opaque.length > 1 ) opaque.sort( customOpaqueSort || painterSortStable );\n\t\tif ( transmissive.length > 1 ) transmissive.sort( customTransparentSort || reversePainterSortStable );\n\t\tif ( transparent.length > 1 ) transparent.sort( customTransparentSort || reversePainterSortStable );\n\n\t}\n\n\tfunction finish() {\n\n\t\t// Clear references from inactive renderItems in the list\n\n\t\tfor ( let i = renderItemsIndex, il = renderItems.length; i < il; i ++ ) {\n\n\t\t\tconst renderItem = renderItems[ i ];\n\n\t\t\tif ( renderItem.id === null ) break;\n\n\t\t\trenderItem.id = null;\n\t\t\trenderItem.object = null;\n\t\t\trenderItem.geometry = null;\n\t\t\trenderItem.material = null;\n\t\t\trenderItem.group = null;\n\n\t\t}\n\n\t}\n\n\treturn {\n\n\t\topaque: opaque,\n\t\ttransmissive: transmissive,\n\t\ttransparent: transparent,\n\n\t\tinit: init,\n\t\tpush: push,\n\t\tunshift: unshift,\n\t\tfinish: finish,\n\n\t\tsort: sort\n\t};\n\n}\n\nfunction WebGLRenderLists() {\n\n\tlet lists = new WeakMap();\n\n\tfunction get( scene, renderCallDepth ) {\n\n\t\tlet list;\n\n\t\tif ( lists.has( scene ) === false ) {\n\n\t\t\tlist = new WebGLRenderList();\n\t\t\tlists.set( scene, [ list ] );\n\n\t\t} else {\n\n\t\t\tif ( renderCallDepth >= lists.get( scene ).length ) {\n\n\t\t\t\tlist = new WebGLRenderList();\n\t\t\t\tlists.get( scene ).push( list );\n\n\t\t\t} else {\n\n\t\t\t\tlist = lists.get( scene )[ renderCallDepth ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn list;\n\n\t}\n\n\tfunction dispose() {\n\n\t\tlists = new WeakMap();\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\nfunction UniformsCache() {\n\n\tconst lights = {};\n\n\treturn {\n\n\t\tget: function ( light ) {\n\n\t\t\tif ( lights[ light.id ] !== undefined ) {\n\n\t\t\t\treturn lights[ light.id ];\n\n\t\t\t}\n\n\t\t\tlet uniforms;\n\n\t\t\tswitch ( light.type ) {\n\n\t\t\t\tcase 'DirectionalLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\tcolor: new Color()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'SpotLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\tdistance: 0,\n\t\t\t\t\t\tconeCos: 0,\n\t\t\t\t\t\tpenumbraCos: 0,\n\t\t\t\t\t\tdecay: 0\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'PointLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\tdistance: 0,\n\t\t\t\t\t\tdecay: 0\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'HemisphereLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\tskyColor: new Color(),\n\t\t\t\t\t\tgroundColor: new Color()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'RectAreaLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\thalfWidth: new Vector3(),\n\t\t\t\t\t\thalfHeight: new Vector3()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tlights[ light.id ] = uniforms;\n\n\t\t\treturn uniforms;\n\n\t\t}\n\n\t};\n\n}\n\nfunction ShadowUniformsCache() {\n\n\tconst lights = {};\n\n\treturn {\n\n\t\tget: function ( light ) {\n\n\t\t\tif ( lights[ light.id ] !== undefined ) {\n\n\t\t\t\treturn lights[ light.id ];\n\n\t\t\t}\n\n\t\t\tlet uniforms;\n\n\t\t\tswitch ( light.type ) {\n\n\t\t\t\tcase 'DirectionalLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\tshadowNormalBias: 0,\n\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'SpotLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\tshadowNormalBias: 0,\n\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'PointLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\tshadowNormalBias: 0,\n\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\tshadowMapSize: new Vector2(),\n\t\t\t\t\t\tshadowCameraNear: 1,\n\t\t\t\t\t\tshadowCameraFar: 1000\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\t// TODO (abelnation): set RectAreaLight shadow uniforms\n\n\t\t\t}\n\n\t\t\tlights[ light.id ] = uniforms;\n\n\t\t\treturn uniforms;\n\n\t\t}\n\n\t};\n\n}\n\n\n\nlet nextVersion = 0;\n\nfunction shadowCastingLightsFirst( lightA, lightB ) {\n\n\treturn ( lightB.castShadow ? 1 : 0 ) - ( lightA.castShadow ? 1 : 0 );\n\n}\n\nfunction WebGLLights( extensions, capabilities ) {\n\n\tconst cache = new UniformsCache();\n\n\tconst shadowCache = ShadowUniformsCache();\n\n\tconst state = {\n\n\t\tversion: 0,\n\n\t\thash: {\n\t\t\tdirectionalLength: - 1,\n\t\t\tpointLength: - 1,\n\t\t\tspotLength: - 1,\n\t\t\trectAreaLength: - 1,\n\t\t\themiLength: - 1,\n\n\t\t\tnumDirectionalShadows: - 1,\n\t\t\tnumPointShadows: - 1,\n\t\t\tnumSpotShadows: - 1\n\t\t},\n\n\t\tambient: [ 0, 0, 0 ],\n\t\tprobe: [],\n\t\tdirectional: [],\n\t\tdirectionalShadow: [],\n\t\tdirectionalShadowMap: [],\n\t\tdirectionalShadowMatrix: [],\n\t\tspot: [],\n\t\tspotShadow: [],\n\t\tspotShadowMap: [],\n\t\tspotShadowMatrix: [],\n\t\trectArea: [],\n\t\trectAreaLTC1: null,\n\t\trectAreaLTC2: null,\n\t\tpoint: [],\n\t\tpointShadow: [],\n\t\tpointShadowMap: [],\n\t\tpointShadowMatrix: [],\n\t\themi: []\n\n\t};\n\n\tfor ( let i = 0; i < 9; i ++ ) state.probe.push( new Vector3() );\n\n\tconst vector3 = new Vector3();\n\tconst matrix4 = new Matrix4();\n\tconst matrix42 = new Matrix4();\n\n\tfunction setup( lights, physicallyCorrectLights ) {\n\n\t\tlet r = 0, g = 0, b = 0;\n\n\t\tfor ( let i = 0; i < 9; i ++ ) state.probe[ i ].set( 0, 0, 0 );\n\n\t\tlet directionalLength = 0;\n\t\tlet pointLength = 0;\n\t\tlet spotLength = 0;\n\t\tlet rectAreaLength = 0;\n\t\tlet hemiLength = 0;\n\n\t\tlet numDirectionalShadows = 0;\n\t\tlet numPointShadows = 0;\n\t\tlet numSpotShadows = 0;\n\n\t\tlights.sort( shadowCastingLightsFirst );\n\n\t\t// artist-friendly light intensity scaling factor\n\t\tconst scaleFactor = ( physicallyCorrectLights !== true ) ? Math.PI : 1;\n\n\t\tfor ( let i = 0, l = lights.length; i < l; i ++ ) {\n\n\t\t\tconst light = lights[ i ];\n\n\t\t\tconst color = light.color;\n\t\t\tconst intensity = light.intensity;\n\t\t\tconst distance = light.distance;\n\n\t\t\tconst shadowMap = ( light.shadow && light.shadow.map ) ? light.shadow.map.texture : null;\n\n\t\t\tif ( light.isAmbientLight ) {\n\n\t\t\t\tr += color.r * intensity * scaleFactor;\n\t\t\t\tg += color.g * intensity * scaleFactor;\n\t\t\t\tb += color.b * intensity * scaleFactor;\n\n\t\t\t} else if ( light.isLightProbe ) {\n\n\t\t\t\tfor ( let j = 0; j < 9; j ++ ) {\n\n\t\t\t\t\tstate.probe[ j ].addScaledVector( light.sh.coefficients[ j ], intensity );\n\n\t\t\t\t}\n\n\t\t\t} else if ( light.isDirectionalLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.color.copy( light.color ).multiplyScalar( light.intensity * scaleFactor );\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\tconst shadow = light.shadow;\n\n\t\t\t\t\tconst shadowUniforms = shadowCache.get( light );\n\n\t\t\t\t\tshadowUniforms.shadowBias = shadow.bias;\n\t\t\t\t\tshadowUniforms.shadowNormalBias = shadow.normalBias;\n\t\t\t\t\tshadowUniforms.shadowRadius = shadow.radius;\n\t\t\t\t\tshadowUniforms.shadowMapSize = shadow.mapSize;\n\n\t\t\t\t\tstate.directionalShadow[ directionalLength ] = shadowUniforms;\n\t\t\t\t\tstate.directionalShadowMap[ directionalLength ] = shadowMap;\n\t\t\t\t\tstate.directionalShadowMatrix[ directionalLength ] = light.shadow.matrix;\n\n\t\t\t\t\tnumDirectionalShadows ++;\n\n\t\t\t\t}\n\n\t\t\t\tstate.directional[ directionalLength ] = uniforms;\n\n\t\t\t\tdirectionalLength ++;\n\n\t\t\t} else if ( light.isSpotLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\n\t\t\t\tuniforms.color.copy( color ).multiplyScalar( intensity * scaleFactor );\n\t\t\t\tuniforms.distance = distance;\n\n\t\t\t\tuniforms.coneCos = Math.cos( light.angle );\n\t\t\t\tuniforms.penumbraCos = Math.cos( light.angle * ( 1 - light.penumbra ) );\n\t\t\t\tuniforms.decay = light.decay;\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\tconst shadow = light.shadow;\n\n\t\t\t\t\tconst shadowUniforms = shadowCache.get( light );\n\n\t\t\t\t\tshadowUniforms.shadowBias = shadow.bias;\n\t\t\t\t\tshadowUniforms.shadowNormalBias = shadow.normalBias;\n\t\t\t\t\tshadowUniforms.shadowRadius = shadow.radius;\n\t\t\t\t\tshadowUniforms.shadowMapSize = shadow.mapSize;\n\n\t\t\t\t\tstate.spotShadow[ spotLength ] = shadowUniforms;\n\t\t\t\t\tstate.spotShadowMap[ spotLength ] = shadowMap;\n\t\t\t\t\tstate.spotShadowMatrix[ spotLength ] = light.shadow.matrix;\n\n\t\t\t\t\tnumSpotShadows ++;\n\n\t\t\t\t}\n\n\t\t\t\tstate.spot[ spotLength ] = uniforms;\n\n\t\t\t\tspotLength ++;\n\n\t\t\t} else if ( light.isRectAreaLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\t// (a) intensity is the total visible light emitted\n\t\t\t\t//uniforms.color.copy( color ).multiplyScalar( intensity / ( light.width * light.height * Math.PI ) );\n\n\t\t\t\t// (b) intensity is the brightness of the light\n\t\t\t\tuniforms.color.copy( color ).multiplyScalar( intensity );\n\n\t\t\t\tuniforms.halfWidth.set( light.width * 0.5, 0.0, 0.0 );\n\t\t\t\tuniforms.halfHeight.set( 0.0, light.height * 0.5, 0.0 );\n\n\t\t\t\tstate.rectArea[ rectAreaLength ] = uniforms;\n\n\t\t\t\trectAreaLength ++;\n\n\t\t\t} else if ( light.isPointLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.color.copy( light.color ).multiplyScalar( light.intensity * scaleFactor );\n\t\t\t\tuniforms.distance = light.distance;\n\t\t\t\tuniforms.decay = light.decay;\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\tconst shadow = light.shadow;\n\n\t\t\t\t\tconst shadowUniforms = shadowCache.get( light );\n\n\t\t\t\t\tshadowUniforms.shadowBias = shadow.bias;\n\t\t\t\t\tshadowUniforms.shadowNormalBias = shadow.normalBias;\n\t\t\t\t\tshadowUniforms.shadowRadius = shadow.radius;\n\t\t\t\t\tshadowUniforms.shadowMapSize = shadow.mapSize;\n\t\t\t\t\tshadowUniforms.shadowCameraNear = shadow.camera.near;\n\t\t\t\t\tshadowUniforms.shadowCameraFar = shadow.camera.far;\n\n\t\t\t\t\tstate.pointShadow[ pointLength ] = shadowUniforms;\n\t\t\t\t\tstate.pointShadowMap[ pointLength ] = shadowMap;\n\t\t\t\t\tstate.pointShadowMatrix[ pointLength ] = light.shadow.matrix;\n\n\t\t\t\t\tnumPointShadows ++;\n\n\t\t\t\t}\n\n\t\t\t\tstate.point[ pointLength ] = uniforms;\n\n\t\t\t\tpointLength ++;\n\n\t\t\t} else if ( light.isHemisphereLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.skyColor.copy( light.color ).multiplyScalar( intensity * scaleFactor );\n\t\t\t\tuniforms.groundColor.copy( light.groundColor ).multiplyScalar( intensity * scaleFactor );\n\n\t\t\t\tstate.hemi[ hemiLength ] = uniforms;\n\n\t\t\t\themiLength ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( rectAreaLength > 0 ) {\n\n\t\t\tif ( capabilities.isWebGL2 ) {\n\n\t\t\t\t// WebGL 2\n\n\t\t\t\tstate.rectAreaLTC1 = UniformsLib.LTC_FLOAT_1;\n\t\t\t\tstate.rectAreaLTC2 = UniformsLib.LTC_FLOAT_2;\n\n\t\t\t} else {\n\n\t\t\t\t// WebGL 1\n\n\t\t\t\tif ( extensions.has( 'OES_texture_float_linear' ) === true ) {\n\n\t\t\t\t\tstate.rectAreaLTC1 = UniformsLib.LTC_FLOAT_1;\n\t\t\t\t\tstate.rectAreaLTC2 = UniformsLib.LTC_FLOAT_2;\n\n\t\t\t\t} else if ( extensions.has( 'OES_texture_half_float_linear' ) === true ) {\n\n\t\t\t\t\tstate.rectAreaLTC1 = UniformsLib.LTC_HALF_1;\n\t\t\t\t\tstate.rectAreaLTC2 = UniformsLib.LTC_HALF_2;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer: Unable to use RectAreaLight. Missing WebGL extensions.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.ambient[ 0 ] = r;\n\t\tstate.ambient[ 1 ] = g;\n\t\tstate.ambient[ 2 ] = b;\n\n\t\tconst hash = state.hash;\n\n\t\tif ( hash.directionalLength !== directionalLength ||\n\t\t\thash.pointLength !== pointLength ||\n\t\t\thash.spotLength !== spotLength ||\n\t\t\thash.rectAreaLength !== rectAreaLength ||\n\t\t\thash.hemiLength !== hemiLength ||\n\t\t\thash.numDirectionalShadows !== numDirectionalShadows ||\n\t\t\thash.numPointShadows !== numPointShadows ||\n\t\t\thash.numSpotShadows !== numSpotShadows ) {\n\n\t\t\tstate.directional.length = directionalLength;\n\t\t\tstate.spot.length = spotLength;\n\t\t\tstate.rectArea.length = rectAreaLength;\n\t\t\tstate.point.length = pointLength;\n\t\t\tstate.hemi.length = hemiLength;\n\n\t\t\tstate.directionalShadow.length = numDirectionalShadows;\n\t\t\tstate.directionalShadowMap.length = numDirectionalShadows;\n\t\t\tstate.pointShadow.length = numPointShadows;\n\t\t\tstate.pointShadowMap.length = numPointShadows;\n\t\t\tstate.spotShadow.length = numSpotShadows;\n\t\t\tstate.spotShadowMap.length = numSpotShadows;\n\t\t\tstate.directionalShadowMatrix.length = numDirectionalShadows;\n\t\t\tstate.pointShadowMatrix.length = numPointShadows;\n\t\t\tstate.spotShadowMatrix.length = numSpotShadows;\n\n\t\t\thash.directionalLength = directionalLength;\n\t\t\thash.pointLength = pointLength;\n\t\t\thash.spotLength = spotLength;\n\t\t\thash.rectAreaLength = rectAreaLength;\n\t\t\thash.hemiLength = hemiLength;\n\n\t\t\thash.numDirectionalShadows = numDirectionalShadows;\n\t\t\thash.numPointShadows = numPointShadows;\n\t\t\thash.numSpotShadows = numSpotShadows;\n\n\t\t\tstate.version = nextVersion ++;\n\n\t\t}\n\n\t}\n\n\tfunction setupView( lights, camera ) {\n\n\t\tlet directionalLength = 0;\n\t\tlet pointLength = 0;\n\t\tlet spotLength = 0;\n\t\tlet rectAreaLength = 0;\n\t\tlet hemiLength = 0;\n\n\t\tconst viewMatrix = camera.matrixWorldInverse;\n\n\t\tfor ( let i = 0, l = lights.length; i < l; i ++ ) {\n\n\t\t\tconst light = lights[ i ];\n\n\t\t\tif ( light.isDirectionalLight ) {\n\n\t\t\t\tconst uniforms = state.directional[ directionalLength ];\n\n\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tvector3.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\tuniforms.direction.sub( vector3 );\n\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\tdirectionalLength ++;\n\n\t\t\t} else if ( light.isSpotLight ) {\n\n\t\t\t\tconst uniforms = state.spot[ spotLength ];\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tvector3.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\tuniforms.direction.sub( vector3 );\n\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\tspotLength ++;\n\n\t\t\t} else if ( light.isRectAreaLight ) {\n\n\t\t\t\tconst uniforms = state.rectArea[ rectAreaLength ];\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\t// extract local rotation of light to derive width/height half vectors\n\t\t\t\tmatrix42.identity();\n\t\t\t\tmatrix4.copy( light.matrixWorld );\n\t\t\t\tmatrix4.premultiply( viewMatrix );\n\t\t\t\tmatrix42.extractRotation( matrix4 );\n\n\t\t\t\tuniforms.halfWidth.set( light.width * 0.5, 0.0, 0.0 );\n\t\t\t\tuniforms.halfHeight.set( 0.0, light.height * 0.5, 0.0 );\n\n\t\t\t\tuniforms.halfWidth.applyMatrix4( matrix42 );\n\t\t\t\tuniforms.halfHeight.applyMatrix4( matrix42 );\n\n\t\t\t\trectAreaLength ++;\n\n\t\t\t} else if ( light.isPointLight ) {\n\n\t\t\t\tconst uniforms = state.point[ pointLength ];\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\tpointLength ++;\n\n\t\t\t} else if ( light.isHemisphereLight ) {\n\n\t\t\t\tconst uniforms = state.hemi[ hemiLength ];\n\n\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\themiLength ++;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn {\n\t\tsetup: setup,\n\t\tsetupView: setupView,\n\t\tstate: state\n\t};\n\n}\n\nfunction WebGLRenderState( extensions, capabilities ) {\n\n\tconst lights = new WebGLLights( extensions, capabilities );\n\n\tconst lightsArray = [];\n\tconst shadowsArray = [];\n\n\tfunction init() {\n\n\t\tlightsArray.length = 0;\n\t\tshadowsArray.length = 0;\n\n\t}\n\n\tfunction pushLight( light ) {\n\n\t\tlightsArray.push( light );\n\n\t}\n\n\tfunction pushShadow( shadowLight ) {\n\n\t\tshadowsArray.push( shadowLight );\n\n\t}\n\n\tfunction setupLights( physicallyCorrectLights ) {\n\n\t\tlights.setup( lightsArray, physicallyCorrectLights );\n\n\t}\n\n\tfunction setupLightsView( camera ) {\n\n\t\tlights.setupView( lightsArray, camera );\n\n\t}\n\n\tconst state = {\n\t\tlightsArray: lightsArray,\n\t\tshadowsArray: shadowsArray,\n\n\t\tlights: lights\n\t};\n\n\treturn {\n\t\tinit: init,\n\t\tstate: state,\n\t\tsetupLights: setupLights,\n\t\tsetupLightsView: setupLightsView,\n\n\t\tpushLight: pushLight,\n\t\tpushShadow: pushShadow\n\t};\n\n}\n\nfunction WebGLRenderStates( extensions, capabilities ) {\n\n\tlet renderStates = new WeakMap();\n\n\tfunction get( scene, renderCallDepth = 0 ) {\n\n\t\tlet renderState;\n\n\t\tif ( renderStates.has( scene ) === false ) {\n\n\t\t\trenderState = new WebGLRenderState( extensions, capabilities );\n\t\t\trenderStates.set( scene, [ renderState ] );\n\n\t\t} else {\n\n\t\t\tif ( renderCallDepth >= renderStates.get( scene ).length ) {\n\n\t\t\t\trenderState = new WebGLRenderState( extensions, capabilities );\n\t\t\t\trenderStates.get( scene ).push( renderState );\n\n\t\t\t} else {\n\n\t\t\t\trenderState = renderStates.get( scene )[ renderCallDepth ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn renderState;\n\n\t}\n\n\tfunction dispose() {\n\n\t\trenderStates = new WeakMap();\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\nclass MeshDepthMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isMeshDepthMaterial = true;\n\n\t\tthis.type = 'MeshDepthMaterial';\n\n\t\tthis.depthPacking = BasicDepthPacking;\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.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.depthPacking = source.depthPacking;\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}\n\nclass MeshDistanceMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isMeshDistanceMaterial = true;\n\n\t\tthis.type = 'MeshDistanceMaterial';\n\n\t\tthis.referencePosition = new Vector3();\n\t\tthis.nearDistance = 1;\n\t\tthis.farDistance = 1000;\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.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.referencePosition.copy( source.referencePosition );\n\t\tthis.nearDistance = source.nearDistance;\n\t\tthis.farDistance = source.farDistance;\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\treturn this;\n\n\t}\n\n}\n\nconst vertex = \"void main() {\\n\\tgl_Position = vec4( position, 1.0 );\\n}\";\n\nconst fragment = \"uniform sampler2D shadow_pass;\\nuniform vec2 resolution;\\nuniform float radius;\\n#include \\nvoid main() {\\n\\tconst float samples = float( VSM_SAMPLES );\\n\\tfloat mean = 0.0;\\n\\tfloat squared_mean = 0.0;\\n\\tfloat uvStride = samples <= 1.0 ? 0.0 : 2.0 / ( samples - 1.0 );\\n\\tfloat uvStart = samples <= 1.0 ? 0.0 : - 1.0;\\n\\tfor ( float i = 0.0; i < samples; i ++ ) {\\n\\t\\tfloat uvOffset = uvStart + i * uvStride;\\n\\t\\t#ifdef HORIZONTAL_PASS\\n\\t\\t\\tvec2 distribution = unpackRGBATo2Half( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( uvOffset, 0.0 ) * radius ) / resolution ) );\\n\\t\\t\\tmean += distribution.x;\\n\\t\\t\\tsquared_mean += distribution.y * distribution.y + distribution.x * distribution.x;\\n\\t\\t#else\\n\\t\\t\\tfloat depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, uvOffset ) * radius ) / resolution ) );\\n\\t\\t\\tmean += depth;\\n\\t\\t\\tsquared_mean += depth * depth;\\n\\t\\t#endif\\n\\t}\\n\\tmean = mean / samples;\\n\\tsquared_mean = squared_mean / samples;\\n\\tfloat std_dev = sqrt( squared_mean - mean * mean );\\n\\tgl_FragColor = pack2HalfToRGBA( vec2( mean, std_dev ) );\\n}\";\n\nfunction WebGLShadowMap( _renderer, _objects, _capabilities ) {\n\n\tlet _frustum = new Frustum();\n\n\tconst _shadowMapSize = new Vector2(),\n\t\t_viewportSize = new Vector2(),\n\n\t\t_viewport = new Vector4(),\n\n\t\t_depthMaterial = new MeshDepthMaterial( { depthPacking: RGBADepthPacking } ),\n\t\t_distanceMaterial = new MeshDistanceMaterial(),\n\n\t\t_materialCache = {},\n\n\t\t_maxTextureSize = _capabilities.maxTextureSize;\n\n\tconst shadowSide = { 0: BackSide, 1: FrontSide, 2: DoubleSide };\n\n\tconst shadowMaterialVertical = new ShaderMaterial( {\n\t\tdefines: {\n\t\t\tVSM_SAMPLES: 8\n\t\t},\n\t\tuniforms: {\n\t\t\tshadow_pass: { value: null },\n\t\t\tresolution: { value: new Vector2() },\n\t\t\tradius: { value: 4.0 }\n\t\t},\n\n\t\tvertexShader: vertex,\n\t\tfragmentShader: fragment\n\n\t} );\n\n\tconst shadowMaterialHorizontal = shadowMaterialVertical.clone();\n\tshadowMaterialHorizontal.defines.HORIZONTAL_PASS = 1;\n\n\tconst fullScreenTri = new BufferGeometry();\n\tfullScreenTri.setAttribute(\n\t\t'position',\n\t\tnew BufferAttribute(\n\t\t\tnew Float32Array( [ - 1, - 1, 0.5, 3, - 1, 0.5, - 1, 3, 0.5 ] ),\n\t\t\t3\n\t\t)\n\t);\n\n\tconst fullScreenMesh = new Mesh( fullScreenTri, shadowMaterialVertical );\n\n\tconst scope = this;\n\n\tthis.enabled = false;\n\n\tthis.autoUpdate = true;\n\tthis.needsUpdate = false;\n\n\tthis.type = PCFShadowMap;\n\n\tthis.render = function ( lights, scene, camera ) {\n\n\t\tif ( scope.enabled === false ) return;\n\t\tif ( scope.autoUpdate === false && scope.needsUpdate === false ) return;\n\n\t\tif ( lights.length === 0 ) return;\n\n\t\tconst currentRenderTarget = _renderer.getRenderTarget();\n\t\tconst activeCubeFace = _renderer.getActiveCubeFace();\n\t\tconst activeMipmapLevel = _renderer.getActiveMipmapLevel();\n\n\t\tconst _state = _renderer.state;\n\n\t\t// Set GL state for depth map.\n\t\t_state.setBlending( NoBlending );\n\t\t_state.buffers.color.setClear( 1, 1, 1, 1 );\n\t\t_state.buffers.depth.setTest( true );\n\t\t_state.setScissorTest( false );\n\n\t\t// render depth map\n\n\t\tfor ( let i = 0, il = lights.length; i < il; i ++ ) {\n\n\t\t\tconst light = lights[ i ];\n\t\t\tconst shadow = light.shadow;\n\n\t\t\tif ( shadow === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLShadowMap:', light, 'has no shadow.' );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tif ( shadow.autoUpdate === false && shadow.needsUpdate === false ) continue;\n\n\t\t\t_shadowMapSize.copy( shadow.mapSize );\n\n\t\t\tconst shadowFrameExtents = shadow.getFrameExtents();\n\n\t\t\t_shadowMapSize.multiply( shadowFrameExtents );\n\n\t\t\t_viewportSize.copy( shadow.mapSize );\n\n\t\t\tif ( _shadowMapSize.x > _maxTextureSize || _shadowMapSize.y > _maxTextureSize ) {\n\n\t\t\t\tif ( _shadowMapSize.x > _maxTextureSize ) {\n\n\t\t\t\t\t_viewportSize.x = Math.floor( _maxTextureSize / shadowFrameExtents.x );\n\t\t\t\t\t_shadowMapSize.x = _viewportSize.x * shadowFrameExtents.x;\n\t\t\t\t\tshadow.mapSize.x = _viewportSize.x;\n\n\t\t\t\t}\n\n\t\t\t\tif ( _shadowMapSize.y > _maxTextureSize ) {\n\n\t\t\t\t\t_viewportSize.y = Math.floor( _maxTextureSize / shadowFrameExtents.y );\n\t\t\t\t\t_shadowMapSize.y = _viewportSize.y * shadowFrameExtents.y;\n\t\t\t\t\tshadow.mapSize.y = _viewportSize.y;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( shadow.map === null ) {\n\n\t\t\t\tconst pars = ( this.type !== VSMShadowMap ) ? { minFilter: NearestFilter, magFilter: NearestFilter } : {};\n\n\t\t\t\tshadow.map = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y, pars );\n\t\t\t\tshadow.map.texture.name = light.name + '.shadowMap';\n\n\t\t\t\tshadow.camera.updateProjectionMatrix();\n\n\t\t\t}\n\n\t\t\t_renderer.setRenderTarget( shadow.map );\n\t\t\t_renderer.clear();\n\n\t\t\tconst viewportCount = shadow.getViewportCount();\n\n\t\t\tfor ( let vp = 0; vp < viewportCount; vp ++ ) {\n\n\t\t\t\tconst viewport = shadow.getViewport( vp );\n\n\t\t\t\t_viewport.set(\n\t\t\t\t\t_viewportSize.x * viewport.x,\n\t\t\t\t\t_viewportSize.y * viewport.y,\n\t\t\t\t\t_viewportSize.x * viewport.z,\n\t\t\t\t\t_viewportSize.y * viewport.w\n\t\t\t\t);\n\n\t\t\t\t_state.viewport( _viewport );\n\n\t\t\t\tshadow.updateMatrices( light, vp );\n\n\t\t\t\t_frustum = shadow.getFrustum();\n\n\t\t\t\trenderObject( scene, camera, shadow.camera, light, this.type );\n\n\t\t\t}\n\n\t\t\t// do blur pass for VSM\n\n\t\t\tif ( shadow.isPointLightShadow !== true && this.type === VSMShadowMap ) {\n\n\t\t\t\tVSMPass( shadow, camera );\n\n\t\t\t}\n\n\t\t\tshadow.needsUpdate = false;\n\n\t\t}\n\n\t\tscope.needsUpdate = false;\n\n\t\t_renderer.setRenderTarget( currentRenderTarget, activeCubeFace, activeMipmapLevel );\n\n\t};\n\n\tfunction VSMPass( shadow, camera ) {\n\n\t\tconst geometry = _objects.update( fullScreenMesh );\n\n\t\tif ( shadowMaterialVertical.defines.VSM_SAMPLES !== shadow.blurSamples ) {\n\n\t\t\tshadowMaterialVertical.defines.VSM_SAMPLES = shadow.blurSamples;\n\t\t\tshadowMaterialHorizontal.defines.VSM_SAMPLES = shadow.blurSamples;\n\n\t\t\tshadowMaterialVertical.needsUpdate = true;\n\t\t\tshadowMaterialHorizontal.needsUpdate = true;\n\n\t\t}\n\n\t\tif ( shadow.mapPass === null ) {\n\n\t\t\tshadow.mapPass = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y );\n\n\t\t}\n\n\t\t// vertical pass\n\n\t\tshadowMaterialVertical.uniforms.shadow_pass.value = shadow.map.texture;\n\t\tshadowMaterialVertical.uniforms.resolution.value = shadow.mapSize;\n\t\tshadowMaterialVertical.uniforms.radius.value = shadow.radius;\n\t\t_renderer.setRenderTarget( shadow.mapPass );\n\t\t_renderer.clear();\n\t\t_renderer.renderBufferDirect( camera, null, geometry, shadowMaterialVertical, fullScreenMesh, null );\n\n\t\t// horizontal pass\n\n\t\tshadowMaterialHorizontal.uniforms.shadow_pass.value = shadow.mapPass.texture;\n\t\tshadowMaterialHorizontal.uniforms.resolution.value = shadow.mapSize;\n\t\tshadowMaterialHorizontal.uniforms.radius.value = shadow.radius;\n\t\t_renderer.setRenderTarget( shadow.map );\n\t\t_renderer.clear();\n\t\t_renderer.renderBufferDirect( camera, null, geometry, shadowMaterialHorizontal, fullScreenMesh, null );\n\n\t}\n\n\tfunction getDepthMaterial( object, material, light, shadowCameraNear, shadowCameraFar, type ) {\n\n\t\tlet result = null;\n\n\t\tconst customMaterial = ( light.isPointLight === true ) ? object.customDistanceMaterial : object.customDepthMaterial;\n\n\t\tif ( customMaterial !== undefined ) {\n\n\t\t\tresult = customMaterial;\n\n\t\t} else {\n\n\t\t\tresult = ( light.isPointLight === true ) ? _distanceMaterial : _depthMaterial;\n\n\t\t}\n\n\t\tif ( ( _renderer.localClippingEnabled && material.clipShadows === true && Array.isArray( material.clippingPlanes ) && material.clippingPlanes.length !== 0 ) ||\n\t\t\t( material.displacementMap && material.displacementScale !== 0 ) ||\n\t\t\t( material.alphaMap && material.alphaTest > 0 ) ) {\n\n\t\t\t// in this case we need a unique material instance reflecting the\n\t\t\t// appropriate state\n\n\t\t\tconst keyA = result.uuid, keyB = material.uuid;\n\n\t\t\tlet materialsForVariant = _materialCache[ keyA ];\n\n\t\t\tif ( materialsForVariant === undefined ) {\n\n\t\t\t\tmaterialsForVariant = {};\n\t\t\t\t_materialCache[ keyA ] = materialsForVariant;\n\n\t\t\t}\n\n\t\t\tlet cachedMaterial = materialsForVariant[ keyB ];\n\n\t\t\tif ( cachedMaterial === undefined ) {\n\n\t\t\t\tcachedMaterial = result.clone();\n\t\t\t\tmaterialsForVariant[ keyB ] = cachedMaterial;\n\n\t\t\t}\n\n\t\t\tresult = cachedMaterial;\n\n\t\t}\n\n\t\tresult.visible = material.visible;\n\t\tresult.wireframe = material.wireframe;\n\n\t\tif ( type === VSMShadowMap ) {\n\n\t\t\tresult.side = ( material.shadowSide !== null ) ? material.shadowSide : material.side;\n\n\t\t} else {\n\n\t\t\tresult.side = ( material.shadowSide !== null ) ? material.shadowSide : shadowSide[ material.side ];\n\n\t\t}\n\n\t\tresult.alphaMap = material.alphaMap;\n\t\tresult.alphaTest = material.alphaTest;\n\n\t\tresult.clipShadows = material.clipShadows;\n\t\tresult.clippingPlanes = material.clippingPlanes;\n\t\tresult.clipIntersection = material.clipIntersection;\n\n\t\tresult.displacementMap = material.displacementMap;\n\t\tresult.displacementScale = material.displacementScale;\n\t\tresult.displacementBias = material.displacementBias;\n\n\t\tresult.wireframeLinewidth = material.wireframeLinewidth;\n\t\tresult.linewidth = material.linewidth;\n\n\t\tif ( light.isPointLight === true && result.isMeshDistanceMaterial === true ) {\n\n\t\t\tresult.referencePosition.setFromMatrixPosition( light.matrixWorld );\n\t\t\tresult.nearDistance = shadowCameraNear;\n\t\t\tresult.farDistance = shadowCameraFar;\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\tfunction renderObject( object, camera, shadowCamera, light, type ) {\n\n\t\tif ( object.visible === false ) return;\n\n\t\tconst visible = object.layers.test( camera.layers );\n\n\t\tif ( visible && ( object.isMesh || object.isLine || object.isPoints ) ) {\n\n\t\t\tif ( ( object.castShadow || ( object.receiveShadow && type === VSMShadowMap ) ) && ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) ) {\n\n\t\t\t\tobject.modelViewMatrix.multiplyMatrices( shadowCamera.matrixWorldInverse, object.matrixWorld );\n\n\t\t\t\tconst geometry = _objects.update( object );\n\t\t\t\tconst material = object.material;\n\n\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\tconst groups = geometry.groups;\n\n\t\t\t\t\tfor ( let k = 0, kl = groups.length; k < kl; k ++ ) {\n\n\t\t\t\t\t\tconst group = groups[ k ];\n\t\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\t\tif ( groupMaterial && groupMaterial.visible ) {\n\n\t\t\t\t\t\t\tconst depthMaterial = getDepthMaterial( object, groupMaterial, light, shadowCamera.near, shadowCamera.far, type );\n\n\t\t\t\t\t\t\t_renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, group );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( material.visible ) {\n\n\t\t\t\t\tconst depthMaterial = getDepthMaterial( object, material, light, shadowCamera.near, shadowCamera.far, type );\n\n\t\t\t\t\t_renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, null );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst children = object.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\trenderObject( children[ i ], camera, shadowCamera, light, type );\n\n\t\t}\n\n\t}\n\n}\n\nfunction WebGLState( gl, extensions, capabilities ) {\n\n\tconst isWebGL2 = capabilities.isWebGL2;\n\n\tfunction ColorBuffer() {\n\n\t\tlet locked = false;\n\n\t\tconst color = new Vector4();\n\t\tlet currentColorMask = null;\n\t\tconst currentColorClear = new Vector4( 0, 0, 0, 0 );\n\n\t\treturn {\n\n\t\t\tsetMask: function ( colorMask ) {\n\n\t\t\t\tif ( currentColorMask !== colorMask && ! locked ) {\n\n\t\t\t\t\tgl.colorMask( colorMask, colorMask, colorMask, colorMask );\n\t\t\t\t\tcurrentColorMask = colorMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\tlocked = lock;\n\n\t\t\t},\n\n\t\t\tsetClear: function ( r, g, b, a, premultipliedAlpha ) {\n\n\t\t\t\tif ( premultipliedAlpha === true ) {\n\n\t\t\t\t\tr *= a; g *= a; b *= a;\n\n\t\t\t\t}\n\n\t\t\t\tcolor.set( r, g, b, a );\n\n\t\t\t\tif ( currentColorClear.equals( color ) === false ) {\n\n\t\t\t\t\tgl.clearColor( r, g, b, a );\n\t\t\t\t\tcurrentColorClear.copy( color );\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\treset: function () {\n\n\t\t\t\tlocked = false;\n\n\t\t\t\tcurrentColorMask = null;\n\t\t\t\tcurrentColorClear.set( - 1, 0, 0, 0 ); // set to invalid state\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\tfunction DepthBuffer() {\n\n\t\tlet locked = false;\n\n\t\tlet currentDepthMask = null;\n\t\tlet currentDepthFunc = null;\n\t\tlet currentDepthClear = null;\n\n\t\treturn {\n\n\t\t\tsetTest: function ( depthTest ) {\n\n\t\t\t\tif ( depthTest ) {\n\n\t\t\t\t\tenable( 2929 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tdisable( 2929 );\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetMask: function ( depthMask ) {\n\n\t\t\t\tif ( currentDepthMask !== depthMask && ! locked ) {\n\n\t\t\t\t\tgl.depthMask( depthMask );\n\t\t\t\t\tcurrentDepthMask = depthMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetFunc: function ( depthFunc ) {\n\n\t\t\t\tif ( currentDepthFunc !== depthFunc ) {\n\n\t\t\t\t\tif ( depthFunc ) {\n\n\t\t\t\t\t\tswitch ( depthFunc ) {\n\n\t\t\t\t\t\t\tcase NeverDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( 512 );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase AlwaysDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( 519 );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase LessDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( 513 );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase LessEqualDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( 515 );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase EqualDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( 514 );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase GreaterEqualDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( 518 );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase GreaterDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( 516 );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase NotEqualDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( 517 );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tdefault:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( 515 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.depthFunc( 515 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcurrentDepthFunc = depthFunc;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\tlocked = lock;\n\n\t\t\t},\n\n\t\t\tsetClear: function ( depth ) {\n\n\t\t\t\tif ( currentDepthClear !== depth ) {\n\n\t\t\t\t\tgl.clearDepth( depth );\n\t\t\t\t\tcurrentDepthClear = depth;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\treset: function () {\n\n\t\t\t\tlocked = false;\n\n\t\t\t\tcurrentDepthMask = null;\n\t\t\t\tcurrentDepthFunc = null;\n\t\t\t\tcurrentDepthClear = null;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\tfunction StencilBuffer() {\n\n\t\tlet locked = false;\n\n\t\tlet currentStencilMask = null;\n\t\tlet currentStencilFunc = null;\n\t\tlet currentStencilRef = null;\n\t\tlet currentStencilFuncMask = null;\n\t\tlet currentStencilFail = null;\n\t\tlet currentStencilZFail = null;\n\t\tlet currentStencilZPass = null;\n\t\tlet currentStencilClear = null;\n\n\t\treturn {\n\n\t\t\tsetTest: function ( stencilTest ) {\n\n\t\t\t\tif ( ! locked ) {\n\n\t\t\t\t\tif ( stencilTest ) {\n\n\t\t\t\t\t\tenable( 2960 );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tdisable( 2960 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetMask: function ( stencilMask ) {\n\n\t\t\t\tif ( currentStencilMask !== stencilMask && ! locked ) {\n\n\t\t\t\t\tgl.stencilMask( stencilMask );\n\t\t\t\t\tcurrentStencilMask = stencilMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetFunc: function ( stencilFunc, stencilRef, stencilMask ) {\n\n\t\t\t\tif ( currentStencilFunc !== stencilFunc ||\n\t\t\t\t currentStencilRef !== stencilRef ||\n\t\t\t\t currentStencilFuncMask !== stencilMask ) {\n\n\t\t\t\t\tgl.stencilFunc( stencilFunc, stencilRef, stencilMask );\n\n\t\t\t\t\tcurrentStencilFunc = stencilFunc;\n\t\t\t\t\tcurrentStencilRef = stencilRef;\n\t\t\t\t\tcurrentStencilFuncMask = stencilMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetOp: function ( stencilFail, stencilZFail, stencilZPass ) {\n\n\t\t\t\tif ( currentStencilFail !== stencilFail ||\n\t\t\t\t currentStencilZFail !== stencilZFail ||\n\t\t\t\t currentStencilZPass !== stencilZPass ) {\n\n\t\t\t\t\tgl.stencilOp( stencilFail, stencilZFail, stencilZPass );\n\n\t\t\t\t\tcurrentStencilFail = stencilFail;\n\t\t\t\t\tcurrentStencilZFail = stencilZFail;\n\t\t\t\t\tcurrentStencilZPass = stencilZPass;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\tlocked = lock;\n\n\t\t\t},\n\n\t\t\tsetClear: function ( stencil ) {\n\n\t\t\t\tif ( currentStencilClear !== stencil ) {\n\n\t\t\t\t\tgl.clearStencil( stencil );\n\t\t\t\t\tcurrentStencilClear = stencil;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\treset: function () {\n\n\t\t\t\tlocked = false;\n\n\t\t\t\tcurrentStencilMask = null;\n\t\t\t\tcurrentStencilFunc = null;\n\t\t\t\tcurrentStencilRef = null;\n\t\t\t\tcurrentStencilFuncMask = null;\n\t\t\t\tcurrentStencilFail = null;\n\t\t\t\tcurrentStencilZFail = null;\n\t\t\t\tcurrentStencilZPass = null;\n\t\t\t\tcurrentStencilClear = null;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t//\n\n\tconst colorBuffer = new ColorBuffer();\n\tconst depthBuffer = new DepthBuffer();\n\tconst stencilBuffer = new StencilBuffer();\n\n\tconst uboBindings = new WeakMap();\n\tconst uboProgamMap = new WeakMap();\n\n\tlet enabledCapabilities = {};\n\n\tlet currentBoundFramebuffers = {};\n\tlet currentDrawbuffers = new WeakMap();\n\tlet defaultDrawbuffers = [];\n\n\tlet currentProgram = null;\n\n\tlet currentBlendingEnabled = false;\n\tlet currentBlending = null;\n\tlet currentBlendEquation = null;\n\tlet currentBlendSrc = null;\n\tlet currentBlendDst = null;\n\tlet currentBlendEquationAlpha = null;\n\tlet currentBlendSrcAlpha = null;\n\tlet currentBlendDstAlpha = null;\n\tlet currentPremultipledAlpha = false;\n\n\tlet currentFlipSided = null;\n\tlet currentCullFace = null;\n\n\tlet currentLineWidth = null;\n\n\tlet currentPolygonOffsetFactor = null;\n\tlet currentPolygonOffsetUnits = null;\n\n\tconst maxTextures = gl.getParameter( 35661 );\n\n\tlet lineWidthAvailable = false;\n\tlet version = 0;\n\tconst glVersion = gl.getParameter( 7938 );\n\n\tif ( glVersion.indexOf( 'WebGL' ) !== - 1 ) {\n\n\t\tversion = parseFloat( /^WebGL (\\d)/.exec( glVersion )[ 1 ] );\n\t\tlineWidthAvailable = ( version >= 1.0 );\n\n\t} else if ( glVersion.indexOf( 'OpenGL ES' ) !== - 1 ) {\n\n\t\tversion = parseFloat( /^OpenGL ES (\\d)/.exec( glVersion )[ 1 ] );\n\t\tlineWidthAvailable = ( version >= 2.0 );\n\n\t}\n\n\tlet currentTextureSlot = null;\n\tlet currentBoundTextures = {};\n\n\tconst scissorParam = gl.getParameter( 3088 );\n\tconst viewportParam = gl.getParameter( 2978 );\n\n\tconst currentScissor = new Vector4().fromArray( scissorParam );\n\tconst currentViewport = new Vector4().fromArray( viewportParam );\n\n\tfunction createTexture( type, target, count ) {\n\n\t\tconst data = new Uint8Array( 4 ); // 4 is required to match default unpack alignment of 4.\n\t\tconst texture = gl.createTexture();\n\n\t\tgl.bindTexture( type, texture );\n\t\tgl.texParameteri( type, 10241, 9728 );\n\t\tgl.texParameteri( type, 10240, 9728 );\n\n\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\tgl.texImage2D( target + i, 0, 6408, 1, 1, 0, 6408, 5121, data );\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\tconst emptyTextures = {};\n\temptyTextures[ 3553 ] = createTexture( 3553, 3553, 1 );\n\temptyTextures[ 34067 ] = createTexture( 34067, 34069, 6 );\n\n\t// init\n\n\tcolorBuffer.setClear( 0, 0, 0, 1 );\n\tdepthBuffer.setClear( 1 );\n\tstencilBuffer.setClear( 0 );\n\n\tenable( 2929 );\n\tdepthBuffer.setFunc( LessEqualDepth );\n\n\tsetFlipSided( false );\n\tsetCullFace( CullFaceBack );\n\tenable( 2884 );\n\n\tsetBlending( NoBlending );\n\n\t//\n\n\tfunction enable( id ) {\n\n\t\tif ( enabledCapabilities[ id ] !== true ) {\n\n\t\t\tgl.enable( id );\n\t\t\tenabledCapabilities[ id ] = true;\n\n\t\t}\n\n\t}\n\n\tfunction disable( id ) {\n\n\t\tif ( enabledCapabilities[ id ] !== false ) {\n\n\t\t\tgl.disable( id );\n\t\t\tenabledCapabilities[ id ] = false;\n\n\t\t}\n\n\t}\n\n\tfunction bindFramebuffer( target, framebuffer ) {\n\n\t\tif ( currentBoundFramebuffers[ target ] !== framebuffer ) {\n\n\t\t\tgl.bindFramebuffer( target, framebuffer );\n\n\t\t\tcurrentBoundFramebuffers[ target ] = framebuffer;\n\n\t\t\tif ( isWebGL2 ) {\n\n\t\t\t\t// 36009 is equivalent to 36160\n\n\t\t\t\tif ( target === 36009 ) {\n\n\t\t\t\t\tcurrentBoundFramebuffers[ 36160 ] = framebuffer;\n\n\t\t\t\t}\n\n\t\t\t\tif ( target === 36160 ) {\n\n\t\t\t\t\tcurrentBoundFramebuffers[ 36009 ] = framebuffer;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\tfunction drawBuffers( renderTarget, framebuffer ) {\n\n\t\tlet drawBuffers = defaultDrawbuffers;\n\n\t\tlet needsUpdate = false;\n\n\t\tif ( renderTarget ) {\n\n\t\t\tdrawBuffers = currentDrawbuffers.get( framebuffer );\n\n\t\t\tif ( drawBuffers === undefined ) {\n\n\t\t\t\tdrawBuffers = [];\n\t\t\t\tcurrentDrawbuffers.set( framebuffer, drawBuffers );\n\n\t\t\t}\n\n\t\t\tif ( renderTarget.isWebGLMultipleRenderTargets ) {\n\n\t\t\t\tconst textures = renderTarget.texture;\n\n\t\t\t\tif ( drawBuffers.length !== textures.length || drawBuffers[ 0 ] !== 36064 ) {\n\n\t\t\t\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tdrawBuffers[ i ] = 36064 + i;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tdrawBuffers.length = textures.length;\n\n\t\t\t\t\tneedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( drawBuffers[ 0 ] !== 36064 ) {\n\n\t\t\t\t\tdrawBuffers[ 0 ] = 36064;\n\n\t\t\t\t\tneedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( drawBuffers[ 0 ] !== 1029 ) {\n\n\t\t\t\tdrawBuffers[ 0 ] = 1029;\n\n\t\t\t\tneedsUpdate = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( needsUpdate ) {\n\n\t\t\tif ( capabilities.isWebGL2 ) {\n\n\t\t\t\tgl.drawBuffers( drawBuffers );\n\n\t\t\t} else {\n\n\t\t\t\textensions.get( 'WEBGL_draw_buffers' ).drawBuffersWEBGL( drawBuffers );\n\n\t\t\t}\n\n\t\t}\n\n\n\t}\n\n\tfunction useProgram( program ) {\n\n\t\tif ( currentProgram !== program ) {\n\n\t\t\tgl.useProgram( program );\n\n\t\t\tcurrentProgram = program;\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\tconst equationToGL = {\n\t\t[ AddEquation ]: 32774,\n\t\t[ SubtractEquation ]: 32778,\n\t\t[ ReverseSubtractEquation ]: 32779\n\t};\n\n\tif ( isWebGL2 ) {\n\n\t\tequationToGL[ MinEquation ] = 32775;\n\t\tequationToGL[ MaxEquation ] = 32776;\n\n\t} else {\n\n\t\tconst extension = extensions.get( 'EXT_blend_minmax' );\n\n\t\tif ( extension !== null ) {\n\n\t\t\tequationToGL[ MinEquation ] = extension.MIN_EXT;\n\t\t\tequationToGL[ MaxEquation ] = extension.MAX_EXT;\n\n\t\t}\n\n\t}\n\n\tconst factorToGL = {\n\t\t[ ZeroFactor ]: 0,\n\t\t[ OneFactor ]: 1,\n\t\t[ SrcColorFactor ]: 768,\n\t\t[ SrcAlphaFactor ]: 770,\n\t\t[ SrcAlphaSaturateFactor ]: 776,\n\t\t[ DstColorFactor ]: 774,\n\t\t[ DstAlphaFactor ]: 772,\n\t\t[ OneMinusSrcColorFactor ]: 769,\n\t\t[ OneMinusSrcAlphaFactor ]: 771,\n\t\t[ OneMinusDstColorFactor ]: 775,\n\t\t[ OneMinusDstAlphaFactor ]: 773\n\t};\n\n\tfunction setBlending( blending, blendEquation, blendSrc, blendDst, blendEquationAlpha, blendSrcAlpha, blendDstAlpha, premultipliedAlpha ) {\n\n\t\tif ( blending === NoBlending ) {\n\n\t\t\tif ( currentBlendingEnabled === true ) {\n\n\t\t\t\tdisable( 3042 );\n\t\t\t\tcurrentBlendingEnabled = false;\n\n\t\t\t}\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( currentBlendingEnabled === false ) {\n\n\t\t\tenable( 3042 );\n\t\t\tcurrentBlendingEnabled = true;\n\n\t\t}\n\n\t\tif ( blending !== CustomBlending ) {\n\n\t\t\tif ( blending !== currentBlending || premultipliedAlpha !== currentPremultipledAlpha ) {\n\n\t\t\t\tif ( currentBlendEquation !== AddEquation || currentBlendEquationAlpha !== AddEquation ) {\n\n\t\t\t\t\tgl.blendEquation( 32774 );\n\n\t\t\t\t\tcurrentBlendEquation = AddEquation;\n\t\t\t\t\tcurrentBlendEquationAlpha = AddEquation;\n\n\t\t\t\t}\n\n\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\tswitch ( blending ) {\n\n\t\t\t\t\t\tcase NormalBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( 1, 771, 1, 771 );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase AdditiveBlending:\n\t\t\t\t\t\t\tgl.blendFunc( 1, 1 );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase SubtractiveBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( 0, 769, 0, 1 );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase MultiplyBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( 0, 768, 0, 770 );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tconsole.error( 'THREE.WebGLState: Invalid blending: ', blending );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tswitch ( blending ) {\n\n\t\t\t\t\t\tcase NormalBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( 770, 771, 1, 771 );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase AdditiveBlending:\n\t\t\t\t\t\t\tgl.blendFunc( 770, 1 );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase SubtractiveBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( 0, 769, 0, 1 );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase MultiplyBlending:\n\t\t\t\t\t\t\tgl.blendFunc( 0, 768 );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tconsole.error( 'THREE.WebGLState: Invalid blending: ', blending );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tcurrentBlendSrc = null;\n\t\t\t\tcurrentBlendDst = null;\n\t\t\t\tcurrentBlendSrcAlpha = null;\n\t\t\t\tcurrentBlendDstAlpha = null;\n\n\t\t\t\tcurrentBlending = blending;\n\t\t\t\tcurrentPremultipledAlpha = premultipliedAlpha;\n\n\t\t\t}\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t// custom blending\n\n\t\tblendEquationAlpha = blendEquationAlpha || blendEquation;\n\t\tblendSrcAlpha = blendSrcAlpha || blendSrc;\n\t\tblendDstAlpha = blendDstAlpha || blendDst;\n\n\t\tif ( blendEquation !== currentBlendEquation || blendEquationAlpha !== currentBlendEquationAlpha ) {\n\n\t\t\tgl.blendEquationSeparate( equationToGL[ blendEquation ], equationToGL[ blendEquationAlpha ] );\n\n\t\t\tcurrentBlendEquation = blendEquation;\n\t\t\tcurrentBlendEquationAlpha = blendEquationAlpha;\n\n\t\t}\n\n\t\tif ( blendSrc !== currentBlendSrc || blendDst !== currentBlendDst || blendSrcAlpha !== currentBlendSrcAlpha || blendDstAlpha !== currentBlendDstAlpha ) {\n\n\t\t\tgl.blendFuncSeparate( factorToGL[ blendSrc ], factorToGL[ blendDst ], factorToGL[ blendSrcAlpha ], factorToGL[ blendDstAlpha ] );\n\n\t\t\tcurrentBlendSrc = blendSrc;\n\t\t\tcurrentBlendDst = blendDst;\n\t\t\tcurrentBlendSrcAlpha = blendSrcAlpha;\n\t\t\tcurrentBlendDstAlpha = blendDstAlpha;\n\n\t\t}\n\n\t\tcurrentBlending = blending;\n\t\tcurrentPremultipledAlpha = null;\n\n\t}\n\n\tfunction setMaterial( material, frontFaceCW ) {\n\n\t\tmaterial.side === DoubleSide\n\t\t\t? disable( 2884 )\n\t\t\t: enable( 2884 );\n\n\t\tlet flipSided = ( material.side === BackSide );\n\t\tif ( frontFaceCW ) flipSided = ! flipSided;\n\n\t\tsetFlipSided( flipSided );\n\n\t\t( material.blending === NormalBlending && material.transparent === false )\n\t\t\t? setBlending( NoBlending )\n\t\t\t: setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.premultipliedAlpha );\n\n\t\tdepthBuffer.setFunc( material.depthFunc );\n\t\tdepthBuffer.setTest( material.depthTest );\n\t\tdepthBuffer.setMask( material.depthWrite );\n\t\tcolorBuffer.setMask( material.colorWrite );\n\n\t\tconst stencilWrite = material.stencilWrite;\n\t\tstencilBuffer.setTest( stencilWrite );\n\t\tif ( stencilWrite ) {\n\n\t\t\tstencilBuffer.setMask( material.stencilWriteMask );\n\t\t\tstencilBuffer.setFunc( material.stencilFunc, material.stencilRef, material.stencilFuncMask );\n\t\t\tstencilBuffer.setOp( material.stencilFail, material.stencilZFail, material.stencilZPass );\n\n\t\t}\n\n\t\tsetPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits );\n\n\t\tmaterial.alphaToCoverage === true\n\t\t\t? enable( 32926 )\n\t\t\t: disable( 32926 );\n\n\t}\n\n\t//\n\n\tfunction setFlipSided( flipSided ) {\n\n\t\tif ( currentFlipSided !== flipSided ) {\n\n\t\t\tif ( flipSided ) {\n\n\t\t\t\tgl.frontFace( 2304 );\n\n\t\t\t} else {\n\n\t\t\t\tgl.frontFace( 2305 );\n\n\t\t\t}\n\n\t\t\tcurrentFlipSided = flipSided;\n\n\t\t}\n\n\t}\n\n\tfunction setCullFace( cullFace ) {\n\n\t\tif ( cullFace !== CullFaceNone ) {\n\n\t\t\tenable( 2884 );\n\n\t\t\tif ( cullFace !== currentCullFace ) {\n\n\t\t\t\tif ( cullFace === CullFaceBack ) {\n\n\t\t\t\t\tgl.cullFace( 1029 );\n\n\t\t\t\t} else if ( cullFace === CullFaceFront ) {\n\n\t\t\t\t\tgl.cullFace( 1028 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tgl.cullFace( 1032 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tdisable( 2884 );\n\n\t\t}\n\n\t\tcurrentCullFace = cullFace;\n\n\t}\n\n\tfunction setLineWidth( width ) {\n\n\t\tif ( width !== currentLineWidth ) {\n\n\t\t\tif ( lineWidthAvailable ) gl.lineWidth( width );\n\n\t\t\tcurrentLineWidth = width;\n\n\t\t}\n\n\t}\n\n\tfunction setPolygonOffset( polygonOffset, factor, units ) {\n\n\t\tif ( polygonOffset ) {\n\n\t\t\tenable( 32823 );\n\n\t\t\tif ( currentPolygonOffsetFactor !== factor || currentPolygonOffsetUnits !== units ) {\n\n\t\t\t\tgl.polygonOffset( factor, units );\n\n\t\t\t\tcurrentPolygonOffsetFactor = factor;\n\t\t\t\tcurrentPolygonOffsetUnits = units;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tdisable( 32823 );\n\n\t\t}\n\n\t}\n\n\tfunction setScissorTest( scissorTest ) {\n\n\t\tif ( scissorTest ) {\n\n\t\t\tenable( 3089 );\n\n\t\t} else {\n\n\t\t\tdisable( 3089 );\n\n\t\t}\n\n\t}\n\n\t// texture\n\n\tfunction activeTexture( webglSlot ) {\n\n\t\tif ( webglSlot === undefined ) webglSlot = 33984 + maxTextures - 1;\n\n\t\tif ( currentTextureSlot !== webglSlot ) {\n\n\t\t\tgl.activeTexture( webglSlot );\n\t\t\tcurrentTextureSlot = webglSlot;\n\n\t\t}\n\n\t}\n\n\tfunction bindTexture( webglType, webglTexture ) {\n\n\t\tif ( currentTextureSlot === null ) {\n\n\t\t\tactiveTexture();\n\n\t\t}\n\n\t\tlet boundTexture = currentBoundTextures[ currentTextureSlot ];\n\n\t\tif ( boundTexture === undefined ) {\n\n\t\t\tboundTexture = { type: undefined, texture: undefined };\n\t\t\tcurrentBoundTextures[ currentTextureSlot ] = boundTexture;\n\n\t\t}\n\n\t\tif ( boundTexture.type !== webglType || boundTexture.texture !== webglTexture ) {\n\n\t\t\tgl.bindTexture( webglType, webglTexture || emptyTextures[ webglType ] );\n\n\t\t\tboundTexture.type = webglType;\n\t\t\tboundTexture.texture = webglTexture;\n\n\t\t}\n\n\t}\n\n\tfunction unbindTexture() {\n\n\t\tconst boundTexture = currentBoundTextures[ currentTextureSlot ];\n\n\t\tif ( boundTexture !== undefined && boundTexture.type !== undefined ) {\n\n\t\t\tgl.bindTexture( boundTexture.type, null );\n\n\t\t\tboundTexture.type = undefined;\n\t\t\tboundTexture.texture = undefined;\n\n\t\t}\n\n\t}\n\n\tfunction compressedTexImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.compressedTexImage2D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texSubImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.texSubImage2D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texSubImage3D() {\n\n\t\ttry {\n\n\t\t\tgl.texSubImage3D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction compressedTexSubImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.compressedTexSubImage2D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texStorage2D() {\n\n\t\ttry {\n\n\t\t\tgl.texStorage2D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texStorage3D() {\n\n\t\ttry {\n\n\t\t\tgl.texStorage3D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.texImage2D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texImage3D() {\n\n\t\ttry {\n\n\t\t\tgl.texImage3D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\t//\n\n\tfunction scissor( scissor ) {\n\n\t\tif ( currentScissor.equals( scissor ) === false ) {\n\n\t\t\tgl.scissor( scissor.x, scissor.y, scissor.z, scissor.w );\n\t\t\tcurrentScissor.copy( scissor );\n\n\t\t}\n\n\t}\n\n\tfunction viewport( viewport ) {\n\n\t\tif ( currentViewport.equals( viewport ) === false ) {\n\n\t\t\tgl.viewport( viewport.x, viewport.y, viewport.z, viewport.w );\n\t\t\tcurrentViewport.copy( viewport );\n\n\t\t}\n\n\t}\n\n\tfunction updateUBOMapping( uniformsGroup, program ) {\n\n\t\tlet mapping = uboProgamMap.get( program );\n\n\t\tif ( mapping === undefined ) {\n\n\t\t\tmapping = new WeakMap();\n\n\t\t\tuboProgamMap.set( program, mapping );\n\n\t\t}\n\n\t\tlet blockIndex = mapping.get( uniformsGroup );\n\n\t\tif ( blockIndex === undefined ) {\n\n\t\t\tblockIndex = gl.getUniformBlockIndex( program, uniformsGroup.name );\n\n\t\t\tmapping.set( uniformsGroup, blockIndex );\n\n\t\t}\n\n\t}\n\n\tfunction uniformBlockBinding( uniformsGroup, program ) {\n\n\t\tconst mapping = uboProgamMap.get( program );\n\t\tconst blockIndex = mapping.get( uniformsGroup );\n\n\t\tif ( uboBindings.get( uniformsGroup ) !== blockIndex ) {\n\n\t\t\t// bind shader specific block index to global block point\n\n\t\t\tgl.uniformBlockBinding( program, blockIndex, uniformsGroup.__bindingPointIndex );\n\n\t\t\tuboBindings.set( uniformsGroup, blockIndex );\n\n\t\t}\n\n\t}\n\n\t//\n\n\tfunction reset() {\n\n\t\t// reset state\n\n\t\tgl.disable( 3042 );\n\t\tgl.disable( 2884 );\n\t\tgl.disable( 2929 );\n\t\tgl.disable( 32823 );\n\t\tgl.disable( 3089 );\n\t\tgl.disable( 2960 );\n\t\tgl.disable( 32926 );\n\n\t\tgl.blendEquation( 32774 );\n\t\tgl.blendFunc( 1, 0 );\n\t\tgl.blendFuncSeparate( 1, 0, 1, 0 );\n\n\t\tgl.colorMask( true, true, true, true );\n\t\tgl.clearColor( 0, 0, 0, 0 );\n\n\t\tgl.depthMask( true );\n\t\tgl.depthFunc( 513 );\n\t\tgl.clearDepth( 1 );\n\n\t\tgl.stencilMask( 0xffffffff );\n\t\tgl.stencilFunc( 519, 0, 0xffffffff );\n\t\tgl.stencilOp( 7680, 7680, 7680 );\n\t\tgl.clearStencil( 0 );\n\n\t\tgl.cullFace( 1029 );\n\t\tgl.frontFace( 2305 );\n\n\t\tgl.polygonOffset( 0, 0 );\n\n\t\tgl.activeTexture( 33984 );\n\n\t\tgl.bindFramebuffer( 36160, null );\n\n\t\tif ( isWebGL2 === true ) {\n\n\t\t\tgl.bindFramebuffer( 36009, null );\n\t\t\tgl.bindFramebuffer( 36008, null );\n\n\t\t}\n\n\t\tgl.useProgram( null );\n\n\t\tgl.lineWidth( 1 );\n\n\t\tgl.scissor( 0, 0, gl.canvas.width, gl.canvas.height );\n\t\tgl.viewport( 0, 0, gl.canvas.width, gl.canvas.height );\n\n\t\t// reset internals\n\n\t\tenabledCapabilities = {};\n\n\t\tcurrentTextureSlot = null;\n\t\tcurrentBoundTextures = {};\n\n\t\tcurrentBoundFramebuffers = {};\n\t\tcurrentDrawbuffers = new WeakMap();\n\t\tdefaultDrawbuffers = [];\n\n\t\tcurrentProgram = null;\n\n\t\tcurrentBlendingEnabled = false;\n\t\tcurrentBlending = null;\n\t\tcurrentBlendEquation = null;\n\t\tcurrentBlendSrc = null;\n\t\tcurrentBlendDst = null;\n\t\tcurrentBlendEquationAlpha = null;\n\t\tcurrentBlendSrcAlpha = null;\n\t\tcurrentBlendDstAlpha = null;\n\t\tcurrentPremultipledAlpha = false;\n\n\t\tcurrentFlipSided = null;\n\t\tcurrentCullFace = null;\n\n\t\tcurrentLineWidth = null;\n\n\t\tcurrentPolygonOffsetFactor = null;\n\t\tcurrentPolygonOffsetUnits = null;\n\n\t\tcurrentScissor.set( 0, 0, gl.canvas.width, gl.canvas.height );\n\t\tcurrentViewport.set( 0, 0, gl.canvas.width, gl.canvas.height );\n\n\t\tcolorBuffer.reset();\n\t\tdepthBuffer.reset();\n\t\tstencilBuffer.reset();\n\n\t}\n\n\treturn {\n\n\t\tbuffers: {\n\t\t\tcolor: colorBuffer,\n\t\t\tdepth: depthBuffer,\n\t\t\tstencil: stencilBuffer\n\t\t},\n\n\t\tenable: enable,\n\t\tdisable: disable,\n\n\t\tbindFramebuffer: bindFramebuffer,\n\t\tdrawBuffers: drawBuffers,\n\n\t\tuseProgram: useProgram,\n\n\t\tsetBlending: setBlending,\n\t\tsetMaterial: setMaterial,\n\n\t\tsetFlipSided: setFlipSided,\n\t\tsetCullFace: setCullFace,\n\n\t\tsetLineWidth: setLineWidth,\n\t\tsetPolygonOffset: setPolygonOffset,\n\n\t\tsetScissorTest: setScissorTest,\n\n\t\tactiveTexture: activeTexture,\n\t\tbindTexture: bindTexture,\n\t\tunbindTexture: unbindTexture,\n\t\tcompressedTexImage2D: compressedTexImage2D,\n\t\ttexImage2D: texImage2D,\n\t\ttexImage3D: texImage3D,\n\n\t\tupdateUBOMapping: updateUBOMapping,\n\t\tuniformBlockBinding: uniformBlockBinding,\n\n\t\ttexStorage2D: texStorage2D,\n\t\ttexStorage3D: texStorage3D,\n\t\ttexSubImage2D: texSubImage2D,\n\t\ttexSubImage3D: texSubImage3D,\n\t\tcompressedTexSubImage2D: compressedTexSubImage2D,\n\n\t\tscissor: scissor,\n\t\tviewport: viewport,\n\n\t\treset: reset\n\n\t};\n\n}\n\nfunction WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info ) {\n\n\tconst isWebGL2 = capabilities.isWebGL2;\n\tconst maxTextures = capabilities.maxTextures;\n\tconst maxCubemapSize = capabilities.maxCubemapSize;\n\tconst maxTextureSize = capabilities.maxTextureSize;\n\tconst maxSamples = capabilities.maxSamples;\n\tconst multisampledRTTExt = extensions.has( 'WEBGL_multisampled_render_to_texture' ) ? extensions.get( 'WEBGL_multisampled_render_to_texture' ) : null;\n\tconst supportsInvalidateFramebuffer = /OculusBrowser/g.test( navigator.userAgent );\n\n\tconst _videoTextures = new WeakMap();\n\tlet _canvas;\n\n\tconst _sources = new WeakMap(); // maps WebglTexture objects to instances of Source\n\n\t// cordova iOS (as of 5.0) still uses UIWebView, which provides OffscreenCanvas,\n\t// also OffscreenCanvas.getContext(\"webgl\"), but not OffscreenCanvas.getContext(\"2d\")!\n\t// Some implementations may only implement OffscreenCanvas partially (e.g. lacking 2d).\n\n\tlet useOffscreenCanvas = false;\n\n\ttry {\n\n\t\tuseOffscreenCanvas = typeof OffscreenCanvas !== 'undefined'\n\t\t\t// eslint-disable-next-line compat/compat\n\t\t\t&& ( new OffscreenCanvas( 1, 1 ).getContext( '2d' ) ) !== null;\n\n\t} catch ( err ) {\n\n\t\t// Ignore any errors\n\n\t}\n\n\tfunction createCanvas( width, height ) {\n\n\t\t// Use OffscreenCanvas when available. Specially needed in web workers\n\n\t\treturn useOffscreenCanvas ?\n\t\t\t// eslint-disable-next-line compat/compat\n\t\t\tnew OffscreenCanvas( width, height ) : createElementNS( 'canvas' );\n\n\t}\n\n\tfunction resizeImage( image, needsPowerOfTwo, needsNewCanvas, maxSize ) {\n\n\t\tlet scale = 1;\n\n\t\t// handle case if texture exceeds max size\n\n\t\tif ( image.width > maxSize || image.height > maxSize ) {\n\n\t\t\tscale = maxSize / Math.max( image.width, image.height );\n\n\t\t}\n\n\t\t// only perform resize if necessary\n\n\t\tif ( scale < 1 || needsPowerOfTwo === true ) {\n\n\t\t\t// only perform resize for certain image types\n\n\t\t\tif ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) ||\n\t\t\t\t( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) ||\n\t\t\t\t( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ) {\n\n\t\t\t\tconst floor = needsPowerOfTwo ? floorPowerOfTwo : Math.floor;\n\n\t\t\t\tconst width = floor( scale * image.width );\n\t\t\t\tconst height = floor( scale * image.height );\n\n\t\t\t\tif ( _canvas === undefined ) _canvas = createCanvas( width, height );\n\n\t\t\t\t// cube textures can't reuse the same canvas\n\n\t\t\t\tconst canvas = needsNewCanvas ? createCanvas( width, height ) : _canvas;\n\n\t\t\t\tcanvas.width = width;\n\t\t\t\tcanvas.height = height;\n\n\t\t\t\tconst context = canvas.getContext( '2d' );\n\t\t\t\tcontext.drawImage( image, 0, 0, width, height );\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture has been resized from (' + image.width + 'x' + image.height + ') to (' + width + 'x' + height + ').' );\n\n\t\t\t\treturn canvas;\n\n\t\t\t} else {\n\n\t\t\t\tif ( 'data' in image ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Image in DataTexture is too big (' + image.width + 'x' + image.height + ').' );\n\n\t\t\t\t}\n\n\t\t\t\treturn image;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn image;\n\n\t}\n\n\tfunction isPowerOfTwo$1( image ) {\n\n\t\treturn isPowerOfTwo( image.width ) && isPowerOfTwo( image.height );\n\n\t}\n\n\tfunction textureNeedsPowerOfTwo( texture ) {\n\n\t\tif ( isWebGL2 ) return false;\n\n\t\treturn ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) ||\n\t\t\t( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter );\n\n\t}\n\n\tfunction textureNeedsGenerateMipmaps( texture, supportsMips ) {\n\n\t\treturn texture.generateMipmaps && supportsMips &&\n\t\t\ttexture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter;\n\n\t}\n\n\tfunction generateMipmap( target ) {\n\n\t\t_gl.generateMipmap( target );\n\n\t}\n\n\tfunction getInternalFormat( internalFormatName, glFormat, glType, encoding, isVideoTexture = false ) {\n\n\t\tif ( isWebGL2 === false ) return glFormat;\n\n\t\tif ( internalFormatName !== null ) {\n\n\t\t\tif ( _gl[ internalFormatName ] !== undefined ) return _gl[ internalFormatName ];\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format \\'' + internalFormatName + '\\'' );\n\n\t\t}\n\n\t\tlet internalFormat = glFormat;\n\n\t\tif ( glFormat === 6403 ) {\n\n\t\t\tif ( glType === 5126 ) internalFormat = 33326;\n\t\t\tif ( glType === 5131 ) internalFormat = 33325;\n\t\t\tif ( glType === 5121 ) internalFormat = 33321;\n\n\t\t}\n\n\t\tif ( glFormat === 33319 ) {\n\n\t\t\tif ( glType === 5126 ) internalFormat = 33328;\n\t\t\tif ( glType === 5131 ) internalFormat = 33327;\n\t\t\tif ( glType === 5121 ) internalFormat = 33323;\n\n\t\t}\n\n\t\tif ( glFormat === 6408 ) {\n\n\t\t\tif ( glType === 5126 ) internalFormat = 34836;\n\t\t\tif ( glType === 5131 ) internalFormat = 34842;\n\t\t\tif ( glType === 5121 ) internalFormat = ( encoding === sRGBEncoding && isVideoTexture === false ) ? 35907 : 32856;\n\t\t\tif ( glType === 32819 ) internalFormat = 32854;\n\t\t\tif ( glType === 32820 ) internalFormat = 32855;\n\n\t\t}\n\n\t\tif ( internalFormat === 33325 || internalFormat === 33326 ||\n\t\t\tinternalFormat === 33327 || internalFormat === 33328 ||\n\t\t\tinternalFormat === 34842 || internalFormat === 34836 ) {\n\n\t\t\textensions.get( 'EXT_color_buffer_float' );\n\n\t\t}\n\n\t\treturn internalFormat;\n\n\t}\n\n\tfunction getMipLevels( texture, image, supportsMips ) {\n\n\t\tif ( textureNeedsGenerateMipmaps( texture, supportsMips ) === true || ( texture.isFramebufferTexture && texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ) ) {\n\n\t\t\treturn Math.log2( Math.max( image.width, image.height ) ) + 1;\n\n\t\t} else if ( texture.mipmaps !== undefined && texture.mipmaps.length > 0 ) {\n\n\t\t\t// user-defined mipmaps\n\n\t\t\treturn texture.mipmaps.length;\n\n\t\t} else if ( texture.isCompressedTexture && Array.isArray( texture.image ) ) {\n\n\t\t\treturn image.mipmaps.length;\n\n\t\t} else {\n\n\t\t\t// texture without mipmaps (only base level)\n\n\t\t\treturn 1;\n\n\t\t}\n\n\t}\n\n\t// Fallback filters for non-power-of-2 textures\n\n\tfunction filterFallback( f ) {\n\n\t\tif ( f === NearestFilter || f === NearestMipmapNearestFilter || f === NearestMipmapLinearFilter ) {\n\n\t\t\treturn 9728;\n\n\t\t}\n\n\t\treturn 9729;\n\n\t}\n\n\t//\n\n\tfunction onTextureDispose( event ) {\n\n\t\tconst texture = event.target;\n\n\t\ttexture.removeEventListener( 'dispose', onTextureDispose );\n\n\t\tdeallocateTexture( texture );\n\n\t\tif ( texture.isVideoTexture ) {\n\n\t\t\t_videoTextures.delete( texture );\n\n\t\t}\n\n\t}\n\n\tfunction onRenderTargetDispose( event ) {\n\n\t\tconst renderTarget = event.target;\n\n\t\trenderTarget.removeEventListener( 'dispose', onRenderTargetDispose );\n\n\t\tdeallocateRenderTarget( renderTarget );\n\n\t}\n\n\t//\n\n\tfunction deallocateTexture( texture ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( textureProperties.__webglInit === undefined ) return;\n\n\t\t// check if it's necessary to remove the WebGLTexture object\n\n\t\tconst source = texture.source;\n\t\tconst webglTextures = _sources.get( source );\n\n\t\tif ( webglTextures ) {\n\n\t\t\tconst webglTexture = webglTextures[ textureProperties.__cacheKey ];\n\t\t\twebglTexture.usedTimes --;\n\n\t\t\t// the WebGLTexture object is not used anymore, remove it\n\n\t\t\tif ( webglTexture.usedTimes === 0 ) {\n\n\t\t\t\tdeleteTexture( texture );\n\n\t\t\t}\n\n\t\t\t// remove the weak map entry if no WebGLTexture uses the source anymore\n\n\t\t\tif ( Object.keys( webglTextures ).length === 0 ) {\n\n\t\t\t\t_sources.delete( source );\n\n\t\t\t}\n\n\t\t}\n\n\t\tproperties.remove( texture );\n\n\t}\n\n\tfunction deleteTexture( texture ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\t\t_gl.deleteTexture( textureProperties.__webglTexture );\n\n\t\tconst source = texture.source;\n\t\tconst webglTextures = _sources.get( source );\n\t\tdelete webglTextures[ textureProperties.__cacheKey ];\n\n\t\tinfo.memory.textures --;\n\n\t}\n\n\tfunction deallocateRenderTarget( renderTarget ) {\n\n\t\tconst texture = renderTarget.texture;\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( textureProperties.__webglTexture !== undefined ) {\n\n\t\t\t_gl.deleteTexture( textureProperties.__webglTexture );\n\n\t\t\tinfo.memory.textures --;\n\n\t\t}\n\n\t\tif ( renderTarget.depthTexture ) {\n\n\t\t\trenderTarget.depthTexture.dispose();\n\n\t\t}\n\n\t\tif ( renderTarget.isWebGLCubeRenderTarget ) {\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\t_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ] );\n\t\t\t\tif ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer[ i ] );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer );\n\t\t\tif ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer );\n\t\t\tif ( renderTargetProperties.__webglMultisampledFramebuffer ) _gl.deleteFramebuffer( renderTargetProperties.__webglMultisampledFramebuffer );\n\n\t\t\tif ( renderTargetProperties.__webglColorRenderbuffer ) {\n\n\t\t\t\tfor ( let i = 0; i < renderTargetProperties.__webglColorRenderbuffer.length; i ++ ) {\n\n\t\t\t\t\tif ( renderTargetProperties.__webglColorRenderbuffer[ i ] ) _gl.deleteRenderbuffer( renderTargetProperties.__webglColorRenderbuffer[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( renderTargetProperties.__webglDepthRenderbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthRenderbuffer );\n\n\t\t}\n\n\t\tif ( renderTarget.isWebGLMultipleRenderTargets ) {\n\n\t\t\tfor ( let i = 0, il = texture.length; i < il; i ++ ) {\n\n\t\t\t\tconst attachmentProperties = properties.get( texture[ i ] );\n\n\t\t\t\tif ( attachmentProperties.__webglTexture ) {\n\n\t\t\t\t\t_gl.deleteTexture( attachmentProperties.__webglTexture );\n\n\t\t\t\t\tinfo.memory.textures --;\n\n\t\t\t\t}\n\n\t\t\t\tproperties.remove( texture[ i ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tproperties.remove( texture );\n\t\tproperties.remove( renderTarget );\n\n\t}\n\n\t//\n\n\tlet textureUnits = 0;\n\n\tfunction resetTextureUnits() {\n\n\t\ttextureUnits = 0;\n\n\t}\n\n\tfunction allocateTextureUnit() {\n\n\t\tconst textureUnit = textureUnits;\n\n\t\tif ( textureUnit >= maxTextures ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLTextures: Trying to use ' + textureUnit + ' texture units while this GPU supports only ' + maxTextures );\n\n\t\t}\n\n\t\ttextureUnits += 1;\n\n\t\treturn textureUnit;\n\n\t}\n\n\tfunction getTextureCacheKey( texture ) {\n\n\t\tconst array = [];\n\n\t\tarray.push( texture.wrapS );\n\t\tarray.push( texture.wrapT );\n\t\tarray.push( texture.magFilter );\n\t\tarray.push( texture.minFilter );\n\t\tarray.push( texture.anisotropy );\n\t\tarray.push( texture.internalFormat );\n\t\tarray.push( texture.format );\n\t\tarray.push( texture.type );\n\t\tarray.push( texture.generateMipmaps );\n\t\tarray.push( texture.premultiplyAlpha );\n\t\tarray.push( texture.flipY );\n\t\tarray.push( texture.unpackAlignment );\n\t\tarray.push( texture.encoding );\n\n\t\treturn array.join();\n\n\t}\n\n\t//\n\n\tfunction setTexture2D( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.isVideoTexture ) updateVideoTexture( texture );\n\n\t\tif ( texture.isRenderTargetTexture === false && texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tconst image = texture.image;\n\n\t\t\tif ( image === null ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture marked for update but no image data found.' );\n\n\t\t\t} else if ( image.complete === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture marked for update but image is incomplete' );\n\n\t\t\t} else {\n\n\t\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.activeTexture( 33984 + slot );\n\t\tstate.bindTexture( 3553, textureProperties.__webglTexture );\n\n\t}\n\n\tfunction setTexture2DArray( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\treturn;\n\n\t\t}\n\n\t\tstate.activeTexture( 33984 + slot );\n\t\tstate.bindTexture( 35866, textureProperties.__webglTexture );\n\n\t}\n\n\tfunction setTexture3D( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\treturn;\n\n\t\t}\n\n\t\tstate.activeTexture( 33984 + slot );\n\t\tstate.bindTexture( 32879, textureProperties.__webglTexture );\n\n\t}\n\n\tfunction setTextureCube( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tuploadCubeTexture( textureProperties, texture, slot );\n\t\t\treturn;\n\n\t\t}\n\n\t\tstate.activeTexture( 33984 + slot );\n\t\tstate.bindTexture( 34067, textureProperties.__webglTexture );\n\n\t}\n\n\tconst wrappingToGL = {\n\t\t[ RepeatWrapping ]: 10497,\n\t\t[ ClampToEdgeWrapping ]: 33071,\n\t\t[ MirroredRepeatWrapping ]: 33648\n\t};\n\n\tconst filterToGL = {\n\t\t[ NearestFilter ]: 9728,\n\t\t[ NearestMipmapNearestFilter ]: 9984,\n\t\t[ NearestMipmapLinearFilter ]: 9986,\n\n\t\t[ LinearFilter ]: 9729,\n\t\t[ LinearMipmapNearestFilter ]: 9985,\n\t\t[ LinearMipmapLinearFilter ]: 9987\n\t};\n\n\tfunction setTextureParameters( textureType, texture, supportsMips ) {\n\n\t\tif ( supportsMips ) {\n\n\t\t\t_gl.texParameteri( textureType, 10242, wrappingToGL[ texture.wrapS ] );\n\t\t\t_gl.texParameteri( textureType, 10243, wrappingToGL[ texture.wrapT ] );\n\n\t\t\tif ( textureType === 32879 || textureType === 35866 ) {\n\n\t\t\t\t_gl.texParameteri( textureType, 32882, wrappingToGL[ texture.wrapR ] );\n\n\t\t\t}\n\n\t\t\t_gl.texParameteri( textureType, 10240, filterToGL[ texture.magFilter ] );\n\t\t\t_gl.texParameteri( textureType, 10241, filterToGL[ texture.minFilter ] );\n\n\t\t} else {\n\n\t\t\t_gl.texParameteri( textureType, 10242, 33071 );\n\t\t\t_gl.texParameteri( textureType, 10243, 33071 );\n\n\t\t\tif ( textureType === 32879 || textureType === 35866 ) {\n\n\t\t\t\t_gl.texParameteri( textureType, 32882, 33071 );\n\n\t\t\t}\n\n\t\t\tif ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping.' );\n\n\t\t\t}\n\n\t\t\t_gl.texParameteri( textureType, 10240, filterFallback( texture.magFilter ) );\n\t\t\t_gl.texParameteri( textureType, 10241, filterFallback( texture.minFilter ) );\n\n\t\t\tif ( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.' );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( extensions.has( 'EXT_texture_filter_anisotropic' ) === true ) {\n\n\t\t\tconst extension = extensions.get( 'EXT_texture_filter_anisotropic' );\n\n\t\t\tif ( texture.type === FloatType && extensions.has( 'OES_texture_float_linear' ) === false ) return; // verify extension for WebGL 1 and WebGL 2\n\t\t\tif ( isWebGL2 === false && ( texture.type === HalfFloatType && extensions.has( 'OES_texture_half_float_linear' ) === false ) ) return; // verify extension for WebGL 1 only\n\n\t\t\tif ( texture.anisotropy > 1 || properties.get( texture ).__currentAnisotropy ) {\n\n\t\t\t\t_gl.texParameterf( textureType, extension.TEXTURE_MAX_ANISOTROPY_EXT, Math.min( texture.anisotropy, capabilities.getMaxAnisotropy() ) );\n\t\t\t\tproperties.get( texture ).__currentAnisotropy = texture.anisotropy;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction initTexture( textureProperties, texture ) {\n\n\t\tlet forceUpload = false;\n\n\t\tif ( textureProperties.__webglInit === undefined ) {\n\n\t\t\ttextureProperties.__webglInit = true;\n\n\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t}\n\n\t\t// create Source <-> WebGLTextures mapping if necessary\n\n\t\tconst source = texture.source;\n\t\tlet webglTextures = _sources.get( source );\n\n\t\tif ( webglTextures === undefined ) {\n\n\t\t\twebglTextures = {};\n\t\t\t_sources.set( source, webglTextures );\n\n\t\t}\n\n\t\t// check if there is already a WebGLTexture object for the given texture parameters\n\n\t\tconst textureCacheKey = getTextureCacheKey( texture );\n\n\t\tif ( textureCacheKey !== textureProperties.__cacheKey ) {\n\n\t\t\t// if not, create a new instance of WebGLTexture\n\n\t\t\tif ( webglTextures[ textureCacheKey ] === undefined ) {\n\n\t\t\t\t// create new entry\n\n\t\t\t\twebglTextures[ textureCacheKey ] = {\n\t\t\t\t\ttexture: _gl.createTexture(),\n\t\t\t\t\tusedTimes: 0\n\t\t\t\t};\n\n\t\t\t\tinfo.memory.textures ++;\n\n\t\t\t\t// when a new instance of WebGLTexture was created, a texture upload is required\n\t\t\t\t// even if the image contents are identical\n\n\t\t\t\tforceUpload = true;\n\n\t\t\t}\n\n\t\t\twebglTextures[ textureCacheKey ].usedTimes ++;\n\n\t\t\t// every time the texture cache key changes, it's necessary to check if an instance of\n\t\t\t// WebGLTexture can be deleted in order to avoid a memory leak.\n\n\t\t\tconst webglTexture = webglTextures[ textureProperties.__cacheKey ];\n\n\t\t\tif ( webglTexture !== undefined ) {\n\n\t\t\t\twebglTextures[ textureProperties.__cacheKey ].usedTimes --;\n\n\t\t\t\tif ( webglTexture.usedTimes === 0 ) {\n\n\t\t\t\t\tdeleteTexture( texture );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// store references to cache key and WebGLTexture object\n\n\t\t\ttextureProperties.__cacheKey = textureCacheKey;\n\t\t\ttextureProperties.__webglTexture = webglTextures[ textureCacheKey ].texture;\n\n\t\t}\n\n\t\treturn forceUpload;\n\n\t}\n\n\tfunction uploadTexture( textureProperties, texture, slot ) {\n\n\t\tlet textureType = 3553;\n\n\t\tif ( texture.isDataArrayTexture ) textureType = 35866;\n\t\tif ( texture.isData3DTexture ) textureType = 32879;\n\n\t\tconst forceUpload = initTexture( textureProperties, texture );\n\t\tconst source = texture.source;\n\n\t\tstate.activeTexture( 33984 + slot );\n\t\tstate.bindTexture( textureType, textureProperties.__webglTexture );\n\n\t\tif ( source.version !== source.__currentVersion || forceUpload === true ) {\n\n\t\t\t_gl.pixelStorei( 37440, texture.flipY );\n\t\t\t_gl.pixelStorei( 37441, texture.premultiplyAlpha );\n\t\t\t_gl.pixelStorei( 3317, texture.unpackAlignment );\n\t\t\t_gl.pixelStorei( 37443, 0 );\n\n\t\t\tconst needsPowerOfTwo = textureNeedsPowerOfTwo( texture ) && isPowerOfTwo$1( texture.image ) === false;\n\t\t\tlet image = resizeImage( texture.image, needsPowerOfTwo, false, maxTextureSize );\n\t\t\timage = verifyColorSpace( texture, image );\n\n\t\t\tconst supportsMips = isPowerOfTwo$1( image ) || isWebGL2,\n\t\t\t\tglFormat = utils.convert( texture.format, texture.encoding );\n\n\t\t\tlet glType = utils.convert( texture.type ),\n\t\t\t\tglInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.encoding, texture.isVideoTexture );\n\n\t\t\tsetTextureParameters( textureType, texture, supportsMips );\n\n\t\t\tlet mipmap;\n\t\t\tconst mipmaps = texture.mipmaps;\n\n\t\t\tconst useTexStorage = ( isWebGL2 && texture.isVideoTexture !== true );\n\t\t\tconst allocateMemory = ( source.__currentVersion === undefined ) || ( forceUpload === true );\n\t\t\tconst levels = getMipLevels( texture, image, supportsMips );\n\n\t\t\tif ( texture.isDepthTexture ) {\n\n\t\t\t\t// populate depth texture with dummy data\n\n\t\t\t\tglInternalFormat = 6402;\n\n\t\t\t\tif ( isWebGL2 ) {\n\n\t\t\t\t\tif ( texture.type === FloatType ) {\n\n\t\t\t\t\t\tglInternalFormat = 36012;\n\n\t\t\t\t\t} else if ( texture.type === UnsignedIntType ) {\n\n\t\t\t\t\t\tglInternalFormat = 33190;\n\n\t\t\t\t\t} else if ( texture.type === UnsignedInt248Type ) {\n\n\t\t\t\t\t\tglInternalFormat = 35056;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tglInternalFormat = 33189; // WebGL2 requires sized internalformat for glTexImage2D\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( texture.type === FloatType ) {\n\n\t\t\t\t\t\tconsole.error( 'WebGLRenderer: Floating point depth texture requires WebGL2.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// validation checks for WebGL 1\n\n\t\t\t\tif ( texture.format === DepthFormat && glInternalFormat === 6402 ) {\n\n\t\t\t\t\t// The error INVALID_OPERATION is generated by texImage2D if format and internalformat are\n\t\t\t\t\t// DEPTH_COMPONENT and type is not UNSIGNED_SHORT or UNSIGNED_INT\n\t\t\t\t\t// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)\n\t\t\t\t\tif ( texture.type !== UnsignedShortType && texture.type !== UnsignedIntType ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture.' );\n\n\t\t\t\t\t\ttexture.type = UnsignedIntType;\n\t\t\t\t\t\tglType = utils.convert( texture.type );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( texture.format === DepthStencilFormat && glInternalFormat === 6402 ) {\n\n\t\t\t\t\t// Depth stencil textures need the DEPTH_STENCIL internal format\n\t\t\t\t\t// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)\n\t\t\t\t\tglInternalFormat = 34041;\n\n\t\t\t\t\t// The error INVALID_OPERATION is generated by texImage2D if format and internalformat are\n\t\t\t\t\t// DEPTH_STENCIL and type is not UNSIGNED_INT_24_8_WEBGL.\n\t\t\t\t\t// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)\n\t\t\t\t\tif ( texture.type !== UnsignedInt248Type ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture.' );\n\n\t\t\t\t\t\ttexture.type = UnsignedInt248Type;\n\t\t\t\t\t\tglType = utils.convert( texture.type );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t//\n\n\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\tstate.texStorage2D( 3553, 1, glInternalFormat, image.width, image.height );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstate.texImage2D( 3553, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, null );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( 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 && supportsMips ) {\n\n\t\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage2D( 3553, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\tstate.texSubImage2D( 3553, i, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texImage2D( 3553, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t}\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\tif ( useTexStorage ) {\n\n\t\t\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\t\t\tstate.texStorage2D( 3553, levels, glInternalFormat, image.width, image.height );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstate.texSubImage2D( 3553, 0, 0, 0, image.width, image.height, glFormat, glType, image.data );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstate.texImage2D( 3553, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, image.data );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isCompressedTexture ) {\n\n\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\tstate.texStorage2D( 3553, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let 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 ) {\n\n\t\t\t\t\t\tif ( glFormat !== null ) {\n\n\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tstate.compressedTexSubImage2D( 3553, i, 0, 0, mipmap.width, mipmap.height, glFormat, mipmap.data );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.compressedTexImage2D( 3553, i, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data );\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\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\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\tstate.texSubImage2D( 3553, i, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texImage2D( 3553, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\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} else if ( texture.isDataArrayTexture ) {\n\n\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage3D( 35866, levels, glInternalFormat, image.width, image.height, image.depth );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tstate.texSubImage3D( 35866, 0, 0, 0, 0, image.width, image.height, image.depth, glFormat, glType, image.data );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.texImage3D( 35866, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data );\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isData3DTexture ) {\n\n\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage3D( 32879, levels, glInternalFormat, image.width, image.height, image.depth );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tstate.texSubImage3D( 32879, 0, 0, 0, 0, image.width, image.height, image.depth, glFormat, glType, image.data );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.texImage3D( 32879, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data );\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isFramebufferTexture ) {\n\n\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\tstate.texStorage2D( 3553, levels, glInternalFormat, image.width, image.height );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tlet width = image.width, height = image.height;\n\n\t\t\t\t\t\tfor ( let i = 0; i < levels; i ++ ) {\n\n\t\t\t\t\t\t\tstate.texImage2D( 3553, i, glInternalFormat, width, height, 0, glFormat, glType, null );\n\n\t\t\t\t\t\t\twidth >>= 1;\n\t\t\t\t\t\t\theight >>= 1;\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} 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 && supportsMips ) {\n\n\t\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage2D( 3553, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\tstate.texSubImage2D( 3553, i, 0, 0, glFormat, glType, mipmap );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texImage2D( 3553, i, glInternalFormat, glFormat, glType, mipmap );\n\n\t\t\t\t\t\t}\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\tif ( useTexStorage ) {\n\n\t\t\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\t\t\tstate.texStorage2D( 3553, levels, glInternalFormat, image.width, image.height );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstate.texSubImage2D( 3553, 0, 0, 0, glFormat, glType, image );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstate.texImage2D( 3553, 0, glInternalFormat, glFormat, glType, image );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) {\n\n\t\t\t\tgenerateMipmap( textureType );\n\n\t\t\t}\n\n\t\t\tsource.__currentVersion = source.version;\n\n\t\t\tif ( texture.onUpdate ) texture.onUpdate( texture );\n\n\t\t}\n\n\t\ttextureProperties.__version = texture.version;\n\n\t}\n\n\tfunction uploadCubeTexture( textureProperties, texture, slot ) {\n\n\t\tif ( texture.image.length !== 6 ) return;\n\n\t\tconst forceUpload = initTexture( textureProperties, texture );\n\t\tconst source = texture.source;\n\n\t\tstate.activeTexture( 33984 + slot );\n\t\tstate.bindTexture( 34067, textureProperties.__webglTexture );\n\n\t\tif ( source.version !== source.__currentVersion || forceUpload === true ) {\n\n\t\t\t_gl.pixelStorei( 37440, texture.flipY );\n\t\t\t_gl.pixelStorei( 37441, texture.premultiplyAlpha );\n\t\t\t_gl.pixelStorei( 3317, texture.unpackAlignment );\n\t\t\t_gl.pixelStorei( 37443, 0 );\n\n\t\t\tconst isCompressed = ( texture.isCompressedTexture || texture.image[ 0 ].isCompressedTexture );\n\t\t\tconst isDataTexture = ( texture.image[ 0 ] && texture.image[ 0 ].isDataTexture );\n\n\t\t\tconst cubeImage = [];\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\tif ( ! isCompressed && ! isDataTexture ) {\n\n\t\t\t\t\tcubeImage[ i ] = resizeImage( texture.image[ i ], false, true, maxCubemapSize );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tcubeImage[ i ] = isDataTexture ? texture.image[ i ].image : texture.image[ i ];\n\n\t\t\t\t}\n\n\t\t\t\tcubeImage[ i ] = verifyColorSpace( texture, cubeImage[ i ] );\n\n\t\t\t}\n\n\t\t\tconst image = cubeImage[ 0 ],\n\t\t\t\tsupportsMips = isPowerOfTwo$1( image ) || isWebGL2,\n\t\t\t\tglFormat = utils.convert( texture.format, texture.encoding ),\n\t\t\t\tglType = utils.convert( texture.type ),\n\t\t\t\tglInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.encoding );\n\n\t\t\tconst useTexStorage = ( isWebGL2 && texture.isVideoTexture !== true );\n\t\t\tconst allocateMemory = ( source.__currentVersion === undefined ) || ( forceUpload === true );\n\t\t\tlet levels = getMipLevels( texture, image, supportsMips );\n\n\t\t\tsetTextureParameters( 34067, texture, supportsMips );\n\n\t\t\tlet mipmaps;\n\n\t\t\tif ( isCompressed ) {\n\n\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\tstate.texStorage2D( 34067, levels, glInternalFormat, image.width, image.height );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\tmipmaps = cubeImage[ i ].mipmaps;\n\n\t\t\t\t\tfor ( let j = 0; j < mipmaps.length; j ++ ) {\n\n\t\t\t\t\t\tconst mipmap = mipmaps[ j ];\n\n\t\t\t\t\t\tif ( texture.format !== RGBAFormat ) {\n\n\t\t\t\t\t\t\tif ( glFormat !== null ) {\n\n\t\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\t\tstate.compressedTexSubImage2D( 34069 + i, j, 0, 0, mipmap.width, mipmap.height, glFormat, mipmap.data );\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tstate.compressedTexImage2D( 34069 + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data );\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\tconsole.warn( 'THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()' );\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\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tstate.texSubImage2D( 34069 + i, j, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( 34069 + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\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} else {\n\n\t\t\t\tmipmaps = texture.mipmaps;\n\n\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\t// TODO: Uniformly handle mipmap definitions\n\t\t\t\t\t// Normal textures and compressed cube textures define base level + mips with their mipmap array\n\t\t\t\t\t// Uncompressed cube textures use their mipmap array only for mips (no base level)\n\n\t\t\t\t\tif ( mipmaps.length > 0 ) levels ++;\n\n\t\t\t\t\tstate.texStorage2D( 34067, levels, glInternalFormat, cubeImage[ 0 ].width, cubeImage[ 0 ].height );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\tif ( isDataTexture ) {\n\n\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\tstate.texSubImage2D( 34069 + i, 0, 0, 0, cubeImage[ i ].width, cubeImage[ i ].height, glFormat, glType, cubeImage[ i ].data );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texImage2D( 34069 + i, 0, glInternalFormat, cubeImage[ i ].width, cubeImage[ i ].height, 0, glFormat, glType, cubeImage[ i ].data );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfor ( let j = 0; j < mipmaps.length; j ++ ) {\n\n\t\t\t\t\t\t\tconst mipmap = mipmaps[ j ];\n\t\t\t\t\t\t\tconst mipmapImage = mipmap.image[ i ].image;\n\n\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tstate.texSubImage2D( 34069 + i, j + 1, 0, 0, mipmapImage.width, mipmapImage.height, glFormat, glType, mipmapImage.data );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( 34069 + i, j + 1, glInternalFormat, mipmapImage.width, mipmapImage.height, 0, glFormat, glType, mipmapImage.data );\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\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\tstate.texSubImage2D( 34069 + i, 0, 0, 0, glFormat, glType, cubeImage[ i ] );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texImage2D( 34069 + i, 0, glInternalFormat, glFormat, glType, cubeImage[ i ] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfor ( let j = 0; j < mipmaps.length; j ++ ) {\n\n\t\t\t\t\t\t\tconst mipmap = mipmaps[ j ];\n\n\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tstate.texSubImage2D( 34069 + i, j + 1, 0, 0, glFormat, glType, mipmap.image[ i ] );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( 34069 + i, j + 1, glInternalFormat, glFormat, glType, mipmap.image[ i ] );\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\tif ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) {\n\n\t\t\t\t// We assume images for cube map have the same size.\n\t\t\t\tgenerateMipmap( 34067 );\n\n\t\t\t}\n\n\t\t\tsource.__currentVersion = source.version;\n\n\t\t\tif ( texture.onUpdate ) texture.onUpdate( texture );\n\n\t\t}\n\n\t\ttextureProperties.__version = texture.version;\n\n\t}\n\n\t// Render targets\n\n\t// Setup storage for target texture and bind it to correct framebuffer\n\tfunction setupFrameBufferTexture( framebuffer, renderTarget, texture, attachment, textureTarget ) {\n\n\t\tconst glFormat = utils.convert( texture.format, texture.encoding );\n\t\tconst glType = utils.convert( texture.type );\n\t\tconst glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.encoding );\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\tif ( ! renderTargetProperties.__hasExternalTextures ) {\n\n\t\t\tif ( textureTarget === 32879 || textureTarget === 35866 ) {\n\n\t\t\t\tstate.texImage3D( textureTarget, 0, glInternalFormat, renderTarget.width, renderTarget.height, renderTarget.depth, 0, glFormat, glType, null );\n\n\t\t\t} else {\n\n\t\t\t\tstate.texImage2D( textureTarget, 0, glInternalFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null );\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.bindFramebuffer( 36160, framebuffer );\n\n\t\tif ( useMultisampledRTT( renderTarget ) ) {\n\n\t\t\tmultisampledRTTExt.framebufferTexture2DMultisampleEXT( 36160, attachment, textureTarget, properties.get( texture ).__webglTexture, 0, getRenderTargetSamples( renderTarget ) );\n\n\t\t} else {\n\n\t\t\t_gl.framebufferTexture2D( 36160, attachment, textureTarget, properties.get( texture ).__webglTexture, 0 );\n\n\t\t}\n\n\t\tstate.bindFramebuffer( 36160, null );\n\n\t}\n\n\n\t// Setup storage for internal depth/stencil buffers and bind to correct framebuffer\n\tfunction setupRenderBufferStorage( renderbuffer, renderTarget, isMultisample ) {\n\n\t\t_gl.bindRenderbuffer( 36161, renderbuffer );\n\n\t\tif ( renderTarget.depthBuffer && ! renderTarget.stencilBuffer ) {\n\n\t\t\tlet glInternalFormat = 33189;\n\n\t\t\tif ( isMultisample || useMultisampledRTT( renderTarget ) ) {\n\n\t\t\t\tconst depthTexture = renderTarget.depthTexture;\n\n\t\t\t\tif ( depthTexture && depthTexture.isDepthTexture ) {\n\n\t\t\t\t\tif ( depthTexture.type === FloatType ) {\n\n\t\t\t\t\t\tglInternalFormat = 36012;\n\n\t\t\t\t\t} else if ( depthTexture.type === UnsignedIntType ) {\n\n\t\t\t\t\t\tglInternalFormat = 33190;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tconst samples = getRenderTargetSamples( renderTarget );\n\n\t\t\t\tif ( useMultisampledRTT( renderTarget ) ) {\n\n\t\t\t\t\tmultisampledRTTExt.renderbufferStorageMultisampleEXT( 36161, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_gl.renderbufferStorageMultisample( 36161, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t_gl.renderbufferStorage( 36161, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t}\n\n\t\t\t_gl.framebufferRenderbuffer( 36160, 36096, 36161, renderbuffer );\n\n\t\t} else if ( renderTarget.depthBuffer && renderTarget.stencilBuffer ) {\n\n\t\t\tconst samples = getRenderTargetSamples( renderTarget );\n\n\t\t\tif ( isMultisample && useMultisampledRTT( renderTarget ) === false ) {\n\n\t\t\t\t_gl.renderbufferStorageMultisample( 36161, samples, 35056, renderTarget.width, renderTarget.height );\n\n\t\t\t} else if ( useMultisampledRTT( renderTarget ) ) {\n\n\t\t\t\tmultisampledRTTExt.renderbufferStorageMultisampleEXT( 36161, samples, 35056, renderTarget.width, renderTarget.height );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.renderbufferStorage( 36161, 34041, renderTarget.width, renderTarget.height );\n\n\t\t\t}\n\n\n\t\t\t_gl.framebufferRenderbuffer( 36160, 33306, 36161, renderbuffer );\n\n\t\t} else {\n\n\t\t\tconst textures = renderTarget.isWebGLMultipleRenderTargets === true ? renderTarget.texture : [ renderTarget.texture ];\n\n\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\tconst texture = textures[ i ];\n\n\t\t\t\tconst glFormat = utils.convert( texture.format, texture.encoding );\n\t\t\t\tconst glType = utils.convert( texture.type );\n\t\t\t\tconst glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.encoding );\n\t\t\t\tconst samples = getRenderTargetSamples( renderTarget );\n\n\t\t\t\tif ( isMultisample && useMultisampledRTT( renderTarget ) === false ) {\n\n\t\t\t\t\t_gl.renderbufferStorageMultisample( 36161, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t} else if ( useMultisampledRTT( renderTarget ) ) {\n\n\t\t\t\t\tmultisampledRTTExt.renderbufferStorageMultisampleEXT( 36161, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_gl.renderbufferStorage( 36161, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t_gl.bindRenderbuffer( 36161, null );\n\n\t}\n\n\t// Setup resources for a Depth Texture for a FBO (needs an extension)\n\tfunction setupDepthTexture( framebuffer, renderTarget ) {\n\n\t\tconst isCube = ( renderTarget && renderTarget.isWebGLCubeRenderTarget );\n\t\tif ( isCube ) throw new Error( 'Depth Texture with cube render targets is not supported' );\n\n\t\tstate.bindFramebuffer( 36160, framebuffer );\n\n\t\tif ( ! ( renderTarget.depthTexture && renderTarget.depthTexture.isDepthTexture ) ) {\n\n\t\t\tthrow new Error( 'renderTarget.depthTexture must be an instance of THREE.DepthTexture' );\n\n\t\t}\n\n\t\t// upload an empty depth texture with framebuffer size\n\t\tif ( ! properties.get( renderTarget.depthTexture ).__webglTexture ||\n\t\t\t\trenderTarget.depthTexture.image.width !== renderTarget.width ||\n\t\t\t\trenderTarget.depthTexture.image.height !== renderTarget.height ) {\n\n\t\t\trenderTarget.depthTexture.image.width = renderTarget.width;\n\t\t\trenderTarget.depthTexture.image.height = renderTarget.height;\n\t\t\trenderTarget.depthTexture.needsUpdate = true;\n\n\t\t}\n\n\t\tsetTexture2D( renderTarget.depthTexture, 0 );\n\n\t\tconst webglDepthTexture = properties.get( renderTarget.depthTexture ).__webglTexture;\n\t\tconst samples = getRenderTargetSamples( renderTarget );\n\n\t\tif ( renderTarget.depthTexture.format === DepthFormat ) {\n\n\t\t\tif ( useMultisampledRTT( renderTarget ) ) {\n\n\t\t\t\tmultisampledRTTExt.framebufferTexture2DMultisampleEXT( 36160, 36096, 3553, webglDepthTexture, 0, samples );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.framebufferTexture2D( 36160, 36096, 3553, webglDepthTexture, 0 );\n\n\t\t\t}\n\n\t\t} else if ( renderTarget.depthTexture.format === DepthStencilFormat ) {\n\n\t\t\tif ( useMultisampledRTT( renderTarget ) ) {\n\n\t\t\t\tmultisampledRTTExt.framebufferTexture2DMultisampleEXT( 36160, 33306, 3553, webglDepthTexture, 0, samples );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.framebufferTexture2D( 36160, 33306, 3553, webglDepthTexture, 0 );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'Unknown depthTexture format' );\n\n\t\t}\n\n\t}\n\n\t// Setup GL resources for a non-texture depth buffer\n\tfunction setupDepthRenderbuffer( renderTarget ) {\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\tconst isCube = ( renderTarget.isWebGLCubeRenderTarget === true );\n\n\t\tif ( renderTarget.depthTexture && ! renderTargetProperties.__autoAllocateDepthBuffer ) {\n\n\t\t\tif ( isCube ) throw new Error( 'target.depthTexture not supported in Cube render targets' );\n\n\t\t\tsetupDepthTexture( renderTargetProperties.__webglFramebuffer, renderTarget );\n\n\t\t} else {\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\trenderTargetProperties.__webglDepthbuffer = [];\n\n\t\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\tstate.bindFramebuffer( 36160, renderTargetProperties.__webglFramebuffer[ i ] );\n\t\t\t\t\trenderTargetProperties.__webglDepthbuffer[ i ] = _gl.createRenderbuffer();\n\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer[ i ], renderTarget, false );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tstate.bindFramebuffer( 36160, renderTargetProperties.__webglFramebuffer );\n\t\t\t\trenderTargetProperties.__webglDepthbuffer = _gl.createRenderbuffer();\n\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer, renderTarget, false );\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.bindFramebuffer( 36160, null );\n\n\t}\n\n\t// rebind framebuffer with external textures\n\tfunction rebindTextures( renderTarget, colorTexture, depthTexture ) {\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\tif ( colorTexture !== undefined ) {\n\n\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, renderTarget.texture, 36064, 3553 );\n\n\t\t}\n\n\t\tif ( depthTexture !== undefined ) {\n\n\t\t\tsetupDepthRenderbuffer( renderTarget );\n\n\t\t}\n\n\t}\n\n\t// Set up GL resources for the render target\n\tfunction setupRenderTarget( renderTarget ) {\n\n\t\tconst texture = renderTarget.texture;\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\tconst textureProperties = properties.get( texture );\n\n\t\trenderTarget.addEventListener( 'dispose', onRenderTargetDispose );\n\n\t\tif ( renderTarget.isWebGLMultipleRenderTargets !== true ) {\n\n\t\t\tif ( textureProperties.__webglTexture === undefined ) {\n\n\t\t\t\ttextureProperties.__webglTexture = _gl.createTexture();\n\n\t\t\t}\n\n\t\t\ttextureProperties.__version = texture.version;\n\t\t\tinfo.memory.textures ++;\n\n\t\t}\n\n\t\tconst isCube = ( renderTarget.isWebGLCubeRenderTarget === true );\n\t\tconst isMultipleRenderTargets = ( renderTarget.isWebGLMultipleRenderTargets === true );\n\t\tconst supportsMips = isPowerOfTwo$1( renderTarget ) || isWebGL2;\n\n\t\t// Setup framebuffer\n\n\t\tif ( isCube ) {\n\n\t\t\trenderTargetProperties.__webglFramebuffer = [];\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\trenderTargetProperties.__webglFramebuffer[ i ] = _gl.createFramebuffer();\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\trenderTargetProperties.__webglFramebuffer = _gl.createFramebuffer();\n\n\t\t\tif ( isMultipleRenderTargets ) {\n\n\t\t\t\tif ( capabilities.drawBuffers ) {\n\n\t\t\t\t\tconst textures = renderTarget.texture;\n\n\t\t\t\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tconst attachmentProperties = properties.get( textures[ i ] );\n\n\t\t\t\t\t\tif ( attachmentProperties.__webglTexture === undefined ) {\n\n\t\t\t\t\t\t\tattachmentProperties.__webglTexture = _gl.createTexture();\n\n\t\t\t\t\t\t\tinfo.memory.textures ++;\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\tconsole.warn( 'THREE.WebGLRenderer: WebGLMultipleRenderTargets can only be used with WebGL2 or WEBGL_draw_buffers extension.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( ( isWebGL2 && renderTarget.samples > 0 ) && useMultisampledRTT( renderTarget ) === false ) {\n\n\t\t\t\tconst textures = isMultipleRenderTargets ? texture : [ texture ];\n\n\t\t\t\trenderTargetProperties.__webglMultisampledFramebuffer = _gl.createFramebuffer();\n\t\t\t\trenderTargetProperties.__webglColorRenderbuffer = [];\n\n\t\t\t\tstate.bindFramebuffer( 36160, renderTargetProperties.__webglMultisampledFramebuffer );\n\n\t\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\t\tconst texture = textures[ i ];\n\t\t\t\t\trenderTargetProperties.__webglColorRenderbuffer[ i ] = _gl.createRenderbuffer();\n\n\t\t\t\t\t_gl.bindRenderbuffer( 36161, renderTargetProperties.__webglColorRenderbuffer[ i ] );\n\n\t\t\t\t\tconst glFormat = utils.convert( texture.format, texture.encoding );\n\t\t\t\t\tconst glType = utils.convert( texture.type );\n\t\t\t\t\tconst glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.encoding );\n\t\t\t\t\tconst samples = getRenderTargetSamples( renderTarget );\n\t\t\t\t\t_gl.renderbufferStorageMultisample( 36161, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t\t_gl.framebufferRenderbuffer( 36160, 36064 + i, 36161, renderTargetProperties.__webglColorRenderbuffer[ i ] );\n\n\t\t\t\t}\n\n\t\t\t\t_gl.bindRenderbuffer( 36161, null );\n\n\t\t\t\tif ( renderTarget.depthBuffer ) {\n\n\t\t\t\t\trenderTargetProperties.__webglDepthRenderbuffer = _gl.createRenderbuffer();\n\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthRenderbuffer, renderTarget, true );\n\n\t\t\t\t}\n\n\t\t\t\tstate.bindFramebuffer( 36160, null );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Setup color buffer\n\n\t\tif ( isCube ) {\n\n\t\t\tstate.bindTexture( 34067, textureProperties.__webglTexture );\n\t\t\tsetTextureParameters( 34067, texture, supportsMips );\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ], renderTarget, texture, 36064, 34069 + i );\n\n\t\t\t}\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) {\n\n\t\t\t\tgenerateMipmap( 34067 );\n\n\t\t\t}\n\n\t\t\tstate.unbindTexture();\n\n\t\t} else if ( isMultipleRenderTargets ) {\n\n\t\t\tconst textures = renderTarget.texture;\n\n\t\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\t\tconst attachment = textures[ i ];\n\t\t\t\tconst attachmentProperties = properties.get( attachment );\n\n\t\t\t\tstate.bindTexture( 3553, attachmentProperties.__webglTexture );\n\t\t\t\tsetTextureParameters( 3553, attachment, supportsMips );\n\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, attachment, 36064 + i, 3553 );\n\n\t\t\t\tif ( textureNeedsGenerateMipmaps( attachment, supportsMips ) ) {\n\n\t\t\t\t\tgenerateMipmap( 3553 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tstate.unbindTexture();\n\n\t\t} else {\n\n\t\t\tlet glTextureType = 3553;\n\n\t\t\tif ( renderTarget.isWebGL3DRenderTarget || renderTarget.isWebGLArrayRenderTarget ) {\n\n\t\t\t\tif ( isWebGL2 ) {\n\n\t\t\t\t\tglTextureType = renderTarget.isWebGL3DRenderTarget ? 32879 : 35866;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( 'THREE.WebGLTextures: THREE.Data3DTexture and THREE.DataArrayTexture only supported with WebGL2.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tstate.bindTexture( glTextureType, textureProperties.__webglTexture );\n\t\t\tsetTextureParameters( glTextureType, texture, supportsMips );\n\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, texture, 36064, glTextureType );\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) {\n\n\t\t\t\tgenerateMipmap( glTextureType );\n\n\t\t\t}\n\n\t\t\tstate.unbindTexture();\n\n\t\t}\n\n\t\t// Setup depth and stencil buffers\n\n\t\tif ( renderTarget.depthBuffer ) {\n\n\t\t\tsetupDepthRenderbuffer( renderTarget );\n\n\t\t}\n\n\t}\n\n\tfunction updateRenderTargetMipmap( renderTarget ) {\n\n\t\tconst supportsMips = isPowerOfTwo$1( renderTarget ) || isWebGL2;\n\n\t\tconst textures = renderTarget.isWebGLMultipleRenderTargets === true ? renderTarget.texture : [ renderTarget.texture ];\n\n\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\tconst texture = textures[ i ];\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) {\n\n\t\t\t\tconst target = renderTarget.isWebGLCubeRenderTarget ? 34067 : 3553;\n\t\t\t\tconst webglTexture = properties.get( texture ).__webglTexture;\n\n\t\t\t\tstate.bindTexture( target, webglTexture );\n\t\t\t\tgenerateMipmap( target );\n\t\t\t\tstate.unbindTexture();\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction updateMultisampleRenderTarget( renderTarget ) {\n\n\t\tif ( ( isWebGL2 && renderTarget.samples > 0 ) && useMultisampledRTT( renderTarget ) === false ) {\n\n\t\t\tconst textures = renderTarget.isWebGLMultipleRenderTargets ? renderTarget.texture : [ renderTarget.texture ];\n\t\t\tconst width = renderTarget.width;\n\t\t\tconst height = renderTarget.height;\n\t\t\tlet mask = 16384;\n\t\t\tconst invalidationArray = [];\n\t\t\tconst depthStyle = renderTarget.stencilBuffer ? 33306 : 36096;\n\t\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\t\tconst isMultipleRenderTargets = ( renderTarget.isWebGLMultipleRenderTargets === true );\n\n\t\t\t// If MRT we need to remove FBO attachments\n\t\t\tif ( isMultipleRenderTargets ) {\n\n\t\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\t\tstate.bindFramebuffer( 36160, renderTargetProperties.__webglMultisampledFramebuffer );\n\t\t\t\t\t_gl.framebufferRenderbuffer( 36160, 36064 + i, 36161, null );\n\n\t\t\t\t\tstate.bindFramebuffer( 36160, renderTargetProperties.__webglFramebuffer );\n\t\t\t\t\t_gl.framebufferTexture2D( 36009, 36064 + i, 3553, null, 0 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tstate.bindFramebuffer( 36008, renderTargetProperties.__webglMultisampledFramebuffer );\n\t\t\tstate.bindFramebuffer( 36009, renderTargetProperties.__webglFramebuffer );\n\n\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\tinvalidationArray.push( 36064 + i );\n\n\t\t\t\tif ( renderTarget.depthBuffer ) {\n\n\t\t\t\t\tinvalidationArray.push( depthStyle );\n\n\t\t\t\t}\n\n\t\t\t\tconst ignoreDepthValues = ( renderTargetProperties.__ignoreDepthValues !== undefined ) ? renderTargetProperties.__ignoreDepthValues : false;\n\n\t\t\t\tif ( ignoreDepthValues === false ) {\n\n\t\t\t\t\tif ( renderTarget.depthBuffer ) mask |= 256;\n\t\t\t\t\tif ( renderTarget.stencilBuffer ) mask |= 1024;\n\n\t\t\t\t}\n\n\t\t\t\tif ( isMultipleRenderTargets ) {\n\n\t\t\t\t\t_gl.framebufferRenderbuffer( 36008, 36064, 36161, renderTargetProperties.__webglColorRenderbuffer[ i ] );\n\n\t\t\t\t}\n\n\t\t\t\tif ( ignoreDepthValues === true ) {\n\n\t\t\t\t\t_gl.invalidateFramebuffer( 36008, [ depthStyle ] );\n\t\t\t\t\t_gl.invalidateFramebuffer( 36009, [ depthStyle ] );\n\n\t\t\t\t}\n\n\t\t\t\tif ( isMultipleRenderTargets ) {\n\n\t\t\t\t\tconst webglTexture = properties.get( textures[ i ] ).__webglTexture;\n\t\t\t\t\t_gl.framebufferTexture2D( 36009, 36064, 3553, webglTexture, 0 );\n\n\t\t\t\t}\n\n\t\t\t\t_gl.blitFramebuffer( 0, 0, width, height, 0, 0, width, height, mask, 9728 );\n\n\t\t\t\tif ( supportsInvalidateFramebuffer ) {\n\n\t\t\t\t\t_gl.invalidateFramebuffer( 36008, invalidationArray );\n\n\t\t\t\t}\n\n\n\t\t\t}\n\n\t\t\tstate.bindFramebuffer( 36008, null );\n\t\t\tstate.bindFramebuffer( 36009, null );\n\n\t\t\t// If MRT since pre-blit we removed the FBO we need to reconstruct the attachments\n\t\t\tif ( isMultipleRenderTargets ) {\n\n\t\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\t\tstate.bindFramebuffer( 36160, renderTargetProperties.__webglMultisampledFramebuffer );\n\t\t\t\t\t_gl.framebufferRenderbuffer( 36160, 36064 + i, 36161, renderTargetProperties.__webglColorRenderbuffer[ i ] );\n\n\t\t\t\t\tconst webglTexture = properties.get( textures[ i ] ).__webglTexture;\n\n\t\t\t\t\tstate.bindFramebuffer( 36160, renderTargetProperties.__webglFramebuffer );\n\t\t\t\t\t_gl.framebufferTexture2D( 36009, 36064 + i, 3553, webglTexture, 0 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tstate.bindFramebuffer( 36009, renderTargetProperties.__webglMultisampledFramebuffer );\n\n\t\t}\n\n\t}\n\n\tfunction getRenderTargetSamples( renderTarget ) {\n\n\t\treturn Math.min( maxSamples, renderTarget.samples );\n\n\t}\n\n\tfunction useMultisampledRTT( renderTarget ) {\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\treturn isWebGL2 && renderTarget.samples > 0 && extensions.has( 'WEBGL_multisampled_render_to_texture' ) === true && renderTargetProperties.__useRenderToTexture !== false;\n\n\t}\n\n\tfunction updateVideoTexture( texture ) {\n\n\t\tconst frame = info.render.frame;\n\n\t\t// Check the last frame we updated the VideoTexture\n\n\t\tif ( _videoTextures.get( texture ) !== frame ) {\n\n\t\t\t_videoTextures.set( texture, frame );\n\t\t\ttexture.update();\n\n\t\t}\n\n\t}\n\n\tfunction verifyColorSpace( texture, image ) {\n\n\t\tconst encoding = texture.encoding;\n\t\tconst format = texture.format;\n\t\tconst type = texture.type;\n\n\t\tif ( texture.isCompressedTexture === true || texture.isVideoTexture === true || texture.format === _SRGBAFormat ) return image;\n\n\t\tif ( encoding !== LinearEncoding ) {\n\n\t\t\t// sRGB\n\n\t\t\tif ( encoding === sRGBEncoding ) {\n\n\t\t\t\tif ( isWebGL2 === false ) {\n\n\t\t\t\t\t// in WebGL 1, try to use EXT_sRGB extension and unsized formats\n\n\t\t\t\t\tif ( extensions.has( 'EXT_sRGB' ) === true && format === RGBAFormat ) {\n\n\t\t\t\t\t\ttexture.format = _SRGBAFormat;\n\n\t\t\t\t\t\t// it's not possible to generate mips in WebGL 1 with this extension\n\n\t\t\t\t\t\ttexture.minFilter = LinearFilter;\n\t\t\t\t\t\ttexture.generateMipmaps = false;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// slow fallback (CPU decode)\n\n\t\t\t\t\t\timage = ImageUtils.sRGBToLinear( image );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// in WebGL 2 uncompressed textures can only be sRGB encoded if they have the RGBA8 format\n\n\t\t\t\t\tif ( format !== RGBAFormat || type !== UnsignedByteType ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.WebGLTextures: sRGB encoded textures have to use RGBAFormat and UnsignedByteType.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( 'THREE.WebGLTextures: Unsupported texture encoding:', encoding );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn image;\n\n\t}\n\n\t//\n\n\tthis.allocateTextureUnit = allocateTextureUnit;\n\tthis.resetTextureUnits = resetTextureUnits;\n\n\tthis.setTexture2D = setTexture2D;\n\tthis.setTexture2DArray = setTexture2DArray;\n\tthis.setTexture3D = setTexture3D;\n\tthis.setTextureCube = setTextureCube;\n\tthis.rebindTextures = rebindTextures;\n\tthis.setupRenderTarget = setupRenderTarget;\n\tthis.updateRenderTargetMipmap = updateRenderTargetMipmap;\n\tthis.updateMultisampleRenderTarget = updateMultisampleRenderTarget;\n\tthis.setupDepthRenderbuffer = setupDepthRenderbuffer;\n\tthis.setupFrameBufferTexture = setupFrameBufferTexture;\n\tthis.useMultisampledRTT = useMultisampledRTT;\n\n}\n\nfunction WebGLUtils( gl, extensions, capabilities ) {\n\n\tconst isWebGL2 = capabilities.isWebGL2;\n\n\tfunction convert( p, encoding = null ) {\n\n\t\tlet extension;\n\n\t\tif ( p === UnsignedByteType ) return 5121;\n\t\tif ( p === UnsignedShort4444Type ) return 32819;\n\t\tif ( p === UnsignedShort5551Type ) return 32820;\n\n\t\tif ( p === ByteType ) return 5120;\n\t\tif ( p === ShortType ) return 5122;\n\t\tif ( p === UnsignedShortType ) return 5123;\n\t\tif ( p === IntType ) return 5124;\n\t\tif ( p === UnsignedIntType ) return 5125;\n\t\tif ( p === FloatType ) return 5126;\n\n\t\tif ( p === HalfFloatType ) {\n\n\t\t\tif ( isWebGL2 ) return 5131;\n\n\t\t\textension = extensions.get( 'OES_texture_half_float' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\treturn extension.HALF_FLOAT_OES;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( p === AlphaFormat ) return 6406;\n\t\tif ( p === RGBAFormat ) return 6408;\n\t\tif ( p === LuminanceFormat ) return 6409;\n\t\tif ( p === LuminanceAlphaFormat ) return 6410;\n\t\tif ( p === DepthFormat ) return 6402;\n\t\tif ( p === DepthStencilFormat ) return 34041;\n\t\tif ( p === RedFormat ) return 6403;\n\n\t\tif ( p === RGBFormat ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: THREE.RGBFormat has been removed. Use THREE.RGBAFormat instead. https://github.com/mrdoob/three.js/pull/23228' );\n\t\t\treturn 6408;\n\n\t\t}\n\n\t\t// WebGL 1 sRGB fallback\n\n\t\tif ( p === _SRGBAFormat ) {\n\n\t\t\textension = extensions.get( 'EXT_sRGB' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\treturn extension.SRGB_ALPHA_EXT;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// WebGL2 formats.\n\n\t\tif ( p === RedIntegerFormat ) return 36244;\n\t\tif ( p === RGFormat ) return 33319;\n\t\tif ( p === RGIntegerFormat ) return 33320;\n\t\tif ( p === RGBAIntegerFormat ) return 36249;\n\n\t\t// S3TC\n\n\t\tif ( p === RGB_S3TC_DXT1_Format || p === RGBA_S3TC_DXT1_Format || p === RGBA_S3TC_DXT3_Format || p === RGBA_S3TC_DXT5_Format ) {\n\n\t\t\tif ( encoding === sRGBEncoding ) {\n\n\t\t\t\textension = extensions.get( 'WEBGL_compressed_texture_s3tc_srgb' );\n\n\t\t\t\tif ( extension !== null ) {\n\n\t\t\t\t\tif ( p === RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_SRGB_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT;\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} else {\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} else {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// PVRTC\n\n\t\tif ( p === RGB_PVRTC_4BPPV1_Format || p === RGB_PVRTC_2BPPV1_Format || p === RGBA_PVRTC_4BPPV1_Format || p === RGBA_PVRTC_2BPPV1_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_pvrtc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGB_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;\n\t\t\t\tif ( p === RGB_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;\n\t\t\t\tif ( p === RGBA_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;\n\t\t\t\tif ( p === RGBA_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// ETC1\n\n\t\tif ( p === RGB_ETC1_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_etc1' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\treturn extension.COMPRESSED_RGB_ETC1_WEBGL;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// ETC2\n\n\t\tif ( p === RGB_ETC2_Format || p === RGBA_ETC2_EAC_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_etc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGB_ETC2_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ETC2 : extension.COMPRESSED_RGB8_ETC2;\n\t\t\t\tif ( p === RGBA_ETC2_EAC_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC : extension.COMPRESSED_RGBA8_ETC2_EAC;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// ASTC\n\n\t\tif ( p === RGBA_ASTC_4x4_Format || p === RGBA_ASTC_5x4_Format || p === RGBA_ASTC_5x5_Format ||\n\t\t\tp === RGBA_ASTC_6x5_Format || p === RGBA_ASTC_6x6_Format || p === RGBA_ASTC_8x5_Format ||\n\t\t\tp === RGBA_ASTC_8x6_Format || p === RGBA_ASTC_8x8_Format || p === RGBA_ASTC_10x5_Format ||\n\t\t\tp === RGBA_ASTC_10x6_Format || p === RGBA_ASTC_10x8_Format || p === RGBA_ASTC_10x10_Format ||\n\t\t\tp === RGBA_ASTC_12x10_Format || p === RGBA_ASTC_12x12_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_astc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGBA_ASTC_4x4_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR : extension.COMPRESSED_RGBA_ASTC_4x4_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_5x4_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR : extension.COMPRESSED_RGBA_ASTC_5x4_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_5x5_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR : extension.COMPRESSED_RGBA_ASTC_5x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_6x5_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR : extension.COMPRESSED_RGBA_ASTC_6x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_6x6_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR : extension.COMPRESSED_RGBA_ASTC_6x6_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_8x5_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR : extension.COMPRESSED_RGBA_ASTC_8x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_8x6_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR : extension.COMPRESSED_RGBA_ASTC_8x6_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_8x8_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR : extension.COMPRESSED_RGBA_ASTC_8x8_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x5_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR : extension.COMPRESSED_RGBA_ASTC_10x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x6_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR : extension.COMPRESSED_RGBA_ASTC_10x6_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x8_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR : extension.COMPRESSED_RGBA_ASTC_10x8_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x10_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR : extension.COMPRESSED_RGBA_ASTC_10x10_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_12x10_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR : extension.COMPRESSED_RGBA_ASTC_12x10_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_12x12_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR : extension.COMPRESSED_RGBA_ASTC_12x12_KHR;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// BPTC\n\n\t\tif ( p === RGBA_BPTC_Format ) {\n\n\t\t\textension = extensions.get( 'EXT_texture_compression_bptc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGBA_BPTC_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT : extension.COMPRESSED_RGBA_BPTC_UNORM_EXT;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tif ( p === UnsignedInt248Type ) {\n\n\t\t\tif ( isWebGL2 ) return 34042;\n\n\t\t\textension = extensions.get( 'WEBGL_depth_texture' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\treturn extension.UNSIGNED_INT_24_8_WEBGL;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// if \"p\" can't be resolved, assume the user defines a WebGL constant as a string (fallback/workaround for packed RGB formats)\n\n\t\treturn ( gl[ p ] !== undefined ) ? gl[ p ] : null;\n\n\t}\n\n\treturn { convert: convert };\n\n}\n\nclass ArrayCamera extends PerspectiveCamera {\n\n\tconstructor( array = [] ) {\n\n\t\tsuper();\n\n\t\tthis.isArrayCamera = true;\n\n\t\tthis.cameras = array;\n\n\t}\n\n}\n\nclass Group extends Object3D {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.isGroup = true;\n\n\t\tthis.type = 'Group';\n\n\t}\n\n}\n\nconst _moveEvent = { type: 'move' };\n\nclass WebXRController {\n\n\tconstructor() {\n\n\t\tthis._targetRay = null;\n\t\tthis._grip = null;\n\t\tthis._hand = null;\n\n\t}\n\n\tgetHandSpace() {\n\n\t\tif ( this._hand === null ) {\n\n\t\t\tthis._hand = new Group();\n\t\t\tthis._hand.matrixAutoUpdate = false;\n\t\t\tthis._hand.visible = false;\n\n\t\t\tthis._hand.joints = {};\n\t\t\tthis._hand.inputState = { pinching: false };\n\n\t\t}\n\n\t\treturn this._hand;\n\n\t}\n\n\tgetTargetRaySpace() {\n\n\t\tif ( this._targetRay === null ) {\n\n\t\t\tthis._targetRay = new Group();\n\t\t\tthis._targetRay.matrixAutoUpdate = false;\n\t\t\tthis._targetRay.visible = false;\n\t\t\tthis._targetRay.hasLinearVelocity = false;\n\t\t\tthis._targetRay.linearVelocity = new Vector3();\n\t\t\tthis._targetRay.hasAngularVelocity = false;\n\t\t\tthis._targetRay.angularVelocity = new Vector3();\n\n\t\t}\n\n\t\treturn this._targetRay;\n\n\t}\n\n\tgetGripSpace() {\n\n\t\tif ( this._grip === null ) {\n\n\t\t\tthis._grip = new Group();\n\t\t\tthis._grip.matrixAutoUpdate = false;\n\t\t\tthis._grip.visible = false;\n\t\t\tthis._grip.hasLinearVelocity = false;\n\t\t\tthis._grip.linearVelocity = new Vector3();\n\t\t\tthis._grip.hasAngularVelocity = false;\n\t\t\tthis._grip.angularVelocity = new Vector3();\n\n\t\t}\n\n\t\treturn this._grip;\n\n\t}\n\n\tdispatchEvent( event ) {\n\n\t\tif ( this._targetRay !== null ) {\n\n\t\t\tthis._targetRay.dispatchEvent( event );\n\n\t\t}\n\n\t\tif ( this._grip !== null ) {\n\n\t\t\tthis._grip.dispatchEvent( event );\n\n\t\t}\n\n\t\tif ( this._hand !== null ) {\n\n\t\t\tthis._hand.dispatchEvent( event );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tdisconnect( inputSource ) {\n\n\t\tthis.dispatchEvent( { type: 'disconnected', data: inputSource } );\n\n\t\tif ( this._targetRay !== null ) {\n\n\t\t\tthis._targetRay.visible = false;\n\n\t\t}\n\n\t\tif ( this._grip !== null ) {\n\n\t\t\tthis._grip.visible = false;\n\n\t\t}\n\n\t\tif ( this._hand !== null ) {\n\n\t\t\tthis._hand.visible = false;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tupdate( inputSource, frame, referenceSpace ) {\n\n\t\tlet inputPose = null;\n\t\tlet gripPose = null;\n\t\tlet handPose = null;\n\n\t\tconst targetRay = this._targetRay;\n\t\tconst grip = this._grip;\n\t\tconst hand = this._hand;\n\n\t\tif ( inputSource && frame.session.visibilityState !== 'visible-blurred' ) {\n\n\t\t\tif ( hand && inputSource.hand ) {\n\n\t\t\t\thandPose = true;\n\n\t\t\t\tfor ( const inputjoint of inputSource.hand.values() ) {\n\n\t\t\t\t\t// Update the joints groups with the XRJoint poses\n\t\t\t\t\tconst jointPose = frame.getJointPose( inputjoint, referenceSpace );\n\n\t\t\t\t\tif ( hand.joints[ inputjoint.jointName ] === undefined ) {\n\n\t\t\t\t\t\t// The transform of this joint will be updated with the joint pose on each frame\n\t\t\t\t\t\tconst joint = new Group();\n\t\t\t\t\t\tjoint.matrixAutoUpdate = false;\n\t\t\t\t\t\tjoint.visible = false;\n\t\t\t\t\t\thand.joints[ inputjoint.jointName ] = joint;\n\t\t\t\t\t\t// ??\n\t\t\t\t\t\thand.add( joint );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst joint = hand.joints[ inputjoint.jointName ];\n\n\t\t\t\t\tif ( jointPose !== null ) {\n\n\t\t\t\t\t\tjoint.matrix.fromArray( jointPose.transform.matrix );\n\t\t\t\t\t\tjoint.matrix.decompose( joint.position, joint.rotation, joint.scale );\n\t\t\t\t\t\tjoint.jointRadius = jointPose.radius;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tjoint.visible = jointPose !== null;\n\n\t\t\t\t}\n\n\t\t\t\t// Custom events\n\n\t\t\t\t// Check pinchz\n\t\t\t\tconst indexTip = hand.joints[ 'index-finger-tip' ];\n\t\t\t\tconst thumbTip = hand.joints[ 'thumb-tip' ];\n\t\t\t\tconst distance = indexTip.position.distanceTo( thumbTip.position );\n\n\t\t\t\tconst distanceToPinch = 0.02;\n\t\t\t\tconst threshold = 0.005;\n\n\t\t\t\tif ( hand.inputState.pinching && distance > distanceToPinch + threshold ) {\n\n\t\t\t\t\thand.inputState.pinching = false;\n\t\t\t\t\tthis.dispatchEvent( {\n\t\t\t\t\t\ttype: 'pinchend',\n\t\t\t\t\t\thandedness: inputSource.handedness,\n\t\t\t\t\t\ttarget: this\n\t\t\t\t\t} );\n\n\t\t\t\t} else if ( ! hand.inputState.pinching && distance <= distanceToPinch - threshold ) {\n\n\t\t\t\t\thand.inputState.pinching = true;\n\t\t\t\t\tthis.dispatchEvent( {\n\t\t\t\t\t\ttype: 'pinchstart',\n\t\t\t\t\t\thandedness: inputSource.handedness,\n\t\t\t\t\t\ttarget: this\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( grip !== null && inputSource.gripSpace ) {\n\n\t\t\t\t\tgripPose = frame.getPose( inputSource.gripSpace, referenceSpace );\n\n\t\t\t\t\tif ( gripPose !== null ) {\n\n\t\t\t\t\t\tgrip.matrix.fromArray( gripPose.transform.matrix );\n\t\t\t\t\t\tgrip.matrix.decompose( grip.position, grip.rotation, grip.scale );\n\n\t\t\t\t\t\tif ( gripPose.linearVelocity ) {\n\n\t\t\t\t\t\t\tgrip.hasLinearVelocity = true;\n\t\t\t\t\t\t\tgrip.linearVelocity.copy( gripPose.linearVelocity );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tgrip.hasLinearVelocity = false;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( gripPose.angularVelocity ) {\n\n\t\t\t\t\t\t\tgrip.hasAngularVelocity = true;\n\t\t\t\t\t\t\tgrip.angularVelocity.copy( gripPose.angularVelocity );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tgrip.hasAngularVelocity = 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\tif ( targetRay !== null ) {\n\n\t\t\t\tinputPose = frame.getPose( inputSource.targetRaySpace, referenceSpace );\n\n\t\t\t\t// Some runtimes (namely Vive Cosmos with Vive OpenXR Runtime) have only grip space and ray space is equal to it\n\t\t\t\tif ( inputPose === null && gripPose !== null ) {\n\n\t\t\t\t\tinputPose = gripPose;\n\n\t\t\t\t}\n\n\t\t\t\tif ( inputPose !== null ) {\n\n\t\t\t\t\ttargetRay.matrix.fromArray( inputPose.transform.matrix );\n\t\t\t\t\ttargetRay.matrix.decompose( targetRay.position, targetRay.rotation, targetRay.scale );\n\n\t\t\t\t\tif ( inputPose.linearVelocity ) {\n\n\t\t\t\t\t\ttargetRay.hasLinearVelocity = true;\n\t\t\t\t\t\ttargetRay.linearVelocity.copy( inputPose.linearVelocity );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttargetRay.hasLinearVelocity = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( inputPose.angularVelocity ) {\n\n\t\t\t\t\t\ttargetRay.hasAngularVelocity = true;\n\t\t\t\t\t\ttargetRay.angularVelocity.copy( inputPose.angularVelocity );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttargetRay.hasAngularVelocity = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.dispatchEvent( _moveEvent );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t}\n\n\t\tif ( targetRay !== null ) {\n\n\t\t\ttargetRay.visible = ( inputPose !== null );\n\n\t\t}\n\n\t\tif ( grip !== null ) {\n\n\t\t\tgrip.visible = ( gripPose !== null );\n\n\t\t}\n\n\t\tif ( hand !== null ) {\n\n\t\t\thand.visible = ( handPose !== null );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass DepthTexture extends Texture {\n\n\tconstructor( 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\tif ( type === undefined && format === DepthFormat ) type = UnsignedIntType;\n\t\tif ( type === undefined && format === DepthStencilFormat ) type = UnsignedInt248Type;\n\n\t\tsuper( null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\tthis.isDepthTexture = true;\n\n\t\tthis.image = { 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.flipY = false;\n\t\tthis.generateMipmaps = false;\n\n\t}\n\n\n}\n\nclass WebXRManager extends EventDispatcher {\n\n\tconstructor( renderer, gl ) {\n\n\t\tsuper();\n\n\t\tconst scope = this;\n\n\t\tlet session = null;\n\t\tlet framebufferScaleFactor = 1.0;\n\n\t\tlet referenceSpace = null;\n\t\tlet referenceSpaceType = 'local-floor';\n\t\tlet customReferenceSpace = null;\n\n\t\tlet pose = null;\n\t\tlet glBinding = null;\n\t\tlet glProjLayer = null;\n\t\tlet glBaseLayer = null;\n\t\tlet xrFrame = null;\n\t\tconst attributes = gl.getContextAttributes();\n\t\tlet initialRenderTarget = null;\n\t\tlet newRenderTarget = null;\n\n\t\tconst controllers = [];\n\t\tconst controllerInputSources = [];\n\n\t\t//\n\n\t\tconst cameraL = new PerspectiveCamera();\n\t\tcameraL.layers.enable( 1 );\n\t\tcameraL.viewport = new Vector4();\n\n\t\tconst cameraR = new PerspectiveCamera();\n\t\tcameraR.layers.enable( 2 );\n\t\tcameraR.viewport = new Vector4();\n\n\t\tconst cameras = [ cameraL, cameraR ];\n\n\t\tconst cameraVR = new ArrayCamera();\n\t\tcameraVR.layers.enable( 1 );\n\t\tcameraVR.layers.enable( 2 );\n\n\t\tlet _currentDepthNear = null;\n\t\tlet _currentDepthFar = null;\n\n\t\t//\n\n\t\tthis.cameraAutoUpdate = true;\n\t\tthis.enabled = false;\n\n\t\tthis.isPresenting = false;\n\n\t\tthis.getController = function ( index ) {\n\n\t\t\tlet controller = controllers[ index ];\n\n\t\t\tif ( controller === undefined ) {\n\n\t\t\t\tcontroller = new WebXRController();\n\t\t\t\tcontrollers[ index ] = controller;\n\n\t\t\t}\n\n\t\t\treturn controller.getTargetRaySpace();\n\n\t\t};\n\n\t\tthis.getControllerGrip = function ( index ) {\n\n\t\t\tlet controller = controllers[ index ];\n\n\t\t\tif ( controller === undefined ) {\n\n\t\t\t\tcontroller = new WebXRController();\n\t\t\t\tcontrollers[ index ] = controller;\n\n\t\t\t}\n\n\t\t\treturn controller.getGripSpace();\n\n\t\t};\n\n\t\tthis.getHand = function ( index ) {\n\n\t\t\tlet controller = controllers[ index ];\n\n\t\t\tif ( controller === undefined ) {\n\n\t\t\t\tcontroller = new WebXRController();\n\t\t\t\tcontrollers[ index ] = controller;\n\n\t\t\t}\n\n\t\t\treturn controller.getHandSpace();\n\n\t\t};\n\n\t\t//\n\n\t\tfunction onSessionEvent( event ) {\n\n\t\t\tconst controllerIndex = controllerInputSources.indexOf( event.inputSource );\n\n\t\t\tif ( controllerIndex === - 1 ) {\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tconst controller = controllers[ controllerIndex ];\n\n\t\t\tif ( controller !== undefined ) {\n\n\t\t\t\tcontroller.dispatchEvent( { type: event.type, data: event.inputSource } );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onSessionEnd() {\n\n\t\t\tsession.removeEventListener( 'select', onSessionEvent );\n\t\t\tsession.removeEventListener( 'selectstart', onSessionEvent );\n\t\t\tsession.removeEventListener( 'selectend', onSessionEvent );\n\t\t\tsession.removeEventListener( 'squeeze', onSessionEvent );\n\t\t\tsession.removeEventListener( 'squeezestart', onSessionEvent );\n\t\t\tsession.removeEventListener( 'squeezeend', onSessionEvent );\n\t\t\tsession.removeEventListener( 'end', onSessionEnd );\n\t\t\tsession.removeEventListener( 'inputsourceschange', onInputSourcesChange );\n\n\t\t\tfor ( let i = 0; i < controllers.length; i ++ ) {\n\n\t\t\t\tconst inputSource = controllerInputSources[ i ];\n\n\t\t\t\tif ( inputSource === null ) continue;\n\n\t\t\t\tcontrollerInputSources[ i ] = null;\n\n\t\t\t\tcontrollers[ i ].disconnect( inputSource );\n\n\t\t\t}\n\n\t\t\t_currentDepthNear = null;\n\t\t\t_currentDepthFar = null;\n\n\t\t\t// restore framebuffer/rendering state\n\n\t\t\trenderer.setRenderTarget( initialRenderTarget );\n\n\t\t\tglBaseLayer = null;\n\t\t\tglProjLayer = null;\n\t\t\tglBinding = null;\n\t\t\tsession = null;\n\t\t\tnewRenderTarget = null;\n\n\t\t\t//\n\n\t\t\tanimation.stop();\n\n\t\t\tscope.isPresenting = false;\n\n\t\t\tscope.dispatchEvent( { type: 'sessionend' } );\n\n\t\t}\n\n\t\tthis.setFramebufferScaleFactor = function ( value ) {\n\n\t\t\tframebufferScaleFactor = value;\n\n\t\t\tif ( scope.isPresenting === true ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebXRManager: Cannot change framebuffer scale while presenting.' );\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.setReferenceSpaceType = function ( value ) {\n\n\t\t\treferenceSpaceType = value;\n\n\t\t\tif ( scope.isPresenting === true ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebXRManager: Cannot change reference space type while presenting.' );\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.getReferenceSpace = function () {\n\n\t\t\treturn customReferenceSpace || referenceSpace;\n\n\t\t};\n\n\t\tthis.setReferenceSpace = function ( space ) {\n\n\t\t\tcustomReferenceSpace = space;\n\n\t\t};\n\n\t\tthis.getBaseLayer = function () {\n\n\t\t\treturn glProjLayer !== null ? glProjLayer : glBaseLayer;\n\n\t\t};\n\n\t\tthis.getBinding = function () {\n\n\t\t\treturn glBinding;\n\n\t\t};\n\n\t\tthis.getFrame = function () {\n\n\t\t\treturn xrFrame;\n\n\t\t};\n\n\t\tthis.getSession = function () {\n\n\t\t\treturn session;\n\n\t\t};\n\n\t\tthis.setSession = async function ( value ) {\n\n\t\t\tsession = value;\n\n\t\t\tif ( session !== null ) {\n\n\t\t\t\tinitialRenderTarget = renderer.getRenderTarget();\n\n\t\t\t\tsession.addEventListener( 'select', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'selectstart', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'selectend', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'squeeze', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'squeezestart', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'squeezeend', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'end', onSessionEnd );\n\t\t\t\tsession.addEventListener( 'inputsourceschange', onInputSourcesChange );\n\n\t\t\t\tif ( attributes.xrCompatible !== true ) {\n\n\t\t\t\t\tawait gl.makeXRCompatible();\n\n\t\t\t\t}\n\n\t\t\t\tif ( ( session.renderState.layers === undefined ) || ( renderer.capabilities.isWebGL2 === false ) ) {\n\n\t\t\t\t\tconst layerInit = {\n\t\t\t\t\t\tantialias: ( session.renderState.layers === undefined ) ? attributes.antialias : true,\n\t\t\t\t\t\talpha: attributes.alpha,\n\t\t\t\t\t\tdepth: attributes.depth,\n\t\t\t\t\t\tstencil: attributes.stencil,\n\t\t\t\t\t\tframebufferScaleFactor: framebufferScaleFactor\n\t\t\t\t\t};\n\n\t\t\t\t\tglBaseLayer = new XRWebGLLayer( session, gl, layerInit );\n\n\t\t\t\t\tsession.updateRenderState( { baseLayer: glBaseLayer } );\n\n\t\t\t\t\tnewRenderTarget = new WebGLRenderTarget(\n\t\t\t\t\t\tglBaseLayer.framebufferWidth,\n\t\t\t\t\t\tglBaseLayer.framebufferHeight,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tformat: RGBAFormat,\n\t\t\t\t\t\t\ttype: UnsignedByteType,\n\t\t\t\t\t\t\tencoding: renderer.outputEncoding\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\n\t\t\t\t} else {\n\n\t\t\t\t\tlet depthFormat = null;\n\t\t\t\t\tlet depthType = null;\n\t\t\t\t\tlet glDepthFormat = null;\n\n\t\t\t\t\tif ( attributes.depth ) {\n\n\t\t\t\t\t\tglDepthFormat = attributes.stencil ? 35056 : 33190;\n\t\t\t\t\t\tdepthFormat = attributes.stencil ? DepthStencilFormat : DepthFormat;\n\t\t\t\t\t\tdepthType = attributes.stencil ? UnsignedInt248Type : UnsignedIntType;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst projectionlayerInit = {\n\t\t\t\t\t\tcolorFormat: 32856,\n\t\t\t\t\t\tdepthFormat: glDepthFormat,\n\t\t\t\t\t\tscaleFactor: framebufferScaleFactor\n\t\t\t\t\t};\n\n\t\t\t\t\tglBinding = new XRWebGLBinding( session, gl );\n\n\t\t\t\t\tglProjLayer = glBinding.createProjectionLayer( projectionlayerInit );\n\n\t\t\t\t\tsession.updateRenderState( { layers: [ glProjLayer ] } );\n\n\t\t\t\t\tnewRenderTarget = new WebGLRenderTarget(\n\t\t\t\t\t\tglProjLayer.textureWidth,\n\t\t\t\t\t\tglProjLayer.textureHeight,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tformat: RGBAFormat,\n\t\t\t\t\t\t\ttype: UnsignedByteType,\n\t\t\t\t\t\t\tdepthTexture: new DepthTexture( glProjLayer.textureWidth, glProjLayer.textureHeight, depthType, undefined, undefined, undefined, undefined, undefined, undefined, depthFormat ),\n\t\t\t\t\t\t\tstencilBuffer: attributes.stencil,\n\t\t\t\t\t\t\tencoding: renderer.outputEncoding,\n\t\t\t\t\t\t\tsamples: attributes.antialias ? 4 : 0\n\t\t\t\t\t\t} );\n\n\t\t\t\t\tconst renderTargetProperties = renderer.properties.get( newRenderTarget );\n\t\t\t\t\trenderTargetProperties.__ignoreDepthValues = glProjLayer.ignoreDepthValues;\n\n\t\t\t\t}\n\n\t\t\t\tnewRenderTarget.isXRRenderTarget = true; // TODO Remove this when possible, see #23278\n\n\t\t\t\t// Set foveation to maximum.\n\t\t\t\tthis.setFoveation( 1.0 );\n\n\t\t\t\tcustomReferenceSpace = null;\n\t\t\t\treferenceSpace = await session.requestReferenceSpace( referenceSpaceType );\n\n\t\t\t\tanimation.setContext( session );\n\t\t\t\tanimation.start();\n\n\t\t\t\tscope.isPresenting = true;\n\n\t\t\t\tscope.dispatchEvent( { type: 'sessionstart' } );\n\n\t\t\t}\n\n\t\t};\n\n\t\tfunction onInputSourcesChange( event ) {\n\n\t\t\t// Notify disconnected\n\n\t\t\tfor ( let i = 0; i < event.removed.length; i ++ ) {\n\n\t\t\t\tconst inputSource = event.removed[ i ];\n\t\t\t\tconst index = controllerInputSources.indexOf( inputSource );\n\n\t\t\t\tif ( index >= 0 ) {\n\n\t\t\t\t\tcontrollerInputSources[ index ] = null;\n\t\t\t\t\tcontrollers[ index ].dispatchEvent( { type: 'disconnected', data: inputSource } );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Notify connected\n\n\t\t\tfor ( let i = 0; i < event.added.length; i ++ ) {\n\n\t\t\t\tconst inputSource = event.added[ i ];\n\n\t\t\t\tlet controllerIndex = controllerInputSources.indexOf( inputSource );\n\n\t\t\t\tif ( controllerIndex === - 1 ) {\n\n\t\t\t\t\t// Assign input source a controller that currently has no input source\n\n\t\t\t\t\tfor ( let i = 0; i < controllers.length; i ++ ) {\n\n\t\t\t\t\t\tif ( i >= controllerInputSources.length ) {\n\n\t\t\t\t\t\t\tcontrollerInputSources.push( inputSource );\n\t\t\t\t\t\t\tcontrollerIndex = i;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t} else if ( controllerInputSources[ i ] === null ) {\n\n\t\t\t\t\t\t\tcontrollerInputSources[ i ] = inputSource;\n\t\t\t\t\t\t\tcontrollerIndex = 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\t// If all controllers do currently receive input we ignore new ones\n\n\t\t\t\t\tif ( controllerIndex === - 1 ) break;\n\n\t\t\t\t}\n\n\t\t\t\tconst controller = controllers[ controllerIndex ];\n\n\t\t\t\tif ( controller ) {\n\n\t\t\t\t\tcontroller.dispatchEvent( { type: 'connected', data: inputSource } );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tconst cameraLPos = new Vector3();\n\t\tconst cameraRPos = new Vector3();\n\n\t\t/**\n\t\t * Assumes 2 cameras that are parallel and share an X-axis, and that\n\t\t * the cameras' projection and world matrices have already been set.\n\t\t * And that near and far planes are identical for both cameras.\n\t\t * Visualization of this technique: https://computergraphics.stackexchange.com/a/4765\n\t\t */\n\t\tfunction setProjectionFromUnion( camera, cameraL, cameraR ) {\n\n\t\t\tcameraLPos.setFromMatrixPosition( cameraL.matrixWorld );\n\t\t\tcameraRPos.setFromMatrixPosition( cameraR.matrixWorld );\n\n\t\t\tconst ipd = cameraLPos.distanceTo( cameraRPos );\n\n\t\t\tconst projL = cameraL.projectionMatrix.elements;\n\t\t\tconst projR = cameraR.projectionMatrix.elements;\n\n\t\t\t// VR systems will have identical far and near planes, and\n\t\t\t// most likely identical top and bottom frustum extents.\n\t\t\t// Use the left camera for these values.\n\t\t\tconst near = projL[ 14 ] / ( projL[ 10 ] - 1 );\n\t\t\tconst far = projL[ 14 ] / ( projL[ 10 ] + 1 );\n\t\t\tconst topFov = ( projL[ 9 ] + 1 ) / projL[ 5 ];\n\t\t\tconst bottomFov = ( projL[ 9 ] - 1 ) / projL[ 5 ];\n\n\t\t\tconst leftFov = ( projL[ 8 ] - 1 ) / projL[ 0 ];\n\t\t\tconst rightFov = ( projR[ 8 ] + 1 ) / projR[ 0 ];\n\t\t\tconst left = near * leftFov;\n\t\t\tconst right = near * rightFov;\n\n\t\t\t// Calculate the new camera's position offset from the\n\t\t\t// left camera. xOffset should be roughly half `ipd`.\n\t\t\tconst zOffset = ipd / ( - leftFov + rightFov );\n\t\t\tconst xOffset = zOffset * - leftFov;\n\n\t\t\t// TODO: Better way to apply this offset?\n\t\t\tcameraL.matrixWorld.decompose( camera.position, camera.quaternion, camera.scale );\n\t\t\tcamera.translateX( xOffset );\n\t\t\tcamera.translateZ( zOffset );\n\t\t\tcamera.matrixWorld.compose( camera.position, camera.quaternion, camera.scale );\n\t\t\tcamera.matrixWorldInverse.copy( camera.matrixWorld ).invert();\n\n\t\t\t// Find the union of the frustum values of the cameras and scale\n\t\t\t// the values so that the near plane's position does not change in world space,\n\t\t\t// although must now be relative to the new union camera.\n\t\t\tconst near2 = near + zOffset;\n\t\t\tconst far2 = far + zOffset;\n\t\t\tconst left2 = left - xOffset;\n\t\t\tconst right2 = right + ( ipd - xOffset );\n\t\t\tconst top2 = topFov * far / far2 * near2;\n\t\t\tconst bottom2 = bottomFov * far / far2 * near2;\n\n\t\t\tcamera.projectionMatrix.makePerspective( left2, right2, top2, bottom2, near2, far2 );\n\n\t\t}\n\n\t\tfunction updateCamera( camera, parent ) {\n\n\t\t\tif ( parent === null ) {\n\n\t\t\t\tcamera.matrixWorld.copy( camera.matrix );\n\n\t\t\t} else {\n\n\t\t\t\tcamera.matrixWorld.multiplyMatrices( parent.matrixWorld, camera.matrix );\n\n\t\t\t}\n\n\t\t\tcamera.matrixWorldInverse.copy( camera.matrixWorld ).invert();\n\n\t\t}\n\n\t\tthis.updateCamera = function ( camera ) {\n\n\t\t\tif ( session === null ) return;\n\n\t\t\tcameraVR.near = cameraR.near = cameraL.near = camera.near;\n\t\t\tcameraVR.far = cameraR.far = cameraL.far = camera.far;\n\n\t\t\tif ( _currentDepthNear !== cameraVR.near || _currentDepthFar !== cameraVR.far ) {\n\n\t\t\t\t// Note that the new renderState won't apply until the next frame. See #18320\n\n\t\t\t\tsession.updateRenderState( {\n\t\t\t\t\tdepthNear: cameraVR.near,\n\t\t\t\t\tdepthFar: cameraVR.far\n\t\t\t\t} );\n\n\t\t\t\t_currentDepthNear = cameraVR.near;\n\t\t\t\t_currentDepthFar = cameraVR.far;\n\n\t\t\t}\n\n\t\t\tconst parent = camera.parent;\n\t\t\tconst cameras = cameraVR.cameras;\n\n\t\t\tupdateCamera( cameraVR, parent );\n\n\t\t\tfor ( let i = 0; i < cameras.length; i ++ ) {\n\n\t\t\t\tupdateCamera( cameras[ i ], parent );\n\n\t\t\t}\n\n\t\t\tcameraVR.matrixWorld.decompose( cameraVR.position, cameraVR.quaternion, cameraVR.scale );\n\n\t\t\t// update user camera and its children\n\n\t\t\tcamera.position.copy( cameraVR.position );\n\t\t\tcamera.quaternion.copy( cameraVR.quaternion );\n\t\t\tcamera.scale.copy( cameraVR.scale );\n\t\t\tcamera.matrix.copy( cameraVR.matrix );\n\t\t\tcamera.matrixWorld.copy( cameraVR.matrixWorld );\n\n\t\t\tconst children = camera.children;\n\n\t\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tchildren[ i ].updateMatrixWorld( true );\n\n\t\t\t}\n\n\t\t\t// update projection matrix for proper view frustum culling\n\n\t\t\tif ( cameras.length === 2 ) {\n\n\t\t\t\tsetProjectionFromUnion( cameraVR, cameraL, cameraR );\n\n\t\t\t} else {\n\n\t\t\t\t// assume single camera setup (AR)\n\n\t\t\t\tcameraVR.projectionMatrix.copy( cameraL.projectionMatrix );\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.getCamera = function () {\n\n\t\t\treturn cameraVR;\n\n\t\t};\n\n\t\tthis.getFoveation = function () {\n\n\t\t\tif ( glProjLayer !== null ) {\n\n\t\t\t\treturn glProjLayer.fixedFoveation;\n\n\t\t\t}\n\n\t\t\tif ( glBaseLayer !== null ) {\n\n\t\t\t\treturn glBaseLayer.fixedFoveation;\n\n\t\t\t}\n\n\t\t\treturn undefined;\n\n\t\t};\n\n\t\tthis.setFoveation = function ( foveation ) {\n\n\t\t\t// 0 = no foveation = full resolution\n\t\t\t// 1 = maximum foveation = the edges render at lower resolution\n\n\t\t\tif ( glProjLayer !== null ) {\n\n\t\t\t\tglProjLayer.fixedFoveation = foveation;\n\n\t\t\t}\n\n\t\t\tif ( glBaseLayer !== null && glBaseLayer.fixedFoveation !== undefined ) {\n\n\t\t\t\tglBaseLayer.fixedFoveation = foveation;\n\n\t\t\t}\n\n\t\t};\n\n\t\t// Animation Loop\n\n\t\tlet onAnimationFrameCallback = null;\n\n\t\tfunction onAnimationFrame( time, frame ) {\n\n\t\t\tpose = frame.getViewerPose( customReferenceSpace || referenceSpace );\n\t\t\txrFrame = frame;\n\n\t\t\tif ( pose !== null ) {\n\n\t\t\t\tconst views = pose.views;\n\n\t\t\t\tif ( glBaseLayer !== null ) {\n\n\t\t\t\t\trenderer.setRenderTargetFramebuffer( newRenderTarget, glBaseLayer.framebuffer );\n\t\t\t\t\trenderer.setRenderTarget( newRenderTarget );\n\n\t\t\t\t}\n\n\t\t\t\tlet cameraVRNeedsUpdate = false;\n\n\t\t\t\t// check if it's necessary to rebuild cameraVR's camera list\n\n\t\t\t\tif ( views.length !== cameraVR.cameras.length ) {\n\n\t\t\t\t\tcameraVR.cameras.length = 0;\n\t\t\t\t\tcameraVRNeedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0; i < views.length; i ++ ) {\n\n\t\t\t\t\tconst view = views[ i ];\n\n\t\t\t\t\tlet viewport = null;\n\n\t\t\t\t\tif ( glBaseLayer !== null ) {\n\n\t\t\t\t\t\tviewport = glBaseLayer.getViewport( view );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconst glSubImage = glBinding.getViewSubImage( glProjLayer, view );\n\t\t\t\t\t\tviewport = glSubImage.viewport;\n\n\t\t\t\t\t\t// For side-by-side projection, we only produce a single texture for both eyes.\n\t\t\t\t\t\tif ( i === 0 ) {\n\n\t\t\t\t\t\t\trenderer.setRenderTargetTextures(\n\t\t\t\t\t\t\t\tnewRenderTarget,\n\t\t\t\t\t\t\t\tglSubImage.colorTexture,\n\t\t\t\t\t\t\t\tglProjLayer.ignoreDepthValues ? undefined : glSubImage.depthStencilTexture );\n\n\t\t\t\t\t\t\trenderer.setRenderTarget( newRenderTarget );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tlet camera = cameras[ i ];\n\n\t\t\t\t\tif ( camera === undefined ) {\n\n\t\t\t\t\t\tcamera = new PerspectiveCamera();\n\t\t\t\t\t\tcamera.layers.enable( i );\n\t\t\t\t\t\tcamera.viewport = new Vector4();\n\t\t\t\t\t\tcameras[ i ] = camera;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcamera.matrix.fromArray( view.transform.matrix );\n\t\t\t\t\tcamera.projectionMatrix.fromArray( view.projectionMatrix );\n\t\t\t\t\tcamera.viewport.set( viewport.x, viewport.y, viewport.width, viewport.height );\n\n\t\t\t\t\tif ( i === 0 ) {\n\n\t\t\t\t\t\tcameraVR.matrix.copy( camera.matrix );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( cameraVRNeedsUpdate === true ) {\n\n\t\t\t\t\t\tcameraVR.cameras.push( camera );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tfor ( let i = 0; i < controllers.length; i ++ ) {\n\n\t\t\t\tconst inputSource = controllerInputSources[ i ];\n\t\t\t\tconst controller = controllers[ i ];\n\n\t\t\t\tif ( inputSource !== null && controller !== undefined ) {\n\n\t\t\t\t\tcontroller.update( inputSource, frame, customReferenceSpace || referenceSpace );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( onAnimationFrameCallback ) onAnimationFrameCallback( time, frame );\n\n\t\t\txrFrame = null;\n\n\t\t}\n\n\t\tconst animation = new WebGLAnimation();\n\n\t\tanimation.setAnimationLoop( onAnimationFrame );\n\n\t\tthis.setAnimationLoop = function ( callback ) {\n\n\t\t\tonAnimationFrameCallback = callback;\n\n\t\t};\n\n\t\tthis.dispose = function () {};\n\n\t}\n\n}\n\nfunction WebGLMaterials( renderer, properties ) {\n\n\tfunction refreshFogUniforms( uniforms, fog ) {\n\n\t\tuniforms.fogColor.value.copy( fog.color );\n\n\t\tif ( fog.isFog ) {\n\n\t\t\tuniforms.fogNear.value = fog.near;\n\t\t\tuniforms.fogFar.value = fog.far;\n\n\t\t} else if ( fog.isFogExp2 ) {\n\n\t\t\tuniforms.fogDensity.value = fog.density;\n\n\t\t}\n\n\t}\n\n\tfunction refreshMaterialUniforms( uniforms, material, pixelRatio, height, transmissionRenderTarget ) {\n\n\t\tif ( material.isMeshBasicMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\n\t\t} else if ( material.isMeshLambertMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\n\t\t} else if ( material.isMeshToonMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsToon( uniforms, material );\n\n\t\t} else if ( material.isMeshPhongMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsPhong( uniforms, material );\n\n\t\t} else if ( material.isMeshStandardMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsStandard( uniforms, material );\n\n\t\t\tif ( material.isMeshPhysicalMaterial ) {\n\n\t\t\t\trefreshUniformsPhysical( uniforms, material, transmissionRenderTarget );\n\n\t\t\t}\n\n\t\t} else if ( material.isMeshMatcapMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsMatcap( uniforms, material );\n\n\t\t} else if ( material.isMeshDepthMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\n\t\t} else if ( material.isMeshDistanceMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsDistance( uniforms, material );\n\n\t\t} else if ( material.isMeshNormalMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\n\t\t} else if ( material.isLineBasicMaterial ) {\n\n\t\t\trefreshUniformsLine( uniforms, material );\n\n\t\t\tif ( material.isLineDashedMaterial ) {\n\n\t\t\t\trefreshUniformsDash( uniforms, material );\n\n\t\t\t}\n\n\t\t} else if ( material.isPointsMaterial ) {\n\n\t\t\trefreshUniformsPoints( uniforms, material, pixelRatio, height );\n\n\t\t} else if ( material.isSpriteMaterial ) {\n\n\t\t\trefreshUniformsSprites( uniforms, material );\n\n\t\t} else if ( material.isShadowMaterial ) {\n\n\t\t\tuniforms.color.value.copy( material.color );\n\t\t\tuniforms.opacity.value = material.opacity;\n\n\t\t} else if ( material.isShaderMaterial ) {\n\n\t\t\tmaterial.uniformsNeedUpdate = false; // #15581\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsCommon( uniforms, material ) {\n\n\t\tuniforms.opacity.value = material.opacity;\n\n\t\tif ( material.color ) {\n\n\t\t\tuniforms.diffuse.value.copy( material.color );\n\n\t\t}\n\n\t\tif ( material.emissive ) {\n\n\t\t\tuniforms.emissive.value.copy( material.emissive ).multiplyScalar( material.emissiveIntensity );\n\n\t\t}\n\n\t\tif ( material.map ) {\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t}\n\n\t\tif ( material.alphaMap ) {\n\n\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t}\n\n\t\tif ( material.bumpMap ) {\n\n\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\t\t\tif ( material.side === BackSide ) uniforms.bumpScale.value *= - 1;\n\n\t\t}\n\n\t\tif ( material.displacementMap ) {\n\n\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t}\n\n\t\tif ( material.emissiveMap ) {\n\n\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t}\n\n\t\tif ( material.normalMap ) {\n\n\t\t\tuniforms.normalMap.value = material.normalMap;\n\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\t\t\tif ( material.side === BackSide ) uniforms.normalScale.value.negate();\n\n\t\t}\n\n\t\tif ( material.specularMap ) {\n\n\t\t\tuniforms.specularMap.value = material.specularMap;\n\n\t\t}\n\n\t\tif ( material.alphaTest > 0 ) {\n\n\t\t\tuniforms.alphaTest.value = material.alphaTest;\n\n\t\t}\n\n\t\tconst envMap = properties.get( material ).envMap;\n\n\t\tif ( envMap ) {\n\n\t\t\tuniforms.envMap.value = envMap;\n\n\t\t\tuniforms.flipEnvMap.value = ( envMap.isCubeTexture && envMap.isRenderTargetTexture === false ) ? - 1 : 1;\n\n\t\t\tuniforms.reflectivity.value = material.reflectivity;\n\t\t\tuniforms.ior.value = material.ior;\n\t\t\tuniforms.refractionRatio.value = material.refractionRatio;\n\n\t\t}\n\n\t\tif ( material.lightMap ) {\n\n\t\t\tuniforms.lightMap.value = material.lightMap;\n\n\t\t\t// artist-friendly light intensity scaling factor\n\t\t\tconst scaleFactor = ( renderer.physicallyCorrectLights !== true ) ? Math.PI : 1;\n\n\t\t\tuniforms.lightMapIntensity.value = material.lightMapIntensity * scaleFactor;\n\n\t\t}\n\n\t\tif ( material.aoMap ) {\n\n\t\t\tuniforms.aoMap.value = material.aoMap;\n\t\t\tuniforms.aoMapIntensity.value = material.aoMapIntensity;\n\n\t\t}\n\n\t\t// uv repeat and offset setting priorities\n\t\t// 1. color map\n\t\t// 2. specular map\n\t\t// 3. displacementMap map\n\t\t// 4. normal map\n\t\t// 5. bump map\n\t\t// 6. roughnessMap map\n\t\t// 7. metalnessMap map\n\t\t// 8. alphaMap map\n\t\t// 9. emissiveMap map\n\t\t// 10. clearcoat map\n\t\t// 11. clearcoat normal map\n\t\t// 12. clearcoat roughnessMap map\n\t\t// 13. iridescence map\n\t\t// 14. iridescence thickness map\n\t\t// 15. specular intensity map\n\t\t// 16. specular tint map\n\t\t// 17. transmission map\n\t\t// 18. thickness map\n\n\t\tlet uvScaleMap;\n\n\t\tif ( material.map ) {\n\n\t\t\tuvScaleMap = material.map;\n\n\t\t} else if ( material.specularMap ) {\n\n\t\t\tuvScaleMap = material.specularMap;\n\n\t\t} else if ( material.displacementMap ) {\n\n\t\t\tuvScaleMap = material.displacementMap;\n\n\t\t} else if ( material.normalMap ) {\n\n\t\t\tuvScaleMap = material.normalMap;\n\n\t\t} else if ( material.bumpMap ) {\n\n\t\t\tuvScaleMap = material.bumpMap;\n\n\t\t} else if ( material.roughnessMap ) {\n\n\t\t\tuvScaleMap = material.roughnessMap;\n\n\t\t} else if ( material.metalnessMap ) {\n\n\t\t\tuvScaleMap = material.metalnessMap;\n\n\t\t} else if ( material.alphaMap ) {\n\n\t\t\tuvScaleMap = material.alphaMap;\n\n\t\t} else if ( material.emissiveMap ) {\n\n\t\t\tuvScaleMap = material.emissiveMap;\n\n\t\t} else if ( material.clearcoatMap ) {\n\n\t\t\tuvScaleMap = material.clearcoatMap;\n\n\t\t} else if ( material.clearcoatNormalMap ) {\n\n\t\t\tuvScaleMap = material.clearcoatNormalMap;\n\n\t\t} else if ( material.clearcoatRoughnessMap ) {\n\n\t\t\tuvScaleMap = material.clearcoatRoughnessMap;\n\n\t\t} else if ( material.iridescenceMap ) {\n\n\t\t\tuvScaleMap = material.iridescenceMap;\n\n\t\t} else if ( material.iridescenceThicknessMap ) {\n\n\t\t\tuvScaleMap = material.iridescenceThicknessMap;\n\n\t\t} else if ( material.specularIntensityMap ) {\n\n\t\t\tuvScaleMap = material.specularIntensityMap;\n\n\t\t} else if ( material.specularColorMap ) {\n\n\t\t\tuvScaleMap = material.specularColorMap;\n\n\t\t} else if ( material.transmissionMap ) {\n\n\t\t\tuvScaleMap = material.transmissionMap;\n\n\t\t} else if ( material.thicknessMap ) {\n\n\t\t\tuvScaleMap = material.thicknessMap;\n\n\t\t} else if ( material.sheenColorMap ) {\n\n\t\t\tuvScaleMap = material.sheenColorMap;\n\n\t\t} else if ( material.sheenRoughnessMap ) {\n\n\t\t\tuvScaleMap = material.sheenRoughnessMap;\n\n\t\t}\n\n\t\tif ( uvScaleMap !== undefined ) {\n\n\t\t\t// backwards compatibility\n\t\t\tif ( uvScaleMap.isWebGLRenderTarget ) {\n\n\t\t\t\tuvScaleMap = uvScaleMap.texture;\n\n\t\t\t}\n\n\t\t\tif ( uvScaleMap.matrixAutoUpdate === true ) {\n\n\t\t\t\tuvScaleMap.updateMatrix();\n\n\t\t\t}\n\n\t\t\tuniforms.uvTransform.value.copy( uvScaleMap.matrix );\n\n\t\t}\n\n\t\t// uv repeat and offset setting priorities for uv2\n\t\t// 1. ao map\n\t\t// 2. light map\n\n\t\tlet uv2ScaleMap;\n\n\t\tif ( material.aoMap ) {\n\n\t\t\tuv2ScaleMap = material.aoMap;\n\n\t\t} else if ( material.lightMap ) {\n\n\t\t\tuv2ScaleMap = material.lightMap;\n\n\t\t}\n\n\t\tif ( uv2ScaleMap !== undefined ) {\n\n\t\t\t// backwards compatibility\n\t\t\tif ( uv2ScaleMap.isWebGLRenderTarget ) {\n\n\t\t\t\tuv2ScaleMap = uv2ScaleMap.texture;\n\n\t\t\t}\n\n\t\t\tif ( uv2ScaleMap.matrixAutoUpdate === true ) {\n\n\t\t\t\tuv2ScaleMap.updateMatrix();\n\n\t\t\t}\n\n\t\t\tuniforms.uv2Transform.value.copy( uv2ScaleMap.matrix );\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsLine( uniforms, material ) {\n\n\t\tuniforms.diffuse.value.copy( material.color );\n\t\tuniforms.opacity.value = material.opacity;\n\n\t}\n\n\tfunction refreshUniformsDash( uniforms, material ) {\n\n\t\tuniforms.dashSize.value = material.dashSize;\n\t\tuniforms.totalSize.value = material.dashSize + material.gapSize;\n\t\tuniforms.scale.value = material.scale;\n\n\t}\n\n\tfunction refreshUniformsPoints( uniforms, material, pixelRatio, height ) {\n\n\t\tuniforms.diffuse.value.copy( material.color );\n\t\tuniforms.opacity.value = material.opacity;\n\t\tuniforms.size.value = material.size * pixelRatio;\n\t\tuniforms.scale.value = height * 0.5;\n\n\t\tif ( material.map ) {\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t}\n\n\t\tif ( material.alphaMap ) {\n\n\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t}\n\n\t\tif ( material.alphaTest > 0 ) {\n\n\t\t\tuniforms.alphaTest.value = material.alphaTest;\n\n\t\t}\n\n\t\t// uv repeat and offset setting priorities\n\t\t// 1. color map\n\t\t// 2. alpha map\n\n\t\tlet uvScaleMap;\n\n\t\tif ( material.map ) {\n\n\t\t\tuvScaleMap = material.map;\n\n\t\t} else if ( material.alphaMap ) {\n\n\t\t\tuvScaleMap = material.alphaMap;\n\n\t\t}\n\n\t\tif ( uvScaleMap !== undefined ) {\n\n\t\t\tif ( uvScaleMap.matrixAutoUpdate === true ) {\n\n\t\t\t\tuvScaleMap.updateMatrix();\n\n\t\t\t}\n\n\t\t\tuniforms.uvTransform.value.copy( uvScaleMap.matrix );\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsSprites( uniforms, material ) {\n\n\t\tuniforms.diffuse.value.copy( material.color );\n\t\tuniforms.opacity.value = material.opacity;\n\t\tuniforms.rotation.value = material.rotation;\n\n\t\tif ( material.map ) {\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t}\n\n\t\tif ( material.alphaMap ) {\n\n\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t}\n\n\t\tif ( material.alphaTest > 0 ) {\n\n\t\t\tuniforms.alphaTest.value = material.alphaTest;\n\n\t\t}\n\n\t\t// uv repeat and offset setting priorities\n\t\t// 1. color map\n\t\t// 2. alpha map\n\n\t\tlet uvScaleMap;\n\n\t\tif ( material.map ) {\n\n\t\t\tuvScaleMap = material.map;\n\n\t\t} else if ( material.alphaMap ) {\n\n\t\t\tuvScaleMap = material.alphaMap;\n\n\t\t}\n\n\t\tif ( uvScaleMap !== undefined ) {\n\n\t\t\tif ( uvScaleMap.matrixAutoUpdate === true ) {\n\n\t\t\t\tuvScaleMap.updateMatrix();\n\n\t\t\t}\n\n\t\t\tuniforms.uvTransform.value.copy( uvScaleMap.matrix );\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsPhong( uniforms, material ) {\n\n\t\tuniforms.specular.value.copy( material.specular );\n\t\tuniforms.shininess.value = Math.max( material.shininess, 1e-4 ); // to prevent pow( 0.0, 0.0 )\n\n\t}\n\n\tfunction refreshUniformsToon( uniforms, material ) {\n\n\t\tif ( material.gradientMap ) {\n\n\t\t\tuniforms.gradientMap.value = material.gradientMap;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsStandard( uniforms, material ) {\n\n\t\tuniforms.roughness.value = material.roughness;\n\t\tuniforms.metalness.value = material.metalness;\n\n\t\tif ( material.roughnessMap ) {\n\n\t\t\tuniforms.roughnessMap.value = material.roughnessMap;\n\n\t\t}\n\n\t\tif ( material.metalnessMap ) {\n\n\t\t\tuniforms.metalnessMap.value = material.metalnessMap;\n\n\t\t}\n\n\t\tconst envMap = properties.get( material ).envMap;\n\n\t\tif ( envMap ) {\n\n\t\t\t//uniforms.envMap.value = material.envMap; // part of uniforms common\n\t\t\tuniforms.envMapIntensity.value = material.envMapIntensity;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsPhysical( uniforms, material, transmissionRenderTarget ) {\n\n\t\tuniforms.ior.value = material.ior; // also part of uniforms common\n\n\t\tif ( material.sheen > 0 ) {\n\n\t\t\tuniforms.sheenColor.value.copy( material.sheenColor ).multiplyScalar( material.sheen );\n\n\t\t\tuniforms.sheenRoughness.value = material.sheenRoughness;\n\n\t\t\tif ( material.sheenColorMap ) {\n\n\t\t\t\tuniforms.sheenColorMap.value = material.sheenColorMap;\n\n\t\t\t}\n\n\t\t\tif ( material.sheenRoughnessMap ) {\n\n\t\t\t\tuniforms.sheenRoughnessMap.value = material.sheenRoughnessMap;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.clearcoat > 0 ) {\n\n\t\t\tuniforms.clearcoat.value = material.clearcoat;\n\t\t\tuniforms.clearcoatRoughness.value = material.clearcoatRoughness;\n\n\t\t\tif ( material.clearcoatMap ) {\n\n\t\t\t\tuniforms.clearcoatMap.value = material.clearcoatMap;\n\n\t\t\t}\n\n\t\t\tif ( material.clearcoatRoughnessMap ) {\n\n\t\t\t\tuniforms.clearcoatRoughnessMap.value = material.clearcoatRoughnessMap;\n\n\t\t\t}\n\n\t\t\tif ( material.clearcoatNormalMap ) {\n\n\t\t\t\tuniforms.clearcoatNormalScale.value.copy( material.clearcoatNormalScale );\n\t\t\t\tuniforms.clearcoatNormalMap.value = material.clearcoatNormalMap;\n\n\t\t\t\tif ( material.side === BackSide ) {\n\n\t\t\t\t\tuniforms.clearcoatNormalScale.value.negate();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.iridescence > 0 ) {\n\n\t\t\tuniforms.iridescence.value = material.iridescence;\n\t\t\tuniforms.iridescenceIOR.value = material.iridescenceIOR;\n\t\t\tuniforms.iridescenceThicknessMinimum.value = material.iridescenceThicknessRange[ 0 ];\n\t\t\tuniforms.iridescenceThicknessMaximum.value = material.iridescenceThicknessRange[ 1 ];\n\n\t\t\tif ( material.iridescenceMap ) {\n\n\t\t\t\tuniforms.iridescenceMap.value = material.iridescenceMap;\n\n\t\t\t}\n\n\t\t\tif ( material.iridescenceThicknessMap ) {\n\n\t\t\t\tuniforms.iridescenceThicknessMap.value = material.iridescenceThicknessMap;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.transmission > 0 ) {\n\n\t\t\tuniforms.transmission.value = material.transmission;\n\t\t\tuniforms.transmissionSamplerMap.value = transmissionRenderTarget.texture;\n\t\t\tuniforms.transmissionSamplerSize.value.set( transmissionRenderTarget.width, transmissionRenderTarget.height );\n\n\t\t\tif ( material.transmissionMap ) {\n\n\t\t\t\tuniforms.transmissionMap.value = material.transmissionMap;\n\n\t\t\t}\n\n\t\t\tuniforms.thickness.value = material.thickness;\n\n\t\t\tif ( material.thicknessMap ) {\n\n\t\t\t\tuniforms.thicknessMap.value = material.thicknessMap;\n\n\t\t\t}\n\n\t\t\tuniforms.attenuationDistance.value = material.attenuationDistance;\n\t\t\tuniforms.attenuationColor.value.copy( material.attenuationColor );\n\n\t\t}\n\n\t\tuniforms.specularIntensity.value = material.specularIntensity;\n\t\tuniforms.specularColor.value.copy( material.specularColor );\n\n\t\tif ( material.specularIntensityMap ) {\n\n\t\t\tuniforms.specularIntensityMap.value = material.specularIntensityMap;\n\n\t\t}\n\n\t\tif ( material.specularColorMap ) {\n\n\t\t\tuniforms.specularColorMap.value = material.specularColorMap;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsMatcap( uniforms, material ) {\n\n\t\tif ( material.matcap ) {\n\n\t\t\tuniforms.matcap.value = material.matcap;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsDistance( uniforms, material ) {\n\n\t\tuniforms.referencePosition.value.copy( material.referencePosition );\n\t\tuniforms.nearDistance.value = material.nearDistance;\n\t\tuniforms.farDistance.value = material.farDistance;\n\n\t}\n\n\treturn {\n\t\trefreshFogUniforms: refreshFogUniforms,\n\t\trefreshMaterialUniforms: refreshMaterialUniforms\n\t};\n\n}\n\nfunction WebGLUniformsGroups( gl, info, capabilities, state ) {\n\n\tlet buffers = {};\n\tlet updateList = {};\n\tlet allocatedBindingPoints = [];\n\n\tconst maxBindingPoints = ( capabilities.isWebGL2 ) ? gl.getParameter( 35375 ) : 0; // binding points are global whereas block indices are per shader program\n\n\tfunction bind( uniformsGroup, program ) {\n\n\t\tconst webglProgram = program.program;\n\t\tstate.uniformBlockBinding( uniformsGroup, webglProgram );\n\n\t}\n\n\tfunction update( uniformsGroup, program ) {\n\n\t\tlet buffer = buffers[ uniformsGroup.id ];\n\n\t\tif ( buffer === undefined ) {\n\n\t\t\tprepareUniformsGroup( uniformsGroup );\n\n\t\t\tbuffer = createBuffer( uniformsGroup );\n\t\t\tbuffers[ uniformsGroup.id ] = buffer;\n\n\t\t\tuniformsGroup.addEventListener( 'dispose', onUniformsGroupsDispose );\n\n\t\t}\n\n\t\t// ensure to update the binding points/block indices mapping for this program\n\n\t\tconst webglProgram = program.program;\n\t\tstate.updateUBOMapping( uniformsGroup, webglProgram );\n\n\t\t// update UBO once per frame\n\n\t\tconst frame = info.render.frame;\n\n\t\tif ( updateList[ uniformsGroup.id ] !== frame ) {\n\n\t\t\tupdateBufferData( uniformsGroup );\n\n\t\t\tupdateList[ uniformsGroup.id ] = frame;\n\n\t\t}\n\n\t}\n\n\tfunction createBuffer( uniformsGroup ) {\n\n\t\t// the setup of an UBO is independent of a particular shader program but global\n\n\t\tconst bindingPointIndex = allocateBindingPointIndex();\n\t\tuniformsGroup.__bindingPointIndex = bindingPointIndex;\n\n\t\tconst buffer = gl.createBuffer();\n\t\tconst size = uniformsGroup.__size;\n\t\tconst usage = uniformsGroup.usage;\n\n\t\tgl.bindBuffer( 35345, buffer );\n\t\tgl.bufferData( 35345, size, usage );\n\t\tgl.bindBuffer( 35345, null );\n\t\tgl.bindBufferBase( 35345, bindingPointIndex, buffer );\n\n\t\treturn buffer;\n\n\t}\n\n\tfunction allocateBindingPointIndex() {\n\n\t\tfor ( let i = 0; i < maxBindingPoints; i ++ ) {\n\n\t\t\tif ( allocatedBindingPoints.indexOf( i ) === - 1 ) {\n\n\t\t\t\tallocatedBindingPoints.push( i );\n\t\t\t\treturn i;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconsole.error( 'THREE.WebGLRenderer: Maximum number of simultaneously usable uniforms groups reached.' );\n\n\t\treturn 0;\n\n\t}\n\n\tfunction updateBufferData( uniformsGroup ) {\n\n\t\tconst buffer = buffers[ uniformsGroup.id ];\n\t\tconst uniforms = uniformsGroup.uniforms;\n\t\tconst cache = uniformsGroup.__cache;\n\n\t\tgl.bindBuffer( 35345, buffer );\n\n\t\tfor ( let i = 0, il = uniforms.length; i < il; i ++ ) {\n\n\t\t\tconst uniform = uniforms[ i ];\n\n\t\t\t// partly update the buffer if necessary\n\n\t\t\tif ( hasUniformChanged( uniform, i, cache ) === true ) {\n\n\t\t\t\tconst value = uniform.value;\n\t\t\t\tconst offset = uniform.__offset;\n\n\t\t\t\tif ( typeof value === 'number' ) {\n\n\t\t\t\t\tuniform.__data[ 0 ] = value;\n\t\t\t\t\tgl.bufferSubData( 35345, offset, uniform.__data );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( uniform.value.isMatrix3 ) {\n\n\t\t\t\t\t\t// manually converting 3x3 to 3x4\n\n\t\t\t\t\t\tuniform.__data[ 0 ] = uniform.value.elements[ 0 ];\n\t\t\t\t\t\tuniform.__data[ 1 ] = uniform.value.elements[ 1 ];\n\t\t\t\t\t\tuniform.__data[ 2 ] = uniform.value.elements[ 2 ];\n\t\t\t\t\t\tuniform.__data[ 3 ] = uniform.value.elements[ 0 ];\n\t\t\t\t\t\tuniform.__data[ 4 ] = uniform.value.elements[ 3 ];\n\t\t\t\t\t\tuniform.__data[ 5 ] = uniform.value.elements[ 4 ];\n\t\t\t\t\t\tuniform.__data[ 6 ] = uniform.value.elements[ 5 ];\n\t\t\t\t\t\tuniform.__data[ 7 ] = uniform.value.elements[ 0 ];\n\t\t\t\t\t\tuniform.__data[ 8 ] = uniform.value.elements[ 6 ];\n\t\t\t\t\t\tuniform.__data[ 9 ] = uniform.value.elements[ 7 ];\n\t\t\t\t\t\tuniform.__data[ 10 ] = uniform.value.elements[ 8 ];\n\t\t\t\t\t\tuniform.__data[ 11 ] = uniform.value.elements[ 0 ];\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tvalue.toArray( uniform.__data );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tgl.bufferSubData( 35345, offset, uniform.__data );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tgl.bindBuffer( 35345, null );\n\n\t}\n\n\tfunction hasUniformChanged( uniform, index, cache ) {\n\n\t\tconst value = uniform.value;\n\n\t\tif ( cache[ index ] === undefined ) {\n\n\t\t\t// cache entry does not exist so far\n\n\t\t\tif ( typeof value === 'number' ) {\n\n\t\t\t\tcache[ index ] = value;\n\n\t\t\t} else {\n\n\t\t\t\tcache[ index ] = value.clone();\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t} else {\n\n\t\t\t// compare current value with cached entry\n\n\t\t\tif ( typeof value === 'number' ) {\n\n\t\t\t\tif ( cache[ index ] !== value ) {\n\n\t\t\t\t\tcache[ index ] = value;\n\t\t\t\t\treturn true;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tconst cachedObject = cache[ index ];\n\n\t\t\t\tif ( cachedObject.equals( value ) === false ) {\n\n\t\t\t\t\tcachedObject.copy( value );\n\t\t\t\t\treturn true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\tfunction prepareUniformsGroup( uniformsGroup ) {\n\n\t\t// determine total buffer size according to the STD140 layout\n\t\t// Hint: STD140 is the only supported layout in WebGL 2\n\n\t\tconst uniforms = uniformsGroup.uniforms;\n\n\t\tlet offset = 0; // global buffer offset in bytes\n\t\tconst chunkSize = 16; // size of a chunk in bytes\n\t\tlet chunkOffset = 0; // offset within a single chunk in bytes\n\n\t\tfor ( let i = 0, l = uniforms.length; i < l; i ++ ) {\n\n\t\t\tconst uniform = uniforms[ i ];\n\t\t\tconst info = getUniformSize( uniform );\n\n\t\t\t// the following two properties will be used for partial buffer updates\n\n\t\t\tuniform.__data = new Float32Array( info.storage / Float32Array.BYTES_PER_ELEMENT );\n\t\t\tuniform.__offset = offset;\n\n\t\t\t//\n\n\t\t\tif ( i > 0 ) {\n\n\t\t\t\tchunkOffset = offset % chunkSize;\n\n\t\t\t\tconst remainingSizeInChunk = chunkSize - chunkOffset;\n\n\t\t\t\t// check for chunk overflow\n\n\t\t\t\tif ( chunkOffset !== 0 && ( remainingSizeInChunk - info.boundary ) < 0 ) {\n\n\t\t\t\t\t// add padding and adjust offset\n\n\t\t\t\t\toffset += ( chunkSize - chunkOffset );\n\t\t\t\t\tuniform.__offset = offset;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\toffset += info.storage;\n\n\t\t}\n\n\t\t// ensure correct final padding\n\n\t\tchunkOffset = offset % chunkSize;\n\n\t\tif ( chunkOffset > 0 ) offset += ( chunkSize - chunkOffset );\n\n\t\t//\n\n\t\tuniformsGroup.__size = offset;\n\t\tuniformsGroup.__cache = {};\n\n\t\treturn this;\n\n\t}\n\n\tfunction getUniformSize( uniform ) {\n\n\t\tconst value = uniform.value;\n\n\t\tconst info = {\n\t\t\tboundary: 0, // bytes\n\t\t\tstorage: 0 // bytes\n\t\t};\n\n\t\t// determine sizes according to STD140\n\n\t\tif ( typeof value === 'number' ) {\n\n\t\t\t// float/int\n\n\t\t\tinfo.boundary = 4;\n\t\t\tinfo.storage = 4;\n\n\t\t} else if ( value.isVector2 ) {\n\n\t\t\t// vec2\n\n\t\t\tinfo.boundary = 8;\n\t\t\tinfo.storage = 8;\n\n\t\t} else if ( value.isVector3 || value.isColor ) {\n\n\t\t\t// vec3\n\n\t\t\tinfo.boundary = 16;\n\t\t\tinfo.storage = 12; // evil: vec3 must start on a 16-byte boundary but it only consumes 12 bytes\n\n\t\t} else if ( value.isVector4 ) {\n\n\t\t\t// vec4\n\n\t\t\tinfo.boundary = 16;\n\t\t\tinfo.storage = 16;\n\n\t\t} else if ( value.isMatrix3 ) {\n\n\t\t\t// mat3 (in STD140 a 3x3 matrix is represented as 3x4)\n\n\t\t\tinfo.boundary = 48;\n\t\t\tinfo.storage = 48;\n\n\t\t} else if ( value.isMatrix4 ) {\n\n\t\t\t// mat4\n\n\t\t\tinfo.boundary = 64;\n\t\t\tinfo.storage = 64;\n\n\t\t} else if ( value.isTexture ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture samplers can not be part of an uniforms group.' );\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: Unsupported uniform value type.', value );\n\n\t\t}\n\n\t\treturn info;\n\n\t}\n\n\tfunction onUniformsGroupsDispose( event ) {\n\n\t\tconst uniformsGroup = event.target;\n\n\t\tuniformsGroup.removeEventListener( 'dispose', onUniformsGroupsDispose );\n\n\t\tconst index = allocatedBindingPoints.indexOf( uniformsGroup.__bindingPointIndex );\n\t\tallocatedBindingPoints.splice( index, 1 );\n\n\t\tgl.deleteBuffer( buffers[ uniformsGroup.id ] );\n\n\t\tdelete buffers[ uniformsGroup.id ];\n\t\tdelete updateList[ uniformsGroup.id ];\n\n\t}\n\n\tfunction dispose() {\n\n\t\tfor ( const id in buffers ) {\n\n\t\t\tgl.deleteBuffer( buffers[ id ] );\n\n\t\t}\n\n\t\tallocatedBindingPoints = [];\n\t\tbuffers = {};\n\t\tupdateList = {};\n\n\t}\n\n\treturn {\n\n\t\tbind: bind,\n\t\tupdate: update,\n\n\t\tdispose: dispose\n\n\t};\n\n}\n\nfunction createCanvasElement() {\n\n\tconst canvas = createElementNS( 'canvas' );\n\tcanvas.style.display = 'block';\n\treturn canvas;\n\n}\n\nfunction WebGLRenderer( parameters = {} ) {\n\n\tthis.isWebGLRenderer = true;\n\n\tconst _canvas = parameters.canvas !== undefined ? parameters.canvas : createCanvasElement(),\n\t\t_context = parameters.context !== undefined ? parameters.context : null,\n\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\t\t_powerPreference = parameters.powerPreference !== undefined ? parameters.powerPreference : 'default',\n\t\t_failIfMajorPerformanceCaveat = parameters.failIfMajorPerformanceCaveat !== undefined ? parameters.failIfMajorPerformanceCaveat : false;\n\n\tlet _alpha;\n\n\tif ( _context !== null ) {\n\n\t\t_alpha = _context.getContextAttributes().alpha;\n\n\t} else {\n\n\t\t_alpha = parameters.alpha !== undefined ? parameters.alpha : false;\n\n\t}\n\n\tlet currentRenderList = null;\n\tlet currentRenderState = null;\n\n\t// render() can be called from within a callback triggered by another render.\n\t// We track this so that the nested render call gets its list and state isolated from the parent render call.\n\n\tconst renderListStack = [];\n\tconst renderStateStack = [];\n\n\t// public properties\n\n\tthis.domElement = _canvas;\n\n\t// Debug configuration container\n\tthis.debug = {\n\n\t\t/**\n\t\t * Enables error checking and reporting when shader programs are being compiled\n\t\t * @type {boolean}\n\t\t */\n\t\tcheckShaderErrors: true\n\t};\n\n\t// clearing\n\n\tthis.autoClear = true;\n\tthis.autoClearColor = true;\n\tthis.autoClearDepth = true;\n\tthis.autoClearStencil = true;\n\n\t// scene graph\n\n\tthis.sortObjects = true;\n\n\t// user-defined clipping\n\n\tthis.clippingPlanes = [];\n\tthis.localClippingEnabled = false;\n\n\t// physically based shading\n\n\tthis.outputEncoding = LinearEncoding;\n\n\t// physical lights\n\n\tthis.physicallyCorrectLights = false;\n\n\t// tone mapping\n\n\tthis.toneMapping = NoToneMapping;\n\tthis.toneMappingExposure = 1.0;\n\n\t//\n\n\tObject.defineProperties( this, {\n\n\t\t// @deprecated since r136, 0e21088102b4de7e0a0a33140620b7a3424b9e6d\n\n\t\tgammaFactor: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: .gammaFactor has been removed.' );\n\t\t\t\treturn 2;\n\n\t\t\t},\n\t\t\tset: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: .gammaFactor has been removed.' );\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\t// internal properties\n\n\tconst _this = this;\n\n\tlet _isContextLost = false;\n\n\t// internal state cache\n\n\tlet _currentActiveCubeFace = 0;\n\tlet _currentActiveMipmapLevel = 0;\n\tlet _currentRenderTarget = null;\n\tlet _currentMaterialId = - 1;\n\n\tlet _currentCamera = null;\n\n\tconst _currentViewport = new Vector4();\n\tconst _currentScissor = new Vector4();\n\tlet _currentScissorTest = null;\n\n\t//\n\n\tlet _width = _canvas.width;\n\tlet _height = _canvas.height;\n\n\tlet _pixelRatio = 1;\n\tlet _opaqueSort = null;\n\tlet _transparentSort = null;\n\n\tconst _viewport = new Vector4( 0, 0, _width, _height );\n\tconst _scissor = new Vector4( 0, 0, _width, _height );\n\tlet _scissorTest = false;\n\n\t// frustum\n\n\tconst _frustum = new Frustum();\n\n\t// clipping\n\n\tlet _clippingEnabled = false;\n\tlet _localClippingEnabled = false;\n\n\t// transmission\n\n\tlet _transmissionRenderTarget = null;\n\n\t// camera matrices cache\n\n\tconst _projScreenMatrix = new Matrix4();\n\n\tconst _vector2 = new Vector2();\n\tconst _vector3 = new Vector3();\n\n\tconst _emptyScene = { background: null, fog: null, environment: null, overrideMaterial: null, isScene: true };\n\n\tfunction getTargetPixelRatio() {\n\n\t\treturn _currentRenderTarget === null ? _pixelRatio : 1;\n\n\t}\n\n\t// initialize\n\n\tlet _gl = _context;\n\n\tfunction getContext( contextNames, contextAttributes ) {\n\n\t\tfor ( let i = 0; i < contextNames.length; i ++ ) {\n\n\t\t\tconst contextName = contextNames[ i ];\n\t\t\tconst context = _canvas.getContext( contextName, contextAttributes );\n\t\t\tif ( context !== null ) return context;\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\ttry {\n\n\t\tconst contextAttributes = {\n\t\t\talpha: true,\n\t\t\tdepth: _depth,\n\t\t\tstencil: _stencil,\n\t\t\tantialias: _antialias,\n\t\t\tpremultipliedAlpha: _premultipliedAlpha,\n\t\t\tpreserveDrawingBuffer: _preserveDrawingBuffer,\n\t\t\tpowerPreference: _powerPreference,\n\t\t\tfailIfMajorPerformanceCaveat: _failIfMajorPerformanceCaveat\n\t\t};\n\n\t\t// OffscreenCanvas does not have setAttribute, see #22811\n\t\tif ( 'setAttribute' in _canvas ) _canvas.setAttribute( 'data-engine', `three.js r${REVISION}` );\n\n\t\t// event listeners must be registered before WebGL context is created, see #12753\n\t\t_canvas.addEventListener( 'webglcontextlost', onContextLost, false );\n\t\t_canvas.addEventListener( 'webglcontextrestored', onContextRestore, false );\n\t\t_canvas.addEventListener( 'webglcontextcreationerror', onContextCreationError, false );\n\n\t\tif ( _gl === null ) {\n\n\t\t\tconst contextNames = [ 'webgl2', 'webgl', 'experimental-webgl' ];\n\n\t\t\tif ( _this.isWebGL1Renderer === true ) {\n\n\t\t\t\tcontextNames.shift();\n\n\t\t\t}\n\n\t\t\t_gl = getContext( contextNames, contextAttributes );\n\n\t\t\tif ( _gl === null ) {\n\n\t\t\t\tif ( getContext( contextNames ) ) {\n\n\t\t\t\t\tthrow new Error( 'Error creating WebGL context with your selected attributes.' );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new Error( 'Error creating WebGL context.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Some experimental-webgl implementations do not have getShaderPrecisionFormat\n\n\t\tif ( _gl.getShaderPrecisionFormat === undefined ) {\n\n\t\t\t_gl.getShaderPrecisionFormat = function () {\n\n\t\t\t\treturn { 'rangeMin': 1, 'rangeMax': 1, 'precision': 1 };\n\n\t\t\t};\n\n\t\t}\n\n\t} catch ( error ) {\n\n\t\tconsole.error( 'THREE.WebGLRenderer: ' + error.message );\n\t\tthrow error;\n\n\t}\n\n\tlet extensions, capabilities, state, info;\n\tlet properties, textures, cubemaps, cubeuvmaps, attributes, geometries, objects;\n\tlet programCache, materials, renderLists, renderStates, clipping, shadowMap;\n\n\tlet background, morphtargets, bufferRenderer, indexedBufferRenderer;\n\n\tlet utils, bindingStates, uniformsGroups;\n\n\tfunction initGLContext() {\n\n\t\textensions = new WebGLExtensions( _gl );\n\n\t\tcapabilities = new WebGLCapabilities( _gl, extensions, parameters );\n\n\t\textensions.init( capabilities );\n\n\t\tutils = new WebGLUtils( _gl, extensions, capabilities );\n\n\t\tstate = new WebGLState( _gl, extensions, capabilities );\n\n\t\tinfo = new WebGLInfo();\n\t\tproperties = new WebGLProperties();\n\t\ttextures = new WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info );\n\t\tcubemaps = new WebGLCubeMaps( _this );\n\t\tcubeuvmaps = new WebGLCubeUVMaps( _this );\n\t\tattributes = new WebGLAttributes( _gl, capabilities );\n\t\tbindingStates = new WebGLBindingStates( _gl, extensions, attributes, capabilities );\n\t\tgeometries = new WebGLGeometries( _gl, attributes, info, bindingStates );\n\t\tobjects = new WebGLObjects( _gl, geometries, attributes, info );\n\t\tmorphtargets = new WebGLMorphtargets( _gl, capabilities, textures );\n\t\tclipping = new WebGLClipping( properties );\n\t\tprogramCache = new WebGLPrograms( _this, cubemaps, cubeuvmaps, extensions, capabilities, bindingStates, clipping );\n\t\tmaterials = new WebGLMaterials( _this, properties );\n\t\trenderLists = new WebGLRenderLists();\n\t\trenderStates = new WebGLRenderStates( extensions, capabilities );\n\t\tbackground = new WebGLBackground( _this, cubemaps, state, objects, _alpha, _premultipliedAlpha );\n\t\tshadowMap = new WebGLShadowMap( _this, objects, capabilities );\n\t\tuniformsGroups = new WebGLUniformsGroups( _gl, info, capabilities, state );\n\n\t\tbufferRenderer = new WebGLBufferRenderer( _gl, extensions, info, capabilities );\n\t\tindexedBufferRenderer = new WebGLIndexedBufferRenderer( _gl, extensions, info, capabilities );\n\n\t\tinfo.programs = programCache.programs;\n\n\t\t_this.capabilities = capabilities;\n\t\t_this.extensions = extensions;\n\t\t_this.properties = properties;\n\t\t_this.renderLists = renderLists;\n\t\t_this.shadowMap = shadowMap;\n\t\t_this.state = state;\n\t\t_this.info = info;\n\n\t}\n\n\tinitGLContext();\n\n\t// xr\n\n\tconst xr = new WebXRManager( _this, _gl );\n\n\tthis.xr = xr;\n\n\t// API\n\n\tthis.getContext = function () {\n\n\t\treturn _gl;\n\n\t};\n\n\tthis.getContextAttributes = function () {\n\n\t\treturn _gl.getContextAttributes();\n\n\t};\n\n\tthis.forceContextLoss = function () {\n\n\t\tconst extension = extensions.get( 'WEBGL_lose_context' );\n\t\tif ( extension ) extension.loseContext();\n\n\t};\n\n\tthis.forceContextRestore = function () {\n\n\t\tconst extension = extensions.get( 'WEBGL_lose_context' );\n\t\tif ( extension ) extension.restoreContext();\n\n\t};\n\n\tthis.getPixelRatio = function () {\n\n\t\treturn _pixelRatio;\n\n\t};\n\n\tthis.setPixelRatio = function ( value ) {\n\n\t\tif ( value === undefined ) return;\n\n\t\t_pixelRatio = value;\n\n\t\tthis.setSize( _width, _height, false );\n\n\t};\n\n\tthis.getSize = function ( target ) {\n\n\t\treturn target.set( _width, _height );\n\n\t};\n\n\tthis.setSize = function ( width, height, updateStyle ) {\n\n\t\tif ( xr.isPresenting ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: Can\\'t change size while VR device is presenting.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\t_width = width;\n\t\t_height = height;\n\n\t\t_canvas.width = Math.floor( width * _pixelRatio );\n\t\t_canvas.height = Math.floor( height * _pixelRatio );\n\n\t\tif ( updateStyle !== false ) {\n\n\t\t\t_canvas.style.width = width + 'px';\n\t\t\t_canvas.style.height = height + 'px';\n\n\t\t}\n\n\t\tthis.setViewport( 0, 0, width, height );\n\n\t};\n\n\tthis.getDrawingBufferSize = function ( target ) {\n\n\t\treturn target.set( _width * _pixelRatio, _height * _pixelRatio ).floor();\n\n\t};\n\n\tthis.setDrawingBufferSize = function ( width, height, pixelRatio ) {\n\n\t\t_width = width;\n\t\t_height = height;\n\n\t\t_pixelRatio = pixelRatio;\n\n\t\t_canvas.width = Math.floor( width * pixelRatio );\n\t\t_canvas.height = Math.floor( height * pixelRatio );\n\n\t\tthis.setViewport( 0, 0, width, height );\n\n\t};\n\n\tthis.getCurrentViewport = function ( target ) {\n\n\t\treturn target.copy( _currentViewport );\n\n\t};\n\n\tthis.getViewport = function ( target ) {\n\n\t\treturn target.copy( _viewport );\n\n\t};\n\n\tthis.setViewport = function ( x, y, width, height ) {\n\n\t\tif ( x.isVector4 ) {\n\n\t\t\t_viewport.set( x.x, x.y, x.z, x.w );\n\n\t\t} else {\n\n\t\t\t_viewport.set( x, y, width, height );\n\n\t\t}\n\n\t\tstate.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ).floor() );\n\n\t};\n\n\tthis.getScissor = function ( target ) {\n\n\t\treturn target.copy( _scissor );\n\n\t};\n\n\tthis.setScissor = function ( x, y, width, height ) {\n\n\t\tif ( x.isVector4 ) {\n\n\t\t\t_scissor.set( x.x, x.y, x.z, x.w );\n\n\t\t} else {\n\n\t\t\t_scissor.set( x, y, width, height );\n\n\t\t}\n\n\t\tstate.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ).floor() );\n\n\t};\n\n\tthis.getScissorTest = function () {\n\n\t\treturn _scissorTest;\n\n\t};\n\n\tthis.setScissorTest = function ( boolean ) {\n\n\t\tstate.setScissorTest( _scissorTest = boolean );\n\n\t};\n\n\tthis.setOpaqueSort = function ( method ) {\n\n\t\t_opaqueSort = method;\n\n\t};\n\n\tthis.setTransparentSort = function ( method ) {\n\n\t\t_transparentSort = method;\n\n\t};\n\n\t// Clearing\n\n\tthis.getClearColor = function ( target ) {\n\n\t\treturn target.copy( background.getClearColor() );\n\n\t};\n\n\tthis.setClearColor = function () {\n\n\t\tbackground.setClearColor.apply( background, arguments );\n\n\t};\n\n\tthis.getClearAlpha = function () {\n\n\t\treturn background.getClearAlpha();\n\n\t};\n\n\tthis.setClearAlpha = function () {\n\n\t\tbackground.setClearAlpha.apply( background, arguments );\n\n\t};\n\n\tthis.clear = function ( color = true, depth = true, stencil = true ) {\n\n\t\tlet bits = 0;\n\n\t\tif ( color ) bits |= 16384;\n\t\tif ( depth ) bits |= 256;\n\t\tif ( stencil ) bits |= 1024;\n\n\t\t_gl.clear( bits );\n\n\t};\n\n\tthis.clearColor = function () {\n\n\t\tthis.clear( true, false, false );\n\n\t};\n\n\tthis.clearDepth = function () {\n\n\t\tthis.clear( false, true, false );\n\n\t};\n\n\tthis.clearStencil = function () {\n\n\t\tthis.clear( false, false, true );\n\n\t};\n\n\t//\n\n\tthis.dispose = function () {\n\n\t\t_canvas.removeEventListener( 'webglcontextlost', onContextLost, false );\n\t\t_canvas.removeEventListener( 'webglcontextrestored', onContextRestore, false );\n\t\t_canvas.removeEventListener( 'webglcontextcreationerror', onContextCreationError, false );\n\n\t\trenderLists.dispose();\n\t\trenderStates.dispose();\n\t\tproperties.dispose();\n\t\tcubemaps.dispose();\n\t\tcubeuvmaps.dispose();\n\t\tobjects.dispose();\n\t\tbindingStates.dispose();\n\t\tuniformsGroups.dispose();\n\t\tprogramCache.dispose();\n\n\t\txr.dispose();\n\n\t\txr.removeEventListener( 'sessionstart', onXRSessionStart );\n\t\txr.removeEventListener( 'sessionend', onXRSessionEnd );\n\n\t\tif ( _transmissionRenderTarget ) {\n\n\t\t\t_transmissionRenderTarget.dispose();\n\t\t\t_transmissionRenderTarget = null;\n\n\t\t}\n\n\t\tanimation.stop();\n\n\t};\n\n\t// Events\n\n\tfunction onContextLost( event ) {\n\n\t\tevent.preventDefault();\n\n\t\tconsole.log( 'THREE.WebGLRenderer: Context Lost.' );\n\n\t\t_isContextLost = true;\n\n\t}\n\n\tfunction onContextRestore( /* event */ ) {\n\n\t\tconsole.log( 'THREE.WebGLRenderer: Context Restored.' );\n\n\t\t_isContextLost = false;\n\n\t\tconst infoAutoReset = info.autoReset;\n\t\tconst shadowMapEnabled = shadowMap.enabled;\n\t\tconst shadowMapAutoUpdate = shadowMap.autoUpdate;\n\t\tconst shadowMapNeedsUpdate = shadowMap.needsUpdate;\n\t\tconst shadowMapType = shadowMap.type;\n\n\t\tinitGLContext();\n\n\t\tinfo.autoReset = infoAutoReset;\n\t\tshadowMap.enabled = shadowMapEnabled;\n\t\tshadowMap.autoUpdate = shadowMapAutoUpdate;\n\t\tshadowMap.needsUpdate = shadowMapNeedsUpdate;\n\t\tshadowMap.type = shadowMapType;\n\n\t}\n\n\tfunction onContextCreationError( event ) {\n\n\t\tconsole.error( 'THREE.WebGLRenderer: A WebGL context could not be created. Reason: ', event.statusMessage );\n\n\t}\n\n\tfunction onMaterialDispose( event ) {\n\n\t\tconst material = event.target;\n\n\t\tmaterial.removeEventListener( 'dispose', onMaterialDispose );\n\n\t\tdeallocateMaterial( material );\n\n\t}\n\n\t// Buffer deallocation\n\n\tfunction deallocateMaterial( material ) {\n\n\t\treleaseMaterialProgramReferences( material );\n\n\t\tproperties.remove( material );\n\n\t}\n\n\n\tfunction releaseMaterialProgramReferences( material ) {\n\n\t\tconst programs = properties.get( material ).programs;\n\n\t\tif ( programs !== undefined ) {\n\n\t\t\tprograms.forEach( function ( program ) {\n\n\t\t\t\tprogramCache.releaseProgram( program );\n\n\t\t\t} );\n\n\t\t\tif ( material.isShaderMaterial ) {\n\n\t\t\t\tprogramCache.releaseShaderCache( material );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t// Buffer rendering\n\n\tthis.renderBufferDirect = function ( camera, scene, geometry, material, object, group ) {\n\n\t\tif ( scene === null ) scene = _emptyScene; // renderBufferDirect second parameter used to be fog (could be null)\n\n\t\tconst frontFaceCW = ( object.isMesh && object.matrixWorld.determinant() < 0 );\n\n\t\tconst program = setProgram( camera, scene, geometry, material, object );\n\n\t\tstate.setMaterial( material, frontFaceCW );\n\n\t\t//\n\n\t\tlet index = geometry.index;\n\t\tconst position = geometry.attributes.position;\n\n\t\t//\n\n\t\tif ( index === null ) {\n\n\t\t\tif ( position === undefined || position.count === 0 ) return;\n\n\t\t} else if ( index.count === 0 ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t//\n\n\t\tlet rangeFactor = 1;\n\n\t\tif ( material.wireframe === true ) {\n\n\t\t\tindex = geometries.getWireframeAttribute( geometry );\n\t\t\trangeFactor = 2;\n\n\t\t}\n\n\t\tbindingStates.setup( object, material, program, geometry, index );\n\n\t\tlet attribute;\n\t\tlet renderer = bufferRenderer;\n\n\t\tif ( index !== null ) {\n\n\t\t\tattribute = attributes.get( index );\n\n\t\t\trenderer = indexedBufferRenderer;\n\t\t\trenderer.setIndex( attribute );\n\n\t\t}\n\n\t\t//\n\n\t\tconst dataCount = ( index !== null ) ? index.count : position.count;\n\n\t\tconst rangeStart = geometry.drawRange.start * rangeFactor;\n\t\tconst rangeCount = geometry.drawRange.count * rangeFactor;\n\n\t\tconst groupStart = group !== null ? group.start * rangeFactor : 0;\n\t\tconst groupCount = group !== null ? group.count * rangeFactor : Infinity;\n\n\t\tconst drawStart = Math.max( rangeStart, groupStart );\n\t\tconst drawEnd = Math.min( dataCount, rangeStart + rangeCount, groupStart + groupCount ) - 1;\n\n\t\tconst drawCount = Math.max( 0, drawEnd - drawStart + 1 );\n\n\t\tif ( drawCount === 0 ) return;\n\n\t\t//\n\n\t\tif ( object.isMesh ) {\n\n\t\t\tif ( material.wireframe === true ) {\n\n\t\t\t\tstate.setLineWidth( material.wireframeLinewidth * getTargetPixelRatio() );\n\t\t\t\trenderer.setMode( 1 );\n\n\t\t\t} else {\n\n\t\t\t\trenderer.setMode( 4 );\n\n\t\t\t}\n\n\t\t} else if ( object.isLine ) {\n\n\t\t\tlet lineWidth = material.linewidth;\n\n\t\t\tif ( lineWidth === undefined ) lineWidth = 1; // Not using Line*Material\n\n\t\t\tstate.setLineWidth( lineWidth * getTargetPixelRatio() );\n\n\t\t\tif ( object.isLineSegments ) {\n\n\t\t\t\trenderer.setMode( 1 );\n\n\t\t\t} else if ( object.isLineLoop ) {\n\n\t\t\t\trenderer.setMode( 2 );\n\n\t\t\t} else {\n\n\t\t\t\trenderer.setMode( 3 );\n\n\t\t\t}\n\n\t\t} else if ( object.isPoints ) {\n\n\t\t\trenderer.setMode( 0 );\n\n\t\t} else if ( object.isSprite ) {\n\n\t\t\trenderer.setMode( 4 );\n\n\t\t}\n\n\t\tif ( object.isInstancedMesh ) {\n\n\t\t\trenderer.renderInstances( drawStart, drawCount, object.count );\n\n\t\t} else if ( geometry.isInstancedBufferGeometry ) {\n\n\t\t\tconst instanceCount = Math.min( geometry.instanceCount, geometry._maxInstanceCount );\n\n\t\t\trenderer.renderInstances( drawStart, drawCount, instanceCount );\n\n\t\t} else {\n\n\t\t\trenderer.render( drawStart, drawCount );\n\n\t\t}\n\n\t};\n\n\t// Compile\n\n\tthis.compile = function ( scene, camera ) {\n\n\t\tcurrentRenderState = renderStates.get( scene );\n\t\tcurrentRenderState.init();\n\n\t\trenderStateStack.push( currentRenderState );\n\n\t\tscene.traverseVisible( function ( object ) {\n\n\t\t\tif ( object.isLight && object.layers.test( camera.layers ) ) {\n\n\t\t\t\tcurrentRenderState.pushLight( object );\n\n\t\t\t\tif ( object.castShadow ) {\n\n\t\t\t\t\tcurrentRenderState.pushShadow( object );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} );\n\n\t\tcurrentRenderState.setupLights( _this.physicallyCorrectLights );\n\n\t\tscene.traverse( function ( object ) {\n\n\t\t\tconst material = object.material;\n\n\t\t\tif ( material ) {\n\n\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\tfor ( let i = 0; i < material.length; i ++ ) {\n\n\t\t\t\t\t\tconst material2 = material[ i ];\n\n\t\t\t\t\t\tgetProgram( material2, scene, object );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tgetProgram( material, scene, object );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} );\n\n\t\trenderStateStack.pop();\n\t\tcurrentRenderState = null;\n\n\t};\n\n\t// Animation Loop\n\n\tlet onAnimationFrameCallback = null;\n\n\tfunction onAnimationFrame( time ) {\n\n\t\tif ( onAnimationFrameCallback ) onAnimationFrameCallback( time );\n\n\t}\n\n\tfunction onXRSessionStart() {\n\n\t\tanimation.stop();\n\n\t}\n\n\tfunction onXRSessionEnd() {\n\n\t\tanimation.start();\n\n\t}\n\n\tconst animation = new WebGLAnimation();\n\tanimation.setAnimationLoop( onAnimationFrame );\n\n\tif ( typeof self !== 'undefined' ) animation.setContext( self );\n\n\tthis.setAnimationLoop = function ( callback ) {\n\n\t\tonAnimationFrameCallback = callback;\n\t\txr.setAnimationLoop( callback );\n\n\t\t( callback === null ) ? animation.stop() : animation.start();\n\n\t};\n\n\txr.addEventListener( 'sessionstart', onXRSessionStart );\n\txr.addEventListener( 'sessionend', onXRSessionEnd );\n\n\t// Rendering\n\n\tthis.render = function ( scene, camera ) {\n\n\t\tif ( camera !== undefined && camera.isCamera !== true ) {\n\n\t\t\tconsole.error( 'THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( _isContextLost === true ) return;\n\n\t\t// update scene graph\n\n\t\tif ( scene.autoUpdate === true ) scene.updateMatrixWorld();\n\n\t\t// update camera matrices and frustum\n\n\t\tif ( camera.parent === null ) camera.updateMatrixWorld();\n\n\t\tif ( xr.enabled === true && xr.isPresenting === true ) {\n\n\t\t\tif ( xr.cameraAutoUpdate === true ) xr.updateCamera( camera );\n\n\t\t\tcamera = xr.getCamera(); // use XR camera for rendering\n\n\t\t}\n\n\t\t//\n\t\tif ( scene.isScene === true ) scene.onBeforeRender( _this, scene, camera, _currentRenderTarget );\n\n\t\tcurrentRenderState = renderStates.get( scene, renderStateStack.length );\n\t\tcurrentRenderState.init();\n\n\t\trenderStateStack.push( currentRenderState );\n\n\t\t_projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );\n\t\t_frustum.setFromProjectionMatrix( _projScreenMatrix );\n\n\t\t_localClippingEnabled = this.localClippingEnabled;\n\t\t_clippingEnabled = clipping.init( this.clippingPlanes, _localClippingEnabled, camera );\n\n\t\tcurrentRenderList = renderLists.get( scene, renderListStack.length );\n\t\tcurrentRenderList.init();\n\n\t\trenderListStack.push( currentRenderList );\n\n\t\tprojectObject( scene, camera, 0, _this.sortObjects );\n\n\t\tcurrentRenderList.finish();\n\n\t\tif ( _this.sortObjects === true ) {\n\n\t\t\tcurrentRenderList.sort( _opaqueSort, _transparentSort );\n\n\t\t}\n\n\t\t//\n\n\t\tif ( _clippingEnabled === true ) clipping.beginShadows();\n\n\t\tconst shadowsArray = currentRenderState.state.shadowsArray;\n\n\t\tshadowMap.render( shadowsArray, scene, camera );\n\n\t\tif ( _clippingEnabled === true ) clipping.endShadows();\n\n\t\t//\n\n\t\tif ( this.info.autoReset === true ) this.info.reset();\n\n\t\t//\n\n\t\tbackground.render( currentRenderList, scene );\n\n\t\t// render scene\n\n\t\tcurrentRenderState.setupLights( _this.physicallyCorrectLights );\n\n\t\tif ( camera.isArrayCamera ) {\n\n\t\t\tconst cameras = camera.cameras;\n\n\t\t\tfor ( let i = 0, l = cameras.length; i < l; i ++ ) {\n\n\t\t\t\tconst camera2 = cameras[ i ];\n\n\t\t\t\trenderScene( currentRenderList, scene, camera2, camera2.viewport );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\trenderScene( currentRenderList, scene, camera );\n\n\t\t}\n\n\t\t//\n\n\t\tif ( _currentRenderTarget !== null ) {\n\n\t\t\t// resolve multisample renderbuffers to a single-sample texture if necessary\n\n\t\t\ttextures.updateMultisampleRenderTarget( _currentRenderTarget );\n\n\t\t\t// Generate mipmap if we're using any kind of mipmap filtering\n\n\t\t\ttextures.updateRenderTargetMipmap( _currentRenderTarget );\n\n\t\t}\n\n\t\t//\n\n\t\tif ( scene.isScene === true ) scene.onAfterRender( _this, scene, camera );\n\n\t\t// _gl.finish();\n\n\t\tbindingStates.resetDefaultState();\n\t\t_currentMaterialId = - 1;\n\t\t_currentCamera = null;\n\n\t\trenderStateStack.pop();\n\n\t\tif ( renderStateStack.length > 0 ) {\n\n\t\t\tcurrentRenderState = renderStateStack[ renderStateStack.length - 1 ];\n\n\t\t} else {\n\n\t\t\tcurrentRenderState = null;\n\n\t\t}\n\n\t\trenderListStack.pop();\n\n\t\tif ( renderListStack.length > 0 ) {\n\n\t\t\tcurrentRenderList = renderListStack[ renderListStack.length - 1 ];\n\n\t\t} else {\n\n\t\t\tcurrentRenderList = null;\n\n\t\t}\n\n\t};\n\n\tfunction projectObject( object, camera, groupOrder, sortObjects ) {\n\n\t\tif ( object.visible === false ) return;\n\n\t\tconst visible = object.layers.test( camera.layers );\n\n\t\tif ( visible ) {\n\n\t\t\tif ( object.isGroup ) {\n\n\t\t\t\tgroupOrder = object.renderOrder;\n\n\t\t\t} else if ( object.isLOD ) {\n\n\t\t\t\tif ( object.autoUpdate === true ) object.update( camera );\n\n\t\t\t} else if ( object.isLight ) {\n\n\t\t\t\tcurrentRenderState.pushLight( object );\n\n\t\t\t\tif ( object.castShadow ) {\n\n\t\t\t\t\tcurrentRenderState.pushShadow( object );\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isSprite ) {\n\n\t\t\t\tif ( ! object.frustumCulled || _frustum.intersectsSprite( object ) ) {\n\n\t\t\t\t\tif ( sortObjects ) {\n\n\t\t\t\t\t\t_vector3.setFromMatrixPosition( object.matrixWorld )\n\t\t\t\t\t\t\t.applyMatrix4( _projScreenMatrix );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst geometry = objects.update( object );\n\t\t\t\t\tconst material = object.material;\n\n\t\t\t\t\tif ( material.visible ) {\n\n\t\t\t\t\t\tcurrentRenderList.push( object, geometry, material, groupOrder, _vector3.z, null );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isMesh || object.isLine || object.isPoints ) {\n\n\t\t\t\tif ( object.isSkinnedMesh ) {\n\n\t\t\t\t\t// update skeleton only once in a frame\n\n\t\t\t\t\tif ( object.skeleton.frame !== info.render.frame ) {\n\n\t\t\t\t\t\tobject.skeleton.update();\n\t\t\t\t\t\tobject.skeleton.frame = info.render.frame;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) {\n\n\t\t\t\t\tif ( sortObjects ) {\n\n\t\t\t\t\t\t_vector3.setFromMatrixPosition( object.matrixWorld )\n\t\t\t\t\t\t\t.applyMatrix4( _projScreenMatrix );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst geometry = objects.update( object );\n\t\t\t\t\tconst material = object.material;\n\n\t\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\t\tconst groups = geometry.groups;\n\n\t\t\t\t\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\t\t\t\t\tconst group = groups[ i ];\n\t\t\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\t\t\tif ( groupMaterial && groupMaterial.visible ) {\n\n\t\t\t\t\t\t\t\tcurrentRenderList.push( object, geometry, groupMaterial, groupOrder, _vector3.z, group );\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 if ( material.visible ) {\n\n\t\t\t\t\t\tcurrentRenderList.push( object, geometry, material, groupOrder, _vector3.z, null );\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\tconst children = object.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tprojectObject( children[ i ], camera, groupOrder, sortObjects );\n\n\t\t}\n\n\t}\n\n\tfunction renderScene( currentRenderList, scene, camera, viewport ) {\n\n\t\tconst opaqueObjects = currentRenderList.opaque;\n\t\tconst transmissiveObjects = currentRenderList.transmissive;\n\t\tconst transparentObjects = currentRenderList.transparent;\n\n\t\tcurrentRenderState.setupLightsView( camera );\n\n\t\tif ( transmissiveObjects.length > 0 ) renderTransmissionPass( opaqueObjects, scene, camera );\n\n\t\tif ( viewport ) state.viewport( _currentViewport.copy( viewport ) );\n\n\t\tif ( opaqueObjects.length > 0 ) renderObjects( opaqueObjects, scene, camera );\n\t\tif ( transmissiveObjects.length > 0 ) renderObjects( transmissiveObjects, scene, camera );\n\t\tif ( transparentObjects.length > 0 ) renderObjects( transparentObjects, scene, camera );\n\n\t\t// Ensure depth buffer writing is enabled so it can be cleared on next render\n\n\t\tstate.buffers.depth.setTest( true );\n\t\tstate.buffers.depth.setMask( true );\n\t\tstate.buffers.color.setMask( true );\n\n\t\tstate.setPolygonOffset( false );\n\n\t}\n\n\tfunction renderTransmissionPass( opaqueObjects, scene, camera ) {\n\n\t\tconst isWebGL2 = capabilities.isWebGL2;\n\n\t\tif ( _transmissionRenderTarget === null ) {\n\n\t\t\t_transmissionRenderTarget = new WebGLRenderTarget( 1, 1, {\n\t\t\t\tgenerateMipmaps: true,\n\t\t\t\ttype: extensions.has( 'EXT_color_buffer_half_float' ) ? HalfFloatType : UnsignedByteType,\n\t\t\t\tminFilter: LinearMipmapLinearFilter,\n\t\t\t\tsamples: ( isWebGL2 && _antialias === true ) ? 4 : 0\n\t\t\t} );\n\n\t\t}\n\n\t\t_this.getDrawingBufferSize( _vector2 );\n\n\t\tif ( isWebGL2 ) {\n\n\t\t\t_transmissionRenderTarget.setSize( _vector2.x, _vector2.y );\n\n\t\t} else {\n\n\t\t\t_transmissionRenderTarget.setSize( floorPowerOfTwo( _vector2.x ), floorPowerOfTwo( _vector2.y ) );\n\n\t\t}\n\n\t\t//\n\n\t\tconst currentRenderTarget = _this.getRenderTarget();\n\t\t_this.setRenderTarget( _transmissionRenderTarget );\n\t\t_this.clear();\n\n\t\t// Turn off the features which can affect the frag color for opaque objects pass.\n\t\t// Otherwise they are applied twice in opaque objects pass and transmission objects pass.\n\t\tconst currentToneMapping = _this.toneMapping;\n\t\t_this.toneMapping = NoToneMapping;\n\n\t\trenderObjects( opaqueObjects, scene, camera );\n\n\t\t_this.toneMapping = currentToneMapping;\n\n\t\ttextures.updateMultisampleRenderTarget( _transmissionRenderTarget );\n\t\ttextures.updateRenderTargetMipmap( _transmissionRenderTarget );\n\n\t\t_this.setRenderTarget( currentRenderTarget );\n\n\t}\n\n\tfunction renderObjects( renderList, scene, camera ) {\n\n\t\tconst overrideMaterial = scene.isScene === true ? scene.overrideMaterial : null;\n\n\t\tfor ( let i = 0, l = renderList.length; i < l; i ++ ) {\n\n\t\t\tconst renderItem = renderList[ i ];\n\n\t\t\tconst object = renderItem.object;\n\t\t\tconst geometry = renderItem.geometry;\n\t\t\tconst material = overrideMaterial === null ? renderItem.material : overrideMaterial;\n\t\t\tconst group = renderItem.group;\n\n\t\t\tif ( object.layers.test( camera.layers ) ) {\n\n\t\t\t\trenderObject( object, scene, camera, geometry, material, group );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction renderObject( object, scene, camera, geometry, material, group ) {\n\n\t\tobject.onBeforeRender( _this, scene, camera, geometry, material, group );\n\n\t\tobject.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );\n\t\tobject.normalMatrix.getNormalMatrix( object.modelViewMatrix );\n\n\t\tmaterial.onBeforeRender( _this, scene, camera, geometry, object, group );\n\n\t\tif ( material.transparent === true && material.side === DoubleSide ) {\n\n\t\t\tmaterial.side = BackSide;\n\t\t\tmaterial.needsUpdate = true;\n\t\t\t_this.renderBufferDirect( camera, scene, geometry, material, object, group );\n\n\t\t\tmaterial.side = FrontSide;\n\t\t\tmaterial.needsUpdate = true;\n\t\t\t_this.renderBufferDirect( camera, scene, geometry, material, object, group );\n\n\t\t\tmaterial.side = DoubleSide;\n\n\t\t} else {\n\n\t\t\t_this.renderBufferDirect( camera, scene, geometry, material, object, group );\n\n\t\t}\n\n\t\tobject.onAfterRender( _this, scene, camera, geometry, material, group );\n\n\t}\n\n\tfunction getProgram( material, scene, object ) {\n\n\t\tif ( scene.isScene !== true ) scene = _emptyScene; // scene could be a Mesh, Line, Points, ...\n\n\t\tconst materialProperties = properties.get( material );\n\n\t\tconst lights = currentRenderState.state.lights;\n\t\tconst shadowsArray = currentRenderState.state.shadowsArray;\n\n\t\tconst lightsStateVersion = lights.state.version;\n\n\t\tconst parameters = programCache.getParameters( material, lights.state, shadowsArray, scene, object );\n\t\tconst programCacheKey = programCache.getProgramCacheKey( parameters );\n\n\t\tlet programs = materialProperties.programs;\n\n\t\t// always update environment and fog - changing these trigger an getProgram call, but it's possible that the program doesn't change\n\n\t\tmaterialProperties.environment = material.isMeshStandardMaterial ? scene.environment : null;\n\t\tmaterialProperties.fog = scene.fog;\n\t\tmaterialProperties.envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || materialProperties.environment );\n\n\t\tif ( programs === undefined ) {\n\n\t\t\t// new material\n\n\t\t\tmaterial.addEventListener( 'dispose', onMaterialDispose );\n\n\t\t\tprograms = new Map();\n\t\t\tmaterialProperties.programs = programs;\n\n\t\t}\n\n\t\tlet program = programs.get( programCacheKey );\n\n\t\tif ( program !== undefined ) {\n\n\t\t\t// early out if program and light state is identical\n\n\t\t\tif ( materialProperties.currentProgram === program && materialProperties.lightsStateVersion === lightsStateVersion ) {\n\n\t\t\t\tupdateCommonMaterialProperties( material, parameters );\n\n\t\t\t\treturn program;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tparameters.uniforms = programCache.getUniforms( material );\n\n\t\t\tmaterial.onBuild( object, parameters, _this );\n\n\t\t\tmaterial.onBeforeCompile( parameters, _this );\n\n\t\t\tprogram = programCache.acquireProgram( parameters, programCacheKey );\n\t\t\tprograms.set( programCacheKey, program );\n\n\t\t\tmaterialProperties.uniforms = parameters.uniforms;\n\n\t\t}\n\n\t\tconst uniforms = materialProperties.uniforms;\n\n\t\tif ( ( ! material.isShaderMaterial && ! material.isRawShaderMaterial ) || material.clipping === true ) {\n\n\t\t\tuniforms.clippingPlanes = clipping.uniform;\n\n\t\t}\n\n\t\tupdateCommonMaterialProperties( material, parameters );\n\n\t\t// store the light setup it was created for\n\n\t\tmaterialProperties.needsLights = materialNeedsLights( material );\n\t\tmaterialProperties.lightsStateVersion = lightsStateVersion;\n\n\t\tif ( materialProperties.needsLights ) {\n\n\t\t\t// wire up the material to this renderer's lighting state\n\n\t\t\tuniforms.ambientLightColor.value = lights.state.ambient;\n\t\t\tuniforms.lightProbe.value = lights.state.probe;\n\t\t\tuniforms.directionalLights.value = lights.state.directional;\n\t\t\tuniforms.directionalLightShadows.value = lights.state.directionalShadow;\n\t\t\tuniforms.spotLights.value = lights.state.spot;\n\t\t\tuniforms.spotLightShadows.value = lights.state.spotShadow;\n\t\t\tuniforms.rectAreaLights.value = lights.state.rectArea;\n\t\t\tuniforms.ltc_1.value = lights.state.rectAreaLTC1;\n\t\t\tuniforms.ltc_2.value = lights.state.rectAreaLTC2;\n\t\t\tuniforms.pointLights.value = lights.state.point;\n\t\t\tuniforms.pointLightShadows.value = lights.state.pointShadow;\n\t\t\tuniforms.hemisphereLights.value = lights.state.hemi;\n\n\t\t\tuniforms.directionalShadowMap.value = lights.state.directionalShadowMap;\n\t\t\tuniforms.directionalShadowMatrix.value = lights.state.directionalShadowMatrix;\n\t\t\tuniforms.spotShadowMap.value = lights.state.spotShadowMap;\n\t\t\tuniforms.spotShadowMatrix.value = lights.state.spotShadowMatrix;\n\t\t\tuniforms.pointShadowMap.value = lights.state.pointShadowMap;\n\t\t\tuniforms.pointShadowMatrix.value = lights.state.pointShadowMatrix;\n\t\t\t// TODO (abelnation): add area lights shadow info to uniforms\n\n\t\t}\n\n\t\tconst progUniforms = program.getUniforms();\n\t\tconst uniformsList = WebGLUniforms.seqWithValue( progUniforms.seq, uniforms );\n\n\t\tmaterialProperties.currentProgram = program;\n\t\tmaterialProperties.uniformsList = uniformsList;\n\n\t\treturn program;\n\n\t}\n\n\tfunction updateCommonMaterialProperties( material, parameters ) {\n\n\t\tconst materialProperties = properties.get( material );\n\n\t\tmaterialProperties.outputEncoding = parameters.outputEncoding;\n\t\tmaterialProperties.instancing = parameters.instancing;\n\t\tmaterialProperties.skinning = parameters.skinning;\n\t\tmaterialProperties.morphTargets = parameters.morphTargets;\n\t\tmaterialProperties.morphNormals = parameters.morphNormals;\n\t\tmaterialProperties.morphColors = parameters.morphColors;\n\t\tmaterialProperties.morphTargetsCount = parameters.morphTargetsCount;\n\t\tmaterialProperties.numClippingPlanes = parameters.numClippingPlanes;\n\t\tmaterialProperties.numIntersection = parameters.numClipIntersection;\n\t\tmaterialProperties.vertexAlphas = parameters.vertexAlphas;\n\t\tmaterialProperties.vertexTangents = parameters.vertexTangents;\n\t\tmaterialProperties.toneMapping = parameters.toneMapping;\n\n\t}\n\n\tfunction setProgram( camera, scene, geometry, material, object ) {\n\n\t\tif ( scene.isScene !== true ) scene = _emptyScene; // scene could be a Mesh, Line, Points, ...\n\n\t\ttextures.resetTextureUnits();\n\n\t\tconst fog = scene.fog;\n\t\tconst environment = material.isMeshStandardMaterial ? scene.environment : null;\n\t\tconst encoding = ( _currentRenderTarget === null ) ? _this.outputEncoding : ( _currentRenderTarget.isXRRenderTarget === true ? _currentRenderTarget.texture.encoding : LinearEncoding );\n\t\tconst envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || environment );\n\t\tconst vertexAlphas = material.vertexColors === true && !! geometry.attributes.color && geometry.attributes.color.itemSize === 4;\n\t\tconst vertexTangents = !! material.normalMap && !! geometry.attributes.tangent;\n\t\tconst morphTargets = !! geometry.morphAttributes.position;\n\t\tconst morphNormals = !! geometry.morphAttributes.normal;\n\t\tconst morphColors = !! geometry.morphAttributes.color;\n\t\tconst toneMapping = material.toneMapped ? _this.toneMapping : NoToneMapping;\n\n\t\tconst morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color;\n\t\tconst morphTargetsCount = ( morphAttribute !== undefined ) ? morphAttribute.length : 0;\n\n\t\tconst materialProperties = properties.get( material );\n\t\tconst lights = currentRenderState.state.lights;\n\n\t\tif ( _clippingEnabled === true ) {\n\n\t\t\tif ( _localClippingEnabled === true || camera !== _currentCamera ) {\n\n\t\t\t\tconst useCache =\n\t\t\t\t\tcamera === _currentCamera &&\n\t\t\t\t\tmaterial.id === _currentMaterialId;\n\n\t\t\t\t// we might want to call this function with some ClippingGroup\n\t\t\t\t// object instead of the material, once it becomes feasible\n\t\t\t\t// (#8465, #8379)\n\t\t\t\tclipping.setState( material, camera, useCache );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tlet needsProgramChange = false;\n\n\t\tif ( material.version === materialProperties.__version ) {\n\n\t\t\tif ( materialProperties.needsLights && ( materialProperties.lightsStateVersion !== lights.state.version ) ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( materialProperties.outputEncoding !== encoding ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( object.isInstancedMesh && materialProperties.instancing === false ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( ! object.isInstancedMesh && materialProperties.instancing === true ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( object.isSkinnedMesh && materialProperties.skinning === false ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( ! object.isSkinnedMesh && materialProperties.skinning === true ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( materialProperties.envMap !== envMap ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( material.fog === true && materialProperties.fog !== fog ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( materialProperties.numClippingPlanes !== undefined &&\n\t\t\t\t( materialProperties.numClippingPlanes !== clipping.numPlanes ||\n\t\t\t\tmaterialProperties.numIntersection !== clipping.numIntersection ) ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( materialProperties.vertexAlphas !== vertexAlphas ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( materialProperties.vertexTangents !== vertexTangents ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( materialProperties.morphTargets !== morphTargets ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( materialProperties.morphNormals !== morphNormals ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( materialProperties.morphColors !== morphColors ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( materialProperties.toneMapping !== toneMapping ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( capabilities.isWebGL2 === true && materialProperties.morphTargetsCount !== morphTargetsCount ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tneedsProgramChange = true;\n\t\t\tmaterialProperties.__version = material.version;\n\n\t\t}\n\n\t\t//\n\n\t\tlet program = materialProperties.currentProgram;\n\n\t\tif ( needsProgramChange === true ) {\n\n\t\t\tprogram = getProgram( material, scene, object );\n\n\t\t}\n\n\t\tlet refreshProgram = false;\n\t\tlet refreshMaterial = false;\n\t\tlet refreshLights = false;\n\n\t\tconst p_uniforms = program.getUniforms(),\n\t\t\tm_uniforms = materialProperties.uniforms;\n\n\t\tif ( state.useProgram( program.program ) ) {\n\n\t\t\trefreshProgram = true;\n\t\t\trefreshMaterial = true;\n\t\t\trefreshLights = true;\n\n\t\t}\n\n\t\tif ( material.id !== _currentMaterialId ) {\n\n\t\t\t_currentMaterialId = material.id;\n\n\t\t\trefreshMaterial = true;\n\n\t\t}\n\n\t\tif ( refreshProgram || _currentCamera !== camera ) {\n\n\t\t\tp_uniforms.setValue( _gl, 'projectionMatrix', camera.projectionMatrix );\n\n\t\t\tif ( capabilities.logarithmicDepthBuffer ) {\n\n\t\t\t\tp_uniforms.setValue( _gl, 'logDepthBufFC',\n\t\t\t\t\t2.0 / ( Math.log( camera.far + 1.0 ) / Math.LN2 ) );\n\n\t\t\t}\n\n\t\t\tif ( _currentCamera !== camera ) {\n\n\t\t\t\t_currentCamera = camera;\n\n\t\t\t\t// lighting uniforms depend on the camera so enforce an update\n\t\t\t\t// now, in case this material supports lights - or later, when\n\t\t\t\t// the next material that does gets activated:\n\n\t\t\t\trefreshMaterial = true;\t\t// set to true on material change\n\t\t\t\trefreshLights = true;\t\t// remains set until update done\n\n\t\t\t}\n\n\t\t\t// load material specific uniforms\n\t\t\t// (shader material also gets them for the sake of genericity)\n\n\t\t\tif ( material.isShaderMaterial ||\n\t\t\t\tmaterial.isMeshPhongMaterial ||\n\t\t\t\tmaterial.isMeshToonMaterial ||\n\t\t\t\tmaterial.isMeshStandardMaterial ||\n\t\t\t\tmaterial.envMap ) {\n\n\t\t\t\tconst uCamPos = p_uniforms.map.cameraPosition;\n\n\t\t\t\tif ( uCamPos !== undefined ) {\n\n\t\t\t\t\tuCamPos.setValue( _gl,\n\t\t\t\t\t\t_vector3.setFromMatrixPosition( camera.matrixWorld ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( material.isMeshPhongMaterial ||\n\t\t\t\tmaterial.isMeshToonMaterial ||\n\t\t\t\tmaterial.isMeshLambertMaterial ||\n\t\t\t\tmaterial.isMeshBasicMaterial ||\n\t\t\t\tmaterial.isMeshStandardMaterial ||\n\t\t\t\tmaterial.isShaderMaterial ) {\n\n\t\t\t\tp_uniforms.setValue( _gl, 'isOrthographic', camera.isOrthographicCamera === true );\n\n\t\t\t}\n\n\t\t\tif ( material.isMeshPhongMaterial ||\n\t\t\t\tmaterial.isMeshToonMaterial ||\n\t\t\t\tmaterial.isMeshLambertMaterial ||\n\t\t\t\tmaterial.isMeshBasicMaterial ||\n\t\t\t\tmaterial.isMeshStandardMaterial ||\n\t\t\t\tmaterial.isShaderMaterial ||\n\t\t\t\tmaterial.isShadowMaterial ||\n\t\t\t\tobject.isSkinnedMesh ) {\n\n\t\t\t\tp_uniforms.setValue( _gl, 'viewMatrix', camera.matrixWorldInverse );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// skinning and morph target uniforms must be set even if material didn't change\n\t\t// auto-setting of texture unit for bone and morph texture must go before other textures\n\t\t// otherwise textures used for skinning and morphing can take over texture units reserved for other material textures\n\n\t\tif ( object.isSkinnedMesh ) {\n\n\t\t\tp_uniforms.setOptional( _gl, object, 'bindMatrix' );\n\t\t\tp_uniforms.setOptional( _gl, object, 'bindMatrixInverse' );\n\n\t\t\tconst skeleton = object.skeleton;\n\n\t\t\tif ( skeleton ) {\n\n\t\t\t\tif ( capabilities.floatVertexTextures ) {\n\n\t\t\t\t\tif ( skeleton.boneTexture === null ) skeleton.computeBoneTexture();\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'boneTexture', skeleton.boneTexture, textures );\n\t\t\t\t\tp_uniforms.setValue( _gl, 'boneTextureSize', skeleton.boneTextureSize );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: SkinnedMesh can only be used with WebGL 2. With WebGL 1 OES_texture_float and vertex textures support is required.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst morphAttributes = geometry.morphAttributes;\n\n\t\tif ( morphAttributes.position !== undefined || morphAttributes.normal !== undefined || ( morphAttributes.color !== undefined && capabilities.isWebGL2 === true ) ) {\n\n\t\t\tmorphtargets.update( object, geometry, material, program );\n\n\t\t}\n\n\n\t\tif ( refreshMaterial || materialProperties.receiveShadow !== object.receiveShadow ) {\n\n\t\t\tmaterialProperties.receiveShadow = object.receiveShadow;\n\t\t\tp_uniforms.setValue( _gl, 'receiveShadow', object.receiveShadow );\n\n\t\t}\n\n\t\tif ( refreshMaterial ) {\n\n\t\t\tp_uniforms.setValue( _gl, 'toneMappingExposure', _this.toneMappingExposure );\n\n\t\t\tif ( materialProperties.needsLights ) {\n\n\t\t\t\t// the current material requires lighting info\n\n\t\t\t\t// note: all lighting uniforms are always set correctly\n\t\t\t\t// they simply reference the renderer's state for their\n\t\t\t\t// values\n\t\t\t\t//\n\t\t\t\t// use the current material's .needsUpdate flags to set\n\t\t\t\t// the GL state when required\n\n\t\t\t\tmarkUniformsLightsNeedsUpdate( m_uniforms, refreshLights );\n\n\t\t\t}\n\n\t\t\t// refresh uniforms common to several materials\n\n\t\t\tif ( fog && material.fog === true ) {\n\n\t\t\t\tmaterials.refreshFogUniforms( m_uniforms, fog );\n\n\t\t\t}\n\n\t\t\tmaterials.refreshMaterialUniforms( m_uniforms, material, _pixelRatio, _height, _transmissionRenderTarget );\n\n\t\t\tWebGLUniforms.upload( _gl, materialProperties.uniformsList, m_uniforms, textures );\n\n\t\t}\n\n\t\tif ( material.isShaderMaterial && material.uniformsNeedUpdate === true ) {\n\n\t\t\tWebGLUniforms.upload( _gl, materialProperties.uniformsList, m_uniforms, textures );\n\t\t\tmaterial.uniformsNeedUpdate = false;\n\n\t\t}\n\n\t\tif ( material.isSpriteMaterial ) {\n\n\t\t\tp_uniforms.setValue( _gl, 'center', object.center );\n\n\t\t}\n\n\t\t// common matrices\n\n\t\tp_uniforms.setValue( _gl, 'modelViewMatrix', object.modelViewMatrix );\n\t\tp_uniforms.setValue( _gl, 'normalMatrix', object.normalMatrix );\n\t\tp_uniforms.setValue( _gl, 'modelMatrix', object.matrixWorld );\n\n\t\t// UBOs\n\n\t\tif ( material.isShaderMaterial || material.isRawShaderMaterial ) {\n\n\t\t\tconst groups = material.uniformsGroups;\n\n\t\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\t\tif ( capabilities.isWebGL2 ) {\n\n\t\t\t\t\tconst group = groups[ i ];\n\n\t\t\t\t\tuniformsGroups.update( group, program );\n\t\t\t\t\tuniformsGroups.bind( group, program );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Uniform Buffer Objects can only be used with WebGL 2.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn program;\n\n\t}\n\n\t// If uniforms are marked as clean, they don't need to be loaded to the GPU.\n\n\tfunction markUniformsLightsNeedsUpdate( uniforms, value ) {\n\n\t\tuniforms.ambientLightColor.needsUpdate = value;\n\t\tuniforms.lightProbe.needsUpdate = value;\n\n\t\tuniforms.directionalLights.needsUpdate = value;\n\t\tuniforms.directionalLightShadows.needsUpdate = value;\n\t\tuniforms.pointLights.needsUpdate = value;\n\t\tuniforms.pointLightShadows.needsUpdate = value;\n\t\tuniforms.spotLights.needsUpdate = value;\n\t\tuniforms.spotLightShadows.needsUpdate = value;\n\t\tuniforms.rectAreaLights.needsUpdate = value;\n\t\tuniforms.hemisphereLights.needsUpdate = value;\n\n\t}\n\n\tfunction materialNeedsLights( material ) {\n\n\t\treturn material.isMeshLambertMaterial || material.isMeshToonMaterial || material.isMeshPhongMaterial ||\n\t\t\tmaterial.isMeshStandardMaterial || material.isShadowMaterial ||\n\t\t\t( material.isShaderMaterial && material.lights === true );\n\n\t}\n\n\tthis.getActiveCubeFace = function () {\n\n\t\treturn _currentActiveCubeFace;\n\n\t};\n\n\tthis.getActiveMipmapLevel = function () {\n\n\t\treturn _currentActiveMipmapLevel;\n\n\t};\n\n\tthis.getRenderTarget = function () {\n\n\t\treturn _currentRenderTarget;\n\n\t};\n\n\tthis.setRenderTargetTextures = function ( renderTarget, colorTexture, depthTexture ) {\n\n\t\tproperties.get( renderTarget.texture ).__webglTexture = colorTexture;\n\t\tproperties.get( renderTarget.depthTexture ).__webglTexture = depthTexture;\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\trenderTargetProperties.__hasExternalTextures = true;\n\n\t\tif ( renderTargetProperties.__hasExternalTextures ) {\n\n\t\t\trenderTargetProperties.__autoAllocateDepthBuffer = depthTexture === undefined;\n\n\t\t\tif ( ! renderTargetProperties.__autoAllocateDepthBuffer ) {\n\n\t\t\t\t// The multisample_render_to_texture extension doesn't work properly if there\n\t\t\t\t// are midframe flushes and an external depth buffer. Disable use of the extension.\n\t\t\t\tif ( extensions.has( 'WEBGL_multisampled_render_to_texture' ) === true ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Render-to-texture extension was disabled because an external texture was provided' );\n\t\t\t\t\trenderTargetProperties.__useRenderToTexture = false;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tthis.setRenderTargetFramebuffer = function ( renderTarget, defaultFramebuffer ) {\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\trenderTargetProperties.__webglFramebuffer = defaultFramebuffer;\n\t\trenderTargetProperties.__useDefaultFramebuffer = defaultFramebuffer === undefined;\n\n\t};\n\n\tthis.setRenderTarget = function ( renderTarget, activeCubeFace = 0, activeMipmapLevel = 0 ) {\n\n\t\t_currentRenderTarget = renderTarget;\n\t\t_currentActiveCubeFace = activeCubeFace;\n\t\t_currentActiveMipmapLevel = activeMipmapLevel;\n\n\t\tlet useDefaultFramebuffer = true;\n\n\t\tif ( renderTarget ) {\n\n\t\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\t\tif ( renderTargetProperties.__useDefaultFramebuffer !== undefined ) {\n\n\t\t\t\t// We need to make sure to rebind the framebuffer.\n\t\t\t\tstate.bindFramebuffer( 36160, null );\n\t\t\t\tuseDefaultFramebuffer = false;\n\n\t\t\t} else if ( renderTargetProperties.__webglFramebuffer === undefined ) {\n\n\t\t\t\ttextures.setupRenderTarget( renderTarget );\n\n\t\t\t} else if ( renderTargetProperties.__hasExternalTextures ) {\n\n\t\t\t\t// Color and depth texture must be rebound in order for the swapchain to update.\n\t\t\t\ttextures.rebindTextures( renderTarget, properties.get( renderTarget.texture ).__webglTexture, properties.get( renderTarget.depthTexture ).__webglTexture );\n\n\t\t\t}\n\n\t\t}\n\n\t\tlet framebuffer = null;\n\t\tlet isCube = false;\n\t\tlet isRenderTarget3D = false;\n\n\t\tif ( renderTarget ) {\n\n\t\t\tconst texture = renderTarget.texture;\n\n\t\t\tif ( texture.isData3DTexture || texture.isDataArrayTexture ) {\n\n\t\t\t\tisRenderTarget3D = true;\n\n\t\t\t}\n\n\t\t\tconst __webglFramebuffer = properties.get( renderTarget ).__webglFramebuffer;\n\n\t\t\tif ( renderTarget.isWebGLCubeRenderTarget ) {\n\n\t\t\t\tframebuffer = __webglFramebuffer[ activeCubeFace ];\n\t\t\t\tisCube = true;\n\n\t\t\t} else if ( ( capabilities.isWebGL2 && renderTarget.samples > 0 ) && textures.useMultisampledRTT( renderTarget ) === false ) {\n\n\t\t\t\tframebuffer = properties.get( renderTarget ).__webglMultisampledFramebuffer;\n\n\t\t\t} else {\n\n\t\t\t\tframebuffer = __webglFramebuffer;\n\n\t\t\t}\n\n\t\t\t_currentViewport.copy( renderTarget.viewport );\n\t\t\t_currentScissor.copy( renderTarget.scissor );\n\t\t\t_currentScissorTest = renderTarget.scissorTest;\n\n\t\t} else {\n\n\t\t\t_currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ).floor();\n\t\t\t_currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ).floor();\n\t\t\t_currentScissorTest = _scissorTest;\n\n\t\t}\n\n\t\tconst framebufferBound = state.bindFramebuffer( 36160, framebuffer );\n\n\t\tif ( framebufferBound && capabilities.drawBuffers && useDefaultFramebuffer ) {\n\n\t\t\tstate.drawBuffers( renderTarget, framebuffer );\n\n\t\t}\n\n\t\tstate.viewport( _currentViewport );\n\t\tstate.scissor( _currentScissor );\n\t\tstate.setScissorTest( _currentScissorTest );\n\n\t\tif ( isCube ) {\n\n\t\t\tconst textureProperties = properties.get( renderTarget.texture );\n\t\t\t_gl.framebufferTexture2D( 36160, 36064, 34069 + activeCubeFace, textureProperties.__webglTexture, activeMipmapLevel );\n\n\t\t} else if ( isRenderTarget3D ) {\n\n\t\t\tconst textureProperties = properties.get( renderTarget.texture );\n\t\t\tconst layer = activeCubeFace || 0;\n\t\t\t_gl.framebufferTextureLayer( 36160, 36064, textureProperties.__webglTexture, activeMipmapLevel || 0, layer );\n\n\t\t}\n\n\t\t_currentMaterialId = - 1; // reset current material to ensure correct uniform bindings\n\n\t};\n\n\tthis.readRenderTargetPixels = function ( renderTarget, x, y, width, height, buffer, activeCubeFaceIndex ) {\n\n\t\tif ( ! ( renderTarget && renderTarget.isWebGLRenderTarget ) ) {\n\n\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tlet framebuffer = properties.get( renderTarget ).__webglFramebuffer;\n\n\t\tif ( renderTarget.isWebGLCubeRenderTarget && activeCubeFaceIndex !== undefined ) {\n\n\t\t\tframebuffer = framebuffer[ activeCubeFaceIndex ];\n\n\t\t}\n\n\t\tif ( framebuffer ) {\n\n\t\t\tstate.bindFramebuffer( 36160, framebuffer );\n\n\t\t\ttry {\n\n\t\t\t\tconst texture = renderTarget.texture;\n\t\t\t\tconst textureFormat = texture.format;\n\t\t\t\tconst textureType = texture.type;\n\n\t\t\t\tif ( textureFormat !== RGBAFormat && utils.convert( textureFormat ) !== _gl.getParameter( 35739 ) ) {\n\n\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.' );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tconst halfFloatSupportedByExt = ( textureType === HalfFloatType ) && ( extensions.has( 'EXT_color_buffer_half_float' ) || ( capabilities.isWebGL2 && extensions.has( 'EXT_color_buffer_float' ) ) );\n\n\t\t\t\tif ( textureType !== UnsignedByteType && utils.convert( textureType ) !== _gl.getParameter( 35738 ) && // Edge and Chrome Mac < 52 (#9513)\n\t\t\t\t\t! ( textureType === FloatType && ( capabilities.isWebGL2 || extensions.has( 'OES_texture_float' ) || extensions.has( 'WEBGL_color_buffer_float' ) ) ) && // Chrome Mac >= 52 and Firefox\n\t\t\t\t\t! halfFloatSupportedByExt ) {\n\n\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.' );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\t// the following if statement ensures valid read requests (no out-of-bounds pixels, see #8604)\n\n\t\t\t\tif ( ( x >= 0 && x <= ( renderTarget.width - width ) ) && ( y >= 0 && y <= ( renderTarget.height - height ) ) ) {\n\n\t\t\t\t\t_gl.readPixels( x, y, width, height, utils.convert( textureFormat ), utils.convert( textureType ), buffer );\n\n\t\t\t\t}\n\n\t\t\t} finally {\n\n\t\t\t\t// restore framebuffer of current render target if necessary\n\n\t\t\t\tconst framebuffer = ( _currentRenderTarget !== null ) ? properties.get( _currentRenderTarget ).__webglFramebuffer : null;\n\t\t\t\tstate.bindFramebuffer( 36160, framebuffer );\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tthis.copyFramebufferToTexture = function ( position, texture, level = 0 ) {\n\n\t\tconst levelScale = Math.pow( 2, - level );\n\t\tconst width = Math.floor( texture.image.width * levelScale );\n\t\tconst height = Math.floor( texture.image.height * levelScale );\n\n\t\ttextures.setTexture2D( texture, 0 );\n\n\t\t_gl.copyTexSubImage2D( 3553, level, 0, 0, position.x, position.y, width, height );\n\n\t\tstate.unbindTexture();\n\n\t};\n\n\tthis.copyTextureToTexture = function ( position, srcTexture, dstTexture, level = 0 ) {\n\n\t\tconst width = srcTexture.image.width;\n\t\tconst height = srcTexture.image.height;\n\t\tconst glFormat = utils.convert( dstTexture.format );\n\t\tconst glType = utils.convert( dstTexture.type );\n\n\t\ttextures.setTexture2D( dstTexture, 0 );\n\n\t\t// As another texture upload may have changed pixelStorei\n\t\t// parameters, make sure they are correct for the dstTexture\n\t\t_gl.pixelStorei( 37440, dstTexture.flipY );\n\t\t_gl.pixelStorei( 37441, dstTexture.premultiplyAlpha );\n\t\t_gl.pixelStorei( 3317, dstTexture.unpackAlignment );\n\n\t\tif ( srcTexture.isDataTexture ) {\n\n\t\t\t_gl.texSubImage2D( 3553, level, position.x, position.y, width, height, glFormat, glType, srcTexture.image.data );\n\n\t\t} else {\n\n\t\t\tif ( srcTexture.isCompressedTexture ) {\n\n\t\t\t\t_gl.compressedTexSubImage2D( 3553, level, position.x, position.y, srcTexture.mipmaps[ 0 ].width, srcTexture.mipmaps[ 0 ].height, glFormat, srcTexture.mipmaps[ 0 ].data );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.texSubImage2D( 3553, level, position.x, position.y, glFormat, glType, srcTexture.image );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Generate mipmaps only when copying level 0\n\t\tif ( level === 0 && dstTexture.generateMipmaps ) _gl.generateMipmap( 3553 );\n\n\t\tstate.unbindTexture();\n\n\t};\n\n\tthis.copyTextureToTexture3D = function ( sourceBox, position, srcTexture, dstTexture, level = 0 ) {\n\n\t\tif ( _this.isWebGL1Renderer ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer.copyTextureToTexture3D: can only be used with WebGL2.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst width = sourceBox.max.x - sourceBox.min.x + 1;\n\t\tconst height = sourceBox.max.y - sourceBox.min.y + 1;\n\t\tconst depth = sourceBox.max.z - sourceBox.min.z + 1;\n\t\tconst glFormat = utils.convert( dstTexture.format );\n\t\tconst glType = utils.convert( dstTexture.type );\n\t\tlet glTarget;\n\n\t\tif ( dstTexture.isData3DTexture ) {\n\n\t\t\ttextures.setTexture3D( dstTexture, 0 );\n\t\t\tglTarget = 32879;\n\n\t\t} else if ( dstTexture.isDataArrayTexture ) {\n\n\t\t\ttextures.setTexture2DArray( dstTexture, 0 );\n\t\t\tglTarget = 35866;\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer.copyTextureToTexture3D: only supports THREE.DataTexture3D and THREE.DataTexture2DArray.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\t_gl.pixelStorei( 37440, dstTexture.flipY );\n\t\t_gl.pixelStorei( 37441, dstTexture.premultiplyAlpha );\n\t\t_gl.pixelStorei( 3317, dstTexture.unpackAlignment );\n\n\t\tconst unpackRowLen = _gl.getParameter( 3314 );\n\t\tconst unpackImageHeight = _gl.getParameter( 32878 );\n\t\tconst unpackSkipPixels = _gl.getParameter( 3316 );\n\t\tconst unpackSkipRows = _gl.getParameter( 3315 );\n\t\tconst unpackSkipImages = _gl.getParameter( 32877 );\n\n\t\tconst image = srcTexture.isCompressedTexture ? srcTexture.mipmaps[ 0 ] : srcTexture.image;\n\n\t\t_gl.pixelStorei( 3314, image.width );\n\t\t_gl.pixelStorei( 32878, image.height );\n\t\t_gl.pixelStorei( 3316, sourceBox.min.x );\n\t\t_gl.pixelStorei( 3315, sourceBox.min.y );\n\t\t_gl.pixelStorei( 32877, sourceBox.min.z );\n\n\t\tif ( srcTexture.isDataTexture || srcTexture.isData3DTexture ) {\n\n\t\t\t_gl.texSubImage3D( glTarget, level, position.x, position.y, position.z, width, height, depth, glFormat, glType, image.data );\n\n\t\t} else {\n\n\t\t\tif ( srcTexture.isCompressedTexture ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer.copyTextureToTexture3D: untested support for compressed srcTexture.' );\n\t\t\t\t_gl.compressedTexSubImage3D( glTarget, level, position.x, position.y, position.z, width, height, depth, glFormat, image.data );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.texSubImage3D( glTarget, level, position.x, position.y, position.z, width, height, depth, glFormat, glType, image );\n\n\t\t\t}\n\n\t\t}\n\n\t\t_gl.pixelStorei( 3314, unpackRowLen );\n\t\t_gl.pixelStorei( 32878, unpackImageHeight );\n\t\t_gl.pixelStorei( 3316, unpackSkipPixels );\n\t\t_gl.pixelStorei( 3315, unpackSkipRows );\n\t\t_gl.pixelStorei( 32877, unpackSkipImages );\n\n\t\t// Generate mipmaps only when copying level 0\n\t\tif ( level === 0 && dstTexture.generateMipmaps ) _gl.generateMipmap( glTarget );\n\n\t\tstate.unbindTexture();\n\n\t};\n\n\tthis.initTexture = function ( texture ) {\n\n\t\tif ( texture.isCubeTexture ) {\n\n\t\t\ttextures.setTextureCube( texture, 0 );\n\n\t\t} else if ( texture.isData3DTexture ) {\n\n\t\t\ttextures.setTexture3D( texture, 0 );\n\n\t\t} else if ( texture.isDataArrayTexture ) {\n\n\t\t\ttextures.setTexture2DArray( texture, 0 );\n\n\t\t} else {\n\n\t\t\ttextures.setTexture2D( texture, 0 );\n\n\t\t}\n\n\t\tstate.unbindTexture();\n\n\t};\n\n\tthis.resetState = function () {\n\n\t\t_currentActiveCubeFace = 0;\n\t\t_currentActiveMipmapLevel = 0;\n\t\t_currentRenderTarget = null;\n\n\t\tstate.reset();\n\t\tbindingStates.reset();\n\n\t};\n\n\tif ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) {\n\n\t\t__THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'observe', { detail: this } ) );\n\n\t}\n\n}\n\nclass WebGL1Renderer extends WebGLRenderer {}\n\nWebGL1Renderer.prototype.isWebGL1Renderer = true;\n\nclass FogExp2 {\n\n\tconstructor( color, density = 0.00025 ) {\n\n\t\tthis.isFogExp2 = true;\n\n\t\tthis.name = '';\n\n\t\tthis.color = new Color( color );\n\t\tthis.density = density;\n\n\t}\n\n\tclone() {\n\n\t\treturn new FogExp2( this.color, this.density );\n\n\t}\n\n\ttoJSON( /* 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}\n\nclass Fog {\n\n\tconstructor( color, near = 1, far = 1000 ) {\n\n\t\tthis.isFog = true;\n\n\t\tthis.name = '';\n\n\t\tthis.color = new Color( color );\n\n\t\tthis.near = near;\n\t\tthis.far = far;\n\n\t}\n\n\tclone() {\n\n\t\treturn new Fog( this.color, this.near, this.far );\n\n\t}\n\n\ttoJSON( /* 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}\n\nclass Scene extends Object3D {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.isScene = true;\n\n\t\tthis.type = 'Scene';\n\n\t\tthis.background = null;\n\t\tthis.environment = null;\n\t\tthis.fog = null;\n\n\t\tthis.overrideMaterial = null;\n\n\t\tthis.autoUpdate = true; // checked by the renderer\n\n\t\tif ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) {\n\n\t\t\t__THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'observe', { detail: this } ) );\n\n\t\t}\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tif ( source.background !== null ) this.background = source.background.clone();\n\t\tif ( source.environment !== null ) this.environment = source.environment.clone();\n\t\tif ( source.fog !== null ) this.fog = source.fog.clone();\n\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\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tif ( this.fog !== null ) data.object.fog = this.fog.toJSON();\n\n\t\treturn data;\n\n\t}\n\n}\n\nclass InterleavedBuffer {\n\n\tconstructor( array, stride ) {\n\n\t\tthis.isInterleavedBuffer = true;\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.usage = StaticDrawUsage;\n\t\tthis.updateRange = { offset: 0, count: - 1 };\n\n\t\tthis.version = 0;\n\n\t\tthis.uuid = generateUUID();\n\n\t}\n\n\tonUploadCallback() {}\n\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n\tsetUsage( value ) {\n\n\t\tthis.usage = value;\n\n\t\treturn this;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.array = new source.array.constructor( source.array );\n\t\tthis.count = source.count;\n\t\tthis.stride = source.stride;\n\t\tthis.usage = source.usage;\n\n\t\treturn this;\n\n\t}\n\n\tcopyAt( index1, attribute, index2 ) {\n\n\t\tindex1 *= this.stride;\n\t\tindex2 *= attribute.stride;\n\n\t\tfor ( let i = 0, l = this.stride; i < l; i ++ ) {\n\n\t\t\tthis.array[ index1 + i ] = attribute.array[ index2 + i ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tset( value, offset = 0 ) {\n\n\t\tthis.array.set( value, offset );\n\n\t\treturn this;\n\n\t}\n\n\tclone( data ) {\n\n\t\tif ( data.arrayBuffers === undefined ) {\n\n\t\t\tdata.arrayBuffers = {};\n\n\t\t}\n\n\t\tif ( this.array.buffer._uuid === undefined ) {\n\n\t\t\tthis.array.buffer._uuid = generateUUID();\n\n\t\t}\n\n\t\tif ( data.arrayBuffers[ this.array.buffer._uuid ] === undefined ) {\n\n\t\t\tdata.arrayBuffers[ this.array.buffer._uuid ] = this.array.slice( 0 ).buffer;\n\n\t\t}\n\n\t\tconst array = new this.array.constructor( data.arrayBuffers[ this.array.buffer._uuid ] );\n\n\t\tconst ib = new this.constructor( array, this.stride );\n\t\tib.setUsage( this.usage );\n\n\t\treturn ib;\n\n\t}\n\n\tonUpload( callback ) {\n\n\t\tthis.onUploadCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( data ) {\n\n\t\tif ( data.arrayBuffers === undefined ) {\n\n\t\t\tdata.arrayBuffers = {};\n\n\t\t}\n\n\t\t// generate UUID for array buffer if necessary\n\n\t\tif ( this.array.buffer._uuid === undefined ) {\n\n\t\t\tthis.array.buffer._uuid = generateUUID();\n\n\t\t}\n\n\t\tif ( data.arrayBuffers[ this.array.buffer._uuid ] === undefined ) {\n\n\t\t\tdata.arrayBuffers[ this.array.buffer._uuid ] = Array.from( new Uint32Array( this.array.buffer ) );\n\n\t\t}\n\n\t\t//\n\n\t\treturn {\n\t\t\tuuid: this.uuid,\n\t\t\tbuffer: this.array.buffer._uuid,\n\t\t\ttype: this.array.constructor.name,\n\t\t\tstride: this.stride\n\t\t};\n\n\t}\n\n}\n\nconst _vector$6 = /*@__PURE__*/ new Vector3();\n\nclass InterleavedBufferAttribute {\n\n\tconstructor( interleavedBuffer, itemSize, offset, normalized = false ) {\n\n\t\tthis.isInterleavedBufferAttribute = true;\n\n\t\tthis.name = '';\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\tget count() {\n\n\t\treturn this.data.count;\n\n\t}\n\n\tget array() {\n\n\t\treturn this.data.array;\n\n\t}\n\n\tset needsUpdate( value ) {\n\n\t\tthis.data.needsUpdate = value;\n\n\t}\n\n\tapplyMatrix4( m ) {\n\n\t\tfor ( let i = 0, l = this.data.count; i < l; i ++ ) {\n\n\t\t\t_vector$6.fromBufferAttribute( this, i );\n\n\t\t\t_vector$6.applyMatrix4( m );\n\n\t\t\tthis.setXYZ( i, _vector$6.x, _vector$6.y, _vector$6.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tapplyNormalMatrix( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$6.fromBufferAttribute( this, i );\n\n\t\t\t_vector$6.applyNormalMatrix( m );\n\n\t\t\tthis.setXYZ( i, _vector$6.x, _vector$6.y, _vector$6.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttransformDirection( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$6.fromBufferAttribute( this, i );\n\n\t\t\t_vector$6.transformDirection( m );\n\n\t\t\tthis.setXYZ( i, _vector$6.x, _vector$6.y, _vector$6.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetX( index, x ) {\n\n\t\tthis.data.array[ index * this.data.stride + this.offset ] = x;\n\n\t\treturn this;\n\n\t}\n\n\tsetY( index, y ) {\n\n\t\tthis.data.array[ index * this.data.stride + this.offset + 1 ] = y;\n\n\t\treturn this;\n\n\t}\n\n\tsetZ( index, z ) {\n\n\t\tthis.data.array[ index * this.data.stride + this.offset + 2 ] = z;\n\n\t\treturn this;\n\n\t}\n\n\tsetW( index, w ) {\n\n\t\tthis.data.array[ index * this.data.stride + this.offset + 3 ] = w;\n\n\t\treturn this;\n\n\t}\n\n\tgetX( index ) {\n\n\t\treturn this.data.array[ index * this.data.stride + this.offset ];\n\n\t}\n\n\tgetY( index ) {\n\n\t\treturn this.data.array[ index * this.data.stride + this.offset + 1 ];\n\n\t}\n\n\tgetZ( index ) {\n\n\t\treturn this.data.array[ index * this.data.stride + this.offset + 2 ];\n\n\t}\n\n\tgetW( index ) {\n\n\t\treturn this.data.array[ index * this.data.stride + this.offset + 3 ];\n\n\t}\n\n\tsetXY( index, x, y ) {\n\n\t\tindex = index * this.data.stride + this.offset;\n\n\t\tthis.data.array[ index + 0 ] = x;\n\t\tthis.data.array[ index + 1 ] = y;\n\n\t\treturn this;\n\n\t}\n\n\tsetXYZ( index, x, y, z ) {\n\n\t\tindex = index * this.data.stride + this.offset;\n\n\t\tthis.data.array[ index + 0 ] = x;\n\t\tthis.data.array[ index + 1 ] = y;\n\t\tthis.data.array[ index + 2 ] = z;\n\n\t\treturn this;\n\n\t}\n\n\tsetXYZW( index, x, y, z, w ) {\n\n\t\tindex = index * this.data.stride + this.offset;\n\n\t\tthis.data.array[ index + 0 ] = x;\n\t\tthis.data.array[ index + 1 ] = y;\n\t\tthis.data.array[ index + 2 ] = z;\n\t\tthis.data.array[ index + 3 ] = w;\n\n\t\treturn this;\n\n\t}\n\n\tclone( data ) {\n\n\t\tif ( data === undefined ) {\n\n\t\t\tconsole.log( 'THREE.InterleavedBufferAttribute.clone(): Cloning an interleaved buffer attribute will deinterleave buffer data.' );\n\n\t\t\tconst array = [];\n\n\t\t\tfor ( let i = 0; i < this.count; i ++ ) {\n\n\t\t\t\tconst index = i * this.data.stride + this.offset;\n\n\t\t\t\tfor ( let j = 0; j < this.itemSize; j ++ ) {\n\n\t\t\t\t\tarray.push( this.data.array[ index + j ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new BufferAttribute( new this.array.constructor( array ), this.itemSize, this.normalized );\n\n\t\t} else {\n\n\t\t\tif ( data.interleavedBuffers === undefined ) {\n\n\t\t\t\tdata.interleavedBuffers = {};\n\n\t\t\t}\n\n\t\t\tif ( data.interleavedBuffers[ this.data.uuid ] === undefined ) {\n\n\t\t\t\tdata.interleavedBuffers[ this.data.uuid ] = this.data.clone( data );\n\n\t\t\t}\n\n\t\t\treturn new InterleavedBufferAttribute( data.interleavedBuffers[ this.data.uuid ], this.itemSize, this.offset, this.normalized );\n\n\t\t}\n\n\t}\n\n\ttoJSON( data ) {\n\n\t\tif ( data === undefined ) {\n\n\t\t\tconsole.log( 'THREE.InterleavedBufferAttribute.toJSON(): Serializing an interleaved buffer attribute will deinterleave buffer data.' );\n\n\t\t\tconst array = [];\n\n\t\t\tfor ( let i = 0; i < this.count; i ++ ) {\n\n\t\t\t\tconst index = i * this.data.stride + this.offset;\n\n\t\t\t\tfor ( let j = 0; j < this.itemSize; j ++ ) {\n\n\t\t\t\t\tarray.push( this.data.array[ index + j ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// deinterleave data and save it as an ordinary buffer attribute for now\n\n\t\t\treturn {\n\t\t\t\titemSize: this.itemSize,\n\t\t\t\ttype: this.array.constructor.name,\n\t\t\t\tarray: array,\n\t\t\t\tnormalized: this.normalized\n\t\t\t};\n\n\t\t} else {\n\n\t\t\t// save as true interleaved attribtue\n\n\t\t\tif ( data.interleavedBuffers === undefined ) {\n\n\t\t\t\tdata.interleavedBuffers = {};\n\n\t\t\t}\n\n\t\t\tif ( data.interleavedBuffers[ this.data.uuid ] === undefined ) {\n\n\t\t\t\tdata.interleavedBuffers[ this.data.uuid ] = this.data.toJSON( data );\n\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tisInterleavedBufferAttribute: true,\n\t\t\t\titemSize: this.itemSize,\n\t\t\t\tdata: this.data.uuid,\n\t\t\t\toffset: this.offset,\n\t\t\t\tnormalized: this.normalized\n\t\t\t};\n\n\t\t}\n\n\t}\n\n}\n\nclass SpriteMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isSpriteMaterial = true;\n\n\t\tthis.type = 'SpriteMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\n\t\tthis.map = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.rotation = 0;\n\n\t\tthis.sizeAttenuation = true;\n\n\t\tthis.transparent = true;\n\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.rotation = source.rotation;\n\n\t\tthis.sizeAttenuation = source.sizeAttenuation;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nlet _geometry;\n\nconst _intersectPoint = /*@__PURE__*/ new Vector3();\nconst _worldScale = /*@__PURE__*/ new Vector3();\nconst _mvPosition = /*@__PURE__*/ new Vector3();\n\nconst _alignedPosition = /*@__PURE__*/ new Vector2();\nconst _rotatedPosition = /*@__PURE__*/ new Vector2();\nconst _viewWorldMatrix = /*@__PURE__*/ new Matrix4();\n\nconst _vA = /*@__PURE__*/ new Vector3();\nconst _vB = /*@__PURE__*/ new Vector3();\nconst _vC = /*@__PURE__*/ new Vector3();\n\nconst _uvA = /*@__PURE__*/ new Vector2();\nconst _uvB = /*@__PURE__*/ new Vector2();\nconst _uvC = /*@__PURE__*/ new Vector2();\n\nclass Sprite extends Object3D {\n\n\tconstructor( material ) {\n\n\t\tsuper();\n\n\t\tthis.isSprite = true;\n\n\t\tthis.type = 'Sprite';\n\n\t\tif ( _geometry === undefined ) {\n\n\t\t\t_geometry = new BufferGeometry();\n\n\t\t\tconst float32Array = new Float32Array( [\n\t\t\t\t- 0.5, - 0.5, 0, 0, 0,\n\t\t\t\t0.5, - 0.5, 0, 1, 0,\n\t\t\t\t0.5, 0.5, 0, 1, 1,\n\t\t\t\t- 0.5, 0.5, 0, 0, 1\n\t\t\t] );\n\n\t\t\tconst interleavedBuffer = new InterleavedBuffer( float32Array, 5 );\n\n\t\t\t_geometry.setIndex( [ 0, 1, 2,\t0, 2, 3 ] );\n\t\t\t_geometry.setAttribute( 'position', new InterleavedBufferAttribute( interleavedBuffer, 3, 0, false ) );\n\t\t\t_geometry.setAttribute( 'uv', new InterleavedBufferAttribute( interleavedBuffer, 2, 3, false ) );\n\n\t\t}\n\n\t\tthis.geometry = _geometry;\n\t\tthis.material = ( material !== undefined ) ? material : new SpriteMaterial();\n\n\t\tthis.center = new Vector2( 0.5, 0.5 );\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tif ( raycaster.camera === null ) {\n\n\t\t\tconsole.error( 'THREE.Sprite: \"Raycaster.camera\" needs to be set in order to raycast against sprites.' );\n\n\t\t}\n\n\t\t_worldScale.setFromMatrixScale( this.matrixWorld );\n\n\t\t_viewWorldMatrix.copy( raycaster.camera.matrixWorld );\n\t\tthis.modelViewMatrix.multiplyMatrices( raycaster.camera.matrixWorldInverse, this.matrixWorld );\n\n\t\t_mvPosition.setFromMatrixPosition( this.modelViewMatrix );\n\n\t\tif ( raycaster.camera.isPerspectiveCamera && this.material.sizeAttenuation === false ) {\n\n\t\t\t_worldScale.multiplyScalar( - _mvPosition.z );\n\n\t\t}\n\n\t\tconst rotation = this.material.rotation;\n\t\tlet sin, cos;\n\n\t\tif ( rotation !== 0 ) {\n\n\t\t\tcos = Math.cos( rotation );\n\t\t\tsin = Math.sin( rotation );\n\n\t\t}\n\n\t\tconst center = this.center;\n\n\t\ttransformVertex( _vA.set( - 0.5, - 0.5, 0 ), _mvPosition, center, _worldScale, sin, cos );\n\t\ttransformVertex( _vB.set( 0.5, - 0.5, 0 ), _mvPosition, center, _worldScale, sin, cos );\n\t\ttransformVertex( _vC.set( 0.5, 0.5, 0 ), _mvPosition, center, _worldScale, sin, cos );\n\n\t\t_uvA.set( 0, 0 );\n\t\t_uvB.set( 1, 0 );\n\t\t_uvC.set( 1, 1 );\n\n\t\t// check first triangle\n\t\tlet intersect = raycaster.ray.intersectTriangle( _vA, _vB, _vC, false, _intersectPoint );\n\n\t\tif ( intersect === null ) {\n\n\t\t\t// check second triangle\n\t\t\ttransformVertex( _vB.set( - 0.5, 0.5, 0 ), _mvPosition, center, _worldScale, sin, cos );\n\t\t\t_uvB.set( 0, 1 );\n\n\t\t\tintersect = raycaster.ray.intersectTriangle( _vA, _vC, _vB, false, _intersectPoint );\n\t\t\tif ( intersect === null ) {\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst distance = raycaster.ray.origin.distanceTo( _intersectPoint );\n\n\t\tif ( distance < raycaster.near || distance > raycaster.far ) return;\n\n\t\tintersects.push( {\n\n\t\t\tdistance: distance,\n\t\t\tpoint: _intersectPoint.clone(),\n\t\t\tuv: Triangle.getUV( _intersectPoint, _vA, _vB, _vC, _uvA, _uvB, _uvC, new Vector2() ),\n\t\t\tface: null,\n\t\t\tobject: this\n\n\t\t} );\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tif ( source.center !== undefined ) this.center.copy( source.center );\n\n\t\tthis.material = source.material;\n\n\t\treturn this;\n\n\t}\n\n}\n\nfunction transformVertex( vertexPosition, mvPosition, center, scale, sin, cos ) {\n\n\t// compute position in camera space\n\t_alignedPosition.subVectors( vertexPosition, center ).addScalar( 0.5 ).multiply( scale );\n\n\t// to check if rotation is not zero\n\tif ( sin !== undefined ) {\n\n\t\t_rotatedPosition.x = ( cos * _alignedPosition.x ) - ( sin * _alignedPosition.y );\n\t\t_rotatedPosition.y = ( sin * _alignedPosition.x ) + ( cos * _alignedPosition.y );\n\n\t} else {\n\n\t\t_rotatedPosition.copy( _alignedPosition );\n\n\t}\n\n\n\tvertexPosition.copy( mvPosition );\n\tvertexPosition.x += _rotatedPosition.x;\n\tvertexPosition.y += _rotatedPosition.y;\n\n\t// transform to world space\n\tvertexPosition.applyMatrix4( _viewWorldMatrix );\n\n}\n\nconst _v1$2 = /*@__PURE__*/ new Vector3();\nconst _v2$1 = /*@__PURE__*/ new Vector3();\n\nclass LOD extends Object3D {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis._currentLevel = 0;\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\tisLOD: {\n\t\t\t\tvalue: true,\n\t\t\t}\n\t\t} );\n\n\t\tthis.autoUpdate = true;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source, false );\n\n\t\tconst levels = source.levels;\n\n\t\tfor ( let i = 0, l = levels.length; i < l; i ++ ) {\n\n\t\t\tconst level = levels[ i ];\n\n\t\t\tthis.addLevel( level.object.clone(), level.distance );\n\n\t\t}\n\n\t\tthis.autoUpdate = source.autoUpdate;\n\n\t\treturn this;\n\n\t}\n\n\taddLevel( object, distance = 0 ) {\n\n\t\tdistance = Math.abs( distance );\n\n\t\tconst levels = this.levels;\n\n\t\tlet l;\n\n\t\tfor ( l = 0; l < levels.length; l ++ ) {\n\n\t\t\tif ( distance < levels[ l ].distance ) {\n\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tlevels.splice( l, 0, { distance: distance, object: object } );\n\n\t\tthis.add( object );\n\n\t\treturn this;\n\n\t}\n\n\tgetCurrentLevel() {\n\n\t\treturn this._currentLevel;\n\n\t}\n\n\tgetObjectForDistance( distance ) {\n\n\t\tconst levels = this.levels;\n\n\t\tif ( levels.length > 0 ) {\n\n\t\t\tlet i, l;\n\n\t\t\tfor ( 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\treturn null;\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tconst levels = this.levels;\n\n\t\tif ( levels.length > 0 ) {\n\n\t\t\t_v1$2.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\tconst distance = raycaster.ray.origin.distanceTo( _v1$2 );\n\n\t\t\tthis.getObjectForDistance( distance ).raycast( raycaster, intersects );\n\n\t\t}\n\n\t}\n\n\tupdate( camera ) {\n\n\t\tconst levels = this.levels;\n\n\t\tif ( levels.length > 1 ) {\n\n\t\t\t_v1$2.setFromMatrixPosition( camera.matrixWorld );\n\t\t\t_v2$1.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\tconst distance = _v1$2.distanceTo( _v2$1 ) / camera.zoom;\n\n\t\t\tlevels[ 0 ].object.visible = true;\n\n\t\t\tlet i, l;\n\n\t\t\tfor ( i = 1, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\tif ( distance >= levels[ i ].distance ) {\n\n\t\t\t\t\tlevels[ i - 1 ].object.visible = false;\n\t\t\t\t\tlevels[ i ].object.visible = true;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis._currentLevel = i - 1;\n\n\t\t\tfor ( ; i < l; i ++ ) {\n\n\t\t\t\tlevels[ i ].object.visible = false;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tif ( this.autoUpdate === false ) data.object.autoUpdate = false;\n\n\t\tdata.object.levels = [];\n\n\t\tconst levels = this.levels;\n\n\t\tfor ( let i = 0, l = levels.length; i < l; i ++ ) {\n\n\t\t\tconst level = levels[ i ];\n\n\t\t\tdata.object.levels.push( {\n\t\t\t\tobject: level.object.uuid,\n\t\t\t\tdistance: level.distance\n\t\t\t} );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n}\n\nconst _basePosition = /*@__PURE__*/ new Vector3();\n\nconst _skinIndex = /*@__PURE__*/ new Vector4();\nconst _skinWeight = /*@__PURE__*/ new Vector4();\n\nconst _vector$5 = /*@__PURE__*/ new Vector3();\nconst _matrix = /*@__PURE__*/ new Matrix4();\n\nclass SkinnedMesh extends Mesh {\n\n\tconstructor( geometry, material ) {\n\n\t\tsuper( geometry, material );\n\n\t\tthis.isSkinnedMesh = true;\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}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.bindMode = source.bindMode;\n\t\tthis.bindMatrix.copy( source.bindMatrix );\n\t\tthis.bindMatrixInverse.copy( source.bindMatrixInverse );\n\n\t\tthis.skeleton = source.skeleton;\n\n\t\treturn this;\n\n\t}\n\n\tbind( skeleton, bindMatrix ) {\n\n\t\tthis.skeleton = skeleton;\n\n\t\tif ( bindMatrix === undefined ) {\n\n\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\tthis.skeleton.calculateInverses();\n\n\t\t\tbindMatrix = this.matrixWorld;\n\n\t\t}\n\n\t\tthis.bindMatrix.copy( bindMatrix );\n\t\tthis.bindMatrixInverse.copy( bindMatrix ).invert();\n\n\t}\n\n\tpose() {\n\n\t\tthis.skeleton.pose();\n\n\t}\n\n\tnormalizeSkinWeights() {\n\n\t\tconst vector = new Vector4();\n\n\t\tconst skinWeight = this.geometry.attributes.skinWeight;\n\n\t\tfor ( let i = 0, l = skinWeight.count; i < l; i ++ ) {\n\n\t\t\tvector.fromBufferAttribute( skinWeight, i );\n\n\t\t\tconst scale = 1.0 / vector.manhattanLength();\n\n\t\t\tif ( scale !== Infinity ) {\n\n\t\t\t\tvector.multiplyScalar( scale );\n\n\t\t\t} else {\n\n\t\t\t\tvector.set( 1, 0, 0, 0 ); // do something reasonable\n\n\t\t\t}\n\n\t\t\tskinWeight.setXYZW( i, vector.x, vector.y, vector.z, vector.w );\n\n\t\t}\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t\tif ( this.bindMode === 'attached' ) {\n\n\t\t\tthis.bindMatrixInverse.copy( this.matrixWorld ).invert();\n\n\t\t} else if ( this.bindMode === 'detached' ) {\n\n\t\t\tthis.bindMatrixInverse.copy( this.bindMatrix ).invert();\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.SkinnedMesh: Unrecognized bindMode: ' + this.bindMode );\n\n\t\t}\n\n\t}\n\n\tboneTransform( index, target ) {\n\n\t\tconst skeleton = this.skeleton;\n\t\tconst geometry = this.geometry;\n\n\t\t_skinIndex.fromBufferAttribute( geometry.attributes.skinIndex, index );\n\t\t_skinWeight.fromBufferAttribute( geometry.attributes.skinWeight, index );\n\n\t\t_basePosition.copy( target ).applyMatrix4( this.bindMatrix );\n\n\t\ttarget.set( 0, 0, 0 );\n\n\t\tfor ( let i = 0; i < 4; i ++ ) {\n\n\t\t\tconst weight = _skinWeight.getComponent( i );\n\n\t\t\tif ( weight !== 0 ) {\n\n\t\t\t\tconst boneIndex = _skinIndex.getComponent( i );\n\n\t\t\t\t_matrix.multiplyMatrices( skeleton.bones[ boneIndex ].matrixWorld, skeleton.boneInverses[ boneIndex ] );\n\n\t\t\t\ttarget.addScaledVector( _vector$5.copy( _basePosition ).applyMatrix4( _matrix ), weight );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn target.applyMatrix4( this.bindMatrixInverse );\n\n\t}\n\n}\n\nclass Bone extends Object3D {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.isBone = true;\n\n\t\tthis.type = 'Bone';\n\n\t}\n\n}\n\nclass DataTexture extends Texture {\n\n\tconstructor( data = null, width = 1, height = 1, format, type, mapping, wrapS, wrapT, magFilter = NearestFilter, minFilter = NearestFilter, anisotropy, encoding ) {\n\n\t\tsuper( null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );\n\n\t\tthis.isDataTexture = true;\n\n\t\tthis.image = { data: data, width: width, height: height };\n\n\t\tthis.generateMipmaps = false;\n\t\tthis.flipY = false;\n\t\tthis.unpackAlignment = 1;\n\n\t}\n\n}\n\nconst _offsetMatrix = /*@__PURE__*/ new Matrix4();\nconst _identityMatrix = /*@__PURE__*/ new Matrix4();\n\nclass Skeleton {\n\n\tconstructor( bones = [], boneInverses = [] ) {\n\n\t\tthis.uuid = generateUUID();\n\n\t\tthis.bones = bones.slice( 0 );\n\t\tthis.boneInverses = boneInverses;\n\t\tthis.boneMatrices = null;\n\n\t\tthis.boneTexture = null;\n\t\tthis.boneTextureSize = 0;\n\n\t\tthis.frame = - 1;\n\n\t\tthis.init();\n\n\t}\n\n\tinit() {\n\n\t\tconst bones = this.bones;\n\t\tconst boneInverses = this.boneInverses;\n\n\t\tthis.boneMatrices = new Float32Array( bones.length * 16 );\n\n\t\t// calculate inverse bone matrices if necessary\n\n\t\tif ( boneInverses.length === 0 ) {\n\n\t\t\tthis.calculateInverses();\n\n\t\t} else {\n\n\t\t\t// handle special case\n\n\t\t\tif ( bones.length !== boneInverses.length ) {\n\n\t\t\t\tconsole.warn( 'THREE.Skeleton: Number of inverse bone matrices does not match amount of bones.' );\n\n\t\t\t\tthis.boneInverses = [];\n\n\t\t\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\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\tcalculateInverses() {\n\n\t\tthis.boneInverses.length = 0;\n\n\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tconst inverse = new Matrix4();\n\n\t\t\tif ( this.bones[ i ] ) {\n\n\t\t\t\tinverse.copy( this.bones[ i ].matrixWorld ).invert();\n\n\t\t\t}\n\n\t\t\tthis.boneInverses.push( inverse );\n\n\t\t}\n\n\t}\n\n\tpose() {\n\n\t\t// recover the bind-time world matrices\n\n\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tconst bone = this.bones[ i ];\n\n\t\t\tif ( bone ) {\n\n\t\t\t\tbone.matrixWorld.copy( this.boneInverses[ i ] ).invert();\n\n\t\t\t}\n\n\t\t}\n\n\t\t// compute the local matrices, positions, rotations and scales\n\n\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tconst bone = this.bones[ i ];\n\n\t\t\tif ( bone ) {\n\n\t\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\t\tbone.matrix.copy( bone.parent.matrixWorld ).invert();\n\t\t\t\t\tbone.matrix.multiply( bone.matrixWorld );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbone.matrix.copy( bone.matrixWorld );\n\n\t\t\t\t}\n\n\t\t\t\tbone.matrix.decompose( bone.position, bone.quaternion, bone.scale );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tupdate() {\n\n\t\tconst bones = this.bones;\n\t\tconst boneInverses = this.boneInverses;\n\t\tconst boneMatrices = this.boneMatrices;\n\t\tconst boneTexture = this.boneTexture;\n\n\t\t// flatten bone matrices to array\n\n\t\tfor ( let i = 0, il = bones.length; i < il; i ++ ) {\n\n\t\t\t// compute the offset between the current and the original transform\n\n\t\t\tconst matrix = bones[ i ] ? bones[ i ].matrixWorld : _identityMatrix;\n\n\t\t\t_offsetMatrix.multiplyMatrices( matrix, boneInverses[ i ] );\n\t\t\t_offsetMatrix.toArray( boneMatrices, i * 16 );\n\n\t\t}\n\n\t\tif ( boneTexture !== null ) {\n\n\t\t\tboneTexture.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n\tclone() {\n\n\t\treturn new Skeleton( this.bones, this.boneInverses );\n\n\t}\n\n\tcomputeBoneTexture() {\n\n\t\t// layout (1 matrix = 4 pixels)\n\t\t// RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4)\n\t\t// with 8x8 pixel texture max 16 bones * 4 pixels = (8 * 8)\n\t\t// 16x16 pixel texture max 64 bones * 4 pixels = (16 * 16)\n\t\t// 32x32 pixel texture max 256 bones * 4 pixels = (32 * 32)\n\t\t// 64x64 pixel texture max 1024 bones * 4 pixels = (64 * 64)\n\n\t\tlet size = Math.sqrt( this.bones.length * 4 ); // 4 pixels needed for 1 matrix\n\t\tsize = ceilPowerOfTwo( size );\n\t\tsize = Math.max( size, 4 );\n\n\t\tconst boneMatrices = new Float32Array( size * size * 4 ); // 4 floats per RGBA pixel\n\t\tboneMatrices.set( this.boneMatrices ); // copy current values\n\n\t\tconst boneTexture = new DataTexture( boneMatrices, size, size, RGBAFormat, FloatType );\n\t\tboneTexture.needsUpdate = true;\n\n\t\tthis.boneMatrices = boneMatrices;\n\t\tthis.boneTexture = boneTexture;\n\t\tthis.boneTextureSize = size;\n\n\t\treturn this;\n\n\t}\n\n\tgetBoneByName( name ) {\n\n\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tconst bone = this.bones[ i ];\n\n\t\t\tif ( bone.name === name ) {\n\n\t\t\t\treturn bone;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn undefined;\n\n\t}\n\n\tdispose( ) {\n\n\t\tif ( this.boneTexture !== null ) {\n\n\t\t\tthis.boneTexture.dispose();\n\n\t\t\tthis.boneTexture = null;\n\n\t\t}\n\n\t}\n\n\tfromJSON( json, bones ) {\n\n\t\tthis.uuid = json.uuid;\n\n\t\tfor ( let i = 0, l = json.bones.length; i < l; i ++ ) {\n\n\t\t\tconst uuid = json.bones[ i ];\n\t\t\tlet bone = bones[ uuid ];\n\n\t\t\tif ( bone === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Skeleton: No bone found with UUID:', uuid );\n\t\t\t\tbone = new Bone();\n\n\t\t\t}\n\n\t\t\tthis.bones.push( bone );\n\t\t\tthis.boneInverses.push( new Matrix4().fromArray( json.boneInverses[ i ] ) );\n\n\t\t}\n\n\t\tthis.init();\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.5,\n\t\t\t\ttype: 'Skeleton',\n\t\t\t\tgenerator: 'Skeleton.toJSON'\n\t\t\t},\n\t\t\tbones: [],\n\t\t\tboneInverses: []\n\t\t};\n\n\t\tdata.uuid = this.uuid;\n\n\t\tconst bones = this.bones;\n\t\tconst boneInverses = this.boneInverses;\n\n\t\tfor ( let i = 0, l = bones.length; i < l; i ++ ) {\n\n\t\t\tconst bone = bones[ i ];\n\t\t\tdata.bones.push( bone.uuid );\n\n\t\t\tconst boneInverse = boneInverses[ i ];\n\t\t\tdata.boneInverses.push( boneInverse.toArray() );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n}\n\nclass InstancedBufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized, meshPerAttribute = 1 ) {\n\n\t\tif ( typeof normalized === 'number' ) {\n\n\t\t\tmeshPerAttribute = normalized;\n\n\t\t\tnormalized = false;\n\n\t\t\tconsole.error( 'THREE.InstancedBufferAttribute: The constructor now expects normalized as the third argument.' );\n\n\t\t}\n\n\t\tsuper( array, itemSize, normalized );\n\n\t\tthis.isInstancedBufferAttribute = true;\n\n\t\tthis.meshPerAttribute = meshPerAttribute;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.meshPerAttribute = source.meshPerAttribute;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.meshPerAttribute = this.meshPerAttribute;\n\n\t\tdata.isInstancedBufferAttribute = true;\n\n\t\treturn data;\n\n\t}\n\n}\n\nconst _instanceLocalMatrix = /*@__PURE__*/ new Matrix4();\nconst _instanceWorldMatrix = /*@__PURE__*/ new Matrix4();\n\nconst _instanceIntersects = [];\n\nconst _mesh = /*@__PURE__*/ new Mesh();\n\nclass InstancedMesh extends Mesh {\n\n\tconstructor( geometry, material, count ) {\n\n\t\tsuper( geometry, material );\n\n\t\tthis.isInstancedMesh = true;\n\n\t\tthis.instanceMatrix = new InstancedBufferAttribute( new Float32Array( count * 16 ), 16 );\n\t\tthis.instanceColor = null;\n\n\t\tthis.count = count;\n\n\t\tthis.frustumCulled = false;\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.instanceMatrix.copy( source.instanceMatrix );\n\n\t\tif ( source.instanceColor !== null ) this.instanceColor = source.instanceColor.clone();\n\n\t\tthis.count = source.count;\n\n\t\treturn this;\n\n\t}\n\n\tgetColorAt( index, color ) {\n\n\t\tcolor.fromArray( this.instanceColor.array, index * 3 );\n\n\t}\n\n\tgetMatrixAt( index, matrix ) {\n\n\t\tmatrix.fromArray( this.instanceMatrix.array, index * 16 );\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tconst matrixWorld = this.matrixWorld;\n\t\tconst raycastTimes = this.count;\n\n\t\t_mesh.geometry = this.geometry;\n\t\t_mesh.material = this.material;\n\n\t\tif ( _mesh.material === undefined ) return;\n\n\t\tfor ( let instanceId = 0; instanceId < raycastTimes; instanceId ++ ) {\n\n\t\t\t// calculate the world matrix for each instance\n\n\t\t\tthis.getMatrixAt( instanceId, _instanceLocalMatrix );\n\n\t\t\t_instanceWorldMatrix.multiplyMatrices( matrixWorld, _instanceLocalMatrix );\n\n\t\t\t// the mesh represents this single instance\n\n\t\t\t_mesh.matrixWorld = _instanceWorldMatrix;\n\n\t\t\t_mesh.raycast( raycaster, _instanceIntersects );\n\n\t\t\t// process the result of raycast\n\n\t\t\tfor ( let i = 0, l = _instanceIntersects.length; i < l; i ++ ) {\n\n\t\t\t\tconst intersect = _instanceIntersects[ i ];\n\t\t\t\tintersect.instanceId = instanceId;\n\t\t\t\tintersect.object = this;\n\t\t\t\tintersects.push( intersect );\n\n\t\t\t}\n\n\t\t\t_instanceIntersects.length = 0;\n\n\t\t}\n\n\t}\n\n\tsetColorAt( index, color ) {\n\n\t\tif ( this.instanceColor === null ) {\n\n\t\t\tthis.instanceColor = new InstancedBufferAttribute( new Float32Array( this.instanceMatrix.count * 3 ), 3 );\n\n\t\t}\n\n\t\tcolor.toArray( this.instanceColor.array, index * 3 );\n\n\t}\n\n\tsetMatrixAt( index, matrix ) {\n\n\t\tmatrix.toArray( this.instanceMatrix.array, index * 16 );\n\n\t}\n\n\tupdateMorphTargets() {\n\n\t}\n\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n}\n\nclass LineBasicMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isLineBasicMaterial = true;\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.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\n\tcopy( source ) {\n\n\t\tsuper.copy( 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\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _start$1 = /*@__PURE__*/ new Vector3();\nconst _end$1 = /*@__PURE__*/ new Vector3();\nconst _inverseMatrix$1 = /*@__PURE__*/ new Matrix4();\nconst _ray$1 = /*@__PURE__*/ new Ray();\nconst _sphere$1 = /*@__PURE__*/ new Sphere();\n\nclass Line extends Object3D {\n\n\tconstructor( geometry = new BufferGeometry(), material = new LineBasicMaterial() ) {\n\n\t\tsuper();\n\n\t\tthis.isLine = true;\n\n\t\tthis.type = 'Line';\n\n\t\tthis.geometry = geometry;\n\t\tthis.material = material;\n\n\t\tthis.updateMorphTargets();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.material = source.material;\n\t\tthis.geometry = source.geometry;\n\n\t\treturn this;\n\n\t}\n\n\tcomputeLineDistances() {\n\n\t\tconst geometry = this.geometry;\n\n\t\t// we assume non-indexed geometry\n\n\t\tif ( geometry.index === null ) {\n\n\t\t\tconst positionAttribute = geometry.attributes.position;\n\t\t\tconst lineDistances = [ 0 ];\n\n\t\t\tfor ( let i = 1, l = positionAttribute.count; i < l; i ++ ) {\n\n\t\t\t\t_start$1.fromBufferAttribute( positionAttribute, i - 1 );\n\t\t\t\t_end$1.fromBufferAttribute( positionAttribute, i );\n\n\t\t\t\tlineDistances[ i ] = lineDistances[ i - 1 ];\n\t\t\t\tlineDistances[ i ] += _start$1.distanceTo( _end$1 );\n\n\t\t\t}\n\n\t\t\tgeometry.setAttribute( 'lineDistance', new Float32BufferAttribute( lineDistances, 1 ) );\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.Line.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.' );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst matrixWorld = this.matrixWorld;\n\t\tconst threshold = raycaster.params.Line.threshold;\n\t\tconst drawRange = geometry.drawRange;\n\n\t\t// Checking boundingSphere distance to ray\n\n\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t_sphere$1.copy( geometry.boundingSphere );\n\t\t_sphere$1.applyMatrix4( matrixWorld );\n\t\t_sphere$1.radius += threshold;\n\n\t\tif ( raycaster.ray.intersectsSphere( _sphere$1 ) === false ) return;\n\n\t\t//\n\n\t\t_inverseMatrix$1.copy( matrixWorld ).invert();\n\t\t_ray$1.copy( raycaster.ray ).applyMatrix4( _inverseMatrix$1 );\n\n\t\tconst localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 );\n\t\tconst localThresholdSq = localThreshold * localThreshold;\n\n\t\tconst vStart = new Vector3();\n\t\tconst vEnd = new Vector3();\n\t\tconst interSegment = new Vector3();\n\t\tconst interRay = new Vector3();\n\t\tconst step = this.isLineSegments ? 2 : 1;\n\n\t\tconst index = geometry.index;\n\t\tconst attributes = geometry.attributes;\n\t\tconst positionAttribute = attributes.position;\n\n\t\tif ( index !== null ) {\n\n\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\tconst end = Math.min( index.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( let i = start, l = end - 1; i < l; i += step ) {\n\n\t\t\t\tconst a = index.getX( i );\n\t\t\t\tconst b = index.getX( i + 1 );\n\n\t\t\t\tvStart.fromBufferAttribute( positionAttribute, a );\n\t\t\t\tvEnd.fromBufferAttribute( positionAttribute, b );\n\n\t\t\t\tconst distSq = _ray$1.distanceSqToSegment( vStart, vEnd, interRay, interSegment );\n\n\t\t\t\tif ( distSq > localThresholdSq ) continue;\n\n\t\t\t\tinterRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation\n\n\t\t\t\tconst distance = raycaster.ray.origin.distanceTo( interRay );\n\n\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) continue;\n\n\t\t\t\tintersects.push( {\n\n\t\t\t\t\tdistance: distance,\n\t\t\t\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t\t\t\t// point: raycaster.ray.at( distance ),\n\t\t\t\t\tpoint: interSegment.clone().applyMatrix4( this.matrixWorld ),\n\t\t\t\t\tindex: i,\n\t\t\t\t\tface: null,\n\t\t\t\t\tfaceIndex: null,\n\t\t\t\t\tobject: this\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\tconst end = Math.min( positionAttribute.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( let i = start, l = end - 1; i < l; i += step ) {\n\n\t\t\t\tvStart.fromBufferAttribute( positionAttribute, i );\n\t\t\t\tvEnd.fromBufferAttribute( positionAttribute, i + 1 );\n\n\t\t\t\tconst distSq = _ray$1.distanceSqToSegment( vStart, vEnd, interRay, interSegment );\n\n\t\t\t\tif ( distSq > localThresholdSq ) continue;\n\n\t\t\t\tinterRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation\n\n\t\t\t\tconst distance = raycaster.ray.origin.distanceTo( interRay );\n\n\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) continue;\n\n\t\t\t\tintersects.push( {\n\n\t\t\t\t\tdistance: distance,\n\t\t\t\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t\t\t\t// point: raycaster.ray.at( distance ),\n\t\t\t\t\tpoint: interSegment.clone().applyMatrix4( this.matrixWorld ),\n\t\t\t\t\tindex: i,\n\t\t\t\t\tface: null,\n\t\t\t\t\tfaceIndex: 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}\n\n\tupdateMorphTargets() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tconst morphAttributes = geometry.morphAttributes;\n\t\tconst keys = Object.keys( morphAttributes );\n\n\t\tif ( keys.length > 0 ) {\n\n\t\t\tconst morphAttribute = morphAttributes[ keys[ 0 ] ];\n\n\t\t\tif ( morphAttribute !== undefined ) {\n\n\t\t\t\tthis.morphTargetInfluences = [];\n\t\t\t\tthis.morphTargetDictionary = {};\n\n\t\t\t\tfor ( let m = 0, ml = morphAttribute.length; m < ml; m ++ ) {\n\n\t\t\t\t\tconst name = morphAttribute[ m ].name || String( m );\n\n\t\t\t\t\tthis.morphTargetInfluences.push( 0 );\n\t\t\t\t\tthis.morphTargetDictionary[ name ] = m;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nconst _start = /*@__PURE__*/ new Vector3();\nconst _end = /*@__PURE__*/ new Vector3();\n\nclass LineSegments extends Line {\n\n\tconstructor( geometry, material ) {\n\n\t\tsuper( geometry, material );\n\n\t\tthis.isLineSegments = true;\n\n\t\tthis.type = 'LineSegments';\n\n\t}\n\n\tcomputeLineDistances() {\n\n\t\tconst geometry = this.geometry;\n\n\t\t// we assume non-indexed geometry\n\n\t\tif ( geometry.index === null ) {\n\n\t\t\tconst positionAttribute = geometry.attributes.position;\n\t\t\tconst lineDistances = [];\n\n\t\t\tfor ( let i = 0, l = positionAttribute.count; i < l; i += 2 ) {\n\n\t\t\t\t_start.fromBufferAttribute( positionAttribute, i );\n\t\t\t\t_end.fromBufferAttribute( positionAttribute, i + 1 );\n\n\t\t\t\tlineDistances[ i ] = ( i === 0 ) ? 0 : lineDistances[ i - 1 ];\n\t\t\t\tlineDistances[ i + 1 ] = lineDistances[ i ] + _start.distanceTo( _end );\n\n\t\t\t}\n\n\t\t\tgeometry.setAttribute( 'lineDistance', new Float32BufferAttribute( lineDistances, 1 ) );\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.LineSegments.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.' );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass LineLoop extends Line {\n\n\tconstructor( geometry, material ) {\n\n\t\tsuper( geometry, material );\n\n\t\tthis.isLineLoop = true;\n\n\t\tthis.type = 'LineLoop';\n\n\t}\n\n}\n\nclass PointsMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isPointsMaterial = true;\n\n\t\tthis.type = 'PointsMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\n\t\tthis.map = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.size = 1;\n\t\tthis.sizeAttenuation = true;\n\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.size = source.size;\n\t\tthis.sizeAttenuation = source.sizeAttenuation;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _inverseMatrix = /*@__PURE__*/ new Matrix4();\nconst _ray = /*@__PURE__*/ new Ray();\nconst _sphere = /*@__PURE__*/ new Sphere();\nconst _position$2 = /*@__PURE__*/ new Vector3();\n\nclass Points extends Object3D {\n\n\tconstructor( geometry = new BufferGeometry(), material = new PointsMaterial() ) {\n\n\t\tsuper();\n\n\t\tthis.isPoints = true;\n\n\t\tthis.type = 'Points';\n\n\t\tthis.geometry = geometry;\n\t\tthis.material = material;\n\n\t\tthis.updateMorphTargets();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.material = source.material;\n\t\tthis.geometry = source.geometry;\n\n\t\treturn this;\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst matrixWorld = this.matrixWorld;\n\t\tconst threshold = raycaster.params.Points.threshold;\n\t\tconst drawRange = geometry.drawRange;\n\n\t\t// Checking boundingSphere distance to ray\n\n\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t_sphere.copy( geometry.boundingSphere );\n\t\t_sphere.applyMatrix4( matrixWorld );\n\t\t_sphere.radius += threshold;\n\n\t\tif ( raycaster.ray.intersectsSphere( _sphere ) === false ) return;\n\n\t\t//\n\n\t\t_inverseMatrix.copy( matrixWorld ).invert();\n\t\t_ray.copy( raycaster.ray ).applyMatrix4( _inverseMatrix );\n\n\t\tconst localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 );\n\t\tconst localThresholdSq = localThreshold * localThreshold;\n\n\t\tconst index = geometry.index;\n\t\tconst attributes = geometry.attributes;\n\t\tconst positionAttribute = attributes.position;\n\n\t\tif ( index !== null ) {\n\n\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\tconst end = Math.min( index.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( let i = start, il = end; i < il; i ++ ) {\n\n\t\t\t\tconst a = index.getX( i );\n\n\t\t\t\t_position$2.fromBufferAttribute( positionAttribute, a );\n\n\t\t\t\ttestPoint( _position$2, a, localThresholdSq, matrixWorld, raycaster, intersects, this );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\tconst end = Math.min( positionAttribute.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( let i = start, l = end; i < l; i ++ ) {\n\n\t\t\t\t_position$2.fromBufferAttribute( positionAttribute, i );\n\n\t\t\t\ttestPoint( _position$2, i, localThresholdSq, matrixWorld, raycaster, intersects, this );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tupdateMorphTargets() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tconst morphAttributes = geometry.morphAttributes;\n\t\tconst keys = Object.keys( morphAttributes );\n\n\t\tif ( keys.length > 0 ) {\n\n\t\t\tconst morphAttribute = morphAttributes[ keys[ 0 ] ];\n\n\t\t\tif ( morphAttribute !== undefined ) {\n\n\t\t\t\tthis.morphTargetInfluences = [];\n\t\t\t\tthis.morphTargetDictionary = {};\n\n\t\t\t\tfor ( let m = 0, ml = morphAttribute.length; m < ml; m ++ ) {\n\n\t\t\t\t\tconst name = morphAttribute[ m ].name || String( m );\n\n\t\t\t\t\tthis.morphTargetInfluences.push( 0 );\n\t\t\t\t\tthis.morphTargetDictionary[ name ] = m;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nfunction testPoint( point, index, localThresholdSq, matrixWorld, raycaster, intersects, object ) {\n\n\tconst rayPointDistanceSq = _ray.distanceSqToPoint( point );\n\n\tif ( rayPointDistanceSq < localThresholdSq ) {\n\n\t\tconst intersectPoint = new Vector3();\n\n\t\t_ray.closestPointToPoint( point, intersectPoint );\n\t\tintersectPoint.applyMatrix4( matrixWorld );\n\n\t\tconst distance = raycaster.ray.origin.distanceTo( intersectPoint );\n\n\t\tif ( distance < raycaster.near || distance > raycaster.far ) return;\n\n\t\tintersects.push( {\n\n\t\t\tdistance: distance,\n\t\t\tdistanceToRay: Math.sqrt( rayPointDistanceSq ),\n\t\t\tpoint: intersectPoint,\n\t\t\tindex: index,\n\t\t\tface: null,\n\t\t\tobject: object\n\n\t\t} );\n\n\t}\n\n}\n\nclass VideoTexture extends Texture {\n\n\tconstructor( video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {\n\n\t\tsuper( video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\tthis.isVideoTexture = true;\n\n\t\tthis.minFilter = minFilter !== undefined ? minFilter : LinearFilter;\n\t\tthis.magFilter = magFilter !== undefined ? magFilter : LinearFilter;\n\n\t\tthis.generateMipmaps = false;\n\n\t\tconst scope = this;\n\n\t\tfunction updateVideo() {\n\n\t\t\tscope.needsUpdate = true;\n\t\t\tvideo.requestVideoFrameCallback( updateVideo );\n\n\t\t}\n\n\t\tif ( 'requestVideoFrameCallback' in video ) {\n\n\t\t\tvideo.requestVideoFrameCallback( updateVideo );\n\n\t\t}\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this.image ).copy( this );\n\n\t}\n\n\tupdate() {\n\n\t\tconst video = this.image;\n\t\tconst hasVideoFrameCallback = 'requestVideoFrameCallback' in video;\n\n\t\tif ( hasVideoFrameCallback === false && video.readyState >= video.HAVE_CURRENT_DATA ) {\n\n\t\t\tthis.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n}\n\nclass FramebufferTexture extends Texture {\n\n\tconstructor( width, height, format ) {\n\n\t\tsuper( { width, height } );\n\n\t\tthis.isFramebufferTexture = true;\n\n\t\tthis.format = format;\n\n\t\tthis.magFilter = NearestFilter;\n\t\tthis.minFilter = NearestFilter;\n\n\t\tthis.generateMipmaps = false;\n\n\t\tthis.needsUpdate = true;\n\n\t}\n\n}\n\nclass CompressedTexture extends Texture {\n\n\tconstructor( mipmaps, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) {\n\n\t\tsuper( null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );\n\n\t\tthis.isCompressedTexture = true;\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}\n\nclass CanvasTexture extends Texture {\n\n\tconstructor( canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {\n\n\t\tsuper( canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\tthis.isCanvasTexture = true;\n\n\t\tthis.needsUpdate = true;\n\n\t}\n\n}\n\n/**\n * Extensible curve object.\n *\n * Some common of curve methods:\n * .getPoint( t, optionalTarget ), .getTangent( t, optionalTarget )\n * .getPointAt( u, optionalTarget ), .getTangentAt( u, optionalTarget )\n * .getPoints(), .getSpacedPoints()\n * .getLength()\n * .updateArcLengths()\n *\n * This following curves inherit from THREE.Curve:\n *\n * -- 2D curves --\n * THREE.ArcCurve\n * THREE.CubicBezierCurve\n * THREE.EllipseCurve\n * THREE.LineCurve\n * THREE.QuadraticBezierCurve\n * THREE.SplineCurve\n *\n * -- 3D curves --\n * THREE.CatmullRomCurve3\n * THREE.CubicBezierCurve3\n * THREE.LineCurve3\n * THREE.QuadraticBezierCurve3\n *\n * A series of curves can be represented as a THREE.CurvePath.\n *\n **/\n\nclass Curve {\n\n\tconstructor() {\n\n\t\tthis.type = 'Curve';\n\n\t\tthis.arcLengthDivisions = 200;\n\n\t}\n\n\t// Virtual base class method to overwrite and implement in subclasses\n\t//\t- t [0 .. 1]\n\n\tgetPoint( /* t, optionalTarget */ ) {\n\n\t\tconsole.warn( 'THREE.Curve: .getPoint() not implemented.' );\n\t\treturn null;\n\n\t}\n\n\t// Get point at relative position in curve according to arc length\n\t// - u [0 .. 1]\n\n\tgetPointAt( u, optionalTarget ) {\n\n\t\tconst t = this.getUtoTmapping( u );\n\t\treturn this.getPoint( t, optionalTarget );\n\n\t}\n\n\t// Get sequence of points using getPoint( t )\n\n\tgetPoints( divisions = 5 ) {\n\n\t\tconst points = [];\n\n\t\tfor ( let d = 0; d <= divisions; d ++ ) {\n\n\t\t\tpoints.push( this.getPoint( d / divisions ) );\n\n\t\t}\n\n\t\treturn points;\n\n\t}\n\n\t// Get sequence of points using getPointAt( u )\n\n\tgetSpacedPoints( divisions = 5 ) {\n\n\t\tconst points = [];\n\n\t\tfor ( let d = 0; d <= divisions; d ++ ) {\n\n\t\t\tpoints.push( this.getPointAt( d / divisions ) );\n\n\t\t}\n\n\t\treturn points;\n\n\t}\n\n\t// Get total curve arc length\n\n\tgetLength() {\n\n\t\tconst lengths = this.getLengths();\n\t\treturn lengths[ lengths.length - 1 ];\n\n\t}\n\n\t// Get list of cumulative segment lengths\n\n\tgetLengths( divisions = this.arcLengthDivisions ) {\n\n\t\tif ( this.cacheArcLengths &&\n\t\t\t( this.cacheArcLengths.length === divisions + 1 ) &&\n\t\t\t! this.needsUpdate ) {\n\n\t\t\treturn this.cacheArcLengths;\n\n\t\t}\n\n\t\tthis.needsUpdate = false;\n\n\t\tconst cache = [];\n\t\tlet current, last = this.getPoint( 0 );\n\t\tlet sum = 0;\n\n\t\tcache.push( 0 );\n\n\t\tfor ( let p = 1; p <= divisions; p ++ ) {\n\n\t\t\tcurrent = this.getPoint( p / divisions );\n\t\t\tsum += current.distanceTo( last );\n\t\t\tcache.push( sum );\n\t\t\tlast = current;\n\n\t\t}\n\n\t\tthis.cacheArcLengths = cache;\n\n\t\treturn cache; // { sums: cache, sum: sum }; Sum is in the last element.\n\n\t}\n\n\tupdateArcLengths() {\n\n\t\tthis.needsUpdate = true;\n\t\tthis.getLengths();\n\n\t}\n\n\t// Given u ( 0 .. 1 ), get a t to find p. This gives you points which are equidistant\n\n\tgetUtoTmapping( u, distance ) {\n\n\t\tconst arcLengths = this.getLengths();\n\n\t\tlet i = 0;\n\t\tconst il = arcLengths.length;\n\n\t\tlet targetArcLength; // The targeted u distance value to get\n\n\t\tif ( distance ) {\n\n\t\t\ttargetArcLength = distance;\n\n\t\t} else {\n\n\t\t\ttargetArcLength = u * arcLengths[ il - 1 ];\n\n\t\t}\n\n\t\t// binary search for the index with largest value smaller than target u distance\n\n\t\tlet low = 0, high = il - 1, comparison;\n\n\t\twhile ( low <= high ) {\n\n\t\t\ti = Math.floor( low + ( high - low ) / 2 ); // less likely to overflow, though probably not issue here, JS doesn't really have integers, all numbers are floats\n\n\t\t\tcomparison = arcLengths[ i ] - targetArcLength;\n\n\t\t\tif ( comparison < 0 ) {\n\n\t\t\t\tlow = i + 1;\n\n\t\t\t} else if ( comparison > 0 ) {\n\n\t\t\t\thigh = i - 1;\n\n\t\t\t} else {\n\n\t\t\t\thigh = i;\n\t\t\t\tbreak;\n\n\t\t\t\t// DONE\n\n\t\t\t}\n\n\t\t}\n\n\t\ti = high;\n\n\t\tif ( arcLengths[ i ] === targetArcLength ) {\n\n\t\t\treturn i / ( il - 1 );\n\n\t\t}\n\n\t\t// we could get finer grain at lengths, or use simple interpolation between two points\n\n\t\tconst lengthBefore = arcLengths[ i ];\n\t\tconst lengthAfter = arcLengths[ i + 1 ];\n\n\t\tconst segmentLength = lengthAfter - lengthBefore;\n\n\t\t// determine where we are between the 'before' and 'after' points\n\n\t\tconst segmentFraction = ( targetArcLength - lengthBefore ) / segmentLength;\n\n\t\t// add that fractional amount to t\n\n\t\tconst t = ( i + segmentFraction ) / ( il - 1 );\n\n\t\treturn t;\n\n\t}\n\n\t// Returns a unit vector tangent at t\n\t// In case any sub curve does not implement its tangent derivation,\n\t// 2 points a small delta apart will be used to find its gradient\n\t// which seems to give a reasonable approximation\n\n\tgetTangent( t, optionalTarget ) {\n\n\t\tconst delta = 0.0001;\n\t\tlet t1 = t - delta;\n\t\tlet t2 = t + delta;\n\n\t\t// Capping in case of danger\n\n\t\tif ( t1 < 0 ) t1 = 0;\n\t\tif ( t2 > 1 ) t2 = 1;\n\n\t\tconst pt1 = this.getPoint( t1 );\n\t\tconst pt2 = this.getPoint( t2 );\n\n\t\tconst tangent = optionalTarget || ( ( pt1.isVector2 ) ? new Vector2() : new Vector3() );\n\n\t\ttangent.copy( pt2 ).sub( pt1 ).normalize();\n\n\t\treturn tangent;\n\n\t}\n\n\tgetTangentAt( u, optionalTarget ) {\n\n\t\tconst t = this.getUtoTmapping( u );\n\t\treturn this.getTangent( t, optionalTarget );\n\n\t}\n\n\tcomputeFrenetFrames( segments, closed ) {\n\n\t\t// see http://www.cs.indiana.edu/pub/techreports/TR425.pdf\n\n\t\tconst normal = new Vector3();\n\n\t\tconst tangents = [];\n\t\tconst normals = [];\n\t\tconst binormals = [];\n\n\t\tconst vec = new Vector3();\n\t\tconst mat = new Matrix4();\n\n\t\t// compute the tangent vectors for each segment on the curve\n\n\t\tfor ( let i = 0; i <= segments; i ++ ) {\n\n\t\t\tconst u = i / segments;\n\n\t\t\ttangents[ i ] = this.getTangentAt( u, new Vector3() );\n\n\t\t}\n\n\t\t// select an initial normal vector perpendicular to the first tangent vector,\n\t\t// and in the direction of the minimum tangent xyz component\n\n\t\tnormals[ 0 ] = new Vector3();\n\t\tbinormals[ 0 ] = new Vector3();\n\t\tlet min = Number.MAX_VALUE;\n\t\tconst tx = Math.abs( tangents[ 0 ].x );\n\t\tconst ty = Math.abs( tangents[ 0 ].y );\n\t\tconst tz = Math.abs( tangents[ 0 ].z );\n\n\t\tif ( tx <= min ) {\n\n\t\t\tmin = tx;\n\t\t\tnormal.set( 1, 0, 0 );\n\n\t\t}\n\n\t\tif ( ty <= min ) {\n\n\t\t\tmin = ty;\n\t\t\tnormal.set( 0, 1, 0 );\n\n\t\t}\n\n\t\tif ( tz <= min ) {\n\n\t\t\tnormal.set( 0, 0, 1 );\n\n\t\t}\n\n\t\tvec.crossVectors( tangents[ 0 ], normal ).normalize();\n\n\t\tnormals[ 0 ].crossVectors( tangents[ 0 ], vec );\n\t\tbinormals[ 0 ].crossVectors( tangents[ 0 ], normals[ 0 ] );\n\n\n\t\t// compute the slowly-varying normal and binormal vectors for each segment on the curve\n\n\t\tfor ( let i = 1; i <= segments; i ++ ) {\n\n\t\t\tnormals[ i ] = normals[ i - 1 ].clone();\n\n\t\t\tbinormals[ i ] = binormals[ i - 1 ].clone();\n\n\t\t\tvec.crossVectors( tangents[ i - 1 ], tangents[ i ] );\n\n\t\t\tif ( vec.length() > Number.EPSILON ) {\n\n\t\t\t\tvec.normalize();\n\n\t\t\t\tconst theta = Math.acos( clamp( tangents[ i - 1 ].dot( tangents[ i ] ), - 1, 1 ) ); // clamp for floating pt errors\n\n\t\t\t\tnormals[ i ].applyMatrix4( mat.makeRotationAxis( vec, theta ) );\n\n\t\t\t}\n\n\t\t\tbinormals[ i ].crossVectors( tangents[ i ], normals[ i ] );\n\n\t\t}\n\n\t\t// if the curve is closed, postprocess the vectors so the first and last normal vectors are the same\n\n\t\tif ( closed === true ) {\n\n\t\t\tlet theta = Math.acos( clamp( normals[ 0 ].dot( normals[ segments ] ), - 1, 1 ) );\n\t\t\ttheta /= segments;\n\n\t\t\tif ( tangents[ 0 ].dot( vec.crossVectors( normals[ 0 ], normals[ segments ] ) ) > 0 ) {\n\n\t\t\t\ttheta = - theta;\n\n\t\t\t}\n\n\t\t\tfor ( let i = 1; i <= segments; i ++ ) {\n\n\t\t\t\t// twist a little...\n\t\t\t\tnormals[ i ].applyMatrix4( mat.makeRotationAxis( tangents[ i ], theta * i ) );\n\t\t\t\tbinormals[ i ].crossVectors( tangents[ i ], normals[ i ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn {\n\t\t\ttangents: tangents,\n\t\t\tnormals: normals,\n\t\t\tbinormals: binormals\n\t\t};\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.arcLengthDivisions = source.arcLengthDivisions;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.5,\n\t\t\t\ttype: 'Curve',\n\t\t\t\tgenerator: 'Curve.toJSON'\n\t\t\t}\n\t\t};\n\n\t\tdata.arcLengthDivisions = this.arcLengthDivisions;\n\t\tdata.type = this.type;\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tthis.arcLengthDivisions = json.arcLengthDivisions;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass EllipseCurve extends Curve {\n\n\tconstructor( aX = 0, aY = 0, xRadius = 1, yRadius = 1, aStartAngle = 0, aEndAngle = Math.PI * 2, aClockwise = false, aRotation = 0 ) {\n\n\t\tsuper();\n\n\t\tthis.isEllipseCurve = true;\n\n\t\tthis.type = 'EllipseCurve';\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;\n\n\t}\n\n\tgetPoint( t, optionalTarget ) {\n\n\t\tconst point = optionalTarget || new Vector2();\n\n\t\tconst twoPi = Math.PI * 2;\n\t\tlet deltaAngle = this.aEndAngle - this.aStartAngle;\n\t\tconst 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\tconst angle = this.aStartAngle + t * deltaAngle;\n\t\tlet x = this.aX + this.xRadius * Math.cos( angle );\n\t\tlet y = this.aY + this.yRadius * Math.sin( angle );\n\n\t\tif ( this.aRotation !== 0 ) {\n\n\t\t\tconst cos = Math.cos( this.aRotation );\n\t\t\tconst sin = Math.sin( this.aRotation );\n\n\t\t\tconst tx = x - this.aX;\n\t\t\tconst 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 point.set( x, y );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.aX = source.aX;\n\t\tthis.aY = source.aY;\n\n\t\tthis.xRadius = source.xRadius;\n\t\tthis.yRadius = source.yRadius;\n\n\t\tthis.aStartAngle = source.aStartAngle;\n\t\tthis.aEndAngle = source.aEndAngle;\n\n\t\tthis.aClockwise = source.aClockwise;\n\n\t\tthis.aRotation = source.aRotation;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.aX = this.aX;\n\t\tdata.aY = this.aY;\n\n\t\tdata.xRadius = this.xRadius;\n\t\tdata.yRadius = this.yRadius;\n\n\t\tdata.aStartAngle = this.aStartAngle;\n\t\tdata.aEndAngle = this.aEndAngle;\n\n\t\tdata.aClockwise = this.aClockwise;\n\n\t\tdata.aRotation = this.aRotation;\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.aX = json.aX;\n\t\tthis.aY = json.aY;\n\n\t\tthis.xRadius = json.xRadius;\n\t\tthis.yRadius = json.yRadius;\n\n\t\tthis.aStartAngle = json.aStartAngle;\n\t\tthis.aEndAngle = json.aEndAngle;\n\n\t\tthis.aClockwise = json.aClockwise;\n\n\t\tthis.aRotation = json.aRotation;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass ArcCurve extends EllipseCurve {\n\n\tconstructor( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\tsuper( aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );\n\n\t\tthis.isArcCurve = true;\n\n\t\tthis.type = 'ArcCurve';\n\n\t}\n\n}\n\n/**\n * Centripetal CatmullRom Curve - which is useful for avoiding\n * cusps and self-intersections in non-uniform catmull rom curves.\n * http://www.cemyuksel.com/research/catmullrom_param/catmullrom.pdf\n *\n * curve.type accepts centripetal(default), chordal and catmullrom\n * curve.tension is used for catmullrom which defaults to 0.5\n */\n\n\n/*\nBased on an optimized c++ solution in\n - http://stackoverflow.com/questions/9489736/catmull-rom-curve-with-no-cusps-and-no-self-intersections/\n - http://ideone.com/NoEbVM\n\nThis CubicPoly class could be used for reusing some variables and calculations,\nbut for three.js curve use, it could be possible inlined and flatten into a single function call\nwhich can be placed in CurveUtils.\n*/\n\nfunction CubicPoly() {\n\n\tlet c0 = 0, c1 = 0, c2 = 0, c3 = 0;\n\n\t/*\n\t * Compute coefficients for a cubic polynomial\n\t * p(s) = c0 + c1*s + c2*s^2 + c3*s^3\n\t * such that\n\t * p(0) = x0, p(1) = x1\n\t * and\n\t * p'(0) = t0, p'(1) = t1.\n\t */\n\tfunction init( x0, x1, t0, t1 ) {\n\n\t\tc0 = x0;\n\t\tc1 = t0;\n\t\tc2 = - 3 * x0 + 3 * x1 - 2 * t0 - t1;\n\t\tc3 = 2 * x0 - 2 * x1 + t0 + t1;\n\n\t}\n\n\treturn {\n\n\t\tinitCatmullRom: function ( x0, x1, x2, x3, tension ) {\n\n\t\t\tinit( x1, x2, tension * ( x2 - x0 ), tension * ( x3 - x1 ) );\n\n\t\t},\n\n\t\tinitNonuniformCatmullRom: function ( x0, x1, x2, x3, dt0, dt1, dt2 ) {\n\n\t\t\t// compute tangents when parameterized in [t1,t2]\n\t\t\tlet t1 = ( x1 - x0 ) / dt0 - ( x2 - x0 ) / ( dt0 + dt1 ) + ( x2 - x1 ) / dt1;\n\t\t\tlet 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\tinit( x1, x2, t1, t2 );\n\n\t\t},\n\n\t\tcalc: function ( t ) {\n\n\t\t\tconst t2 = t * t;\n\t\t\tconst t3 = t2 * t;\n\t\t\treturn c0 + c1 * t + c2 * t2 + c3 * t3;\n\n\t\t}\n\n\t};\n\n}\n\n//\n\nconst tmp = /*@__PURE__*/ new Vector3();\nconst px = /*@__PURE__*/ new CubicPoly();\nconst py = /*@__PURE__*/ new CubicPoly();\nconst pz = /*@__PURE__*/ new CubicPoly();\n\nclass CatmullRomCurve3 extends Curve {\n\n\tconstructor( points = [], closed = false, curveType = 'centripetal', tension = 0.5 ) {\n\n\t\tsuper();\n\n\t\tthis.isCatmullRomCurve3 = true;\n\n\t\tthis.type = 'CatmullRomCurve3';\n\n\t\tthis.points = points;\n\t\tthis.closed = closed;\n\t\tthis.curveType = curveType;\n\t\tthis.tension = tension;\n\n\t}\n\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst points = this.points;\n\t\tconst l = points.length;\n\n\t\tconst p = ( l - ( this.closed ? 0 : 1 ) ) * t;\n\t\tlet intPoint = Math.floor( p );\n\t\tlet weight = p - intPoint;\n\n\t\tif ( this.closed ) {\n\n\t\t\tintPoint += intPoint > 0 ? 0 : ( Math.floor( Math.abs( intPoint ) / l ) + 1 ) * l;\n\n\t\t} else if ( weight === 0 && intPoint === l - 1 ) {\n\n\t\t\tintPoint = l - 2;\n\t\t\tweight = 1;\n\n\t\t}\n\n\t\tlet p0, p3; // 4 points (p1 & p2 defined below)\n\n\t\tif ( this.closed || intPoint > 0 ) {\n\n\t\t\tp0 = points[ ( intPoint - 1 ) % l ];\n\n\t\t} else {\n\n\t\t\t// extrapolate first point\n\t\t\ttmp.subVectors( points[ 0 ], points[ 1 ] ).add( points[ 0 ] );\n\t\t\tp0 = tmp;\n\n\t\t}\n\n\t\tconst p1 = points[ intPoint % l ];\n\t\tconst p2 = points[ ( intPoint + 1 ) % l ];\n\n\t\tif ( this.closed || intPoint + 2 < l ) {\n\n\t\t\tp3 = points[ ( intPoint + 2 ) % l ];\n\n\t\t} else {\n\n\t\t\t// extrapolate last point\n\t\t\ttmp.subVectors( points[ l - 1 ], points[ l - 2 ] ).add( points[ l - 1 ] );\n\t\t\tp3 = tmp;\n\n\t\t}\n\n\t\tif ( this.curveType === 'centripetal' || this.curveType === 'chordal' ) {\n\n\t\t\t// init Centripetal / Chordal Catmull-Rom\n\t\t\tconst pow = this.curveType === 'chordal' ? 0.5 : 0.25;\n\t\t\tlet dt0 = Math.pow( p0.distanceToSquared( p1 ), pow );\n\t\t\tlet dt1 = Math.pow( p1.distanceToSquared( p2 ), pow );\n\t\t\tlet dt2 = Math.pow( p2.distanceToSquared( p3 ), pow );\n\n\t\t\t// safety check for repeated points\n\t\t\tif ( dt1 < 1e-4 ) dt1 = 1.0;\n\t\t\tif ( dt0 < 1e-4 ) dt0 = dt1;\n\t\t\tif ( dt2 < 1e-4 ) dt2 = dt1;\n\n\t\t\tpx.initNonuniformCatmullRom( p0.x, p1.x, p2.x, p3.x, dt0, dt1, dt2 );\n\t\t\tpy.initNonuniformCatmullRom( p0.y, p1.y, p2.y, p3.y, dt0, dt1, dt2 );\n\t\t\tpz.initNonuniformCatmullRom( p0.z, p1.z, p2.z, p3.z, dt0, dt1, dt2 );\n\n\t\t} else if ( this.curveType === 'catmullrom' ) {\n\n\t\t\tpx.initCatmullRom( p0.x, p1.x, p2.x, p3.x, this.tension );\n\t\t\tpy.initCatmullRom( p0.y, p1.y, p2.y, p3.y, this.tension );\n\t\t\tpz.initCatmullRom( p0.z, p1.z, p2.z, p3.z, this.tension );\n\n\t\t}\n\n\t\tpoint.set(\n\t\t\tpx.calc( weight ),\n\t\t\tpy.calc( weight ),\n\t\t\tpz.calc( weight )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.points = [];\n\n\t\tfor ( let i = 0, l = source.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = source.points[ i ];\n\n\t\t\tthis.points.push( point.clone() );\n\n\t\t}\n\n\t\tthis.closed = source.closed;\n\t\tthis.curveType = source.curveType;\n\t\tthis.tension = source.tension;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.points = [];\n\n\t\tfor ( let i = 0, l = this.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = this.points[ i ];\n\t\t\tdata.points.push( point.toArray() );\n\n\t\t}\n\n\t\tdata.closed = this.closed;\n\t\tdata.curveType = this.curveType;\n\t\tdata.tension = this.tension;\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.points = [];\n\n\t\tfor ( let i = 0, l = json.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = json.points[ i ];\n\t\t\tthis.points.push( new Vector3().fromArray( point ) );\n\n\t\t}\n\n\t\tthis.closed = json.closed;\n\t\tthis.curveType = json.curveType;\n\t\tthis.tension = json.tension;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * Bezier Curves formulas obtained from\n * https://en.wikipedia.org/wiki/B%C3%A9zier_curve\n */\n\nfunction CatmullRom( t, p0, p1, p2, p3 ) {\n\n\tconst v0 = ( p2 - p0 ) * 0.5;\n\tconst v1 = ( p3 - p1 ) * 0.5;\n\tconst t2 = t * t;\n\tconst t3 = t * t2;\n\treturn ( 2 * p1 - 2 * p2 + v0 + v1 ) * t3 + ( - 3 * p1 + 3 * p2 - 2 * v0 - v1 ) * t2 + v0 * t + p1;\n\n}\n\n//\n\nfunction QuadraticBezierP0( t, p ) {\n\n\tconst k = 1 - t;\n\treturn k * k * p;\n\n}\n\nfunction QuadraticBezierP1( t, p ) {\n\n\treturn 2 * ( 1 - t ) * t * p;\n\n}\n\nfunction QuadraticBezierP2( t, p ) {\n\n\treturn t * t * p;\n\n}\n\nfunction QuadraticBezier( t, p0, p1, p2 ) {\n\n\treturn QuadraticBezierP0( t, p0 ) + QuadraticBezierP1( t, p1 ) +\n\t\tQuadraticBezierP2( t, p2 );\n\n}\n\n//\n\nfunction CubicBezierP0( t, p ) {\n\n\tconst k = 1 - t;\n\treturn k * k * k * p;\n\n}\n\nfunction CubicBezierP1( t, p ) {\n\n\tconst k = 1 - t;\n\treturn 3 * k * k * t * p;\n\n}\n\nfunction CubicBezierP2( t, p ) {\n\n\treturn 3 * ( 1 - t ) * t * t * p;\n\n}\n\nfunction CubicBezierP3( t, p ) {\n\n\treturn t * t * t * p;\n\n}\n\nfunction CubicBezier( t, p0, p1, p2, p3 ) {\n\n\treturn CubicBezierP0( t, p0 ) + CubicBezierP1( t, p1 ) + CubicBezierP2( t, p2 ) +\n\t\tCubicBezierP3( t, p3 );\n\n}\n\nclass CubicBezierCurve extends Curve {\n\n\tconstructor( v0 = new Vector2(), v1 = new Vector2(), v2 = new Vector2(), v3 = new Vector2() ) {\n\n\t\tsuper();\n\n\t\tthis.isCubicBezierCurve = true;\n\n\t\tthis.type = 'CubicBezierCurve';\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\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3;\n\n\t\tpoint.set(\n\t\t\tCubicBezier( t, v0.x, v1.x, v2.x, v3.x ),\n\t\t\tCubicBezier( t, v0.y, v1.y, v2.y, v3.y )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v0.copy( source.v0 );\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\t\tthis.v3.copy( source.v3 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v0 = this.v0.toArray();\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\t\tdata.v3 = this.v3.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v0.fromArray( json.v0 );\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\t\tthis.v3.fromArray( json.v3 );\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass CubicBezierCurve3 extends Curve {\n\n\tconstructor( v0 = new Vector3(), v1 = new Vector3(), v2 = new Vector3(), v3 = new Vector3() ) {\n\n\t\tsuper();\n\n\t\tthis.isCubicBezierCurve3 = true;\n\n\t\tthis.type = 'CubicBezierCurve3';\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\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3;\n\n\t\tpoint.set(\n\t\t\tCubicBezier( t, v0.x, v1.x, v2.x, v3.x ),\n\t\t\tCubicBezier( t, v0.y, v1.y, v2.y, v3.y ),\n\t\t\tCubicBezier( t, v0.z, v1.z, v2.z, v3.z )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v0.copy( source.v0 );\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\t\tthis.v3.copy( source.v3 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v0 = this.v0.toArray();\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\t\tdata.v3 = this.v3.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v0.fromArray( json.v0 );\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\t\tthis.v3.fromArray( json.v3 );\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass LineCurve extends Curve {\n\n\tconstructor( v1 = new Vector2(), v2 = new Vector2() ) {\n\n\t\tsuper();\n\n\t\tthis.isLineCurve = true;\n\n\t\tthis.type = 'LineCurve';\n\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\n\t}\n\n\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tif ( t === 1 ) {\n\n\t\t\tpoint.copy( this.v2 );\n\n\t\t} else {\n\n\t\t\tpoint.copy( this.v2 ).sub( this.v1 );\n\t\t\tpoint.multiplyScalar( t ).add( this.v1 );\n\n\t\t}\n\n\t\treturn point;\n\n\t}\n\n\t// Line curve is linear, so we can overwrite default getPointAt\n\tgetPointAt( u, optionalTarget ) {\n\n\t\treturn this.getPoint( u, optionalTarget );\n\n\t}\n\n\tgetTangent( t, optionalTarget ) {\n\n\t\tconst tangent = optionalTarget || new Vector2();\n\n\t\ttangent.copy( this.v2 ).sub( this.v1 ).normalize();\n\n\t\treturn tangent;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass LineCurve3 extends Curve {\n\n\tconstructor( v1 = new Vector3(), v2 = new Vector3() ) {\n\n\t\tsuper();\n\n\t\tthis.isLineCurve3 = true;\n\n\t\tthis.type = 'LineCurve3';\n\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\n\t}\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tif ( t === 1 ) {\n\n\t\t\tpoint.copy( this.v2 );\n\n\t\t} else {\n\n\t\t\tpoint.copy( this.v2 ).sub( this.v1 );\n\t\t\tpoint.multiplyScalar( t ).add( this.v1 );\n\n\t\t}\n\n\t\treturn point;\n\n\t}\n\t// Line curve is linear, so we can overwrite default getPointAt\n\tgetPointAt( u, optionalTarget ) {\n\n\t\treturn this.getPoint( u, optionalTarget );\n\n\t}\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\n\t\treturn this;\n\n\t}\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\n\t\treturn data;\n\n\t}\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass QuadraticBezierCurve extends Curve {\n\n\tconstructor( v0 = new Vector2(), v1 = new Vector2(), v2 = new Vector2() ) {\n\n\t\tsuper();\n\n\t\tthis.isQuadraticBezierCurve = true;\n\n\t\tthis.type = 'QuadraticBezierCurve';\n\n\t\tthis.v0 = v0;\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\n\t}\n\n\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2;\n\n\t\tpoint.set(\n\t\t\tQuadraticBezier( t, v0.x, v1.x, v2.x ),\n\t\t\tQuadraticBezier( t, v0.y, v1.y, v2.y )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v0.copy( source.v0 );\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v0 = this.v0.toArray();\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v0.fromArray( json.v0 );\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass QuadraticBezierCurve3 extends Curve {\n\n\tconstructor( v0 = new Vector3(), v1 = new Vector3(), v2 = new Vector3() ) {\n\n\t\tsuper();\n\n\t\tthis.isQuadraticBezierCurve3 = true;\n\n\t\tthis.type = 'QuadraticBezierCurve3';\n\n\t\tthis.v0 = v0;\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\n\t}\n\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2;\n\n\t\tpoint.set(\n\t\t\tQuadraticBezier( t, v0.x, v1.x, v2.x ),\n\t\t\tQuadraticBezier( t, v0.y, v1.y, v2.y ),\n\t\t\tQuadraticBezier( t, v0.z, v1.z, v2.z )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v0.copy( source.v0 );\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v0 = this.v0.toArray();\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v0.fromArray( json.v0 );\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass SplineCurve extends Curve {\n\n\tconstructor( points = [] ) {\n\n\t\tsuper();\n\n\t\tthis.isSplineCurve = true;\n\n\t\tthis.type = 'SplineCurve';\n\n\t\tthis.points = points;\n\n\t}\n\n\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst points = this.points;\n\t\tconst p = ( points.length - 1 ) * t;\n\n\t\tconst intPoint = Math.floor( p );\n\t\tconst weight = p - intPoint;\n\n\t\tconst p0 = points[ intPoint === 0 ? intPoint : intPoint - 1 ];\n\t\tconst p1 = points[ intPoint ];\n\t\tconst p2 = points[ intPoint > points.length - 2 ? points.length - 1 : intPoint + 1 ];\n\t\tconst p3 = points[ intPoint > points.length - 3 ? points.length - 1 : intPoint + 2 ];\n\n\t\tpoint.set(\n\t\t\tCatmullRom( weight, p0.x, p1.x, p2.x, p3.x ),\n\t\t\tCatmullRom( weight, p0.y, p1.y, p2.y, p3.y )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.points = [];\n\n\t\tfor ( let i = 0, l = source.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = source.points[ i ];\n\n\t\t\tthis.points.push( point.clone() );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.points = [];\n\n\t\tfor ( let i = 0, l = this.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = this.points[ i ];\n\t\t\tdata.points.push( point.toArray() );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.points = [];\n\n\t\tfor ( let i = 0, l = json.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = json.points[ i ];\n\t\t\tthis.points.push( new Vector2().fromArray( point ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\nvar Curves = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tArcCurve: ArcCurve,\n\tCatmullRomCurve3: CatmullRomCurve3,\n\tCubicBezierCurve: CubicBezierCurve,\n\tCubicBezierCurve3: CubicBezierCurve3,\n\tEllipseCurve: EllipseCurve,\n\tLineCurve: LineCurve,\n\tLineCurve3: LineCurve3,\n\tQuadraticBezierCurve: QuadraticBezierCurve,\n\tQuadraticBezierCurve3: QuadraticBezierCurve3,\n\tSplineCurve: SplineCurve\n});\n\n/**************************************************************\n *\tCurved Path - a curve path is simply a array of connected\n * curves, but retains the api of a curve\n **************************************************************/\n\nclass CurvePath extends Curve {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.type = 'CurvePath';\n\n\t\tthis.curves = [];\n\t\tthis.autoClose = false; // Automatically closes the path\n\n\t}\n\n\tadd( curve ) {\n\n\t\tthis.curves.push( curve );\n\n\t}\n\n\tclosePath() {\n\n\t\t// Add a line curve if start and end of lines are not connected\n\t\tconst startPoint = this.curves[ 0 ].getPoint( 0 );\n\t\tconst endPoint = this.curves[ this.curves.length - 1 ].getPoint( 1 );\n\n\t\tif ( ! startPoint.equals( endPoint ) ) {\n\n\t\t\tthis.curves.push( new LineCurve( endPoint, startPoint ) );\n\n\t\t}\n\n\t}\n\n\t// To get accurate point with reference to\n\t// entire path distance at time t,\n\t// following has to be done:\n\n\t// 1. Length of each sub path have to be known\n\t// 2. Locate and identify type of curve\n\t// 3. Get t for the curve\n\t// 4. Return curve.getPointAt(t')\n\n\tgetPoint( t, optionalTarget ) {\n\n\t\tconst d = t * this.getLength();\n\t\tconst curveLengths = this.getCurveLengths();\n\t\tlet i = 0;\n\n\t\t// To think about boundaries points.\n\n\t\twhile ( i < curveLengths.length ) {\n\n\t\t\tif ( curveLengths[ i ] >= d ) {\n\n\t\t\t\tconst diff = curveLengths[ i ] - d;\n\t\t\t\tconst curve = this.curves[ i ];\n\n\t\t\t\tconst segmentLength = curve.getLength();\n\t\t\t\tconst u = segmentLength === 0 ? 0 : 1 - diff / segmentLength;\n\n\t\t\t\treturn curve.getPointAt( u, optionalTarget );\n\n\t\t\t}\n\n\t\t\ti ++;\n\n\t\t}\n\n\t\treturn null;\n\n\t\t// loop where sum != 0, sum > d , sum+1 1 && ! points[ points.length - 1 ].equals( points[ 0 ] ) ) {\n\n\t\t\tpoints.push( points[ 0 ] );\n\n\t\t}\n\n\t\treturn points;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.curves = [];\n\n\t\tfor ( let i = 0, l = source.curves.length; i < l; i ++ ) {\n\n\t\t\tconst curve = source.curves[ i ];\n\n\t\t\tthis.curves.push( curve.clone() );\n\n\t\t}\n\n\t\tthis.autoClose = source.autoClose;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.autoClose = this.autoClose;\n\t\tdata.curves = [];\n\n\t\tfor ( let i = 0, l = this.curves.length; i < l; i ++ ) {\n\n\t\t\tconst curve = this.curves[ i ];\n\t\t\tdata.curves.push( curve.toJSON() );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.autoClose = json.autoClose;\n\t\tthis.curves = [];\n\n\t\tfor ( let i = 0, l = json.curves.length; i < l; i ++ ) {\n\n\t\t\tconst curve = json.curves[ i ];\n\t\t\tthis.curves.push( new Curves[ curve.type ]().fromJSON( curve ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass Path extends CurvePath {\n\n\tconstructor( points ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'Path';\n\n\t\tthis.currentPoint = new Vector2();\n\n\t\tif ( points ) {\n\n\t\t\tthis.setFromPoints( points );\n\n\t\t}\n\n\t}\n\n\tsetFromPoints( points ) {\n\n\t\tthis.moveTo( points[ 0 ].x, points[ 0 ].y );\n\n\t\tfor ( let i = 1, l = points.length; i < l; i ++ ) {\n\n\t\t\tthis.lineTo( points[ i ].x, points[ i ].y );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tmoveTo( x, y ) {\n\n\t\tthis.currentPoint.set( x, y ); // TODO consider referencing vectors instead of copying?\n\n\t\treturn this;\n\n\t}\n\n\tlineTo( x, y ) {\n\n\t\tconst curve = new LineCurve( this.currentPoint.clone(), new Vector2( x, y ) );\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.set( x, y );\n\n\t\treturn this;\n\n\t}\n\n\tquadraticCurveTo( aCPx, aCPy, aX, aY ) {\n\n\t\tconst curve = new QuadraticBezierCurve(\n\t\t\tthis.currentPoint.clone(),\n\t\t\tnew Vector2( aCPx, aCPy ),\n\t\t\tnew Vector2( aX, aY )\n\t\t);\n\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.set( aX, aY );\n\n\t\treturn this;\n\n\t}\n\n\tbezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {\n\n\t\tconst curve = new CubicBezierCurve(\n\t\t\tthis.currentPoint.clone(),\n\t\t\tnew Vector2( aCP1x, aCP1y ),\n\t\t\tnew Vector2( aCP2x, aCP2y ),\n\t\t\tnew Vector2( aX, aY )\n\t\t);\n\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.set( aX, aY );\n\n\t\treturn this;\n\n\t}\n\n\tsplineThru( pts /*Array of Vector*/ ) {\n\n\t\tconst npts = [ this.currentPoint.clone() ].concat( pts );\n\n\t\tconst curve = new SplineCurve( npts );\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.copy( pts[ pts.length - 1 ] );\n\n\t\treturn this;\n\n\t}\n\n\tarc( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\tconst x0 = this.currentPoint.x;\n\t\tconst y0 = this.currentPoint.y;\n\n\t\tthis.absarc( aX + x0, aY + y0, aRadius,\n\t\t\taStartAngle, aEndAngle, aClockwise );\n\n\t\treturn this;\n\n\t}\n\n\tabsarc( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\tthis.absellipse( aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );\n\n\t\treturn this;\n\n\t}\n\n\tellipse( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\tconst x0 = this.currentPoint.x;\n\t\tconst y0 = this.currentPoint.y;\n\n\t\tthis.absellipse( aX + x0, aY + y0, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation );\n\n\t\treturn this;\n\n\t}\n\n\tabsellipse( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\tconst curve = new EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation );\n\n\t\tif ( this.curves.length > 0 ) {\n\n\t\t\t// if a previous curve is present, attempt to join\n\t\t\tconst firstPoint = curve.getPoint( 0 );\n\n\t\t\tif ( ! firstPoint.equals( this.currentPoint ) ) {\n\n\t\t\t\tthis.lineTo( firstPoint.x, firstPoint.y );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.curves.push( curve );\n\n\t\tconst lastPoint = curve.getPoint( 1 );\n\t\tthis.currentPoint.copy( lastPoint );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.currentPoint.copy( source.currentPoint );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.currentPoint = this.currentPoint.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.currentPoint.fromArray( json.currentPoint );\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass LatheGeometry extends BufferGeometry {\n\n\tconstructor( points = [ new Vector2( 0, - 0.5 ), new Vector2( 0.5, 0 ), new Vector2( 0, 0.5 ) ], segments = 12, phiStart = 0, phiLength = Math.PI * 2 ) {\n\n\t\tsuper();\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\tsegments = Math.floor( segments );\n\n\t\t// clamp phiLength so it's in range of [ 0, 2PI ]\n\n\t\tphiLength = clamp( phiLength, 0, Math.PI * 2 );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst uvs = [];\n\t\tconst initNormals = [];\n\t\tconst normals = [];\n\n\t\t// helper variables\n\n\t\tconst inverseSegments = 1.0 / segments;\n\t\tconst vertex = new Vector3();\n\t\tconst uv = new Vector2();\n\t\tconst normal = new Vector3();\n\t\tconst curNormal = new Vector3();\n\t\tconst prevNormal = new Vector3();\n\t\tlet dx = 0;\n\t\tlet dy = 0;\n\n\t\t// pre-compute normals for initial \"meridian\"\n\n\t\tfor ( let j = 0; j <= ( points.length - 1 ); j ++ ) {\n\n\t\t\tswitch ( j ) {\n\n\t\t\t\tcase 0:\t\t\t\t// special handling for 1st vertex on path\n\n\t\t\t\t\tdx = points[ j + 1 ].x - points[ j ].x;\n\t\t\t\t\tdy = points[ j + 1 ].y - points[ j ].y;\n\n\t\t\t\t\tnormal.x = dy * 1.0;\n\t\t\t\t\tnormal.y = - dx;\n\t\t\t\t\tnormal.z = dy * 0.0;\n\n\t\t\t\t\tprevNormal.copy( normal );\n\n\t\t\t\t\tnormal.normalize();\n\n\t\t\t\t\tinitNormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase ( points.length - 1 ):\t// special handling for last Vertex on path\n\n\t\t\t\t\tinitNormals.push( prevNormal.x, prevNormal.y, prevNormal.z );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\t\t\t// default handling for all vertices in between\n\n\t\t\t\t\tdx = points[ j + 1 ].x - points[ j ].x;\n\t\t\t\t\tdy = points[ j + 1 ].y - points[ j ].y;\n\n\t\t\t\t\tnormal.x = dy * 1.0;\n\t\t\t\t\tnormal.y = - dx;\n\t\t\t\t\tnormal.z = dy * 0.0;\n\n\t\t\t\t\tcurNormal.copy( normal );\n\n\t\t\t\t\tnormal.x += prevNormal.x;\n\t\t\t\t\tnormal.y += prevNormal.y;\n\t\t\t\t\tnormal.z += prevNormal.z;\n\n\t\t\t\t\tnormal.normalize();\n\n\t\t\t\t\tinitNormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t\tprevNormal.copy( curNormal );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate vertices, uvs and normals\n\n\t\tfor ( let i = 0; i <= segments; i ++ ) {\n\n\t\t\tconst phi = phiStart + i * inverseSegments * phiLength;\n\n\t\t\tconst sin = Math.sin( phi );\n\t\t\tconst cos = Math.cos( phi );\n\n\t\t\tfor ( let j = 0; j <= ( points.length - 1 ); j ++ ) {\n\n\t\t\t\t// vertex\n\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\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = i / segments;\n\t\t\t\tuv.y = j / ( points.length - 1 );\n\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\t// normal\n\n\t\t\t\tconst x = initNormals[ 3 * j + 0 ] * sin;\n\t\t\t\tconst y = initNormals[ 3 * j + 1 ];\n\t\t\t\tconst z = initNormals[ 3 * j + 0 ] * cos;\n\n\t\t\t\tnormals.push( x, y, z );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( let i = 0; i < segments; i ++ ) {\n\n\t\t\tfor ( let j = 0; j < ( points.length - 1 ); j ++ ) {\n\n\t\t\t\tconst base = j + i * points.length;\n\n\t\t\t\tconst a = base;\n\t\t\t\tconst b = base + points.length;\n\t\t\t\tconst c = base + points.length + 1;\n\t\t\t\tconst d = base + 1;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( c, d, b );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new LatheGeometry( data.points, data.segments, data.phiStart, data.phiLength );\n\n\t}\n\n}\n\nclass CapsuleGeometry extends LatheGeometry {\n\n\tconstructor( radius = 1, length = 1, capSegments = 4, radialSegments = 8 ) {\n\n\t\tconst path = new Path();\n\t\tpath.absarc( 0, - length / 2, radius, Math.PI * 1.5, 0 );\n\t\tpath.absarc( 0, length / 2, radius, 0, Math.PI * 0.5 );\n\n\t\tsuper( path.getPoints( capSegments ), radialSegments );\n\n\t\tthis.type = 'CapsuleGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\theight: length,\n\t\t\tcapSegments: capSegments,\n\t\t\tradialSegments: radialSegments,\n\t\t};\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new CapsuleGeometry( data.radius, data.length, data.capSegments, data.radialSegments );\n\n\t}\n\n}\n\nclass CircleGeometry extends BufferGeometry {\n\n\tconstructor( radius = 1, segments = 8, thetaStart = 0, thetaLength = Math.PI * 2 ) {\n\n\t\tsuper();\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\tsegments = Math.max( 3, segments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tconst vertex = new Vector3();\n\t\tconst uv = new Vector2();\n\n\t\t// center point\n\n\t\tvertices.push( 0, 0, 0 );\n\t\tnormals.push( 0, 0, 1 );\n\t\tuvs.push( 0.5, 0.5 );\n\n\t\tfor ( let s = 0, i = 3; s <= segments; s ++, i += 3 ) {\n\n\t\t\tconst segment = thetaStart + s / segments * thetaLength;\n\n\t\t\t// vertex\n\n\t\t\tvertex.x = radius * Math.cos( segment );\n\t\t\tvertex.y = radius * Math.sin( segment );\n\n\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t// normal\n\n\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t// uvs\n\n\t\t\tuv.x = ( vertices[ i ] / radius + 1 ) / 2;\n\t\t\tuv.y = ( vertices[ i + 1 ] / radius + 1 ) / 2;\n\n\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( let i = 1; i <= segments; i ++ ) {\n\n\t\t\tindices.push( i, i + 1, 0 );\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new CircleGeometry( data.radius, data.segments, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\nclass CylinderGeometry extends BufferGeometry {\n\n\tconstructor( radiusTop = 1, radiusBottom = 1, height = 1, radialSegments = 8, heightSegments = 1, openEnded = false, thetaStart = 0, thetaLength = Math.PI * 2 ) {\n\n\t\tsuper();\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\tconst scope = this;\n\n\t\tradialSegments = Math.floor( radialSegments );\n\t\theightSegments = Math.floor( heightSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tlet index = 0;\n\t\tconst indexArray = [];\n\t\tconst halfHeight = height / 2;\n\t\tlet groupStart = 0;\n\n\t\t// generate geometry\n\n\t\tgenerateTorso();\n\n\t\tif ( openEnded === false ) {\n\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.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\tfunction generateTorso() {\n\n\t\t\tconst normal = new Vector3();\n\t\t\tconst vertex = new Vector3();\n\n\t\t\tlet groupCount = 0;\n\n\t\t\t// this will be used to calculate the normal\n\t\t\tconst slope = ( radiusBottom - radiusTop ) / height;\n\n\t\t\t// generate vertices, normals and uvs\n\n\t\t\tfor ( let y = 0; y <= heightSegments; y ++ ) {\n\n\t\t\t\tconst indexRow = [];\n\n\t\t\t\tconst v = y / heightSegments;\n\n\t\t\t\t// calculate the radius of the current row\n\n\t\t\t\tconst radius = v * ( radiusBottom - radiusTop ) + radiusTop;\n\n\t\t\t\tfor ( let x = 0; x <= radialSegments; x ++ ) {\n\n\t\t\t\t\tconst u = x / radialSegments;\n\n\t\t\t\t\tconst theta = u * thetaLength + thetaStart;\n\n\t\t\t\t\tconst sinTheta = Math.sin( theta );\n\t\t\t\t\tconst cosTheta = Math.cos( theta );\n\n\t\t\t\t\t// vertex\n\n\t\t\t\t\tvertex.x = radius * sinTheta;\n\t\t\t\t\tvertex.y = - v * height + halfHeight;\n\t\t\t\t\tvertex.z = radius * cosTheta;\n\t\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t\t// normal\n\n\t\t\t\t\tnormal.set( sinTheta, slope, cosTheta ).normalize();\n\t\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t\t// uv\n\n\t\t\t\t\tuvs.push( u, 1 - v );\n\n\t\t\t\t\t// save index of vertex in respective row\n\n\t\t\t\t\tindexRow.push( index ++ );\n\n\t\t\t\t}\n\n\t\t\t\t// now save vertices of the row in our index array\n\n\t\t\t\tindexArray.push( indexRow );\n\n\t\t\t}\n\n\t\t\t// generate indices\n\n\t\t\tfor ( let x = 0; x < radialSegments; x ++ ) {\n\n\t\t\t\tfor ( let y = 0; y < heightSegments; y ++ ) {\n\n\t\t\t\t\t// we use the index array to access the correct indices\n\n\t\t\t\t\tconst a = indexArray[ y ][ x ];\n\t\t\t\t\tconst b = indexArray[ y + 1 ][ x ];\n\t\t\t\t\tconst c = indexArray[ y + 1 ][ x + 1 ];\n\t\t\t\t\tconst d = indexArray[ y ][ x + 1 ];\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t\t// update group counter\n\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\n\t\t\tscope.addGroup( groupStart, groupCount, 0 );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t}\n\n\t\tfunction generateCap( top ) {\n\n\t\t\t// save the index of the first center vertex\n\t\t\tconst centerIndexStart = index;\n\n\t\t\tconst uv = new Vector2();\n\t\t\tconst vertex = new Vector3();\n\n\t\t\tlet groupCount = 0;\n\n\t\t\tconst radius = ( top === true ) ? radiusTop : radiusBottom;\n\t\t\tconst sign = ( top === true ) ? 1 : - 1;\n\n\t\t\t// first we generate the center vertex data of the cap.\n\t\t\t// because the geometry needs one set of uvs per face,\n\t\t\t// we must generate a center vertex per face/segment\n\n\t\t\tfor ( let x = 1; x <= radialSegments; x ++ ) {\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertices.push( 0, halfHeight * sign, 0 );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push( 0, sign, 0 );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( 0.5, 0.5 );\n\n\t\t\t\t// increase index\n\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t\t// save the index of the last center vertex\n\t\t\tconst centerIndexEnd = index;\n\n\t\t\t// now we generate the surrounding vertices, normals and uvs\n\n\t\t\tfor ( let x = 0; x <= radialSegments; x ++ ) {\n\n\t\t\t\tconst u = x / radialSegments;\n\t\t\t\tconst theta = u * thetaLength + thetaStart;\n\n\t\t\t\tconst cosTheta = Math.cos( theta );\n\t\t\t\tconst sinTheta = Math.sin( theta );\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = radius * sinTheta;\n\t\t\t\tvertex.y = halfHeight * sign;\n\t\t\t\tvertex.z = radius * cosTheta;\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push( 0, sign, 0 );\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = ( cosTheta * 0.5 ) + 0.5;\n\t\t\t\tuv.y = ( sinTheta * 0.5 * sign ) + 0.5;\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\t// increase index\n\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t\t// generate indices\n\n\t\t\tfor ( let x = 0; x < radialSegments; x ++ ) {\n\n\t\t\t\tconst c = centerIndexStart + x;\n\t\t\t\tconst i = centerIndexEnd + x;\n\n\t\t\t\tif ( top === true ) {\n\n\t\t\t\t\t// face top\n\n\t\t\t\t\tindices.push( i, i + 1, c );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// face bottom\n\n\t\t\t\t\tindices.push( i + 1, i, c );\n\n\t\t\t\t}\n\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\n\t\t\tscope.addGroup( groupStart, groupCount, top === true ? 1 : 2 );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t}\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new CylinderGeometry( data.radiusTop, data.radiusBottom, data.height, data.radialSegments, data.heightSegments, data.openEnded, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\nclass ConeGeometry extends CylinderGeometry {\n\n\tconstructor( radius = 1, height = 1, radialSegments = 8, heightSegments = 1, openEnded = false, thetaStart = 0, thetaLength = Math.PI * 2 ) {\n\n\t\tsuper( 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\tstatic fromJSON( data ) {\n\n\t\treturn new ConeGeometry( data.radius, data.height, data.radialSegments, data.heightSegments, data.openEnded, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\nclass PolyhedronGeometry extends BufferGeometry {\n\n\tconstructor( vertices = [], indices = [], radius = 1, detail = 0 ) {\n\n\t\tsuper();\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\t// default buffer data\n\n\t\tconst vertexBuffer = [];\n\t\tconst uvBuffer = [];\n\n\t\t// the subdivision creates the vertex buffer data\n\n\t\tsubdivide( detail );\n\n\t\t// all vertices should lie on a conceptual sphere with a given radius\n\n\t\tapplyRadius( radius );\n\n\t\t// finally, create the uv data\n\n\t\tgenerateUVs();\n\n\t\t// build non-indexed geometry\n\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertexBuffer, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( vertexBuffer.slice(), 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvBuffer, 2 ) );\n\n\t\tif ( detail === 0 ) {\n\n\t\t\tthis.computeVertexNormals(); // flat normals\n\n\t\t} else {\n\n\t\t\tthis.normalizeNormals(); // smooth normals\n\n\t\t}\n\n\t\t// helper functions\n\n\t\tfunction subdivide( detail ) {\n\n\t\t\tconst a = new Vector3();\n\t\t\tconst b = new Vector3();\n\t\t\tconst c = new Vector3();\n\n\t\t\t// iterate over all faces and apply a subdivison with the given detail value\n\n\t\t\tfor ( let 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\tconst cols = detail + 1;\n\n\t\t\t// we use this multidimensional array as a data structure for creating the subdivision\n\n\t\t\tconst v = [];\n\n\t\t\t// construct all of the vertices for this subdivision\n\n\t\t\tfor ( let i = 0; i <= cols; i ++ ) {\n\n\t\t\t\tv[ i ] = [];\n\n\t\t\t\tconst aj = a.clone().lerp( c, i / cols );\n\t\t\t\tconst bj = b.clone().lerp( c, i / cols );\n\n\t\t\t\tconst rows = cols - i;\n\n\t\t\t\tfor ( let j = 0; j <= rows; j ++ ) {\n\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 ( let i = 0; i < cols; i ++ ) {\n\n\t\t\t\tfor ( let j = 0; j < 2 * ( cols - i ) - 1; j ++ ) {\n\n\t\t\t\t\tconst 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 applyRadius( radius ) {\n\n\t\t\tconst vertex = new Vector3();\n\n\t\t\t// iterate over the entire buffer and apply the radius to each vertex\n\n\t\t\tfor ( let i = 0; i < vertexBuffer.length; i += 3 ) {\n\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\tconst vertex = new Vector3();\n\n\t\t\tfor ( let 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\tconst u = azimuth( vertex ) / 2 / Math.PI + 0.5;\n\t\t\t\tconst v = inclination( vertex ) / Math.PI + 0.5;\n\t\t\t\tuvBuffer.push( u, 1 - v );\n\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 ( let i = 0; i < uvBuffer.length; i += 6 ) {\n\n\t\t\t\t// uv data of a single face\n\n\t\t\t\tconst x0 = uvBuffer[ i + 0 ];\n\t\t\t\tconst x1 = uvBuffer[ i + 2 ];\n\t\t\t\tconst x2 = uvBuffer[ i + 4 ];\n\n\t\t\t\tconst max = Math.max( x0, x1, x2 );\n\t\t\t\tconst min = Math.min( x0, x1, x2 );\n\n\t\t\t\t// 0.9 is somewhat arbitrary\n\n\t\t\t\tif ( max > 0.9 && min < 0.1 ) {\n\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\tconst stride = index * 3;\n\n\t\t\tvertex.x = vertices[ stride + 0 ];\n\t\t\tvertex.y = vertices[ stride + 1 ];\n\t\t\tvertex.z = vertices[ stride + 2 ];\n\n\t\t}\n\n\t\tfunction correctUVs() {\n\n\t\t\tconst a = new Vector3();\n\t\t\tconst b = new Vector3();\n\t\t\tconst c = new Vector3();\n\n\t\t\tconst centroid = new Vector3();\n\n\t\t\tconst uvA = new Vector2();\n\t\t\tconst uvB = new Vector2();\n\t\t\tconst uvC = new Vector2();\n\n\t\t\tfor ( let i = 0, j = 0; i < vertexBuffer.length; i += 9, j += 6 ) {\n\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\tconst azi = azimuth( centroid );\n\n\t\t\t\tcorrectUV( uvA, j + 0, a, azi );\n\t\t\t\tcorrectUV( uvB, j + 2, b, azi );\n\t\t\t\tcorrectUV( uvC, j + 4, c, azi );\n\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\tstatic fromJSON( data ) {\n\n\t\treturn new PolyhedronGeometry( data.vertices, data.indices, data.radius, data.details );\n\n\t}\n\n}\n\nclass DodecahedronGeometry extends PolyhedronGeometry {\n\n\tconstructor( radius = 1, detail = 0 ) {\n\n\t\tconst t = ( 1 + Math.sqrt( 5 ) ) / 2;\n\t\tconst r = 1 / t;\n\n\t\tconst vertices = [\n\n\t\t\t// (±1, ±1, ±1)\n\t\t\t- 1, - 1, - 1,\t- 1, - 1, 1,\n\t\t\t- 1, 1, - 1, - 1, 1, 1,\n\t\t\t1, - 1, - 1, 1, - 1, 1,\n\t\t\t1, 1, - 1, 1, 1, 1,\n\n\t\t\t// (0, ±1/φ, ±φ)\n\t\t\t0, - r, - t, 0, - r, t,\n\t\t\t0, r, - t, 0, r, t,\n\n\t\t\t// (±1/φ, ±φ, 0)\n\t\t\t- r, - t, 0, - r, t, 0,\n\t\t\tr, - t, 0, r, t, 0,\n\n\t\t\t// (±φ, 0, ±1/φ)\n\t\t\t- t, 0, - r, t, 0, - r,\n\t\t\t- t, 0, r, t, 0, r\n\t\t];\n\n\t\tconst indices = [\n\t\t\t3, 11, 7, \t3, 7, 15, \t3, 15, 13,\n\t\t\t7, 19, 17, \t7, 17, 6, \t7, 6, 15,\n\t\t\t17, 4, 8, \t17, 8, 10, \t17, 10, 6,\n\t\t\t8, 0, 16, \t8, 16, 2, \t8, 2, 10,\n\t\t\t0, 12, 1, \t0, 1, 18, \t0, 18, 16,\n\t\t\t6, 10, 2, \t6, 2, 13, \t6, 13, 15,\n\t\t\t2, 16, 18, \t2, 18, 3, \t2, 3, 13,\n\t\t\t18, 1, 9, \t18, 9, 11, \t18, 11, 3,\n\t\t\t4, 14, 12, \t4, 12, 0, \t4, 0, 8,\n\t\t\t11, 9, 5, \t11, 5, 19, \t11, 19, 7,\n\t\t\t19, 5, 14, \t19, 14, 4, \t19, 4, 17,\n\t\t\t1, 12, 14, \t1, 14, 5, \t1, 5, 9\n\t\t];\n\n\t\tsuper( vertices, indices, radius, detail );\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}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new DodecahedronGeometry( data.radius, data.detail );\n\n\t}\n\n}\n\nconst _v0 = /*@__PURE__*/ new Vector3();\nconst _v1$1 = /*@__PURE__*/ new Vector3();\nconst _normal = /*@__PURE__*/ new Vector3();\nconst _triangle = /*@__PURE__*/ new Triangle();\n\nclass EdgesGeometry extends BufferGeometry {\n\n\tconstructor( geometry = null, thresholdAngle = 1 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'EdgesGeometry';\n\n\t\tthis.parameters = {\n\t\t\tgeometry: geometry,\n\t\t\tthresholdAngle: thresholdAngle\n\t\t};\n\n\t\tif ( geometry !== null ) {\n\n\t\t\tconst precisionPoints = 4;\n\t\t\tconst precision = Math.pow( 10, precisionPoints );\n\t\t\tconst thresholdDot = Math.cos( DEG2RAD * thresholdAngle );\n\n\t\t\tconst indexAttr = geometry.getIndex();\n\t\t\tconst positionAttr = geometry.getAttribute( 'position' );\n\t\t\tconst indexCount = indexAttr ? indexAttr.count : positionAttr.count;\n\n\t\t\tconst indexArr = [ 0, 0, 0 ];\n\t\t\tconst vertKeys = [ 'a', 'b', 'c' ];\n\t\t\tconst hashes = new Array( 3 );\n\n\t\t\tconst edgeData = {};\n\t\t\tconst vertices = [];\n\t\t\tfor ( let i = 0; i < indexCount; i += 3 ) {\n\n\t\t\t\tif ( indexAttr ) {\n\n\t\t\t\t\tindexArr[ 0 ] = indexAttr.getX( i );\n\t\t\t\t\tindexArr[ 1 ] = indexAttr.getX( i + 1 );\n\t\t\t\t\tindexArr[ 2 ] = indexAttr.getX( i + 2 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tindexArr[ 0 ] = i;\n\t\t\t\t\tindexArr[ 1 ] = i + 1;\n\t\t\t\t\tindexArr[ 2 ] = i + 2;\n\n\t\t\t\t}\n\n\t\t\t\tconst { a, b, c } = _triangle;\n\t\t\t\ta.fromBufferAttribute( positionAttr, indexArr[ 0 ] );\n\t\t\t\tb.fromBufferAttribute( positionAttr, indexArr[ 1 ] );\n\t\t\t\tc.fromBufferAttribute( positionAttr, indexArr[ 2 ] );\n\t\t\t\t_triangle.getNormal( _normal );\n\n\t\t\t\t// create hashes for the edge from the vertices\n\t\t\t\thashes[ 0 ] = `${ Math.round( a.x * precision ) },${ Math.round( a.y * precision ) },${ Math.round( a.z * precision ) }`;\n\t\t\t\thashes[ 1 ] = `${ Math.round( b.x * precision ) },${ Math.round( b.y * precision ) },${ Math.round( b.z * precision ) }`;\n\t\t\t\thashes[ 2 ] = `${ Math.round( c.x * precision ) },${ Math.round( c.y * precision ) },${ Math.round( c.z * precision ) }`;\n\n\t\t\t\t// skip degenerate triangles\n\t\t\t\tif ( hashes[ 0 ] === hashes[ 1 ] || hashes[ 1 ] === hashes[ 2 ] || hashes[ 2 ] === hashes[ 0 ] ) {\n\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\t// iterate over every edge\n\t\t\t\tfor ( let j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t// get the first and next vertex making up the edge\n\t\t\t\t\tconst jNext = ( j + 1 ) % 3;\n\t\t\t\t\tconst vecHash0 = hashes[ j ];\n\t\t\t\t\tconst vecHash1 = hashes[ jNext ];\n\t\t\t\t\tconst v0 = _triangle[ vertKeys[ j ] ];\n\t\t\t\t\tconst v1 = _triangle[ vertKeys[ jNext ] ];\n\n\t\t\t\t\tconst hash = `${ vecHash0 }_${ vecHash1 }`;\n\t\t\t\t\tconst reverseHash = `${ vecHash1 }_${ vecHash0 }`;\n\n\t\t\t\t\tif ( reverseHash in edgeData && edgeData[ reverseHash ] ) {\n\n\t\t\t\t\t\t// if we found a sibling edge add it into the vertex array if\n\t\t\t\t\t\t// it meets the angle threshold and delete the edge from the map.\n\t\t\t\t\t\tif ( _normal.dot( edgeData[ reverseHash ].normal ) <= thresholdDot ) {\n\n\t\t\t\t\t\t\tvertices.push( v0.x, v0.y, v0.z );\n\t\t\t\t\t\t\tvertices.push( v1.x, v1.y, v1.z );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tedgeData[ reverseHash ] = null;\n\n\t\t\t\t\t} else if ( ! ( hash in edgeData ) ) {\n\n\t\t\t\t\t\t// if we've already got an edge here then skip adding a new one\n\t\t\t\t\t\tedgeData[ hash ] = {\n\n\t\t\t\t\t\t\tindex0: indexArr[ j ],\n\t\t\t\t\t\t\tindex1: indexArr[ jNext ],\n\t\t\t\t\t\t\tnormal: _normal.clone(),\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// iterate over all remaining, unmatched edges and add them to the vertex array\n\t\t\tfor ( const key in edgeData ) {\n\n\t\t\t\tif ( edgeData[ key ] ) {\n\n\t\t\t\t\tconst { index0, index1 } = edgeData[ key ];\n\t\t\t\t\t_v0.fromBufferAttribute( positionAttr, index0 );\n\t\t\t\t\t_v1$1.fromBufferAttribute( positionAttr, index1 );\n\n\t\t\t\t\tvertices.push( _v0.x, _v0.y, _v0.z );\n\t\t\t\t\tvertices.push( _v1$1.x, _v1$1.y, _v1$1.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\n\t\t}\n\n\t}\n\n}\n\nclass Shape extends Path {\n\n\tconstructor( points ) {\n\n\t\tsuper( points );\n\n\t\tthis.uuid = generateUUID();\n\n\t\tthis.type = 'Shape';\n\n\t\tthis.holes = [];\n\n\t}\n\n\tgetPointsHoles( divisions ) {\n\n\t\tconst holesPts = [];\n\n\t\tfor ( let i = 0, l = this.holes.length; i < l; i ++ ) {\n\n\t\t\tholesPts[ i ] = this.holes[ i ].getPoints( divisions );\n\n\t\t}\n\n\t\treturn holesPts;\n\n\t}\n\n\t// get points of shape and holes (keypoints based on segments parameter)\n\n\textractPoints( divisions ) {\n\n\t\treturn {\n\n\t\t\tshape: this.getPoints( divisions ),\n\t\t\tholes: this.getPointsHoles( divisions )\n\n\t\t};\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.holes = [];\n\n\t\tfor ( let i = 0, l = source.holes.length; i < l; i ++ ) {\n\n\t\t\tconst hole = source.holes[ i ];\n\n\t\t\tthis.holes.push( hole.clone() );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.uuid = this.uuid;\n\t\tdata.holes = [];\n\n\t\tfor ( let i = 0, l = this.holes.length; i < l; i ++ ) {\n\n\t\t\tconst hole = this.holes[ i ];\n\t\t\tdata.holes.push( hole.toJSON() );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.uuid = json.uuid;\n\t\tthis.holes = [];\n\n\t\tfor ( let i = 0, l = json.holes.length; i < l; i ++ ) {\n\n\t\t\tconst hole = json.holes[ i ];\n\t\t\tthis.holes.push( new Path().fromJSON( hole ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * Port from https://github.com/mapbox/earcut (v2.2.2)\n */\n\nconst Earcut = {\n\n\ttriangulate: function ( data, holeIndices, dim = 2 ) {\n\n\t\tconst hasHoles = holeIndices && holeIndices.length;\n\t\tconst outerLen = hasHoles ? holeIndices[ 0 ] * dim : data.length;\n\t\tlet outerNode = linkedList( data, 0, outerLen, dim, true );\n\t\tconst triangles = [];\n\n\t\tif ( ! outerNode || outerNode.next === outerNode.prev ) return triangles;\n\n\t\tlet minX, minY, maxX, maxY, x, y, invSize;\n\n\t\tif ( hasHoles ) outerNode = eliminateHoles( data, holeIndices, outerNode, dim );\n\n\t\t// if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox\n\t\tif ( data.length > 80 * dim ) {\n\n\t\t\tminX = maxX = data[ 0 ];\n\t\t\tminY = maxY = data[ 1 ];\n\n\t\t\tfor ( let i = dim; i < outerLen; i += dim ) {\n\n\t\t\t\tx = data[ i ];\n\t\t\t\ty = data[ i + 1 ];\n\t\t\t\tif ( x < minX ) minX = x;\n\t\t\t\tif ( y < minY ) minY = y;\n\t\t\t\tif ( x > maxX ) maxX = x;\n\t\t\t\tif ( y > maxY ) maxY = y;\n\n\t\t\t}\n\n\t\t\t// minX, minY and invSize are later used to transform coords into integers for z-order calculation\n\t\t\tinvSize = Math.max( maxX - minX, maxY - minY );\n\t\t\tinvSize = invSize !== 0 ? 1 / invSize : 0;\n\n\t\t}\n\n\t\tearcutLinked( outerNode, triangles, dim, minX, minY, invSize );\n\n\t\treturn triangles;\n\n\t}\n\n};\n\n// create a circular doubly linked list from polygon points in the specified winding order\nfunction linkedList( data, start, end, dim, clockwise ) {\n\n\tlet i, last;\n\n\tif ( clockwise === ( signedArea( data, start, end, dim ) > 0 ) ) {\n\n\t\tfor ( i = start; i < end; i += dim ) last = insertNode( i, data[ i ], data[ i + 1 ], last );\n\n\t} else {\n\n\t\tfor ( i = end - dim; i >= start; i -= dim ) last = insertNode( i, data[ i ], data[ i + 1 ], last );\n\n\t}\n\n\tif ( last && equals( last, last.next ) ) {\n\n\t\tremoveNode( last );\n\t\tlast = last.next;\n\n\t}\n\n\treturn last;\n\n}\n\n// eliminate colinear or duplicate points\nfunction filterPoints( start, end ) {\n\n\tif ( ! start ) return start;\n\tif ( ! end ) end = start;\n\n\tlet p = start,\n\t\tagain;\n\tdo {\n\n\t\tagain = false;\n\n\t\tif ( ! p.steiner && ( equals( p, p.next ) || area( p.prev, p, p.next ) === 0 ) ) {\n\n\t\t\tremoveNode( p );\n\t\t\tp = end = p.prev;\n\t\t\tif ( p === p.next ) break;\n\t\t\tagain = true;\n\n\t\t} else {\n\n\t\t\tp = p.next;\n\n\t\t}\n\n\t} while ( again || p !== end );\n\n\treturn end;\n\n}\n\n// main ear slicing loop which triangulates a polygon (given as a linked list)\nfunction earcutLinked( ear, triangles, dim, minX, minY, invSize, pass ) {\n\n\tif ( ! ear ) return;\n\n\t// interlink polygon nodes in z-order\n\tif ( ! pass && invSize ) indexCurve( ear, minX, minY, invSize );\n\n\tlet stop = ear,\n\t\tprev, next;\n\n\t// iterate through ears, slicing them one by one\n\twhile ( ear.prev !== ear.next ) {\n\n\t\tprev = ear.prev;\n\t\tnext = ear.next;\n\n\t\tif ( invSize ? isEarHashed( ear, minX, minY, invSize ) : isEar( ear ) ) {\n\n\t\t\t// cut off the triangle\n\t\t\ttriangles.push( prev.i / dim );\n\t\t\ttriangles.push( ear.i / dim );\n\t\t\ttriangles.push( next.i / dim );\n\n\t\t\tremoveNode( ear );\n\n\t\t\t// skipping the next vertex leads to less sliver triangles\n\t\t\tear = next.next;\n\t\t\tstop = next.next;\n\n\t\t\tcontinue;\n\n\t\t}\n\n\t\tear = next;\n\n\t\t// if we looped through the whole remaining polygon and can't find any more ears\n\t\tif ( ear === stop ) {\n\n\t\t\t// try filtering points and slicing again\n\t\t\tif ( ! pass ) {\n\n\t\t\t\tearcutLinked( filterPoints( ear ), triangles, dim, minX, minY, invSize, 1 );\n\n\t\t\t\t// if this didn't work, try curing all small self-intersections locally\n\n\t\t\t} else if ( pass === 1 ) {\n\n\t\t\t\tear = cureLocalIntersections( filterPoints( ear ), triangles, dim );\n\t\t\t\tearcutLinked( ear, triangles, dim, minX, minY, invSize, 2 );\n\n\t\t\t\t// as a last resort, try splitting the remaining polygon into two\n\n\t\t\t} else if ( pass === 2 ) {\n\n\t\t\t\tsplitEarcut( ear, triangles, dim, minX, minY, invSize );\n\n\t\t\t}\n\n\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n}\n\n// check whether a polygon node forms a valid ear with adjacent nodes\nfunction isEar( ear ) {\n\n\tconst a = ear.prev,\n\t\tb = ear,\n\t\tc = ear.next;\n\n\tif ( area( a, b, c ) >= 0 ) return false; // reflex, can't be an ear\n\n\t// now make sure we don't have other points inside the potential ear\n\tlet p = ear.next.next;\n\n\twhile ( p !== ear.prev ) {\n\n\t\tif ( pointInTriangle( a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y ) &&\n\t\t\tarea( p.prev, p, p.next ) >= 0 ) return false;\n\t\tp = p.next;\n\n\t}\n\n\treturn true;\n\n}\n\nfunction isEarHashed( ear, minX, minY, invSize ) {\n\n\tconst a = ear.prev,\n\t\tb = ear,\n\t\tc = ear.next;\n\n\tif ( area( a, b, c ) >= 0 ) return false; // reflex, can't be an ear\n\n\t// triangle bbox; min & max are calculated like this for speed\n\tconst minTX = a.x < b.x ? ( a.x < c.x ? a.x : c.x ) : ( b.x < c.x ? b.x : c.x ),\n\t\tminTY = a.y < b.y ? ( a.y < c.y ? a.y : c.y ) : ( b.y < c.y ? b.y : c.y ),\n\t\tmaxTX = a.x > b.x ? ( a.x > c.x ? a.x : c.x ) : ( b.x > c.x ? b.x : c.x ),\n\t\tmaxTY = a.y > b.y ? ( a.y > c.y ? a.y : c.y ) : ( b.y > c.y ? b.y : c.y );\n\n\t// z-order range for the current triangle bbox;\n\tconst minZ = zOrder( minTX, minTY, minX, minY, invSize ),\n\t\tmaxZ = zOrder( maxTX, maxTY, minX, minY, invSize );\n\n\tlet p = ear.prevZ,\n\t\tn = ear.nextZ;\n\n\t// look for points inside the triangle in both directions\n\twhile ( p && p.z >= minZ && n && n.z <= maxZ ) {\n\n\t\tif ( p !== ear.prev && p !== ear.next &&\n\t\t\tpointInTriangle( a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y ) &&\n\t\t\tarea( p.prev, p, p.next ) >= 0 ) return false;\n\t\tp = p.prevZ;\n\n\t\tif ( n !== ear.prev && n !== ear.next &&\n\t\t\tpointInTriangle( a.x, a.y, b.x, b.y, c.x, c.y, n.x, n.y ) &&\n\t\t\tarea( n.prev, n, n.next ) >= 0 ) return false;\n\t\tn = n.nextZ;\n\n\t}\n\n\t// look for remaining points in decreasing z-order\n\twhile ( p && p.z >= minZ ) {\n\n\t\tif ( p !== ear.prev && p !== ear.next &&\n\t\t\tpointInTriangle( a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y ) &&\n\t\t\tarea( p.prev, p, p.next ) >= 0 ) return false;\n\t\tp = p.prevZ;\n\n\t}\n\n\t// look for remaining points in increasing z-order\n\twhile ( n && n.z <= maxZ ) {\n\n\t\tif ( n !== ear.prev && n !== ear.next &&\n\t\t\tpointInTriangle( a.x, a.y, b.x, b.y, c.x, c.y, n.x, n.y ) &&\n\t\t\tarea( n.prev, n, n.next ) >= 0 ) return false;\n\t\tn = n.nextZ;\n\n\t}\n\n\treturn true;\n\n}\n\n// go through all polygon nodes and cure small local self-intersections\nfunction cureLocalIntersections( start, triangles, dim ) {\n\n\tlet p = start;\n\tdo {\n\n\t\tconst a = p.prev,\n\t\t\tb = p.next.next;\n\n\t\tif ( ! equals( a, b ) && intersects( a, p, p.next, b ) && locallyInside( a, b ) && locallyInside( b, a ) ) {\n\n\t\t\ttriangles.push( a.i / dim );\n\t\t\ttriangles.push( p.i / dim );\n\t\t\ttriangles.push( b.i / dim );\n\n\t\t\t// remove two nodes involved\n\t\t\tremoveNode( p );\n\t\t\tremoveNode( p.next );\n\n\t\t\tp = start = b;\n\n\t\t}\n\n\t\tp = p.next;\n\n\t} while ( p !== start );\n\n\treturn filterPoints( p );\n\n}\n\n// try splitting polygon into two and triangulate them independently\nfunction splitEarcut( start, triangles, dim, minX, minY, invSize ) {\n\n\t// look for a valid diagonal that divides the polygon into two\n\tlet a = start;\n\tdo {\n\n\t\tlet b = a.next.next;\n\t\twhile ( b !== a.prev ) {\n\n\t\t\tif ( a.i !== b.i && isValidDiagonal( a, b ) ) {\n\n\t\t\t\t// split the polygon in two by the diagonal\n\t\t\t\tlet c = splitPolygon( a, b );\n\n\t\t\t\t// filter colinear points around the cuts\n\t\t\t\ta = filterPoints( a, a.next );\n\t\t\t\tc = filterPoints( c, c.next );\n\n\t\t\t\t// run earcut on each half\n\t\t\t\tearcutLinked( a, triangles, dim, minX, minY, invSize );\n\t\t\t\tearcutLinked( c, triangles, dim, minX, minY, invSize );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tb = b.next;\n\n\t\t}\n\n\t\ta = a.next;\n\n\t} while ( a !== start );\n\n}\n\n// link every hole into the outer loop, producing a single-ring polygon without holes\nfunction eliminateHoles( data, holeIndices, outerNode, dim ) {\n\n\tconst queue = [];\n\tlet i, len, start, end, list;\n\n\tfor ( i = 0, len = holeIndices.length; i < len; i ++ ) {\n\n\t\tstart = holeIndices[ i ] * dim;\n\t\tend = i < len - 1 ? holeIndices[ i + 1 ] * dim : data.length;\n\t\tlist = linkedList( data, start, end, dim, false );\n\t\tif ( list === list.next ) list.steiner = true;\n\t\tqueue.push( getLeftmost( list ) );\n\n\t}\n\n\tqueue.sort( compareX );\n\n\t// process holes from left to right\n\tfor ( i = 0; i < queue.length; i ++ ) {\n\n\t\teliminateHole( queue[ i ], outerNode );\n\t\touterNode = filterPoints( outerNode, outerNode.next );\n\n\t}\n\n\treturn outerNode;\n\n}\n\nfunction compareX( a, b ) {\n\n\treturn a.x - b.x;\n\n}\n\n// find a bridge between vertices that connects hole with an outer ring and link it\nfunction eliminateHole( hole, outerNode ) {\n\n\touterNode = findHoleBridge( hole, outerNode );\n\tif ( outerNode ) {\n\n\t\tconst b = splitPolygon( outerNode, hole );\n\n\t\t// filter collinear points around the cuts\n\t\tfilterPoints( outerNode, outerNode.next );\n\t\tfilterPoints( b, b.next );\n\n\t}\n\n}\n\n// David Eberly's algorithm for finding a bridge between hole and outer polygon\nfunction findHoleBridge( hole, outerNode ) {\n\n\tlet p = outerNode;\n\tconst hx = hole.x;\n\tconst hy = hole.y;\n\tlet qx = - Infinity, m;\n\n\t// find a segment intersected by a ray from the hole's leftmost point to the left;\n\t// segment's endpoint with lesser x will be potential connection point\n\tdo {\n\n\t\tif ( hy <= p.y && hy >= p.next.y && p.next.y !== p.y ) {\n\n\t\t\tconst x = p.x + ( hy - p.y ) * ( p.next.x - p.x ) / ( p.next.y - p.y );\n\t\t\tif ( x <= hx && x > qx ) {\n\n\t\t\t\tqx = x;\n\t\t\t\tif ( x === hx ) {\n\n\t\t\t\t\tif ( hy === p.y ) return p;\n\t\t\t\t\tif ( hy === p.next.y ) return p.next;\n\n\t\t\t\t}\n\n\t\t\t\tm = p.x < p.next.x ? p : p.next;\n\n\t\t\t}\n\n\t\t}\n\n\t\tp = p.next;\n\n\t} while ( p !== outerNode );\n\n\tif ( ! m ) return null;\n\n\tif ( hx === qx ) return m; // hole touches outer segment; pick leftmost endpoint\n\n\t// look for points inside the triangle of hole point, segment intersection and endpoint;\n\t// if there are no points found, we have a valid connection;\n\t// otherwise choose the point of the minimum angle with the ray as connection point\n\n\tconst stop = m,\n\t\tmx = m.x,\n\t\tmy = m.y;\n\tlet tanMin = Infinity, tan;\n\n\tp = m;\n\n\tdo {\n\n\t\tif ( hx >= p.x && p.x >= mx && hx !== p.x &&\n\t\t\t\tpointInTriangle( hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y ) ) {\n\n\t\t\ttan = Math.abs( hy - p.y ) / ( hx - p.x ); // tangential\n\n\t\t\tif ( locallyInside( p, hole ) && ( tan < tanMin || ( tan === tanMin && ( p.x > m.x || ( p.x === m.x && sectorContainsSector( m, p ) ) ) ) ) ) {\n\n\t\t\t\tm = p;\n\t\t\t\ttanMin = tan;\n\n\t\t\t}\n\n\t\t}\n\n\t\tp = p.next;\n\n\t} while ( p !== stop );\n\n\treturn m;\n\n}\n\n// whether sector in vertex m contains sector in vertex p in the same coordinates\nfunction sectorContainsSector( m, p ) {\n\n\treturn area( m.prev, m, p.prev ) < 0 && area( p.next, m, m.next ) < 0;\n\n}\n\n// interlink polygon nodes in z-order\nfunction indexCurve( start, minX, minY, invSize ) {\n\n\tlet p = start;\n\tdo {\n\n\t\tif ( p.z === null ) p.z = zOrder( p.x, p.y, minX, minY, invSize );\n\t\tp.prevZ = p.prev;\n\t\tp.nextZ = p.next;\n\t\tp = p.next;\n\n\t} while ( p !== start );\n\n\tp.prevZ.nextZ = null;\n\tp.prevZ = null;\n\n\tsortLinked( p );\n\n}\n\n// Simon Tatham's linked list merge sort algorithm\n// http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html\nfunction sortLinked( list ) {\n\n\tlet i, p, q, e, tail, numMerges, pSize, qSize,\n\t\tinSize = 1;\n\n\tdo {\n\n\t\tp = list;\n\t\tlist = null;\n\t\ttail = null;\n\t\tnumMerges = 0;\n\n\t\twhile ( p ) {\n\n\t\t\tnumMerges ++;\n\t\t\tq = p;\n\t\t\tpSize = 0;\n\t\t\tfor ( i = 0; i < inSize; i ++ ) {\n\n\t\t\t\tpSize ++;\n\t\t\t\tq = q.nextZ;\n\t\t\t\tif ( ! q ) break;\n\n\t\t\t}\n\n\t\t\tqSize = inSize;\n\n\t\t\twhile ( pSize > 0 || ( qSize > 0 && q ) ) {\n\n\t\t\t\tif ( pSize !== 0 && ( qSize === 0 || ! q || p.z <= q.z ) ) {\n\n\t\t\t\t\te = p;\n\t\t\t\t\tp = p.nextZ;\n\t\t\t\t\tpSize --;\n\n\t\t\t\t} else {\n\n\t\t\t\t\te = q;\n\t\t\t\t\tq = q.nextZ;\n\t\t\t\t\tqSize --;\n\n\t\t\t\t}\n\n\t\t\t\tif ( tail ) tail.nextZ = e;\n\t\t\t\telse list = e;\n\n\t\t\t\te.prevZ = tail;\n\t\t\t\ttail = e;\n\n\t\t\t}\n\n\t\t\tp = q;\n\n\t\t}\n\n\t\ttail.nextZ = null;\n\t\tinSize *= 2;\n\n\t} while ( numMerges > 1 );\n\n\treturn list;\n\n}\n\n// z-order of a point given coords and inverse of the longer side of data bbox\nfunction zOrder( x, y, minX, minY, invSize ) {\n\n\t// coords are transformed into non-negative 15-bit integer range\n\tx = 32767 * ( x - minX ) * invSize;\n\ty = 32767 * ( y - minY ) * invSize;\n\n\tx = ( x | ( x << 8 ) ) & 0x00FF00FF;\n\tx = ( x | ( x << 4 ) ) & 0x0F0F0F0F;\n\tx = ( x | ( x << 2 ) ) & 0x33333333;\n\tx = ( x | ( x << 1 ) ) & 0x55555555;\n\n\ty = ( y | ( y << 8 ) ) & 0x00FF00FF;\n\ty = ( y | ( y << 4 ) ) & 0x0F0F0F0F;\n\ty = ( y | ( y << 2 ) ) & 0x33333333;\n\ty = ( y | ( y << 1 ) ) & 0x55555555;\n\n\treturn x | ( y << 1 );\n\n}\n\n// find the leftmost node of a polygon ring\nfunction getLeftmost( start ) {\n\n\tlet p = start,\n\t\tleftmost = start;\n\tdo {\n\n\t\tif ( p.x < leftmost.x || ( p.x === leftmost.x && p.y < leftmost.y ) ) leftmost = p;\n\t\tp = p.next;\n\n\t} while ( p !== start );\n\n\treturn leftmost;\n\n}\n\n// check if a point lies within a convex triangle\nfunction pointInTriangle( ax, ay, bx, by, cx, cy, px, py ) {\n\n\treturn ( cx - px ) * ( ay - py ) - ( ax - px ) * ( cy - py ) >= 0 &&\n\t\t\t( ax - px ) * ( by - py ) - ( bx - px ) * ( ay - py ) >= 0 &&\n\t\t\t( bx - px ) * ( cy - py ) - ( cx - px ) * ( by - py ) >= 0;\n\n}\n\n// check if a diagonal between two polygon nodes is valid (lies in polygon interior)\nfunction isValidDiagonal( a, b ) {\n\n\treturn a.next.i !== b.i && a.prev.i !== b.i && ! intersectsPolygon( a, b ) && // doesn't intersect other edges\n\t\t( locallyInside( a, b ) && locallyInside( b, a ) && middleInside( a, b ) && // locally visible\n\t\t( area( a.prev, a, b.prev ) || area( a, b.prev, b ) ) || // does not create opposite-facing sectors\n\t\tequals( a, b ) && area( a.prev, a, a.next ) > 0 && area( b.prev, b, b.next ) > 0 ); // special zero-length case\n\n}\n\n// signed area of a triangle\nfunction area( p, q, r ) {\n\n\treturn ( q.y - p.y ) * ( r.x - q.x ) - ( q.x - p.x ) * ( r.y - q.y );\n\n}\n\n// check if two points are equal\nfunction equals( p1, p2 ) {\n\n\treturn p1.x === p2.x && p1.y === p2.y;\n\n}\n\n// check if two segments intersect\nfunction intersects( p1, q1, p2, q2 ) {\n\n\tconst o1 = sign( area( p1, q1, p2 ) );\n\tconst o2 = sign( area( p1, q1, q2 ) );\n\tconst o3 = sign( area( p2, q2, p1 ) );\n\tconst o4 = sign( area( p2, q2, q1 ) );\n\n\tif ( o1 !== o2 && o3 !== o4 ) return true; // general case\n\n\tif ( o1 === 0 && onSegment( p1, p2, q1 ) ) return true; // p1, q1 and p2 are collinear and p2 lies on p1q1\n\tif ( o2 === 0 && onSegment( p1, q2, q1 ) ) return true; // p1, q1 and q2 are collinear and q2 lies on p1q1\n\tif ( o3 === 0 && onSegment( p2, p1, q2 ) ) return true; // p2, q2 and p1 are collinear and p1 lies on p2q2\n\tif ( o4 === 0 && onSegment( p2, q1, q2 ) ) return true; // p2, q2 and q1 are collinear and q1 lies on p2q2\n\n\treturn false;\n\n}\n\n// for collinear points p, q, r, check if point q lies on segment pr\nfunction onSegment( p, q, r ) {\n\n\treturn q.x <= Math.max( p.x, r.x ) && q.x >= Math.min( p.x, r.x ) && q.y <= Math.max( p.y, r.y ) && q.y >= Math.min( p.y, r.y );\n\n}\n\nfunction sign( num ) {\n\n\treturn num > 0 ? 1 : num < 0 ? - 1 : 0;\n\n}\n\n// check if a polygon diagonal intersects any polygon segments\nfunction intersectsPolygon( a, b ) {\n\n\tlet p = a;\n\tdo {\n\n\t\tif ( p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i &&\n\t\t\t\tintersects( p, p.next, a, b ) ) return true;\n\t\tp = p.next;\n\n\t} while ( p !== a );\n\n\treturn false;\n\n}\n\n// check if a polygon diagonal is locally inside the polygon\nfunction locallyInside( a, b ) {\n\n\treturn area( a.prev, a, a.next ) < 0 ?\n\t\tarea( a, b, a.next ) >= 0 && area( a, a.prev, b ) >= 0 :\n\t\tarea( a, b, a.prev ) < 0 || area( a, a.next, b ) < 0;\n\n}\n\n// check if the middle point of a polygon diagonal is inside the polygon\nfunction middleInside( a, b ) {\n\n\tlet p = a,\n\t\tinside = false;\n\tconst px = ( a.x + b.x ) / 2,\n\t\tpy = ( a.y + b.y ) / 2;\n\tdo {\n\n\t\tif ( ( ( p.y > py ) !== ( p.next.y > py ) ) && p.next.y !== p.y &&\n\t\t\t\t( px < ( p.next.x - p.x ) * ( py - p.y ) / ( p.next.y - p.y ) + p.x ) )\n\t\t\tinside = ! inside;\n\t\tp = p.next;\n\n\t} while ( p !== a );\n\n\treturn inside;\n\n}\n\n// link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two;\n// if one belongs to the outer ring and another to a hole, it merges it into a single ring\nfunction splitPolygon( a, b ) {\n\n\tconst a2 = new Node( a.i, a.x, a.y ),\n\t\tb2 = new Node( b.i, b.x, b.y ),\n\t\tan = a.next,\n\t\tbp = b.prev;\n\n\ta.next = b;\n\tb.prev = a;\n\n\ta2.next = an;\n\tan.prev = a2;\n\n\tb2.next = a2;\n\ta2.prev = b2;\n\n\tbp.next = b2;\n\tb2.prev = bp;\n\n\treturn b2;\n\n}\n\n// create a node and optionally link it with previous one (in a circular doubly linked list)\nfunction insertNode( i, x, y, last ) {\n\n\tconst p = new Node( i, x, y );\n\n\tif ( ! last ) {\n\n\t\tp.prev = p;\n\t\tp.next = p;\n\n\t} else {\n\n\t\tp.next = last.next;\n\t\tp.prev = last;\n\t\tlast.next.prev = p;\n\t\tlast.next = p;\n\n\t}\n\n\treturn p;\n\n}\n\nfunction removeNode( p ) {\n\n\tp.next.prev = p.prev;\n\tp.prev.next = p.next;\n\n\tif ( p.prevZ ) p.prevZ.nextZ = p.nextZ;\n\tif ( p.nextZ ) p.nextZ.prevZ = p.prevZ;\n\n}\n\nfunction Node( i, x, y ) {\n\n\t// vertex index in coordinates array\n\tthis.i = i;\n\n\t// vertex coordinates\n\tthis.x = x;\n\tthis.y = y;\n\n\t// previous and next vertex nodes in a polygon ring\n\tthis.prev = null;\n\tthis.next = null;\n\n\t// z-order curve value\n\tthis.z = null;\n\n\t// previous and next nodes in z-order\n\tthis.prevZ = null;\n\tthis.nextZ = null;\n\n\t// indicates whether this is a steiner point\n\tthis.steiner = false;\n\n}\n\nfunction signedArea( data, start, end, dim ) {\n\n\tlet sum = 0;\n\tfor ( let i = start, j = end - dim; i < end; i += dim ) {\n\n\t\tsum += ( data[ j ] - data[ i ] ) * ( data[ i + 1 ] + data[ j + 1 ] );\n\t\tj = i;\n\n\t}\n\n\treturn sum;\n\n}\n\nclass ShapeUtils {\n\n\t// calculate area of the contour polygon\n\n\tstatic area( contour ) {\n\n\t\tconst n = contour.length;\n\t\tlet a = 0.0;\n\n\t\tfor ( let p = n - 1, q = 0; q < n; p = q ++ ) {\n\n\t\t\ta += contour[ p ].x * contour[ q ].y - contour[ q ].x * contour[ p ].y;\n\n\t\t}\n\n\t\treturn a * 0.5;\n\n\t}\n\n\tstatic isClockWise( pts ) {\n\n\t\treturn ShapeUtils.area( pts ) < 0;\n\n\t}\n\n\tstatic triangulateShape( contour, holes ) {\n\n\t\tconst vertices = []; // flat array of vertices like [ x0,y0, x1,y1, x2,y2, ... ]\n\t\tconst holeIndices = []; // array of hole indices\n\t\tconst faces = []; // final array of vertex indices like [ [ a,b,d ], [ b,c,d ] ]\n\n\t\tremoveDupEndPts( contour );\n\t\taddContour( vertices, contour );\n\n\t\t//\n\n\t\tlet holeIndex = contour.length;\n\n\t\tholes.forEach( removeDupEndPts );\n\n\t\tfor ( let i = 0; i < holes.length; i ++ ) {\n\n\t\t\tholeIndices.push( holeIndex );\n\t\t\tholeIndex += holes[ i ].length;\n\t\t\taddContour( vertices, holes[ i ] );\n\n\t\t}\n\n\t\t//\n\n\t\tconst triangles = Earcut.triangulate( vertices, holeIndices );\n\n\t\t//\n\n\t\tfor ( let i = 0; i < triangles.length; i += 3 ) {\n\n\t\t\tfaces.push( triangles.slice( i, i + 3 ) );\n\n\t\t}\n\n\t\treturn faces;\n\n\t}\n\n}\n\nfunction removeDupEndPts( points ) {\n\n\tconst l = points.length;\n\n\tif ( l > 2 && points[ l - 1 ].equals( points[ 0 ] ) ) {\n\n\t\tpoints.pop();\n\n\t}\n\n}\n\nfunction addContour( vertices, contour ) {\n\n\tfor ( let i = 0; i < contour.length; i ++ ) {\n\n\t\tvertices.push( contour[ i ].x );\n\t\tvertices.push( contour[ i ].y );\n\n\t}\n\n}\n\n/**\n * Creates extruded geometry from a path shape.\n *\n * parameters = {\n *\n * curveSegments: , // number of points on the curves\n * steps: , // number of points for z-side extrusions / used for subdividing segments of extrude spline too\n * depth: , // Depth to extrude the shape\n *\n * bevelEnabled: , // turn on bevel\n * bevelThickness: , // how deep into the original shape bevel goes\n * bevelSize: , // how far from shape outline (including bevelOffset) is bevel\n * bevelOffset: , // how far from shape outline does bevel start\n * bevelSegments: , // number of bevel layers\n *\n * extrudePath: // curve to extrude shape along\n *\n * UVGenerator: // object that provides UV generator functions\n *\n * }\n */\n\nclass ExtrudeGeometry extends BufferGeometry {\n\n\tconstructor( shapes = new Shape( [ new Vector2( 0.5, 0.5 ), new Vector2( - 0.5, 0.5 ), new Vector2( - 0.5, - 0.5 ), new Vector2( 0.5, - 0.5 ) ] ), options = {} ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'ExtrudeGeometry';\n\n\t\tthis.parameters = {\n\t\t\tshapes: shapes,\n\t\t\toptions: options\n\t\t};\n\n\t\tshapes = Array.isArray( shapes ) ? shapes : [ shapes ];\n\n\t\tconst scope = this;\n\n\t\tconst verticesArray = [];\n\t\tconst uvArray = [];\n\n\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\tconst shape = shapes[ i ];\n\t\t\taddShape( shape );\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( verticesArray, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvArray, 2 ) );\n\n\t\tthis.computeVertexNormals();\n\n\t\t// functions\n\n\t\tfunction addShape( shape ) {\n\n\t\t\tconst placeholder = [];\n\n\t\t\t// options\n\n\t\t\tconst curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12;\n\t\t\tconst steps = options.steps !== undefined ? options.steps : 1;\n\t\t\tconst depth = options.depth !== undefined ? options.depth : 1;\n\n\t\t\tlet bevelEnabled = options.bevelEnabled !== undefined ? options.bevelEnabled : true;\n\t\t\tlet bevelThickness = options.bevelThickness !== undefined ? options.bevelThickness : 0.2;\n\t\t\tlet bevelSize = options.bevelSize !== undefined ? options.bevelSize : bevelThickness - 0.1;\n\t\t\tlet bevelOffset = options.bevelOffset !== undefined ? options.bevelOffset : 0;\n\t\t\tlet bevelSegments = options.bevelSegments !== undefined ? options.bevelSegments : 3;\n\n\t\t\tconst extrudePath = options.extrudePath;\n\n\t\t\tconst uvgen = options.UVGenerator !== undefined ? options.UVGenerator : WorldUVGenerator;\n\n\t\t\t//\n\n\t\t\tlet extrudePts, extrudeByPath = false;\n\t\t\tlet splineTube, binormal, normal, position2;\n\n\t\t\tif ( extrudePath ) {\n\n\t\t\t\textrudePts = extrudePath.getSpacedPoints( steps );\n\n\t\t\t\textrudeByPath = true;\n\t\t\t\tbevelEnabled = false; // bevels not supported for path extrusion\n\n\t\t\t\t// SETUP TNB variables\n\n\t\t\t\t// TODO1 - have a .isClosed in spline?\n\n\t\t\t\tsplineTube = extrudePath.computeFrenetFrames( steps, false );\n\n\t\t\t\t// console.log(splineTube, 'splineTube', splineTube.normals.length, 'steps', steps, 'extrudePts', extrudePts.length);\n\n\t\t\t\tbinormal = new Vector3();\n\t\t\t\tnormal = new Vector3();\n\t\t\t\tposition2 = new Vector3();\n\n\t\t\t}\n\n\t\t\t// Safeguards if bevels are not enabled\n\n\t\t\tif ( ! bevelEnabled ) {\n\n\t\t\t\tbevelSegments = 0;\n\t\t\t\tbevelThickness = 0;\n\t\t\t\tbevelSize = 0;\n\t\t\t\tbevelOffset = 0;\n\n\t\t\t}\n\n\t\t\t// Variables initialization\n\n\t\t\tconst shapePoints = shape.extractPoints( curveSegments );\n\n\t\t\tlet vertices = shapePoints.shape;\n\t\t\tconst holes = shapePoints.holes;\n\n\t\t\tconst reverse = ! ShapeUtils.isClockWise( vertices );\n\n\t\t\tif ( reverse ) {\n\n\t\t\t\tvertices = vertices.reverse();\n\n\t\t\t\t// Maybe we should also check if holes are in the opposite direction, just to be safe ...\n\n\t\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\t\tconst ahole = holes[ h ];\n\n\t\t\t\t\tif ( ShapeUtils.isClockWise( ahole ) ) {\n\n\t\t\t\t\t\tholes[ h ] = ahole.reverse();\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\tconst faces = ShapeUtils.triangulateShape( vertices, holes );\n\n\t\t\t/* Vertices */\n\n\t\t\tconst contour = vertices; // vertices has all points but contour has only points of circumference\n\n\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tconst ahole = holes[ h ];\n\n\t\t\t\tvertices = vertices.concat( ahole );\n\n\t\t\t}\n\n\n\t\t\tfunction scalePt2( pt, vec, size ) {\n\n\t\t\t\tif ( ! vec ) console.error( 'THREE.ExtrudeGeometry: vec does not exist' );\n\n\t\t\t\treturn vec.clone().multiplyScalar( size ).add( pt );\n\n\t\t\t}\n\n\t\t\tconst vlen = vertices.length, flen = faces.length;\n\n\n\t\t\t// Find directions for point movement\n\n\n\t\t\tfunction getBevelVec( inPt, inPrev, inNext ) {\n\n\t\t\t\t// computes for inPt the corresponding point inPt' on a new contour\n\t\t\t\t// shifted by 1 unit (length of normalized vector) to the left\n\t\t\t\t// if we walk along contour clockwise, this new contour is outside the old one\n\t\t\t\t//\n\t\t\t\t// inPt' is the intersection of the two lines parallel to the two\n\t\t\t\t// adjacent edges of inPt at a distance of 1 unit on the left side.\n\n\t\t\t\tlet v_trans_x, v_trans_y, shrink_by; // resulting translation vector for inPt\n\n\t\t\t\t// good reading for geometry algorithms (here: line-line intersection)\n\t\t\t\t// http://geomalgorithms.com/a05-_intersect-1.html\n\n\t\t\t\tconst v_prev_x = inPt.x - inPrev.x,\n\t\t\t\t\tv_prev_y = inPt.y - inPrev.y;\n\t\t\t\tconst v_next_x = inNext.x - inPt.x,\n\t\t\t\t\tv_next_y = inNext.y - inPt.y;\n\n\t\t\t\tconst v_prev_lensq = ( v_prev_x * v_prev_x + v_prev_y * v_prev_y );\n\n\t\t\t\t// check for collinear edges\n\t\t\t\tconst collinear0 = ( v_prev_x * v_next_y - v_prev_y * v_next_x );\n\n\t\t\t\tif ( Math.abs( collinear0 ) > Number.EPSILON ) {\n\n\t\t\t\t\t// not collinear\n\n\t\t\t\t\t// length of vectors for normalizing\n\n\t\t\t\t\tconst v_prev_len = Math.sqrt( v_prev_lensq );\n\t\t\t\t\tconst v_next_len = Math.sqrt( v_next_x * v_next_x + v_next_y * v_next_y );\n\n\t\t\t\t\t// shift adjacent points by unit vectors to the left\n\n\t\t\t\t\tconst ptPrevShift_x = ( inPrev.x - v_prev_y / v_prev_len );\n\t\t\t\t\tconst ptPrevShift_y = ( inPrev.y + v_prev_x / v_prev_len );\n\n\t\t\t\t\tconst ptNextShift_x = ( inNext.x - v_next_y / v_next_len );\n\t\t\t\t\tconst ptNextShift_y = ( inNext.y + v_next_x / v_next_len );\n\n\t\t\t\t\t// scaling factor for v_prev to intersection point\n\n\t\t\t\t\tconst 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\t// vector from inPt to intersection point\n\n\t\t\t\t\tv_trans_x = ( ptPrevShift_x + v_prev_x * sf - inPt.x );\n\t\t\t\t\tv_trans_y = ( ptPrevShift_y + v_prev_y * sf - inPt.y );\n\n\t\t\t\t\t// Don't normalize!, otherwise sharp corners become ugly\n\t\t\t\t\t// but prevent crazy spikes\n\t\t\t\t\tconst v_trans_lensq = ( v_trans_x * v_trans_x + v_trans_y * v_trans_y );\n\t\t\t\t\tif ( v_trans_lensq <= 2 ) {\n\n\t\t\t\t\t\treturn new Vector2( v_trans_x, v_trans_y );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tshrink_by = Math.sqrt( v_trans_lensq / 2 );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// handle special case of collinear edges\n\n\t\t\t\t\tlet direction_eq = false; // assumes: opposite\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 ( v_prev_x < - Number.EPSILON ) {\n\n\t\t\t\t\t\t\tif ( v_next_x < - Number.EPSILON ) {\n\n\t\t\t\t\t\t\t\tdirection_eq = true;\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\tif ( Math.sign( v_prev_y ) === Math.sign( v_next_y ) ) {\n\n\t\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( direction_eq ) {\n\n\t\t\t\t\t\t// console.log(\"Warning: lines are a straight sequence\");\n\t\t\t\t\t\tv_trans_x = - v_prev_y;\n\t\t\t\t\t\tv_trans_y = v_prev_x;\n\t\t\t\t\t\tshrink_by = Math.sqrt( v_prev_lensq );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// console.log(\"Warning: lines are a straight spike\");\n\t\t\t\t\t\tv_trans_x = v_prev_x;\n\t\t\t\t\t\tv_trans_y = v_prev_y;\n\t\t\t\t\t\tshrink_by = Math.sqrt( v_prev_lensq / 2 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn new Vector2( v_trans_x / shrink_by, v_trans_y / shrink_by );\n\n\t\t\t}\n\n\n\t\t\tconst contourMovements = [];\n\n\t\t\tfor ( let i = 0, il = contour.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\t// console.log('i,j,k', i, j , k)\n\n\t\t\t\tcontourMovements[ i ] = getBevelVec( contour[ i ], contour[ j ], contour[ k ] );\n\n\t\t\t}\n\n\t\t\tconst holesMovements = [];\n\t\t\tlet oneHoleMovements, verticesMovements = contourMovements.concat();\n\n\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tconst ahole = holes[ h ];\n\n\t\t\t\toneHoleMovements = [];\n\n\t\t\t\tfor ( let i = 0, il = ahole.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {\n\n\t\t\t\t\tif ( j === il ) j = 0;\n\t\t\t\t\tif ( k === il ) k = 0;\n\n\t\t\t\t\t// (j)---(i)---(k)\n\t\t\t\t\toneHoleMovements[ i ] = getBevelVec( ahole[ i ], ahole[ j ], ahole[ k ] );\n\n\t\t\t\t}\n\n\t\t\t\tholesMovements.push( oneHoleMovements );\n\t\t\t\tverticesMovements = verticesMovements.concat( oneHoleMovements );\n\n\t\t\t}\n\n\n\t\t\t// Loop bevelSegments, 1 for the front, 1 for the back\n\n\t\t\tfor ( let b = 0; b < bevelSegments; b ++ ) {\n\n\t\t\t\t//for ( b = bevelSegments; b > 0; b -- ) {\n\n\t\t\t\tconst t = b / bevelSegments;\n\t\t\t\tconst z = bevelThickness * Math.cos( t * Math.PI / 2 );\n\t\t\t\tconst bs = bevelSize * Math.sin( t * Math.PI / 2 ) + bevelOffset;\n\n\t\t\t\t// contract shape\n\n\t\t\t\tfor ( let i = 0, il = contour.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst vert = scalePt2( contour[ i ], contourMovements[ 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\t// expand holes\n\n\t\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\t\tconst ahole = holes[ h ];\n\t\t\t\t\toneHoleMovements = holesMovements[ h ];\n\n\t\t\t\t\tfor ( let i = 0, il = ahole.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tconst vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );\n\n\t\t\t\t\t\tv( vert.x, vert.y, - z );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst bs = bevelSize + bevelOffset;\n\n\t\t\t// Back facing vertices\n\n\t\t\tfor ( let i = 0; i < vlen; i ++ ) {\n\n\t\t\t\tconst vert = 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, 0 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// v( vert.x, vert.y + extrudePts[ 0 ].y, extrudePts[ 0 ].x );\n\n\t\t\t\t\tnormal.copy( splineTube.normals[ 0 ] ).multiplyScalar( vert.x );\n\t\t\t\t\tbinormal.copy( splineTube.binormals[ 0 ] ).multiplyScalar( vert.y );\n\n\t\t\t\t\tposition2.copy( extrudePts[ 0 ] ).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\t// Add stepped vertices...\n\t\t\t// Including front facing vertices\n\n\t\t\tfor ( let s = 1; s <= steps; s ++ ) {\n\n\t\t\t\tfor ( let i = 0; i < vlen; i ++ ) {\n\n\t\t\t\t\tconst vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];\n\n\t\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\t\tv( vert.x, vert.y, depth / steps * s );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// v( vert.x, vert.y + extrudePts[ s - 1 ].y, extrudePts[ s - 1 ].x );\n\n\t\t\t\t\t\tnormal.copy( splineTube.normals[ s ] ).multiplyScalar( vert.x );\n\t\t\t\t\t\tbinormal.copy( splineTube.binormals[ s ] ).multiplyScalar( vert.y );\n\n\t\t\t\t\t\tposition2.copy( extrudePts[ s ] ).add( normal ).add( binormal );\n\n\t\t\t\t\t\tv( position2.x, position2.y, position2.z );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\t// Add bevel segments planes\n\n\t\t\t//for ( b = 1; b <= bevelSegments; b ++ ) {\n\t\t\tfor ( let b = bevelSegments - 1; b >= 0; b -- ) {\n\n\t\t\t\tconst t = b / bevelSegments;\n\t\t\t\tconst z = bevelThickness * Math.cos( t * Math.PI / 2 );\n\t\t\t\tconst bs = bevelSize * Math.sin( t * Math.PI / 2 ) + bevelOffset;\n\n\t\t\t\t// contract shape\n\n\t\t\t\tfor ( let i = 0, il = contour.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst vert = scalePt2( contour[ i ], contourMovements[ i ], bs );\n\t\t\t\t\tv( vert.x, vert.y, depth + z );\n\n\t\t\t\t}\n\n\t\t\t\t// expand holes\n\n\t\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\t\tconst ahole = holes[ h ];\n\t\t\t\t\toneHoleMovements = holesMovements[ h ];\n\n\t\t\t\t\tfor ( let i = 0, il = ahole.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tconst vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );\n\n\t\t\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\t\t\tv( vert.x, vert.y, depth + z );\n\n\t\t\t\t\t\t} else {\n\n\t\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\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t/* Faces */\n\n\t\t\t// Top and bottom faces\n\n\t\t\tbuildLidFaces();\n\n\t\t\t// Sides faces\n\n\t\t\tbuildSideFaces();\n\n\n\t\t\t///// Internal functions\n\n\t\t\tfunction buildLidFaces() {\n\n\t\t\t\tconst start = verticesArray.length / 3;\n\n\t\t\t\tif ( bevelEnabled ) {\n\n\t\t\t\t\tlet layer = 0; // steps + 1\n\t\t\t\t\tlet offset = vlen * layer;\n\n\t\t\t\t\t// Bottom faces\n\n\t\t\t\t\tfor ( let i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\t\tconst face = faces[ i ];\n\t\t\t\t\t\tf3( face[ 2 ] + offset, face[ 1 ] + offset, face[ 0 ] + offset );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tlayer = steps + bevelSegments * 2;\n\t\t\t\t\toffset = vlen * layer;\n\n\t\t\t\t\t// Top faces\n\n\t\t\t\t\tfor ( let i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\t\tconst face = faces[ i ];\n\t\t\t\t\t\tf3( face[ 0 ] + offset, face[ 1 ] + offset, face[ 2 ] + offset );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Bottom faces\n\n\t\t\t\t\tfor ( let i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\t\tconst face = faces[ i ];\n\t\t\t\t\t\tf3( face[ 2 ], face[ 1 ], face[ 0 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Top faces\n\n\t\t\t\t\tfor ( let i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\t\tconst face = faces[ i ];\n\t\t\t\t\t\tf3( face[ 0 ] + vlen * steps, face[ 1 ] + vlen * steps, face[ 2 ] + vlen * steps );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tscope.addGroup( start, verticesArray.length / 3 - start, 0 );\n\n\t\t\t}\n\n\t\t\t// Create faces for the z-sides of the shape\n\n\t\t\tfunction buildSideFaces() {\n\n\t\t\t\tconst start = verticesArray.length / 3;\n\t\t\t\tlet layeroffset = 0;\n\t\t\t\tsidewalls( contour, layeroffset );\n\t\t\t\tlayeroffset += contour.length;\n\n\t\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\t\tconst ahole = holes[ h ];\n\t\t\t\t\tsidewalls( ahole, layeroffset );\n\n\t\t\t\t\t//, true\n\t\t\t\t\tlayeroffset += ahole.length;\n\n\t\t\t\t}\n\n\n\t\t\t\tscope.addGroup( start, verticesArray.length / 3 - start, 1 );\n\n\n\t\t\t}\n\n\t\t\tfunction sidewalls( contour, layeroffset ) {\n\n\t\t\t\tlet i = contour.length;\n\n\t\t\t\twhile ( -- i >= 0 ) {\n\n\t\t\t\t\tconst j = i;\n\t\t\t\t\tlet k = i - 1;\n\t\t\t\t\tif ( k < 0 ) k = contour.length - 1;\n\n\t\t\t\t\t//console.log('b', i,j, i-1, k,vertices.length);\n\n\t\t\t\t\tfor ( let s = 0, sl = ( steps + bevelSegments * 2 ); s < sl; s ++ ) {\n\n\t\t\t\t\t\tconst slen1 = vlen * s;\n\t\t\t\t\t\tconst slen2 = vlen * ( s + 1 );\n\n\t\t\t\t\t\tconst a = layeroffset + j + slen1,\n\t\t\t\t\t\t\tb = layeroffset + k + slen1,\n\t\t\t\t\t\t\tc = layeroffset + k + slen2,\n\t\t\t\t\t\t\td = layeroffset + j + slen2;\n\n\t\t\t\t\t\tf4( a, b, c, d );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction v( x, y, z ) {\n\n\t\t\t\tplaceholder.push( x );\n\t\t\t\tplaceholder.push( y );\n\t\t\t\tplaceholder.push( z );\n\n\t\t\t}\n\n\n\t\t\tfunction f3( a, b, c ) {\n\n\t\t\t\taddVertex( a );\n\t\t\t\taddVertex( b );\n\t\t\t\taddVertex( c );\n\n\t\t\t\tconst nextIndex = verticesArray.length / 3;\n\t\t\t\tconst uvs = uvgen.generateTopUV( scope, verticesArray, nextIndex - 3, nextIndex - 2, nextIndex - 1 );\n\n\t\t\t\taddUV( uvs[ 0 ] );\n\t\t\t\taddUV( uvs[ 1 ] );\n\t\t\t\taddUV( uvs[ 2 ] );\n\n\t\t\t}\n\n\t\t\tfunction f4( a, b, c, d ) {\n\n\t\t\t\taddVertex( a );\n\t\t\t\taddVertex( b );\n\t\t\t\taddVertex( d );\n\n\t\t\t\taddVertex( b );\n\t\t\t\taddVertex( c );\n\t\t\t\taddVertex( d );\n\n\n\t\t\t\tconst nextIndex = verticesArray.length / 3;\n\t\t\t\tconst uvs = uvgen.generateSideWallUV( scope, verticesArray, nextIndex - 6, nextIndex - 3, nextIndex - 2, nextIndex - 1 );\n\n\t\t\t\taddUV( uvs[ 0 ] );\n\t\t\t\taddUV( uvs[ 1 ] );\n\t\t\t\taddUV( uvs[ 3 ] );\n\n\t\t\t\taddUV( uvs[ 1 ] );\n\t\t\t\taddUV( uvs[ 2 ] );\n\t\t\t\taddUV( uvs[ 3 ] );\n\n\t\t\t}\n\n\t\t\tfunction addVertex( index ) {\n\n\t\t\t\tverticesArray.push( placeholder[ index * 3 + 0 ] );\n\t\t\t\tverticesArray.push( placeholder[ index * 3 + 1 ] );\n\t\t\t\tverticesArray.push( placeholder[ index * 3 + 2 ] );\n\n\t\t\t}\n\n\n\t\t\tfunction addUV( vector2 ) {\n\n\t\t\t\tuvArray.push( vector2.x );\n\t\t\t\tuvArray.push( vector2.y );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tconst shapes = this.parameters.shapes;\n\t\tconst options = this.parameters.options;\n\n\t\treturn toJSON$1( shapes, options, data );\n\n\t}\n\n\tstatic fromJSON( data, shapes ) {\n\n\t\tconst geometryShapes = [];\n\n\t\tfor ( let j = 0, jl = data.shapes.length; j < jl; j ++ ) {\n\n\t\t\tconst shape = shapes[ data.shapes[ j ] ];\n\n\t\t\tgeometryShapes.push( shape );\n\n\t\t}\n\n\t\tconst extrudePath = data.options.extrudePath;\n\n\t\tif ( extrudePath !== undefined ) {\n\n\t\t\tdata.options.extrudePath = new Curves[ extrudePath.type ]().fromJSON( extrudePath );\n\n\t\t}\n\n\t\treturn new ExtrudeGeometry( geometryShapes, data.options );\n\n\t}\n\n}\n\nconst WorldUVGenerator = {\n\n\tgenerateTopUV: function ( geometry, vertices, indexA, indexB, indexC ) {\n\n\t\tconst a_x = vertices[ indexA * 3 ];\n\t\tconst a_y = vertices[ indexA * 3 + 1 ];\n\t\tconst b_x = vertices[ indexB * 3 ];\n\t\tconst b_y = vertices[ indexB * 3 + 1 ];\n\t\tconst c_x = vertices[ indexC * 3 ];\n\t\tconst c_y = vertices[ indexC * 3 + 1 ];\n\n\t\treturn [\n\t\t\tnew Vector2( a_x, a_y ),\n\t\t\tnew Vector2( b_x, b_y ),\n\t\t\tnew Vector2( c_x, c_y )\n\t\t];\n\n\t},\n\n\tgenerateSideWallUV: function ( geometry, vertices, indexA, indexB, indexC, indexD ) {\n\n\t\tconst a_x = vertices[ indexA * 3 ];\n\t\tconst a_y = vertices[ indexA * 3 + 1 ];\n\t\tconst a_z = vertices[ indexA * 3 + 2 ];\n\t\tconst b_x = vertices[ indexB * 3 ];\n\t\tconst b_y = vertices[ indexB * 3 + 1 ];\n\t\tconst b_z = vertices[ indexB * 3 + 2 ];\n\t\tconst c_x = vertices[ indexC * 3 ];\n\t\tconst c_y = vertices[ indexC * 3 + 1 ];\n\t\tconst c_z = vertices[ indexC * 3 + 2 ];\n\t\tconst d_x = vertices[ indexD * 3 ];\n\t\tconst d_y = vertices[ indexD * 3 + 1 ];\n\t\tconst d_z = vertices[ indexD * 3 + 2 ];\n\n\t\tif ( Math.abs( a_y - b_y ) < Math.abs( a_x - b_x ) ) {\n\n\t\t\treturn [\n\t\t\t\tnew Vector2( a_x, 1 - a_z ),\n\t\t\t\tnew Vector2( b_x, 1 - b_z ),\n\t\t\t\tnew Vector2( c_x, 1 - c_z ),\n\t\t\t\tnew Vector2( d_x, 1 - d_z )\n\t\t\t];\n\n\t\t} else {\n\n\t\t\treturn [\n\t\t\t\tnew Vector2( a_y, 1 - a_z ),\n\t\t\t\tnew Vector2( b_y, 1 - b_z ),\n\t\t\t\tnew Vector2( c_y, 1 - c_z ),\n\t\t\t\tnew Vector2( d_y, 1 - d_z )\n\t\t\t];\n\n\t\t}\n\n\t}\n\n};\n\nfunction toJSON$1( shapes, options, data ) {\n\n\tdata.shapes = [];\n\n\tif ( Array.isArray( shapes ) ) {\n\n\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\tconst shape = shapes[ i ];\n\n\t\t\tdata.shapes.push( shape.uuid );\n\n\t\t}\n\n\t} else {\n\n\t\tdata.shapes.push( shapes.uuid );\n\n\t}\n\n\tdata.options = Object.assign( {}, options );\n\n\tif ( options.extrudePath !== undefined ) data.options.extrudePath = options.extrudePath.toJSON();\n\n\treturn data;\n\n}\n\nclass IcosahedronGeometry extends PolyhedronGeometry {\n\n\tconstructor( radius = 1, detail = 0 ) {\n\n\t\tconst t = ( 1 + Math.sqrt( 5 ) ) / 2;\n\n\t\tconst vertices = [\n\t\t\t- 1, t, 0, \t1, t, 0, \t- 1, - t, 0, \t1, - t, 0,\n\t\t\t0, - 1, t, \t0, 1, t,\t0, - 1, - t, \t0, 1, - t,\n\t\t\tt, 0, - 1, \tt, 0, 1, \t- t, 0, - 1, \t- t, 0, 1\n\t\t];\n\n\t\tconst indices = [\n\t\t\t0, 11, 5, \t0, 5, 1, \t0, 1, 7, \t0, 7, 10, \t0, 10, 11,\n\t\t\t1, 5, 9, \t5, 11, 4,\t11, 10, 2,\t10, 7, 6,\t7, 1, 8,\n\t\t\t3, 9, 4, \t3, 4, 2,\t3, 2, 6,\t3, 6, 8,\t3, 8, 9,\n\t\t\t4, 9, 5, \t2, 4, 11,\t6, 2, 10,\t8, 6, 7,\t9, 8, 1\n\t\t];\n\n\t\tsuper( vertices, indices, radius, detail );\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}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new IcosahedronGeometry( data.radius, data.detail );\n\n\t}\n\n}\n\nclass OctahedronGeometry extends PolyhedronGeometry {\n\n\tconstructor( radius = 1, detail = 0 ) {\n\n\t\tconst vertices = [\n\t\t\t1, 0, 0, \t- 1, 0, 0,\t0, 1, 0,\n\t\t\t0, - 1, 0, \t0, 0, 1,\t0, 0, - 1\n\t\t];\n\n\t\tconst indices = [\n\t\t\t0, 2, 4,\t0, 4, 3,\t0, 3, 5,\n\t\t\t0, 5, 2,\t1, 2, 5,\t1, 5, 3,\n\t\t\t1, 3, 4,\t1, 4, 2\n\t\t];\n\n\t\tsuper( vertices, indices, radius, detail );\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}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new OctahedronGeometry( data.radius, data.detail );\n\n\t}\n\n}\n\nclass RingGeometry extends BufferGeometry {\n\n\tconstructor( innerRadius = 0.5, outerRadius = 1, thetaSegments = 8, phiSegments = 1, thetaStart = 0, thetaLength = Math.PI * 2 ) {\n\n\t\tsuper();\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\tthetaSegments = Math.max( 3, thetaSegments );\n\t\tphiSegments = Math.max( 1, phiSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// some helper variables\n\n\t\tlet radius = innerRadius;\n\t\tconst radiusStep = ( ( outerRadius - innerRadius ) / phiSegments );\n\t\tconst vertex = new Vector3();\n\t\tconst uv = new Vector2();\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( let j = 0; j <= phiSegments; j ++ ) {\n\n\t\t\tfor ( let i = 0; i <= thetaSegments; i ++ ) {\n\n\t\t\t\t// values are generate from the inside of the ring to the outside\n\n\t\t\t\tconst segment = thetaStart + i / thetaSegments * thetaLength;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = radius * Math.cos( segment );\n\t\t\t\tvertex.y = radius * Math.sin( segment );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = ( vertex.x / outerRadius + 1 ) / 2;\n\t\t\t\tuv.y = ( vertex.y / outerRadius + 1 ) / 2;\n\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t}\n\n\t\t\t// increase the radius for next row of vertices\n\n\t\t\tradius += radiusStep;\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( let j = 0; j < phiSegments; j ++ ) {\n\n\t\t\tconst thetaSegmentLevel = j * ( thetaSegments + 1 );\n\n\t\t\tfor ( let i = 0; i < thetaSegments; i ++ ) {\n\n\t\t\t\tconst segment = i + thetaSegmentLevel;\n\n\t\t\t\tconst a = segment;\n\t\t\t\tconst b = segment + thetaSegments + 1;\n\t\t\t\tconst c = segment + thetaSegments + 2;\n\t\t\t\tconst d = segment + 1;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new RingGeometry( data.innerRadius, data.outerRadius, data.thetaSegments, data.phiSegments, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\nclass ShapeGeometry extends BufferGeometry {\n\n\tconstructor( shapes = new Shape( [ new Vector2( 0, 0.5 ), new Vector2( - 0.5, - 0.5 ), new Vector2( 0.5, - 0.5 ) ] ), curveSegments = 12 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'ShapeGeometry';\n\n\t\tthis.parameters = {\n\t\t\tshapes: shapes,\n\t\t\tcurveSegments: curveSegments\n\t\t};\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tlet groupStart = 0;\n\t\tlet groupCount = 0;\n\n\t\t// allow single and array values for \"shapes\" parameter\n\n\t\tif ( Array.isArray( shapes ) === false ) {\n\n\t\t\taddShape( shapes );\n\n\t\t} else {\n\n\t\t\tfor ( let i = 0; i < shapes.length; i ++ ) {\n\n\t\t\t\taddShape( shapes[ i ] );\n\n\t\t\t\tthis.addGroup( groupStart, groupCount, i ); // enables MultiMaterial support\n\n\t\t\t\tgroupStart += groupCount;\n\t\t\t\tgroupCount = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\n\t\t// helper functions\n\n\t\tfunction addShape( shape ) {\n\n\t\t\tconst indexOffset = vertices.length / 3;\n\t\t\tconst points = shape.extractPoints( curveSegments );\n\n\t\t\tlet shapeVertices = points.shape;\n\t\t\tconst shapeHoles = points.holes;\n\n\t\t\t// check direction of vertices\n\n\t\t\tif ( ShapeUtils.isClockWise( shapeVertices ) === false ) {\n\n\t\t\t\tshapeVertices = shapeVertices.reverse();\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0, l = shapeHoles.length; i < l; i ++ ) {\n\n\t\t\t\tconst shapeHole = shapeHoles[ i ];\n\n\t\t\t\tif ( ShapeUtils.isClockWise( shapeHole ) === true ) {\n\n\t\t\t\t\tshapeHoles[ i ] = shapeHole.reverse();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst faces = ShapeUtils.triangulateShape( shapeVertices, shapeHoles );\n\n\t\t\t// join vertices of inner and outer paths to a single array\n\n\t\t\tfor ( let i = 0, l = shapeHoles.length; i < l; i ++ ) {\n\n\t\t\t\tconst shapeHole = shapeHoles[ i ];\n\t\t\t\tshapeVertices = shapeVertices.concat( shapeHole );\n\n\t\t\t}\n\n\t\t\t// vertices, normals, uvs\n\n\t\t\tfor ( let i = 0, l = shapeVertices.length; i < l; i ++ ) {\n\n\t\t\t\tconst vertex = shapeVertices[ i ];\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, 0 );\n\t\t\t\tnormals.push( 0, 0, 1 );\n\t\t\t\tuvs.push( vertex.x, vertex.y ); // world uvs\n\n\t\t\t}\n\n\t\t\t// incides\n\n\t\t\tfor ( let i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\tconst face = faces[ i ];\n\n\t\t\t\tconst a = face[ 0 ] + indexOffset;\n\t\t\t\tconst b = face[ 1 ] + indexOffset;\n\t\t\t\tconst c = face[ 2 ] + indexOffset;\n\n\t\t\t\tindices.push( a, b, c );\n\t\t\t\tgroupCount += 3;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tconst shapes = this.parameters.shapes;\n\n\t\treturn toJSON( shapes, data );\n\n\t}\n\n\tstatic fromJSON( data, shapes ) {\n\n\t\tconst geometryShapes = [];\n\n\t\tfor ( let j = 0, jl = data.shapes.length; j < jl; j ++ ) {\n\n\t\t\tconst shape = shapes[ data.shapes[ j ] ];\n\n\t\t\tgeometryShapes.push( shape );\n\n\t\t}\n\n\t\treturn new ShapeGeometry( geometryShapes, data.curveSegments );\n\n\t}\n\n}\n\nfunction toJSON( shapes, data ) {\n\n\tdata.shapes = [];\n\n\tif ( Array.isArray( shapes ) ) {\n\n\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\tconst shape = shapes[ i ];\n\n\t\t\tdata.shapes.push( shape.uuid );\n\n\t\t}\n\n\t} else {\n\n\t\tdata.shapes.push( shapes.uuid );\n\n\t}\n\n\treturn data;\n\n}\n\nclass SphereGeometry extends BufferGeometry {\n\n\tconstructor( radius = 1, widthSegments = 32, heightSegments = 16, phiStart = 0, phiLength = Math.PI * 2, thetaStart = 0, thetaLength = Math.PI ) {\n\n\t\tsuper();\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\twidthSegments = Math.max( 3, Math.floor( widthSegments ) );\n\t\theightSegments = Math.max( 2, Math.floor( heightSegments ) );\n\n\t\tconst thetaEnd = Math.min( thetaStart + thetaLength, Math.PI );\n\n\t\tlet index = 0;\n\t\tconst grid = [];\n\n\t\tconst vertex = new Vector3();\n\t\tconst normal = new Vector3();\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( let iy = 0; iy <= heightSegments; iy ++ ) {\n\n\t\t\tconst verticesRow = [];\n\n\t\t\tconst v = iy / heightSegments;\n\n\t\t\t// special case for the poles\n\n\t\t\tlet uOffset = 0;\n\n\t\t\tif ( iy == 0 && thetaStart == 0 ) {\n\n\t\t\t\tuOffset = 0.5 / widthSegments;\n\n\t\t\t} else if ( iy == heightSegments && thetaEnd == Math.PI ) {\n\n\t\t\t\tuOffset = - 0.5 / widthSegments;\n\n\t\t\t}\n\n\t\t\tfor ( let ix = 0; ix <= widthSegments; ix ++ ) {\n\n\t\t\t\tconst u = ix / widthSegments;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = - radius * Math.cos( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );\n\t\t\t\tvertex.y = radius * Math.cos( thetaStart + v * thetaLength );\n\t\t\t\tvertex.z = radius * Math.sin( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormal.copy( vertex ).normalize();\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( u + uOffset, 1 - v );\n\n\t\t\t\tverticesRow.push( index ++ );\n\n\t\t\t}\n\n\t\t\tgrid.push( verticesRow );\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( let iy = 0; iy < heightSegments; iy ++ ) {\n\n\t\t\tfor ( let ix = 0; ix < widthSegments; ix ++ ) {\n\n\t\t\t\tconst a = grid[ iy ][ ix + 1 ];\n\t\t\t\tconst b = grid[ iy ][ ix ];\n\t\t\t\tconst c = grid[ iy + 1 ][ ix ];\n\t\t\t\tconst d = grid[ iy + 1 ][ ix + 1 ];\n\n\t\t\t\tif ( iy !== 0 || thetaStart > 0 ) indices.push( a, b, d );\n\t\t\t\tif ( iy !== heightSegments - 1 || thetaEnd < Math.PI ) indices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new SphereGeometry( data.radius, data.widthSegments, data.heightSegments, data.phiStart, data.phiLength, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\nclass TetrahedronGeometry extends PolyhedronGeometry {\n\n\tconstructor( radius = 1, detail = 0 ) {\n\n\t\tconst vertices = [\n\t\t\t1, 1, 1, \t- 1, - 1, 1, \t- 1, 1, - 1, \t1, - 1, - 1\n\t\t];\n\n\t\tconst indices = [\n\t\t\t2, 1, 0, \t0, 3, 2,\t1, 3, 0,\t2, 3, 1\n\t\t];\n\n\t\tsuper( vertices, indices, radius, detail );\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}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new TetrahedronGeometry( data.radius, data.detail );\n\n\t}\n\n}\n\nclass TorusGeometry extends BufferGeometry {\n\n\tconstructor( radius = 1, tube = 0.4, radialSegments = 8, tubularSegments = 6, arc = Math.PI * 2 ) {\n\n\t\tsuper();\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\tradialSegments = Math.floor( radialSegments );\n\t\ttubularSegments = Math.floor( tubularSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tconst center = new Vector3();\n\t\tconst vertex = new Vector3();\n\t\tconst normal = new Vector3();\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( let j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\tfor ( let i = 0; i <= tubularSegments; i ++ ) {\n\n\t\t\t\tconst u = i / tubularSegments * arc;\n\t\t\t\tconst v = j / radialSegments * Math.PI * 2;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = ( radius + tube * Math.cos( v ) ) * Math.cos( u );\n\t\t\t\tvertex.y = ( radius + tube * Math.cos( v ) ) * Math.sin( u );\n\t\t\t\tvertex.z = tube * Math.sin( v );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tcenter.x = radius * Math.cos( u );\n\t\t\t\tcenter.y = radius * Math.sin( u );\n\t\t\t\tnormal.subVectors( vertex, center ).normalize();\n\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( i / tubularSegments );\n\t\t\t\tuvs.push( j / radialSegments );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( let j = 1; j <= radialSegments; j ++ ) {\n\n\t\t\tfor ( let i = 1; i <= tubularSegments; i ++ ) {\n\n\t\t\t\t// indices\n\n\t\t\t\tconst a = ( tubularSegments + 1 ) * j + i - 1;\n\t\t\t\tconst b = ( tubularSegments + 1 ) * ( j - 1 ) + i - 1;\n\t\t\t\tconst c = ( tubularSegments + 1 ) * ( j - 1 ) + i;\n\t\t\t\tconst d = ( tubularSegments + 1 ) * j + i;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new TorusGeometry( data.radius, data.tube, data.radialSegments, data.tubularSegments, data.arc );\n\n\t}\n\n}\n\nclass TorusKnotGeometry extends BufferGeometry {\n\n\tconstructor( radius = 1, tube = 0.4, tubularSegments = 64, radialSegments = 8, p = 2, q = 3 ) {\n\n\t\tsuper();\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\ttubularSegments = Math.floor( tubularSegments );\n\t\tradialSegments = Math.floor( radialSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tconst vertex = new Vector3();\n\t\tconst normal = new Vector3();\n\n\t\tconst P1 = new Vector3();\n\t\tconst P2 = new Vector3();\n\n\t\tconst B = new Vector3();\n\t\tconst T = new Vector3();\n\t\tconst N = new Vector3();\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( let 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 segment\n\n\t\t\tconst u = i / tubularSegments * p * Math.PI * 2;\n\n\t\t\t// now we calculate two points. P1 is our current position on the curve, P2 is a little farther ahead.\n\t\t\t// these points are used to create a special \"coordinate space\", which is necessary to calculate the correct vertex positions\n\n\t\t\tcalculatePositionOnCurve( u, p, q, radius, P1 );\n\t\t\tcalculatePositionOnCurve( u + 0.01, p, q, radius, P2 );\n\n\t\t\t// calculate orthonormal basis\n\n\t\t\tT.subVectors( P2, P1 );\n\t\t\tN.addVectors( P2, P1 );\n\t\t\tB.crossVectors( T, N );\n\t\t\tN.crossVectors( B, T );\n\n\t\t\t// normalize B, N. T can be ignored, we don't use it\n\n\t\t\tB.normalize();\n\t\t\tN.normalize();\n\n\t\t\tfor ( let 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\tconst v = j / radialSegments * Math.PI * 2;\n\t\t\t\tconst cx = - tube * Math.cos( v );\n\t\t\t\tconst cy = tube * Math.sin( v );\n\n\t\t\t\t// now calculate the final vertex position.\n\t\t\t\t// first we orient the extrusion with our basis vectors, then we add it to the current position on the curve\n\n\t\t\t\tvertex.x = P1.x + ( cx * N.x + cy * B.x );\n\t\t\t\tvertex.y = P1.y + ( cx * N.y + cy * B.y );\n\t\t\t\tvertex.z = P1.z + ( cx * N.z + cy * B.z );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal (P1 is always the center/origin of the extrusion, thus we can use it to calculate the normal)\n\n\t\t\t\tnormal.subVectors( vertex, P1 ).normalize();\n\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( i / tubularSegments );\n\t\t\t\tuvs.push( j / radialSegments );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( let j = 1; j <= tubularSegments; j ++ ) {\n\n\t\t\tfor ( let i = 1; i <= radialSegments; i ++ ) {\n\n\t\t\t\t// indices\n\n\t\t\t\tconst a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );\n\t\t\t\tconst b = ( radialSegments + 1 ) * j + ( i - 1 );\n\t\t\t\tconst c = ( radialSegments + 1 ) * j + i;\n\t\t\t\tconst d = ( radialSegments + 1 ) * ( j - 1 ) + i;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\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\tconst cu = Math.cos( u );\n\t\t\tconst su = Math.sin( u );\n\t\t\tconst quOverP = q / p * u;\n\t\t\tconst cs = Math.cos( quOverP );\n\n\t\t\tposition.x = radius * ( 2 + cs ) * 0.5 * cu;\n\t\t\tposition.y = radius * ( 2 + cs ) * su * 0.5;\n\t\t\tposition.z = radius * Math.sin( quOverP ) * 0.5;\n\n\t\t}\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new TorusKnotGeometry( data.radius, data.tube, data.tubularSegments, data.radialSegments, data.p, data.q );\n\n\t}\n\n}\n\nclass TubeGeometry extends BufferGeometry {\n\n\tconstructor( path = new QuadraticBezierCurve3( new Vector3( - 1, - 1, 0 ), new Vector3( - 1, 1, 0 ), new Vector3( 1, 1, 0 ) ), tubularSegments = 64, radius = 1, radialSegments = 8, closed = false ) {\n\n\t\tsuper();\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\tconst 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\tconst vertex = new Vector3();\n\t\tconst normal = new Vector3();\n\t\tconst uv = new Vector2();\n\t\tlet P = new Vector3();\n\n\t\t// buffer\n\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\t\tconst indices = [];\n\n\t\t// create buffer data\n\n\t\tgenerateBufferData();\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\t// functions\n\n\t\tfunction generateBufferData() {\n\n\t\t\tfor ( let 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\tP = path.getPointAt( i / tubularSegments, P );\n\n\t\t\t// retrieve corresponding normal and binormal\n\n\t\t\tconst N = frames.normals[ i ];\n\t\t\tconst B = frames.binormals[ i ];\n\n\t\t\t// generate normals and vertices for the current segment\n\n\t\t\tfor ( let j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\t\tconst v = j / radialSegments * Math.PI * 2;\n\n\t\t\t\tconst sin = Math.sin( v );\n\t\t\t\tconst 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 ( let j = 1; j <= tubularSegments; j ++ ) {\n\n\t\t\t\tfor ( let i = 1; i <= radialSegments; i ++ ) {\n\n\t\t\t\t\tconst a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );\n\t\t\t\t\tconst b = ( radialSegments + 1 ) * j + ( i - 1 );\n\t\t\t\t\tconst c = ( radialSegments + 1 ) * j + i;\n\t\t\t\t\tconst d = ( radialSegments + 1 ) * ( j - 1 ) + i;\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction generateUVs() {\n\n\t\t\tfor ( let i = 0; i <= tubularSegments; i ++ ) {\n\n\t\t\t\tfor ( let 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\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.path = this.parameters.path.toJSON();\n\n\t\treturn data;\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\t// This only works for built-in curves (e.g. CatmullRomCurve3).\n\t\t// User defined curves or instances of CurvePath will not be deserialized.\n\t\treturn new TubeGeometry(\n\t\t\tnew Curves[ data.path.type ]().fromJSON( data.path ),\n\t\t\tdata.tubularSegments,\n\t\t\tdata.radius,\n\t\t\tdata.radialSegments,\n\t\t\tdata.closed\n\t\t);\n\n\t}\n\n}\n\nclass WireframeGeometry extends BufferGeometry {\n\n\tconstructor( geometry = null ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'WireframeGeometry';\n\n\t\tthis.parameters = {\n\t\t\tgeometry: geometry\n\t\t};\n\n\t\tif ( geometry !== null ) {\n\n\t\t\t// buffer\n\n\t\t\tconst vertices = [];\n\t\t\tconst edges = new Set();\n\n\t\t\t// helper variables\n\n\t\t\tconst start = new Vector3();\n\t\t\tconst end = new Vector3();\n\n\t\t\tif ( geometry.index !== null ) {\n\n\t\t\t\t// indexed BufferGeometry\n\n\t\t\t\tconst position = geometry.attributes.position;\n\t\t\t\tconst indices = geometry.index;\n\t\t\t\tlet groups = geometry.groups;\n\n\t\t\t\tif ( groups.length === 0 ) {\n\n\t\t\t\t\tgroups = [ { start: 0, count: indices.count, materialIndex: 0 } ];\n\n\t\t\t\t}\n\n\t\t\t\t// create a data structure that contains all edges without duplicates\n\n\t\t\t\tfor ( let o = 0, ol = groups.length; o < ol; ++ o ) {\n\n\t\t\t\t\tconst group = groups[ o ];\n\n\t\t\t\t\tconst groupStart = group.start;\n\t\t\t\t\tconst groupCount = group.count;\n\n\t\t\t\t\tfor ( let i = groupStart, l = ( groupStart + groupCount ); i < l; i += 3 ) {\n\n\t\t\t\t\t\tfor ( let j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t\tconst index1 = indices.getX( i + j );\n\t\t\t\t\t\t\tconst index2 = indices.getX( i + ( j + 1 ) % 3 );\n\n\t\t\t\t\t\t\tstart.fromBufferAttribute( position, index1 );\n\t\t\t\t\t\t\tend.fromBufferAttribute( position, index2 );\n\n\t\t\t\t\t\t\tif ( isUniqueEdge( start, end, edges ) === true ) {\n\n\t\t\t\t\t\t\t\tvertices.push( start.x, start.y, start.z );\n\t\t\t\t\t\t\t\tvertices.push( end.x, end.y, end.z );\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} else {\n\n\t\t\t\t// non-indexed BufferGeometry\n\n\t\t\t\tconst position = geometry.attributes.position;\n\n\t\t\t\tfor ( let i = 0, l = ( position.count / 3 ); i < l; i ++ ) {\n\n\t\t\t\t\tfor ( let j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t// three edges per triangle, an edge is represented as (index1, index2)\n\t\t\t\t\t\t// e.g. the first triangle has the following edges: (0,1),(1,2),(2,0)\n\n\t\t\t\t\t\tconst index1 = 3 * i + j;\n\t\t\t\t\t\tconst index2 = 3 * i + ( ( j + 1 ) % 3 );\n\n\t\t\t\t\t\tstart.fromBufferAttribute( position, index1 );\n\t\t\t\t\t\tend.fromBufferAttribute( position, index2 );\n\n\t\t\t\t\t\tif ( isUniqueEdge( start, end, edges ) === true ) {\n\n\t\t\t\t\t\t\tvertices.push( start.x, start.y, start.z );\n\t\t\t\t\t\t\tvertices.push( end.x, end.y, end.z );\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// build geometry\n\n\t\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\n\t\t}\n\n\t}\n\n}\n\nfunction isUniqueEdge( start, end, edges ) {\n\n\tconst hash1 = `${start.x},${start.y},${start.z}-${end.x},${end.y},${end.z}`;\n\tconst hash2 = `${end.x},${end.y},${end.z}-${start.x},${start.y},${start.z}`; // coincident edge\n\n\tif ( edges.has( hash1 ) === true || edges.has( hash2 ) === true ) {\n\n\t\treturn false;\n\n\t} else {\n\n\t\tedges.add( hash1 );\n\t\tedges.add( hash2 );\n\t\treturn true;\n\n\t}\n\n}\n\nvar Geometries = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tBoxGeometry: BoxGeometry,\n\tBoxBufferGeometry: BoxGeometry,\n\tCapsuleGeometry: CapsuleGeometry,\n\tCapsuleBufferGeometry: CapsuleGeometry,\n\tCircleGeometry: CircleGeometry,\n\tCircleBufferGeometry: CircleGeometry,\n\tConeGeometry: ConeGeometry,\n\tConeBufferGeometry: ConeGeometry,\n\tCylinderGeometry: CylinderGeometry,\n\tCylinderBufferGeometry: CylinderGeometry,\n\tDodecahedronGeometry: DodecahedronGeometry,\n\tDodecahedronBufferGeometry: DodecahedronGeometry,\n\tEdgesGeometry: EdgesGeometry,\n\tExtrudeGeometry: ExtrudeGeometry,\n\tExtrudeBufferGeometry: ExtrudeGeometry,\n\tIcosahedronGeometry: IcosahedronGeometry,\n\tIcosahedronBufferGeometry: IcosahedronGeometry,\n\tLatheGeometry: LatheGeometry,\n\tLatheBufferGeometry: LatheGeometry,\n\tOctahedronGeometry: OctahedronGeometry,\n\tOctahedronBufferGeometry: OctahedronGeometry,\n\tPlaneGeometry: PlaneGeometry,\n\tPlaneBufferGeometry: PlaneGeometry,\n\tPolyhedronGeometry: PolyhedronGeometry,\n\tPolyhedronBufferGeometry: PolyhedronGeometry,\n\tRingGeometry: RingGeometry,\n\tRingBufferGeometry: RingGeometry,\n\tShapeGeometry: ShapeGeometry,\n\tShapeBufferGeometry: ShapeGeometry,\n\tSphereGeometry: SphereGeometry,\n\tSphereBufferGeometry: SphereGeometry,\n\tTetrahedronGeometry: TetrahedronGeometry,\n\tTetrahedronBufferGeometry: TetrahedronGeometry,\n\tTorusGeometry: TorusGeometry,\n\tTorusBufferGeometry: TorusGeometry,\n\tTorusKnotGeometry: TorusKnotGeometry,\n\tTorusKnotBufferGeometry: TorusKnotGeometry,\n\tTubeGeometry: TubeGeometry,\n\tTubeBufferGeometry: TubeGeometry,\n\tWireframeGeometry: WireframeGeometry\n});\n\nclass ShadowMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isShadowMaterial = true;\n\n\t\tthis.type = 'ShadowMaterial';\n\n\t\tthis.color = new Color( 0x000000 );\n\t\tthis.transparent = true;\n\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass RawShaderMaterial extends ShaderMaterial {\n\n\tconstructor( parameters ) {\n\n\t\tsuper( parameters );\n\n\t\tthis.isRawShaderMaterial = true;\n\n\t\tthis.type = 'RawShaderMaterial';\n\n\t}\n\n}\n\nclass MeshStandardMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isMeshStandardMaterial = true;\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 = 1.0;\n\t\tthis.metalness = 0.0;\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.normalMapType = TangentSpaceNormalMap;\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.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\t\tthis.wireframeLinecap = 'round';\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\tthis.flatShading = false;\n\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( 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.normalMapType = source.normalMapType;\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.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.flatShading = source.flatShading;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass MeshPhysicalMaterial extends MeshStandardMaterial {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isMeshPhysicalMaterial = true;\n\n\t\tthis.defines = {\n\n\t\t\t'STANDARD': '',\n\t\t\t'PHYSICAL': ''\n\n\t\t};\n\n\t\tthis.type = 'MeshPhysicalMaterial';\n\n\t\tthis.clearcoatMap = null;\n\t\tthis.clearcoatRoughness = 0.0;\n\t\tthis.clearcoatRoughnessMap = null;\n\t\tthis.clearcoatNormalScale = new Vector2( 1, 1 );\n\t\tthis.clearcoatNormalMap = null;\n\n\t\tthis.ior = 1.5;\n\n\t\tObject.defineProperty( this, 'reflectivity', {\n\t\t\tget: function () {\n\n\t\t\t\treturn ( clamp( 2.5 * ( this.ior - 1 ) / ( this.ior + 1 ), 0, 1 ) );\n\n\t\t\t},\n\t\t\tset: function ( reflectivity ) {\n\n\t\t\t\tthis.ior = ( 1 + 0.4 * reflectivity ) / ( 1 - 0.4 * reflectivity );\n\n\t\t\t}\n\t\t} );\n\n\t\tthis.iridescenceMap = null;\n\t\tthis.iridescenceIOR = 1.3;\n\t\tthis.iridescenceThicknessRange = [ 100, 400 ];\n\t\tthis.iridescenceThicknessMap = null;\n\n\t\tthis.sheenColor = new Color( 0x000000 );\n\t\tthis.sheenColorMap = null;\n\t\tthis.sheenRoughness = 1.0;\n\t\tthis.sheenRoughnessMap = null;\n\n\t\tthis.transmissionMap = null;\n\n\t\tthis.thickness = 0;\n\t\tthis.thicknessMap = null;\n\t\tthis.attenuationDistance = 0.0;\n\t\tthis.attenuationColor = new Color( 1, 1, 1 );\n\n\t\tthis.specularIntensity = 1.0;\n\t\tthis.specularIntensityMap = null;\n\t\tthis.specularColor = new Color( 1, 1, 1 );\n\t\tthis.specularColorMap = null;\n\n\t\tthis._sheen = 0.0;\n\t\tthis._clearcoat = 0;\n\t\tthis._iridescence = 0;\n\t\tthis._transmission = 0;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tget sheen() {\n\n\t\treturn this._sheen;\n\n\t}\n\n\tset sheen( value ) {\n\n\t\tif ( this._sheen > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._sheen = value;\n\n\t}\n\n\tget clearcoat() {\n\n\t\treturn this._clearcoat;\n\n\t}\n\n\tset clearcoat( value ) {\n\n\t\tif ( this._clearcoat > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._clearcoat = value;\n\n\t}\n\n\tget iridescence() {\n\n\t\treturn this._iridescence;\n\n\t}\n\n\tset iridescence( value ) {\n\n\t\tif ( this._iridescence > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._iridescence = value;\n\n\t}\n\n\tget transmission() {\n\n\t\treturn this._transmission;\n\n\t}\n\n\tset transmission( value ) {\n\n\t\tif ( this._transmission > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._transmission = value;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.defines = {\n\n\t\t\t'STANDARD': '',\n\t\t\t'PHYSICAL': ''\n\n\t\t};\n\n\t\tthis.clearcoat = source.clearcoat;\n\t\tthis.clearcoatMap = source.clearcoatMap;\n\t\tthis.clearcoatRoughness = source.clearcoatRoughness;\n\t\tthis.clearcoatRoughnessMap = source.clearcoatRoughnessMap;\n\t\tthis.clearcoatNormalMap = source.clearcoatNormalMap;\n\t\tthis.clearcoatNormalScale.copy( source.clearcoatNormalScale );\n\n\t\tthis.ior = source.ior;\n\n\t\tthis.iridescence = source.iridescence;\n\t\tthis.iridescenceMap = source.iridescenceMap;\n\t\tthis.iridescenceIOR = source.iridescenceIOR;\n\t\tthis.iridescenceThicknessRange = [ ...source.iridescenceThicknessRange ];\n\t\tthis.iridescenceThicknessMap = source.iridescenceThicknessMap;\n\n\t\tthis.sheen = source.sheen;\n\t\tthis.sheenColor.copy( source.sheenColor );\n\t\tthis.sheenColorMap = source.sheenColorMap;\n\t\tthis.sheenRoughness = source.sheenRoughness;\n\t\tthis.sheenRoughnessMap = source.sheenRoughnessMap;\n\n\t\tthis.transmission = source.transmission;\n\t\tthis.transmissionMap = source.transmissionMap;\n\n\t\tthis.thickness = source.thickness;\n\t\tthis.thicknessMap = source.thicknessMap;\n\t\tthis.attenuationDistance = source.attenuationDistance;\n\t\tthis.attenuationColor.copy( source.attenuationColor );\n\n\t\tthis.specularIntensity = source.specularIntensity;\n\t\tthis.specularIntensityMap = source.specularIntensityMap;\n\t\tthis.specularColor.copy( source.specularColor );\n\t\tthis.specularColorMap = source.specularColorMap;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass MeshPhongMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isMeshPhongMaterial = true;\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.normalMapType = TangentSpaceNormalMap;\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.flatShading = false;\n\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( 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.normalMapType = source.normalMapType;\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.flatShading = source.flatShading;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass MeshToonMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isMeshToonMaterial = true;\n\n\t\tthis.defines = { 'TOON': '' };\n\n\t\tthis.type = 'MeshToonMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\n\t\tthis.map = null;\n\t\tthis.gradientMap = 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.normalMapType = TangentSpaceNormalMap;\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.alphaMap = null;\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.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\t\tthis.gradientMap = source.gradientMap;\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.normalMapType = source.normalMapType;\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.alphaMap = source.alphaMap;\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.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass MeshNormalMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isMeshNormalMaterial = true;\n\n\t\tthis.type = 'MeshNormalMaterial';\n\n\t\tthis.bumpMap = null;\n\t\tthis.bumpScale = 1;\n\n\t\tthis.normalMap = null;\n\t\tthis.normalMapType = TangentSpaceNormalMap;\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.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\n\t\tthis.flatShading = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\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.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\tthis.flatShading = source.flatShading;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass MeshLambertMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isMeshLambertMaterial = true;\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.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( 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.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass MeshMatcapMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isMeshMatcapMaterial = true;\n\n\t\tthis.defines = { 'MATCAP': '' };\n\n\t\tthis.type = 'MeshMatcapMaterial';\n\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\n\t\tthis.matcap = null;\n\n\t\tthis.map = null;\n\n\t\tthis.bumpMap = null;\n\t\tthis.bumpScale = 1;\n\n\t\tthis.normalMap = null;\n\t\tthis.normalMapType = TangentSpaceNormalMap;\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.alphaMap = null;\n\n\t\tthis.flatShading = false;\n\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.defines = { 'MATCAP': '' };\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.matcap = source.matcap;\n\n\t\tthis.map = source.map;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\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.alphaMap = source.alphaMap;\n\n\t\tthis.flatShading = source.flatShading;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass LineDashedMaterial extends LineBasicMaterial {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isLineDashedMaterial = true;\n\n\t\tthis.type = 'LineDashedMaterial';\n\n\t\tthis.scale = 1;\n\t\tthis.dashSize = 3;\n\t\tthis.gapSize = 1;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\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// same as Array.prototype.slice, but also works on typed arrays\nfunction arraySlice( array, from, to ) {\n\n\tif ( isTypedArray( array ) ) {\n\n\t\t// in ios9 array.subarray(from, undefined) will return empty array\n\t\t// but array.subarray(from) or array.subarray(from, len) is correct\n\t\treturn new array.constructor( array.subarray( from, to !== undefined ? to : array.length ) );\n\n\t}\n\n\treturn array.slice( from, to );\n\n}\n\n// converts an array to a specific type\nfunction convertArray( array, type, forceClone ) {\n\n\tif ( ! array || // let 'undefined' and 'null' pass\n\t\t! forceClone && array.constructor === type ) return array;\n\n\tif ( typeof type.BYTES_PER_ELEMENT === 'number' ) {\n\n\t\treturn new type( array ); // create typed array\n\n\t}\n\n\treturn Array.prototype.slice.call( array ); // create Array\n\n}\n\nfunction isTypedArray( object ) {\n\n\treturn ArrayBuffer.isView( object ) &&\n\t\t! ( object instanceof DataView );\n\n}\n\n// returns an array by which times and values can be sorted\nfunction getKeyframeOrder( times ) {\n\n\tfunction compareTime( i, j ) {\n\n\t\treturn times[ i ] - times[ j ];\n\n\t}\n\n\tconst n = times.length;\n\tconst result = new Array( n );\n\tfor ( let i = 0; i !== n; ++ i ) result[ i ] = i;\n\n\tresult.sort( compareTime );\n\n\treturn result;\n\n}\n\n// uses the array previously returned by 'getKeyframeOrder' to sort data\nfunction sortedArray( values, stride, order ) {\n\n\tconst nValues = values.length;\n\tconst result = new values.constructor( nValues );\n\n\tfor ( let i = 0, dstOffset = 0; dstOffset !== nValues; ++ i ) {\n\n\t\tconst srcOffset = order[ i ] * stride;\n\n\t\tfor ( let j = 0; j !== stride; ++ j ) {\n\n\t\t\tresult[ dstOffset ++ ] = values[ srcOffset + j ];\n\n\t\t}\n\n\t}\n\n\treturn result;\n\n}\n\n// function for parsing AOS keyframe formats\nfunction flattenJSON( jsonKeys, times, values, valuePropertyName ) {\n\n\tlet i = 1, key = jsonKeys[ 0 ];\n\n\twhile ( key !== undefined && key[ valuePropertyName ] === undefined ) {\n\n\t\tkey = jsonKeys[ i ++ ];\n\n\t}\n\n\tif ( key === undefined ) return; // no data\n\n\tlet value = key[ valuePropertyName ];\n\tif ( value === undefined ) return; // no data\n\n\tif ( Array.isArray( value ) ) {\n\n\t\tdo {\n\n\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\tif ( value !== undefined ) {\n\n\t\t\t\ttimes.push( key.time );\n\t\t\t\tvalues.push.apply( values, value ); // push all elements\n\n\t\t\t}\n\n\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t} while ( key !== undefined );\n\n\t} else if ( value.toArray !== undefined ) {\n\n\t\t// ...assume THREE.Math-ish\n\n\t\tdo {\n\n\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\tif ( value !== undefined ) {\n\n\t\t\t\ttimes.push( key.time );\n\t\t\t\tvalue.toArray( values, values.length );\n\n\t\t\t}\n\n\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t} while ( key !== undefined );\n\n\t} else {\n\n\t\t// otherwise push as-is\n\n\t\tdo {\n\n\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\tif ( value !== undefined ) {\n\n\t\t\t\ttimes.push( key.time );\n\t\t\t\tvalues.push( value );\n\n\t\t\t}\n\n\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t} while ( key !== undefined );\n\n\t}\n\n}\n\nfunction subclip( sourceClip, name, startFrame, endFrame, fps = 30 ) {\n\n\tconst clip = sourceClip.clone();\n\n\tclip.name = name;\n\n\tconst tracks = [];\n\n\tfor ( let i = 0; i < clip.tracks.length; ++ i ) {\n\n\t\tconst track = clip.tracks[ i ];\n\t\tconst valueSize = track.getValueSize();\n\n\t\tconst times = [];\n\t\tconst values = [];\n\n\t\tfor ( let j = 0; j < track.times.length; ++ j ) {\n\n\t\t\tconst frame = track.times[ j ] * fps;\n\n\t\t\tif ( frame < startFrame || frame >= endFrame ) continue;\n\n\t\t\ttimes.push( track.times[ j ] );\n\n\t\t\tfor ( let k = 0; k < valueSize; ++ k ) {\n\n\t\t\t\tvalues.push( track.values[ j * valueSize + k ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( times.length === 0 ) continue;\n\n\t\ttrack.times = convertArray( times, track.times.constructor );\n\t\ttrack.values = convertArray( values, track.values.constructor );\n\n\t\ttracks.push( track );\n\n\t}\n\n\tclip.tracks = tracks;\n\n\t// find minimum .times value across all tracks in the trimmed clip\n\n\tlet minStartTime = Infinity;\n\n\tfor ( let i = 0; i < clip.tracks.length; ++ i ) {\n\n\t\tif ( minStartTime > clip.tracks[ i ].times[ 0 ] ) {\n\n\t\t\tminStartTime = clip.tracks[ i ].times[ 0 ];\n\n\t\t}\n\n\t}\n\n\t// shift all tracks such that clip begins at t=0\n\n\tfor ( let i = 0; i < clip.tracks.length; ++ i ) {\n\n\t\tclip.tracks[ i ].shift( - 1 * minStartTime );\n\n\t}\n\n\tclip.resetDuration();\n\n\treturn clip;\n\n}\n\nfunction makeClipAdditive( targetClip, referenceFrame = 0, referenceClip = targetClip, fps = 30 ) {\n\n\tif ( fps <= 0 ) fps = 30;\n\n\tconst numTracks = referenceClip.tracks.length;\n\tconst referenceTime = referenceFrame / fps;\n\n\t// Make each track's values relative to the values at the reference frame\n\tfor ( let i = 0; i < numTracks; ++ i ) {\n\n\t\tconst referenceTrack = referenceClip.tracks[ i ];\n\t\tconst referenceTrackType = referenceTrack.ValueTypeName;\n\n\t\t// Skip this track if it's non-numeric\n\t\tif ( referenceTrackType === 'bool' || referenceTrackType === 'string' ) continue;\n\n\t\t// Find the track in the target clip whose name and type matches the reference track\n\t\tconst targetTrack = targetClip.tracks.find( function ( track ) {\n\n\t\t\treturn track.name === referenceTrack.name\n\t\t\t\t&& track.ValueTypeName === referenceTrackType;\n\n\t\t} );\n\n\t\tif ( targetTrack === undefined ) continue;\n\n\t\tlet referenceOffset = 0;\n\t\tconst referenceValueSize = referenceTrack.getValueSize();\n\n\t\tif ( referenceTrack.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline ) {\n\n\t\t\treferenceOffset = referenceValueSize / 3;\n\n\t\t}\n\n\t\tlet targetOffset = 0;\n\t\tconst targetValueSize = targetTrack.getValueSize();\n\n\t\tif ( targetTrack.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline ) {\n\n\t\t\ttargetOffset = targetValueSize / 3;\n\n\t\t}\n\n\t\tconst lastIndex = referenceTrack.times.length - 1;\n\t\tlet referenceValue;\n\n\t\t// Find the value to subtract out of the track\n\t\tif ( referenceTime <= referenceTrack.times[ 0 ] ) {\n\n\t\t\t// Reference frame is earlier than the first keyframe, so just use the first keyframe\n\t\t\tconst startIndex = referenceOffset;\n\t\t\tconst endIndex = referenceValueSize - referenceOffset;\n\t\t\treferenceValue = arraySlice( referenceTrack.values, startIndex, endIndex );\n\n\t\t} else if ( referenceTime >= referenceTrack.times[ lastIndex ] ) {\n\n\t\t\t// Reference frame is after the last keyframe, so just use the last keyframe\n\t\t\tconst startIndex = lastIndex * referenceValueSize + referenceOffset;\n\t\t\tconst endIndex = startIndex + referenceValueSize - referenceOffset;\n\t\t\treferenceValue = arraySlice( referenceTrack.values, startIndex, endIndex );\n\n\t\t} else {\n\n\t\t\t// Interpolate to the reference value\n\t\t\tconst interpolant = referenceTrack.createInterpolant();\n\t\t\tconst startIndex = referenceOffset;\n\t\t\tconst endIndex = referenceValueSize - referenceOffset;\n\t\t\tinterpolant.evaluate( referenceTime );\n\t\t\treferenceValue = arraySlice( interpolant.resultBuffer, startIndex, endIndex );\n\n\t\t}\n\n\t\t// Conjugate the quaternion\n\t\tif ( referenceTrackType === 'quaternion' ) {\n\n\t\t\tconst referenceQuat = new Quaternion().fromArray( referenceValue ).normalize().conjugate();\n\t\t\treferenceQuat.toArray( referenceValue );\n\n\t\t}\n\n\t\t// Subtract the reference value from all of the track values\n\n\t\tconst numTimes = targetTrack.times.length;\n\t\tfor ( let j = 0; j < numTimes; ++ j ) {\n\n\t\t\tconst valueStart = j * targetValueSize + targetOffset;\n\n\t\t\tif ( referenceTrackType === 'quaternion' ) {\n\n\t\t\t\t// Multiply the conjugate for quaternion track types\n\t\t\t\tQuaternion.multiplyQuaternionsFlat(\n\t\t\t\t\ttargetTrack.values,\n\t\t\t\t\tvalueStart,\n\t\t\t\t\treferenceValue,\n\t\t\t\t\t0,\n\t\t\t\t\ttargetTrack.values,\n\t\t\t\t\tvalueStart\n\t\t\t\t);\n\n\t\t\t} else {\n\n\t\t\t\tconst valueEnd = targetValueSize - targetOffset * 2;\n\n\t\t\t\t// Subtract each value for all other numeric track types\n\t\t\t\tfor ( let k = 0; k < valueEnd; ++ k ) {\n\n\t\t\t\t\ttargetTrack.values[ valueStart + k ] -= referenceValue[ k ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\ttargetClip.blendMode = AdditiveAnimationBlendMode;\n\n\treturn targetClip;\n\n}\n\nvar AnimationUtils = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tarraySlice: arraySlice,\n\tconvertArray: convertArray,\n\tisTypedArray: isTypedArray,\n\tgetKeyframeOrder: getKeyframeOrder,\n\tsortedArray: sortedArray,\n\tflattenJSON: flattenJSON,\n\tsubclip: subclip,\n\tmakeClipAdditive: makeClipAdditive\n});\n\n/**\n * Abstract base class of interpolants over parametric samples.\n *\n * The parameter domain is one dimensional, typically the time or a path\n * along a curve defined by the data.\n *\n * The sample values can have any dimensionality and derived classes may\n * apply special interpretations to the data.\n *\n * This class provides the interval seek in a Template Method, deferring\n * the actual interpolation to derived classes.\n *\n * Time complexity is O(1) for linear access crossing at most two points\n * and O(log N) for random access, where N is the number of positions.\n *\n * References:\n *\n * \t\thttp://www.oodesign.com/template-method-pattern.html\n *\n */\n\nclass Interpolant {\n\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tthis.parameterPositions = parameterPositions;\n\t\tthis._cachedIndex = 0;\n\n\t\tthis.resultBuffer = resultBuffer !== undefined ?\n\t\t\tresultBuffer : new sampleValues.constructor( sampleSize );\n\t\tthis.sampleValues = sampleValues;\n\t\tthis.valueSize = sampleSize;\n\n\t\tthis.settings = null;\n\t\tthis.DefaultSettings_ = {};\n\n\t}\n\n\tevaluate( t ) {\n\n\t\tconst pp = this.parameterPositions;\n\t\tlet i1 = this._cachedIndex,\n\t\t\tt1 = pp[ i1 ],\n\t\t\tt0 = pp[ i1 - 1 ];\n\n\t\tvalidate_interval: {\n\n\t\t\tseek: {\n\n\t\t\t\tlet right;\n\n\t\t\t\tlinear_scan: {\n\n\t\t\t\t\t//- See http://jsperf.com/comparison-to-undefined/3\n\t\t\t\t\t//- slower code:\n\t\t\t\t\t//-\n\t\t\t\t\t//- \t\t\t\tif ( t >= t1 || t1 === undefined ) {\n\t\t\t\t\tforward_scan: if ( ! ( t < t1 ) ) {\n\n\t\t\t\t\t\tfor ( let giveUpAt = i1 + 2; ; ) {\n\n\t\t\t\t\t\t\tif ( t1 === undefined ) {\n\n\t\t\t\t\t\t\t\tif ( t < t0 ) break forward_scan;\n\n\t\t\t\t\t\t\t\t// after end\n\n\t\t\t\t\t\t\t\ti1 = pp.length;\n\t\t\t\t\t\t\t\tthis._cachedIndex = i1;\n\t\t\t\t\t\t\t\treturn this.copySampleValue_( i1 - 1 );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( i1 === giveUpAt ) break; // this loop\n\n\t\t\t\t\t\t\tt0 = t1;\n\t\t\t\t\t\t\tt1 = pp[ ++ i1 ];\n\n\t\t\t\t\t\t\tif ( t < t1 ) {\n\n\t\t\t\t\t\t\t\t// we have arrived at the sought interval\n\t\t\t\t\t\t\t\tbreak seek;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// prepare binary search on the right side of the index\n\t\t\t\t\t\tright = pp.length;\n\t\t\t\t\t\tbreak linear_scan;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t//- slower code:\n\t\t\t\t\t//-\t\t\t\t\tif ( t < t0 || t0 === undefined ) {\n\t\t\t\t\tif ( ! ( t >= t0 ) ) {\n\n\t\t\t\t\t\t// looping?\n\n\t\t\t\t\t\tconst t1global = pp[ 1 ];\n\n\t\t\t\t\t\tif ( t < t1global ) {\n\n\t\t\t\t\t\t\ti1 = 2; // + 1, using the scan for the details\n\t\t\t\t\t\t\tt0 = t1global;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// linear reverse scan\n\n\t\t\t\t\t\tfor ( let giveUpAt = i1 - 2; ; ) {\n\n\t\t\t\t\t\t\tif ( t0 === undefined ) {\n\n\t\t\t\t\t\t\t\t// before start\n\n\t\t\t\t\t\t\t\tthis._cachedIndex = 0;\n\t\t\t\t\t\t\t\treturn this.copySampleValue_( 0 );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( i1 === giveUpAt ) break; // this loop\n\n\t\t\t\t\t\t\tt1 = t0;\n\t\t\t\t\t\t\tt0 = pp[ -- i1 - 1 ];\n\n\t\t\t\t\t\t\tif ( t >= t0 ) {\n\n\t\t\t\t\t\t\t\t// we have arrived at the sought interval\n\t\t\t\t\t\t\t\tbreak seek;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// prepare binary search on the left side of the index\n\t\t\t\t\t\tright = i1;\n\t\t\t\t\t\ti1 = 0;\n\t\t\t\t\t\tbreak linear_scan;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// the interval is valid\n\n\t\t\t\t\tbreak validate_interval;\n\n\t\t\t\t} // linear scan\n\n\t\t\t\t// binary search\n\n\t\t\t\twhile ( i1 < right ) {\n\n\t\t\t\t\tconst mid = ( i1 + right ) >>> 1;\n\n\t\t\t\t\tif ( t < pp[ mid ] ) {\n\n\t\t\t\t\t\tright = mid;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ti1 = mid + 1;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tt1 = pp[ i1 ];\n\t\t\t\tt0 = pp[ i1 - 1 ];\n\n\t\t\t\t// check boundary cases, again\n\n\t\t\t\tif ( t0 === undefined ) {\n\n\t\t\t\t\tthis._cachedIndex = 0;\n\t\t\t\t\treturn this.copySampleValue_( 0 );\n\n\t\t\t\t}\n\n\t\t\t\tif ( t1 === undefined ) {\n\n\t\t\t\t\ti1 = pp.length;\n\t\t\t\t\tthis._cachedIndex = i1;\n\t\t\t\t\treturn this.copySampleValue_( i1 - 1 );\n\n\t\t\t\t}\n\n\t\t\t} // seek\n\n\t\t\tthis._cachedIndex = i1;\n\n\t\t\tthis.intervalChanged_( i1, t0, t1 );\n\n\t\t} // validate_interval\n\n\t\treturn this.interpolate_( i1, t0, t, t1 );\n\n\t}\n\n\tgetSettings_() {\n\n\t\treturn this.settings || this.DefaultSettings_;\n\n\t}\n\n\tcopySampleValue_( index ) {\n\n\t\t// copies a sample value to the result buffer\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\t\t\toffset = index * stride;\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tresult[ i ] = values[ offset + i ];\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\t// Template methods for derived classes:\n\n\tinterpolate_( /* i1, t0, t, t1 */ ) {\n\n\t\tthrow new Error( 'call to abstract method' );\n\t\t// implementations shall return this.resultBuffer\n\n\t}\n\n\tintervalChanged_( /* i1, t0, t1 */ ) {\n\n\t\t// empty\n\n\t}\n\n}\n\n/**\n * Fast and simple cubic spline interpolant.\n *\n * It was derived from a Hermitian construction setting the first derivative\n * at each sample position to the linear slope between neighboring positions\n * over their parameter interval.\n */\n\nclass CubicInterpolant extends Interpolant {\n\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tsuper( 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\tthis.DefaultSettings_ = {\n\n\t\t\tendingStart: ZeroCurvatureEnding,\n\t\t\tendingEnd: ZeroCurvatureEnding\n\n\t\t};\n\n\t}\n\n\tintervalChanged_( i1, t0, t1 ) {\n\n\t\tconst pp = this.parameterPositions;\n\t\tlet iPrev = i1 - 2,\n\t\t\tiNext = i1 + 1,\n\n\t\t\ttPrev = pp[ iPrev ],\n\t\t\ttNext = pp[ iNext ];\n\n\t\tif ( tPrev === undefined ) {\n\n\t\t\tswitch ( this.getSettings_().endingStart ) {\n\n\t\t\t\tcase ZeroSlopeEnding:\n\n\t\t\t\t\t// f'(t0) = 0\n\t\t\t\t\tiPrev = i1;\n\t\t\t\t\ttPrev = 2 * t0 - t1;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase WrapAroundEnding:\n\n\t\t\t\t\t// use the other end of the curve\n\t\t\t\t\tiPrev = pp.length - 2;\n\t\t\t\t\ttPrev = t0 + pp[ iPrev ] - pp[ iPrev + 1 ];\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault: // ZeroCurvatureEnding\n\n\t\t\t\t\t// f''(t0) = 0 a.k.a. Natural Spline\n\t\t\t\t\tiPrev = i1;\n\t\t\t\t\ttPrev = t1;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( tNext === undefined ) {\n\n\t\t\tswitch ( this.getSettings_().endingEnd ) {\n\n\t\t\t\tcase ZeroSlopeEnding:\n\n\t\t\t\t\t// f'(tN) = 0\n\t\t\t\t\tiNext = i1;\n\t\t\t\t\ttNext = 2 * t1 - t0;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase WrapAroundEnding:\n\n\t\t\t\t\t// use the other end of the curve\n\t\t\t\t\tiNext = 1;\n\t\t\t\t\ttNext = t1 + pp[ 1 ] - pp[ 0 ];\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault: // ZeroCurvatureEnding\n\n\t\t\t\t\t// f''(tN) = 0, a.k.a. Natural Spline\n\t\t\t\t\tiNext = i1 - 1;\n\t\t\t\t\ttNext = t0;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst halfDt = ( t1 - t0 ) * 0.5,\n\t\t\tstride = this.valueSize;\n\n\t\tthis._weightPrev = halfDt / ( t0 - tPrev );\n\t\tthis._weightNext = halfDt / ( tNext - t1 );\n\t\tthis._offsetPrev = iPrev * stride;\n\t\tthis._offsetNext = iNext * stride;\n\n\t}\n\n\tinterpolate_( i1, t0, t, t1 ) {\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\n\t\t\to1 = i1 * stride,\t\to0 = o1 - stride,\n\t\t\toP = this._offsetPrev, \toN = this._offsetNext,\n\t\t\twP = this._weightPrev,\twN = this._weightNext,\n\n\t\t\tp = ( t - t0 ) / ( t1 - t0 ),\n\t\t\tpp = p * p,\n\t\t\tppp = pp * p;\n\n\t\t// evaluate polynomials\n\n\t\tconst sP = - wP * ppp + 2 * wP * pp - wP * p;\n\t\tconst s0 = ( 1 + wP ) * ppp + ( - 1.5 - 2 * wP ) * pp + ( - 0.5 + wP ) * p + 1;\n\t\tconst s1 = ( - 1 - wN ) * ppp + ( 1.5 + wN ) * pp + 0.5 * p;\n\t\tconst sN = wN * ppp - wN * pp;\n\n\t\t// combine data linearly\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tresult[ i ] =\n\t\t\t\t\tsP * values[ oP + i ] +\n\t\t\t\t\ts0 * values[ o0 + i ] +\n\t\t\t\t\ts1 * values[ o1 + i ] +\n\t\t\t\t\tsN * values[ oN + i ];\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n}\n\nclass LinearInterpolant extends Interpolant {\n\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tinterpolate_( i1, t0, t, t1 ) {\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\n\t\t\toffset1 = i1 * stride,\n\t\t\toffset0 = offset1 - stride,\n\n\t\t\tweight1 = ( t - t0 ) / ( t1 - t0 ),\n\t\t\tweight0 = 1 - weight1;\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tresult[ i ] =\n\t\t\t\t\tvalues[ offset0 + i ] * weight0 +\n\t\t\t\t\tvalues[ offset1 + i ] * weight1;\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n}\n\n/**\n *\n * Interpolant that evaluates to the sample value at the position preceding\n * the parameter.\n */\n\nclass DiscreteInterpolant extends Interpolant {\n\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tinterpolate_( i1 /*, t0, t, t1 */ ) {\n\n\t\treturn this.copySampleValue_( i1 - 1 );\n\n\t}\n\n}\n\nclass KeyframeTrack {\n\n\tconstructor( name, times, values, interpolation ) {\n\n\t\tif ( name === undefined ) throw new Error( 'THREE.KeyframeTrack: track name is undefined' );\n\t\tif ( times === undefined || times.length === 0 ) throw new Error( 'THREE.KeyframeTrack: no keyframes in track named ' + name );\n\n\t\tthis.name = name;\n\n\t\tthis.times = convertArray( times, this.TimeBufferType );\n\t\tthis.values = convertArray( values, this.ValueBufferType );\n\n\t\tthis.setInterpolation( interpolation || this.DefaultInterpolation );\n\n\t}\n\n\t// Serialization (in static context, because of constructor invocation\n\t// and automatic invocation of .toJSON):\n\n\tstatic toJSON( track ) {\n\n\t\tconst trackType = track.constructor;\n\n\t\tlet json;\n\n\t\t// derived classes can define a static toJSON method\n\t\tif ( trackType.toJSON !== this.toJSON ) {\n\n\t\t\tjson = trackType.toJSON( track );\n\n\t\t} else {\n\n\t\t\t// by default, we assume the data can be serialized as-is\n\t\t\tjson = {\n\n\t\t\t\t'name': track.name,\n\t\t\t\t'times': convertArray( track.times, Array ),\n\t\t\t\t'values': convertArray( track.values, Array )\n\n\t\t\t};\n\n\t\t\tconst interpolation = track.getInterpolation();\n\n\t\t\tif ( interpolation !== track.DefaultInterpolation ) {\n\n\t\t\t\tjson.interpolation = interpolation;\n\n\t\t\t}\n\n\t\t}\n\n\t\tjson.type = track.ValueTypeName; // mandatory\n\n\t\treturn json;\n\n\t}\n\n\tInterpolantFactoryMethodDiscrete( result ) {\n\n\t\treturn new DiscreteInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t}\n\n\tInterpolantFactoryMethodLinear( result ) {\n\n\t\treturn new LinearInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t}\n\n\tInterpolantFactoryMethodSmooth( result ) {\n\n\t\treturn new CubicInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t}\n\n\tsetInterpolation( interpolation ) {\n\n\t\tlet factoryMethod;\n\n\t\tswitch ( interpolation ) {\n\n\t\t\tcase InterpolateDiscrete:\n\n\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodDiscrete;\n\n\t\t\t\tbreak;\n\n\t\t\tcase InterpolateLinear:\n\n\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodLinear;\n\n\t\t\t\tbreak;\n\n\t\t\tcase InterpolateSmooth:\n\n\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodSmooth;\n\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\tif ( factoryMethod === undefined ) {\n\n\t\t\tconst message = 'unsupported interpolation for ' +\n\t\t\t\tthis.ValueTypeName + ' keyframe track named ' + this.name;\n\n\t\t\tif ( this.createInterpolant === undefined ) {\n\n\t\t\t\t// fall back to default, unless the default itself is messed up\n\t\t\t\tif ( interpolation !== this.DefaultInterpolation ) {\n\n\t\t\t\t\tthis.setInterpolation( this.DefaultInterpolation );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new Error( message ); // fatal, in this case\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconsole.warn( 'THREE.KeyframeTrack:', message );\n\t\t\treturn this;\n\n\t\t}\n\n\t\tthis.createInterpolant = factoryMethod;\n\n\t\treturn this;\n\n\t}\n\n\tgetInterpolation() {\n\n\t\tswitch ( this.createInterpolant ) {\n\n\t\t\tcase this.InterpolantFactoryMethodDiscrete:\n\n\t\t\t\treturn InterpolateDiscrete;\n\n\t\t\tcase this.InterpolantFactoryMethodLinear:\n\n\t\t\t\treturn InterpolateLinear;\n\n\t\t\tcase this.InterpolantFactoryMethodSmooth:\n\n\t\t\t\treturn InterpolateSmooth;\n\n\t\t}\n\n\t}\n\n\tgetValueSize() {\n\n\t\treturn this.values.length / this.times.length;\n\n\t}\n\n\t// move all keyframes either forwards or backwards in time\n\tshift( timeOffset ) {\n\n\t\tif ( timeOffset !== 0.0 ) {\n\n\t\t\tconst times = this.times;\n\n\t\t\tfor ( let i = 0, n = times.length; i !== n; ++ i ) {\n\n\t\t\t\ttimes[ i ] += timeOffset;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t// scale all keyframe times by a factor (useful for frame <-> seconds conversions)\n\tscale( timeScale ) {\n\n\t\tif ( timeScale !== 1.0 ) {\n\n\t\t\tconst times = this.times;\n\n\t\t\tfor ( let i = 0, n = times.length; i !== n; ++ i ) {\n\n\t\t\t\ttimes[ i ] *= timeScale;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t// removes keyframes before and after animation without changing any values within the range [startTime, endTime].\n\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\ttrim( startTime, endTime ) {\n\n\t\tconst times = this.times,\n\t\t\tnKeys = times.length;\n\n\t\tlet from = 0,\n\t\t\tto = nKeys - 1;\n\n\t\twhile ( from !== nKeys && times[ from ] < startTime ) {\n\n\t\t\t++ from;\n\n\t\t}\n\n\t\twhile ( to !== - 1 && times[ to ] > endTime ) {\n\n\t\t\t-- to;\n\n\t\t}\n\n\t\t++ to; // inclusive -> exclusive bound\n\n\t\tif ( from !== 0 || to !== nKeys ) {\n\n\t\t\t// empty tracks are forbidden, so keep at least one keyframe\n\t\t\tif ( from >= to ) {\n\n\t\t\t\tto = Math.max( to, 1 );\n\t\t\t\tfrom = to - 1;\n\n\t\t\t}\n\n\t\t\tconst stride = this.getValueSize();\n\t\t\tthis.times = arraySlice( times, from, to );\n\t\t\tthis.values = arraySlice( this.values, from * stride, to * stride );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t// ensure we do not get a GarbageInGarbageOut situation, make sure tracks are at least minimally viable\n\tvalidate() {\n\n\t\tlet valid = true;\n\n\t\tconst valueSize = this.getValueSize();\n\t\tif ( valueSize - Math.floor( valueSize ) !== 0 ) {\n\n\t\t\tconsole.error( 'THREE.KeyframeTrack: Invalid value size in track.', this );\n\t\t\tvalid = false;\n\n\t\t}\n\n\t\tconst times = this.times,\n\t\t\tvalues = this.values,\n\n\t\t\tnKeys = times.length;\n\n\t\tif ( nKeys === 0 ) {\n\n\t\t\tconsole.error( 'THREE.KeyframeTrack: Track is empty.', this );\n\t\t\tvalid = false;\n\n\t\t}\n\n\t\tlet prevTime = null;\n\n\t\tfor ( let i = 0; i !== nKeys; i ++ ) {\n\n\t\t\tconst currTime = times[ i ];\n\n\t\t\tif ( typeof currTime === 'number' && isNaN( currTime ) ) {\n\n\t\t\t\tconsole.error( 'THREE.KeyframeTrack: Time is not a valid number.', this, i, currTime );\n\t\t\t\tvalid = false;\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tif ( prevTime !== null && prevTime > currTime ) {\n\n\t\t\t\tconsole.error( 'THREE.KeyframeTrack: Out of order keys.', this, i, currTime, prevTime );\n\t\t\t\tvalid = false;\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tprevTime = currTime;\n\n\t\t}\n\n\t\tif ( values !== undefined ) {\n\n\t\t\tif ( isTypedArray( values ) ) {\n\n\t\t\t\tfor ( let i = 0, n = values.length; i !== n; ++ i ) {\n\n\t\t\t\t\tconst value = values[ i ];\n\n\t\t\t\t\tif ( isNaN( value ) ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.KeyframeTrack: Value is not a valid number.', this, i, value );\n\t\t\t\t\t\tvalid = false;\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}\n\n\t\treturn valid;\n\n\t}\n\n\t// removes equivalent sequential keys as common in morph target sequences\n\t// (0,0,0,0,1,1,1,0,0,0,0,0,0,0) --> (0,0,1,1,0,0)\n\toptimize() {\n\n\t\t// times or values may be shared with other tracks, so overwriting is unsafe\n\t\tconst times = arraySlice( this.times ),\n\t\t\tvalues = arraySlice( this.values ),\n\t\t\tstride = this.getValueSize(),\n\n\t\t\tsmoothInterpolation = this.getInterpolation() === InterpolateSmooth,\n\n\t\t\tlastIndex = times.length - 1;\n\n\t\tlet writeIndex = 1;\n\n\t\tfor ( let i = 1; i < lastIndex; ++ i ) {\n\n\t\t\tlet keep = false;\n\n\t\t\tconst time = times[ i ];\n\t\t\tconst timeNext = times[ i + 1 ];\n\n\t\t\t// remove adjacent keyframes scheduled at the same time\n\n\t\t\tif ( time !== timeNext && ( i !== 1 || time !== times[ 0 ] ) ) {\n\n\t\t\t\tif ( ! smoothInterpolation ) {\n\n\t\t\t\t\t// remove unnecessary keyframes same as their neighbors\n\n\t\t\t\t\tconst offset = i * stride,\n\t\t\t\t\t\toffsetP = offset - stride,\n\t\t\t\t\t\toffsetN = offset + stride;\n\n\t\t\t\t\tfor ( let j = 0; j !== stride; ++ j ) {\n\n\t\t\t\t\t\tconst value = values[ offset + j ];\n\n\t\t\t\t\t\tif ( value !== values[ offsetP + j ] ||\n\t\t\t\t\t\t\tvalue !== values[ offsetN + j ] ) {\n\n\t\t\t\t\t\t\tkeep = true;\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} else {\n\n\t\t\t\t\tkeep = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// in-place compaction\n\n\t\t\tif ( keep ) {\n\n\t\t\t\tif ( i !== writeIndex ) {\n\n\t\t\t\t\ttimes[ writeIndex ] = times[ i ];\n\n\t\t\t\t\tconst readOffset = i * stride,\n\t\t\t\t\t\twriteOffset = writeIndex * stride;\n\n\t\t\t\t\tfor ( let j = 0; j !== stride; ++ j ) {\n\n\t\t\t\t\t\tvalues[ writeOffset + j ] = values[ readOffset + j ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t++ writeIndex;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// flush last keyframe (compaction looks ahead)\n\n\t\tif ( lastIndex > 0 ) {\n\n\t\t\ttimes[ writeIndex ] = times[ lastIndex ];\n\n\t\t\tfor ( let readOffset = lastIndex * stride, writeOffset = writeIndex * stride, j = 0; j !== stride; ++ j ) {\n\n\t\t\t\tvalues[ writeOffset + j ] = values[ readOffset + j ];\n\n\t\t\t}\n\n\t\t\t++ writeIndex;\n\n\t\t}\n\n\t\tif ( writeIndex !== times.length ) {\n\n\t\t\tthis.times = arraySlice( times, 0, writeIndex );\n\t\t\tthis.values = arraySlice( values, 0, writeIndex * stride );\n\n\t\t} else {\n\n\t\t\tthis.times = times;\n\t\t\tthis.values = values;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\tconst times = arraySlice( this.times, 0 );\n\t\tconst values = arraySlice( this.values, 0 );\n\n\t\tconst TypedKeyframeTrack = this.constructor;\n\t\tconst track = new TypedKeyframeTrack( this.name, times, values );\n\n\t\t// Interpolant argument to constructor is not saved, so copy the factory method directly.\n\t\ttrack.createInterpolant = this.createInterpolant;\n\n\t\treturn track;\n\n\t}\n\n}\n\nKeyframeTrack.prototype.TimeBufferType = Float32Array;\nKeyframeTrack.prototype.ValueBufferType = Float32Array;\nKeyframeTrack.prototype.DefaultInterpolation = InterpolateLinear;\n\n/**\n * A Track of Boolean keyframe values.\n */\nclass BooleanKeyframeTrack extends KeyframeTrack {}\n\nBooleanKeyframeTrack.prototype.ValueTypeName = 'bool';\nBooleanKeyframeTrack.prototype.ValueBufferType = Array;\nBooleanKeyframeTrack.prototype.DefaultInterpolation = InterpolateDiscrete;\nBooleanKeyframeTrack.prototype.InterpolantFactoryMethodLinear = undefined;\nBooleanKeyframeTrack.prototype.InterpolantFactoryMethodSmooth = undefined;\n\n/**\n * A Track of keyframe values that represent color.\n */\nclass ColorKeyframeTrack extends KeyframeTrack {}\n\nColorKeyframeTrack.prototype.ValueTypeName = 'color';\n\n/**\n * A Track of numeric keyframe values.\n */\nclass NumberKeyframeTrack extends KeyframeTrack {}\n\nNumberKeyframeTrack.prototype.ValueTypeName = 'number';\n\n/**\n * Spherical linear unit quaternion interpolant.\n */\n\nclass QuaternionLinearInterpolant extends Interpolant {\n\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tinterpolate_( i1, t0, t, t1 ) {\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\n\t\t\talpha = ( t - t0 ) / ( t1 - t0 );\n\n\t\tlet offset = i1 * stride;\n\n\t\tfor ( let end = offset + stride; offset !== end; offset += 4 ) {\n\n\t\t\tQuaternion.slerpFlat( result, 0, values, offset - stride, values, offset, alpha );\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n}\n\n/**\n * A Track of quaternion keyframe values.\n */\nclass QuaternionKeyframeTrack extends KeyframeTrack {\n\n\tInterpolantFactoryMethodLinear( result ) {\n\n\t\treturn new QuaternionLinearInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t}\n\n}\n\nQuaternionKeyframeTrack.prototype.ValueTypeName = 'quaternion';\n// ValueBufferType is inherited\nQuaternionKeyframeTrack.prototype.DefaultInterpolation = InterpolateLinear;\nQuaternionKeyframeTrack.prototype.InterpolantFactoryMethodSmooth = undefined;\n\n/**\n * A Track that interpolates Strings\n */\nclass StringKeyframeTrack extends KeyframeTrack {}\n\nStringKeyframeTrack.prototype.ValueTypeName = 'string';\nStringKeyframeTrack.prototype.ValueBufferType = Array;\nStringKeyframeTrack.prototype.DefaultInterpolation = InterpolateDiscrete;\nStringKeyframeTrack.prototype.InterpolantFactoryMethodLinear = undefined;\nStringKeyframeTrack.prototype.InterpolantFactoryMethodSmooth = undefined;\n\n/**\n * A Track of vectored keyframe values.\n */\nclass VectorKeyframeTrack extends KeyframeTrack {}\n\nVectorKeyframeTrack.prototype.ValueTypeName = 'vector';\n\nclass AnimationClip {\n\n\tconstructor( name, duration = - 1, tracks, blendMode = NormalAnimationBlendMode ) {\n\n\t\tthis.name = name;\n\t\tthis.tracks = tracks;\n\t\tthis.duration = duration;\n\t\tthis.blendMode = blendMode;\n\n\t\tthis.uuid = 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}\n\n\n\tstatic parse( json ) {\n\n\t\tconst tracks = [],\n\t\t\tjsonTracks = json.tracks,\n\t\t\tframeTime = 1.0 / ( json.fps || 1.0 );\n\n\t\tfor ( let i = 0, n = jsonTracks.length; i !== n; ++ i ) {\n\n\t\t\ttracks.push( parseKeyframeTrack( jsonTracks[ i ] ).scale( frameTime ) );\n\n\t\t}\n\n\t\tconst clip = new this( json.name, json.duration, tracks, json.blendMode );\n\t\tclip.uuid = json.uuid;\n\n\t\treturn clip;\n\n\t}\n\n\tstatic toJSON( clip ) {\n\n\t\tconst tracks = [],\n\t\t\tclipTracks = clip.tracks;\n\n\t\tconst json = {\n\n\t\t\t'name': clip.name,\n\t\t\t'duration': clip.duration,\n\t\t\t'tracks': tracks,\n\t\t\t'uuid': clip.uuid,\n\t\t\t'blendMode': clip.blendMode\n\n\t\t};\n\n\t\tfor ( let i = 0, n = clipTracks.length; i !== n; ++ i ) {\n\n\t\t\ttracks.push( KeyframeTrack.toJSON( clipTracks[ i ] ) );\n\n\t\t}\n\n\t\treturn json;\n\n\t}\n\n\tstatic CreateFromMorphTargetSequence( name, morphTargetSequence, fps, noLoop ) {\n\n\t\tconst numMorphTargets = morphTargetSequence.length;\n\t\tconst tracks = [];\n\n\t\tfor ( let i = 0; i < numMorphTargets; i ++ ) {\n\n\t\t\tlet times = [];\n\t\t\tlet values = [];\n\n\t\t\ttimes.push(\n\t\t\t\t( i + numMorphTargets - 1 ) % numMorphTargets,\n\t\t\t\ti,\n\t\t\t\t( i + 1 ) % numMorphTargets );\n\n\t\t\tvalues.push( 0, 1, 0 );\n\n\t\t\tconst order = getKeyframeOrder( times );\n\t\t\ttimes = sortedArray( times, 1, order );\n\t\t\tvalues = sortedArray( values, 1, order );\n\n\t\t\t// if there is a key at the first frame, duplicate it as the\n\t\t\t// last frame as well for perfect loop.\n\t\t\tif ( ! noLoop && times[ 0 ] === 0 ) {\n\n\t\t\t\ttimes.push( numMorphTargets );\n\t\t\t\tvalues.push( values[ 0 ] );\n\n\t\t\t}\n\n\t\t\ttracks.push(\n\t\t\t\tnew NumberKeyframeTrack(\n\t\t\t\t\t'.morphTargetInfluences[' + morphTargetSequence[ i ].name + ']',\n\t\t\t\t\ttimes, values\n\t\t\t\t).scale( 1.0 / fps ) );\n\n\t\t}\n\n\t\treturn new this( name, - 1, tracks );\n\n\t}\n\n\tstatic findByName( objectOrClipArray, name ) {\n\n\t\tlet clipArray = objectOrClipArray;\n\n\t\tif ( ! Array.isArray( objectOrClipArray ) ) {\n\n\t\t\tconst o = objectOrClipArray;\n\t\t\tclipArray = o.geometry && o.geometry.animations || o.animations;\n\n\t\t}\n\n\t\tfor ( let i = 0; i < clipArray.length; i ++ ) {\n\n\t\t\tif ( clipArray[ i ].name === name ) {\n\n\t\t\t\treturn clipArray[ i ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\tstatic CreateClipsFromMorphTargetSequences( morphTargets, fps, noLoop ) {\n\n\t\tconst animationToMorphTargets = {};\n\n\t\t// tested with https://regex101.com/ on trick sequences\n\t\t// such flamingo_flyA_003, flamingo_run1_003, crdeath0059\n\t\tconst pattern = /^([\\w-]*?)([\\d]+)$/;\n\n\t\t// sort morph target names into animation groups based\n\t\t// patterns like Walk_001, Walk_002, Run_001, Run_002\n\t\tfor ( let i = 0, il = morphTargets.length; i < il; i ++ ) {\n\n\t\t\tconst morphTarget = morphTargets[ i ];\n\t\t\tconst parts = morphTarget.name.match( pattern );\n\n\t\t\tif ( parts && parts.length > 1 ) {\n\n\t\t\t\tconst name = parts[ 1 ];\n\n\t\t\t\tlet animationMorphTargets = animationToMorphTargets[ name ];\n\n\t\t\t\tif ( ! animationMorphTargets ) {\n\n\t\t\t\t\tanimationToMorphTargets[ name ] = animationMorphTargets = [];\n\n\t\t\t\t}\n\n\t\t\t\tanimationMorphTargets.push( morphTarget );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst clips = [];\n\n\t\tfor ( const name in animationToMorphTargets ) {\n\n\t\t\tclips.push( this.CreateFromMorphTargetSequence( name, animationToMorphTargets[ name ], fps, noLoop ) );\n\n\t\t}\n\n\t\treturn clips;\n\n\t}\n\n\t// parse the animation.hierarchy format\n\tstatic parseAnimation( animation, bones ) {\n\n\t\tif ( ! animation ) {\n\n\t\t\tconsole.error( 'THREE.AnimationClip: No animation in JSONLoader data.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst addNonemptyTrack = function ( trackType, trackName, animationKeys, propertyName, destTracks ) {\n\n\t\t\t// only return track if there are actually keys.\n\t\t\tif ( animationKeys.length !== 0 ) {\n\n\t\t\t\tconst times = [];\n\t\t\t\tconst values = [];\n\n\t\t\t\tflattenJSON( animationKeys, times, values, propertyName );\n\n\t\t\t\t// empty keys are filtered out, so check again\n\t\t\t\tif ( times.length !== 0 ) {\n\n\t\t\t\t\tdestTracks.push( new trackType( trackName, times, values ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\tconst tracks = [];\n\n\t\tconst clipName = animation.name || 'default';\n\t\tconst fps = animation.fps || 30;\n\t\tconst blendMode = animation.blendMode;\n\n\t\t// automatic length determination in AnimationClip.\n\t\tlet duration = animation.length || - 1;\n\n\t\tconst hierarchyTracks = animation.hierarchy || [];\n\n\t\tfor ( let h = 0; h < hierarchyTracks.length; h ++ ) {\n\n\t\t\tconst animationKeys = hierarchyTracks[ h ].keys;\n\n\t\t\t// skip empty tracks\n\t\t\tif ( ! animationKeys || animationKeys.length === 0 ) continue;\n\n\t\t\t// process morph targets\n\t\t\tif ( animationKeys[ 0 ].morphTargets ) {\n\n\t\t\t\t// figure out all morph targets used in this track\n\t\t\t\tconst morphTargetNames = {};\n\n\t\t\t\tlet k;\n\n\t\t\t\tfor ( k = 0; k < animationKeys.length; k ++ ) {\n\n\t\t\t\t\tif ( animationKeys[ k ].morphTargets ) {\n\n\t\t\t\t\t\tfor ( let m = 0; m < animationKeys[ k ].morphTargets.length; m ++ ) {\n\n\t\t\t\t\t\t\tmorphTargetNames[ animationKeys[ k ].morphTargets[ m ] ] = - 1;\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\t// create a track for each morph target with all zero\n\t\t\t\t// morphTargetInfluences except for the keys in which\n\t\t\t\t// the morphTarget is named.\n\t\t\t\tfor ( const morphTargetName in morphTargetNames ) {\n\n\t\t\t\t\tconst times = [];\n\t\t\t\t\tconst values = [];\n\n\t\t\t\t\tfor ( let m = 0; m !== animationKeys[ k ].morphTargets.length; ++ m ) {\n\n\t\t\t\t\t\tconst animationKey = animationKeys[ k ];\n\n\t\t\t\t\t\ttimes.push( animationKey.time );\n\t\t\t\t\t\tvalues.push( ( animationKey.morphTarget === morphTargetName ) ? 1 : 0 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttracks.push( new NumberKeyframeTrack( '.morphTargetInfluence[' + morphTargetName + ']', times, values ) );\n\n\t\t\t\t}\n\n\t\t\t\tduration = morphTargetNames.length * fps;\n\n\t\t\t} else {\n\n\t\t\t\t// ...assume skeletal animation\n\n\t\t\t\tconst boneName = '.bones[' + bones[ h ].name + ']';\n\n\t\t\t\taddNonemptyTrack(\n\t\t\t\t\tVectorKeyframeTrack, boneName + '.position',\n\t\t\t\t\tanimationKeys, 'pos', tracks );\n\n\t\t\t\taddNonemptyTrack(\n\t\t\t\t\tQuaternionKeyframeTrack, boneName + '.quaternion',\n\t\t\t\t\tanimationKeys, 'rot', tracks );\n\n\t\t\t\taddNonemptyTrack(\n\t\t\t\t\tVectorKeyframeTrack, boneName + '.scale',\n\t\t\t\t\tanimationKeys, 'scl', tracks );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( tracks.length === 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst clip = new this( clipName, duration, tracks, blendMode );\n\n\t\treturn clip;\n\n\t}\n\n\tresetDuration() {\n\n\t\tconst tracks = this.tracks;\n\t\tlet duration = 0;\n\n\t\tfor ( let i = 0, n = tracks.length; i !== n; ++ i ) {\n\n\t\t\tconst track = this.tracks[ i ];\n\n\t\t\tduration = Math.max( duration, track.times[ track.times.length - 1 ] );\n\n\t\t}\n\n\t\tthis.duration = duration;\n\n\t\treturn this;\n\n\t}\n\n\ttrim() {\n\n\t\tfor ( let i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\tthis.tracks[ i ].trim( 0, this.duration );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tvalidate() {\n\n\t\tlet valid = true;\n\n\t\tfor ( let i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\tvalid = valid && this.tracks[ i ].validate();\n\n\t\t}\n\n\t\treturn valid;\n\n\t}\n\n\toptimize() {\n\n\t\tfor ( let i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\tthis.tracks[ i ].optimize();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\tconst tracks = [];\n\n\t\tfor ( let i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\ttracks.push( this.tracks[ i ].clone() );\n\n\t\t}\n\n\t\treturn new this.constructor( this.name, this.duration, tracks, this.blendMode );\n\n\t}\n\n\ttoJSON() {\n\n\t\treturn this.constructor.toJSON( this );\n\n\t}\n\n}\n\nfunction getTrackTypeForValueTypeName( typeName ) {\n\n\tswitch ( typeName.toLowerCase() ) {\n\n\t\tcase 'scalar':\n\t\tcase 'double':\n\t\tcase 'float':\n\t\tcase 'number':\n\t\tcase 'integer':\n\n\t\t\treturn NumberKeyframeTrack;\n\n\t\tcase 'vector':\n\t\tcase 'vector2':\n\t\tcase 'vector3':\n\t\tcase 'vector4':\n\n\t\t\treturn VectorKeyframeTrack;\n\n\t\tcase 'color':\n\n\t\t\treturn ColorKeyframeTrack;\n\n\t\tcase 'quaternion':\n\n\t\t\treturn QuaternionKeyframeTrack;\n\n\t\tcase 'bool':\n\t\tcase 'boolean':\n\n\t\t\treturn BooleanKeyframeTrack;\n\n\t\tcase 'string':\n\n\t\t\treturn StringKeyframeTrack;\n\n\t}\n\n\tthrow new Error( 'THREE.KeyframeTrack: Unsupported typeName: ' + typeName );\n\n}\n\nfunction parseKeyframeTrack( json ) {\n\n\tif ( json.type === undefined ) {\n\n\t\tthrow new Error( 'THREE.KeyframeTrack: track type undefined, can not parse' );\n\n\t}\n\n\tconst trackType = getTrackTypeForValueTypeName( json.type );\n\n\tif ( json.times === undefined ) {\n\n\t\tconst times = [], values = [];\n\n\t\tflattenJSON( json.keys, times, values, 'value' );\n\n\t\tjson.times = times;\n\t\tjson.values = values;\n\n\t}\n\n\t// derived classes can define a static parse method\n\tif ( trackType.parse !== undefined ) {\n\n\t\treturn trackType.parse( json );\n\n\t} else {\n\n\t\t// by default, we assume a constructor compatible with the base\n\t\treturn new trackType( json.name, json.times, json.values, json.interpolation );\n\n\t}\n\n}\n\nconst Cache = {\n\n\tenabled: false,\n\n\tfiles: {},\n\n\tadd: function ( key, file ) {\n\n\t\tif ( this.enabled === false ) return;\n\n\t\t// console.log( 'THREE.Cache', 'Adding key:', key );\n\n\t\tthis.files[ key ] = file;\n\n\t},\n\n\tget: function ( key ) {\n\n\t\tif ( this.enabled === false ) return;\n\n\t\t// console.log( 'THREE.Cache', 'Checking key:', key );\n\n\t\treturn this.files[ key ];\n\n\t},\n\n\tremove: function ( key ) {\n\n\t\tdelete this.files[ key ];\n\n\t},\n\n\tclear: function () {\n\n\t\tthis.files = {};\n\n\t}\n\n};\n\nclass LoadingManager {\n\n\tconstructor( onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tlet isLoading = false;\n\t\tlet itemsLoaded = 0;\n\t\tlet itemsTotal = 0;\n\t\tlet urlModifier = undefined;\n\t\tconst handlers = [];\n\n\t\t// Refer to #5689 for the reason why we don't set .onStart\n\t\t// in the constructor\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\tthis.resolveURL = function ( url ) {\n\n\t\t\tif ( urlModifier ) {\n\n\t\t\t\treturn urlModifier( url );\n\n\t\t\t}\n\n\t\t\treturn url;\n\n\t\t};\n\n\t\tthis.setURLModifier = function ( transform ) {\n\n\t\t\turlModifier = transform;\n\n\t\t\treturn this;\n\n\t\t};\n\n\t\tthis.addHandler = function ( regex, loader ) {\n\n\t\t\thandlers.push( regex, loader );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t\tthis.removeHandler = function ( regex ) {\n\n\t\t\tconst index = handlers.indexOf( regex );\n\n\t\t\tif ( index !== - 1 ) {\n\n\t\t\t\thandlers.splice( index, 2 );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t};\n\n\t\tthis.getHandler = function ( file ) {\n\n\t\t\tfor ( let i = 0, l = handlers.length; i < l; i += 2 ) {\n\n\t\t\t\tconst regex = handlers[ i ];\n\t\t\t\tconst loader = handlers[ i + 1 ];\n\n\t\t\t\tif ( regex.global ) regex.lastIndex = 0; // see #17920\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}\n\nconst DefaultLoadingManager = /*@__PURE__*/ new LoadingManager();\n\nclass Loader {\n\n\tconstructor( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t\tthis.crossOrigin = 'anonymous';\n\t\tthis.withCredentials = false;\n\t\tthis.path = '';\n\t\tthis.resourcePath = '';\n\t\tthis.requestHeader = {};\n\n\t}\n\n\tload( /* url, onLoad, onProgress, onError */ ) {}\n\n\tloadAsync( url, onProgress ) {\n\n\t\tconst scope = this;\n\n\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\tscope.load( url, resolve, onProgress, reject );\n\n\t\t} );\n\n\t}\n\n\tparse( /* data */ ) {}\n\n\tsetCrossOrigin( crossOrigin ) {\n\n\t\tthis.crossOrigin = crossOrigin;\n\t\treturn this;\n\n\t}\n\n\tsetWithCredentials( value ) {\n\n\t\tthis.withCredentials = value;\n\t\treturn this;\n\n\t}\n\n\tsetPath( path ) {\n\n\t\tthis.path = path;\n\t\treturn this;\n\n\t}\n\n\tsetResourcePath( resourcePath ) {\n\n\t\tthis.resourcePath = resourcePath;\n\t\treturn this;\n\n\t}\n\n\tsetRequestHeader( requestHeader ) {\n\n\t\tthis.requestHeader = requestHeader;\n\t\treturn this;\n\n\t}\n\n}\n\nconst loading = {};\n\nclass HttpError extends Error {\n\n\tconstructor( message, response ) {\n\n\t\tsuper( message );\n\t\tthis.response = response;\n\n\t}\n\n}\n\nclass FileLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tif ( url === undefined ) url = '';\n\n\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\turl = this.manager.resolveURL( url );\n\n\t\tconst cached = Cache.get( url );\n\n\t\tif ( cached !== undefined ) {\n\n\t\t\tthis.manager.itemStart( url );\n\n\t\t\tsetTimeout( () => {\n\n\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\tthis.manager.itemEnd( url );\n\n\t\t\t}, 0 );\n\n\t\t\treturn cached;\n\n\t\t}\n\n\t\t// Check if request is duplicate\n\n\t\tif ( loading[ url ] !== undefined ) {\n\n\t\t\tloading[ url ].push( {\n\n\t\t\t\tonLoad: onLoad,\n\t\t\t\tonProgress: onProgress,\n\t\t\t\tonError: onError\n\n\t\t\t} );\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t// Initialise array for duplicate requests\n\t\tloading[ url ] = [];\n\n\t\tloading[ url ].push( {\n\t\t\tonLoad: onLoad,\n\t\t\tonProgress: onProgress,\n\t\t\tonError: onError,\n\t\t} );\n\n\t\t// create request\n\t\tconst req = new Request( url, {\n\t\t\theaders: new Headers( this.requestHeader ),\n\t\t\tcredentials: this.withCredentials ? 'include' : 'same-origin',\n\t\t\t// An abort controller could be added within a future PR\n\t\t} );\n\n\t\t// record states ( avoid data race )\n\t\tconst mimeType = this.mimeType;\n\t\tconst responseType = this.responseType;\n\n\t\t// start the fetch\n\t\tfetch( req )\n\t\t\t.then( response => {\n\n\t\t\t\tif ( response.status === 200 || response.status === 0 ) {\n\n\t\t\t\t\t// Some browsers return HTTP Status 0 when using non-http protocol\n\t\t\t\t\t// e.g. 'file://' or 'data://'. Handle as success.\n\n\t\t\t\t\tif ( response.status === 0 ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.FileLoader: HTTP Status 0 received.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Workaround: Checking if response.body === undefined for Alipay browser #23548\n\n\t\t\t\t\tif ( typeof ReadableStream === 'undefined' || response.body === undefined || response.body.getReader === undefined ) {\n\n\t\t\t\t\t\treturn response;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst callbacks = loading[ url ];\n\t\t\t\t\tconst reader = response.body.getReader();\n\t\t\t\t\tconst contentLength = response.headers.get( 'Content-Length' );\n\t\t\t\t\tconst total = contentLength ? parseInt( contentLength ) : 0;\n\t\t\t\t\tconst lengthComputable = total !== 0;\n\t\t\t\t\tlet loaded = 0;\n\n\t\t\t\t\t// periodically read data into the new stream tracking while download progress\n\t\t\t\t\tconst stream = new ReadableStream( {\n\t\t\t\t\t\tstart( controller ) {\n\n\t\t\t\t\t\t\treadData();\n\n\t\t\t\t\t\t\tfunction readData() {\n\n\t\t\t\t\t\t\t\treader.read().then( ( { done, value } ) => {\n\n\t\t\t\t\t\t\t\t\tif ( done ) {\n\n\t\t\t\t\t\t\t\t\t\tcontroller.close();\n\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\tloaded += value.byteLength;\n\n\t\t\t\t\t\t\t\t\t\tconst event = new ProgressEvent( 'progress', { lengthComputable, loaded, total } );\n\t\t\t\t\t\t\t\t\t\tfor ( let i = 0, il = callbacks.length; i < il; i ++ ) {\n\n\t\t\t\t\t\t\t\t\t\t\tconst callback = callbacks[ i ];\n\t\t\t\t\t\t\t\t\t\t\tif ( callback.onProgress ) callback.onProgress( event );\n\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tcontroller.enqueue( value );\n\t\t\t\t\t\t\t\t\t\treadData();\n\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}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} );\n\n\t\t\t\t\treturn new Response( stream );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new HttpError( `fetch for \"${response.url}\" responded with ${response.status}: ${response.statusText}`, response );\n\n\t\t\t\t}\n\n\t\t\t} )\n\t\t\t.then( response => {\n\n\t\t\t\tswitch ( responseType ) {\n\n\t\t\t\t\tcase 'arraybuffer':\n\n\t\t\t\t\t\treturn response.arrayBuffer();\n\n\t\t\t\t\tcase 'blob':\n\n\t\t\t\t\t\treturn response.blob();\n\n\t\t\t\t\tcase 'document':\n\n\t\t\t\t\t\treturn response.text()\n\t\t\t\t\t\t\t.then( text => {\n\n\t\t\t\t\t\t\t\tconst parser = new DOMParser();\n\t\t\t\t\t\t\t\treturn parser.parseFromString( text, mimeType );\n\n\t\t\t\t\t\t\t} );\n\n\t\t\t\t\tcase 'json':\n\n\t\t\t\t\t\treturn response.json();\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tif ( mimeType === undefined ) {\n\n\t\t\t\t\t\t\treturn response.text();\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// sniff encoding\n\t\t\t\t\t\t\tconst re = /charset=\"?([^;\"\\s]*)\"?/i;\n\t\t\t\t\t\t\tconst exec = re.exec( mimeType );\n\t\t\t\t\t\t\tconst label = exec && exec[ 1 ] ? exec[ 1 ].toLowerCase() : undefined;\n\t\t\t\t\t\t\tconst decoder = new TextDecoder( label );\n\t\t\t\t\t\t\treturn response.arrayBuffer().then( ab => decoder.decode( ab ) );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} )\n\t\t\t.then( data => {\n\n\t\t\t\t// Add to cache only on HTTP success, so that we do not cache\n\t\t\t\t// error response bodies as proper responses to requests.\n\t\t\t\tCache.add( url, data );\n\n\t\t\t\tconst callbacks = loading[ url ];\n\t\t\t\tdelete loading[ url ];\n\n\t\t\t\tfor ( let i = 0, il = callbacks.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst callback = callbacks[ i ];\n\t\t\t\t\tif ( callback.onLoad ) callback.onLoad( data );\n\n\t\t\t\t}\n\n\t\t\t} )\n\t\t\t.catch( err => {\n\n\t\t\t\t// Abort errors and other errors are handled the same\n\n\t\t\t\tconst callbacks = loading[ url ];\n\n\t\t\t\tif ( callbacks === undefined ) {\n\n\t\t\t\t\t// When onLoad was called and url was deleted in `loading`\n\t\t\t\t\tthis.manager.itemError( url );\n\t\t\t\t\tthrow err;\n\n\t\t\t\t}\n\n\t\t\t\tdelete loading[ url ];\n\n\t\t\t\tfor ( let i = 0, il = callbacks.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst callback = callbacks[ i ];\n\t\t\t\t\tif ( callback.onError ) callback.onError( err );\n\n\t\t\t\t}\n\n\t\t\t\tthis.manager.itemError( url );\n\n\t\t\t} )\n\t\t\t.finally( () => {\n\n\t\t\t\tthis.manager.itemEnd( url );\n\n\t\t\t} );\n\n\t\tthis.manager.itemStart( url );\n\n\t}\n\n\tsetResponseType( value ) {\n\n\t\tthis.responseType = value;\n\t\treturn this;\n\n\t}\n\n\tsetMimeType( value ) {\n\n\t\tthis.mimeType = value;\n\t\treturn this;\n\n\t}\n\n}\n\nclass AnimationLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\tparse( json ) {\n\n\t\tconst animations = [];\n\n\t\tfor ( let i = 0; i < json.length; i ++ ) {\n\n\t\t\tconst clip = AnimationClip.parse( json[ i ] );\n\n\t\t\tanimations.push( clip );\n\n\t\t}\n\n\t\treturn animations;\n\n\t}\n\n}\n\n/**\n * Abstract Base class to block based textures loader (dds, pvr, ...)\n *\n * Sub classes have to implement the parse() method which will be used in load().\n */\n\nclass CompressedTextureLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst images = [];\n\n\t\tconst texture = new CompressedTexture();\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\n\t\tlet loaded = 0;\n\n\t\tfunction loadTexture( i ) {\n\n\t\t\tloader.load( url[ i ], function ( buffer ) {\n\n\t\t\t\tconst texDatas = scope.parse( buffer, true );\n\n\t\t\t\timages[ i ] = {\n\t\t\t\t\twidth: texDatas.width,\n\t\t\t\t\theight: texDatas.height,\n\t\t\t\t\tformat: texDatas.format,\n\t\t\t\t\tmipmaps: texDatas.mipmaps\n\t\t\t\t};\n\n\t\t\t\tloaded += 1;\n\n\t\t\t\tif ( loaded === 6 ) {\n\n\t\t\t\t\tif ( texDatas.mipmapCount === 1 ) texture.minFilter = LinearFilter;\n\n\t\t\t\t\ttexture.image = images;\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}\n\n\t\t\t}, onProgress, onError );\n\n\t\t}\n\n\t\tif ( Array.isArray( url ) ) {\n\n\t\t\tfor ( let i = 0, il = url.length; i < il; ++ i ) {\n\n\t\t\t\tloadTexture( i );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// compressed cubemap texture stored in a single DDS file\n\n\t\t\tloader.load( url, function ( buffer ) {\n\n\t\t\t\tconst texDatas = scope.parse( buffer, true );\n\n\t\t\t\tif ( texDatas.isCubemap ) {\n\n\t\t\t\t\tconst faces = texDatas.mipmaps.length / texDatas.mipmapCount;\n\n\t\t\t\t\tfor ( let f = 0; f < faces; f ++ ) {\n\n\t\t\t\t\t\timages[ f ] = { mipmaps: [] };\n\n\t\t\t\t\t\tfor ( let i = 0; i < texDatas.mipmapCount; i ++ ) {\n\n\t\t\t\t\t\t\timages[ f ].mipmaps.push( texDatas.mipmaps[ f * texDatas.mipmapCount + i ] );\n\t\t\t\t\t\t\timages[ f ].format = texDatas.format;\n\t\t\t\t\t\t\timages[ f ].width = texDatas.width;\n\t\t\t\t\t\t\timages[ f ].height = texDatas.height;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.image = images;\n\n\t\t\t\t} else {\n\n\t\t\t\t\ttexture.image.width = texDatas.width;\n\t\t\t\t\ttexture.image.height = texDatas.height;\n\t\t\t\t\ttexture.mipmaps = texDatas.mipmaps;\n\n\t\t\t\t}\n\n\t\t\t\tif ( texDatas.mipmapCount === 1 ) {\n\n\t\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t\t}\n\n\t\t\t\ttexture.format = texDatas.format;\n\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t}, onProgress, onError );\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n}\n\nclass ImageLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\turl = this.manager.resolveURL( url );\n\n\t\tconst scope = this;\n\n\t\tconst cached = Cache.get( url );\n\n\t\tif ( cached !== undefined ) {\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\tsetTimeout( function () {\n\n\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t}, 0 );\n\n\t\t\treturn cached;\n\n\t\t}\n\n\t\tconst image = createElementNS( 'img' );\n\n\t\tfunction onImageLoad() {\n\n\t\t\tremoveEventListeners();\n\n\t\t\tCache.add( url, this );\n\n\t\t\tif ( onLoad ) onLoad( this );\n\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t}\n\n\t\tfunction onImageError( event ) {\n\n\t\t\tremoveEventListeners();\n\n\t\t\tif ( onError ) onError( event );\n\n\t\t\tscope.manager.itemError( url );\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t}\n\n\t\tfunction removeEventListeners() {\n\n\t\t\timage.removeEventListener( 'load', onImageLoad, false );\n\t\t\timage.removeEventListener( 'error', onImageError, false );\n\n\t\t}\n\n\t\timage.addEventListener( 'load', onImageLoad, false );\n\t\timage.addEventListener( 'error', onImageError, false );\n\n\t\tif ( url.slice( 0, 5 ) !== 'data:' ) {\n\n\t\t\tif ( this.crossOrigin !== undefined ) image.crossOrigin = this.crossOrigin;\n\n\t\t}\n\n\t\tscope.manager.itemStart( url );\n\n\t\timage.src = url;\n\n\t\treturn image;\n\n\t}\n\n}\n\nclass CubeTextureLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( urls, onLoad, onProgress, onError ) {\n\n\t\tconst texture = new CubeTexture();\n\n\t\tconst loader = new ImageLoader( this.manager );\n\t\tloader.setCrossOrigin( this.crossOrigin );\n\t\tloader.setPath( this.path );\n\n\t\tlet loaded = 0;\n\n\t\tfunction loadTexture( i ) {\n\n\t\t\tloader.load( urls[ i ], function ( image ) {\n\n\t\t\t\ttexture.images[ i ] = image;\n\n\t\t\t\tloaded ++;\n\n\t\t\t\tif ( loaded === 6 ) {\n\n\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t}\n\n\t\t\t}, undefined, onError );\n\n\t\t}\n\n\t\tfor ( let i = 0; i < urls.length; ++ i ) {\n\n\t\t\tloadTexture( i );\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n}\n\n/**\n * Abstract Base class to load generic binary textures formats (rgbe, hdr, ...)\n *\n * Sub classes have to implement the parse() method which will be used in load().\n */\n\nclass DataTextureLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst texture = new DataTexture();\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setPath( this.path );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\t\tloader.load( url, function ( buffer ) {\n\n\t\t\tconst texData = scope.parse( buffer );\n\n\t\t\tif ( ! texData ) return;\n\n\t\t\tif ( texData.image !== undefined ) {\n\n\t\t\t\ttexture.image = texData.image;\n\n\t\t\t} else if ( texData.data !== undefined ) {\n\n\t\t\t\ttexture.image.width = texData.width;\n\t\t\t\ttexture.image.height = texData.height;\n\t\t\t\ttexture.image.data = texData.data;\n\n\t\t\t}\n\n\t\t\ttexture.wrapS = texData.wrapS !== undefined ? texData.wrapS : ClampToEdgeWrapping;\n\t\t\ttexture.wrapT = texData.wrapT !== undefined ? texData.wrapT : ClampToEdgeWrapping;\n\n\t\t\ttexture.magFilter = texData.magFilter !== undefined ? texData.magFilter : LinearFilter;\n\t\t\ttexture.minFilter = texData.minFilter !== undefined ? texData.minFilter : LinearFilter;\n\n\t\t\ttexture.anisotropy = texData.anisotropy !== undefined ? texData.anisotropy : 1;\n\n\t\t\tif ( texData.encoding !== undefined ) {\n\n\t\t\t\ttexture.encoding = texData.encoding;\n\n\t\t\t}\n\n\t\t\tif ( texData.flipY !== undefined ) {\n\n\t\t\t\ttexture.flipY = texData.flipY;\n\n\t\t\t}\n\n\t\t\tif ( texData.format !== undefined ) {\n\n\t\t\t\ttexture.format = texData.format;\n\n\t\t\t}\n\n\t\t\tif ( texData.type !== undefined ) {\n\n\t\t\t\ttexture.type = texData.type;\n\n\t\t\t}\n\n\t\t\tif ( texData.mipmaps !== undefined ) {\n\n\t\t\t\ttexture.mipmaps = texData.mipmaps;\n\t\t\t\ttexture.minFilter = LinearMipmapLinearFilter; // presumably...\n\n\t\t\t}\n\n\t\t\tif ( texData.mipmapCount === 1 ) {\n\n\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t}\n\n\t\t\tif ( texData.generateMipmaps !== undefined ) {\n\n\t\t\t\ttexture.generateMipmaps = texData.generateMipmaps;\n\n\t\t\t}\n\n\t\t\ttexture.needsUpdate = true;\n\n\t\t\tif ( onLoad ) onLoad( texture, texData );\n\n\t\t}, onProgress, onError );\n\n\n\t\treturn texture;\n\n\t}\n\n}\n\nclass TextureLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst texture = new Texture();\n\n\t\tconst loader = new ImageLoader( this.manager );\n\t\tloader.setCrossOrigin( this.crossOrigin );\n\t\tloader.setPath( this.path );\n\n\t\tloader.load( url, function ( image ) {\n\n\t\t\ttexture.image = image;\n\t\t\ttexture.needsUpdate = true;\n\n\t\t\tif ( onLoad !== undefined ) {\n\n\t\t\t\tonLoad( texture );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t\treturn texture;\n\n\t}\n\n}\n\nclass Light extends Object3D {\n\n\tconstructor( color, intensity = 1 ) {\n\n\t\tsuper();\n\n\t\tthis.isLight = true;\n\n\t\tthis.type = 'Light';\n\n\t\tthis.color = new Color( color );\n\t\tthis.intensity = intensity;\n\n\t}\n\n\tdispose() {\n\n\t\t// Empty here in base class; some subclasses override.\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.color.copy( source.color );\n\t\tthis.intensity = source.intensity;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.color = this.color.getHex();\n\t\tdata.object.intensity = this.intensity;\n\n\t\tif ( this.groundColor !== undefined ) data.object.groundColor = this.groundColor.getHex();\n\n\t\tif ( this.distance !== undefined ) data.object.distance = this.distance;\n\t\tif ( this.angle !== undefined ) data.object.angle = this.angle;\n\t\tif ( this.decay !== undefined ) data.object.decay = this.decay;\n\t\tif ( this.penumbra !== undefined ) data.object.penumbra = this.penumbra;\n\n\t\tif ( this.shadow !== undefined ) data.object.shadow = this.shadow.toJSON();\n\n\t\treturn data;\n\n\t}\n\n}\n\nclass HemisphereLight extends Light {\n\n\tconstructor( skyColor, groundColor, intensity ) {\n\n\t\tsuper( skyColor, intensity );\n\n\t\tthis.isHemisphereLight = true;\n\n\t\tthis.type = 'HemisphereLight';\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\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.groundColor.copy( source.groundColor );\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _projScreenMatrix$1 = /*@__PURE__*/ new Matrix4();\nconst _lightPositionWorld$1 = /*@__PURE__*/ new Vector3();\nconst _lookTarget$1 = /*@__PURE__*/ new Vector3();\n\nclass LightShadow {\n\n\tconstructor( camera ) {\n\n\t\tthis.camera = camera;\n\n\t\tthis.bias = 0;\n\t\tthis.normalBias = 0;\n\t\tthis.radius = 1;\n\t\tthis.blurSamples = 8;\n\n\t\tthis.mapSize = new Vector2( 512, 512 );\n\n\t\tthis.map = null;\n\t\tthis.mapPass = null;\n\t\tthis.matrix = new Matrix4();\n\n\t\tthis.autoUpdate = true;\n\t\tthis.needsUpdate = false;\n\n\t\tthis._frustum = new Frustum();\n\t\tthis._frameExtents = new Vector2( 1, 1 );\n\n\t\tthis._viewportCount = 1;\n\n\t\tthis._viewports = [\n\n\t\t\tnew Vector4( 0, 0, 1, 1 )\n\n\t\t];\n\n\t}\n\n\tgetViewportCount() {\n\n\t\treturn this._viewportCount;\n\n\t}\n\n\tgetFrustum() {\n\n\t\treturn this._frustum;\n\n\t}\n\n\tupdateMatrices( light ) {\n\n\t\tconst shadowCamera = this.camera;\n\t\tconst shadowMatrix = this.matrix;\n\n\t\t_lightPositionWorld$1.setFromMatrixPosition( light.matrixWorld );\n\t\tshadowCamera.position.copy( _lightPositionWorld$1 );\n\n\t\t_lookTarget$1.setFromMatrixPosition( light.target.matrixWorld );\n\t\tshadowCamera.lookAt( _lookTarget$1 );\n\t\tshadowCamera.updateMatrixWorld();\n\n\t\t_projScreenMatrix$1.multiplyMatrices( shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse );\n\t\tthis._frustum.setFromProjectionMatrix( _projScreenMatrix$1 );\n\n\t\tshadowMatrix.set(\n\t\t\t0.5, 0.0, 0.0, 0.5,\n\t\t\t0.0, 0.5, 0.0, 0.5,\n\t\t\t0.0, 0.0, 0.5, 0.5,\n\t\t\t0.0, 0.0, 0.0, 1.0\n\t\t);\n\n\t\tshadowMatrix.multiply( shadowCamera.projectionMatrix );\n\t\tshadowMatrix.multiply( shadowCamera.matrixWorldInverse );\n\n\t}\n\n\tgetViewport( viewportIndex ) {\n\n\t\treturn this._viewports[ viewportIndex ];\n\n\t}\n\n\tgetFrameExtents() {\n\n\t\treturn this._frameExtents;\n\n\t}\n\n\tdispose() {\n\n\t\tif ( this.map ) {\n\n\t\t\tthis.map.dispose();\n\n\t\t}\n\n\t\tif ( this.mapPass ) {\n\n\t\t\tthis.mapPass.dispose();\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.camera = source.camera.clone();\n\n\t\tthis.bias = source.bias;\n\t\tthis.radius = source.radius;\n\n\t\tthis.mapSize.copy( source.mapSize );\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst object = {};\n\n\t\tif ( this.bias !== 0 ) object.bias = this.bias;\n\t\tif ( this.normalBias !== 0 ) object.normalBias = this.normalBias;\n\t\tif ( this.radius !== 1 ) object.radius = this.radius;\n\t\tif ( this.mapSize.x !== 512 || this.mapSize.y !== 512 ) object.mapSize = this.mapSize.toArray();\n\n\t\tobject.camera = this.camera.toJSON( false ).object;\n\t\tdelete object.camera.matrix;\n\n\t\treturn object;\n\n\t}\n\n}\n\nclass SpotLightShadow extends LightShadow {\n\n\tconstructor() {\n\n\t\tsuper( new PerspectiveCamera( 50, 1, 0.5, 500 ) );\n\n\t\tthis.isSpotLightShadow = true;\n\n\t\tthis.focus = 1;\n\n\t}\n\n\tupdateMatrices( light ) {\n\n\t\tconst camera = this.camera;\n\n\t\tconst fov = RAD2DEG * 2 * light.angle * this.focus;\n\t\tconst aspect = this.mapSize.width / this.mapSize.height;\n\t\tconst far = light.distance || camera.far;\n\n\t\tif ( fov !== camera.fov || aspect !== camera.aspect || far !== camera.far ) {\n\n\t\t\tcamera.fov = fov;\n\t\t\tcamera.aspect = aspect;\n\t\t\tcamera.far = far;\n\t\t\tcamera.updateProjectionMatrix();\n\n\t\t}\n\n\t\tsuper.updateMatrices( light );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.focus = source.focus;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass SpotLight extends Light {\n\n\tconstructor( color, intensity, distance = 0, angle = Math.PI / 3, penumbra = 0, decay = 1 ) {\n\n\t\tsuper( color, intensity );\n\n\t\tthis.isSpotLight = true;\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\tthis.distance = distance;\n\t\tthis.angle = angle;\n\t\tthis.penumbra = penumbra;\n\t\tthis.decay = decay; // for physically correct lights, should be 2.\n\n\t\tthis.shadow = new SpotLightShadow();\n\n\t}\n\n\tget power() {\n\n\t\t// compute the light's luminous power (in lumens) from its intensity (in candela)\n\t\t// by convention for a spotlight, luminous power (lm) = π * luminous intensity (cd)\n\t\treturn this.intensity * Math.PI;\n\n\t}\n\n\tset power( power ) {\n\n\t\t// set the light's intensity (in candela) from the desired luminous power (in lumens)\n\t\tthis.intensity = power / Math.PI;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.shadow.dispose();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.distance = source.distance;\n\t\tthis.angle = source.angle;\n\t\tthis.penumbra = source.penumbra;\n\t\tthis.decay = source.decay;\n\n\t\tthis.target = source.target.clone();\n\n\t\tthis.shadow = source.shadow.clone();\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _projScreenMatrix = /*@__PURE__*/ new Matrix4();\nconst _lightPositionWorld = /*@__PURE__*/ new Vector3();\nconst _lookTarget = /*@__PURE__*/ new Vector3();\n\nclass PointLightShadow extends LightShadow {\n\n\tconstructor() {\n\n\t\tsuper( new PerspectiveCamera( 90, 1, 0.5, 500 ) );\n\n\t\tthis.isPointLightShadow = true;\n\n\t\tthis._frameExtents = new Vector2( 4, 2 );\n\n\t\tthis._viewportCount = 6;\n\n\t\tthis._viewports = [\n\t\t\t// These viewports map a cube-map onto a 2D texture with the\n\t\t\t// following orientation:\n\t\t\t//\n\t\t\t// xzXZ\n\t\t\t// y Y\n\t\t\t//\n\t\t\t// X - Positive x direction\n\t\t\t// x - Negative x direction\n\t\t\t// Y - Positive y direction\n\t\t\t// y - Negative y direction\n\t\t\t// Z - Positive z direction\n\t\t\t// z - Negative z direction\n\n\t\t\t// positive X\n\t\t\tnew Vector4( 2, 1, 1, 1 ),\n\t\t\t// negative X\n\t\t\tnew Vector4( 0, 1, 1, 1 ),\n\t\t\t// positive Z\n\t\t\tnew Vector4( 3, 1, 1, 1 ),\n\t\t\t// negative Z\n\t\t\tnew Vector4( 1, 1, 1, 1 ),\n\t\t\t// positive Y\n\t\t\tnew Vector4( 3, 0, 1, 1 ),\n\t\t\t// negative Y\n\t\t\tnew Vector4( 1, 0, 1, 1 )\n\t\t];\n\n\t\tthis._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\tthis._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}\n\n\tupdateMatrices( light, viewportIndex = 0 ) {\n\n\t\tconst camera = this.camera;\n\t\tconst shadowMatrix = this.matrix;\n\n\t\tconst far = light.distance || camera.far;\n\n\t\tif ( far !== camera.far ) {\n\n\t\t\tcamera.far = far;\n\t\t\tcamera.updateProjectionMatrix();\n\n\t\t}\n\n\t\t_lightPositionWorld.setFromMatrixPosition( light.matrixWorld );\n\t\tcamera.position.copy( _lightPositionWorld );\n\n\t\t_lookTarget.copy( camera.position );\n\t\t_lookTarget.add( this._cubeDirections[ viewportIndex ] );\n\t\tcamera.up.copy( this._cubeUps[ viewportIndex ] );\n\t\tcamera.lookAt( _lookTarget );\n\t\tcamera.updateMatrixWorld();\n\n\t\tshadowMatrix.makeTranslation( - _lightPositionWorld.x, - _lightPositionWorld.y, - _lightPositionWorld.z );\n\n\t\t_projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );\n\t\tthis._frustum.setFromProjectionMatrix( _projScreenMatrix );\n\n\t}\n\n}\n\nclass PointLight extends Light {\n\n\tconstructor( color, intensity, distance = 0, decay = 1 ) {\n\n\t\tsuper( color, intensity );\n\n\t\tthis.isPointLight = true;\n\n\t\tthis.type = 'PointLight';\n\n\t\tthis.distance = distance;\n\t\tthis.decay = decay; // for physically correct lights, should be 2.\n\n\t\tthis.shadow = new PointLightShadow();\n\n\t}\n\n\tget power() {\n\n\t\t// compute the light's luminous power (in lumens) from its intensity (in candela)\n\t\t// for an isotropic light source, luminous power (lm) = 4 π luminous intensity (cd)\n\t\treturn this.intensity * 4 * Math.PI;\n\n\t}\n\n\tset power( power ) {\n\n\t\t// set the light's intensity (in candela) from the desired luminous power (in lumens)\n\t\tthis.intensity = power / ( 4 * Math.PI );\n\n\t}\n\n\tdispose() {\n\n\t\tthis.shadow.dispose();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.distance = source.distance;\n\t\tthis.decay = source.decay;\n\n\t\tthis.shadow = source.shadow.clone();\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass DirectionalLightShadow extends LightShadow {\n\n\tconstructor() {\n\n\t\tsuper( new OrthographicCamera( - 5, 5, 5, - 5, 0.5, 500 ) );\n\n\t\tthis.isDirectionalLightShadow = true;\n\n\t}\n\n}\n\nclass DirectionalLight extends Light {\n\n\tconstructor( color, intensity ) {\n\n\t\tsuper( color, intensity );\n\n\t\tthis.isDirectionalLight = true;\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\tdispose() {\n\n\t\tthis.shadow.dispose();\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.target = source.target.clone();\n\t\tthis.shadow = source.shadow.clone();\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass AmbientLight extends Light {\n\n\tconstructor( color, intensity ) {\n\n\t\tsuper( color, intensity );\n\n\t\tthis.isAmbientLight = true;\n\n\t\tthis.type = 'AmbientLight';\n\n\t}\n\n}\n\nclass RectAreaLight extends Light {\n\n\tconstructor( color, intensity, width = 10, height = 10 ) {\n\n\t\tsuper( color, intensity );\n\n\t\tthis.isRectAreaLight = true;\n\n\t\tthis.type = 'RectAreaLight';\n\n\t\tthis.width = width;\n\t\tthis.height = height;\n\n\t}\n\n\tget power() {\n\n\t\t// compute the light's luminous power (in lumens) from its intensity (in nits)\n\t\treturn this.intensity * this.width * this.height * Math.PI;\n\n\t}\n\n\tset power( power ) {\n\n\t\t// set the light's intensity (in nits) from the desired luminous power (in lumens)\n\t\tthis.intensity = power / ( this.width * this.height * Math.PI );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.width = source.width;\n\t\tthis.height = source.height;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.width = this.width;\n\t\tdata.object.height = this.height;\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * Primary reference:\n * https://graphics.stanford.edu/papers/envmap/envmap.pdf\n *\n * Secondary reference:\n * https://www.ppsloan.org/publications/StupidSH36.pdf\n */\n\n// 3-band SH defined by 9 coefficients\n\nclass SphericalHarmonics3 {\n\n\tconstructor() {\n\n\t\tthis.isSphericalHarmonics3 = true;\n\n\t\tthis.coefficients = [];\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients.push( new Vector3() );\n\n\t\t}\n\n\t}\n\n\tset( coefficients ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].copy( coefficients[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tzero() {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].set( 0, 0, 0 );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t// get the radiance in the direction of the normal\n\t// target is a Vector3\n\tgetAt( normal, target ) {\n\n\t\t// normal is assumed to be unit length\n\n\t\tconst x = normal.x, y = normal.y, z = normal.z;\n\n\t\tconst coeff = this.coefficients;\n\n\t\t// band 0\n\t\ttarget.copy( coeff[ 0 ] ).multiplyScalar( 0.282095 );\n\n\t\t// band 1\n\t\ttarget.addScaledVector( coeff[ 1 ], 0.488603 * y );\n\t\ttarget.addScaledVector( coeff[ 2 ], 0.488603 * z );\n\t\ttarget.addScaledVector( coeff[ 3 ], 0.488603 * x );\n\n\t\t// band 2\n\t\ttarget.addScaledVector( coeff[ 4 ], 1.092548 * ( x * y ) );\n\t\ttarget.addScaledVector( coeff[ 5 ], 1.092548 * ( y * z ) );\n\t\ttarget.addScaledVector( coeff[ 6 ], 0.315392 * ( 3.0 * z * z - 1.0 ) );\n\t\ttarget.addScaledVector( coeff[ 7 ], 1.092548 * ( x * z ) );\n\t\ttarget.addScaledVector( coeff[ 8 ], 0.546274 * ( x * x - y * y ) );\n\n\t\treturn target;\n\n\t}\n\n\t// get the irradiance (radiance convolved with cosine lobe) in the direction of the normal\n\t// target is a Vector3\n\t// https://graphics.stanford.edu/papers/envmap/envmap.pdf\n\tgetIrradianceAt( normal, target ) {\n\n\t\t// normal is assumed to be unit length\n\n\t\tconst x = normal.x, y = normal.y, z = normal.z;\n\n\t\tconst coeff = this.coefficients;\n\n\t\t// band 0\n\t\ttarget.copy( coeff[ 0 ] ).multiplyScalar( 0.886227 ); // π * 0.282095\n\n\t\t// band 1\n\t\ttarget.addScaledVector( coeff[ 1 ], 2.0 * 0.511664 * y ); // ( 2 * π / 3 ) * 0.488603\n\t\ttarget.addScaledVector( coeff[ 2 ], 2.0 * 0.511664 * z );\n\t\ttarget.addScaledVector( coeff[ 3 ], 2.0 * 0.511664 * x );\n\n\t\t// band 2\n\t\ttarget.addScaledVector( coeff[ 4 ], 2.0 * 0.429043 * x * y ); // ( π / 4 ) * 1.092548\n\t\ttarget.addScaledVector( coeff[ 5 ], 2.0 * 0.429043 * y * z );\n\t\ttarget.addScaledVector( coeff[ 6 ], 0.743125 * z * z - 0.247708 ); // ( π / 4 ) * 0.315392 * 3\n\t\ttarget.addScaledVector( coeff[ 7 ], 2.0 * 0.429043 * x * z );\n\t\ttarget.addScaledVector( coeff[ 8 ], 0.429043 * ( x * x - y * y ) ); // ( π / 4 ) * 0.546274\n\n\t\treturn target;\n\n\t}\n\n\tadd( sh ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].add( sh.coefficients[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\taddScaledSH( sh, s ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].addScaledVector( sh.coefficients[ i ], s );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tscale( s ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].multiplyScalar( s );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tlerp( sh, alpha ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].lerp( sh.coefficients[ i ], alpha );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tequals( sh ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tif ( ! this.coefficients[ i ].equals( sh.coefficients[ i ] ) ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tcopy( sh ) {\n\n\t\treturn this.set( sh.coefficients );\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tconst coefficients = this.coefficients;\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tcoefficients[ i ].fromArray( array, offset + ( i * 3 ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tconst coefficients = this.coefficients;\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tcoefficients[ i ].toArray( array, offset + ( i * 3 ) );\n\n\t\t}\n\n\t\treturn array;\n\n\t}\n\n\t// evaluate the basis functions\n\t// shBasis is an Array[ 9 ]\n\tstatic getBasisAt( normal, shBasis ) {\n\n\t\t// normal is assumed to be unit length\n\n\t\tconst x = normal.x, y = normal.y, z = normal.z;\n\n\t\t// band 0\n\t\tshBasis[ 0 ] = 0.282095;\n\n\t\t// band 1\n\t\tshBasis[ 1 ] = 0.488603 * y;\n\t\tshBasis[ 2 ] = 0.488603 * z;\n\t\tshBasis[ 3 ] = 0.488603 * x;\n\n\t\t// band 2\n\t\tshBasis[ 4 ] = 1.092548 * x * y;\n\t\tshBasis[ 5 ] = 1.092548 * y * z;\n\t\tshBasis[ 6 ] = 0.315392 * ( 3 * z * z - 1 );\n\t\tshBasis[ 7 ] = 1.092548 * x * z;\n\t\tshBasis[ 8 ] = 0.546274 * ( x * x - y * y );\n\n\t}\n\n}\n\nclass LightProbe extends Light {\n\n\tconstructor( sh = new SphericalHarmonics3(), intensity = 1 ) {\n\n\t\tsuper( undefined, intensity );\n\n\t\tthis.isLightProbe = true;\n\n\t\tthis.sh = sh;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.sh.copy( source.sh );\n\n\t\treturn this;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tthis.intensity = json.intensity; // TODO: Move this bit to Light.fromJSON();\n\t\tthis.sh.fromArray( json.sh );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.sh = this.sh.toArray();\n\n\t\treturn data;\n\n\t}\n\n}\n\nclass MaterialLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\t\tthis.textures = {};\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( scope.manager );\n\t\tloader.setPath( scope.path );\n\t\tloader.setRequestHeader( scope.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\tparse( json ) {\n\n\t\tconst textures = this.textures;\n\n\t\tfunction getTexture( name ) {\n\n\t\t\tif ( textures[ name ] === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.MaterialLoader: Undefined texture', name );\n\n\t\t\t}\n\n\t\t\treturn textures[ name ];\n\n\t\t}\n\n\t\tconst material = MaterialLoader.createMaterialFromType( json.type );\n\n\t\tif ( json.uuid !== undefined ) material.uuid = json.uuid;\n\t\tif ( json.name !== undefined ) material.name = json.name;\n\t\tif ( json.color !== undefined && material.color !== undefined ) material.color.setHex( json.color );\n\t\tif ( json.roughness !== undefined ) material.roughness = json.roughness;\n\t\tif ( json.metalness !== undefined ) material.metalness = json.metalness;\n\t\tif ( json.sheen !== undefined ) material.sheen = json.sheen;\n\t\tif ( json.sheenColor !== undefined ) material.sheenColor = new Color().setHex( json.sheenColor );\n\t\tif ( json.sheenRoughness !== undefined ) material.sheenRoughness = json.sheenRoughness;\n\t\tif ( json.emissive !== undefined && material.emissive !== undefined ) material.emissive.setHex( json.emissive );\n\t\tif ( json.specular !== undefined && material.specular !== undefined ) material.specular.setHex( json.specular );\n\t\tif ( json.specularIntensity !== undefined ) material.specularIntensity = json.specularIntensity;\n\t\tif ( json.specularColor !== undefined && material.specularColor !== undefined ) material.specularColor.setHex( json.specularColor );\n\t\tif ( json.shininess !== undefined ) material.shininess = json.shininess;\n\t\tif ( json.clearcoat !== undefined ) material.clearcoat = json.clearcoat;\n\t\tif ( json.clearcoatRoughness !== undefined ) material.clearcoatRoughness = json.clearcoatRoughness;\n\t\tif ( json.iridescence !== undefined ) material.iridescence = json.iridescence;\n\t\tif ( json.iridescenceIOR !== undefined ) material.iridescenceIOR = json.iridescenceIOR;\n\t\tif ( json.iridescenceThicknessRange !== undefined ) material.iridescenceThicknessRange = json.iridescenceThicknessRange;\n\t\tif ( json.transmission !== undefined ) material.transmission = json.transmission;\n\t\tif ( json.thickness !== undefined ) material.thickness = json.thickness;\n\t\tif ( json.attenuationDistance !== undefined ) material.attenuationDistance = json.attenuationDistance;\n\t\tif ( json.attenuationColor !== undefined && material.attenuationColor !== undefined ) material.attenuationColor.setHex( json.attenuationColor );\n\t\tif ( json.fog !== undefined ) material.fog = json.fog;\n\t\tif ( json.flatShading !== undefined ) material.flatShading = json.flatShading;\n\t\tif ( json.blending !== undefined ) material.blending = json.blending;\n\t\tif ( json.combine !== undefined ) material.combine = json.combine;\n\t\tif ( json.side !== undefined ) material.side = json.side;\n\t\tif ( json.shadowSide !== undefined ) material.shadowSide = json.shadowSide;\n\t\tif ( json.opacity !== undefined ) material.opacity = json.opacity;\n\t\tif ( json.transparent !== undefined ) material.transparent = json.transparent;\n\t\tif ( json.alphaTest !== undefined ) material.alphaTest = json.alphaTest;\n\t\tif ( json.depthTest !== undefined ) material.depthTest = json.depthTest;\n\t\tif ( json.depthWrite !== undefined ) material.depthWrite = json.depthWrite;\n\t\tif ( json.colorWrite !== undefined ) material.colorWrite = json.colorWrite;\n\n\t\tif ( json.stencilWrite !== undefined ) material.stencilWrite = json.stencilWrite;\n\t\tif ( json.stencilWriteMask !== undefined ) material.stencilWriteMask = json.stencilWriteMask;\n\t\tif ( json.stencilFunc !== undefined ) material.stencilFunc = json.stencilFunc;\n\t\tif ( json.stencilRef !== undefined ) material.stencilRef = json.stencilRef;\n\t\tif ( json.stencilFuncMask !== undefined ) material.stencilFuncMask = json.stencilFuncMask;\n\t\tif ( json.stencilFail !== undefined ) material.stencilFail = json.stencilFail;\n\t\tif ( json.stencilZFail !== undefined ) material.stencilZFail = json.stencilZFail;\n\t\tif ( json.stencilZPass !== undefined ) material.stencilZPass = json.stencilZPass;\n\n\t\tif ( json.wireframe !== undefined ) material.wireframe = json.wireframe;\n\t\tif ( json.wireframeLinewidth !== undefined ) material.wireframeLinewidth = json.wireframeLinewidth;\n\t\tif ( json.wireframeLinecap !== undefined ) material.wireframeLinecap = json.wireframeLinecap;\n\t\tif ( json.wireframeLinejoin !== undefined ) material.wireframeLinejoin = json.wireframeLinejoin;\n\n\t\tif ( json.rotation !== undefined ) material.rotation = json.rotation;\n\n\t\tif ( json.linewidth !== 1 ) material.linewidth = json.linewidth;\n\t\tif ( json.dashSize !== undefined ) material.dashSize = json.dashSize;\n\t\tif ( json.gapSize !== undefined ) material.gapSize = json.gapSize;\n\t\tif ( json.scale !== undefined ) material.scale = json.scale;\n\n\t\tif ( json.polygonOffset !== undefined ) material.polygonOffset = json.polygonOffset;\n\t\tif ( json.polygonOffsetFactor !== undefined ) material.polygonOffsetFactor = json.polygonOffsetFactor;\n\t\tif ( json.polygonOffsetUnits !== undefined ) material.polygonOffsetUnits = json.polygonOffsetUnits;\n\n\t\tif ( json.dithering !== undefined ) material.dithering = json.dithering;\n\n\t\tif ( json.alphaToCoverage !== undefined ) material.alphaToCoverage = json.alphaToCoverage;\n\t\tif ( json.premultipliedAlpha !== undefined ) material.premultipliedAlpha = json.premultipliedAlpha;\n\n\t\tif ( json.visible !== undefined ) material.visible = json.visible;\n\n\t\tif ( json.toneMapped !== undefined ) material.toneMapped = json.toneMapped;\n\n\t\tif ( json.userData !== undefined ) material.userData = json.userData;\n\n\t\tif ( json.vertexColors !== undefined ) {\n\n\t\t\tif ( typeof json.vertexColors === 'number' ) {\n\n\t\t\t\tmaterial.vertexColors = ( json.vertexColors > 0 ) ? true : false;\n\n\t\t\t} else {\n\n\t\t\t\tmaterial.vertexColors = json.vertexColors;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Shader Material\n\n\t\tif ( json.uniforms !== undefined ) {\n\n\t\t\tfor ( const name in json.uniforms ) {\n\n\t\t\t\tconst uniform = json.uniforms[ name ];\n\n\t\t\t\tmaterial.uniforms[ name ] = {};\n\n\t\t\t\tswitch ( uniform.type ) {\n\n\t\t\t\t\tcase 't':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = getTexture( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'c':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Color().setHex( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'v2':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Vector2().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'v3':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Vector3().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'v4':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Vector4().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'm3':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Matrix3().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'm4':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Matrix4().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = uniform.value;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( json.defines !== undefined ) material.defines = json.defines;\n\t\tif ( json.vertexShader !== undefined ) material.vertexShader = json.vertexShader;\n\t\tif ( json.fragmentShader !== undefined ) material.fragmentShader = json.fragmentShader;\n\n\t\tif ( json.extensions !== undefined ) {\n\n\t\t\tfor ( const key in json.extensions ) {\n\n\t\t\t\tmaterial.extensions[ key ] = json.extensions[ key ];\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Deprecated\n\n\t\tif ( json.shading !== undefined ) material.flatShading = json.shading === 1; // THREE.FlatShading\n\n\t\t// for PointsMaterial\n\n\t\tif ( json.size !== undefined ) material.size = json.size;\n\t\tif ( json.sizeAttenuation !== undefined ) material.sizeAttenuation = json.sizeAttenuation;\n\n\t\t// maps\n\n\t\tif ( json.map !== undefined ) material.map = getTexture( json.map );\n\t\tif ( json.matcap !== undefined ) material.matcap = getTexture( json.matcap );\n\n\t\tif ( json.alphaMap !== undefined ) material.alphaMap = getTexture( json.alphaMap );\n\n\t\tif ( json.bumpMap !== undefined ) material.bumpMap = getTexture( json.bumpMap );\n\t\tif ( json.bumpScale !== undefined ) material.bumpScale = json.bumpScale;\n\n\t\tif ( json.normalMap !== undefined ) material.normalMap = getTexture( json.normalMap );\n\t\tif ( json.normalMapType !== undefined ) material.normalMapType = json.normalMapType;\n\t\tif ( json.normalScale !== undefined ) {\n\n\t\t\tlet normalScale = json.normalScale;\n\n\t\t\tif ( Array.isArray( normalScale ) === false ) {\n\n\t\t\t\t// Blender exporter used to export a scalar. See #7459\n\n\t\t\t\tnormalScale = [ normalScale, normalScale ];\n\n\t\t\t}\n\n\t\t\tmaterial.normalScale = new Vector2().fromArray( normalScale );\n\n\t\t}\n\n\t\tif ( json.displacementMap !== undefined ) material.displacementMap = getTexture( json.displacementMap );\n\t\tif ( json.displacementScale !== undefined ) material.displacementScale = json.displacementScale;\n\t\tif ( json.displacementBias !== undefined ) material.displacementBias = json.displacementBias;\n\n\t\tif ( json.roughnessMap !== undefined ) material.roughnessMap = getTexture( json.roughnessMap );\n\t\tif ( json.metalnessMap !== undefined ) material.metalnessMap = getTexture( json.metalnessMap );\n\n\t\tif ( json.emissiveMap !== undefined ) material.emissiveMap = getTexture( json.emissiveMap );\n\t\tif ( json.emissiveIntensity !== undefined ) material.emissiveIntensity = json.emissiveIntensity;\n\n\t\tif ( json.specularMap !== undefined ) material.specularMap = getTexture( json.specularMap );\n\t\tif ( json.specularIntensityMap !== undefined ) material.specularIntensityMap = getTexture( json.specularIntensityMap );\n\t\tif ( json.specularColorMap !== undefined ) material.specularColorMap = getTexture( json.specularColorMap );\n\n\t\tif ( json.envMap !== undefined ) material.envMap = getTexture( json.envMap );\n\t\tif ( json.envMapIntensity !== undefined ) material.envMapIntensity = json.envMapIntensity;\n\n\t\tif ( json.reflectivity !== undefined ) material.reflectivity = json.reflectivity;\n\t\tif ( json.refractionRatio !== undefined ) material.refractionRatio = json.refractionRatio;\n\n\t\tif ( json.lightMap !== undefined ) material.lightMap = getTexture( json.lightMap );\n\t\tif ( json.lightMapIntensity !== undefined ) material.lightMapIntensity = json.lightMapIntensity;\n\n\t\tif ( json.aoMap !== undefined ) material.aoMap = getTexture( json.aoMap );\n\t\tif ( json.aoMapIntensity !== undefined ) material.aoMapIntensity = json.aoMapIntensity;\n\n\t\tif ( json.gradientMap !== undefined ) material.gradientMap = getTexture( json.gradientMap );\n\n\t\tif ( json.clearcoatMap !== undefined ) material.clearcoatMap = getTexture( json.clearcoatMap );\n\t\tif ( json.clearcoatRoughnessMap !== undefined ) material.clearcoatRoughnessMap = getTexture( json.clearcoatRoughnessMap );\n\t\tif ( json.clearcoatNormalMap !== undefined ) material.clearcoatNormalMap = getTexture( json.clearcoatNormalMap );\n\t\tif ( json.clearcoatNormalScale !== undefined ) material.clearcoatNormalScale = new Vector2().fromArray( json.clearcoatNormalScale );\n\n\t\tif ( json.iridescenceMap !== undefined ) material.iridescenceMap = getTexture( json.iridescenceMap );\n\t\tif ( json.iridescenceThicknessMap !== undefined ) material.iridescenceThicknessMap = getTexture( json.iridescenceThicknessMap );\n\n\t\tif ( json.transmissionMap !== undefined ) material.transmissionMap = getTexture( json.transmissionMap );\n\t\tif ( json.thicknessMap !== undefined ) material.thicknessMap = getTexture( json.thicknessMap );\n\n\t\tif ( json.sheenColorMap !== undefined ) material.sheenColorMap = getTexture( json.sheenColorMap );\n\t\tif ( json.sheenRoughnessMap !== undefined ) material.sheenRoughnessMap = getTexture( json.sheenRoughnessMap );\n\n\t\treturn material;\n\n\t}\n\n\tsetTextures( value ) {\n\n\t\tthis.textures = value;\n\t\treturn this;\n\n\t}\n\n\tstatic createMaterialFromType( type ) {\n\n\t\tconst materialLib = {\n\t\t\tShadowMaterial,\n\t\t\tSpriteMaterial,\n\t\t\tRawShaderMaterial,\n\t\t\tShaderMaterial,\n\t\t\tPointsMaterial,\n\t\t\tMeshPhysicalMaterial,\n\t\t\tMeshStandardMaterial,\n\t\t\tMeshPhongMaterial,\n\t\t\tMeshToonMaterial,\n\t\t\tMeshNormalMaterial,\n\t\t\tMeshLambertMaterial,\n\t\t\tMeshDepthMaterial,\n\t\t\tMeshDistanceMaterial,\n\t\t\tMeshBasicMaterial,\n\t\t\tMeshMatcapMaterial,\n\t\t\tLineDashedMaterial,\n\t\t\tLineBasicMaterial,\n\t\t\tMaterial\n\t\t};\n\n\t\treturn new materialLib[ type ]();\n\n\t}\n\n}\n\nclass LoaderUtils {\n\n\tstatic decodeText( array ) {\n\n\t\tif ( typeof TextDecoder !== 'undefined' ) {\n\n\t\t\treturn new TextDecoder().decode( array );\n\n\t\t}\n\n\t\t// Avoid the String.fromCharCode.apply(null, array) shortcut, which\n\t\t// throws a \"maximum call stack size exceeded\" error for large arrays.\n\n\t\tlet s = '';\n\n\t\tfor ( let i = 0, il = array.length; i < il; i ++ ) {\n\n\t\t\t// Implicitly assumes little-endian.\n\t\t\ts += String.fromCharCode( array[ i ] );\n\n\t\t}\n\n\t\ttry {\n\n\t\t\t// merges multi-byte utf-8 characters.\n\n\t\t\treturn decodeURIComponent( escape( s ) );\n\n\t\t} catch ( e ) { // see #16358\n\n\t\t\treturn s;\n\n\t\t}\n\n\t}\n\n\tstatic extractUrlBase( url ) {\n\n\t\tconst index = url.lastIndexOf( '/' );\n\n\t\tif ( index === - 1 ) return './';\n\n\t\treturn url.slice( 0, index + 1 );\n\n\t}\n\n\tstatic resolveURL( url, path ) {\n\n\t\t// Invalid URL\n\t\tif ( typeof url !== 'string' || url === '' ) return '';\n\n\t\t// Host Relative URL\n\t\tif ( /^https?:\\/\\//i.test( path ) && /^\\//.test( url ) ) {\n\n\t\t\tpath = path.replace( /(^https?:\\/\\/[^\\/]+).*/i, '$1' );\n\n\t\t}\n\n\t\t// Absolute URL http://,https://,//\n\t\tif ( /^(https?:)?\\/\\//i.test( url ) ) return url;\n\n\t\t// Data URI\n\t\tif ( /^data:.*,.*$/i.test( url ) ) return url;\n\n\t\t// Blob URL\n\t\tif ( /^blob:.*$/i.test( url ) ) return url;\n\n\t\t// Relative URL\n\t\treturn path + url;\n\n\t}\n\n}\n\nclass InstancedBufferGeometry extends BufferGeometry {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.isInstancedBufferGeometry = true;\n\n\t\tthis.type = 'InstancedBufferGeometry';\n\t\tthis.instanceCount = Infinity;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.instanceCount = source.instanceCount;\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON( this );\n\n\t\tdata.instanceCount = this.instanceCount;\n\n\t\tdata.isInstancedBufferGeometry = true;\n\n\t\treturn data;\n\n\t}\n\n}\n\nclass BufferGeometryLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( scope.manager );\n\t\tloader.setPath( scope.path );\n\t\tloader.setRequestHeader( scope.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\tparse( json ) {\n\n\t\tconst interleavedBufferMap = {};\n\t\tconst arrayBufferMap = {};\n\n\t\tfunction getInterleavedBuffer( json, uuid ) {\n\n\t\t\tif ( interleavedBufferMap[ uuid ] !== undefined ) return interleavedBufferMap[ uuid ];\n\n\t\t\tconst interleavedBuffers = json.interleavedBuffers;\n\t\t\tconst interleavedBuffer = interleavedBuffers[ uuid ];\n\n\t\t\tconst buffer = getArrayBuffer( json, interleavedBuffer.buffer );\n\n\t\t\tconst array = getTypedArray( interleavedBuffer.type, buffer );\n\t\t\tconst ib = new InterleavedBuffer( array, interleavedBuffer.stride );\n\t\t\tib.uuid = interleavedBuffer.uuid;\n\n\t\t\tinterleavedBufferMap[ uuid ] = ib;\n\n\t\t\treturn ib;\n\n\t\t}\n\n\t\tfunction getArrayBuffer( json, uuid ) {\n\n\t\t\tif ( arrayBufferMap[ uuid ] !== undefined ) return arrayBufferMap[ uuid ];\n\n\t\t\tconst arrayBuffers = json.arrayBuffers;\n\t\t\tconst arrayBuffer = arrayBuffers[ uuid ];\n\n\t\t\tconst ab = new Uint32Array( arrayBuffer ).buffer;\n\n\t\t\tarrayBufferMap[ uuid ] = ab;\n\n\t\t\treturn ab;\n\n\t\t}\n\n\t\tconst geometry = json.isInstancedBufferGeometry ? new InstancedBufferGeometry() : new BufferGeometry();\n\n\t\tconst index = json.data.index;\n\n\t\tif ( index !== undefined ) {\n\n\t\t\tconst typedArray = getTypedArray( index.type, index.array );\n\t\t\tgeometry.setIndex( new BufferAttribute( typedArray, 1 ) );\n\n\t\t}\n\n\t\tconst attributes = json.data.attributes;\n\n\t\tfor ( const key in attributes ) {\n\n\t\t\tconst attribute = attributes[ key ];\n\t\t\tlet bufferAttribute;\n\n\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\tconst interleavedBuffer = getInterleavedBuffer( json.data, attribute.data );\n\t\t\t\tbufferAttribute = new InterleavedBufferAttribute( interleavedBuffer, attribute.itemSize, attribute.offset, attribute.normalized );\n\n\t\t\t} else {\n\n\t\t\t\tconst typedArray = getTypedArray( attribute.type, attribute.array );\n\t\t\t\tconst bufferAttributeConstr = attribute.isInstancedBufferAttribute ? InstancedBufferAttribute : BufferAttribute;\n\t\t\t\tbufferAttribute = new bufferAttributeConstr( typedArray, attribute.itemSize, attribute.normalized );\n\n\t\t\t}\n\n\t\t\tif ( attribute.name !== undefined ) bufferAttribute.name = attribute.name;\n\t\t\tif ( attribute.usage !== undefined ) bufferAttribute.setUsage( attribute.usage );\n\n\t\t\tif ( attribute.updateRange !== undefined ) {\n\n\t\t\t\tbufferAttribute.updateRange.offset = attribute.updateRange.offset;\n\t\t\t\tbufferAttribute.updateRange.count = attribute.updateRange.count;\n\n\t\t\t}\n\n\t\t\tgeometry.setAttribute( key, bufferAttribute );\n\n\t\t}\n\n\t\tconst morphAttributes = json.data.morphAttributes;\n\n\t\tif ( morphAttributes ) {\n\n\t\t\tfor ( const key in morphAttributes ) {\n\n\t\t\t\tconst attributeArray = morphAttributes[ key ];\n\n\t\t\t\tconst array = [];\n\n\t\t\t\tfor ( let i = 0, il = attributeArray.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst attribute = attributeArray[ i ];\n\t\t\t\t\tlet bufferAttribute;\n\n\t\t\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\t\t\tconst interleavedBuffer = getInterleavedBuffer( json.data, attribute.data );\n\t\t\t\t\t\tbufferAttribute = new InterleavedBufferAttribute( interleavedBuffer, attribute.itemSize, attribute.offset, attribute.normalized );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconst typedArray = getTypedArray( attribute.type, attribute.array );\n\t\t\t\t\t\tbufferAttribute = new BufferAttribute( typedArray, attribute.itemSize, attribute.normalized );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( attribute.name !== undefined ) bufferAttribute.name = attribute.name;\n\t\t\t\t\tarray.push( bufferAttribute );\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.morphAttributes[ key ] = array;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst morphTargetsRelative = json.data.morphTargetsRelative;\n\n\t\tif ( morphTargetsRelative ) {\n\n\t\t\tgeometry.morphTargetsRelative = true;\n\n\t\t}\n\n\t\tconst groups = json.data.groups || json.data.drawcalls || json.data.offsets;\n\n\t\tif ( groups !== undefined ) {\n\n\t\t\tfor ( let i = 0, n = groups.length; i !== n; ++ i ) {\n\n\t\t\t\tconst group = groups[ i ];\n\n\t\t\t\tgeometry.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst boundingSphere = json.data.boundingSphere;\n\n\t\tif ( boundingSphere !== undefined ) {\n\n\t\t\tconst center = new Vector3();\n\n\t\t\tif ( boundingSphere.center !== undefined ) {\n\n\t\t\t\tcenter.fromArray( boundingSphere.center );\n\n\t\t\t}\n\n\t\t\tgeometry.boundingSphere = new Sphere( center, boundingSphere.radius );\n\n\t\t}\n\n\t\tif ( json.name ) geometry.name = json.name;\n\t\tif ( json.userData ) geometry.userData = json.userData;\n\n\t\treturn geometry;\n\n\t}\n\n}\n\nclass ObjectLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst path = ( this.path === '' ) ? LoaderUtils.extractUrlBase( url ) : this.path;\n\t\tthis.resourcePath = this.resourcePath || path;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\tlet json = null;\n\n\t\t\ttry {\n\n\t\t\t\tjson = JSON.parse( text );\n\n\t\t\t} catch ( error ) {\n\n\t\t\t\tif ( onError !== undefined ) onError( error );\n\n\t\t\t\tconsole.error( 'THREE:ObjectLoader: Can\\'t parse ' + url + '.', error.message );\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tconst metadata = json.metadata;\n\n\t\t\tif ( metadata === undefined || metadata.type === undefined || metadata.type.toLowerCase() === 'geometry' ) {\n\n\t\t\t\tconsole.error( 'THREE.ObjectLoader: Can\\'t load ' + url );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tscope.parse( json, onLoad );\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\tasync loadAsync( url, onProgress ) {\n\n\t\tconst scope = this;\n\n\t\tconst path = ( this.path === '' ) ? LoaderUtils.extractUrlBase( url ) : this.path;\n\t\tthis.resourcePath = this.resourcePath || path;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\n\t\tconst text = await loader.loadAsync( url, onProgress );\n\n\t\tconst json = JSON.parse( text );\n\n\t\tconst metadata = json.metadata;\n\n\t\tif ( metadata === undefined || metadata.type === undefined || metadata.type.toLowerCase() === 'geometry' ) {\n\n\t\t\tthrow new Error( 'THREE.ObjectLoader: Can\\'t load ' + url );\n\n\t\t}\n\n\t\treturn await scope.parseAsync( json );\n\n\t}\n\n\tparse( json, onLoad ) {\n\n\t\tconst animations = this.parseAnimations( json.animations );\n\t\tconst shapes = this.parseShapes( json.shapes );\n\t\tconst geometries = this.parseGeometries( json.geometries, shapes );\n\n\t\tconst images = this.parseImages( json.images, function () {\n\n\t\t\tif ( onLoad !== undefined ) onLoad( object );\n\n\t\t} );\n\n\t\tconst textures = this.parseTextures( json.textures, images );\n\t\tconst materials = this.parseMaterials( json.materials, textures );\n\n\t\tconst object = this.parseObject( json.object, geometries, materials, textures, animations );\n\t\tconst skeletons = this.parseSkeletons( json.skeletons, object );\n\n\t\tthis.bindSkeletons( object, skeletons );\n\n\t\t//\n\n\t\tif ( onLoad !== undefined ) {\n\n\t\t\tlet hasImages = false;\n\n\t\t\tfor ( const uuid in images ) {\n\n\t\t\t\tif ( images[ uuid ].data instanceof HTMLImageElement ) {\n\n\t\t\t\t\thasImages = true;\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( hasImages === false ) onLoad( object );\n\n\t\t}\n\n\t\treturn object;\n\n\t}\n\n\tasync parseAsync( json ) {\n\n\t\tconst animations = this.parseAnimations( json.animations );\n\t\tconst shapes = this.parseShapes( json.shapes );\n\t\tconst geometries = this.parseGeometries( json.geometries, shapes );\n\n\t\tconst images = await this.parseImagesAsync( json.images );\n\n\t\tconst textures = this.parseTextures( json.textures, images );\n\t\tconst materials = this.parseMaterials( json.materials, textures );\n\n\t\tconst object = this.parseObject( json.object, geometries, materials, textures, animations );\n\t\tconst skeletons = this.parseSkeletons( json.skeletons, object );\n\n\t\tthis.bindSkeletons( object, skeletons );\n\n\t\treturn object;\n\n\t}\n\n\tparseShapes( json ) {\n\n\t\tconst shapes = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tconst shape = new Shape().fromJSON( json[ i ] );\n\n\t\t\t\tshapes[ shape.uuid ] = shape;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn shapes;\n\n\t}\n\n\tparseSkeletons( json, object ) {\n\n\t\tconst skeletons = {};\n\t\tconst bones = {};\n\n\t\t// generate bone lookup table\n\n\t\tobject.traverse( function ( child ) {\n\n\t\t\tif ( child.isBone ) bones[ child.uuid ] = child;\n\n\t\t} );\n\n\t\t// create skeletons\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tconst skeleton = new Skeleton().fromJSON( json[ i ], bones );\n\n\t\t\t\tskeletons[ skeleton.uuid ] = skeleton;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn skeletons;\n\n\t}\n\n\tparseGeometries( json, shapes ) {\n\n\t\tconst geometries = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tconst bufferGeometryLoader = new BufferGeometryLoader();\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tlet geometry;\n\t\t\t\tconst data = json[ i ];\n\n\t\t\t\tswitch ( data.type ) {\n\n\t\t\t\t\tcase 'BufferGeometry':\n\t\t\t\t\tcase 'InstancedBufferGeometry':\n\n\t\t\t\t\t\tgeometry = bufferGeometryLoader.parse( data );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Geometry':\n\n\t\t\t\t\t\tconsole.error( 'THREE.ObjectLoader: The legacy Geometry type is no longer supported.' );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tif ( data.type in Geometries ) {\n\n\t\t\t\t\t\t\tgeometry = Geometries[ data.type ].fromJSON( data, shapes );\n\n\t\t\t\t\t\t} else {\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}\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.uuid = data.uuid;\n\n\t\t\t\tif ( data.name !== undefined ) geometry.name = data.name;\n\t\t\t\tif ( geometry.isBufferGeometry === true && data.userData !== undefined ) geometry.userData = data.userData;\n\n\t\t\t\tgeometries[ data.uuid ] = geometry;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn geometries;\n\n\t}\n\n\tparseMaterials( json, textures ) {\n\n\t\tconst cache = {}; // MultiMaterial\n\t\tconst materials = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tconst loader = new MaterialLoader();\n\t\t\tloader.setTextures( textures );\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tconst data = json[ i ];\n\n\t\t\t\tif ( data.type === 'MultiMaterial' ) {\n\n\t\t\t\t\t// Deprecated\n\n\t\t\t\t\tconst array = [];\n\n\t\t\t\t\tfor ( let j = 0; j < data.materials.length; j ++ ) {\n\n\t\t\t\t\t\tconst material = data.materials[ j ];\n\n\t\t\t\t\t\tif ( cache[ material.uuid ] === undefined ) {\n\n\t\t\t\t\t\t\tcache[ material.uuid ] = loader.parse( material );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tarray.push( cache[ material.uuid ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tmaterials[ data.uuid ] = array;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( cache[ data.uuid ] === undefined ) {\n\n\t\t\t\t\t\tcache[ data.uuid ] = loader.parse( data );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tmaterials[ data.uuid ] = cache[ data.uuid ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn materials;\n\n\t}\n\n\tparseAnimations( json ) {\n\n\t\tconst animations = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tfor ( let i = 0; i < json.length; i ++ ) {\n\n\t\t\t\tconst data = json[ i ];\n\n\t\t\t\tconst clip = AnimationClip.parse( data );\n\n\t\t\t\tanimations[ clip.uuid ] = clip;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn animations;\n\n\t}\n\n\tparseImages( json, onLoad ) {\n\n\t\tconst scope = this;\n\t\tconst images = {};\n\n\t\tlet loader;\n\n\t\tfunction loadImage( url ) {\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\treturn loader.load( url, function () {\n\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t}, undefined, function () {\n\n\t\t\t\tscope.manager.itemError( url );\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t} );\n\n\t\t}\n\n\t\tfunction deserializeImage( image ) {\n\n\t\t\tif ( typeof image === 'string' ) {\n\n\t\t\t\tconst url = image;\n\n\t\t\t\tconst path = /^(\\/\\/)|([a-z]+:(\\/\\/)?)/i.test( url ) ? url : scope.resourcePath + url;\n\n\t\t\t\treturn loadImage( path );\n\n\t\t\t} else {\n\n\t\t\t\tif ( image.data ) {\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tdata: getTypedArray( image.type, image.data ),\n\t\t\t\t\t\twidth: image.width,\n\t\t\t\t\t\theight: image.height\n\t\t\t\t\t};\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}\n\n\t\t}\n\n\t\tif ( json !== undefined && json.length > 0 ) {\n\n\t\t\tconst manager = new LoadingManager( onLoad );\n\n\t\t\tloader = new ImageLoader( manager );\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\t\tfor ( let i = 0, il = json.length; i < il; i ++ ) {\n\n\t\t\t\tconst image = json[ i ];\n\t\t\t\tconst url = image.url;\n\n\t\t\t\tif ( Array.isArray( url ) ) {\n\n\t\t\t\t\t// load array of images e.g CubeTexture\n\n\t\t\t\t\tconst imageArray = [];\n\n\t\t\t\t\tfor ( let j = 0, jl = url.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tconst currentUrl = url[ j ];\n\n\t\t\t\t\t\tconst deserializedImage = deserializeImage( currentUrl );\n\n\t\t\t\t\t\tif ( deserializedImage !== null ) {\n\n\t\t\t\t\t\t\tif ( deserializedImage instanceof HTMLImageElement ) {\n\n\t\t\t\t\t\t\t\timageArray.push( deserializedImage );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// special case: handle array of data textures for cube textures\n\n\t\t\t\t\t\t\t\timageArray.push( new DataTexture( deserializedImage.data, deserializedImage.width, deserializedImage.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}\n\n\t\t\t\t\timages[ image.uuid ] = new Source( imageArray );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// load single image\n\n\t\t\t\t\tconst deserializedImage = deserializeImage( image.url );\n\t\t\t\t\timages[ image.uuid ] = new Source( deserializedImage );\n\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn images;\n\n\t}\n\n\tasync parseImagesAsync( json ) {\n\n\t\tconst scope = this;\n\t\tconst images = {};\n\n\t\tlet loader;\n\n\t\tasync function deserializeImage( image ) {\n\n\t\t\tif ( typeof image === 'string' ) {\n\n\t\t\t\tconst url = image;\n\n\t\t\t\tconst path = /^(\\/\\/)|([a-z]+:(\\/\\/)?)/i.test( url ) ? url : scope.resourcePath + url;\n\n\t\t\t\treturn await loader.loadAsync( path );\n\n\t\t\t} else {\n\n\t\t\t\tif ( image.data ) {\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tdata: getTypedArray( image.type, image.data ),\n\t\t\t\t\t\twidth: image.width,\n\t\t\t\t\t\theight: image.height\n\t\t\t\t\t};\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}\n\n\t\t}\n\n\t\tif ( json !== undefined && json.length > 0 ) {\n\n\t\t\tloader = new ImageLoader( this.manager );\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\t\tfor ( let i = 0, il = json.length; i < il; i ++ ) {\n\n\t\t\t\tconst image = json[ i ];\n\t\t\t\tconst url = image.url;\n\n\t\t\t\tif ( Array.isArray( url ) ) {\n\n\t\t\t\t\t// load array of images e.g CubeTexture\n\n\t\t\t\t\tconst imageArray = [];\n\n\t\t\t\t\tfor ( let j = 0, jl = url.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tconst currentUrl = url[ j ];\n\n\t\t\t\t\t\tconst deserializedImage = await deserializeImage( currentUrl );\n\n\t\t\t\t\t\tif ( deserializedImage !== null ) {\n\n\t\t\t\t\t\t\tif ( deserializedImage instanceof HTMLImageElement ) {\n\n\t\t\t\t\t\t\t\timageArray.push( deserializedImage );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// special case: handle array of data textures for cube textures\n\n\t\t\t\t\t\t\t\timageArray.push( new DataTexture( deserializedImage.data, deserializedImage.width, deserializedImage.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}\n\n\t\t\t\t\timages[ image.uuid ] = new Source( imageArray );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// load single image\n\n\t\t\t\t\tconst deserializedImage = await deserializeImage( image.url );\n\t\t\t\t\timages[ image.uuid ] = new Source( deserializedImage );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn images;\n\n\t}\n\n\tparseTextures( json, images ) {\n\n\t\tfunction parseConstant( value, type ) {\n\n\t\t\tif ( typeof value === 'number' ) return value;\n\n\t\t\tconsole.warn( 'THREE.ObjectLoader.parseTexture: Constant should be in numeric form.', value );\n\n\t\t\treturn type[ value ];\n\n\t\t}\n\n\t\tconst textures = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tconst data = json[ i ];\n\n\t\t\t\tif ( data.image === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: No \"image\" specified for', data.uuid );\n\n\t\t\t\t}\n\n\t\t\t\tif ( images[ data.image ] === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined image', data.image );\n\n\t\t\t\t}\n\n\t\t\t\tconst source = images[ data.image ];\n\t\t\t\tconst image = source.data;\n\n\t\t\t\tlet texture;\n\n\t\t\t\tif ( Array.isArray( image ) ) {\n\n\t\t\t\t\ttexture = new CubeTexture();\n\n\t\t\t\t\tif ( image.length === 6 ) texture.needsUpdate = true;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( image && image.data ) {\n\n\t\t\t\t\t\ttexture = new DataTexture();\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttexture = new Texture();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( image ) texture.needsUpdate = true; // textures can have undefined image data\n\n\t\t\t\t}\n\n\t\t\t\ttexture.source = source;\n\n\t\t\t\ttexture.uuid = data.uuid;\n\n\t\t\t\tif ( data.name !== undefined ) texture.name = data.name;\n\n\t\t\t\tif ( data.mapping !== undefined ) texture.mapping = parseConstant( data.mapping, TEXTURE_MAPPING );\n\n\t\t\t\tif ( data.offset !== undefined ) texture.offset.fromArray( data.offset );\n\t\t\t\tif ( data.repeat !== undefined ) texture.repeat.fromArray( data.repeat );\n\t\t\t\tif ( data.center !== undefined ) texture.center.fromArray( data.center );\n\t\t\t\tif ( data.rotation !== undefined ) texture.rotation = data.rotation;\n\n\t\t\t\tif ( data.wrap !== undefined ) {\n\n\t\t\t\t\ttexture.wrapS = parseConstant( data.wrap[ 0 ], TEXTURE_WRAPPING );\n\t\t\t\t\ttexture.wrapT = parseConstant( data.wrap[ 1 ], TEXTURE_WRAPPING );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.format !== undefined ) texture.format = data.format;\n\t\t\t\tif ( data.type !== undefined ) texture.type = data.type;\n\t\t\t\tif ( data.encoding !== undefined ) texture.encoding = data.encoding;\n\n\t\t\t\tif ( data.minFilter !== undefined ) texture.minFilter = parseConstant( data.minFilter, TEXTURE_FILTER );\n\t\t\t\tif ( data.magFilter !== undefined ) texture.magFilter = parseConstant( data.magFilter, TEXTURE_FILTER );\n\t\t\t\tif ( data.anisotropy !== undefined ) texture.anisotropy = data.anisotropy;\n\n\t\t\t\tif ( data.flipY !== undefined ) texture.flipY = data.flipY;\n\n\t\t\t\tif ( data.premultiplyAlpha !== undefined ) texture.premultiplyAlpha = data.premultiplyAlpha;\n\t\t\t\tif ( data.unpackAlignment !== undefined ) texture.unpackAlignment = data.unpackAlignment;\n\n\t\t\t\tif ( data.userData !== undefined ) texture.userData = data.userData;\n\n\t\t\t\ttextures[ data.uuid ] = texture;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn textures;\n\n\t}\n\n\tparseObject( data, geometries, materials, textures, animations ) {\n\n\t\tlet object;\n\n\t\tfunction getGeometry( name ) {\n\n\t\t\tif ( geometries[ name ] === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined geometry', name );\n\n\t\t\t}\n\n\t\t\treturn geometries[ name ];\n\n\t\t}\n\n\t\tfunction getMaterial( name ) {\n\n\t\t\tif ( name === undefined ) return undefined;\n\n\t\t\tif ( Array.isArray( name ) ) {\n\n\t\t\t\tconst array = [];\n\n\t\t\t\tfor ( let i = 0, l = name.length; i < l; i ++ ) {\n\n\t\t\t\t\tconst uuid = name[ i ];\n\n\t\t\t\t\tif ( materials[ uuid ] === undefined ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined material', uuid );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tarray.push( materials[ uuid ] );\n\n\t\t\t\t}\n\n\t\t\t\treturn array;\n\n\t\t\t}\n\n\t\t\tif ( materials[ name ] === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined material', name );\n\n\t\t\t}\n\n\t\t\treturn materials[ name ];\n\n\t\t}\n\n\t\tfunction getTexture( uuid ) {\n\n\t\t\tif ( textures[ uuid ] === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined texture', uuid );\n\n\t\t\t}\n\n\t\t\treturn textures[ uuid ];\n\n\t\t}\n\n\t\tlet geometry, material;\n\n\t\tswitch ( data.type ) {\n\n\t\t\tcase 'Scene':\n\n\t\t\t\tobject = new Scene();\n\n\t\t\t\tif ( data.background !== undefined ) {\n\n\t\t\t\t\tif ( Number.isInteger( data.background ) ) {\n\n\t\t\t\t\t\tobject.background = new Color( data.background );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tobject.background = getTexture( data.background );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.environment !== undefined ) {\n\n\t\t\t\t\tobject.environment = getTexture( data.environment );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.fog !== undefined ) {\n\n\t\t\t\t\tif ( data.fog.type === 'Fog' ) {\n\n\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} else if ( data.fog.type === 'FogExp2' ) {\n\n\t\t\t\t\t\tobject.fog = new FogExp2( data.fog.color, data.fog.density );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'PerspectiveCamera':\n\n\t\t\t\tobject = new PerspectiveCamera( data.fov, data.aspect, data.near, data.far );\n\n\t\t\t\tif ( data.focus !== undefined ) object.focus = data.focus;\n\t\t\t\tif ( data.zoom !== undefined ) object.zoom = data.zoom;\n\t\t\t\tif ( data.filmGauge !== undefined ) object.filmGauge = data.filmGauge;\n\t\t\t\tif ( data.filmOffset !== undefined ) object.filmOffset = data.filmOffset;\n\t\t\t\tif ( data.view !== undefined ) object.view = Object.assign( {}, data.view );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'OrthographicCamera':\n\n\t\t\t\tobject = new OrthographicCamera( data.left, data.right, data.top, data.bottom, data.near, data.far );\n\n\t\t\t\tif ( data.zoom !== undefined ) object.zoom = data.zoom;\n\t\t\t\tif ( data.view !== undefined ) object.view = Object.assign( {}, data.view );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'AmbientLight':\n\n\t\t\t\tobject = new AmbientLight( data.color, data.intensity );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'DirectionalLight':\n\n\t\t\t\tobject = new DirectionalLight( data.color, data.intensity );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'PointLight':\n\n\t\t\t\tobject = new PointLight( data.color, data.intensity, data.distance, data.decay );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'RectAreaLight':\n\n\t\t\t\tobject = new RectAreaLight( data.color, data.intensity, data.width, data.height );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'SpotLight':\n\n\t\t\t\tobject = new SpotLight( data.color, data.intensity, data.distance, data.angle, data.penumbra, data.decay );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'HemisphereLight':\n\n\t\t\t\tobject = new HemisphereLight( data.color, data.groundColor, data.intensity );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LightProbe':\n\n\t\t\t\tobject = new LightProbe().fromJSON( data );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'SkinnedMesh':\n\n\t\t\t\tgeometry = getGeometry( data.geometry );\n\t\t\t \tmaterial = getMaterial( data.material );\n\n\t\t\t\tobject = new SkinnedMesh( geometry, material );\n\n\t\t\t\tif ( data.bindMode !== undefined ) object.bindMode = data.bindMode;\n\t\t\t\tif ( data.bindMatrix !== undefined ) object.bindMatrix.fromArray( data.bindMatrix );\n\t\t\t\tif ( data.skeleton !== undefined ) object.skeleton = data.skeleton;\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Mesh':\n\n\t\t\t\tgeometry = getGeometry( data.geometry );\n\t\t\t\tmaterial = getMaterial( data.material );\n\n\t\t\t\tobject = new Mesh( geometry, material );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'InstancedMesh':\n\n\t\t\t\tgeometry = getGeometry( data.geometry );\n\t\t\t\tmaterial = getMaterial( data.material );\n\t\t\t\tconst count = data.count;\n\t\t\t\tconst instanceMatrix = data.instanceMatrix;\n\t\t\t\tconst instanceColor = data.instanceColor;\n\n\t\t\t\tobject = new InstancedMesh( geometry, material, count );\n\t\t\t\tobject.instanceMatrix = new InstancedBufferAttribute( new Float32Array( instanceMatrix.array ), 16 );\n\t\t\t\tif ( instanceColor !== undefined ) object.instanceColor = new InstancedBufferAttribute( new Float32Array( instanceColor.array ), instanceColor.itemSize );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LOD':\n\n\t\t\t\tobject = new LOD();\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Line':\n\n\t\t\t\tobject = new Line( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LineLoop':\n\n\t\t\t\tobject = new LineLoop( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LineSegments':\n\n\t\t\t\tobject = new LineSegments( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'PointCloud':\n\t\t\tcase 'Points':\n\n\t\t\t\tobject = new Points( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Sprite':\n\n\t\t\t\tobject = new Sprite( getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Group':\n\n\t\t\t\tobject = new Group();\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Bone':\n\n\t\t\t\tobject = new Bone();\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tobject = new Object3D();\n\n\t\t}\n\n\t\tobject.uuid = data.uuid;\n\n\t\tif ( data.name !== undefined ) object.name = data.name;\n\n\t\tif ( data.matrix !== undefined ) {\n\n\t\t\tobject.matrix.fromArray( data.matrix );\n\n\t\t\tif ( data.matrixAutoUpdate !== undefined ) object.matrixAutoUpdate = data.matrixAutoUpdate;\n\t\t\tif ( object.matrixAutoUpdate ) object.matrix.decompose( object.position, object.quaternion, object.scale );\n\n\t\t} else {\n\n\t\t\tif ( data.position !== undefined ) object.position.fromArray( data.position );\n\t\t\tif ( data.rotation !== undefined ) object.rotation.fromArray( data.rotation );\n\t\t\tif ( data.quaternion !== undefined ) object.quaternion.fromArray( data.quaternion );\n\t\t\tif ( data.scale !== undefined ) object.scale.fromArray( data.scale );\n\n\t\t}\n\n\t\tif ( data.castShadow !== undefined ) object.castShadow = data.castShadow;\n\t\tif ( data.receiveShadow !== undefined ) object.receiveShadow = data.receiveShadow;\n\n\t\tif ( data.shadow ) {\n\n\t\t\tif ( data.shadow.bias !== undefined ) object.shadow.bias = data.shadow.bias;\n\t\t\tif ( data.shadow.normalBias !== undefined ) object.shadow.normalBias = data.shadow.normalBias;\n\t\t\tif ( data.shadow.radius !== undefined ) object.shadow.radius = data.shadow.radius;\n\t\t\tif ( data.shadow.mapSize !== undefined ) object.shadow.mapSize.fromArray( data.shadow.mapSize );\n\t\t\tif ( data.shadow.camera !== undefined ) object.shadow.camera = this.parseObject( data.shadow.camera );\n\n\t\t}\n\n\t\tif ( data.visible !== undefined ) object.visible = data.visible;\n\t\tif ( data.frustumCulled !== undefined ) object.frustumCulled = data.frustumCulled;\n\t\tif ( data.renderOrder !== undefined ) object.renderOrder = data.renderOrder;\n\t\tif ( data.userData !== undefined ) object.userData = data.userData;\n\t\tif ( data.layers !== undefined ) object.layers.mask = data.layers;\n\n\t\tif ( data.children !== undefined ) {\n\n\t\t\tconst children = data.children;\n\n\t\t\tfor ( let i = 0; i < children.length; i ++ ) {\n\n\t\t\t\tobject.add( this.parseObject( children[ i ], geometries, materials, textures, animations ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( data.animations !== undefined ) {\n\n\t\t\tconst objectAnimations = data.animations;\n\n\t\t\tfor ( let i = 0; i < objectAnimations.length; i ++ ) {\n\n\t\t\t\tconst uuid = objectAnimations[ i ];\n\n\t\t\t\tobject.animations.push( animations[ uuid ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( data.type === 'LOD' ) {\n\n\t\t\tif ( data.autoUpdate !== undefined ) object.autoUpdate = data.autoUpdate;\n\n\t\t\tconst levels = data.levels;\n\n\t\t\tfor ( let l = 0; l < levels.length; l ++ ) {\n\n\t\t\t\tconst level = levels[ l ];\n\t\t\t\tconst child = object.getObjectByProperty( 'uuid', level.object );\n\n\t\t\t\tif ( child !== undefined ) {\n\n\t\t\t\t\tobject.addLevel( child, level.distance );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn object;\n\n\t}\n\n\tbindSkeletons( object, skeletons ) {\n\n\t\tif ( Object.keys( skeletons ).length === 0 ) return;\n\n\t\tobject.traverse( function ( child ) {\n\n\t\t\tif ( child.isSkinnedMesh === true && child.skeleton !== undefined ) {\n\n\t\t\t\tconst skeleton = skeletons[ child.skeleton ];\n\n\t\t\t\tif ( skeleton === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: No skeleton found with UUID:', child.skeleton );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tchild.bind( skeleton, child.bindMatrix );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n}\n\nconst TEXTURE_MAPPING = {\n\tUVMapping: UVMapping,\n\tCubeReflectionMapping: CubeReflectionMapping,\n\tCubeRefractionMapping: CubeRefractionMapping,\n\tEquirectangularReflectionMapping: EquirectangularReflectionMapping,\n\tEquirectangularRefractionMapping: EquirectangularRefractionMapping,\n\tCubeUVReflectionMapping: CubeUVReflectionMapping\n};\n\nconst TEXTURE_WRAPPING = {\n\tRepeatWrapping: RepeatWrapping,\n\tClampToEdgeWrapping: ClampToEdgeWrapping,\n\tMirroredRepeatWrapping: MirroredRepeatWrapping\n};\n\nconst TEXTURE_FILTER = {\n\tNearestFilter: NearestFilter,\n\tNearestMipmapNearestFilter: NearestMipmapNearestFilter,\n\tNearestMipmapLinearFilter: NearestMipmapLinearFilter,\n\tLinearFilter: LinearFilter,\n\tLinearMipmapNearestFilter: LinearMipmapNearestFilter,\n\tLinearMipmapLinearFilter: LinearMipmapLinearFilter\n};\n\nclass ImageBitmapLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\tthis.isImageBitmapLoader = true;\n\n\t\tif ( typeof createImageBitmap === 'undefined' ) {\n\n\t\t\tconsole.warn( 'THREE.ImageBitmapLoader: createImageBitmap() not supported.' );\n\n\t\t}\n\n\t\tif ( typeof fetch === 'undefined' ) {\n\n\t\t\tconsole.warn( 'THREE.ImageBitmapLoader: fetch() not supported.' );\n\n\t\t}\n\n\t\tthis.options = { premultiplyAlpha: 'none' };\n\n\t}\n\n\tsetOptions( options ) {\n\n\t\tthis.options = options;\n\n\t\treturn this;\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tif ( url === undefined ) url = '';\n\n\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\turl = this.manager.resolveURL( url );\n\n\t\tconst scope = this;\n\n\t\tconst cached = Cache.get( url );\n\n\t\tif ( cached !== undefined ) {\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\tsetTimeout( function () {\n\n\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t}, 0 );\n\n\t\t\treturn cached;\n\n\t\t}\n\n\t\tconst fetchOptions = {};\n\t\tfetchOptions.credentials = ( this.crossOrigin === 'anonymous' ) ? 'same-origin' : 'include';\n\t\tfetchOptions.headers = this.requestHeader;\n\n\t\tfetch( url, fetchOptions ).then( function ( res ) {\n\n\t\t\treturn res.blob();\n\n\t\t} ).then( function ( blob ) {\n\n\t\t\treturn createImageBitmap( blob, Object.assign( scope.options, { colorSpaceConversion: 'none' } ) );\n\n\t\t} ).then( function ( imageBitmap ) {\n\n\t\t\tCache.add( url, imageBitmap );\n\n\t\t\tif ( onLoad ) onLoad( imageBitmap );\n\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t} ).catch( function ( e ) {\n\n\t\t\tif ( onError ) onError( e );\n\n\t\t\tscope.manager.itemError( url );\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t} );\n\n\t\tscope.manager.itemStart( url );\n\n\t}\n\n}\n\nlet _context;\n\nconst AudioContext = {\n\n\tgetContext: function () {\n\n\t\tif ( _context === undefined ) {\n\n\t\t\t_context = new ( window.AudioContext || window.webkitAudioContext )();\n\n\t\t}\n\n\t\treturn _context;\n\n\t},\n\n\tsetContext: function ( value ) {\n\n\t\t_context = value;\n\n\t}\n\n};\n\nclass AudioLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\t\tloader.load( url, function ( buffer ) {\n\n\t\t\ttry {\n\n\t\t\t\t// Create a copy of the buffer. The `decodeAudioData` method\n\t\t\t\t// detaches the buffer when complete, preventing reuse.\n\t\t\t\tconst bufferCopy = buffer.slice( 0 );\n\n\t\t\t\tconst context = AudioContext.getContext();\n\t\t\t\tcontext.decodeAudioData( bufferCopy, function ( audioBuffer ) {\n\n\t\t\t\t\tonLoad( audioBuffer );\n\n\t\t\t\t} );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n}\n\nclass HemisphereLightProbe extends LightProbe {\n\n\tconstructor( skyColor, groundColor, intensity = 1 ) {\n\n\t\tsuper( undefined, intensity );\n\n\t\tthis.isHemisphereLightProbe = true;\n\n\t\tconst color1 = new Color().set( skyColor );\n\t\tconst color2 = new Color().set( groundColor );\n\n\t\tconst sky = new Vector3( color1.r, color1.g, color1.b );\n\t\tconst ground = new Vector3( color2.r, color2.g, color2.b );\n\n\t\t// without extra factor of PI in the shader, should = 1 / Math.sqrt( Math.PI );\n\t\tconst c0 = Math.sqrt( Math.PI );\n\t\tconst c1 = c0 * Math.sqrt( 0.75 );\n\n\t\tthis.sh.coefficients[ 0 ].copy( sky ).add( ground ).multiplyScalar( c0 );\n\t\tthis.sh.coefficients[ 1 ].copy( sky ).sub( ground ).multiplyScalar( c1 );\n\n\t}\n\n}\n\nclass AmbientLightProbe extends LightProbe {\n\n\tconstructor( color, intensity = 1 ) {\n\n\t\tsuper( undefined, intensity );\n\n\t\tthis.isAmbientLightProbe = true;\n\n\t\tconst color1 = new Color().set( color );\n\n\t\t// without extra factor of PI in the shader, would be 2 / Math.sqrt( Math.PI );\n\t\tthis.sh.coefficients[ 0 ].set( color1.r, color1.g, color1.b ).multiplyScalar( 2 * Math.sqrt( Math.PI ) );\n\n\t}\n\n}\n\nconst _eyeRight = /*@__PURE__*/ new Matrix4();\nconst _eyeLeft = /*@__PURE__*/ new Matrix4();\nconst _projectionMatrix = /*@__PURE__*/ new Matrix4();\n\nclass StereoCamera {\n\n\tconstructor() {\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\tthis._cache = {\n\t\t\tfocus: null,\n\t\t\tfov: null,\n\t\t\taspect: null,\n\t\t\tnear: null,\n\t\t\tfar: null,\n\t\t\tzoom: null,\n\t\t\teyeSep: null\n\t\t};\n\n\t}\n\n\tupdate( camera ) {\n\n\t\tconst cache = this._cache;\n\n\t\tconst needsUpdate = cache.focus !== camera.focus || cache.fov !== camera.fov ||\n\t\t\tcache.aspect !== camera.aspect * this.aspect || cache.near !== camera.near ||\n\t\t\tcache.far !== camera.far || cache.zoom !== camera.zoom || cache.eyeSep !== this.eyeSep;\n\n\t\tif ( needsUpdate ) {\n\n\t\t\tcache.focus = camera.focus;\n\t\t\tcache.fov = camera.fov;\n\t\t\tcache.aspect = camera.aspect * this.aspect;\n\t\t\tcache.near = camera.near;\n\t\t\tcache.far = camera.far;\n\t\t\tcache.zoom = camera.zoom;\n\t\t\tcache.eyeSep = this.eyeSep;\n\n\t\t\t// Off-axis stereoscopic effect based on\n\t\t\t// http://paulbourke.net/stereographics/stereorender/\n\n\t\t\t_projectionMatrix.copy( camera.projectionMatrix );\n\t\t\tconst eyeSepHalf = cache.eyeSep / 2;\n\t\t\tconst eyeSepOnProjection = eyeSepHalf * cache.near / cache.focus;\n\t\t\tconst ymax = ( cache.near * Math.tan( DEG2RAD * cache.fov * 0.5 ) ) / cache.zoom;\n\t\t\tlet xmin, xmax;\n\n\t\t\t// translate xOffset\n\n\t\t\t_eyeLeft.elements[ 12 ] = - eyeSepHalf;\n\t\t\t_eyeRight.elements[ 12 ] = eyeSepHalf;\n\n\t\t\t// for left eye\n\n\t\t\txmin = - ymax * cache.aspect + eyeSepOnProjection;\n\t\t\txmax = ymax * cache.aspect + eyeSepOnProjection;\n\n\t\t\t_projectionMatrix.elements[ 0 ] = 2 * cache.near / ( xmax - xmin );\n\t\t\t_projectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );\n\n\t\t\tthis.cameraL.projectionMatrix.copy( _projectionMatrix );\n\n\t\t\t// for right eye\n\n\t\t\txmin = - ymax * cache.aspect - eyeSepOnProjection;\n\t\t\txmax = ymax * cache.aspect - eyeSepOnProjection;\n\n\t\t\t_projectionMatrix.elements[ 0 ] = 2 * cache.near / ( xmax - xmin );\n\t\t\t_projectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );\n\n\t\t\tthis.cameraR.projectionMatrix.copy( _projectionMatrix );\n\n\t\t}\n\n\t\tthis.cameraL.matrixWorld.copy( camera.matrixWorld ).multiply( _eyeLeft );\n\t\tthis.cameraR.matrixWorld.copy( camera.matrixWorld ).multiply( _eyeRight );\n\n\t}\n\n}\n\nclass Clock {\n\n\tconstructor( autoStart = true ) {\n\n\t\tthis.autoStart = autoStart;\n\n\t\tthis.startTime = 0;\n\t\tthis.oldTime = 0;\n\t\tthis.elapsedTime = 0;\n\n\t\tthis.running = false;\n\n\t}\n\n\tstart() {\n\n\t\tthis.startTime = now();\n\n\t\tthis.oldTime = this.startTime;\n\t\tthis.elapsedTime = 0;\n\t\tthis.running = true;\n\n\t}\n\n\tstop() {\n\n\t\tthis.getElapsedTime();\n\t\tthis.running = false;\n\t\tthis.autoStart = false;\n\n\t}\n\n\tgetElapsedTime() {\n\n\t\tthis.getDelta();\n\t\treturn this.elapsedTime;\n\n\t}\n\n\tgetDelta() {\n\n\t\tlet diff = 0;\n\n\t\tif ( this.autoStart && ! this.running ) {\n\n\t\t\tthis.start();\n\t\t\treturn 0;\n\n\t\t}\n\n\t\tif ( this.running ) {\n\n\t\t\tconst newTime = now();\n\n\t\t\tdiff = ( newTime - this.oldTime ) / 1000;\n\t\t\tthis.oldTime = newTime;\n\n\t\t\tthis.elapsedTime += diff;\n\n\t\t}\n\n\t\treturn diff;\n\n\t}\n\n}\n\nfunction now() {\n\n\treturn ( typeof performance === 'undefined' ? Date : performance ).now(); // see #10732\n\n}\n\nconst _position$1 = /*@__PURE__*/ new Vector3();\nconst _quaternion$1 = /*@__PURE__*/ new Quaternion();\nconst _scale$1 = /*@__PURE__*/ new Vector3();\nconst _orientation$1 = /*@__PURE__*/ new Vector3();\n\nclass AudioListener extends Object3D {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.type = 'AudioListener';\n\n\t\tthis.context = AudioContext.getContext();\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\tthis.timeDelta = 0;\n\n\t\t// private\n\n\t\tthis._clock = new Clock();\n\n\t}\n\n\tgetInput() {\n\n\t\treturn this.gain;\n\n\t}\n\n\tremoveFilter() {\n\n\t\tif ( this.filter !== null ) {\n\n\t\t\tthis.gain.disconnect( this.filter );\n\t\t\tthis.filter.disconnect( this.context.destination );\n\t\t\tthis.gain.connect( this.context.destination );\n\t\t\tthis.filter = null;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tgetFilter() {\n\n\t\treturn this.filter;\n\n\t}\n\n\tsetFilter( value ) {\n\n\t\tif ( this.filter !== null ) {\n\n\t\t\tthis.gain.disconnect( this.filter );\n\t\t\tthis.filter.disconnect( this.context.destination );\n\n\t\t} else {\n\n\t\t\tthis.gain.disconnect( this.context.destination );\n\n\t\t}\n\n\t\tthis.filter = value;\n\t\tthis.gain.connect( this.filter );\n\t\tthis.filter.connect( this.context.destination );\n\n\t\treturn this;\n\n\t}\n\n\tgetMasterVolume() {\n\n\t\treturn this.gain.gain.value;\n\n\t}\n\n\tsetMasterVolume( value ) {\n\n\t\tthis.gain.gain.setTargetAtTime( value, this.context.currentTime, 0.01 );\n\n\t\treturn this;\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t\tconst listener = this.context.listener;\n\t\tconst up = this.up;\n\n\t\tthis.timeDelta = this._clock.getDelta();\n\n\t\tthis.matrixWorld.decompose( _position$1, _quaternion$1, _scale$1 );\n\n\t\t_orientation$1.set( 0, 0, - 1 ).applyQuaternion( _quaternion$1 );\n\n\t\tif ( listener.positionX ) {\n\n\t\t\t// code path for Chrome (see #14393)\n\n\t\t\tconst endTime = this.context.currentTime + this.timeDelta;\n\n\t\t\tlistener.positionX.linearRampToValueAtTime( _position$1.x, endTime );\n\t\t\tlistener.positionY.linearRampToValueAtTime( _position$1.y, endTime );\n\t\t\tlistener.positionZ.linearRampToValueAtTime( _position$1.z, endTime );\n\t\t\tlistener.forwardX.linearRampToValueAtTime( _orientation$1.x, endTime );\n\t\t\tlistener.forwardY.linearRampToValueAtTime( _orientation$1.y, endTime );\n\t\t\tlistener.forwardZ.linearRampToValueAtTime( _orientation$1.z, endTime );\n\t\t\tlistener.upX.linearRampToValueAtTime( up.x, endTime );\n\t\t\tlistener.upY.linearRampToValueAtTime( up.y, endTime );\n\t\t\tlistener.upZ.linearRampToValueAtTime( up.z, endTime );\n\n\t\t} else {\n\n\t\t\tlistener.setPosition( _position$1.x, _position$1.y, _position$1.z );\n\t\t\tlistener.setOrientation( _orientation$1.x, _orientation$1.y, _orientation$1.z, up.x, up.y, up.z );\n\n\t\t}\n\n\t}\n\n}\n\nclass Audio extends Object3D {\n\n\tconstructor( listener ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'Audio';\n\n\t\tthis.listener = listener;\n\t\tthis.context = listener.context;\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.buffer = null;\n\t\tthis.detune = 0;\n\t\tthis.loop = false;\n\t\tthis.loopStart = 0;\n\t\tthis.loopEnd = 0;\n\t\tthis.offset = 0;\n\t\tthis.duration = undefined;\n\t\tthis.playbackRate = 1;\n\t\tthis.isPlaying = false;\n\t\tthis.hasPlaybackControl = true;\n\t\tthis.source = null;\n\t\tthis.sourceType = 'empty';\n\n\t\tthis._startedAt = 0;\n\t\tthis._progress = 0;\n\t\tthis._connected = false;\n\n\t\tthis.filters = [];\n\n\t}\n\n\tgetOutput() {\n\n\t\treturn this.gain;\n\n\t}\n\n\tsetNodeSource( audioNode ) {\n\n\t\tthis.hasPlaybackControl = false;\n\t\tthis.sourceType = 'audioNode';\n\t\tthis.source = audioNode;\n\t\tthis.connect();\n\n\t\treturn this;\n\n\t}\n\n\tsetMediaElementSource( mediaElement ) {\n\n\t\tthis.hasPlaybackControl = false;\n\t\tthis.sourceType = 'mediaNode';\n\t\tthis.source = this.context.createMediaElementSource( mediaElement );\n\t\tthis.connect();\n\n\t\treturn this;\n\n\t}\n\n\tsetMediaStreamSource( mediaStream ) {\n\n\t\tthis.hasPlaybackControl = false;\n\t\tthis.sourceType = 'mediaStreamNode';\n\t\tthis.source = this.context.createMediaStreamSource( mediaStream );\n\t\tthis.connect();\n\n\t\treturn this;\n\n\t}\n\n\tsetBuffer( audioBuffer ) {\n\n\t\tthis.buffer = audioBuffer;\n\t\tthis.sourceType = 'buffer';\n\n\t\tif ( this.autoplay ) this.play();\n\n\t\treturn this;\n\n\t}\n\n\tplay( delay = 0 ) {\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: Audio is already playing.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis._startedAt = this.context.currentTime + delay;\n\n\t\tconst source = this.context.createBufferSource();\n\t\tsource.buffer = this.buffer;\n\t\tsource.loop = this.loop;\n\t\tsource.loopStart = this.loopStart;\n\t\tsource.loopEnd = this.loopEnd;\n\t\tsource.onended = this.onEnded.bind( this );\n\t\tsource.start( this._startedAt, this._progress + this.offset, this.duration );\n\n\t\tthis.isPlaying = true;\n\n\t\tthis.source = source;\n\n\t\tthis.setDetune( this.detune );\n\t\tthis.setPlaybackRate( this.playbackRate );\n\n\t\treturn this.connect();\n\n\t}\n\n\tpause() {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\t// update current progress\n\n\t\t\tthis._progress += Math.max( this.context.currentTime - this._startedAt, 0 ) * this.playbackRate;\n\n\t\t\tif ( this.loop === true ) {\n\n\t\t\t\t// ensure _progress does not exceed duration with looped audios\n\n\t\t\t\tthis._progress = this._progress % ( this.duration || this.buffer.duration );\n\n\t\t\t}\n\n\t\t\tthis.source.stop();\n\t\t\tthis.source.onended = null;\n\n\t\t\tthis.isPlaying = false;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tstop() {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis._progress = 0;\n\n\t\tthis.source.stop();\n\t\tthis.source.onended = null;\n\t\tthis.isPlaying = false;\n\n\t\treturn this;\n\n\t}\n\n\tconnect() {\n\n\t\tif ( this.filters.length > 0 ) {\n\n\t\t\tthis.source.connect( this.filters[ 0 ] );\n\n\t\t\tfor ( let i = 1, l = this.filters.length; i < l; i ++ ) {\n\n\t\t\t\tthis.filters[ i - 1 ].connect( this.filters[ i ] );\n\n\t\t\t}\n\n\t\t\tthis.filters[ this.filters.length - 1 ].connect( this.getOutput() );\n\n\t\t} else {\n\n\t\t\tthis.source.connect( this.getOutput() );\n\n\t\t}\n\n\t\tthis._connected = true;\n\n\t\treturn this;\n\n\t}\n\n\tdisconnect() {\n\n\t\tif ( this.filters.length > 0 ) {\n\n\t\t\tthis.source.disconnect( this.filters[ 0 ] );\n\n\t\t\tfor ( let i = 1, l = this.filters.length; i < l; i ++ ) {\n\n\t\t\t\tthis.filters[ i - 1 ].disconnect( this.filters[ i ] );\n\n\t\t\t}\n\n\t\t\tthis.filters[ this.filters.length - 1 ].disconnect( this.getOutput() );\n\n\t\t} else {\n\n\t\t\tthis.source.disconnect( this.getOutput() );\n\n\t\t}\n\n\t\tthis._connected = false;\n\n\t\treturn this;\n\n\t}\n\n\tgetFilters() {\n\n\t\treturn this.filters;\n\n\t}\n\n\tsetFilters( value ) {\n\n\t\tif ( ! value ) value = [];\n\n\t\tif ( this._connected === true ) {\n\n\t\t\tthis.disconnect();\n\t\t\tthis.filters = value.slice();\n\t\t\tthis.connect();\n\n\t\t} else {\n\n\t\t\tthis.filters = value.slice();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetDetune( value ) {\n\n\t\tthis.detune = value;\n\n\t\tif ( this.source.detune === undefined ) return; // only set detune when available\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\tthis.source.detune.setTargetAtTime( this.detune, this.context.currentTime, 0.01 );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tgetDetune() {\n\n\t\treturn this.detune;\n\n\t}\n\n\tgetFilter() {\n\n\t\treturn this.getFilters()[ 0 ];\n\n\t}\n\n\tsetFilter( filter ) {\n\n\t\treturn this.setFilters( filter ? [ filter ] : [] );\n\n\t}\n\n\tsetPlaybackRate( value ) {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis.playbackRate = value;\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\tthis.source.playbackRate.setTargetAtTime( this.playbackRate, this.context.currentTime, 0.01 );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tgetPlaybackRate() {\n\n\t\treturn this.playbackRate;\n\n\t}\n\n\tonEnded() {\n\n\t\tthis.isPlaying = false;\n\n\t}\n\n\tgetLoop() {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\treturn false;\n\n\t\t}\n\n\t\treturn this.loop;\n\n\t}\n\n\tsetLoop( value ) {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis.loop = value;\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\tthis.source.loop = this.loop;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetLoopStart( value ) {\n\n\t\tthis.loopStart = value;\n\n\t\treturn this;\n\n\t}\n\n\tsetLoopEnd( value ) {\n\n\t\tthis.loopEnd = value;\n\n\t\treturn this;\n\n\t}\n\n\tgetVolume() {\n\n\t\treturn this.gain.gain.value;\n\n\t}\n\n\tsetVolume( value ) {\n\n\t\tthis.gain.gain.setTargetAtTime( value, this.context.currentTime, 0.01 );\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _position = /*@__PURE__*/ new Vector3();\nconst _quaternion = /*@__PURE__*/ new Quaternion();\nconst _scale = /*@__PURE__*/ new Vector3();\nconst _orientation = /*@__PURE__*/ new Vector3();\n\nclass PositionalAudio extends Audio {\n\n\tconstructor( listener ) {\n\n\t\tsuper( listener );\n\n\t\tthis.panner = this.context.createPanner();\n\t\tthis.panner.panningModel = 'HRTF';\n\t\tthis.panner.connect( this.gain );\n\n\t}\n\n\tdisconnect() {\n\n\t\tsuper.disconnect();\n\n\t\tthis.panner.disconnect( this.gain );\n\n\t}\n\n\tgetOutput() {\n\n\t\treturn this.panner;\n\n\t}\n\n\tgetRefDistance() {\n\n\t\treturn this.panner.refDistance;\n\n\t}\n\n\tsetRefDistance( value ) {\n\n\t\tthis.panner.refDistance = value;\n\n\t\treturn this;\n\n\t}\n\n\tgetRolloffFactor() {\n\n\t\treturn this.panner.rolloffFactor;\n\n\t}\n\n\tsetRolloffFactor( value ) {\n\n\t\tthis.panner.rolloffFactor = value;\n\n\t\treturn this;\n\n\t}\n\n\tgetDistanceModel() {\n\n\t\treturn this.panner.distanceModel;\n\n\t}\n\n\tsetDistanceModel( value ) {\n\n\t\tthis.panner.distanceModel = value;\n\n\t\treturn this;\n\n\t}\n\n\tgetMaxDistance() {\n\n\t\treturn this.panner.maxDistance;\n\n\t}\n\n\tsetMaxDistance( value ) {\n\n\t\tthis.panner.maxDistance = value;\n\n\t\treturn this;\n\n\t}\n\n\tsetDirectionalCone( coneInnerAngle, coneOuterAngle, coneOuterGain ) {\n\n\t\tthis.panner.coneInnerAngle = coneInnerAngle;\n\t\tthis.panner.coneOuterAngle = coneOuterAngle;\n\t\tthis.panner.coneOuterGain = coneOuterGain;\n\n\t\treturn this;\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t\tif ( this.hasPlaybackControl === true && this.isPlaying === false ) return;\n\n\t\tthis.matrixWorld.decompose( _position, _quaternion, _scale );\n\n\t\t_orientation.set( 0, 0, 1 ).applyQuaternion( _quaternion );\n\n\t\tconst panner = this.panner;\n\n\t\tif ( panner.positionX ) {\n\n\t\t\t// code path for Chrome and Firefox (see #14393)\n\n\t\t\tconst endTime = this.context.currentTime + this.listener.timeDelta;\n\n\t\t\tpanner.positionX.linearRampToValueAtTime( _position.x, endTime );\n\t\t\tpanner.positionY.linearRampToValueAtTime( _position.y, endTime );\n\t\t\tpanner.positionZ.linearRampToValueAtTime( _position.z, endTime );\n\t\t\tpanner.orientationX.linearRampToValueAtTime( _orientation.x, endTime );\n\t\t\tpanner.orientationY.linearRampToValueAtTime( _orientation.y, endTime );\n\t\t\tpanner.orientationZ.linearRampToValueAtTime( _orientation.z, endTime );\n\n\t\t} else {\n\n\t\t\tpanner.setPosition( _position.x, _position.y, _position.z );\n\t\t\tpanner.setOrientation( _orientation.x, _orientation.y, _orientation.z );\n\n\t\t}\n\n\t}\n\n}\n\nclass AudioAnalyser {\n\n\tconstructor( audio, fftSize = 2048 ) {\n\n\t\tthis.analyser = audio.context.createAnalyser();\n\t\tthis.analyser.fftSize = fftSize;\n\n\t\tthis.data = new Uint8Array( this.analyser.frequencyBinCount );\n\n\t\taudio.getOutput().connect( this.analyser );\n\n\t}\n\n\n\tgetFrequencyData() {\n\n\t\tthis.analyser.getByteFrequencyData( this.data );\n\n\t\treturn this.data;\n\n\t}\n\n\tgetAverageFrequency() {\n\n\t\tlet value = 0;\n\t\tconst data = this.getFrequencyData();\n\n\t\tfor ( let i = 0; i < data.length; i ++ ) {\n\n\t\t\tvalue += data[ i ];\n\n\t\t}\n\n\t\treturn value / data.length;\n\n\t}\n\n}\n\nclass PropertyMixer {\n\n\tconstructor( binding, typeName, valueSize ) {\n\n\t\tthis.binding = binding;\n\t\tthis.valueSize = valueSize;\n\n\t\tlet mixFunction,\n\t\t\tmixFunctionAdditive,\n\t\t\tsetIdentity;\n\n\t\t// buffer layout: [ incoming | accu0 | accu1 | orig | addAccu | (optional work) ]\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\t\t//\n\t\t// 'add' is used for additive cumulative results\n\t\t//\n\t\t// 'work' is optional and is only present for quaternion types. It is used\n\t\t// to store intermediate quaternion multiplication results\n\n\t\tswitch ( typeName ) {\n\n\t\t\tcase 'quaternion':\n\t\t\t\tmixFunction = this._slerp;\n\t\t\t\tmixFunctionAdditive = this._slerpAdditive;\n\t\t\t\tsetIdentity = this._setAdditiveIdentityQuaternion;\n\n\t\t\t\tthis.buffer = new Float64Array( valueSize * 6 );\n\t\t\t\tthis._workIndex = 5;\n\t\t\t\tbreak;\n\n\t\t\tcase 'string':\n\t\t\tcase 'bool':\n\t\t\t\tmixFunction = this._select;\n\n\t\t\t\t// Use the regular mix function and for additive on these types,\n\t\t\t\t// additive is not relevant for non-numeric types\n\t\t\t\tmixFunctionAdditive = this._select;\n\n\t\t\t\tsetIdentity = this._setAdditiveIdentityOther;\n\n\t\t\t\tthis.buffer = new Array( valueSize * 5 );\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tmixFunction = this._lerp;\n\t\t\t\tmixFunctionAdditive = this._lerpAdditive;\n\t\t\t\tsetIdentity = this._setAdditiveIdentityNumeric;\n\n\t\t\t\tthis.buffer = new Float64Array( valueSize * 5 );\n\n\t\t}\n\n\t\tthis._mixBufferRegion = mixFunction;\n\t\tthis._mixBufferRegionAdditive = mixFunctionAdditive;\n\t\tthis._setIdentity = setIdentity;\n\t\tthis._origIndex = 3;\n\t\tthis._addIndex = 4;\n\n\t\tthis.cumulativeWeight = 0;\n\t\tthis.cumulativeWeightAdditive = 0;\n\n\t\tthis.useCount = 0;\n\t\tthis.referenceCount = 0;\n\n\t}\n\n\t// accumulate data in the 'incoming' region into 'accu'\n\taccumulate( accuIndex, weight ) {\n\n\t\t// note: happily accumulating nothing when weight = 0, the caller knows\n\t\t// the weight and shouldn't have made the call in the first place\n\n\t\tconst buffer = this.buffer,\n\t\t\tstride = this.valueSize,\n\t\t\toffset = accuIndex * stride + stride;\n\n\t\tlet currentWeight = this.cumulativeWeight;\n\n\t\tif ( currentWeight === 0 ) {\n\n\t\t\t// accuN := incoming * weight\n\n\t\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tbuffer[ offset + i ] = buffer[ i ];\n\n\t\t\t}\n\n\t\t\tcurrentWeight = weight;\n\n\t\t} else {\n\n\t\t\t// accuN := accuN + incoming * weight\n\n\t\t\tcurrentWeight += weight;\n\t\t\tconst mix = weight / currentWeight;\n\t\t\tthis._mixBufferRegion( buffer, offset, 0, mix, stride );\n\n\t\t}\n\n\t\tthis.cumulativeWeight = currentWeight;\n\n\t}\n\n\t// accumulate data in the 'incoming' region into 'add'\n\taccumulateAdditive( weight ) {\n\n\t\tconst buffer = this.buffer,\n\t\t\tstride = this.valueSize,\n\t\t\toffset = stride * this._addIndex;\n\n\t\tif ( this.cumulativeWeightAdditive === 0 ) {\n\n\t\t\t// add = identity\n\n\t\t\tthis._setIdentity();\n\n\t\t}\n\n\t\t// add := add + incoming * weight\n\n\t\tthis._mixBufferRegionAdditive( buffer, offset, 0, weight, stride );\n\t\tthis.cumulativeWeightAdditive += weight;\n\n\t}\n\n\t// apply the state of 'accu' to the binding when accus differ\n\tapply( accuIndex ) {\n\n\t\tconst stride = this.valueSize,\n\t\t\tbuffer = this.buffer,\n\t\t\toffset = accuIndex * stride + stride,\n\n\t\t\tweight = this.cumulativeWeight,\n\t\t\tweightAdditive = this.cumulativeWeightAdditive,\n\n\t\t\tbinding = this.binding;\n\n\t\tthis.cumulativeWeight = 0;\n\t\tthis.cumulativeWeightAdditive = 0;\n\n\t\tif ( weight < 1 ) {\n\n\t\t\t// accuN := accuN + original * ( 1 - cumulativeWeight )\n\n\t\t\tconst originalValueOffset = stride * this._origIndex;\n\n\t\t\tthis._mixBufferRegion(\n\t\t\t\tbuffer, offset, originalValueOffset, 1 - weight, stride );\n\n\t\t}\n\n\t\tif ( weightAdditive > 0 ) {\n\n\t\t\t// accuN := accuN + additive accuN\n\n\t\t\tthis._mixBufferRegionAdditive( buffer, offset, this._addIndex * stride, 1, stride );\n\n\t\t}\n\n\t\tfor ( let i = stride, e = stride + stride; i !== e; ++ i ) {\n\n\t\t\tif ( buffer[ i ] !== buffer[ i + stride ] ) {\n\n\t\t\t\t// value has changed -> update scene graph\n\n\t\t\t\tbinding.setValue( buffer, offset );\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t// remember the state of the bound property and copy it to both accus\n\tsaveOriginalState() {\n\n\t\tconst binding = this.binding;\n\n\t\tconst buffer = this.buffer,\n\t\t\tstride = this.valueSize,\n\n\t\t\toriginalValueOffset = stride * this._origIndex;\n\n\t\tbinding.getValue( buffer, originalValueOffset );\n\n\t\t// accu[0..1] := orig -- initially detect changes against the original\n\t\tfor ( let i = stride, e = originalValueOffset; i !== e; ++ i ) {\n\n\t\t\tbuffer[ i ] = buffer[ originalValueOffset + ( i % stride ) ];\n\n\t\t}\n\n\t\t// Add to identity for additive\n\t\tthis._setIdentity();\n\n\t\tthis.cumulativeWeight = 0;\n\t\tthis.cumulativeWeightAdditive = 0;\n\n\t}\n\n\t// apply the state previously taken via 'saveOriginalState' to the binding\n\trestoreOriginalState() {\n\n\t\tconst originalValueOffset = this.valueSize * 3;\n\t\tthis.binding.setValue( this.buffer, originalValueOffset );\n\n\t}\n\n\t_setAdditiveIdentityNumeric() {\n\n\t\tconst startIndex = this._addIndex * this.valueSize;\n\t\tconst endIndex = startIndex + this.valueSize;\n\n\t\tfor ( let i = startIndex; i < endIndex; i ++ ) {\n\n\t\t\tthis.buffer[ i ] = 0;\n\n\t\t}\n\n\t}\n\n\t_setAdditiveIdentityQuaternion() {\n\n\t\tthis._setAdditiveIdentityNumeric();\n\t\tthis.buffer[ this._addIndex * this.valueSize + 3 ] = 1;\n\n\t}\n\n\t_setAdditiveIdentityOther() {\n\n\t\tconst startIndex = this._origIndex * this.valueSize;\n\t\tconst targetIndex = this._addIndex * this.valueSize;\n\n\t\tfor ( let i = 0; i < this.valueSize; i ++ ) {\n\n\t\t\tthis.buffer[ targetIndex + i ] = this.buffer[ startIndex + i ];\n\n\t\t}\n\n\t}\n\n\n\t// mix functions\n\n\t_select( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\tif ( t >= 0.5 ) {\n\n\t\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tbuffer[ dstOffset + i ] = buffer[ srcOffset + i ];\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_slerp( buffer, dstOffset, srcOffset, t ) {\n\n\t\tQuaternion.slerpFlat( buffer, dstOffset, buffer, dstOffset, buffer, srcOffset, t );\n\n\t}\n\n\t_slerpAdditive( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\tconst workOffset = this._workIndex * stride;\n\n\t\t// Store result in intermediate buffer offset\n\t\tQuaternion.multiplyQuaternionsFlat( buffer, workOffset, buffer, dstOffset, buffer, srcOffset );\n\n\t\t// Slerp to the intermediate result\n\t\tQuaternion.slerpFlat( buffer, dstOffset, buffer, dstOffset, buffer, workOffset, t );\n\n\t}\n\n\t_lerp( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\tconst s = 1 - t;\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tconst j = dstOffset + i;\n\n\t\t\tbuffer[ j ] = buffer[ j ] * s + buffer[ srcOffset + i ] * t;\n\n\t\t}\n\n\t}\n\n\t_lerpAdditive( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tconst j = dstOffset + i;\n\n\t\t\tbuffer[ j ] = buffer[ j ] + buffer[ srcOffset + i ] * t;\n\n\t\t}\n\n\t}\n\n}\n\n// Characters [].:/ are reserved for track binding syntax.\nconst _RESERVED_CHARS_RE = '\\\\[\\\\]\\\\.:\\\\/';\nconst _reservedRe = new RegExp( '[' + _RESERVED_CHARS_RE + ']', 'g' );\n\n// Attempts to allow node names from any language. ES5's `\\w` regexp matches\n// only latin characters, and the unicode \\p{L} is not yet supported. So\n// instead, we exclude reserved characters and match everything else.\nconst _wordChar = '[^' + _RESERVED_CHARS_RE + ']';\nconst _wordCharOrDot = '[^' + _RESERVED_CHARS_RE.replace( '\\\\.', '' ) + ']';\n\n// Parent directories, delimited by '/' or ':'. Currently unused, but must\n// be matched to parse the rest of the track name.\nconst _directoryRe = /*@__PURE__*/ /((?:WC+[\\/:])*)/.source.replace( 'WC', _wordChar );\n\n// Target node. May contain word characters (a-zA-Z0-9_) and '.' or '-'.\nconst _nodeRe = /*@__PURE__*/ /(WCOD+)?/.source.replace( 'WCOD', _wordCharOrDot );\n\n// Object on target node, and accessor. May not contain reserved\n// characters. Accessor may contain any character except closing bracket.\nconst _objectRe = /*@__PURE__*/ /(?:\\.(WC+)(?:\\[(.+)\\])?)?/.source.replace( 'WC', _wordChar );\n\n// Property and accessor. May not contain reserved characters. Accessor may\n// contain any non-bracket characters.\nconst _propertyRe = /*@__PURE__*/ /\\.(WC+)(?:\\[(.+)\\])?/.source.replace( 'WC', _wordChar );\n\nconst _trackRe = new RegExp( ''\n\t+ '^'\n\t+ _directoryRe\n\t+ _nodeRe\n\t+ _objectRe\n\t+ _propertyRe\n\t+ '$'\n);\n\nconst _supportedObjectNames = [ 'material', 'materials', 'bones' ];\n\nclass Composite {\n\n\tconstructor( targetGroup, path, optionalParsedPath ) {\n\n\t\tconst parsedPath = optionalParsedPath || PropertyBinding.parseTrackName( path );\n\n\t\tthis._targetGroup = targetGroup;\n\t\tthis._bindings = targetGroup.subscribe_( path, parsedPath );\n\n\t}\n\n\tgetValue( array, offset ) {\n\n\t\tthis.bind(); // bind all binding\n\n\t\tconst firstValidIndex = this._targetGroup.nCachedObjects_,\n\t\t\tbinding = this._bindings[ firstValidIndex ];\n\n\t\t// and only call .getValue on the first\n\t\tif ( binding !== undefined ) binding.getValue( array, offset );\n\n\t}\n\n\tsetValue( array, offset ) {\n\n\t\tconst bindings = this._bindings;\n\n\t\tfor ( let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tbindings[ i ].setValue( array, offset );\n\n\t\t}\n\n\t}\n\n\tbind() {\n\n\t\tconst bindings = this._bindings;\n\n\t\tfor ( let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tbindings[ i ].bind();\n\n\t\t}\n\n\t}\n\n\tunbind() {\n\n\t\tconst bindings = this._bindings;\n\n\t\tfor ( let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tbindings[ i ].unbind();\n\n\t\t}\n\n\t}\n\n}\n\n// Note: This class uses a State pattern on a per-method basis:\n// 'bind' sets 'this.getValue' / 'setValue' and shadows the\n// prototype version of these methods with one that represents\n// the bound state. When the property is not found, the methods\n// become no-ops.\nclass PropertyBinding {\n\n\tconstructor( rootNode, path, parsedPath ) {\n\n\t\tthis.path = path;\n\t\tthis.parsedPath = parsedPath || PropertyBinding.parseTrackName( path );\n\n\t\tthis.node = PropertyBinding.findNode( rootNode, this.parsedPath.nodeName ) || rootNode;\n\n\t\tthis.rootNode = rootNode;\n\n\t\t// initial state of these methods that calls 'bind'\n\t\tthis.getValue = this._getValue_unbound;\n\t\tthis.setValue = this._setValue_unbound;\n\n\t}\n\n\n\tstatic create( 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\t/**\n\t * Replaces spaces with underscores and removes unsupported characters from\n\t * node names, to ensure compatibility with parseTrackName().\n\t *\n\t * @param {string} name Node name to be sanitized.\n\t * @return {string}\n\t */\n\tstatic sanitizeNodeName( name ) {\n\n\t\treturn name.replace( /\\s/g, '_' ).replace( _reservedRe, '' );\n\n\t}\n\n\tstatic parseTrackName( trackName ) {\n\n\t\tconst matches = _trackRe.exec( trackName );\n\n\t\tif ( matches === null ) {\n\n\t\t\tthrow new Error( 'PropertyBinding: Cannot parse trackName: ' + trackName );\n\n\t\t}\n\n\t\tconst results = {\n\t\t\t// directoryName: matches[ 1 ], // (tschw) currently unused\n\t\t\tnodeName: matches[ 2 ],\n\t\t\tobjectName: matches[ 3 ],\n\t\t\tobjectIndex: matches[ 4 ],\n\t\t\tpropertyName: matches[ 5 ], // required\n\t\t\tpropertyIndex: matches[ 6 ]\n\t\t};\n\n\t\tconst lastDot = results.nodeName && results.nodeName.lastIndexOf( '.' );\n\n\t\tif ( lastDot !== undefined && lastDot !== - 1 ) {\n\n\t\t\tconst objectName = results.nodeName.substring( lastDot + 1 );\n\n\t\t\t// Object names must be checked against an allowlist. Otherwise, there\n\t\t\t// is no way to parse 'foo.bar.baz': 'baz' must be a property, but\n\t\t\t// 'bar' could be the objectName, or part of a nodeName (which can\n\t\t\t// include '.' characters).\n\t\t\tif ( _supportedObjectNames.indexOf( objectName ) !== - 1 ) {\n\n\t\t\t\tresults.nodeName = results.nodeName.substring( 0, lastDot );\n\t\t\t\tresults.objectName = objectName;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( results.propertyName === null || results.propertyName.length === 0 ) {\n\n\t\t\tthrow new Error( 'PropertyBinding: can not parse propertyName from trackName: ' + trackName );\n\n\t\t}\n\n\t\treturn results;\n\n\t}\n\n\tstatic findNode( root, nodeName ) {\n\n\t\tif ( nodeName === undefined || nodeName === '' || 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\tconst bone = root.skeleton.getBoneByName( nodeName );\n\n\t\t\tif ( bone !== undefined ) {\n\n\t\t\t\treturn bone;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// search into node subtree.\n\t\tif ( root.children ) {\n\n\t\t\tconst searchNodeSubtree = function ( children ) {\n\n\t\t\t\tfor ( let i = 0; i < children.length; i ++ ) {\n\n\t\t\t\t\tconst 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\tconst 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\tconst 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// these are used to \"bind\" a nonexistent property\n\t_getValue_unavailable() {}\n\t_setValue_unavailable() {}\n\n\t// Getters\n\n\t_getValue_direct( buffer, offset ) {\n\n\t\tbuffer[ offset ] = this.targetObject[ this.propertyName ];\n\n\t}\n\n\t_getValue_array( buffer, offset ) {\n\n\t\tconst source = this.resolvedProperty;\n\n\t\tfor ( let i = 0, n = source.length; i !== n; ++ i ) {\n\n\t\t\tbuffer[ offset ++ ] = source[ i ];\n\n\t\t}\n\n\t}\n\n\t_getValue_arrayElement( buffer, offset ) {\n\n\t\tbuffer[ offset ] = this.resolvedProperty[ this.propertyIndex ];\n\n\t}\n\n\t_getValue_toArray( buffer, offset ) {\n\n\t\tthis.resolvedProperty.toArray( buffer, offset );\n\n\t}\n\n\t// Direct\n\n\t_setValue_direct( buffer, offset ) {\n\n\t\tthis.targetObject[ this.propertyName ] = buffer[ offset ];\n\n\t}\n\n\t_setValue_direct_setNeedsUpdate( buffer, offset ) {\n\n\t\tthis.targetObject[ this.propertyName ] = buffer[ offset ];\n\t\tthis.targetObject.needsUpdate = true;\n\n\t}\n\n\t_setValue_direct_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\tthis.targetObject[ this.propertyName ] = buffer[ offset ];\n\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\t// EntireArray\n\n\t_setValue_array( buffer, offset ) {\n\n\t\tconst dest = this.resolvedProperty;\n\n\t\tfor ( let i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t}\n\n\t}\n\n\t_setValue_array_setNeedsUpdate( buffer, offset ) {\n\n\t\tconst dest = this.resolvedProperty;\n\n\t\tfor ( let i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t}\n\n\t\tthis.targetObject.needsUpdate = true;\n\n\t}\n\n\t_setValue_array_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\tconst dest = this.resolvedProperty;\n\n\t\tfor ( let i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t}\n\n\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\t// ArrayElement\n\n\t_setValue_arrayElement( buffer, offset ) {\n\n\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\n\t}\n\n\t_setValue_arrayElement_setNeedsUpdate( buffer, offset ) {\n\n\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\t\tthis.targetObject.needsUpdate = true;\n\n\t}\n\n\t_setValue_arrayElement_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\t// HasToFromArray\n\n\t_setValue_fromArray( buffer, offset ) {\n\n\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\n\t}\n\n\t_setValue_fromArray_setNeedsUpdate( buffer, offset ) {\n\n\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\t\tthis.targetObject.needsUpdate = true;\n\n\t}\n\n\t_setValue_fromArray_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\t_getValue_unbound( targetArray, offset ) {\n\n\t\tthis.bind();\n\t\tthis.getValue( targetArray, offset );\n\n\t}\n\n\t_setValue_unbound( sourceArray, offset ) {\n\n\t\tthis.bind();\n\t\tthis.setValue( sourceArray, offset );\n\n\t}\n\n\t// create getter / setter pair for a property in the scene graph\n\tbind() {\n\n\t\tlet targetObject = this.node;\n\t\tconst parsedPath = this.parsedPath;\n\n\t\tconst objectName = parsedPath.objectName;\n\t\tconst propertyName = parsedPath.propertyName;\n\t\tlet propertyIndex = parsedPath.propertyIndex;\n\n\t\tif ( ! targetObject ) {\n\n\t\t\ttargetObject = PropertyBinding.findNode( this.rootNode, parsedPath.nodeName ) || this.rootNode;\n\n\t\t\tthis.node = targetObject;\n\n\t\t}\n\n\t\t// set fail state so we can just 'return' on error\n\t\tthis.getValue = this._getValue_unavailable;\n\t\tthis.setValue = this._setValue_unavailable;\n\n\t\t// ensure there is a value node\n\t\tif ( ! targetObject ) {\n\n\t\t\tconsole.error( 'THREE.PropertyBinding: Trying to update node for track: ' + this.path + ' but it wasn\\'t found.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( objectName ) {\n\n\t\t\tlet objectIndex = parsedPath.objectIndex;\n\n\t\t\t// special cases were we need to reach deeper into the hierarchy to get the face materials....\n\t\t\tswitch ( objectName ) {\n\n\t\t\t\tcase 'materials':\n\n\t\t\t\t\tif ( ! targetObject.material ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to material as node does not have a material.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! targetObject.material.materials ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to material.materials as node.material does not have a materials array.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttargetObject = targetObject.material.materials;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'bones':\n\n\t\t\t\t\tif ( ! targetObject.skeleton ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to bones as node does not have a skeleton.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// potential future optimization: skip this if propertyIndex is already an integer\n\t\t\t\t\t// and convert the integer string to a true integer.\n\n\t\t\t\t\ttargetObject = targetObject.skeleton.bones;\n\n\t\t\t\t\t// support resolving morphTarget names into indices.\n\t\t\t\t\tfor ( let i = 0; i < targetObject.length; i ++ ) {\n\n\t\t\t\t\t\tif ( targetObject[ i ].name === objectIndex ) {\n\n\t\t\t\t\t\t\tobjectIndex = 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\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tif ( targetObject[ objectName ] === undefined ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to objectName of node undefined.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttargetObject = targetObject[ objectName ];\n\n\t\t\t}\n\n\n\t\t\tif ( objectIndex !== undefined ) {\n\n\t\t\t\tif ( targetObject[ objectIndex ] === undefined ) {\n\n\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Trying to bind to objectIndex of objectName, but is undefined.', this, targetObject );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\ttargetObject = targetObject[ objectIndex ];\n\n\t\t\t}\n\n\t\t}\n\n\t\t// resolve property\n\t\tconst nodeProperty = targetObject[ propertyName ];\n\n\t\tif ( nodeProperty === undefined ) {\n\n\t\t\tconst nodeName = parsedPath.nodeName;\n\n\t\t\tconsole.error( 'THREE.PropertyBinding: Trying to update property for track: ' + nodeName +\n\t\t\t\t'.' + propertyName + ' but it wasn\\'t found.', targetObject );\n\t\t\treturn;\n\n\t\t}\n\n\t\t// determine versioning scheme\n\t\tlet versioning = this.Versioning.None;\n\n\t\tthis.targetObject = targetObject;\n\n\t\tif ( targetObject.needsUpdate !== undefined ) { // material\n\n\t\t\tversioning = this.Versioning.NeedsUpdate;\n\n\t\t} else if ( targetObject.matrixWorldNeedsUpdate !== undefined ) { // node transform\n\n\t\t\tversioning = this.Versioning.MatrixWorldNeedsUpdate;\n\n\t\t}\n\n\t\t// determine how the property gets bound\n\t\tlet bindingType = this.BindingType.Direct;\n\n\t\tif ( propertyIndex !== undefined ) {\n\n\t\t\t// access a sub element of the property array (only primitives are supported right now)\n\n\t\t\tif ( propertyName === 'morphTargetInfluences' ) {\n\n\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// support resolving morphTarget names into indices.\n\t\t\t\tif ( ! targetObject.geometry ) {\n\n\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.', this );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tif ( ! targetObject.geometry.morphAttributes ) {\n\n\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphAttributes.', this );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tif ( targetObject.morphTargetDictionary[ propertyIndex ] !== undefined ) {\n\n\t\t\t\t\tpropertyIndex = targetObject.morphTargetDictionary[ propertyIndex ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tbindingType = this.BindingType.ArrayElement;\n\n\t\t\tthis.resolvedProperty = nodeProperty;\n\t\t\tthis.propertyIndex = propertyIndex;\n\n\t\t} else if ( nodeProperty.fromArray !== undefined && nodeProperty.toArray !== undefined ) {\n\n\t\t\t// must use copy for Object3D.Euler/Quaternion\n\n\t\t\tbindingType = this.BindingType.HasFromToArray;\n\n\t\t\tthis.resolvedProperty = nodeProperty;\n\n\t\t} else if ( Array.isArray( nodeProperty ) ) {\n\n\t\t\tbindingType = this.BindingType.EntireArray;\n\n\t\t\tthis.resolvedProperty = nodeProperty;\n\n\t\t} else {\n\n\t\t\tthis.propertyName = propertyName;\n\n\t\t}\n\n\t\t// select getter / setter\n\t\tthis.getValue = this.GetterByBindingType[ bindingType ];\n\t\tthis.setValue = this.SetterByBindingTypeAndVersioning[ bindingType ][ versioning ];\n\n\t}\n\n\tunbind() {\n\n\t\tthis.node = null;\n\n\t\t// back to the prototype version of getValue / setValue\n\t\t// note: avoiding to mutate the shape of 'this' via 'delete'\n\t\tthis.getValue = this._getValue_unbound;\n\t\tthis.setValue = this._setValue_unbound;\n\n\t}\n\n}\n\nPropertyBinding.Composite = Composite;\n\nPropertyBinding.prototype.BindingType = {\n\tDirect: 0,\n\tEntireArray: 1,\n\tArrayElement: 2,\n\tHasFromToArray: 3\n};\n\nPropertyBinding.prototype.Versioning = {\n\tNone: 0,\n\tNeedsUpdate: 1,\n\tMatrixWorldNeedsUpdate: 2\n};\n\nPropertyBinding.prototype.GetterByBindingType = [\n\n\tPropertyBinding.prototype._getValue_direct,\n\tPropertyBinding.prototype._getValue_array,\n\tPropertyBinding.prototype._getValue_arrayElement,\n\tPropertyBinding.prototype._getValue_toArray,\n\n];\n\nPropertyBinding.prototype.SetterByBindingTypeAndVersioning = [\n\n\t[\n\t\t// Direct\n\t\tPropertyBinding.prototype._setValue_direct,\n\t\tPropertyBinding.prototype._setValue_direct_setNeedsUpdate,\n\t\tPropertyBinding.prototype._setValue_direct_setMatrixWorldNeedsUpdate,\n\n\t], [\n\n\t\t// EntireArray\n\n\t\tPropertyBinding.prototype._setValue_array,\n\t\tPropertyBinding.prototype._setValue_array_setNeedsUpdate,\n\t\tPropertyBinding.prototype._setValue_array_setMatrixWorldNeedsUpdate,\n\n\t], [\n\n\t\t// ArrayElement\n\t\tPropertyBinding.prototype._setValue_arrayElement,\n\t\tPropertyBinding.prototype._setValue_arrayElement_setNeedsUpdate,\n\t\tPropertyBinding.prototype._setValue_arrayElement_setMatrixWorldNeedsUpdate,\n\n\t], [\n\n\t\t// HasToFromArray\n\t\tPropertyBinding.prototype._setValue_fromArray,\n\t\tPropertyBinding.prototype._setValue_fromArray_setNeedsUpdate,\n\t\tPropertyBinding.prototype._setValue_fromArray_setMatrixWorldNeedsUpdate,\n\n\t]\n\n];\n\n/**\n *\n * A group of objects that receives a shared animation state.\n *\n * Usage:\n *\n * - Add objects you would otherwise pass as 'root' to the\n * constructor or the .clipAction method of AnimationMixer.\n *\n * - Instead pass this object as 'root'.\n *\n * - You can also add and remove objects later when the mixer\n * is running.\n *\n * Note:\n *\n * Objects of this class appear as one object to the mixer,\n * so cache control of the individual objects must be done\n * on the group.\n *\n * Limitation:\n *\n * - The animated properties must be compatible among the\n * all objects in the group.\n *\n * - A single property can either be controlled through a\n * target group or directly, but not both.\n */\n\nclass AnimationObjectGroup {\n\n\tconstructor() {\n\n\t\tthis.isAnimationObjectGroup = true;\n\n\t\tthis.uuid = 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; // threshold\n\t\t// note: read by PropertyBinding.Composite\n\n\t\tconst indices = {};\n\t\tthis._indicesByUUID = indices; // for bookkeeping\n\n\t\tfor ( let 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 = []; // inside: string\n\t\tthis._parsedPaths = []; // inside: { we don't care, here }\n\t\tthis._bindings = []; // inside: Array< PropertyBinding >\n\t\tthis._bindingsIndicesByPath = {}; // inside: indices in these arrays\n\n\t\tconst scope = this;\n\n\t\tthis.stats = {\n\n\t\t\tobjects: {\n\t\t\t\tget total() {\n\n\t\t\t\t\treturn scope._objects.length;\n\n\t\t\t\t},\n\t\t\t\tget inUse() {\n\n\t\t\t\t\treturn this.total - scope.nCachedObjects_;\n\n\t\t\t\t}\n\t\t\t},\n\t\t\tget bindingsPerObject() {\n\n\t\t\t\treturn scope._bindings.length;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\tadd() {\n\n\t\tconst objects = this._objects,\n\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\tpaths = this._paths,\n\t\t\tparsedPaths = this._parsedPaths,\n\t\t\tbindings = this._bindings,\n\t\t\tnBindings = bindings.length;\n\n\t\tlet knownObject = undefined,\n\t\t\tnObjects = objects.length,\n\t\t\tnCachedObjects = this.nCachedObjects_;\n\n\t\tfor ( let i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tconst object = arguments[ i ],\n\t\t\t\tuuid = object.uuid;\n\t\t\tlet index = indicesByUUID[ uuid ];\n\n\t\t\tif ( index === undefined ) {\n\n\t\t\t\t// unknown object -> add it to the ACTIVE region\n\n\t\t\t\tindex = nObjects ++;\n\t\t\t\tindicesByUUID[ uuid ] = index;\n\t\t\t\tobjects.push( object );\n\n\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\tbindings[ j ].push( new PropertyBinding( object, paths[ j ], parsedPaths[ j ] ) );\n\n\t\t\t\t}\n\n\t\t\t} else if ( index < nCachedObjects ) {\n\n\t\t\t\tknownObject = objects[ index ];\n\n\t\t\t\t// move existing object to the ACTIVE region\n\n\t\t\t\tconst firstActiveIndex = -- nCachedObjects,\n\t\t\t\t\tlastCachedObject = objects[ firstActiveIndex ];\n\n\t\t\t\tindicesByUUID[ lastCachedObject.uuid ] = index;\n\t\t\t\tobjects[ index ] = lastCachedObject;\n\n\t\t\t\tindicesByUUID[ uuid ] = firstActiveIndex;\n\t\t\t\tobjects[ firstActiveIndex ] = object;\n\n\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\tconst bindingsForPath = bindings[ j ],\n\t\t\t\t\t\tlastCached = bindingsForPath[ firstActiveIndex ];\n\n\t\t\t\t\tlet binding = bindingsForPath[ index ];\n\n\t\t\t\t\tbindingsForPath[ index ] = lastCached;\n\n\t\t\t\t\tif ( binding === undefined ) {\n\n\t\t\t\t\t\t// since we do not bother to create new bindings\n\t\t\t\t\t\t// for objects that are cached, the binding may\n\t\t\t\t\t\t// or may not exist\n\n\t\t\t\t\t\tbinding = new PropertyBinding( object, paths[ j ], parsedPaths[ j ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbindingsForPath[ firstActiveIndex ] = binding;\n\n\t\t\t\t}\n\n\t\t\t} else if ( objects[ index ] !== knownObject ) {\n\n\t\t\t\tconsole.error( 'THREE.AnimationObjectGroup: Different objects with the same UUID ' +\n\t\t\t\t\t'detected. Clean the caches or recreate your infrastructure when reloading scenes.' );\n\n\t\t\t} // else the object is already where we want it to be\n\n\t\t} // for arguments\n\n\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t}\n\n\tremove() {\n\n\t\tconst objects = this._objects,\n\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\tbindings = this._bindings,\n\t\t\tnBindings = bindings.length;\n\n\t\tlet nCachedObjects = this.nCachedObjects_;\n\n\t\tfor ( let i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tconst object = arguments[ i ],\n\t\t\t\tuuid = object.uuid,\n\t\t\t\tindex = indicesByUUID[ uuid ];\n\n\t\t\tif ( index !== undefined && index >= nCachedObjects ) {\n\n\t\t\t\t// move existing object into the CACHED region\n\n\t\t\t\tconst lastCachedIndex = nCachedObjects ++,\n\t\t\t\t\tfirstActiveObject = objects[ lastCachedIndex ];\n\n\t\t\t\tindicesByUUID[ firstActiveObject.uuid ] = index;\n\t\t\t\tobjects[ index ] = firstActiveObject;\n\n\t\t\t\tindicesByUUID[ uuid ] = lastCachedIndex;\n\t\t\t\tobjects[ lastCachedIndex ] = object;\n\n\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\tconst bindingsForPath = bindings[ j ],\n\t\t\t\t\t\tfirstActive = bindingsForPath[ lastCachedIndex ],\n\t\t\t\t\t\tbinding = bindingsForPath[ index ];\n\n\t\t\t\t\tbindingsForPath[ index ] = firstActive;\n\t\t\t\t\tbindingsForPath[ lastCachedIndex ] = binding;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} // for arguments\n\n\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t}\n\n\t// remove & forget\n\tuncache() {\n\n\t\tconst objects = this._objects,\n\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\tbindings = this._bindings,\n\t\t\tnBindings = bindings.length;\n\n\t\tlet nCachedObjects = this.nCachedObjects_,\n\t\t\tnObjects = objects.length;\n\n\t\tfor ( let i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tconst object = arguments[ i ],\n\t\t\t\tuuid = object.uuid,\n\t\t\t\tindex = indicesByUUID[ uuid ];\n\n\t\t\tif ( index !== undefined ) {\n\n\t\t\t\tdelete indicesByUUID[ uuid ];\n\n\t\t\t\tif ( index < nCachedObjects ) {\n\n\t\t\t\t\t// object is cached, shrink the CACHED region\n\n\t\t\t\t\tconst firstActiveIndex = -- nCachedObjects,\n\t\t\t\t\t\tlastCachedObject = objects[ firstActiveIndex ],\n\t\t\t\t\t\tlastIndex = -- nObjects,\n\t\t\t\t\t\tlastObject = objects[ lastIndex ];\n\n\t\t\t\t\t// last cached object takes this object's place\n\t\t\t\t\tindicesByUUID[ lastCachedObject.uuid ] = index;\n\t\t\t\t\tobjects[ index ] = lastCachedObject;\n\n\t\t\t\t\t// last object goes to the activated slot and pop\n\t\t\t\t\tindicesByUUID[ lastObject.uuid ] = firstActiveIndex;\n\t\t\t\t\tobjects[ firstActiveIndex ] = lastObject;\n\t\t\t\t\tobjects.pop();\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tconst bindingsForPath = bindings[ j ],\n\t\t\t\t\t\t\tlastCached = bindingsForPath[ firstActiveIndex ],\n\t\t\t\t\t\t\tlast = bindingsForPath[ lastIndex ];\n\n\t\t\t\t\t\tbindingsForPath[ index ] = lastCached;\n\t\t\t\t\t\tbindingsForPath[ firstActiveIndex ] = last;\n\t\t\t\t\t\tbindingsForPath.pop();\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// object is active, just swap with the last and pop\n\n\t\t\t\t\tconst lastIndex = -- nObjects,\n\t\t\t\t\t\tlastObject = objects[ lastIndex ];\n\n\t\t\t\t\tif ( lastIndex > 0 ) {\n\n\t\t\t\t\t\tindicesByUUID[ lastObject.uuid ] = index;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tobjects[ index ] = lastObject;\n\t\t\t\t\tobjects.pop();\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tconst bindingsForPath = bindings[ j ];\n\n\t\t\t\t\t\tbindingsForPath[ index ] = bindingsForPath[ lastIndex ];\n\t\t\t\t\t\tbindingsForPath.pop();\n\n\t\t\t\t\t}\n\n\t\t\t\t} // cached or active\n\n\t\t\t} // if object is known\n\n\t\t} // for arguments\n\n\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t}\n\n\t// Internal interface used by befriended PropertyBinding.Composite:\n\n\tsubscribe_( path, parsedPath ) {\n\n\t\t// returns an array of bindings for the given path that is changed\n\t\t// according to the contained objects in the group\n\n\t\tconst indicesByPath = this._bindingsIndicesByPath;\n\t\tlet index = indicesByPath[ path ];\n\t\tconst bindings = this._bindings;\n\n\t\tif ( index !== undefined ) return bindings[ index ];\n\n\t\tconst paths = this._paths,\n\t\t\tparsedPaths = this._parsedPaths,\n\t\t\tobjects = this._objects,\n\t\t\tnObjects = objects.length,\n\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\tbindingsForPath = new Array( nObjects );\n\n\t\tindex = bindings.length;\n\n\t\tindicesByPath[ path ] = index;\n\n\t\tpaths.push( path );\n\t\tparsedPaths.push( parsedPath );\n\t\tbindings.push( bindingsForPath );\n\n\t\tfor ( let i = nCachedObjects, n = objects.length; i !== n; ++ i ) {\n\n\t\t\tconst object = objects[ i ];\n\t\t\tbindingsForPath[ i ] = new PropertyBinding( object, path, parsedPath );\n\n\t\t}\n\n\t\treturn bindingsForPath;\n\n\t}\n\n\tunsubscribe_( path ) {\n\n\t\t// tells the group to forget about a property path and no longer\n\t\t// update the array previously obtained with 'subscribe_'\n\n\t\tconst indicesByPath = this._bindingsIndicesByPath,\n\t\t\tindex = indicesByPath[ path ];\n\n\t\tif ( index !== undefined ) {\n\n\t\t\tconst paths = this._paths,\n\t\t\t\tparsedPaths = this._parsedPaths,\n\t\t\t\tbindings = this._bindings,\n\t\t\t\tlastBindingsIndex = bindings.length - 1,\n\t\t\t\tlastBindings = bindings[ lastBindingsIndex ],\n\t\t\t\tlastBindingsPath = path[ lastBindingsIndex ];\n\n\t\t\tindicesByPath[ lastBindingsPath ] = index;\n\n\t\t\tbindings[ index ] = lastBindings;\n\t\t\tbindings.pop();\n\n\t\t\tparsedPaths[ index ] = parsedPaths[ lastBindingsIndex ];\n\t\t\tparsedPaths.pop();\n\n\t\t\tpaths[ index ] = paths[ lastBindingsIndex ];\n\t\t\tpaths.pop();\n\n\t\t}\n\n\t}\n\n}\n\nclass AnimationAction {\n\n\tconstructor( mixer, clip, localRoot = null, blendMode = clip.blendMode ) {\n\n\t\tthis._mixer = mixer;\n\t\tthis._clip = clip;\n\t\tthis._localRoot = localRoot;\n\t\tthis.blendMode = blendMode;\n\n\t\tconst tracks = clip.tracks,\n\t\t\tnTracks = tracks.length,\n\t\t\tinterpolants = new Array( nTracks );\n\n\t\tconst interpolantSettings = {\n\t\t\tendingStart: ZeroCurvatureEnding,\n\t\t\tendingEnd: ZeroCurvatureEnding\n\t\t};\n\n\t\tfor ( let i = 0; i !== nTracks; ++ i ) {\n\n\t\t\tconst 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; // 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; // for the memory manager\n\t\tthis._byClipCacheIndex = null; // 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; // no. of repetitions when looping\n\n\t\tthis.paused = false; // true -> zero effective time scale\n\t\tthis.enabled = true; // false -> zero effective weight\n\n\t\tthis.clampWhenFinished = false;// keep feeding the last frame?\n\n\t\tthis.zeroSlopeAtStart = true;// for smooth interpolation w/o separate\n\t\tthis.zeroSlopeAtEnd = true;// clips for start, loop and end\n\n\t}\n\n\t// State & Scheduling\n\n\tplay() {\n\n\t\tthis._mixer._activateAction( this );\n\n\t\treturn this;\n\n\t}\n\n\tstop() {\n\n\t\tthis._mixer._deactivateAction( this );\n\n\t\treturn this.reset();\n\n\t}\n\n\treset() {\n\n\t\tthis.paused = false;\n\t\tthis.enabled = true;\n\n\t\tthis.time = 0; // restart clip\n\t\tthis._loopCount = - 1;// forget previous loops\n\t\tthis._startTime = null;// forget scheduling\n\n\t\treturn this.stopFading().stopWarping();\n\n\t}\n\n\tisRunning() {\n\n\t\treturn this.enabled && ! this.paused && this.timeScale !== 0 &&\n\t\t\tthis._startTime === null && this._mixer._isActiveAction( this );\n\n\t}\n\n\t// return true when play has been called\n\tisScheduled() {\n\n\t\treturn this._mixer._isActiveAction( this );\n\n\t}\n\n\tstartAt( time ) {\n\n\t\tthis._startTime = time;\n\n\t\treturn this;\n\n\t}\n\n\tsetLoop( mode, repetitions ) {\n\n\t\tthis.loop = mode;\n\t\tthis.repetitions = repetitions;\n\n\t\treturn this;\n\n\t}\n\n\t// Weight\n\n\t// set the weight stopping any scheduled fading\n\t// although .enabled = false yields an effective weight of zero, this\n\t// method does *not* change .enabled, because it would be confusing\n\tsetEffectiveWeight( weight ) {\n\n\t\tthis.weight = weight;\n\n\t\t// note: same logic as when updated at runtime\n\t\tthis._effectiveWeight = this.enabled ? weight : 0;\n\n\t\treturn this.stopFading();\n\n\t}\n\n\t// return the weight considering fading and .enabled\n\tgetEffectiveWeight() {\n\n\t\treturn this._effectiveWeight;\n\n\t}\n\n\tfadeIn( duration ) {\n\n\t\treturn this._scheduleFading( duration, 0, 1 );\n\n\t}\n\n\tfadeOut( duration ) {\n\n\t\treturn this._scheduleFading( duration, 1, 0 );\n\n\t}\n\n\tcrossFadeFrom( fadeOutAction, duration, warp ) {\n\n\t\tfadeOutAction.fadeOut( duration );\n\t\tthis.fadeIn( duration );\n\n\t\tif ( warp ) {\n\n\t\t\tconst fadeInDuration = this._clip.duration,\n\t\t\t\tfadeOutDuration = fadeOutAction._clip.duration,\n\n\t\t\t\tstartEndRatio = fadeOutDuration / fadeInDuration,\n\t\t\t\tendStartRatio = fadeInDuration / fadeOutDuration;\n\n\t\t\tfadeOutAction.warp( 1.0, startEndRatio, duration );\n\t\t\tthis.warp( endStartRatio, 1.0, duration );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tcrossFadeTo( fadeInAction, duration, warp ) {\n\n\t\treturn fadeInAction.crossFadeFrom( this, duration, warp );\n\n\t}\n\n\tstopFading() {\n\n\t\tconst weightInterpolant = this._weightInterpolant;\n\n\t\tif ( weightInterpolant !== null ) {\n\n\t\t\tthis._weightInterpolant = null;\n\t\t\tthis._mixer._takeBackControlInterpolant( weightInterpolant );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t// Time Scale Control\n\n\t// set the time scale stopping any scheduled warping\n\t// although .paused = true yields an effective time scale of zero, this\n\t// method does *not* change .paused, because it would be confusing\n\tsetEffectiveTimeScale( timeScale ) {\n\n\t\tthis.timeScale = timeScale;\n\t\tthis._effectiveTimeScale = this.paused ? 0 : timeScale;\n\n\t\treturn this.stopWarping();\n\n\t}\n\n\t// return the time scale considering warping and .paused\n\tgetEffectiveTimeScale() {\n\n\t\treturn this._effectiveTimeScale;\n\n\t}\n\n\tsetDuration( duration ) {\n\n\t\tthis.timeScale = this._clip.duration / duration;\n\n\t\treturn this.stopWarping();\n\n\t}\n\n\tsyncWith( action ) {\n\n\t\tthis.time = action.time;\n\t\tthis.timeScale = action.timeScale;\n\n\t\treturn this.stopWarping();\n\n\t}\n\n\thalt( duration ) {\n\n\t\treturn this.warp( this._effectiveTimeScale, 0, duration );\n\n\t}\n\n\twarp( startTimeScale, endTimeScale, duration ) {\n\n\t\tconst mixer = this._mixer,\n\t\t\tnow = mixer.time,\n\t\t\ttimeScale = this.timeScale;\n\n\t\tlet interpolant = this._timeScaleInterpolant;\n\n\t\tif ( interpolant === null ) {\n\n\t\t\tinterpolant = mixer._lendControlInterpolant();\n\t\t\tthis._timeScaleInterpolant = interpolant;\n\n\t\t}\n\n\t\tconst times = interpolant.parameterPositions,\n\t\t\tvalues = interpolant.sampleValues;\n\n\t\ttimes[ 0 ] = now;\n\t\ttimes[ 1 ] = now + duration;\n\n\t\tvalues[ 0 ] = startTimeScale / timeScale;\n\t\tvalues[ 1 ] = endTimeScale / timeScale;\n\n\t\treturn this;\n\n\t}\n\n\tstopWarping() {\n\n\t\tconst timeScaleInterpolant = this._timeScaleInterpolant;\n\n\t\tif ( timeScaleInterpolant !== null ) {\n\n\t\t\tthis._timeScaleInterpolant = null;\n\t\t\tthis._mixer._takeBackControlInterpolant( timeScaleInterpolant );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t// Object Accessors\n\n\tgetMixer() {\n\n\t\treturn this._mixer;\n\n\t}\n\n\tgetClip() {\n\n\t\treturn this._clip;\n\n\t}\n\n\tgetRoot() {\n\n\t\treturn this._localRoot || this._mixer._root;\n\n\t}\n\n\t// Interna\n\n\t_update( time, deltaTime, timeDirection, accuIndex ) {\n\n\t\t// called by the mixer\n\n\t\tif ( ! this.enabled ) {\n\n\t\t\t// call ._updateWeight() to update ._effectiveWeight\n\n\t\t\tthis._updateWeight( time );\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst startTime = this._startTime;\n\n\t\tif ( startTime !== null ) {\n\n\t\t\t// check for scheduled start of action\n\n\t\t\tconst timeRunning = ( time - startTime ) * timeDirection;\n\t\t\tif ( timeRunning < 0 || timeDirection === 0 ) {\n\n\t\t\t\treturn; // yet to come / don't decide when delta = 0\n\n\t\t\t}\n\n\t\t\t// start\n\n\t\t\tthis._startTime = null; // unschedule\n\t\t\tdeltaTime = timeDirection * timeRunning;\n\n\t\t}\n\n\t\t// apply time scale and advance time\n\n\t\tdeltaTime *= this._updateTimeScale( time );\n\t\tconst clipTime = this._updateTime( deltaTime );\n\n\t\t// note: _updateTime may disable the action resulting in\n\t\t// an effective weight of 0\n\n\t\tconst weight = this._updateWeight( time );\n\n\t\tif ( weight > 0 ) {\n\n\t\t\tconst interpolants = this._interpolants;\n\t\t\tconst propertyMixers = this._propertyBindings;\n\n\t\t\tswitch ( this.blendMode ) {\n\n\t\t\t\tcase AdditiveAnimationBlendMode:\n\n\t\t\t\t\tfor ( let j = 0, m = interpolants.length; j !== m; ++ j ) {\n\n\t\t\t\t\t\tinterpolants[ j ].evaluate( clipTime );\n\t\t\t\t\t\tpropertyMixers[ j ].accumulateAdditive( weight );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase NormalAnimationBlendMode:\n\t\t\t\tdefault:\n\n\t\t\t\t\tfor ( let j = 0, m = interpolants.length; j !== m; ++ j ) {\n\n\t\t\t\t\t\tinterpolants[ j ].evaluate( clipTime );\n\t\t\t\t\t\tpropertyMixers[ j ].accumulate( accuIndex, weight );\n\n\t\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_updateWeight( time ) {\n\n\t\tlet weight = 0;\n\n\t\tif ( this.enabled ) {\n\n\t\t\tweight = this.weight;\n\t\t\tconst interpolant = this._weightInterpolant;\n\n\t\t\tif ( interpolant !== null ) {\n\n\t\t\t\tconst interpolantValue = interpolant.evaluate( time )[ 0 ];\n\n\t\t\t\tweight *= interpolantValue;\n\n\t\t\t\tif ( time > interpolant.parameterPositions[ 1 ] ) {\n\n\t\t\t\t\tthis.stopFading();\n\n\t\t\t\t\tif ( interpolantValue === 0 ) {\n\n\t\t\t\t\t\t// faded out, disable\n\t\t\t\t\t\tthis.enabled = 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\tthis._effectiveWeight = weight;\n\t\treturn weight;\n\n\t}\n\n\t_updateTimeScale( time ) {\n\n\t\tlet timeScale = 0;\n\n\t\tif ( ! this.paused ) {\n\n\t\t\ttimeScale = this.timeScale;\n\n\t\t\tconst interpolant = this._timeScaleInterpolant;\n\n\t\t\tif ( interpolant !== null ) {\n\n\t\t\t\tconst interpolantValue = interpolant.evaluate( time )[ 0 ];\n\n\t\t\t\ttimeScale *= interpolantValue;\n\n\t\t\t\tif ( time > interpolant.parameterPositions[ 1 ] ) {\n\n\t\t\t\t\tthis.stopWarping();\n\n\t\t\t\t\tif ( timeScale === 0 ) {\n\n\t\t\t\t\t\t// motion has halted, pause\n\t\t\t\t\t\tthis.paused = true;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// warp done - apply final time scale\n\t\t\t\t\t\tthis.timeScale = timeScale;\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\tthis._effectiveTimeScale = timeScale;\n\t\treturn timeScale;\n\n\t}\n\n\t_updateTime( deltaTime ) {\n\n\t\tconst duration = this._clip.duration;\n\t\tconst loop = this.loop;\n\n\t\tlet time = this.time + deltaTime;\n\t\tlet loopCount = this._loopCount;\n\n\t\tconst pingPong = ( loop === LoopPingPong );\n\n\t\tif ( deltaTime === 0 ) {\n\n\t\t\tif ( loopCount === - 1 ) return time;\n\n\t\t\treturn ( pingPong && ( loopCount & 1 ) === 1 ) ? duration - time : time;\n\n\t\t}\n\n\t\tif ( loop === LoopOnce ) {\n\n\t\t\tif ( loopCount === - 1 ) {\n\n\t\t\t\t// just started\n\n\t\t\t\tthis._loopCount = 0;\n\t\t\t\tthis._setEndings( true, true, false );\n\n\t\t\t}\n\n\t\t\thandle_stop: {\n\n\t\t\t\tif ( time >= duration ) {\n\n\t\t\t\t\ttime = duration;\n\n\t\t\t\t} else if ( time < 0 ) {\n\n\t\t\t\t\ttime = 0;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis.time = time;\n\n\t\t\t\t\tbreak handle_stop;\n\n\t\t\t\t}\n\n\t\t\t\tif ( this.clampWhenFinished ) this.paused = true;\n\t\t\t\telse this.enabled = false;\n\n\t\t\t\tthis.time = time;\n\n\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\ttype: 'finished', action: this,\n\t\t\t\t\tdirection: deltaTime < 0 ? - 1 : 1\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t} else { // repetitive Repeat or PingPong\n\n\t\t\tif ( loopCount === - 1 ) {\n\n\t\t\t\t// just started\n\n\t\t\t\tif ( deltaTime >= 0 ) {\n\n\t\t\t\t\tloopCount = 0;\n\n\t\t\t\t\tthis._setEndings( true, this.repetitions === 0, pingPong );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// when looping in reverse direction, the initial\n\t\t\t\t\t// transition through zero counts as a repetition,\n\t\t\t\t\t// so leave loopCount at -1\n\n\t\t\t\t\tthis._setEndings( this.repetitions === 0, true, pingPong );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( time >= duration || time < 0 ) {\n\n\t\t\t\t// wrap around\n\n\t\t\t\tconst loopDelta = Math.floor( time / duration ); // signed\n\t\t\t\ttime -= duration * loopDelta;\n\n\t\t\t\tloopCount += Math.abs( loopDelta );\n\n\t\t\t\tconst pending = this.repetitions - loopCount;\n\n\t\t\t\tif ( pending <= 0 ) {\n\n\t\t\t\t\t// have to stop (switch state, clamp time, fire event)\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\ttime = deltaTime > 0 ? duration : 0;\n\n\t\t\t\t\tthis.time = time;\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} else {\n\n\t\t\t\t\t// keep running\n\n\t\t\t\t\tif ( pending === 1 ) {\n\n\t\t\t\t\t\t// entering the last round\n\n\t\t\t\t\t\tconst atStart = deltaTime < 0;\n\t\t\t\t\t\tthis._setEndings( atStart, ! atStart, pingPong );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthis._setEndings( false, false, pingPong );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis._loopCount = loopCount;\n\n\t\t\t\t\tthis.time = time;\n\n\t\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\t\ttype: 'loop', action: this, loopDelta: loopDelta\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tthis.time = time;\n\n\t\t\t}\n\n\t\t\tif ( pingPong && ( loopCount & 1 ) === 1 ) {\n\n\t\t\t\t// invert time for the \"pong round\"\n\n\t\t\t\treturn duration - time;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn time;\n\n\t}\n\n\t_setEndings( atStart, atEnd, pingPong ) {\n\n\t\tconst settings = this._interpolantSettings;\n\n\t\tif ( pingPong ) {\n\n\t\t\tsettings.endingStart = ZeroSlopeEnding;\n\t\t\tsettings.endingEnd = ZeroSlopeEnding;\n\n\t\t} else {\n\n\t\t\t// assuming for LoopOnce atStart == atEnd == true\n\n\t\t\tif ( atStart ) {\n\n\t\t\t\tsettings.endingStart = this.zeroSlopeAtStart ? ZeroSlopeEnding : ZeroCurvatureEnding;\n\n\t\t\t} else {\n\n\t\t\t\tsettings.endingStart = WrapAroundEnding;\n\n\t\t\t}\n\n\t\t\tif ( atEnd ) {\n\n\t\t\t\tsettings.endingEnd = this.zeroSlopeAtEnd ? ZeroSlopeEnding : ZeroCurvatureEnding;\n\n\t\t\t} else {\n\n\t\t\t\tsettings.endingEnd \t = WrapAroundEnding;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_scheduleFading( duration, weightNow, weightThen ) {\n\n\t\tconst mixer = this._mixer, now = mixer.time;\n\t\tlet interpolant = this._weightInterpolant;\n\n\t\tif ( interpolant === null ) {\n\n\t\t\tinterpolant = mixer._lendControlInterpolant();\n\t\t\tthis._weightInterpolant = interpolant;\n\n\t\t}\n\n\t\tconst times = interpolant.parameterPositions,\n\t\t\tvalues = interpolant.sampleValues;\n\n\t\ttimes[ 0 ] = now;\n\t\tvalues[ 0 ] = weightNow;\n\t\ttimes[ 1 ] = now + duration;\n\t\tvalues[ 1 ] = weightThen;\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _controlInterpolantsResultBuffer = new Float32Array( 1 );\n\n\nclass AnimationMixer extends EventDispatcher {\n\n\tconstructor( root ) {\n\n\t\tsuper();\n\n\t\tthis._root = root;\n\t\tthis._initMemoryManager();\n\t\tthis._accuIndex = 0;\n\t\tthis.time = 0;\n\t\tthis.timeScale = 1.0;\n\n\t}\n\n\t_bindAction( action, prototypeAction ) {\n\n\t\tconst root = action._localRoot || this._root,\n\t\t\ttracks = action._clip.tracks,\n\t\t\tnTracks = tracks.length,\n\t\t\tbindings = action._propertyBindings,\n\t\t\tinterpolants = action._interpolants,\n\t\t\trootUuid = root.uuid,\n\t\t\tbindingsByRoot = this._bindingsByRootAndName;\n\n\t\tlet bindingsByName = bindingsByRoot[ rootUuid ];\n\n\t\tif ( bindingsByName === undefined ) {\n\n\t\t\tbindingsByName = {};\n\t\t\tbindingsByRoot[ rootUuid ] = bindingsByName;\n\n\t\t}\n\n\t\tfor ( let i = 0; i !== nTracks; ++ i ) {\n\n\t\t\tconst track = tracks[ i ],\n\t\t\t\ttrackName = track.name;\n\n\t\t\tlet binding = bindingsByName[ trackName ];\n\n\t\t\tif ( binding !== undefined ) {\n\n\t\t\t\t++ binding.referenceCount;\n\t\t\t\tbindings[ i ] = binding;\n\n\t\t\t} else {\n\n\t\t\t\tbinding = bindings[ i ];\n\n\t\t\t\tif ( binding !== undefined ) {\n\n\t\t\t\t\t// existing binding, make sure the cache knows\n\n\t\t\t\t\tif ( binding._cacheIndex === null ) {\n\n\t\t\t\t\t\t++ binding.referenceCount;\n\t\t\t\t\t\tthis._addInactiveBinding( binding, rootUuid, trackName );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tconst path = prototypeAction && prototypeAction.\n\t\t\t\t\t_propertyBindings[ i ].binding.parsedPath;\n\n\t\t\t\tbinding = new PropertyMixer(\n\t\t\t\t\tPropertyBinding.create( root, trackName, path ),\n\t\t\t\t\ttrack.ValueTypeName, track.getValueSize() );\n\n\t\t\t\t++ binding.referenceCount;\n\t\t\t\tthis._addInactiveBinding( binding, rootUuid, trackName );\n\n\t\t\t\tbindings[ i ] = binding;\n\n\t\t\t}\n\n\t\t\tinterpolants[ i ].resultBuffer = binding.buffer;\n\n\t\t}\n\n\t}\n\n\t_activateAction( action ) {\n\n\t\tif ( ! this._isActiveAction( action ) ) {\n\n\t\t\tif ( action._cacheIndex === null ) {\n\n\t\t\t\t// this action has been forgotten by the cache, but the user\n\t\t\t\t// appears to be still using it -> rebind\n\n\t\t\t\tconst rootUuid = ( action._localRoot || this._root ).uuid,\n\t\t\t\t\tclipUuid = action._clip.uuid,\n\t\t\t\t\tactionsForClip = this._actionsByClip[ clipUuid ];\n\n\t\t\t\tthis._bindAction( action,\n\t\t\t\t\tactionsForClip && actionsForClip.knownActions[ 0 ] );\n\n\t\t\t\tthis._addInactiveAction( action, clipUuid, rootUuid );\n\n\t\t\t}\n\n\t\t\tconst bindings = action._propertyBindings;\n\n\t\t\t// increment reference counts / sort out state\n\t\t\tfor ( let i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tconst binding = bindings[ i ];\n\n\t\t\t\tif ( binding.useCount ++ === 0 ) {\n\n\t\t\t\t\tthis._lendBinding( binding );\n\t\t\t\t\tbinding.saveOriginalState();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis._lendAction( action );\n\n\t\t}\n\n\t}\n\n\t_deactivateAction( action ) {\n\n\t\tif ( this._isActiveAction( action ) ) {\n\n\t\t\tconst bindings = action._propertyBindings;\n\n\t\t\t// decrement reference counts / sort out state\n\t\t\tfor ( let i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tconst binding = bindings[ i ];\n\n\t\t\t\tif ( -- binding.useCount === 0 ) {\n\n\t\t\t\t\tbinding.restoreOriginalState();\n\t\t\t\t\tthis._takeBackBinding( binding );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis._takeBackAction( action );\n\n\t\t}\n\n\t}\n\n\t// Memory manager\n\n\t_initMemoryManager() {\n\n\t\tthis._actions = []; // 'nActiveActions' followed by inactive ones\n\t\tthis._nActiveActions = 0;\n\n\t\tthis._actionsByClip = {};\n\t\t// inside:\n\t\t// {\n\t\t// \tknownActions: Array< AnimationAction > - used as prototypes\n\t\t// \tactionByRoot: AnimationAction - lookup\n\t\t// }\n\n\n\t\tthis._bindings = []; // 'nActiveBindings' followed by inactive ones\n\t\tthis._nActiveBindings = 0;\n\n\t\tthis._bindingsByRootAndName = {}; // inside: Map< name, PropertyMixer >\n\n\n\t\tthis._controlInterpolants = []; // same game as above\n\t\tthis._nActiveControlInterpolants = 0;\n\n\t\tconst scope = this;\n\n\t\tthis.stats = {\n\n\t\t\tactions: {\n\t\t\t\tget total() {\n\n\t\t\t\t\treturn scope._actions.length;\n\n\t\t\t\t},\n\t\t\t\tget inUse() {\n\n\t\t\t\t\treturn scope._nActiveActions;\n\n\t\t\t\t}\n\t\t\t},\n\t\t\tbindings: {\n\t\t\t\tget total() {\n\n\t\t\t\t\treturn scope._bindings.length;\n\n\t\t\t\t},\n\t\t\t\tget inUse() {\n\n\t\t\t\t\treturn scope._nActiveBindings;\n\n\t\t\t\t}\n\t\t\t},\n\t\t\tcontrolInterpolants: {\n\t\t\t\tget total() {\n\n\t\t\t\t\treturn scope._controlInterpolants.length;\n\n\t\t\t\t},\n\t\t\t\tget inUse() {\n\n\t\t\t\t\treturn scope._nActiveControlInterpolants;\n\n\t\t\t\t}\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t// Memory management for AnimationAction objects\n\n\t_isActiveAction( action ) {\n\n\t\tconst index = action._cacheIndex;\n\t\treturn index !== null && index < this._nActiveActions;\n\n\t}\n\n\t_addInactiveAction( action, clipUuid, rootUuid ) {\n\n\t\tconst actions = this._actions,\n\t\t\tactionsByClip = this._actionsByClip;\n\n\t\tlet actionsForClip = actionsByClip[ clipUuid ];\n\n\t\tif ( actionsForClip === undefined ) {\n\n\t\t\tactionsForClip = {\n\n\t\t\t\tknownActions: [ action ],\n\t\t\t\tactionByRoot: {}\n\n\t\t\t};\n\n\t\t\taction._byClipCacheIndex = 0;\n\n\t\t\tactionsByClip[ clipUuid ] = actionsForClip;\n\n\t\t} else {\n\n\t\t\tconst knownActions = actionsForClip.knownActions;\n\n\t\t\taction._byClipCacheIndex = knownActions.length;\n\t\t\tknownActions.push( action );\n\n\t\t}\n\n\t\taction._cacheIndex = actions.length;\n\t\tactions.push( action );\n\n\t\tactionsForClip.actionByRoot[ rootUuid ] = action;\n\n\t}\n\n\t_removeInactiveAction( action ) {\n\n\t\tconst actions = this._actions,\n\t\t\tlastInactiveAction = actions[ actions.length - 1 ],\n\t\t\tcacheIndex = action._cacheIndex;\n\n\t\tlastInactiveAction._cacheIndex = cacheIndex;\n\t\tactions[ cacheIndex ] = lastInactiveAction;\n\t\tactions.pop();\n\n\t\taction._cacheIndex = null;\n\n\n\t\tconst clipUuid = action._clip.uuid,\n\t\t\tactionsByClip = this._actionsByClip,\n\t\t\tactionsForClip = actionsByClip[ clipUuid ],\n\t\t\tknownActionsForClip = actionsForClip.knownActions,\n\n\t\t\tlastKnownAction =\n\t\t\t\tknownActionsForClip[ knownActionsForClip.length - 1 ],\n\n\t\t\tbyClipCacheIndex = action._byClipCacheIndex;\n\n\t\tlastKnownAction._byClipCacheIndex = byClipCacheIndex;\n\t\tknownActionsForClip[ byClipCacheIndex ] = lastKnownAction;\n\t\tknownActionsForClip.pop();\n\n\t\taction._byClipCacheIndex = null;\n\n\n\t\tconst actionByRoot = actionsForClip.actionByRoot,\n\t\t\trootUuid = ( action._localRoot || this._root ).uuid;\n\n\t\tdelete actionByRoot[ rootUuid ];\n\n\t\tif ( knownActionsForClip.length === 0 ) {\n\n\t\t\tdelete actionsByClip[ clipUuid ];\n\n\t\t}\n\n\t\tthis._removeInactiveBindingsForAction( action );\n\n\t}\n\n\t_removeInactiveBindingsForAction( action ) {\n\n\t\tconst bindings = action._propertyBindings;\n\n\t\tfor ( let i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tconst binding = bindings[ i ];\n\n\t\t\tif ( -- binding.referenceCount === 0 ) {\n\n\t\t\t\tthis._removeInactiveBinding( binding );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_lendAction( action ) {\n\n\t\t// [ active actions | inactive actions ]\n\t\t// [ active actions >| inactive actions ]\n\t\t// s a\n\t\t// <-swap->\n\t\t// a s\n\n\t\tconst actions = this._actions,\n\t\t\tprevIndex = action._cacheIndex,\n\n\t\t\tlastActiveIndex = this._nActiveActions ++,\n\n\t\t\tfirstInactiveAction = actions[ lastActiveIndex ];\n\n\t\taction._cacheIndex = lastActiveIndex;\n\t\tactions[ lastActiveIndex ] = action;\n\n\t\tfirstInactiveAction._cacheIndex = prevIndex;\n\t\tactions[ prevIndex ] = firstInactiveAction;\n\n\t}\n\n\t_takeBackAction( action ) {\n\n\t\t// [ active actions | inactive actions ]\n\t\t// [ active actions |< inactive actions ]\n\t\t// a s\n\t\t// <-swap->\n\t\t// s a\n\n\t\tconst actions = this._actions,\n\t\t\tprevIndex = action._cacheIndex,\n\n\t\t\tfirstInactiveIndex = -- this._nActiveActions,\n\n\t\t\tlastActiveAction = actions[ firstInactiveIndex ];\n\n\t\taction._cacheIndex = firstInactiveIndex;\n\t\tactions[ firstInactiveIndex ] = action;\n\n\t\tlastActiveAction._cacheIndex = prevIndex;\n\t\tactions[ prevIndex ] = lastActiveAction;\n\n\t}\n\n\t// Memory management for PropertyMixer objects\n\n\t_addInactiveBinding( binding, rootUuid, trackName ) {\n\n\t\tconst bindingsByRoot = this._bindingsByRootAndName,\n\t\t\tbindings = this._bindings;\n\n\t\tlet bindingByName = bindingsByRoot[ rootUuid ];\n\n\t\tif ( bindingByName === undefined ) {\n\n\t\t\tbindingByName = {};\n\t\t\tbindingsByRoot[ rootUuid ] = bindingByName;\n\n\t\t}\n\n\t\tbindingByName[ trackName ] = binding;\n\n\t\tbinding._cacheIndex = bindings.length;\n\t\tbindings.push( binding );\n\n\t}\n\n\t_removeInactiveBinding( binding ) {\n\n\t\tconst bindings = this._bindings,\n\t\t\tpropBinding = binding.binding,\n\t\t\trootUuid = propBinding.rootNode.uuid,\n\t\t\ttrackName = propBinding.path,\n\t\t\tbindingsByRoot = this._bindingsByRootAndName,\n\t\t\tbindingByName = bindingsByRoot[ rootUuid ],\n\n\t\t\tlastInactiveBinding = bindings[ bindings.length - 1 ],\n\t\t\tcacheIndex = binding._cacheIndex;\n\n\t\tlastInactiveBinding._cacheIndex = cacheIndex;\n\t\tbindings[ cacheIndex ] = lastInactiveBinding;\n\t\tbindings.pop();\n\n\t\tdelete bindingByName[ trackName ];\n\n\t\tif ( Object.keys( bindingByName ).length === 0 ) {\n\n\t\t\tdelete bindingsByRoot[ rootUuid ];\n\n\t\t}\n\n\t}\n\n\t_lendBinding( binding ) {\n\n\t\tconst bindings = this._bindings,\n\t\t\tprevIndex = binding._cacheIndex,\n\n\t\t\tlastActiveIndex = this._nActiveBindings ++,\n\n\t\t\tfirstInactiveBinding = bindings[ lastActiveIndex ];\n\n\t\tbinding._cacheIndex = lastActiveIndex;\n\t\tbindings[ lastActiveIndex ] = binding;\n\n\t\tfirstInactiveBinding._cacheIndex = prevIndex;\n\t\tbindings[ prevIndex ] = firstInactiveBinding;\n\n\t}\n\n\t_takeBackBinding( binding ) {\n\n\t\tconst bindings = this._bindings,\n\t\t\tprevIndex = binding._cacheIndex,\n\n\t\t\tfirstInactiveIndex = -- this._nActiveBindings,\n\n\t\t\tlastActiveBinding = bindings[ firstInactiveIndex ];\n\n\t\tbinding._cacheIndex = firstInactiveIndex;\n\t\tbindings[ firstInactiveIndex ] = binding;\n\n\t\tlastActiveBinding._cacheIndex = prevIndex;\n\t\tbindings[ prevIndex ] = lastActiveBinding;\n\n\t}\n\n\n\t// Memory management of Interpolants for weight and time scale\n\n\t_lendControlInterpolant() {\n\n\t\tconst interpolants = this._controlInterpolants,\n\t\t\tlastActiveIndex = this._nActiveControlInterpolants ++;\n\n\t\tlet interpolant = interpolants[ lastActiveIndex ];\n\n\t\tif ( interpolant === undefined ) {\n\n\t\t\tinterpolant = new LinearInterpolant(\n\t\t\t\tnew Float32Array( 2 ), new Float32Array( 2 ),\n\t\t\t\t1, _controlInterpolantsResultBuffer );\n\n\t\t\tinterpolant.__cacheIndex = lastActiveIndex;\n\t\t\tinterpolants[ lastActiveIndex ] = interpolant;\n\n\t\t}\n\n\t\treturn interpolant;\n\n\t}\n\n\t_takeBackControlInterpolant( interpolant ) {\n\n\t\tconst interpolants = this._controlInterpolants,\n\t\t\tprevIndex = interpolant.__cacheIndex,\n\n\t\t\tfirstInactiveIndex = -- this._nActiveControlInterpolants,\n\n\t\t\tlastActiveInterpolant = interpolants[ firstInactiveIndex ];\n\n\t\tinterpolant.__cacheIndex = firstInactiveIndex;\n\t\tinterpolants[ firstInactiveIndex ] = interpolant;\n\n\t\tlastActiveInterpolant.__cacheIndex = prevIndex;\n\t\tinterpolants[ prevIndex ] = lastActiveInterpolant;\n\n\t}\n\n\t// return an action for a clip optionally using a custom root target\n\t// object (this method allocates a lot of dynamic memory in case a\n\t// previously unknown clip/root combination is specified)\n\tclipAction( clip, optionalRoot, blendMode ) {\n\n\t\tconst root = optionalRoot || this._root,\n\t\t\trootUuid = root.uuid;\n\n\t\tlet clipObject = typeof clip === 'string' ? AnimationClip.findByName( root, clip ) : clip;\n\n\t\tconst clipUuid = clipObject !== null ? clipObject.uuid : clip;\n\n\t\tconst actionsForClip = this._actionsByClip[ clipUuid ];\n\t\tlet prototypeAction = null;\n\n\t\tif ( blendMode === undefined ) {\n\n\t\t\tif ( clipObject !== null ) {\n\n\t\t\t\tblendMode = clipObject.blendMode;\n\n\t\t\t} else {\n\n\t\t\t\tblendMode = NormalAnimationBlendMode;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\tconst existingAction = actionsForClip.actionByRoot[ rootUuid ];\n\n\t\t\tif ( existingAction !== undefined && existingAction.blendMode === blendMode ) {\n\n\t\t\t\treturn existingAction;\n\n\t\t\t}\n\n\t\t\t// we know the clip, so we don't have to parse all\n\t\t\t// the bindings again but can just copy\n\t\t\tprototypeAction = actionsForClip.knownActions[ 0 ];\n\n\t\t\t// also, take the clip from the prototype action\n\t\t\tif ( clipObject === null )\n\t\t\t\tclipObject = prototypeAction._clip;\n\n\t\t}\n\n\t\t// clip must be known when specified via string\n\t\tif ( clipObject === null ) return null;\n\n\t\t// allocate all resources required to run it\n\t\tconst newAction = new AnimationAction( this, clipObject, optionalRoot, blendMode );\n\n\t\tthis._bindAction( newAction, prototypeAction );\n\n\t\t// and make the action known to the memory manager\n\t\tthis._addInactiveAction( newAction, clipUuid, rootUuid );\n\n\t\treturn newAction;\n\n\t}\n\n\t// get an existing action\n\texistingAction( clip, optionalRoot ) {\n\n\t\tconst root = optionalRoot || this._root,\n\t\t\trootUuid = root.uuid,\n\n\t\t\tclipObject = typeof clip === 'string' ?\n\t\t\t\tAnimationClip.findByName( root, clip ) : clip,\n\n\t\t\tclipUuid = clipObject ? clipObject.uuid : clip,\n\n\t\t\tactionsForClip = this._actionsByClip[ clipUuid ];\n\n\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\treturn actionsForClip.actionByRoot[ rootUuid ] || null;\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\t// deactivates all previously scheduled actions\n\tstopAllAction() {\n\n\t\tconst actions = this._actions,\n\t\t\tnActions = this._nActiveActions;\n\n\t\tfor ( let i = nActions - 1; i >= 0; -- i ) {\n\n\t\t\tactions[ i ].stop();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t// advance the time and update apply the animation\n\tupdate( deltaTime ) {\n\n\t\tdeltaTime *= this.timeScale;\n\n\t\tconst actions = this._actions,\n\t\t\tnActions = this._nActiveActions,\n\n\t\t\ttime = this.time += deltaTime,\n\t\t\ttimeDirection = Math.sign( deltaTime ),\n\n\t\t\taccuIndex = this._accuIndex ^= 1;\n\n\t\t// run active actions\n\n\t\tfor ( let i = 0; i !== nActions; ++ i ) {\n\n\t\t\tconst action = actions[ i ];\n\n\t\t\taction._update( time, deltaTime, timeDirection, accuIndex );\n\n\t\t}\n\n\t\t// update scene graph\n\n\t\tconst bindings = this._bindings,\n\t\t\tnBindings = this._nActiveBindings;\n\n\t\tfor ( let i = 0; i !== nBindings; ++ i ) {\n\n\t\t\tbindings[ i ].apply( accuIndex );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t// Allows you to seek to a specific time in an animation.\n\tsetTime( timeInSeconds ) {\n\n\t\tthis.time = 0; // Zero out time attribute for AnimationMixer object;\n\t\tfor ( let i = 0; i < this._actions.length; i ++ ) {\n\n\t\t\tthis._actions[ i ].time = 0; // Zero out time attribute for all associated AnimationAction objects.\n\n\t\t}\n\n\t\treturn this.update( timeInSeconds ); // Update used to set exact time. Returns \"this\" AnimationMixer object.\n\n\t}\n\n\t// return this mixer's root target object\n\tgetRoot() {\n\n\t\treturn this._root;\n\n\t}\n\n\t// free all resources specific to a particular clip\n\tuncacheClip( clip ) {\n\n\t\tconst actions = this._actions,\n\t\t\tclipUuid = clip.uuid,\n\t\t\tactionsByClip = this._actionsByClip,\n\t\t\tactionsForClip = actionsByClip[ clipUuid ];\n\n\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\t// note: just calling _removeInactiveAction would mess up the\n\t\t\t// iteration state and also require updating the state we can\n\t\t\t// just throw away\n\n\t\t\tconst actionsToRemove = actionsForClip.knownActions;\n\n\t\t\tfor ( let i = 0, n = actionsToRemove.length; i !== n; ++ i ) {\n\n\t\t\t\tconst action = actionsToRemove[ i ];\n\n\t\t\t\tthis._deactivateAction( action );\n\n\t\t\t\tconst cacheIndex = action._cacheIndex,\n\t\t\t\t\tlastInactiveAction = actions[ actions.length - 1 ];\n\n\t\t\t\taction._cacheIndex = null;\n\t\t\t\taction._byClipCacheIndex = null;\n\n\t\t\t\tlastInactiveAction._cacheIndex = cacheIndex;\n\t\t\t\tactions[ cacheIndex ] = lastInactiveAction;\n\t\t\t\tactions.pop();\n\n\t\t\t\tthis._removeInactiveBindingsForAction( action );\n\n\t\t\t}\n\n\t\t\tdelete actionsByClip[ clipUuid ];\n\n\t\t}\n\n\t}\n\n\t// free all resources specific to a particular root target object\n\tuncacheRoot( root ) {\n\n\t\tconst rootUuid = root.uuid,\n\t\t\tactionsByClip = this._actionsByClip;\n\n\t\tfor ( const clipUuid in actionsByClip ) {\n\n\t\t\tconst actionByRoot = actionsByClip[ clipUuid ].actionByRoot,\n\t\t\t\taction = actionByRoot[ rootUuid ];\n\n\t\t\tif ( action !== undefined ) {\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\tconst bindingsByRoot = this._bindingsByRootAndName,\n\t\t\tbindingByName = bindingsByRoot[ rootUuid ];\n\n\t\tif ( bindingByName !== undefined ) {\n\n\t\t\tfor ( const trackName in bindingByName ) {\n\n\t\t\t\tconst binding = bindingByName[ trackName ];\n\t\t\t\tbinding.restoreOriginalState();\n\t\t\t\tthis._removeInactiveBinding( binding );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t// remove a targeted clip from the cache\n\tuncacheAction( clip, optionalRoot ) {\n\n\t\tconst action = this.existingAction( clip, optionalRoot );\n\n\t\tif ( action !== null ) {\n\n\t\t\tthis._deactivateAction( action );\n\t\t\tthis._removeInactiveAction( action );\n\n\t\t}\n\n\t}\n\n}\n\nclass Uniform {\n\n\tconstructor( 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\tclone() {\n\n\t\treturn new Uniform( this.value.clone === undefined ? this.value : this.value.clone() );\n\n\t}\n\n}\n\nlet id = 0;\n\nclass UniformsGroup extends EventDispatcher {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.isUniformsGroup = true;\n\n\t\tObject.defineProperty( this, 'id', { value: id ++ } );\n\n\t\tthis.name = '';\n\n\t\tthis.usage = StaticDrawUsage;\n\t\tthis.uniforms = [];\n\n\t}\n\n\tadd( uniform ) {\n\n\t\tthis.uniforms.push( uniform );\n\n\t\treturn this;\n\n\t}\n\n\tremove( uniform ) {\n\n\t\tconst index = this.uniforms.indexOf( uniform );\n\n\t\tif ( index !== - 1 ) this.uniforms.splice( index, 1 );\n\n\t\treturn this;\n\n\t}\n\n\tsetName( name ) {\n\n\t\tthis.name = name;\n\n\t\treturn this;\n\n\t}\n\n\tsetUsage( value ) {\n\n\t\tthis.usage = value;\n\n\t\treturn this;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.name = source.name;\n\t\tthis.usage = source.usage;\n\n\t\tconst uniformsSource = source.uniforms;\n\n\t\tthis.uniforms.length = 0;\n\n\t\tfor ( let i = 0, l = uniformsSource.length; i < l; i ++ ) {\n\n\t\t\tthis.uniforms.push( uniformsSource[ i ].clone() );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nclass InstancedInterleavedBuffer extends InterleavedBuffer {\n\n\tconstructor( array, stride, meshPerAttribute = 1 ) {\n\n\t\tsuper( array, stride );\n\n\t\tthis.isInstancedInterleavedBuffer = true;\n\n\t\tthis.meshPerAttribute = meshPerAttribute;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.meshPerAttribute = source.meshPerAttribute;\n\n\t\treturn this;\n\n\t}\n\n\tclone( data ) {\n\n\t\tconst ib = super.clone( data );\n\n\t\tib.meshPerAttribute = this.meshPerAttribute;\n\n\t\treturn ib;\n\n\t}\n\n\ttoJSON( data ) {\n\n\t\tconst json = super.toJSON( data );\n\n\t\tjson.isInstancedInterleavedBuffer = true;\n\t\tjson.meshPerAttribute = this.meshPerAttribute;\n\n\t\treturn json;\n\n\t}\n\n}\n\nclass GLBufferAttribute {\n\n\tconstructor( buffer, type, itemSize, elementSize, count ) {\n\n\t\tthis.isGLBufferAttribute = true;\n\n\t\tthis.buffer = buffer;\n\t\tthis.type = type;\n\t\tthis.itemSize = itemSize;\n\t\tthis.elementSize = elementSize;\n\t\tthis.count = count;\n\n\t\tthis.version = 0;\n\n\t}\n\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n\tsetBuffer( buffer ) {\n\n\t\tthis.buffer = buffer;\n\n\t\treturn this;\n\n\t}\n\n\tsetType( type, elementSize ) {\n\n\t\tthis.type = type;\n\t\tthis.elementSize = elementSize;\n\n\t\treturn this;\n\n\t}\n\n\tsetItemSize( itemSize ) {\n\n\t\tthis.itemSize = itemSize;\n\n\t\treturn this;\n\n\t}\n\n\tsetCount( count ) {\n\n\t\tthis.count = count;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass Raycaster {\n\n\tconstructor( origin, direction, near = 0, far = Infinity ) {\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;\n\t\tthis.far = far;\n\t\tthis.camera = null;\n\t\tthis.layers = new Layers();\n\n\t\tthis.params = {\n\t\t\tMesh: {},\n\t\t\tLine: { threshold: 1 },\n\t\t\tLOD: {},\n\t\t\tPoints: { threshold: 1 },\n\t\t\tSprite: {}\n\t\t};\n\n\t}\n\n\tset( origin, direction ) {\n\n\t\t// direction is assumed to be normalized (for accurate distance calculations)\n\n\t\tthis.ray.set( origin, direction );\n\n\t}\n\n\tsetFromCamera( coords, camera ) {\n\n\t\tif ( camera.isPerspectiveCamera ) {\n\n\t\t\tthis.ray.origin.setFromMatrixPosition( camera.matrixWorld );\n\t\t\tthis.ray.direction.set( coords.x, coords.y, 0.5 ).unproject( camera ).sub( this.ray.origin ).normalize();\n\t\t\tthis.camera = camera;\n\n\t\t} else if ( camera.isOrthographicCamera ) {\n\n\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\tthis.ray.direction.set( 0, 0, - 1 ).transformDirection( camera.matrixWorld );\n\t\t\tthis.camera = camera;\n\n\t\t} else {\n\n\t\t\tconsole.error( 'THREE.Raycaster: Unsupported camera type: ' + camera.type );\n\n\t\t}\n\n\t}\n\n\tintersectObject( object, recursive = true, intersects = [] ) {\n\n\t\tintersectObject( object, this, intersects, recursive );\n\n\t\tintersects.sort( ascSort );\n\n\t\treturn intersects;\n\n\t}\n\n\tintersectObjects( objects, recursive = true, intersects = [] ) {\n\n\t\tfor ( let i = 0, l = objects.length; i < l; i ++ ) {\n\n\t\t\tintersectObject( objects[ i ], this, intersects, recursive );\n\n\t\t}\n\n\t\tintersects.sort( ascSort );\n\n\t\treturn intersects;\n\n\t}\n\n}\n\nfunction ascSort( a, b ) {\n\n\treturn a.distance - b.distance;\n\n}\n\nfunction intersectObject( object, raycaster, intersects, recursive ) {\n\n\tif ( object.layers.test( raycaster.layers ) ) {\n\n\t\tobject.raycast( raycaster, intersects );\n\n\t}\n\n\tif ( recursive === true ) {\n\n\t\tconst children = object.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tintersectObject( children[ i ], raycaster, intersects, true );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * Ref: https://en.wikipedia.org/wiki/Spherical_coordinate_system\n *\n * The polar angle (phi) is measured from the positive y-axis. The positive y-axis is up.\n * The azimuthal angle (theta) is measured from the positive z-axis.\n */\n\nclass Spherical {\n\n\tconstructor( radius = 1, phi = 0, theta = 0 ) {\n\n\t\tthis.radius = radius;\n\t\tthis.phi = phi; // polar angle\n\t\tthis.theta = theta; // azimuthal angle\n\n\t\treturn this;\n\n\t}\n\n\tset( radius, phi, theta ) {\n\n\t\tthis.radius = radius;\n\t\tthis.phi = phi;\n\t\tthis.theta = theta;\n\n\t\treturn this;\n\n\t}\n\n\tcopy( other ) {\n\n\t\tthis.radius = other.radius;\n\t\tthis.phi = other.phi;\n\t\tthis.theta = other.theta;\n\n\t\treturn this;\n\n\t}\n\n\t// restrict phi to be between EPS and PI-EPS\n\tmakeSafe() {\n\n\t\tconst EPS = 0.000001;\n\t\tthis.phi = Math.max( EPS, Math.min( Math.PI - EPS, this.phi ) );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromVector3( v ) {\n\n\t\treturn this.setFromCartesianCoords( v.x, v.y, v.z );\n\n\t}\n\n\tsetFromCartesianCoords( x, y, z ) {\n\n\t\tthis.radius = Math.sqrt( x * x + y * y + z * z );\n\n\t\tif ( this.radius === 0 ) {\n\n\t\t\tthis.theta = 0;\n\t\t\tthis.phi = 0;\n\n\t\t} else {\n\n\t\t\tthis.theta = Math.atan2( x, z );\n\t\t\tthis.phi = Math.acos( clamp( y / this.radius, - 1, 1 ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\n/**\n * Ref: https://en.wikipedia.org/wiki/Cylindrical_coordinate_system\n */\n\nclass Cylindrical {\n\n\tconstructor( radius = 1, theta = 0, y = 0 ) {\n\n\t\tthis.radius = radius; // distance from the origin to a point in the x-z plane\n\t\tthis.theta = theta; // counterclockwise angle in the x-z plane measured in radians from the positive z-axis\n\t\tthis.y = y; // height above the x-z plane\n\n\t\treturn this;\n\n\t}\n\n\tset( radius, theta, y ) {\n\n\t\tthis.radius = radius;\n\t\tthis.theta = theta;\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\tcopy( other ) {\n\n\t\tthis.radius = other.radius;\n\t\tthis.theta = other.theta;\n\t\tthis.y = other.y;\n\n\t\treturn this;\n\n\t}\n\n\tsetFromVector3( v ) {\n\n\t\treturn this.setFromCartesianCoords( v.x, v.y, v.z );\n\n\t}\n\n\tsetFromCartesianCoords( x, y, z ) {\n\n\t\tthis.radius = Math.sqrt( x * x + z * z );\n\t\tthis.theta = Math.atan2( x, z );\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nconst _vector$4 = /*@__PURE__*/ new Vector2();\n\nclass Box2 {\n\n\tconstructor( min = new Vector2( + Infinity, + Infinity ), max = new Vector2( - Infinity, - Infinity ) ) {\n\n\t\tthis.isBox2 = true;\n\n\t\tthis.min = min;\n\t\tthis.max = max;\n\n\t}\n\n\tset( min, max ) {\n\n\t\tthis.min.copy( min );\n\t\tthis.max.copy( max );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromPoints( points ) {\n\n\t\tthis.makeEmpty();\n\n\t\tfor ( let i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\tthis.expandByPoint( points[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetFromCenterAndSize( center, size ) {\n\n\t\tconst halfSize = _vector$4.copy( size ).multiplyScalar( 0.5 );\n\t\tthis.min.copy( center ).sub( halfSize );\n\t\tthis.max.copy( center ).add( halfSize );\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( box ) {\n\n\t\tthis.min.copy( box.min );\n\t\tthis.max.copy( box.max );\n\n\t\treturn this;\n\n\t}\n\n\tmakeEmpty() {\n\n\t\tthis.min.x = this.min.y = + Infinity;\n\t\tthis.max.x = this.max.y = - Infinity;\n\n\t\treturn this;\n\n\t}\n\n\tisEmpty() {\n\n\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\treturn ( this.max.x < this.min.x ) || ( this.max.y < this.min.y );\n\n\t}\n\n\tgetCenter( target ) {\n\n\t\treturn this.isEmpty() ? target.set( 0, 0 ) : target.addVectors( this.min, this.max ).multiplyScalar( 0.5 );\n\n\t}\n\n\tgetSize( target ) {\n\n\t\treturn this.isEmpty() ? target.set( 0, 0 ) : target.subVectors( this.max, this.min );\n\n\t}\n\n\texpandByPoint( point ) {\n\n\t\tthis.min.min( point );\n\t\tthis.max.max( point );\n\n\t\treturn this;\n\n\t}\n\n\texpandByVector( vector ) {\n\n\t\tthis.min.sub( vector );\n\t\tthis.max.add( vector );\n\n\t\treturn this;\n\n\t}\n\n\texpandByScalar( scalar ) {\n\n\t\tthis.min.addScalar( - scalar );\n\t\tthis.max.addScalar( scalar );\n\n\t\treturn this;\n\n\t}\n\n\tcontainsPoint( point ) {\n\n\t\treturn point.x < this.min.x || point.x > this.max.x ||\n\t\t\tpoint.y < this.min.y || point.y > this.max.y ? false : true;\n\n\t}\n\n\tcontainsBox( box ) {\n\n\t\treturn this.min.x <= box.min.x && box.max.x <= this.max.x &&\n\t\t\tthis.min.y <= box.min.y && box.max.y <= this.max.y;\n\n\t}\n\n\tgetParameter( point, target ) {\n\n\t\t// This can potentially have a divide by zero if the box\n\t\t// has a size dimension of 0.\n\n\t\treturn target.set(\n\t\t\t( point.x - this.min.x ) / ( this.max.x - this.min.x ),\n\t\t\t( point.y - this.min.y ) / ( this.max.y - this.min.y )\n\t\t);\n\n\t}\n\n\tintersectsBox( box ) {\n\n\t\t// using 4 splitting planes to rule out intersections\n\n\t\treturn box.max.x < this.min.x || box.min.x > this.max.x ||\n\t\t\tbox.max.y < this.min.y || box.min.y > this.max.y ? false : true;\n\n\t}\n\n\tclampPoint( point, target ) {\n\n\t\treturn target.copy( point ).clamp( this.min, this.max );\n\n\t}\n\n\tdistanceToPoint( point ) {\n\n\t\tconst clampedPoint = _vector$4.copy( point ).clamp( this.min, this.max );\n\t\treturn clampedPoint.sub( point ).length();\n\n\t}\n\n\tintersect( box ) {\n\n\t\tthis.min.max( box.min );\n\t\tthis.max.min( box.max );\n\n\t\treturn this;\n\n\t}\n\n\tunion( box ) {\n\n\t\tthis.min.min( box.min );\n\t\tthis.max.max( box.max );\n\n\t\treturn this;\n\n\t}\n\n\ttranslate( offset ) {\n\n\t\tthis.min.add( offset );\n\t\tthis.max.add( offset );\n\n\t\treturn this;\n\n\t}\n\n\tequals( box ) {\n\n\t\treturn box.min.equals( this.min ) && box.max.equals( this.max );\n\n\t}\n\n}\n\nconst _startP = /*@__PURE__*/ new Vector3();\nconst _startEnd = /*@__PURE__*/ new Vector3();\n\nclass Line3 {\n\n\tconstructor( start = new Vector3(), end = new Vector3() ) {\n\n\t\tthis.start = start;\n\t\tthis.end = end;\n\n\t}\n\n\tset( start, end ) {\n\n\t\tthis.start.copy( start );\n\t\tthis.end.copy( end );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( line ) {\n\n\t\tthis.start.copy( line.start );\n\t\tthis.end.copy( line.end );\n\n\t\treturn this;\n\n\t}\n\n\tgetCenter( target ) {\n\n\t\treturn target.addVectors( this.start, this.end ).multiplyScalar( 0.5 );\n\n\t}\n\n\tdelta( target ) {\n\n\t\treturn target.subVectors( this.end, this.start );\n\n\t}\n\n\tdistanceSq() {\n\n\t\treturn this.start.distanceToSquared( this.end );\n\n\t}\n\n\tdistance() {\n\n\t\treturn this.start.distanceTo( this.end );\n\n\t}\n\n\tat( t, target ) {\n\n\t\treturn this.delta( target ).multiplyScalar( t ).add( this.start );\n\n\t}\n\n\tclosestPointToPointParameter( point, clampToLine ) {\n\n\t\t_startP.subVectors( point, this.start );\n\t\t_startEnd.subVectors( this.end, this.start );\n\n\t\tconst startEnd2 = _startEnd.dot( _startEnd );\n\t\tconst startEnd_startP = _startEnd.dot( _startP );\n\n\t\tlet t = startEnd_startP / startEnd2;\n\n\t\tif ( clampToLine ) {\n\n\t\t\tt = clamp( t, 0, 1 );\n\n\t\t}\n\n\t\treturn t;\n\n\t}\n\n\tclosestPointToPoint( point, clampToLine, target ) {\n\n\t\tconst t = this.closestPointToPointParameter( point, clampToLine );\n\n\t\treturn this.delta( target ).multiplyScalar( t ).add( this.start );\n\n\t}\n\n\tapplyMatrix4( matrix ) {\n\n\t\tthis.start.applyMatrix4( matrix );\n\t\tthis.end.applyMatrix4( matrix );\n\n\t\treturn this;\n\n\t}\n\n\tequals( line ) {\n\n\t\treturn line.start.equals( this.start ) && line.end.equals( this.end );\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nconst _vector$3 = /*@__PURE__*/ new Vector3();\n\nclass SpotLightHelper extends Object3D {\n\n\tconstructor( light, color ) {\n\n\t\tsuper();\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.color = color;\n\n\t\tconst geometry = new BufferGeometry();\n\n\t\tconst positions = [\n\t\t\t0, 0, 0, \t0, 0, 1,\n\t\t\t0, 0, 0, \t1, 0, 1,\n\t\t\t0, 0, 0,\t- 1, 0, 1,\n\t\t\t0, 0, 0, \t0, 1, 1,\n\t\t\t0, 0, 0, \t0, - 1, 1\n\t\t];\n\n\t\tfor ( let i = 0, j = 1, l = 32; i < l; i ++, j ++ ) {\n\n\t\t\tconst p1 = ( i / l ) * Math.PI * 2;\n\t\t\tconst p2 = ( j / l ) * Math.PI * 2;\n\n\t\t\tpositions.push(\n\t\t\t\tMath.cos( p1 ), Math.sin( p1 ), 1,\n\t\t\t\tMath.cos( p2 ), Math.sin( p2 ), 1\n\t\t\t);\n\n\t\t}\n\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { fog: false, toneMapped: 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\tdispose() {\n\n\t\tthis.cone.geometry.dispose();\n\t\tthis.cone.material.dispose();\n\n\t}\n\n\tupdate() {\n\n\t\tthis.light.updateMatrixWorld();\n\n\t\tconst coneLength = this.light.distance ? this.light.distance : 1000;\n\t\tconst coneWidth = coneLength * Math.tan( this.light.angle );\n\n\t\tthis.cone.scale.set( coneWidth, coneWidth, coneLength );\n\n\t\t_vector$3.setFromMatrixPosition( this.light.target.matrixWorld );\n\n\t\tthis.cone.lookAt( _vector$3 );\n\n\t\tif ( this.color !== undefined ) {\n\n\t\t\tthis.cone.material.color.set( this.color );\n\n\t\t} else {\n\n\t\t\tthis.cone.material.color.copy( this.light.color );\n\n\t\t}\n\n\t}\n\n}\n\nconst _vector$2 = /*@__PURE__*/ new Vector3();\nconst _boneMatrix = /*@__PURE__*/ new Matrix4();\nconst _matrixWorldInv = /*@__PURE__*/ new Matrix4();\n\n\nclass SkeletonHelper extends LineSegments {\n\n\tconstructor( object ) {\n\n\t\tconst bones = getBoneList( object );\n\n\t\tconst geometry = new BufferGeometry();\n\n\t\tconst vertices = [];\n\t\tconst colors = [];\n\n\t\tconst color1 = new Color( 0, 0, 1 );\n\t\tconst color2 = new Color( 0, 1, 0 );\n\n\t\tfor ( let i = 0; i < bones.length; i ++ ) {\n\n\t\t\tconst bone = bones[ i ];\n\n\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\tvertices.push( 0, 0, 0 );\n\t\t\t\tvertices.push( 0, 0, 0 );\n\t\t\t\tcolors.push( color1.r, color1.g, color1.b );\n\t\t\t\tcolors.push( color2.r, color2.g, color2.b );\n\n\t\t\t}\n\n\t\t}\n\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { vertexColors: true, depthTest: false, depthWrite: false, toneMapped: false, transparent: true } );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.isSkeletonHelper = true;\n\n\t\tthis.type = 'SkeletonHelper';\n\n\t\tthis.root = object;\n\t\tthis.bones = bones;\n\n\t\tthis.matrix = object.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tconst bones = this.bones;\n\n\t\tconst geometry = this.geometry;\n\t\tconst position = geometry.getAttribute( 'position' );\n\n\t\t_matrixWorldInv.copy( this.root.matrixWorld ).invert();\n\n\t\tfor ( let i = 0, j = 0; i < bones.length; i ++ ) {\n\n\t\t\tconst bone = bones[ i ];\n\n\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\t_boneMatrix.multiplyMatrices( _matrixWorldInv, bone.matrixWorld );\n\t\t\t\t_vector$2.setFromMatrixPosition( _boneMatrix );\n\t\t\t\tposition.setXYZ( j, _vector$2.x, _vector$2.y, _vector$2.z );\n\n\t\t\t\t_boneMatrix.multiplyMatrices( _matrixWorldInv, bone.parent.matrixWorld );\n\t\t\t\t_vector$2.setFromMatrixPosition( _boneMatrix );\n\t\t\t\tposition.setXYZ( j + 1, _vector$2.x, _vector$2.y, _vector$2.z );\n\n\t\t\t\tj += 2;\n\n\t\t\t}\n\n\t\t}\n\n\t\tgeometry.getAttribute( 'position' ).needsUpdate = true;\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t}\n\n}\n\n\nfunction getBoneList( object ) {\n\n\tconst boneList = [];\n\n\tif ( object.isBone === true ) {\n\n\t\tboneList.push( object );\n\n\t}\n\n\tfor ( let i = 0; i < object.children.length; i ++ ) {\n\n\t\tboneList.push.apply( boneList, getBoneList( object.children[ i ] ) );\n\n\t}\n\n\treturn boneList;\n\n}\n\nclass PointLightHelper extends Mesh {\n\n\tconstructor( light, sphereSize, color ) {\n\n\t\tconst geometry = new SphereGeometry( sphereSize, 4, 2 );\n\t\tconst material = new MeshBasicMaterial( { wireframe: true, fog: false, toneMapped: false } );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.light = light;\n\t\tthis.light.updateMatrixWorld();\n\n\t\tthis.color = color;\n\n\t\tthis.type = 'PointLightHelper';\n\n\t\tthis.matrix = this.light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.update();\n\n\n\t\t/*\n\t// TODO: delete this comment?\n\tconst distanceGeometry = new THREE.IcosahedronGeometry( 1, 2 );\n\tconst distanceMaterial = new THREE.MeshBasicMaterial( { color: hexColor, fog: false, wireframe: true, opacity: 0.1, transparent: true } );\n\n\tthis.lightSphere = new THREE.Mesh( bulbGeometry, bulbMaterial );\n\tthis.lightDistance = new THREE.Mesh( distanceGeometry, distanceMaterial );\n\n\tconst d = light.distance;\n\n\tif ( d === 0.0 ) {\n\n\t\tthis.lightDistance.visible = false;\n\n\t} else {\n\n\t\tthis.lightDistance.scale.set( d, d, d );\n\n\t}\n\n\tthis.add( this.lightDistance );\n\t*/\n\n\t}\n\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n\tupdate() {\n\n\t\tif ( this.color !== undefined ) {\n\n\t\t\tthis.material.color.set( this.color );\n\n\t\t} else {\n\n\t\t\tthis.material.color.copy( this.light.color );\n\n\t\t}\n\n\t\t/*\n\t\tconst 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}\n\nconst _vector$1 = /*@__PURE__*/ new Vector3();\nconst _color1 = /*@__PURE__*/ new Color();\nconst _color2 = /*@__PURE__*/ new Color();\n\nclass HemisphereLightHelper extends Object3D {\n\n\tconstructor( light, size, color ) {\n\n\t\tsuper();\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.color = color;\n\n\t\tconst geometry = new OctahedronGeometry( size );\n\t\tgeometry.rotateY( Math.PI * 0.5 );\n\n\t\tthis.material = new MeshBasicMaterial( { wireframe: true, fog: false, toneMapped: false } );\n\t\tif ( this.color === undefined ) this.material.vertexColors = true;\n\n\t\tconst position = geometry.getAttribute( 'position' );\n\t\tconst colors = new Float32Array( position.count * 3 );\n\n\t\tgeometry.setAttribute( 'color', new BufferAttribute( colors, 3 ) );\n\n\t\tthis.add( new Mesh( geometry, this.material ) );\n\n\t\tthis.update();\n\n\t}\n\n\tdispose() {\n\n\t\tthis.children[ 0 ].geometry.dispose();\n\t\tthis.children[ 0 ].material.dispose();\n\n\t}\n\n\tupdate() {\n\n\t\tconst mesh = this.children[ 0 ];\n\n\t\tif ( this.color !== undefined ) {\n\n\t\t\tthis.material.color.set( this.color );\n\n\t\t} else {\n\n\t\t\tconst colors = mesh.geometry.getAttribute( 'color' );\n\n\t\t\t_color1.copy( this.light.color );\n\t\t\t_color2.copy( this.light.groundColor );\n\n\t\t\tfor ( let i = 0, l = colors.count; i < l; i ++ ) {\n\n\t\t\t\tconst color = ( i < ( l / 2 ) ) ? _color1 : _color2;\n\n\t\t\t\tcolors.setXYZ( i, color.r, color.g, color.b );\n\n\t\t\t}\n\n\t\t\tcolors.needsUpdate = true;\n\n\t\t}\n\n\t\tmesh.lookAt( _vector$1.setFromMatrixPosition( this.light.matrixWorld ).negate() );\n\n\t}\n\n}\n\nclass GridHelper extends LineSegments {\n\n\tconstructor( size = 10, divisions = 10, color1 = 0x444444, color2 = 0x888888 ) {\n\n\t\tcolor1 = new Color( color1 );\n\t\tcolor2 = new Color( color2 );\n\n\t\tconst center = divisions / 2;\n\t\tconst step = size / divisions;\n\t\tconst halfSize = size / 2;\n\n\t\tconst vertices = [], colors = [];\n\n\t\tfor ( let i = 0, j = 0, k = - halfSize; i <= divisions; i ++, k += step ) {\n\n\t\t\tvertices.push( - halfSize, 0, k, halfSize, 0, k );\n\t\t\tvertices.push( k, 0, - halfSize, k, 0, halfSize );\n\n\t\t\tconst color = i === center ? color1 : color2;\n\n\t\t\tcolor.toArray( colors, j ); 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\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { vertexColors: true, toneMapped: false } );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'GridHelper';\n\n\t}\n\n}\n\nclass PolarGridHelper extends LineSegments {\n\n\tconstructor( radius = 10, radials = 16, circles = 8, divisions = 64, color1 = 0x444444, color2 = 0x888888 ) {\n\n\t\tcolor1 = new Color( color1 );\n\t\tcolor2 = new Color( color2 );\n\n\t\tconst vertices = [];\n\t\tconst colors = [];\n\n\t\t// create the radials\n\n\t\tfor ( let i = 0; i <= radials; i ++ ) {\n\n\t\t\tconst v = ( i / radials ) * ( Math.PI * 2 );\n\n\t\t\tconst x = Math.sin( v ) * radius;\n\t\t\tconst z = Math.cos( v ) * radius;\n\n\t\t\tvertices.push( 0, 0, 0 );\n\t\t\tvertices.push( x, 0, z );\n\n\t\t\tconst color = ( i & 1 ) ? color1 : color2;\n\n\t\t\tcolors.push( color.r, color.g, color.b );\n\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t}\n\n\t\t// create the circles\n\n\t\tfor ( let i = 0; i <= circles; i ++ ) {\n\n\t\t\tconst color = ( i & 1 ) ? color1 : color2;\n\n\t\t\tconst r = radius - ( radius / circles * i );\n\n\t\t\tfor ( let j = 0; j < divisions; j ++ ) {\n\n\t\t\t\t// first vertex\n\n\t\t\t\tlet v = ( j / divisions ) * ( Math.PI * 2 );\n\n\t\t\t\tlet x = Math.sin( v ) * r;\n\t\t\t\tlet z = Math.cos( v ) * r;\n\n\t\t\t\tvertices.push( x, 0, z );\n\t\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\t\t// second vertex\n\n\t\t\t\tv = ( ( j + 1 ) / divisions ) * ( Math.PI * 2 );\n\n\t\t\t\tx = Math.sin( v ) * r;\n\t\t\t\tz = Math.cos( v ) * r;\n\n\t\t\t\tvertices.push( x, 0, z );\n\t\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { vertexColors: true, toneMapped: false } );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'PolarGridHelper';\n\n\t}\n\n}\n\nconst _v1 = /*@__PURE__*/ new Vector3();\nconst _v2 = /*@__PURE__*/ new Vector3();\nconst _v3 = /*@__PURE__*/ new Vector3();\n\nclass DirectionalLightHelper extends Object3D {\n\n\tconstructor( light, size, color ) {\n\n\t\tsuper();\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.color = color;\n\n\t\tif ( size === undefined ) size = 1;\n\n\t\tlet geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( [\n\t\t\t- size, size, 0,\n\t\t\tsize, size, 0,\n\t\t\tsize, - size, 0,\n\t\t\t- size, - size, 0,\n\t\t\t- size, size, 0\n\t\t], 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { fog: false, toneMapped: false } );\n\n\t\tthis.lightPlane = new Line( geometry, material );\n\t\tthis.add( this.lightPlane );\n\n\t\tgeometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 0, 1 ], 3 ) );\n\n\t\tthis.targetLine = new Line( geometry, material );\n\t\tthis.add( this.targetLine );\n\n\t\tthis.update();\n\n\t}\n\n\tdispose() {\n\n\t\tthis.lightPlane.geometry.dispose();\n\t\tthis.lightPlane.material.dispose();\n\t\tthis.targetLine.geometry.dispose();\n\t\tthis.targetLine.material.dispose();\n\n\t}\n\n\tupdate() {\n\n\t\t_v1.setFromMatrixPosition( this.light.matrixWorld );\n\t\t_v2.setFromMatrixPosition( this.light.target.matrixWorld );\n\t\t_v3.subVectors( _v2, _v1 );\n\n\t\tthis.lightPlane.lookAt( _v2 );\n\n\t\tif ( this.color !== undefined ) {\n\n\t\t\tthis.lightPlane.material.color.set( this.color );\n\t\t\tthis.targetLine.material.color.set( this.color );\n\n\t\t} else {\n\n\t\t\tthis.lightPlane.material.color.copy( this.light.color );\n\t\t\tthis.targetLine.material.color.copy( this.light.color );\n\n\t\t}\n\n\t\tthis.targetLine.lookAt( _v2 );\n\t\tthis.targetLine.scale.z = _v3.length();\n\n\t}\n\n}\n\nconst _vector = /*@__PURE__*/ new Vector3();\nconst _camera = /*@__PURE__*/ new Camera();\n\n/**\n *\t- shows frustum, line of sight and up of the camera\n *\t- suitable for fast updates\n * \t- based on frustum visualization in lightgl.js shadowmap example\n *\t\thttps://github.com/evanw/lightgl.js/blob/master/tests/shadowmap.html\n */\n\nclass CameraHelper extends LineSegments {\n\n\tconstructor( camera ) {\n\n\t\tconst geometry = new BufferGeometry();\n\t\tconst material = new LineBasicMaterial( { color: 0xffffff, vertexColors: true, toneMapped: false } );\n\n\t\tconst vertices = [];\n\t\tconst colors = [];\n\n\t\tconst pointMap = {};\n\n\t\t// near\n\n\t\taddLine( 'n1', 'n2' );\n\t\taddLine( 'n2', 'n4' );\n\t\taddLine( 'n4', 'n3' );\n\t\taddLine( 'n3', 'n1' );\n\n\t\t// far\n\n\t\taddLine( 'f1', 'f2' );\n\t\taddLine( 'f2', 'f4' );\n\t\taddLine( 'f4', 'f3' );\n\t\taddLine( 'f3', 'f1' );\n\n\t\t// sides\n\n\t\taddLine( 'n1', 'f1' );\n\t\taddLine( 'n2', 'f2' );\n\t\taddLine( 'n3', 'f3' );\n\t\taddLine( 'n4', 'f4' );\n\n\t\t// cone\n\n\t\taddLine( 'p', 'n1' );\n\t\taddLine( 'p', 'n2' );\n\t\taddLine( 'p', 'n3' );\n\t\taddLine( 'p', 'n4' );\n\n\t\t// up\n\n\t\taddLine( 'u1', 'u2' );\n\t\taddLine( 'u2', 'u3' );\n\t\taddLine( 'u3', 'u1' );\n\n\t\t// target\n\n\t\taddLine( 'c', 't' );\n\t\taddLine( 'p', 'c' );\n\n\t\t// cross\n\n\t\taddLine( 'cn1', 'cn2' );\n\t\taddLine( 'cn3', 'cn4' );\n\n\t\taddLine( 'cf1', 'cf2' );\n\t\taddLine( 'cf3', 'cf4' );\n\n\t\tfunction addLine( a, b ) {\n\n\t\t\taddPoint( a );\n\t\t\taddPoint( b );\n\n\t\t}\n\n\t\tfunction addPoint( id ) {\n\n\t\t\tvertices.push( 0, 0, 0 );\n\t\t\tcolors.push( 0, 0, 0 );\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( ( vertices.length / 3 ) - 1 );\n\n\t\t}\n\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'CameraHelper';\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\t// colors\n\n\t\tconst colorFrustum = new Color( 0xffaa00 );\n\t\tconst colorCone = new Color( 0xff0000 );\n\t\tconst colorUp = new Color( 0x00aaff );\n\t\tconst colorTarget = new Color( 0xffffff );\n\t\tconst colorCross = new Color( 0x333333 );\n\n\t\tthis.setColors( colorFrustum, colorCone, colorUp, colorTarget, colorCross );\n\n\t}\n\n\tsetColors( frustum, cone, up, target, cross ) {\n\n\t\tconst geometry = this.geometry;\n\n\t\tconst colorAttribute = geometry.getAttribute( 'color' );\n\n\t\t// near\n\n\t\tcolorAttribute.setXYZ( 0, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 1, frustum.r, frustum.g, frustum.b ); // n1, n2\n\t\tcolorAttribute.setXYZ( 2, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 3, frustum.r, frustum.g, frustum.b ); // n2, n4\n\t\tcolorAttribute.setXYZ( 4, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 5, frustum.r, frustum.g, frustum.b ); // n4, n3\n\t\tcolorAttribute.setXYZ( 6, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 7, frustum.r, frustum.g, frustum.b ); // n3, n1\n\n\t\t// far\n\n\t\tcolorAttribute.setXYZ( 8, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 9, frustum.r, frustum.g, frustum.b ); // f1, f2\n\t\tcolorAttribute.setXYZ( 10, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 11, frustum.r, frustum.g, frustum.b ); // f2, f4\n\t\tcolorAttribute.setXYZ( 12, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 13, frustum.r, frustum.g, frustum.b ); // f4, f3\n\t\tcolorAttribute.setXYZ( 14, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 15, frustum.r, frustum.g, frustum.b ); // f3, f1\n\n\t\t// sides\n\n\t\tcolorAttribute.setXYZ( 16, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 17, frustum.r, frustum.g, frustum.b ); // n1, f1\n\t\tcolorAttribute.setXYZ( 18, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 19, frustum.r, frustum.g, frustum.b ); // n2, f2\n\t\tcolorAttribute.setXYZ( 20, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 21, frustum.r, frustum.g, frustum.b ); // n3, f3\n\t\tcolorAttribute.setXYZ( 22, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 23, frustum.r, frustum.g, frustum.b ); // n4, f4\n\n\t\t// cone\n\n\t\tcolorAttribute.setXYZ( 24, cone.r, cone.g, cone.b ); colorAttribute.setXYZ( 25, cone.r, cone.g, cone.b ); // p, n1\n\t\tcolorAttribute.setXYZ( 26, cone.r, cone.g, cone.b ); colorAttribute.setXYZ( 27, cone.r, cone.g, cone.b ); // p, n2\n\t\tcolorAttribute.setXYZ( 28, cone.r, cone.g, cone.b ); colorAttribute.setXYZ( 29, cone.r, cone.g, cone.b ); // p, n3\n\t\tcolorAttribute.setXYZ( 30, cone.r, cone.g, cone.b ); colorAttribute.setXYZ( 31, cone.r, cone.g, cone.b ); // p, n4\n\n\t\t// up\n\n\t\tcolorAttribute.setXYZ( 32, up.r, up.g, up.b ); colorAttribute.setXYZ( 33, up.r, up.g, up.b ); // u1, u2\n\t\tcolorAttribute.setXYZ( 34, up.r, up.g, up.b ); colorAttribute.setXYZ( 35, up.r, up.g, up.b ); // u2, u3\n\t\tcolorAttribute.setXYZ( 36, up.r, up.g, up.b ); colorAttribute.setXYZ( 37, up.r, up.g, up.b ); // u3, u1\n\n\t\t// target\n\n\t\tcolorAttribute.setXYZ( 38, target.r, target.g, target.b ); colorAttribute.setXYZ( 39, target.r, target.g, target.b ); // c, t\n\t\tcolorAttribute.setXYZ( 40, cross.r, cross.g, cross.b ); colorAttribute.setXYZ( 41, cross.r, cross.g, cross.b ); // p, c\n\n\t\t// cross\n\n\t\tcolorAttribute.setXYZ( 42, cross.r, cross.g, cross.b ); colorAttribute.setXYZ( 43, cross.r, cross.g, cross.b ); // cn1, cn2\n\t\tcolorAttribute.setXYZ( 44, cross.r, cross.g, cross.b ); colorAttribute.setXYZ( 45, cross.r, cross.g, cross.b ); // cn3, cn4\n\n\t\tcolorAttribute.setXYZ( 46, cross.r, cross.g, cross.b ); colorAttribute.setXYZ( 47, cross.r, cross.g, cross.b ); // cf1, cf2\n\t\tcolorAttribute.setXYZ( 48, cross.r, cross.g, cross.b ); colorAttribute.setXYZ( 49, cross.r, cross.g, cross.b ); // cf3, cf4\n\n\t\tcolorAttribute.needsUpdate = true;\n\n\t}\n\n\tupdate() {\n\n\t\tconst geometry = this.geometry;\n\t\tconst pointMap = this.pointMap;\n\n\t\tconst w = 1, h = 1;\n\n\t\t// we need just camera projection matrix inverse\n\t\t// world matrix must be identity\n\n\t\t_camera.projectionMatrixInverse.copy( this.camera.projectionMatrixInverse );\n\n\t\t// center / target\n\n\t\tsetPoint( 'c', pointMap, geometry, _camera, 0, 0, - 1 );\n\t\tsetPoint( 't', pointMap, geometry, _camera, 0, 0, 1 );\n\n\t\t// near\n\n\t\tsetPoint( 'n1', pointMap, geometry, _camera, - w, - h, - 1 );\n\t\tsetPoint( 'n2', pointMap, geometry, _camera, w, - h, - 1 );\n\t\tsetPoint( 'n3', pointMap, geometry, _camera, - w, h, - 1 );\n\t\tsetPoint( 'n4', pointMap, geometry, _camera, w, h, - 1 );\n\n\t\t// far\n\n\t\tsetPoint( 'f1', pointMap, geometry, _camera, - w, - h, 1 );\n\t\tsetPoint( 'f2', pointMap, geometry, _camera, w, - h, 1 );\n\t\tsetPoint( 'f3', pointMap, geometry, _camera, - w, h, 1 );\n\t\tsetPoint( 'f4', pointMap, geometry, _camera, w, h, 1 );\n\n\t\t// up\n\n\t\tsetPoint( 'u1', pointMap, geometry, _camera, w * 0.7, h * 1.1, - 1 );\n\t\tsetPoint( 'u2', pointMap, geometry, _camera, - w * 0.7, h * 1.1, - 1 );\n\t\tsetPoint( 'u3', pointMap, geometry, _camera, 0, h * 2, - 1 );\n\n\t\t// cross\n\n\t\tsetPoint( 'cf1', pointMap, geometry, _camera, - w, 0, 1 );\n\t\tsetPoint( 'cf2', pointMap, geometry, _camera, w, 0, 1 );\n\t\tsetPoint( 'cf3', pointMap, geometry, _camera, 0, - h, 1 );\n\t\tsetPoint( 'cf4', pointMap, geometry, _camera, 0, h, 1 );\n\n\t\tsetPoint( 'cn1', pointMap, geometry, _camera, - w, 0, - 1 );\n\t\tsetPoint( 'cn2', pointMap, geometry, _camera, w, 0, - 1 );\n\t\tsetPoint( 'cn3', pointMap, geometry, _camera, 0, - h, - 1 );\n\t\tsetPoint( 'cn4', pointMap, geometry, _camera, 0, h, - 1 );\n\n\t\tgeometry.getAttribute( 'position' ).needsUpdate = true;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\n\nfunction setPoint( point, pointMap, geometry, camera, x, y, z ) {\n\n\t_vector.set( x, y, z ).unproject( camera );\n\n\tconst points = pointMap[ point ];\n\n\tif ( points !== undefined ) {\n\n\t\tconst position = geometry.getAttribute( 'position' );\n\n\t\tfor ( let i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\tposition.setXYZ( points[ i ], _vector.x, _vector.y, _vector.z );\n\n\t\t}\n\n\t}\n\n}\n\nconst _box = /*@__PURE__*/ new Box3();\n\nclass BoxHelper extends LineSegments {\n\n\tconstructor( object, color = 0xffff00 ) {\n\n\t\tconst indices = new Uint16Array( [ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ] );\n\t\tconst positions = new Float32Array( 8 * 3 );\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setIndex( new BufferAttribute( indices, 1 ) );\n\t\tgeometry.setAttribute( 'position', new BufferAttribute( positions, 3 ) );\n\n\t\tsuper( geometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );\n\n\t\tthis.object = object;\n\t\tthis.type = 'BoxHelper';\n\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.update();\n\n\t}\n\n\tupdate( object ) {\n\n\t\tif ( object !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.BoxHelper: .update() has no longer arguments.' );\n\n\t\t}\n\n\t\tif ( this.object !== undefined ) {\n\n\t\t\t_box.setFromObject( this.object );\n\n\t\t}\n\n\t\tif ( _box.isEmpty() ) return;\n\n\t\tconst min = _box.min;\n\t\tconst max = _box.max;\n\n\t\t/*\n\t\t\t5____4\n\t\t1/___0/|\n\t\t| 6__|_7\n\t\t2/___3/\n\n\t\t0: max.x, max.y, max.z\n\t\t1: min.x, max.y, max.z\n\t\t2: min.x, min.y, max.z\n\t\t3: max.x, min.y, max.z\n\t\t4: max.x, max.y, min.z\n\t\t5: min.x, max.y, min.z\n\t\t6: min.x, min.y, min.z\n\t\t7: max.x, min.y, min.z\n\t\t*/\n\n\t\tconst position = this.geometry.attributes.position;\n\t\tconst array = position.array;\n\n\t\tarray[ 0 ] = max.x; array[ 1 ] = max.y; array[ 2 ] = max.z;\n\t\tarray[ 3 ] = min.x; array[ 4 ] = max.y; array[ 5 ] = max.z;\n\t\tarray[ 6 ] = min.x; array[ 7 ] = min.y; array[ 8 ] = max.z;\n\t\tarray[ 9 ] = max.x; array[ 10 ] = min.y; array[ 11 ] = max.z;\n\t\tarray[ 12 ] = max.x; array[ 13 ] = max.y; array[ 14 ] = min.z;\n\t\tarray[ 15 ] = min.x; array[ 16 ] = max.y; array[ 17 ] = min.z;\n\t\tarray[ 18 ] = min.x; array[ 19 ] = min.y; array[ 20 ] = min.z;\n\t\tarray[ 21 ] = max.x; array[ 22 ] = min.y; array[ 23 ] = min.z;\n\n\t\tposition.needsUpdate = true;\n\n\t\tthis.geometry.computeBoundingSphere();\n\n\n\t}\n\n\tsetFromObject( object ) {\n\n\t\tthis.object = object;\n\t\tthis.update();\n\n\t\treturn this;\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.object = source.object;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass Box3Helper extends LineSegments {\n\n\tconstructor( box, color = 0xffff00 ) {\n\n\t\tconst indices = new Uint16Array( [ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ] );\n\n\t\tconst positions = [ 1, 1, 1, - 1, 1, 1, - 1, - 1, 1, 1, - 1, 1, 1, 1, - 1, - 1, 1, - 1, - 1, - 1, - 1, 1, - 1, - 1 ];\n\n\t\tconst geometry = new BufferGeometry();\n\n\t\tgeometry.setIndex( new BufferAttribute( indices, 1 ) );\n\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\n\t\tsuper( geometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );\n\n\t\tthis.box = box;\n\n\t\tthis.type = 'Box3Helper';\n\n\t\tthis.geometry.computeBoundingSphere();\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tconst box = this.box;\n\n\t\tif ( box.isEmpty() ) return;\n\n\t\tbox.getCenter( this.position );\n\n\t\tbox.getSize( this.scale );\n\n\t\tthis.scale.multiplyScalar( 0.5 );\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t}\n\n}\n\nclass PlaneHelper extends Line {\n\n\tconstructor( plane, size = 1, hex = 0xffff00 ) {\n\n\t\tconst color = hex;\n\n\t\tconst positions = [ 1, - 1, 0, - 1, 1, 0, - 1, - 1, 0, 1, 1, 0, - 1, 1, 0, - 1, - 1, 0, 1, - 1, 0, 1, 1, 0 ];\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\t\tgeometry.computeBoundingSphere();\n\n\t\tsuper( geometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );\n\n\t\tthis.type = 'PlaneHelper';\n\n\t\tthis.plane = plane;\n\n\t\tthis.size = size;\n\n\t\tconst positions2 = [ 1, 1, 0, - 1, 1, 0, - 1, - 1, 0, 1, 1, 0, - 1, - 1, 0, 1, - 1, 0 ];\n\n\t\tconst geometry2 = new BufferGeometry();\n\t\tgeometry2.setAttribute( 'position', new Float32BufferAttribute( positions2, 3 ) );\n\t\tgeometry2.computeBoundingSphere();\n\n\t\tthis.add( new Mesh( geometry2, new MeshBasicMaterial( { color: color, opacity: 0.2, transparent: true, depthWrite: false, toneMapped: false } ) ) );\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tthis.position.set( 0, 0, 0 );\n\n\t\tthis.scale.set( 0.5 * this.size, 0.5 * this.size, 1 );\n\n\t\tthis.lookAt( this.plane.normal );\n\n\t\tthis.translateZ( - this.plane.constant );\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t}\n\n}\n\nconst _axis = /*@__PURE__*/ new Vector3();\nlet _lineGeometry, _coneGeometry;\n\nclass ArrowHelper extends Object3D {\n\n\t// dir is assumed to be normalized\n\n\tconstructor( dir = new Vector3( 0, 0, 1 ), origin = new Vector3( 0, 0, 0 ), length = 1, color = 0xffff00, headLength = length * 0.2, headWidth = headLength * 0.2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'ArrowHelper';\n\n\t\tif ( _lineGeometry === undefined ) {\n\n\t\t\t_lineGeometry = new BufferGeometry();\n\t\t\t_lineGeometry.setAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 1, 0 ], 3 ) );\n\n\t\t\t_coneGeometry = new CylinderGeometry( 0, 0.5, 1, 5, 1 );\n\t\t\t_coneGeometry.translate( 0, - 0.5, 0 );\n\n\t\t}\n\n\t\tthis.position.copy( origin );\n\n\t\tthis.line = new Line( _lineGeometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );\n\t\tthis.line.matrixAutoUpdate = false;\n\t\tthis.add( this.line );\n\n\t\tthis.cone = new Mesh( _coneGeometry, new MeshBasicMaterial( { color: color, toneMapped: false } ) );\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\tsetDirection( dir ) {\n\n\t\t// dir is assumed to be normalized\n\n\t\tif ( dir.y > 0.99999 ) {\n\n\t\t\tthis.quaternion.set( 0, 0, 0, 1 );\n\n\t\t} else if ( dir.y < - 0.99999 ) {\n\n\t\t\tthis.quaternion.set( 1, 0, 0, 0 );\n\n\t\t} else {\n\n\t\t\t_axis.set( dir.z, 0, - dir.x ).normalize();\n\n\t\t\tconst radians = Math.acos( dir.y );\n\n\t\t\tthis.quaternion.setFromAxisAngle( _axis, radians );\n\n\t\t}\n\n\t}\n\n\tsetLength( length, headLength = length * 0.2, headWidth = headLength * 0.2 ) {\n\n\t\tthis.line.scale.set( 1, Math.max( 0.0001, length - headLength ), 1 ); // see #17458\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\tsetColor( color ) {\n\n\t\tthis.line.material.color.set( color );\n\t\tthis.cone.material.color.set( color );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source, false );\n\n\t\tthis.line.copy( source.line );\n\t\tthis.cone.copy( source.cone );\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass AxesHelper extends LineSegments {\n\n\tconstructor( size = 1 ) {\n\n\t\tconst vertices = [\n\t\t\t0, 0, 0,\tsize, 0, 0,\n\t\t\t0, 0, 0,\t0, size, 0,\n\t\t\t0, 0, 0,\t0, 0, size\n\t\t];\n\n\t\tconst colors = [\n\t\t\t1, 0, 0,\t1, 0.6, 0,\n\t\t\t0, 1, 0,\t0.6, 1, 0,\n\t\t\t0, 0, 1,\t0, 0.6, 1\n\t\t];\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { vertexColors: true, toneMapped: false } );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'AxesHelper';\n\n\t}\n\n\tsetColors( xAxisColor, yAxisColor, zAxisColor ) {\n\n\t\tconst color = new Color();\n\t\tconst array = this.geometry.attributes.color.array;\n\n\t\tcolor.set( xAxisColor );\n\t\tcolor.toArray( array, 0 );\n\t\tcolor.toArray( array, 3 );\n\n\t\tcolor.set( yAxisColor );\n\t\tcolor.toArray( array, 6 );\n\t\tcolor.toArray( array, 9 );\n\n\t\tcolor.set( zAxisColor );\n\t\tcolor.toArray( array, 12 );\n\t\tcolor.toArray( array, 15 );\n\n\t\tthis.geometry.attributes.color.needsUpdate = true;\n\n\t\treturn this;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\nclass ShapePath {\n\n\tconstructor() {\n\n\t\tthis.type = 'ShapePath';\n\n\t\tthis.color = new Color();\n\n\t\tthis.subPaths = [];\n\t\tthis.currentPath = null;\n\n\t}\n\n\tmoveTo( x, y ) {\n\n\t\tthis.currentPath = new Path();\n\t\tthis.subPaths.push( this.currentPath );\n\t\tthis.currentPath.moveTo( x, y );\n\n\t\treturn this;\n\n\t}\n\n\tlineTo( x, y ) {\n\n\t\tthis.currentPath.lineTo( x, y );\n\n\t\treturn this;\n\n\t}\n\n\tquadraticCurveTo( aCPx, aCPy, aX, aY ) {\n\n\t\tthis.currentPath.quadraticCurveTo( aCPx, aCPy, aX, aY );\n\n\t\treturn this;\n\n\t}\n\n\tbezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {\n\n\t\tthis.currentPath.bezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY );\n\n\t\treturn this;\n\n\t}\n\n\tsplineThru( pts ) {\n\n\t\tthis.currentPath.splineThru( pts );\n\n\t\treturn this;\n\n\t}\n\n\ttoShapes( isCCW, noHoles ) {\n\n\t\tfunction toShapesNoHoles( inSubpaths ) {\n\n\t\t\tconst shapes = [];\n\n\t\t\tfor ( let i = 0, l = inSubpaths.length; i < l; i ++ ) {\n\n\t\t\t\tconst tmpPath = inSubpaths[ i ];\n\n\t\t\t\tconst tmpShape = new Shape();\n\t\t\t\ttmpShape.curves = tmpPath.curves;\n\n\t\t\t\tshapes.push( tmpShape );\n\n\t\t\t}\n\n\t\t\treturn shapes;\n\n\t\t}\n\n\t\tfunction isPointInsidePolygon( inPt, inPolygon ) {\n\n\t\t\tconst polyLen = inPolygon.length;\n\n\t\t\t// inPt on polygon contour => immediate success or\n\t\t\t// toggling of inside/outside at every single! intersection point of an edge\n\t\t\t// with the horizontal line through inPt, left of inPt\n\t\t\t// not counting lowerY endpoints of edges and whole edges on that line\n\t\t\tlet inside = false;\n\t\t\tfor ( let p = polyLen - 1, q = 0; q < polyLen; p = q ++ ) {\n\n\t\t\t\tlet edgeLowPt = inPolygon[ p ];\n\t\t\t\tlet edgeHighPt = inPolygon[ q ];\n\n\t\t\t\tlet edgeDx = edgeHighPt.x - edgeLowPt.x;\n\t\t\t\tlet edgeDy = edgeHighPt.y - edgeLowPt.y;\n\n\t\t\t\tif ( Math.abs( edgeDy ) > Number.EPSILON ) {\n\n\t\t\t\t\t// not parallel\n\t\t\t\t\tif ( edgeDy < 0 ) {\n\n\t\t\t\t\t\tedgeLowPt = inPolygon[ q ]; edgeDx = - edgeDx;\n\t\t\t\t\t\tedgeHighPt = inPolygon[ p ]; edgeDy = - edgeDy;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ( inPt.y < edgeLowPt.y ) || ( inPt.y > edgeHighPt.y ) ) \t\tcontinue;\n\n\t\t\t\t\tif ( inPt.y === edgeLowPt.y ) {\n\n\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// continue;\t\t\t\t// no intersection or edgeLowPt => doesn't count !!!\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconst perpEdge = edgeDy * ( inPt.x - edgeLowPt.x ) - edgeDx * ( inPt.y - edgeLowPt.y );\n\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\tif ( perpEdge < 0 ) \t\t\t\tcontinue;\n\t\t\t\t\t\tinside = ! inside;\t\t// true intersection left of inPt\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// parallel or collinear\n\t\t\t\t\tif ( inPt.y !== edgeLowPt.y ) \t\tcontinue;\t\t\t// parallel\n\t\t\t\t\t// edge lies on the same horizontal line as inPt\n\t\t\t\t\tif ( ( ( edgeHighPt.x <= inPt.x ) && ( inPt.x <= edgeLowPt.x ) ) ||\n\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// continue;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn\tinside;\n\n\t\t}\n\n\t\tconst isClockWise = ShapeUtils.isClockWise;\n\n\t\tconst subPaths = this.subPaths;\n\t\tif ( subPaths.length === 0 ) return [];\n\n\t\tif ( noHoles === true )\treturn\ttoShapesNoHoles( subPaths );\n\n\n\t\tlet solid, tmpPath, tmpShape;\n\t\tconst shapes = [];\n\n\t\tif ( subPaths.length === 1 ) {\n\n\t\t\ttmpPath = subPaths[ 0 ];\n\t\t\ttmpShape = new Shape();\n\t\t\ttmpShape.curves = tmpPath.curves;\n\t\t\tshapes.push( tmpShape );\n\t\t\treturn shapes;\n\n\t\t}\n\n\t\tlet holesFirst = ! isClockWise( subPaths[ 0 ].getPoints() );\n\t\tholesFirst = isCCW ? ! holesFirst : holesFirst;\n\n\t\t// console.log(\"Holes first\", holesFirst);\n\n\t\tconst betterShapeHoles = [];\n\t\tconst newShapes = [];\n\t\tlet newShapeHoles = [];\n\t\tlet mainIdx = 0;\n\t\tlet tmpPoints;\n\n\t\tnewShapes[ mainIdx ] = undefined;\n\t\tnewShapeHoles[ mainIdx ] = [];\n\n\t\tfor ( let i = 0, l = subPaths.length; i < l; i ++ ) {\n\n\t\t\ttmpPath = subPaths[ i ];\n\t\t\ttmpPoints = tmpPath.getPoints();\n\t\t\tsolid = isClockWise( tmpPoints );\n\t\t\tsolid = isCCW ? ! solid : solid;\n\n\t\t\tif ( solid ) {\n\n\t\t\t\tif ( ( ! holesFirst ) && ( newShapes[ mainIdx ] ) )\tmainIdx ++;\n\n\t\t\t\tnewShapes[ mainIdx ] = { s: new Shape(), p: tmpPoints };\n\t\t\t\tnewShapes[ mainIdx ].s.curves = tmpPath.curves;\n\n\t\t\t\tif ( holesFirst )\tmainIdx ++;\n\t\t\t\tnewShapeHoles[ mainIdx ] = [];\n\n\t\t\t\t//console.log('cw', i);\n\n\t\t\t} else {\n\n\t\t\t\tnewShapeHoles[ mainIdx ].push( { h: tmpPath, p: tmpPoints[ 0 ] } );\n\n\t\t\t\t//console.log('ccw', i);\n\n\t\t\t}\n\n\t\t}\n\n\t\t// only Holes? -> probably all Shapes with wrong orientation\n\t\tif ( ! newShapes[ 0 ] )\treturn\ttoShapesNoHoles( subPaths );\n\n\n\t\tif ( newShapes.length > 1 ) {\n\n\t\t\tlet ambiguous = false;\n\t\t\tlet toChange = 0;\n\n\t\t\tfor ( let sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {\n\n\t\t\t\tbetterShapeHoles[ sIdx ] = [];\n\n\t\t\t}\n\n\t\t\tfor ( let sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {\n\n\t\t\t\tconst sho = newShapeHoles[ sIdx ];\n\n\t\t\t\tfor ( let hIdx = 0; hIdx < sho.length; hIdx ++ ) {\n\n\t\t\t\t\tconst ho = sho[ hIdx ];\n\t\t\t\t\tlet hole_unassigned = true;\n\n\t\t\t\t\tfor ( let s2Idx = 0; s2Idx < newShapes.length; s2Idx ++ ) {\n\n\t\t\t\t\t\tif ( isPointInsidePolygon( ho.p, newShapes[ s2Idx ].p ) ) {\n\n\t\t\t\t\t\t\tif ( sIdx !== s2Idx )\ttoChange ++;\n\n\t\t\t\t\t\t\tif ( hole_unassigned ) {\n\n\t\t\t\t\t\t\t\thole_unassigned = false;\n\t\t\t\t\t\t\t\tbetterShapeHoles[ s2Idx ].push( ho );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tambiguous = true;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( hole_unassigned ) {\n\n\t\t\t\t\t\tbetterShapeHoles[ sIdx ].push( ho );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( toChange > 0 && ambiguous === false ) {\n\n\t\t\t\tnewShapeHoles = betterShapeHoles;\n\n\t\t\t}\n\n\t\t}\n\n\t\tlet tmpHoles;\n\n\t\tfor ( let i = 0, il = newShapes.length; i < il; i ++ ) {\n\n\t\t\ttmpShape = newShapes[ i ].s;\n\t\t\tshapes.push( tmpShape );\n\t\t\ttmpHoles = newShapeHoles[ i ];\n\n\t\t\tfor ( let j = 0, jl = tmpHoles.length; j < jl; j ++ ) {\n\n\t\t\t\ttmpShape.holes.push( tmpHoles[ j ].h );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//console.log(\"shape\", shapes);\n\n\t\treturn shapes;\n\n\t}\n\n}\n\n// Fast Half Float Conversions, http://www.fox-toolkit.org/ftp/fasthalffloatconversion.pdf\n\nconst _tables = /*@__PURE__*/ _generateTables();\n\nfunction _generateTables() {\n\n\t// float32 to float16 helpers\n\n\tconst buffer = new ArrayBuffer( 4 );\n\tconst floatView = new Float32Array( buffer );\n\tconst uint32View = new Uint32Array( buffer );\n\n\tconst baseTable = new Uint32Array( 512 );\n\tconst shiftTable = new Uint32Array( 512 );\n\n\tfor ( let i = 0; i < 256; ++ i ) {\n\n\t\tconst e = i - 127;\n\n\t\t// very small number (0, -0)\n\n\t\tif ( e < - 27 ) {\n\n\t\t\tbaseTable[ i ] = 0x0000;\n\t\t\tbaseTable[ i | 0x100 ] = 0x8000;\n\t\t\tshiftTable[ i ] = 24;\n\t\t\tshiftTable[ i | 0x100 ] = 24;\n\n\t\t\t// small number (denorm)\n\n\t\t} else if ( e < - 14 ) {\n\n\t\t\tbaseTable[ i ] = 0x0400 >> ( - e - 14 );\n\t\t\tbaseTable[ i | 0x100 ] = ( 0x0400 >> ( - e - 14 ) ) | 0x8000;\n\t\t\tshiftTable[ i ] = - e - 1;\n\t\t\tshiftTable[ i | 0x100 ] = - e - 1;\n\n\t\t\t// normal number\n\n\t\t} else if ( e <= 15 ) {\n\n\t\t\tbaseTable[ i ] = ( e + 15 ) << 10;\n\t\t\tbaseTable[ i | 0x100 ] = ( ( e + 15 ) << 10 ) | 0x8000;\n\t\t\tshiftTable[ i ] = 13;\n\t\t\tshiftTable[ i | 0x100 ] = 13;\n\n\t\t\t// large number (Infinity, -Infinity)\n\n\t\t} else if ( e < 128 ) {\n\n\t\t\tbaseTable[ i ] = 0x7c00;\n\t\t\tbaseTable[ i | 0x100 ] = 0xfc00;\n\t\t\tshiftTable[ i ] = 24;\n\t\t\tshiftTable[ i | 0x100 ] = 24;\n\n\t\t\t// stay (NaN, Infinity, -Infinity)\n\n\t\t} else {\n\n\t\t\tbaseTable[ i ] = 0x7c00;\n\t\t\tbaseTable[ i | 0x100 ] = 0xfc00;\n\t\t\tshiftTable[ i ] = 13;\n\t\t\tshiftTable[ i | 0x100 ] = 13;\n\n\t\t}\n\n\t}\n\n\t// float16 to float32 helpers\n\n\tconst mantissaTable = new Uint32Array( 2048 );\n\tconst exponentTable = new Uint32Array( 64 );\n\tconst offsetTable = new Uint32Array( 64 );\n\n\tfor ( let i = 1; i < 1024; ++ i ) {\n\n\t\tlet m = i << 13; // zero pad mantissa bits\n\t\tlet e = 0; // zero exponent\n\n\t\t// normalized\n\t\twhile ( ( m & 0x00800000 ) === 0 ) {\n\n\t\t\tm <<= 1;\n\t\t\te -= 0x00800000; // decrement exponent\n\n\t\t}\n\n\t\tm &= ~ 0x00800000; // clear leading 1 bit\n\t\te += 0x38800000; // adjust bias\n\n\t\tmantissaTable[ i ] = m | e;\n\n\t}\n\n\tfor ( let i = 1024; i < 2048; ++ i ) {\n\n\t\tmantissaTable[ i ] = 0x38000000 + ( ( i - 1024 ) << 13 );\n\n\t}\n\n\tfor ( let i = 1; i < 31; ++ i ) {\n\n\t\texponentTable[ i ] = i << 23;\n\n\t}\n\n\texponentTable[ 31 ] = 0x47800000;\n\texponentTable[ 32 ] = 0x80000000;\n\n\tfor ( let i = 33; i < 63; ++ i ) {\n\n\t\texponentTable[ i ] = 0x80000000 + ( ( i - 32 ) << 23 );\n\n\t}\n\n\texponentTable[ 63 ] = 0xc7800000;\n\n\tfor ( let i = 1; i < 64; ++ i ) {\n\n\t\tif ( i !== 32 ) {\n\n\t\t\toffsetTable[ i ] = 1024;\n\n\t\t}\n\n\t}\n\n\treturn {\n\t\tfloatView: floatView,\n\t\tuint32View: uint32View,\n\t\tbaseTable: baseTable,\n\t\tshiftTable: shiftTable,\n\t\tmantissaTable: mantissaTable,\n\t\texponentTable: exponentTable,\n\t\toffsetTable: offsetTable\n\t};\n\n}\n\n// float32 to float16\n\nfunction toHalfFloat( val ) {\n\n\tif ( Math.abs( val ) > 65504 ) console.warn( 'THREE.DataUtils.toHalfFloat(): Value out of range.' );\n\n\tval = clamp( val, - 65504, 65504 );\n\n\t_tables.floatView[ 0 ] = val;\n\tconst f = _tables.uint32View[ 0 ];\n\tconst e = ( f >> 23 ) & 0x1ff;\n\treturn _tables.baseTable[ e ] + ( ( f & 0x007fffff ) >> _tables.shiftTable[ e ] );\n\n}\n\n// float16 to float32\n\nfunction fromHalfFloat( val ) {\n\n\tconst m = val >> 10;\n\t_tables.uint32View[ 0 ] = _tables.mantissaTable[ _tables.offsetTable[ m ] + ( val & 0x3ff ) ] + _tables.exponentTable[ m ];\n\treturn _tables.floatView[ 0 ];\n\n}\n\nvar DataUtils = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\ttoHalfFloat: toHalfFloat,\n\tfromHalfFloat: fromHalfFloat\n});\n\n// r133, c5bb5434555a3c3ddd784944a0a124f996fc721b\n\nclass ParametricGeometry extends BufferGeometry {\n\n\tconstructor() {\n\n\t\tconsole.error( 'THREE.ParametricGeometry has been moved to /examples/jsm/geometries/ParametricGeometry.js' );\n\t\tsuper();\n\n\t}\n\n}\n\n// r133, eb58ff153119090d3bbb24474ea0ffc40c70dc92\n\nclass TextGeometry extends BufferGeometry {\n\n\tconstructor() {\n\n\t\tconsole.error( 'THREE.TextGeometry has been moved to /examples/jsm/geometries/TextGeometry.js' );\n\t\tsuper();\n\n\t}\n\n}\n\n// r133, eb58ff153119090d3bbb24474ea0ffc40c70dc92\n\nfunction FontLoader() {\n\n\tconsole.error( 'THREE.FontLoader has been moved to /examples/jsm/loaders/FontLoader.js' );\n\n}\n\n// r133, eb58ff153119090d3bbb24474ea0ffc40c70dc92\n\nfunction Font() {\n\n\tconsole.error( 'THREE.Font has been moved to /examples/jsm/loaders/FontLoader.js' );\n\n}\n\n// r134, d65e0af06644fe5a84a6fc0e372f4318f95a04c0\n\nfunction ImmediateRenderObject() {\n\n\tconsole.error( 'THREE.ImmediateRenderObject has been removed.' );\n\n}\n\n// r138, 48b05d3500acc084df50be9b4c90781ad9b8cb17\n\nclass WebGLMultisampleRenderTarget extends WebGLRenderTarget {\n\n\tconstructor( width, height, options ) {\n\n\t\tconsole.error( 'THREE.WebGLMultisampleRenderTarget has been removed. Use a normal render target and set the \"samples\" property to greater 0 to enable multisampling.' );\n\t\tsuper( width, height, options );\n\t\tthis.samples = 4;\n\n\t}\n\n}\n\n// r138, f9cd9cab03b7b64244e304900a3a2eeaa3a588ce\n\nclass DataTexture2DArray extends DataArrayTexture {\n\n\tconstructor( data, width, height, depth ) {\n\n\t\tconsole.warn( 'THREE.DataTexture2DArray has been renamed to DataArrayTexture.' );\n\t\tsuper( data, width, height, depth );\n\n\t}\n\n}\n\n// r138, f9cd9cab03b7b64244e304900a3a2eeaa3a588ce\n\nclass DataTexture3D extends Data3DTexture {\n\n\tconstructor( data, width, height, depth ) {\n\n\t\tconsole.warn( 'THREE.DataTexture3D has been renamed to Data3DTexture.' );\n\t\tsuper( data, width, height, depth );\n\n\t}\n\n}\n\nif ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) {\n\n\t__THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'register', { detail: {\n\t\trevision: REVISION,\n\t} } ) );\n\n}\n\nif ( typeof window !== 'undefined' ) {\n\n\tif ( window.__THREE__ ) {\n\n\t\tconsole.warn( 'WARNING: Multiple instances of Three.js being imported.' );\n\n\t} else {\n\n\t\twindow.__THREE__ = REVISION;\n\n\t}\n\n}\n\nexport { ACESFilmicToneMapping, AddEquation, AddOperation, AdditiveAnimationBlendMode, AdditiveBlending, AlphaFormat, AlwaysDepth, AlwaysStencilFunc, AmbientLight, AmbientLightProbe, AnimationClip, AnimationLoader, AnimationMixer, AnimationObjectGroup, AnimationUtils, ArcCurve, ArrayCamera, ArrowHelper, Audio, AudioAnalyser, AudioContext, AudioListener, AudioLoader, AxesHelper, BackSide, BasicDepthPacking, BasicShadowMap, Bone, BooleanKeyframeTrack, Box2, Box3, Box3Helper, BoxGeometry as BoxBufferGeometry, BoxGeometry, BoxHelper, BufferAttribute, BufferGeometry, BufferGeometryLoader, ByteType, Cache, Camera, CameraHelper, CanvasTexture, CapsuleGeometry as CapsuleBufferGeometry, CapsuleGeometry, CatmullRomCurve3, CineonToneMapping, CircleGeometry as CircleBufferGeometry, CircleGeometry, ClampToEdgeWrapping, Clock, Color, ColorKeyframeTrack, ColorManagement, CompressedTexture, CompressedTextureLoader, ConeGeometry as ConeBufferGeometry, ConeGeometry, CubeCamera, CubeReflectionMapping, CubeRefractionMapping, CubeTexture, CubeTextureLoader, CubeUVReflectionMapping, CubicBezierCurve, CubicBezierCurve3, CubicInterpolant, CullFaceBack, CullFaceFront, CullFaceFrontBack, CullFaceNone, Curve, CurvePath, CustomBlending, CustomToneMapping, CylinderGeometry as CylinderBufferGeometry, CylinderGeometry, Cylindrical, Data3DTexture, DataArrayTexture, DataTexture, DataTexture2DArray, DataTexture3D, DataTextureLoader, DataUtils, DecrementStencilOp, DecrementWrapStencilOp, DefaultLoadingManager, DepthFormat, DepthStencilFormat, DepthTexture, DirectionalLight, DirectionalLightHelper, DiscreteInterpolant, DodecahedronGeometry as DodecahedronBufferGeometry, DodecahedronGeometry, DoubleSide, DstAlphaFactor, DstColorFactor, DynamicCopyUsage, DynamicDrawUsage, DynamicReadUsage, EdgesGeometry, EllipseCurve, EqualDepth, EqualStencilFunc, EquirectangularReflectionMapping, EquirectangularRefractionMapping, Euler, EventDispatcher, ExtrudeGeometry as ExtrudeBufferGeometry, ExtrudeGeometry, FileLoader, FlatShading, Float16BufferAttribute, Float32BufferAttribute, Float64BufferAttribute, FloatType, Fog, FogExp2, Font, FontLoader, FramebufferTexture, FrontSide, Frustum, GLBufferAttribute, GLSL1, GLSL3, GreaterDepth, GreaterEqualDepth, GreaterEqualStencilFunc, GreaterStencilFunc, GridHelper, Group, HalfFloatType, HemisphereLight, HemisphereLightHelper, HemisphereLightProbe, IcosahedronGeometry as IcosahedronBufferGeometry, IcosahedronGeometry, ImageBitmapLoader, ImageLoader, ImageUtils, ImmediateRenderObject, IncrementStencilOp, IncrementWrapStencilOp, InstancedBufferAttribute, InstancedBufferGeometry, InstancedInterleavedBuffer, InstancedMesh, Int16BufferAttribute, Int32BufferAttribute, Int8BufferAttribute, IntType, InterleavedBuffer, InterleavedBufferAttribute, Interpolant, InterpolateDiscrete, InterpolateLinear, InterpolateSmooth, InvertStencilOp, KeepStencilOp, KeyframeTrack, LOD, LatheGeometry as LatheBufferGeometry, LatheGeometry, Layers, LessDepth, LessEqualDepth, LessEqualStencilFunc, LessStencilFunc, Light, LightProbe, Line, Line3, LineBasicMaterial, LineCurve, LineCurve3, LineDashedMaterial, LineLoop, LineSegments, LinearEncoding, LinearFilter, LinearInterpolant, LinearMipMapLinearFilter, LinearMipMapNearestFilter, LinearMipmapLinearFilter, LinearMipmapNearestFilter, LinearSRGBColorSpace, LinearToneMapping, Loader, LoaderUtils, LoadingManager, LoopOnce, LoopPingPong, LoopRepeat, LuminanceAlphaFormat, LuminanceFormat, MOUSE, Material, MaterialLoader, MathUtils, Matrix3, Matrix4, MaxEquation, Mesh, MeshBasicMaterial, MeshDepthMaterial, MeshDistanceMaterial, MeshLambertMaterial, MeshMatcapMaterial, MeshNormalMaterial, MeshPhongMaterial, MeshPhysicalMaterial, MeshStandardMaterial, MeshToonMaterial, MinEquation, MirroredRepeatWrapping, MixOperation, MultiplyBlending, MultiplyOperation, NearestFilter, NearestMipMapLinearFilter, NearestMipMapNearestFilter, NearestMipmapLinearFilter, NearestMipmapNearestFilter, NeverDepth, NeverStencilFunc, NoBlending, NoColorSpace, NoToneMapping, NormalAnimationBlendMode, NormalBlending, NotEqualDepth, NotEqualStencilFunc, NumberKeyframeTrack, Object3D, ObjectLoader, ObjectSpaceNormalMap, OctahedronGeometry as OctahedronBufferGeometry, OctahedronGeometry, OneFactor, OneMinusDstAlphaFactor, OneMinusDstColorFactor, OneMinusSrcAlphaFactor, OneMinusSrcColorFactor, OrthographicCamera, PCFShadowMap, PCFSoftShadowMap, PMREMGenerator, ParametricGeometry, Path, PerspectiveCamera, Plane, PlaneGeometry as PlaneBufferGeometry, PlaneGeometry, PlaneHelper, PointLight, PointLightHelper, Points, PointsMaterial, PolarGridHelper, PolyhedronGeometry as PolyhedronBufferGeometry, PolyhedronGeometry, PositionalAudio, PropertyBinding, PropertyMixer, QuadraticBezierCurve, QuadraticBezierCurve3, Quaternion, QuaternionKeyframeTrack, QuaternionLinearInterpolant, REVISION, RGBADepthPacking, RGBAFormat, RGBAIntegerFormat, RGBA_ASTC_10x10_Format, RGBA_ASTC_10x5_Format, RGBA_ASTC_10x6_Format, RGBA_ASTC_10x8_Format, RGBA_ASTC_12x10_Format, RGBA_ASTC_12x12_Format, RGBA_ASTC_4x4_Format, RGBA_ASTC_5x4_Format, RGBA_ASTC_5x5_Format, RGBA_ASTC_6x5_Format, RGBA_ASTC_6x6_Format, RGBA_ASTC_8x5_Format, RGBA_ASTC_8x6_Format, RGBA_ASTC_8x8_Format, RGBA_BPTC_Format, RGBA_ETC2_EAC_Format, RGBA_PVRTC_2BPPV1_Format, RGBA_PVRTC_4BPPV1_Format, RGBA_S3TC_DXT1_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT5_Format, RGBFormat, RGB_ETC1_Format, RGB_ETC2_Format, RGB_PVRTC_2BPPV1_Format, RGB_PVRTC_4BPPV1_Format, RGB_S3TC_DXT1_Format, RGFormat, RGIntegerFormat, RawShaderMaterial, Ray, Raycaster, RectAreaLight, RedFormat, RedIntegerFormat, ReinhardToneMapping, RepeatWrapping, ReplaceStencilOp, ReverseSubtractEquation, RingGeometry as RingBufferGeometry, RingGeometry, SRGBColorSpace, Scene, ShaderChunk, ShaderLib, ShaderMaterial, ShadowMaterial, Shape, ShapeGeometry as ShapeBufferGeometry, ShapeGeometry, ShapePath, ShapeUtils, ShortType, Skeleton, SkeletonHelper, SkinnedMesh, SmoothShading, Source, Sphere, SphereGeometry as SphereBufferGeometry, SphereGeometry, Spherical, SphericalHarmonics3, SplineCurve, SpotLight, SpotLightHelper, Sprite, SpriteMaterial, SrcAlphaFactor, SrcAlphaSaturateFactor, SrcColorFactor, StaticCopyUsage, StaticDrawUsage, StaticReadUsage, StereoCamera, StreamCopyUsage, StreamDrawUsage, StreamReadUsage, StringKeyframeTrack, SubtractEquation, SubtractiveBlending, TOUCH, TangentSpaceNormalMap, TetrahedronGeometry as TetrahedronBufferGeometry, TetrahedronGeometry, TextGeometry, Texture, TextureLoader, TorusGeometry as TorusBufferGeometry, TorusGeometry, TorusKnotGeometry as TorusKnotBufferGeometry, TorusKnotGeometry, Triangle, TriangleFanDrawMode, TriangleStripDrawMode, TrianglesDrawMode, TubeGeometry as TubeBufferGeometry, TubeGeometry, UVMapping, Uint16BufferAttribute, Uint32BufferAttribute, Uint8BufferAttribute, Uint8ClampedBufferAttribute, Uniform, UniformsGroup, UniformsLib, UniformsUtils, UnsignedByteType, UnsignedInt248Type, UnsignedIntType, UnsignedShort4444Type, UnsignedShort5551Type, UnsignedShortType, VSMShadowMap, Vector2, Vector3, Vector4, VectorKeyframeTrack, VideoTexture, WebGL1Renderer, WebGL3DRenderTarget, WebGLArrayRenderTarget, WebGLCubeRenderTarget, WebGLMultipleRenderTargets, WebGLMultisampleRenderTarget, WebGLRenderTarget, WebGLRenderer, WebGLUtils, WireframeGeometry, WrapAroundEnding, ZeroCurvatureEnding, ZeroFactor, ZeroSlopeEnding, ZeroStencilOp, _SRGBAFormat, sRGBEncoding };\n","import { DataTexture, LinearFilter, LinearMipMapLinearFilter, MathUtils, RepeatWrapping, RGBAFormat, UnsignedByteType, UVMapping, Vector2 } from 'three';\n\n/**\n * MIT License\n * Copyright (c) 2019 David Lenaerts\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @classdesc\n * ThinFilmFresnelMap is a lookup texture containing the reflection colour. The texture index value\n * is dot(normal, view). The texture values are stored in approximated gamma space (power 2.0), so\n * the sampled value needs to be multiplied with itself before use. The sampled value should replace\n * the fresnel factor in a PBR material.\n *\n * @property filmThickness The thickness of the thin film layer in nanometers. Defaults to 380.\n * @property refractiveIndexFilm The refractive index of the thin film. Defaults to 2.\n * @property refractiveIndexBase The refractive index of the material under the film. Defaults to 3.\n *\n * @constructor\n * @param filmThickness The thickness of the thin film layer in nanometers. Defaults to 380.\n * @param refractiveIndexFilm The refractive index of the thin film. Defaults to 2.\n * @param refractiveIndexBase The refractive index of the material under the film. Defaults to 3.\n * @param size The width of the texture. Defaults to 64.\n *\n * @extends DataTexture\n *\n * @author David Lenaerts \n * @author Mathias Latournerie\n */\nclass ThinFilmFresnelMap extends DataTexture {\n\n constructor(filmThickness = 380, refractiveIndexFilm = 1.5, refractiveIndexBase = 3, size = 64) {\n\n const data = new Uint8Array(size * size * 4);\n super(data, size, size, RGBAFormat, UnsignedByteType, UVMapping, RepeatWrapping, RepeatWrapping, LinearFilter, LinearMipMapLinearFilter);\n\n this._filmThickness = filmThickness;\n this._refractiveIndexFilm = refractiveIndexFilm;\n this._refractiveIndexBase = refractiveIndexBase;\n this._size = size;\n this._data = data;\n\n this._updateData();\n\n this.generateMipmaps = true;\n this.needsUpdate = true;\n }\n\n get filmThickness() {\n return this._filmThickness;\n }\n set filmThickness(value) {\n this._filmThickness = value;\n this.updateSettings(this._filmThickness, this._refractiveIndexFilm, this._refractiveIndexBase);\n }\n\n get refractiveIndexFilm() {\n return this._refractiveIndexFilm;\n }\n set refractiveIndexFilm(value) {\n this._refractiveIndexFilm = value;\n this.updateSettings(this._filmThickness, this._refractiveIndexFilm, this._refractiveIndexBase);\n }\n\n get refractiveIndexBase() {\n return this._refractiveIndexBase;\n }\n set refractiveIndexBase(value) {\n this._refractiveIndexBase = value;\n this.updateSettings(this._filmThickness, this._refractiveIndexFilm, this._refractiveIndexBase);\n }\n\n\n /**\n * Regenerates the lookup texture given new data.\n * @param filmThickness The thickness of the thin film layer in nanometers. Defaults to 380.\n * @param refractiveIndexFilm The refractive index of the thin film. Defaults to 2.\n * @param refractiveIndexBase The refractive index of the material under the film. Defaults to 3.\n */\n updateSettings(filmThickness, refractiveIndexFilm, refractiveIndexBase) {\n this._filmThickness = filmThickness || 380;\n this._refractiveIndexFilm = refractiveIndexFilm || 2;\n this._refractiveIndexBase = refractiveIndexBase || 3;\n this._updateData();\n };\n\n /**\n * @private\n */\n _fresnelRefl(refractiveIndex1, refractiveIndex2, cos1, cos2, R, phi) {\n // r is amplitudinal, R is power\n var sin1Sqr = 1.0 - cos1 * cos1; // = sin^2(incident)\n var refrRatio = refractiveIndex1 / refractiveIndex2;\n\n if (refrRatio * refrRatio * sin1Sqr > 1.0) {\n // total internal reflection\n R.x = 1.0;\n R.y = 1.0;\n\n var sqrRefrRatio = refrRatio * refrRatio;\n // it looks like glsl's atan ranges are different from those in JS?\n phi.x = 2.0 * Math.atan(-sqrRefrRatio * Math.sqrt(sin1Sqr - 1.0 / sqrRefrRatio) / cos1);\n phi.y = 2.0 * Math.atan(-Math.sqrt(sin1Sqr - 1.0 / sqrRefrRatio) / cos1);\n } else {\n var r_p = (refractiveIndex2 * cos1 - refractiveIndex1 * cos2) / (refractiveIndex2 * cos1 + refractiveIndex1 * cos2);\n var r_s = (refractiveIndex1 * cos1 - refractiveIndex2 * cos2) / (refractiveIndex1 * cos1 + refractiveIndex2 * cos2);\n\n phi.x = r_p < 0.0 ? Math.PI : 0.0;\n phi.y = r_s < 0.0 ? Math.PI : 0.0;\n\n R.x = r_p * r_p;\n R.y = r_s * r_s;\n }\n };\n\n /**\n * @private\n */\n _updateData() {\n var filmThickness = this._filmThickness;\n var refractiveIndexFilm = this._refractiveIndexFilm;\n var refractiveIndexBase = this._refractiveIndexBase;\n var size = this._size;\n\n // approximate CIE XYZ weighting functions from: http://jcgt.org/published/0002/02/01/paper.pdf\n function xFit_1931(lambda) {\n var t1 = (lambda - 442.0) * ((lambda < 442.0) ? 0.0624 : 0.0374);\n var t2 = (lambda - 599.8) * ((lambda < 599.8) ? 0.0264 : 0.0323);\n var t3 = (lambda - 501.1) * ((lambda < 501.1) ? 0.0490 : 0.0382);\n return 0.362 * Math.exp(-0.5 * t1 * t1) + 1.056 * Math.exp(-0.5 * t2 * t2) - 0.065 * Math.exp(-0.5 * t3 * t3);\n }\n\n function yFit_1931(lambda) {\n var t1 = (lambda - 568.8) * ((lambda < 568.8) ? 0.0213 : 0.0247);\n var t2 = (lambda - 530.9) * ((lambda < 530.9) ? 0.0613 : 0.0322);\n return 0.821 * Math.exp(-0.5 * t1 * t1) + 0.286 * Math.exp(-0.5 * t2 * t2);\n }\n\n function zFit_1931(lambda) {\n var t1 = (lambda - 437.0) * ((lambda < 437.0) ? 0.0845 : 0.0278);\n var t2 = (lambda - 459.0) * ((lambda < 459.0) ? 0.0385 : 0.0725);\n return 1.217 * Math.exp(-0.5 * t1 * t1) + 0.681 * Math.exp(-0.5 * t2 * t2);\n }\n\n var data = this._data;\n var phi12 = new Vector2();\n var phi21 = new Vector2();\n var phi23 = new Vector2();\n var R12 = new Vector2();\n var T12 = new Vector2();\n var R23 = new Vector2();\n var R_bi = new Vector2();\n var T_tot = new Vector2();\n var R_star = new Vector2();\n var R_bi_sqr = new Vector2();\n var R_12_star = new Vector2();\n var R_star_t_tot = new Vector2();\n\n var refrRatioSqr = 1.0 / (refractiveIndexFilm * refractiveIndexFilm);\n var refrRatioSqrBase = (refractiveIndexFilm * refractiveIndexFilm) / (refractiveIndexBase * refractiveIndexBase);\n\n // RGB is too limiting, so we use the entire spectral domain, but using limited samples (64) to\n // create more pleasing bands\n var numBands = 64;\n var waveLenRange = 780 - 380; // the entire visible range\n\n for (var i = 0; i < size; ++i) {\n for (var k = 0; k < size; ++k) {\n var cosThetaI = i / size;\n var cosThetaT = Math.sqrt(1 - refrRatioSqr * (1.0 - cosThetaI * cosThetaI));\n var cosThetaT2 = Math.sqrt(1 - refrRatioSqrBase * (1.0 - cosThetaT * cosThetaT));\n\n // this is essentially the extra distance traveled by a ray if it bounds through the film\n var pathDiff = 2.0 * refractiveIndexFilm * ((waveLenRange / size * k) + 280) * cosThetaT;\n var pathDiff2PI = 2.0 * Math.PI * pathDiff;\n\n this._fresnelRefl(1.0, refractiveIndexFilm, cosThetaI, cosThetaT, R12, phi12);\n T12.x = 1.0 - R12.x;\n T12.y = 1.0 - R12.y;\n phi21.x = Math.PI - phi12.x;\n phi21.y = Math.PI - phi12.y;\n\n // this concerns the base layer\n this._fresnelRefl(refractiveIndexFilm, refractiveIndexBase, cosThetaT, cosThetaT2, R23, phi23);\n R_bi.x = Math.sqrt(R23.x * R12.x);\n R_bi.y = Math.sqrt(R23.y * R12.y);\n T_tot.x = Math.sqrt(T12.x * T12.x);\n T_tot.y = Math.sqrt(T12.y * T12.y);\n R_star.x = (T12.x * T12.x * R23.x) / (1.0 - R23.x * R12.x);\n R_star.y = (T12.y * T12.y * R23.y) / (1.0 - R23.y * R12.y);\n R_bi_sqr.x = R_bi.x * R_bi.x;\n R_bi_sqr.y = R_bi.y * R_bi.y;\n R_12_star.x = R12.x + R_star.x;\n R_12_star.y = R12.y + R_star.y;\n R_star_t_tot.x = R_star.x - T_tot.x;\n R_star_t_tot.y = R_star.y - T_tot.y;\n var x = 0, y = 0, z = 0;\n var totX = 0, totY = 0, totZ = 0;\n\n for (var j = 0; j < numBands; ++j) {\n var waveLen = 380 + j / (numBands - 1) * waveLenRange;\n var deltaPhase = pathDiff2PI / waveLen;\n\n var cosPhiX = Math.cos(deltaPhase + phi23.x + phi21.x);\n var cosPhiY = Math.cos(deltaPhase + phi23.y + phi21.y);\n var valX = R_12_star.x + 2.0 * (R_bi.x * cosPhiX - R_bi_sqr.x) / (1.0 - 2 * R_bi.x * cosPhiX + R_bi_sqr.x) * R_star_t_tot.x;\n var valY = R_12_star.y + 2.0 * (R_bi.y * cosPhiY - R_bi_sqr.y) / (1.0 - 2 * R_bi.y * cosPhiY + R_bi_sqr.y) * R_star_t_tot.y;\n var v = .5 * (valX + valY);\n\n var wx = xFit_1931(waveLen);\n var wy = yFit_1931(waveLen);\n var wz = zFit_1931(waveLen);\n\n totX += wx;\n totY += wy;\n totZ += wz;\n\n x += wx * v;\n y += wy * v;\n z += wz * v;\n }\n\n x /= totX;\n y /= totY;\n z /= totZ;\n\n var r = 3.2406 * x - 1.5372 * y - 0.4986 * z;\n var g = -0.9689 * x + 1.8758 * y + 0.0415 * z;\n var b = 0.0557 * x - 0.2040 * y + 1.0570 * z;\n\n r = MathUtils.clamp(r, 0.0, 1.0);\n g = MathUtils.clamp(g, 0.0, 1.0);\n b = MathUtils.clamp(b, 0.0, 1.0);\n\n // linear to gamma\n r = Math.pow(r, 0.7);\n g = Math.pow(g, 0.7);\n b = Math.pow(b, 0.7);\n\n // CIE XYZ to linear rgb conversion matrix:\n // 3.2406 -1.5372 -0.4986\n // -0.9689 1.8758 0.0415\n // 0.0557 -0.2040 1.0570\n\n var l = i * 4 + (k * size) * 4;\n data[l] = Math.floor(r * 0xff);\n data[l + 1] = Math.floor(g * 0xff);\n data[l + 2] = Math.floor(b * 0xff);\n data[l + 3] = 0xff;\n }\n }\n\n this.needsUpdate = true;\n };\n}\n\nexport { ThinFilmFresnelMap };","/**\n * This class contains utility functions for working with shaders.\n * These functions are called during the onBeforeCompile event.\n * @class ShaderUtils\n */\nexport class ShaderUtils {\n\n\tstatic applyDiceSoNiceShader(shader) {\n\n\t\tif(this.emissive !== undefined && game.dice3d.DiceFactory.realisticLighting) {\n\t\t\tShaderUtils.selectiveBloomShaderFragment(shader);\n\t\t}\n\n\t\tif (this.userData.iridescent) {\n\t\t\tShaderUtils.iridescentShaderFragment(shader);\n\t\t}\n\n\t\tif (shader.shaderName == \"MeshPhysicalMaterial\" && shader.transmission) {\n\t\t\tShaderUtils.transmissionAlphaShaderFragment(shader);\n\t\t}\n\t}\n\n\tstatic transmissionAlphaShaderFragment(shader) {\n\t\tshader.fragmentShader = shader.fragmentShader.replace(`#include `,\n\t\t\t`#include \n\t\t\ttotalDiffuse = mix( totalDiffuse, transmission.rgb, transmissionFactor);\n\t\t\tfloat grey = (material.diffuseColor.r + material.diffuseColor.g + material.diffuseColor.b) / 3.0;\n\t\t\ttransmissionAlpha = mix( transmissionAlpha, 1.0-grey, transmissionFactor );`);\n\t}\n\n\tstatic selectiveBloomShaderFragment(shader) {\n\t\tshader.uniforms.globalBloom = game.dice3d.uniforms.globalBloom;\n\t\tshader.fragmentShader = `\n\t\t\tuniform float globalBloom;\n\t\t\t${shader.fragmentShader}\n\t\t`.replace(\n\t\t\t`#include `,\n\t\t\t`#include \n\t\t\tif (globalBloom > 0.5) {\n\t\t\t\t#ifdef USE_EMISSIVEMAP\n\t\t\t\t\tgl_FragColor.rgb = texture2D( emissiveMap, vUv ).rgb * emissive;\n\t\t\t\t#else\n\t\t\t\t\tgl_FragColor.rgb = vec3(0.0);\n\t\t\t\t#endif\n\t\t\t}\n\t\t`\n\t\t);\n\t}\n\n\tstatic iridescentShaderFragment(shader) {\n\t\tshader.uniforms.iridescenceLookUp = game.dice3d.uniforms.iridescenceLookUp;\n\t\tshader.uniforms.iridescenceNoise = game.dice3d.uniforms.iridescenceNoise;\n\t\tshader.uniforms.boost = game.dice3d.uniforms.boost;\n\n\t\tshader.vertexShader = `\n\t\t\tvarying vec3 viWorldPosition;\n\t\t\tvarying vec3 viWorldNormal;\n\t\t\t${shader.vertexShader}\n\t\t`.replace(\n\t\t\t`#include `,\n\t\t\t`#include \n\t\t\tviWorldPosition = worldPosition.xyz;\n\t\t\tviWorldNormal = mat3(modelMatrix) * normalize(normal);\n\t\t\t`\n\t\t);\n\n\t\tshader.fragmentShader = `\n\t\t\tvarying vec3 viWorldPosition;\n\t\t\tvarying vec3 viWorldNormal;\n\t\t\t\n\t\t\tuniform sampler2D iridescenceLookUp;\n\t\t\tuniform sampler2D iridescenceNoise;\n\t\t\tuniform float boost;\n\t\t\t${shader.fragmentShader}\n\t\t`.replace(\n\t\t\t`#include `,\n\t\t\t`vec3 viewWorldDir = normalize(viWorldPosition - cameraPosition);\n\t\t\tvec3 iNormal = normalize(viWorldNormal); \n\t\t\tfloat NdotV = max(-dot(viewWorldDir, iNormal), 0.0);\n\t\t\tfloat fresnelFactor = pow(1.0 - NdotV, 5.0);\n\t\t\tfloat noise = texture2D(iridescenceNoise, vUv/2.0).r;\n\t\t\tvec3 airy = texture2D(iridescenceLookUp, vec2(NdotV * .99, noise)).xyz;\n\t\t\ttotalSpecular = totalSpecular * airy * boost;\n\n\t\t\t#include `\n\t\t);\n\t}\n}","\nimport { ThinFilmFresnelMap } from './libs/ThinFilmFresnelMap.js';\nimport { ShaderUtils } from './ShaderUtils';\nexport class DicePreset {\n\n\tconstructor(type, shape = '') {\n\n\t\tshape = shape || type;\n\n\t\tthis.type = type;\n\t\tthis.term = 'Die';\n\t\tthis.shape = shape || type;\n\t\tthis.scale = 1;\n\t\tthis.labels = [];\n\t\tthis.valueMap = null;\n\t\tthis.values = [];\n\t\tthis.bumps = [];\n\t\tthis.emissiveMaps = [];\n\t\tthis.emissive = 0x000000;\n\t\tthis.mass = 300;\n\t\tthis.inertia = 13;\n\t\tthis.geometry = null;\n\t\tthis.model = null;\n\t\tthis.system = 'standard';\n\t\tthis.modelLoaded = false;\n\t\tthis.modelLoading = false;\n\t\tthis.modelFile = null;\n\t\tthis.internalAdd = false;\n\n\t\t//todo : check if this is useful\n\t\tthis.appearance = {\n\t\t\tlabelColor: \"#FFFFFF\",\n\t\t\tdiceColor: \"#000000\",\n\t\t\toutlineColor: \"#000000\",\n\t\t\tedgeColor: \"#000000\",\n\t\t\ttexture: \"none\",\n\t\t\tmaterial: \"auto\",\n\t\t\tfont: \"auto\",\n\t\t\tcolorset: \"custom\"\n\t\t};\n\t}\n\n\tsetValues(min = 1, max = 20, step = 1) {\n\t\tthis.values = this.range(min, max, step);\n\t\tif(min < 1)\n\t\t\tthis.setValueMap(min, max, step);\n\t}\n\n\tsetValueMap(min, max, step) {\n\t\tlet map = {};\n\t\tlet count=1;\n\t\tfor(let i = min; i<= max; i+=step){\n\t\t\tmap[i] = count;\n\t\t\tcount++;\n\t\t}\n\t\tthis.valueMap = map;\n\t}\n\n\tregisterFaces(faces, type = \"labels\") {\n\t\tlet tab = [];\n\t\t\n\t\ttab.push('');\n\t\tif (![\"d2\", \"d10\"].includes(this.shape)) tab.push('');\n\n\t\tif (this.shape == 'd4') {\n\n\t\t\tlet a = faces[0];\n\t\t\tlet b = faces[1];\n\t\t\tlet c = faces[2];\n\t\t\tlet d = faces[3];\n\n\t\t\ttab = [\n\t\t\t\t[[], [0, 0, 0], [b, d, c], [a, c, d], [b, a, d], [a, b, c]],\n\t\t\t\t[[], [0, 0, 0], [b, c, d], [c, a, d], [b, d, a], [c, b, a]],\n\t\t\t\t[[], [0, 0, 0], [d, c, b], [c, d, a], [d, b, a], [c, a, b]],\n\t\t\t\t[[], [0, 0, 0], [d, b, c], [a, d, c], [d, a, b], [a, c, b]]\n\t\t\t];\n\t\t} else {\n\t\t\tArray.prototype.push.apply(tab, faces)\n\t\t}\n\n\t\tswitch(type){\n\t\t\tcase \"labels\":\n\t\t\t\tthis.labels = tab;\n\t\t\t\tbreak;\n\t\t\tcase \"bumps\":\n\t\t\t\tthis.bumps = tab;\n\t\t\t\tbreak;\n\t\t\tcase \"emissive\":\n\t\t\t\tthis.emissiveMaps = tab;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tsetLabels(labels) {\n\t\tthis.labels = labels;\n\t\tthis.modelLoaded=false;\n\t\tthis.modelLoading=false;\n\t}\n\n\tsetBumpMaps(bumps) {\n\t\tthis.bumps = bumps;\n\t\tthis.modelLoaded=false;\n\t\tthis.modelLoading=false;\n\t}\n\n\tsetEmissiveMaps(emissiveMaps) {\n\t\tthis.emissiveMaps = emissiveMaps;\n\t\tthis.modelLoaded=false;\n\t\tthis.modelLoading=false;\n\t}\n\n\tloadTextures() {\n\t\tif(!this.modelLoaded && this.modelLoading === false){\n\t\t\tthis.modelLoading = new Promise((resolve,reject)=> {\n\t\t\t\tlet textures;\n\t\t\t\tlet type;\n\t\t\t\tlet textureTypeLoaded = 0;\n\t\t\t\tfor(let i = 0; i < 3;i++){\n\t\t\t\t\tswitch(i){\n\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\ttextures = this.labels;\n\t\t\t\t\t\t\ttype = \"labels\";\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 1:\n\t\t\t\t\t\t\ttextures = this.bumps;\n\t\t\t\t\t\t\ttype = \"bumps\";\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\ttextures = this.emissiveMaps;\n\t\t\t\t\t\t\ttype = \"emissive\";\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tlet loadedImages = 0;\n\t\t\t\t\tlet numImages = textures.length;\n\t\t\t\t\tlet regexTexture = /\\.(PNG|JPG|GIF|WEBP)$/i;\n\t\t\t\t\tlet imgElements = Array(textures.length);\n\t\t\t\t\tlet hasTextures = false;\n\t\t\t\t\tfor (let i = 0; i < numImages; i++) {\n\t\t\t\t\t\tif (textures[i] == null || textures[i] == '' || !textures[i].match(regexTexture)) {\n\t\t\t\t\t\t\timgElements[i] = textures[i];\n\t\t\t\t\t\t\t++loadedImages\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\thasTextures = true;\n\t\t\t\t\t\timgElements[i] = new Image();\n\t\t\t\t\t\timgElements[i].crossOrigin = \"Anonymous\";\n\t\t\t\t\t\timgElements.textureType = type;\n\t\t\t\t\t\timgElements[i].onload = function(){\n\t\t\t\t\t\t\tif (++loadedImages >= numImages) {\n\t\t\t\t\t\t\t\tthis.registerFaces(imgElements, imgElements.textureType);\n\t\t\t\t\t\t\t\tif(textureTypeLoaded < 2)\n\t\t\t\t\t\t\t\t\ttextureTypeLoaded++;\n\t\t\t\t\t\t\t\telse{\n\t\t\t\t\t\t\t\t\tresolve();\n\t\t\t\t\t\t\t\t\tthis.modelLoaded = true;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}.bind(this);\n\n\t\t\t\t\t\t//We still consider the image as loaded even if it fails to load\n\t\t\t\t\t\t//so that we can still initialize the module\n\t\t\t\t\t\timgElements[i].onerror = function(texture){\n\t\t\t\t\t\t\tconsole.error(\"[Dice So Nice] Error loading texture:\" + texture);\n\t\t\t\t\t\t\tif (++loadedImages >= numImages) {\n\t\t\t\t\t\t\t\tif(textureTypeLoaded < 2)\n\t\t\t\t\t\t\t\t\ttextureTypeLoaded++;\n\t\t\t\t\t\t\t\telse{\n\t\t\t\t\t\t\t\t\tresolve();\n\t\t\t\t\t\t\t\t\tthis.modelLoaded = true;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}.bind(this, textures[i]);\n\n\t\t\t\t\t\timgElements[i].src = textures[i];\n\t\t\t\t\t}\n\t\t\t\t\tif (!hasTextures){\n\t\t\t\t\t\tthis.registerFaces(imgElements, type);\n\t\t\t\t\t\tif(textureTypeLoaded < 2)\n\t\t\t\t\t\t\ttextureTypeLoaded++;\n\t\t\t\t\t\telse{\n\t\t\t\t\t\t\tresolve();\n\t\t\t\t\t\t\tthis.modelLoaded = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\treturn this.modelLoading;\n\t}\n\n\trange(start, stop, step = 1) {\n\t\tvar a = [start], b = start;\n\t\twhile (b < stop) {\n\t\t\ta.push(b += step || 1);\n\t\t}\n\t\treturn a;\n\t}\n\n\tsetModel(file) {\n\t\tthis.modelFile = file;\n\t\tthis.modelLoaded = false;\n\t}\n\n\tloadModel(loader = null) {\n\t\t// Load a glTF resource\n\t\tif(!this.modelLoaded && this.modelLoading === false){\n\t\t\tthis.modelLoading = new Promise((resolve,reject)=> {\n\t\t\t\tloader.load(this.modelFile, gltf => {\n\t\t\t\t\tgltf.scene.traverse(function (node) {\n\t\t\t\t\t\tif (node.isMesh) {\n\t\t\t\t\t\t\tnode.castShadow = true; \n\t\t\t\t\t\t\tnode.material.onBeforeCompile = ShaderUtils.applyDiceSoNiceShader;\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tif(node.material.map !== null)\n\t\t\t\t\t\t\t\tnode.material.map.anisotropy = 8;\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tif(node.material.normalMap !== null)\n\t\t\t\t\t\t\t\tnode.material.normalMap.anisotropy = 8;\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tif(node.material.emissiveMap !== null)\n\t\t\t\t\t\t\t\tnode.material.emissiveMap.anisotropy = 8;\n\n\t\t\t\t\t\t\tif(node.material.roughnessMap !== null)\n\t\t\t\t\t\t\t\tnode.material.roughnessMap.anisotropy = 8;\n\n\t\t\t\t\t\t\tif(node.material.metalnessMap !== null)\n\t\t\t\t\t\t\t\tnode.material.metalnessMap.anisotropy = 8;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tthis.model = gltf;\n\t\t\t\t\tthis.modelLoaded = true;\n\t\t\t\t\tHooks.callAll(\"diceSoNiceModelLoaded\", this);\n\t\t\t\t\tresolve(gltf);\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t\treturn this.modelLoading;\n\t}\n}","\nimport { DicePreset } from './DicePreset.js';\n\nexport const BASE_PRESETS_LIST = [];\nexport const EXTRA_PRESETS_LIST = [];\n\n\n//////////////////////////////////////////////////\n// BASE SYSTEM //\n//////////////////////////////////////////////////\nlet diceobj;\n\ndiceobj = new DicePreset('d2');\ndiceobj.setLabels(['1', '2']);\ndiceobj.setValues(1, 2);\ndiceobj.inertia = 8;\ndiceobj.mass = 400;\ndiceobj.scale = 0.9;\nBASE_PRESETS_LIST.push(diceobj);\n\ndiceobj = new DicePreset('dc', 'd2');\ndiceobj.term = 'Coin';\ndiceobj.setLabels([\n 'modules/dice-so-nice/textures/coin/tail.webp',\n 'modules/dice-so-nice/textures/coin/heads.webp'\n]);\ndiceobj.setBumpMaps([\n 'modules/dice-so-nice/textures/coin/tail_bump.webp',\n 'modules/dice-so-nice/textures/coin/heads_bump.webp'\n]);\ndiceobj.setValues(0, 1);\ndiceobj.inertia = 8;\ndiceobj.scale = 0.9;\ndiceobj.colorset = \"coin_default\"\nBASE_PRESETS_LIST.push(diceobj);\n\ndiceobj = new DicePreset('d4');\ndiceobj.setLabels(['1', '2', '3', '4']);\ndiceobj.setValues(1, 4);\ndiceobj.inertia = 5;\ndiceobj.scale = 1.2;\nBASE_PRESETS_LIST.push(diceobj);\n\ndiceobj = new DicePreset('d6');\ndiceobj.setLabels(['1', '2', '3', '4', '5', '6']);\ndiceobj.setValues(1, 6);\ndiceobj.scale = 0.9;\nBASE_PRESETS_LIST.push(diceobj);\n\ndiceobj = new DicePreset('d3', 'd6');\ndiceobj.setLabels(['1', '2', '3']);\ndiceobj.setValues(1, 3);\ndiceobj.scale = 0.9;\nBASE_PRESETS_LIST.push(diceobj);\n\ndiceobj = new DicePreset('df', 'd6');\ndiceobj.term = 'FateDie';\ndiceobj.setLabels(['−', ' ', '+']);\ndiceobj.setValues(-1, 1);\ndiceobj.scale = 0.9;\nBASE_PRESETS_LIST.push(diceobj);\n\ndiceobj = new DicePreset('d8');\ndiceobj.setLabels(['1', '2', '3', '4', '5', '6', '7', '8']);\ndiceobj.setValues(1, 8);\nBASE_PRESETS_LIST.push(diceobj);\n\ndiceobj = new DicePreset('d10');\ndiceobj.setLabels(['1', '2', '3', '4', '5', '6', '7', '8', '9', '0']);\ndiceobj.setValues(1, 10);\ndiceobj.mass = 450;\ndiceobj.inertia = 9;\ndiceobj.scale = 0.9;\nBASE_PRESETS_LIST.push(diceobj);\n\ndiceobj = new DicePreset('d5', 'd10');\ndiceobj.setLabels(['1', '2', '3', '4', '5']);\ndiceobj.setValues(1, 5);\ndiceobj.mass = 450;\ndiceobj.inertia = 9;\ndiceobj.scale = 0.9;\nBASE_PRESETS_LIST.push(diceobj);\n\ndiceobj = new DicePreset('d100', 'd10');\ndiceobj.setLabels(['10', '20', '30', '40', '50', '60', '70', '80', '90', '00']);\ndiceobj.setValues(10, 100, 10);\ndiceobj.mass = 450;\ndiceobj.inertia = 9;\ndiceobj.scale = 0.9;\nBASE_PRESETS_LIST.push(diceobj);\n\ndiceobj = new DicePreset('d12');\ndiceobj.setLabels(['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12']);\ndiceobj.setValues(1, 12);\ndiceobj.mass = 450;\ndiceobj.inertia = 8;\ndiceobj.scale = 0.9;\nBASE_PRESETS_LIST.push(diceobj);\n\ndiceobj = new DicePreset('d14');\ndiceobj.setLabels(['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14']);\ndiceobj.setValues(1, 14);\ndiceobj.mass = 450;\ndiceobj.inertia = 8;\ndiceobj.scale = 1;\nBASE_PRESETS_LIST.push(diceobj);\n\ndiceobj = new DicePreset('d7', 'd14');\ndiceobj.setLabels(['1', '2', '3', '4', '5', '6', '7']);\ndiceobj.setValues(1, 7);\ndiceobj.mass = 450;\ndiceobj.inertia = 8;\ndiceobj.scale = 1;\nBASE_PRESETS_LIST.push(diceobj);\n\ndiceobj = new DicePreset('d16');\ndiceobj.setLabels(['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16']);\ndiceobj.setValues(1, 16);\ndiceobj.mass = 450;\ndiceobj.inertia = 8;\ndiceobj.scale = 1;\nBASE_PRESETS_LIST.push(diceobj);\n\ndiceobj = new DicePreset('d20');\ndiceobj.setLabels(['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20']);\ndiceobj.setValues(1, 20);\ndiceobj.mass = 500;\ndiceobj.scale = 1;\ndiceobj.inertia = 6;\nBASE_PRESETS_LIST.push(diceobj);\n\ndiceobj = new DicePreset('d24');\ndiceobj.setLabels(['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24']);\ndiceobj.setValues(1, 24);\ndiceobj.mass = 500;\ndiceobj.scale = 1;\ndiceobj.inertia = 10;\nBASE_PRESETS_LIST.push(diceobj);\n\ndiceobj = new DicePreset('d30');\ndiceobj.setLabels(['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '30']);\ndiceobj.setValues(1, 30);\ndiceobj.mass = 500;\ndiceobj.scale = 1;\ndiceobj.inertia = 10;\nBASE_PRESETS_LIST.push(diceobj);\n\n//////////////////////////////////////////////////\n// EXTRA SYSTEM //\n//////////////////////////////////////////////////\n\n/**\n * Dot System\n */\nEXTRA_PRESETS_LIST.push({\n type: \"d6\",\n labels: [\n 'modules/dice-so-nice/textures/dot/d6-1.webp',\n 'modules/dice-so-nice/textures/dot/d6-2.webp',\n 'modules/dice-so-nice/textures/dot/d6-3.webp',\n 'modules/dice-so-nice/textures/dot/d6-4.webp',\n 'modules/dice-so-nice/textures/dot/d6-5.webp',\n 'modules/dice-so-nice/textures/dot/d6-6.webp'\n ],\n bumpMaps: [\n 'modules/dice-so-nice/textures/dot/d6-1-b.webp',\n 'modules/dice-so-nice/textures/dot/d6-2-b.webp',\n 'modules/dice-so-nice/textures/dot/d6-3-b.webp',\n 'modules/dice-so-nice/textures/dot/d6-4-b.webp',\n 'modules/dice-so-nice/textures/dot/d6-5-b.webp',\n 'modules/dice-so-nice/textures/dot/d6-6-b.webp'\n ],\n system: \"dot\"\n});\n\nEXTRA_PRESETS_LIST.push({\n type: \"d6\",\n labels: [\n 'modules/dice-so-nice/textures/dot/d6-1-black.webp',\n 'modules/dice-so-nice/textures/dot/d6-2-black.webp',\n 'modules/dice-so-nice/textures/dot/d6-3-black.webp',\n 'modules/dice-so-nice/textures/dot/d6-4-black.webp',\n 'modules/dice-so-nice/textures/dot/d6-5-black.webp',\n 'modules/dice-so-nice/textures/dot/d6-6-black.webp',\n ],\n bumpMaps: [\n 'modules/dice-so-nice/textures/dot/d6-1-b.webp',\n 'modules/dice-so-nice/textures/dot/d6-2-b.webp',\n 'modules/dice-so-nice/textures/dot/d6-3-b.webp',\n 'modules/dice-so-nice/textures/dot/d6-4-b.webp',\n 'modules/dice-so-nice/textures/dot/d6-5-b.webp',\n 'modules/dice-so-nice/textures/dot/d6-6-b.webp',\n ],\n system: \"dot_b\"\n});\n\n/**\n * foundry_vtt System\n */\nEXTRA_PRESETS_LIST.push({\n type: \"d2\",\n labels: ['1', 'F'],\n font: \"FoundryVTT\",\n system: \"foundry_vtt\",\n fontScale: 1.2\n});\nEXTRA_PRESETS_LIST.push({\n type: \"d4\",\n labels: ['1', '2', '3', 'E'],\n font: \"FoundryVTT\",\n system: \"foundry_vtt\",\n fontScale: 0.8\n});\nEXTRA_PRESETS_LIST.push({\n type: \"d6\",\n labels: ['1', '2', '3', '4', '5', 'E'],\n font: \"FoundryVTT\",\n system: \"foundry_vtt\"\n});\nEXTRA_PRESETS_LIST.push({\n type: \"df\",\n labels: ['−', ' ', '+'],\n font: \"FoundryVTT\",\n system: \"foundry_vtt\"\n});\nEXTRA_PRESETS_LIST.push({\n type: \"d3\",\n labels: ['1', '2', 'E'],\n font: \"FoundryVTT\",\n system: \"foundry_vtt\"\n});\nEXTRA_PRESETS_LIST.push({\n type: \"d8\",\n labels: ['1', '2', '3', '4', '5', '6', '7', 'F'],\n font: \"FoundryVTT\",\n system: \"foundry_vtt\"\n});\nEXTRA_PRESETS_LIST.push({\n type: \"d10\",\n labels: ['1', '2', '3', '4', '5', '6', '7', '8', '9', 'E'],\n font: \"FoundryVTT\",\n system: \"foundry_vtt\",\n fontScale: 0.9\n});\nEXTRA_PRESETS_LIST.push({\n type: \"d5\",\n labels: ['1', '2', '3', '4', 'E'],\n font: \"FoundryVTT\",\n system: \"foundry_vtt\",\n fontScale: 0.9\n});\nEXTRA_PRESETS_LIST.push({\n type: \"d100\",\n labels: ['10', '20', '30', '40', '50', '60', '70', '80', '90', 'E'],\n font: \"FoundryVTT\",\n system: \"foundry_vtt\"\n});\nEXTRA_PRESETS_LIST.push({\n type: \"d12\",\n labels: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', 'E'],\n font: \"FoundryVTT\",\n system: \"foundry_vtt\"\n});\nEXTRA_PRESETS_LIST.push({\n type: \"d14\",\n labels: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', 'E'],\n font: \"FoundryVTT\",\n system: \"foundry_vtt\"\n});\nEXTRA_PRESETS_LIST.push({\n type: \"d7\",\n labels: ['1', '2', '3', '4', '5', '6', 'E'],\n font: \"FoundryVTT\",\n system: \"foundry_vtt\"\n});\nEXTRA_PRESETS_LIST.push({\n type: \"d16\",\n labels: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', 'E'],\n font: \"FoundryVTT\",\n system: \"foundry_vtt\"\n});\nEXTRA_PRESETS_LIST.push({\n type: \"d20\",\n labels: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', 'F'],\n font: \"FoundryVTT\",\n system: \"foundry_vtt\"\n});\nEXTRA_PRESETS_LIST.push({\n type: \"d24\",\n labels: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', 'F'],\n font: \"FoundryVTT\",\n system: \"foundry_vtt\"\n});\nEXTRA_PRESETS_LIST.push({\n type: \"d30\",\n labels: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', 'E'],\n font: \"FoundryVTT\",\n system: \"foundry_vtt\"\n});\n\n\n/**\n * Spectrum System\n */\n\nEXTRA_PRESETS_LIST.push({\n type: \"df\",\n labels: [\n 'modules/dice-so-nice/textures/spectrumdice/df-m.webp',\n 'modules/dice-so-nice/textures/spectrumdice/df-0.webp',\n 'modules/dice-so-nice/textures/spectrumdice/df-p.webp'\n ],\n emissiveMaps: [\n 'modules/dice-so-nice/textures/spectrumdice/df-m.webp',\n 'modules/dice-so-nice/textures/spectrumdice/df-0.webp',\n 'modules/dice-so-nice/textures/spectrumdice/df-p.webp'\n ],\n emissive: 0xffffff,\n colorset: \"spectrum_default\",\n system: \"spectrum\"\n});\n\nEXTRA_PRESETS_LIST.push({\n type: \"d2\",\n labels: [\n 'modules/dice-so-nice/textures/spectrumdice/d2-1.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d2-2.webp'\n ],\n emissiveMaps: [\n 'modules/dice-so-nice/textures/spectrumdice/d2-1.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d2-2.webp'\n ],\n emissive: 0xffffff,\n colorset: \"spectrum_default\",\n system: \"spectrum\"\n});\n\nEXTRA_PRESETS_LIST.push({\n type: \"dc\",\n labels: [\n 'modules/dice-so-nice/textures/spectrumdice/dc-h.webp',\n 'modules/dice-so-nice/textures/spectrumdice/dc-t.webp'\n ],\n emissiveMaps: [\n 'modules/dice-so-nice/textures/spectrumdice/dc-h.webp',\n 'modules/dice-so-nice/textures/spectrumdice/dc-t.webp'\n ],\n emissive: 0xffffff,\n colorset: \"spectrum_default\",\n system: \"spectrum\"\n});\n\nEXTRA_PRESETS_LIST.push({\n type: \"d4\",\n labels: [\n 'modules/dice-so-nice/textures/spectrumdice/d4-1.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d4-2.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d4-3.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d4-4.webp'\n ],\n emissiveMaps: [\n 'modules/dice-so-nice/textures/spectrumdice/d4-1.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d4-2.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d4-3.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d4-4.webp'\n ],\n emissive: 0xffffff,\n colorset: \"spectrum_default\",\n system: \"spectrum\"\n});\n\nEXTRA_PRESETS_LIST.push({\n type: \"d6\",\n labels: [\n 'modules/dice-so-nice/textures/spectrumdice/d6-1.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d6-2.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d6-3.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d6-4.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d6-5.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d6-6.webp'\n ],\n emissiveMaps: [\n 'modules/dice-so-nice/textures/spectrumdice/d6-1.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d6-2.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d6-3.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d6-4.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d6-5.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d6-6.webp'\n ],\n emissive: 0xffffff,\n colorset: \"spectrum_default\",\n system: \"spectrum\"\n});\n\nEXTRA_PRESETS_LIST.push({\n type: \"d8\",\n labels: [\n 'modules/dice-so-nice/textures/spectrumdice/d8-1.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d8-2.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d8-3.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d8-4.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d8-5.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d8-6.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d8-7.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d8-8.webp'\n ],\n emissiveMaps: [\n 'modules/dice-so-nice/textures/spectrumdice/d8-1.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d8-2.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d8-3.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d8-4.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d8-5.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d8-6.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d8-7.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d8-8.webp'\n ],\n emissive: 0xffffff,\n colorset: \"spectrum_default\",\n system: \"spectrum\"\n});\n\nEXTRA_PRESETS_LIST.push({\n type: \"d10\",\n labels: [\n 'modules/dice-so-nice/textures/spectrumdice/d10-1.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d10-2.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d10-3.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d10-4.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d10-5.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d10-6.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d10-7.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d10-8.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d10-9.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d10-0.webp'\n ],\n emissiveMaps: [\n 'modules/dice-so-nice/textures/spectrumdice/d10-1.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d10-2.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d10-3.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d10-4.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d10-5.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d10-6.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d10-7.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d10-8.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d10-9.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d10-0.webp'\n ],\n emissive: 0xffffff,\n colorset: \"spectrum_default\",\n system: \"spectrum\"\n});\n\nEXTRA_PRESETS_LIST.push({\n type: \"d12\",\n labels: [\n 'modules/dice-so-nice/textures/spectrumdice/d12-1.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d12-2.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d12-3.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d12-4.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d12-5.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d12-6.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d12-7.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d12-8.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d12-9.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d12-10.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d12-11.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d12-12.webp'\n ],\n emissiveMaps: [\n 'modules/dice-so-nice/textures/spectrumdice/d12-1.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d12-2.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d12-3.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d12-4.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d12-5.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d12-6.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d12-7.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d12-8.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d12-9.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d12-10.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d12-11.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d12-12.webp'\n ],\n emissive: 0xffffff,\n colorset: \"spectrum_default\",\n system: \"spectrum\"\n});\n\nEXTRA_PRESETS_LIST.push({\n type: \"d100\",\n labels: [\n 'modules/dice-so-nice/textures/spectrumdice/d100-10.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d100-20.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d100-30.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d100-40.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d100-50.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d100-60.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d100-70.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d100-80.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d100-90.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d100-00.webp'\n ],\n emissiveMaps: [\n 'modules/dice-so-nice/textures/spectrumdice/d100-10.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d100-20.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d100-30.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d100-40.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d100-50.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d100-60.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d100-70.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d100-80.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d100-90.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d100-00.webp'\n ],\n emissive: 0xffffff,\n colorset: \"spectrum_default\",\n system: \"spectrum\"\n});\n\nEXTRA_PRESETS_LIST.push({\n type: \"d20\",\n labels: [\n 'modules/dice-so-nice/textures/spectrumdice/d20-1.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-2.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-3.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-4.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-5.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-6.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-7.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-8.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-9.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-10.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-11.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-12.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-13.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-14.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-15.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-16.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-17.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-18.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-19.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-20.webp'\n ],\n emissiveMaps: [\n 'modules/dice-so-nice/textures/spectrumdice/d20-1.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-2.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-3.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-4.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-5.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-6.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-7.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-8.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-9.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-10.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-11.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-12.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-13.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-14.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-15.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-16.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-17.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-18.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-19.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-20.webp'\n ],\n emissive: 0xffffff,\n colorset: \"spectrum_default\",\n system: \"spectrum\"\n});\n","export const TEXTURELIST = {\n\t'none': {\n\t\tname: 'DICESONICE.TextureNone',\n\t\tcomposite: 'source-over',\n\t\tsource: '',\n\t\tbump: ''\n\t},\n\t'cloudy': {\n\t\tname: 'DICESONICE.TextureCloudsTransparent',\n\t\tcomposite: 'destination-in',\n\t\tsource: 'modules/dice-so-nice/textures/cloudy.webp',\n\t\tbump: 'modules/dice-so-nice/textures/cloudy.alt.webp'\n\t},\n\t'cloudy_2': {\n\t\tname: 'DICESONICE.TextureClouds',\n\t\tcomposite: 'multiply',\n\t\tsource: 'modules/dice-so-nice/textures/cloudy.alt.webp',\n\t\tbump: 'modules/dice-so-nice/textures/cloudy.alt.webp'\n\t},\n\t'fire': {\n\t\tname: 'DICESONICE.TextureFire',\n\t\tcomposite: 'multiply',\n\t\tsource: 'modules/dice-so-nice/textures/fire.webp',\n\t\tbump: 'modules/dice-so-nice/textures/fire.webp'\n\t},\n\t'marble': {\n\t\tname: 'DICESONICE.TextureMarble',\n\t\tcomposite: 'multiply',\n\t\tsource: 'modules/dice-so-nice/textures/marble.webp',\n\t\tbump: '',\n\t\tmaterial: \"glass\"\n\t},\n\t'water': {\n\t\tname: 'DICESONICE.TextureWaterTransparent',\n\t\tcomposite: 'destination-in',\n\t\tsource: 'modules/dice-so-nice/textures/water.webp',\n\t\tbump: 'modules/dice-so-nice/textures/water.webp',\n\t\tmaterial: 'glass',\n\t},\n\t'water_2': {\n\t\tname: 'DICESONICE.TextureWater',\n\t\tcomposite: 'multiply',\n\t\tsource: 'modules/dice-so-nice/textures/water.webp',\n\t\tbump: 'modules/dice-so-nice/textures/water.webp',\n\t\tmaterial: 'glass',\n\t},\n\t'ice': {\n\t\tname: 'DICESONICE.TextureIceTransparent',\n\t\tcomposite: 'destination-in',\n\t\tsource: 'modules/dice-so-nice/textures/ice.webp',\n\t\tbump: 'modules/dice-so-nice/textures/ice.webp',\n\t\tmaterial: 'glass'\n\t},\n\t'ice_2': {\n\t\tname: 'DICESONICE.TextureIce',\n\t\tcomposite: 'multiply',\n\t\tsource: 'modules/dice-so-nice/textures/ice.webp',\n\t\tbump: 'modules/dice-so-nice/textures/ice.webp',\n\t\tmaterial: 'glass'\n\t},\n\t'paper': {\n\t\tname: 'DICESONICE.TexturePaper',\n\t\tcomposite: 'multiply',\n\t\tsource: 'modules/dice-so-nice/textures/paper.webp',\n\t\tbump: 'modules/dice-so-nice/textures/paper-bump.webp',\n\t\tmaterial: 'wood'\n\t},\n\t'speckles': {\n\t\tname: 'DICESONICE.TextureSpeckles',\n\t\tcomposite: 'multiply',\n\t\tsource: 'modules/dice-so-nice/textures/speckles.webp',\n\t\tbump: 'modules/dice-so-nice/textures/speckles.webp'\n\t},\n\t'glitter': {\n\t\tname: 'DICESONICE.TextureGlitter',\n\t\tcomposite: 'multiply',\n\t\tsource: 'modules/dice-so-nice/textures/glitter.webp',\n\t\tbump: 'modules/dice-so-nice/textures/glitter-bump.webp'\n\t},\n\t'glitter_2': {\n\t\tname: 'DICESONICE.TextureGlitterTransparent',\n\t\tcomposite: 'destination-in',\n\t\tsource: 'modules/dice-so-nice/textures/glitter-alpha.webp',\n\t\tbump: ''\n\t},\n\t'stars': {\n\t\tname: 'DICESONICE.TextureStars',\n\t\tcomposite: 'multiply',\n\t\tsource: 'modules/dice-so-nice/textures/stars.webp',\n\t\tbump: 'modules/dice-so-nice/textures/stars.webp'\n\t},\n\t'stainedglass': {\n\t\tname: 'DICESONICE.TextureStainedGlass',\n\t\tcomposite: 'multiply',\n\t\tsource: 'modules/dice-so-nice/textures/stainedglass.webp',\n\t\tbump: 'modules/dice-so-nice/textures/stainedglass-bump.webp',\n\t\tmaterial: 'iridescent'\n\t},\n\t'skulls': {\n\t\tname: 'DICESONICE.TextureSkulls',\n\t\tcomposite: 'multiply',\n\t\tsource: 'modules/dice-so-nice/textures/skulls.webp',\n\t\tbump: 'modules/dice-so-nice/textures/skulls.webp'\n\t},\n\t'leopard': {\n\t\tname: 'DICESONICE.TextureLeopard',\n\t\tcomposite: 'multiply',\n\t\tsource: 'modules/dice-so-nice/textures/leopard.webp',\n\t\tbump: 'modules/dice-so-nice/textures/leopard.webp',\n\t\tmaterial: 'wood'\n\t},\n\t'tiger': {\n\t\tname: 'DICESONICE.TextureTiger',\n\t\tcomposite: 'multiply',\n\t\tsource: 'modules/dice-so-nice/textures/tiger.webp',\n\t\tbump: 'modules/dice-so-nice/textures/tiger.webp',\n\t\tmaterial: 'wood'\n\t},\n\t'cheetah': {\n\t\tname: 'DICESONICE.TextureCheetah',\n\t\tcomposite: 'multiply',\n\t\tsource: 'modules/dice-so-nice/textures/cheetah.webp',\n\t\tbump: 'modules/dice-so-nice/textures/cheetah.webp',\n\t\tmaterial: 'wood'\n\t},\n\t'dragon': {\n\t\tname: 'Dragon',\n\t\tcomposite: 'multiply',\n\t\tsource: 'modules/dice-so-nice/textures/dragon.webp',\n\t\tbump: 'modules/dice-so-nice/textures/dragon-bump.webp'\n\t},\n\t'lizard': {\n\t\tname: 'Lizard',\n\t\tcomposite: 'multiply',\n\t\tsource: 'modules/dice-so-nice/textures/lizard.webp',\n\t\tbump: 'modules/dice-so-nice/textures/lizard-bump.webp'\n\t},\n\t'bird': {\n\t\tname: 'Bird',\n\t\tcomposite: 'multiply',\n\t\tsource: 'modules/dice-so-nice/textures/feather.webp',\n\t\tbump: 'modules/dice-so-nice/textures/feather-bump.webp'\n\t},\n\t'astral': {\n\t\tname: 'DICESONICE.TextureAstralSea',\n\t\tcomposite: 'multiply',\n\t\tsource: 'modules/dice-so-nice/textures/astral.webp',\n\t\tbump: 'modules/dice-so-nice/textures/stars.webp'\n\t},\n\t'wood': {\n\t\tname: 'DICESONICE.TextureWood',\n\t\tcomposite: 'multiply',\n\t\tsource: 'modules/dice-so-nice/textures/wood.webp',\n\t\tbump: 'modules/dice-so-nice/textures/wood.webp',\n\t\tmaterial: 'wood'\n\t},\n\t'metal': {\n\t\tname: 'DICESONICE.TextureMetal',\n\t\tcomposite: 'multiply',\n\t\tsource: 'modules/dice-so-nice/textures/metal.webp',\n\t\tbump: '',\n\t\tmaterial: 'metal'\n\t},\n\t'stone': {\n\t\tname: 'DICESONICE.TextureStone',\n\t\tcomposite: 'soft-light',\n\t\tsource: 'modules/dice-so-nice/textures/stone.webp',\n\t\tbump: 'modules/dice-so-nice/textures/stone.webp',\n\t\tmaterial: 'stone'\n\t},\n\t'radial': {\n\t\tname: 'DICESONICE.TextureRadial',\n\t\tcomposite: 'source-over',\n\t\tsource: 'modules/dice-so-nice/textures/radial.webp',\n\t\tbump: '',\n\t},\n\t'bronze01': {\n\t\tname: 'DICESONICE.TextureBronze1',\n\t\tcomposite: 'difference',\n\t\tsource: 'modules/dice-so-nice/textures/bronze01.webp',\n\t\tmaterial: 'metal',\n\t\tbump: ''\n\t},\n\t'bronze02': {\n\t\tname: 'DICESONICE.TextureBronze2',\n\t\tcomposite: 'difference',\n\t\tsource: 'modules/dice-so-nice/textures/bronze02.webp',\n\t\tmaterial: 'metal',\n\t\tbump: ''\n\t},\n\t'bronze03': {\n\t\tname: 'DICESONICE.TextureBronze3',\n\t\tcomposite: 'difference',\n\t\tsource: 'modules/dice-so-nice/textures/bronze03.webp',\n\t\tmaterial: 'metal',\n\t\tbump: ''\n\t},\n\t'bronze03a': {\n\t\tname: 'DICESONICE.TextureBronze3a',\n\t\tcomposite: 'difference',\n\t\tsource: 'modules/dice-so-nice/textures/bronze03a.webp',\n\t\tmaterial: 'metal',\n\t\tbump: ''\n\t},\n\t'bronze03b': {\n\t\tname: 'DICESONICE.TextureBronze3b',\n\t\tcomposite: 'difference',\n\t\tsource: 'modules/dice-so-nice/textures/bronze03b.webp',\n\t\tmaterial: 'metal',\n\t\tbump: ''\n\t},\n\t'bronze04': {\n\t\tname: 'DICESONICE.TextureBronze4',\n\t\tcomposite: 'difference',\n\t\tsource: 'modules/dice-so-nice/textures/bronze04.webp',\n\t\tmaterial: 'metal',\n\t\tbump: ''\n\t}\n};\n\nexport const COLORSETS = {\n\t'coin_default': {\n\t\tname: 'coin_default',\n\t\tdescription: 'DICESONICE.ColorCoinDefault',\n\t\tcategory: 'DICESONICE.AcquiredTaste',\n\t\tforeground: '#f6c928',\n\t\tbackground: '#f6c928',\n\t\toutline: 'none',\n\t\tedge: '#f6c928',\n\t\ttexture: 'metal',\n\t\tvisibility: 'hidden'\n\t},\n\t'spectrum_default': {\n\t\tname: 'spectrum_default',\n\t\tdescription: 'DICESONICE.ColorSpectrumDefault',\n\t\tcategory: 'DICESONICE.AcquiredTaste',\n\t\tforeground: '#ffffff',\n\t\tbackground: '#000000',\n\t\toutline: '#ffffff',\n\t\tedge: '#000000',\n\t\ttexture: 'none',\n\t\tvisibility: 'hidden',\n\t\tmaterial: 'pristine'\n\t},\n\t'radiant': {\n\t\tname: 'radiant',\n\t\tdescription: 'DICESONICE.ColorRadiant',\n\t\tcategory: 'DICESONICE.DamageTypes',\n\t\tforeground: '#F9B333',\n\t\tbackground: '#FFFFFF',\n\t\toutline: 'gray',\n\t\ttexture: 'paper'\n\t},\n\t'fire': {\n\t\tname: 'fire',\n\t\tdescription: 'DICESONICE.ColorFire',\n\t\tcategory: 'DICESONICE.DamageTypes',\n\t\tforeground: '#f8d84f',\n\t\tbackground: ['#f8d84f','#f9b02d','#f43c04','#910200','#4c1009'],\n\t\toutline: 'black',\n\t\ttexture: 'fire'\n\t},\n\t'ice': {\n\t\tname: 'ice',\n\t\tdescription: 'DICESONICE.ColorIce',\n\t\tcategory: 'DICESONICE.DamageTypes',\n\t\tforeground: '#60E9FF',\n\t\tbackground: ['#214fa3','#3c6ac1','#253f70','#0b56e2','#09317a'],\n\t\toutline: 'black',\n\t\ttexture: 'ice'\n\t},\n\t'cold': {\n\t\tname: 'cold',\n\t\tdescription: 'DICESONICE.ColorCold',\n\t\tcategory: 'DICESONICE.DamageTypes',\n\t\tforeground: '#60E9FF',\n\t\tbackground: ['#214fa3','#3c6ac1','#253f70','#0b56e2','#09317a'],\n\t\toutline: 'black',\n\t\ttexture: 'ice_2'\n\t},\n\t'poison': {\n\t\tname: 'poison',\n\t\tdescription: 'DICESONICE.ColorPoison',\n\t\tcategory: 'DICESONICE.DamageTypes',\n\t\tforeground: '#D6A8FF',\n\t\tbackground: ['#313866','#504099','#66409e','#934fc3','#c949fc'],\n\t\toutline: 'black',\n\t\ttexture: 'cloudy'\n\t},\n\t'acid': {\n\t\tname: 'acid',\n\t\tdescription: 'DICESONICE.ColorAcid',\n\t\tcategory: 'DICESONICE.DamageTypes',\n\t\tforeground: '#A9FF70',\n\t\tbackground: ['#a6ff00', '#83b625','#5ace04','#69f006','#b0f006','#93bc25'],\n\t\toutline: 'black',\n\t\ttexture: 'marble',\n\t\tmaterial: 'plastic'\n\t},\n\t'thunder': {\n\t\tname: 'thunder',\n\t\tdescription: 'DICESONICE.ColorThunder',\n\t\tcategory: 'DICESONICE.DamageTypes',\n\t\tforeground: '#FFC500',\n\t\tbackground: '#7D7D7D',\n\t\toutline: 'black',\n\t\ttexture: 'cloudy'\n\t},\n\t'lightning': {\n\t\tname: 'lightning',\n\t\tdescription: 'DICESONICE.ColorLightning',\n\t\tcategory: 'DICESONICE.DamageTypes',\n\t\tforeground: '#FFC500',\n\t\tbackground: ['#f17105', '#f3ca40','#eddea4','#df9a57','#dea54b'],\n\t\toutline: '#7D7D7D',\n\t\ttexture: 'ice'\n\t},\n\t'air': {\n\t\tname: 'air',\n\t\tdescription: 'DICESONICE.ColorAir',\n\t\tcategory: 'DICESONICE.DamageTypes',\n\t\tforeground: '#ffffff',\n\t\tbackground: ['#d0e5ea', '#c3dee5','#a4ccd6','#8dafb7','#80a4ad'],\n\t\toutline: 'black',\n\t\ttexture: 'cloudy'\n\t},\n\t'water': {\n\t\tname: 'water',\n\t\tdescription: 'DICESONICE.ColorWater',\n\t\tcategory: 'DICESONICE.DamageTypes',\n\t\tforeground: '#60E9FF',\n\t\tbackground: ['#87b8c4', '#77a6b2','#6b98a3','#5b8691','#4b757f'],\n\t\toutline: 'black',\n\t\ttexture: 'water'\n\t},\n\t'earth': {\n\t\tname: 'earth',\n\t\tdescription: 'DICESONICE.ColorEarth',\n\t\tcategory: 'DICESONICE.DamageTypes',\n\t\tforeground: '#6C9943',\n\t\tbackground: ['#346804', '#184200','#527f22', '#3a1d04', '#56341a','#331c17','#5a352a','#302210'],\n\t\toutline: 'black',\n\t\ttexture: 'speckles'\n\t},\n\t'force': {\n\t\tname: 'force',\n\t\tdescription: 'DICESONICE.ColorForce',\n\t\tcategory: 'DICESONICE.DamageTypes',\n\t\tforeground: 'white',\n\t\tbackground: ['#FF97FF', '#FF68FF','#C651C6'],\n\t\toutline: '#570000',\n\t\ttexture: 'stars'\n\t},\n\t'psychic': {\n\t\tname: 'psychic',\n\t\tdescription: 'DICESONICE.ColorPsychic',\n\t\tcategory: 'DICESONICE.DamageTypes',\n\t\tforeground: '#D6A8FF',\n\t\tbackground: ['#313866','#504099','#66409E','#934FC3','#C949FC','#313866'],\n\t\toutline: 'black',\n\t\ttexture: 'speckles'\n\t},\n\t'necrotic': {\n\t\tname: 'necrotic',\n\t\tdescription: 'DICESONICE.ColorNecrotic',\n\t\tcategory: 'DICESONICE.DamageTypes',\n\t\tforeground: '#ffffff',\n\t\tbackground: '#6F0000',\n\t\toutline: 'black',\n\t\ttexture: 'skulls'\n\t},\n\t'breebaby': {\n\t\tname: 'breebaby',\n\t\tdescription: 'DICESONICE.ColorPastelSunset',\n\t\tcategory: 'DICESONICE.ThemesSoNice',\n\t\tforeground: ['#5E175E', '#564A5E','#45455E','#3D5A5E','#1E595E','#5E3F3D','#5E1E29','#283C5E','#25295E'],\n\t\tbackground: ['#FE89CF', '#DFD4F2','#C2C2E8','#CCE7FA','#A1D9FC','#F3C3C2','#EB8993','#8EA1D2','#7477AD'],\n\t\toutline: 'white',\n\t\ttexture: 'marble',\n\t\tmaterial: 'plastic'\n\t},\n\t'pinkdreams': {\n\t\tname: 'pinkdreams',\n\t\tdescription: 'DICESONICE.ColorPinkDreams',\n\t\tcategory: 'DICESONICE.ThemesSoNice',\n\t\tforeground: 'white',\n\t\tbackground: ['#ff007c', '#df73ff','#f400a1','#df00ff','#ff33cc'],\n\t\toutline: '#570000',\n\t\ttexture: 'skulls'\n\t},\n\t'inspired': {\n\t\tname: 'inspired',\n\t\tdescription: 'DICESONICE.ColorInspired',\n\t\tcategory: 'DICESONICE.ThemesSoNice',\n\t\tforeground: '#FFD800',\n\t\tbackground: '#C4C4B6',\n\t\toutline: '#000000',\n\t\ttexture: 'stone'\n\t},\n\t'bloodmoon': {\n\t\tname: 'bloodmoon',\n\t\tdescription: 'DICESONICE.ColorBloodMoon',\n\t\tcategory: 'DICESONICE.ThemesSoNice',\n\t\tforeground: '#CDB800',\n\t\tbackground: '#6F0000',\n\t\toutline: 'black',\n\t\ttexture: 'marble',\n\t\tmaterial: 'plastic'\n\t},\n\t'starynight': {\n\t\tname: 'starynight',\n\t\tdescription: 'DICESONICE.ColorStaryNight',\n\t\tcategory: 'DICESONICE.ThemesSoNice',\n\t\tforeground: '#4F708F',\n\t\tbackground: ['#091636','#233660','#4F708F','#8597AD','#E2E2E2'],\n\t\toutline: 'white',\n\t\ttexture: 'speckles'\n\t},\n\t'glitterparty': {\n\t\tname: 'glitterparty',\n\t\tdescription: 'DICESONICE.ColorGlitterParty',\n\t\tcategory: 'DICESONICE.ThemesSoNice',\n\t\tforeground: 'white',\n\t\tbackground: ['#FFB5F5','#7FC9FF','#A17FFF'],\n\t\toutline: 'none',\n\t\ttexture: 'glitter'\n\t},\n\t'astralsea': {\n\t\tname: 'astralsea',\n\t\tdescription: 'DICESONICE.ColorAstralSea',\n\t\tcategory: 'DICESONICE.ThemesSoNice',\n\t\tforeground: '#565656',\n\t\tbackground: 'white',\n\t\toutline: 'none',\n\t\ttexture: 'astral'\n\t},\n\t'foundry': {\n\t\tname: 'foundry',\n\t\tdescription: 'DICESONICE.ColorFoundry',\n\t\tcategory: 'DICESONICE.ThemesSoNice',\n\t\tforeground: '#000000',\n\t\tbackground: '#ffffff',\n\t\toutline: 'none',\n\t\tedge: '#000000',\n\t\ttexture: 'radial'\n\t},\n\t'dragons': {\n\t\tname: 'dragons',\n\t\tdescription: 'DICESONICE.ColorDragons',\n\t\tcategory: 'DICESONICE.AcquiredTaste',\n\t\tforeground: '#FFFFFF',\n\t\t// \t\t\t[ red, black, blue, green white gold, silver, bronze, copper brass\n\t\tbackground: ['#B80000', '#4D5A5A', '#5BB8FF', '#7E934E', '#FFFFFF', '#F6ED7C', '#7797A3', '#A78437', '#862C1A', '#FFDF8A'],\n\t\toutline: 'black',\n\t\ttexture: ['dragon', 'lizard'],\n\t\tdescription: 'Here be Dragons'\n\t},\n\t'birdup': {\n\t\tname: 'birdup',\n\t\tdescription: 'DICESONICE.ColorBirdUp',\n\t\tcategory: 'DICESONICE.AcquiredTaste',\n\t\tforeground: '#FFFFFF',\n\t\tbackground: ['#F11602', '#FFC000', '#6EC832', '#0094BC', '#05608D', '#FEABB3', '#F75680', '#F3F0DF', '#C7A57F'],\n\t\toutline: 'black',\n\t\ttexture: 'bird',\n\t\tdescription: 'Bird Up!'\n\t},\n\t'tigerking': {\n\t\tname: 'tigerking',\n\t\tdescription: 'DICESONICE.ColorTigerKing',\n\t\tcategory: 'DICESONICE.AcquiredTaste',\n\t\tforeground: '#ffffff',\n\t\tbackground: '#FFCC40',\n\t\toutline: 'black',\n\t\ttexture: ['leopard', 'tiger', 'cheetah']\n\t},\n\t'toxic': {\n\t\tname: 'toxic',\n\t\tdescription: 'DICESONICE.ColorToxic',\n\t\tcategory: 'DICESONICE.AcquiredTaste',\n\t\tforeground: '#A9FF70',\n\t\tbackground: ['#a6ff00', '#83b625','#5ace04','#69f006','#b0f006','#93bc25'],\n\t\toutline: 'black',\n\t\ttexture: 'fire'\n\t},\n\t'rainbow': {\n\t\tname: 'rainbow',\n\t\tdescription: 'DICESONICE.ColorRainblow',\n\t\tcategory: 'DICESONICE.Colors',\n\t\tforeground: ['#FF5959','#FFA74F','#FFFF56','#59FF59','#2374FF','#00FFFF','#FF59FF'],\n\t\tbackground: ['#900000','#CE3900','#BCBC00','#00B500','#00008E','#008282','#A500A5'],\n\t\toutline: 'black',\n\t\ttexture: 'none'\n\t},\n\t'random': {\n\t\tname: 'random',\n\t\tdescription: 'DICESONICE.ColorRaNdOm',\n\t\tcategory: 'DICESONICE.Colors',\n\t\tforeground: [],\n\t\toutline: [],\n\t\tbackground: [],\n\t\ttexture: []\n\t},\n\t'black': {\n\t\tname: 'black',\n\t\tdescription: 'DICESONICE.ColorBlack',\n\t\tcategory: 'DICESONICE.Colors',\n\t\tforeground: '#ffffff',\n\t\tbackground: '#000000',\n\t\toutline: 'black',\n\t\ttexture: 'none'\n\t},\n\t'white': {\n\t\tname: 'white',\n\t\tdescription: 'DICESONICE.ColorWhite',\n\t\tcategory: 'DICESONICE.Colors',\n\t\tforeground: '#000000',\n\t\tbackground: '#FFFFFF',\n\t\toutline: '#FFFFFF',\n\t\ttexture: 'none'\n\t},\n\t'grey': {\n\t\tname: 'grey',\n\t\tdescription: 'DICESONICE.ColorGrey',\n\t\tcategory: 'DICESONICE.Colors',\n\t\tforeground: '#FFFFFF',\n\t\tbackground: '#888888',\n\t\toutline: '#000000',\n\t\ttexture: 'none'\n\t},\n\t'red': {\n\t\tname: 'red',\n\t\tdescription: 'DICESONICE.ColorRed',\n\t\tcategory: 'DICESONICE.Colors',\n\t\tforeground: '#FFFFFF',\n\t\tbackground: '#FF0000',\n\t\toutline: 'none',\n\t\ttexture: 'none'\n\t},\n\t'blue': {\n\t\tname: 'blue',\n\t\tdescription: 'DICESONICE.ColorBlue',\n\t\tcategory: 'DICESONICE.Colors',\n\t\tforeground: '#FFFFFF',\n\t\tbackground: '#0000FF',\n\t\toutline: 'none',\n\t\ttexture: 'none'\n\t},\n\t'green': {\n\t\tname: 'green',\n\t\tdescription: 'DICESONICE.ColorGreen',\n\t\tcategory: 'DICESONICE.Colors',\n\t\tforeground: '#FFFFFF',\n\t\tbackground: '#00FF00',\n\t\toutline: 'none',\n\t\ttexture: 'none'\n\t},\n\t'yellow': {\n\t\tname: 'yellow',\n\t\tdescription: 'DICESONICE.ColorYellow',\n\t\tcategory: 'DICESONICE.Colors',\n\t\tforeground: '#000000',\n\t\tbackground: '#FFFF00',\n\t\toutline: 'none',\n\t\ttexture: 'none'\n\t},\n\t'pink': {\n\t\tname: 'pink',\n\t\tdescription: 'DICESONICE.ColorPink',\n\t\tcategory: 'DICESONICE.Colors',\n\t\tforeground: '#FFFFFF',\n\t\tbackground: '#FF00FF',\n\t\toutline: 'none',\n\t\ttexture: 'none'\n\t},\n\t'cyan': {\n\t\tname: 'cyan',\n\t\tdescription: 'DICESONICE.ColorCyan',\n\t\tcategory: 'DICESONICE.Colors',\n\t\tforeground: '#000000',\n\t\tbackground: '#00FFFF',\n\t\toutline: 'none',\n\t\ttexture: 'none'\n\t},\n\t'prism': {\n\t\tname: 'prism',\n\t\tdescription: 'DICESONICE.ColorPrism',\n\t\tcategory: 'DICESONICE.AcquiredTaste',\n\t\tforeground: '#FFFFFF',\n\t\tbackground: '#FFFFFF',\n\t\toutline: 'black',\n\t\ttexture: 'stainedglass'\n\t},\n\t'bronze': {\n\t\tname: 'bronze',\n\t\tdescription: 'DICESONICE.ColorBronze',\n\t\tcategory: 'DICESONICE.ThemesSoNice',\n\t\tforeground: ['#FF9159','#FFB066','#FFBF59','#FFD059'],\n\t\tbackground: ['#705206','#7A4E06','#643100','#7A2D06'],\n\t\toutline: ['#3D2D03','#472D04','#301700','#471A04'],\n\t\tedge: ['#FF5D0D','#FF7B00','#FFA20D','#FFBA0D'],\n\t\ttexture: [['bronze01','bronze02','bronze03','bronze03b','bronze03b','bronze04']]\n\t},\n\t'custom': {\n\t\tname: 'custom',\n\t\tdescription: 'DICESONICE.ColorCustom',\n\t\tcategory: 'DICESONICE.Colors',\n\t\tforeground: '',\n\t\tbackground: '',\n\t\toutline: '',\n\t\tedge: '',\n\t\ttexture: 'none'\n\t}\n};\n\nexport const DICE_SCALE = {\n\t\"d2\":1,\n\t\"d4\":1,\n\t\"d6\":1.3,\n\t\"d8\":1.1,\n\t\"d10\":1,\n\t\"d12\":1.1,\n\t\"d14\":0.5,\n\t\"d16\":0.5,\n\t\"d20\":1,\n\t\"d24\":1,\n\t\"d30\":0.75,\n\t\"d3\":1.3,\n\t\"d5\":1,\n\t\"d7\":0.5,\n\t\"df\":2,\n\t\"d100\":0.75\n};\n\nexport class DiceColors {\n\n\tstatic loadTextures(sources, callback) {\n\n\t\tlet images = {};\n\t\tlet bumps = {};\n\t\tlet loadedImages = 0;\n\t\n\t\tlet itemprops = Object.entries(sources);\n\t\tlet numImages = itemprops.length*2; //One for texture, one for bump texture\n\t\tfor (const [key, value] of itemprops) {\n\n\t\t\tif(value.source === '') {\n\t\t\t\tloadedImages+=2;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\n\t\t\timages[key] = new Image();\n\t\t\timages[key].crossOrigin = \"Anonymous\";\n\t\t\timages[key].onload = function() {\n\t\n\t\t\t\tif (++loadedImages >= numImages) {\n\t\t\t\t\tDiceColors.diceTextures = mergeObject(images, DiceColors.diceTextures || {},{performDeletions:true});\n\t\t\t\t\tDiceColors.diceBumps = mergeObject(bumps, DiceColors.diceBumps || {},{performDeletions:true});\n\t\t\t\t\tcallback(images);\n\t\t\t\t}\n\t\t\t};\n\t\t\timages[key].src = value.source;\n\n\t\t\tif(value.bump === '') {\n\t\t\t\t++loadedImages;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tbumps[key] = new Image();\n\t\t\tbumps[key].crossOrigin = \"Anonymous\";\n\t\t\tbumps[key].onload = function() {\n\t\n\t\t\t\tif (++loadedImages >= numImages) {\n\t\t\t\t\tDiceColors.diceTextures = mergeObject(images, DiceColors.diceTextures || {},{performDeletions:true});\n\t\t\t\t\tDiceColors.diceBumps = mergeObject(bumps, DiceColors.diceBumps || {},{performDeletions:true});\n\t\t\t\t\tcallback(images);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tbumps[key].src = value.bump;\n\t\t}\n\t}\n\t\n\tstatic getTexture(texturename) {\n\t\n\t\tif (Array.isArray(texturename)) {\n\t\n\t\t\tlet textures = [];\n\t\t\tfor(let i = 0, l = texturename.length; i < l; i++){\n\t\t\t\tif (typeof texturename[i] == 'string' || Array.isArray(texturename[i])) {\n\t\t\t\t\ttextures.push(this.getTexture(texturename[i]));\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn textures;\n\t\t}\n\t\n\t\tif (!texturename || texturename == '') {\n\t\t\treturn {name:'',texture:'',material:\"plastic\"};\n\t\t}\n\t\n\t\tif (texturename == 'none') {\n\t\t\treturn {name:'none',texture:'',material:\"plastic\"};\n\t\t}\n\t\n\t\tif(texturename == 'random') {\n\t\t\tlet names = Object.keys(DiceColors.diceTextures);\n\t\t\t// add 'none' for possibility of no texture\n\t\t\tnames.pop(); //remove 'random' from this list\n\t\n\t\t\treturn this.getTexture(names[Math.floor(Math.random() * names.length)]);\n\t\t}\n\t\t//Init not done yet, let the init load the texture\n\t\tif(!DiceColors.diceTextures)\n\t\t\treturn texturename;\n\t\tif (DiceColors.diceTextures[texturename] != null) {\n\t\t\tif(!TEXTURELIST[texturename].material)\n\t\t\t\tTEXTURELIST[texturename].material = \"plastic\";\n\t\t\tif(!DiceColors.diceBumps[texturename])\n\t\t\t\tDiceColors.diceBumps[texturename] = '';\n\t\t\treturn { name: texturename, bump: DiceColors.diceBumps[texturename], material: TEXTURELIST[texturename].material, texture: DiceColors.diceTextures[texturename], composite: TEXTURELIST[texturename].composite };\n\t\t}\n\t\treturn {name:'',texture:''};\n\t}\n\t\n\tstatic randomColor() {\n\t\t// random colors\n\t\tlet rgb=[];\n\t\trgb[0] = Math.floor(Math.random() * 254);\n\t\trgb[1] = Math.floor(Math.random() * 254);\n\t\trgb[2] = Math.floor(Math.random() * 254);\n\t\n\t\t// this is an attempt to make the foregroudn color stand out from the background color\n\t\t// it sometimes produces ok results\n\t\tlet brightness = ((parseInt(rgb[0]) * 299) + (parseInt(rgb[1]) * 587) + (parseInt(rgb[2]) * 114)) / 1000;\n\t\tlet foreground = (brightness > 126) ? 'rgb(30,30,30)' : 'rgb(230,230,230)'; // high brightness = dark text, else bright text\n\t\tlet background = 'rgb(' + rgb[0] + ',' + rgb[1] + ',' + rgb[2] + ')';\n\t\n\t\treturn {background: background, foreground: foreground };\n\t}\n\t\n\tstatic initColorSets(entries = null) {\n\t\tlet sets;\n\t\tif(entries)\n\t\t{\n\t\t\tlet uniqueSet = {};\n\t\t\tuniqueSet[entries.name] = entries;\n\t\t\tsets = Object.entries(uniqueSet);\n\t\t}\n\t\telse\n\t\t\tsets = Object.entries(COLORSETS);\n\t\tfor (const [name, data] of sets) {\n\t\t\tCOLORSETS[name].id = name;\n\t\t\tif(data.texture != \"custom\")\n\t\t\t\tCOLORSETS[name].texture = this.getTexture(data.texture);\n\t\t\tif(typeof COLORSETS[name].texture == \"object\")\n\t\t\t\tCOLORSETS[name].texture.id = data.texture;\n\t\t\tif(!COLORSETS[name].material)\n\t\t\t\tCOLORSETS[name].material = '';\n\t\t\tif(!COLORSETS[name].font)\n\t\t\t\tCOLORSETS[name].font = 'Arial';\n\t\t\tif(!COLORSETS[name].fontScale)\n\t\t\t\tCOLORSETS[name].fontScale = DICE_SCALE;\n\t\t\telse\n\t\t\t\tCOLORSETS[name].fontScale = mergeObject(DICE_SCALE,COLORSETS[name].fontScale,{inplace:false,performDeletions:true});\n\t\t\tif(!COLORSETS[name].visibility)\n\t\t\t\tCOLORSETS[name].visibility = \"visible\";\n\t\t}\n\t\t\n\t\t// generate the colors and textures for the random set\n\t\tif(!entries)\n\t\t{\n\t\t\tfor (let i = 0; i < 10; i++) {\n\t\t\t\tlet randcolor = this.randomColor();\n\t\t\t\tlet randtex = this.getTexture('random');\n\t\t\n\t\t\t\tif (randtex.name != '') {\n\t\t\t\t\tCOLORSETS['random'].foreground.push(randcolor.foreground); \n\t\t\t\t\tCOLORSETS['random'].background.push(randcolor.background);\n\t\t\t\t\tCOLORSETS['random'].outline.push(randcolor.background);\n\t\t\t\t\tCOLORSETS['random'].texture.push(randtex);\n\t\t\t\t} else {\n\t\t\t\t\tCOLORSETS['random'].foreground.push(randcolor.foreground); \n\t\t\t\t\tCOLORSETS['random'].background.push(randcolor.background);\n\t\t\t\t\tCOLORSETS['random'].outline.push('black');\n\t\t\t\t\tCOLORSETS['random'].texture.push('');\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\tstatic getColorSet(colorsetname) {\n\t\tlet colorset = COLORSETS[colorsetname] || COLORSETS['custom'];\n\t\treturn {...colorset};\n\t}\n\n\tstatic setColorCustom(foreground = '#FFFFFF', background = '#000000', outline = '#FFFFFF', edge = '#FFFFFF'){\n\t\tCOLORSETS['custom'].foreground = foreground;\n\t\tCOLORSETS['custom'].background = background;\n\t\tCOLORSETS['custom'].outline = outline;\n\t\tCOLORSETS['custom'].edge = edge;\n\t}\n}\n","export const DICE_MODELS = {\n \"d2\": {\n \"metadata\": {\n \"version\": 4.5,\n \"type\": \"BufferGeometry\",\n \"generator\": \"BufferGeometry.toJSON\"\n },\n \"uuid\": \"29D8FA3F-1F04-4F5A-985B-16353BAB0B2C\",\n \"type\": \"BufferGeometry\",\n \"data\": {\n \"attributes\": {\n \"position\": {\n \"itemSize\": 3,\n \"type\": \"Float32Array\",\n \"array\": [88.93379974365234,0.0001336209534201771,-4.532903671264648,88.93379974365234,0.0001336209534201771,-4.532903671264648,88.93379974365234,0.0001336209534201771,-4.532903671264648,90.8361587524414,-0.00006830116763012484,-2.6535863876342773,90.8361587524414,-0.00006830116763012484,-2.6535863876342773,84.580078125,-27.482694625854492,4.547501087188721,84.580078125,-27.482694625854492,4.547501087188721,86.38970947265625,-28.07042121887207,2.668496608734131,27.482057571411133,-84.58028411865234,-4.547504901885986,27.482057571411133,-84.58028411865234,-4.547504901885986,28.06978416442871,-86.38990783691406,-2.6685009002685547,27.481149673461914,-84.58119201660156,4.536083698272705,27.481149673461914,-84.58119201660156,4.536083698272705,28.069250106811523,-86.39043426513672,2.6568350791931152,-0.0007737207342870533,-88.93378448486328,4.532901287078857,-0.0007737207342870533,-88.93378448486328,4.532901287078857,-0.0007737207342870533,-88.93378448486328,4.532901287078857,-0.0005998046253807843,-90.83614349365234,2.6535849571228027,-0.0005998046253807843,-90.83614349365234,2.6535849571228027,-27.482694625854492,-84.58097839355469,4.5305891036987305,-27.482694625854492,-84.58097839355469,4.5305891036987305,-28.07042121887207,-86.39022827148438,2.6512229442596436,-84.58029174804688,-27.481143951416016,-4.552997589111328,-84.58029174804688,-27.481143951416016,-4.552997589111328,-86.3899154663086,-28.06924819946289,-2.6741106510162354,-88.93379974365234,-0.0001336209534201771,4.532903671264648,-88.93379974365234,-0.0001336209534201771,4.532903671264648,-88.93379974365234,-0.0001336209534201771,4.532903671264648,-90.8361587524414,0.00006830116763012484,2.6535863876342773,-90.8361587524414,0.00006830116763012484,2.6535863876342773,-71.94794464111328,52.27442169189453,-4.543759822845459,-71.94794464111328,52.27442169189453,-4.543759822845459,-73.4873275756836,53.39253234863281,-2.664675235748291,-71.9488525390625,52.27351379394531,4.539828777313232,-71.9488525390625,52.27351379394531,4.539828777313232,-73.48785400390625,53.391998291015625,2.6606605052948,-52.27299499511719,71.94922637939453,-4.539824962615967,-52.27299499511719,71.94922637939453,-4.539824962615967,-53.39146423339844,73.48823547363281,-2.660656213760376,-27.482057571411133,84.58028411865234,4.547504901885986,-27.482057571411133,84.58028411865234,4.547504901885986,-28.06978416442871,86.38990783691406,2.6685009002685547,0.0007736866245977581,88.93378448486328,-4.532901287078857,0.0007736866245977581,88.93378448486328,-4.532901287078857,0.0007736866245977581,88.93378448486328,-4.532901287078857,0.0005998046253807843,90.83614349365234,-2.6535849571228027,0.0005998046253807843,90.83614349365234,-2.6535849571228027,-0.00013426830992102623,88.93287658691406,4.550687789916992,-0.00013426830992102623,88.93287658691406,4.550687789916992,-0.00013426830992102623,88.93287658691406,4.550687789916992,0.00006751317414455116,90.83562469482422,2.6717519760131836,0.00006751317414455116,90.83562469482422,2.6717519760131836,27.482694625854492,84.58097839355469,-4.5305891036987305,27.482694625854492,84.58097839355469,-4.5305891036987305,28.07042121887207,86.39022827148438,-2.6512229442596436,84.5811996459961,27.482053756713867,-4.530590534210205,84.5811996459961,27.482053756713867,-4.530590534210205,86.39044189453125,28.069782257080078,-2.651224374771118,84.58098602294922,-27.48178482055664,-4.5360870361328125,84.58098602294922,-27.48178482055664,-4.5360870361328125,86.3902359008789,-28.069887161254883,-2.6568384170532227,73.48785400390625,-53.391998291015625,-2.6606605052948,71.9488525390625,-52.27351379394531,-4.539828777313232,71.9488525390625,-52.27351379394531,-4.539828777313232,52.273902893066406,-71.94831848144531,-4.543763637542725,52.273902893066406,-71.94831848144531,-4.543763637542725,53.39199447631836,-73.48770904541016,-2.6646788120269775,0.00013430237595457584,-88.93287658691406,-4.550687789916992,0.00013430237595457584,-88.93287658691406,-4.550687789916992,0.00013430237595457584,-88.93287658691406,-4.550687789916992,-0.00006751317414455116,-90.83562469482422,-2.6717519760131836,-0.00006751317414455116,-90.83562469482422,-2.6717519760131836,-28.069887161254883,-86.38970184326172,-2.6741127967834473,-27.48178482055664,-84.58007049560547,-4.552999496459961,-27.48178482055664,-84.58007049560547,-4.552999496459961,-52.27351760864258,-71.94794464111328,-4.5542144775390625,-52.27351760864258,-71.94794464111328,-4.5542144775390625,-53.39200210571289,-73.4873275756836,-2.67535400390625,-71.94832611083984,-52.27299118041992,-4.554214000701904,-71.94832611083984,-52.27299118041992,-4.554214000701904,-73.48771667480469,-53.391456604003906,-2.675353527069092,-88.93289947509766,0.0007747426279820502,-4.550684928894043,-88.93289947509766,0.0007747426279820502,-4.550684928894043,-88.93289947509766,0.0007747426279820502,-4.550684928894043,-90.83563995361328,0.000600832630880177,-2.671748399734497,-90.83563995361328,0.000600832630880177,-2.671748399734497,-84.580078125,27.482694625854492,-4.547501087188721,-84.580078125,27.482694625854492,-4.547501087188721,-86.38970947265625,28.07042121887207,-2.668496608734131,-27.481149673461914,84.58119201660156,-4.536083698272705,-27.481149673461914,84.58119201660156,-4.536083698272705,-28.069250106811523,86.39043426513672,-2.6568350791931152,52.2744255065918,71.94884490966797,-4.529373645782471,52.2744255065918,71.94884490966797,-4.529373645782471,53.39253616333008,73.48784637451172,-2.649981737136841,71.94922637939453,52.273895263671875,-4.529374599456787,71.94922637939453,52.273895263671875,-4.529374599456787,73.48823547363281,53.391990661621094,-2.649982452392578,88.93289947509766,-0.0007747426279820502,4.550684928894043,88.93289947509766,-0.0007747426279820502,4.550684928894043,88.93289947509766,-0.0007747426279820502,4.550684928894043,90.83563995361328,-0.000600832630880177,2.671748399734497,90.83563995361328,-0.000600832630880177,2.671748399734497,71.94794464111328,-52.27442169189453,4.543759346008301,71.94794464111328,-52.27442169189453,4.543759346008301,73.4873275756836,-53.39253234863281,2.664675235748291,52.27299499511719,-71.94922637939453,4.539824962615967,52.27299499511719,-71.94922637939453,4.539824962615967,53.39146423339844,-73.48823547363281,2.660656213760376,-52.2744255065918,-71.94884490966797,4.529373645782471,-52.2744255065918,-71.94884490966797,4.529373645782471,-53.39253616333008,-73.48784637451172,2.649981737136841,-73.48823547363281,-53.391990661621094,2.649982452392578,-71.94922637939453,-52.273895263671875,4.529374599456787,-71.94922637939453,-52.273895263671875,4.529374599456787,-84.5811996459961,-27.482053756713867,4.530590534210205,-84.5811996459961,-27.482053756713867,4.530590534210205,-86.39044189453125,-28.069782257080078,2.651224374771118,-84.58098602294922,27.48178482055664,4.5360870361328125,-84.58098602294922,27.48178482055664,4.5360870361328125,-86.3902359008789,28.069887161254883,2.6568384170532227,-52.273902893066406,71.94831848144531,4.543763637542725,-52.273902893066406,71.94831848144531,4.543763637542725,-53.39199447631836,73.48770904541016,2.6646788120269775,27.48178482055664,84.58007049560547,4.552999496459961,27.48178482055664,84.58007049560547,4.552999496459961,28.069887161254883,86.38970184326172,2.6741127967834473,52.27351760864258,71.94794464111328,4.5542144775390625,52.27351760864258,71.94794464111328,4.5542144775390625,53.39200210571289,73.4873275756836,2.67535400390625,73.48771667480469,53.391456604003906,2.675353527069092,71.94832611083984,52.27299118041992,4.554214000701904,71.94832611083984,52.27299118041992,4.554214000701904,84.58029174804688,27.481143951416016,4.552997589111328,84.58029174804688,27.481143951416016,4.552997589111328,86.3899154663086,28.06924819946289,2.6741106510162354],\n \"normalized\": false\n },\n \"normal\": {\n \"itemSize\": 3,\n \"type\": \"Float32Array\",\n \"array\": [0.004305333364754915,0.00014043168630450964,-0.9999908208847046,0.004305333364754915,0.00014043168630450964,-0.9999908208847046,0.004305333364754915,0.00014043168630450964,-0.9999908208847046,0.967370867729187,0.000023871660232543945,-0.2533644437789917,0.967370867729187,0.000023871660232543945,-0.2533644437789917,0.003924518823623657,-0.0014061331748962402,0.9999912977218628,0.003924518823623657,-0.0014061331748962402,0.9999912977218628,0.919967532157898,-0.2989548146724701,0.25354647636413574,0.0014187097549438477,-0.003943443298339844,-0.9999911785125732,0.0014187097549438477,-0.003943443298339844,-0.9999911785125732,0.2989460825920105,-0.9199705719947815,-0.2535456418991089,0.001207306981086731,-0.004139244556427002,0.999990701675415,0.001207306981086731,-0.004139244556427002,0.999990701675415,0.29889336228370667,-0.9200217723846436,0.25342196226119995,-0.00010144524276256561,-0.004305422306060791,0.9999908208847046,-0.00010144524276256561,-0.004305422306060791,0.9999908208847046,-0.00010144524276256561,-0.004305422306060791,0.9999908208847046,-0.00002811197191476822,-0.9673709869384766,0.25336405634880066,-0.00002811197191476822,-0.9673709869384766,0.25336405634880066,-0.0013865083456039429,-0.0041558146476745605,0.9999904036521912,-0.0013865083456039429,-0.0041558146476745605,0.9999904036521912,-0.29895341396331787,-0.9200186133384705,0.25336307287216187,-0.003935068845748901,-0.0012163519859313965,-0.9999915361404419,-0.003935068845748901,-0.0012163519859313965,-0.9999915361404419,-0.9199703335762024,-0.2988958954811096,-0.25360578298568726,-0.00432974100112915,-0.00013017654418945312,0.9999905824661255,-0.00432974100112915,-0.00013017654418945312,0.9999905824661255,-0.00432974100112915,-0.00013017654418945312,0.9999905824661255,-0.967370867729187,-0.000022581778466701508,0.2533644139766693,-0.967370867729187,-0.000022581778466701508,0.2533644139766693,-0.003362357383593917,0.002567464951425791,-0.9999910593032837,-0.003362357383593917,0.002567464951425791,-0.9999910593032837,-0.7825664281845093,0.5686163306236267,-0.253506064414978,-0.0035184919834136963,0.0023897886276245117,0.9999909996986389,-0.0035184919834136963,0.0023897886276245117,0.9999909996986389,-0.7826218605041504,0.5685698390007019,0.25343894958496094,-0.002216615015640855,0.0036201775074005127,-0.9999910593032837,-0.002216615015640855,0.0036201775074005127,-0.9999910593032837,-0.5685653686523438,0.782625675201416,-0.25343722105026245,-0.0013963840901851654,0.0039055049419403076,0.9999913573265076,-0.0013963840901851654,0.0039055049419403076,0.9999913573265076,-0.2989453971385956,0.9199708104133606,0.2535455524921417,0.00011461973190307617,0.004342749714851379,-0.9999904632568359,0.00011461973190307617,0.004342749714851379,-0.9999904632568359,0.00011461973190307617,0.004342749714851379,-0.9999904632568359,0.000028920238037244417,0.9673709273338318,-0.25336408615112305,0.000028920238037244417,0.9673709273338318,-0.25336408615112305,-0.00009849853813648224,0.0041036903858184814,0.9999915957450867,-0.00009849853813648224,0.0041036903858184814,0.9999915957450867,-0.00009849853813648224,0.0041036903858184814,0.9999915957450867,-0.00001982133835554123,0.967315137386322,0.2535773515701294,-0.00001982133835554123,0.967315137386322,0.2535773515701294,0.001379296649247408,0.004155764821916819,-0.9999904632568359,0.001379296649247408,0.004155764821916819,-0.9999904632568359,0.2989526391029358,0.9200189113616943,-0.25336307287216187,0.004105646628886461,0.0014420022489503026,-0.9999905824661255,0.004105646628886461,0.0014420022489503026,-0.9999905824661255,0.9200265407562256,0.29895055294036865,-0.25333744287490845,0.0041483743116259575,-0.001177109545096755,-0.999990701675415,0.0041483743116259575,-0.001177109545096755,-0.999990701675415,0.92001873254776,-0.29890236258506775,-0.2534225881099701,0.7826225161552429,-0.5685691237449646,-0.2534385919570923,0.0034059027675539255,-0.002543120877817273,-0.9999909400939941,0.0034059027675539255,-0.002543120877817273,-0.9999909400939941,0.0025934576988220215,-0.0033233165740966797,-0.9999910593032837,0.0025934576988220215,-0.0033233165740966797,-0.9999910593032837,0.5686105489730835,-0.7825710773468018,-0.2535049617290497,0.00014024082338437438,-0.004108965862542391,-0.9999915361404419,0.00014024082338437438,-0.004108965862542391,-0.9999915361404419,0.00014024082338437438,-0.004108965862542391,-0.9999915361404419,0.000021778512746095657,-0.9673150777816772,-0.253577321767807,0.000021778512746095657,-0.9673150777816772,-0.253577321767807,-0.29890191555023193,-0.9199681878089905,-0.2536064684391022,-0.001328025944530964,-0.003906830679625273,-0.9999914765357971,-0.001328025944530964,-0.003906830679625273,-0.9999914765357971,-0.0024206042289733887,-0.0033184662461280823,-0.9999915361404419,-0.0024206042289733887,-0.0033184662461280823,-0.9999915361404419,-0.56856769323349,-0.7825732231140137,-0.25359416007995605,-0.0033223330974578857,-0.002392679452896118,-0.9999916553497314,-0.0033223330974578857,-0.002392679452896118,-0.9999916553497314,-0.7825719118118286,-0.5685604810714722,-0.25361454486846924,-0.004138410557061434,0.00005978979606879875,-0.9999914169311523,-0.004138410557061434,0.00005978979606879875,-0.9999914169311523,-0.004138410557061434,0.00005978979606879875,-0.9999914169311523,-0.9673154950141907,0.00002910134026024025,-0.25357601046562195,-0.9673154950141907,0.00002910134026024025,-0.25357601046562195,-0.003914192318916321,0.0014359354972839355,-0.9999912977218628,-0.003914192318916321,0.0014359354972839355,-0.9999912977218628,-0.9199680089950562,0.29895293712615967,-0.2535468339920044,-0.001218944787979126,0.004143953323364258,-0.9999906420707703,-0.001218944787979126,0.004143953323364258,-0.9999906420707703,-0.2988971769809723,0.920020580291748,-0.25342193245887756,0.002553605241701007,0.003544599749147892,-0.9999905228614807,0.002553605241701007,0.003544599749147892,-0.9999905228614807,0.5686197876930237,0.7826223373413086,-0.25332552194595337,0.0034990310668945312,0.0025759339332580566,-0.9999905824661255,0.0034990310668945312,0.0025759339332580566,-0.9999905824661255,0.7826220393180847,0.5686109662055969,-0.25334614515304565,0.004121424164623022,0.00009648066043155268,0.9999914169311523,0.004121424164623022,0.00009648066043155268,0.9999914169311523,0.004121424164623022,0.00009648066043155268,0.9999914169311523,0.9673154950141907,-0.00002708425745368004,0.2535760700702667,0.9673154950141907,-0.00002708425745368004,0.2535760700702667,0.0033468306064605713,-0.002586185932159424,0.9999910593032837,0.0033468306064605713,-0.002586185932159424,0.9999910593032837,0.7825667858123779,-0.5686154365539551,0.25350672006607056,0.002382144331932068,-0.003524601459503174,0.9999909996986389,0.002382144331932068,-0.003524601459503174,0.9999909996986389,0.5685621500015259,-0.7826279401779175,0.2534373998641968,-0.0025890469551086426,-0.003517657518386841,0.9999905228614807,-0.0025890469551086426,-0.003517657518386841,0.9999905228614807,-0.5686206817626953,-0.7826217412948608,0.253325492143631,-0.7826230525970459,-0.5686094760894775,0.25334617495536804,-0.003505319356918335,-0.002576306462287903,0.9999906420707703,-0.003505319356918335,-0.002576306462287903,0.9999906420707703,-0.0041239261627197266,-0.001402430236339569,0.9999905228614807,-0.0041239261627197266,-0.001402430236339569,0.9999905228614807,-0.9200277328491211,-0.29894667863845825,0.2533373534679413,-0.0041457414627075195,0.0012131333351135254,0.999990701675415,-0.0041457414627075195,0.0012131333351135254,0.999990701675415,-0.9200185537338257,0.29890307784080505,0.2534220814704895,-0.0025840699672698975,0.003327280282974243,0.9999911785125732,-0.0025840699672698975,0.003327280282974243,0.9999911785125732,-0.5686099529266357,0.7825716137886047,0.2535049021244049,0.0012101978063583374,0.003936886787414551,0.9999915361404419,0.0012101978063583374,0.003936886787414551,0.9999915361404419,0.2989037334918976,0.9199675917625427,0.2536064088344574,0.0023893117904663086,0.003317922353744507,0.9999916553497314,0.0023893117904663086,0.003317922353744507,0.9999916553497314,0.5685685873031616,0.7825725674629211,0.2535940706729889,0.782572329044342,0.5685595870018005,0.25361499190330505,0.0033287405967712402,0.002385169267654419,0.9999915361404419,0.0033287405967712402,0.002385169267654419,0.9999915361404419,0.003944873809814453,0.0012125223875045776,0.9999915957450867,0.003944873809814453,0.0012125223875045776,0.9999915957450867,0.9199705719947815,0.298895001411438,0.25360581278800964],\n \"normalized\": false\n },\n \"uv\": {\n \"itemSize\": 2,\n \"type\": \"Float32Array\",\n \"array\": [0.23704378306865692,0.023000359535217285,0.2962978482246399,0.4792518615722656,0.5050051212310791,0.2502303123474121,0.22790862619876862,0.021942079067230225,0.2874794006347656,0.4803285002708435,0.017633967101573944,0.6739451289176941,0.20161525905132294,0.1155695915222168,0.21026334166526794,0.11554199457168579,0.23612302541732788,0.3868170976638794,0.6741329431533813,0.48301517963409424,0.22747491300106049,0.3868447542190552,0.17478206753730774,0.5167970061302185,0.2012992650270462,0.3867114782333374,0.2101074755191803,0.38673484325408936,0.17778971791267395,0.4792518615722656,0.20069445669651031,0.47938668727874756,0.2504180371761322,0.5048181414604187,0.16897115111351013,0.4803285002708435,0.20982962846755981,0.4804449677467346,0.17686891555786133,0.38681697845458984,0.3260548710823059,0.5167969465255737,0.16822080314159393,0.3868447542190552,0.1423611342906952,0.11557012796401978,0.9825537800788879,0.32586705684661865,0.1510092318058014,0.11554241180419922,0.17778971791267395,0.02300053834915161,0.3555530905723572,0.4792248010635376,0.4951818287372589,0.7495819330215454,0.16865456104278564,0.021942198276519775,0.34673523902893066,0.480310320854187,0.3197054862976074,0.29629039764404297,0.9477878212928772,0.1063617467880249,0.32840070128440857,0.2962949275970459,0.35455501079559326,0.2964339256286621,0.4484367072582245,0.8934502601623535,0.34586313366889954,0.29642730951309204,0.31974896788597107,0.20592015981674194,0.8936383128166199,0.0522121787071228,0.32843995094299316,0.20592659711837769,0.32605481147766113,0.9823660254478455,0.3545942008495331,0.11562323570251465,0.34578996896743774,0.1155862808227539,0.2962978482246399,0.023000359535217285,0.3192167282104492,0.023042798042297363,0.7497690320014954,0.0054662227630615234,0.287162721157074,0.021942138671875,0.32804927229881287,0.022000432014465332,0.2504180371761322,0.9943457245826721,0.25994858145713806,0.02313518524169922,0.3555530905723572,0.023087799549102783,0.2687670588493347,0.022058546543121338,0.3464353084564209,0.021996140480041504,0.295693039894104,0.11567586660385132,0.6741330623626709,0.017446041107177734,0.2868848443031311,0.11565232276916504,0.2953770160675049,0.3868170976638794,0.5169848203659058,0.17459428310394287,0.28672900795936584,0.3868447542190552,0.2364388257265091,0.11567533016204834,0.5169847011566162,0.32586705684661865,0.22763070464134216,0.11565178632736206,0.2276650071144104,0.20608502626419067,0.23635976016521454,0.20609813928604126,0.5517510175704956,0.39409929513931274,0.23622643947601318,0.2964661121368408,0.6059006452560425,0.44824880361557007,0.22753484547138214,0.2964508533477783,0.1414402574300766,0.47938668727874756,0.23704378306865692,0.4792518615722656,0.7497687339782715,0.49499499797821045,0.15057551860809326,0.4804449677467346,0.2282252460718155,0.4803285002708435,0.15085339546203613,0.38673484325408936,0.14204517006874084,0.38671135902404785,0.8254057765007019,0.48301517963409424,0.14212429523468018,0.29628849029541016,0.893638014793396,0.4482489228248596,0.15081912279129028,0.2963016629219055,0.1422577202320099,0.20592069625854492,0.9477876424789429,0.39409929513931274,0.15094926953315735,0.20593607425689697,0.14144045114517212,0.02313530445098877,0.31920260190963745,0.4793957471847534,0.9945327043533325,0.2502301335334778,0.15025892853736877,0.02205866575241089,0.3283390998840332,0.4804449677467346,0.31971582770347595,0.38671642541885376,0.9825538992881775,0.17459410429000854,0.32852432131767273,0.38673120737075806,0.31976577639579773,0.11558306217193604,0.8254058957099915,0.017445921897888184,0.3284158408641815,0.11556941270828247,0.29561394453048706,0.2060987949371338,0.6059007048606873,0.05221235752105713,0.28691911697387695,0.2060856819152832,0.29548054933547974,0.2964667081832886,0.5517511963844299,0.1063617467880249,0.2867889404296875,0.29645150899887085,0.005654247011989355,0.749582052230835,0.20069456100463867,0.02313518524169922,0.25994864106178284,0.47938668727874756,0.20951306819915771,0.022058427333831787,0.26908373832702637,0.4804449677467346,0.05240018665790558,0.605712890625,0.20151172578334808,0.2059200406074524,0.21020328998565674,0.2059352993965149,0.10654976963996887,0.5515632033348083,0.2013782411813736,0.2962881922721863,0.2100730687379837,0.29630136489868164,0.17697232961654663,0.29646652936935425,0.39428722858428955,0.5515631437301636,0.16828079521656036,0.2964513301849365,0.1684110462665558,0.20608550310134888,0.17710581421852112,0.206098735332489,0.44843676686286926,0.6057127714157104,0.1771848499774933,0.11567568778991699,0.4832030236721039,0.6739450693130493,0.168376624584198,0.11565232276916504,0.3545408844947815,0.38678765296936035,0.4832029938697815,0.8252179622650146,0.3458925485610962,0.3868238925933838,0.35459887981414795,0.20606255531311035,0.3942871689796448,0.9475997686386108,0.34590303897857666,0.2060578465461731,0.17478202283382416,0.9823660254478455,0.2608692944049835,0.11557012796401978,0.2695173919200897,0.11554241180419922,0.10654974728822708,0.9475998282432556,0.26076579093933105,0.20592081546783447,0.2694574296474457,0.20593613386154175,0.2693272829055786,0.29630184173583984,0.05240019038319588,0.8934502601623535,0.2606324851512909,0.2962886691093445,0.0176339503377676,0.8252179622650146,0.26055341958999634,0.3867114782333374,0.2693616449832916,0.38673484325408936],\n \"normalized\": false\n },\n \"color\": {\n \"itemSize\": 4,\n \"type\": \"Uint16Array\",\n \"array\": [65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535],\n \"normalized\": true\n }\n },\n \"index\": {\n \"type\": \"Uint16Array\",\n \"array\": [35,38,32,129,54,126,123,91,38,130,57,97,18,10,13,21,77,72,120,32,88,17,72,70,27,20,103,105,60,7,130,94,129,126,45,50,28,24,117,13,66,108,117,80,112,29,88,85,111,80,77,41,46,91,108,61,105,135,4,57,76,87,44,38,30,32,54,42,45,72,67,70,77,78,75,94,95,92,104,108,105,113,117,112,125,129,126,134,130,132,113,111,109,15,13,12,14,21,17,49,41,40,61,58,60,61,64,62,77,73,72,88,82,85,135,100,102,132,129,128,60,0,3,66,8,64,10,68,8,80,22,78,24,81,22,32,86,88,38,89,36,91,43,89,94,52,54,57,95,97,57,1,55,6,105,7,19,111,21,26,120,29,12,108,107,48,126,50,25,117,115,118,35,120,40,123,121,99,7,101,121,35,33,7,3,101,35,123,38,129,94,54,123,41,91,130,135,57,18,71,10,21,111,77,120,35,32,17,21,72,103,5,131,5,98,131,98,133,131,131,127,124,124,47,131,47,39,131,39,122,27,122,34,27,34,119,27,27,116,114,114,110,20,20,16,103,16,11,103,11,106,103,27,114,20,103,131,39,39,27,103,105,61,60,130,97,94,126,54,45,28,84,24,13,10,66,117,24,80,29,120,88,111,112,80,41,51,46,108,66,61,135,102,4,56,2,65,2,59,65,59,63,65,65,9,69,69,74,76,76,79,87,79,23,87,23,83,87,87,31,37,37,90,44,44,53,93,93,96,44,96,56,44,65,69,76,87,37,44,56,65,44,65,76,44,38,36,30,54,52,42,72,73,67,77,80,78,94,97,95,104,107,108,113,115,117,125,128,129,134,135,130,113,112,111,15,18,13,14,19,21,49,51,41,61,62,58,61,66,64,77,75,73,88,86,82,135,134,100,132,130,129,60,58,0,66,10,8,10,71,68,80,24,22,24,84,81,32,30,86,38,91,89,91,46,43,94,92,52,57,55,95,57,4,1,6,104,105,19,109,111,26,118,120,12,13,108,48,125,126,25,28,117,118,33,35,40,41,123,99,6,7,121,123,35,7,60,3]\n },\n \"boundingSphere\": {\n \"center\": [0,0,0],\n \"radius\": 128.54241934554352\n }\n },\n faceValues: [0, 0, 0, 0, 0, 0, 0, 0, 2, 1],\n rotationCombinations: {\n \"1,2\": [180, 0, 0]\n }\n },\n \"d4\": {\n \"metadata\": {\n \"version\": 4.5,\n \"type\": \"BufferGeometry\",\n \"generator\": \"BufferGeometry.toJSON\"\n },\n \"uuid\": \"C5380F7D-1CC8-4744-8B30-2399F5490F2A\",\n \"type\": \"BufferGeometry\",\n \"data\": {\n \"attributes\": {\n \"position\": {\n \"itemSize\": 3,\n \"type\": \"Float32Array\",\n \"array\": [-67.64075469970703, -67.64099884033203, 65.7880630493164, -67.64075469970703, -67.64099884033203, 65.7880630493164, -67.64075469970703, -67.64099884033203, 65.7880630493164, 67.64124298095703, 65.7878189086914, 67.6407470703125, 67.64124298095703, 65.7878189086914, 67.6407470703125, 67.64124298095703, 65.7878189086914, 67.6407470703125, 65.7880630493164, 67.64099884033203, 67.64075469970703, 65.7880630493164, 67.64099884033203, 67.64075469970703, -67.6412353515625, 67.64099884033203, -65.78756713867188, -67.6412353515625, 67.64099884033203, -65.78756713867188, -67.6407470703125, -65.7878189086914, 67.64124298095703, -67.6407470703125, -65.7878189086914, 67.64124298095703, 67.6412353515625, 67.64099884033203, 65.78756713867188, 67.6412353515625, 67.64099884033203, 65.78756713867188, 67.6412353515625, 67.64099884033203, 65.78756713867188, 67.64075469970703, -67.64099884033203, -65.7880630493164, 67.64075469970703, -67.64099884033203, -65.7880630493164, 67.6407470703125, -65.7878189086914, -67.64124298095703, 67.6407470703125, -65.7878189086914, -67.64124298095703, 65.78756713867188, -67.64099884033203, -67.6412353515625, 65.78756713867188, -67.64099884033203, -67.6412353515625, -65.78756713867188, -67.64099884033203, 67.6412353515625, -65.78756713867188, -67.64099884033203, 67.6412353515625, -65.78756713867188, -67.64099884033203, 67.6412353515625, -65.7880630493164, 67.64099884033203, -67.64075469970703, -65.7880630493164, 67.64099884033203, -67.64075469970703, -65.7880630493164, 67.64099884033203, -67.64075469970703, -67.64124298095703, 65.7878189086914, -67.6407470703125, -67.64124298095703, 65.7878189086914, -67.6407470703125, -67.64124298095703, 65.7878189086914, -67.6407470703125],\n \"normalized\": false\n },\n \"normal\": {\n \"itemSize\": 3,\n \"type\": \"Float32Array\",\n \"array\": [-0.5875354409217834, -0.5875733494758606, -0.5563808679580688, -0.5875354409217834, -0.5875733494758606, -0.5563808679580688, -0.5875354409217834, -0.5875733494758606, -0.5563808679580688, 0.58754962682724, -0.5564354062080383, 0.5875076055526733, 0.58754962682724, -0.5564354062080383, 0.5875076055526733, 0.58754962682724, -0.5564354062080383, 0.5875076055526733, -0.5564345121383667, 0.5875091552734375, 0.5875489711761475, -0.5564345121383667, 0.5875091552734375, 0.5875489711761475, -0.5875074863433838, 0.5875474810600281, 0.5564377903938293, -0.5875074863433838, 0.5875474810600281, 0.5564377903938293, -0.5875458717346191, 0.5564350485801697, 0.5875116586685181, -0.5875458717346191, 0.5564350485801697, 0.5875116586685181, 0.5875073075294495, 0.5875475406646729, -0.5564377903938293, 0.5875073075294495, 0.5875475406646729, -0.5564377903938293, 0.5875073075294495, 0.5875475406646729, -0.5564377903938293, 0.5875356793403625, -0.5875731706619263, 0.5563808679580688, 0.5875356793403625, -0.5875731706619263, 0.5563808679580688, 0.5875458717346191, 0.5564350485801697, -0.5875116586685181, 0.5875458717346191, 0.5564350485801697, -0.5875116586685181, -0.5564398169517517, -0.5875092148780823, -0.5875437259674072, -0.5564398169517517, -0.5875092148780823, -0.5875437259674072, 0.5564400553703308, -0.5875090956687927, 0.5875436663627625, 0.5564400553703308, -0.5875090956687927, 0.5875436663627625, 0.5564400553703308, -0.5875090956687927, 0.5875436663627625, 0.5564344525337219, 0.587509036064148, -0.587549090385437, 0.5564344525337219, 0.587509036064148, -0.587549090385437, 0.5564344525337219, 0.587509036064148, -0.587549090385437, -0.5875496864318848, -0.5564355850219727, -0.5875071883201599, -0.5875496864318848, -0.5564355850219727, -0.5875071883201599, -0.5875496864318848, -0.5564355850219727, -0.5875071883201599],\n \"normalized\": false\n },\n \"uv\": {\n \"itemSize\": 2,\n \"type\": \"Float32Array\",\n \"array\": [0.20333926379680634, 0.01598501205444336, 0.20718662440776825, 0.23812401294708252, 0.5022410154342651, 0.21281301975250244, 0.20517542958259583, 0.22700607776641846, 0.21218715608119965, 0.009441137313842773, 0.6251919865608215, 0.25002896785736084, 0.12502600252628326, 0.24997997283935547, 0.2080860435962677, 0.01124197244644165, 0.0021929999347776175, 0.4627319574356079, 0.015251883305609226, 0.12210333347320557, 0.2076776623725891, 0.23367196321487427, 0.24785800278186798, 0.4627319574356079, 0.20334681868553162, 0.22807049751281738, 0.20728397369384766, 0.00649791955947876, 0.49776899814605713, 0.46269500255584717, 0.14456242322921753, 0.12202131748199463, 0.7480239868164062, 0.46278202533721924, 0.14273378252983093, 0.12308567762374878, 0.3749360144138336, 0.24994301795959473, 0.14272625744342804, 0.12096989154815674, 0.625074028968811, 0.00006097555160522461, 0.20517542958259583, 0.0170363187789917, 0.21218715608119965, 0.23534929752349854, 0.5023589730262756, 0.46278202533721924, 0.011641831137239933, 0.11945211887359619, 0.021507836878299713, 0.12308526039123535, 0.2521030008792877, 0.46269500255584717, 0.011544500477612019, 0.12516993284225464, 0.021500281989574432, 0.12096947431564331, 0.7479060292243958, 0.21281301975250244],\n \"normalized\": false\n },\n \"color\": {\n \"itemSize\": 4,\n \"type\": \"Uint16Array\",\n \"array\": [65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535],\n \"normalized\": true\n }\n },\n \"index\": {\n \"type\": \"Uint16Array\",\n \"array\": [6, 8, 11, 26, 14, 18, 29, 20, 2, 5, 23, 16, 17, 3, 15, 25, 19, 28, 10, 27, 1, 0, 15, 21, 9, 13, 24, 9, 24, 27, 7, 4, 13, 10, 1, 22, 17, 15, 19, 7, 22, 4, 17, 12, 3, 25, 17, 19, 10, 9, 27, 0, 19, 15, 9, 7, 13, 7, 10, 22]\n },\n \"boundingSphere\": {\n \"center\": [0, 0, 0],\n \"radius\": 117.1579285756433\n }\n },\n faceValues: [2, 4, 3, 1],\n rotationCombinations: {\n \"1,2\": [90, 0, 90],\n \"1,3\": [120, 90, 150],\n \"1,4\": [-180, 0, -180],\n \"2,3\": [90, 0, 90],\n \"2,4\": [-90, 0, -90],\n \"3,4\": [-90, 0, 90]\n }\n },\n \"d6\": {\n \"metadata\": {\n \"version\": 4.5,\n \"type\": \"BufferGeometry\",\n \"generator\": \"BufferGeometry.toJSON\"\n },\n \"uuid\": \"E18C9F5C-7D15-4FF3-AC5E-A4A56A405499\",\n \"type\": \"BufferGeometry\",\n \"data\": {\n \"attributes\": {\n \"position\": {\n \"itemSize\": 3,\n \"type\": \"Float32Array\",\n \"array\": [52.081398010253906, -49.99797058105469, 49.997779846191406, 52.081398010253906, -49.99797058105469, 49.997779846191406, 52.081398010253906, -49.99797058105469, 49.997779846191406, 52.081398010253906, -49.99797058105469, 49.997779846191406, 52.081031799316406, 49.99797058105469, -49.99816131591797, 52.081031799316406, 49.99797058105469, -49.99816131591797, 52.081031799316406, 49.99797058105469, -49.99816131591797, 52.081031799316406, 49.99797058105469, -49.99816131591797, 52.081398010253906, 49.99797058105469, 49.997779846191406, 52.081398010253906, 49.99797058105469, 49.997779846191406, 52.081398010253906, 49.99797058105469, 49.997779846191406, 52.081398010253906, 49.99797058105469, 49.997779846191406, -52.081031799316406, 49.99797058105469, 49.99816131591797, -52.081031799316406, 49.99797058105469, 49.99816131591797, -52.081031799316406, 49.99797058105469, 49.99816131591797, -52.081031799316406, 49.99797058105469, 49.99816131591797, 49.99778747558594, 52.081214904785156, -49.99814987182617, 49.99778747558594, 52.081214904785156, -49.99814987182617, 49.99778747558594, 52.081214904785156, -49.99814987182617, 49.99778747558594, 52.081214904785156, -49.99814987182617, -49.99814987182617, -52.081214904785156, -49.99778747558594, -49.99814987182617, -52.081214904785156, -49.99778747558594, -49.99814987182617, -52.081214904785156, -49.99778747558594, -49.99814987182617, -52.081214904785156, -49.99778747558594, -49.99816131591797, -49.99797058105469, -52.081031799316406, -49.99816131591797, -49.99797058105469, -52.081031799316406, -49.99816131591797, -49.99797058105469, -52.081031799316406, -49.99816131591797, -49.99797058105469, -52.081031799316406, 49.99778747558594, -52.081214904785156, -49.99814987182617, 49.99778747558594, -52.081214904785156, -49.99814987182617, 49.99778747558594, -52.081214904785156, -49.99814987182617, 49.99778747558594, -52.081214904785156, -49.99814987182617, -49.99778747558594, -52.081214904785156, 49.99814987182617, -49.99778747558594, -52.081214904785156, 49.99814987182617, -49.99778747558594, -52.081214904785156, 49.99814987182617, -49.99778747558594, -52.081214904785156, 49.99814987182617, 52.081031799316406, -49.99797058105469, -49.99816131591797, 52.081031799316406, -49.99797058105469, -49.99816131591797, 52.081031799316406, -49.99797058105469, -49.99816131591797, 52.081031799316406, -49.99797058105469, -49.99816131591797, 49.997779846191406, -49.99797058105469, -52.081398010253906, 49.997779846191406, -49.99797058105469, -52.081398010253906, 49.997779846191406, -49.99797058105469, -52.081398010253906, 49.997779846191406, -49.99797058105469, -52.081398010253906, -52.081398010253906, -49.99797058105469, -49.997779846191406, -52.081398010253906, -49.99797058105469, -49.997779846191406, -52.081398010253906, -49.99797058105469, -49.997779846191406, -52.081398010253906, -49.99797058105469, -49.997779846191406, -49.99814987182617, 52.081214904785156, -49.99778747558594, -49.99814987182617, 52.081214904785156, -49.99778747558594, -49.99814987182617, 52.081214904785156, -49.99778747558594, -49.99814987182617, 52.081214904785156, -49.99778747558594, 49.99814987182617, 52.081214904785156, 49.99778747558594, 49.99814987182617, 52.081214904785156, 49.99778747558594, 49.99814987182617, 52.081214904785156, 49.99778747558594, 49.99814987182617, 52.081214904785156, 49.99778747558594, -49.997779846191406, -49.99797058105469, 52.081398010253906, -49.997779846191406, -49.99797058105469, 52.081398010253906, -49.997779846191406, -49.99797058105469, 52.081398010253906, -49.997779846191406, -49.99797058105469, 52.081398010253906, -49.99778747558594, 52.081214904785156, 49.99814987182617, -49.99778747558594, 52.081214904785156, 49.99814987182617, -49.99778747558594, 52.081214904785156, 49.99814987182617, -49.99778747558594, 52.081214904785156, 49.99814987182617, 49.99816131591797, 49.99797058105469, 52.081031799316406, 49.99816131591797, 49.99797058105469, 52.081031799316406, 49.99816131591797, 49.99797058105469, 52.081031799316406, 49.99816131591797, 49.99797058105469, 52.081031799316406, 49.99814987182617, -52.081214904785156, 49.99778747558594, 49.99814987182617, -52.081214904785156, 49.99778747558594, 49.99814987182617, -52.081214904785156, 49.99778747558594, 49.99814987182617, -52.081214904785156, 49.99778747558594, 49.99816131591797, -49.99797058105469, 52.081031799316406, 49.99816131591797, -49.99797058105469, 52.081031799316406, 49.99816131591797, -49.99797058105469, 52.081031799316406, 49.99816131591797, -49.99797058105469, 52.081031799316406, -52.081031799316406, -49.99797058105469, 49.99816131591797, -52.081031799316406, -49.99797058105469, 49.99816131591797, -52.081031799316406, -49.99797058105469, 49.99816131591797, -52.081031799316406, -49.99797058105469, 49.99816131591797, 49.997779846191406, 49.99797058105469, -52.081398010253906, 49.997779846191406, 49.99797058105469, -52.081398010253906, 49.997779846191406, 49.99797058105469, -52.081398010253906, 49.997779846191406, 49.99797058105469, -52.081398010253906, -49.99816131591797, 49.99797058105469, -52.081031799316406, -49.99816131591797, 49.99797058105469, -52.081031799316406, -49.99816131591797, 49.99797058105469, -52.081031799316406, -49.99816131591797, 49.99797058105469, -52.081031799316406, -52.081398010253906, 49.99797058105469, -49.997779846191406, -52.081398010253906, 49.99797058105469, -49.997779846191406, -52.081398010253906, 49.99797058105469, -49.997779846191406, -52.081398010253906, 49.99797058105469, -49.997779846191406, -49.997779846191406, 49.99797058105469, 52.081398010253906, -49.997779846191406, 49.99797058105469, 52.081398010253906, -49.997779846191406, 49.99797058105469, 52.081398010253906, -49.997779846191406, 49.99797058105469, 52.081398010253906],\n \"normalized\": false\n },\n \"normal\": {\n \"itemSize\": 3,\n \"type\": \"Float32Array\",\n \"array\": [0.9995923042297363, -0.020230919122695923, 0.020147494971752167, 0.9995923042297363, -0.020230919122695923, 0.020147494971752167, 0.9995923042297363, -0.020230919122695923, 0.020147494971752167, 0.9995923042297363, -0.020230919122695923, 0.020147494971752167, 0.9995908737182617, 0.02024438977241516, -0.020207354798913002, 0.9995908737182617, 0.02024438977241516, -0.020207354798913002, 0.9995908737182617, 0.02024438977241516, -0.020207354798913002, 0.9995908737182617, 0.02024438977241516, -0.020207354798913002, 0.9995913505554199, 0.020214110612869263, 0.020209431648254395, 0.9995913505554199, 0.020214110612869263, 0.020209431648254395, 0.9995913505554199, 0.020214110612869263, 0.020209431648254395, 0.9995913505554199, 0.020214110612869263, 0.020209431648254395, -0.9995912313461304, 0.020234376192092896, 0.020197225734591484, -0.9995912313461304, 0.020234376192092896, 0.020197225734591484, -0.9995912313461304, 0.020234376192092896, 0.020197225734591484, -0.9995912313461304, 0.020234376192092896, 0.020197225734591484, 0.02019399404525757, 0.9995913505554199, -0.02023378014564514, 0.02019399404525757, 0.9995913505554199, -0.02023378014564514, 0.02019399404525757, 0.9995913505554199, -0.02023378014564514, 0.02019399404525757, 0.9995913505554199, -0.02023378014564514, -0.02023431658744812, -0.9995909333229065, -0.020213313400745392, -0.02023431658744812, -0.9995909333229065, -0.020213313400745392, -0.02023431658744812, -0.9995909333229065, -0.020213313400745392, -0.02023431658744812, -0.9995909333229065, -0.020213313400745392, -0.02021673321723938, -0.02017366886138916, -0.9995919466018677, -0.02021673321723938, -0.02017366886138916, -0.9995919466018677, -0.02021673321723938, -0.02017366886138916, -0.9995919466018677, -0.02021673321723938, -0.02017366886138916, -0.9995919466018677, 0.020203232765197754, -0.9995912909507751, -0.020224466919898987, 0.020203232765197754, -0.9995912909507751, -0.020224466919898987, 0.020203232765197754, -0.9995912909507751, -0.020224466919898987, 0.020203232765197754, -0.9995912909507751, -0.020224466919898987, -0.020203210413455963, -0.9995913505554199, 0.02022451162338257, -0.020203210413455963, -0.9995913505554199, 0.02022451162338257, -0.020203210413455963, -0.9995913505554199, 0.02022451162338257, -0.020203210413455963, -0.9995913505554199, 0.02022451162338257, 0.9995921850204468, -0.020173730328679085, -0.020216643810272217, 0.9995921850204468, -0.020173730328679085, -0.020216643810272217, 0.9995921850204468, -0.020173730328679085, -0.020216643810272217, 0.9995921850204468, -0.020173730328679085, -0.020216643810272217, 0.020147576928138733, -0.020230591297149658, -0.9995923042297363, 0.020147576928138733, -0.020230591297149658, -0.9995923042297363, 0.020147576928138733, -0.020230591297149658, -0.9995923042297363, 0.020147576928138733, -0.020230591297149658, -0.9995923042297363, -0.9995916485786438, -0.020208656787872314, -0.020204007625579834, -0.9995916485786438, -0.020208656787872314, -0.020204007625579834, -0.9995916485786438, -0.020208656787872314, -0.020204007625579834, -0.9995916485786438, -0.020208656787872314, -0.020204007625579834, -0.02024361491203308, 0.9995908737182617, -0.02020406536757946, -0.02024361491203308, 0.9995908737182617, -0.02020406536757946, -0.02024361491203308, 0.9995908737182617, -0.02020406536757946, -0.02024361491203308, 0.9995908737182617, -0.02020406536757946, 0.02026575803756714, 0.9995908141136169, 0.020181983709335327, 0.02026575803756714, 0.9995908141136169, 0.020181983709335327, 0.02026575803756714, 0.9995908141136169, 0.020181983709335327, 0.02026575803756714, 0.9995908141136169, 0.020181983709335327, -0.020204126834869385, -0.020208358764648438, 0.9995917081832886, -0.020204126834869385, -0.020208358764648438, 0.9995917081832886, -0.020204126834869385, -0.020208358764648438, 0.9995917081832886, -0.020204126834869385, -0.020208358764648438, 0.9995917081832886, -0.02021375298500061, 0.9995914101600647, 0.020213931798934937, -0.02021375298500061, 0.9995914101600647, 0.020213931798934937, -0.02021375298500061, 0.9995914101600647, 0.020213931798934937, -0.02021375298500061, 0.9995914101600647, 0.020213931798934937, 0.020197970792651176, 0.020234346389770508, 0.9995912313461304, 0.020197970792651176, 0.020234346389770508, 0.9995912313461304, 0.020197970792651176, 0.020234346389770508, 0.9995912313461304, 0.020197970792651176, 0.020234346389770508, 0.9995912313461304, 0.02023431658744812, -0.9995909333229065, 0.020213313400745392, 0.02023431658744812, -0.9995909333229065, 0.020213313400745392, 0.02023431658744812, -0.9995909333229065, 0.020213313400745392, 0.02023431658744812, -0.9995909333229065, 0.020213313400745392, 0.020256830379366875, -0.020169764757156372, 0.9995912909507751, 0.020256830379366875, -0.020169764757156372, 0.9995912909507751, 0.020256830379366875, -0.020169764757156372, 0.9995912909507751, 0.020256830379366875, -0.020169764757156372, 0.9995912909507751, -0.9995914101600647, -0.02016991376876831, 0.020256860181689262, -0.9995914101600647, -0.02016991376876831, 0.020256860181689262, -0.9995914101600647, -0.02016991376876831, 0.020256860181689262, -0.9995914101600647, -0.02016991376876831, 0.020256860181689262, 0.02021026611328125, 0.020213961601257324, -0.9995913505554199, 0.02021026611328125, 0.020213961601257324, -0.9995913505554199, 0.02021026611328125, 0.020213961601257324, -0.9995913505554199, 0.02021026611328125, 0.020213961601257324, -0.9995913505554199, -0.02020804025232792, 0.020244628190994263, -0.9995906949043274, -0.02020804025232792, 0.020244628190994263, -0.9995906949043274, -0.02020804025232792, 0.020244628190994263, -0.9995906949043274, -0.02020804025232792, 0.020244628190994263, -0.9995906949043274, -0.9995908737182617, 0.020204482600092888, -0.020239561796188354, -0.9995908737182617, 0.020204482600092888, -0.020239561796188354, -0.9995908737182617, 0.020204482600092888, -0.020239561796188354, -0.9995908737182617, 0.020204482600092888, -0.020239561796188354, -0.020240217447280884, 0.020204216241836548, 0.9995909929275513, -0.020240217447280884, 0.020204216241836548, 0.9995909929275513, -0.020240217447280884, 0.020204216241836548, 0.9995909929275513, -0.020240217447280884, 0.020204216241836548, 0.9995909929275513],\n \"normalized\": false\n },\n \"uv\": {\n \"itemSize\": 2,\n \"type\": \"Float32Array\",\n \"array\": [0.002862999914214015, 0.7471370100975037, 0.07257817685604095, 0.00783926248550415, 0.20479217171669006, 0.24324274063110352, 0.23563209176063538, 0.18311190605163574, 0.16701677441596985, 0.007843196392059326, 0.21674437820911407, 0.007843255996704102, 0.23563209176063538, 0.23977500200271606, 0.24713699519634247, 0.5028629899024963, 0.002862999914214015, 0.5028629899024963, 0.16701683402061462, 0.24324274063110352, 0.20479217171669006, 0.007843196392059326, 0.2416384220123291, 0.12991642951965332, 0.12230584025382996, 0.24324274063110352, 0.14119352400302887, 0.007843255996704102, 0.24163848161697388, 0.2243550419807434, 0.2481130063533783, 0.4981130361557007, 0.11035363376140594, 0.007843255996704102, 0.16008129715919495, 0.007843196392059326, 0.2416384220123291, 0.23630714416503906, 0.4975059926509857, 0.7470999956130981, 0.008979067206382751, 0.00783926248550415, 0.02786727249622345, 0.24324274063110352, 0.2416384220123291, 0.20546722412109375, 0.7475240230560303, 0.002879023551940918, 0.034802429378032684, 0.24324274063110352, 0.08453041315078735, 0.24324274063110352, 0.23563209176063538, 0.20199954509735107, 0.4974119961261749, 0.49670398235321045, 0.027866892516613007, 0.00783926248550415, 0.06564302742481232, 0.24324274063110352, 0.2416384220123291, 0.1607564091682434, 0.5032510161399841, 0.002879023551940918, 0.008979566395282745, 0.24324274063110352, 0.046754732728004456, 0.00783926248550415, 0.2416384220123291, 0.11102879047393799, 0.7475240230560303, 0.24715197086334229, 0.07257817685604095, 0.24324274063110352, 0.21674437820911407, 0.24324274063110352, 0.2416384220123291, 0.1676918864250183, 0.24713699519634247, 0.7471370100975037, 0.03480251133441925, 0.00783926248550415, 0.22367990016937256, 0.24324274063110352, 0.23563209176063538, 0.16422414779663086, 0.2531389892101288, 0.49670398235321045, 0.0038399999029934406, 0.25383996963500977, 0.015914686024188995, 0.00783926248550415, 0.09146587550640106, 0.24324274063110352, 0.2416384220123291, 0.19853174686431885, 0.11035363376140594, 0.24324274063110352, 0.12924134731292725, 0.007843255996704102, 0.2416384220123291, 0.1488041877746582, 0.4975059926509857, 0.5028259754180908, 0.16008129715919495, 0.24324274063110352, 0.17896901071071625, 0.007843196392059326, 0.2416384220123291, 0.12298095226287842, 0.2532320022583008, 0.7470999956130981, 0.0536903440952301, 0.00783926248550415, 0.14812909066677094, 0.24324274063110352, 0.2416384220123291, 0.10409331321716309, 0.5033630132675171, 0.252979040145874, 0.12924134731292725, 0.24324274063110352, 0.17896901071071625, 0.24324274063110352, 0.23563209176063538, 0.22088712453842163, 0.2532320022583008, 0.5028259754180908, 0.18590447306632996, 0.007843196392059326, 0.19785669445991516, 0.007843196392059326, 0.23563209176063538, 0.12644875049591064, 0.7476369738578796, 0.4972519874572754, 0.046755194664001465, 0.24324274063110352, 0.06564256548881531, 0.00783926248550415, 0.2416384220123291, 0.17964410781860352, 0.5032510161399841, 0.24715197086334229, 0.0536903440952301, 0.24324274063110352, 0.19785669445991516, 0.24324274063110352, 0.2416384220123291, 0.18657952547073364, 0.5033630132675171, 0.4972519874572754, 0.0038399999029934406, 0.4981130361557007, 0.015914715826511383, 0.24324274063110352, 0.14119356870651245, 0.24324274063110352, 0.23563209176063538, 0.10756111145019531, 0.10341811925172806, 0.007843255996704102, 0.22367990016937256, 0.007843255996704102, 0.2416384220123291, 0.24324274063110352, 0.2531389892101288, 0.2524310350418091, 0.08453038334846497, 0.007843196392059326, 0.10341812670230865, 0.24324274063110352, 0.2416384220123291, 0.14186859130859375, 0.4974119961261749, 0.2524310350418091, 0.09146586060523987, 0.007843196392059326, 0.12230582535266876, 0.007843255996704102, 0.23563209176063538, 0.14533644914627075, 0.2481130063533783, 0.25383996963500977, 0.14812903106212616, 0.007843255996704102, 0.18590447306632996, 0.24324274063110352, 0.24163848161697388, 0.21741944551467896, 0.7476369738578796, 0.252979040145874],\n \"normalized\": false\n },\n \"color\": {\n \"itemSize\": 4,\n \"type\": \"Uint16Array\",\n \"array\": [65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535],\n \"normalized\": true\n }\n },\n \"index\": {\n \"type\": \"Uint16Array\",\n \"array\": [83, 27, 87, 8, 39, 7, 44, 15, 91, 59, 67, 95, 63, 19, 51, 13, 57, 92, 1, 29, 36, 56, 68, 72, 40, 21, 24, 80, 48, 16, 45, 32, 77, 41, 5, 37, 89, 60, 49, 84, 46, 88, 2, 65, 73, 93, 53, 61, 9, 17, 52, 70, 3, 74, 30, 42, 38, 22, 47, 26, 34, 58, 79, 11, 54, 66, 82, 18, 6, 86, 90, 50, 14, 94, 62, 31, 35, 23, 83, 43, 27, 8, 0, 39, 44, 76, 15, 59, 75, 67, 63, 55, 19, 13, 78, 57, 1, 69, 29, 56, 33, 68, 40, 28, 21, 80, 85, 48, 45, 20, 32, 41, 81, 5, 89, 12, 60, 84, 25, 46, 2, 10, 65, 93, 64, 53, 9, 4, 17, 31, 71, 35]\n },\n \"boundingSphere\": {\n \"center\": [0, 0, 0],\n \"radius\": 90.20752176710862\n }\n },\n faceValues: [3, 5, 1, 6, 2, 4],\n rotationCombinations: {\n \"1,2\": [0, 0, 90],\n \"1,3\": [-90, 0, 0],\n \"1,4\": [90, 0, 0],\n \"1,5\": [0, 0, -90],\n \"1,6\": [180, 0, 0],\n \"2,3\": [0, 90, 0],\n \"2,4\": [0, -90, 0],\n \"2,5\": [0, 0, 180],\n \"2,6\": [0, 0, 90],\n \"3,4\": [-180, 0, -180],\n \"3,5\": [0, 90, 0],\n \"3,6\": [-90, 0, 0],\n \"4,5\": [180, -90, 180],\n \"4,6\": [90, 0, 0],\n \"5,6\": [0, 0, -90]\n }\n },\n \"d8\": {\n \"metadata\": {\n \"version\": 4.5,\n \"type\": \"BufferGeometry\",\n \"generator\": \"BufferGeometry.toJSON\"\n },\n \"uuid\": \"F0A476BC-C144-4BC6-A327-5E00064C485A\",\n \"type\": \"BufferGeometry\",\n \"data\": {\n \"attributes\": {\n \"position\": {\n \"itemSize\": 3,\n \"type\": \"Float32Array\",\n \"array\": [-1.1684173345565796, 1.168058156967163, -97.7831802368164, -1.1684173345565796, 1.168058156967163, -97.7831802368164, -1.1684173345565796, 1.168058156967163, -97.7831802368164, -1.1684173345565796, 1.168058156967163, -97.7831802368164, -97.7831802368164, 1.168058156967163, 1.1684173345565796, -97.7831802368164, 1.168058156967163, 1.1684173345565796, -97.7831802368164, 1.168058156967163, 1.1684173345565796, -97.7831802368164, 1.168058156967163, 1.1684173345565796, -1.167698860168457, -1.168058156967163, 97.7831802368164, -1.167698860168457, -1.168058156967163, 97.7831802368164, -1.167698860168457, -1.168058156967163, 97.7831802368164, -1.167698860168457, -1.168058156967163, 97.7831802368164, -97.7831802368164, -1.168058156967163, 1.1684173345565796, -97.7831802368164, -1.168058156967163, 1.1684173345565796, -97.7831802368164, -1.168058156967163, 1.1684173345565796, -97.7831802368164, -1.168058156967163, 1.1684173345565796, -1.1680537462234497, 97.7831802368164, 1.168062448501587, -1.1680537462234497, 97.7831802368164, 1.168062448501587, -1.1680537462234497, 97.7831802368164, 1.168062448501587, -1.1680537462234497, 97.7831802368164, 1.168062448501587, -97.7831802368164, 1.168058156967163, -1.167698860168457, -97.7831802368164, 1.168058156967163, -1.167698860168457, -97.7831802368164, 1.168058156967163, -1.167698860168457, -97.7831802368164, 1.168058156967163, -1.167698860168457, -1.168062448501587, 97.7831802368164, -1.1680537462234497, -1.168062448501587, 97.7831802368164, -1.1680537462234497, -1.168062448501587, 97.7831802368164, -1.1680537462234497, -1.168062448501587, 97.7831802368164, -1.1680537462234497, 97.7831802368164, -1.168058156967163, -1.1684173345565796, 97.7831802368164, -1.168058156967163, -1.1684173345565796, 97.7831802368164, -1.168058156967163, -1.1684173345565796, 97.7831802368164, -1.168058156967163, -1.1684173345565796, 1.167698860168457, -1.168058156967163, -97.7831802368164, 1.167698860168457, -1.168058156967163, -97.7831802368164, 1.167698860168457, -1.168058156967163, -97.7831802368164, 1.167698860168457, -1.168058156967163, -97.7831802368164, 1.167698860168457, 1.168058156967163, -97.7831802368164, 1.167698860168457, 1.168058156967163, -97.7831802368164, 1.167698860168457, 1.168058156967163, -97.7831802368164, 1.167698860168457, 1.168058156967163, -97.7831802368164, 1.1680537462234497, 97.7831802368164, -1.168062448501587, 1.1680537462234497, 97.7831802368164, -1.168062448501587, 1.1680537462234497, 97.7831802368164, -1.168062448501587, 1.1680537462234497, 97.7831802368164, -1.168062448501587, 97.7831802368164, 1.168058156967163, 1.167698860168457, 97.7831802368164, 1.168058156967163, 1.167698860168457, 97.7831802368164, 1.168058156967163, 1.167698860168457, 97.7831802368164, 1.168058156967163, 1.167698860168457, -1.168062448501587, -97.7831802368164, -1.1680537462234497, -1.168062448501587, -97.7831802368164, -1.1680537462234497, -1.168062448501587, -97.7831802368164, -1.1680537462234497, -1.168062448501587, -97.7831802368164, -1.1680537462234497, -97.7831802368164, -1.168058156967163, -1.167698860168457, -97.7831802368164, -1.168058156967163, -1.167698860168457, -97.7831802368164, -1.168058156967163, -1.167698860168457, -97.7831802368164, -1.168058156967163, -1.167698860168457, 97.7831802368164, -1.168058156967163, 1.167698860168457, 97.7831802368164, -1.168058156967163, 1.167698860168457, 97.7831802368164, -1.168058156967163, 1.167698860168457, 97.7831802368164, -1.168058156967163, 1.167698860168457, -1.167698860168457, 1.168058156967163, 97.7831802368164, -1.167698860168457, 1.168058156967163, 97.7831802368164, -1.167698860168457, 1.168058156967163, 97.7831802368164, -1.167698860168457, 1.168058156967163, 97.7831802368164, 1.168062448501587, -97.7831802368164, 1.1680537462234497, 1.168062448501587, -97.7831802368164, 1.1680537462234497, 1.168062448501587, -97.7831802368164, 1.1680537462234497, 1.168062448501587, -97.7831802368164, 1.1680537462234497, 1.1684173345565796, -1.168058156967163, 97.7831802368164, 1.1684173345565796, -1.168058156967163, 97.7831802368164, 1.1684173345565796, -1.168058156967163, 97.7831802368164, 1.1684173345565796, -1.168058156967163, 97.7831802368164, -1.1684173345565796, -1.168058156967163, -97.7831802368164, -1.1684173345565796, -1.168058156967163, -97.7831802368164, -1.1684173345565796, -1.168058156967163, -97.7831802368164, -1.1684173345565796, -1.168058156967163, -97.7831802368164, 1.1684173345565796, 1.168058156967163, 97.7831802368164, 1.1684173345565796, 1.168058156967163, 97.7831802368164, 1.1684173345565796, 1.168058156967163, 97.7831802368164, 1.1684173345565796, 1.168058156967163, 97.7831802368164, 97.7831802368164, 1.168058156967163, -1.1684173345565796, 97.7831802368164, 1.168058156967163, -1.1684173345565796, 97.7831802368164, 1.168058156967163, -1.1684173345565796, 97.7831802368164, 1.168058156967163, -1.1684173345565796, 1.168062448501587, 97.7831802368164, 1.1680537462234497, 1.168062448501587, 97.7831802368164, 1.1680537462234497, 1.168062448501587, 97.7831802368164, 1.1680537462234497, 1.168062448501587, 97.7831802368164, 1.1680537462234497, -1.1680537462234497, -97.7831802368164, 1.168062448501587, -1.1680537462234497, -97.7831802368164, 1.168062448501587, -1.1680537462234497, -97.7831802368164, 1.168062448501587, -1.1680537462234497, -97.7831802368164, 1.168062448501587, 1.1680537462234497, -97.7831802368164, -1.168062448501587, 1.1680537462234497, -97.7831802368164, -1.168062448501587, 1.1680537462234497, -97.7831802368164, -1.168062448501587, 1.1680537462234497, -97.7831802368164, -1.168062448501587],\n \"normalized\": false\n },\n \"normal\": {\n \"itemSize\": 3,\n \"type\": \"Float32Array\",\n \"array\": [-0.5682533383369446, 0.5682891607284546, -0.5950928330421448, -0.5682533383369446, 0.5682891607284546, -0.5950928330421448, -0.5682533383369446, 0.5682891607284546, -0.5950928330421448, -0.5682533383369446, 0.5682891607284546, -0.5950928330421448, -0.5951133966445923, 0.568278431892395, 0.5682425498962402, -0.5951133966445923, 0.568278431892395, 0.5682425498962402, -0.5951133966445923, 0.568278431892395, 0.5682425498962402, -0.5951133966445923, 0.568278431892395, 0.5682425498962402, -0.5682530999183655, -0.5682904720306396, 0.5950918197631836, -0.5682530999183655, -0.5682904720306396, 0.5950918197631836, -0.5682530999183655, -0.5682904720306396, 0.5950918197631836, -0.5682530999183655, -0.5682904720306396, 0.5950918197631836, -0.5950893759727478, -0.5682545304298401, 0.5682916045188904, -0.5950893759727478, -0.5682545304298401, 0.5682916045188904, -0.5950893759727478, -0.5682545304298401, 0.5682916045188904, -0.5950893759727478, -0.5682545304298401, 0.5682916045188904, -0.5682390332221985, 0.5951166152954102, 0.5682786107063293, -0.5682390332221985, 0.5951166152954102, 0.5682786107063293, -0.5682390332221985, 0.5951166152954102, 0.5682786107063293, -0.5682390332221985, 0.5951166152954102, 0.5682786107063293, -0.5951080918312073, 0.5682451725006104, -0.5682812929153442, -0.5951080918312073, 0.5682451725006104, -0.5682812929153442, -0.5951080918312073, 0.5682451725006104, -0.5682812929153442, -0.5951080918312073, 0.5682451725006104, -0.5682812929153442, -0.5682910680770874, 0.5950912833213806, -0.5682533383369446, -0.5682910680770874, 0.5950912833213806, -0.5682533383369446, -0.5682910680770874, 0.5950912833213806, -0.5682533383369446, -0.5682910680770874, 0.5950912833213806, -0.5682533383369446, 0.595115065574646, -0.5682411789894104, -0.5682781934738159, 0.595115065574646, -0.5682411789894104, -0.5682781934738159, 0.595115065574646, -0.5682411789894104, -0.5682781934738159, 0.595115065574646, -0.5682411789894104, -0.5682781934738159, 0.5682530999183655, -0.5682904720306396, -0.5950918197631836, 0.5682530999183655, -0.5682904720306396, -0.5950918197631836, 0.5682530999183655, -0.5682904720306396, -0.5950918197631836, 0.5682530999183655, -0.5682904720306396, -0.5950918197631836, 0.5682830810546875, 0.5682469010353088, -0.5951048731803894, 0.5682830810546875, 0.5682469010353088, -0.5951048731803894, 0.5682830810546875, 0.5682469010353088, -0.5951048731803894, 0.5682830810546875, 0.5682469010353088, -0.5951048731803894, 0.5682392716407776, 0.5951164960861206, -0.5682784914970398, 0.5682392716407776, 0.5951164960861206, -0.5682784914970398, 0.5682392716407776, 0.5951164960861206, -0.5682784914970398, 0.5682392716407776, 0.5951164960861206, -0.5682784914970398, 0.5951049327850342, 0.5682469010353088, 0.5682830214500427, 0.5951049327850342, 0.5682469010353088, 0.5682830214500427, 0.5951049327850342, 0.5682469010353088, 0.5682830214500427, 0.5951049327850342, 0.5682469010353088, 0.5682830214500427, -0.5682423114776611, -0.5951160788536072, -0.5682759881019592, -0.5682423114776611, -0.5951160788536072, -0.5682759881019592, -0.5682423114776611, -0.5951160788536072, -0.5682759881019592, -0.5682423114776611, -0.5951160788536072, -0.5682759881019592, -0.595117449760437, -0.5682770609855652, -0.568239688873291, -0.595117449760437, -0.5682770609855652, -0.568239688873291, -0.595117449760437, -0.5682770609855652, -0.568239688873291, -0.595117449760437, -0.5682770609855652, -0.568239688873291, 0.5950918197631836, -0.5682904720306396, 0.5682530999183655, 0.5950918197631836, -0.5682904720306396, 0.5682530999183655, 0.5950918197631836, -0.5682904720306396, 0.5682530999183655, 0.5950918197631836, -0.5682904720306396, 0.5682530999183655, -0.5682830810546875, 0.5682469010353088, 0.5951048731803894, -0.5682830810546875, 0.5682469010353088, 0.5951048731803894, -0.5682830810546875, 0.5682469010353088, 0.5951048731803894, -0.5682830810546875, 0.5682469010353088, 0.5951048731803894, 0.5682426691055298, -0.5951159000396729, 0.5682759284973145, 0.5682426691055298, -0.5951159000396729, 0.5682759284973145, 0.5682426691055298, -0.5951159000396729, 0.5682759284973145, 0.5682426691055298, -0.5951159000396729, 0.5682759284973145, 0.5682781934738159, -0.5682411193847656, 0.595115065574646, 0.5682781934738159, -0.5682411193847656, 0.595115065574646, 0.5682781934738159, -0.5682411193847656, 0.595115065574646, 0.5682781934738159, -0.5682411193847656, 0.595115065574646, -0.5682781934738159, -0.5682411193847656, -0.595115065574646, -0.5682781934738159, -0.5682411193847656, -0.595115065574646, -0.5682781934738159, -0.5682411193847656, -0.595115065574646, -0.5682781934738159, -0.5682411193847656, -0.595115065574646, 0.5682533383369446, 0.5682891607284546, 0.5950928330421448, 0.5682533383369446, 0.5682891607284546, 0.5950928330421448, 0.5682533383369446, 0.5682891607284546, 0.5950928330421448, 0.5682533383369446, 0.5682891607284546, 0.5950928330421448, 0.5950928330421448, 0.5682891607284546, -0.5682533383369446, 0.5950928330421448, 0.5682891607284546, -0.5682533383369446, 0.5950928330421448, 0.5682891607284546, -0.5682533383369446, 0.5950928330421448, 0.5682891607284546, -0.5682533383369446, 0.5682913064956665, 0.595090925693512, 0.5682531595230103, 0.5682913064956665, 0.595090925693512, 0.5682531595230103, 0.5682913064956665, 0.595090925693512, 0.5682531595230103, 0.5682913064956665, 0.595090925693512, 0.5682531595230103, -0.5682886838912964, -0.5950911641120911, 0.5682557225227356, -0.5682886838912964, -0.5950911641120911, 0.5682557225227356, -0.5682886838912964, -0.5950911641120911, 0.5682557225227356, -0.5682886838912964, -0.5950911641120911, 0.5682557225227356, 0.5682889819145203, -0.5950908660888672, -0.5682554841041565, 0.5682889819145203, -0.5950908660888672, -0.5682554841041565, 0.5682889819145203, -0.5950908660888672, -0.5682554841041565, 0.5682889819145203, -0.5950908660888672, -0.5682554841041565],\n \"normalized\": false\n },\n \"uv\": {\n \"itemSize\": 2,\n \"type\": \"Float32Array\",\n \"array\": [0.07201391458511353, 0.011956751346588135, 0.1601339429616928, 0.228448748588562, 0.2343699038028717, 0.15436840057373047, 0.9927999973297119, 0.452796995639801, 0.14628882706165314, 0.22844743728637695, 0.213005930185318, 0.228448748588562, 0.23062995076179504, 0.19327861070632935, 0.3759610056877136, 0.5007950067520142, 0.036765892058610916, 0.011956632137298584, 0.2167847901582718, 0.011955499649047852, 0.2343699038028717, 0.13678330183029175, 0.9929670095443726, 0.2016180157661438, 0.1286647915840149, 0.011955201625823975, 0.2167847901582718, 0.22844743728637695, 0.23062995076179504, 0.1895385980606079, 0.8765519857406616, -0.00001895427703857422, 0.14628879725933075, 0.011955201625823975, 0.19916081428527832, 0.22844743728637695, 0.23062995076179504, 0.20712369680404663, 0.49237701296806335, 0.7024319767951965, 0.14250995218753815, 0.228448748588562, 0.1601339429616928, 0.011956632137298584, 0.2343699038028717, 0.19327861070632935, 0.876384973526001, 0.25116002559661865, 0.07201394438743591, 0.228448748588562, 0.14250992238521576, 0.011956632137298584, 0.2343699038028717, 0.20712369680404663, 0.7599689960479736, 0.452796995639801, 0.022920722141861916, 0.011955201625823975, 0.18153679370880127, 0.22844743728637695, 0.23062995076179504, 0.22470879554748535, 0.6253160238265991, 0.0010759830474853516, 0.08963792026042938, 0.011956632137298584, 0.18153676390647888, 0.011955499649047852, 0.23062995076179504, 0.15810835361480713, 0.7397840023040771, 0.19933903217315674, 0.00919399969279766, 0.7025139927864075, 0.07579275965690613, 0.011955320835113525, 0.17775794863700867, 0.011956751346588135, 0.23062995076179504, 0.15436840057373047, 0.07579278945922852, 0.22844737768173218, 0.10726193338632584, 0.228448748588562, 0.2343699038028717, 0.21086370944976807, 0.2420250028371811, 0.7025139927864075, 0.05816878750920296, 0.22844743728637695, 0.11104078590869904, 0.011955320835113525, 0.2343699038028717, 0.228448748588562, 0.6256870031356812, 0.2503969669342041, 0.09341679513454437, 0.22844743728637695, 0.1248859316110611, 0.228448748588562, 0.2343699038028717, 0.17195343971252441, 0.49275800585746765, 0.4534569978713989, 0.12488594651222229, 0.011956632137298584, 0.1639128178358078, 0.011955201625823975, 0.2343699038028717, 0.1895385980606079, 0.37544700503349304, 0.25026899576187134, 0.019141869619488716, 0.011956572532653809, 0.05438993498682976, 0.228448748588562, 0.12524299323558807, 0.2504919767379761, 0.2343699038028717, 0.22470879554748535, 0.19916081428527832, 0.011955499649047852, 0.2130059003829956, 0.011956751346588135, 0.2343699038028717, 0.1405232548713684, 0.2595460116863251, 0.7024319767951965, 0.019141899421811104, 0.228448748588562, 0.0405447743833065, 0.22844743728637695, 0.23062995076179504, 0.17569351196289062, 0.2416590005159378, 0.4521290063858032, 0.008828000165522099, 0.4521290063858032, 0.040544744580984116, 0.011955201625823975, 0.05438990518450737, 0.011956632137298584, 0.23062992095947266, 0.13678330183029175, 0.09341679513454437, 0.011955201625823975, 0.1639127880334854, 0.22844743728637695, 0.2343699038028717, 0.15810835361480713, 0.2581369876861572, 0.4534569978713989, 0.05816878750920296, 0.01195526123046875, 0.19538196921348572, 0.011956751346588135, 0.23062992095947266, 0.14052319526672363, 0.7421020269393921, 0.45203500986099243, 0.10726191848516464, 0.011956751346588135, 0.12560999393463135, 0.5008770227432251, 0.17775794863700867, 0.228448748588562, 0.23062995076179504, 0.228448748588562, 0.11104080080986023, 0.22844737768173218, 0.19538193941116333, 0.228448748588562, 0.23062995076179504, 0.21086370944976807, 0.5092710256576538, 0.45203500986099243, 0.036765921860933304, 0.228448748588562, 0.1286647915840149, 0.22844737768173218, 0.2343699038028717, 0.17569351196289062, 0.7601360082626343, 0.2016180157661438, 0.022920751944184303, 0.22844743728637695, 0.08963793516159058, 0.228448748588562, 0.23062995076179504, 0.17195343971252441, 0.5108489990234375, 0.19933903217315674],\n \"normalized\": false\n },\n \"color\": {\n \"itemSize\": 4,\n \"type\": \"Uint16Array\",\n \"array\": [65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535],\n \"normalized\": true\n }\n },\n \"index\": {\n \"type\": \"Uint16Array\",\n \"array\": [3, 23, 27, 36, 43, 81, 35, 31, 95, 75, 51, 55, 79, 47, 87, 63, 19, 7, 11, 15, 91, 68, 67, 58, 60, 85, 17, 30, 46, 59, 92, 56, 64, 6, 54, 14, 37, 24, 40, 45, 41, 84, 32, 48, 72, 16, 20, 4, 42, 18, 86, 50, 66, 90, 52, 89, 12, 61, 13, 9, 74, 39, 34, 71, 62, 10, 38, 29, 33, 21, 73, 53, 8, 65, 69, 44, 70, 57, 60, 77, 85, 30, 83, 46, 92, 28, 56, 6, 22, 54, 37, 0, 24, 45, 80, 41, 32, 93, 48, 16, 25, 20, 42, 26, 18, 50, 94, 66, 52, 49, 89, 61, 5, 13, 74, 2, 39, 71, 78, 62, 38, 82, 29, 21, 1, 73, 8, 88, 65, 44, 76, 70]\n },\n \"boundingSphere\": {\n \"center\": [0, 0, 0],\n \"radius\": 169.36543629583093\n }\n },\n faceValues: [5, 3, 1, 7, 2, 8, 6, 4],\n rotationCombinations: {\n \"1,2\": [180, 0, 180],\n \"1,3\": [90, 0, 0],\n \"1,4\": [0, 0, 90],\n \"1,5\": [-180, 0, 0],\n \"1,6\": [0, 0, 180],\n \"1,7\": [-90, 0, 0],\n \"1,8\": [90, 0, 180],\n \"2,3\": [90, 0, 180],\n \"2,4\": [-90, 0, 0],\n \"2,5\": [0, 0, 180],\n \"2,6\": [-180, 0, 0],\n \"2,7\": [-90, 0, -180],\n \"2,8\": [90, 0, 0],\n \"3,4\": [-180, 0, 180],\n \"3,5\": [90, 0, 0],\n \"3,6\": [-90, 0, -180],\n \"3,7\": [-180, 0, 0],\n \"3,8\": [0, 0, 180],\n \"4,5\": [90, 0, 180],\n \"4,6\": [-90, 0, 0],\n \"4,7\": [0, 0, -180],\n \"4,8\": [180, 0, 0],\n \"5,6\": [-180, 0, -180],\n \"5,7\": [90, 0, 0],\n \"5,8\": [-90, 0, 180],\n \"6,7\": [90, 0, -180],\n \"6,8\": [-90, 0, 0],\n \"7,8\": [-180, 0, -180]\n }\n },\n \"d10\": {\n \"metadata\": {\n \"version\": 4.5,\n \"type\": \"BufferGeometry\",\n \"generator\": \"BufferGeometry.toJSON\"\n },\n \"uuid\": \"1B9B60ED-6BEC-48CC-8EB9-EEFFC2DD3ED8\",\n \"type\": \"BufferGeometry\",\n \"data\": {\n \"attributes\": {\n \"position\": {\n \"itemSize\": 3,\n \"type\": \"Float32Array\",\n \"array\": [-2.5946993827819824,1.8790435791015625,86.0141830444336,-2.5946993827819824,1.8790435791015625,86.0141830444336,-2.5946993827819824,1.8790435791015625,86.0141830444336,-2.5946993827819824,1.8790435791015625,86.0141830444336,71.31939697265625,-49.49197769165039,10.200661659240723,71.31939697265625,-49.49197769165039,10.200661659240723,71.31939697265625,-49.49197769165039,10.200661659240723,71.31939697265625,-49.49197769165039,10.200661659240723,87.39810180664062,-0.005702871363610029,-7.479601860046387,87.39810180664062,-0.005702871363610029,-7.479601860046387,87.39810180664062,-0.005702871363610029,-7.479601860046387,87.39810180664062,-0.005702871363610029,-7.479601860046387,3.2070045471191406,-0.005997277796268463,86.01419830322266,3.2070045471191406,-0.005997277796268463,86.01419830322266,3.2070045471191406,-0.005997277796268463,86.01419830322266,3.2070045471191406,-0.005997277796268463,86.01419830322266,-28.610445022583008,-81.96196746826172,10.200666427612305,-28.610445022583008,-81.96196746826172,10.200666427612305,-28.610445022583008,-81.96196746826172,10.200666427612305,-28.610445022583008,-81.96196746826172,10.200666427612305,69.1033706665039,-52.5421257019043,10.200669288635254,69.1033706665039,-52.5421257019043,10.200669288635254,69.1033706665039,-52.5421257019043,10.200669288635254,69.1033706665039,-52.5421257019043,10.200669288635254,0.9909778237342834,-3.0561423301696777,86.01419830322266,0.9909778237342834,-3.0561423301696777,86.01419830322266,0.9909778237342834,-3.0561423301696777,86.01419830322266,0.9909778237342834,-3.0561423301696777,86.01419830322266,70.70691680908203,-51.37708282470703,7.479945659637451,70.70691680908203,-51.37708282470703,7.479945659637451,70.70691680908203,-51.37708282470703,7.479945659637451,70.70691680908203,-51.37708282470703,7.479945659637451,-25.02603530883789,83.11405944824219,10.200100898742676,-25.02603530883789,83.11405944824219,10.200100898742676,-25.02603530883789,83.11405944824219,10.200100898742676,-25.02603530883789,83.11405944824219,10.200100898742676,-69.10337829589844,52.52949142456055,-10.200671195983887,-69.10337829589844,52.52949142456055,-10.200671195983887,-69.10337829589844,52.52949142456055,-10.200671195983887,-69.10337829589844,52.52949142456055,-10.200671195983887,-86.7856216430664,1.8781644105911255,10.200315475463867,-86.7856216430664,1.8781644105911255,10.200315475463867,-86.7856216430664,1.8781644105911255,10.200315475463867,-86.7856216430664,1.8781644105911255,10.200315475463867,-28.611663818359375,81.948974609375,10.200101852416992,-28.611663818359375,81.948974609375,10.200101852416992,-28.611663818359375,81.948974609375,10.200101852416992,-28.611663818359375,81.948974609375,10.200101852416992,-27.008115768432617,83.1140365600586,7.479378700256348,-27.008115768432617,83.1140365600586,7.479378700256348,-27.008115768432617,83.1140365600586,7.479378700256348,-27.008115768432617,83.1140365600586,7.479378700256348,-70.70691680908203,51.364444732666016,-7.479947566986084,-70.70691680908203,51.364444732666016,-7.479947566986084,-70.70691680908203,51.364444732666016,-7.479947566986084,-70.70691680908203,51.364444732666016,-7.479947566986084,71.31866455078125,49.48046112060547,10.200318336486816,71.31866455078125,49.48046112060547,10.200318336486816,71.31866455078125,49.48046112060547,10.200318336486816,71.31866455078125,49.48046112060547,10.200318336486816,86.78557586669922,1.8793641328811646,-10.20033073425293,86.78557586669922,1.8793641328811646,-10.20033073425293,86.78557586669922,1.8793641328811646,-10.20033073425293,86.78557586669922,1.8793641328811646,-10.20033073425293,69.10259246826172,52.53056716918945,10.20030689239502,69.10259246826172,52.53056716918945,10.20030689239502,69.10259246826172,52.53056716918945,10.20030689239502,69.10259246826172,52.53056716918945,10.20030689239502,70.7061538696289,51.36553192138672,7.479590892791748,70.7061538696289,51.36553192138672,7.479590892791748,70.7061538696289,51.36553192138672,7.479590892791748,70.7061538696289,51.36553192138672,7.479590892791748,2.5946712493896484,1.8784899711608887,-86.01419830322266,2.5946712493896484,1.8784899711608887,-86.01419830322266,2.5946712493896484,1.8784899711608887,-86.01419830322266,2.5946712493896484,1.8784899711608887,-86.01419830322266,28.610443115234375,81.9493408203125,-10.200669288635254,28.610443115234375,81.9493408203125,-10.200669288635254,28.610443115234375,81.9493408203125,-10.200669288635254,28.610443115234375,81.9493408203125,-10.200669288635254,86.78562927246094,-1.8908008337020874,-10.2003173828125,86.78562927246094,-1.8908008337020874,-10.2003173828125,86.78562927246094,-1.8908008337020874,-10.2003173828125,86.78562927246094,-1.8908008337020874,-10.2003173828125,0.9909327626228333,3.0441155433654785,86.0141830444336,0.9909327626228333,3.0441155433654785,86.0141830444336,0.9909327626228333,3.0441155433654785,86.0141830444336,0.9909327626228333,3.0441155433654785,86.0141830444336,-27.00689125061035,-83.12700653076172,7.479950428009033,-27.00689125061035,-83.12700653076172,7.479950428009033,-27.00689125061035,-83.12700653076172,7.479950428009033,-27.00689125061035,-83.12700653076172,7.479950428009033,-69.10259246826172,-52.54320526123047,-10.200308799743652,-69.10259246826172,-52.54320526123047,-10.200308799743652,-69.10259246826172,-52.54320526123047,-10.200308799743652,-69.10259246826172,-52.54320526123047,-10.200308799743652,2.594700574874878,-1.8916770219802856,-86.0141830444336,2.594700574874878,-1.8916770219802856,-86.0141830444336,2.594700574874878,-1.8916770219802856,-86.0141830444336,2.594700574874878,-1.8916770219802856,-86.0141830444336,25.026033401489258,-83.1266860961914,-10.200102806091309,25.026033401489258,-83.1266860961914,-10.200102806091309,25.026033401489258,-83.1266860961914,-10.200102806091309,25.026033401489258,-83.1266860961914,-10.200102806091309,-86.78559112548828,-1.892000436782837,10.200329780578613,-86.78559112548828,-1.892000436782837,10.200329780578613,-86.78559112548828,-1.892000436782837,10.200329780578613,-86.78559112548828,-1.892000436782837,10.200329780578613,-70.7061538696289,-51.37816619873047,-7.479592323303223,-70.7061538696289,-51.37816619873047,-7.479592323303223,-70.7061538696289,-51.37816619873047,-7.479592323303223,-70.7061538696289,-51.37816619873047,-7.479592323303223,-25.024797439575195,-83.12699127197266,10.200674057006836,-25.024797439575195,-83.12699127197266,10.200674057006836,-25.024797439575195,-83.12699127197266,10.200674057006836,-25.024797439575195,-83.12699127197266,10.200674057006836,-2.5946712493896484,-1.8911232948303223,86.01419830322266,-2.5946712493896484,-1.8911232948303223,86.01419830322266,-2.5946712493896484,-1.8911232948303223,86.01419830322266,-2.5946712493896484,-1.8911232948303223,86.01419830322266,-71.31940460205078,49.47935104370117,-10.200664520263672,-71.31940460205078,49.47935104370117,-10.200664520263672,-71.31940460205078,49.47935104370117,-10.200664520263672,-71.31940460205078,49.47935104370117,-10.200664520263672,28.611663818359375,-81.96160888671875,-10.200103759765625,28.611663818359375,-81.96160888671875,-10.200103759765625,28.611663818359375,-81.96160888671875,-10.200103759765625,28.611663818359375,-81.96160888671875,-10.200103759765625,27.00688934326172,83.1143798828125,-7.479951858520508,27.00688934326172,83.1143798828125,-7.479951858520508,27.00688934326172,83.1143798828125,-7.479951858520508,27.00688934326172,83.1143798828125,-7.479951858520508,25.024797439575195,83.11434936523438,-10.200675010681152,25.024797439575195,83.11434936523438,-10.200675010681152,25.024797439575195,83.11434936523438,-10.200675010681152,25.024797439575195,83.11434936523438,-10.200675010681152,27.008115768432617,-83.12667083740234,-7.4793806076049805,27.008115768432617,-83.12667083740234,-7.4793806076049805,27.008115768432617,-83.12667083740234,-7.4793806076049805,27.008115768432617,-83.12667083740234,-7.4793806076049805,-87.39810180664062,-0.006933570373803377,7.479599952697754,-87.39810180664062,-0.006933570373803377,7.479599952697754,-87.39810180664062,-0.006933570373803377,7.479599952697754,-87.39810180664062,-0.006933570373803377,7.479599952697754,-71.31866455078125,-49.493099212646484,-10.20032024383545,-71.31866455078125,-49.493099212646484,-10.20032024383545,-71.31866455078125,-49.493099212646484,-10.20032024383545,-71.31866455078125,-49.493099212646484,-10.20032024383545,-0.9909327626228333,-3.056749105453491,-86.0141830444336,-0.9909327626228333,-3.056749105453491,-86.0141830444336,-0.9909327626228333,-3.056749105453491,-86.0141830444336,-0.9909327626228333,-3.056749105453491,-86.0141830444336,-3.2070045471191406,-0.006636159960180521,-86.01419830322266,-3.2070045471191406,-0.006636159960180521,-86.01419830322266,-3.2070045471191406,-0.006636159960180521,-86.01419830322266,-3.2070045471191406,-0.006636159960180521,-86.01419830322266,-0.9909778237342834,3.0435099601745605,-86.01419830322266,-0.9909778237342834,3.0435099601745605,-86.01419830322266,-0.9909778237342834,3.0435099601745605,-86.01419830322266,-0.9909778237342834,3.0435099601745605,-86.01419830322266],\n \"normalized\": false\n },\n \"normal\": {\n \"itemSize\": 3,\n \"type\": \"Float32Array\",\n \"array\": [-0.5870956778526306,0.42651230096817017,0.6880449652671814,-0.5870956778526306,0.42651230096817017,0.6880449652671814,-0.5870956778526306,0.42651230096817017,0.6880449652671814,-0.5870956778526306,0.42651230096817017,0.6880449652671814,0.745985746383667,-0.033444374799728394,0.6651214957237244,0.745985746383667,-0.033444374799728394,0.6651214957237244,0.745985746383667,-0.033444374799728394,0.6651214957237244,0.745985746383667,-0.033444374799728394,0.6651214957237244,0.7662718892097473,0.00003863871097564697,0.6425164937973022,0.7662718892097473,0.00003863871097564697,0.6425164937973022,0.7662718892097473,0.00003863871097564697,0.6425164937973022,0.7662718892097473,0.00003863871097564697,0.6425164937973022,0.7256649732589722,0.000032261013984680176,0.6880481839179993,0.7256649732589722,0.000032261013984680176,0.6880481839179993,0.7256649732589722,0.000032261013984680176,0.6880481839179993,0.7256649732589722,0.000032261013984680176,0.6880481839179993,-0.5838431119918823,-0.4655483365058899,0.6651255488395691,-0.5838431119918823,-0.4655483365058899,0.6651255488395691,-0.5838431119918823,-0.4655483365058899,0.6651255488395691,-0.5838431119918823,-0.4655483365058899,0.6651255488395691,0.2623160779476166,-0.6991221904754639,0.6651454567909241,0.2623160779476166,-0.6991221904754639,0.6651454567909241,0.2623160779476166,-0.6991221904754639,0.6651454567909241,0.2623160779476166,-0.6991221904754639,0.6651454567909241,0.22423836588859558,-0.6901593208312988,0.6880385875701904,0.22423836588859558,-0.6901593208312988,0.6880385875701904,0.22423836588859558,-0.6901593208312988,0.6880385875701904,0.22423836588859558,-0.6901593208312988,0.6880385875701904,0.6199150085449219,-0.4504251182079315,-0.6425127983093262,0.6199150085449219,-0.4504251182079315,-0.6425127983093262,0.6199150085449219,-0.4504251182079315,-0.6425127983093262,0.6199150085449219,-0.4504251182079315,-0.6425127983093262,0.19871656596660614,0.7197921276092529,0.6651397347450256,0.19871656596660614,0.7197921276092529,0.6651397347450256,0.19871656596660614,0.7197921276092529,0.6651397347450256,0.19871656596660614,0.7197921276092529,0.6651397347450256,-0.26231205463409424,0.6991309523582458,-0.665137767791748,-0.26231205463409424,0.6991309523582458,-0.665137767791748,-0.26231205463409424,0.6991309523582458,-0.665137767791748,-0.26231205463409424,0.6991309523582458,-0.665137767791748,-0.6231518387794495,0.41137412190437317,0.6651715636253357,-0.6231518387794495,0.41137412190437317,0.6651715636253357,-0.6231518387794495,0.41137412190437317,0.6651715636253357,-0.6231518387794495,0.41137412190437317,0.6651715636253357,-0.583817720413208,0.46555060148239136,0.6651462912559509,-0.583817720413208,0.46555060148239136,0.6651462912559509,-0.583817720413208,0.46555060148239136,0.6651462912559509,-0.583817720413208,0.46555060148239136,0.6651462912559509,-0.23676739633083344,0.7287734746932983,-0.6425187587738037,-0.23676739633083344,0.7287734746932983,-0.6425187587738037,-0.23676739633083344,0.7287734746932983,-0.6425187587738037,-0.23676739633083344,0.7287734746932983,-0.6425187587738037,-0.6199446320533752,0.45038023591041565,0.6425155997276306,-0.6199446320533752,0.45038023591041565,0.6425155997276306,-0.6199446320533752,0.45038023591041565,0.6425155997276306,-0.6199446320533752,0.45038023591041565,0.6425155997276306,0.7459679841995239,0.03343930095434189,0.6651415824890137,0.7459679841995239,0.03343930095434189,0.6651415824890137,0.7459679841995239,0.03343930095434189,0.6651415824890137,0.7459679841995239,0.03343930095434189,0.6651415824890137,0.623174250125885,0.4114120602607727,-0.6651270389556885,0.623174250125885,0.4114120602607727,-0.6651270389556885,0.623174250125885,0.4114120602607727,-0.6651270389556885,0.623174250125885,0.4114120602607727,-0.6651270389556885,0.26233187317848206,0.6991434097290039,0.6651169061660767,0.26233187317848206,0.6991434097290039,0.6651169061660767,0.26233187317848206,0.6991434097290039,0.6651169061660767,0.26233187317848206,0.6991434097290039,0.6651169061660767,0.6199406385421753,0.45038270950317383,-0.6425178050994873,0.6199406385421753,0.45038270950317383,-0.6425178050994873,0.6199406385421753,0.45038270950317383,-0.6425178050994873,0.6199406385421753,0.45038270950317383,-0.6425178050994873,0.587073564529419,0.4265226125717163,-0.6880576610565186,0.587073564529419,0.4265226125717163,-0.6880576610565186,0.587073564529419,0.4265226125717163,-0.6880576610565186,0.587073564529419,0.4265226125717163,-0.6880576610565186,0.5838503241539001,0.4655469059944153,-0.6651202440261841,0.5838503241539001,0.4655469059944153,-0.6651202440261841,0.5838503241539001,0.4655469059944153,-0.6651202440261841,0.5838503241539001,0.4655469059944153,-0.6651202440261841,0.6231569647789001,-0.4114269018173218,-0.665134072303772,0.6231569647789001,-0.4114269018173218,-0.665134072303772,0.6231569647789001,-0.4114269018173218,-0.665134072303772,0.6231569647789001,-0.4114269018173218,-0.665134072303772,0.22424747049808502,0.6901424527168274,0.6880526542663574,0.22424747049808502,0.6901424527168274,0.6880526542663574,0.22424747049808502,0.6901424527168274,0.6880526542663574,0.22424747049808502,0.6901424527168274,0.6880526542663574,-0.2368125319480896,-0.7287622094154358,-0.6425150632858276,-0.2368125319480896,-0.7287622094154358,-0.6425150632858276,-0.2368125319480896,-0.7287622094154358,-0.6425150632858276,-0.2368125319480896,-0.7287622094154358,-0.6425150632858276,-0.2623360753059387,-0.6991369128227234,-0.6651220917701721,-0.2623360753059387,-0.6991369128227234,-0.6651220917701721,-0.2623360753059387,-0.6991369128227234,-0.6651220917701721,-0.2623360753059387,-0.6991369128227234,-0.6651220917701721,0.5870862603187561,-0.42650753259658813,-0.6880559921264648,0.5870862603187561,-0.42650753259658813,-0.6880559921264648,0.5870862603187561,-0.42650753259658813,-0.6880559921264648,0.5870862603187561,-0.42650753259658813,-0.6880559921264648,-0.19872358441352844,-0.7197949886322021,-0.6651346683502197,-0.19872358441352844,-0.7197949886322021,-0.6651346683502197,-0.19872358441352844,-0.7197949886322021,-0.6651346683502197,-0.19872358441352844,-0.7197949886322021,-0.6651346683502197,-0.623177170753479,-0.4114185571670532,0.6651203036308289,-0.623177170753479,-0.4114185571670532,0.6651203036308289,-0.623177170753479,-0.4114185571670532,0.6651203036308289,-0.623177170753479,-0.4114185571670532,0.6651203036308289,-0.6199068427085876,-0.45042937994003296,0.6425175666809082,-0.6199068427085876,-0.45042937994003296,0.6425175666809082,-0.6199068427085876,-0.45042937994003296,0.6425175666809082,-0.6199068427085876,-0.45042937994003296,0.6425175666809082,0.19873395562171936,-0.7197892069816589,0.6651378273963928,0.19873395562171936,-0.7197892069816589,0.6651378273963928,0.19873395562171936,-0.7197892069816589,0.6651378273963928,0.19873395562171936,-0.7197892069816589,0.6651378273963928,-0.5870490074157715,-0.42655661702156067,0.6880573630332947,-0.5870490074157715,-0.42655661702156067,0.6880573630332947,-0.5870490074157715,-0.42655661702156067,0.6880573630332947,-0.5870490074157715,-0.42655661702156067,0.6880573630332947,-0.7459824085235596,0.033452022820711136,-0.665124773979187,-0.7459824085235596,0.033452022820711136,-0.665124773979187,-0.7459824085235596,0.033452022820711136,-0.665124773979187,-0.7459824085235596,0.033452022820711136,-0.665124773979187,0.5838494300842285,-0.4655435383319855,-0.665123462677002,0.5838494300842285,-0.4655435383319855,-0.665123462677002,0.5838494300842285,-0.4655435383319855,-0.665123462677002,0.5838494300842285,-0.4655435383319855,-0.665123462677002,0.2367572784423828,0.7287806272506714,0.6425143480300903,0.2367572784423828,0.7287806272506714,0.6425143480300903,0.2367572784423828,0.7287806272506714,0.6425143480300903,0.2367572784423828,0.7287806272506714,0.6425143480300903,-0.1987278163433075,0.7197844982147217,-0.6651448011398315,-0.1987278163433075,0.7197844982147217,-0.6651448011398315,-0.1987278163433075,0.7197844982147217,-0.6651448011398315,-0.1987278163433075,0.7197844982147217,-0.6651448011398315,0.23682300746440887,-0.7287558913230896,0.6425182819366455,0.23682300746440887,-0.7287558913230896,0.6425182819366455,0.23682300746440887,-0.7287558913230896,0.6425182819366455,0.23682300746440887,-0.7287558913230896,0.6425182819366455,-0.7662706971168518,0.000020429491996765137,-0.6425180435180664,-0.7662706971168518,0.000020429491996765137,-0.6425180435180664,-0.7662706971168518,0.000020429491996765137,-0.6425180435180664,-0.7662706971168518,0.000020429491996765137,-0.6425180435180664,-0.7459728717803955,-0.03343328833580017,-0.6651365756988525,-0.7459728717803955,-0.03343328833580017,-0.6651365756988525,-0.7459728717803955,-0.03343328833580017,-0.6651365756988525,-0.7459728717803955,-0.03343328833580017,-0.6651365756988525,-0.22426503896713257,-0.6901455521583557,-0.6880438327789307,-0.22426503896713257,-0.6901455521583557,-0.6880438327789307,-0.22426503896713257,-0.6901455521583557,-0.6880438327789307,-0.22426503896713257,-0.6901455521583557,-0.6880438327789307,-0.7256579995155334,-0.00003316998481750488,-0.6880554556846619,-0.7256579995155334,-0.00003316998481750488,-0.6880554556846619,-0.7256579995155334,-0.00003316998481750488,-0.6880554556846619,-0.7256579995155334,-0.00003316998481750488,-0.6880554556846619,-0.22427412867546082,0.6901446580886841,-0.6880418658256531,-0.22427412867546082,0.6901446580886841,-0.6880418658256531,-0.22427412867546082,0.6901446580886841,-0.6880418658256531,-0.22427412867546082,0.6901446580886841,-0.6880418658256531],\n \"normalized\": false\n },\n \"uv\": {\n \"itemSize\": 2,\n \"type\": \"Float32Array\",\n \"array\": [0.1126541942358017,0.23340463638305664,0.15771642327308655,0.010170280933380127,0.1696747988462448,0.09594517946243286,0.37625399231910706,0.5020440220832825,0.09763339906930923,0.23340469598770142,0.17146287858486176,0.012006521224975586,0.24126237630844116,0.007275700569152832,0.7849239706993103,0.19342201948165894,0.18520936369895935,0.026231110095977783,0.19948936998844147,0.1231493353843689,0.24126237630844116,0.11555743217468262,0.8759239912033081,0.2386530041694641,0.05257079377770424,0.23340463638305664,0.09763336926698685,0.010167598724365234,0.1696747988462448,0.08392536640167236,0.8759239912033081,0.0006530284881591797,0.015100483782589436,0.23340469598770142,0.17080335319042206,0.06890475749969482,0.21341374516487122,0.23143154382705688,0.4681450128555298,0.19335603713989258,0.09020465612411499,0.23340463638305664,0.16530834138393402,0.016166627407073975,0.22733810544013977,0.11358428001403809,0.9650390148162842,0.44349002838134766,0.022529248148202896,0.010164380073547363,0.09020490944385529,0.010167598724365234,0.176739901304245,0.08622092008590698,0.8740389943122864,0.2507209777832031,0.17146287858486176,0.018639087677001953,0.22100581228733063,0.11555743217468262,0.23493003845214844,0.005302548408508301,0.6253309845924377,0.739175021648407,0.15028777718544006,0.23340463638305664,0.18520939350128174,0.018639087677001953,0.2412623167037964,0.23143154382705688,0.46857601404190063,0.4435969591140747,0.06016269698739052,0.010176539421081543,0.179232656955719,0.2314314842224121,0.18520936369895935,0.05468016862869263,0.5344629883766174,0.1933860182762146,0.11265438795089722,0.010173439979553223,0.16530834138393402,0.12512201070785522,0.18389028310775757,0.06890475749969482,0.46725401282310486,0.6948130130767822,0.15771642327308655,0.23340457677841187,0.1790548413991928,0.01447904109954834,0.1855650693178177,0.12512195110321045,0.28525400161743164,0.6948130130767822,0.17923292517662048,0.12314879894256592,0.18520939350128174,0.012006521224975586,0.2349299192428589,0.23340469598770142,0.6254630088806152,0.23861700296401978,0.1653086096048355,0.23340469598770142,0.18520936369895935,0.06131279468536377,0.1855650693178177,0.23340469598770142,0.37625399231910706,0.7400439977645874,0.05257079377770424,0.01016455888748169,0.17146287858486176,0.032863736152648926,0.19948936998844147,0.23143154382705688,0.9669240117073059,0.19342201948165894,0.14269573986530304,0.010170340538024902,0.18520936369895935,0.032863736152648926,0.19315698742866516,0.12512242794036865,0.21655499935150146,0.6933860182762146,0.04514260217547417,0.01016455888748169,0.16530832648277283,0.02870357036590576,0.21341368556022644,0.007275700569152832,0.2865760028362274,0.4435969591140747,0.12555499374866486,0.7386170029640198,0.17146287858486176,0.026231110095977783,0.1931571662425995,0.23340469598770142,0.2070813775062561,0.005302548408508301,0.12555499374866486,0.5006170272827148,0.12767508625984192,0.010170459747314453,0.14269573986530304,0.23340463638305664,0.16530832648277283,0.109546959400177,0.03455499932169914,0.6933860182762146,0.12767508625984192,0.23340463638305664,0.17146290838718414,0.040455639362335205,0.2070814073085785,0.11358422040939331,0.1352669894695282,0.010170340538024902,0.17905481159687042,0.028703629970550537,0.23493003845214844,0.11358428001403809,0.5343310236930847,0.693943977355957,0.04514192417263985,0.23340457677841187,0.1502876579761505,0.010170280933380127,0.16530834138393402,0.089935302734375,0.37757599353790283,0.2508280277252197,0.12430000305175781,0.48809099197387695,0.16530832648277283,0.07261902093887329,0.19948936998844147,0.11555695533752441,0.20708149671554565,0.23340469598770142,0.0301218219101429,0.23340463638305664,0.17146289348602295,0.06131279468536377,0.2070813775062561,0.1251225471496582,0.2153010070323944,0.4428600072860718,0.08261273801326752,0.23340463638305664,0.13526709377765656,0.23340463638305664,0.16967478394508362,0.11555695533752441,0.6253309845924377,0.5011749863624573,0.03330099955201149,0.4428600072860718,0.07518399506807327,0.010167300701141357,0.17905481159687042,0.042928099632263184,0.19948936998844147,0.007275700569152832,0.10522530972957611,0.010173439979553223,0.18389026820659637,0.07633346319198608,0.22100578248500824,0.23143154382705688,0.28614500164985657,0.19335603713989258,0.17146289348602295,0.05468016862869263,0.21341368556022644,0.12314939498901367,0.2210056483745575,0.1231493353843689,0.377144992351532,0.23858702182769775,0.02252865955233574,0.23340469598770142,0.17080335319042206,0.07633340358734131,0.19315703213214874,0.11358380317687988,0.7830389738082886,0.44349002838134766,0.015100372023880482,0.010164380073547363,0.10522563755512238,0.23340463638305664,0.1767398715019226,0.09364962577819824,0.377144992351532,0.0005869865417480469,0.0675920695066452,0.010176539421081543,0.17164073884487152,0.23143154382705688,0.17905481159687042,0.05884033441543579,0.7172229886054993,0.4428600072860718,0.08261273801326752,0.010167300701141357,0.18520936369895935,0.04708826541900635,0.2210056483745575,0.007276654243469238,0.7163310050964355,0.693943977355957,0.17146290838718414,0.04708826541900635,0.21341368556022644,0.11555737257003784,0.2412623167037964,0.12314939498901367,0.37757599353790283,0.48882800340652466,0.12024644762277603,0.23340463638305664,0.16530834138393402,0.044615745544433594,0.23493006825447083,0.1251225471496582,0.716463029384613,0.1933860182762146,0.18520936369895935,0.040455639362335205,0.19315698742866516,0.005302488803863525,0.22733810544013977,0.005303502082824707,0.8740389943122864,0.48872101306915283,0.17164073884487152,0.1231488585472107,0.17839525640010834,0.07261908054351807,0.2273380160331726,0.23340463638305664,0.6262230277061462,0.48809099197387695,0.037550006061792374,0.23340463638305664,0.16530834138393402,0.057152748107910156,0.2273380160331726,0.12512242794036865,0.5352230072021484,0.4428600072860718,0.030121158808469772,0.010164439678192139,0.07518427819013596,0.23340463638305664,0.12430000305175781,0.25009095668792725,0.176739901304245,0.11326134204864502,0.037550006061792374,0.010164439678192139,0.0675920695066452,0.23340457677841187,0.176739901304245,0.10583275556564331,0.6262230277061462,0.25009095668792725,0.06016361340880394,0.23340463638305664,0.12024631351232529,0.010170459747314453,0.16967478394508362,0.10353708267211914,0.6254630088806152,0.0006170272827148438],\n \"normalized\": false\n },\n \"color\": {\n \"itemSize\": 4,\n \"type\": \"Uint16Array\",\n \"array\": [65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535],\n \"normalized\": true\n }\n },\n \"index\": {\n \"type\": \"Uint16Array\",\n \"array\": [23,115,139,123,147,143,19,107,111,35,67,131,59,7,11,95,100,88,63,76,68,135,39,51,127,83,31,4,25,20,82,6,30,97,60,80,62,58,9,22,126,29,94,18,109,37,46,48,0,104,117,44,85,32,66,79,129,124,149,96,114,103,137,156,120,36,146,106,142,24,16,112,34,134,50,152,92,144,77,157,132,41,121,140,102,125,136,5,21,28,61,8,81,69,65,57,78,133,128,45,33,49,53,38,122,42,141,105,93,108,145,89,113,17,98,151,154,43,47,55,12,64,84,86,118,26,23,27,115,123,155,147,19,119,107,35,87,67,59,15,7,95,150,100,63,72,76,135,159,39,127,99,83,4,13,25,82,10,6,97,74,60,62,70,58,22,138,126,94,91,18,37,54,46,0,40,104,44,1,85,66,71,79,124,101,149,114,90,103,156,153,120,146,110,106,24,116,16,34,130,134,152,148,92,77,73,157,41,52,121,158,75,154,75,98,154,43,3,47,12,56,64,26,14,86,86,2,118]\n },\n \"boundingSphere\": {\n \"center\": [0,-0.006313323974609375,0],\n \"radius\": 148.14155442794186\n }\n },\n faceValues: [1, 2, 5, 10, 7, 4, 3, 8, 9, 6],\n rotationCombinations: {\n \"1,2\": [180, 0, 36],\n \"1,3\": [0, 0, -144],\n \"1,4\": [-180, 0, -108],\n \"1,5\": [0, 0, 144],\n \"1,6\": [180, 0, -36],\n \"1,7\": [0, 0, -72],\n \"1,8\": [180, 0, 108],\n \"1,9\": [0, 0, 72],\n \"1,10\": [-180, 0, 180],\n \"2,3\": [180, 0, -108],\n \"2,4\": [0, 0, -144],\n \"2,5\": [-180, 0, -180],\n \"2,6\": [0, 0, -72],\n \"2,7\": [180, 0, -36],\n \"2,8\": [0, 0, 72],\n \"2,9\": [-180, 0, 108],\n \"2,10\": [0, 0, 144],\n \"3,4\": [-180, 0, 108],\n \"3,5\": [0, 0, -72],\n \"3,6\": [-180, 0, 180],\n \"3,7\": [0, 0, 72],\n \"3,8\": [180, 0, -36],\n \"3,9\": [0, 0, -144],\n \"3,10\": [180, 0, 36],\n \"4,5\": [180, 0, 36],\n \"4,6\": [0, 0, 72],\n \"4,7\": [-180, 0, -180],\n \"4,8\": [0, 0, -144],\n \"4,9\": [180, 0, -36],\n \"4,10\": [0, 0, -72],\n \"5,6\": [180, 0, 108],\n \"5,7\": [0, 0, 144],\n \"5,8\": [-180, 0, -108],\n \"5,9\": [0, 0, -72],\n \"5,10\": [180, 0, -36],\n \"6,7\": [180, 0, -108],\n \"6,8\": [0, 0, 144],\n \"6,9\": [-180, 0, 36],\n \"6,10\": [0, 0, -144],\n \"7,8\": [180, 0, 36],\n \"7,9\": [0, 0, 144],\n \"7,10\": [-180, 0, 108],\n \"8,9\": [-180, 0, 180],\n \"8,10\": [0, 0, 72],\n \"9,10\": [180, 0, -108]\n\n }\n },\n \"d12\": {\n \"metadata\": {\n \"version\": 4.5,\n \"type\": \"BufferGeometry\",\n \"generator\": \"BufferGeometry.toJSON\"\n },\n \"uuid\": \"04389FAB-5CCD-4FEC-B604-C19AD1000B1C\",\n \"type\": \"BufferGeometry\",\n \"data\": {\n \"attributes\": {\n \"position\": {\n \"itemSize\": 3,\n \"type\": \"Float32Array\",\n \"array\": [-31.141719818115234, 83.4803466796875, -1.2052193880081177, -31.141719818115234, 83.4803466796875, -1.2052193880081177, -31.141719818115234, 83.4803466796875, -1.2052193880081177, -31.141719818115234, 83.4803466796875, -1.2052193880081177, 83.48023223876953, -1.2053337097167969, -31.14202308654785, 83.48023223876953, -1.2053337097167969, -31.14202308654785, 83.48023223876953, -1.2053337097167969, -31.14202308654785, 83.48023223876953, -1.2053337097167969, -31.14202308654785, 83.48045349121094, -1.2053337097167969, 31.141408920288086, 83.48045349121094, -1.2053337097167969, 31.141408920288086, 83.48045349121094, -1.2053337097167969, 31.141408920288086, 83.48045349121094, -1.2053337097167969, 31.141408920288086, -82.73528289794922, 0, 33.09229278564453, -82.73528289794922, 0, 33.09229278564453, -82.73528289794922, 0, 33.09229278564453, -82.73528289794922, 0, 33.09229278564453, 51.59387969970703, 50.38835906982422, 52.338436126708984, 51.59387969970703, 50.38835906982422, 52.338436126708984, 51.59387969970703, 50.38835906982422, 52.338436126708984, 51.59387969970703, 50.38835906982422, 52.338436126708984, 50.3885498046875, 52.338626861572266, 51.593505859375, 50.3885498046875, 52.338626861572266, 51.593505859375, 50.3885498046875, 52.338626861572266, 51.593505859375, 50.3885498046875, 52.338626861572266, 51.593505859375, -31.141712188720703, 83.4803466796875, 1.2054481506347656, -31.141712188720703, 83.4803466796875, 1.2054481506347656, -31.141712188720703, 83.4803466796875, 1.2054481506347656, -31.141712188720703, 83.4803466796875, 1.2054481506347656, 83.48023223876953, 1.2053337097167969, -31.14202308654785, 83.48023223876953, 1.2053337097167969, -31.14202308654785, 83.48023223876953, 1.2053337097167969, -31.14202308654785, 83.48023223876953, 1.2053337097167969, -31.14202308654785, -83.48045349121094, -1.2053337097167969, -31.141408920288086, -83.48045349121094, -1.2053337097167969, -31.141408920288086, -83.48045349121094, -1.2053337097167969, -31.141408920288086, -83.48045349121094, -1.2053337097167969, -31.141408920288086, -51.59387969970703, -50.38835906982422, -52.338436126708984, -51.59387969970703, -50.38835906982422, -52.338436126708984, -51.59387969970703, -50.38835906982422, -52.338436126708984, -51.59387969970703, -50.38835906982422, -52.338436126708984, -1.205640435218811, 31.14171600341797, -83.48033142089844, -1.205640435218811, 31.14171600341797, -83.48033142089844, -1.205640435218811, 31.14171600341797, -83.48033142089844, -1.205640435218811, 31.14171600341797, -83.48033142089844, -1.205640435218811, -31.14171600341797, -83.48033142089844, -1.205640435218811, -31.14171600341797, -83.48033142089844, -1.205640435218811, -31.14171600341797, -83.48033142089844, -1.205640435218811, -31.14171600341797, -83.48033142089844, 1.2050271034240723, 31.14171600341797, -83.48035430908203, 1.2050271034240723, 31.14171600341797, -83.48035430908203, 1.2050271034240723, 31.14171600341797, -83.48035430908203, 1.2050271034240723, 31.14171600341797, -83.48035430908203, -83.48045349121094, 1.2053337097167969, -31.141408920288086, -83.48045349121094, 1.2053337097167969, -31.141408920288086, -83.48045349121094, 1.2053337097167969, -31.141408920288086, -83.48045349121094, 1.2053337097167969, -31.141408920288086, -83.48023223876953, 1.2053337097167969, 31.14202308654785, -83.48023223876953, 1.2053337097167969, 31.14202308654785, -83.48023223876953, 1.2053337097167969, 31.14202308654785, -83.48023223876953, 1.2053337097167969, 31.14202308654785, -50.38816833496094, -52.338626861572266, 51.593875885009766, -50.38816833496094, -52.338626861572266, 51.593875885009766, -50.38816833496094, -52.338626861572266, 51.593875885009766, -50.38816833496094, -52.338626861572266, 51.593875885009766, 31.141712188720703, 83.4803466796875, -1.2054481506347656, 31.141712188720703, 83.4803466796875, -1.2054481506347656, 31.141712188720703, 83.4803466796875, -1.2054481506347656, 31.141712188720703, 83.4803466796875, -1.2054481506347656, -50.3885498046875, 52.338626861572266, -51.593505859375, -50.3885498046875, 52.338626861572266, -51.593505859375, -50.3885498046875, 52.338626861572266, -51.593505859375, -50.3885498046875, 52.338626861572266, -51.593505859375, 50.38816833496094, 52.338626861572266, -51.593875885009766, 50.38816833496094, 52.338626861572266, -51.593875885009766, 50.38816833496094, 52.338626861572266, -51.593875885009766, 50.38816833496094, 52.338626861572266, -51.593875885009766, -0.000303904089378193, 33.09198760986328, -82.73540496826172, -0.000303904089378193, 33.09198760986328, -82.73540496826172, -0.000303904089378193, 33.09198760986328, -82.73540496826172, -0.000303904089378193, 33.09198760986328, -82.73540496826172, 82.73552703857422, 0, 33.0916862487793, 82.73552703857422, 0, 33.0916862487793, 82.73552703857422, 0, 33.0916862487793, 82.73552703857422, 0, 33.0916862487793, 52.338809967041016, -51.59368896484375, 50.38816833496094, 52.338809967041016, -51.59368896484375, 50.38816833496094, 52.338809967041016, -51.59368896484375, 50.38816833496094, 52.338809967041016, -51.59368896484375, 50.38816833496094, 83.48045349121094, 1.2053337097167969, 31.141408920288086, 83.48045349121094, 1.2053337097167969, 31.141408920288086, 83.48045349121094, 1.2053337097167969, 31.141408920288086, 83.48045349121094, 1.2053337097167969, 31.141408920288086, 52.33843994140625, -51.59368896484375, -50.3885498046875, 52.33843994140625, -51.59368896484375, -50.3885498046875, 52.33843994140625, -51.59368896484375, -50.3885498046875, 52.33843994140625, -51.59368896484375, -50.3885498046875, 51.593502044677734, -50.38835906982422, -52.33881759643555, 51.593502044677734, -50.38835906982422, -52.33881759643555, 51.593502044677734, -50.38835906982422, -52.33881759643555, 51.593502044677734, -50.38835906982422, -52.33881759643555, 82.73528289794922, 0, -33.09229278564453, 82.73528289794922, 0, -33.09229278564453, 82.73528289794922, 0, -33.09229278564453, 82.73528289794922, 0, -33.09229278564453, 33.09198760986328, -82.73540496826172, -0.00012155366130173206, 33.09198760986328, -82.73540496826172, -0.00012155366130173206, 33.09198760986328, -82.73540496826172, -0.00012155366130173206, 33.09198760986328, -82.73540496826172, -0.00012155366130173206, -1.2050271034240723, -31.14171600341797, 83.48035430908203, -1.2050271034240723, -31.14171600341797, 83.48035430908203, -1.2050271034240723, -31.14171600341797, 83.48035430908203, -1.2050271034240723, -31.14171600341797, 83.48035430908203, -1.2050271034240723, 31.14171600341797, 83.48035430908203, -1.2050271034240723, 31.14171600341797, 83.48035430908203, -1.2050271034240723, 31.14171600341797, 83.48035430908203, -1.2050271034240723, 31.14171600341797, 83.48035430908203, -52.33843994140625, -51.59368896484375, 50.3885498046875, -52.33843994140625, -51.59368896484375, 50.3885498046875, -52.33843994140625, -51.59368896484375, 50.3885498046875, -52.33843994140625, -51.59368896484375, 50.3885498046875, -51.593502044677734, -50.38835906982422, 52.33881759643555, -51.593502044677734, -50.38835906982422, 52.33881759643555, -51.593502044677734, -50.38835906982422, 52.33881759643555, -51.593502044677734, -50.38835906982422, 52.33881759643555, -51.593502044677734, 50.38835906982422, 52.33881759643555, -51.593502044677734, 50.38835906982422, 52.33881759643555, -51.593502044677734, 50.38835906982422, 52.33881759643555, -51.593502044677734, 50.38835906982422, 52.33881759643555, -52.33843994140625, 51.59368896484375, 50.3885498046875, -52.33843994140625, 51.59368896484375, 50.3885498046875, -52.33843994140625, 51.59368896484375, 50.3885498046875, -52.33843994140625, 51.59368896484375, 50.3885498046875, 0.000303904089378193, 33.09198760986328, 82.73540496826172, 0.000303904089378193, 33.09198760986328, 82.73540496826172, 0.000303904089378193, 33.09198760986328, 82.73540496826172, 0.000303904089378193, 33.09198760986328, 82.73540496826172, 52.338809967041016, 51.59368896484375, 50.38816833496094, 52.338809967041016, 51.59368896484375, 50.38816833496094, 52.338809967041016, 51.59368896484375, 50.38816833496094, 52.338809967041016, 51.59368896484375, 50.38816833496094, 1.205640435218811, -31.14171600341797, 83.48033142089844, 1.205640435218811, -31.14171600341797, 83.48033142089844, 1.205640435218811, -31.14171600341797, 83.48033142089844, 1.205640435218811, -31.14171600341797, 83.48033142089844, -33.09198760986328, 82.73540496826172, 0.00012155366130173206, -33.09198760986328, 82.73540496826172, 0.00012155366130173206, -33.09198760986328, 82.73540496826172, 0.00012155366130173206, -33.09198760986328, 82.73540496826172, 0.00012155366130173206, -50.38816833496094, 52.338626861572266, 51.593875885009766, -50.38816833496094, 52.338626861572266, 51.593875885009766, -50.38816833496094, 52.338626861572266, 51.593875885009766, -50.38816833496094, 52.338626861572266, 51.593875885009766, 51.593502044677734, 50.38835906982422, -52.33881759643555, 51.593502044677734, 50.38835906982422, -52.33881759643555, 51.593502044677734, 50.38835906982422, -52.33881759643555, 51.593502044677734, 50.38835906982422, -52.33881759643555, -52.338809967041016, -51.59368896484375, -50.38816833496094, -52.338809967041016, -51.59368896484375, -50.38816833496094, -52.338809967041016, -51.59368896484375, -50.38816833496094, -52.338809967041016, -51.59368896484375, -50.38816833496094, -33.09198760986328, -82.73540496826172, 0.00012155366130173206, -33.09198760986328, -82.73540496826172, 0.00012155366130173206, -33.09198760986328, -82.73540496826172, 0.00012155366130173206, -33.09198760986328, -82.73540496826172, 0.00012155366130173206, -83.48023223876953, -1.2053337097167969, 31.14202308654785, -83.48023223876953, -1.2053337097167969, 31.14202308654785, -83.48023223876953, -1.2053337097167969, 31.14202308654785, -83.48023223876953, -1.2053337097167969, 31.14202308654785, -50.3885498046875, -52.338626861572266, -51.593505859375, -50.3885498046875, -52.338626861572266, -51.593505859375, -50.3885498046875, -52.338626861572266, -51.593505859375, -50.3885498046875, -52.338626861572266, -51.593505859375, -0.000303904089378193, -33.09198760986328, -82.73540496826172, -0.000303904089378193, -33.09198760986328, -82.73540496826172, -0.000303904089378193, -33.09198760986328, -82.73540496826172, -0.000303904089378193, -33.09198760986328, -82.73540496826172, 50.38816833496094, -52.338626861572266, -51.593875885009766, 50.38816833496094, -52.338626861572266, -51.593875885009766, 50.38816833496094, -52.338626861572266, -51.593875885009766, 50.38816833496094, -52.338626861572266, -51.593875885009766, 31.141719818115234, -83.4803466796875, 1.2052193880081177, 31.141719818115234, -83.4803466796875, 1.2052193880081177, 31.141719818115234, -83.4803466796875, 1.2052193880081177, 31.141719818115234, -83.4803466796875, 1.2052193880081177, -31.141719818115234, -83.4803466796875, -1.2052193880081177, -31.141719818115234, -83.4803466796875, -1.2052193880081177, -31.141719818115234, -83.4803466796875, -1.2052193880081177, -31.141719818115234, -83.4803466796875, -1.2052193880081177, 1.2050271034240723, -31.14171600341797, -83.48035430908203, 1.2050271034240723, -31.14171600341797, -83.48035430908203, 1.2050271034240723, -31.14171600341797, -83.48035430908203, 1.2050271034240723, -31.14171600341797, -83.48035430908203, -52.338809967041016, 51.59368896484375, -50.38816833496094, -52.338809967041016, 51.59368896484375, -50.38816833496094, -52.338809967041016, 51.59368896484375, -50.38816833496094, -52.338809967041016, 51.59368896484375, -50.38816833496094, -31.141712188720703, -83.4803466796875, 1.2054481506347656, -31.141712188720703, -83.4803466796875, 1.2054481506347656, -31.141712188720703, -83.4803466796875, 1.2054481506347656, -31.141712188720703, -83.4803466796875, 1.2054481506347656, 31.141719818115234, 83.4803466796875, 1.2052193880081177, 31.141719818115234, 83.4803466796875, 1.2052193880081177, 31.141719818115234, 83.4803466796875, 1.2052193880081177, 31.141719818115234, 83.4803466796875, 1.2052193880081177, 33.09198760986328, 82.73540496826172, -0.00012155366130173206, 33.09198760986328, 82.73540496826172, -0.00012155366130173206, 33.09198760986328, 82.73540496826172, -0.00012155366130173206, 33.09198760986328, 82.73540496826172, -0.00012155366130173206, 31.141712188720703, -83.4803466796875, -1.2054481506347656, 31.141712188720703, -83.4803466796875, -1.2054481506347656, 31.141712188720703, -83.4803466796875, -1.2054481506347656, 31.141712188720703, -83.4803466796875, -1.2054481506347656, 1.205640435218811, 31.14171600341797, 83.48033142089844, 1.205640435218811, 31.14171600341797, 83.48033142089844, 1.205640435218811, 31.14171600341797, 83.48033142089844, 1.205640435218811, 31.14171600341797, 83.48033142089844, 0.000303904089378193, -33.09198760986328, 82.73540496826172, 0.000303904089378193, -33.09198760986328, 82.73540496826172, 0.000303904089378193, -33.09198760986328, 82.73540496826172, 0.000303904089378193, -33.09198760986328, 82.73540496826172, -82.73552703857422, 0, -33.0916862487793, -82.73552703857422, 0, -33.0916862487793, -82.73552703857422, 0, -33.0916862487793, -82.73552703857422, 0, -33.0916862487793, -51.59387969970703, 50.38835906982422, -52.338436126708984, -51.59387969970703, 50.38835906982422, -52.338436126708984, -51.59387969970703, 50.38835906982422, -52.338436126708984, -51.59387969970703, 50.38835906982422, -52.338436126708984, 52.33843994140625, 51.59368896484375, -50.3885498046875, 52.33843994140625, 51.59368896484375, -50.3885498046875, 52.33843994140625, 51.59368896484375, -50.3885498046875, 52.33843994140625, 51.59368896484375, -50.3885498046875, 51.59387969970703, -50.38835906982422, 52.338436126708984, 51.59387969970703, -50.38835906982422, 52.338436126708984, 51.59387969970703, -50.38835906982422, 52.338436126708984, 51.59387969970703, -50.38835906982422, 52.338436126708984, 50.3885498046875, -52.338626861572266, 51.593505859375, 50.3885498046875, -52.338626861572266, 51.593505859375, 50.3885498046875, -52.338626861572266, 51.593505859375, 50.3885498046875, -52.338626861572266, 51.593505859375],\n \"normalized\": false\n },\n \"normal\": {\n \"itemSize\": 3,\n \"type\": \"Float32Array\",\n \"array\": [-0.010959841310977936, 0.8584385514259338, -0.5127993226051331, -0.010959841310977936, 0.8584385514259338, -0.5127993226051331, -0.010959841310977936, 0.8584385514259338, -0.5127993226051331, -0.010959841310977936, 0.8584385514259338, -0.5127993226051331, 0.8584375977516174, -0.5128011703491211, -0.010949048213660717, 0.8584375977516174, -0.5128011703491211, -0.010949048213660717, 0.8584375977516174, -0.5128011703491211, -0.010949048213660717, 0.8584375977516174, -0.5128011703491211, -0.010949048213660717, 0.8584346175193787, -0.5128057599067688, 0.010964557528495789, 0.8584346175193787, -0.5128057599067688, 0.010964557528495789, 0.8584346175193787, -0.5128057599067688, 0.010964557528495789, 0.8584346175193787, -0.5128057599067688, 0.010964557528495789, -0.5414749979972839, -0.00002707540988922119, 0.8407168388366699, -0.5414749979972839, -0.00002707540988922119, 0.8407168388366699, -0.5414749979972839, -0.00002707540988922119, 0.8407168388366699, -0.5414749979972839, -0.00002707540988922119, 0.8407168388366699, 0.5305333137512207, 0.017743051052093506, 0.8474783301353455, 0.5305333137512207, 0.017743051052093506, 0.8474783301353455, 0.5305333137512207, 0.017743051052093506, 0.8474783301353455, 0.5305333137512207, 0.017743051052093506, 0.8474783301353455, 0.01774728298187256, 0.8474791646003723, 0.5305318236351013, 0.01774728298187256, 0.8474791646003723, 0.5305318236351013, 0.01774728298187256, 0.8474791646003723, 0.5305318236351013, 0.01774728298187256, 0.8474791646003723, 0.5305318236351013, -0.010942935943603516, 0.8584372997283936, 0.5128018856048584, -0.010942935943603516, 0.8584372997283936, 0.5128018856048584, -0.010942935943603516, 0.8584372997283936, 0.5128018856048584, -0.010942935943603516, 0.8584372997283936, 0.5128018856048584, 0.8584451079368591, 0.5127884149551392, -0.01095967274159193, 0.8584451079368591, 0.5127884149551392, -0.01095967274159193, 0.8584451079368591, 0.5127884149551392, -0.01095967274159193, 0.8584451079368591, 0.5127884149551392, -0.01095967274159193, -0.8584290742874146, -0.512814462184906, -0.010995045304298401, -0.8584290742874146, -0.512814462184906, -0.010995045304298401, -0.8584290742874146, -0.512814462184906, -0.010995045304298401, -0.8584290742874146, -0.512814462184906, -0.010995045304298401, -0.5305572152137756, -0.017733842134475708, -0.8474634885787964, -0.5305572152137756, -0.017733842134475708, -0.8474634885787964, -0.5305572152137756, -0.017733842134475708, -0.8474634885787964, -0.5305572152137756, -0.017733842134475708, -0.8474634885787964, -0.5128048658370972, 0.010960124433040619, -0.8584352135658264, -0.5128048658370972, 0.010960124433040619, -0.8584352135658264, -0.5128048658370972, 0.010960124433040619, -0.8584352135658264, -0.5128048658370972, 0.010960124433040619, -0.8584352135658264, -0.5128147006034851, -0.010991238057613373, -0.858428955078125, -0.5128147006034851, -0.010991238057613373, -0.858428955078125, -0.5128147006034851, -0.010991238057613373, -0.858428955078125, -0.5128147006034851, -0.010991238057613373, -0.858428955078125, 0.5127923488616943, 0.010975174605846405, -0.8584426045417786, 0.5127923488616943, 0.010975174605846405, -0.8584426045417786, 0.5127923488616943, 0.010975174605846405, -0.8584426045417786, 0.5127923488616943, 0.010975174605846405, -0.8584426045417786, -0.8584410548210144, 0.512795627117157, -0.010933354496955872, -0.8584410548210144, 0.512795627117157, -0.010933354496955872, -0.8584410548210144, 0.512795627117157, -0.010933354496955872, -0.8584410548210144, 0.512795627117157, -0.010933354496955872, -0.8584320545196533, 0.5128099322319031, 0.01097819209098816, -0.8584320545196533, 0.5128099322319031, 0.01097819209098816, -0.8584320545196533, 0.5128099322319031, 0.01097819209098816, -0.8584320545196533, 0.5128099322319031, 0.01097819209098816, -0.01773303747177124, -0.8474655151367188, 0.5305542349815369, -0.01773303747177124, -0.8474655151367188, 0.5305542349815369, -0.01773303747177124, -0.8474655151367188, 0.5305542349815369, -0.01773303747177124, -0.8474655151367188, 0.5305542349815369, 0.010984241962432861, 0.8584214448928833, -0.5128273963928223, 0.010984241962432861, 0.8584214448928833, -0.5128273963928223, 0.010984241962432861, 0.8584214448928833, -0.5128273963928223, 0.010984241962432861, 0.8584214448928833, -0.5128273963928223, -0.017747551202774048, 0.847478985786438, -0.5305322408676147, -0.017747551202774048, 0.847478985786438, -0.5305322408676147, -0.017747551202774048, 0.847478985786438, -0.5305322408676147, -0.017747551202774048, 0.847478985786438, -0.5305322408676147, 0.017701515927910805, 0.8474764823913574, -0.5305377244949341, 0.017701515927910805, 0.8474764823913574, -0.5305377244949341, 0.017701515927910805, 0.8474764823913574, -0.5305377244949341, 0.017701515927910805, 0.8474764823913574, -0.5305377244949341, -0.00002969801425933838, 0.840691328048706, -0.54151451587677, -0.00002969801425933838, 0.840691328048706, -0.54151451587677, -0.00002969801425933838, 0.840691328048706, -0.54151451587677, -0.00002969801425933838, 0.840691328048706, -0.54151451587677, 0.5415211915969849, 0.000026792287826538086, 0.840687096118927, 0.5415211915969849, 0.000026792287826538086, 0.840687096118927, 0.5415211915969849, 0.000026792287826538086, 0.840687096118927, 0.5415211915969849, 0.000026792287826538086, 0.840687096118927, 0.8474524617195129, -0.5305749177932739, 0.01773586869239807, 0.8474524617195129, -0.5305749177932739, 0.01773586869239807, 0.8474524617195129, -0.5305749177932739, 0.01773586869239807, 0.8474524617195129, -0.5305749177932739, 0.01773586869239807, 0.8584384322166443, 0.5127996206283569, 0.010955426841974258, 0.8584384322166443, 0.5127996206283569, 0.010955426841974258, 0.8584384322166443, 0.5127996206283569, 0.010955426841974258, 0.8584384322166443, 0.5127996206283569, 0.010955426841974258, 0.8474904298782349, -0.530514657497406, -0.01772182434797287, 0.8474904298782349, -0.530514657497406, -0.01772182434797287, 0.8474904298782349, -0.530514657497406, -0.01772182434797287, 0.8474904298782349, -0.530514657497406, -0.01772182434797287, 0.5305161476135254, -0.017740633338689804, -0.8474891185760498, 0.5305161476135254, -0.017740633338689804, -0.8474891185760498, 0.5305161476135254, -0.017740633338689804, -0.8474891185760498, 0.5305161476135254, -0.017740633338689804, -0.8474891185760498, 0.5414748787879944, -0.000005863606929779053, -0.8407169580459595, 0.5414748787879944, -0.000005863606929779053, -0.8407169580459595, 0.5414748787879944, -0.000005863606929779053, -0.8407169580459595, 0.5414748787879944, -0.000005863606929779053, -0.8407169580459595, 0.8406915068626404, -0.5415142774581909, -0.00000934302806854248, 0.8406915068626404, -0.5415142774581909, -0.00000934302806854248, 0.8406915068626404, -0.5415142774581909, -0.00000934302806854248, 0.8406915068626404, -0.5415142774581909, -0.00000934302806854248, -0.5128104090690613, -0.01098555326461792, 0.8584316372871399, -0.5128104090690613, -0.01098555326461792, 0.8584316372871399, -0.5128104090690613, -0.01098555326461792, 0.8584316372871399, -0.5128104090690613, -0.01098555326461792, 0.8584316372871399, -0.5128028988838196, 0.010992184281349182, 0.858436107635498, -0.5128028988838196, 0.010992184281349182, 0.858436107635498, -0.5128028988838196, 0.010992184281349182, 0.858436107635498, -0.5128028988838196, 0.010992184281349182, 0.858436107635498, -0.8474770188331604, -0.5305349826812744, 0.017758265137672424, -0.8474770188331604, -0.5305349826812744, 0.017758265137672424, -0.8474770188331604, -0.5305349826812744, 0.017758265137672424, -0.8474770188331604, -0.5305349826812744, 0.017758265137672424, -0.5305088758468628, -0.017743252217769623, 0.8474936485290527, -0.5305088758468628, -0.017743252217769623, 0.8474936485290527, -0.5305088758468628, -0.017743252217769623, 0.8474936485290527, -0.5305088758468628, -0.017743252217769623, 0.8474936485290527, -0.5305161476135254, 0.017740704119205475, 0.8474891781806946, -0.5305161476135254, 0.017740704119205475, 0.8474891781806946, -0.5305161476135254, 0.017740704119205475, 0.8474891781806946, -0.5305161476135254, 0.017740704119205475, 0.8474891781806946, -0.8474623560905457, 0.5305585861206055, 0.01774775981903076, -0.8474623560905457, 0.5305585861206055, 0.01774775981903076, -0.8474623560905457, 0.5305585861206055, 0.01774775981903076, -0.8474623560905457, 0.5305585861206055, 0.01774775981903076, 0.000029221177101135254, 0.8406913876533508, 0.5415146350860596, 0.000029221177101135254, 0.8406913876533508, 0.5415146350860596, 0.000029221177101135254, 0.8406913876533508, 0.5415146350860596, 0.000029221177101135254, 0.8406913876533508, 0.5415146350860596, 0.8474631309509277, 0.5305578112602234, 0.017742618918418884, 0.8474631309509277, 0.5305578112602234, 0.017742618918418884, 0.8474631309509277, 0.5305578112602234, 0.017742618918418884, 0.8474631309509277, 0.5305578112602234, 0.017742618918418884, 0.5128002166748047, -0.010964479297399521, 0.8584378957748413, 0.5128002166748047, -0.010964479297399521, 0.8584378957748413, 0.5128002166748047, -0.010964479297399521, 0.8584378957748413, 0.5128002166748047, -0.010964479297399521, 0.8584378957748413, -0.8407147526741028, 0.5414782166481018, 0.000009499490261077881, -0.8407147526741028, 0.5414782166481018, 0.000009499490261077881, -0.8407147526741028, 0.5414782166481018, 0.000009499490261077881, -0.8407147526741028, 0.5414782166481018, 0.000009499490261077881, -0.017701396718621254, 0.847476601600647, 0.530537486076355, -0.017701396718621254, 0.847476601600647, 0.530537486076355, -0.017701396718621254, 0.847476601600647, 0.530537486076355, -0.017701396718621254, 0.847476601600647, 0.530537486076355, 0.5305255055427551, 0.01773667335510254, -0.8474833369255066, 0.5305255055427551, 0.01773667335510254, -0.8474833369255066, 0.5305255055427551, 0.01773667335510254, -0.8474833369255066, 0.5305255055427551, 0.01773667335510254, -0.8474833369255066, -0.8474682569503784, -0.5305496454238892, -0.017742810770869255, -0.8474682569503784, -0.5305496454238892, -0.017742810770869255, -0.8474682569503784, -0.5305496454238892, -0.017742810770869255, -0.8474682569503784, -0.5305496454238892, -0.017742810770869255, -0.8406901359558105, -0.5415164232254028, 0.00003986060619354248, -0.8406901359558105, -0.5415164232254028, 0.00003986060619354248, -0.8406901359558105, -0.5415164232254028, 0.00003986060619354248, -0.8406901359558105, -0.5415164232254028, 0.00003986060619354248, -0.858434796333313, -0.5128055810928345, 0.010956216603517532, -0.858434796333313, -0.5128055810928345, 0.010956216603517532, -0.858434796333313, -0.5128055810928345, 0.010956216603517532, -0.858434796333313, -0.5128055810928345, 0.010956216603517532, -0.017747780308127403, -0.8474676012992859, -0.530550479888916, -0.017747780308127403, -0.8474676012992859, -0.530550479888916, -0.017747780308127403, -0.8474676012992859, -0.530550479888916, -0.017747780308127403, -0.8474676012992859, -0.530550479888916, 0.000033095479011535645, -0.8406911492347717, -0.5415149331092834, 0.000033095479011535645, -0.8406911492347717, -0.5415149331092834, 0.000033095479011535645, -0.8406911492347717, -0.5415149331092834, 0.000033095479011535645, -0.8406911492347717, -0.5415149331092834, 0.017742261290550232, -0.8474804759025574, -0.5305300354957581, 0.017742261290550232, -0.8474804759025574, -0.5305300354957581, 0.017742261290550232, -0.8474804759025574, -0.5305300354957581, 0.017742261290550232, -0.8474804759025574, -0.5305300354957581, 0.010982692241668701, -0.8584359288215637, 0.5128030776977539, 0.010982692241668701, -0.8584359288215637, 0.5128030776977539, 0.010982692241668701, -0.8584359288215637, 0.5128030776977539, 0.010982692241668701, -0.8584359288215637, 0.5128030776977539, -0.011000136844813824, -0.8584293127059937, -0.512813925743103, -0.011000136844813824, -0.8584293127059937, -0.512813925743103, -0.011000136844813824, -0.8584293127059937, -0.512813925743103, -0.011000136844813824, -0.8584293127059937, -0.512813925743103, 0.5127899050712585, -0.010951489210128784, -0.858444333076477, 0.5127899050712585, -0.010951489210128784, -0.858444333076477, 0.5127899050712585, -0.010951489210128784, -0.858444333076477, 0.5127899050712585, -0.010951489210128784, -0.858444333076477, -0.8474836945533752, 0.530524492263794, -0.017755359411239624, -0.8474836945533752, 0.530524492263794, -0.017755359411239624, -0.8474836945533752, 0.530524492263794, -0.017755359411239624, -0.8474836945533752, 0.530524492263794, -0.017755359411239624, -0.010949179530143738, -0.8584410548210144, 0.5127953290939331, -0.010949179530143738, -0.8584410548210144, 0.5127953290939331, -0.010949179530143738, -0.8584410548210144, 0.5127953290939331, -0.010949179530143738, -0.8584410548210144, 0.5127953290939331, 0.010959796607494354, 0.8584384918212891, 0.5127993226051331, 0.010959796607494354, 0.8584384918212891, 0.5127993226051331, 0.010959796607494354, 0.8584384918212891, 0.5127993226051331, 0.010959796607494354, 0.8584384918212891, 0.5127993226051331, 0.840688943862915, 0.5415182709693909, 0.0000023245811462402344, 0.840688943862915, 0.5415182709693909, 0.0000023245811462402344, 0.840688943862915, 0.5415182709693909, 0.0000023245811462402344, 0.840688943862915, 0.5415182709693909, 0.0000023245811462402344, 0.010956525802612305, -0.85843825340271, -0.512799859046936, 0.010956525802612305, -0.85843825340271, -0.512799859046936, 0.010956525802612305, -0.85843825340271, -0.512799859046936, 0.010956525802612305, -0.85843825340271, -0.512799859046936, 0.5128072500228882, 0.010947109200060368, 0.8584340214729309, 0.5128072500228882, 0.010947109200060368, 0.8584340214729309, 0.5128072500228882, 0.010947109200060368, 0.8584340214729309, 0.5128072500228882, 0.010947109200060368, 0.8584340214729309, -0.00002372264862060547, -0.8406915664672852, 0.5415141582489014, -0.00002372264862060547, -0.8406915664672852, 0.5415141582489014, -0.00002372264862060547, -0.8406915664672852, 0.5415141582489014, -0.00002372264862060547, -0.8406915664672852, 0.5415141582489014, -0.5415211319923401, 0.0000058785080909729, -0.8406871557235718, -0.5415211319923401, 0.0000058785080909729, -0.8406871557235718, -0.5415211319923401, 0.0000058785080909729, -0.8406871557235718, -0.5415211319923401, 0.0000058785080909729, -0.8406871557235718, -0.5305268168449402, 0.017754971981048584, -0.8474822044372559, -0.5305268168449402, 0.017754971981048584, -0.8474822044372559, -0.5305268168449402, 0.017754971981048584, -0.8474822044372559, -0.5305268168449402, 0.017754971981048584, -0.8474822044372559, 0.8474643230438232, 0.530555784702301, -0.017738506197929382, 0.8474643230438232, 0.530555784702301, -0.017738506197929382, 0.8474643230438232, 0.530555784702301, -0.017738506197929382, 0.8474643230438232, 0.530555784702301, -0.017738506197929382, 0.5305773615837097, -0.017735809087753296, 0.8474509716033936, 0.5305773615837097, -0.017735809087753296, 0.8474509716033936, 0.5305773615837097, -0.017735809087753296, 0.8474509716033936, 0.5305773615837097, -0.017735809087753296, 0.8474509716033936, 0.017751533538103104, -0.8474733233451843, 0.5305410623550415, 0.017751533538103104, -0.8474733233451843, 0.5305410623550415, 0.017751533538103104, -0.8474733233451843, 0.5305410623550415, 0.017751533538103104, -0.8474733233451843, 0.5305410623550415],\n \"normalized\": false\n },\n \"uv\": {\n \"itemSize\": 2,\n \"type\": \"Float32Array\",\n \"array\": [0.04446648806333542, 0.07376205921173096, 0.20145824551582336, 0.23582905530929565, 0.21539996564388275, 0.12743210792541504, 0.37534299492836, 0.25084298849105835, 0.04809992015361786, 0.08560597896575928, 0.057846054434776306, 0.11768478155136108, 0.1833210289478302, 0.12743109464645386, 0.7991840243339539, 0.7345119714736938, 0.04446648806333542, 0.10164541006088257, 0.05784609913825989, 0.009287774562835693, 0.1456916183233261, 0.009287774562835693, 0.9510290026664734, 0.7345119714736938, 0.029962755739688873, 0.009287834167480469, 0.08629150688648224, 0.11558711528778076, 0.16937947273254395, 0.23582905530929565, 0.29914700984954834, 0.9847790002822876, 0.09967105835676193, 0.11768478155136108, 0.12479200214147568, 0.5006319880485535, 0.13174988329410553, 0.06191825866699219, 0.14569158852100372, 0.23582911491394043, 0.10386674106121063, 0.11768478155136108, 0.1178082525730133, 0.12743109464645386, 0.12811647355556488, 0.059820473194122314, 0.2996180057525635, 0.7345709800720215, 0.04809992015361786, 0.07166439294815063, 0.1038665845990181, 0.12743091583251953, 0.2112043797969818, 0.12743210792541504, 0.4983850121498108, 0.5901579856872559, 0.04809992015361786, 0.08980154991149902, 0.04809992015361786, 0.1274309754371643, 0.06204163283109665, 0.11768478155136108, 0.9510089755058289, 0.23450398445129395, 0.04809992015361786, 0.11348932981491089, 0.07598327845335007, 0.11768478155136108, 0.11361270397901535, 0.11768472194671631, 0.24789699912071228, 0.8405579924583435, 0.1178082674741745, 0.009287655353546143, 0.15963312983512878, 0.23582905530929565, 0.2148379236459732, 0.11348950862884521, 0.7521880269050598, 0.34043699502944946, 0.04446648806333542, 0.04587888717651367, 0.22514608502388, 0.00928884744644165, 0.2390877902507782, 0.23582905530929565, 0.9978780150413513, 0.34043699502944946, 0.12811647355556488, 0.08770370483398438, 0.15963324904441833, 0.12743109464645386, 0.23908784985542297, 0.12743210792541504, 0.8750330209732056, 0.25118499994277954, 0.04809989035129547, 0.0437811017036438, 0.22934159636497498, 0.12743210792541504, 0.24328330159187317, 0.23582911491394043, 0.5490679740905762, 0.2342810034751892, 0.04446648806333542, 0.11558705568313599, 0.0717877745628357, 0.11768478155136108, 0.12755444645881653, 0.12743091583251953, 0.20090700685977936, 0.4844740033149719, 0.03415820747613907, 0.009287834167480469, 0.07178772985935211, 0.009287774562835693, 0.08992494642734528, 0.11768484115600586, 0.24783000349998474, 0.3400610089302063, 0.029962942004203796, 0.1274297833442688, 0.08629149198532104, 0.05982053279876709, 0.17357508838176727, 0.009289085865020752, 0.7481870055198669, 0.5902109742164612, 0.07598324865102768, 0.12743091583251953, 0.13174989819526672, 0.10374313592910767, 0.2153998762369156, 0.23582905530929565, 0.25249800086021423, 0.34009504318237305, 0.08629149198532104, 0.07376205921173096, 0.20145824551582336, 0.1274312138557434, 0.22934159636497498, 0.11768591403961182, 0.49818700551986694, 0.34009504318237305, 0.04446648806333542, 0.05982053279876709, 0.07598326355218887, 0.23582905530929565, 0.22514608502388, 0.23582905530929565, 0.29941999912261963, 0.48450803756713867, 0.04809989035129547, 0.04797661304473877, 0.2251461148262024, 0.12743210792541504, 0.22934159636497498, 0.009288787841796875, 0.45126500725746155, 0.48450803756713867, 0.04809992015361786, 0.0995476245880127, 0.14149606227874756, 0.009287774562835693, 0.14569158852100372, 0.12743109464645386, 0.24763700366020203, 0.5898839831352234, 0.08572941273450851, 0.23582905530929565, 0.12811647355556488, 0.04587888717651367, 0.1456916183233261, 0.11768472194671631, 0.9979509711265564, 0.5900989770889282, 0.04809992015361786, 0.10374313592910767, 0.062041595578193665, 0.009287774562835693, 0.14149613678455353, 0.12743109464645386, 0.7991650104522705, 0.23450398445129395, 0.08629149198532104, 0.04587888717651367, 0.18332113325595856, 0.23582911491394043, 0.2014583796262741, 0.11768490076065063, 0.7522619962692261, 0.5900989770889282, 0.08992491662502289, 0.0437811017036438, 0.18751657009124756, 0.23582905530929565, 0.23908784985542297, 0.11768591403961182, 0.6249899864196777, 0.0006160140037536621, 0.043904468417167664, 0.1274309754371643, 0.0444665253162384, 0.08770382404327393, 0.18751657009124756, 0.12743109464645386, 0.7478349804878235, 0.08986800909042358, 0.08572938293218613, 0.1274309754371643, 0.13174991309642792, 0.0758599042892456, 0.2014583796262741, 0.009289026260375977, 0.8751059770584106, 0.5008469820022583, 0.034158237278461456, 0.23582905530929565, 0.0899249017238617, 0.10374313592910767, 0.15543770790100098, 0.11768490076065063, 0.49791398644447327, 0.840366005897522, 0.020216554403305054, 0.1274297833442688, 0.13174991309642792, 0.11768472194671631, 0.15543778240680695, 0.009287893772125244, 0.3750689923763275, 0.751114010810852, 0.04913000017404556, 0.9849709868431091, 0.0899249017238617, 0.05772274732589722, 0.1693795919418335, 0.009289145469665527, 0.17357489466667175, 0.12743103504180908, 0.034158237278461456, 0.1274297833442688, 0.0899249017238617, 0.06191825866699219, 0.16937938332557678, 0.1274309754371643, 0.45099198818206787, 0.9847790002822876, 0.020216554403305054, 0.23582911491394043, 0.029962696135044098, 0.11768358945846558, 0.2148379534482956, 0.0995478630065918, 0.25222501158714294, 0.840366005897522, 0.034158363938331604, 0.11768358945846558, 0.09967107325792313, 0.23582905530929565, 0.12498500198125839, 0.2508090138435364, 0.2148379534482956, 0.10374337434768677, 0.016021236777305603, 0.1274297833442688, 0.10386674106121063, 0.009288907051086426, 0.12811647355556488, 0.11558699607849121, 0.2526949942111969, 0.5901579856872559, 0.1136128157377243, 0.12743109464645386, 0.13174988329410553, 0.05772268772125244, 0.14149603247642517, 0.23582905530929565, 0.7522420287132263, 0.09009099006652832, 0.020216554403305054, 0.009286701679229736, 0.04887000098824501, 0.734296977519989, 0.08629149198532104, 0.10164541006088257, 0.15963326394557953, 0.11768490076065063, 0.002139999996870756, 0.3400610089302063, 0.04809992015361786, 0.0758599042892456, 0.0996711403131485, 0.12743091583251953, 0.197262704372406, 0.23582911491394043, 0.016021013259887695, 0.23582905530929565, 0.1038665771484375, 0.23582905530929565, 0.21120451390743256, 0.1016455888748169, 0.37553998827934265, 0.5009059906005859, 0.043904371559619904, 0.23582905530929565, 0.04809992015361786, 0.05772274732589722, 0.22934159636497498, 0.23582905530929565, 0.7009119987487793, 0.2342810034751892, 0.057846151292324066, 0.23582905530929565, 0.11361275613307953, 0.009287714958190918, 0.12505200505256653, 0.7513059973716736, 0.2148379236459732, 0.11768490076065063, 0.0022070000413805246, 0.8405579924583435, 0.057846054434776306, 0.1274309754371643, 0.08629149198532104, 0.08770382404327393, 0.16937938332557678, 0.11768496036529541, 0.07598327845335007, 0.009287774562835693, 0.08992494642734528, 0.11348938941955566, 0.17357489466667175, 0.23582911491394043, 0.2009740024805069, 0.9849709868431091, 0.06204158067703247, 0.23582905530929565, 0.15543770790100098, 0.23582905530929565, 0.21120451390743256, 0.11558717489242554, 0.5491099953651428, 0.48442399501800537, 0.13174989819526672, 0.08560597896575928, 0.15543770790100098, 0.12743109464645386, 0.24328330159187317, 0.009288966655731201, 0.7009549736976624, 0.48442399501800537, 0.08992491662502289, 0.04797661304473877, 0.1972629427909851, 0.11768496036529541, 0.24328330159187317, 0.11768591403961182, 0.7478770017623901, 0.3400120139122009, 0.08992493152618408, 0.1274309754371643, 0.13174991309642792, 0.07166433334350586, 0.18751657009124756, 0.11768484115600586, 0.5024970173835754, 0.5902109742164612, 0.06204158067703247, 0.1274309754371643, 0.08992491662502289, 0.0898016095161438, 0.18332108855247498, 0.009287834167480469, 0.5021880269050598, 0.3400120139122009, 0.13174989819526672, 0.08980154991149902, 0.2390877902507782, 0.009288907051086426, 0.24328330159187317, 0.12743210792541504, 0.502144992351532, 0.08986800909042358, 0.049063000828027725, 0.4844740033149719, 0.0899249017238617, 0.07166439294815063, 0.12755438685417175, 0.23582905530929565, 0.19726276397705078, 0.1274312138557434, 0.08992491662502289, 0.08560603857040405, 0.17357507348060608, 0.11768496036529541, 0.18751657009124756, 0.009287834167480469, 0.6253420114517212, 0.5009589791297913, 0.1178082600235939, 0.23582905530929565, 0.13174989819526672, 0.0995476245880127, 0.2112043797969818, 0.23582905530929565, 0.4514620006084442, 0.7345709800720215, 0.07178780436515808, 0.1274309754371643, 0.11361271142959595, 0.23582905530929565, 0.12811647355556488, 0.10164541006088257, 0.8750870227813721, 0.0008389949798583984, 0.12811648845672607, 0.07376205921173096, 0.1833210289478302, 0.11768484115600586, 0.197262704372406, 0.009289026260375977, 0.6250330209732056, 0.25075995922088623, 0.0019470000406727195, 0.5898839831352234, 0.09967128932476044, 0.009288907051086426, 0.13174991309642792, 0.11348927021026611, 0.15963326394557953, 0.009287893772125244, 0.01602097600698471, 0.009286701679229736, 0.029962696135044098, 0.23582905530929565, 0.0899249017238617, 0.0995476245880127, 0.7012640237808228, 0.7346240282058716, 0.04809992015361786, 0.11768478155136108, 0.1178082674741745, 0.11768472194671631, 0.13174991309642792, 0.12743091583251953, 0.799111008644104, 0.4848499894142151, 0.0899249017238617, 0.0758599042892456, 0.13174991309642792, 0.23582911491394043, 0.22514614462852478, 0.11768591403961182, 0.9509549736976624, 0.4848499894142151, 0.04809992015361786, 0.06191825866699219, 0.04809992015361786, 0.23582905530929565, 0.07178771495819092, 0.23582905530929565, 0.9979320168495178, 0.09009099006652832, 0.020216554403305054, 0.11768358945846558, 0.13174989819526672, 0.047976553440093994, 0.14149612188339233, 0.11768472194671631, 0.20071400701999664, 0.734296977519989, 0.01602107286453247, 0.11768358945846558, 0.08992485702037811, 0.23582905530929565, 0.13174989819526672, 0.0437811017036438, 0.5494199991226196, 0.7346240282058716],\n \"normalized\": false\n },\n \"color\": {\n \"itemSize\": 4,\n \"type\": \"Uint16Array\",\n \"array\": [65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535],\n \"normalized\": true\n }\n },\n \"index\": {\n \"type\": \"Uint16Array\",\n \"array\": [17, 212, 141, 107, 7, 11, 43, 39, 223, 59, 130, 144, 158, 116, 167, 151, 23, 203, 91, 231, 207, 199, 183, 239, 75, 71, 3, 103, 191, 51, 171, 179, 211, 186, 182, 198, 149, 146, 129, 133, 16, 20, 108, 60, 217, 205, 21, 136, 157, 221, 36, 202, 2, 26, 119, 14, 166, 49, 74, 154, 161, 168, 184, 33, 57, 53, 178, 189, 98, 229, 100, 152, 102, 93, 97, 148, 112, 132, 232, 216, 236, 194, 222, 54, 173, 37, 45, 104, 237, 180, 138, 82, 90, 12, 128, 56, 86, 81, 234, 73, 204, 230, 46, 50, 190, 94, 210, 177, 147, 69, 195, 226, 78, 41, 9, 30, 89, 118, 197, 62, 0, 145, 24, 162, 185, 196, 65, 201, 206, 105, 181, 208, 76, 48, 40, 172, 44, 188, 113, 214, 134, 109, 218, 142, 32, 52, 220, 4, 101, 28, 13, 58, 165, 8, 88, 80, 68, 224, 193, 159, 38, 170, 72, 228, 153, 92, 176, 96, 126, 150, 131, 121, 117, 61, 18, 137, 22, 85, 233, 238, 114, 143, 215, 15, 111, 115, 235, 83, 141, 83, 17, 141, 11, 87, 107, 107, 95, 7, 223, 227, 43, 43, 47, 39, 192, 55, 144, 55, 59, 144, 167, 35, 158, 158, 160, 116, 203, 27, 151, 151, 135, 23, 207, 139, 91, 91, 31, 231, 219, 63, 239, 63, 199, 239, 3, 67, 75, 75, 79, 71, 51, 155, 103, 103, 99, 191, 211, 187, 171, 171, 175, 179, 186, 209, 182, 149, 25, 146, 133, 213, 16, 108, 120, 60, 205, 200, 21, 157, 34, 221, 202, 66, 2, 119, 122, 14, 49, 77, 74, 161, 156, 168, 33, 164, 57, 178, 174, 189, 229, 29, 100, 102, 6, 93, 148, 124, 112, 232, 140, 216, 194, 225, 222, 173, 169, 37, 104, 84, 237, 138, 19, 82, 12, 125, 128, 86, 10, 81, 73, 64, 204, 46, 42, 50, 94, 106, 210, 147, 1, 69, 226, 70, 78, 9, 5, 30, 118, 163, 197, 114, 110, 143, 115, 127, 15, 15, 123, 111]\n },\n \"boundingSphere\": {\n \"center\": [0, 0, 0],\n \"radius\": 144.59226795520192\n }\n },\n faceValues: [7, 5, 3, 11, 12, 9, 4, 1, 2, 10, 8, 6],\n rotationCombinations: {\n \"1,2\": [90, 0, -90],\n \"1,3\": [-90, 0, -90],\n \"1,4\": [-32, 18, -58],\n \"1,5\": [32, 18, 58],\n \"1,6\": [0, 0, 180],\n \"1,7\": [-180, 0, 0],\n \"1,8\": [-148, -18, -58],\n \"1,9\": [-148, -18, 122],\n \"1,10\": [-90, 0, 90],\n \"1,11\": [90, 0, 90],\n \"1,12\": [-180, 0, -180],\n \"2,3\": [-180, 0, -180],\n \"2,4\": [90, 0, -90],\n \"2,5\": [90, 0, 90],\n \"2,6\": [-122, -90, 148],\n \"2,7\": [-69, 30, 21],\n \"2,8\": [-90, 0, -90],\n \"2,9\": [-32, 18, 122],\n \"2,10\": [-180, 0, 0],\n \"2,11\": [0, 0, 180],\n \"2,12\": [-148, 54, 122],\n \"3,4\": [32, 18, 58],\n \"3,5\": [90, 0, -90],\n \"3,6\": [32, 54, -58],\n \"3,7\": [-32, -54, 122],\n \"3,8\": [-148, -18, 122],\n \"3,9\": [-90, 0, -90],\n \"3,10\": [-148, 18, -122],\n \"3,11\": [-180, 0, 0],\n \"3,12\": [-122, -90, 148],\n \"4,5\": [0, 0, 180],\n \"4,6\": [90, 0, 90],\n \"4,7\": [-90, 0, 90],\n \"4,8\": [-180, 0, -180],\n \"4,9\": [-180, 0, 0],\n \"4,10\": [148, -54, -58],\n \"4,11\": [-122, -90, 148],\n \"4,12\": [-90, 0, -90],\n \"5,6\": [-90, 0, -90],\n \"5,7\": [90, 0, -90],\n \"5,8\": [-180, 0, 0],\n \"5,9\": [-180, 0, -180],\n \"5,10\": [-148, -18, 122],\n \"5,11\": [32, 18, 58],\n \"5,12\": [90, 0, 90],\n \"6,7\": [-180, 0, -180],\n \"6,8\": [148, 18, 122],\n \"6,9\": [-122, -90, 148],\n \"6,10\": [90, 0, -90],\n \"6,11\": [-148, 54, -58],\n \"6,12\": [-148, -18, -58],\n \"7,8\": [32, -18, -58],\n \"7,9\": [-69, 30, 21],\n \"7,10\": [148, 54, 58],\n \"7,11\": [-90, 0, 90],\n \"7,12\": [-32, 54, 58],\n \"8,9\": [0, 0, 180],\n \"8,10\": [-148, -18, -58],\n \"8,11\": [-148, -54, 58],\n \"8,12\": [-90, 0, 90],\n \"9,10\": [-31, 18, -58],\n \"9,11\": [-148, -90, -58],\n \"9,12\": [90, 0, -90],\n \"10,11\": [-180, 0, -180],\n \"10,12\": [-90, 90, -180],\n \"11,12\": [148, -54, -58],\n }\n },\n \"d14\": {\n \"metadata\": {\n \"version\": 4.5,\n \"type\": \"BufferGeometry\",\n \"generator\": \"BufferGeometry.toJSON\"\n },\n \"uuid\": \"55E8EC8E-D9C5-4E75-86AC-BC4F49CF5FEA\",\n \"type\": \"BufferGeometry\",\n \"data\": {\n \"attributes\": {\n \"position\": {\n \"itemSize\": 3,\n \"type\": \"Float32Array\",\n \"array\": [-3.3639726638793945,6.319602012634277,-77.80762481689453,-3.3639726638793945,6.319602012634277,-77.80762481689453,-3.3639726638793945,6.319602012634277,-77.80762481689453,-3.3639726638793945,6.319602012634277,-77.80762481689453,2.563892364501953,84.39848327636719,-5.970834732055664,2.563892364501953,84.39848327636719,-5.970834732055664,2.563892364501953,84.39848327636719,-5.970834732055664,2.563892364501953,84.39848327636719,-5.970834732055664,2.563892364501953,84.39848327636719,-5.970834732055664,75.92582702636719,-2.281585454940796,-17.299819946289062,75.92582702636719,-2.281585454940796,-17.299819946289062,75.92582702636719,-2.281585454940796,-17.299819946289062,75.92582702636719,-2.281585454940796,-17.299819946289062,4.9952239990234375,84.37457275390625,4.497790336608887,4.9952239990234375,84.37457275390625,4.497790336608887,4.9952239990234375,84.37457275390625,4.497790336608887,4.9952239990234375,84.37457275390625,4.497790336608887,4.9952239990234375,84.37457275390625,4.497790336608887,-30.552932739257812,6.355025291442871,71.34111022949219,-30.552932739257812,6.355025291442871,71.34111022949219,-30.552932739257812,6.355025291442871,71.34111022949219,-30.552932739257812,6.355025291442871,71.34111022949219,31.1562557220459,6.31425142288208,71.49166870117188,31.1562557220459,6.31425142288208,71.49166870117188,31.1562557220459,6.31425142288208,71.49166870117188,31.1562557220459,6.31425142288208,71.49166870117188,-74.74581909179688,-6.299898624420166,-20.404645919799805,-74.74581909179688,-6.299898624420166,-20.404645919799805,-74.74581909179688,-6.299898624420166,-20.404645919799805,-74.74581909179688,-6.299898624420166,-20.404645919799805,30.55293846130371,-6.35502815246582,-71.34111022949219,30.55293846130371,-6.35502815246582,-71.34111022949219,30.55293846130371,-6.35502815246582,-71.34111022949219,30.55293846130371,-6.35502815246582,-71.34111022949219,-31.1562557220459,-6.31424617767334,-71.49166870117188,-31.1562557220459,-6.31424617767334,-71.49166870117188,-31.1562557220459,-6.31424617767334,-71.49166870117188,-31.1562557220459,-6.31424617767334,-71.49166870117188,5.657160758972168,-84.42521667480469,-4.448384761810303,5.657160758972168,-84.42521667480469,-4.448384761810303,5.657160758972168,-84.42521667480469,-4.448384761810303,5.657160758972168,-84.42521667480469,-4.448384761810303,5.657160758972168,-84.42521667480469,-4.448384761810303,62.504119873046875,-6.354261875152588,46.30989074707031,62.504119873046875,-6.354261875152588,46.30989074707031,62.504119873046875,-6.354261875152588,46.30989074707031,62.504119873046875,-6.354261875152588,46.30989074707031,7.009031295776367,-84.40763854980469,1.33268404006958,7.009031295776367,-84.40763854980469,1.33268404006958,7.009031295776367,-84.40763854980469,1.33268404006958,7.009031295776367,-84.40763854980469,1.33268404006958,7.009031295776367,-84.40763854980469,1.33268404006958,75.9446792602539,-6.379278182983398,-14.266926765441895,75.9446792602539,-6.379278182983398,-14.266926765441895,75.9446792602539,-6.379278182983398,-14.266926765441895,75.9446792602539,-6.379278182983398,-14.266926765441895,3.3639724254608154,-6.31959867477417,77.8076171875,3.3639724254608154,-6.31959867477417,77.8076171875,3.3639724254608154,-6.31959867477417,77.8076171875,3.3639724254608154,-6.31959867477417,77.8076171875,3.3671836853027344,-84.35977935791016,6.014355659484863,3.3671836853027344,-84.35977935791016,6.014355659484863,3.3671836853027344,-84.35977935791016,6.014355659484863,3.3671836853027344,-84.35977935791016,6.014355659484863,3.3671836853027344,-84.35977935791016,6.014355659484863,34.1295166015625,2.239828109741211,70.8094711303711,34.1295166015625,2.239828109741211,70.8094711303711,34.1295166015625,2.239828109741211,70.8094711303711,34.1295166015625,2.239828109741211,70.8094711303711,-75.9446792602539,6.379278182983398,14.26693058013916,-75.9446792602539,6.379278182983398,14.26693058013916,-75.9446792602539,6.379278182983398,14.26693058013916,-75.9446792602539,6.379278182983398,14.26693058013916,-76.03756713867188,-6.302979946136475,-14.609931945800781,-76.03756713867188,-6.302979946136475,-14.609931945800781,-76.03756713867188,-6.302979946136475,-14.609931945800781,-76.03756713867188,-6.302979946136475,-14.609931945800781,-76.0564956665039,-2.211188554763794,-17.664764404296875,-76.0564956665039,-2.211188554763794,-17.664764404296875,-76.0564956665039,-2.211188554763794,-17.664764404296875,-76.0564956665039,-2.211188554763794,-17.664764404296875,-62.504119873046875,6.354262351989746,-46.30989074707031,-62.504119873046875,6.354262351989746,-46.30989074707031,-62.504119873046875,6.354262351989746,-46.30989074707031,-62.504119873046875,6.354262351989746,-46.30989074707031,-61.1809196472168,2.2734644412994385,-49.07624435424805,-61.1809196472168,2.2734644412994385,-49.07624435424805,-61.1809196472168,2.2734644412994385,-49.07624435424805,-61.1809196472168,2.2734644412994385,-49.07624435424805,-58.829193115234375,6.3529181480407715,-50.964759826660156,-58.829193115234375,6.3529181480407715,-50.964759826660156,-58.829193115234375,6.3529181480407715,-50.964759826660156,-58.829193115234375,6.3529181480407715,-50.964759826660156,-36.493858337402344,-6.314887523651123,-68.91082763671875,-36.493858337402344,-6.314887523651123,-68.91082763671875,-36.493858337402344,-6.314887523651123,-68.91082763671875,-36.493858337402344,-6.314887523651123,-68.91082763671875,58.31211471557617,6.307106018066406,-50.69571304321289,58.31211471557617,6.307106018066406,-50.69571304321289,58.31211471557617,6.307106018066406,-50.69571304321289,58.31211471557617,6.307106018066406,-50.69571304321289,62.011024475097656,6.3075995445251465,-46.048179626464844,62.011024475097656,6.3075995445251465,-46.048179626464844,62.011024475097656,6.3075995445251465,-46.048179626464844,62.011024475097656,6.3075995445251465,-46.048179626464844,74.60848999023438,-6.379120826721191,-20.05154037475586,74.60848999023438,-6.379120826721191,-20.05154037475586,74.60848999023438,-6.379120826721191,-20.05154037475586,74.60848999023438,-6.379120826721191,-20.05154037475586,76.0564956665039,2.2111899852752686,17.664772033691406,76.0564956665039,2.2111899852752686,17.664772033691406,76.0564956665039,2.2111899852752686,17.664772033691406,76.0564956665039,2.2111899852752686,17.664772033691406,74.74581909179688,6.299901008605957,20.404653549194336,74.74581909179688,6.299901008605957,20.404653549194336,74.74581909179688,6.299901008605957,20.404653549194336,74.74581909179688,6.299901008605957,20.404653549194336,36.493858337402344,6.3148884773254395,68.91082763671875,36.493858337402344,6.3148884773254395,68.91082763671875,36.493858337402344,6.3148884773254395,68.91082763671875,36.493858337402344,6.3148884773254395,68.91082763671875,-2.5638914108276367,-84.39848327636719,5.9708333015441895,-2.5638914108276367,-84.39848327636719,5.9708333015441895,-2.5638914108276367,-84.39848327636719,5.9708333015441895,-2.5638914108276367,-84.39848327636719,5.9708333015441895,-2.5638914108276367,-84.39848327636719,5.9708333015441895,0.3401651680469513,-84.3684310913086,-7.083171844482422,0.3401651680469513,-84.3684310913086,-7.083171844482422,0.3401651680469513,-84.3684310913086,-7.083171844482422,0.3401651680469513,-84.3684310913086,-7.083171844482422,0.3401651680469513,-84.3684310913086,-7.083171844482422,-5.657160758972168,84.42522430419922,4.448385238647461,-5.657160758972168,84.42522430419922,4.448385238647461,-5.657160758972168,84.42522430419922,4.448385238647461,-5.657160758972168,84.42522430419922,4.448385238647461,-5.657160758972168,84.42522430419922,4.448385238647461,-0.4000111222267151,2.242583751678467,-78.4876937866211,-0.4000111222267151,2.242583751678467,-78.4876937866211,-0.4000111222267151,2.242583751678467,-78.4876937866211,-0.4000111222267151,2.242583751678467,-78.4876937866211,-34.1295166015625,-2.239827871322632,-70.8094711303711,-34.1295166015625,-2.239827871322632,-70.8094711303711,-34.1295166015625,-2.239827871322632,-70.8094711303711,-34.1295166015625,-2.239827871322632,-70.8094711303711,2.5671069622039795,6.321245193481445,-77.7981948852539,2.5671069622039795,6.321245193481445,-77.7981948852539,2.5671069622039795,6.321245193481445,-77.7981948852539,2.5671069622039795,6.321245193481445,-77.7981948852539,60.691749572753906,2.211258888244629,-48.80388641357422,60.691749572753906,2.211258888244629,-48.80388641357422,60.691749572753906,2.211258888244629,-48.80388641357422,60.691749572753906,2.211258888244629,-48.80388641357422,35.8908576965332,-6.357795238494873,-68.75081634521484,35.8908576965332,-6.357795238494873,-68.75081634521484,35.8908576965332,-6.357795238494873,-68.75081634521484,35.8908576965332,-6.357795238494873,-68.75081634521484,33.49201583862305,-2.268580436706543,-70.65808868408203,33.49201583862305,-2.268580436706543,-70.65808868408203,33.49201583862305,-2.268580436706543,-70.65808868408203,33.49201583862305,-2.268580436706543,-70.65808868408203,76.03756713867188,6.302982807159424,14.609939575195312,76.03756713867188,6.302982807159424,14.609939575195312,76.03756713867188,6.302982807159424,14.609939575195312,76.03756713867188,6.302982807159424,14.609939575195312,61.1809196472168,-2.2734615802764893,49.07624435424805,61.1809196472168,-2.2734615802764893,49.07624435424805,61.1809196472168,-2.2734615802764893,49.07624435424805,61.1809196472168,-2.2734615802764893,49.07624435424805,-58.31211471557617,-6.307102203369141,50.69571304321289,-58.31211471557617,-6.307102203369141,50.69571304321289,-58.31211471557617,-6.307102203369141,50.69571304321289,-58.31211471557617,-6.307102203369141,50.69571304321289,-33.49201202392578,2.268582582473755,70.65808868408203,-33.49201202392578,2.268582582473755,70.65808868408203,-33.49201202392578,2.268582582473755,70.65808868408203,-33.49201202392578,2.268582582473755,70.65808868408203,-35.8908576965332,6.357793807983398,68.75082397460938,-35.8908576965332,6.357793807983398,68.75082397460938,-35.8908576965332,6.357793807983398,68.75082397460938,-35.8908576965332,6.357793807983398,68.75082397460938,-2.567105293273926,-6.321239948272705,77.7981948852539,-2.567105293273926,-6.321239948272705,77.7981948852539,-2.567105293273926,-6.321239948272705,77.7981948852539,-2.567105293273926,-6.321239948272705,77.7981948852539,0.40001073479652405,-2.242581844329834,78.4876937866211,0.40001073479652405,-2.242581844329834,78.4876937866211,0.40001073479652405,-2.242581844329834,78.4876937866211,0.40001073479652405,-2.242581844329834,78.4876937866211,-60.69174575805664,-2.211254835128784,48.803897857666016,-60.69174575805664,-2.211254835128784,48.803897857666016,-60.69174575805664,-2.211254835128784,48.803897857666016,-60.69174575805664,-2.211254835128784,48.803897857666016,-74.60848999023438,6.379125595092773,20.051544189453125,-74.60848999023438,6.379125595092773,20.051544189453125,-74.60848999023438,6.379125595092773,20.051544189453125,-74.60848999023438,6.379125595092773,20.051544189453125,-75.92582702636719,2.2815887928009033,17.29982566833496,-75.92582702636719,2.2815887928009033,17.29982566833496,-75.92582702636719,2.2815887928009033,17.29982566833496,-75.92582702636719,2.2815887928009033,17.29982566833496,-62.011024475097656,-6.307600975036621,46.04818344116211,-62.011024475097656,-6.307600975036621,46.04818344116211,-62.011024475097656,-6.307600975036621,46.04818344116211,-62.011024475097656,-6.307600975036621,46.04818344116211,-6.242546081542969,-84.4273681640625,1.3070549964904785,-6.242546081542969,-84.4273681640625,1.3070549964904785,-6.242546081542969,-84.4273681640625,1.3070549964904785,-6.242546081542969,-84.4273681640625,1.3070549964904785,-6.242546081542969,-84.4273681640625,1.3070549964904785,-4.99522066116333,-84.37457275390625,-4.497788429260254,-4.99522066116333,-84.37457275390625,-4.497788429260254,-4.99522066116333,-84.37457275390625,-4.497788429260254,-4.99522066116333,-84.37457275390625,-4.497788429260254,-4.99522066116333,-84.37457275390625,-4.497788429260254,58.829200744628906,-6.3529205322265625,50.964759826660156,58.829200744628906,-6.3529205322265625,50.964759826660156,58.829200744628906,-6.3529205322265625,50.964759826660156,58.829200744628906,-6.3529205322265625,50.964759826660156,-0.34016573429107666,84.3684310913086,7.083171844482422,-0.34016573429107666,84.3684310913086,7.083171844482422,-0.34016573429107666,84.3684310913086,7.083171844482422,-0.34016573429107666,84.3684310913086,7.083171844482422,-0.34016573429107666,84.3684310913086,7.083171844482422,6.242546081542969,84.4273681640625,-1.307053804397583,6.242546081542969,84.4273681640625,-1.307053804397583,6.242546081542969,84.4273681640625,-1.307053804397583,6.242546081542969,84.4273681640625,-1.307053804397583,6.242546081542969,84.4273681640625,-1.307053804397583,-3.3671834468841553,84.35977935791016,-6.0143561363220215,-3.3671834468841553,84.35977935791016,-6.0143561363220215,-3.3671834468841553,84.35977935791016,-6.0143561363220215,-3.3671834468841553,84.35977935791016,-6.0143561363220215,-3.3671834468841553,84.35977935791016,-6.0143561363220215,-7.009029865264893,84.40763854980469,-1.3326834440231323,-7.009029865264893,84.40763854980469,-1.3326834440231323,-7.009029865264893,84.40763854980469,-1.3326834440231323,-7.009029865264893,84.40763854980469,-1.3326834440231323,-7.009029865264893,84.40763854980469,-1.3326834440231323,-0.36670994758605957,87.28189849853516,0.20025108754634857,-0.36670994758605957,87.28189849853516,0.20025108754634857,-0.36670994758605957,87.28189849853516,0.20025108754634857,-0.36670994758605957,87.28189849853516,0.20025108754634857,-0.36670994758605957,87.28189849853516,0.20025108754634857,-0.36670994758605957,87.28189849853516,0.20025108754634857,-0.36670994758605957,87.28189849853516,0.20025108754634857,0.366711288690567,-87.28191375732422,-0.2002510279417038,0.366711288690567,-87.28191375732422,-0.2002510279417038,0.366711288690567,-87.28191375732422,-0.2002510279417038,0.366711288690567,-87.28191375732422,-0.2002510279417038,0.366711288690567,-87.28191375732422,-0.2002510279417038,0.366711288690567,-87.28191375732422,-0.2002510279417038,0.366711288690567,-87.28191375732422,-0.2002510279417038],\n \"normalized\": false\n },\n \"normal\": {\n \"itemSize\": 3,\n \"type\": \"Float32Array\",\n \"array\": [-0.28516727685928345,0.6296403408050537,-0.7226566076278687,-0.28516727685928345,0.6296403408050537,-0.7226566076278687,-0.28516727685928345,0.6296403408050537,-0.7226566076278687,-0.28516727685928345,0.6296403408050537,-0.7226566076278687,0.3280982971191406,0.6602655649185181,-0.6755744218826294,0.3280982971191406,0.6602655649185181,-0.6755744218826294,0.3280982971191406,0.6602655649185181,-0.6755744218826294,0.3280982971191406,0.6602655649185181,-0.6755744218826294,0.3280982971191406,0.6602655649185181,-0.6755744218826294,0.7842698693275452,0.5933358073234558,-0.18131035566329956,0.7842698693275452,0.5933358073234558,-0.18131035566329956,0.7842698693275452,0.5933358073234558,-0.18131035566329956,0.7842698693275452,0.5933358073234558,-0.18131035566329956,0.589374303817749,0.6605231761932373,0.46513107419013977,0.589374303817749,0.6605231761932373,0.46513107419013977,0.589374303817749,0.6605231761932373,0.46513107419013977,0.589374303817749,0.6605231761932373,0.46513107419013977,0.589374303817749,0.6605231761932373,0.46513107419013977,-0.059090327471494675,0.6272545456886292,0.7765694260597229,-0.059090327471494675,0.6272545456886292,0.7765694260597229,-0.059090327471494675,0.6272545456886292,0.7765694260597229,-0.059090327471494675,0.6272545456886292,0.7765694260597229,0.05634559690952301,0.6280144453048706,0.7761592268943787,0.05634559690952301,0.6280144453048706,0.7761592268943787,0.05634559690952301,0.6280144453048706,0.7761592268943787,0.05634559690952301,0.6280144453048706,0.7761592268943787,-0.6443470120429993,-0.6290098428726196,-0.43492940068244934,-0.6443470120429993,-0.6290098428726196,-0.43492940068244934,-0.6443470120429993,-0.6290098428726196,-0.43492940068244934,-0.6443470120429993,-0.6290098428726196,-0.43492940068244934,0.05909096822142601,-0.6272543668746948,-0.7765696048736572,0.05909096822142601,-0.6272543668746948,-0.7765696048736572,0.05909096822142601,-0.6272543668746948,-0.7765696048736572,0.05909096822142601,-0.6272543668746948,-0.7765696048736572,-0.05632945895195007,-0.6280063986778259,-0.7761667966842651,-0.05632945895195007,-0.6280063986778259,-0.7761667966842651,-0.05632945895195007,-0.6280063986778259,-0.7761667966842651,-0.05632945895195007,-0.6280063986778259,-0.7761667966842651,0.5910056829452515,-0.6553013920783997,-0.4704173803329468,0.5910056829452515,-0.6553013920783997,-0.4704173803329468,0.5910056829452515,-0.6553013920783997,-0.4704173803329468,0.5910056829452515,-0.6553013920783997,-0.4704173803329468,0.5910056829452515,-0.6553013920783997,-0.4704173803329468,0.7470955848693848,-0.6255302429199219,0.22485576570034027,0.7470955848693848,-0.6255302429199219,0.22485576570034027,0.7470955848693848,-0.6255302429199219,0.22485576570034027,0.7470955848693848,-0.6255302429199219,0.22485576570034027,0.7361034154891968,-0.6567224264144897,0.16391272842884064,0.7361034154891968,-0.6567224264144897,0.16391272842884064,0.7361034154891968,-0.6567224264144897,0.16391272842884064,0.7361034154891968,-0.6567224264144897,0.16391272842884064,0.7361034154891968,-0.6567224264144897,0.16391272842884064,0.7726380228996277,-0.6246670484542847,0.11323241889476776,0.7726380228996277,-0.6246670484542847,0.11323241889476776,0.7726380228996277,-0.6246670484542847,0.11323241889476776,0.7726380228996277,-0.6246670484542847,0.11323241889476776,0.2852247953414917,-0.6296125650405884,0.7226580381393433,0.2852247953414917,-0.6296125650405884,0.7226580381393433,0.2852247953414917,-0.6296125650405884,0.7226580381393433,0.2852247953414917,-0.6296125650405884,0.7226580381393433,0.32667452096939087,-0.6607898473739624,0.6757517457008362,0.32667452096939087,-0.6607898473739624,0.6757517457008362,0.32667452096939087,-0.6607898473739624,0.6757517457008362,0.32667452096939087,-0.6607898473739624,0.6757517457008362,0.32667452096939087,-0.6607898473739624,0.6757517457008362,0.3497964143753052,-0.5950561165809631,0.7235679030418396,0.3497964143753052,-0.5950561165809631,0.7235679030418396,0.3497964143753052,-0.5950561165809631,0.7235679030418396,0.3497964143753052,-0.5950561165809631,0.7235679030418396,-0.7726274132728577,0.6246878504753113,-0.11318989098072052,-0.7726274132728577,0.6246878504753113,-0.11318989098072052,-0.7726274132728577,0.6246878504753113,-0.11318989098072052,-0.7726274132728577,0.6246878504753113,-0.11318989098072052,-0.7692402005195618,-0.6276887655258179,0.11948297917842865,-0.7692402005195618,-0.6276887655258179,0.11948297917842865,-0.7692402005195618,-0.6276887655258179,0.11948297917842865,-0.7692402005195618,-0.6276887655258179,0.11948297917842865,-0.7877770662307739,0.5905534625053406,-0.17508289217948914,-0.7877770662307739,0.5905534625053406,-0.17508289217948914,-0.7877770662307739,0.5905534625053406,-0.17508289217948914,-0.7877770662307739,0.5905534625053406,-0.17508289217948914,-0.7470952868461609,0.6255304217338562,-0.22485589981079102,-0.7470952868461609,0.6255304217338562,-0.22485589981079102,-0.7470952868461609,0.6255304217338562,-0.22485589981079102,-0.7470952868461609,0.6255304217338562,-0.22485589981079102,-0.631263256072998,-0.5948466658592224,-0.4976588785648346,-0.631263256072998,-0.5948466658592224,-0.4976588785648346,-0.631263256072998,-0.5948466658592224,-0.4976588785648346,-0.631263256072998,-0.5948466658592224,-0.4976588785648346,-0.38938289880752563,0.6292169094085693,-0.6726565957069397,-0.38938289880752563,0.6292169094085693,-0.6726565957069397,-0.38938289880752563,0.6292169094085693,-0.6726565957069397,-0.38938289880752563,0.6292169094085693,-0.6726565957069397,-0.5729118585586548,-0.6292456388473511,-0.5251874923706055,-0.5729118585586548,-0.6292456388473511,-0.5251874923706055,-0.5729118585586548,-0.6292456388473511,-0.5251874923706055,-0.5729118585586548,-0.6292456388473511,-0.5251874923706055,0.3904346227645874,0.628699541091919,-0.6725307703018188,0.3904346227645874,0.628699541091919,-0.6725307703018188,0.3904346227645874,0.628699541091919,-0.6725307703018188,0.3904346227645874,0.628699541091919,-0.6725307703018188,0.7437728643417358,0.6275497078895569,-0.2301807701587677,0.7437728643417358,0.6275497078895569,-0.2301807701587677,0.7437728643417358,0.6275497078895569,-0.2301807701587677,0.7437728643417358,0.6275497078895569,-0.2301807701587677,0.6457582712173462,-0.6233645677566528,-0.4409227967262268,0.6457582712173462,-0.6233645677566528,-0.4409227967262268,0.6457582712173462,-0.6233645677566528,-0.4409227967262268,0.6457582712173462,-0.6233645677566528,-0.4409227967262268,0.7877867221832275,-0.5905534029006958,0.17503942549228668,0.7877867221832275,-0.5905534029006958,0.17503942549228668,0.7877867221832275,-0.5905534029006958,0.17503942549228668,0.7877867221832275,-0.5905534029006958,0.17503942549228668,0.6443431377410889,0.6290005445480347,0.43494871258735657,0.6443431377410889,0.6290005445480347,0.43494871258735657,0.6443431377410889,0.6290005445480347,0.43494871258735657,0.6443431377410889,0.6290005445480347,0.43494871258735657,0.5729120969772339,0.6292457580566406,0.5251871347427368,0.5729120969772339,0.6292457580566406,0.5251871347427368,0.5729120969772339,0.6292457580566406,0.5251871347427368,0.5729120969772339,0.6292457580566406,0.5251871347427368,-0.3281112611293793,-0.6602649092674255,0.6755688190460205,-0.3281112611293793,-0.6602649092674255,0.6755688190460205,-0.3281112611293793,-0.6602649092674255,0.6755688190460205,-0.3281112611293793,-0.6602649092674255,0.6755688190460205,-0.3281112611293793,-0.6602649092674255,0.6755688190460205,0.0011704713106155396,-0.6591591238975525,-0.7520025968551636,0.0011704713106155396,-0.6591591238975525,-0.7520025968551636,0.0011704713106155396,-0.6591591238975525,-0.7520025968551636,0.0011704713106155396,-0.6591591238975525,-0.7520025968551636,0.0011704713106155396,-0.6591591238975525,-0.7520025968551636,-0.5910052061080933,0.6553022861480713,0.47041675448417664,-0.5910052061080933,0.6553022861480713,0.47041675448417664,-0.5910052061080933,0.6553022861480713,0.47041675448417664,-0.5910052061080933,0.6553022861480713,0.47041675448417664,-0.5910052061080933,0.6553022861480713,0.47041675448417664,0.0015861615538597107,-0.5931890606880188,-0.8050615787506104,0.0015861615538597107,-0.5931890606880188,-0.8050615787506104,0.0015861615538597107,-0.5931890606880188,-0.8050615787506104,0.0015861615538597107,-0.5931890606880188,-0.8050615787506104,-0.34979522228240967,0.5950555801391602,-0.7235690355300903,-0.34979522228240967,0.5950555801391602,-0.7235690355300903,-0.34979522228240967,0.5950555801391602,-0.7235690355300903,-0.34979522228240967,0.5950555801391602,-0.7235690355300903,0.2873671054840088,0.6291413903236389,-0.7222195863723755,0.2873671054840088,0.6291413903236389,-0.7222195863723755,0.2873671054840088,0.6291413903236389,-0.7222195863723755,0.2873671054840088,0.6291413903236389,-0.7222195863723755,0.6324546933174133,-0.5889533758163452,-0.5031253695487976,0.6324546933174133,-0.5889533758163452,-0.5031253695487976,0.6324546933174133,-0.5889533758163452,-0.5031253695487976,0.6324546933174133,-0.5889533758163452,-0.5031253695487976,0.574481725692749,-0.6237778663635254,-0.5299734473228455,0.574481725692749,-0.6237778663635254,-0.5299734473228455,0.574481725692749,-0.6237778663635254,-0.5299734473228455,0.574481725692749,-0.6237778663635254,-0.5299734473228455,0.35163187980651855,0.594671368598938,-0.7229945659637451,0.35163187980651855,0.594671368598938,-0.7229945659637451,0.35163187980651855,0.594671368598938,-0.7229945659637451,0.35163187980651855,0.594671368598938,-0.7229945659637451,0.7692419290542603,0.6276857852935791,-0.11948888003826141,0.7692419290542603,0.6276857852935791,-0.11948888003826141,0.7692419290542603,0.6276857852935791,-0.11948888003826141,0.7692419290542603,0.6276857852935791,-0.11948888003826141,0.6312867403030396,0.5948468446731567,0.49762865900993347,0.6312867403030396,0.5948468446731567,0.49762865900993347,0.6312867403030396,0.5948468446731567,0.49762865900993347,0.6312867403030396,0.5948468446731567,0.49762865900993347,-0.3904343545436859,-0.6286999583244324,0.6725306510925293,-0.3904343545436859,-0.6286999583244324,0.6725306510925293,-0.3904343545436859,-0.6286999583244324,0.6725306510925293,-0.3904343545436859,-0.6286999583244324,0.6725306510925293,-0.3516600430011749,-0.5946711301803589,0.7229809761047363,-0.3516600430011749,-0.5946711301803589,0.7229809761047363,-0.3516600430011749,-0.5946711301803589,0.7229809761047363,-0.3516600430011749,-0.5946711301803589,0.7229809761047363,-0.5744823813438416,0.6237770915031433,0.5299737453460693,-0.5744823813438416,0.6237770915031433,0.5299737453460693,-0.5744823813438416,0.6237770915031433,0.5299737453460693,-0.5744823813438416,0.6237770915031433,0.5299737453460693,-0.28738611936569214,-0.6291320323944092,0.722220242023468,-0.28738611936569214,-0.6291320323944092,0.722220242023468,-0.28738611936569214,-0.6291320323944092,0.722220242023468,-0.28738611936569214,-0.6291320323944092,0.722220242023468,-0.0015616416931152344,0.5931897759437561,0.8050611615180969,-0.0015616416931152344,0.5931897759437561,0.8050611615180969,-0.0015616416931152344,0.5931897759437561,0.8050611615180969,-0.0015616416931152344,0.5931897759437561,0.8050611615180969,-0.632463812828064,0.5889529585838318,0.5031142830848694,-0.632463812828064,0.5889529585838318,0.5031142830848694,-0.632463812828064,0.5889529585838318,0.5031142830848694,-0.632463812828064,0.5889529585838318,0.5031142830848694,-0.6457580924034119,0.6233644485473633,0.44092315435409546,-0.6457580924034119,0.6233644485473633,0.44092315435409546,-0.6457580924034119,0.6233644485473633,0.44092315435409546,-0.6457580924034119,0.6233644485473633,0.44092315435409546,-0.7842698097229004,-0.593335747718811,0.18131089210510254,-0.7842698097229004,-0.593335747718811,0.18131089210510254,-0.7842698097229004,-0.593335747718811,0.18131089210510254,-0.7842698097229004,-0.593335747718811,0.18131089210510254,-0.7437704205513,-0.6275736689567566,0.23012343049049377,-0.7437704205513,-0.6275736689567566,0.23012343049049377,-0.7437704205513,-0.6275736689567566,0.23012343049049377,-0.7437704205513,-0.6275736689567566,0.23012343049049377,-0.7328628301620483,-0.6589818596839905,0.16927775740623474,-0.7328628301620483,-0.6589818596839905,0.16927775740623474,-0.7328628301620483,-0.6589818596839905,0.16927775740623474,-0.7328628301620483,-0.6589818596839905,0.16927775740623474,-0.7328628301620483,-0.6589818596839905,0.16927775740623474,-0.5893685817718506,-0.6605226993560791,-0.4651390612125397,-0.5893685817718506,-0.6605226993560791,-0.4651390612125397,-0.5893685817718506,-0.6605226993560791,-0.4651390612125397,-0.5893685817718506,-0.6605226993560791,-0.4651390612125397,-0.5893685817718506,-0.6605226993560791,-0.4651390612125397,0.38937872648239136,-0.6292127966880798,0.6726629734039307,0.38937872648239136,-0.6292127966880798,0.6726629734039307,0.38937872648239136,-0.6292127966880798,0.6726629734039307,0.38937872648239136,-0.6292127966880798,0.6726629734039307,-0.0011698007583618164,0.6591596007347107,0.7520022988319397,-0.0011698007583618164,0.6591596007347107,0.7520022988319397,-0.0011698007583618164,0.6591596007347107,0.7520022988319397,-0.0011698007583618164,0.6591596007347107,0.7520022988319397,-0.0011698007583618164,0.6591596007347107,0.7520022988319397,0.7328664064407349,0.6589823961257935,-0.16926002502441406,0.7328664064407349,0.6589823961257935,-0.16926002502441406,0.7328664064407349,0.6589823961257935,-0.16926002502441406,0.7328664064407349,0.6589823961257935,-0.16926002502441406,0.7328664064407349,0.6589823961257935,-0.16926002502441406,-0.3266833424568176,0.6607902646064758,-0.6757471561431885,-0.3266833424568176,0.6607902646064758,-0.6757471561431885,-0.3266833424568176,0.6607902646064758,-0.6757471561431885,-0.3266833424568176,0.6607902646064758,-0.6757471561431885,-0.3266833424568176,0.6607902646064758,-0.6757471561431885,-0.7360942959785461,0.6567226648330688,-0.16395282745361328,-0.7360942959785461,0.6567226648330688,-0.16395282745361328,-0.7360942959785461,0.6567226648330688,-0.16395282745361328,-0.7360942959785461,0.6567226648330688,-0.16395282745361328,-0.7360942959785461,0.6567226648330688,-0.16395282745361328,0.0001270859647775069,1,0.00006240241782506928,0.0001270859647775069,1,0.00006240241782506928,0.0001270859647775069,1,0.00006240241782506928,0.0001270859647775069,1,0.00006240241782506928,0.0001270859647775069,1,0.00006240241782506928,0.0001270859647775069,1,0.00006240241782506928,0.0001270859647775069,1,0.00006240241782506928,-0.00012663456436712295,-1,-0.00006260263762669638,-0.00012663456436712295,-1,-0.00006260263762669638,-0.00012663456436712295,-1,-0.00006260263762669638,-0.00012663456436712295,-1,-0.00006260263762669638,-0.00012663456436712295,-1,-0.00006260263762669638,-0.00012663456436712295,-1,-0.00006260263762669638,-0.00012663456436712295,-1,-0.00006260263762669638],\n \"normalized\": false\n },\n \"uv\": {\n \"itemSize\": 2,\n \"type\": \"Float32Array\",\n \"array\": [0.012080706655979156,0.01143413782119751,0.02038293331861496,0.2402452826499939,0.07275813817977905,0.7014026641845703,0.23399420082569122,0.044198572635650635,0.012080706655979156,0.09173142910003662,0.09271499514579773,0.0920637845993042,0.22834762930870056,0.033225297927856445,0.24569767713546753,0.027156472206115723,0.8750260472297668,0.27947235107421875,0.15672194957733154,0.03217524290084839,0.15672194957733154,0.040720343589782715,0.21759822964668274,0.041023433208465576,0.624879777431488,0.4702685475349426,0.04823240637779236,0.03318381309509277,0.07462695240974426,0.2401202917098999,0.1386493444442749,0.24023151397705078,0.20049551129341125,0.03662097454071045,0.3756515383720398,0.27943485975265503,0.04823240637779236,0.08685857057571411,0.07282328605651855,0.45090705156326294,0.16252003610134125,0.018233835697174072,0.2011767327785492,0.2402452826499939,0.1273123025894165,0.01617354154586792,0.14694836735725403,0.09188961982727051,0.17717677354812622,0.4513193964958191,0.25039011240005493,0.08733206987380981,0.04823240637779236,0.09189057350158691,0.05499856173992157,0.009189963340759277,0.0725666880607605,0.9514256715774536,0.14694836735725403,0.043423593044281006,0.07372921705245972,0.016311585903167725,0.07462692260742188,0.08685952425003052,0.21925535798072815,0.09241074323654175,0.4275488257408142,0.9517285227775574,0.12057686597108841,0.09188848733901978,0.14611805975437164,0.009021878242492676,0.22737187147140503,0.08733206987380981,0.32245123386383057,0.9515766501426697,0.11080294847488403,0.026038765907287598,0.12057653814554214,0.029400944709777832,0.21095037460327148,0.2402452826499939,0.24711300432682037,0.0928187370300293,0.6267523169517517,0.7800135612487793,0.09018958359956741,0.008709728717803955,0.12057658284902573,0.04346507787704468,0.1830982267856598,0.09213989973068237,0.9277936816215515,0.951744794845581,0.10317572951316833,0.0293390154838562,0.1393822878599167,0.032990872859954834,0.1830982267856598,0.2402452826499939,0.255423367023468,0.09287703037261963,0.8746025562286377,0.7797321677207947,0.16253256797790527,0.03631782531738281,0.16336379945278168,0.04333001375198364,0.2554234266281128,0.2402452826499939,0.8222063779830933,0.9510524272918701,0.03845880925655365,0.09173208475112915,0.10992515832185745,0.01626521348953247,0.24376779794692993,0.04419851303100586,0.42733103036880493,0.701709508895874,0.03845880925655365,0.026774346828460693,0.03845880925655365,0.24016445875167847,0.14694836735725403,0.036410391330718994,0.174796923995018,0.24008393287658691,0.37455111742019653,0.5295032858848572,0.03845880925655365,0.08928269147872925,0.1273123025894165,0.009048819541931152,0.24376779794692993,0.08995997905731201,0.37507760524749756,0.7204967141151428,0.17645640671253204,0.043330609798431396,0.21771717071533203,0.016403138637542725,0.22902902960777283,0.2402452826499939,0.6778356432914734,0.20166105031967163,0.04823240637779236,0.014015018939971924,0.056542813777923584,0.09192115068435669,0.1830982267856598,0.08697599172592163,0.9278727769851685,0.7018176913261414,0.05499856173992157,0.0163193941116333,0.1403140127658844,0.040812790393829346,0.17645637691020966,0.08961743116378784,0.6247076988220215,0.22033452987670898,0.140313982963562,0.08676266670227051,0.15672211349010468,0.09213924407958984,0.18057595193386078,0.017045259475708008,0.5721643567085266,0.201244056224823,0.012080706655979156,0.08928197622299194,0.12499088048934937,0.9704728722572327,0.14694836735725403,0.08941596746444702,0.17478692531585693,0.012857019901275635,0.018697038292884827,0.08670186996459961,0.16502328217029572,0.09206610918045044,0.17724192142486572,0.7014986276626587,0.18057595193386078,0.008743643760681152,0.012080706655979156,0.04335254430770874,0.12887565791606903,0.09186422824859619,0.1393822878599167,0.013869822025299072,0.1774333119392395,0.9517008662223816,0.09104300290346146,0.04336506128311157,0.09271499514579773,0.2402452826499939,0.19964106380939484,0.009263157844543457,0.8223589658737183,0.45139479637145996,0.08440056443214417,0.24022287130355835,0.1928718537092209,0.014091014862060547,0.21759822964668274,0.08731919527053833,0.6777778267860413,0.45166242122650146,0.16253256797790527,0.02800750732421875,0.21095037460327148,0.04365772008895874,0.24711309373378754,0.24022060632705688,0.6778541803359985,0.951484739780426,0.12057655304670334,0.08941489458084106,0.16336379945278168,0.08961677551269531,0.2351137399673462,0.009227573871612549,0.8750938177108765,0.9702678322792053,0.07462695240974426,0.0918915867805481,0.12721094489097595,0.0868040919303894,0.2351137399673462,0.0163571834564209,0.4274844527244568,0.45174920558929443,0.031842514872550964,0.08667910099029541,0.12057653814554214,0.011325597763061523,0.13864925503730774,0.09186530113220215,0.3225155472755432,0.45152556896209717,0.012080706655979156,0.03307300806045532,0.030156202614307404,0.026774346828460693,0.030156515538692474,0.2402452826499939,0.10248857736587524,0.092063307762146,0.6261616945266724,0.5296865701675415,0.12057653814554214,0.2402452826499939,0.1281311959028244,0.025947153568267822,0.21095037460327148,0.029455959796905518,0.21925535798072815,0.2400715947151184,0.3766971230506897,0.7794159054756165,0.07462692260742188,0.02608513832092285,0.1928718537092209,0.09240931272506714,0.23733942210674286,0.0928187370300293,0.24569767713546753,0.007925331592559814,0.875484049320221,0.02962595224380493,0.01882428675889969,0.009150922298431396,0.07462692260742188,0.04079252481460571,0.22737182676792145,0.04158461093902588,0.37476611137390137,0.9705840945243835,0.018697038292884827,0.0407489538192749,0.12485933303833008,0.7203324437141418,0.14611805975437164,0.016146481037139893,0.23399420082569122,0.08995997905731201,0.012080781161785126,0.24023497104644775,0.01882428675889969,0.01627671718597412,0.06800204515457153,0.04341691732406616,0.9276410341262817,0.4518194794654846,0.08440056443214417,0.04074656963348389,0.19964106380939484,0.01640307903289795,0.21095037460327148,0.08995997905731201,0.6247829794883728,0.9699863791465759,0.06695697456598282,0.011504054069519043,0.08440056443214417,0.08688396215438843,0.21095052361488342,0.09248226881027222,0.5721458196640015,0.9508618116378784,0.06800201535224915,0.0894421935081482,0.07372921705245972,0.009201109409332275,0.09104300290346146,0.08953815698623657,0.8750190138816833,0.47052764892578125,0.06631660461425781,0.09192222356796265,0.15672194957733154,0.08697539567947388,0.22834759950637817,0.011532008647918701,0.5722221732139587,0.4511365294456482,0.03184248507022858,0.04074972867965698,0.08440056443214417,0.012897908687591553,0.12721094489097595,0.04081183671951294,0.374919056892395,0.47056519985198975,0.030156202614307404,0.014692902565002441,0.10248860716819763,0.2402452826499939,0.10416048020124435,0.043364644050598145,0.6775245070457458,0.7015867233276367,0.054857321083545685,0.08944112062454224,0.10416045039892197,0.08953768014907837,0.15672194957733154,0.014117896556854248,0.6248504519462585,0.7203134894371033,0.11080294847488403,0.086883544921875,0.16252003610134125,0.009928703308105469,0.19287201762199402,0.24017375707626343,0.9280667304992676,0.20186400413513184,0.030156604945659637,0.09174239635467529,0.054857321083545685,0.043415963649749756,0.10317572951316833,0.011430740356445312,0.5724754929542542,0.7012842297554016,0.04823240637779236,0.04079157114028931,0.10992515832185745,0.009145617485046387,0.12513083219528198,0.4699118137359619,0.25039011240005493,0.04158461093902588,0.03691284358501434,0.017000675201416016,0.11080294847488403,0.04074627161026001,0.1928718537092209,0.041023433208465576,0.8749712705612183,0.22037410736083984,0.1928718537092209,0.0873255729675293,0.21095037460327148,0.011578857898712158,0.23733942210674286,0.2402205467224121,0.8219332098960876,0.20110386610031128,0.1830982267856598,0.040720999240875244,0.19951972365379333,0.08995997905731201,0.21771717071533203,0.009267032146453857,0.8749260902404785,0.7204409241676331,0.03691284358501434,0.009847462177276611,0.11080294847488403,0.24022287130355835,0.19951972365379333,0.04366427659988403,0.8221272826194763,0.7012577056884766,0.01972394436597824,0.03634655475616455,0.056542813777923584,0.2402452826499939,0.11080294847488403,0.09198707342147827,0.18309825658798218,0.026818931102752686,0.8757262825965881,0.5295590758323669,0.04823248088359833,0.2401202917098999,0.1251671314239502,0.7795271873474121,0.12887565791606903,0.24023151397705078,0.17478697001934052,0.026818931102752686,0.21857404708862305,0.026176750659942627,0.03845880925655365,0.04332977533340454,0.09018958359956741,0.01701122522354126,0.1747969537973404,0.09206688404083252,0.32266902923583984,0.7014552354812622,0.06695697456598282,0.02927464246749878,0.1242377758026123,0.2800881862640381,0.14694832265377045,0.2402452826499939,0.1928718090057373,0.03334176540374756,0.2011767327785492,0.09258311986923218,0.05590075999498367,0.036389052867889404,0.06631642580032349,0.2402452826499939,0.08440063893795013,0.09198743104934692,0.25401246547698975,0.027156472206115723,0.6260393857955933,0.2797313928604126,0.02038293331861496,0.09181225299835205,0.09270339459180832,0.026784837245941162,0.12602335214614868,0.5296675562858582,0.16502328217029572,0.24008393287658691,0.2359241247177124,0.03662097454071045,0.08440056443214417,0.026784837245941162,0.15672194957733154,0.2402452826499939,0.22902897000312805,0.09287703037261963,0.25400829315185547,0.007925331592559814,0.6272023916244507,0.02966541051864624,0.05590075999498367,0.026093125343322754,0.07462692260742188,0.03639000654220581,0.08838308602571487,0.03634411096572876,0.20049551129341125,0.026176750659942627,0.2359241247177124,0.026130735874176025,0.24978983402252197,0.01738286018371582,0.2499590814113617,0.03662097454071045,0.01972394436597824,0.0260503888130188,0.034168489277362823,0.036347150802612305,0.11080294847488403,0.03634369373321533,0.1281311959028244,0.03640943765640259,0.14694836735725403,0.02592015266418457,0.1791275292634964,0.03631848096847534,0.21857404708862305,0.03662097454071045],\n \"normalized\": false\n }\n },\n \"index\": {\n \"type\": \"Uint16Array\",\n \"array\": [96,28,86,33,37,139,108,155,151,195,179,135,120,116,17,171,183,175,84,72,237,2,91,230,100,147,8,163,104,227,46,55,112,170,176,189,19,24,219,101,5,225,106,103,11,83,92,88,45,63,49,192,202,190,209,74,26,182,57,185,165,215,43,93,89,140,194,235,71,3,36,143,168,188,200,142,35,95,75,69,79,228,144,1,31,146,156,107,50,41,44,114,166,136,0,145,97,153,158,162,115,111,124,201,206,14,160,224,82,231,90,30,157,152,70,198,193,102,149,99,214,117,65,34,211,94,53,161,110,9,52,105,73,77,27,58,25,187,66,118,22,154,129,32,81,29,78,222,178,21,15,23,119,18,181,184,76,203,199,180,61,56,59,217,68,20,177,174,6,232,242,229,233,240,236,134,243,131,218,239,221,16,241,13,223,238,226,7,244,60,122,246,121,204,245,207,212,250,213,128,251,127,39,248,38,47,247,48,62,249,96,210,28,33,130,37,108,42,155,195,191,179,120,167,116,171,125,183,84,80,72,2,141,91,100,159,147,163,12,104,46,51,55,170,173,176,19,186,24,101,98,5,106,150,103,45,216,63,192,197,202,209,205,74,93,85,89,194,133,235,3,138,36,75,196,69,228,4,144,31,137,146,107,54,50,44,109,114,97,148,153,124,169,201,14,113,160,82,234,231,214,164,117,34,126,211,53,10,161,58,67,25,154,40,129,81,87,29,222,132,178,15,220,23,18,172,181,76,208,203,180,123,61,59,64,217]\n },\n \"boundingSphere\": {\n \"center\": [0,-0.00000762939453125,0],\n \"radius\": 139.86793680588863\n }\n },\n faceValues: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14],\n rotationCombinations: {\n \"1,2\": [1, -51, 0],\n \"1,3\": [-1, -103, -1],\n \"1,4\": [0, -155, 0],\n \"1,5\": [0, 154, 0],\n \"1,6\": [2, 103, -2],\n \"1,7\": [0, 52, 1],\n \"1,8\": [2, -77, -178],\n \"1,9\": [180, -51, -1],\n \"1,10\": [-180, 0, 0],\n \"1,11\": [-179, 51, -1],\n \"1,12\": [-1, 77, -179],\n \"1,13\": [0, 26, 180],\n \"1,14\": [1, -26, -180],\n \"2,3\": [0, -52, 0],\n \"2,4\": [-2, -103, -2],\n \"2,5\": [0, -154, 0],\n \"2,6\": [0, 154, 0],\n \"2,7\": [2, 103, -2],\n \"2,8\": [0, -26, -180],\n \"2,9\": [2, -77, -178],\n \"2,10\": [180, -52, -1],\n \"2,11\": [-180, 0, 0],\n \"2,12\": [-180, 51, -1],\n \"2,13\": [-1, 77, -179],\n \"2,14\": [0, 26, 180],\n \"3,4\": [1, -52, 1],\n \"3,5\": [-2, -103, -2],\n \"3,6\": [0, -154, 0],\n \"3,7\": [0, 155, -1],\n \"3,8\": [0, 26, -180],\n \"3,9\": [0, -26, -179],\n \"3,10\": [1, -77, -179],\n \"3,11\": [180, -52, 0],\n \"3,12\": [180, 0, -1],\n \"3,13\": [-180, 51, -1],\n \"3,14\": [0, 77, 180],\n \"4,5\": [0, -51, 0],\n \"4,6\": [0, -103, 1],\n \"4,7\": [0, -154, 0],\n \"4,8\": [1, 77, 179],\n \"4,9\": [0, 26, -180],\n \"4,10\": [0, -25, -180],\n \"4,11\": [-1, -77, 180],\n \"4,12\": [180, -52, 0],\n \"4,13\": [180, 0, 0],\n \"4,14\": [179, 51, 0],\n \"5,6\": [0, -51, 0],\n \"5,7\": [1, -103, 1],\n \"5,8\": [180, 51, 0],\n \"5,9\": [1, 77, 179],\n \"5,10\": [0, 26, -180],\n \"5,11\": [0, -25, 180],\n \"5,12\": [0, -77, 180],\n \"5,13\": [180, -52, 0],\n \"5,14\": [180, 0, 0],\n \"6,7\": [0, -51, -1],\n \"6,8\": [180, 0, 0],\n \"6,9\": [180, 52, 1],\n \"6,10\": [1, 77, 180],\n \"6,11\": [0, 26, 180],\n \"6,12\": [0, -26, 180],\n \"6,13\": [0, -77, 179],\n \"6,14\": [180, -51, 0],\n \"7,8\": [180, -51, -1],\n \"7,9\": [-180, 0, 0],\n \"7,10\": [-180, 51, 0],\n \"7,11\": [-1, 77, -179],\n \"7,12\": [0, 26, 180],\n \"7,13\": [0, -26, 180],\n \"7,14\": [2, -77, -178],\n \"8,9\": [0, 51, 1],\n \"8,10\": [1, 103, 0],\n \"8,11\": [0, 154, 0],\n \"8,12\": [0, -155, 0],\n \"8,13\": [0, -103, -1],\n \"8,14\": [0, -52, 0],\n \"9,10\": [0, 51, 0],\n \"9,11\": [-1, 103, 1],\n \"9,12\": [0, 154, 0],\n \"9,13\": [0, -154, 0],\n \"9,14\": [2, -103, 2],\n \"10,11\": [0, 51, 0],\n \"10,12\": [0, 103, 0],\n \"10,13\": [0, 154, 0],\n \"10,14\": [0, -154, 0],\n \"11,12\": [0, 52, 0],\n \"11,13\": [0, 103, -1],\n \"11,14\": [0, 155, 0],\n \"12,13\": [0, 52, 0],\n \"12,14\": [3, 103, -3],\n \"13,14\": [-1, 51, 1]\n }\n },\n \"d16\": {\n \"metadata\": {\n \"version\": 4.5,\n \"type\": \"BufferGeometry\",\n \"generator\": \"BufferGeometry.toJSON\"\n },\n \"uuid\": \"C14C9443-AE98-4545-B8F9-EEF68D99E5CB\",\n \"type\": \"BufferGeometry\",\n \"data\": {\n \"attributes\": {\n \"position\": {\n \"itemSize\": 3,\n \"type\": \"Float32Array\",\n \"array\": [1.9203956127166748,-75.6114730834961,4.636213302612305,1.9203956127166748,-75.6114730834961,4.636213302612305,1.9203956127166748,-75.6114730834961,4.636213302612305,1.9203956127166748,-75.6114730834961,4.636213302612305,1.9203956127166748,-75.6114730834961,4.636213302612305,1.9203956127166748,-75.6114730834961,4.636213302612305,-1.9200903177261353,1.4698024988174438,78.77789306640625,-1.9200903177261353,1.4698024988174438,78.77789306640625,-1.9200903177261353,1.4698024988174438,78.77789306640625,-1.9200903177261353,1.4698024988174438,78.77789306640625,-1.9200903177261353,1.4698024988174438,78.77789306640625,57.06234359741211,-1.4698084592819214,54.34610366821289,57.06234359741211,-1.4698084592819214,54.34610366821289,57.06234359741211,-1.4698084592819214,54.34610366821289,57.06234359741211,-1.4698084592819214,54.34610366821289,57.06234359741211,-1.4698084592819214,54.34610366821289,-1.9204055070877075,-75.6114730834961,-4.63621187210083,-1.9204055070877075,-75.6114730834961,-4.63621187210083,-1.9204055070877075,-75.6114730834961,-4.63621187210083,-1.9204055070877075,-75.6114730834961,-4.63621187210083,-1.9204055070877075,-75.6114730834961,-4.63621187210083,54.34610366821289,1.4697924852371216,-57.06234359741211,54.34610366821289,1.4697924852371216,-57.06234359741211,54.34610366821289,1.4697924852371216,-57.06234359741211,54.34610366821289,1.4697924852371216,-57.06234359741211,54.34610366821289,1.4697924852371216,-57.06234359741211,1.9206753969192505,1.4697996377944946,78.77787780761719,1.9206753969192505,1.4697996377944946,78.77787780761719,1.9206753969192505,1.4697996377944946,78.77787780761719,1.9206753969192505,1.4697996377944946,78.77787780761719,1.9206753969192505,1.4697996377944946,78.77787780761719,1.9206753969192505,1.4697996377944946,78.77787780761719,-4.6361985206604,75.6114730834961,1.9204007387161255,-4.6361985206604,75.6114730834961,1.9204007387161255,-4.6361985206604,75.6114730834961,1.9204007387161255,-4.6361985206604,75.6114730834961,1.9204007387161255,-4.6361985206604,75.6114730834961,1.9204007387161255,-57.06234359741211,1.469807744026184,-54.34610366821289,-57.06234359741211,1.469807744026184,-54.34610366821289,-57.06234359741211,1.469807744026184,-54.34610366821289,-57.06234359741211,1.469807744026184,-54.34610366821289,-57.06234359741211,1.469807744026184,-54.34610366821289,-57.06234359741211,1.469807744026184,-54.34610366821289,-57.06234359741211,1.469807744026184,-54.34610366821289,78.77787780761719,-1.4698125123977661,-1.9206798076629639,78.77787780761719,-1.4698125123977661,-1.9206798076629639,78.77787780761719,-1.4698125123977661,-1.9206798076629639,78.77787780761719,-1.4698125123977661,-1.9206798076629639,78.77787780761719,-1.4698125123977661,-1.9206798076629639,78.77787780761719,-1.4698125123977661,-1.9206798076629639,4.6362080574035645,-75.6114730834961,-1.9204015731811523,4.6362080574035645,-75.6114730834961,-1.9204015731811523,4.6362080574035645,-75.6114730834961,-1.9204015731811523,4.6362080574035645,-75.6114730834961,-1.9204015731811523,4.6362080574035645,-75.6114730834961,-1.9204015731811523,4.6362080574035645,-75.6114730834961,-1.9204015731811523,57.06194305419922,-1.4698078632354736,-54.346519470214844,57.06194305419922,-1.4698078632354736,-54.346519470214844,57.06194305419922,-1.4698078632354736,-54.346519470214844,57.06194305419922,-1.4698078632354736,-54.346519470214844,1.9201017618179321,-1.4698004722595215,-78.77789306640625,1.9201017618179321,-1.4698004722595215,-78.77789306640625,1.9201017618179321,-1.4698004722595215,-78.77789306640625,1.9201017618179321,-1.4698004722595215,-78.77789306640625,1.9201017618179321,-1.4698004722595215,-78.77789306640625,54.34610366821289,-1.4698083400726318,-57.06234359741211,54.34610366821289,-1.4698083400726318,-57.06234359741211,54.34610366821289,-1.4698083400726318,-57.06234359741211,54.34610366821289,-1.4698083400726318,-57.06234359741211,54.34610366821289,-1.4698083400726318,-57.06234359741211,54.34610366821289,-1.4698083400726318,-57.06234359741211,57.06194305419922,1.469793438911438,-54.346519470214844,57.06194305419922,1.469793438911438,-54.346519470214844,57.06194305419922,1.469793438911438,-54.346519470214844,57.06194305419922,1.469793438911438,-54.346519470214844,57.06194305419922,1.469793438911438,-54.346519470214844,78.77787780761719,1.4697893857955933,-1.920678734779358,78.77787780761719,1.4697893857955933,-1.920678734779358,78.77787780761719,1.4697893857955933,-1.920678734779358,78.77787780761719,1.4697893857955933,-1.920678734779358,78.77787780761719,1.4697893857955933,-1.920678734779358,-54.34610366821289,1.469807505607605,57.06234359741211,-54.34610366821289,1.469807505607605,57.06234359741211,-54.34610366821289,1.469807505607605,57.06234359741211,-54.34610366821289,1.469807505607605,57.06234359741211,-57.06194305419922,-1.469792366027832,54.346519470214844,-57.06194305419922,-1.469792366027832,54.346519470214844,-57.06194305419922,-1.469792366027832,54.346519470214844,-57.06194305419922,-1.469792366027832,54.346519470214844,-78.77787780761719,1.4698104858398438,1.920676589012146,-78.77787780761719,1.4698104858398438,1.920676589012146,-78.77787780761719,1.4698104858398438,1.920676589012146,-78.77787780761719,1.4698104858398438,1.920676589012146,-78.77787780761719,1.4698104858398438,1.920676589012146,-78.77787780761719,1.4698104858398438,1.920676589012146,-57.06234359741211,-1.469793438911438,-54.34610366821289,-57.06234359741211,-1.469793438911438,-54.34610366821289,-57.06234359741211,-1.469793438911438,-54.34610366821289,-57.06234359741211,-1.469793438911438,-54.34610366821289,4.6362409591674805,75.6114730834961,1.920365810394287,4.6362409591674805,75.6114730834961,1.920365810394287,4.6362409591674805,75.6114730834961,1.920365810394287,4.6362409591674805,75.6114730834961,1.920365810394287,4.6362409591674805,75.6114730834961,1.920365810394287,-1.9203522205352783,75.6114730834961,4.636227607727051,-1.9203522205352783,75.6114730834961,4.636227607727051,-1.9203522205352783,75.6114730834961,4.636227607727051,-1.9203522205352783,75.6114730834961,4.636227607727051,-1.9203522205352783,75.6114730834961,4.636227607727051,-1.9203522205352783,75.6114730834961,4.636227607727051,-1.9203522205352783,75.6114730834961,4.636227607727051,1.9204154014587402,75.61146545410156,4.636213302612305,1.9204154014587402,75.61146545410156,4.636213302612305,1.9204154014587402,75.61146545410156,4.636213302612305,1.9204154014587402,75.61146545410156,4.636213302612305,1.9204154014587402,75.61146545410156,4.636213302612305,1.9204154014587402,75.61146545410156,4.636213302612305,-1.9203720092773438,-75.6114730834961,4.636226177215576,-1.9203720092773438,-75.6114730834961,4.636226177215576,-1.9203720092773438,-75.6114730834961,4.636226177215576,-1.9203720092773438,-75.6114730834961,4.636226177215576,-1.9203720092773438,-75.6114730834961,4.636226177215576,-4.636218547821045,-75.61146545410156,1.920400619506836,-4.636218547821045,-75.61146545410156,1.920400619506836,-4.636218547821045,-75.61146545410156,1.920400619506836,-4.636218547821045,-75.61146545410156,1.920400619506836,-4.636218547821045,-75.61146545410156,1.920400619506836,-4.636218547821045,-75.61146545410156,1.920400619506836,-4.636231899261475,-75.61146545410156,-1.9203662872314453,-4.636231899261475,-75.61146545410156,-1.9203662872314453,-4.636231899261475,-75.61146545410156,-1.9203662872314453,-4.636231899261475,-75.61146545410156,-1.9203662872314453,-4.636231899261475,-75.61146545410156,-1.9203662872314453,-4.636231899261475,-75.61146545410156,-1.9203662872314453,-4.636231899261475,-75.61146545410156,-1.9203662872314453,-54.34610366821289,-1.4697926044464111,57.06234359741211,-54.34610366821289,-1.4697926044464111,57.06234359741211,-54.34610366821289,-1.4697926044464111,57.06234359741211,-54.34610366821289,-1.4697926044464111,57.06234359741211,-54.34610366821289,-1.4697926044464111,57.06234359741211,-54.34610366821289,-1.4697926044464111,57.06234359741211,-57.06194305419922,1.4698082208633423,54.346519470214844,-57.06194305419922,1.4698082208633423,54.346519470214844,-57.06194305419922,1.4698082208633423,54.346519470214844,-57.06194305419922,1.4698082208633423,54.346519470214844,-57.06194305419922,1.4698082208633423,54.346519470214844,-57.06194305419922,1.4698082208633423,54.346519470214844,-1.9206644296646118,-1.469801664352417,-78.77787780761719,-1.9206644296646118,-1.469801664352417,-78.77787780761719,-1.9206644296646118,-1.469801664352417,-78.77787780761719,-1.9206644296646118,-1.469801664352417,-78.77787780761719,-1.9206644296646118,-1.469801664352417,-78.77787780761719,-1.9206644296646118,-1.469801664352417,-78.77787780761719,78.77789306640625,1.469791293144226,1.9200873374938965,78.77789306640625,1.469791293144226,1.9200873374938965,78.77789306640625,1.469791293144226,1.9200873374938965,78.77789306640625,1.469791293144226,1.9200873374938965,78.77789306640625,1.469791293144226,1.9200873374938965,78.77789306640625,1.469791293144226,1.9200873374938965,57.06234359741211,1.4697922468185425,54.34610366821289,57.06234359741211,1.4697922468185425,54.34610366821289,57.06234359741211,1.4697922468185425,54.34610366821289,57.06234359741211,1.4697922468185425,54.34610366821289,57.06234359741211,1.4697922468185425,54.34610366821289,78.77789306640625,-1.4698106050491333,1.9200865030288696,78.77789306640625,-1.4698106050491333,1.9200865030288696,78.77789306640625,-1.4698106050491333,1.9200865030288696,78.77789306640625,-1.4698106050491333,1.9200865030288696,78.77789306640625,-1.4698106050491333,1.9200865030288696,54.346519470214844,-1.4698073863983154,57.06194305419922,54.346519470214844,-1.4698073863983154,57.06194305419922,54.346519470214844,-1.4698073863983154,57.06194305419922,54.346519470214844,-1.4698073863983154,57.06194305419922,54.346519470214844,-1.4698073863983154,57.06194305419922,54.346519470214844,1.4697927236557007,57.06194305419922,54.346519470214844,1.4697927236557007,57.06194305419922,54.346519470214844,1.4697927236557007,57.06194305419922,54.346519470214844,1.4697927236557007,57.06194305419922,54.346519470214844,1.4697927236557007,57.06194305419922,-78.77789306640625,1.469812273979187,-1.920089602470398,-78.77789306640625,1.469812273979187,-1.920089602470398,-78.77789306640625,1.469812273979187,-1.920089602470398,-78.77789306640625,1.469812273979187,-1.920089602470398,-4.636211395263672,75.6114730834961,-1.920365810394287,-4.636211395263672,75.6114730834961,-1.920365810394287,-4.636211395263672,75.6114730834961,-1.920365810394287,-4.636211395263672,75.6114730834961,-1.920365810394287,-4.636211395263672,75.6114730834961,-1.920365810394287,-4.636211395263672,75.6114730834961,-1.920365810394287,-54.346519470214844,1.4698083400726318,-57.06194305419922,-54.346519470214844,1.4698083400726318,-57.06194305419922,-54.346519470214844,1.4698083400726318,-57.06194305419922,-54.346519470214844,1.4698083400726318,-57.06194305419922,-54.346519470214844,1.4698083400726318,-57.06194305419922,-1.9206633567810059,1.4698004722595215,-78.77787780761719,-1.9206633567810059,1.4698004722595215,-78.77787780761719,-1.9206633567810059,1.4698004722595215,-78.77787780761719,-1.9206633567810059,1.4698004722595215,-78.77787780761719,-1.9206633567810059,1.4698004722595215,-78.77787780761719,-1.9206633567810059,1.4698004722595215,-78.77787780761719,-1.920385479927063,75.6114730834961,-4.636212348937988,-1.920385479927063,75.6114730834961,-4.636212348937988,-1.920385479927063,75.6114730834961,-4.636212348937988,-1.920385479927063,75.6114730834961,-4.636212348937988,-1.920385479927063,75.6114730834961,-4.636212348937988,-1.920385479927063,75.6114730834961,-4.636212348937988,1.9201031923294067,1.469801664352417,-78.77789306640625,1.9201031923294067,1.469801664352417,-78.77789306640625,1.9201031923294067,1.469801664352417,-78.77789306640625,1.9201031923294067,1.469801664352417,-78.77789306640625,1.9201031923294067,1.469801664352417,-78.77789306640625,1.9203814268112183,75.61146545410156,-4.636227130889893,1.9203814268112183,75.61146545410156,-4.636227130889893,1.9203814268112183,75.61146545410156,-4.636227130889893,1.9203814268112183,75.61146545410156,-4.636227130889893,1.9203814268112183,75.61146545410156,-4.636227130889893,1.9203814268112183,75.61146545410156,-4.636227130889893,4.636227607727051,75.61146545410156,-1.9204010963439941,4.636227607727051,75.61146545410156,-1.9204010963439941,4.636227607727051,75.61146545410156,-1.9204010963439941,4.636227607727051,75.61146545410156,-1.9204010963439941,4.636227607727051,75.61146545410156,-1.9204010963439941,4.636227607727051,75.61146545410156,-1.9204010963439941,4.636227607727051,75.61146545410156,-1.9204010963439941,1.9203611612319946,-75.6114730834961,-4.636227130889893,1.9203611612319946,-75.6114730834961,-4.636227130889893,1.9203611612319946,-75.6114730834961,-4.636227130889893,1.9203611612319946,-75.6114730834961,-4.636227130889893,1.9203611612319946,-75.6114730834961,-4.636227130889893,1.9203611612319946,-75.6114730834961,-4.636227130889893,4.636220455169678,-75.6114730834961,1.9203660488128662,4.636220455169678,-75.6114730834961,1.9203660488128662,4.636220455169678,-75.6114730834961,1.9203660488128662,4.636220455169678,-75.6114730834961,1.9203660488128662,4.636220455169678,-75.6114730834961,1.9203660488128662,4.636220455169678,-75.6114730834961,1.9203660488128662,4.636220455169678,-75.6114730834961,1.9203660488128662,-1.9200901985168457,-1.4697996377944946,78.77789306640625,-1.9200901985168457,-1.4697996377944946,78.77789306640625,-1.9200901985168457,-1.4697996377944946,78.77789306640625,-1.9200901985168457,-1.4697996377944946,78.77789306640625,-1.9200901985168457,-1.4697996377944946,78.77789306640625,-1.9200901985168457,-1.4697996377944946,78.77789306640625,1.9206759929656982,-1.4698023796081543,78.77787780761719,1.9206759929656982,-1.4698023796081543,78.77787780761719,1.9206759929656982,-1.4698023796081543,78.77787780761719,1.9206759929656982,-1.4698023796081543,78.77787780761719,1.9206759929656982,-1.4698023796081543,78.77787780761719,-78.77789306640625,-1.4697893857955933,-1.9200888872146606,-78.77789306640625,-1.4697893857955933,-1.9200888872146606,-78.77789306640625,-1.4697893857955933,-1.9200888872146606,-78.77789306640625,-1.4697893857955933,-1.9200888872146606,-78.77789306640625,-1.4697893857955933,-1.9200888872146606,-78.77789306640625,-1.4697893857955933,-1.9200888872146606,-78.77787780761719,-1.4697915315628052,1.9206773042678833,-78.77787780761719,-1.4697915315628052,1.9206773042678833,-78.77787780761719,-1.4697915315628052,1.9206773042678833,-78.77787780761719,-1.4697915315628052,1.9206773042678833,-78.77787780761719,-1.4697915315628052,1.9206773042678833,-78.77787780761719,-1.4697915315628052,1.9206773042678833,-54.346519470214844,-1.4697924852371216,-57.06194305419922,-54.346519470214844,-1.4697924852371216,-57.06194305419922,-54.346519470214844,-1.4697924852371216,-57.06194305419922,-54.346519470214844,-1.4697924852371216,-57.06194305419922,-54.346519470214844,-1.4697924852371216,-57.06194305419922,-54.346519470214844,-1.4697924852371216,-57.06194305419922,0.00001482796960772248,77.15787506103516,4.608693302543543e-7,0.00001482796960772248,77.15787506103516,4.608693302543543e-7,0.00001482796960772248,77.15787506103516,4.608693302543543e-7,0.00001482796960772248,77.15787506103516,4.608693302543543e-7,0.00001482796960772248,77.15787506103516,4.608693302543543e-7,0.00001482796960772248,77.15787506103516,4.608693302543543e-7,0.00001482796960772248,77.15787506103516,4.608693302543543e-7,0.00001482796960772248,77.15787506103516,4.608693302543543e-7,-0.000005149714979779674,-77.15787506103516,8.015119590254471e-8,-0.000005149714979779674,-77.15787506103516,8.015119590254471e-8,-0.000005149714979779674,-77.15787506103516,8.015119590254471e-8,-0.000005149714979779674,-77.15787506103516,8.015119590254471e-8,-0.000005149714979779674,-77.15787506103516,8.015119590254471e-8,-0.000005149714979779674,-77.15787506103516,8.015119590254471e-8,-0.000005149714979779674,-77.15787506103516,8.015119590254471e-8,-0.000005149714979779674,-77.15787506103516,8.015119590254471e-8],\n \"normalized\": false\n },\n \"normal\": {\n \"itemSize\": 3,\n \"type\": \"Float32Array\",\n \"array\": [0.276015043258667,-0.6926735639572144,0.6663474440574646,0.27601727843284607,-0.6926627159118652,0.6663578748703003,0.2760189175605774,-0.692660391330719,0.6663596630096436,0.2760222256183624,-0.6926570534706116,0.6663616299629211,0.276040256023407,-0.6926739811897278,0.6663366556167603,0.276040256023407,-0.6926739811897278,0.6663366556167603,-0.25681689381599426,0.6585057377815247,0.707400381565094,-0.25677764415740967,0.6585237979888916,0.7073978781700134,-0.25676974654197693,0.6585195064544678,0.7074047327041626,-0.25676843523979187,0.658514142036438,0.7074101567268372,-0.25676360726356506,0.6585231423377991,0.7074034810066223,0.6817693710327148,-0.6585230231285095,0.3186502456665039,0.6817746758460999,-0.6585193276405334,0.31864672899246216,0.6817750930786133,-0.6585239171981812,0.3186362087726593,0.6817806363105774,-0.6585127711296082,0.3186471462249756,0.6818035244941711,-0.6585102081298828,0.3186035752296448,-0.27603888511657715,-0.6926746368408203,-0.6663365960121155,-0.27603888511657715,-0.6926746368408203,-0.6663365960121155,-0.2760240435600281,-0.6926567554473877,-0.6663613319396973,-0.27601906657218933,-0.6926603317260742,-0.6663596034049988,-0.276016503572464,-0.6926576495170593,-0.6663634777069092,0.31860223412513733,0.6585102677345276,-0.6818041205406189,0.31864118576049805,0.6585193872451782,-0.6817771792411804,0.31864672899246216,0.6585192680358887,-0.6817746162414551,0.31865164637565613,0.6585074067115784,-0.6817838549613953,0.3186781108379364,0.6585215926170349,-0.6817577481269836,0.2567409873008728,0.6585215926170349,0.7074131965637207,0.2567734122276306,0.6585090756416321,0.7074129581451416,0.2567753195762634,0.6585192680358887,0.7074028849601746,0.2567766308784485,0.6585201025009155,0.7074016332626343,0.25684815645217896,0.6585031747817993,0.7073915004730225,0.2568749189376831,0.6584857106208801,0.707397997379303,-0.6663634181022644,0.6926576495170593,0.2760165333747864,-0.6663627028465271,0.6926561594009399,0.27602237462997437,-0.6663594245910645,0.6926605105400085,0.27601903676986694,-0.666336178779602,0.6926746368408203,0.2760397791862488,-0.666336178779602,0.6926746368408203,0.2760397791862488,-0.6818409562110901,0.6584908962249756,-0.3185632526874542,-0.6818210482597351,0.6585003733634949,-0.3185865879058838,-0.6817838549613953,0.6585077047348022,-0.3186509609222412,-0.6817764043807983,0.6585201025009155,-0.3186413049697876,-0.6817750930786133,0.6585239171981812,-0.31863611936569214,-0.6817746162414551,0.6585193872451782,-0.3186466097831726,-0.6817693710327148,0.6585230827331543,-0.3186500072479248,0.7073933482170105,-0.6585105061531067,-0.256823867559433,0.7073962092399597,-0.6585232615470886,-0.2567831575870514,0.7074015736579895,-0.6585202813148499,-0.2567760646343231,0.7074017524719238,-0.6585232019424438,-0.25676846504211426,0.707402765750885,-0.658519446849823,-0.25677525997161865,0.7074130177497864,-0.6585090756416321,-0.2567734122276306,0.6663360595703125,-0.6926746964454651,-0.27603980898857117,0.6663360595703125,-0.6926746964454651,-0.27603980898857117,0.6663508415222168,-0.6926715970039368,-0.276012122631073,0.6663575768470764,-0.6926620602607727,-0.27601906657218933,0.6663594841957092,-0.6926604509353638,-0.2760190963745117,0.6663633584976196,-0.6926577091217041,-0.27601656317710876,0.6817554831504822,-0.6585215926170349,-0.31868305802345276,0.6817722320556641,-0.6585193276405334,-0.3186517655849457,0.6817790865898132,-0.6585125923156738,-0.3186511695384979,0.6818022131919861,-0.6585102677345276,-0.3186061382293701,0.2567366063594818,-0.65851891040802,-0.7074173092842102,0.2567683160305023,-0.6585140228271484,-0.7074102163314819,0.2567698359489441,-0.6585193872451782,-0.7074047923088074,0.25684165954589844,-0.6584954261779785,-0.7074009776115417,0.25686919689178467,-0.6584891676902771,-0.7073968052864075,0.3186025023460388,-0.6585103273391724,-0.6818039417266846,0.3186361789703369,-0.6585239768028259,-0.6817750930786133,0.3186422288417816,-0.6585192084312439,-0.6817768216133118,0.31864655017852783,-0.6585193276405334,-0.6817747354507446,0.3186500072479248,-0.6585085988044739,-0.6817831993103027,0.3186507225036621,-0.6585209369659424,-0.6817711591720581,0.6817664504051208,0.6585237383842468,-0.31865495443344116,0.6817724108695984,0.6585192084312439,-0.3186517655849457,0.6817728281021118,0.6585238575935364,-0.31864115595817566,0.6817781925201416,0.6585131287574768,-0.31865185499191284,0.681801974773407,0.6585103869438171,-0.31860649585723877,0.7073934674263,0.6585009098052979,-0.25684863328933716,0.707394540309906,0.6584897637367249,-0.2568739354610443,0.7074029445648193,0.6585192680358887,-0.25677525997161865,0.70740807056427,0.6585136651992798,-0.2567750811576843,0.707412600517273,0.6585222482681274,-0.2567406892776489,-0.318678081035614,0.6585216522216797,0.6817576885223389,-0.3186471462249756,0.6585129499435425,0.6817804574966431,-0.3186464309692383,0.658519446849823,0.6817746758460999,-0.31860098242759705,0.6585105657577515,0.681804358959198,-0.6818021535873413,-0.6585102677345276,0.3186064064502716,-0.6817792654037476,-0.6585121750831604,0.3186511993408203,-0.6817723512649536,-0.6585192680358887,0.31865155696868896,-0.6817554831504822,-0.6585215926170349,0.31868308782577515,-0.7074131965637207,0.6585215926170349,0.2567409873008728,-0.7074130773544312,0.6585090756416321,0.2567734122276306,-0.7074027061462402,0.6585195064544678,0.2567752003669739,-0.7074015140533447,0.6585204005241394,0.25677624344825745,-0.7073948979377747,0.6584895253181458,0.25687336921691895,-0.7073922157287598,0.6585012078285217,0.25685107707977295,-0.681803286075592,-0.6585100293159485,-0.3186042904853821,-0.681780993938446,-0.6585121750831604,-0.3186477720737457,-0.6817747354507446,-0.6585192084312439,-0.31864655017852783,-0.6817577481269836,-0.6585215926170349,-0.3186781406402588,0.6663422584533691,0.6926707029342651,0.27603498101234436,0.6663422584533691,0.6926707029342651,0.27603498101234436,0.6663618087768555,0.6926602721214294,0.27601414918899536,0.6663632988929749,0.6926569938659668,0.27601855993270874,0.6663657426834106,0.6926578283309937,0.27601078152656555,-0.276034414768219,0.6926738619804382,0.666339099407196,-0.276034414768219,0.6926738619804382,0.666339099407196,-0.27601510286331177,0.6926615834236145,0.6663600206375122,-0.27601391077041626,0.6926605701446533,0.6663616299629211,-0.2760116159915924,0.6926630735397339,0.6663599014282227,-0.2760094106197357,0.6926736831665039,0.6663497686386108,-0.2760079801082611,0.6926721930503845,0.666351854801178,0.2760111689567566,0.6926732659339905,0.6663495302200317,0.27601638436317444,0.6926575303077698,0.666363537311554,0.276017963886261,0.692661464214325,0.6663587093353271,0.2760191559791565,0.6926603317260742,0.6663596034049988,0.2760407030582428,0.6926730871200562,0.6663374900817871,0.2760407030582428,0.6926730871200562,0.6663374900817871,-0.27603691816329956,-0.6926735043525696,0.6663385629653931,-0.27603691816329956,-0.6926735043525696,0.6663385629653931,-0.27601784467697144,-0.6926572918891907,0.6663633584976196,-0.2760142683982849,-0.692660391330719,0.6663615703582764,-0.2760106921195984,-0.6926577687263489,0.6663656830787659,-0.6663632392883301,-0.6926574110984802,0.27601781487464905,-0.6663596034049988,-0.692660391330719,0.276018887758255,-0.666358232498169,-0.6926620006561279,0.2760181128978729,-0.6663506031036377,-0.6926716566085815,0.27601203322410583,-0.6663397550582886,-0.6926713585853577,0.2760394513607025,-0.6663397550582886,-0.6926713585853577,0.2760394513607025,-0.6663616299629211,-0.6926603317260742,-0.2760140001773834,-0.6663612723350525,-0.6926611661911011,-0.2760130763053894,-0.6663604378700256,-0.6926630735397339,-0.2760102152824402,-0.6663517951965332,-0.6926720142364502,-0.27600860595703125,-0.6663496494293213,-0.6926732659339905,-0.2760104537010193,-0.6663398742675781,-0.6926730871200562,-0.27603474259376526,-0.6663398742675781,-0.6926730871200562,-0.27603474259376526,-0.318651407957077,-0.6585085988044739,0.6817827820777893,-0.31865057349205017,-0.6585232019424438,0.6817690134048462,-0.3186468183994293,-0.6585192680358887,0.6817746758460999,-0.31864237785339355,-0.6585188508033752,0.6817769408226013,-0.3186362087726593,-0.6585239768028259,0.6817749738693237,-0.3185986876487732,-0.6585110425949097,0.6818050146102905,-0.6818026900291443,0.6585108637809753,0.3186039626598358,-0.6817818284034729,0.6585076451301575,0.31865543127059937,-0.681774914264679,0.6585193276405334,0.3186458647251129,-0.6817728281021118,0.6585239171981812,0.31864118576049805,-0.6817721724510193,0.6585193872451782,0.3186517059803009,-0.6817666888237,0.6585231423377991,0.3186558485031128,-0.25682297348976135,-0.6585092544555664,-0.7073948383331299,-0.25678229331970215,-0.6585257649421692,-0.7073943018913269,-0.25677669048309326,-0.6585200428962708,-0.7074015140533447,-0.2567752003669739,-0.6585193276405334,-0.7074028849601746,-0.25677335262298584,-0.6585087776184082,-0.7074132561683655,-0.25676870346069336,-0.6585231423377991,-0.7074016332626343,0.7073953151702881,0.6585105657577515,0.25681835412979126,0.7073976993560791,0.6585239768028259,0.2567773759365082,0.7074037194252014,0.6585230827331543,0.25676336884498596,0.7074037790298462,0.6585202813148499,0.25676998496055603,0.7074049115180969,0.6585192680358887,0.2567700147628784,0.707414984703064,0.658509373664856,0.2567674517631531,0.6817577481269836,0.6585216522216797,0.3186781108379364,0.6817748546600342,0.6585191488265991,0.3186466693878174,0.6817762851715088,0.6585201025009155,0.31864142417907715,0.6817829012870789,0.6585080027580261,0.31865206360816956,0.6818039417266846,0.6585102081298828,0.3186025619506836,0.7073953747749329,-0.6585008502006531,0.25684332847595215,0.7073964476585388,-0.6584898233413696,0.25686851143836975,0.7074047327041626,-0.6585193872451782,0.2567700147628784,0.7074100375175476,-0.6585139036178589,0.25676897168159485,0.7074150443077087,-0.6585217118263245,0.2567354738712311,0.31860607862472534,-0.6585102677345276,0.6818023324012756,0.31864601373672485,-0.6585190892219543,0.6817750334739685,0.31865158677101135,-0.6585192680358887,0.6817724108695984,0.3186558485031128,-0.6585085988044739,0.6817806363105774,0.31868311762809753,-0.6585216522216797,0.6817553639411926,0.31860703229904175,0.658510148525238,0.6818019151687622,0.3186412453651428,0.6585239768028259,0.6817727088928223,0.31865087151527405,0.6585137248039246,0.6817781329154968,0.31865182518959045,0.6585192084312439,0.6817723512649536,0.3186556100845337,0.6585230827331543,0.6817667484283447,-0.707414984703064,0.6585217118263245,-0.25673556327819824,-0.7074099779129028,0.6585142612457275,-0.2567688226699829,-0.7074046730995178,0.6585195064544678,-0.25676992535591125,-0.7073950171470642,0.658510684967041,-0.25681883096694946,-0.666364312171936,0.6926564574241638,-0.2760176658630371,-0.6663615703582764,0.6926605105400085,-0.2760140895843506,-0.6663599610328674,0.6926629543304443,-0.2760114371776581,-0.6663492918014526,0.6926740407943726,-0.27600976824760437,-0.6663401126861572,0.692672848701477,-0.276034951210022,-0.6663401126861572,0.692672848701477,-0.276034951210022,-0.3186555504798889,0.6585217118263245,-0.6817682385444641,-0.3186514973640442,0.6585192680358887,-0.6817724108695984,-0.31865087151527405,0.6585137248039246,-0.6817781329154968,-0.3186410963535309,0.6585239768028259,-0.6817727088928223,-0.31860843300819397,0.6585099697113037,-0.6818014979362488,-0.25687503814697266,0.6584945321083069,-0.7073897123336792,-0.25684797763824463,0.6585018634796143,-0.7073926329612732,-0.25677669048309326,0.6585201025009155,-0.7074015736579895,-0.25677499175071716,0.6585193276405334,-0.7074029445648193,-0.2567721903324127,0.6585090160369873,-0.7074134349822998,-0.256741464138031,0.6585198640823364,-0.7074146270751953,-0.2760404050350189,0.6926735043525696,-0.6663371324539185,-0.2760404050350189,0.6926735043525696,-0.6663371324539185,-0.27601927518844604,0.6926617622375488,-0.6663580536842346,-0.27601882815361023,0.692660391330719,-0.6663596630096436,-0.27601534128189087,0.6926579475402832,-0.6663636565208435,-0.2760111093521118,0.6926732659339905,-0.666349470615387,0.25676339864730835,0.6585231423377991,-0.7074035406112671,0.2567683756351471,0.658514142036438,-0.7074102163314819,0.2567700743675232,0.6585193872451782,-0.7074046730995178,0.2567768692970276,0.6585267186164856,-0.7073954343795776,0.25681787729263306,0.6585150361061096,-0.7073912620544434,0.27600938081741333,0.6926736831665039,-0.6663497090339661,0.27601268887519836,0.6926624774932861,-0.6663600206375122,0.27601420879364014,0.692660391330719,-0.6663615703582764,0.2760183811187744,0.6926562786102295,-0.6663641929626465,0.27603667974472046,0.692672848701477,-0.6663392782211304,0.27603667974472046,0.692672848701477,-0.6663392782211304,0.6663398146629333,0.6926707625389099,-0.2760407030582428,0.6663398146629333,0.6926707625389099,-0.2760407030582428,0.666347861289978,0.6926729083061218,-0.2760158181190491,0.6663495898246765,0.6926727294921875,-0.27601224184036255,0.666358232498169,0.6926625370979309,-0.2760171592235565,0.6663585901260376,0.6926613450050354,-0.27601903676986694,0.6663596630096436,0.6926603317260742,-0.2760190963745117,0.27600938081741333,-0.6926738023757935,-0.6663495302200317,0.27601149678230286,-0.6926628947257996,-0.6663601398468018,0.2760140001773834,-0.6926604509353638,-0.6663616299629211,0.2760170102119446,-0.6926567554473877,-0.6663640737533569,0.27603477239608765,-0.6926739811897278,-0.6663388609886169,0.27603477239608765,-0.6926739811897278,-0.6663388609886169,0.6663395166397095,-0.6926735043525696,0.2760348320007324,0.6663395166397095,-0.6926735043525696,0.2760348320007324,0.6663496494293213,-0.69267338514328,0.2760099768638611,0.6663513779640198,-0.6926727294921875,0.2760077118873596,0.6663597822189331,-0.6926623582839966,0.27601343393325806,0.6663600206375122,-0.6926628947257996,0.2760114371776581,0.6663615703582764,-0.6926604509353638,0.27601417899131775,-0.2568694055080414,-0.6584880352020264,0.7073978185653687,-0.25684303045272827,-0.658505916595459,0.7073907852172852,-0.25677070021629333,-0.6585201025009155,0.7074036002159119,-0.2567701041698456,-0.6585193276405334,0.7074047327041626,-0.2567673623561859,-0.6585090160369873,0.7074152231216431,-0.25673583149909973,-0.6585217118263245,0.7074149250984192,0.25676846504211426,-0.6585231423377991,0.7074017524719238,0.2567743957042694,-0.6585140228271484,0.7074080109596252,0.2567751109600067,-0.6585193276405334,0.7074029445648193,0.25678279995918274,-0.6585239768028259,0.7073957920074463,0.256822794675827,-0.6585081815719604,0.7073959708213806,-0.7074099779129028,-0.6585137248039246,-0.25676944851875305,-0.7074047923088074,-0.6585192680358887,-0.2567698359489441,-0.7074031233787537,-0.6585232019424438,-0.25676456093788147,-0.7073982357978821,-0.658488929271698,-0.2568660080432892,-0.7073976397514343,-0.6585239171981812,-0.2567775249481201,-0.707395076751709,-0.6585009098052979,-0.25684383511543274,-0.7074130177497864,-0.6585085988044739,0.25677454471588135,-0.7074028849601746,-0.6585193872451782,0.2567750811576843,-0.7074017524719238,-0.6585231423377991,0.2567686140537262,-0.7074016332626343,-0.6585202813148499,0.2567755877971649,-0.7073957920074463,-0.6585239171981812,0.2567828893661499,-0.7073920369148254,-0.6585111021995544,0.2568261921405792,-0.31868305802345276,-0.6585215926170349,-0.6817554235458374,-0.3186575174331665,-0.658507764339447,-0.6817806363105774,-0.3186517059803009,-0.6585192084312439,-0.6817723512649536,-0.3186461925506592,-0.658518373966217,-0.6817757487297058,-0.3185906708240509,-0.6585003137588501,-0.6818190813064575,-0.3185673952102661,-0.6584908366203308,-0.6818392276763916,0.000001342588575425907,1,-7.968073134634324e-8,0.000001342588575425907,1,-7.968073134634324e-8,0.000001342588575425907,1,-7.968073134634324e-8,0.000001342588575425907,1,-7.968073134634324e-8,0.000001342588575425907,1,-7.968073134634324e-8,0.000001342588575425907,1,-7.968073134634324e-8,0.000001342588575425907,1,-7.968073134634324e-8,0.000001342588575425907,1,-7.968073134634324e-8,-7.788058837832068e-7,-1,-7.342277541511066e-8,-7.788058837832068e-7,-1,-7.342277541511066e-8,-7.788058837832068e-7,-1,-7.342277541511066e-8,-7.788058837832068e-7,-1,-7.342277541511066e-8,-7.788058837832068e-7,-1,-7.342277541511066e-8,-7.788058837832068e-7,-1,-7.342277541511066e-8,-7.788058837832068e-7,-1,-7.342277541511066e-8,-7.788058837832068e-7,-1,-7.342277541511066e-8],\n \"normalized\": false\n },\n \"uv\": {\n \"itemSize\": 2,\n \"type\": \"Float32Array\",\n \"array\": [0.03048560582101345,0.01567864418029785,0.03048560582101345,0.01567864418029785,0.4374997317790985,0.2620980143547058,0.03719213604927063,0.12196230888366699,0.034566912800073624,0.013053596019744873,0.04797939583659172,0.007471561431884766,0.023779170587658882,0.004848778247833252,0.11408431828022003,0.12196230888366699,0.09070630371570587,0.23767399787902832,0.07480431348085403,0.01567620038986206,0.11408431828022003,0.12196230888366699,0.11983299255371094,0.12196230888366699,0.3407820463180542,0.3628087639808655,0.11983299255371094,0.12196230888366699,0.041273150593042374,0.015676438808441162,0.004617570899426937,0.005231618881225586,0.08821681886911392,0.00785917043685913,0.104537233710289,0.00896519422531128,0.017072739079594612,0.12196230888366699,0.3124997019767761,0.3871912360191345,0.04389829561114311,0.015676259994506836,0.034566912800073624,0.004848778247833252,0.014447606168687344,0.12196230888366699,0.5343227386474609,0.23762238025665283,0.014447606168687344,0.12196230888366699,0.12820686399936676,0.06416767835617065,0.11096081137657166,0.06416738033294678,0.0707232654094696,0.01567620038986206,0.15942715108394623,0.23743665218353271,0.0707232654094696,0.01567620038986206,0.023779170587658882,0.0007677078247070312,0.023779170587658882,0.0007677078247070312,0.07742954790592194,0.12196230888366699,0.007741174660623074,0.12196230888366699,0.5624786019325256,0.012261509895324707,0.061391860246658325,0.013051092624664307,0.07480429112911224,0.007857918739318848,0.01348982285708189,0.004848778247833252,0.01348982285708189,0.004848778247833252,0.027860479429364204,0.12196230888366699,0.027860479429364204,0.12196230888366699,0.12245811522006989,0.06416767835617065,0.4092179536819458,0.11280876398086548,0.12245811522006989,0.06416767835617065,0.07072323560714722,0.005232870578765869,0.12245811522006989,0.06679385900497437,0.06401706486940384,0.12196230888366699,0.12245811522006989,0.06679385900497437,0.21575646102428436,0.36276328563690186,0.06401706486940384,0.12196230888366699,0.05060452222824097,0.007858037948608398,0.06809809058904648,0.007857978343963623,0.09084202349185944,0.12196230888366699,0.09084202349185944,0.12196230888366699,0.18749970197677612,0.26223671436309814,0.06401699781417847,0.015676140785217285,0.12245821952819824,0.12196230888366699,0.15924353897571564,0.36276328563690186,0.09084194898605347,0.015676438808441162,0.03144339099526405,0.000767827033996582,0.13133037090301514,0.003871619701385498,0.04797939583659172,0.12196230888366699,0.03418757766485214,0.362862765789032,0.08725927770137787,0.005232870578765869,0.08725927770137787,0.005232870578765869,0.03144339099526405,0.004848778247833252,0.13133037090301514,0.06416767835617065,0.09492307156324387,0.015676438808441162,0.09081242233514786,0.362862765789032,0.09492307156324387,0.015676438808441162,0.13133037090301514,0.06416767835617065,0.1255817413330078,0.12196230888366699,0.4657820463180542,0.23780876398086548,0.1255817413330078,0.12196230888366699,0.01036630105227232,0.12196230888366699,0.034566912800073624,0.000767827033996582,0.07384677231311798,0.005232870578765869,0.07384677231311798,0.005232870578765869,0.4092180132865906,0.23780876398086548,0.057310834527015686,0.015676259994506836,0.1255817413330078,0.06679385900497437,0.11408431828022003,0.0667925477027893,0.0036600297316908836,0.015675067901611328,0.03429369255900383,0.23767399787902832,0.06497455388307571,0.0011516809463500977,0.06809809058904648,0.005232870578765869,0.09754816442728043,0.015677452087402344,0.15919587016105652,0.48784810304641724,0.12820686399936676,0.12196230888366699,0.13133040070533752,0.06679350137710571,0.07742944359779358,0.01567739248275757,0.5342592000961304,0.11273849010467529,0.07742944359779358,0.01567739248275757,0.05060454457998276,0.0011516809463500977,0.05060454457998276,0.0011516809463500977,0.01036630105227232,0.004848778247833252,0.021154051646590233,0.01567864418029785,0.09083183109760284,0.4878973960876465,0.12558168172836304,0.06416767835617065,0.017355674877762794,0.008966445922851562,0.07771223783493042,0.011559724807739258,0.3124997019767761,0.1371912956237793,0.10425447672605515,0.12196230888366699,0.06139186769723892,0.12196230888366699,0.07072321325540543,0.007857918739318848,0.09112466126680374,0.011558711528778076,0.003660283051431179,0.12196230888366699,0.06249973922967911,0.13732600212097168,0.07480431348085403,0.12196230888366699,0.07480431348085403,0.12196230888366699,0.003660283051431179,0.12196230888366699,0.10833562910556793,0.12196230888366699,0.07072321325540543,0.12196230888366699,0.10833562910556793,0.12196230888366699,0.1875002682209015,0.13756322860717773,0.021154051646590233,0.007474005222320557,0.09492305666208267,0.013051152229309082,0.04418101906776428,0.008964121341705322,0.09783096611499786,0.011559903621673584,0.10162932425737381,0.12196230888366699,0.5625002384185791,0.26224493980407715,0.034566912800073624,0.01567864418029785,0.08821682631969452,0.12196230888366699,0.1874997317790985,0.387151837348938,0.09754827618598938,0.12196230888366699,0.09754827618598938,0.12196230888366699,0.007741096429526806,0.00785684585571289,0.1016293466091156,0.013052403926849365,0.06250026077032089,0.3871026635169983,0.021154044196009636,0.12196230888366699,0.08413578569889069,0.12196230888366699,0.021154044196009636,0.12196230888366699,0.08413578569889069,0.12196230888366699,0.0036600297316908836,0.00785684585571289,0.10833562910556793,0.0074727535247802734,0.10162932425737381,0.015677452087402344,0.11096075177192688,0.0667925477027893,0.5907518267631531,0.3627550005912781,0.10162932425737381,0.015677452087402344,0.11096075177192688,0.0667925477027893,0.06809809058904648,0.0011516809463500977,0.06497455388307571,0.005232870578765869,0.007741174660623074,0.015675067901611328,0.007741174660623074,0.015675067901611328,0.13133040070533752,0.12196230888366699,0.5907407999038696,0.11272633075714111,0.13133040070533752,0.12196230888366699,0.08725927770137787,0.0011516809463500977,0.11670946329832077,0.003871321678161621,0.04389836639165878,0.12196230888366699,0.3407820463180542,0.4878087639808655,0.04389836639165878,0.12196230888366699,0.11670946329832077,0.003871321678161621,0.07384677231311798,0.0011516809463500977,0.11670953035354614,0.06679290533065796,0.11670953035354614,0.06679290533065796,0.06139186769723892,0.015676259994506836,0.34078195691108704,0.2378087043762207,0.06139186769723892,0.015676259994506836,0.11670944094657898,0.12196230888366699,0.2842180132865906,0.2378087043762207,0.1042545735836029,0.01567751169204712,0.1042545735836029,0.01567751169204712,0.007741096429526806,0.005231618881225586,0.07072323560714722,0.0011516809463500977,0.07072323560714722,0.0011516809463500977,0.2842179536819458,0.3628087639808655,0.06809809058904648,0.12196230888366699,0.11983299255371094,0.06679290533065796,0.004617570899426937,0.0011506080627441406,0.03719203174114227,0.015676438808441162,0.40916556119918823,0.3629019856452942,0.03719203174114227,0.015676438808441162,0.11408430337905884,0.003871619701385498,0.007741096429526806,0.0011506080627441406,0.11096075177192688,0.003871619701385498,0.10833562910556793,0.01567751169204712,0.21557284891605377,0.23743665218353271,0.11096075177192688,0.003871619701385498,0.12245815992355347,0.003871917724609375,0.08151060342788696,0.01567739248275757,0.4657820463180542,0.11280876398086548,0.05060454457998276,0.005232870578765869,0.02786046452820301,0.01567864418029785,0.4374997317790985,0.012191295623779297,0.08151060342788696,0.12196230888366699,0.08151060342788696,0.12196230888366699,0.01036630105227232,0.008966505527496338,0.05759349465370178,0.011558592319488525,0.11983299255371094,0.06416738033294678,0.3407820463180542,0.1128087043762207,0.02377944253385067,0.12196230888366699,0.11983299255371094,0.06416738033294678,0.01348982285708189,0.000767827033996582,0.0841357409954071,0.0011516809463500977,0.0841357409954071,0.0011516809463500977,0.05060460418462753,0.015676259994506836,0.2842179536819458,0.11280876398086548,0.05060460418462753,0.015676259994506836,0.11983299255371094,0.003871321678161621,0.014164685271680355,0.007474005222320557,0.03719203174114227,0.008964121341705322,0.023779170587658882,0.01567864418029785,0.31250008940696716,0.012191236019134521,0.05060452222824097,0.12196230888366699,0.023779170587658882,0.01567864418029785,0.12820683419704437,0.0038716793060302734,0.05468563735485077,0.01567620038986206,0.5906772613525391,0.23762238025665283,0.12820683419704437,0.0038716793060302734,0.0841357409954071,0.005232870578765869,0.05468563735485077,0.12196230888366699,0.05468563735485077,0.12196230888366699,0.5624997615814209,0.1373775601387024,0.014447621069848537,0.015678703784942627,0.02377917803823948,0.008966445922851562,0.040990397334098816,0.007471561431884766,0.027577554807066917,0.007474005222320557,0.08151061087846756,0.01305234432220459,0.05731076002120972,0.12196230888366699,0.010366610251367092,0.015678703784942627,0.05731076002120972,0.12196230888366699,0.010366610251367092,0.015678703784942627,0.4375002980232239,0.13719123601913452,0.04797941446304321,0.015676259994506836,0.04797941446304321,0.015676259994506836,0.06250029802322388,0.262137234210968,0.09492305666208267,0.12196230888366699,0.05468561500310898,0.007858037948608398,0.08413572609424591,0.00785917043685913,0.03076852671802044,0.011561095714569092,0.06401699781417847,0.007857978343963623,0.06809809058904648,0.015676140785217285,0.04127315804362297,0.12196230888366699,0.04127315804362297,0.12196230888366699,0.06809809058904648,0.015676140785217285,0.3125002682209015,0.26219117641448975,0.026902692392468452,0.004848778247833252,0.026902692392468452,0.004848778247833252,0.034566912800073624,0.12196230888366699,0.5342481732368469,0.3627550005912781,0.034566912800073624,0.12196230888366699,0.11096090078353882,0.12196230888366699,0.11408430337905884,0.06416738033294678,0.03048589639365673,0.12196230888366699,0.46583443880081177,0.3629019856452942,0.11408430337905884,0.06416738033294678,0.026902692392468452,0.0007677078247070312,0.08413572609424591,0.015676140785217285,0.034168168902397156,0.4878973960876465,0.12558168172836304,0.003871917724609375,0.05372808128595352,0.005232870578765869,0.12558168172836304,0.003871917724609375,0.05372808128595352,0.005232870578765869,0.08821682631969452,0.015676140785217285,0.21580412983894348,0.48784810304641724,0.12820687890052795,0.06679350137710571,0.08821682631969452,0.015676140785217285,0.12820687890052795,0.06679350137710571,0.05372808128595352,0.0011516809463500977,0.11670944094657898,0.06416738033294678,0.01707303337752819,0.01567864418029785,0.2842179536819458,0.4878087639808655,0.01707303337752819,0.01567864418029785,0.01036630105227232,0.000767827033996582,0.01036630105227232,0.000767827033996582,0.014164685271680355,0.013053655624389648,0.021154051646590233,0.013053596019744873,0.027577554807066917,0.013053596019744873,0.040990397334098816,0.013051152229309082,0.061391860246658325,0.00747150182723999,0.07276374846696854,0.013051033020019531,0.08151061087846756,0.007472634315490723,0.09492305666208267,0.007471621036529541,0.005700557492673397,0.013049840927124023,0.034566912800073624,0.007474005222320557,0.04797939583659172,0.013051152229309082,0.052645064890384674,0.013051152229309082,0.06605753302574158,0.013051152229309082,0.08617626875638962,0.01305234432220459,0.1016293466091156,0.0074727535247802734,0.10833562910556793,0.013052403926849365],\n \"normalized\": false\n }\n },\n \"index\": {\n \"type\": \"Uint16Array\",\n \"array\": [97,128,249,171,245,2,83,8,107,137,120,240,12,236,166,262,150,19,23,208,213,190,203,197,78,72,223,101,160,157,255,123,87,114,28,177,91,145,34,42,181,184,48,54,57,238,31,6,76,165,44,254,130,122,108,27,112,126,133,274,192,152,260,142,106,33,38,265,95,253,93,182,185,90,32,239,0,244,69,53,227,212,198,204,161,111,176,129,261,18,85,84,141,258,146,89,13,155,159,219,156,79,139,10,81,169,163,174,170,233,14,21,59,65,125,138,86,73,47,56,40,205,191,224,149,61,246,178,26,222,24,214,250,41,98,232,46,167,209,70,60,63,194,210,68,226,62,36,104,271,105,116,273,115,99,267,100,218,272,217,215,268,216,201,269,200,187,266,188,35,270,134,17,281,16,229,279,228,50,277,51,231,278,230,4,275,5,117,276,118,127,280,237,247,30,77,153,164,257,248,132,109,9,29,189,199,148,143,82,110,37,193,264,251,259,94,186,180,92,241,121,1,67,58,52,211,207,196,162,102,113,131,96,263,85,140,84,256,88,144,11,168,154,221,103,158,136,242,7,169,15,163,172,3,234,21,75,59,124,119,135,71,80,45,39,183,202,225,20,151,243,173,175,220,74,22,252,179,43,235,55,49,206,25,66,64,147,195]\n },\n \"boundingSphere\": {\n \"center\": [0,0,0],\n \"radius\": 135.51845097955697\n }\n },\n faceValues: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16],\n rotationCombinations: {\n \"1,2\": [-1, -46, -1],\n \"1,3\": [44, -91, 44],\n \"1,4\": [0, -135, 0],\n \"1,5\": [-1, 179, 1],\n \"1,6\": [-1, 134, 1],\n \"1,7\": [44, 89, -44],\n \"1,8\": [1, 44, -2],\n \"1,9\": [-1, 0, 180],\n \"1,10\": [-2, -45, 179],\n \"1,11\": [-103, -89, 78],\n \"1,12\": [-180, -45, 0],\n \"1,13\": [179, 2, 1],\n \"1,14\": [179, 46, 1],\n \"1,15\": [13, 89, 166],\n \"1,16\": [0, 44, 179],\n \"2,3\": [0, -45, 0],\n \"2,4\": [43, -90, 43],\n \"2,5\": [0, -135, 0],\n \"2,6\": [0, 180, 0],\n \"2,7\": [0, 135, 0],\n \"2,8\": [38, 89, -39],\n \"2,9\": [0, 45, -180],\n \"2,10\": [0, 0, 180],\n \"2,11\": [-1, -45, 179],\n \"2,12\": [-3, -89, 177],\n \"2,13\": [-180, -44, 1],\n \"2,14\": [-179, 0, 0],\n \"2,15\": [-179, 45, 0],\n \"2,16\": [-6, 90, -174],\n \"3,4\": [0, -45, 0],\n \"3,5\": [-54, -90, -54],\n \"3,6\": [0, -135, 0],\n \"3,7\": [0, -180, 0],\n \"3,8\": [-1, 134, 0],\n \"3,9\": [-177, 90, -3],\n \"3,10\": [-1, 45, -180],\n \"3,11\": [-1, 0, 180],\n \"3,12\": [0, -44, 179],\n \"3,13\": [-179, -89, 2],\n \"3,14\": [-179, -45, 1],\n \"3,15\": [-180, 0, 0],\n \"3,16\": [-180, 45, 0],\n \"4,5\": [0, -45, 1],\n \"4,6\": [-47, -90, -47],\n \"4,7\": [-1, -135, 0],\n \"4,8\": [-1, 179, -1],\n \"4,9\": [-180, 45, 0],\n \"4,10\": [-98, 89, -83],\n \"4,11\": [-1, 45, -179],\n \"4,12\": [0, 1, 180],\n \"4,13\": [0, -46, -179],\n \"4,14\": [-161, -89, 20],\n \"4,15\": [180, -44, 0],\n \"4,16\": [180, 1, 0],\n \"5,6\": [-1, -45, 0],\n \"5,7\": [-60, -90, -59],\n \"5,8\": [-1, -136, -1],\n \"5,9\": [180, -1, 1],\n \"5,10\": [180, 44, 0],\n \"5,11\": [-159, 89, -21],\n \"5,12\": [0, 46, 179],\n \"5,13\": [0, -1, -180],\n \"5,14\": [-1, -45, 179],\n \"5,15\": [-109, -89, 72],\n \"5,16\": [-180, -45, 0],\n \"6,7\": [0, -45, 0],\n \"6,8\": [-38, -91, -39],\n \"6,9\": [-180, -45, 0],\n \"6,10\": [-180, 0, 0],\n \"6,11\": [-179, 45, -1],\n \"6,12\": [-177, 89, -3],\n \"6,13\": [0, 44, -179],\n \"6,14\": [-1, 0, -180],\n \"6,15\": [-1, -45, 180],\n \"6,16\": [-174, -90, 6],\n \"7,8\": [1, -46, 0],\n \"7,9\": [-3, -90, 177],\n \"7,10\": [-179, -45, 0],\n \"7,11\": [-179, 0, 0],\n \"7,12\": [-180, 44, -1],\n \"7,13\": [-1, 89, -178],\n \"7,14\": [-1, 45, -179],\n \"7,15\": [0, 0, -180],\n \"7,16\": [0, -45, 180],\n \"8,9\": [0, -44, -179],\n \"8,10\": [12, -89, -167],\n \"8,11\": [179, -46, -1],\n \"8,12\": [179, -2, -1],\n \"8,13\": [-180, 45, 0],\n \"8,14\": [-109, 89, -71],\n \"8,15\": [-2, 45, -178],\n \"8,16\": [-1, 0, -180],\n \"9,10\": [1, 45, -1],\n \"9,11\": [89, 89, -89],\n \"9,12\": [0, 135, 0],\n \"9,13\": [0, -179, 1],\n \"9,14\": [0, -134, 0],\n \"9,15\": [7, -89, 7],\n \"9,16\": [0, -44, -1],\n \"10,11\": [0, 45, 0],\n \"10,12\": [-9, 89, 8],\n \"10,13\": [0, 136, 1],\n \"10,14\": [-1, -179, 0],\n \"10,15\": [-1, -134, 0],\n \"10,16\": [11, -89, 12],\n \"11,12\": [-1, 45, -1],\n \"11,13\": [4, 91, -4],\n \"11,14\": [-1, 136, 1],\n \"11,15\": [-1, -179, 0],\n \"11,16\": [-1, -134, 0],\n \"12,13\": [-1, 47, 2],\n \"12,14\": [6, 91, -6],\n \"12,15\": [0, 136, 0],\n \"12,16\": [0, -179, -1],\n \"13,14\": [1, 44, -1],\n \"13,15\": [68, 89, -68],\n \"13,16\": [-1, 135, 1],\n \"14,15\": [0, 45, 0],\n \"14,16\": [-86, 90, 85],\n \"15,16\": [0, 45, -1]\n }\n },\n \"d20\": {\n \"metadata\": {\n \"version\": 4.5,\n \"type\": \"BufferGeometry\",\n \"generator\": \"BufferGeometry.toJSON\"\n },\n \"uuid\": \"4947963B-5ABA-4507-A373-1DA7805EB4DE\",\n \"type\": \"BufferGeometry\",\n \"data\": {\n \"attributes\": {\n \"position\": {\n \"itemSize\": 3,\n \"type\": \"Float32Array\",\n \"array\": [-83.39456939697266, 2.066877841949463, 52.33057403564453, -83.39456939697266, 2.066877841949463, 52.33057403564453, -83.39456939697266, 2.066877841949463, 52.33057403564453, -83.39456939697266, 2.066877841949463, 52.33057403564453, -53.607669830322266, 82.60527038574219, 0.00019691196212079376, -53.607669830322266, 82.60527038574219, 0.00019691196212079376, -53.607669830322266, 82.60527038574219, 0.00019691196212079376, -53.607669830322266, 82.60527038574219, 0.00019691196212079376, -84.67233276367188, 1.2774014472961426, -50.26307678222656, -84.67233276367188, 1.2774014472961426, -50.26307678222656, -84.67233276367188, 1.2774014472961426, -50.26307678222656, -84.67233276367188, 1.2774014472961426, -50.26307678222656, -84.67233276367188, -1.2774014472961426, -50.26307678222656, -84.67233276367188, -1.2774014472961426, -50.26307678222656, -84.67233276367188, -1.2774014472961426, -50.26307678222656, -84.67233276367188, -1.2774014472961426, -50.26307678222656, -52.330257415771484, -83.39476013183594, 2.0670700073242188, -52.330257415771484, -83.39476013183594, 2.0670700073242188, -52.330257415771484, -83.39476013183594, 2.0670700073242188, -52.330257415771484, -83.39476013183594, 2.0670700073242188, -1.2770904302597046, -50.263389587402344, 84.67215728759766, -1.2770904302597046, -50.263389587402344, 84.67215728759766, -1.2770904302597046, -50.263389587402344, 84.67215728759766, -1.2770904302597046, -50.263389587402344, 84.67215728759766, -52.33027648925781, 83.39476013183594, -2.066685438156128, -52.33027648925781, 83.39476013183594, -2.066685438156128, -52.33027648925781, 83.39476013183594, -2.066685438156128, -52.33027648925781, 83.39476013183594, -2.066685438156128, -50.26338577270508, 84.67214965820312, 1.2775861024856567, -50.26338577270508, 84.67214965820312, 1.2775861024856567, -50.26338577270508, 84.67214965820312, 1.2775861024856567, -50.26338577270508, 84.67214965820312, 1.2775861024856567, 1.2777124643325806, -50.263389587402344, 84.6721420288086, 1.2777124643325806, -50.263389587402344, 84.6721420288086, 1.2777124643325806, -50.263389587402344, 84.6721420288086, 1.2777124643325806, -50.263389587402344, 84.6721420288086, -2.0671839714050293, -52.330265045166016, -83.39474487304688, -2.0671839714050293, -52.330265045166016, -83.39474487304688, -2.0671839714050293, -52.330265045166016, -83.39474487304688, -2.0671839714050293, -52.330265045166016, -83.39474487304688, 83.39456939697266, 2.066877841949463, -52.33057403564453, 83.39456939697266, 2.066877841949463, -52.33057403564453, 83.39456939697266, 2.066877841949463, -52.33057403564453, 83.39456939697266, 2.066877841949463, -52.33057403564453, 84.67233276367188, 1.2774014472961426, 50.26307678222656, 84.67233276367188, 1.2774014472961426, 50.26307678222656, 84.67233276367188, 1.2774014472961426, 50.26307678222656, 84.67233276367188, 1.2774014472961426, 50.26307678222656, 53.607669830322266, -82.60527038574219, -0.00019691196212079376, 53.607669830322266, -82.60527038574219, -0.00019691196212079376, 53.607669830322266, -82.60527038574219, -0.00019691196212079376, 53.607669830322266, -82.60527038574219, -0.00019691196212079376, 83.39456939697266, -2.066877841949463, -52.33057403564453, 83.39456939697266, -2.066877841949463, -52.33057403564453, 83.39456939697266, -2.066877841949463, -52.33057403564453, 83.39456939697266, -2.066877841949463, -52.33057403564453, 1.2770904302597046, 50.263389587402344, -84.67215728759766, 1.2770904302597046, 50.263389587402344, -84.67215728759766, 1.2770904302597046, 50.263389587402344, -84.67215728759766, 1.2770904302597046, 50.263389587402344, -84.67215728759766, 50.26338577270508, 84.67214965820312, -1.2775861024856567, 50.26338577270508, 84.67214965820312, -1.2775861024856567, 50.26338577270508, 84.67214965820312, -1.2775861024856567, 50.26338577270508, 84.67214965820312, -1.2775861024856567, 83.39495086669922, -2.066877841949463, 52.329959869384766, 83.39495086669922, -2.066877841949463, 52.329959869384766, 83.39495086669922, -2.066877841949463, 52.329959869384766, 83.39495086669922, -2.066877841949463, 52.329959869384766, -50.26339340209961, -84.67214965820312, -1.2772167921066284, -50.26339340209961, -84.67214965820312, -1.2772167921066284, -50.26339340209961, -84.67214965820312, -1.2772167921066284, -50.26339340209961, -84.67214965820312, -1.2772167921066284, -1.2777124643325806, -50.263389587402344, -84.6721420288086, -1.2777124643325806, -50.263389587402344, -84.6721420288086, -1.2777124643325806, -50.263389587402344, -84.6721420288086, -1.2777124643325806, -50.263389587402344, -84.6721420288086, -52.330257415771484, 83.39476013183594, 2.0670700073242188, -52.330257415771484, 83.39476013183594, 2.0670700073242188, -52.330257415771484, 83.39476013183594, 2.0670700073242188, -52.330257415771484, 83.39476013183594, 2.0670700073242188, -82.60507202148438, 0, 53.60797119140625, -82.60507202148438, 0, 53.60797119140625, -82.60507202148438, 0, 53.60797119140625, -82.60507202148438, 0, 53.60797119140625, -2.0665714740753174, 52.330265045166016, 83.39476776123047, -2.0665714740753174, 52.330265045166016, 83.39476776123047, -2.0665714740753174, 52.330265045166016, 83.39476776123047, -2.0665714740753174, 52.330265045166016, 83.39476776123047, -84.67196655273438, -1.2774014472961426, 50.26369857788086, -84.67196655273438, -1.2774014472961426, 50.26369857788086, -84.67196655273438, -1.2774014472961426, 50.26369857788086, -84.67196655273438, -1.2774014472961426, 50.26369857788086, -84.67196655273438, 1.2774014472961426, 50.26369857788086, -84.67196655273438, 1.2774014472961426, 50.26369857788086, -84.67196655273438, 1.2774014472961426, 50.26369857788086, -84.67196655273438, 1.2774014472961426, 50.26369857788086, -53.607669830322266, -82.60527038574219, 0.00019691196212079376, -53.607669830322266, -82.60527038574219, 0.00019691196212079376, -53.607669830322266, -82.60527038574219, 0.00019691196212079376, -53.607669830322266, -82.60527038574219, 0.00019691196212079376, -83.39456939697266, -2.066877841949463, 52.33057403564453, -83.39456939697266, -2.066877841949463, 52.33057403564453, -83.39456939697266, -2.066877841949463, 52.33057403564453, -83.39456939697266, -2.066877841949463, 52.33057403564453, -52.33027648925781, -83.39476013183594, -2.066685438156128, -52.33027648925781, -83.39476013183594, -2.066685438156128, -52.33027648925781, -83.39476013183594, -2.066685438156128, -52.33027648925781, -83.39476013183594, -2.066685438156128, -2.0665714740753174, -52.330265045166016, 83.39476776123047, -2.0665714740753174, -52.330265045166016, 83.39476776123047, -2.0665714740753174, -52.330265045166016, 83.39476776123047, -2.0665714740753174, -52.330265045166016, 83.39476776123047, -1.2770904302597046, 50.263389587402344, 84.67215728759766, -1.2770904302597046, 50.263389587402344, 84.67215728759766, -1.2770904302597046, 50.263389587402344, 84.67215728759766, -1.2770904302597046, 50.263389587402344, 84.67215728759766, -0.0003034261171706021, 53.607669830322266, -82.60527038574219, -0.0003034261171706021, 53.607669830322266, -82.60527038574219, -0.0003034261171706021, 53.607669830322266, -82.60527038574219, -0.0003034261171706021, 53.607669830322266, -82.60527038574219, -2.0671839714050293, 52.330265045166016, -83.39474487304688, -2.0671839714050293, 52.330265045166016, -83.39474487304688, -2.0671839714050293, 52.330265045166016, -83.39474487304688, -2.0671839714050293, 52.330265045166016, -83.39474487304688, -83.39495086669922, 2.066877841949463, -52.329959869384766, -83.39495086669922, 2.066877841949463, -52.329959869384766, -83.39495086669922, 2.066877841949463, -52.329959869384766, -83.39495086669922, 2.066877841949463, -52.329959869384766, 50.26339340209961, 84.67214965820312, 1.2772167921066284, 50.26339340209961, 84.67214965820312, 1.2772167921066284, 50.26339340209961, 84.67214965820312, 1.2772167921066284, 50.26339340209961, 84.67214965820312, 1.2772167921066284, -50.26339340209961, 84.67214965820312, -1.2772167921066284, -50.26339340209961, 84.67214965820312, -1.2772167921066284, -50.26339340209961, 84.67214965820312, -1.2772167921066284, -50.26339340209961, 84.67214965820312, -1.2772167921066284, 2.0671839714050293, 52.330265045166016, 83.39474487304688, 2.0671839714050293, 52.330265045166016, 83.39474487304688, 2.0671839714050293, 52.330265045166016, 83.39474487304688, 2.0671839714050293, 52.330265045166016, 83.39474487304688, 82.60547637939453, 0, 53.607364654541016, 82.60547637939453, 0, 53.607364654541016, 82.60547637939453, 0, 53.607364654541016, 82.60547637939453, 0, 53.607364654541016, 83.39495086669922, 2.066877841949463, 52.329959869384766, 83.39495086669922, 2.066877841949463, 52.329959869384766, 83.39495086669922, 2.066877841949463, 52.329959869384766, 83.39495086669922, 2.066877841949463, 52.329959869384766, 50.26339340209961, -84.67214965820312, 1.2772167921066284, 50.26339340209961, -84.67214965820312, 1.2772167921066284, 50.26339340209961, -84.67214965820312, 1.2772167921066284, 50.26339340209961, -84.67214965820312, 1.2772167921066284, 2.0671839714050293, -52.330265045166016, 83.39474487304688, 2.0671839714050293, -52.330265045166016, 83.39474487304688, 2.0671839714050293, -52.330265045166016, 83.39474487304688, 2.0671839714050293, -52.330265045166016, 83.39474487304688, 50.26338577270508, -84.67214965820312, -1.2775861024856567, 50.26338577270508, -84.67214965820312, -1.2775861024856567, 50.26338577270508, -84.67214965820312, -1.2775861024856567, 50.26338577270508, -84.67214965820312, -1.2775861024856567, -83.39495086669922, -2.066877841949463, -52.329959869384766, -83.39495086669922, -2.066877841949463, -52.329959869384766, -83.39495086669922, -2.066877841949463, -52.329959869384766, -83.39495086669922, -2.066877841949463, -52.329959869384766, -82.60547637939453, 0, -53.607364654541016, -82.60547637939453, 0, -53.607364654541016, -82.60547637939453, 0, -53.607364654541016, -82.60547637939453, 0, -53.607364654541016, 52.330257415771484, 83.39476013183594, -2.0670700073242188, 52.330257415771484, 83.39476013183594, -2.0670700073242188, 52.330257415771484, 83.39476013183594, -2.0670700073242188, 52.330257415771484, 83.39476013183594, -2.0670700073242188, 53.607669830322266, 82.60527038574219, -0.00019691196212079376, 53.607669830322266, 82.60527038574219, -0.00019691196212079376, 53.607669830322266, 82.60527038574219, -0.00019691196212079376, 53.607669830322266, 82.60527038574219, -0.00019691196212079376, 2.0665714740753174, 52.330265045166016, -83.39476776123047, 2.0665714740753174, 52.330265045166016, -83.39476776123047, 2.0665714740753174, 52.330265045166016, -83.39476776123047, 2.0665714740753174, 52.330265045166016, -83.39476776123047, 84.67233276367188, -1.2774014472961426, 50.26307678222656, 84.67233276367188, -1.2774014472961426, 50.26307678222656, 84.67233276367188, -1.2774014472961426, 50.26307678222656, 84.67233276367188, -1.2774014472961426, 50.26307678222656, 84.67196655273438, -1.2774014472961426, -50.26369857788086, 84.67196655273438, -1.2774014472961426, -50.26369857788086, 84.67196655273438, -1.2774014472961426, -50.26369857788086, 84.67196655273438, -1.2774014472961426, -50.26369857788086, 84.67196655273438, 1.2774014472961426, -50.26369857788086, 84.67196655273438, 1.2774014472961426, -50.26369857788086, 84.67196655273438, 1.2774014472961426, -50.26369857788086, 84.67196655273438, 1.2774014472961426, -50.26369857788086, 52.33027648925781, 83.39476013183594, 2.066685438156128, 52.33027648925781, 83.39476013183594, 2.066685438156128, 52.33027648925781, 83.39476013183594, 2.066685438156128, 52.33027648925781, 83.39476013183594, 2.066685438156128, 52.330257415771484, -83.39476013183594, -2.0670700073242188, 52.330257415771484, -83.39476013183594, -2.0670700073242188, 52.330257415771484, -83.39476013183594, -2.0670700073242188, 52.330257415771484, -83.39476013183594, -2.0670700073242188, 82.60507202148438, 0, -53.60797119140625, 82.60507202148438, 0, -53.60797119140625, 82.60507202148438, 0, -53.60797119140625, 82.60507202148438, 0, -53.60797119140625, 52.33027648925781, -83.39476013183594, 2.066685438156128, 52.33027648925781, -83.39476013183594, 2.066685438156128, 52.33027648925781, -83.39476013183594, 2.066685438156128, 52.33027648925781, -83.39476013183594, 2.066685438156128, -50.26338577270508, -84.67214965820312, 1.2775861024856567, -50.26338577270508, -84.67214965820312, 1.2775861024856567, -50.26338577270508, -84.67214965820312, 1.2775861024856567, -50.26338577270508, -84.67214965820312, 1.2775861024856567, 1.2770904302597046, -50.263389587402344, -84.67215728759766, 1.2770904302597046, -50.263389587402344, -84.67215728759766, 1.2770904302597046, -50.263389587402344, -84.67215728759766, 1.2770904302597046, -50.263389587402344, -84.67215728759766, 2.0665714740753174, -52.330265045166016, -83.39476776123047, 2.0665714740753174, -52.330265045166016, -83.39476776123047, 2.0665714740753174, -52.330265045166016, -83.39476776123047, 2.0665714740753174, -52.330265045166016, -83.39476776123047, -0.0003034261171706021, -53.607669830322266, -82.60527038574219, -0.0003034261171706021, -53.607669830322266, -82.60527038574219, -0.0003034261171706021, -53.607669830322266, -82.60527038574219, -0.0003034261171706021, -53.607669830322266, -82.60527038574219, -1.2777124643325806, 50.263389587402344, -84.6721420288086, -1.2777124643325806, 50.263389587402344, -84.6721420288086, -1.2777124643325806, 50.263389587402344, -84.6721420288086, -1.2777124643325806, 50.263389587402344, -84.6721420288086, 0.0003034261171706021, -53.607669830322266, 82.60527038574219, 0.0003034261171706021, -53.607669830322266, 82.60527038574219, 0.0003034261171706021, -53.607669830322266, 82.60527038574219, 0.0003034261171706021, -53.607669830322266, 82.60527038574219, 1.2777124643325806, 50.263389587402344, 84.6721420288086, 1.2777124643325806, 50.263389587402344, 84.6721420288086, 1.2777124643325806, 50.263389587402344, 84.6721420288086, 1.2777124643325806, 50.263389587402344, 84.6721420288086, 0.0003034261171706021, 53.607669830322266, 82.60527038574219, 0.0003034261171706021, 53.607669830322266, 82.60527038574219, 0.0003034261171706021, 53.607669830322266, 82.60527038574219, 0.0003034261171706021, 53.607669830322266, 82.60527038574219],\n \"normalized\": false\n },\n \"normal\": {\n \"itemSize\": 3,\n \"type\": \"Float32Array\",\n \"array\": [-0.5902835130691528, 0.5619468092918396, 0.5794662833213806, -0.5902835130691528, 0.5619468092918396, 0.5794662833213806, -0.5902835130691528, 0.5619468092918396, 0.5794662833213806, -0.5902835130691528, 0.5619468092918396, 0.5794662833213806, -0.9267594814300537, 0.3756551742553711, -3.650784492492676e-7, -0.9267594814300537, 0.3756551742553711, -3.650784492492676e-7, -0.9267594814300537, 0.3756551742553711, -3.650784492492676e-7, -0.9267594814300537, 0.3756551742553711, -3.650784492492676e-7, -0.9375927448272705, 0.3472937345504761, -0.01751660369336605, -0.9375927448272705, 0.3472937345504761, -0.01751660369336605, -0.9375927448272705, 0.3472937345504761, -0.01751660369336605, -0.9375927448272705, 0.3472937345504761, -0.01751660369336605, -0.9375886917114258, -0.34730517864227295, -0.01751125603914261, -0.9375886917114258, -0.34730517864227295, -0.01751125603914261, -0.9375886917114258, -0.34730517864227295, -0.01751125603914261, -0.9375886917114258, -0.34730517864227295, -0.01751125603914261, -0.5794563889503479, -0.5902886986732483, 0.5619516968727112, -0.5794563889503479, -0.5902886986732483, 0.5619516968727112, -0.5794563889503479, -0.5902886986732483, 0.5619516968727112, -0.5794563889503479, -0.5902886986732483, 0.5619516968727112, -0.34728965163230896, -0.01751914620399475, 0.9375942349433899, -0.34728965163230896, -0.01751914620399475, 0.9375942349433899, -0.34728965163230896, -0.01751914620399475, 0.9375942349433899, -0.34728965163230896, -0.01751914620399475, 0.9375942349433899, -0.579460859298706, 0.5902918577194214, -0.5619436502456665, -0.579460859298706, 0.5902918577194214, -0.5619436502456665, -0.579460859298706, 0.5902918577194214, -0.5619436502456665, -0.579460859298706, 0.5902918577194214, -0.5619436502456665, -0.017521724104881287, 0.9375901818275452, 0.34730058908462524, -0.017521724104881287, 0.9375901818275452, 0.34730058908462524, -0.017521724104881287, 0.9375901818275452, 0.34730058908462524, -0.017521724104881287, 0.9375901818275452, 0.34730058908462524, 0.3473122715950012, -0.017512619495391846, 0.9375860095024109, 0.3473122715950012, -0.017512619495391846, 0.9375860095024109, 0.3473122715950012, -0.017512619495391846, 0.9375860095024109, 0.3473122715950012, -0.017512619495391846, 0.9375860095024109, -0.5619495511054993, -0.579465389251709, -0.5902817845344543, -0.5619495511054993, -0.579465389251709, -0.5902817845344543, -0.5619495511054993, -0.579465389251709, -0.5902817845344543, -0.5619495511054993, -0.579465389251709, -0.5902817845344543, 0.5902835130691528, 0.5619468092918396, -0.5794662833213806, 0.5902835130691528, 0.5619468092918396, -0.5794662833213806, 0.5902835130691528, 0.5619468092918396, -0.5794662833213806, 0.5902835130691528, 0.5619468092918396, -0.5794662833213806, 0.9375926852226257, 0.3472939133644104, 0.017516572028398514, 0.9375926852226257, 0.3472939133644104, 0.017516572028398514, 0.9375926852226257, 0.3472939133644104, 0.017516572028398514, 0.9375926852226257, 0.3472939133644104, 0.017516572028398514, 0.9267594814300537, -0.3756551742553711, -0.000007398426532745361, 0.9267594814300537, -0.3756551742553711, -0.000007398426532745361, 0.9267594814300537, -0.3756551742553711, -0.000007398426532745361, 0.9267594814300537, -0.3756551742553711, -0.000007398426532745361, 0.590289294719696, -0.5619460344314575, -0.5794610977172852, 0.590289294719696, -0.5619460344314575, -0.5794610977172852, 0.590289294719696, -0.5619460344314575, -0.5794610977172852, 0.590289294719696, -0.5619460344314575, -0.5794610977172852, 0.3473011553287506, 0.017513729631900787, -0.9375900626182556, 0.3473011553287506, 0.017513729631900787, -0.9375900626182556, 0.3473011553287506, 0.017513729631900787, -0.9375900626182556, 0.3473011553287506, 0.017513729631900787, -0.9375900626182556, 0.01752115786075592, 0.9375901818275452, -0.3473004698753357, 0.01752115786075592, 0.9375901818275452, -0.3473004698753357, 0.01752115786075592, 0.9375901818275452, -0.3473004698753357, 0.01752115786075592, 0.9375901818275452, -0.3473004698753357, 0.5902906656265259, -0.5619435906410217, 0.5794621706008911, 0.5902906656265259, -0.5619435906410217, 0.5794621706008911, 0.5902906656265259, -0.5619435906410217, 0.5794621706008911, 0.5902906656265259, -0.5619435906410217, 0.5794621706008911, -0.01751122623682022, -0.9375880360603333, -0.34730690717697144, -0.01751122623682022, -0.9375880360603333, -0.34730690717697144, -0.01751122623682022, -0.9375880360603333, -0.34730690717697144, -0.01751122623682022, -0.9375880360603333, -0.34730690717697144, -0.34731000661849976, -0.01751551777124405, -0.9375866651535034, -0.34731000661849976, -0.01751551777124405, -0.9375866651535034, -0.34731000661849976, -0.01751551777124405, -0.9375866651535034, -0.34731000661849976, -0.01751551777124405, -0.9375866651535034, -0.5794625282287598, 0.5902847647666931, 0.5619492530822754, -0.5794625282287598, 0.5902847647666931, 0.5619492530822754, -0.5794625282287598, 0.5902847647666931, 0.5619492530822754, -0.5794625282287598, 0.5902847647666931, 0.5619492530822754, -0.3756488859653473, -0.000004090368747711182, 0.9267621040344238, -0.3756488859653473, -0.000004090368747711182, 0.9267621040344238, -0.3756488859653473, -0.000004090368747711182, 0.9267621040344238, -0.3756488859653473, -0.000004090368747711182, 0.9267621040344238, -0.5619439482688904, 0.5794651508331299, 0.5902872681617737, -0.5619439482688904, 0.5794651508331299, 0.5902872681617737, -0.5619439482688904, 0.5794651508331299, 0.5902872681617737, -0.5619439482688904, 0.5794651508331299, 0.5902872681617737, -0.9375901818275452, -0.34730082750320435, 0.017511630430817604, -0.9375901818275452, -0.34730082750320435, 0.017511630430817604, -0.9375901818275452, -0.34730082750320435, 0.017511630430817604, -0.9375901818275452, -0.34730082750320435, 0.017511630430817604, -0.9375885128974915, 0.3473053276538849, 0.017515607178211212, -0.9375885128974915, 0.3473053276538849, 0.017515607178211212, -0.9375885128974915, 0.3473053276538849, 0.017515607178211212, -0.9375885128974915, 0.3473053276538849, 0.017515607178211212, -0.9267594814300537, -0.3756551742553711, 0.000007398426532745361, -0.9267594814300537, -0.3756551742553711, 0.000007398426532745361, -0.9267594814300537, -0.3756551742553711, 0.000007398426532745361, -0.9267594814300537, -0.3756551742553711, 0.000007398426532745361, -0.590289294719696, -0.5619460344314575, 0.5794610977172852, -0.590289294719696, -0.5619460344314575, 0.5794610977172852, -0.590289294719696, -0.5619460344314575, 0.5794610977172852, -0.590289294719696, -0.5619460344314575, 0.5794610977172852, -0.5794673562049866, -0.5902878642082214, -0.5619411468505859, -0.5794673562049866, -0.5902878642082214, -0.5619411468505859, -0.5794673562049866, -0.5902878642082214, -0.5619411468505859, -0.5794673562049866, -0.5902878642082214, -0.5619411468505859, -0.56194669008255, -0.5794578194618225, 0.5902919173240662, -0.56194669008255, -0.5794578194618225, 0.5902919173240662, -0.56194669008255, -0.5794578194618225, 0.5902919173240662, -0.56194669008255, -0.5794578194618225, 0.5902919173240662, -0.3473033905029297, 0.01751108467578888, 0.9375893473625183, -0.3473033905029297, 0.01751108467578888, 0.9375893473625183, -0.3473033905029297, 0.01751108467578888, 0.9375893473625183, -0.3473033905029297, 0.01751108467578888, 0.9375893473625183, -0.000006303191184997559, 0.9267597794532776, -0.3756546974182129, -0.000006303191184997559, 0.9267597794532776, -0.3756546974182129, -0.000006303191184997559, 0.9267597794532776, -0.3756546974182129, -0.000006303191184997559, 0.9267597794532776, -0.3756546974182129, -0.5619495511054993, 0.5794599056243896, -0.5902870297431946, -0.5619495511054993, 0.5794599056243896, -0.5902870297431946, -0.5619495511054993, 0.5794599056243896, -0.5902870297431946, -0.5619495511054993, 0.5794599056243896, -0.5902870297431946, -0.590303897857666, 0.5619341731071472, -0.5794578194618225, -0.590303897857666, 0.5619341731071472, -0.5794578194618225, -0.590303897857666, 0.5619341731071472, -0.5794578194618225, -0.590303897857666, 0.5619341731071472, -0.5794578194618225, 0.017507383599877357, 0.9375904202461243, 0.34730064868927, 0.017507383599877357, 0.9375904202461243, 0.34730064868927, 0.017507383599877357, 0.9375904202461243, 0.34730064868927, 0.017507383599877357, 0.9375904202461243, 0.34730064868927, -0.017507383599877357, 0.9375904202461243, -0.3473004698753357, -0.017507383599877357, 0.9375904202461243, -0.3473004698753357, -0.017507383599877357, 0.9375904202461243, -0.3473004698753357, -0.017507383599877357, 0.9375904202461243, -0.3473004698753357, 0.5619532465934753, 0.5794590711593628, 0.5902844667434692, 0.5619532465934753, 0.5794590711593628, 0.5902844667434692, 0.5619532465934753, 0.5794590711593628, 0.5902844667434692, 0.5619532465934753, 0.5794590711593628, 0.5902844667434692, 0.3756416141986847, 0.0000029206275939941406, 0.926764965057373, 0.3756416141986847, 0.0000029206275939941406, 0.926764965057373, 0.3756416141986847, 0.0000029206275939941406, 0.926764965057373, 0.3756416141986847, 0.0000029206275939941406, 0.926764965057373, 0.5902771949768066, 0.5619665384292603, 0.5794534683227539, 0.5902771949768066, 0.5619665384292603, 0.5794534683227539, 0.5902771949768066, 0.5619665384292603, 0.5794534683227539, 0.5902771949768066, 0.5619665384292603, 0.5794534683227539, 0.017511233687400818, -0.937588095664978, 0.3473067581653595, 0.017511233687400818, -0.937588095664978, 0.3473067581653595, 0.017511233687400818, -0.937588095664978, 0.3473067581653595, 0.017511233687400818, -0.937588095664978, 0.3473067581653595, 0.5619463324546814, -0.579465389251709, 0.5902849435806274, 0.5619463324546814, -0.579465389251709, 0.5902849435806274, 0.5619463324546814, -0.579465389251709, 0.5902849435806274, 0.5619463324546814, -0.579465389251709, 0.5902849435806274, 0.017518242821097374, -0.9375925660133362, -0.34729424118995667, 0.017518242821097374, -0.9375925660133362, -0.34729424118995667, 0.017518242821097374, -0.9375925660133362, -0.34729424118995667, 0.017518242821097374, -0.9375925660133362, -0.34729424118995667, -0.5902858376502991, -0.5619493722915649, -0.5794615745544434, -0.5902858376502991, -0.5619493722915649, -0.5794615745544434, -0.5902858376502991, -0.5619493722915649, -0.5794615745544434, -0.5902858376502991, -0.5619493722915649, -0.5794615745544434, -0.37564951181411743, 0.0000028908252716064453, -0.9267617464065552, -0.37564951181411743, 0.0000028908252716064453, -0.9267617464065552, -0.37564951181411743, 0.0000028908252716064453, -0.9267617464065552, -0.37564951181411743, 0.0000028908252716064453, -0.9267617464065552, 0.5794623494148254, 0.5902848839759827, -0.5619493126869202, 0.5794623494148254, 0.5902848839759827, -0.5619493126869202, 0.5794623494148254, 0.5902848839759827, -0.5619493126869202, 0.5794623494148254, 0.5902848839759827, -0.5619493126869202, 0.9267598390579224, 0.3756541609764099, 2.980232238769531e-7, 0.9267598390579224, 0.3756541609764099, 2.980232238769531e-7, 0.9267598390579224, 0.3756541609764099, 2.980232238769531e-7, 0.9267598390579224, 0.3756541609764099, 2.980232238769531e-7, 0.5619441866874695, 0.5794647932052612, -0.5902873873710632, 0.5619441866874695, 0.5794647932052612, -0.5902873873710632, 0.5619441866874695, 0.5794647932052612, -0.5902873873710632, 0.5619441866874695, 0.5794647932052612, -0.5902873873710632, 0.9375880360603333, -0.347307026386261, 0.017507091164588928, 0.9375880360603333, -0.347307026386261, 0.017507091164588928, 0.9375880360603333, -0.347307026386261, 0.017507091164588928, 0.9375880360603333, -0.347307026386261, 0.017507091164588928, 0.9375901818275452, -0.34730082750320435, -0.017511630430817604, 0.9375901818275452, -0.34730082750320435, -0.017511630430817604, 0.9375901818275452, -0.34730082750320435, -0.017511630430817604, 0.9375901818275452, -0.34730082750320435, -0.017511630430817604, 0.9375885128974915, 0.3473053276538849, -0.017515607178211212, 0.9375885128974915, 0.3473053276538849, -0.017515607178211212, 0.9375885128974915, 0.3473053276538849, -0.017515607178211212, 0.9375885128974915, 0.3473053276538849, -0.017515607178211212, 0.5794609785079956, 0.5902916789054871, 0.5619437098503113, 0.5794609785079956, 0.5902916789054871, 0.5619437098503113, 0.5794609785079956, 0.5902916789054871, 0.5619437098503113, 0.5794609785079956, 0.5902916789054871, 0.5619437098503113, 0.5794563889503479, -0.5902886986732483, -0.5619516968727112, 0.5794563889503479, -0.5902886986732483, -0.5619516968727112, 0.5794563889503479, -0.5902886986732483, -0.5619516968727112, 0.5794563889503479, -0.5902886986732483, -0.5619516968727112, 0.3756488859653473, -0.000004090368747711182, -0.9267621040344238, 0.3756488859653473, -0.000004090368747711182, -0.9267621040344238, 0.3756488859653473, -0.000004090368747711182, -0.9267621040344238, 0.3756488859653473, -0.000004090368747711182, -0.9267621040344238, 0.5794673562049866, -0.5902878642082214, 0.5619410276412964, 0.5794673562049866, -0.5902878642082214, 0.5619410276412964, 0.5794673562049866, -0.5902878642082214, 0.5619410276412964, 0.5794673562049866, -0.5902878642082214, 0.5619410276412964, -0.017518242821097374, -0.9375925660133362, 0.34729424118995667, -0.017518242821097374, -0.9375925660133362, 0.34729424118995667, -0.017518242821097374, -0.9375925660133362, 0.34729424118995667, -0.017518242821097374, -0.9375925660133362, 0.34729424118995667, 0.34729689359664917, -0.017507314682006836, -0.9375919103622437, 0.34729689359664917, -0.017507314682006836, -0.9375919103622437, 0.34729689359664917, -0.017507314682006836, -0.9375919103622437, 0.34729689359664917, -0.017507314682006836, -0.9375919103622437, 0.5619431734085083, -0.5794587135314941, -0.5902944207191467, 0.5619431734085083, -0.5794587135314941, -0.5902944207191467, 0.5619431734085083, -0.5794587135314941, -0.5902944207191467, 0.5619431734085083, -0.5794587135314941, -0.5902944207191467, 0.0000016316771507263184, -0.9267597794532776, -0.3756546974182129, 0.0000016316771507263184, -0.9267597794532776, -0.3756546974182129, 0.0000016316771507263184, -0.9267597794532776, -0.3756546974182129, 0.0000016316771507263184, -0.9267597794532776, -0.3756546974182129, -0.3473055958747864, 0.017509743571281433, -0.9375884532928467, -0.3473055958747864, 0.017509743571281433, -0.9375884532928467, -0.3473055958747864, 0.017509743571281433, -0.9375884532928467, -0.3473055958747864, 0.017509743571281433, -0.9375884532928467, -0.0000012889504432678223, -0.9267591834068298, 0.3756559193134308, -0.0000012889504432678223, -0.9267591834068298, 0.3756559193134308, -0.0000012889504432678223, -0.9267591834068298, 0.3756559193134308, -0.0000012889504432678223, -0.9267591834068298, 0.3756559193134308, 0.3473014235496521, 0.01751813292503357, 0.9375898241996765, 0.3473014235496521, 0.01751813292503357, 0.9375898241996765, 0.3473014235496521, 0.01751813292503357, 0.9375898241996765, 0.3473014235496521, 0.01751813292503357, 0.9375898241996765, 0.000006429851055145264, 0.9267741441726685, 0.37561920285224915, 0.000006429851055145264, 0.9267741441726685, 0.37561920285224915, 0.000006429851055145264, 0.9267741441726685, 0.37561920285224915, 0.000006429851055145264, 0.9267741441726685, 0.37561920285224915],\n \"normalized\": false\n },\n \"uv\": {\n \"itemSize\": 2,\n \"type\": \"Float32Array\",\n \"array\": [0.050937071442604065, 0.0637897253036499, 0.11147573590278625, 0.05759662389755249, 0.1211576759815216, 0.10764795541763306, 0.12535500526428223, 0.35762202739715576, 0.05231131985783577, 0.1178632378578186, 0.07363925129175186, 0.11786329746246338, 0.119850754737854, 0.015513718128204346, 0.6247040033340454, 0.2332320213317871, 0.02066764421761036, 0.05759531259536743, 0.07363908737897873, 0.06378960609436035, 0.1211576759815216, 0.005298316478729248, 0.5624589920043945, 0.1254199743270874, 0.0220418032258749, 0.05759531259536743, 0.08258064091205597, 0.0637897253036499, 0.1211576759815216, 0.0066724419593811035, 0.24976900219917297, 0.6079350113868713, 0.02066793106496334, 0.11786329746246338, 0.02823532558977604, 0.06378841400146484, 0.1211576759815216, 0.09218895435333252, 0.4997659921646118, 0.1081160306930542, 0.08120644837617874, 0.057596445083618164, 0.0977153331041336, 0.11786329746246338, 0.1190430074930191, 0.039651691913604736, 0.4997679889202118, 0.3578059673309326, 0.05987865850329399, 0.0035230517387390137, 0.07501331716775894, 0.11786329746246338, 0.1190430074930191, 0.014401912689208984, 0.3747130036354065, 0.48311901092529297, 0.037176623940467834, 0.06378841400146484, 0.08877374976873398, 0.0637897253036499, 0.1211576759815216, 0.013714849948883057, 0.3754439949989319, 0.48308396339416504, 0.01310031395405531, 0.057595252990722656, 0.08258060365915298, 0.05759638547897339, 0.119850754737854, 0.038539886474609375, 0.24988000094890594, 0.4829980134963989, 0.04336973652243614, 0.003524184226989746, 0.06254100054502487, 0.37501800060272217, 0.08877380937337875, 0.05759662389755249, 0.11985072493553162, 0.04695647954940796, 0.00035799999022856355, 0.6079339981079102, 0.02823505364358425, 0.05759531259536743, 0.096341073513031, 0.0035229921340942383, 0.1190430074930191, 0.02281850576400757, 0.06744597852230072, 0.05759650468826294, 0.07363912463188171, 0.05759662389755249, 0.121157705783844, 0.0557977557182312, 0.3125090003013611, 0.0000960230827331543, 0.0055332062765955925, 0.11786329746246338, 0.10390840470790863, 0.0637897253036499, 0.11985082179307938, 0.09880667924880981, 0.5625389814376831, 0.25025200843811035, 0.0069072050973773, 0.06378835439682007, 0.05093708261847496, 0.0035218000411987305, 0.1211576759815216, 0.02213144302368164, 0.2504560053348541, 0.3578009605407715, 0.0296091977506876, 0.0035229921340942383, 0.06246799975633621, 0.25025999546051025, 0.10390840470790863, 0.0035241246223449707, 0.1211576759815216, 0.0823981761932373, 0.044743988662958145, 0.06378841400146484, 0.09014798700809479, 0.11786329746246338, 0.1211576759815216, 0.11606442928314209, 0.5002009868621826, 0.10809803009033203, 0.014474472962319851, 0.003522932529449463, 0.10528266429901123, 0.1178632378578186, 0.119850754737854, 0.05759662389755249, 0.24995200335979462, 0.2328779697418213, 0.006907171569764614, 0.057595252990722656, 0.062495000660419464, 0.12494999170303345, 0.0901479572057724, 0.0035241246223449707, 0.11904306709766388, 0.09150189161300659, 0.04474392160773277, 0.003524184226989746, 0.10528260469436646, 0.05759662389755249, 0.1190430074930191, 0.048068225383758545, 0.37474000453948975, 0.23276197910308838, 0.03580237179994583, 0.06378841400146484, 0.05093725398182869, 0.11786329746246338, 0.1211576759815216, 0.015089035034179688, 0.1876010000705719, 0.24980902671813965, 0.09771531820297241, 0.0637897253036499, 0.1128498986363411, 0.05759662389755249, 0.1211576759815216, 0.10902208089828491, 0.37527701258659363, 0.3578059673309326, 0.03580237179994583, 0.11786329746246338, 0.11147570610046387, 0.003524184226989746, 0.119850754737854, 0.030123412609100342, 0.24984599649906158, 0.35762202739715576, 0.02204183302819729, 0.0035229921340942383, 0.029609275981783867, 0.11786329746246338, 0.11904306709766388, 0.10833495855331421, 0.12527799606323242, 0.6079350113868713, 0.02066764421761036, 0.0035229921340942383, 0.05231131985783577, 0.0637897253036499, 0.11985082179307938, 0.1072232723236084, 0.5002130270004272, 0.2332320213317871, 0.029609275981783867, 0.06378841400146484, 0.08258064091205597, 0.11786329746246338, 0.1211576759815216, 0.09081476926803589, 0.1875240057706833, 0.5001220107078552, 0.028234990313649178, 0.11786329746246338, 0.096341073513031, 0.0637897253036499, 0.11985072493553162, 0.1094467043876648, 0.37527498602867126, 0.1081160306930542, 0.00029600001289509237, 0.4828310012817383, 0.08120640367269516, 0.11786329746246338, 0.08877374976873398, 0.0035241246223449707, 0.11985082179307938, 0.09039008617401123, 0.02066764421761036, 0.06378841400146484, 0.09634126722812653, 0.11786329746246338, 0.119850754737854, 0.04076343774795532, 0.43751999735832214, 0.00030297040939331055, 0.08120640367269516, 0.0035240650177001953, 0.1128498986363411, 0.003524184226989746, 0.1190430074930191, 0.031235098838806152, 0.4375219941139221, 0.2499929666519165, 0.04474368318915367, 0.11786329746246338, 0.05850442126393318, 0.05759662389755249, 0.119850754737854, 0.0841970443725586, 0.6246920228004456, 0.10809803009033203, 0.059878647327423096, 0.05759662389755249, 0.06607192009687424, 0.11786329746246338, 0.11904306709766388, 0.08308535814285278, 0.3124679923057556, 0.37530601024627686, 0.06607174873352051, 0.0637897253036499, 0.07501332461833954, 0.06378960609436035, 0.119850754737854, 0.00487363338470459, 0.25022199749946594, 0.48311901092529297, 0.05987865850329399, 0.11786329746246338, 0.0887739360332489, 0.11786329746246338, 0.119850754737854, 0.11563986539840698, 0.43768998980522156, 0.3752709627151489, 0.05850460007786751, 0.0035230517387390137, 0.09014798700809479, 0.0637897253036499, 0.11985069513320923, 0.013290226459503174, 0.5624470114707947, 0.00028502941131591797, 0.05850442126393318, 0.06378966569900513, 0.11147573590278625, 0.11786329746246338, 0.1211576759815216, 0.031922221183776855, 0.43765100836753845, 0.12517499923706055, 0.013100284151732922, 0.003522932529449463, 0.11284996569156647, 0.0637897253036499, 0.1190430074930191, 0.056484758853912354, 0.18763400614261627, 0.3751859664916992, 0.06607174873352051, 0.05759650468826294, 0.11147589981555939, 0.0637897253036499, 0.119850754737854, 0.05537313222885132, 0.3754050135612488, 0.23298698663711548, 0.005532982759177685, 0.0035241246223449707, 0.037176575511693954, 0.0035229921340942383, 0.119850754737854, 0.10103017091751099, 0.5628489851951599, 0.37501800060272217, 0.014474472962319851, 0.057595252990722656, 0.03580237179994583, 0.05759531259536743, 0.1211576759815216, 0.03896456956863403, 0.18770700693130493, 0.12506598234176636, 0.006907171569764614, 0.0035241246223449707, 0.014474536292254925, 0.11786329746246338, 0.1211576759815216, 0.10060548782348633, 0.12473999708890915, 0.23276197910308838, 0.04336966946721077, 0.05759531259536743, 0.08120658993721008, 0.0637897253036499, 0.119850754737854, 0.007097125053405762, 0.12478700280189514, 0.4828310012817383, 0.04474392160773277, 0.05759531259536743, 0.06744600087404251, 0.0637897253036499, 0.1190430074930191, 0.005985379219055176, 0.31249499320983887, 0.12494999170303345, 0.04336971789598465, 0.06378841400146484, 0.06260299682617188, 0.500120997428894, 0.09634125232696533, 0.05759662389755249, 0.1211576759815216, 0.11743861436843872, 0.06744597852230072, 0.003522932529449463, 0.09771530330181122, 0.05759662389755249, 0.11985082179307938, 0.11786329746246338, 0.37475401163101196, 0.10790902376174927, 0.02823500521481037, 0.0035229921340942383, 0.04336973652243614, 0.11786329746246338, 0.1211576759815216, 0.08377236127853394, 0.12484899908304214, 0.6079339981079102, 0.07501329481601715, 0.05759662389755249, 0.10390856862068176, 0.11786329746246338, 0.121157705783844, 0.05717200040817261, 0.624783992767334, 0.35806500911712646, 0.005532919429242611, 0.06378835439682007, 0.07501330226659775, 0.0035242438316345215, 0.1211576759815216, 0.02350562810897827, 0.5002930164337158, 0.35806500911712646, 0.07363908737897873, 0.0035242438316345215, 0.09771530330181122, 0.0035229921340942383, 0.119850754737854, 0.02393031120300293, 0.2502630054950714, 0.10790902376174927, 0.05850442126393318, 0.11786329746246338, 0.06607190519571304, 0.003522932529449463, 0.11904306709766388, 0.11675161123275757, 0.49989598989486694, 0.23298698663711548, 0.0069072050973773, 0.11786329746246338, 0.01310060080140829, 0.11786329746246338, 0.1211576759815216, 0.09923136234283447, 0.3749470114707947, 0.3578009605407715, 0.00022200000239536166, 0.35807204246520996, 0.0296091977506876, 0.05759531259536743, 0.052311308681964874, 0.0035218000411987305, 0.119850754737854, 0.021706759929656982, 0.035802435129880905, 0.0035229921340942383, 0.10528266429901123, 0.06378966569900513, 0.11904306709766388, 0.0999184250831604, 0.12546099722385406, 0.2328779697418213, 0.005532919429242611, 0.057595252990722656, 0.02204192988574505, 0.11786329746246338, 0.11985082179307938, 0.09261363744735718, 0.625095009803772, 0.4828310012817383, 0.05231131985783577, 0.05759531259536743, 0.10390844196081161, 0.05759662389755249, 0.11985072493553162, 0.049180030822753906, 0.1247130036354065, 0.35807204246520996, 0.013100284151732922, 0.06378841400146484, 0.050937261432409286, 0.05759531259536743, 0.1211576759815216, 0.04875540733337402, 0.3127020001411438, 0.24998903274536133, 0.00024900000425986946, 0.23276197910308838, 0.014474536292254925, 0.06378841400146484, 0.0901479572057724, 0.05759662389755249, 0.1211576759815216, 0.04738116264343262, 0.06744600087404251, 0.11786329746246338, 0.10528260469436646, 0.0035241246223449707, 0.11985082179307938, 0.0819736123085022, 0.2502489984035492, 0.23276197910308838, 0.022041896358132362, 0.06378841400146484, 0.037176575511693954, 0.05759531259536743, 0.1211576759815216, 0.040338754653930664, 0.500603973865509, 0.4828310012817383, 0.08258060365915298, 0.00352400541305542, 0.11284996569156647, 0.11786329746246338, 0.119850754737854, 0.03234678506851196, 0.1253889948129654, 0.4829980134963989, 0.03717633709311485, 0.11786329746246338, 0.05987846478819847, 0.06378966569900513, 0.1211576759815216, 0.03054797649383545, 0.4999360144138336, 0.48308396339416504],\n \"normalized\": false\n },\n \"color\": {\n \"itemSize\": 4,\n \"type\": \"Uint16Array\",\n \"array\": [65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535],\n \"normalized\": true\n }\n },\n \"index\": {\n \"type\": \"Uint16Array\",\n \"array\": [3, 87, 79, 95, 7, 11, 91, 15, 99, 103, 19, 111, 83, 23, 115, 127, 27, 123, 31, 239, 131, 235, 35, 143, 231, 211, 151, 104, 163, 37, 40, 179, 169, 191, 175, 47, 187, 183, 51, 55, 199, 219, 200, 215, 57, 63, 119, 135, 147, 195, 139, 207, 67, 155, 220, 159, 69, 227, 75, 167, 42, 173, 189, 176, 201, 56, 168, 116, 60, 58, 73, 225, 144, 172, 193, 36, 164, 72, 49, 65, 205, 106, 222, 70, 221, 197, 157, 92, 12, 88, 233, 145, 137, 54, 43, 190, 148, 68, 156, 140, 152, 64, 52, 48, 196, 117, 24, 132, 228, 16, 209, 229, 204, 153, 125, 5, 25, 124, 224, 165, 202, 217, 212, 192, 237, 136, 0, 4, 93, 133, 129, 61, 85, 81, 113, 100, 96, 17, 76, 236, 28, 80, 109, 21, 97, 161, 105, 188, 180, 185, 26, 78, 30, 10, 126, 166, 206, 158, 198, 86, 114, 234, 110, 230, 154, 62, 130, 194, 59, 226, 122, 107, 210, 18, 74, 214, 218, 102, 2, 94, 112, 33, 232, 66, 46, 146, 42, 170, 173, 176, 41, 201, 168, 177, 116, 58, 213, 73, 144, 44, 172, 36, 160, 164, 49, 181, 65, 106, 38, 222, 221, 216, 197, 92, 8, 12, 233, 141, 145, 190, 186, 54, 54, 203, 43, 148, 208, 68, 140, 32, 152, 52, 184, 48, 117, 120, 24, 228, 108, 16, 229, 149, 204, 125, 9, 5, 124, 121, 224, 202, 53, 217, 192, 128, 237, 0, 77, 4, 133, 29, 129, 85, 1, 81, 100, 89, 96, 76, 84, 236, 80, 101, 109, 97, 13, 161, 188, 45, 180, 30, 134, 26, 26, 6, 78, 166, 162, 14, 14, 10, 166, 198, 50, 206, 206, 150, 158, 234, 138, 238, 238, 86, 234, 154, 34, 22, 22, 110, 154, 174, 171, 194, 171, 62, 194, 118, 178, 122, 178, 59, 122, 18, 98, 107, 107, 71, 210, 223, 39, 218, 39, 74, 218, 94, 90, 102, 102, 82, 2, 112, 20, 33, 146, 142, 66, 66, 182, 46]\n },\n \"boundingSphere\": {\n \"center\": [0, 0, 0],\n \"radius\": 146.65657531498138\n }\n },\n faceValues: [10, 17, 3, 16, 8, 7, 12, 20, 6, 19, 5, 18, 4, 11, 13, 15, 2, 14, 9, 1],\n rotationCombinations: {\n \"1,2\": [-58, 18, 148],\n \"1,3\": [-21, -30, -69],\n \"1,4\": [-159, -30, 69],\n \"1,5\": [-122, 18, 32],\n \"1,6\": [58, -54, -148],\n \"1,7\": [-58, 18, -31],\n \"1,8\": [180, 0, 180],\n \"1,9\": [58, -54, 30],\n \"1,10\": [122, 54, -148],\n \"1,11\": [-122, -54, 31],\n \"1,12\": [-58, 54, -148],\n \"1,13\": [58, 18, 31],\n \"1,14\": [58, -18, 148],\n \"1,15\": [148, 90, -58],\n \"1,16\": [122, -18, -148],\n \"1,17\": [159, 30, -110],\n \"1,18\": [21, 30, 110],\n \"1,19\": [158, -30, -69],\n \"1,20\": [0, 0, 180],\n \"2,3\": [-159, -30, 68],\n \"2,4\": [-159, -30, -110],\n \"2,5\": [122, -54, 148],\n \"2,6\": [-122, 54, 148],\n \"2,7\": [-32, -90, -122],\n \"2,8\": [-20, 30, 69],\n \"2,9\": [-122, 54, -32],\n \"2,10\": [58, 18, 30],\n \"2,11\": [-180, 90, 90],\n \"2,12\": [21, -30, 69],\n \"2,13\": [-21, 30, -110],\n \"2,14\": [158, 30, -110],\n \"2,15\": [21, -30, -110],\n \"2,16\": [0, 90, 90],\n \"2,17\": [-58, -54, 148],\n \"2,18\": [-58, -54, -32],\n \"2,19\": [158, 30, 69],\n \"2,20\": [58, 54, -30],\n \"3,4\": [0, 0, 180],\n \"3,5\": [-158, 30, -69],\n \"3,6\": [90, 0, 90],\n \"3,7\": [-159, -30, -110],\n \"3,8\": [158, -30, 110],\n \"3,9\": [90, 0, -90],\n \"3,10\": [-58, 18, -32],\n \"3,11\": [58, -54, -148],\n \"3,12\": [-90, 0, -90],\n \"3,13\": [-21, -30, 110],\n \"3,14\": [21, -30, -110],\n \"3,15\": [-90, 0, 90],\n \"3,16\": [58, -54, 30],\n \"3,17\": [-180, 0, 180],\n \"3,18\": [180, 0, 0],\n \"3,19\": [58, 54, -32],\n \"3,20\": [158, 30, 69],\n \"4,5\": [58, -18, -32],\n \"4,6\": [-58, 18, 148],\n \"4,7\": [158, 30, 69],\n \"4,8\": [-90, -90, 0],\n \"4,9\": [-58, 18, -32],\n \"4,10\": [58, -18, 148],\n \"4,11\": [-122, -18, 148],\n \"4,12\": [122, 18, -32],\n \"4,13\": [0, -90, -90],\n \"4,14\": [-122, 18, -148],\n \"4,15\": [122, 18, 148],\n \"4,16\": [-122, -18, -32],\n \"4,17\": [58, -54, -148],\n \"4,18\": [58, 54, -32],\n \"4,19\": [-58, -54, 148],\n \"4,20\": [-158, -30, -110],\n \"5,6\": [-122, -18, 148],\n \"5,7\": [122, 54, 30],\n \"5,8\": [58, -54, -148],\n \"5,9\": [-122, -54, -148],\n \"5,10\": [0, 0, 180],\n \"5,11\": [-58, -54, -32],\n \"5,12\": [58, 54, -32],\n \"5,13\": [-58, 18, -32],\n \"5,14\": [180, 0, -180],\n \"5,15\": [58, 54, 148],\n \"5,16\": [-58, -54, 148],\n \"5,17\": [122, 18, -32],\n \"5,18\": [-58, 54, 32],\n \"5,19\": [-180, 0, 0],\n \"5,20\": [-122, 54, 148],\n \"6,7\": [-159, 30, 110],\n \"6,8\": [-58, -54, -32],\n \"6,9\": [21, 30, -69],\n \"6,10\": [122, -54, 148],\n \"6,11\": [58, 54, -32],\n \"6,12\": [159, -30, 110],\n \"6,13\": [-122, 54, 148],\n \"6,14\": [-21, -30, -69],\n \"6,15\": [159, -30, -69],\n \"6,16\": [58, 54, 148],\n \"6,17\": [90, -90, -180],\n \"6,18\": [122, 18, -32],\n \"6,19\": [-21, -30, 110],\n \"6,20\": [122, 54, 32],\n \"7,8\": [21, -30, -110],\n \"7,9\": [159, -30, -69],\n \"7,10\": [21, 30, -69],\n \"7,11\": [90, 0, 90],\n \"7,12\": [-58, 54, 32],\n \"7,13\": [122, 54, 32],\n \"7,14\": [58, -54, -148],\n \"7,15\": [-21, 30, 69],\n \"7,16\": [90, 0, -90],\n \"7,17\": [58, 54, -32],\n \"7,18\": [-21, -30, 110],\n \"7,19\": [-159, -30, -110],\n \"7,20\": [-158, 30, 110],\n \"8,9\": [122, 54, -148],\n \"8,10\": [58, -54, 32],\n \"8,11\": [-58, 54, -148],\n \"8,12\": [-122, -54, 32],\n \"8,13\": [0, 0, 180],\n \"8,14\": [122, 18, -32],\n \"8,15\": [0, -90, 90],\n \"8,16\": [-58, 54, 32],\n \"8,17\": [-90, 0, 90],\n \"8,18\": [-90, 0, -90],\n \"8,19\": [-122, 54, 148],\n \"8,20\": [180, 0, 0],\n \"9,10\": [-159, -30, -110],\n \"9,11\": [58, -18, -32],\n \"9,12\": [180, 0, 180],\n \"9,13\": [58, 54, -32],\n \"9,14\": [21, 30, 110],\n \"9,15\": [-180, 0, 0],\n \"9,16\": [-58, -54, -32],\n \"9,17\": [-122, -18, -32],\n \"9,18\": [90, 90, 0],\n \"9,19\": [-58, -18, 32],\n \"9,20\": [-58, 54, -148],\n \"10,11\": [58, 54, 148],\n \"10,12\": [-58, -18, 32],\n \"10,13\": [58, -18, 148],\n \"10,14\": [90, 0, -90],\n \"10,15\": [-58, -54, -32],\n \"10,16\": [120, -18, 32],\n \"10,17\": [-122, -18, 148],\n \"10,18\": [58, -54, -148],\n \"10,19\": [-180, 0, -180],\n \"10,20\": [122, -54, -32],\n \"11,12\": [159, 30, -110],\n \"11,13\": [-159, -30, 69],\n \"11,14\": [21, -30, 69],\n \"11,15\": [122, 18, -32],\n \"11,16\": [0, 0, -180],\n \"11,17\": [159, -30, -69],\n \"11,18\": [58, 18, 32],\n \"11,19\": [-122, -54, 30],\n \"11,20\": [21, 30, 110],\n \"12,13\": [58, 54, 148],\n \"12,14\": [-122, 18, 32],\n \"12,15\": [0, 0, -180],\n \"12,16\": [-122, 54, 148],\n \"12,17\": [-110, -90, 159],\n \"12,18\": [58, 18, -148],\n \"12,19\": [159, -30, 110],\n \"12,20\": [90, 0, -90],\n \"13,14\": [122, -54, 148],\n \"13,15\": [58, 54, -32],\n \"13,16\": [-58, -18, -148],\n \"13,17\": [-21, 30, -110],\n \"13,18\": [-21, 30, 69],\n \"13,19\": [122, -54, -32],\n \"13,20\": [-180, 0, -180],\n \"14,15\": [122, -18, -148],\n \"14,16\": [21, 30, 110],\n \"14,17\": [58, -18, 148],\n \"14,18\": [58, -18, -32],\n \"14,19\": [0, 0, -180],\n \"14,20\": [58, 18, 32],\n \"15,16\": [159, 30, -110],\n \"15,17\": [58, -18, -32],\n \"15,18\": [-58, -18, 32],\n \"15,19\": [122, -18, 32],\n \"15,20\": [58, -54, -148],\n \"16,17\": [122, -54, 148],\n \"16,18\": [122, -54, -32],\n \"16,19\": [122, 54, -148],\n \"16,20\": [-122, 54, -32],\n \"17,18\": [0, 0, 180],\n \"17,19\": [122, -54, 148],\n \"17,20\": [21, -30, -110],\n \"18,19\": [-159, -30, 69],\n \"18,20\": [158, 30, -110],\n \"19,20\": [58, 54, 148]\n }\n },\n \"d24\": {\n \"metadata\": {\n \"version\": 4.5,\n \"type\": \"BufferGeometry\",\n \"generator\": \"BufferGeometry.toJSON\"\n },\n \"uuid\": \"D1B379DE-9640-4151-A394-D6DF1846E49C\",\n \"type\": \"BufferGeometry\",\n \"data\": {\n \"attributes\": {\n \"position\": {\n \"itemSize\": 3,\n \"type\": \"Float32Array\",\n \"array\": [-93.4049072265625,-3.781350612640381,3.7816989421844482,-93.4049072265625,-3.781350612640381,3.7816989421844482,-93.4049072265625,-3.781350612640381,3.7816989421844482,-93.4049072265625,-3.781350612640381,3.7816989421844482,-49.7835578918457,55.42812728881836,-49.783199310302734,-49.7835578918457,55.42812728881836,-49.783199310302734,-49.7835578918457,55.42812728881836,-49.783199310302734,-49.7835578918457,55.42812728881836,-49.783199310302734,-63.36488342285156,68.7131118774414,-3.781550168991089,-63.36488342285156,68.7131118774414,-3.781550168991089,-63.36488342285156,68.7131118774414,-3.781550168991089,-63.36488342285156,68.7131118774414,-3.781550168991089,-3.7813644409179688,93.4049301147461,-3.7813427448272705,-3.7813644409179688,93.4049301147461,-3.7813427448272705,-3.7813644409179688,93.4049301147461,-3.7813427448272705,-3.7813644409179688,93.4049301147461,-3.7813427448272705,3.7820396423339844,63.364871978759766,68.71309661865234,3.7820396423339844,63.364871978759766,68.71309661865234,3.7820396423339844,63.364871978759766,68.71309661865234,3.7820396423339844,63.364871978759766,68.71309661865234,49.78358840942383,49.783382415771484,55.427940368652344,49.78358840942383,49.783382415771484,55.427940368652344,49.78358840942383,49.783382415771484,55.427940368652344,49.78358840942383,49.783382415771484,55.427940368652344,-93.40494537353516,3.7813589572906494,-3.781012773513794,-93.40494537353516,3.7813589572906494,-3.781012773513794,-93.40494537353516,3.7813589572906494,-3.781012773513794,-93.40494537353516,3.7813589572906494,-3.781012773513794,-55.42829895019531,49.78338623046875,-49.78317642211914,-55.42829895019531,49.78338623046875,-49.78317642211914,-55.42829895019531,49.78338623046875,-49.78317642211914,-55.42829895019531,49.78338623046875,-49.78317642211914,-63.3648567199707,68.7131118774414,3.7820181846618652,-63.3648567199707,68.7131118774414,3.7820181846618652,-63.3648567199707,68.7131118774414,3.7820181846618652,-63.3648567199707,68.7131118774414,3.7820181846618652,49.7835693359375,55.42811965942383,49.783199310302734,49.7835693359375,55.42811965942383,49.783199310302734,49.7835693359375,55.42811965942383,49.783199310302734,49.7835693359375,55.42811965942383,49.783199310302734,63.364891052246094,68.7131118774414,3.781550168991089,63.364891052246094,68.7131118774414,3.781550168991089,63.364891052246094,68.7131118774414,3.781550168991089,63.364891052246094,68.7131118774414,3.781550168991089,63.3646240234375,3.781778573989868,-68.71334075927734,63.3646240234375,3.781778573989868,-68.71334075927734,63.3646240234375,3.781778573989868,-68.71334075927734,63.3646240234375,3.781778573989868,-68.71334075927734,68.71309661865234,63.3648681640625,-3.7820355892181396,68.71309661865234,63.3648681640625,-3.7820355892181396,68.71309661865234,63.3648681640625,-3.7820355892181396,68.71309661865234,63.3648681640625,-3.7820355892181396,93.4049072265625,3.781350612640381,-3.7816996574401855,93.4049072265625,3.781350612640381,-3.7816996574401855,93.4049072265625,3.781350612640381,-3.7816996574401855,93.4049072265625,3.781350612640381,-3.7816996574401855,68.71288299560547,3.781782865524292,-63.36511993408203,68.71288299560547,3.781782865524292,-63.36511993408203,68.71288299560547,3.781782865524292,-63.36511993408203,68.71288299560547,3.781782865524292,-63.36511993408203,55.42794418334961,49.783382415771484,-49.7835807800293,55.42794418334961,49.783382415771484,-49.7835807800293,55.42794418334961,49.783382415771484,-49.7835807800293,55.42794418334961,49.783382415771484,-49.7835807800293,49.783203125,55.42811965942383,-49.7835578918457,49.783203125,55.42811965942383,-49.7835578918457,49.783203125,55.42811965942383,-49.7835578918457,49.783203125,55.42811965942383,-49.7835578918457,3.7813453674316406,93.4049301147461,-3.781369686126709,3.7813453674316406,93.4049301147461,-3.781369686126709,3.7813453674316406,93.4049301147461,-3.781369686126709,3.7813453674316406,93.4049301147461,-3.781369686126709,93.40494537353516,-3.7813589572906494,3.7810134887695312,93.40494537353516,-3.7813589572906494,3.7810134887695312,93.40494537353516,-3.7813589572906494,3.7810134887695312,93.40494537353516,-3.7813589572906494,3.7810134887695312,-3.7816996574401855,3.7813563346862793,-93.40489196777344,-3.7816996574401855,3.7813563346862793,-93.40489196777344,-3.7816996574401855,3.7813563346862793,-93.40489196777344,-3.7816996574401855,3.7813563346862793,-93.40489196777344,-49.7835807800293,49.78338623046875,-55.427940368652344,-49.7835807800293,49.78338623046875,-55.427940368652344,-49.7835807800293,49.78338623046875,-55.427940368652344,-49.7835807800293,49.78338623046875,-55.427940368652344,55.428306579589844,49.783382415771484,49.78317642211914,55.428306579589844,49.783382415771484,49.78317642211914,55.428306579589844,49.783382415771484,49.78317642211914,55.428306579589844,49.783382415771484,49.78317642211914,-3.7813727855682373,-93.4049301147461,-3.781342029571533,-3.7813727855682373,-93.4049301147461,-3.781342029571533,-3.7813727855682373,-93.4049301147461,-3.781342029571533,-3.7813727855682373,-93.4049301147461,-3.781342029571533,-68.71334838867188,-3.781782865524292,-63.36461639404297,-68.71334838867188,-3.781782865524292,-63.36461639404297,-68.71334838867188,-3.781782865524292,-63.36461639404297,-68.71334838867188,-3.781782865524292,-63.36461639404297,-3.7820396423339844,-63.364871978759766,-68.71309661865234,-3.7820396423339844,-63.364871978759766,-68.71309661865234,-3.7820396423339844,-63.364871978759766,-68.71309661865234,-3.7820396423339844,-63.364871978759766,-68.71309661865234,-49.7835807800293,-49.783382415771484,-55.427940368652344,-49.7835807800293,-49.783382415771484,-55.427940368652344,-49.7835807800293,-49.783382415771484,-55.427940368652344,-49.7835807800293,-49.783382415771484,-55.427940368652344,63.3648567199707,-68.7131118774414,-3.7820160388946533,63.3648567199707,-68.7131118774414,-3.7820160388946533,63.3648567199707,-68.7131118774414,-3.7820160388946533,63.3648567199707,-68.7131118774414,-3.7820160388946533,3.781336784362793,-93.4049301147461,-3.7813704013824463,3.781336784362793,-93.4049301147461,-3.7813704013824463,3.781336784362793,-93.4049301147461,-3.7813704013824463,3.781336784362793,-93.4049301147461,-3.7813704013824463,3.7815499305725098,-68.7131118774414,-63.36488342285156,3.7815499305725098,-68.7131118774414,-63.36488342285156,3.7815499305725098,-68.7131118774414,-63.36488342285156,3.7815499305725098,-68.7131118774414,-63.36488342285156,-63.3646240234375,3.781787157058716,68.71334075927734,-63.3646240234375,3.781787157058716,68.71334075927734,-63.3646240234375,3.781787157058716,68.71334075927734,-63.3646240234375,3.781787157058716,68.71334075927734,3.7820351123809814,-63.364871978759766,68.71309661865234,3.7820351123809814,-63.364871978759766,68.71309661865234,3.7820351123809814,-63.364871978759766,68.71309661865234,3.7820351123809814,-63.364871978759766,68.71309661865234,63.3651237487793,-3.781787157058716,68.71287536621094,63.3651237487793,-3.781787157058716,68.71287536621094,63.3651237487793,-3.781787157058716,68.71287536621094,63.3651237487793,-3.781787157058716,68.71287536621094,55.42794418334961,-49.783382415771484,-49.7835807800293,55.42794418334961,-49.783382415771484,-49.7835807800293,55.42794418334961,-49.783382415771484,-49.7835807800293,55.42794418334961,-49.783382415771484,-49.7835807800293,-93.4049072265625,3.7813589572906494,3.7816996574401855,-93.4049072265625,3.7813589572906494,3.7816996574401855,-93.4049072265625,3.7813589572906494,3.7816996574401855,-93.4049072265625,3.7813589572906494,3.7816996574401855,-55.42794418334961,49.78338623046875,49.7835807800293,-55.42794418334961,49.78338623046875,49.7835807800293,-55.42794418334961,49.78338623046875,49.7835807800293,-55.42794418334961,49.78338623046875,49.7835807800293,68.71311950683594,-63.3648796081543,3.7815308570861816,68.71311950683594,-63.3648796081543,3.7815308570861816,68.71311950683594,-63.3648796081543,3.7815308570861816,68.71311950683594,-63.3648796081543,3.7815308570861816,3.781013250350952,3.7813565731048584,-93.4049301147461,3.781013250350952,3.7813565731048584,-93.4049301147461,3.781013250350952,3.7813565731048584,-93.4049301147461,3.781013250350952,3.7813565731048584,-93.4049301147461,-63.3651237487793,3.781787157058716,-68.71288299560547,-63.3651237487793,3.781787157058716,-68.71288299560547,-63.3651237487793,3.781787157058716,-68.71288299560547,-63.3651237487793,3.781787157058716,-68.71288299560547,-63.3651237487793,-3.781778573989868,-68.71287536621094,-63.3651237487793,-3.781778573989868,-68.71287536621094,-63.3651237487793,-3.781778573989868,-68.71287536621094,-63.3651237487793,-3.781778573989868,-68.71287536621094,3.7815260887145996,-63.364871978759766,-68.71311950683594,3.7815260887145996,-63.364871978759766,-68.71311950683594,3.7815260887145996,-63.364871978759766,-68.71311950683594,3.7815260887145996,-63.364871978759766,-68.71311950683594,-3.781545639038086,68.7131118774414,63.36488342285156,-3.781545639038086,68.7131118774414,63.36488342285156,-3.781545639038086,68.7131118774414,63.36488342285156,-3.781545639038086,68.7131118774414,63.36488342285156,-3.7815303802490234,63.364871978759766,68.71312713623047,-3.7815303802490234,63.364871978759766,68.71312713623047,-3.7815303802490234,63.364871978759766,68.71312713623047,-3.7815303802490234,63.364871978759766,68.71312713623047,3.7820241451263428,68.7131118774414,63.3648567199707,3.7820241451263428,68.7131118774414,63.3648567199707,3.7820241451263428,68.7131118774414,63.3648567199707,3.7820241451263428,68.7131118774414,63.3648567199707,3.7820115089416504,-68.7131118774414,63.3648567199707,3.7820115089416504,-68.7131118774414,63.3648567199707,3.7820115089416504,-68.7131118774414,63.3648567199707,3.7820115089416504,-68.7131118774414,63.3648567199707,93.4049072265625,-3.7813589572906494,-3.7816989421844482,93.4049072265625,-3.7813589572906494,-3.7816989421844482,93.4049072265625,-3.7813589572906494,-3.7816989421844482,93.4049072265625,-3.7813589572906494,-3.7816989421844482,63.36486053466797,68.7131118774414,-3.7820181846618652,63.36486053466797,68.7131118774414,-3.7820181846618652,63.36486053466797,68.7131118774414,-3.7820181846618652,63.36486053466797,68.7131118774414,-3.7820181846618652,68.71312713623047,63.3648681640625,3.7815330028533936,68.71312713623047,63.3648681640625,3.7815330028533936,68.71312713623047,63.3648681640625,3.7815330028533936,68.71312713623047,63.3648681640625,3.7815330028533936,3.7815349102020264,63.364871978759766,-68.71312713623047,3.7815349102020264,63.364871978759766,-68.71312713623047,3.7815349102020264,63.364871978759766,-68.71312713623047,3.7815349102020264,63.364871978759766,-68.71312713623047,-3.7820308208465576,63.364871978759766,-68.71309661865234,-3.7820308208465576,63.364871978759766,-68.71309661865234,-3.7820308208465576,63.364871978759766,-68.71309661865234,-3.7820308208465576,63.364871978759766,-68.71309661865234,-68.71309661865234,-63.3648681640625,3.7820377349853516,-68.71309661865234,-63.3648681640625,3.7820377349853516,-68.71309661865234,-63.3648681640625,3.7820377349853516,-68.71309661865234,-63.3648681640625,3.7820377349853516,-68.71312713623047,-63.3648681640625,-3.7815308570861816,-68.71312713623047,-63.3648681640625,-3.7815308570861816,-68.71312713623047,-63.3648681640625,-3.7815308570861816,-68.71312713623047,-63.3648681640625,-3.7815308570861816,-55.42830276489258,-49.783382415771484,-49.78317642211914,-55.42830276489258,-49.783382415771484,-49.78317642211914,-55.42830276489258,-49.783382415771484,-49.78317642211914,-55.42830276489258,-49.783382415771484,-49.78317642211914,3.7813644409179688,-93.4049301147461,3.781342029571533,3.7813644409179688,-93.4049301147461,3.781342029571533,3.7813644409179688,-93.4049301147461,3.781342029571533,3.7813644409179688,-93.4049301147461,3.781342029571533,63.36488342285156,-68.7131118774414,3.781552314758301,63.36488342285156,-68.7131118774414,3.781552314758301,63.36488342285156,-68.7131118774414,3.781552314758301,63.36488342285156,-68.7131118774414,3.781552314758301,93.40494537353516,3.781350612640381,3.781012773513794,93.40494537353516,3.781350612640381,3.781012773513794,93.40494537353516,3.781350612640381,3.781012773513794,93.40494537353516,3.781350612640381,3.781012773513794,-3.7810142040252686,-3.781355857849121,93.4049301147461,-3.7810142040252686,-3.781355857849121,93.4049301147461,-3.7810142040252686,-3.781355857849121,93.4049301147461,-3.7810142040252686,-3.781355857849121,93.4049301147461,-63.36488723754883,-68.7131118774414,-3.781552314758301,-63.36488723754883,-68.7131118774414,-3.781552314758301,-63.36488723754883,-68.7131118774414,-3.781552314758301,-63.36488723754883,-68.7131118774414,-3.781552314758301,-3.7813453674316406,-93.4049301147461,3.7813704013824463,-3.7813453674316406,-93.4049301147461,3.7813704013824463,-3.7813453674316406,-93.4049301147461,3.7813704013824463,-3.7813453674316406,-93.4049301147461,3.7813704013824463,-63.364864349365234,-68.7131118774414,3.7820160388946533,-63.364864349365234,-68.7131118774414,3.7820160388946533,-63.364864349365234,-68.7131118774414,3.7820160388946533,-63.364864349365234,-68.7131118774414,3.7820160388946533,-3.7816994190216064,-3.7813565731048584,-93.40489196777344,-3.7816994190216064,-3.7813565731048584,-93.40489196777344,-3.7816994190216064,-3.7813565731048584,-93.40489196777344,-3.7816994190216064,-3.7813565731048584,-93.40489196777344,63.3646240234375,-3.781787157058716,-68.71334838867188,63.3646240234375,-3.781787157058716,-68.71334838867188,63.3646240234375,-3.781787157058716,-68.71334838867188,63.3646240234375,-3.781787157058716,-68.71334838867188,3.7810134887695312,-3.7813563346862793,-93.4049301147461,3.7810134887695312,-3.7813563346862793,-93.4049301147461,3.7810134887695312,-3.7813563346862793,-93.4049301147461,3.7810134887695312,-3.7813563346862793,-93.4049301147461,68.71309661865234,-63.364871978759766,-3.7820377349853516,68.71309661865234,-63.364871978759766,-3.7820377349853516,68.71309661865234,-63.364871978759766,-3.7820377349853516,68.71309661865234,-63.364871978759766,-3.7820377349853516,68.71288299560547,-3.781787157058716,-63.36511993408203,68.71288299560547,-3.781787157058716,-63.36511993408203,68.71288299560547,-3.781787157058716,-63.36511993408203,68.71288299560547,-3.781787157058716,-63.36511993408203,-93.40494537353516,-3.781350612640381,-3.7810134887695312,-93.40494537353516,-3.781350612640381,-3.7810134887695312,-93.40494537353516,-3.781350612640381,-3.7810134887695312,-93.40494537353516,-3.781350612640381,-3.7810134887695312,-68.71312713623047,63.364871978759766,-3.7815330028533936,-68.71312713623047,63.364871978759766,-3.7815330028533936,-68.71312713623047,63.364871978759766,-3.7815330028533936,-68.71312713623047,63.364871978759766,-3.7815330028533936,68.71334838867188,-3.7817912101745605,63.36461639404297,68.71334838867188,-3.7817912101745605,63.36461639404297,68.71334838867188,-3.7817912101745605,63.36461639404297,68.71334838867188,-3.7817912101745605,63.36461639404297,-3.782020092010498,-68.7131118774414,-63.3648567199707,-3.782020092010498,-68.7131118774414,-63.3648567199707,-3.782020092010498,-68.7131118774414,-63.3648567199707,-3.782020092010498,-68.7131118774414,-63.3648567199707,-3.781336784362793,93.4049301147461,3.781369686126709,-3.781336784362793,93.4049301147461,3.781369686126709,-3.781336784362793,93.4049301147461,3.781369686126709,-3.781336784362793,93.4049301147461,3.781369686126709,3.7813727855682373,93.4049301147461,3.7813427448272705,3.7813727855682373,93.4049301147461,3.7813427448272705,3.7813727855682373,93.4049301147461,3.7813427448272705,3.7813727855682373,93.4049301147461,3.7813427448272705,3.781700372695923,3.781355857849121,93.40489196777344,3.781700372695923,3.781355857849121,93.40489196777344,3.781700372695923,3.781355857849121,93.40489196777344,3.781700372695923,3.781355857849121,93.40489196777344,3.7816989421844482,-3.7813572883605957,93.40489196777344,3.7816989421844482,-3.7813572883605957,93.40489196777344,3.7816989421844482,-3.7813572883605957,93.40489196777344,3.7816989421844482,-3.7813572883605957,93.40489196777344,-3.781012773513794,3.7813572883605957,93.4049301147461,-3.781012773513794,3.7813572883605957,93.4049301147461,-3.781012773513794,3.7813572883605957,93.4049301147461,-3.781012773513794,3.7813572883605957,93.4049301147461,3.7815542221069336,68.7131118774414,-63.36488342285156,3.7815542221069336,68.7131118774414,-63.36488342285156,3.7815542221069336,68.7131118774414,-63.36488342285156,3.7815542221069336,68.7131118774414,-63.36488342285156,-49.78318405151367,-49.783382415771484,55.42829895019531,-49.78318405151367,-49.783382415771484,55.42829895019531,-49.78318405151367,-49.783382415771484,55.42829895019531,-49.78318405151367,-49.783382415771484,55.42829895019531,49.7835807800293,-49.783382415771484,55.42793655395508,49.7835807800293,-49.783382415771484,55.42793655395508,49.7835807800293,-49.783382415771484,55.42793655395508,49.7835807800293,-49.783382415771484,55.42793655395508,49.783565521240234,-55.42811965942383,49.78319549560547,49.783565521240234,-55.42811965942383,49.78319549560547,49.783565521240234,-55.42811965942383,49.78319549560547,49.783565521240234,-55.42811965942383,49.78319549560547,55.42829895019531,-49.783382415771484,49.783172607421875,55.42829895019531,-49.783382415771484,49.783172607421875,55.42829895019531,-49.783382415771484,49.783172607421875,55.42829895019531,-49.783382415771484,49.783172607421875,-49.7835578918457,-55.42811965942383,-49.783199310302734,-49.7835578918457,-55.42811965942383,-49.783199310302734,-49.7835578918457,-55.42811965942383,-49.783199310302734,-49.7835578918457,-55.42811965942383,-49.783199310302734,-49.783199310302734,-55.42811965942383,49.7835578918457,-49.783199310302734,-55.42811965942383,49.7835578918457,-49.783199310302734,-55.42811965942383,49.7835578918457,-49.783199310302734,-55.42811965942383,49.7835578918457,49.78318405151367,-49.783382415771484,-55.42829895019531,49.78318405151367,-49.783382415771484,-55.42829895019531,49.78318405151367,-49.783382415771484,-55.42829895019531,49.78318405151367,-49.783382415771484,-55.42829895019531,-55.42794418334961,-49.783382415771484,49.7835807800293,-55.42794418334961,-49.783382415771484,49.7835807800293,-55.42794418334961,-49.783382415771484,49.7835807800293,-55.42794418334961,-49.783382415771484,49.7835807800293,49.78318405151367,49.783382415771484,-55.42829895019531,49.78318405151367,49.783382415771484,-55.42829895019531,49.78318405151367,49.783382415771484,-55.42829895019531,49.78318405151367,49.783382415771484,-55.42829895019531,-49.78318405151367,49.78338623046875,55.42829895019531,-49.78318405151367,49.78338623046875,55.42829895019531,-49.78318405151367,49.78338623046875,55.42829895019531,-49.78318405151367,49.78338623046875,55.42829895019531,-49.783199310302734,55.42812728881836,49.7835578918457,-49.783199310302734,55.42812728881836,49.7835578918457,-49.783199310302734,55.42812728881836,49.7835578918457,-49.783199310302734,55.42812728881836,49.7835578918457,-63.3646240234375,-3.781782865524292,68.71334838867188,-63.3646240234375,-3.781782865524292,68.71334838867188,-63.3646240234375,-3.781782865524292,68.71334838867188,-63.3646240234375,-3.781782865524292,68.71334838867188,-68.71288299560547,-3.781778573989868,63.36511993408203,-68.71288299560547,-3.781778573989868,63.36511993408203,-68.71288299560547,-3.781778573989868,63.36511993408203,-68.71288299560547,-3.781778573989868,63.36511993408203,-3.7815349102020264,-63.364871978759766,68.71311950683594,-3.7815349102020264,-63.364871978759766,68.71311950683594,-3.7815349102020264,-63.364871978759766,68.71311950683594,-3.7815349102020264,-63.364871978759766,68.71311950683594,-3.7815582752227783,-68.7131118774414,63.36488342285156,-3.7815582752227783,-68.7131118774414,63.36488342285156,-3.7815582752227783,-68.7131118774414,63.36488342285156,-3.7815582752227783,-68.7131118774414,63.36488342285156,-3.782015800476074,68.7131118774414,-63.3648567199707,-3.782015800476074,68.7131118774414,-63.3648567199707,-3.782015800476074,68.7131118774414,-63.3648567199707,-3.782015800476074,68.7131118774414,-63.3648567199707,-68.71334838867188,3.781787157058716,-63.36461639404297,-68.71334838867188,3.781787157058716,-63.36461639404297,-68.71334838867188,3.781787157058716,-63.36461639404297,-68.71334838867188,3.781787157058716,-63.36461639404297,63.3651237487793,3.781782865524292,68.71288299560547,63.3651237487793,3.781782865524292,68.71288299560547,63.3651237487793,3.781782865524292,68.71288299560547,63.3651237487793,3.781782865524292,68.71288299560547,68.71334838867188,3.781778573989868,63.36461639404297,68.71334838867188,3.781778573989868,63.36461639404297,68.71334838867188,3.781778573989868,63.36461639404297,68.71334838867188,3.781778573989868,63.36461639404297,-68.71309661865234,63.3648796081543,3.7820355892181396,-68.71309661865234,63.3648796081543,3.7820355892181396,-68.71309661865234,63.3648796081543,3.7820355892181396,-68.71309661865234,63.3648796081543,3.7820355892181396,-68.71288299560547,3.7817912101745605,63.36511993408203,-68.71288299560547,3.7817912101745605,63.36511993408203,-68.71288299560547,3.7817912101745605,63.36511993408203,-68.71288299560547,3.7817912101745605,63.36511993408203,49.783203125,-55.42811965942383,-49.7835578918457,49.783203125,-55.42811965942383,-49.7835578918457,49.783203125,-55.42811965942383,-49.7835578918457,49.783203125,-55.42811965942383,-49.7835578918457],\n \"normalized\": false\n },\n \"normal\": {\n \"itemSize\": 3,\n \"type\": \"Float32Array\",\n \"array\": [-0.8930176496505737,-0.31821155548095703,0.31821513175964355,-0.8930176496505737,-0.31821155548095703,0.31821513175964355,-0.8930176496505737,-0.31821155548095703,0.31821513175964355,-0.8930176496505737,-0.31821155548095703,0.31821513175964355,-0.3939540982246399,0.8304173350334167,-0.3939635753631592,-0.3939540982246399,0.8304173350334167,-0.3939635753631592,-0.3939540982246399,0.8304173350334167,-0.3939635753631592,-0.3939540982246399,0.8304173350334167,-0.3939635753631592,-0.39820414781570435,0.8611265420913696,-0.31606101989746094,-0.39820414781570435,0.8611265420913696,-0.31606101989746094,-0.39820414781570435,0.8611265420913696,-0.31606101989746094,-0.39820414781570435,0.8611265420913696,-0.31606101989746094,-0.3181779980659485,0.8930322527885437,-0.3182079792022705,-0.3181779980659485,0.8930322527885437,-0.3182079792022705,-0.3181779980659485,0.8930322527885437,-0.3182079792022705,-0.3181779980659485,0.8930322527885437,-0.3182079792022705,0.3160579800605774,0.3982042074203491,0.8611275553703308,0.3160579800605774,0.3982042074203491,0.8611275553703308,0.3160579800605774,0.3982042074203491,0.8611275553703308,0.3160579800605774,0.3982042074203491,0.8611275553703308,0.39394938945770264,0.39396142959594727,0.8304205536842346,0.39394938945770264,0.39396142959594727,0.8304205536842346,0.39394938945770264,0.39396142959594727,0.8304205536842346,0.39394938945770264,0.39396142959594727,0.8304205536842346,-0.8930201530456543,0.3182116746902466,-0.31820809841156006,-0.8930201530456543,0.3182116746902466,-0.31820809841156006,-0.8930201530456543,0.3182116746902466,-0.31820809841156006,-0.8930201530456543,0.3182116746902466,-0.31820809841156006,-0.8304393887519836,0.3939298987388611,-0.39394134283065796,-0.8304393887519836,0.3939298987388611,-0.39394134283065796,-0.8304393887519836,0.3939298987388611,-0.39394134283065796,-0.8304393887519836,0.3939298987388611,-0.39394134283065796,-0.39819657802581787,0.8611276745796204,0.31606724858283997,-0.39819657802581787,0.8611276745796204,0.31606724858283997,-0.39819657802581787,0.8611276745796204,0.31606724858283997,-0.39819657802581787,0.8611276745796204,0.31606724858283997,0.3939548134803772,0.8304223418235779,0.3939521610736847,0.3939548134803772,0.8304223418235779,0.3939521610736847,0.3939548134803772,0.8304223418235779,0.3939521610736847,0.3939548134803772,0.8304223418235779,0.3939521610736847,0.398190438747406,0.8611446022987366,0.31602901220321655,0.398190438747406,0.8611446022987366,0.31602901220321655,0.398190438747406,0.8611446022987366,0.31602901220321655,0.398190438747406,0.8611446022987366,0.31602901220321655,0.39820146560668945,0.3160552680492401,-0.8611298203468323,0.39820146560668945,0.3160552680492401,-0.8611298203468323,0.39820146560668945,0.3160552680492401,-0.8611298203468323,0.39820146560668945,0.3160552680492401,-0.8611298203468323,0.8611258268356323,0.39821386337280273,-0.31605064868927,0.8611258268356323,0.39821386337280273,-0.31605064868927,0.8611258268356323,0.39821386337280273,-0.31605064868927,0.8611258268356323,0.39821386337280273,-0.31605064868927,0.8930308818817139,0.3181929588317871,-0.318196564912796,0.8930308818817139,0.3181929588317871,-0.318196564912796,0.8930308818817139,0.3181929588317871,-0.318196564912796,0.8930308818817139,0.3181929588317871,-0.318196564912796,0.8611277937889099,0.3160572052001953,-0.39820432662963867,0.8611277937889099,0.3160572052001953,-0.39820432662963867,0.8611277937889099,0.3160572052001953,-0.39820432662963867,0.8611277937889099,0.3160572052001953,-0.39820432662963867,0.8304156064987183,0.3939667344093323,-0.3939545154571533,0.8304156064987183,0.3939667344093323,-0.3939545154571533,0.8304156064987183,0.3939667344093323,-0.3939545154571533,0.8304156064987183,0.3939667344093323,-0.3939545154571533,0.39395228028297424,0.8304221630096436,-0.3939549922943115,0.39395228028297424,0.8304221630096436,-0.3939549922943115,0.39395228028297424,0.8304221630096436,-0.3939549922943115,0.39395228028297424,0.8304221630096436,-0.3939549922943115,0.31819266080856323,0.893029510974884,-0.31820082664489746,0.31819266080856323,0.893029510974884,-0.31820082664489746,0.31819266080856323,0.893029510974884,-0.31820082664489746,0.31819266080856323,0.893029510974884,-0.31820082664489746,0.8930361866950989,-0.3181893527507782,0.3181857466697693,0.8930361866950989,-0.3181893527507782,0.3181857466697693,0.8930361866950989,-0.3181893527507782,0.3181857466697693,0.8930361866950989,-0.3181893527507782,0.3181857466697693,-0.3182153105735779,0.31821152567863464,-0.8930174708366394,-0.3182153105735779,0.31821152567863464,-0.8930174708366394,-0.3182153105735779,0.31821152567863464,-0.8930174708366394,-0.3182153105735779,0.31821152567863464,-0.8930174708366394,-0.3939494788646698,0.39396119117736816,-0.8304205536842346,-0.3939494788646698,0.39396119117736816,-0.8304205536842346,-0.3939494788646698,0.39396119117736816,-0.8304205536842346,-0.3939494788646698,0.39396119117736816,-0.8304205536842346,0.8304232358932495,0.3939468264579773,0.3939582109451294,0.8304232358932495,0.3939468264579773,0.3939582109451294,0.8304232358932495,0.3939468264579773,0.3939582109451294,0.8304232358932495,0.3939468264579773,0.3939582109451294,-0.3181976079940796,-0.8930297493934631,-0.3181954622268677,-0.3181976079940796,-0.8930297493934631,-0.3181954622268677,-0.3181976079940796,-0.8930297493934631,-0.3181954622268677,-0.3181976079940796,-0.8930297493934631,-0.3181954622268677,-0.8611258268356323,-0.3160642981529236,-0.3982030749320984,-0.8611258268356323,-0.3160642981529236,-0.3982030749320984,-0.8611258268356323,-0.3160642981529236,-0.3982030749320984,-0.8611258268356323,-0.3160642981529236,-0.3982030749320984,-0.31608039140701294,-0.3982047438621521,-0.8611190915107727,-0.31608039140701294,-0.3982047438621521,-0.8611190915107727,-0.31608039140701294,-0.3982047438621521,-0.8611190915107727,-0.31608039140701294,-0.3982047438621521,-0.8611190915107727,-0.3939639627933502,-0.3939467966556549,-0.8304204940795898,-0.3939639627933502,-0.3939467966556549,-0.8304204940795898,-0.3939639627933502,-0.3939467966556549,-0.8304204940795898,-0.3939639627933502,-0.3939467966556549,-0.8304204940795898,0.39820337295532227,-0.8611286282539368,-0.31605619192123413,0.39820337295532227,-0.8611286282539368,-0.31605619192123413,0.39820337295532227,-0.8611286282539368,-0.31605619192123413,0.39820337295532227,-0.8611286282539368,-0.31605619192123413,0.3181878924369812,-0.8930350542068481,-0.31819045543670654,0.3181878924369812,-0.8930350542068481,-0.31819045543670654,0.3181878924369812,-0.8930350542068481,-0.31819045543670654,0.3181878924369812,-0.8930350542068481,-0.31819045543670654,0.3160671591758728,-0.8611257672309875,-0.39820101857185364,0.3160671591758728,-0.8611257672309875,-0.39820101857185364,0.3160671591758728,-0.8611257672309875,-0.39820101857185364,0.3160671591758728,-0.8611257672309875,-0.39820101857185364,-0.3982013761997223,0.3160552680492401,0.861129879951477,-0.3982013761997223,0.3160552680492401,0.861129879951477,-0.3982013761997223,0.3160552680492401,0.861129879951477,-0.3982013761997223,0.3160552680492401,0.861129879951477,0.31605467200279236,-0.39822202920913696,0.8611205220222473,0.31605467200279236,-0.39822202920913696,0.8611205220222473,0.31605467200279236,-0.39822202920913696,0.8611205220222473,0.31605467200279236,-0.39822202920913696,0.8611205220222473,0.39822128415107727,-0.3160440921783447,0.8611248135566711,0.39822128415107727,-0.3160440921783447,0.8611248135566711,0.39822128415107727,-0.3160440921783447,0.8611248135566711,0.39822128415107727,-0.3160440921783447,0.8611248135566711,0.830415666103363,-0.3939518928527832,-0.39396917819976807,0.830415666103363,-0.3939518928527832,-0.39396917819976807,0.830415666103363,-0.3939518928527832,-0.39396917819976807,0.830415666103363,-0.3939518928527832,-0.39396917819976807,-0.8930335640907288,0.31818917393684387,0.3181927800178528,-0.8930335640907288,0.31818917393684387,0.3181927800178528,-0.8930335640907288,0.31818917393684387,0.3181927800178528,-0.8930335640907288,0.31818917393684387,0.3181927800178528,-0.8304204344749451,0.3939615488052368,0.39394932985305786,-0.8304204344749451,0.3939615488052368,0.39394932985305786,-0.8304204344749451,0.3939615488052368,0.39394932985305786,-0.8304204344749451,0.3939615488052368,0.39394932985305786,0.8611295819282532,-0.39820489287376404,0.3160513937473297,0.8611295819282532,-0.39820489287376404,0.3160513937473297,0.8611295819282532,-0.39820489287376404,0.3160513937473297,0.8611295819282532,-0.39820489287376404,0.3160513937473297,0.31818902492523193,0.3181936740875244,-0.8930333852767944,0.31818902492523193,0.3181936740875244,-0.8930333852767944,0.31818902492523193,0.3181936740875244,-0.8930333852767944,0.31818902492523193,0.3181936740875244,-0.8930333852767944,-0.3982042670249939,0.3160568177700043,-0.861128032207489,-0.3982042670249939,0.3160568177700043,-0.861128032207489,-0.3982042670249939,0.3160568177700043,-0.861128032207489,-0.3982042670249939,0.3160568177700043,-0.861128032207489,-0.3982074558734894,-0.31605467200279236,-0.8611272573471069,-0.3982074558734894,-0.31605467200279236,-0.8611272573471069,-0.3982074558734894,-0.31605467200279236,-0.8611272573471069,-0.3982074558734894,-0.31605467200279236,-0.8611272573471069,0.31604087352752686,-0.3982185125350952,-0.8611272573471069,0.31604087352752686,-0.3982185125350952,-0.8611272573471069,0.31604087352752686,-0.3982185125350952,-0.8611272573471069,0.31604087352752686,-0.3982185125350952,-0.8611272573471069,-0.31601834297180176,0.8611423373222351,0.39820387959480286,-0.31601834297180176,0.8611423373222351,0.39820387959480286,-0.31601834297180176,0.8611423373222351,0.39820387959480286,-0.31601834297180176,0.8611423373222351,0.39820387959480286,-0.31606096029281616,0.39820629358291626,0.8611255288124084,-0.31606096029281616,0.39820629358291626,0.8611255288124084,-0.31606096029281616,0.39820629358291626,0.8611255288124084,-0.31606096029281616,0.39820629358291626,0.8611255288124084,0.31606805324554443,0.8611271977424622,0.39819690585136414,0.31606805324554443,0.8611271977424622,0.39819690585136414,0.31606805324554443,0.8611271977424622,0.39819690585136414,0.31606805324554443,0.8611271977424622,0.39819690585136414,0.31605327129364014,-0.8611239194869995,0.3982159495353699,0.31605327129364014,-0.8611239194869995,0.3982159495353699,0.31605327129364014,-0.8611239194869995,0.3982159495353699,0.31605327129364014,-0.8611239194869995,0.3982159495353699,0.8930177092552185,-0.31821155548095703,-0.31821513175964355,0.8930177092552185,-0.31821155548095703,-0.31821513175964355,0.8930177092552185,-0.31821155548095703,-0.31821513175964355,0.8930177092552185,-0.31821155548095703,-0.31821513175964355,0.39822056889533997,0.8611229658126831,-0.3160500228404999,0.39822056889533997,0.8611229658126831,-0.3160500228404999,0.39822056889533997,0.8611229658126831,-0.3160500228404999,0.39822056889533997,0.8611229658126831,-0.3160500228404999,0.8611273765563965,0.3982042968273163,0.3160584568977356,0.8611273765563965,0.3982042968273163,0.3160584568977356,0.8611273765563965,0.3982042968273163,0.3160584568977356,0.8611273765563965,0.3982042968273163,0.3160584568977356,0.31604790687561035,0.3982231020927429,-0.8611226081848145,0.31604790687561035,0.3982231020927429,-0.8611226081848145,0.31604790687561035,0.3982231020927429,-0.8611226081848145,0.31604790687561035,0.3982231020927429,-0.8611226081848145,-0.3160579800605774,0.39820435643196106,-0.8611276149749756,-0.3160579800605774,0.39820435643196106,-0.8611276149749756,-0.3160579800605774,0.39820435643196106,-0.8611276149749756,-0.3160579800605774,0.39820435643196106,-0.8611276149749756,-0.8611293435096741,-0.3981947600841522,0.31606513261795044,-0.8611293435096741,-0.3981947600841522,0.31606513261795044,-0.8611293435096741,-0.3981947600841522,0.31606513261795044,-0.8611293435096741,-0.3981947600841522,0.31606513261795044,-0.8611273169517517,-0.3982181251049042,-0.31604093313217163,-0.8611273169517517,-0.3982181251049042,-0.31604093313217163,-0.8611273169517517,-0.3982181251049042,-0.31604093313217163,-0.8611273169517517,-0.3982181251049042,-0.31604093313217163,-0.8304233551025391,-0.3939613699913025,-0.39394333958625793,-0.8304233551025391,-0.3939613699913025,-0.39394333958625793,-0.8304233551025391,-0.3939613699913025,-0.39394333958625793,-0.8304233551025391,-0.3939613699913025,-0.39394333958625793,0.31822317838668823,-0.8930189609527588,0.31819969415664673,0.31822317838668823,-0.8930189609527588,0.31819969415664673,0.31822317838668823,-0.8930189609527588,0.31819969415664673,0.31822317838668823,-0.8930189609527588,0.31819969415664673,0.398205429315567,-0.861126184463501,0.3160603642463684,0.398205429315567,-0.861126184463501,0.3160603642463684,0.398205429315567,-0.861126184463501,0.3160603642463684,0.398205429315567,-0.861126184463501,0.3160603642463684,0.8930307030677795,0.31819677352905273,0.31819313764572144,0.8930307030677795,0.31819677352905273,0.31819313764572144,0.8930307030677795,0.31819677352905273,0.31819313764572144,0.8930307030677795,0.31819677352905273,0.31819313764572144,-0.31818729639053345,-0.31819117069244385,0.8930348753929138,-0.31818729639053345,-0.31819117069244385,0.8930348753929138,-0.31818729639053345,-0.31819117069244385,0.8930348753929138,-0.31818729639053345,-0.31819117069244385,0.8930348753929138,-0.39820730686187744,-0.8611242771148682,-0.31606295704841614,-0.39820730686187744,-0.8611242771148682,-0.31606295704841614,-0.39820730686187744,-0.8611242771148682,-0.31606295704841614,-0.39820730686187744,-0.8611242771148682,-0.31606295704841614,-0.3181917071342468,-0.8930321931838989,0.31819429993629456,-0.3181917071342468,-0.8930321931838989,0.31819429993629456,-0.3181917071342468,-0.8930321931838989,0.31819429993629456,-0.3181917071342468,-0.8930321931838989,0.31819429993629456,-0.39820390939712524,-0.8611285090446472,0.31605613231658936,-0.39820390939712524,-0.8611285090446472,0.31605613231658936,-0.39820390939712524,-0.8611285090446472,0.31605613231658936,-0.39820390939712524,-0.8611285090446472,0.31605613231658936,-0.3181929588317871,-0.3181893825531006,-0.8930334448814392,-0.3181929588317871,-0.3181893825531006,-0.8930334448814392,-0.3181929588317871,-0.3181893825531006,-0.8930334448814392,-0.3181929588317871,-0.3181893825531006,-0.8930334448814392,0.398214727640152,-0.3160427510738373,-0.8611282706260681,0.398214727640152,-0.3160427510738373,-0.8611282706260681,0.398214727640152,-0.3160427510738373,-0.8611282706260681,0.398214727640152,-0.3160427510738373,-0.8611282706260681,0.31819266080856323,-0.31819653511047363,-0.8930309414863586,0.31819266080856323,-0.31819653511047363,-0.8930309414863586,0.31819266080856323,-0.31819653511047363,-0.8930309414863586,0.31819266080856323,-0.31819653511047363,-0.8930309414863586,0.8611248731613159,-0.39820438623428345,-0.31606507301330566,0.8611248731613159,-0.39820438623428345,-0.31606507301330566,0.8611248731613159,-0.39820438623428345,-0.31606507301330566,0.8611248731613159,-0.39820438623428345,-0.31606507301330566,0.8611255884170532,-0.3160474896430969,-0.39821693301200867,0.8611255884170532,-0.3160474896430969,-0.39821693301200867,0.8611255884170532,-0.3160474896430969,-0.39821693301200867,0.8611255884170532,-0.3160474896430969,-0.39821693301200867,-0.8930345773696899,-0.3181912899017334,-0.31818774342536926,-0.8930345773696899,-0.3181912899017334,-0.31818774342536926,-0.8930345773696899,-0.3181912899017334,-0.31818774342536926,-0.8930345773696899,-0.3181912899017334,-0.31818774342536926,-0.8611279726028442,0.3982178866863251,-0.3160398602485657,-0.8611279726028442,0.3982178866863251,-0.3160398602485657,-0.8611279726028442,0.3982178866863251,-0.3160398602485657,-0.8611279726028442,0.3982178866863251,-0.3160398602485657,0.8611286878585815,-0.3160666823387146,0.39819496870040894,0.8611286878585815,-0.3160666823387146,0.39819496870040894,0.8611286878585815,-0.3160666823387146,0.39819496870040894,0.8611286878585815,-0.3160666823387146,0.39819496870040894,-0.31604599952697754,-0.8611259460449219,-0.3982173800468445,-0.31604599952697754,-0.8611259460449219,-0.3982173800468445,-0.31604599952697754,-0.8611259460449219,-0.3982173800468445,-0.31604599952697754,-0.8611259460449219,-0.3982173800468445,-0.3182077705860138,0.8930187225341797,0.31821584701538086,-0.3182077705860138,0.8930187225341797,0.31821584701538086,-0.3182077705860138,0.8930187225341797,0.31821584701538086,-0.3182077705860138,0.8930187225341797,0.31821584701538086,0.31819307804107666,0.8930350542068481,0.3181852102279663,0.31819307804107666,0.8930350542068481,0.3181852102279663,0.31819307804107666,0.8930350542068481,0.3181852102279663,0.31819307804107666,0.8930350542068481,0.3181852102279663,0.3181931972503662,0.3181889057159424,0.893033504486084,0.3181931972503662,0.3181889057159424,0.893033504486084,0.3181931972503662,0.3181889057159424,0.893033504486084,0.3181931972503662,0.3181889057159424,0.893033504486084,0.3182152509689331,-0.3182116150856018,0.893017590045929,0.3182152509689331,-0.3182116150856018,0.893017590045929,0.3182152509689331,-0.3182116150856018,0.893017590045929,0.3182152509689331,-0.3182116150856018,0.893017590045929,-0.3182075023651123,0.31821173429489136,0.8930203914642334,-0.3182075023651123,0.31821173429489136,0.8930203914642334,-0.3182075023651123,0.31821173429489136,0.8930203914642334,-0.3182075023651123,0.31821173429489136,0.8930203914642334,0.3160323202610016,0.8611453771591187,-0.39818620681762695,0.3160323202610016,0.8611453771591187,-0.39818620681762695,0.3160323202610016,0.8611453771591187,-0.39818620681762695,0.3160323202610016,0.8611453771591187,-0.39818620681762695,-0.39394327998161316,-0.39396142959594727,0.8304233551025391,-0.39394327998161316,-0.39396142959594727,0.8304233551025391,-0.39394327998161316,-0.39396142959594727,0.8304233551025391,-0.39394327998161316,-0.39396142959594727,0.8304233551025391,0.39394742250442505,-0.3939295709133148,0.8304365277290344,0.39394742250442505,-0.3939295709133148,0.8304365277290344,0.39394742250442505,-0.3939295709133148,0.8304365277290344,0.39394742250442505,-0.3939295709133148,0.8304365277290344,0.393976092338562,-0.8304168581962585,0.39394256472587585,0.393976092338562,-0.8304168581962585,0.39394256472587585,0.393976092338562,-0.8304168581962585,0.39394256472587585,0.393976092338562,-0.8304168581962585,0.39394256472587585,0.8304234743118286,-0.39396101236343384,0.3939433991909027,0.8304234743118286,-0.39396101236343384,0.3939433991909027,0.8304234743118286,-0.39396101236343384,0.3939433991909027,0.8304234743118286,-0.39396101236343384,0.3939433991909027,-0.3939476013183594,-0.8304222822189331,-0.3939594626426697,-0.3939476013183594,-0.8304222822189331,-0.3939594626426697,-0.3939476013183594,-0.8304222822189331,-0.3939594626426697,-0.3939476013183594,-0.8304222822189331,-0.3939594626426697,-0.3939593434333801,-0.8304222822189331,0.3939477205276489,-0.3939593434333801,-0.8304222822189331,0.3939477205276489,-0.3939593434333801,-0.8304222822189331,0.3939477205276489,-0.3939593434333801,-0.8304222822189331,0.3939477205276489,0.393926739692688,-0.3939448595046997,-0.8304391503334045,0.393926739692688,-0.3939448595046997,-0.8304391503334045,0.393926739692688,-0.3939448595046997,-0.8304391503334045,0.393926739692688,-0.3939448595046997,-0.8304391503334045,-0.8304203152656555,-0.39394691586494446,0.39396411180496216,-0.8304203152656555,-0.39394691586494446,0.39396411180496216,-0.8304203152656555,-0.39394691586494446,0.39396411180496216,-0.8304203152656555,-0.39394691586494446,0.39396411180496216,0.3939414918422699,0.393930047750473,-0.8304392099380493,0.3939414918422699,0.393930047750473,-0.8304392099380493,0.3939414918422699,0.393930047750473,-0.8304392099380493,0.3939414918422699,0.393930047750473,-0.8304392099380493,-0.3939580023288727,0.39394649863243103,0.8304234743118286,-0.3939580023288727,0.39394649863243103,0.8304234743118286,-0.3939580023288727,0.39394649863243103,0.8304234743118286,-0.3939580023288727,0.39394649863243103,0.8304234743118286,-0.39395201206207275,0.8304221630096436,0.39395517110824585,-0.39395201206207275,0.8304221630096436,0.39395517110824585,-0.39395201206207275,0.8304221630096436,0.39395517110824585,-0.39395201206207275,0.8304221630096436,0.39395517110824585,-0.39820295572280884,-0.3160640299320221,0.8611259460449219,-0.39820295572280884,-0.3160640299320221,0.8611259460449219,-0.39820295572280884,-0.3160640299320221,0.8611259460449219,-0.39820295572280884,-0.3160640299320221,0.8611259460449219,-0.8611248135566711,-0.3160442113876343,0.39822128415107727,-0.8611248135566711,-0.3160442113876343,0.39822128415107727,-0.8611248135566711,-0.3160442113876343,0.39822128415107727,-0.8611248135566711,-0.3160442113876343,0.39822128415107727,-0.31604111194610596,-0.3982183337211609,0.8611273169517517,-0.31604111194610596,-0.3982183337211609,0.8611273169517517,-0.31604111194610596,-0.3982183337211609,0.8611273169517517,-0.31604111194610596,-0.3982183337211609,0.8611273169517517,-0.3160600960254669,-0.8611261248588562,0.39820581674575806,-0.3160600960254669,-0.8611261248588562,0.39820581674575806,-0.3160600960254669,-0.8611261248588562,0.39820581674575806,-0.3160600960254669,-0.8611261248588562,0.39820581674575806,-0.31606826186180115,0.8611270189285278,-0.39819711446762085,-0.31606826186180115,0.8611270189285278,-0.39819711446762085,-0.31606826186180115,0.8611270189285278,-0.39819711446762085,-0.31606826186180115,0.8611270189285278,-0.39819711446762085,-0.8611301183700562,0.3160545825958252,-0.3982013463973999,-0.8611301183700562,0.3160545825958252,-0.3982013463973999,-0.8611301183700562,0.3160545825958252,-0.3982013463973999,-0.8611301183700562,0.3160545825958252,-0.3982013463973999,0.3982081413269043,0.31607723236083984,0.8611186742782593,0.3982081413269043,0.31607723236083984,0.8611186742782593,0.3982081413269043,0.31607723236083984,0.8611186742782593,0.3982081413269043,0.31607723236083984,0.8611186742782593,0.8611276745796204,0.3160439729690552,0.3982152044773102,0.8611276745796204,0.3160439729690552,0.3982152044773102,0.8611276745796204,0.3160439729690552,0.3982152044773102,0.8611276745796204,0.3160439729690552,0.3982152044773102,-0.8611273765563965,0.39820489287376404,0.3160577416419983,-0.8611273765563965,0.39820489287376404,0.3160577416419983,-0.8611273765563965,0.39820489287376404,0.3160577416419983,-0.8611273765563965,0.39820489287376404,0.3160577416419983,-0.8611289858818054,0.3160620927810669,0.3981979489326477,-0.8611289858818054,0.3160620927810669,0.3981979489326477,-0.8611289858818054,0.3160620927810669,0.3981979489326477,-0.8611289858818054,0.3160620927810669,0.3981979489326477,0.3939596116542816,-0.8304221630096436,-0.39394763112068176,0.3939596116542816,-0.8304221630096436,-0.39394763112068176,0.3939596116542816,-0.8304221630096436,-0.39394763112068176,0.3939596116542816,-0.8304221630096436,-0.39394763112068176],\n \"normalized\": false\n },\n \"uv\": {\n \"itemSize\": 2,\n \"type\": \"Float32Array\",\n \"array\": [0.04120219498872757,0.12086033821105957,0.05345028638839722,0.08731907606124878,0.11187556385993958,0.0670785903930664,0.6875278949737549,0.13345998525619507,0.04903397709131241,0.004412055015563965,0.0771341323852539,0.03593343496322632,0.11686006188392639,0.03130292892456055,0.31248292326927185,0.10850334167480469,0.0489392951130867,0.02688688039779663,0.06469712406396866,0.01563972234725952,0.0803603008389473,0.0917351245880127,0.3686402440071106,0.07315778732299805,0.08036012947559357,0.12086033821105957,0.09260810911655426,0.08731895685195923,0.10864977538585663,0.015640199184417725,0.31252771615982056,0.008440375328063965,0.07252871245145798,0.0917351245880127,0.08828651905059814,0.02688688039779663,0.10081818699836731,0.02688688039779663,0.4936917722225189,0.19815367460250854,0.08025602996349335,0.04575681686401367,0.08838120102882385,0.004412055015563965,0.1084604263305664,0.0983855128288269,0.4374849796295166,0.23353207111358643,0.037787072360515594,0.08731907606124878,0.049033790826797485,0.08731907606124878,0.1084604263305664,0.06366342306137085,0.18752798438072205,0.38353127241134644,0.04542912542819977,0.004412055015563965,0.08025602996349335,0.034130990505218506,0.1040443629026413,0.06484419107437134,0.18748320639133453,0.4834633469581604,0.006349444389343262,0.5731359720230103,0.006555216386914253,0.02688688039779663,0.06469712406396866,0.01905524730682373,0.07694480568170547,0.0917351245880127,0.030523335561156273,0.02688688039779663,0.0771341323852539,0.043954312801361084,0.08477634936571121,0.004412055015563965,0.4374811053276062,0.35838615894317627,0.014292115345597267,0.12086033821105957,0.03061802126467228,0.004412055015563965,0.0964021235704422,0.015639781951904297,0.4934193789958954,0.32318025827407837,0.053450047969818115,0.01905524730682373,0.06469716131687164,0.0917351245880127,0.09630745649337769,0.05377775430679321,0.49373188614845276,0.44814980030059814,0.009876048192381859,0.0917351245880127,0.09298662841320038,0.01905524730682373,0.11999154090881348,0.09396946430206299,0.6183853149414062,0.3231801986694336,0.00987587682902813,0.12086033821105957,0.029955485835671425,0.12086033821105957,0.06469673663377762,0.007808566093444824,0.562527596950531,0.2587568163871765,0.0299553032964468,0.0917351245880127,0.05686555057764053,0.01905524730682373,0.09289196133613586,0.05377775430679321,0.5065897703170776,0.32315701246261597,0.056571945548057556,0.0421520471572876,0.09279727190732956,0.03130292892456055,0.1200861781835556,0.07149463891983032,0.5624833106994629,0.35836511850357056,0.018086323514580727,0.004412055015563965,0.056571945548057556,0.04575687646865845,0.11648134887218475,0.07149463891983032,0.18748287856578827,0.3584839701652527,0.017707442864775658,0.09173506498336792,0.09602326154708862,0.08731895685195923,0.1120648980140686,0.015640199184417725,0.1875280737876892,0.2584848999977112,0.05345025658607483,0.12086033821105957,0.06128161400556564,0.011223673820495605,0.07252849638462067,0.08731907606124878,0.3125280439853668,0.13357031345367432,0.03337060660123825,0.08731913566589355,0.0769449844956398,0.087319016456604,0.10864977538585663,0.0078089237213134766,0.5625283718109131,0.133742094039917,0.08025602996349335,0.03773587942123413,0.10043948143720627,0.06484419107437134,0.12046489119529724,0.03130292892456055,0.5624833703041077,0.23337173461914062,0.03412818908691406,0.02688688039779663,0.08025602996349335,0.04215192794799805,0.11206528544425964,0.0983855128288269,0.18748319149017334,0.23347699642181396,0.006460724398493767,0.087319016456604,0.017707442864775658,0.087319016456604,0.06252795457839966,0.25844651460647583,0.1120649129152298,0.023471713066101074,0.014576157554984093,0.05377775430679321,0.04561847448348999,0.058193862438201904,0.1008182168006897,0.01563972234725952,0.25627732276916504,0.44812923669815063,0.006148636341094971,0.4481179118156433,0.05686555057764053,0.026886820793151855,0.08819183707237244,0.12086033821105957,0.10893382132053375,0.05377775430679321,0.018086323514580727,0.03130292892456055,0.056571945548057556,0.05017292499542236,0.06248307228088379,0.48360395431518555,0.10883913934230804,0.03130292892456055,0.025539224967360497,0.05819380283355713,0.07252870500087738,0.01563972234725952,0.1039496660232544,0.12086033821105957,0.49378809332847595,0.07314485311508179,0.014292331412434578,0.087319016456604,0.025539005175232887,0.087319016456604,0.10864977538585663,0.023471713066101074,0.4375278651714325,0.008257150650024414,0.009970692917704582,0.03130298852920532,0.014292115345597267,0.05819380283355713,0.053450047969818115,0.023471355438232422,0.3811866044998169,0.07312166690826416,0.0490339919924736,0.0917351245880127,0.0803602933883667,0.01563972234725952,0.10432836413383484,0.05377775430679321,0.6185856461524963,0.44816309213638306,0.02601257897913456,0.03130292892456055,0.061281636357307434,0.05819380283355713,0.06469713896512985,0.02688688039779663,0.6315924525260925,0.32315754890441895,0.03061799891293049,0.03130292892456055,0.06911320239305496,0.023471355438232422,0.09602341055870056,0.09173518419265747,0.7433825731277466,0.32318103313446045,0.08477634936571121,0.05377775430679321,0.10043948143720627,0.0983855128288269,0.11629162728786469,0.0652761459350586,0.687483012676239,0.4834805130958557,0.037787072360515594,0.12086033821105957,0.041202202439308167,0.08731907606124878,0.11187553405761719,0.06366342306137085,0.5625277757644653,0.00847846269607544,0.010065404698252678,0.004412055015563965,0.05345005542039871,0.035933494567871094,0.1008182168006897,0.03130298852920532,0.5624833703041077,0.10848653316497803,0.02601257897913456,0.02688688039779663,0.06911320239305496,0.01905524730682373,0.07252870500087738,0.05819380283355713,0.3685356378555298,0.19816696643829346,0.029955485835671425,0.08731913566589355,0.06469696015119553,0.12086033821105957,0.10864977538585663,0.011224091053009033,0.43752849102020264,0.38332629203796387,0.07694479078054428,0.05819380283355713,0.10053417086601257,0.08731895685195923,0.10423369705677032,0.01905524730682373,0.5065778493881226,0.19815611839294434,0.017991656437516212,0.05377775430679321,0.0803602933883667,0.05819380283355713,0.10423369705677032,0.01563972234725952,0.1188262403011322,0.4481416940689087,0.0065551940351724625,0.03130298852920532,0.05686555057764053,0.023471355438232422,0.084776371717453,0.12086033821105957,0.7436801791191101,0.07315462827682495,0.025539247319102287,0.09173518419265747,0.06460244953632355,0.05377769470214844,0.10423369705677032,0.023471355438232422,0.11862531304359436,0.5731591582298279,0.06118693947792053,0.05377769470214844,0.06911322474479675,0.0917351245880127,0.10081818699836731,0.023471355438232422,0.5063889026641846,0.4481391906738281,0.022123711183667183,0.09173518419265747,0.08487099409103394,0.02688688039779663,0.10423369705677032,0.02688688039779663,0.38155296444892883,0.3231542706489563,0.02259708009660244,0.03130292892456055,0.06128162145614624,0.02688688039779663,0.08819186687469482,0.05819392204284668,0.24363532662391663,0.5731584429740906,0.03337061405181885,0.12086033821105957,0.06469673663377762,0.011223673820495605,0.0691133663058281,0.08731907606124878,0.687528133392334,0.3834933042526245,0.017707636579871178,0.12086033821105957,0.0964021235704422,0.01905524730682373,0.11657601594924927,0.09396946430206299,0.1313704252243042,0.32313746213912964,0.006460549309849739,0.0917351245880127,0.03403352200984955,0.004412055015563965,0.09298662841320038,0.015639781951904297,0.13138353824615479,0.1981390118598938,0.014576157554984093,0.02688688039779663,0.0299553032964468,0.05819392204284668,0.0803602784872055,0.026886820793151855,0.38124242424964905,0.4481261968612671,0.033370792865753174,0.05819392204284668,0.0803602784872055,0.023471355438232422,0.12037022411823273,0.05377775430679321,0.6183971166610718,0.19817936420440674,0.05345005542039871,0.058193862438201904,0.0964021235704422,0.02688688039779663,0.11999151110649109,0.0983855128288269,0.6313499808311462,0.1981356143951416,0.056865572929382324,0.058193862438201904,0.06920789182186127,0.03130286931991577,0.0964021235704422,0.023471355438232422,0.3686973452568054,0.4481528401374817,0.014481494203209877,0.03130292892456055,0.056571945548057556,0.05377781391143799,0.06911319494247437,0.05377769470214844,0.3124830424785614,0.48353415727615356,0.022123875096440315,0.087319016456604,0.08819165080785751,0.08731907606124878,0.10864977538585663,0.02688688039779663,0.18752774596214294,0.5084468126296997,0.022123703733086586,0.05819380283355713,0.02259708009660244,0.02688688039779663,0.07252870500087738,0.01905524730682373,0.1313396394252777,0.5731350779533386,0.00646076537668705,0.12086033821105957,0.05686537176370621,0.12086033821105957,0.06128161400556564,0.007808566093444824,0.18752765655517578,0.1335013508796692,0.04561866074800491,0.12086033821105957,0.053450047969818115,0.007808566093444824,0.06252825260162354,0.1334705352783203,0.06469693779945374,0.08731907606124878,0.006339132785797119,0.3231348991394043,0.006460549309849739,0.05819380283355713,0.07262339442968369,0.03130286931991577,0.09298662841320038,0.023471355438232422,0.009875854477286339,0.087319016456604,0.08477649837732315,0.08731907606124878,0.1120649129152298,0.02688688039779663,0.31252795457839966,0.25839555263519287,0.009876048192381859,0.05819380283355713,0.09298662841320038,0.02688688039779663,0.11657601594924927,0.0983855128288269,0.36867624521255493,0.3231545090675354,0.06252825260162354,0.383209228515625,0.08036010712385178,0.087319016456604,0.0881916955113411,0.09173506498336792,0.1120649129152298,0.0078089237213134766,0.053450047969818115,0.01563972234725952,0.06128164380788803,0.0917351245880127,0.08828655630350113,0.03130298852920532,0.6312947273254395,0.073131263256073,0.061281830072402954,0.12086033821105957,0.08477656543254852,0.09173506498336792,0.1120649129152298,0.011224091053009033,0.6875279545783997,0.008391082286834717,0.06911320239305496,0.01563972234725952,0.06911322474479675,0.05819380283355713,0.10053417086601257,0.12086033821105957,0.631377100944519,0.44813835620880127,0.033370815217494965,0.0917351245880127,0.05686555057764053,0.01563972234725952,0.08487105369567871,0.03130298852920532,0.7435976266860962,0.44816213846206665,0.04561866074800491,0.08731907606124878,0.05686540901660919,0.08731907606124878,0.1084604263305664,0.0670785903930664,0.3125280737876892,0.3833693861961365,0.037786878645420074,0.05819380283355713,0.04552379250526428,0.02688688039779663,0.06128161400556564,0.01563972234725952,0.13140809535980225,0.4481407403945923,0.03403349965810776,0.03130292892456055,0.05345005542039871,0.0917351245880127,0.06911320239305496,0.026886820793151855,0.2564394772052765,0.19814354181289673,0.017707636579871178,0.05819380283355713,0.053450047969818115,0.026886820793151855,0.11234933137893677,0.05377775430679321,0.11863547563552856,0.32315850257873535,0.025539016351103783,0.12086033821105957,0.0625276267528534,0.5084590315818787,0.07694500684738159,0.12086033821105957,0.10864977538585663,0.01905524730682373,0.014292312785983086,0.09173506498336792,0.022123919799923897,0.12086033821105957,0.1120648980140686,0.01905524730682373,0.43752825260162354,0.2587151527404785,0.05686517059803009,0.011223673820495605,0.07252854108810425,0.12086033821105957,0.09260810166597366,0.12086033821105957,0.4375276267528534,0.13337987661361694,0.053450047969818115,0.011223673820495605,0.06128180772066116,0.08731907606124878,0.09602323174476624,0.12086033821105957,0.687527596950531,0.2587602138519287,0.049033790826797485,0.12086033821105957,0.05686517059803009,0.007808566093444824,0.06911341845989227,0.12086033821105957,0.5625280141830444,0.38350802659988403,0.017991656437516212,0.02688688039779663,0.07694479078054428,0.02688688039779663,0.09602341055870056,0.05819380283355713,0.24360424280166626,0.3231614828109741,0.045429132878780365,0.03130298852920532,0.06248307228088379,0.2334902286529541,0.11206528544425964,0.07149463891983032,0.11960287392139435,0.023281991481781006,0.026107268407940865,0.05377775430679321,0.030523335561156273,0.05377775430679321,0.08025602996349335,0.05377769470214844,0.6874831914901733,0.3583640456199646,0.022502413019537926,0.004412055015563965,0.022502413019537926,0.05377775430679321,0.08025602996349335,0.05017286539077759,0.18748320639133453,0.6085007190704346,0.026107246056199074,0.004412055015563965,0.03412819653749466,0.05377775430679321,0.0771341323852539,0.0519753098487854,0.3124833106994629,0.2334464192390442,0.05345005542039871,0.051975369453430176,0.062483012676239014,0.3585008978843689,0.0727180615067482,0.05377769470214844,0.11244398355484009,0.03130292892456055,0.1084604263305664,0.07149463891983032,0.11648134887218475,0.12086033821105957,0.11960287392139435,0.02688688039779663,0.31248316168785095,0.35852259397506714,0.006460549309849739,0.05377775430679321,0.08838121592998505,0.05377775430679321,0.11941350996494293,0.06347370147705078,0.6874832510948181,0.10852515697479248,0.0490339919924736,0.03130298852920532,0.11648097634315491,0.02508443593978882,0.1200861781835556,0.12086033821105957,0.6874829530715942,0.23349487781524658,0.014481494203209877,0.004412055015563965,0.05345005542039871,0.043954432010650635,0.0964021235704422,0.03130292892456055,0.43748292326927185,0.4835529923439026,0.05657196044921875,0.037735939025878906,0.061092279851436615,0.03130286931991577,0.10442306846380234,0.03130298852920532,0.5624828934669495,0.4834739565849304,0.006460549309849739,0.004412055015563965,0.056571945548057556,0.03413110971450806,0.06248317286372185,0.6084953546524048,0.06469713896512985,0.03130286931991577,0.006358683109283447,0.198136568069458,0.04552381485700607,0.05377781391143799,0.04561847448348999,0.0917351245880127,0.0803602933883667,0.01905524730682373,0.04120240360498428,0.0917351245880127,0.04893931746482849,0.05377781391143799,0.07694479078054428,0.01905524730682373,0.7436245679855347,0.1981593370437622,0.06469712406396866,0.023471355438232422,0.06469712406396866,0.05819380283355713,0.11197057366371155,0.09396946430206299,0.11861595511436462,0.1981601119041443,0.06128162145614624,0.023471355438232422,0.084776371717453,0.05819392204284668,0.10855509340763092,0.09396940469741821,0.25629860162734985,0.32313108444213867,0.07694478332996368,0.023471355438232422,0.09260791540145874,0.05819380283355713,0.1169547289609909,0.05377775430679321,0.256334125995636,0.07313430309295654,0.049033984541893005,0.058193862438201904,0.1008182168006897,0.01905524730682373,0.1039496511220932,0.08731895685195923,0.2435668408870697,0.448164165019989,0.07252871245145798,0.023471355438232422,0.09260791540145874,0.09173518419265747,0.10855511575937271,0.12086033821105957,0.38128527998924255,0.19813251495361328,0.056865572929382324,0.0917351245880127,0.07252871245145798,0.026886820793151855,0.11197061836719513,0.12086033821105957,0.2435913383960724,0.19816231727600098,0.009970737621188164,0.02688688039779663,0.04120238125324249,0.05819380283355713,0.06128162145614624,0.01905524730682373,0.6186096668243408,0.07316023111343384,0.037786878645420074,0.0917351245880127,0.07694479078054428,0.01563972234725952,0.10091288387775421,0.05377775430679321,0.5063652992248535,0.07313716411590576,0.010065404698252678,0.05377775430679321,0.10404433310031891,0.0983855128288269,0.11941350996494293,0.0670785903930664,0.4374832212924957,0.10858356952667236],\n \"normalized\": false\n }\n },\n \"index\": {\n \"type\": \"Uint16Array\",\n \"array\": [283,23,19,231,319,235,27,31,363,338,273,32,39,279,171,147,331,47,55,63,51,67,71,183,75,311,143,79,83,195,222,297,351,219,87,371,90,313,271,259,207,203,236,102,155,111,383,107,291,335,119,247,323,159,287,303,127,179,131,255,135,139,375,3,327,347,308,213,140,91,210,230,70,275,278,348,173,122,269,157,114,36,185,41,193,293,190,108,268,113,28,8,4,294,13,69,18,162,166,9,374,34,82,358,194,26,2,134,361,154,94,233,202,227,277,160,168,117,346,343,99,315,103,260,133,373,246,78,146,212,109,104,276,180,68,301,264,124,369,125,266,284,289,221,177,218,73,381,250,106,172,300,120,33,136,336,322,130,382,112,320,380,298,354,350,238,158,98,285,349,121,249,74,142,228,225,88,176,56,53,132,344,376,189,76,192,274,10,35,368,72,217,237,148,77,1,200,196,342,288,116,165,281,16,184,52,48,241,145,45,25,93,256,126,282,286,339,164,161,42,49,181,92,100,204,341,324,296,378,334,138,312,205,101,149,30,81,337,137,332,105,141,214,226,206,314,5,80,29,60,329,65,44,253,240,66,50,62,299,325,318,328,292,64,37,20,85,366,86,22,58,330,61,254,321,242,211,307,175,15,7,11,310,302,306,198,317,326,353,209,174,21,169,17,283,367,23,231,355,319,27,263,31,338,163,273,39,43,279,147,191,331,55,59,63,67,295,71,75,267,311,79,151,83,222,340,297,219,187,87,90,224,313,259,95,207,236,96,102,111,115,383,291,167,335,247,243,323,287,123,303,179,251,131,135,379,139,3,199,327,308,304,213,91,110,210,70,14,275,348,352,173,269,97,157,36,84,185,193,356,293,108,89,268,28,261,8,294,357,13,18,170,162,9,262,374,82,6,358,26,258,2,361,150,154,233,197,202,277,272,160,117,377,346,99,270,315,260,24,133,246,239,78,212,208,109,276,40,180,301,309,264,369,364,125,284,280,289,177,54,218,381,129,250,172,305,300,33,372,136,112,156,320,298,316,354,238,245,158,285,223,349,249,178,74,228,232,225,176,252,56,132,0,344,189,144,76,274,12,10,368,265,72,237,153,148,1,257,200,342,220,288,165,290,281,184,216,52,241,244,145,25,360,93,126,365,282,339,333,164,42,186,49,92,152,100,341,345,324,378,118,334,149,362,30,105,248,141,226,201,206,44,57,253,66,182,50,328,188,292,366,370,86,58,46,330,254,128,321,211,215,307,15,359,7,198,234,317,353,229,209,21,38,169]\n },\n \"boundingSphere\": {\n \"center\": [0,0,0],\n \"radius\": 161.78209344582697\n }\n },\n faceValues: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24],\n rotationCombinations: {\n \"1,2\": [0, 0, 180],\n \"1,3\": [-180, 0, 90],\n \"1,4\": [90, 0, -90],\n \"1,5\": [-90, 0, -90],\n \"1,6\": [-130, -90, -40],\n \"1,7\": [0, -180, 90],\n \"1,8\": [-90, 0, 90],\n \"1,9\": [90, 0, 90],\n \"1,10\": [50, -90, -40],\n \"1,11\": [0, 90, -180],\n \"1,12\": [0, 90, 0],\n \"1,13\": [180, 0, 0],\n \"1,14\": [0, 180, 0],\n \"1,15\": [0, 0, 90],\n \"1,16\": [90, 180, 0],\n \"1,17\": [90, 0, 0],\n \"1,18\": [-130, 90, 40],\n \"1,19\": [0, 0, -90],\n \"1,20\": [90, 0, -180],\n \"1,21\": [-90, 0, 0],\n \"1,22\": [50, 90, 40],\n \"1,23\": [0, -90, 0],\n \"1,24\": [0, -90, -180],\n \"2,3\": [0, 180, 90],\n \"2,4\": [-90, 0, 90],\n \"2,5\": [90, 0, 90],\n \"2,6\": [-50, 90, -40],\n \"2,7\": [180, 0, 90],\n \"2,8\": [90, 0, -90],\n \"2,9\": [-90, 0, -90],\n \"2,10\": [130, 90, -40],\n \"2,11\": [0, -90, 0],\n \"2,12\": [0, -90, 180],\n \"2,13\": [0, -180, 0],\n \"2,14\": [-180, 0, 0],\n \"2,15\": [0, 0, -90],\n \"2,16\": [90, 0, 0],\n \"2,17\": [-90, 0, -180],\n \"2,18\": [-50, -90, 40],\n \"2,19\": [0, 0, 90],\n \"2,20\": [-90, 0, 0],\n \"2,21\": [-90, -180, 0],\n \"2,22\": [130, -90, 40],\n \"2,23\": [0, 90, -180],\n \"2,24\": [0, 90, 0],\n \"3,4\": [0, 90, -180],\n \"3,5\": [0, -90, 180],\n \"3,6\": [-90, 0, -180],\n \"3,7\": [0, 0, 180],\n \"3,8\": [0, -90, 0],\n \"3,9\": [0, 90, 0],\n \"3,10\": [-90, 0, 0],\n \"3,11\": [90, 0, -90],\n \"3,12\": [90, 0, 90],\n \"3,13\": [0, 0, -90],\n \"3,14\": [0, 0, 90],\n \"3,15\": [0, 180, 0],\n \"3,16\": [45, -90, 135],\n \"3,17\": [-135, 90, 45],\n \"3,18\": [90, 0, 0],\n \"3,19\": [-180, 0, 0],\n \"3,20\": [45, 90, 45],\n \"3,21\": [45, -90, -45],\n \"3,22\": [-90, 180, 0],\n \"3,23\": [-90, 0, 90],\n \"3,24\": [-90, 0, -90],\n \"4,5\": [0, 180, 0],\n \"4,6\": [90, 0, -90],\n \"4,7\": [0, 90, 0],\n \"4,8\": [180, 0, 0],\n \"4,9\": [0, 0, -180],\n \"4,10\": [90, 0, 90],\n \"4,11\": [-90, 0, 180],\n \"4,12\": [-90, 0, 0],\n \"4,13\": [-40, 90, 130],\n \"4,14\": [-40, 90, -50],\n \"4,15\": [0, -90, -180],\n \"4,16\": [-180, 0, 90],\n \"4,17\": [0, 0, 90],\n \"4,18\": [-90, 0, -90],\n \"4,19\": [0, -90, 0],\n \"4,20\": [0, 0, -90],\n \"4,21\": [0, 180, 90],\n \"4,22\": [-90, 0, 90],\n \"4,23\": [-90, 180, 0],\n \"4,24\": [90, 0, 0],\n \"5,6\": [90, 0, 90],\n \"5,7\": [0, -90, 0],\n \"5,8\": [0, 0, 180],\n \"5,9\": [180, 0, 0],\n \"5,10\": [90, 0, -90],\n \"5,11\": [-90, 0, 0],\n \"5,12\": [90, 180, 0],\n \"5,13\": [40, -90, 130],\n \"5,14\": [40, -90, -50],\n \"5,15\": [0, 90, 180],\n \"5,16\": [0, 0, -90],\n \"5,17\": [180, 0, -90],\n \"5,18\": [-90, 0, 90],\n \"5,19\": [0, 90, 0],\n \"5,20\": [0, 180, -90],\n \"5,21\": [0, 0, 90],\n \"5,22\": [-90, 0, -90],\n \"5,23\": [90, 0, 0],\n \"5,24\": [90, 0, -180],\n \"6,7\": [-90, 0, 0],\n \"6,8\": [45, 90, 45],\n \"6,9\": [45, -90, -45],\n \"6,10\": [0, 0, -180],\n \"6,11\": [0, 180, -90],\n \"6,12\": [-180, 0, -90],\n \"6,13\": [-90, 0, 90],\n \"6,14\": [-90, 0, -90],\n \"6,15\": [90, 0, 0],\n \"6,16\": [0, 90, -180],\n \"6,17\": [0, -90, -180],\n \"6,18\": [0, -180, 0],\n \"6,19\": [-90, -180, 0],\n \"6,20\": [0, -90, 0],\n \"6,21\": [0, 90, 0],\n \"6,22\": [-180, 0, 0],\n \"6,23\": [0, 0, -90],\n \"6,24\": [0, 0, 90],\n \"7,8\": [0, 90, 180],\n \"7,9\": [0, -90, -180],\n \"7,10\": [90, 0, -180],\n \"7,11\": [-90, 0, 90],\n \"7,12\": [-90, 0, -90],\n \"7,13\": [0, 0, 90],\n \"7,14\": [0, 0, -90],\n \"7,15\": [180, 0, 0],\n \"7,16\": [-45, 90, -45],\n \"7,17\": [-45, -90, 45],\n \"7,18\": [90, -180, 0],\n \"7,19\": [0, 180, 0],\n \"7,20\": [135, -90, 45],\n \"7,21\": [135, 90, -45],\n \"7,22\": [-90, 0, 0],\n \"7,23\": [90, 0, -90],\n \"7,24\": [90, 0, 90],\n \"8,9\": [0, -180, 0],\n \"8,10\": [-90, 0, 90],\n \"8,11\": [-90, -180, 0],\n \"8,12\": [90, 0, 0],\n \"8,13\": [-40, 90, -50],\n \"8,14\": [-40, 90, 130],\n \"8,15\": [0, -90, 0],\n \"8,16\": [0, 0, 90],\n \"8,17\": [0, -180, -90],\n \"8,18\": [90, 0, -90],\n \"8,19\": [0, -90, -180],\n \"8,20\": [-180, 0, -90],\n \"8,21\": [0, 0, -90],\n \"8,22\": [90, 0, 90],\n \"8,23\": [-90, 0, -180],\n \"8,24\": [-90, 0, 0],\n \"9,10\": [-90, 0, -90],\n \"9,11\": [90, 0, 0],\n \"9,12\": [90, 0, 180],\n \"9,13\": [40, -90, -50],\n \"9,14\": [40, -90, 130],\n \"9,15\": [0, 90, 0],\n \"9,16\": [0, -180, 90],\n \"9,17\": [0, 0, -90],\n \"9,18\": [90, 0, 90],\n \"9,19\": [0, 90, -180],\n \"9,20\": [0, 0, 90],\n \"9,21\": [180, 0, 90],\n \"9,22\": [90, 0, -90],\n \"9,23\": [-90, 0, 0],\n \"9,24\": [90, -180, 0],\n \"10,11\": [180, 0, -90],\n \"10,12\": [0, -180, -90],\n \"10,13\": [90, 0, -90],\n \"10,14\": [90, 0, 90],\n \"10,15\": [90, 180, 0],\n \"10,16\": [0, -90, 0],\n \"10,17\": [0, 90, 0],\n \"10,18\": [180, 0, 0],\n \"10,19\": [-90, 0, 0],\n \"10,20\": [0, 90, 180],\n \"10,21\": [0, -90, -180],\n \"10,22\": [0, 180, 0],\n \"10,23\": [0, 0, 90],\n \"10,24\": [0, 0, -90],\n \"11,12\": [0, 0, 180],\n \"11,13\": [0, -90, 0],\n \"11,14\": [0, -90, 180],\n \"11,15\": [-50, 90, -40],\n \"11,16\": [90, 0, -90],\n \"11,17\": [-90, 0, -90],\n \"11,18\": [0, 0, 90],\n \"11,19\": [130, 90, -40],\n \"11,20\": [-90, 0, 90],\n \"11,21\": [90, 0, 90],\n \"11,22\": [0, 0, -90],\n \"11,23\": [-180, 0, 0],\n \"11,24\": [0, -180, 0],\n \"12,13\": [0, 90, -180],\n \"12,14\": [0, 90, 0],\n \"12,15\": [-130, -90, -40],\n \"12,16\": [-90, 0, 90],\n \"12,17\": [90, 0, 90],\n \"12,18\": [0, 0, -90],\n \"12,19\": [50, -90, -40],\n \"12,20\": [90, 0, -90],\n \"12,21\": [-90, 0, -90],\n \"12,22\": [0, 0, 90],\n \"12,23\": [0, -180, 0],\n \"12,24\": [-180, 0, 0],\n \"13,14\": [0, 0, 180],\n \"13,15\": [0, 180, -90],\n \"13,16\": [90, 0, 180],\n \"13,17\": [-90, 0, 0],\n \"13,18\": [50, 90, 40],\n \"13,19\": [-180, 0, -90],\n \"13,20\": [90, -180, 0],\n \"13,21\": [90, 0, 0],\n \"13,22\": [-130, 90, 40],\n \"13,23\": [0, -90, 180],\n \"13,24\": [0, -90, 0],\n \"14,15\": [180, 0, -90],\n \"14,16\": [-90, 0, 0],\n \"14,17\": [-90, 180, 0],\n \"14,18\": [130, -90, 40],\n \"14,19\": [0, -180, -90],\n \"14,20\": [90, 0, 0],\n \"14,21\": [-90, 0, 180],\n \"14,22\": [-50, -90, 40],\n \"14,23\": [0, 90, 0],\n \"14,24\": [0, 90, -180],\n \"15,16\": [-45, 90, 135],\n \"15,17\": [-45, -90, -135],\n \"15,18\": [90, 0, 180],\n \"15,19\": [0, 0, 180],\n \"15,20\": [-45, -90, 45],\n \"15,21\": [-45, 90, -45],\n \"15,22\": [90, 0, 0],\n \"15,23\": [-90, 0, -90],\n \"15,24\": [-90, 0, 90],\n \"16,17\": [0, 180, 0],\n \"16,18\": [0, -90, -180],\n \"16,19\": [-90, 0, 90],\n \"16,20\": [180, 0, 0],\n \"16,21\": [0, 0, 180],\n \"16,22\": [0, -90, 0],\n \"16,23\": [40, 90, 50],\n \"16,24\": [40, 90, -130],\n \"17,18\": [0, 90, -180],\n \"17,19\": [-90, 0, -90],\n \"17,20\": [0, 0, 180],\n \"17,21\": [180, 0, 0],\n \"17,22\": [0, 90, 0],\n \"17,23\": [-40, -90, 50],\n \"17,24\": [-40, -90, -130],\n \"18,19\": [90, 0, 0],\n \"18,20\": [0, 90, 0],\n \"18,21\": [0, -90, 0],\n \"18,22\": [0, 0, 180],\n \"18,23\": [180, 0, 90],\n \"18,24\": [0, 180, 90],\n \"19,20\": [-135, 90, 45],\n \"19,21\": [-135, -90, -45],\n \"19,22\": [-90, 0, 180],\n \"19,23\": [90, 0, 90],\n \"19,24\": [90, 0, -90],\n \"20,21\": [0, 180, 0],\n \"20,22\": [0, -90, 180],\n \"20,23\": [40, 90, -130],\n \"20,24\": [40, 90, 50],\n \"21,22\": [0, 90, 180],\n \"21,23\": [-40, -90, -130],\n \"21,24\": [-40, -90, 50],\n \"22,23\": [0, -180, 90],\n \"22,24\": [-180, 0, 90],\n \"23,24\": [0, 0, -180]\n }\n },\n \"d30\": {\n \"metadata\": {\n \"version\": 4.5,\n \"type\": \"BufferGeometry\",\n \"generator\": \"BufferGeometry.toJSON\"\n },\n \"uuid\": \"6D1EB50D-67F2-45C7-BF93-23245B31E912\",\n \"type\": \"BufferGeometry\",\n \"data\": {\n \"attributes\": {\n \"position\": {\n \"itemSize\": 3,\n \"type\": \"Float32Array\",\n \"array\": [-55.942420959472656,58.09579086303711,-56.76457214355469,-55.942420959472656,58.09579086303711,-56.76457214355469,-55.942420959472656,58.09579086303711,-56.76457214355469,-55.942420959472656,58.09579086303711,-56.76457214355469,-55.942420959472656,58.09579086303711,-56.76457214355469,-55.942420959472656,58.09579086303711,-56.76457214355469,-55.54539108276367,91.2035140991211,-2.153374433517456,-55.54539108276367,91.2035140991211,-2.153374433517456,-55.54539108276367,91.2035140991211,-2.153374433517456,-55.54539108276367,91.2035140991211,-2.153374433517456,-55.54539108276367,91.2035140991211,-2.153374433517456,58.09599685668945,56.76477813720703,55.94200897216797,58.09599685668945,56.76477813720703,55.94200897216797,58.09599685668945,56.76477813720703,55.94200897216797,58.09599685668945,56.76477813720703,55.94200897216797,58.09599685668945,56.76477813720703,55.94200897216797,-2.1539175510406494,-55.545379638671875,-91.20350646972656,-2.1539175510406494,-55.545379638671875,-91.20350646972656,-2.1539175510406494,-55.545379638671875,-91.20350646972656,-2.1539175510406494,-55.545379638671875,-91.20350646972656,-2.1539175510406494,-55.545379638671875,-91.20350646972656,-2.1539175510406494,-55.545379638671875,-91.20350646972656,35.903011322021484,1.3310145139694214,-91.8457260131836,35.903011322021484,1.3310145139694214,-91.8457260131836,35.903011322021484,1.3310145139694214,-91.8457260131836,35.903011322021484,1.3310145139694214,-91.8457260131836,35.903011322021484,1.3310145139694214,-91.8457260131836,35.903011322021484,1.3310145139694214,-91.8457260131836,33.74937438964844,-5.019184072807548e-7,-92.66828918457031,33.74937438964844,-5.019184072807548e-7,-92.66828918457031,33.74937438964844,-5.019184072807548e-7,-92.66828918457031,33.74937438964844,-5.019184072807548e-7,-92.66828918457031,35.903690338134766,1.331014633178711,91.84544372558594,35.903690338134766,1.331014633178711,91.84544372558594,35.903690338134766,1.331014633178711,91.84544372558594,35.903690338134766,1.331014633178711,91.84544372558594,35.903690338134766,1.331014633178711,91.84544372558594,56.76499557495117,55.94220733642578,58.0955924987793,56.76499557495117,55.94220733642578,58.0955924987793,56.76499557495117,55.94220733642578,58.0955924987793,56.76499557495117,55.94220733642578,58.0955924987793,56.76499557495117,55.94220733642578,58.0955924987793,-1.3306841850280762,-57.6989631652832,89.87248229980469,-1.3306841850280762,-57.6989631652832,89.87248229980469,-1.3306841850280762,-57.6989631652832,89.87248229980469,-1.3306841850280762,-57.6989631652832,89.87248229980469,-1.3306841850280762,-57.6989631652832,89.87248229980469,-1.3306841850280762,-57.6989631652832,89.87248229980469,92.66816711425781,33.749717712402344,-0.00033652668935246766,92.66816711425781,33.749717712402344,-0.00033652668935246766,92.66816711425781,33.749717712402344,-0.00033652668935246766,92.66816711425781,33.749717712402344,-0.00033652668935246766,0.0001248687185579911,92.66816711425781,33.74972152709961,0.0001248687185579911,92.66816711425781,33.74972152709961,0.0001248687185579911,92.66816711425781,33.74972152709961,0.0001248687185579911,92.66816711425781,33.74972152709961,-91.8455810546875,-35.903350830078125,1.3313559293746948,-91.8455810546875,-35.903350830078125,1.3313559293746948,-91.8455810546875,-35.903350830078125,1.3313559293746948,-91.8455810546875,-35.903350830078125,1.3313559293746948,-91.8455810546875,-35.903350830078125,1.3313559293746948,-91.8455810546875,-35.903350830078125,1.3313559293746948,-56.76499557495117,55.94220733642578,-58.095577239990234,-56.76499557495117,55.94220733642578,-58.095577239990234,-56.76499557495117,55.94220733642578,-58.095577239990234,-56.76499557495117,55.94220733642578,-58.095577239990234,-92.66815185546875,-33.749717712402344,0.000344159547239542,-92.66815185546875,-33.749717712402344,0.000344159547239542,-92.66815185546875,-33.749717712402344,0.000344159547239542,-92.66815185546875,-33.749717712402344,0.000344159547239542,-91.84559631347656,-35.903350830078125,-1.3306736946105957,-91.84559631347656,-35.903350830078125,-1.3306736946105957,-91.84559631347656,-35.903350830078125,-1.3306736946105957,-91.84559631347656,-35.903350830078125,-1.3306736946105957,-91.84559631347656,-35.903350830078125,-1.3306736946105957,-91.2037124633789,-2.1535837650299072,-55.54503631591797,-91.2037124633789,-2.1535837650299072,-55.54503631591797,-91.2037124633789,-2.1535837650299072,-55.54503631591797,-91.2037124633789,-2.1535837650299072,-55.54503631591797,-91.2037124633789,-2.1535837650299072,-55.54503631591797,1.3308831453323364,91.84559631347656,-35.90335464477539,1.3308831453323364,91.84559631347656,-35.90335464477539,1.3308831453323364,91.84559631347656,-35.90335464477539,1.3308831453323364,91.84559631347656,-35.90335464477539,1.3308831453323364,91.84559631347656,-35.90335464477539,55.545372009277344,91.2035140991211,-2.1537835597991943,55.545372009277344,91.2035140991211,-2.1537835597991943,55.545372009277344,91.2035140991211,-2.1537835597991943,55.545372009277344,91.2035140991211,-2.1537835597991943,55.545372009277344,91.2035140991211,-2.1537835597991943,55.545372009277344,91.2035140991211,-2.1537835597991943,-91.84558868408203,35.903350830078125,1.331355094909668,-91.84558868408203,35.903350830078125,1.331355094909668,-91.84558868408203,35.903350830078125,1.331355094909668,-91.84558868408203,35.903350830078125,1.331355094909668,-91.84558868408203,35.903350830078125,1.331355094909668,-91.84558868408203,35.903350830078125,1.331355094909668,-58.09558868408203,56.76477813720703,55.94243240356445,-58.09558868408203,56.76477813720703,55.94243240356445,-58.09558868408203,56.76477813720703,55.94243240356445,-58.09558868408203,56.76477813720703,55.94243240356445,-58.09558868408203,56.76477813720703,55.94243240356445,-57.698951721191406,89.87249755859375,1.3312309980392456,-57.698951721191406,89.87249755859375,1.3312309980392456,-57.698951721191406,89.87249755859375,1.3312309980392456,-57.698951721191406,89.87249755859375,1.3312309980392456,-55.54539108276367,-91.20350646972656,-2.1533758640289307,-55.54539108276367,-91.20350646972656,-2.1533758640289307,-55.54539108276367,-91.20350646972656,-2.1533758640289307,-55.54539108276367,-91.20350646972656,-2.1533758640289307,-55.54539108276367,-91.20350646972656,-2.1533758640289307,-55.545372009277344,91.2035140991211,2.1537914276123047,-55.545372009277344,91.2035140991211,2.1537914276123047,-55.545372009277344,91.2035140991211,2.1537914276123047,-55.545372009277344,91.2035140991211,2.1537914276123047,-55.545372009277344,91.2035140991211,2.1537914276123047,-55.545372009277344,91.2035140991211,2.1537914276123047,-55.545372009277344,91.2035140991211,2.1537914276123047,-55.9420051574707,58.09578323364258,56.764991760253906,-55.9420051574707,58.09578323364258,56.764991760253906,-55.9420051574707,58.09578323364258,56.764991760253906,-55.9420051574707,58.09578323364258,56.764991760253906,1.3308836221694946,-91.84559631347656,-35.90335464477539,1.3308836221694946,-91.84559631347656,-35.90335464477539,1.3308836221694946,-91.84559631347656,-35.90335464477539,1.3308836221694946,-91.84559631347656,-35.90335464477539,1.3308836221694946,-91.84559631347656,-35.90335464477539,-91.20330047607422,-2.153582811355591,55.54571533203125,-91.20330047607422,-2.153582811355591,55.54571533203125,-91.20330047607422,-2.153582811355591,55.54571533203125,-91.20330047607422,-2.153582811355591,55.54571533203125,-91.20330047607422,-2.153582811355591,55.54571533203125,-91.20330047607422,2.1535825729370117,55.54571533203125,-91.20330047607422,2.1535825729370117,55.54571533203125,-91.20330047607422,2.1535825729370117,55.54571533203125,-91.20330047607422,2.1535825729370117,55.54571533203125,-91.20330047607422,2.1535825729370117,55.54571533203125,-91.20330047607422,2.1535825729370117,55.54571533203125,-91.8456039428711,35.903350830078125,-1.3306739330291748,-91.8456039428711,35.903350830078125,-1.3306739330291748,-91.8456039428711,35.903350830078125,-1.3306739330291748,-91.8456039428711,35.903350830078125,-1.3306739330291748,-91.8456039428711,35.903350830078125,-1.3306739330291748,33.750057220458984,-3.255321701089997e-7,92.66802978515625,33.750057220458984,-3.255321701089997e-7,92.66802978515625,33.750057220458984,-3.255321701089997e-7,92.66802978515625,33.750057220458984,-3.255321701089997e-7,92.66802978515625,89.87269592285156,-1.3310151100158691,57.698638916015625,89.87269592285156,-1.3310151100158691,57.698638916015625,89.87269592285156,-1.3310151100158691,57.698638916015625,89.87269592285156,-1.3310151100158691,57.698638916015625,89.87269592285156,-1.3310151100158691,57.698638916015625,91.2037124633789,2.153581380844116,55.545047760009766,91.2037124633789,2.153581380844116,55.545047760009766,91.2037124633789,2.153581380844116,55.545047760009766,91.2037124633789,2.153581380844116,55.545047760009766,91.2037124633789,2.153581380844116,55.545047760009766,91.2037124633789,2.153581380844116,55.545047760009766,-35.903011322021484,1.3310145139694214,91.84571075439453,-35.903011322021484,1.3310145139694214,91.84571075439453,-35.903011322021484,1.3310145139694214,91.84571075439453,-35.903011322021484,1.3310145139694214,91.84571075439453,-35.903011322021484,1.3310145139694214,91.84571075439453,-35.903011322021484,-1.33101487159729,91.84571075439453,-35.903011322021484,-1.33101487159729,91.84571075439453,-35.903011322021484,-1.33101487159729,91.84571075439453,-35.903011322021484,-1.33101487159729,91.84571075439453,-35.903011322021484,-1.33101487159729,91.84571075439453,-33.74938201904297,-5.100424687043414e-7,92.66827392578125,-33.74938201904297,-5.100424687043414e-7,92.66827392578125,-33.74938201904297,-5.100424687043414e-7,92.66827392578125,-33.74938201904297,-5.100424687043414e-7,92.66827392578125,1.0764577388763428,55.84297561645508,-91.01956939697266,1.0764577388763428,55.84297561645508,-91.01956939697266,1.0764577388763428,55.84297561645508,-91.01956939697266,1.0764577388763428,55.84297561645508,-91.01956939697266,1.0764577388763428,55.84297561645508,-91.01956939697266,1.0764577388763428,55.84297561645508,-91.01956939697266,1.0764577388763428,55.84297561645508,-91.01956939697266,-0.00033518741838634014,55.17742919921875,-91.43085479736328,-0.00033518741838634014,55.17742919921875,-91.43085479736328,-0.00033518741838634014,55.17742919921875,-91.43085479736328,-0.00033518741838634014,55.17742919921875,-91.43085479736328,-0.00033518741838634014,55.17742919921875,-91.43085479736328,-0.00033518741838634014,55.17742919921875,-91.43085479736328,54.21428298950195,-92.02606964111328,-0.00019521401554811746,54.21428298950195,-92.02606964111328,-0.00019521401554811746,54.21428298950195,-92.02606964111328,-0.00019521401554811746,54.21428298950195,-92.02606964111328,-0.00019521401554811746,54.21428298950195,-92.02606964111328,-0.00019521401554811746,54.21428298950195,-92.02606964111328,-0.00019521401554811746,55.545372009277344,-91.20350646972656,-2.153782844543457,55.545372009277344,-91.20350646972656,-2.153782844543457,55.545372009277344,-91.20350646972656,-2.153782844543457,55.545372009277344,-91.20350646972656,-2.153782844543457,55.545372009277344,-91.20350646972656,-2.153782844543457,91.8455810546875,-35.903350830078125,-1.331348180770874,91.8455810546875,-35.903350830078125,-1.331348180770874,91.8455810546875,-35.903350830078125,-1.331348180770874,91.8455810546875,-35.903350830078125,-1.331348180770874,91.8455810546875,-35.903350830078125,-1.331348180770874,91.8455810546875,-35.903350830078125,-1.331348180770874,-54.21428298950195,92.02607727050781,0.00020320962357800454,-54.21428298950195,92.02607727050781,0.00020320962357800454,-54.21428298950195,92.02607727050781,0.00020320962357800454,-54.21428298950195,92.02607727050781,0.00020320962357800454,-54.21428298950195,92.02607727050781,0.00020320962357800454,-54.21428298950195,92.02607727050781,0.00020320962357800454,55.9420051574707,58.09579086303711,-56.76498031616211,55.9420051574707,58.09579086303711,-56.76498031616211,55.9420051574707,58.09579086303711,-56.76498031616211,55.9420051574707,58.09579086303711,-56.76498031616211,55.9420051574707,58.09579086303711,-56.76498031616211,57.69895935058594,89.87249755859375,1.3308056592941284,57.69895935058594,89.87249755859375,1.3308056592941284,57.69895935058594,89.87249755859375,1.3308056592941284,57.69895935058594,89.87249755859375,1.3308056592941284,57.69895935058594,89.87249755859375,1.3308056592941284,57.69895935058594,89.87249755859375,1.3308056592941284,57.69895935058594,89.87249755859375,1.3308056592941284,-1.330683946609497,57.698951721191406,89.87248229980469,-1.330683946609497,57.698951721191406,89.87248229980469,-1.330683946609497,57.698951721191406,89.87248229980469,-1.330683946609497,57.698951721191406,89.87248229980469,-1.330683946609497,57.698951721191406,89.87248229980469,1.3313459157943726,57.698951721191406,89.87246704101562,1.3313459157943726,57.698951721191406,89.87246704101562,1.3313459157943726,57.698951721191406,89.87246704101562,1.3313459157943726,57.698951721191406,89.87246704101562,1.3313459157943726,57.698951721191406,89.87246704101562,1.3313459157943726,57.698951721191406,89.87246704101562,-33.75006103515625,-3.2792155479910434e-7,-92.66804504394531,-33.75006103515625,-3.2792155479910434e-7,-92.66804504394531,-33.75006103515625,-3.2792155479910434e-7,-92.66804504394531,-33.75006103515625,-3.2792155479910434e-7,-92.66804504394531,1.3306846618652344,-57.69895935058594,-89.87250518798828,1.3306846618652344,-57.69895935058594,-89.87250518798828,1.3306846618652344,-57.69895935058594,-89.87250518798828,1.3306846618652344,-57.69895935058594,-89.87250518798828,1.3306846618652344,-57.69895935058594,-89.87250518798828,35.903011322021484,-1.33101487159729,-91.8457260131836,35.903011322021484,-1.33101487159729,-91.8457260131836,35.903011322021484,-1.33101487159729,-91.8457260131836,35.903011322021484,-1.33101487159729,-91.8457260131836,35.903011322021484,-1.33101487159729,-91.8457260131836,1.331345796585083,-57.6989631652832,89.87246704101562,1.331345796585083,-57.6989631652832,89.87246704101562,1.331345796585083,-57.6989631652832,89.87246704101562,1.331345796585083,-57.6989631652832,89.87246704101562,1.331345796585083,-57.6989631652832,89.87246704101562,1.331345796585083,-57.6989631652832,89.87246704101562,-58.09558868408203,-56.76478576660156,55.94243240356445,-58.09558868408203,-56.76478576660156,55.94243240356445,-58.09558868408203,-56.76478576660156,55.94243240356445,-58.09558868408203,-56.76478576660156,55.94243240356445,-55.9420051574707,-58.09579849243164,56.764991760253906,-55.9420051574707,-58.09579849243164,56.764991760253906,-55.9420051574707,-58.09579849243164,56.764991760253906,-55.9420051574707,-58.09579849243164,56.764991760253906,-55.9420051574707,-58.09579849243164,56.764991760253906,-89.87269592285156,1.3310145139694214,-57.69862365722656,-89.87269592285156,1.3310145139694214,-57.69862365722656,-89.87269592285156,1.3310145139694214,-57.69862365722656,-89.87269592285156,1.3310145139694214,-57.69862365722656,-89.87269592285156,1.3310145139694214,-57.69862365722656,-89.87269592285156,1.3310145139694214,-57.69862365722656,55.942420959472656,58.09578323364258,56.764583587646484,55.942420959472656,58.09578323364258,56.764583587646484,55.942420959472656,58.09578323364258,56.764583587646484,55.942420959472656,58.09578323364258,56.764583587646484,55.942420959472656,58.09578323364258,56.764583587646484,-0.00012307056749705225,-92.66816711425781,-33.749717712402344,-0.00012307056749705225,-92.66816711425781,-33.749717712402344,-0.00012307056749705225,-92.66816711425781,-33.749717712402344,-0.00012307056749705225,-92.66816711425781,-33.749717712402344,-1.3311455249786377,-91.84559631347656,-35.90334701538086,-1.3311455249786377,-91.84559631347656,-35.90334701538086,-1.3311455249786377,-91.84559631347656,-35.90334701538086,-1.3311455249786377,-91.84559631347656,-35.90334701538086,-1.3311455249786377,-91.84559631347656,-35.90334701538086,-1.3311455249786377,-91.84559631347656,-35.90334701538086,58.09599685668945,-56.76478576660156,55.94200897216797,58.09599685668945,-56.76478576660156,55.94200897216797,58.09599685668945,-56.76478576660156,55.94200897216797,58.09599685668945,-56.76478576660156,55.94200897216797,55.54539108276367,91.2035140991211,2.15338134765625,55.54539108276367,91.2035140991211,2.15338134765625,55.54539108276367,91.2035140991211,2.15338134765625,55.54539108276367,91.2035140991211,2.15338134765625,55.54539108276367,91.2035140991211,2.15338134765625,2.153247594833374,-55.545379638671875,-91.20352172851562,2.153247594833374,-55.545379638671875,-91.20352172851562,2.153247594833374,-55.545379638671875,-91.20352172851562,2.153247594833374,-55.545379638671875,-91.20352172851562,2.153247594833374,-55.545379638671875,-91.20352172851562,2.153247594833374,-55.545379638671875,-91.20352172851562,2.153247594833374,-55.545379638671875,-91.20352172851562,-0.0003373770450707525,-54.21428298950195,-92.02607727050781,-0.0003373770450707525,-54.21428298950195,-92.02607727050781,-0.0003373770450707525,-54.21428298950195,-92.02607727050781,-0.0003373770450707525,-54.21428298950195,-92.02607727050781,-0.0003373770450707525,-54.21428298950195,-92.02607727050781,-0.0003373770450707525,-54.21428298950195,-92.02607727050781,1.3311474323272705,91.84559631347656,35.90334701538086,1.3311474323272705,91.84559631347656,35.90334701538086,1.3311474323272705,91.84559631347656,35.90334701538086,1.3311474323272705,91.84559631347656,35.90334701538086,1.3311474323272705,91.84559631347656,35.90334701538086,54.21428298950195,92.02607727050781,-0.00019560271175578237,54.21428298950195,92.02607727050781,-0.00019560271175578237,54.21428298950195,92.02607727050781,-0.00019560271175578237,54.21428298950195,92.02607727050781,-0.00019560271175578237,54.21428298950195,92.02607727050781,-0.00019560271175578237,54.21428298950195,92.02607727050781,-0.00019560271175578237,-56.76456832885742,55.94220733642578,58.096012115478516,-56.76456832885742,55.94220733642578,58.096012115478516,-56.76456832885742,55.94220733642578,58.096012115478516,-56.76456832885742,55.94220733642578,58.096012115478516,-56.76456832885742,55.94220733642578,58.096012115478516,-56.76456832885742,55.94220733642578,58.096012115478516,-1.3308817148208618,91.84559631347656,35.90335464477539,-1.3308817148208618,91.84559631347656,35.90335464477539,-1.3308817148208618,91.84559631347656,35.90335464477539,-1.3308817148208618,91.84559631347656,35.90335464477539,-1.3308817148208618,91.84559631347656,35.90335464477539,-1.3308817148208618,91.84559631347656,35.90335464477539,-92.66816711425781,33.749717712402344,0.0003441836452111602,-92.66816711425781,33.749717712402344,0.0003441836452111602,-92.66816711425781,33.749717712402344,0.0003441836452111602,-92.66816711425781,33.749717712402344,0.0003441836452111602,-92.02587127685547,-3.414504305965238e-7,54.21462631225586,-92.02587127685547,-3.414504305965238e-7,54.21462631225586,-92.02587127685547,-3.414504305965238e-7,54.21462631225586,-92.02587127685547,-3.414504305965238e-7,54.21462631225586,-92.02587127685547,-3.414504305965238e-7,54.21462631225586,-92.02587127685547,-3.414504305965238e-7,54.21462631225586,-92.02587127685547,-3.414504305965238e-7,54.21462631225586,-89.87227630615234,-1.3310153484344482,57.69929885864258,-89.87227630615234,-1.3310153484344482,57.69929885864258,-89.87227630615234,-1.3310153484344482,57.69929885864258,-89.87227630615234,-1.3310153484344482,57.69929885864258,-89.87227630615234,-1.3310153484344482,57.69929885864258,-89.87227630615234,-1.3310153484344482,57.69929885864258,-56.76499557495117,-55.94221496582031,-58.095577239990234,-56.76499557495117,-55.94221496582031,-58.095577239990234,-56.76499557495117,-55.94221496582031,-58.095577239990234,-56.76499557495117,-55.94221496582031,-58.095577239990234,-89.87269592285156,-1.3310151100158691,-57.69862365722656,-89.87269592285156,-1.3310151100158691,-57.69862365722656,-89.87269592285156,-1.3310151100158691,-57.69862365722656,-89.87269592285156,-1.3310151100158691,-57.69862365722656,-89.87269592285156,-1.3310151100158691,-57.69862365722656,-91.2037124633789,2.1535816192626953,-55.54503631591797,-91.2037124633789,2.1535816192626953,-55.54503631591797,-91.2037124633789,2.1535816192626953,-55.54503631591797,-91.2037124633789,2.1535816192626953,-55.54503631591797,-91.2037124633789,2.1535816192626953,-55.54503631591797,-91.2037124633789,2.1535816192626953,-55.54503631591797,-57.6989631652832,-89.87248229980469,-1.3307993412017822,-57.6989631652832,-89.87248229980469,-1.3307993412017822,-57.6989631652832,-89.87248229980469,-1.3307993412017822,-57.6989631652832,-89.87248229980469,-1.3307993412017822,-57.6989631652832,-89.87248229980469,-1.3307993412017822,-57.6989631652832,-89.87248229980469,-1.3307993412017822,-57.69895553588867,-89.87248229980469,1.331230640411377,-57.69895553588867,-89.87248229980469,1.331230640411377,-57.69895553588867,-89.87248229980469,1.331230640411377,-57.69895553588867,-89.87248229980469,1.331230640411377,-57.69895553588867,-89.87248229980469,1.331230640411377,-57.69895553588867,-89.87248229980469,1.331230640411377,-57.69895553588867,-89.87248229980469,1.331230640411377,91.2037124633789,-2.1535840034484863,55.545047760009766,91.2037124633789,-2.1535840034484863,55.545047760009766,91.2037124633789,-2.1535840034484863,55.545047760009766,91.2037124633789,-2.1535840034484863,55.545047760009766,91.2037124633789,-2.1535840034484863,55.545047760009766,91.84559631347656,-35.903350830078125,1.3306814432144165,91.84559631347656,-35.903350830078125,1.3306814432144165,91.84559631347656,-35.903350830078125,1.3306814432144165,91.84559631347656,-35.903350830078125,1.3306814432144165,91.84559631347656,-35.903350830078125,1.3306814432144165,0.00033884088043123484,-54.21428298950195,92.02606964111328,0.00033884088043123484,-54.21428298950195,92.02606964111328,0.00033884088043123484,-54.21428298950195,92.02606964111328,0.00033884088043123484,-54.21428298950195,92.02606964111328,0.00033884088043123484,-54.21428298950195,92.02606964111328,0.00033884088043123484,-54.21428298950195,92.02606964111328,1.3311470746994019,-91.84559631347656,35.90334701538086,1.3311470746994019,-91.84559631347656,35.90334701538086,1.3311470746994019,-91.84559631347656,35.90334701538086,1.3311470746994019,-91.84559631347656,35.90334701538086,1.3311470746994019,-91.84559631347656,35.90334701538086,91.8456039428711,35.903350830078125,1.330681324005127,91.8456039428711,35.903350830078125,1.330681324005127,91.8456039428711,35.903350830078125,1.330681324005127,91.8456039428711,35.903350830078125,1.330681324005127,91.8456039428711,35.903350830078125,1.330681324005127,57.698951721191406,89.87249755859375,-1.3312232494354248,57.698951721191406,89.87249755859375,-1.3312232494354248,57.698951721191406,89.87249755859375,-1.3312232494354248,57.698951721191406,89.87249755859375,-1.3312232494354248,35.903690338134766,-1.331014633178711,91.84544372558594,35.903690338134766,-1.331014633178711,91.84544372558594,35.903690338134766,-1.331014633178711,91.84544372558594,35.903690338134766,-1.331014633178711,91.84544372558594,35.903690338134766,-1.331014633178711,91.84544372558594,35.903690338134766,-1.331014633178711,91.84544372558594,-56.76456832885742,-55.94221496582031,58.096012115478516,-56.76456832885742,-55.94221496582031,58.096012115478516,-56.76456832885742,-55.94221496582031,58.096012115478516,-56.76456832885742,-55.94221496582031,58.096012115478516,-56.76456832885742,-55.94221496582031,58.096012115478516,-56.76456832885742,-55.94221496582031,58.096012115478516,-2.1532464027404785,-55.545379638671875,91.20350646972656,-2.1532464027404785,-55.545379638671875,91.20350646972656,-2.1532464027404785,-55.545379638671875,91.20350646972656,-2.1532464027404785,-55.545379638671875,91.20350646972656,-2.1532464027404785,-55.545379638671875,91.20350646972656,0.00012470953515730798,-92.66816711425781,33.74972152709961,0.00012470953515730798,-92.66816711425781,33.74972152709961,0.00012470953515730798,-92.66816711425781,33.74972152709961,0.00012470953515730798,-92.66816711425781,33.74972152709961,-1.33088219165802,-91.84559631347656,35.90335464477539,-1.33088219165802,-91.84559631347656,35.90335464477539,-1.33088219165802,-91.84559631347656,35.90335464477539,-1.33088219165802,-91.84559631347656,35.90335464477539,-1.33088219165802,-91.84559631347656,35.90335464477539,-1.33088219165802,-91.84559631347656,35.90335464477539,-55.545372009277344,-91.20350646972656,2.153789758682251,-55.545372009277344,-91.20350646972656,2.153789758682251,-55.545372009277344,-91.20350646972656,2.153789758682251,-55.545372009277344,-91.20350646972656,2.153789758682251,56.76456832885742,-55.94221878051758,-58.09599304199219,56.76456832885742,-55.94221878051758,-58.09599304199219,56.76456832885742,-55.94221878051758,-58.09599304199219,56.76456832885742,-55.94221878051758,-58.09599304199219,92.66815185546875,-33.749717712402344,-0.0003363910655025393,92.66815185546875,-33.749717712402344,-0.0003363910655025393,92.66815185546875,-33.749717712402344,-0.0003363910655025393,92.66815185546875,-33.749717712402344,-0.0003363910655025393,91.20330047607422,-2.1535825729370117,-55.54570388793945,91.20330047607422,-2.1535825729370117,-55.54570388793945,91.20330047607422,-2.1535825729370117,-55.54570388793945,91.20330047607422,-2.1535825729370117,-55.54570388793945,91.20330047607422,-2.1535825729370117,-55.54570388793945,92.02587127685547,-3.892050415288395e-7,-54.2146110534668,92.02587127685547,-3.892050415288395e-7,-54.2146110534668,92.02587127685547,-3.892050415288395e-7,-54.2146110534668,92.02587127685547,-3.892050415288395e-7,-54.2146110534668,92.02587127685547,-3.892050415288395e-7,-54.2146110534668,92.02587127685547,-3.892050415288395e-7,-54.2146110534668,92.02587127685547,-3.892050415288395e-7,-54.2146110534668,0.0003386797325219959,54.21427536010742,92.02606964111328,0.0003386797325219959,54.21427536010742,92.02606964111328,0.0003386797325219959,54.21427536010742,92.02606964111328,0.0003386797325219959,54.21427536010742,92.02606964111328,0.0003386797325219959,54.21427536010742,92.02606964111328,0.0003386797325219959,54.21427536010742,92.02606964111328,2.1539180278778076,55.54536819458008,91.2034912109375,2.1539180278778076,55.54536819458008,91.2034912109375,2.1539180278778076,55.54536819458008,91.2034912109375,2.1539180278778076,55.54536819458008,91.2034912109375,91.20330047607422,2.153582811355591,-55.54570388793945,91.20330047607422,2.153582811355591,-55.54570388793945,91.20330047607422,2.153582811355591,-55.54570388793945,91.20330047607422,2.153582811355591,-55.54570388793945,91.20330047607422,2.153582811355591,-55.54570388793945,89.87227630615234,1.3310145139694214,-57.69927978515625,89.87227630615234,1.3310145139694214,-57.69927978515625,89.87227630615234,1.3310145139694214,-57.69927978515625,89.87227630615234,1.3310145139694214,-57.69927978515625,89.87227630615234,1.3310145139694214,-57.69927978515625,89.87227630615234,1.3310145139694214,-57.69927978515625,56.76456832885742,55.94220733642578,-58.09599304199219,56.76456832885742,55.94220733642578,-58.09599304199219,56.76456832885742,55.94220733642578,-58.09599304199219,56.76456832885742,55.94220733642578,-58.09599304199219,56.76456832885742,55.94220733642578,-58.09599304199219,58.09558868408203,56.76477813720703,-55.942420959472656,58.09558868408203,56.76477813720703,-55.942420959472656,58.09558868408203,56.76477813720703,-55.942420959472656,58.09558868408203,56.76477813720703,-55.942420959472656,55.54539108276367,-91.20350646972656,2.153383255004883,55.54539108276367,-91.20350646972656,2.153383255004883,55.54539108276367,-91.20350646972656,2.153383255004883,55.54539108276367,-91.20350646972656,2.153383255004883,55.54539108276367,-91.20350646972656,2.153383255004883,55.54539108276367,-91.20350646972656,2.153383255004883,91.84558868408203,35.903350830078125,-1.3313480615615845,91.84558868408203,35.903350830078125,-1.3313480615615845,91.84558868408203,35.903350830078125,-1.3313480615615845,91.84558868408203,35.903350830078125,-1.3313480615615845,91.84558868408203,35.903350830078125,-1.3313480615615845,91.84558868408203,35.903350830078125,-1.3313480615615845,-35.903690338134766,-1.331014633178711,-91.84546661376953,-35.903690338134766,-1.331014633178711,-91.84546661376953,-35.903690338134766,-1.331014633178711,-91.84546661376953,-35.903690338134766,-1.331014633178711,-91.84546661376953,-35.903690338134766,-1.331014633178711,-91.84546661376953,-35.903690338134766,-1.331014633178711,-91.84546661376953,-54.21428298950195,-92.02606964111328,0.00020284479251131415,-54.21428298950195,-92.02606964111328,0.00020284479251131415,-54.21428298950195,-92.02606964111328,0.00020284479251131415,-54.21428298950195,-92.02606964111328,0.00020284479251131415,-54.21428298950195,-92.02606964111328,0.00020284479251131415,-54.21428298950195,-92.02606964111328,0.00020284479251131415,-54.21428298950195,-92.02606964111328,0.00020284479251131415,-35.903690338134766,1.331014633178711,-91.84546661376953,-35.903690338134766,1.331014633178711,-91.84546661376953,-35.903690338134766,1.331014633178711,-91.84546661376953,-35.903690338134766,1.331014633178711,-91.84546661376953,-35.903690338134766,1.331014633178711,-91.84546661376953,89.87227630615234,-1.3310154676437378,-57.69927978515625,89.87227630615234,-1.3310154676437378,-57.69927978515625,89.87227630615234,-1.3310154676437378,-57.69927978515625,89.87227630615234,-1.3310154676437378,-57.69927978515625,89.87227630615234,-1.3310154676437378,-57.69927978515625,89.87227630615234,-1.3310154676437378,-57.69927978515625,55.942420959472656,-58.09579849243164,56.764583587646484,55.942420959472656,-58.09579849243164,56.764583587646484,55.942420959472656,-58.09579849243164,56.764583587646484,55.942420959472656,-58.09579849243164,56.764583587646484,55.942420959472656,-58.09579849243164,56.764583587646484,56.76499557495117,-55.94221496582031,58.0955924987793,56.76499557495117,-55.94221496582031,58.0955924987793,56.76499557495117,-55.94221496582031,58.0955924987793,56.76499557495117,-55.94221496582031,58.0955924987793,56.76499557495117,-55.94221496582031,58.0955924987793,2.1539194583892822,-55.545379638671875,91.2034912109375,2.1539194583892822,-55.545379638671875,91.2034912109375,2.1539194583892822,-55.545379638671875,91.2034912109375,2.1539194583892822,-55.545379638671875,91.2034912109375,2.1539194583892822,-55.545379638671875,91.2034912109375,2.1539194583892822,-55.545379638671875,91.2034912109375,-55.942420959472656,-58.09579849243164,-56.76457214355469,-55.942420959472656,-58.09579849243164,-56.76457214355469,-55.942420959472656,-58.09579849243164,-56.76457214355469,-55.942420959472656,-58.09579849243164,-56.76457214355469,-55.942420959472656,-58.09579849243164,-56.76457214355469,-55.942420959472656,-58.09579849243164,-56.76457214355469,-58.09599685668945,-56.76478576660156,-55.941993713378906,-58.09599685668945,-56.76478576660156,-55.941993713378906,-58.09599685668945,-56.76478576660156,-55.941993713378906,-58.09599685668945,-56.76478576660156,-55.941993713378906,92.0262680053711,-4.4363298457028577e-7,54.21394729614258,92.0262680053711,-4.4363298457028577e-7,54.21394729614258,92.0262680053711,-4.4363298457028577e-7,54.21394729614258,92.0262680053711,-4.4363298457028577e-7,54.21394729614258,92.0262680053711,-4.4363298457028577e-7,54.21394729614258,92.0262680053711,-4.4363298457028577e-7,54.21394729614258,55.9420051574707,-58.095802307128906,-56.76498031616211,55.9420051574707,-58.095802307128906,-56.76498031616211,55.9420051574707,-58.095802307128906,-56.76498031616211,55.9420051574707,-58.095802307128906,-56.76498031616211,55.9420051574707,-58.095802307128906,-56.76498031616211,55.9420051574707,-58.095802307128906,-56.76498031616211,58.09558868408203,-56.76478576660156,-55.942420959472656,58.09558868408203,-56.76478576660156,-55.942420959472656,58.09558868408203,-56.76478576660156,-55.942420959472656,58.09558868408203,-56.76478576660156,-55.942420959472656,58.09558868408203,-56.76478576660156,-55.942420959472656,89.87269592285156,1.3310145139694214,57.698638916015625,89.87269592285156,1.3310145139694214,57.698638916015625,89.87269592285156,1.3310145139694214,57.698638916015625,89.87269592285156,1.3310145139694214,57.698638916015625,89.87269592285156,1.3310145139694214,57.698638916015625,89.87269592285156,1.3310145139694214,57.698638916015625,57.6989631652832,-89.87248229980469,1.330806851387024,57.6989631652832,-89.87248229980469,1.330806851387024,57.6989631652832,-89.87248229980469,1.330806851387024,57.6989631652832,-89.87248229980469,1.330806851387024,57.6989631652832,-89.87248229980469,1.330806851387024,57.6989631652832,-89.87248229980469,1.330806851387024,57.69895553588867,-89.87248229980469,-1.3312231302261353,57.69895553588867,-89.87248229980469,-1.3312231302261353,57.69895553588867,-89.87248229980469,-1.3312231302261353,57.69895553588867,-89.87248229980469,-1.3312231302261353,57.69895553588867,-89.87248229980469,-1.3312231302261353,57.69895553588867,-89.87248229980469,-1.3312231302261353,-1.331344485282898,-57.69895935058594,-89.87249755859375,-1.331344485282898,-57.69895935058594,-89.87249755859375,-1.331344485282898,-57.69895935058594,-89.87249755859375,-1.331344485282898,-57.69895935058594,-89.87249755859375,-1.331344485282898,-57.69895935058594,-89.87249755859375,-92.0262680053711,-3.9587837363797007e-7,-54.21393585205078,-92.0262680053711,-3.9587837363797007e-7,-54.21393585205078,-92.0262680053711,-3.9587837363797007e-7,-54.21393585205078,-92.0262680053711,-3.9587837363797007e-7,-54.21393585205078,-92.0262680053711,-3.9587837363797007e-7,-54.21393585205078,-92.0262680053711,-3.9587837363797007e-7,-54.21393585205078,-58.09599685668945,56.76477813720703,-55.941993713378906,-58.09599685668945,56.76477813720703,-55.941993713378906,-58.09599685668945,56.76477813720703,-55.941993713378906,-58.09599685668945,56.76477813720703,-55.941993713378906,-58.09599685668945,56.76477813720703,-55.941993713378906,-57.69895935058594,89.87249755859375,-1.3307981491088867,-57.69895935058594,89.87249755859375,-1.3307981491088867,-57.69895935058594,89.87249755859375,-1.3307981491088867,-57.69895935058594,89.87249755859375,-1.3307981491088867,-57.69895935058594,89.87249755859375,-1.3307981491088867,-57.69895935058594,89.87249755859375,-1.3307981491088867,-57.69895935058594,89.87249755859375,-1.3307981491088867,-1.0771249532699585,55.84297561645508,-91.01956939697266,-1.0771249532699585,55.84297561645508,-91.01956939697266,-1.0771249532699585,55.84297561645508,-91.01956939697266,-1.0771249532699585,55.84297561645508,-91.01956939697266,-1.0771249532699585,55.84297561645508,-91.01956939697266,-1.0771249532699585,55.84297561645508,-91.01956939697266,0.6651760339736938,56.91976547241211,-90.35406494140625,0.6651760339736938,56.91976547241211,-90.35406494140625,0.6651760339736938,56.91976547241211,-90.35406494140625,0.6651760339736938,56.91976547241211,-90.35406494140625,0.6651760339736938,56.91976547241211,-90.35406494140625,-0.6658390760421753,56.91976547241211,-90.35406494140625,-0.6658390760421753,56.91976547241211,-90.35406494140625,-0.6658390760421753,56.91976547241211,-90.35406494140625,-0.6658390760421753,56.91976547241211,-90.35406494140625,-0.6658390760421753,56.91976547241211,-90.35406494140625,-1.3311461210250854,91.84559631347656,-35.90334701538086,-1.3311461210250854,91.84559631347656,-35.90334701538086,-1.3311461210250854,91.84559631347656,-35.90334701538086,-1.3311461210250854,91.84559631347656,-35.90334701538086,-1.3311461210250854,91.84559631347656,-35.90334701538086,-1.3311461210250854,91.84559631347656,-35.90334701538086,-0.00012322973634582013,92.66816711425781,-33.749717712402344,-0.00012322973634582013,92.66816711425781,-33.749717712402344,-0.00012322973634582013,92.66816711425781,-33.749717712402344,-0.00012322973634582013,92.66816711425781,-33.749717712402344,-89.87227630615234,1.3310145139694214,57.69929885864258,-89.87227630615234,1.3310145139694214,57.69929885864258,-89.87227630615234,1.3310145139694214,57.69929885864258,-89.87227630615234,1.3310145139694214,57.69929885864258,-2.153247833251953,55.54536819458008,91.20350646972656,-2.153247833251953,55.54536819458008,91.20350646972656,-2.153247833251953,55.54536819458008,91.20350646972656,-2.153247833251953,55.54536819458008,91.20350646972656],\n \"normalized\": false\n },\n \"normal\": {\n \"itemSize\": 3,\n \"type\": \"Float32Array\",\n \"array\": [-0.32300448417663574,0.7980563640594482,-0.5086984634399414,-0.3229999840259552,0.7980471849441528,-0.5087158679962158,-0.32299789786338806,0.7980540990829468,-0.5087060928344727,-0.3229975402355194,0.7980594038963318,-0.5086981654167175,-0.322995662689209,0.7980546951293945,-0.5087066292762756,-0.32297030091285706,0.7980630397796631,-0.5087097883224487,-0.3145313560962677,0.8124136924743652,-0.4909725487232208,-0.3145303428173065,0.8124191761016846,-0.4909641742706299,-0.31452667713165283,0.8123946189880371,-0.49100714921951294,-0.31452617049217224,0.8124018907546997,-0.49099525809288025,-0.31451353430747986,0.8124081492424011,-0.49099329113960266,0.7977177500724792,0.5067335963249207,0.3269055485725403,0.797724187374115,0.5067331790924072,0.3268907070159912,0.7977266907691956,0.5067335367202759,0.32688409090042114,0.797727644443512,0.5067120790481567,0.3269153833389282,0.7977277636528015,0.5067290663719177,0.3268887996673584,-0.48681509494781494,-0.3170761168003082,-0.8139249086380005,-0.486814022064209,-0.31705862283706665,-0.8139324188232422,-0.4868130683898926,-0.31705430150032043,-0.8139346241950989,-0.486799031496048,-0.3170582056045532,-0.8139415383338928,-0.48679620027542114,-0.31705963611602783,-0.8139426112174988,-0.4867938756942749,-0.3170706033706665,-0.8139398097991943,0.4910266399383545,0.2948715388774872,-0.8197216391563416,0.4910283386707306,0.29487162828445435,-0.8197205662727356,0.4910544753074646,0.29487064480781555,-0.8197053670883179,0.49105706810951233,0.2948714792728424,-0.8197034597396851,0.49106070399284363,0.2948935925960541,-0.8196933269500732,0.49107053875923157,0.29487308859825134,-0.8196947574615479,0.019486773759126663,0.0034609902650117874,-0.9998041391372681,0.01950395107269287,0.003431154415011406,-0.9998038411140442,0.01951080560684204,0.0034348517656326294,-0.9998037219047546,0.019518375396728516,0.003450945019721985,-0.9998035430908203,0.4929899275302887,0.2909228503704071,0.8199541568756104,0.4929942488670349,0.29094332456588745,0.8199442028999329,0.49299705028533936,0.29093438386917114,0.8199459314346313,0.49300453066825867,0.29094645380973816,0.8199370503425598,0.49301400780677795,0.29092937707901,0.8199374079704285,0.506730854511261,0.3268951177597046,0.7977238893508911,0.5067356824874878,0.32688724994659424,0.797724187374115,0.5067362189292908,0.3268929123878479,0.7977213859558105,0.5067363381385803,0.3269083499908447,0.7977150082588196,0.5067551732063293,0.32688796520233154,0.7977114319801331,-0.30085650086402893,-0.8039307594299316,0.5130113363265991,-0.3008539080619812,-0.8039156794548035,0.5130366683006287,-0.3008496165275574,-0.8039196729660034,0.5130329728126526,-0.30084699392318726,-0.8039218187332153,0.5130308866500854,-0.3008323013782501,-0.8039500713348389,0.5129954814910889,-0.3008321523666382,-0.8039198517799377,0.5130428671836853,0.999752938747406,0.022229939699172974,-0.000027254223823547363,0.9997531175613403,0.02221774309873581,0.000002555549144744873,0.9997531175613403,0.022219747304916382,-0.000011578202247619629,0.9997537136077881,0.022191841155290604,-0.000005044043064117432,-0.000006690621376037598,0.9997531771659851,0.022219300270080566,0.0000015208497643470764,0.9997526407241821,0.02224019356071949,0.000007711350917816162,0.9997531771659851,0.022218987345695496,0.000025779008865356445,0.9997528791427612,0.022229254245758057,-0.8199474215507507,-0.4929923415184021,0.29093796014785767,-0.8199467658996582,-0.49298861622810364,0.29094576835632324,-0.8199445605278015,-0.4929924011230469,0.2909456789493561,-0.8199410438537598,-0.4930053651332855,0.2909337878227234,-0.8199405670166016,-0.4929971694946289,0.29094862937927246,-0.8199316263198853,-0.4930025041103363,0.2909652292728424,-0.503142237663269,0.32643717527389526,-0.800179123878479,-0.503139078617096,0.3264300227165222,-0.8001841306686401,-0.5031341314315796,0.3264409899711609,-0.8001827001571655,-0.5031154155731201,0.32642847299575806,-0.800199568271637,-0.9997532367706299,-0.02221621572971344,-0.0000050961971282958984,-0.9997530579566956,-0.02221750095486641,0.000010980293154716492,-0.9997529983520508,-0.022224798798561096,-0.0000216066837310791,-0.9997526407241821,-0.022240420803427696,0.000005041249096393585,-0.8199519515037537,-0.4929916560649872,-0.29092633724212646,-0.8199494481086731,-0.4929870665073395,-0.29094117879867554,-0.8199440240859985,-0.4930054545402527,-0.29092511534690857,-0.8199396729469299,-0.4930015802383423,-0.29094383120536804,-0.8199336528778076,-0.4930025637149811,-0.29095908999443054,-0.8139479756355286,-0.48679518699645996,-0.3170475959777832,-0.8139445185661316,-0.4867909550666809,-0.31706294417381287,-0.8139359951019287,-0.4868128299713135,-0.3170514404773712,-0.8139359951019287,-0.4868128299713135,-0.3170514404773712,-0.8139272928237915,-0.4868120551109314,-0.3170749247074127,0.291377991437912,0.817572832107544,-0.4966624081134796,0.2913815379142761,0.817571222782135,-0.4966628849506378,0.29140985012054443,0.8175534605979919,-0.49667567014694214,0.29141905903816223,0.8175671696662903,-0.49664777517318726,0.2914317846298218,0.8175531625747681,-0.49666333198547363,0.3144916296005249,0.8124189376831055,-0.4909893870353699,0.314521849155426,0.812416136264801,-0.4909745156764984,0.31452593207359314,0.8124017119407654,-0.4909958243370056,0.31453219056129456,0.8123990893363953,-0.4909961223602295,0.31453219056129456,0.8123990893363953,-0.4909961223602295,0.31453603506088257,0.8124093413352966,-0.49097663164138794,-0.8199474215507507,0.4929920434951782,0.2909386157989502,-0.8199455142021179,0.4929906129837036,0.29094627499580383,-0.8199436664581299,0.492990642786026,0.29095107316970825,-0.8199414610862732,0.4929976165294647,0.2909456193447113,-0.8199408054351807,0.49300891160964966,0.290928453207016,-0.8199315071105957,0.4930025339126587,0.2909652292728424,-0.7977402210235596,0.5067192316055298,0.3268728256225586,-0.797728419303894,0.5067235827445984,0.3268952965736389,-0.7977269291877747,0.5067242383956909,0.32689791917800903,-0.7977257370948792,0.5067130923271179,0.3269180655479431,-0.7977219223976135,0.5067331790924072,0.32689642906188965,-0.8039276003837585,0.513014554977417,0.30085939168930054,-0.803920328617096,0.5130298733711243,0.30085256695747375,-0.8039193153381348,0.513033926486969,0.30084848403930664,-0.8039184808731079,0.5130314230918884,0.3008551299571991,-0.3170892596244812,-0.8139346837997437,-0.4867902398109436,-0.3170653283596039,-0.813935399055481,-0.48680463433265686,-0.3170589804649353,-0.8139439225196838,-0.4867946207523346,-0.3170560896396637,-0.8139365315437317,-0.486808717250824,-0.31703075766563416,-0.813947319984436,-0.4868071973323822,-0.3170735538005829,0.8139387965202332,0.4867936074733734,-0.31706538796424866,0.8139315843582153,0.48681098222732544,-0.3170650601387024,0.8139441609382629,0.4867902994155884,-0.31706249713897705,0.8139439225196838,0.4867921471595764,-0.3170546293258667,0.8139438629150391,0.4867975413799286,-0.31705403327941895,0.8139353394508362,0.4868120551109314,-0.31705284118652344,0.8139360547065735,0.4868115782737732,-0.32690656185150146,0.797716498374939,0.5067349672317505,-0.32688647508621216,0.7977249026298523,0.5067349076271057,-0.32688552141189575,0.7977311611175537,0.506725549697876,-0.3268853724002838,0.7977126240730286,0.5067547559738159,0.2909286618232727,-0.8199402689933777,-0.49300962686538696,0.290932297706604,-0.8199490904808044,-0.4929928183555603,0.290941059589386,-0.8199471831321716,-0.49299079179763794,0.2909466624259949,-0.8199383020401001,-0.49300238490104675,0.2909603714942932,-0.8199326395988464,-0.49300357699394226,-0.8139441013336182,-0.4867924749851227,0.31706178188323975,-0.8139419555664062,-0.4867969751358032,0.3170603811740875,-0.8139404058456421,-0.4868042469024658,0.31705325841903687,-0.8139353394508362,-0.48680993914604187,0.31705722212791443,-0.8139327764511108,-0.486809641122818,0.3170642554759979,-0.8139600157737732,0.48677366971969604,0.31704968214035034,-0.8139446973800659,0.4867933988571167,0.31705862283706665,-0.8139420747756958,0.48679694533348083,0.31706005334854126,-0.813937246799469,0.48679330945014954,0.3170780539512634,-0.8139326572418213,0.4868103265762329,0.3170636296272278,-0.8139210939407349,0.4868491590023041,0.31703364849090576,-0.8199512958526611,0.4929920434951782,-0.29092729091644287,-0.8199489712715149,0.4929892122745514,-0.2909389138221741,-0.8199403882026672,0.49300849437713623,-0.29093047976493835,-0.8199390172958374,0.4930011034011841,-0.2909468710422516,-0.8199335932731628,0.49300262331962585,-0.2909591794013977,0.022224154323339462,0.000008113682270050049,0.999752938747406,0.022224217653274536,-0.000007063150405883789,0.9997529983520508,0.02223508059978485,-0.00002683699131011963,0.9997528195381165,0.022243808954954147,0.0000014416873455047607,0.9997525811195374,0.5130226612091064,-0.30085763335227966,0.8039230704307556,0.5130249857902527,-0.30090412497520447,0.8039043545722961,0.5130347013473511,-0.3008493185043335,0.8039185404777527,0.5130426287651062,-0.30085936188697815,0.8039097785949707,0.5130426287651062,-0.30085936188697815,0.8039097785949707,0.8139259815216064,0.4868123233318329,0.31707778573036194,0.8139373064041138,0.4867918789386749,0.31708046793937683,0.8139375448226929,0.48680996894836426,0.3170512318611145,0.8139379024505615,0.4868050515651703,0.3170582354068756,0.8139469027519226,0.48679566383361816,0.3170495331287384,0.8139491677284241,0.48678889870643616,0.31705406308174133,-0.49300631880760193,0.29092955589294434,0.8199419379234314,-0.4929933547973633,0.29095086455345154,0.8199421167373657,-0.4929933547973633,0.29095086455345154,0.8199421167373657,-0.49299073219299316,0.2909349799156189,0.8199493885040283,-0.4929877817630768,0.290939062833786,0.8199498057365417,-0.49300646781921387,-0.29092955589294434,0.8199418783187866,-0.4929991066455841,-0.2909305989742279,0.8199458718299866,-0.4929991066455841,-0.2909305989742279,0.8199458718299866,-0.4929906129837036,-0.29093536734580994,0.8199493885040283,-0.49298787117004395,-0.2909401059150696,0.819949209690094,-0.022236576303839684,-0.0000014398247003555298,0.9997527003288269,-0.022226199507713318,0.000026732683181762695,0.9997529983520508,-0.022215761244297028,-0.000004159286618232727,0.9997531771659851,-0.022215470671653748,0.0000028014183044433594,0.9997532963752747,0.4860762059688568,0.31750911474227905,-0.8141976594924927,0.4860828220844269,0.3174929618835449,-0.8142000436782837,0.4860839545726776,0.31748220324516296,-0.8142036199569702,0.48609045147895813,0.31749191880226135,-0.8141958713531494,0.48609644174575806,0.31749197840690613,-0.8141922950744629,0.48610714077949524,0.3175130784511566,-0.8141777515411377,0.48611539602279663,0.31747305393218994,-0.8141883611679077,-0.0000346451997756958,0.016819089651107788,-0.9998586177825928,-0.00002047419548034668,0.016789883375167847,-0.999859094619751,-0.000013813376426696777,0.016806378960609436,-0.9998587369918823,-0.00000277138315141201,0.016810698434710503,-0.9998586773872375,0.0000065267086029052734,0.016805753111839294,-0.9998587965965271,0.000018220569472759962,0.016794271767139435,-0.9998589754104614,0.016185671091079712,-0.9998690485954285,-0.00003345310688018799,0.01620444655418396,-0.999868631362915,-0.0000010926742106676102,0.016207069158554077,-0.999868631362915,0.000011086463928222656,0.01620793342590332,-0.999868631362915,-0.000010415911674499512,0.016219258308410645,-0.9998684525489807,-2.980232238769531e-7,0.016219640150666237,-0.9998684525489807,-4.5890919864177704e-7,0.3170523941516876,-0.8139364719390869,-0.486811101436615,0.3170545697212219,-0.8139440417289734,-0.48679736256599426,0.31706172227859497,-0.8139370083808899,-0.48680418729782104,0.3170723617076874,-0.8139404058456421,-0.486791729927063,0.31707704067230225,-0.8139263391494751,-0.48681217432022095,0.8199406266212463,-0.4929971992969513,-0.29094862937927246,0.8199410438537598,-0.49300533533096313,-0.290933758020401,0.8199447989463806,-0.49299201369285583,-0.2909456193447113,0.8199467658996582,-0.4929884672164917,-0.290946364402771,0.819947361946106,-0.492992103099823,-0.2909383773803711,0.8199547529220581,-0.49298709630966187,-0.2909259796142578,-0.016219263896346092,0.9998684525489807,5.702022463083267e-7,-0.016217336058616638,0.9998685717582703,-4.023313522338867e-7,-0.016208097338676453,0.9998686909675598,-0.00001023709774017334,-0.016207024455070496,0.9998686909675598,0.000011369585990905762,-0.01620444655418396,0.9998686909675598,0.0000010926742106676102,-0.01616719365119934,0.9998693466186523,0.000033482909202575684,0.32295531034469604,0.7980619072914124,-0.5087209343910217,0.32295531034469604,0.7980619072914124,-0.5087209343910217,0.3229907155036926,0.798053503036499,-0.5087116956710815,0.3229965567588806,0.7980476021766663,-0.50871741771698,0.32300084829330444,0.7980570793151855,-0.5086997747421265,0.8039142489433289,0.5130448937416077,0.30084332823753357,0.8039181232452393,0.5130343437194824,0.3008510172367096,0.8039227724075317,0.5130297541618347,0.300846129655838,0.8039230108261108,0.5130389332771301,0.300830215215683,0.8039236664772034,0.5130265355110168,0.30084937810897827,0.8039326667785645,0.5130090117454529,0.3008555769920349,0.8039484024047852,0.512998104095459,0.3008320927619934,-0.30085283517837524,0.8039165735244751,0.5130358934402466,-0.300849586725235,0.8039194345474243,0.5130332708358765,-0.3008473813533783,0.803921639919281,0.5130310654640198,-0.3008348345756531,0.8039216995239258,0.5130383372306824,-0.3008311986923218,0.8039206862449646,0.5130419731140137,0.300837904214859,0.803917407989502,0.5130431056022644,0.30084890127182007,0.8039129972457886,0.5130437016487122,0.30085113644599915,0.803921639919281,0.5130288004875183,0.3008517622947693,0.8039230704307556,0.5130261182785034,0.3008546531200409,0.8039194941520691,0.5130301117897034,0.3008613586425781,0.8039342164993286,0.5130031108856201,-0.019525907933712006,0.0034512635320425034,-0.999803364276886,-0.019515730440616608,0.003434911370277405,-0.9998036623001099,-0.01951080560684204,0.0034344345331192017,-0.9998037815093994,-0.01949400082230568,0.003460988402366638,-0.9998040795326233,0.30084559321403503,-0.8039190173149109,-0.5130363702774048,0.3008456826210022,-0.8039130568504333,-0.5130454301834106,0.30084726214408875,-0.8039217591285706,-0.5130307674407959,0.30084937810897827,-0.8039229512214661,-0.5130279660224915,0.3008571267127991,-0.803926944732666,-0.5130170583724976,0.49298426508903503,-0.29092302918434143,-0.8199574947357178,0.4929867684841156,-0.290944904088974,-0.819948136806488,0.4929903745651245,-0.29092836380004883,-0.8199520111083984,0.4929988384246826,-0.29094645380973816,-0.819940447807312,0.4930066466331482,-0.29092955589294434,-0.8199417591094971,0.30083754658699036,-0.8039181232452393,0.5130423307418823,0.3008488714694977,-0.8039132356643677,0.5130434036254883,0.3008507788181305,-0.8039216995239258,0.5130287408828735,0.30085182189941406,-0.8039235472679138,0.5130254030227661,0.30085495114326477,-0.8039181232452393,0.5130321383476257,0.30085986852645874,-0.8039340376853943,0.5130043029785156,-0.797728419303894,-0.5067229270935059,0.3268962502479553,-0.7977258563041687,-0.506712794303894,0.3269183933734894,-0.797725260257721,-0.5067326426506042,0.3268887996673584,-0.7977154850959778,-0.5067335367202759,0.32691144943237305,-0.3269064426422119,-0.7977167367935181,0.5067347884178162,-0.3268938660621643,-0.7977226376533508,0.5067335367202759,-0.3268907070159912,-0.7977270483970642,0.5067287087440491,-0.3268868923187256,-0.7977240085601807,0.5067360997200012,-0.3268852233886719,-0.7977129817008972,0.5067545175552368,-0.5089601278305054,0.3034306466579437,-0.805536687374115,-0.5089573860168457,0.30343058705329895,-0.805538535118103,-0.5089519619941711,0.30339932441711426,-0.8055538535118103,-0.5089257955551147,0.30343857407569885,-0.8055554628372192,-0.5089184045791626,0.3034357726573944,-0.8055611252784729,-0.5088995695114136,0.30344462394714355,-0.8055697679519653,0.3268873393535614,0.7977280616760254,0.5067291259765625,0.32689282298088074,0.7977269887924194,0.5067273378372192,0.3269011378288269,0.7977209091186523,0.5067315101623535,0.3269102871417999,0.7977165579795837,0.5067325234413147,0.32691535353660583,0.7977278828620911,0.5067119002342224,-0.000026047229766845703,-0.999752938747406,-0.02222883701324463,-0.000008940696716308594,-0.9997531175613403,-0.022218912839889526,-0.0000015245750546455383,-0.9997526407241821,-0.02224019728600979,0.000007366761565208435,-0.9997531175613403,-0.02221873588860035,-0.290948748588562,-0.8199450969696045,-0.49298956990242004,-0.2909458875656128,-0.8199467658996582,-0.49298855662345886,-0.2909458577632904,-0.8199422955513,-0.4929962456226349,-0.29093700647354126,-0.8199491500854492,-0.4929898679256439,-0.29093021154403687,-0.8199409246444702,-0.4930077791213989,-0.2909247875213623,-0.8199558854103088,-0.4929860532283783,0.7977120280265808,-0.5067539215087891,0.32688847184181213,0.7977270483970642,-0.506733775138855,0.3268832564353943,0.7977273464202881,-0.5067236423492432,0.32689768075942993,0.7977273464202881,-0.5067236423492432,0.32689768075942993,0.3170563578605652,0.8139361143112183,0.48680925369262695,0.3170570433139801,0.8139445185661316,0.4867948889732361,0.3170689344406128,0.813934862613678,0.4868030846118927,0.3170716166496277,0.8139290809631348,0.4868110716342926,0.31707435846328735,0.8139417171478271,0.48678815364837646,0.4867840111255646,-0.3170663118362427,-0.8139473795890808,0.486789345741272,-0.3170621991157532,-0.8139458894729614,0.4867922365665436,-0.31707215309143066,-0.8139402270317078,0.48679348826408386,-0.317050039768219,-0.8139480948448181,0.4868071973323822,-0.3170592784881592,-0.8139362335205078,0.48680734634399414,-0.31705474853515625,-0.8139378428459167,0.4868084490299225,-0.3170764446258545,-0.8139288425445557,-0.000013574957847595215,-0.01111060380935669,-0.9999383091926575,-0.000004933535819873214,-0.011075659655034542,-0.9999386072158813,0.000007039896445348859,-0.011118302121758461,-0.9999381303787231,0.00000852346420288086,-0.01112416386604309,-0.9999381899833679,0.000014200806617736816,-0.011078417301177979,-0.9999385476112366,0.00003071129322052002,-0.011100709438323975,-0.9999383687973022,0.29092466831207275,0.8199556469917297,0.49298620223999023,0.2909298241138458,0.8199406862258911,0.4930081367492676,0.2909347116947174,0.8199495077133179,0.4929908514022827,0.2909448742866516,0.8199471235275269,0.49298879504203796,0.29094886779785156,0.8199383020401001,0.49300071597099304,0.016171813011169434,0.9998692274093628,-0.00003343820571899414,0.01620444655418396,0.999868631362915,-0.0000010915100574493408,0.01620711386203766,0.9998686909675598,-0.000010520219802856445,0.01620851457118988,0.9998686909675598,0.00001023709774017334,0.01621788740158081,0.9998685121536255,1.7881393432617188e-7,0.016219263896346092,0.9998685121536255,-3.4598633646965027e-7,-0.5067505836486816,0.3268905580043793,0.7977132201194763,-0.5067304372787476,0.3269084393978119,0.7977187037467957,-0.5067296028137207,0.3268975615501404,0.797723650932312,-0.5067266225814819,0.3268991708755493,0.7977248430252075,-0.5067264437675476,0.32688987255096436,0.7977288961410522,-0.5067263245582581,0.32689154148101807,0.7977282404899597,-0.2909603714942932,0.8199325203895569,0.49300387501716614,-0.2909455895423889,0.8199446797370911,0.4929923117160797,-0.2909436821937561,0.8199417591094971,0.4929981827735901,-0.2909405529499054,0.8199470639228821,0.4929913282394409,-0.2909325659275055,0.8199489712715149,0.4929928183555603,-0.2909291386604309,0.819939911365509,0.4930098354816437,-0.9997537136077881,0.022191839292645454,0.00000504031777381897,-0.9997531175613403,0.02221798151731491,-0.000002693384885787964,-0.9997531175613403,0.022219747304916382,0.000011652708053588867,-0.9997529983520508,0.022228829562664032,0.0000273287296295166,-0.9998690485954285,-0.00004357099533081055,0.01618865132331848,-0.999868631362915,8.069910109043121e-7,0.016208183020353317,-0.9998685717582703,-0.0000448375940322876,0.01621093973517418,-0.9998685717582703,-0.000008761882781982422,0.01621145009994507,-0.9998685717582703,0.000011309981346130371,0.01621215045452118,-0.9998684525489807,-0.0000010132789611816406,0.01622423529624939,-0.9998683929443359,0.0000010335352271795273,0.016223950311541557,-0.5130453705787659,-0.3008093237876892,0.8039266467094421,-0.5130453705787659,-0.3008093237876892,0.8039266467094421,-0.5130347013473511,-0.30084866285324097,0.8039188385009766,-0.5130272507667542,-0.3008646070957184,0.803917646408081,-0.5130270719528198,-0.3008405864238739,0.8039267659187317,-0.5130001902580261,-0.3008325397968292,0.8039469718933105,-0.5067576169967651,-0.3268996477127075,-0.7977050542831421,-0.5067576169967651,-0.3268996477127075,-0.7977050542831421,-0.5067268013954163,-0.3268904387950897,-0.7977283596992493,-0.5067136287689209,-0.32691413164138794,-0.7977270483970642,-0.5130422711372375,-0.30085960030555725,-0.8039097785949707,-0.5130422711372375,-0.30085960030555725,-0.8039097785949707,-0.5130351185798645,-0.3008493185043335,-0.8039183616638184,-0.5130186080932617,-0.30085819959640503,-0.8039255738258362,-0.5130038857460022,-0.3008323609828949,-0.8039445877075195,-0.8139479756355286,0.4867886006832123,-0.31705790758132935,-0.8139469027519226,0.4867956042289734,-0.3170493245124817,-0.8139386773109436,0.4867936074733734,-0.31707385182380676,-0.8139375448226929,0.48680996894836426,-0.3170512914657593,-0.8139374256134033,0.486805260181427,-0.3170590400695801,-0.8139272928237915,0.4868119955062866,-0.31707483530044556,-0.8039371967315674,-0.5130016803741455,-0.3008561134338379,-0.8039246797561646,-0.5130265951156616,-0.30084672570228577,-0.8039228916168213,-0.5130297541618347,-0.30084607005119324,-0.803920567035675,-0.5130411386489868,-0.3008330762386322,-0.803917407989502,-0.5130360126495361,-0.3008502721786499,-0.8039128184318542,-0.5130437016487122,-0.30084937810897827,-0.8039510250091553,-0.5129914879798889,0.30083632469177246,-0.803925633430481,-0.513030469417572,0.30083781480789185,-0.8039206862449646,-0.5130295753479004,0.3008521795272827,-0.8039200901985168,-0.5130325555801392,0.3008491098880768,-0.8039183616638184,-0.5130420923233032,0.30083730816841125,-0.8039169311523438,-0.513033390045166,0.3008556663990021,-0.8039165735244751,-0.5130240321159363,0.3008728623390198,0.8139259219169617,-0.4868123531341553,0.3170778751373291,0.8139362335205078,-0.48681262135505676,0.31705108284950256,0.8139362335205078,-0.48681262135505676,0.31705108284950256,0.8139456510543823,-0.4867914915084839,0.31705909967422485,0.8139479756355286,-0.4867952764034271,0.3170475363731384,0.8199337124824524,-0.4930025637149811,0.29095906019210815,0.8199397325515747,-0.4930015802383423,0.29094383120536804,0.8199440240859985,-0.4930053949356079,0.29092511534690857,0.8199495673179626,-0.49298688769340515,0.290941059589386,0.8199518918991089,-0.4929915964603424,0.29092657566070557,-0.000030502676963806152,-0.01617613434791565,0.9998691082000732,-0.000008180737495422363,-0.016205251216888428,0.999868631362915,0.0000011175870895385742,-0.01622094213962555,0.9998685121536255,0.0000046496279537677765,-0.01620444841682911,0.9998686909675598,0.000006626127287745476,-0.016218557953834534,0.9998685121536255,0.000016480684280395508,-0.016207247972488403,0.999868631362915,0.2909298837184906,-0.8199405670166016,0.493008553981781,0.2909371554851532,-0.819949209690094,0.49298959970474243,0.290944904088974,-0.8199470043182373,0.4929887652397156,0.29094886779785156,-0.8199384212493896,0.4930006265640259,0.29096388816833496,-0.8199325799942017,0.49300146102905273,0.8199388980865479,0.4930010437965393,0.2909468710422516,0.8199397325515747,0.4930093288421631,0.2909305691719055,0.8199490904808044,0.49298906326293945,0.2909387946128845,0.8199512362480164,0.4929920732975006,0.2909274697303772,0.8199567198753357,0.4929872155189514,0.29091987013816833,0.8039079904556274,0.5130425095558167,-0.30086418986320496,0.8039079904556274,0.5130425095558167,-0.30086418986320496,0.8039183616638184,0.513031542301178,-0.3008551597595215,0.8039308786392212,0.5130091905593872,-0.30085980892181396,0.4929937720298767,-0.29094550013542175,0.8199437856674194,0.4929945468902588,-0.2909424602985382,0.819944441318512,0.4929971694946289,-0.2909335792064667,0.8199460506439209,0.49299973249435425,-0.29094603657722473,0.8199400305747986,0.4930054247379303,-0.2909621000289917,0.819930911064148,0.4930139482021332,-0.2909294068813324,0.8199374079704285,-0.5067506432533264,-0.326890766620636,0.7977131605148315,-0.5067328214645386,-0.32690688967704773,0.797717809677124,-0.5067287087440491,-0.326896071434021,0.7977248430252075,-0.5067263841629028,-0.3268885314464569,0.7977295517921448,-0.5067260265350342,-0.3268907368183136,0.7977287173271179,-0.5067246556282043,-0.3268979489803314,0.7977266907691956,-0.4868078827857971,-0.31707385182380676,0.8139301538467407,-0.48680680990219116,-0.31705403327941895,0.8139384388923645,-0.4868009090423584,-0.3170638084411621,0.8139382600784302,-0.4867950677871704,-0.3170577883720398,0.8139441013336182,-0.486785888671875,-0.31707119941711426,0.8139443397521973,-0.0000063907355070114136,-0.9997531175613403,0.02221914753317833,0.0000015255063772201538,-0.9997526407241821,0.022240199148654938,0.000007659196853637695,-0.9997530579566956,0.022218987345695496,0.000025704503059387207,-0.9997528791427612,0.022229783236980438,-0.2909602224826813,-0.8199326992034912,0.49300363659858704,-0.2909456193447113,-0.8199447989463806,0.4929920732975006,-0.2909436523914337,-0.8199417591094971,0.4929981827735901,-0.2909403145313263,-0.8199471235275269,0.4929913580417633,-0.2909320592880249,-0.8199489116668701,0.4929931163787842,-0.2909291386604309,-0.8199397325515747,0.4930102229118347,-0.3170614242553711,-0.8139365911483765,0.4868052303791046,-0.3170546591281891,-0.8139438629150391,0.4867975413799286,-0.31705236434936523,-0.8139365911483765,0.4868110716342926,-0.31705206632614136,-0.8139435052871704,0.4867997169494629,0.5067088007926941,-0.32691431045532227,-0.7977301478385925,0.5067205429077148,-0.32689112424850464,-0.7977320551872253,0.506729781627655,-0.32688722014427185,-0.7977279424667358,0.5067307949066162,-0.32690852880477905,-0.797718346118927,0.9997526407241821,-0.022240418940782547,-0.000005042180418968201,0.9997529983520508,-0.02222476899623871,0.0000216066837310791,0.9997532367706299,-0.022217553108930588,-0.000011643394827842712,0.9997532963752747,-0.022216007113456726,0.0000049620866775512695,0.8139346837997437,-0.48679178953170776,-0.31708675622940063,0.8139352798461914,-0.48680993914604187,-0.31705716252326965,0.8139358758926392,-0.48680379986763,-0.31706541776657104,0.8139419555664062,-0.4867968261241913,-0.3170607388019562,0.8139616847038269,-0.4867711067199707,-0.3170492947101593,0.9998683333396912,9.019859135150909e-7,-0.016223222017288208,0.9998684525489807,-9.5367431640625e-7,-0.016224414110183716,0.999868631362915,-0.00000858306884765625,-0.01621215045452118,0.999868631362915,8.074566721916199e-7,-0.016208184882998466,0.999868631362915,0.000011593103408813477,-0.016211628913879395,0.9998686909675598,-0.000031620264053344727,-0.016208022832870483,0.9998689293861389,-0.00004826486110687256,-0.0161912702023983,-0.00000838935375213623,0.016203731298446655,0.9998688101768494,9.622890502214432e-7,0.01622016541659832,0.9998683929443359,0.000004648929461836815,0.01620445027947426,0.9998686909675598,0.0000064373016357421875,0.01621994376182556,0.9998685717582703,0.00001582503318786621,0.016208693385124207,0.9998685121536255,0.00003847479820251465,0.016177505254745483,0.999869167804718,0.48680007457733154,0.31705743074417114,0.813941240310669,0.48680129647254944,0.3170565962791443,0.8139409422874451,0.4868077337741852,0.3170599937438965,0.8139355778694153,0.48685207962989807,0.3170304000377655,0.8139206767082214,0.8139327168464661,0.48680904507637024,-0.31706565618515015,0.8139352798461914,0.48680996894836426,-0.3170573115348816,0.813941240310669,0.48680001497268677,-0.31705746054649353,0.8139423727989197,0.4867967665195465,-0.31705957651138306,0.8139436841011047,0.48679426312446594,-0.3170599341392517,0.5088772773742676,0.30341875553131104,-0.8055935502052307,0.5089110136032104,0.3034226894378662,-0.8055708408355713,0.5089132785797119,0.30345800518989563,-0.8055559992790222,0.5089139342308044,0.30345267057418823,-0.8055576086044312,0.508934497833252,0.30343055725097656,-0.8055529594421387,0.5089894533157349,0.303387314081192,-0.8055344820022583,0.5031076073646545,0.3264298439025879,-0.8002038598060608,0.5031241178512573,0.3264410197734833,-0.8001890182495117,0.5031249523162842,0.32645124197006226,-0.8001842498779297,0.5031318664550781,0.3264358937740326,-0.8001861572265625,0.5031365752220154,0.3264387249946594,-0.8001821041107178,0.797707200050354,0.506753146648407,-0.3269011378288269,0.797707200050354,0.506753146648407,-0.3269011378288269,0.7977266907691956,0.5067112445831299,-0.32691892981529236,0.7977287769317627,0.5067213773727417,-0.3268980383872986,0.3170560896396637,-0.8139365315437317,0.486808717250824,0.31705886125564575,-0.8139439821243286,0.48679447174072266,0.3170628845691681,-0.813936173915863,0.4868050217628479,0.3170718252658844,-0.8139439821243286,0.48678603768348694,0.31708014011383057,-0.8139369487762451,0.48679235577583313,0.31708040833473206,-0.8139251470565796,0.48681211471557617,0.8199315071105957,0.4930025637149811,-0.2909652590751648,0.8199403285980225,0.49300968647003174,-0.2909284830093384,0.8199413418769836,0.49299755692481995,-0.2909456491470337,0.8199435472488403,0.49299076199531555,-0.29095104336738586,0.8199455142021179,0.4929905831813812,-0.2909463047981262,0.8199475407600403,0.4929920434951782,-0.2909378409385681,-0.49301081895828247,-0.2909294068813324,-0.8199392557144165,-0.4930001497268677,-0.29094603657722473,-0.8199397325515747,-0.4929942190647125,-0.29094552993774414,-0.8199436664581299,-0.49299415946006775,-0.2909356355667114,-0.8199470043182373,-0.4929927885532379,-0.2909421920776367,-0.8199455738067627,-0.49299028515815735,-0.29092299938201904,-0.8199537992477417,-0.016219697892665863,-0.9998685121536255,1.8882565200328827e-7,-0.016219332814216614,-0.9998683929443359,4.917383193969727e-7,-0.016213014721870422,-0.9998685121536255,0.00004868209362030029,-0.016209125518798828,-0.999868631362915,-0.000010088086128234863,-0.016207367181777954,-0.999868631362915,0.000010952353477478027,-0.01620444655418396,-0.9998686909675598,-9.727664291858673e-7,-0.01618608832359314,-0.9998689889907837,0.00003844499588012695,-0.49107488989830017,0.2948729395866394,-0.8196921944618225,-0.49106675386428833,0.29489362239837646,-0.8196896314620972,-0.49106061458587646,0.2948709726333618,-0.8197014927864075,-0.49105924367904663,0.2948675751686096,-0.8197035193443298,-0.4910484552383423,0.2948729693889618,-0.8197080492973328,0.5130017399787903,-0.30085939168930054,-0.8039357662200928,0.5130244493484497,-0.30084937810897827,-0.803925096988678,0.513026773929596,-0.3008493483066559,-0.8039234280586243,0.513030469417572,-0.30085432529449463,-0.8039193749427795,0.5130401253700256,-0.30083391070365906,-0.8039209842681885,0.5130414366722107,-0.30084913969039917,-0.8039143681526184,0.32688838243484497,-0.7977268695831299,0.5067307949066162,0.3268934488296509,-0.797727644443512,0.5067262649536133,0.3268952965736389,-0.7977220416069031,0.5067338347434998,0.3269088566303253,-0.7977157235145569,0.5067347288131714,0.32691681385040283,-0.7977270483970642,0.5067120790481567,0.506731390953064,-0.3268928527832031,0.7977245450019836,0.5067368745803833,-0.3268938362598419,0.7977205514907837,0.5067563056945801,-0.3268866240978241,0.7977113723754883,0.5067574977874756,-0.3268994987010956,0.7977052927017212,0.5067574977874756,-0.3268994987010956,0.7977052927017212,0.48679232597351074,-0.31706538796424866,0.8139427304267883,0.4867943525314331,-0.3170838952064514,0.8139344453811646,0.48680126667022705,-0.317055344581604,0.8139413595199585,0.48680776357650757,-0.31706103682518005,0.8139351010322571,0.4868128001689911,-0.3170541524887085,0.813934862613678,0.4868144989013672,-0.3170735836029053,0.8139262199401855,-0.3269168436527252,-0.7977273464202881,-0.5067114233970642,-0.3269089162349701,-0.7977157235145569,-0.5067346096038818,-0.32690006494522095,-0.7977253198623657,-0.5067254304885864,-0.3268975615501404,-0.7977211475372314,-0.5067336559295654,-0.326894074678421,-0.7977250218391418,-0.5067296624183655,-0.32689133286476135,-0.7977280020713806,-0.5067267417907715,-0.7977375388145447,-0.5067383050918579,-0.3268502950668335,-0.7977375388145447,-0.5067383050918579,-0.3268502950668335,-0.7977255582809448,-0.5067352652549744,-0.326884001493454,-0.7977122068405151,-0.5067542791366577,-0.32688724994659424,0.9998685717582703,-1.9371509552001953e-7,0.016211718320846558,0.9998686909675598,-0.000007063150405883789,0.01620452105998993,0.9998686909675598,5.688052624464035e-7,0.01620963215827942,0.9998687505722046,8.088536560535431e-7,0.01620098017156124,0.9998687505722046,0.000009447336196899414,0.016203224658966064,0.9998690485954285,-0.000034227967262268066,0.01618596911430359,0.3268680274486542,-0.7977415323257446,-0.5067204236984253,0.3268900513648987,-0.7977254986763,-0.5067315697669983,0.32689306139945984,-0.7977262735366821,-0.5067285299301147,0.3268945813179016,-0.7977228164672852,-0.5067329406738281,0.32689517736434937,-0.7977268099784851,-0.5067262649536133,0.32691502571105957,-0.7977272272109985,-0.5067128539085388,0.7977112531661987,-0.5067529678344727,-0.32689201831817627,0.7977154850959778,-0.5067335963249207,-0.32691144943237305,0.7977215647697449,-0.506732702255249,-0.32689809799194336,0.7977254390716553,-0.5067287087440491,-0.32689452171325684,0.7977267503738403,-0.5067309141159058,-0.32688814401626587,0.5130077004432678,0.30085963010787964,0.8039320707321167,0.5130297541618347,0.30084937810897827,0.8039216995239258,0.5130323171615601,0.3008490204811096,0.8039200901985168,0.5130364894866943,0.30085432529449463,0.8039156794548035,0.5130462050437927,0.3008359372615814,0.8039162158966064,0.51304692029953,0.30084913969039917,0.8039107918739319,0.8039127588272095,-0.5130437612533569,0.30084940791130066,0.8039186596870422,-0.5130347609519958,0.3008493483066559,0.8039190769195557,-0.5130429863929749,0.30083420872688293,0.8039229512214661,-0.5130298137664795,0.30084604024887085,0.8039247393608093,-0.5130265951156616,0.3008466958999634,0.8039315938949585,-0.5130106210708618,0.3008553087711334,0.8039183616638184,-0.5130316615104675,-0.30085524916648865,0.803918719291687,-0.5130422711372375,-0.3008360266685486,0.8039200305938721,-0.5130326151847839,-0.30084913969039917,0.8039206862449646,-0.5130296349525452,-0.3008522093296051,0.8039317727088928,-0.513005793094635,-0.30086347460746765,0.8039458394050598,-0.5129998922348022,-0.3008357584476471,-0.30086222290992737,-0.8039306402206421,-0.5130082964897156,-0.30085277557373047,-0.8039199113845825,-0.513030469417572,-0.300851047039032,-0.8039217591285706,-0.513028621673584,-0.3008507788181305,-0.8039173483848572,-0.5130357146263123,-0.3008337914943695,-0.8039432168006897,-0.5130053162574768,-0.9998691082000732,-0.000034242868423461914,-0.01618131995201111,-0.9998687505722046,8.067581802606583e-7,-0.01620098017156124,-0.9998687505722046,0.000009641051292419434,-0.016203448176383972,-0.9998686909675598,-0.000007212162017822266,-0.016204625368118286,-0.9998686909675598,6.223563104867935e-7,-0.016209648922085762,-0.9998685121536255,-1.9371509552001953e-7,-0.01621153950691223,-0.7977283596992493,0.5067322254180908,-0.326882004737854,-0.7977277636528015,0.5067290663719177,-0.3268887996673584,-0.7977234125137329,0.5067338943481445,-0.32689157128334045,-0.7977177500724792,0.5067336559295654,-0.32690560817718506,-0.7977122068405151,0.5067541599273682,-0.326887309551239,-0.8039452433586121,0.5130032300949097,-0.3008318245410919,-0.8039326071739197,0.5130090713500977,-0.3008555769920349,-0.8039237856864929,0.5130265951156616,-0.30084937810897827,-0.8039227724075317,0.5130298137664795,-0.3008461892604828,-0.8039199709892273,0.5130324363708496,-0.30084940791130066,-0.8039199709892273,0.5130419135093689,-0.30083346366882324,-0.8039143681526184,0.5130447745323181,-0.30084335803985596,-0.4861213266849518,0.3174731433391571,-0.8141847252845764,-0.4861072897911072,0.3175134062767029,-0.8141775131225586,-0.4861047863960266,0.31748297810554504,-0.8141908049583435,-0.4861007332801819,0.3174685537815094,-0.8141988515853882,-0.4860859811306,0.31749480962753296,-0.8141974210739136,-0.48608478903770447,0.3174983561038971,-0.814196765422821,0.30044397711753845,0.8036642670631409,-0.5136703848838806,0.30044645071029663,0.8036598563194275,-0.5136758685112,0.3004480004310608,0.8036625981330872,-0.5136705636978149,0.3004538118839264,0.8036926984786987,-0.5136200785636902,0.30045652389526367,0.8036901950836182,-0.5136222839355469,-0.3004720211029053,0.8036836981773376,-0.5136234760284424,-0.30045682191848755,0.8036627769470215,-0.513664960861206,-0.3004477024078369,0.8036642670631409,-0.5136681795120239,-0.30044496059417725,0.8036916851997375,-0.5136268734931946,-0.3004448711872101,0.8036707043647766,-0.5136595964431763,-0.29143548011779785,0.8175532221794128,-0.4966612160205841,-0.2914249300956726,0.8175643086433411,-0.4966491460800171,-0.2914220690727234,0.8175652623176575,-0.49664899706840515,-0.2914113402366638,0.8175539374351501,-0.4966740012168884,-0.2913860082626343,0.8175709843635559,-0.49666067957878113,-0.2913796901702881,0.8175732493400574,-0.49666085839271545,-0.00002612173557281494,0.9997528791427612,-0.022229932248592377,-0.000007601454854011536,0.9997532367706299,-0.02221878245472908,0.0000013606622815132141,0.9997526407241821,-0.02224019542336464,0.000006318092346191406,0.9997531771659851,-0.022218704223632812,-0.5130420923233032,0.3008320927619934,0.8039203882217407,-0.5130420923233032,0.3008320927619934,0.8039203882217407,-0.513036847114563,0.30085039138793945,0.8039168119430542,-0.5130102634429932,0.3008587956428528,0.8039306998252869,-0.48680686950683594,0.31705421209335327,0.8139384388923645,-0.48680058121681213,0.31706511974334717,0.8139378428459167,-0.4867952764034271,0.3170567750930786,0.8139443397521973,-0.48679250478744507,0.3170604407787323,0.8139445781707764],\n \"normalized\": false\n },\n \"uv\": {\n \"itemSize\": 2,\n \"type\": \"Float32Array\",\n \"array\": [0.01962309330701828,0.012889564037322998,0.02023136429488659,0.10979831218719482,0.07965327799320221,0.07732349634170532,0.07965327799320221,0.07732349634170532,0.02023136429488659,0.10979831218719482,0.5619750022888184,0.14709901809692383,0.02450018748641014,0.02645343542098999,0.06788178533315659,0.04795658588409424,0.0796533077955246,0.04795646667480469,0.02450018748641014,0.02645343542098999,0.503350019454956,0.1835920214653015,0.3125010132789612,0.3969320058822632,0.10002404451370239,0.04638880491256714,0.0839850902557373,0.04795658588409424,0.01962309330701828,0.008929312229156494,0.10002404451370239,0.04638880491256714,0.018139563500881195,0.03942161798477173,0.05488619580864906,0.04795628786087036,0.503491997718811,0.058592021465301514,0.09820473194122314,0.10979831218719482,0.05488619580864906,0.04795628786087036,0.018139563500881195,0.03942161798477173,0.04933025687932968,0.08043122291564941,0.04933025687932968,0.08043122291564941,0.03322688490152359,0.0800524353981018,0.03322688490152359,0.0800524353981018,0.0619719997048378,0.7201650142669678,0.012844499200582504,0.020931720733642578,0.5630499720573425,0.345100998878479,0.09606381505727768,0.008966565132141113,0.011493649333715439,0.020151853561401367,0.03200281038880348,0.0800524353981018,0.6875010132789612,0.5218279957771301,0.05055434629321098,0.07732337713241577,0.05055434629321098,0.07732337713241577,0.11814413964748383,0.008967041969299316,0.0850236713886261,0.029828131198883057,0.057423245161771774,0.008966565132141113,0.10158386081457138,0.04638880491256714,0.057423245161771774,0.008966565132141113,0.6874989867210388,0.5953599810600281,0.01827225834131241,0.008149445056915283,0.019623126834630966,0.045423686504364014,0.03755871579051018,0.047578275203704834,0.09387288242578506,0.07732349634170532,0.24622400104999542,0.4335950016975403,0.019623126834630966,0.045423686504364014,0.03755871579051018,0.047578275203704834,0.0850236713886261,0.040868282318115234,0.07398355007171631,0.008967041969299316,0.07532140612602234,0.08043128252029419,0.18750199675559998,0.5220270156860352,0.04066653922200203,0.04795628786087036,0.3125,0.021938025951385498,0.10997618734836578,0.10979831218719482,0.02358332648873329,0.01918947696685791,0.05190323293209076,0.046388089656829834,0.05190323293209076,0.046388089656829834,0.05488622561097145,0.08043128252029419,0.08367279171943665,0.023528218269348145,0.05488622561097145,0.08043128252029419,0.3124989867210388,0.5957159996032715,0.018272243440151215,0.013669490814208984,0.10554412007331848,0.008966803550720215,0.019007263705134392,0.10979831218719482,0.4383139908313751,0.39722001552581787,0.10253656655550003,0.10979831218719482,0.0503433421254158,0.04638814926147461,0.0850236713886261,0.024307966232299805,0.3124980032444,0.22047501802444458,0.10131248831748962,0.10979825258255005,0.10131248831748962,0.10979825258255005,0.0850236713886261,0.022748231887817383,0.05366211757063866,0.08043128252029419,0.1875,0.27190500497817993,0.10131251811981201,0.08043169975280762,0.02450021728873253,0.04338186979293823,0.06294332444667816,0.008966565132141113,0.1285640001296997,0.3085939884185791,0.02450021728873253,0.04338186979293823,0.09387288242578506,0.08043169975280762,0.09387288242578506,0.08043169975280762,0.006182555109262466,0.02567189931869507,0.027670973911881447,0.08005237579345703,0.312734991312027,0.34500598907470703,0.09387288242578506,0.10979831218719482,0.007099363952875137,0.04590404033660889,0.007099363952875137,0.04590404033660889,0.059218067675828934,0.08043104410171509,0.37151700258255005,0.3090599775314331,0.007099363952875137,0.04590404033660889,0.10997628420591354,0.07732337713241577,0.10997628420591354,0.07732337713241577,0.10253656655550003,0.07732349634170532,0.10253656655550003,0.07732349634170532,0.006182555109262466,0.020151853561401367,0.0625,0.14693999290466309,0.0625,0.2202470302581787,0.03322688490152359,0.07694470882415771,0.03378301486372948,0.04638814926147461,0.08502364158630371,0.013267934322357178,0.03378301486372948,0.04638814926147461,0.02598363533616066,0.024411678314208984,0.12137900292873383,0.1835939884185791,0.03378315269947052,0.008967041969299316,0.10253656655550003,0.04795682430267334,0.02450018748641014,0.030413687229156494,0.028895026072859764,0.047577083110809326,0.04622248187661171,0.07732313871383667,0.6290850043296814,0.1835920214653015,0.02450018748641014,0.030413687229156494,0.02450018748641014,0.0239296555519104,0.02450018748641014,0.0239296555519104,0.02450018748641014,0.0239296555519104,0.035342950373888016,0.008967041969299316,0.041890617460012436,0.07732313871383667,0.035342950373888016,0.008967041969299316,0.4962030053138733,0.3085950016975403,0.4375010132789612,0.27205002307891846,0.02333913929760456,0.07694411277770996,0.035342950373888016,0.04638814926147461,0.08367279171943665,0.012488067150115967,0.012844499200582504,0.024891972541809082,0.06232589855790138,0.047956228256225586,0.06232589855790138,0.047956228256225586,0.0883169174194336,0.07732337713241577,0.06249900162220001,0.47056400775909424,0.08087734878063202,0.10979831218719482,0.05190323293209076,0.00896763801574707,0.024500157684087753,0.03689777851104736,0.25286900997161865,0.5585929751396179,0.08087734878063202,0.10979831218719482,0.02598368003964424,0.038939595222473145,0.03322688490152359,0.047577738761901855,0.10997621715068817,0.04795706272125244,0.02598368003964424,0.038939595222473145,0.03322688490152359,0.047577738761901855,0.003621000098064542,0.1835939884185791,0.07794374972581863,0.008966684341430664,0.07794374972581863,0.008966684341430664,0.007533404976129532,0.020931720733642578,0.10131248831748962,0.07732349634170532,0.5625010132789612,0.5218250155448914,0.04933026805520058,0.07732349634170532,0.07532145082950592,0.04795658588409424,0.0850236713886261,0.028268277645111084,0.6875020265579224,0.2718750238418579,0.008582886308431625,0.03737819194793701,0.008582886308431625,0.03737819194793701,0.11658430099487305,0.04638892412185669,0.11106422543525696,0.00896674394607544,0.12150800228118896,0.3085930347442627,0.007099427282810211,0.03942000865936279,0.007099427282810211,0.03942000865936279,0.25360798835754395,0.4335930347442627,0.10002404451370239,0.00896674394607544,0.07242370396852493,0.046388447284698486,0.007099427282810211,0.03942000865936279,0.01857360079884529,0.019969403743743896,0.0462225005030632,0.10979831218719482,0.06249900162220001,0.5952410101890564,0.059218067675828934,0.04795658588409424,0.059218067675828934,0.04795658588409424,0.01857360079884529,0.018409550189971924,0.044998399913311005,0.10979831218719482,0.4374989867210388,0.09534800052642822,0.06690356880426407,0.008966684341430664,0.06690356880426407,0.008966684341430664,0.6874979734420776,0.34531301259994507,0.017222747206687927,0.01918947696685791,0.06846341490745544,0.008966624736785889,0.057993993163108826,0.04795658588409424,0.032921500504016876,0.10979831218719482,0.029636148363351822,0.019969403743743896,0.02364526502788067,0.10979831218719482,0.029636148363351822,0.019969403743743896,0.02364526502788067,0.10979831218719482,0.01326248049736023,0.04464298486709595,0.12177500128746033,0.6835950016975403,0.012804049998521805,0.04527390003204346,0.0372520349919796,0.10979831218719482,0.0372520349919796,0.10979831218719482,0.5033249855041504,0.3086329698562622,0.03230946138501167,0.10979831218719482,0.03230946138501167,0.10979831218719482,0.019623063504695892,0.032455623149871826,0.12873399257659912,0.6835910081863403,0.06665770709514618,0.10979819297790527,0.06354992836713791,0.07732325792312622,0.06354992836713791,0.07732325792312622,0.06665770709514618,0.10979819297790527,0.0031109999399632215,0.4335930347442627,0.06232583895325661,0.077323317527771,0.04066653922200203,0.08043086528778076,0.019623063504695892,0.030895769596099854,0.019623063504695892,0.030895769596099854,0.0635499358177185,0.08043128252029419,0.08367279171943665,0.018008112907409668,0.0635499358177185,0.08043128252029419,0.07098956406116486,0.04795658588409424,0.07098956406116486,0.04795658588409424,0.4375010132789612,0.5215610265731812,0.04066656902432442,0.0773230791091919,0.06665772199630737,0.047956645488739014,0.06665772199630737,0.047956645488739014,0.04066656902432442,0.0773230791091919,0.37138599157333374,0.0585939884185791,0.0235833041369915,0.02519160509109497,0.05921806022524834,0.10979831218719482,0.3133150041103363,0.27218103408813477,0.024563191458582878,0.08005183935165405,0.024563191458582878,0.08005183935165405,0.006182555109262466,0.014631807804107666,0.1068684309720993,0.10979831218719482,0.08398514240980148,0.07732337713241577,0.37139201164245605,0.4335950016975403,0.08398514240980148,0.07732337713241577,0.1068684309720993,0.10979831218719482,0.007099427282810211,0.04338020086288452,0.007099427282810211,0.04338020086288452,0.02333918772637844,0.047576963901519775,0.1056443378329277,0.07732349634170532,0.3787969946861267,0.3085930347442627,0.018139638006687164,0.02645343542098999,0.02333918772637844,0.047576963901519775,0.0558633916079998,0.046388328075408936,0.1068684458732605,0.07732337713241577,0.6207290291786194,0.4335950016975403,0.1068684458732605,0.07732337713241577,0.0558633916079998,0.046388328075408936,0.017222747206687927,0.02519160509109497,0.037558771669864655,0.08005297183990479,0.08367282897233963,0.04560840129852295,0.09698063135147095,0.08043169975280762,0.5630019903182983,0.2720860242843628,0.09054373949766159,0.008966386318206787,0.08831693977117538,0.047956764698028564,0.12188900262117386,0.4335950016975403,0.08831693977117538,0.047956764698028564,0.018139630556106567,0.03689777851104736,0.4375010132789612,0.14693796634674072,0.09450394660234451,0.008966565132141113,0.09450394660234451,0.008966565132141113,0.05055436119437218,0.08043122291564941,0.012844499200582504,0.01937192678451538,0.039303116500377655,0.008966505527496338,0.09264880418777466,0.07732337713241577,0.7453330159187317,0.4335939884185791,0.09264880418777466,0.07732337713241577,0.039303116500377655,0.008966505527496338,0.019623126834630966,0.043863773345947266,0.08087734878063202,0.08043140172958374,0.012844476848840714,0.01385188102722168,0.08831700682640076,0.08043140172958374,0.3125010132789612,0.5214719772338867,0.1875009983778,0.3970370292663574,0.08954101800918579,0.08043140172958374,0.08954101800918579,0.08043140172958374,0.03755873069167137,0.0769452452659607,0.011493649333715439,0.014631807804107666,0.07098963111639023,0.08043122291564941,0.07098963111639023,0.08043122291564941,0.10554413497447968,0.046388864517211914,0.10554413497447968,0.046388864517211914,0.49645400047302246,0.4340590238571167,0.025983694940805435,0.045423686504364014,0.05586344376206398,0.008966565132141113,0.08520916849374771,0.04795658588409424,0.08520916849374771,0.04795658588409424,0.5625010132789612,0.39734500646591187,0.01962309330701828,0.007369518280029297,0.011493649333715439,0.02567189931869507,0.04499842971563339,0.04795628786087036,0.18750199675559998,0.6470130085945129,0.06354992836713791,0.04795616865158081,0.08954101800918579,0.07732349634170532,0.04622248187661171,0.04795628786087036,0.08954101800918579,0.07732349634170532,0.04622248187661171,0.04795628786087036,0.012844499200582504,0.026451826095581055,0.6875010132789612,0.14722901582717896,0.024934161454439163,0.01444941759109497,0.04638303443789482,0.008966565132141113,0.11262404918670654,0.046388864517211914,0.6874989867210388,0.09525102376937866,0.5042709708213806,0.4335930347442627,0.1112002432346344,0.08043169975280762,0.08520916849374771,0.07732337713241577,0.008582878857851028,0.043862223625183105,0.008582878857851028,0.043862223625183105,0.01962309330701828,0.03737986087799072,0.08898389339447021,0.008966386318206787,0.01962309330701828,0.03737986087799072,0.09450394660234451,0.04638838768005371,0.08898389339447021,0.008966386318206787,0.4963819980621338,0.18359601497650146,0.01962309330701828,0.03737986087799072,0.09606381505727768,0.046388328075408936,0.6216750144958496,0.308555006980896,0.09698067605495453,0.10979819297790527,0.09698067605495453,0.10979819297790527,0.09606381505727768,0.046388328075408936,0.01962309330701828,0.038939714431762695,0.5624989867210388,0.46984195709228516,0.02493416890501976,0.0184096097946167,0.1112002432346344,0.10979825258255005,0.1112002432346344,0.10979825258255005,0.1068684458732605,0.04795706272125244,0.008582878857851028,0.04542207717895508,0.25361400842666626,0.0585939884185791,0.09264880418777466,0.10979819297790527,0.10997617989778519,0.08043175935745239,0.10997617989778519,0.08043175935745239,0.09264880418777466,0.10979819297790527,0.08502364158630371,0.01170814037322998,0.06250099837779999,0.5219460129737854,0.024563191458582878,0.07694411277770996,0.03200285881757736,0.07694464921951294,0.024563191458582878,0.07694411277770996,0.03200285881757736,0.07694464921951294,0.4374989867210388,0.3451380133628845,0.10564440488815308,0.04795706272125244,0.10564440488815308,0.04795706272125244,0.041890617460012436,0.04795628786087036,0.041890617460012436,0.04795628786087036,0.02493416890501976,0.019969403743743896,0.3125019967556,0.14671200513839722,0.0795036107301712,0.008966624736785889,0.11120033264160156,0.07732337713241577,0.007533404976129532,0.01937192678451538,0.02598368003964424,0.03737974166870117,0.37174901366233826,0.18359798192977905,0.02598368003964424,0.03737974166870117,0.05034333094954491,0.00896763801574707,0.11120033264160156,0.04795718193054199,0.05034333094954491,0.00896763801574707,0.11120033264160156,0.04795718193054199,0.04499838873744011,0.08043122291564941,0.49654099345207214,0.058596014976501465,0.07965327799320221,0.10979831218719482,0.023583341389894485,0.038159728050231934,0.023583341389894485,0.038159728050231934,0.023583341389894485,0.038159728050231934,0.06138351559638977,0.04638826847076416,0.5624989867210388,0.09532797336578369,0.05488619580864906,0.07732349634170532,0.007533375173807144,0.009891688823699951,0.061383482068777084,0.008966565132141113,0.621508002281189,0.058596014976501465,0.07221363484859467,0.08043122291564941,0.025983694940805435,0.043863773345947266,0.025983694940805435,0.043863773345947266,0.02450021728873253,0.04590564966201782,0.07794374972581863,0.04638850688934326,0.02450021728873253,0.04590564966201782,0.6215639710426331,0.5585950016975403,0.10710396617650986,0.046388864517211914,0.02450021728873253,0.04590564966201782,0.025983672589063644,0.030895769596099854,0.05366221442818642,0.10979831218719482,0.2464359998703003,0.3085939884185791,0.02767101861536503,0.047577083110809326,0.02767101861536503,0.047577083110809326,0.05366221442818642,0.10979831218719482,0.025983672589063644,0.032455503940582275,0.025983672589063644,0.032455503940582275,0.37213099002838135,0.5585950016975403,0.05488622561097145,0.10979831218719482,0.08831696212291718,0.10979831218719482,0.08831696212291718,0.10979831218719482,0.025983672589063644,0.032455503940582275,0.007099442183971405,0.03689616918563843,0.11262404918670654,0.00896674394607544,0.6286150217056274,0.058592021465301514,0.007099442183971405,0.03689616918563843,0.12366431206464767,0.046389102935791016,0.6875010132789612,0.021937012672424316,0.06232582405209541,0.08043128252029419,0.0850236713886261,0.017228126525878906,0.12366431206464767,0.00896763801574707,0.12366431206464767,0.00896763801574707,0.017222747206687927,0.04464375972747803,0.06846341490745544,0.04638838768005371,0.06846341490745544,0.04638838768005371,0.7464879751205444,0.30859601497650146,0.07532142847776413,0.077323317527771,0.07532142847776413,0.077323317527771,0.0850236713886261,0.033788442611694336,0.06788180023431778,0.08043128252029419,0.06788180023431778,0.08043128252029419,0.09264878183603287,0.04795682430267334,0.6875,0.3975909948348999,0.1068684309720993,0.08043169975280762,0.08367282897233963,0.04008835554122925,0.07242365181446075,0.008967041969299316,0.07242365181446075,0.008967041969299316,0.3124989867210388,0.4702550172805786,0.057993993163108826,0.08043110370635986,0.2463259994983673,0.18359601497650146,0.1056443527340889,0.10979831218719482,0.006182555109262466,0.044642090797424316,0.11658430099487305,0.008967041969299316,0.07654549926519394,0.04795658588409424,0.07654549926519394,0.04795658588409424,0.11658430099487305,0.008967041969299316,0.0625,0.2718600034713745,0.08367279171943665,0.029048264026641846,0.012844476848840714,0.015411734580993652,0.4375010132789612,0.02183997631072998,0.03633471950888634,0.0769452452659607,0.03633471950888634,0.0769452452659607,0.07965333014726639,0.08043140172958374,0.07965333014726639,0.08043140172958374,0.018139638006687164,0.04590564966201782,0.37845900654792786,0.058592021465301514,0.036334652453660965,0.047578275203704834,0.06690356880426407,0.04638850688934326,0.018139638006687164,0.04590564966201782,0.09698062390089035,0.07732349634170532,0.18749800324440002,0.7201740145683289,0.06665777415037155,0.08043122291564941,0.0850236713886261,0.03534823656082153,0.1874990016222,0.47015100717544556,0.09387288242578506,0.04795682430267334,0.09387288242578506,0.04795682430267334,0.09820473194122314,0.07732337713241577,0.09820473194122314,0.07732337713241577,0.08367279171943665,0.03456830978393555,0.08954101800918579,0.10979831218719482,0.09820473194122314,0.04795682430267334,0.12877599895000458,0.4335930347442627,0.02450018748641014,0.032937586307525635,0.012844454497098923,0.008331894874572754,0.08898389339447021,0.04638838768005371,0.08398512005805969,0.08043140172958374,0.4374989867210388,0.2202489972114563,0.18749800324440002,0.5951610207557678,0.0850236713886261,0.018788039684295654,0.07221363484859467,0.04795658588409424,0.12210442870855331,0.00896763801574707,0.007099363952875137,0.03041207790374756,0.4969879984855652,0.5585939884185791,0.0852091833949089,0.10979831218719482,0.07098958641290665,0.07732349634170532,0.007099363952875137,0.03041207790374756,0.0753214880824089,0.10979819297790527,0.07221363484859467,0.07732337713241577,0.07221363484859467,0.07732337713241577,0.24624399840831757,0.5585960149765015,0.0753214880824089,0.10979819297790527,0.008582886308431625,0.030893981456756592,0.008582886308431625,0.030893981456756592,0.05799401178956032,0.07732337713241577,0.05799401178956032,0.07732337713241577,0.6285120248794556,0.30859100818634033,0.04933030903339386,0.047956645488739014,0.04933030903339386,0.047956645488739014,0.01962307095527649,0.024411559104919434,0.018139563500881195,0.0239296555519104,0.05055434629321098,0.04795658588409424,0.057423245161771774,0.046388328075408936,0.7465599775314331,0.5585950016975403,0.02023131214082241,0.0475764274597168,0.1286740005016327,0.1835920214653015,0.008582886308431625,0.032453835010528564,0.07654549926519394,0.10979831218719482,0.02023131214082241,0.0475764274597168,0.007099427282810211,0.03293585777282715,0.007099427282810211,0.03293585777282715,0.019007263705134392,0.0475764274597168,0.007099427282810211,0.03293585777282715,0.04933033511042595,0.10979831218719482,0.0032250001095235348,0.6835929751396179,0.061973001807928085,0.647022008895874,0.01900731585919857,0.07694333791732788,0.02333913929760456,0.08005183935165405,0.01900731585919857,0.07694333791732788,0.007533375173807144,0.01385188102722168,0.05799407511949539,0.10979831218719482,0.1874990016222,0.22021400928497314,0.007533375173807144,0.015411734580993652,0.02023131214082241,0.07694333791732788,0.6296669840812683,0.4335930347442627,0.06788180023431778,0.10979831218719482,0.04482320323586464,0.04638856649398804,0.018139563500881195,0.032937586307525635,0.018139563500881195,0.032937586307525635,0.018139563500881195,0.032937586307525635,0.1875009983778,0.14697301387786865,0.0850236713886261,0.03930848836898804,0.1056443378329277,0.08043169975280762,0.1056443378329277,0.08043169975280762,0.07654549926519394,0.08043128252029419,0.07654549926519394,0.08043128252029419,0.0850236713886261,0.04638838768005371,0.07221363484859467,0.10979831218719482,0.07221363484859467,0.10979831218719482,0.09820473194122314,0.08043169975280762,0.09820473194122314,0.08043169975280762,0.5625010132789612,0.02186000347137451,0.044998399913311005,0.0773230791091919,0.09698063135147095,0.04795682430267334,0.023583319038152695,0.031675636768341064,0.044998399913311005,0.0773230791091919,0.09698063135147095,0.04795682430267334,0.24626600742340088,0.6835960149765015,0.023583319038152695,0.031675636768341064,0.0850236713886261,0.044828593730926514,0.437734991312027,0.46996796131134033,0.036334652453660965,0.08005297183990479,0.036334652453660965,0.08005297183990479,0.07098956406116486,0.10979831218719482,0.006182555109262466,0.031673967838287354,0.05055436119437218,0.10979831218719482,0.3786180019378662,0.1835920214653015,0.08398512005805969,0.10979831218719482,0.08398512005805969,0.10979831218719482,0.05055436119437218,0.10979831218719482,0.03930313140153885,0.04638850688934326,0.04482320323586464,0.008966565132141113,0.04482320323586464,0.008966565132141113,0.6875,0.4695960283279419,0.02358332648873329,0.013669490814208984,0.04086293280124664,0.04638850688934326,0.04086293280124664,0.04638850688934326,0.024934161454439163,0.012889564037322998,0.0625,0.3453270196914673,0.11106422543525696,0.04638880491256714,0.018139638006687164,0.04338186979293823,0.018139638006687164,0.04338186979293823,0.07654549926519394,0.07732349634170532,0.04086294770240784,0.008966505527496338,0.0034920000471174717,0.3085939884185791,0.018139638006687164,0.04338186979293823,0.007533375173807144,0.008331894874572754,0.6874989867210388,0.21995800733566284,0.05366221442818642,0.07732349634170532,0.028895026072859764,0.07694411277770996,0.05366221442818642,0.07732349634170532,0.028895026072859764,0.07694411277770996,0.06294332444667816,0.04638826847076416,0.1875,0.34528303146362305,0.027670973911881447,0.07694411277770996,0.006182555109262466,0.009111762046813965,0.07398355007171631,0.04638838768005371,0.12210451066493988,0.046389102935791016,0.12210451066493988,0.046389102935791016,0.12875600159168243,0.5585910081863403,0.07398355007171631,0.04638838768005371,0.006182555109262466,0.03815799951553345,0.06250099837779999,0.39662301540374756,0.0905437171459198,0.04638838768005371,0.040666673332452774,0.10979831218719482,0.040666673332452774,0.10979831218719482,0.0905437171459198,0.04638838768005371,0.012844454497098923,0.009891688823699951,0.011493615806102753,0.009111762046813965,0.4374989867210388,0.5956270098686218,0.08520913124084473,0.08043140172958374,0.08520913124084473,0.08043140172958374,0.04189063608646393,0.10979831218719482,0.008582908660173416,0.03893798589706421,0.11814413964748383,0.04638892412185669,0.6284400224685669,0.5585929751396179,0.10158386081457138,0.00896674394607544,0.10158386081457138,0.00896674394607544,0.11814413964748383,0.04638892412185669,0.06232590600848198,0.10979831218719482,0.04638301953673363,0.04638856649398804,0.04638301953673363,0.04638856649398804,0.7463849782943726,0.058596014976501465,0.06232590600848198,0.10979831218719482,0.01722273975610733,0.031675636768341064,0.04189063608646393,0.08043086528778076,0.04189063608646393,0.08043086528778076,0.0635499358177185,0.10979831218719482,0.3780120015144348,0.5585929751396179,0.018139611929655075,0.030413687229156494,0.018139611929655075,0.030413687229156494,0.017222747206687927,0.038159728050231934,0.08954101800918579,0.047956764698028564,0.7459149956703186,0.18359500169754028,0.05366213247179985,0.04795628786087036,0.017222747206687927,0.038159728050231934,0.023583341389894485,0.04464375972747803,0.25325098633766174,0.18358999490737915,0.0795036107301712,0.04638838768005371,0.10253656655550003,0.08043175935745239,0.10253656655550003,0.08043175935745239,0.0795036107301712,0.04638838768005371,0.08087733387947083,0.07732349634170532,0.10710396617650986,0.008966803550720215,0.10710396617650986,0.008966803550720215,0.5624989867210388,0.5953620076179504,0.01962309330701828,0.014449357986450195,0.025983653962612152,0.02597147226333618,0.025983653962612152,0.02597147226333618,0.10131251811981201,0.04795682430267334,0.5034360289573669,0.5585929751396179,0.08087733387947083,0.04795646667480469,0.08087733387947083,0.04795646667480469,0.10131251811981201,0.04795682430267334,0.37854599952697754,0.4331200122833252,0.01326248049736023,0.04590487480163574,0.019313467666506767,0.08005118370056152,0.03664000332355499,0.10979831218719482,0.019313467666506767,0.08005118370056152,0.029636148363351822,0.018707633018493652,0.25348299741744995,0.3081200122833252,0.02889440953731537,0.019728541374206543,0.024257240816950798,0.10979831218719482,0.02797701396048069,0.10979831218719482,0.02797701396048069,0.10979831218719482,0.02889440953731537,0.01894855499267578,0.028589049354195595,0.10979831218719482,0.621649980545044,0.18359601497650146,0.02889440953731537,0.01894855499267578,0.019925372675061226,0.08005118370056152,0.561972975730896,0.22008800506591797,0.02889503724873066,0.08005237579345703,0.02889503724873066,0.08005237579345703,0.007533404976129532,0.02645176649093628,0.06788178533315659,0.07732349634170532,0.06788178533315659,0.07732349634170532,0.007533404976129532,0.024891972541809082,0.06665770709514618,0.07732349634170532,0.3125,0.0952489972114563,0.09264882653951645,0.08043169975280762,0.0036299999337643385,0.5585929751396179,0.04622241482138634,0.08043122291564941,0.03200281038880348,0.047577738761901855,0.024500224739313126,0.03942161798477173,0.12137000262737274,0.5585950016975403,0.024563191458582878,0.047576963901519775,0.059218067675828934,0.07732349634170532,0.01962307095527649,0.025971412658691406],\n \"normalized\": false\n }\n },\n \"index\": {\n \"type\": \"Uint16Array\",\n \"array\": [28,234,182,303,269,285,521,391,482,142,593,355,209,84,89,440,512,467,168,146,454,320,118,222,535,280,109,40,32,563,488,479,398,419,273,186,541,74,78,326,69,331,240,435,295,473,26,178,626,53,309,51,436,448,96,97,103,255,422,45,5,618,615,65,508,264,284,376,373,315,160,632,550,126,237,254,61,366,499,344,348,165,408,414,557,201,576,506,431,365,329,95,140,145,406,36,578,572,486,16,302,296,72,59,68,158,163,169,177,179,603,62,594,0,393,48,489,352,350,76,543,346,534,378,197,437,528,417,42,480,477,212,613,173,607,230,223,635,595,102,111,555,432,556,494,507,232,86,289,218,314,121,100,244,30,27,407,252,259,304,55,325,157,147,374,396,11,154,14,270,41,271,279,122,330,129,341,522,281,525,624,82,621,427,421,387,199,447,438,495,260,511,80,313,85,573,552,560,501,426,429,43,410,258,187,389,420,248,424,390,493,445,465,347,540,77,411,131,251,462,474,481,12,565,155,150,283,372,490,217,392,587,71,66,386,402,144,161,453,634,58,363,367,94,597,141,277,238,125,3,600,8,136,319,98,300,498,233,17,538,345,324,202,115,394,548,49,318,220,119,33,456,143,335,56,128,39,225,460,91,336,134,198,567,575,361,537,107,383,166,416,404,562,35,189,123,192,211,174,610,116,101,120,208,397,478,515,559,434,226,321,221,306,311,54,620,612,614,369,257,253,291,554,235,139,586,327,245,524,531,268,216,287,569,520,484,23,513,243,622,204,625,1,604,64,545,379,439,592,263,356,509,181,231,25,184,172,297,242,293,503,276,272,405,526,151,159,337,164,28,298,234,303,227,269,521,247,391,142,598,593,209,608,84,468,464,451,450,444,470,168,384,146,320,117,118,535,581,280,40,461,32,488,463,479,419,505,273,541,360,74,326,585,69,240,514,435,473,472,26,626,206,53,51,547,436,96,137,97,255,430,422,5,10,618,65,602,508,284,570,376,315,628,160,550,191,126,254,130,61,499,18,344,165,338,408,557,441,201,358,106,364,110,502,370,185,195,487,194,577,485,239,583,292,579,21,290,79,584,357,354,265,351,46,250,529,533,381,413,616,609,175,457,458,635,458,230,635,112,207,9,6,596,113,219,400,90,87,308,288,371,549,152,153,561,148,396,215,11,631,135,342,132,332,340,200,443,446,496,349,261,81,627,310,574,193,553,504,418,425,47,415,409,190,483,388,246,44,423,492,50,449,347,343,540,412,339,127,466,469,476,15,38,564,150,527,283,491,399,213,588,75,70,385,530,403,162,171,452,60,73,359,93,105,601,275,580,236,2,590,599,133,630,317,299,19,497,20,582,536,323,52,205,395,156,544,316,633,224,34,459,455,333,67,57,37,266,229,92,328,334,196,377,571,362,542,539,382,170,167,401,149,566,188,274,124,210,475,176,114,104,99,208,88,397,516,442,558,228,307,322,305,286,312,619,83,611,368,428,256,294,433,551,138,353,589,249,518,523,267,13,214,568,282,519,22,471,517,623,7,203,4,617,606,546,375,380,591,63,262,510,605,180,24,31,183,301,29,241,500,108,278,405,532,526,159,629,337]\n },\n \"boundingSphere\": {\n \"center\": [0,0,-0.00000762939453125],\n \"radius\": 160.50603975869993\n }\n },\n faceValues: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30],\n rotationCombinations: {\n \"1,2\": [-58, -18, -148],\n \"1,3\": [122, -18, 32],\n \"1,4\": [-159, 30, -69],\n \"1,5\": [21, 150, -69],\n \"1,6\": [21, -30, 69],\n \"1,7\": [0, 90, -90],\n \"1,8\": [122, 18, -32],\n \"1,9\": [-58, 126, 32],\n \"1,10\": [58, 54, 148],\n \"1,11\": [-122, -18, -32],\n \"1,12\": [159, 30, 69],\n \"1,13\": [58, 54, -32],\n \"1,14\": [-58, 54, 32],\n \"1,15\": [90, 0, 90],\n \"1,16\": [-90, 0, -90],\n \"1,17\": [122, 54, 32],\n \"1,18\": [-122, 54, -32],\n \"1,19\": [-21, 30, 69],\n \"1,20\": [58, -18, -32],\n \"1,21\": [58, 126, -32],\n \"1,22\": [-58, 54, -148],\n \"1,23\": [-58, 18, -32],\n \"1,24\": [0, 90, 90],\n \"1,25\": [-21, 30, -111],\n \"1,26\": [21, 30, 111],\n \"1,27\": [-21, -150, -69],\n \"1,28\": [-58, -18, 32],\n \"1,29\": [58, 18, 32],\n \"1,30\": [-180, 0, 0],\n \"2,3\": [-21, 150, 69],\n \"2,4\": [-58, -126, -32],\n \"2,5\": [122, -54, -32],\n \"2,6\": [-58, 54, -148],\n \"2,7\": [-122, -54, 32],\n \"2,8\": [0, -180, 0],\n \"2,9\": [-159, -30, 69],\n \"2,10\": [-122, -18, -32],\n \"2,11\": [58, -18, 148],\n \"2,12\": [159, -30, -69],\n \"2,13\": [58, -162, -32],\n \"2,14\": [-58, -54, 148],\n \"2,15\": [-159, 30, -69],\n \"2,16\": [21, -30, 69],\n \"2,17\": [21, -150, 69],\n \"2,18\": [0, -90, 90],\n \"2,19\": [-58, -18, -148],\n \"2,20\": [58, 126, -32],\n \"2,21\": [0, -90, -90],\n \"2,22\": [-58, -54, -32],\n \"2,23\": [-21, -30, 111],\n \"2,24\": [58, -126, 32],\n \"2,25\": [-58, -18, 32],\n \"2,26\": [-90, 0, -90],\n \"2,27\": [122, 18, -32],\n \"2,28\": [0, 0, -180],\n \"2,29\": [58, 162, 32],\n \"2,30\": [-58, -162, 32],\n \"3,4\": [90, 0, -90],\n \"3,5\": [90, 0, 90],\n \"3,6\": [-90, 0, 90],\n \"3,7\": [122, 54, 32],\n \"3,8\": [21, 30, -69],\n \"3,9\": [58, 54, 148],\n \"3,10\": [0, 90, 90],\n \"3,11\": [122, -54, -32],\n \"3,12\": [58, 18, 32],\n \"3,13\": [0, 90, -90],\n \"3,14\": [159, 30, 69],\n \"3,15\": [-21, 30, 69],\n \"3,16\": [159, -30, -69],\n \"3,17\": [58, 54, -32],\n \"3,18\": [122, 18, -32],\n \"3,19\": [21, 150, -69],\n \"3,20\": [-58, 18, -32],\n \"3,21\": [-58, 162, -32],\n \"3,22\": [-21, 150, 69],\n \"3,23\": [180, 0, 0],\n \"3,24\": [-58, 126, 32],\n \"3,25\": [-159, 30, -69],\n \"3,26\": [58, 126, -32],\n \"3,27\": [21, -30, 69],\n \"3,28\": [-159, -30, 69],\n \"3,29\": [-58, 54, 32],\n \"3,30\": [58, -18, -32],\n \"4,5\": [0, 0, 180],\n \"4,6\": [180, 0, 0],\n \"4,7\": [-58, 18, 148],\n \"4,8\": [-58, -54, -32],\n \"4,9\": [-58, -18, -148],\n \"4,10\": [-90, 0, 90],\n \"4,11\": [58, 18, 32],\n \"4,12\": [-21, -30, 111],\n \"4,13\": [-90, 0, -90],\n \"4,14\": [-58, 54, -148],\n \"4,15\": [-122, -54, 32],\n \"4,16\": [58, 54, -32],\n \"4,17\": [-58, -18, 32],\n \"4,18\": [-21, 30, 69],\n \"4,19\": [-122, 54, -32],\n \"4,20\": [21, -150, 69],\n \"4,21\": [-21, 30, -111],\n \"4,22\": [-58, 54, 32],\n \"4,23\": [0, 90, 90],\n \"4,24\": [-58, 18, -32],\n \"4,25\": [58, 126, -32],\n \"4,26\": [-122, 18, 32],\n \"4,27\": [58, -54, -148],\n \"4,28\": [122, 54, 32],\n \"4,29\": [-122, -18, -32],\n \"4,30\": [21, -30, 69],\n \"5,6\": [0, 180, 0],\n \"5,7\": [58, -18, -32],\n \"5,8\": [58, 54, 148],\n \"5,9\": [58, 18, 32],\n \"5,10\": [90, 0, -90],\n \"5,11\": [-58, -18, -148],\n \"5,12\": [21, 30, -69],\n \"5,13\": [90, 0, 90],\n \"5,14\": [58, -54, 32],\n \"5,15\": [-58, 126, 32],\n \"5,16\": [-58, -54, 148],\n \"5,17\": [58, 18, -148],\n \"5,18\": [21, -30, -111],\n \"5,19\": [-58, -126, -32],\n \"5,20\": [159, 30, 69],\n \"5,21\": [21, -30, 69],\n \"5,22\": [58, -54, -148],\n \"5,23\": [0, -90, -90],\n \"5,24\": [58, -18, 148],\n \"5,25\": [122, -54, -32],\n \"5,26\": [-58, -162, 32],\n \"5,27\": [-58, 54, 32],\n \"5,28\": [58, -126, 32],\n \"5,29\": [-58, 162, -32],\n \"5,30\": [-21, 30, -111],\n \"6,7\": [-58, 162, -32],\n \"6,8\": [122, -54, -32],\n \"6,9\": [-58, -162, 32],\n \"6,10\": [90, 0, 90],\n \"6,11\": [-122, 18, 32],\n \"6,12\": [-21, -150, -69],\n \"6,13\": [90, 0, -90],\n \"6,14\": [-58, 126, 32],\n \"6,15\": [58, -54, 32],\n \"6,16\": [-122, 54, -32],\n \"6,17\": [122, -18, 32],\n \"6,18\": [159, 30, 69],\n \"6,19\": [58, 54, -32],\n \"6,20\": [21, -30, -111],\n \"6,21\": [-21, 150, 69],\n \"6,22\": [122, 54, 32],\n \"6,23\": [0, 90, -90],\n \"6,24\": [122, 18, -32],\n \"6,25\": [58, 54, 148],\n \"6,26\": [58, 18, 32],\n \"6,27\": [58, -126, 32],\n \"6,28\": [-58, 54, 32],\n \"6,29\": [58, -18, -32],\n \"6,30\": [-159, -30, 69],\n \"7,8\": [-58, 54, -148],\n \"7,9\": [-21, 30, 69],\n \"7,10\": [21, 30, -69],\n \"7,11\": [58, -126, 32],\n \"7,12\": [-58, 18, -32],\n \"7,13\": [21, 30, 111],\n \"7,14\": [21, -30, 69],\n \"7,15\": [0, 90, -90],\n \"7,16\": [0, -90, -90],\n \"7,17\": [-21, 30, -111],\n \"7,18\": [-21, -30, -69],\n \"7,19\": [58, -18, 148],\n \"7,20\": [122, 54, 32],\n \"7,21\": [-21, -30, 111],\n \"7,22\": [21, -30, -111],\n \"7,23\": [58, -54, 32],\n \"7,24\": [0, 0, 180],\n \"7,25\": [58, -18, -32],\n \"7,26\": [58, 18, -148],\n \"7,27\": [-122, 18, 32],\n \"7,28\": [-58, -126, -32],\n \"7,29\": [58, 54, 148],\n \"7,30\": [-90, 0, -90],\n \"8,9\": [-21, 30, -111],\n \"8,10\": [-58, 18, 148],\n \"8,11\": [122, 18, -32],\n \"8,12\": [21, 30, 111],\n \"8,13\": [-58, 18, -32],\n \"8,14\": [-122, 54, -32],\n \"8,15\": [-21, -30, 111],\n \"8,16\": [-21, 150, 69],\n \"8,17\": [-21, 30, 69],\n \"8,18\": [0, 90, 90],\n \"8,19\": [-122, 18, 32],\n \"8,20\": [-58, -54, -32],\n \"8,21\": [0, 90, -90],\n \"8,22\": [58, 126, -32],\n \"8,23\": [-159, 30, -69],\n \"8,24\": [-58, 54, 32],\n \"8,25\": [58, 162, 32],\n \"8,26\": [-90, 0, 90],\n \"8,27\": [58, -18, 148],\n \"8,28\": [180, 0, 0],\n \"8,29\": [-58, -18, 32],\n \"8,30\": [58, 18, 32],\n \"9,10\": [21, -30, -111],\n \"9,11\": [58, 162, 32],\n \"9,12\": [-21, 30, -111],\n \"9,13\": [21, -30, 69],\n \"9,14\": [-58, -54, -32],\n \"9,15\": [58, 18, -148],\n \"9,16\": [58, -162, -32],\n \"9,17\": [0, 0, -180],\n \"9,18\": [-58, -18, -148],\n \"9,19\": [0, -90, 90],\n \"9,20\": [90, 0, 90],\n \"9,21\": [-58, -18, 32],\n \"9,22\": [-58, -54, 148],\n \"9,23\": [58, -126, 32],\n \"9,24\": [-21, -30, 111],\n \"9,25\": [0, -90, -90],\n \"9,26\": [58, -54, -148],\n \"9,27\": [0, 90, -90],\n \"9,28\": [21, -150, 69],\n \"9,29\": [58, -18, 148],\n \"9,30\": [-58, 54, -148],\n \"10,11\": [-21, -150, -69],\n \"10,12\": [-58, -54, -32],\n \"10,13\": [0, 0, 180],\n \"10,14\": [58, -18, 148],\n \"10,15\": [-58, 18, -32],\n \"10,16\": [122, -18, 32],\n \"10,17\": [-21, -30, -69],\n \"10,18\": [58, -54, 32],\n \"10,19\": [58, 18, -148],\n \"10,20\": [-58, 54, -148],\n \"10,21\": [58, -54, -148],\n \"10,22\": [58, -18, -32],\n \"10,23\": [90, 0, 90],\n \"10,24\": [21, -30, -111],\n \"10,25\": [58, 18, 32],\n \"10,26\": [21, 30, -69],\n \"10,27\": [-122, -18, -32],\n \"10,28\": [-58, 162, -32],\n \"10,29\": [-21, 30, -111],\n \"10,30\": [58, -126, 32],\n \"11,12\": [-90, 0, 90],\n \"11,13\": [-159, 30, -69],\n \"11,14\": [0, 90, 90],\n \"11,15\": [-159, -30, 69],\n \"11,16\": [21, 30, -69],\n \"11,17\": [-122, 18, 32],\n \"11,18\": [-58, 54, 32],\n \"11,19\": [122, 54, 32],\n \"11,20\": [159, -30, -69],\n \"11,21\": [-58, 54, -148],\n \"11,22\": [0, 90, -90],\n \"11,23\": [58, 54, -32],\n \"11,24\": [-122, 54, -32],\n \"11,25\": [-58, 126, 32],\n \"11,26\": [159, 30, 69],\n \"11,27\": [-58, -54, 148],\n \"11,28\": [58, 18, 32],\n \"11,29\": [-180, 0, 0],\n \"11,30\": [-58, -18, 32],\n \"12,13\": [58, 54, 148],\n \"12,14\": [90, 0, 90],\n \"12,15\": [-58, 54, 32],\n \"12,16\": [122, -54, -32],\n \"12,17\": [21, 30, -69],\n \"12,18\": [58, -18, -32],\n \"12,19\": [-58, 162, -32],\n \"12,20\": [-122, 54, -32],\n \"12,21\": [58, -18, 148],\n \"12,22\": [90, 0, -90],\n \"12,23\": [122, -18, 32],\n \"12,24\": [58, 18, -148],\n \"12,25\": [122, 18, -32],\n \"12,26\": [-58, 126, 32],\n \"12,27\": [-58, -18, 32],\n \"12,28\": [-21, -150, -69],\n \"12,29\": [0, 90, -90],\n \"12,30\": [-21, -30, -69],\n \"13,14\": [-58, 18, -32],\n \"13,15\": [58, -18, 148],\n \"13,16\": [58, 162, 32],\n \"13,17\": [21, 30, 111],\n \"13,18\": [-58, 54, -148],\n \"13,19\": [-58, -18, 32],\n \"13,20\": [58, -54, 32],\n \"13,21\": [-58, 54, 32],\n \"13,22\": [-58, 18, 148],\n \"13,23\": [-90, 0, -90],\n \"13,24\": [-21, 30, 69],\n \"13,25\": [-58, -18, -148],\n \"13,26\": [-21, -30, 111],\n \"13,27\": [-58, 162, -32],\n \"13,28\": [-122, -18, -32],\n \"13,29\": [21, -30, 69],\n \"13,30\": [122, 54, 32],\n \"14,15\": [-58, 162, -32],\n \"14,16\": [-58, -18, -148],\n \"14,17\": [58, 54, 148],\n \"14,18\": [-21, 30, -111],\n \"14,19\": [21, -30, 69],\n \"14,20\": [122, -18, 32],\n \"14,21\": [-21, 30, 69],\n \"14,22\": [0, 0, 180],\n \"14,23\": [-21, -30, -69],\n \"14,24\": [21, 30, 111],\n \"14,25\": [21, -30, -111],\n \"14,26\": [58, -18, 148],\n \"14,27\": [21, 150, -69],\n \"14,28\": [-58, -54, -32],\n \"14,29\": [90, 0, 90],\n \"14,30\": [-122, 54, -32],\n \"15,16\": [180, 0, 0],\n \"15,17\": [58, -18, -32],\n \"15,18\": [122, -18, 32],\n \"15,19\": [-58, 126, 32],\n \"15,20\": [-21, 30, -111],\n \"15,21\": [-58, -162, 32],\n \"15,22\": [122, 18, -32],\n \"15,23\": [159, 30, 69],\n \"15,24\": [90, 0, -90],\n \"15,25\": [122, 54, 32],\n \"15,26\": [58, 54, -32],\n \"15,27\": [-58, -54, -32],\n \"15,28\": [21, 150, -69],\n \"15,29\": [21, 30, -69],\n \"15,30\": [0, -90, -90],\n \"16,17\": [-122, -18, -32],\n \"16,18\": [-58, -18, 32],\n \"16,19\": [-58, 54, -148],\n \"16,20\": [-21, 150, 69],\n \"16,21\": [-58, -18, -148],\n \"16,22\": [-58, 18, -32],\n \"16,23\": [-21, 30, 69],\n \"16,24\": [-90, 0, -90],\n \"16,25\": [-58, 54, 32],\n \"16,26\": [-122, 54, -32],\n \"16,27\": [122, -54, -32],\n \"16,28\": [21, 30, 111],\n \"16,29\": [-159, 30, -69],\n \"16,30\": [0, -90, 90],\n \"17,18\": [58, 18, 32],\n \"17,19\": [0, 90, -90],\n \"17,20\": [-90, 0, -90],\n \"17,21\": [58, 18, -148],\n \"17,22\": [58, 54, -32],\n \"17,23\": [122, 54, 32],\n \"17,24\": [21, 30, -69],\n \"17,25\": [0, 90, 90],\n \"17,26\": [-58, 54, 32],\n \"17,27\": [0, -90, 90],\n \"17,28\": [159, 30, 69],\n \"17,29\": [-58, 18, -32],\n \"17,30\": [58, -54, 32],\n \"18,19\": [58, 54, 148],\n \"18,20\": [-159, 30, -69],\n \"18,21\": [0, 0, -180],\n \"18,22\": [21, 30, -69],\n \"18,23\": [58, 18, 32],\n \"18,24\": [-21, 30, -111],\n \"18,25\": [58, 54, -32],\n \"18,26\": [0, 90, -90],\n \"18,27\": [-122, -54, 32],\n \"18,28\": [90, 0, 90],\n \"18,29\": [-122, 54, -32],\n \"18,30\": [-58, -54, -32],\n \"19,20\": [0, -90, -90],\n \"19,21\": [58, 54, -32],\n \"19,22\": [21, 30, 111],\n \"19,23\": [-21, 30, -111],\n \"19,24\": [58, 18, 32],\n \"19,25\": [0, 0, 180],\n \"19,26\": [21, -30, 69],\n \"19,27\": [0, 180, 0],\n \"19,28\": [-58, 18, -32],\n \"19,29\": [58, -54, 32],\n \"19,30\": [159, 30, 69],\n \"20,21\": [21, 150, -69],\n \"20,22\": [58, 162, 32],\n \"20,23\": [-122, -18, -32],\n \"20,24\": [58, 126, -32],\n \"20,25\": [-90, 0, -90],\n \"20,26\": [-58, 18, 148],\n \"20,27\": [90, 0, 90],\n \"20,28\": [-122, -54, 32],\n \"20,29\": [-21, 30, 69],\n \"20,30\": [122, 18, -32],\n \"21,22\": [-21, -30, 111],\n \"21,23\": [-58, -18, -148],\n \"21,24\": [21, -30, 69],\n \"21,25\": [-58, -54, 148],\n \"21,26\": [0, -90, 90],\n \"21,27\": [-58, 126, 32],\n \"21,28\": [-90, 0, -90],\n \"21,29\": [-58, -126, -32],\n \"21,30\": [58, 54, 148],\n \"22,23\": [21, 30, 111],\n \"22,24\": [-21, -30, -69],\n \"22,25\": [-21, 30, 69],\n \"22,26\": [-58, 18, -32],\n \"22,27\": [159, -30, -69],\n \"22,28\": [58, 54, 148],\n \"22,29\": [-90, 0, -90],\n \"22,30\": [-58, -126, -32],\n \"23,24\": [-58, 54, -148],\n \"23,25\": [21, 30, -69],\n \"23,26\": [58, 54, 148],\n \"23,27\": [-159, -30, 69],\n \"23,28\": [21, -30, 69],\n \"23,29\": [122, 54, 32],\n \"23,30\": [-122, -18, -32],\n \"24,25\": [-58, 18, 148],\n \"24,26\": [-58, -18, 32],\n \"24,27\": [-58, -162, 32],\n \"24,28\": [-122, 54, -32],\n \"24,29\": [-58, -54, -32],\n \"24,30\": [90, 0, 90],\n \"25,26\": [-21, 30, -111],\n \"25,27\": [-180, 0, 0],\n \"25,28\": [58, -18, 148],\n \"25,29\": [-58, 54, -148],\n \"25,30\": [21, -150, 69],\n \"26,27\": [21, -150, 69],\n \"26,28\": [0, 90, -90],\n \"26,29\": [-21, -30, -69],\n \"26,30\": [-21, -150, -69],\n \"27,28\": [58, -162, -32],\n \"27,29\": [-58, 126, 32],\n \"27,30\": [21, -30, -111],\n \"28,29\": [122, -18, 32],\n \"28,30\": [-122, 18, 32],\n \"29,30\": [122, -18, 32]\n }\n }\n};\n","import {\n\tAnimationClip,\n\tBone,\n\tBox3,\n\tBufferAttribute,\n\tBufferGeometry,\n\tClampToEdgeWrapping,\n\tColor,\n\tDirectionalLight,\n\tDoubleSide,\n\tFileLoader,\n\tFrontSide,\n\tGroup,\n\tImageBitmapLoader,\n\tInterleavedBuffer,\n\tInterleavedBufferAttribute,\n\tInterpolant,\n\tInterpolateDiscrete,\n\tInterpolateLinear,\n\tLine,\n\tLineBasicMaterial,\n\tLineLoop,\n\tLineSegments,\n\tLinearFilter,\n\tLinearMipmapLinearFilter,\n\tLinearMipmapNearestFilter,\n\tLoader,\n\tLoaderUtils,\n\tMaterial,\n\tMathUtils,\n\tMatrix4,\n\tMesh,\n\tMeshBasicMaterial,\n\tMeshPhysicalMaterial,\n\tMeshStandardMaterial,\n\tMirroredRepeatWrapping,\n\tNearestFilter,\n\tNearestMipmapLinearFilter,\n\tNearestMipmapNearestFilter,\n\tNumberKeyframeTrack,\n\tObject3D,\n\tOrthographicCamera,\n\tPerspectiveCamera,\n\tPointLight,\n\tPoints,\n\tPointsMaterial,\n\tPropertyBinding,\n\tQuaternion,\n\tQuaternionKeyframeTrack,\n\tRepeatWrapping,\n\tSkeleton,\n\tSkinnedMesh,\n\tSphere,\n\tSpotLight,\n\tTangentSpaceNormalMap,\n\tTexture,\n\tTextureLoader,\n\tTriangleFanDrawMode,\n\tTriangleStripDrawMode,\n\tVector2,\n\tVector3,\n\tVectorKeyframeTrack,\n\tsRGBEncoding\n} from 'three';\n\nclass GLTFLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\tthis.dracoLoader = null;\n\t\tthis.ktx2Loader = null;\n\t\tthis.meshoptDecoder = null;\n\n\t\tthis.pluginCallbacks = [];\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsClearcoatExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFTextureBasisUExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFTextureWebPExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsSheenExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsTransmissionExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsVolumeExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsIorExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsEmissiveStrengthExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsSpecularExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsIridescenceExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFLightsExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMeshoptCompression( parser );\n\n\t\t} );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tlet resourcePath;\n\n\t\tif ( this.resourcePath !== '' ) {\n\n\t\t\tresourcePath = this.resourcePath;\n\n\t\t} else if ( this.path !== '' ) {\n\n\t\t\tresourcePath = this.path;\n\n\t\t} else {\n\n\t\t\tresourcePath = LoaderUtils.extractUrlBase( url );\n\n\t\t}\n\n\t\t// Tells the LoadingManager to track an extra item, which resolves after\n\t\t// the model is fully loaded. This means the count of items loaded will\n\t\t// be incorrect, but ensures manager.onLoad() does not fire early.\n\t\tthis.manager.itemStart( url );\n\n\t\tconst _onError = function ( e ) {\n\n\t\t\tif ( onError ) {\n\n\t\t\t\tonError( e );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( e );\n\n\t\t\t}\n\n\t\t\tscope.manager.itemError( url );\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t};\n\n\t\tconst loader = new FileLoader( this.manager );\n\n\t\tloader.setPath( this.path );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\n\t\tloader.load( url, function ( data ) {\n\n\t\t\ttry {\n\n\t\t\t\tscope.parse( data, resourcePath, function ( gltf ) {\n\n\t\t\t\t\tonLoad( gltf );\n\n\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t}, _onError );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\t_onError( e );\n\n\t\t\t}\n\n\t\t}, onProgress, _onError );\n\n\t}\n\n\tsetDRACOLoader( dracoLoader ) {\n\n\t\tthis.dracoLoader = dracoLoader;\n\t\treturn this;\n\n\t}\n\n\tsetDDSLoader() {\n\n\t\tthrow new Error(\n\n\t\t\t'THREE.GLTFLoader: \"MSFT_texture_dds\" no longer supported. Please update to \"KHR_texture_basisu\".'\n\n\t\t);\n\n\t}\n\n\tsetKTX2Loader( ktx2Loader ) {\n\n\t\tthis.ktx2Loader = ktx2Loader;\n\t\treturn this;\n\n\t}\n\n\tsetMeshoptDecoder( meshoptDecoder ) {\n\n\t\tthis.meshoptDecoder = meshoptDecoder;\n\t\treturn this;\n\n\t}\n\n\tregister( callback ) {\n\n\t\tif ( this.pluginCallbacks.indexOf( callback ) === - 1 ) {\n\n\t\t\tthis.pluginCallbacks.push( callback );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tunregister( callback ) {\n\n\t\tif ( this.pluginCallbacks.indexOf( callback ) !== - 1 ) {\n\n\t\t\tthis.pluginCallbacks.splice( this.pluginCallbacks.indexOf( callback ), 1 );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tparse( data, path, onLoad, onError ) {\n\n\t\tlet content;\n\t\tconst extensions = {};\n\t\tconst plugins = {};\n\n\t\tif ( typeof data === 'string' ) {\n\n\t\t\tcontent = data;\n\n\t\t} else {\n\n\t\t\tconst magic = LoaderUtils.decodeText( new Uint8Array( data, 0, 4 ) );\n\n\t\t\tif ( magic === BINARY_EXTENSION_HEADER_MAGIC ) {\n\n\t\t\t\ttry {\n\n\t\t\t\t\textensions[ EXTENSIONS.KHR_BINARY_GLTF ] = new GLTFBinaryExtension( data );\n\n\t\t\t\t} catch ( error ) {\n\n\t\t\t\t\tif ( onError ) onError( error );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tcontent = extensions[ EXTENSIONS.KHR_BINARY_GLTF ].content;\n\n\t\t\t} else {\n\n\t\t\t\tcontent = LoaderUtils.decodeText( new Uint8Array( data ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst json = JSON.parse( content );\n\n\t\tif ( json.asset === undefined || json.asset.version[ 0 ] < 2 ) {\n\n\t\t\tif ( onError ) onError( new Error( 'THREE.GLTFLoader: Unsupported asset. glTF versions >=2.0 are supported.' ) );\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst parser = new GLTFParser( json, {\n\n\t\t\tpath: path || this.resourcePath || '',\n\t\t\tcrossOrigin: this.crossOrigin,\n\t\t\trequestHeader: this.requestHeader,\n\t\t\tmanager: this.manager,\n\t\t\tktx2Loader: this.ktx2Loader,\n\t\t\tmeshoptDecoder: this.meshoptDecoder\n\n\t\t} );\n\n\t\tparser.fileLoader.setRequestHeader( this.requestHeader );\n\n\t\tfor ( let i = 0; i < this.pluginCallbacks.length; i ++ ) {\n\n\t\t\tconst plugin = this.pluginCallbacks[ i ]( parser );\n\t\t\tplugins[ plugin.name ] = plugin;\n\n\t\t\t// Workaround to avoid determining as unknown extension\n\t\t\t// in addUnknownExtensionsToUserData().\n\t\t\t// Remove this workaround if we move all the existing\n\t\t\t// extension handlers to plugin system\n\t\t\textensions[ plugin.name ] = true;\n\n\t\t}\n\n\t\tif ( json.extensionsUsed ) {\n\n\t\t\tfor ( let i = 0; i < json.extensionsUsed.length; ++ i ) {\n\n\t\t\t\tconst extensionName = json.extensionsUsed[ i ];\n\t\t\t\tconst extensionsRequired = json.extensionsRequired || [];\n\n\t\t\t\tswitch ( extensionName ) {\n\n\t\t\t\t\tcase EXTENSIONS.KHR_MATERIALS_UNLIT:\n\t\t\t\t\t\textensions[ extensionName ] = new GLTFMaterialsUnlitExtension();\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS:\n\t\t\t\t\t\textensions[ extensionName ] = new GLTFMaterialsPbrSpecularGlossinessExtension();\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase EXTENSIONS.KHR_DRACO_MESH_COMPRESSION:\n\t\t\t\t\t\textensions[ extensionName ] = new GLTFDracoMeshCompressionExtension( json, this.dracoLoader );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase EXTENSIONS.KHR_TEXTURE_TRANSFORM:\n\t\t\t\t\t\textensions[ extensionName ] = new GLTFTextureTransformExtension();\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase EXTENSIONS.KHR_MESH_QUANTIZATION:\n\t\t\t\t\t\textensions[ extensionName ] = new GLTFMeshQuantizationExtension();\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tif ( extensionsRequired.indexOf( extensionName ) >= 0 && plugins[ extensionName ] === undefined ) {\n\n\t\t\t\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Unknown extension \"' + extensionName + '\".' );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tparser.setExtensions( extensions );\n\t\tparser.setPlugins( plugins );\n\t\tparser.parse( onLoad, onError );\n\n\t}\n\n\tparseAsync( data, path ) {\n\n\t\tconst scope = this;\n\n\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\tscope.parse( data, path, resolve, reject );\n\n\t\t} );\n\n\t}\n\n}\n\n/* GLTFREGISTRY */\n\nfunction GLTFRegistry() {\n\n\tlet objects = {};\n\n\treturn\t{\n\n\t\tget: function ( key ) {\n\n\t\t\treturn objects[ key ];\n\n\t\t},\n\n\t\tadd: function ( key, object ) {\n\n\t\t\tobjects[ key ] = object;\n\n\t\t},\n\n\t\tremove: function ( key ) {\n\n\t\t\tdelete objects[ key ];\n\n\t\t},\n\n\t\tremoveAll: function () {\n\n\t\t\tobjects = {};\n\n\t\t}\n\n\t};\n\n}\n\n/*********************************/\n/********** EXTENSIONS ***********/\n/*********************************/\n\nconst EXTENSIONS = {\n\tKHR_BINARY_GLTF: 'KHR_binary_glTF',\n\tKHR_DRACO_MESH_COMPRESSION: 'KHR_draco_mesh_compression',\n\tKHR_LIGHTS_PUNCTUAL: 'KHR_lights_punctual',\n\tKHR_MATERIALS_CLEARCOAT: 'KHR_materials_clearcoat',\n\tKHR_MATERIALS_IOR: 'KHR_materials_ior',\n\tKHR_MATERIALS_PBR_SPECULAR_GLOSSINESS: 'KHR_materials_pbrSpecularGlossiness',\n\tKHR_MATERIALS_SHEEN: 'KHR_materials_sheen',\n\tKHR_MATERIALS_SPECULAR: 'KHR_materials_specular',\n\tKHR_MATERIALS_TRANSMISSION: 'KHR_materials_transmission',\n\tKHR_MATERIALS_IRIDESCENCE: 'KHR_materials_iridescence',\n\tKHR_MATERIALS_UNLIT: 'KHR_materials_unlit',\n\tKHR_MATERIALS_VOLUME: 'KHR_materials_volume',\n\tKHR_TEXTURE_BASISU: 'KHR_texture_basisu',\n\tKHR_TEXTURE_TRANSFORM: 'KHR_texture_transform',\n\tKHR_MESH_QUANTIZATION: 'KHR_mesh_quantization',\n\tKHR_MATERIALS_EMISSIVE_STRENGTH: 'KHR_materials_emissive_strength',\n\tEXT_TEXTURE_WEBP: 'EXT_texture_webp',\n\tEXT_MESHOPT_COMPRESSION: 'EXT_meshopt_compression'\n};\n\n/**\n * Punctual Lights Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_lights_punctual\n */\nclass GLTFLightsExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_LIGHTS_PUNCTUAL;\n\n\t\t// Object3D instance caches\n\t\tthis.cache = { refs: {}, uses: {} };\n\n\t}\n\n\t_markDefs() {\n\n\t\tconst parser = this.parser;\n\t\tconst nodeDefs = this.parser.json.nodes || [];\n\n\t\tfor ( let nodeIndex = 0, nodeLength = nodeDefs.length; nodeIndex < nodeLength; nodeIndex ++ ) {\n\n\t\t\tconst nodeDef = nodeDefs[ nodeIndex ];\n\n\t\t\tif ( nodeDef.extensions\n\t\t\t\t\t&& nodeDef.extensions[ this.name ]\n\t\t\t\t\t&& nodeDef.extensions[ this.name ].light !== undefined ) {\n\n\t\t\t\tparser._addNodeRef( this.cache, nodeDef.extensions[ this.name ].light );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_loadLight( lightIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst cacheKey = 'light:' + lightIndex;\n\t\tlet dependency = parser.cache.get( cacheKey );\n\n\t\tif ( dependency ) return dependency;\n\n\t\tconst json = parser.json;\n\t\tconst extensions = ( json.extensions && json.extensions[ this.name ] ) || {};\n\t\tconst lightDefs = extensions.lights || [];\n\t\tconst lightDef = lightDefs[ lightIndex ];\n\t\tlet lightNode;\n\n\t\tconst color = new Color( 0xffffff );\n\n\t\tif ( lightDef.color !== undefined ) color.fromArray( lightDef.color );\n\n\t\tconst range = lightDef.range !== undefined ? lightDef.range : 0;\n\n\t\tswitch ( lightDef.type ) {\n\n\t\t\tcase 'directional':\n\t\t\t\tlightNode = new DirectionalLight( color );\n\t\t\t\tlightNode.target.position.set( 0, 0, - 1 );\n\t\t\t\tlightNode.add( lightNode.target );\n\t\t\t\tbreak;\n\n\t\t\tcase 'point':\n\t\t\t\tlightNode = new PointLight( color );\n\t\t\t\tlightNode.distance = range;\n\t\t\t\tbreak;\n\n\t\t\tcase 'spot':\n\t\t\t\tlightNode = new SpotLight( color );\n\t\t\t\tlightNode.distance = range;\n\t\t\t\t// Handle spotlight properties.\n\t\t\t\tlightDef.spot = lightDef.spot || {};\n\t\t\t\tlightDef.spot.innerConeAngle = lightDef.spot.innerConeAngle !== undefined ? lightDef.spot.innerConeAngle : 0;\n\t\t\t\tlightDef.spot.outerConeAngle = lightDef.spot.outerConeAngle !== undefined ? lightDef.spot.outerConeAngle : Math.PI / 4.0;\n\t\t\t\tlightNode.angle = lightDef.spot.outerConeAngle;\n\t\t\t\tlightNode.penumbra = 1.0 - lightDef.spot.innerConeAngle / lightDef.spot.outerConeAngle;\n\t\t\t\tlightNode.target.position.set( 0, 0, - 1 );\n\t\t\t\tlightNode.add( lightNode.target );\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tthrow new Error( 'THREE.GLTFLoader: Unexpected light type: ' + lightDef.type );\n\n\t\t}\n\n\t\t// Some lights (e.g. spot) default to a position other than the origin. Reset the position\n\t\t// here, because node-level parsing will only override position if explicitly specified.\n\t\tlightNode.position.set( 0, 0, 0 );\n\n\t\tlightNode.decay = 2;\n\n\t\tif ( lightDef.intensity !== undefined ) lightNode.intensity = lightDef.intensity;\n\n\t\tlightNode.name = parser.createUniqueName( lightDef.name || ( 'light_' + lightIndex ) );\n\n\t\tdependency = Promise.resolve( lightNode );\n\n\t\tparser.cache.add( cacheKey, dependency );\n\n\t\treturn dependency;\n\n\t}\n\n\tcreateNodeAttachment( nodeIndex ) {\n\n\t\tconst self = this;\n\t\tconst parser = this.parser;\n\t\tconst json = parser.json;\n\t\tconst nodeDef = json.nodes[ nodeIndex ];\n\t\tconst lightDef = ( nodeDef.extensions && nodeDef.extensions[ this.name ] ) || {};\n\t\tconst lightIndex = lightDef.light;\n\n\t\tif ( lightIndex === undefined ) return null;\n\n\t\treturn this._loadLight( lightIndex ).then( function ( light ) {\n\n\t\t\treturn parser._getNodeRef( self.cache, lightIndex, light );\n\n\t\t} );\n\n\t}\n\n}\n\n/**\n * Unlit Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_unlit\n */\nclass GLTFMaterialsUnlitExtension {\n\n\tconstructor() {\n\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_UNLIT;\n\n\t}\n\n\tgetMaterialType() {\n\n\t\treturn MeshBasicMaterial;\n\n\t}\n\n\textendParams( materialParams, materialDef, parser ) {\n\n\t\tconst pending = [];\n\n\t\tmaterialParams.color = new Color( 1.0, 1.0, 1.0 );\n\t\tmaterialParams.opacity = 1.0;\n\n\t\tconst metallicRoughness = materialDef.pbrMetallicRoughness;\n\n\t\tif ( metallicRoughness ) {\n\n\t\t\tif ( Array.isArray( metallicRoughness.baseColorFactor ) ) {\n\n\t\t\t\tconst array = metallicRoughness.baseColorFactor;\n\n\t\t\t\tmaterialParams.color.fromArray( array );\n\t\t\t\tmaterialParams.opacity = array[ 3 ];\n\n\t\t\t}\n\n\t\t\tif ( metallicRoughness.baseColorTexture !== undefined ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'map', metallicRoughness.baseColorTexture, sRGBEncoding ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Materials Emissive Strength Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/blob/5768b3ce0ef32bc39cdf1bef10b948586635ead3/extensions/2.0/Khronos/KHR_materials_emissive_strength/README.md\n */\nclass GLTFMaterialsEmissiveStrengthExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_EMISSIVE_STRENGTH;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst emissiveStrength = materialDef.extensions[ this.name ].emissiveStrength;\n\n\t\tif ( emissiveStrength !== undefined ) {\n\n\t\t\tmaterialParams.emissiveIntensity = emissiveStrength;\n\n\t\t}\n\n\t\treturn Promise.resolve();\n\n\t}\n\n}\n\n/**\n * Clearcoat Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_clearcoat\n */\nclass GLTFMaterialsClearcoatExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_CLEARCOAT;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tif ( extension.clearcoatFactor !== undefined ) {\n\n\t\t\tmaterialParams.clearcoat = extension.clearcoatFactor;\n\n\t\t}\n\n\t\tif ( extension.clearcoatTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'clearcoatMap', extension.clearcoatTexture ) );\n\n\t\t}\n\n\t\tif ( extension.clearcoatRoughnessFactor !== undefined ) {\n\n\t\t\tmaterialParams.clearcoatRoughness = extension.clearcoatRoughnessFactor;\n\n\t\t}\n\n\t\tif ( extension.clearcoatRoughnessTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'clearcoatRoughnessMap', extension.clearcoatRoughnessTexture ) );\n\n\t\t}\n\n\t\tif ( extension.clearcoatNormalTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'clearcoatNormalMap', extension.clearcoatNormalTexture ) );\n\n\t\t\tif ( extension.clearcoatNormalTexture.scale !== undefined ) {\n\n\t\t\t\tconst scale = extension.clearcoatNormalTexture.scale;\n\n\t\t\t\tmaterialParams.clearcoatNormalScale = new Vector2( scale, scale );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Iridescence Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_iridescence\n */\nclass GLTFMaterialsIridescenceExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_IRIDESCENCE;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tif ( extension.iridescenceFactor !== undefined ) {\n\n\t\t\tmaterialParams.iridescence = extension.iridescenceFactor;\n\n\t\t}\n\n\t\tif ( extension.iridescenceTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'iridescenceMap', extension.iridescenceTexture ) );\n\n\t\t}\n\n\t\tif ( extension.iridescenceIor !== undefined ) {\n\n\t\t\tmaterialParams.iridescenceIOR = extension.iridescenceIor;\n\n\t\t}\n\n\t\tif ( materialParams.iridescenceThicknessRange === undefined ) {\n\n\t\t\tmaterialParams.iridescenceThicknessRange = [ 100, 400 ];\n\n\t\t}\n\n\t\tif ( extension.iridescenceThicknessMinimum !== undefined ) {\n\n\t\t\tmaterialParams.iridescenceThicknessRange[ 0 ] = extension.iridescenceThicknessMinimum;\n\n\t\t}\n\n\t\tif ( extension.iridescenceThicknessMaximum !== undefined ) {\n\n\t\t\tmaterialParams.iridescenceThicknessRange[ 1 ] = extension.iridescenceThicknessMaximum;\n\n\t\t}\n\n\t\tif ( extension.iridescenceThicknessTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'iridescenceThicknessMap', extension.iridescenceThicknessTexture ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Sheen Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_sheen\n */\nclass GLTFMaterialsSheenExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_SHEEN;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tmaterialParams.sheenColor = new Color( 0, 0, 0 );\n\t\tmaterialParams.sheenRoughness = 0;\n\t\tmaterialParams.sheen = 1;\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tif ( extension.sheenColorFactor !== undefined ) {\n\n\t\t\tmaterialParams.sheenColor.fromArray( extension.sheenColorFactor );\n\n\t\t}\n\n\t\tif ( extension.sheenRoughnessFactor !== undefined ) {\n\n\t\t\tmaterialParams.sheenRoughness = extension.sheenRoughnessFactor;\n\n\t\t}\n\n\t\tif ( extension.sheenColorTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'sheenColorMap', extension.sheenColorTexture, sRGBEncoding ) );\n\n\t\t}\n\n\t\tif ( extension.sheenRoughnessTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'sheenRoughnessMap', extension.sheenRoughnessTexture ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Transmission Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_transmission\n * Draft: https://github.com/KhronosGroup/glTF/pull/1698\n */\nclass GLTFMaterialsTransmissionExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_TRANSMISSION;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tif ( extension.transmissionFactor !== undefined ) {\n\n\t\t\tmaterialParams.transmission = extension.transmissionFactor;\n\n\t\t}\n\n\t\tif ( extension.transmissionTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'transmissionMap', extension.transmissionTexture ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Materials Volume Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_volume\n */\nclass GLTFMaterialsVolumeExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_VOLUME;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tmaterialParams.thickness = extension.thicknessFactor !== undefined ? extension.thicknessFactor : 0;\n\n\t\tif ( extension.thicknessTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'thicknessMap', extension.thicknessTexture ) );\n\n\t\t}\n\n\t\tmaterialParams.attenuationDistance = extension.attenuationDistance || 0;\n\n\t\tconst colorArray = extension.attenuationColor || [ 1, 1, 1 ];\n\t\tmaterialParams.attenuationColor = new Color( colorArray[ 0 ], colorArray[ 1 ], colorArray[ 2 ] );\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Materials ior Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_ior\n */\nclass GLTFMaterialsIorExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_IOR;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tmaterialParams.ior = extension.ior !== undefined ? extension.ior : 1.5;\n\n\t\treturn Promise.resolve();\n\n\t}\n\n}\n\n/**\n * Materials specular Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_specular\n */\nclass GLTFMaterialsSpecularExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_SPECULAR;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tmaterialParams.specularIntensity = extension.specularFactor !== undefined ? extension.specularFactor : 1.0;\n\n\t\tif ( extension.specularTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'specularIntensityMap', extension.specularTexture ) );\n\n\t\t}\n\n\t\tconst colorArray = extension.specularColorFactor || [ 1, 1, 1 ];\n\t\tmaterialParams.specularColor = new Color( colorArray[ 0 ], colorArray[ 1 ], colorArray[ 2 ] );\n\n\t\tif ( extension.specularColorTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'specularColorMap', extension.specularColorTexture, sRGBEncoding ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * BasisU Texture Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_texture_basisu\n */\nclass GLTFTextureBasisUExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_TEXTURE_BASISU;\n\n\t}\n\n\tloadTexture( textureIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst json = parser.json;\n\n\t\tconst textureDef = json.textures[ textureIndex ];\n\n\t\tif ( ! textureDef.extensions || ! textureDef.extensions[ this.name ] ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst extension = textureDef.extensions[ this.name ];\n\t\tconst loader = parser.options.ktx2Loader;\n\n\t\tif ( ! loader ) {\n\n\t\t\tif ( json.extensionsRequired && json.extensionsRequired.indexOf( this.name ) >= 0 ) {\n\n\t\t\t\tthrow new Error( 'THREE.GLTFLoader: setKTX2Loader must be called before loading KTX2 textures' );\n\n\t\t\t} else {\n\n\t\t\t\t// Assumes that the extension is optional and that a fallback texture is present\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn parser.loadTextureImage( textureIndex, extension.source, loader );\n\n\t}\n\n}\n\n/**\n * WebP Texture Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_texture_webp\n */\nclass GLTFTextureWebPExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.EXT_TEXTURE_WEBP;\n\t\tthis.isSupported = null;\n\n\t}\n\n\tloadTexture( textureIndex ) {\n\n\t\tconst name = this.name;\n\t\tconst parser = this.parser;\n\t\tconst json = parser.json;\n\n\t\tconst textureDef = json.textures[ textureIndex ];\n\n\t\tif ( ! textureDef.extensions || ! textureDef.extensions[ name ] ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst extension = textureDef.extensions[ name ];\n\t\tconst source = json.images[ extension.source ];\n\n\t\tlet loader = parser.textureLoader;\n\t\tif ( source.uri ) {\n\n\t\t\tconst handler = parser.options.manager.getHandler( source.uri );\n\t\t\tif ( handler !== null ) loader = handler;\n\n\t\t}\n\n\t\treturn this.detectSupport().then( function ( isSupported ) {\n\n\t\t\tif ( isSupported ) return parser.loadTextureImage( textureIndex, extension.source, loader );\n\n\t\t\tif ( json.extensionsRequired && json.extensionsRequired.indexOf( name ) >= 0 ) {\n\n\t\t\t\tthrow new Error( 'THREE.GLTFLoader: WebP required by asset but unsupported.' );\n\n\t\t\t}\n\n\t\t\t// Fall back to PNG or JPEG.\n\t\t\treturn parser.loadTexture( textureIndex );\n\n\t\t} );\n\n\t}\n\n\tdetectSupport() {\n\n\t\tif ( ! this.isSupported ) {\n\n\t\t\tthis.isSupported = new Promise( function ( resolve ) {\n\n\t\t\t\tconst image = new Image();\n\n\t\t\t\t// Lossy test image. Support for lossy images doesn't guarantee support for all\n\t\t\t\t// WebP images, unfortunately.\n\t\t\t\timage.src = 'data:image/webp;base64,UklGRiIAAABXRUJQVlA4IBYAAAAwAQCdASoBAAEADsD+JaQAA3AAAAAA';\n\n\t\t\t\timage.onload = image.onerror = function () {\n\n\t\t\t\t\tresolve( image.height === 1 );\n\n\t\t\t\t};\n\n\t\t\t} );\n\n\t\t}\n\n\t\treturn this.isSupported;\n\n\t}\n\n}\n\n/**\n * meshopt BufferView Compression Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_meshopt_compression\n */\nclass GLTFMeshoptCompression {\n\n\tconstructor( parser ) {\n\n\t\tthis.name = EXTENSIONS.EXT_MESHOPT_COMPRESSION;\n\t\tthis.parser = parser;\n\n\t}\n\n\tloadBufferView( index ) {\n\n\t\tconst json = this.parser.json;\n\t\tconst bufferView = json.bufferViews[ index ];\n\n\t\tif ( bufferView.extensions && bufferView.extensions[ this.name ] ) {\n\n\t\t\tconst extensionDef = bufferView.extensions[ this.name ];\n\n\t\t\tconst buffer = this.parser.getDependency( 'buffer', extensionDef.buffer );\n\t\t\tconst decoder = this.parser.options.meshoptDecoder;\n\n\t\t\tif ( ! decoder || ! decoder.supported ) {\n\n\t\t\t\tif ( json.extensionsRequired && json.extensionsRequired.indexOf( this.name ) >= 0 ) {\n\n\t\t\t\t\tthrow new Error( 'THREE.GLTFLoader: setMeshoptDecoder must be called before loading compressed files' );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Assumes that the extension is optional and that fallback buffer data is present\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn Promise.all( [ buffer, decoder.ready ] ).then( function ( res ) {\n\n\t\t\t\tconst byteOffset = extensionDef.byteOffset || 0;\n\t\t\t\tconst byteLength = extensionDef.byteLength || 0;\n\n\t\t\t\tconst count = extensionDef.count;\n\t\t\t\tconst stride = extensionDef.byteStride;\n\n\t\t\t\tconst result = new ArrayBuffer( count * stride );\n\t\t\t\tconst source = new Uint8Array( res[ 0 ], byteOffset, byteLength );\n\n\t\t\t\tdecoder.decodeGltfBuffer( new Uint8Array( result ), count, stride, source, extensionDef.mode, extensionDef.filter );\n\t\t\t\treturn result;\n\n\t\t\t} );\n\n\t\t} else {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t}\n\n}\n\n/* BINARY EXTENSION */\nconst BINARY_EXTENSION_HEADER_MAGIC = 'glTF';\nconst BINARY_EXTENSION_HEADER_LENGTH = 12;\nconst BINARY_EXTENSION_CHUNK_TYPES = { JSON: 0x4E4F534A, BIN: 0x004E4942 };\n\nclass GLTFBinaryExtension {\n\n\tconstructor( data ) {\n\n\t\tthis.name = EXTENSIONS.KHR_BINARY_GLTF;\n\t\tthis.content = null;\n\t\tthis.body = null;\n\n\t\tconst headerView = new DataView( data, 0, BINARY_EXTENSION_HEADER_LENGTH );\n\n\t\tthis.header = {\n\t\t\tmagic: LoaderUtils.decodeText( new Uint8Array( data.slice( 0, 4 ) ) ),\n\t\t\tversion: headerView.getUint32( 4, true ),\n\t\t\tlength: headerView.getUint32( 8, true )\n\t\t};\n\n\t\tif ( this.header.magic !== BINARY_EXTENSION_HEADER_MAGIC ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: Unsupported glTF-Binary header.' );\n\n\t\t} else if ( this.header.version < 2.0 ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: Legacy binary file detected.' );\n\n\t\t}\n\n\t\tconst chunkContentsLength = this.header.length - BINARY_EXTENSION_HEADER_LENGTH;\n\t\tconst chunkView = new DataView( data, BINARY_EXTENSION_HEADER_LENGTH );\n\t\tlet chunkIndex = 0;\n\n\t\twhile ( chunkIndex < chunkContentsLength ) {\n\n\t\t\tconst chunkLength = chunkView.getUint32( chunkIndex, true );\n\t\t\tchunkIndex += 4;\n\n\t\t\tconst chunkType = chunkView.getUint32( chunkIndex, true );\n\t\t\tchunkIndex += 4;\n\n\t\t\tif ( chunkType === BINARY_EXTENSION_CHUNK_TYPES.JSON ) {\n\n\t\t\t\tconst contentArray = new Uint8Array( data, BINARY_EXTENSION_HEADER_LENGTH + chunkIndex, chunkLength );\n\t\t\t\tthis.content = LoaderUtils.decodeText( contentArray );\n\n\t\t\t} else if ( chunkType === BINARY_EXTENSION_CHUNK_TYPES.BIN ) {\n\n\t\t\t\tconst byteOffset = BINARY_EXTENSION_HEADER_LENGTH + chunkIndex;\n\t\t\t\tthis.body = data.slice( byteOffset, byteOffset + chunkLength );\n\n\t\t\t}\n\n\t\t\t// Clients must ignore chunks with unknown types.\n\n\t\t\tchunkIndex += chunkLength;\n\n\t\t}\n\n\t\tif ( this.content === null ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: JSON content not found.' );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * DRACO Mesh Compression Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_draco_mesh_compression\n */\nclass GLTFDracoMeshCompressionExtension {\n\n\tconstructor( json, dracoLoader ) {\n\n\t\tif ( ! dracoLoader ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: No DRACOLoader instance provided.' );\n\n\t\t}\n\n\t\tthis.name = EXTENSIONS.KHR_DRACO_MESH_COMPRESSION;\n\t\tthis.json = json;\n\t\tthis.dracoLoader = dracoLoader;\n\t\tthis.dracoLoader.preload();\n\n\t}\n\n\tdecodePrimitive( primitive, parser ) {\n\n\t\tconst json = this.json;\n\t\tconst dracoLoader = this.dracoLoader;\n\t\tconst bufferViewIndex = primitive.extensions[ this.name ].bufferView;\n\t\tconst gltfAttributeMap = primitive.extensions[ this.name ].attributes;\n\t\tconst threeAttributeMap = {};\n\t\tconst attributeNormalizedMap = {};\n\t\tconst attributeTypeMap = {};\n\n\t\tfor ( const attributeName in gltfAttributeMap ) {\n\n\t\t\tconst threeAttributeName = ATTRIBUTES[ attributeName ] || attributeName.toLowerCase();\n\n\t\t\tthreeAttributeMap[ threeAttributeName ] = gltfAttributeMap[ attributeName ];\n\n\t\t}\n\n\t\tfor ( const attributeName in primitive.attributes ) {\n\n\t\t\tconst threeAttributeName = ATTRIBUTES[ attributeName ] || attributeName.toLowerCase();\n\n\t\t\tif ( gltfAttributeMap[ attributeName ] !== undefined ) {\n\n\t\t\t\tconst accessorDef = json.accessors[ primitive.attributes[ attributeName ] ];\n\t\t\t\tconst componentType = WEBGL_COMPONENT_TYPES[ accessorDef.componentType ];\n\n\t\t\t\tattributeTypeMap[ threeAttributeName ] = componentType;\n\t\t\t\tattributeNormalizedMap[ threeAttributeName ] = accessorDef.normalized === true;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn parser.getDependency( 'bufferView', bufferViewIndex ).then( function ( bufferView ) {\n\n\t\t\treturn new Promise( function ( resolve ) {\n\n\t\t\t\tdracoLoader.decodeDracoFile( bufferView, function ( geometry ) {\n\n\t\t\t\t\tfor ( const attributeName in geometry.attributes ) {\n\n\t\t\t\t\t\tconst attribute = geometry.attributes[ attributeName ];\n\t\t\t\t\t\tconst normalized = attributeNormalizedMap[ attributeName ];\n\n\t\t\t\t\t\tif ( normalized !== undefined ) attribute.normalized = normalized;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tresolve( geometry );\n\n\t\t\t\t}, threeAttributeMap, attributeTypeMap );\n\n\t\t\t} );\n\n\t\t} );\n\n\t}\n\n}\n\n/**\n * Texture Transform Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_texture_transform\n */\nclass GLTFTextureTransformExtension {\n\n\tconstructor() {\n\n\t\tthis.name = EXTENSIONS.KHR_TEXTURE_TRANSFORM;\n\n\t}\n\n\textendTexture( texture, transform ) {\n\n\t\tif ( transform.texCoord !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.GLTFLoader: Custom UV sets in \"' + this.name + '\" extension not yet supported.' );\n\n\t\t}\n\n\t\tif ( transform.offset === undefined && transform.rotation === undefined && transform.scale === undefined ) {\n\n\t\t\t// See https://github.com/mrdoob/three.js/issues/21819.\n\t\t\treturn texture;\n\n\t\t}\n\n\t\ttexture = texture.clone();\n\n\t\tif ( transform.offset !== undefined ) {\n\n\t\t\ttexture.offset.fromArray( transform.offset );\n\n\t\t}\n\n\t\tif ( transform.rotation !== undefined ) {\n\n\t\t\ttexture.rotation = transform.rotation;\n\n\t\t}\n\n\t\tif ( transform.scale !== undefined ) {\n\n\t\t\ttexture.repeat.fromArray( transform.scale );\n\n\t\t}\n\n\t\ttexture.needsUpdate = true;\n\n\t\treturn texture;\n\n\t}\n\n}\n\n/**\n * Specular-Glossiness Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Archived/KHR_materials_pbrSpecularGlossiness\n */\n\n/**\n * A sub class of StandardMaterial with some of the functionality\n * changed via the `onBeforeCompile` callback\n * @pailhead\n */\nclass GLTFMeshStandardSGMaterial extends MeshStandardMaterial {\n\n\tconstructor( params ) {\n\n\t\tsuper();\n\n\t\tthis.isGLTFSpecularGlossinessMaterial = true;\n\n\t\t//various chunks that need replacing\n\t\tconst specularMapParsFragmentChunk = [\n\t\t\t'#ifdef USE_SPECULARMAP',\n\t\t\t'\tuniform sampler2D specularMap;',\n\t\t\t'#endif'\n\t\t].join( '\\n' );\n\n\t\tconst glossinessMapParsFragmentChunk = [\n\t\t\t'#ifdef USE_GLOSSINESSMAP',\n\t\t\t'\tuniform sampler2D glossinessMap;',\n\t\t\t'#endif'\n\t\t].join( '\\n' );\n\n\t\tconst specularMapFragmentChunk = [\n\t\t\t'vec3 specularFactor = specular;',\n\t\t\t'#ifdef USE_SPECULARMAP',\n\t\t\t'\tvec4 texelSpecular = texture2D( specularMap, vUv );',\n\t\t\t'\t// reads channel RGB, compatible with a glTF Specular-Glossiness (RGBA) texture',\n\t\t\t'\tspecularFactor *= texelSpecular.rgb;',\n\t\t\t'#endif'\n\t\t].join( '\\n' );\n\n\t\tconst glossinessMapFragmentChunk = [\n\t\t\t'float glossinessFactor = glossiness;',\n\t\t\t'#ifdef USE_GLOSSINESSMAP',\n\t\t\t'\tvec4 texelGlossiness = texture2D( glossinessMap, vUv );',\n\t\t\t'\t// reads channel A, compatible with a glTF Specular-Glossiness (RGBA) texture',\n\t\t\t'\tglossinessFactor *= texelGlossiness.a;',\n\t\t\t'#endif'\n\t\t].join( '\\n' );\n\n\t\tconst lightPhysicalFragmentChunk = [\n\t\t\t'PhysicalMaterial material;',\n\t\t\t'material.diffuseColor = diffuseColor.rgb * ( 1. - max( specularFactor.r, max( specularFactor.g, specularFactor.b ) ) );',\n\t\t\t'vec3 dxy = max( abs( dFdx( geometryNormal ) ), abs( dFdy( geometryNormal ) ) );',\n\t\t\t'float geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );',\n\t\t\t'material.roughness = max( 1.0 - glossinessFactor, 0.0525 ); // 0.0525 corresponds to the base mip of a 256 cubemap.',\n\t\t\t'material.roughness += geometryRoughness;',\n\t\t\t'material.roughness = min( material.roughness, 1.0 );',\n\t\t\t'material.specularColor = specularFactor;',\n\t\t].join( '\\n' );\n\n\t\tconst uniforms = {\n\t\t\tspecular: { value: new Color().setHex( 0xffffff ) },\n\t\t\tglossiness: { value: 1 },\n\t\t\tspecularMap: { value: null },\n\t\t\tglossinessMap: { value: null }\n\t\t};\n\n\t\tthis._extraUniforms = uniforms;\n\n\t\tthis.onBeforeCompile = function ( shader ) {\n\n\t\t\tfor ( const uniformName in uniforms ) {\n\n\t\t\t\tshader.uniforms[ uniformName ] = uniforms[ uniformName ];\n\n\t\t\t}\n\n\t\t\tshader.fragmentShader = shader.fragmentShader\n\t\t\t\t.replace( 'uniform float roughness;', 'uniform vec3 specular;' )\n\t\t\t\t.replace( 'uniform float metalness;', 'uniform float glossiness;' )\n\t\t\t\t.replace( '#include ', specularMapParsFragmentChunk )\n\t\t\t\t.replace( '#include ', glossinessMapParsFragmentChunk )\n\t\t\t\t.replace( '#include ', specularMapFragmentChunk )\n\t\t\t\t.replace( '#include ', glossinessMapFragmentChunk )\n\t\t\t\t.replace( '#include ', lightPhysicalFragmentChunk );\n\n\t\t};\n\n\t\tObject.defineProperties( this, {\n\n\t\t\tspecular: {\n\t\t\t\tget: function () {\n\n\t\t\t\t\treturn uniforms.specular.value;\n\n\t\t\t\t},\n\t\t\t\tset: function ( v ) {\n\n\t\t\t\t\tuniforms.specular.value = v;\n\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tspecularMap: {\n\t\t\t\tget: function () {\n\n\t\t\t\t\treturn uniforms.specularMap.value;\n\n\t\t\t\t},\n\t\t\t\tset: function ( v ) {\n\n\t\t\t\t\tuniforms.specularMap.value = v;\n\n\t\t\t\t\tif ( v ) {\n\n\t\t\t\t\t\tthis.defines.USE_SPECULARMAP = ''; // USE_UV is set by the renderer for specular maps\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tdelete this.defines.USE_SPECULARMAP;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tglossiness: {\n\t\t\t\tget: function () {\n\n\t\t\t\t\treturn uniforms.glossiness.value;\n\n\t\t\t\t},\n\t\t\t\tset: function ( v ) {\n\n\t\t\t\t\tuniforms.glossiness.value = v;\n\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tglossinessMap: {\n\t\t\t\tget: function () {\n\n\t\t\t\t\treturn uniforms.glossinessMap.value;\n\n\t\t\t\t},\n\t\t\t\tset: function ( v ) {\n\n\t\t\t\t\tuniforms.glossinessMap.value = v;\n\n\t\t\t\t\tif ( v ) {\n\n\t\t\t\t\t\tthis.defines.USE_GLOSSINESSMAP = '';\n\t\t\t\t\t\tthis.defines.USE_UV = '';\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tdelete this.defines.USE_GLOSSINESSMAP;\n\t\t\t\t\t\tdelete this.defines.USE_UV;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t}\n\n\t\t} );\n\n\t\tdelete this.metalness;\n\t\tdelete this.roughness;\n\t\tdelete this.metalnessMap;\n\t\tdelete this.roughnessMap;\n\n\t\tthis.setValues( params );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.specularMap = source.specularMap;\n\t\tthis.specular.copy( source.specular );\n\t\tthis.glossinessMap = source.glossinessMap;\n\t\tthis.glossiness = source.glossiness;\n\t\tdelete this.metalness;\n\t\tdelete this.roughness;\n\t\tdelete this.metalnessMap;\n\t\tdelete this.roughnessMap;\n\t\treturn this;\n\n\t}\n\n}\n\n\nclass GLTFMaterialsPbrSpecularGlossinessExtension {\n\n\tconstructor() {\n\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS;\n\n\t\tthis.specularGlossinessParams = [\n\t\t\t'color',\n\t\t\t'map',\n\t\t\t'lightMap',\n\t\t\t'lightMapIntensity',\n\t\t\t'aoMap',\n\t\t\t'aoMapIntensity',\n\t\t\t'emissive',\n\t\t\t'emissiveIntensity',\n\t\t\t'emissiveMap',\n\t\t\t'bumpMap',\n\t\t\t'bumpScale',\n\t\t\t'normalMap',\n\t\t\t'normalMapType',\n\t\t\t'displacementMap',\n\t\t\t'displacementScale',\n\t\t\t'displacementBias',\n\t\t\t'specularMap',\n\t\t\t'specular',\n\t\t\t'glossinessMap',\n\t\t\t'glossiness',\n\t\t\t'alphaMap',\n\t\t\t'envMap',\n\t\t\t'envMapIntensity'\n\t\t];\n\n\t}\n\n\tgetMaterialType() {\n\n\t\treturn GLTFMeshStandardSGMaterial;\n\n\t}\n\n\textendParams( materialParams, materialDef, parser ) {\n\n\t\tconst pbrSpecularGlossiness = materialDef.extensions[ this.name ];\n\n\t\tmaterialParams.color = new Color( 1.0, 1.0, 1.0 );\n\t\tmaterialParams.opacity = 1.0;\n\n\t\tconst pending = [];\n\n\t\tif ( Array.isArray( pbrSpecularGlossiness.diffuseFactor ) ) {\n\n\t\t\tconst array = pbrSpecularGlossiness.diffuseFactor;\n\n\t\t\tmaterialParams.color.fromArray( array );\n\t\t\tmaterialParams.opacity = array[ 3 ];\n\n\t\t}\n\n\t\tif ( pbrSpecularGlossiness.diffuseTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'map', pbrSpecularGlossiness.diffuseTexture, sRGBEncoding ) );\n\n\t\t}\n\n\t\tmaterialParams.emissive = new Color( 0.0, 0.0, 0.0 );\n\t\tmaterialParams.glossiness = pbrSpecularGlossiness.glossinessFactor !== undefined ? pbrSpecularGlossiness.glossinessFactor : 1.0;\n\t\tmaterialParams.specular = new Color( 1.0, 1.0, 1.0 );\n\n\t\tif ( Array.isArray( pbrSpecularGlossiness.specularFactor ) ) {\n\n\t\t\tmaterialParams.specular.fromArray( pbrSpecularGlossiness.specularFactor );\n\n\t\t}\n\n\t\tif ( pbrSpecularGlossiness.specularGlossinessTexture !== undefined ) {\n\n\t\t\tconst specGlossMapDef = pbrSpecularGlossiness.specularGlossinessTexture;\n\t\t\tpending.push( parser.assignTexture( materialParams, 'glossinessMap', specGlossMapDef ) );\n\t\t\tpending.push( parser.assignTexture( materialParams, 'specularMap', specGlossMapDef, sRGBEncoding ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n\tcreateMaterial( materialParams ) {\n\n\t\tconst material = new GLTFMeshStandardSGMaterial( materialParams );\n\t\tmaterial.fog = true;\n\n\t\tmaterial.color = materialParams.color;\n\n\t\tmaterial.map = materialParams.map === undefined ? null : materialParams.map;\n\n\t\tmaterial.lightMap = null;\n\t\tmaterial.lightMapIntensity = 1.0;\n\n\t\tmaterial.aoMap = materialParams.aoMap === undefined ? null : materialParams.aoMap;\n\t\tmaterial.aoMapIntensity = 1.0;\n\n\t\tmaterial.emissive = materialParams.emissive;\n\t\tmaterial.emissiveIntensity = materialParams.emissiveIntensity === undefined ? 1.0 : materialParams.emissiveIntensity;\n\t\tmaterial.emissiveMap = materialParams.emissiveMap === undefined ? null : materialParams.emissiveMap;\n\n\t\tmaterial.bumpMap = materialParams.bumpMap === undefined ? null : materialParams.bumpMap;\n\t\tmaterial.bumpScale = 1;\n\n\t\tmaterial.normalMap = materialParams.normalMap === undefined ? null : materialParams.normalMap;\n\t\tmaterial.normalMapType = TangentSpaceNormalMap;\n\n\t\tif ( materialParams.normalScale ) material.normalScale = materialParams.normalScale;\n\n\t\tmaterial.displacementMap = null;\n\t\tmaterial.displacementScale = 1;\n\t\tmaterial.displacementBias = 0;\n\n\t\tmaterial.specularMap = materialParams.specularMap === undefined ? null : materialParams.specularMap;\n\t\tmaterial.specular = materialParams.specular;\n\n\t\tmaterial.glossinessMap = materialParams.glossinessMap === undefined ? null : materialParams.glossinessMap;\n\t\tmaterial.glossiness = materialParams.glossiness;\n\n\t\tmaterial.alphaMap = null;\n\n\t\tmaterial.envMap = materialParams.envMap === undefined ? null : materialParams.envMap;\n\t\tmaterial.envMapIntensity = 1.0;\n\n\t\treturn material;\n\n\t}\n\n}\n\n/**\n * Mesh Quantization Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_mesh_quantization\n */\nclass GLTFMeshQuantizationExtension {\n\n\tconstructor() {\n\n\t\tthis.name = EXTENSIONS.KHR_MESH_QUANTIZATION;\n\n\t}\n\n}\n\n/*********************************/\n/********** INTERPOLATION ********/\n/*********************************/\n\n// Spline Interpolation\n// Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#appendix-c-spline-interpolation\nclass GLTFCubicSplineInterpolant extends Interpolant {\n\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tcopySampleValue_( index ) {\n\n\t\t// Copies a sample value to the result buffer. See description of glTF\n\t\t// CUBICSPLINE values layout in interpolate_() function below.\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tvalueSize = this.valueSize,\n\t\t\toffset = index * valueSize * 3 + valueSize;\n\n\t\tfor ( let i = 0; i !== valueSize; i ++ ) {\n\n\t\t\tresult[ i ] = values[ offset + i ];\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\tinterpolate_( i1, t0, t, t1 ) {\n\n\t\tconst result = this.resultBuffer;\n\t\tconst values = this.sampleValues;\n\t\tconst stride = this.valueSize;\n\n\t\tconst stride2 = stride * 2;\n\t\tconst stride3 = stride * 3;\n\n\t\tconst td = t1 - t0;\n\n\t\tconst p = ( t - t0 ) / td;\n\t\tconst pp = p * p;\n\t\tconst ppp = pp * p;\n\n\t\tconst offset1 = i1 * stride3;\n\t\tconst offset0 = offset1 - stride3;\n\n\t\tconst s2 = - 2 * ppp + 3 * pp;\n\t\tconst s3 = ppp - pp;\n\t\tconst s0 = 1 - s2;\n\t\tconst s1 = s3 - pp + p;\n\n\t\t// Layout of keyframe output values for CUBICSPLINE animations:\n\t\t// [ inTangent_1, splineVertex_1, outTangent_1, inTangent_2, splineVertex_2, ... ]\n\t\tfor ( let i = 0; i !== stride; i ++ ) {\n\n\t\t\tconst p0 = values[ offset0 + i + stride ]; // splineVertex_k\n\t\t\tconst m0 = values[ offset0 + i + stride2 ] * td; // outTangent_k * (t_k+1 - t_k)\n\t\t\tconst p1 = values[ offset1 + i + stride ]; // splineVertex_k+1\n\t\t\tconst m1 = values[ offset1 + i ] * td; // inTangent_k+1 * (t_k+1 - t_k)\n\n\t\t\tresult[ i ] = s0 * p0 + s1 * m0 + s2 * p1 + s3 * m1;\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n}\n\nconst _q = new Quaternion();\n\nclass GLTFCubicSplineQuaternionInterpolant extends GLTFCubicSplineInterpolant {\n\n\tinterpolate_( i1, t0, t, t1 ) {\n\n\t\tconst result = super.interpolate_( i1, t0, t, t1 );\n\n\t\t_q.fromArray( result ).normalize().toArray( result );\n\n\t\treturn result;\n\n\t}\n\n}\n\n\n/*********************************/\n/********** INTERNALS ************/\n/*********************************/\n\n/* CONSTANTS */\n\nconst WEBGL_CONSTANTS = {\n\tFLOAT: 5126,\n\t//FLOAT_MAT2: 35674,\n\tFLOAT_MAT3: 35675,\n\tFLOAT_MAT4: 35676,\n\tFLOAT_VEC2: 35664,\n\tFLOAT_VEC3: 35665,\n\tFLOAT_VEC4: 35666,\n\tLINEAR: 9729,\n\tREPEAT: 10497,\n\tSAMPLER_2D: 35678,\n\tPOINTS: 0,\n\tLINES: 1,\n\tLINE_LOOP: 2,\n\tLINE_STRIP: 3,\n\tTRIANGLES: 4,\n\tTRIANGLE_STRIP: 5,\n\tTRIANGLE_FAN: 6,\n\tUNSIGNED_BYTE: 5121,\n\tUNSIGNED_SHORT: 5123\n};\n\nconst WEBGL_COMPONENT_TYPES = {\n\t5120: Int8Array,\n\t5121: Uint8Array,\n\t5122: Int16Array,\n\t5123: Uint16Array,\n\t5125: Uint32Array,\n\t5126: Float32Array\n};\n\nconst WEBGL_FILTERS = {\n\t9728: NearestFilter,\n\t9729: LinearFilter,\n\t9984: NearestMipmapNearestFilter,\n\t9985: LinearMipmapNearestFilter,\n\t9986: NearestMipmapLinearFilter,\n\t9987: LinearMipmapLinearFilter\n};\n\nconst WEBGL_WRAPPINGS = {\n\t33071: ClampToEdgeWrapping,\n\t33648: MirroredRepeatWrapping,\n\t10497: RepeatWrapping\n};\n\nconst WEBGL_TYPE_SIZES = {\n\t'SCALAR': 1,\n\t'VEC2': 2,\n\t'VEC3': 3,\n\t'VEC4': 4,\n\t'MAT2': 4,\n\t'MAT3': 9,\n\t'MAT4': 16\n};\n\nconst ATTRIBUTES = {\n\tPOSITION: 'position',\n\tNORMAL: 'normal',\n\tTANGENT: 'tangent',\n\tTEXCOORD_0: 'uv',\n\tTEXCOORD_1: 'uv2',\n\tCOLOR_0: 'color',\n\tWEIGHTS_0: 'skinWeight',\n\tJOINTS_0: 'skinIndex',\n};\n\nconst PATH_PROPERTIES = {\n\tscale: 'scale',\n\ttranslation: 'position',\n\trotation: 'quaternion',\n\tweights: 'morphTargetInfluences'\n};\n\nconst INTERPOLATION = {\n\tCUBICSPLINE: undefined, // We use a custom interpolant (GLTFCubicSplineInterpolation) for CUBICSPLINE tracks. Each\n\t\t // keyframe track will be initialized with a default interpolation type, then modified.\n\tLINEAR: InterpolateLinear,\n\tSTEP: InterpolateDiscrete\n};\n\nconst ALPHA_MODES = {\n\tOPAQUE: 'OPAQUE',\n\tMASK: 'MASK',\n\tBLEND: 'BLEND'\n};\n\n/**\n * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#default-material\n */\nfunction createDefaultMaterial( cache ) {\n\n\tif ( cache[ 'DefaultMaterial' ] === undefined ) {\n\n\t\tcache[ 'DefaultMaterial' ] = new MeshStandardMaterial( {\n\t\t\tcolor: 0xFFFFFF,\n\t\t\temissive: 0x000000,\n\t\t\tmetalness: 1,\n\t\t\troughness: 1,\n\t\t\ttransparent: false,\n\t\t\tdepthTest: true,\n\t\t\tside: FrontSide\n\t\t} );\n\n\t}\n\n\treturn cache[ 'DefaultMaterial' ];\n\n}\n\nfunction addUnknownExtensionsToUserData( knownExtensions, object, objectDef ) {\n\n\t// Add unknown glTF extensions to an object's userData.\n\n\tfor ( const name in objectDef.extensions ) {\n\n\t\tif ( knownExtensions[ name ] === undefined ) {\n\n\t\t\tobject.userData.gltfExtensions = object.userData.gltfExtensions || {};\n\t\t\tobject.userData.gltfExtensions[ name ] = objectDef.extensions[ name ];\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * @param {Object3D|Material|BufferGeometry} object\n * @param {GLTF.definition} gltfDef\n */\nfunction assignExtrasToUserData( object, gltfDef ) {\n\n\tif ( gltfDef.extras !== undefined ) {\n\n\t\tif ( typeof gltfDef.extras === 'object' ) {\n\n\t\t\tObject.assign( object.userData, gltfDef.extras );\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.GLTFLoader: Ignoring primitive type .extras, ' + gltfDef.extras );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#morph-targets\n *\n * @param {BufferGeometry} geometry\n * @param {Array} targets\n * @param {GLTFParser} parser\n * @return {Promise}\n */\nfunction addMorphTargets( geometry, targets, parser ) {\n\n\tlet hasMorphPosition = false;\n\tlet hasMorphNormal = false;\n\tlet hasMorphColor = false;\n\n\tfor ( let i = 0, il = targets.length; i < il; i ++ ) {\n\n\t\tconst target = targets[ i ];\n\n\t\tif ( target.POSITION !== undefined ) hasMorphPosition = true;\n\t\tif ( target.NORMAL !== undefined ) hasMorphNormal = true;\n\t\tif ( target.COLOR_0 !== undefined ) hasMorphColor = true;\n\n\t\tif ( hasMorphPosition && hasMorphNormal && hasMorphColor ) break;\n\n\t}\n\n\tif ( ! hasMorphPosition && ! hasMorphNormal && ! hasMorphColor ) return Promise.resolve( geometry );\n\n\tconst pendingPositionAccessors = [];\n\tconst pendingNormalAccessors = [];\n\tconst pendingColorAccessors = [];\n\n\tfor ( let i = 0, il = targets.length; i < il; i ++ ) {\n\n\t\tconst target = targets[ i ];\n\n\t\tif ( hasMorphPosition ) {\n\n\t\t\tconst pendingAccessor = target.POSITION !== undefined\n\t\t\t\t? parser.getDependency( 'accessor', target.POSITION )\n\t\t\t\t: geometry.attributes.position;\n\n\t\t\tpendingPositionAccessors.push( pendingAccessor );\n\n\t\t}\n\n\t\tif ( hasMorphNormal ) {\n\n\t\t\tconst pendingAccessor = target.NORMAL !== undefined\n\t\t\t\t? parser.getDependency( 'accessor', target.NORMAL )\n\t\t\t\t: geometry.attributes.normal;\n\n\t\t\tpendingNormalAccessors.push( pendingAccessor );\n\n\t\t}\n\n\t\tif ( hasMorphColor ) {\n\n\t\t\tconst pendingAccessor = target.COLOR_0 !== undefined\n\t\t\t\t? parser.getDependency( 'accessor', target.COLOR_0 )\n\t\t\t\t: geometry.attributes.color;\n\n\t\t\tpendingColorAccessors.push( pendingAccessor );\n\n\t\t}\n\n\t}\n\n\treturn Promise.all( [\n\t\tPromise.all( pendingPositionAccessors ),\n\t\tPromise.all( pendingNormalAccessors ),\n\t\tPromise.all( pendingColorAccessors )\n\t] ).then( function ( accessors ) {\n\n\t\tconst morphPositions = accessors[ 0 ];\n\t\tconst morphNormals = accessors[ 1 ];\n\t\tconst morphColors = accessors[ 2 ];\n\n\t\tif ( hasMorphPosition ) geometry.morphAttributes.position = morphPositions;\n\t\tif ( hasMorphNormal ) geometry.morphAttributes.normal = morphNormals;\n\t\tif ( hasMorphColor ) geometry.morphAttributes.color = morphColors;\n\t\tgeometry.morphTargetsRelative = true;\n\n\t\treturn geometry;\n\n\t} );\n\n}\n\n/**\n * @param {Mesh} mesh\n * @param {GLTF.Mesh} meshDef\n */\nfunction updateMorphTargets( mesh, meshDef ) {\n\n\tmesh.updateMorphTargets();\n\n\tif ( meshDef.weights !== undefined ) {\n\n\t\tfor ( let i = 0, il = meshDef.weights.length; i < il; i ++ ) {\n\n\t\t\tmesh.morphTargetInfluences[ i ] = meshDef.weights[ i ];\n\n\t\t}\n\n\t}\n\n\t// .extras has user-defined data, so check that .extras.targetNames is an array.\n\tif ( meshDef.extras && Array.isArray( meshDef.extras.targetNames ) ) {\n\n\t\tconst targetNames = meshDef.extras.targetNames;\n\n\t\tif ( mesh.morphTargetInfluences.length === targetNames.length ) {\n\n\t\t\tmesh.morphTargetDictionary = {};\n\n\t\t\tfor ( let i = 0, il = targetNames.length; i < il; i ++ ) {\n\n\t\t\t\tmesh.morphTargetDictionary[ targetNames[ i ] ] = i;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.GLTFLoader: Invalid extras.targetNames length. Ignoring names.' );\n\n\t\t}\n\n\t}\n\n}\n\nfunction createPrimitiveKey( primitiveDef ) {\n\n\tconst dracoExtension = primitiveDef.extensions && primitiveDef.extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ];\n\tlet geometryKey;\n\n\tif ( dracoExtension ) {\n\n\t\tgeometryKey = 'draco:' + dracoExtension.bufferView\n\t\t\t\t+ ':' + dracoExtension.indices\n\t\t\t\t+ ':' + createAttributesKey( dracoExtension.attributes );\n\n\t} else {\n\n\t\tgeometryKey = primitiveDef.indices + ':' + createAttributesKey( primitiveDef.attributes ) + ':' + primitiveDef.mode;\n\n\t}\n\n\treturn geometryKey;\n\n}\n\nfunction createAttributesKey( attributes ) {\n\n\tlet attributesKey = '';\n\n\tconst keys = Object.keys( attributes ).sort();\n\n\tfor ( let i = 0, il = keys.length; i < il; i ++ ) {\n\n\t\tattributesKey += keys[ i ] + ':' + attributes[ keys[ i ] ] + ';';\n\n\t}\n\n\treturn attributesKey;\n\n}\n\nfunction getNormalizedComponentScale( constructor ) {\n\n\t// Reference:\n\t// https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_mesh_quantization#encoding-quantized-data\n\n\tswitch ( constructor ) {\n\n\t\tcase Int8Array:\n\t\t\treturn 1 / 127;\n\n\t\tcase Uint8Array:\n\t\t\treturn 1 / 255;\n\n\t\tcase Int16Array:\n\t\t\treturn 1 / 32767;\n\n\t\tcase Uint16Array:\n\t\t\treturn 1 / 65535;\n\n\t\tdefault:\n\t\t\tthrow new Error( 'THREE.GLTFLoader: Unsupported normalized accessor component type.' );\n\n\t}\n\n}\n\nfunction getImageURIMimeType( uri ) {\n\n\tif ( uri.search( /\\.jpe?g($|\\?)/i ) > 0 || uri.search( /^data\\:image\\/jpeg/ ) === 0 ) return 'image/jpeg';\n\tif ( uri.search( /\\.webp($|\\?)/i ) > 0 || uri.search( /^data\\:image\\/webp/ ) === 0 ) return 'image/webp';\n\n\treturn 'image/png';\n\n}\n\n/* GLTF PARSER */\n\nclass GLTFParser {\n\n\tconstructor( json = {}, options = {} ) {\n\n\t\tthis.json = json;\n\t\tthis.extensions = {};\n\t\tthis.plugins = {};\n\t\tthis.options = options;\n\n\t\t// loader object cache\n\t\tthis.cache = new GLTFRegistry();\n\n\t\t// associations between Three.js objects and glTF elements\n\t\tthis.associations = new Map();\n\n\t\t// BufferGeometry caching\n\t\tthis.primitiveCache = {};\n\n\t\t// Object3D instance caches\n\t\tthis.meshCache = { refs: {}, uses: {} };\n\t\tthis.cameraCache = { refs: {}, uses: {} };\n\t\tthis.lightCache = { refs: {}, uses: {} };\n\n\t\tthis.sourceCache = {};\n\t\tthis.textureCache = {};\n\n\t\t// Track node names, to ensure no duplicates\n\t\tthis.nodeNamesUsed = {};\n\n\t\t// Use an ImageBitmapLoader if imageBitmaps are supported. Moves much of the\n\t\t// expensive work of uploading a texture to the GPU off the main thread.\n\n\t\tconst isSafari = /^((?!chrome|android).)*safari/i.test( navigator.userAgent ) === true;\n\t\tconst isFirefox = navigator.userAgent.indexOf( 'Firefox' ) > - 1;\n\t\tconst firefoxVersion = isFirefox ? navigator.userAgent.match( /Firefox\\/([0-9]+)\\./ )[ 1 ] : - 1;\n\n\t\tif ( typeof createImageBitmap === 'undefined' || isSafari || ( isFirefox && firefoxVersion < 98 ) ) {\n\n\t\t\tthis.textureLoader = new TextureLoader( this.options.manager );\n\n\t\t} else {\n\n\t\t\tthis.textureLoader = new ImageBitmapLoader( this.options.manager );\n\n\t\t}\n\n\t\tthis.textureLoader.setCrossOrigin( this.options.crossOrigin );\n\t\tthis.textureLoader.setRequestHeader( this.options.requestHeader );\n\n\t\tthis.fileLoader = new FileLoader( this.options.manager );\n\t\tthis.fileLoader.setResponseType( 'arraybuffer' );\n\n\t\tif ( this.options.crossOrigin === 'use-credentials' ) {\n\n\t\t\tthis.fileLoader.setWithCredentials( true );\n\n\t\t}\n\n\t}\n\n\tsetExtensions( extensions ) {\n\n\t\tthis.extensions = extensions;\n\n\t}\n\n\tsetPlugins( plugins ) {\n\n\t\tthis.plugins = plugins;\n\n\t}\n\n\tparse( onLoad, onError ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\t\tconst extensions = this.extensions;\n\n\t\t// Clear the loader cache\n\t\tthis.cache.removeAll();\n\n\t\t// Mark the special nodes/meshes in json for efficient parse\n\t\tthis._invokeAll( function ( ext ) {\n\n\t\t\treturn ext._markDefs && ext._markDefs();\n\n\t\t} );\n\n\t\tPromise.all( this._invokeAll( function ( ext ) {\n\n\t\t\treturn ext.beforeRoot && ext.beforeRoot();\n\n\t\t} ) ).then( function () {\n\n\t\t\treturn Promise.all( [\n\n\t\t\t\tparser.getDependencies( 'scene' ),\n\t\t\t\tparser.getDependencies( 'animation' ),\n\t\t\t\tparser.getDependencies( 'camera' ),\n\n\t\t\t] );\n\n\t\t} ).then( function ( dependencies ) {\n\n\t\t\tconst result = {\n\t\t\t\tscene: dependencies[ 0 ][ json.scene || 0 ],\n\t\t\t\tscenes: dependencies[ 0 ],\n\t\t\t\tanimations: dependencies[ 1 ],\n\t\t\t\tcameras: dependencies[ 2 ],\n\t\t\t\tasset: json.asset,\n\t\t\t\tparser: parser,\n\t\t\t\tuserData: {}\n\t\t\t};\n\n\t\t\taddUnknownExtensionsToUserData( extensions, result, json );\n\n\t\t\tassignExtrasToUserData( result, json );\n\n\t\t\tPromise.all( parser._invokeAll( function ( ext ) {\n\n\t\t\t\treturn ext.afterRoot && ext.afterRoot( result );\n\n\t\t\t} ) ).then( function () {\n\n\t\t\t\tonLoad( result );\n\n\t\t\t} );\n\n\t\t} ).catch( onError );\n\n\t}\n\n\t/**\n\t * Marks the special nodes/meshes in json for efficient parse.\n\t */\n\t_markDefs() {\n\n\t\tconst nodeDefs = this.json.nodes || [];\n\t\tconst skinDefs = this.json.skins || [];\n\t\tconst meshDefs = this.json.meshes || [];\n\n\t\t// Nothing in the node definition indicates whether it is a Bone or an\n\t\t// Object3D. Use the skins' joint references to mark bones.\n\t\tfor ( let skinIndex = 0, skinLength = skinDefs.length; skinIndex < skinLength; skinIndex ++ ) {\n\n\t\t\tconst joints = skinDefs[ skinIndex ].joints;\n\n\t\t\tfor ( let i = 0, il = joints.length; i < il; i ++ ) {\n\n\t\t\t\tnodeDefs[ joints[ i ] ].isBone = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Iterate over all nodes, marking references to shared resources,\n\t\t// as well as skeleton joints.\n\t\tfor ( let nodeIndex = 0, nodeLength = nodeDefs.length; nodeIndex < nodeLength; nodeIndex ++ ) {\n\n\t\t\tconst nodeDef = nodeDefs[ nodeIndex ];\n\n\t\t\tif ( nodeDef.mesh !== undefined ) {\n\n\t\t\t\tthis._addNodeRef( this.meshCache, nodeDef.mesh );\n\n\t\t\t\t// Nothing in the mesh definition indicates whether it is\n\t\t\t\t// a SkinnedMesh or Mesh. Use the node's mesh reference\n\t\t\t\t// to mark SkinnedMesh if node has skin.\n\t\t\t\tif ( nodeDef.skin !== undefined ) {\n\n\t\t\t\t\tmeshDefs[ nodeDef.mesh ].isSkinnedMesh = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( nodeDef.camera !== undefined ) {\n\n\t\t\t\tthis._addNodeRef( this.cameraCache, nodeDef.camera );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Counts references to shared node / Object3D resources. These resources\n\t * can be reused, or \"instantiated\", at multiple nodes in the scene\n\t * hierarchy. Mesh, Camera, and Light instances are instantiated and must\n\t * be marked. Non-scenegraph resources (like Materials, Geometries, and\n\t * Textures) can be reused directly and are not marked here.\n\t *\n\t * Example: CesiumMilkTruck sample model reuses \"Wheel\" meshes.\n\t */\n\t_addNodeRef( cache, index ) {\n\n\t\tif ( index === undefined ) return;\n\n\t\tif ( cache.refs[ index ] === undefined ) {\n\n\t\t\tcache.refs[ index ] = cache.uses[ index ] = 0;\n\n\t\t}\n\n\t\tcache.refs[ index ] ++;\n\n\t}\n\n\t/** Returns a reference to a shared resource, cloning it if necessary. */\n\t_getNodeRef( cache, index, object ) {\n\n\t\tif ( cache.refs[ index ] <= 1 ) return object;\n\n\t\tconst ref = object.clone();\n\n\t\t// Propagates mappings to the cloned object, prevents mappings on the\n\t\t// original object from being lost.\n\t\tconst updateMappings = ( original, clone ) => {\n\n\t\t\tconst mappings = this.associations.get( original );\n\t\t\tif ( mappings != null ) {\n\n\t\t\t\tthis.associations.set( clone, mappings );\n\n\t\t\t}\n\n\t\t\tfor ( const [ i, child ] of original.children.entries() ) {\n\n\t\t\t\tupdateMappings( child, clone.children[ i ] );\n\n\t\t\t}\n\n\t\t};\n\n\t\tupdateMappings( object, ref );\n\n\t\tref.name += '_instance_' + ( cache.uses[ index ] ++ );\n\n\t\treturn ref;\n\n\t}\n\n\t_invokeOne( func ) {\n\n\t\tconst extensions = Object.values( this.plugins );\n\t\textensions.push( this );\n\n\t\tfor ( let i = 0; i < extensions.length; i ++ ) {\n\n\t\t\tconst result = func( extensions[ i ] );\n\n\t\t\tif ( result ) return result;\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\t_invokeAll( func ) {\n\n\t\tconst extensions = Object.values( this.plugins );\n\t\textensions.unshift( this );\n\n\t\tconst pending = [];\n\n\t\tfor ( let i = 0; i < extensions.length; i ++ ) {\n\n\t\t\tconst result = func( extensions[ i ] );\n\n\t\t\tif ( result ) pending.push( result );\n\n\t\t}\n\n\t\treturn pending;\n\n\t}\n\n\t/**\n\t * Requests the specified dependency asynchronously, with caching.\n\t * @param {string} type\n\t * @param {number} index\n\t * @return {Promise}\n\t */\n\tgetDependency( type, index ) {\n\n\t\tconst cacheKey = type + ':' + index;\n\t\tlet dependency = this.cache.get( cacheKey );\n\n\t\tif ( ! dependency ) {\n\n\t\t\tswitch ( type ) {\n\n\t\t\t\tcase 'scene':\n\t\t\t\t\tdependency = this.loadScene( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'node':\n\t\t\t\t\tdependency = this.loadNode( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'mesh':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadMesh && ext.loadMesh( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'accessor':\n\t\t\t\t\tdependency = this.loadAccessor( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'bufferView':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadBufferView && ext.loadBufferView( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'buffer':\n\t\t\t\t\tdependency = this.loadBuffer( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'material':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadMaterial && ext.loadMaterial( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'texture':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadTexture && ext.loadTexture( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'skin':\n\t\t\t\t\tdependency = this.loadSkin( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'animation':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadAnimation && ext.loadAnimation( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'camera':\n\t\t\t\t\tdependency = this.loadCamera( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error( 'Unknown type: ' + type );\n\n\t\t\t}\n\n\t\t\tthis.cache.add( cacheKey, dependency );\n\n\t\t}\n\n\t\treturn dependency;\n\n\t}\n\n\t/**\n\t * Requests all dependencies of the specified type asynchronously, with caching.\n\t * @param {string} type\n\t * @return {Promise>}\n\t */\n\tgetDependencies( type ) {\n\n\t\tlet dependencies = this.cache.get( type );\n\n\t\tif ( ! dependencies ) {\n\n\t\t\tconst parser = this;\n\t\t\tconst defs = this.json[ type + ( type === 'mesh' ? 'es' : 's' ) ] || [];\n\n\t\t\tdependencies = Promise.all( defs.map( function ( def, index ) {\n\n\t\t\t\treturn parser.getDependency( type, index );\n\n\t\t\t} ) );\n\n\t\t\tthis.cache.add( type, dependencies );\n\n\t\t}\n\n\t\treturn dependencies;\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#buffers-and-buffer-views\n\t * @param {number} bufferIndex\n\t * @return {Promise}\n\t */\n\tloadBuffer( bufferIndex ) {\n\n\t\tconst bufferDef = this.json.buffers[ bufferIndex ];\n\t\tconst loader = this.fileLoader;\n\n\t\tif ( bufferDef.type && bufferDef.type !== 'arraybuffer' ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: ' + bufferDef.type + ' buffer type is not supported.' );\n\n\t\t}\n\n\t\t// If present, GLB container is required to be the first buffer.\n\t\tif ( bufferDef.uri === undefined && bufferIndex === 0 ) {\n\n\t\t\treturn Promise.resolve( this.extensions[ EXTENSIONS.KHR_BINARY_GLTF ].body );\n\n\t\t}\n\n\t\tconst options = this.options;\n\n\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\tloader.load( LoaderUtils.resolveURL( bufferDef.uri, options.path ), resolve, undefined, function () {\n\n\t\t\t\treject( new Error( 'THREE.GLTFLoader: Failed to load buffer \"' + bufferDef.uri + '\".' ) );\n\n\t\t\t} );\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#buffers-and-buffer-views\n\t * @param {number} bufferViewIndex\n\t * @return {Promise}\n\t */\n\tloadBufferView( bufferViewIndex ) {\n\n\t\tconst bufferViewDef = this.json.bufferViews[ bufferViewIndex ];\n\n\t\treturn this.getDependency( 'buffer', bufferViewDef.buffer ).then( function ( buffer ) {\n\n\t\t\tconst byteLength = bufferViewDef.byteLength || 0;\n\t\t\tconst byteOffset = bufferViewDef.byteOffset || 0;\n\t\t\treturn buffer.slice( byteOffset, byteOffset + byteLength );\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#accessors\n\t * @param {number} accessorIndex\n\t * @return {Promise}\n\t */\n\tloadAccessor( accessorIndex ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\n\t\tconst accessorDef = this.json.accessors[ accessorIndex ];\n\n\t\tif ( accessorDef.bufferView === undefined && accessorDef.sparse === undefined ) {\n\n\t\t\t// Ignore empty accessors, which may be used to declare runtime\n\t\t\t// information about attributes coming from another source (e.g. Draco\n\t\t\t// compression extension).\n\t\t\treturn Promise.resolve( null );\n\n\t\t}\n\n\t\tconst pendingBufferViews = [];\n\n\t\tif ( accessorDef.bufferView !== undefined ) {\n\n\t\t\tpendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.bufferView ) );\n\n\t\t} else {\n\n\t\t\tpendingBufferViews.push( null );\n\n\t\t}\n\n\t\tif ( accessorDef.sparse !== undefined ) {\n\n\t\t\tpendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.sparse.indices.bufferView ) );\n\t\t\tpendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.sparse.values.bufferView ) );\n\n\t\t}\n\n\t\treturn Promise.all( pendingBufferViews ).then( function ( bufferViews ) {\n\n\t\t\tconst bufferView = bufferViews[ 0 ];\n\n\t\t\tconst itemSize = WEBGL_TYPE_SIZES[ accessorDef.type ];\n\t\t\tconst TypedArray = WEBGL_COMPONENT_TYPES[ accessorDef.componentType ];\n\n\t\t\t// For VEC3: itemSize is 3, elementBytes is 4, itemBytes is 12.\n\t\t\tconst elementBytes = TypedArray.BYTES_PER_ELEMENT;\n\t\t\tconst itemBytes = elementBytes * itemSize;\n\t\t\tconst byteOffset = accessorDef.byteOffset || 0;\n\t\t\tconst byteStride = accessorDef.bufferView !== undefined ? json.bufferViews[ accessorDef.bufferView ].byteStride : undefined;\n\t\t\tconst normalized = accessorDef.normalized === true;\n\t\t\tlet array, bufferAttribute;\n\n\t\t\t// The buffer is not interleaved if the stride is the item size in bytes.\n\t\t\tif ( byteStride && byteStride !== itemBytes ) {\n\n\t\t\t\t// Each \"slice\" of the buffer, as defined by 'count' elements of 'byteStride' bytes, gets its own InterleavedBuffer\n\t\t\t\t// This makes sure that IBA.count reflects accessor.count properly\n\t\t\t\tconst ibSlice = Math.floor( byteOffset / byteStride );\n\t\t\t\tconst ibCacheKey = 'InterleavedBuffer:' + accessorDef.bufferView + ':' + accessorDef.componentType + ':' + ibSlice + ':' + accessorDef.count;\n\t\t\t\tlet ib = parser.cache.get( ibCacheKey );\n\n\t\t\t\tif ( ! ib ) {\n\n\t\t\t\t\tarray = new TypedArray( bufferView, ibSlice * byteStride, accessorDef.count * byteStride / elementBytes );\n\n\t\t\t\t\t// Integer parameters to IB/IBA are in array elements, not bytes.\n\t\t\t\t\tib = new InterleavedBuffer( array, byteStride / elementBytes );\n\n\t\t\t\t\tparser.cache.add( ibCacheKey, ib );\n\n\t\t\t\t}\n\n\t\t\t\tbufferAttribute = new InterleavedBufferAttribute( ib, itemSize, ( byteOffset % byteStride ) / elementBytes, normalized );\n\n\t\t\t} else {\n\n\t\t\t\tif ( bufferView === null ) {\n\n\t\t\t\t\tarray = new TypedArray( accessorDef.count * itemSize );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tarray = new TypedArray( bufferView, byteOffset, accessorDef.count * itemSize );\n\n\t\t\t\t}\n\n\t\t\t\tbufferAttribute = new BufferAttribute( array, itemSize, normalized );\n\n\t\t\t}\n\n\t\t\t// https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#sparse-accessors\n\t\t\tif ( accessorDef.sparse !== undefined ) {\n\n\t\t\t\tconst itemSizeIndices = WEBGL_TYPE_SIZES.SCALAR;\n\t\t\t\tconst TypedArrayIndices = WEBGL_COMPONENT_TYPES[ accessorDef.sparse.indices.componentType ];\n\n\t\t\t\tconst byteOffsetIndices = accessorDef.sparse.indices.byteOffset || 0;\n\t\t\t\tconst byteOffsetValues = accessorDef.sparse.values.byteOffset || 0;\n\n\t\t\t\tconst sparseIndices = new TypedArrayIndices( bufferViews[ 1 ], byteOffsetIndices, accessorDef.sparse.count * itemSizeIndices );\n\t\t\t\tconst sparseValues = new TypedArray( bufferViews[ 2 ], byteOffsetValues, accessorDef.sparse.count * itemSize );\n\n\t\t\t\tif ( bufferView !== null ) {\n\n\t\t\t\t\t// Avoid modifying the original ArrayBuffer, if the bufferView wasn't initialized with zeroes.\n\t\t\t\t\tbufferAttribute = new BufferAttribute( bufferAttribute.array.slice(), bufferAttribute.itemSize, bufferAttribute.normalized );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0, il = sparseIndices.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst index = sparseIndices[ i ];\n\n\t\t\t\t\tbufferAttribute.setX( index, sparseValues[ i * itemSize ] );\n\t\t\t\t\tif ( itemSize >= 2 ) bufferAttribute.setY( index, sparseValues[ i * itemSize + 1 ] );\n\t\t\t\t\tif ( itemSize >= 3 ) bufferAttribute.setZ( index, sparseValues[ i * itemSize + 2 ] );\n\t\t\t\t\tif ( itemSize >= 4 ) bufferAttribute.setW( index, sparseValues[ i * itemSize + 3 ] );\n\t\t\t\t\tif ( itemSize >= 5 ) throw new Error( 'THREE.GLTFLoader: Unsupported itemSize in sparse BufferAttribute.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn bufferAttribute;\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#textures\n\t * @param {number} textureIndex\n\t * @return {Promise}\n\t */\n\tloadTexture( textureIndex ) {\n\n\t\tconst json = this.json;\n\t\tconst options = this.options;\n\t\tconst textureDef = json.textures[ textureIndex ];\n\t\tconst sourceIndex = textureDef.source;\n\t\tconst sourceDef = json.images[ sourceIndex ];\n\n\t\tlet loader = this.textureLoader;\n\n\t\tif ( sourceDef.uri ) {\n\n\t\t\tconst handler = options.manager.getHandler( sourceDef.uri );\n\t\t\tif ( handler !== null ) loader = handler;\n\n\t\t}\n\n\t\treturn this.loadTextureImage( textureIndex, sourceIndex, loader );\n\n\t}\n\n\tloadTextureImage( textureIndex, sourceIndex, loader ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\n\t\tconst textureDef = json.textures[ textureIndex ];\n\t\tconst sourceDef = json.images[ sourceIndex ];\n\n\t\tconst cacheKey = ( sourceDef.uri || sourceDef.bufferView ) + ':' + textureDef.sampler;\n\n\t\tif ( this.textureCache[ cacheKey ] ) {\n\n\t\t\t// See https://github.com/mrdoob/three.js/issues/21559.\n\t\t\treturn this.textureCache[ cacheKey ];\n\n\t\t}\n\n\t\tconst promise = this.loadImageSource( sourceIndex, loader ).then( function ( texture ) {\n\n\t\t\ttexture.flipY = false;\n\n\t\t\tif ( textureDef.name ) texture.name = textureDef.name;\n\n\t\t\tconst samplers = json.samplers || {};\n\t\t\tconst sampler = samplers[ textureDef.sampler ] || {};\n\n\t\t\ttexture.magFilter = WEBGL_FILTERS[ sampler.magFilter ] || LinearFilter;\n\t\t\ttexture.minFilter = WEBGL_FILTERS[ sampler.minFilter ] || LinearMipmapLinearFilter;\n\t\t\ttexture.wrapS = WEBGL_WRAPPINGS[ sampler.wrapS ] || RepeatWrapping;\n\t\t\ttexture.wrapT = WEBGL_WRAPPINGS[ sampler.wrapT ] || RepeatWrapping;\n\n\t\t\tparser.associations.set( texture, { textures: textureIndex } );\n\n\t\t\treturn texture;\n\n\t\t} ).catch( function () {\n\n\t\t\treturn null;\n\n\t\t} );\n\n\t\tthis.textureCache[ cacheKey ] = promise;\n\n\t\treturn promise;\n\n\t}\n\n\tloadImageSource( sourceIndex, loader ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\t\tconst options = this.options;\n\n\t\tif ( this.sourceCache[ sourceIndex ] !== undefined ) {\n\n\t\t\treturn this.sourceCache[ sourceIndex ].then( ( texture ) => texture.clone() );\n\n\t\t}\n\n\t\tconst sourceDef = json.images[ sourceIndex ];\n\n\t\tconst URL = self.URL || self.webkitURL;\n\n\t\tlet sourceURI = sourceDef.uri || '';\n\t\tlet isObjectURL = false;\n\n\t\tif ( sourceDef.bufferView !== undefined ) {\n\n\t\t\t// Load binary image data from bufferView, if provided.\n\n\t\t\tsourceURI = parser.getDependency( 'bufferView', sourceDef.bufferView ).then( function ( bufferView ) {\n\n\t\t\t\tisObjectURL = true;\n\t\t\t\tconst blob = new Blob( [ bufferView ], { type: sourceDef.mimeType } );\n\t\t\t\tsourceURI = URL.createObjectURL( blob );\n\t\t\t\treturn sourceURI;\n\n\t\t\t} );\n\n\t\t} else if ( sourceDef.uri === undefined ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: Image ' + sourceIndex + ' is missing URI and bufferView' );\n\n\t\t}\n\n\t\tconst promise = Promise.resolve( sourceURI ).then( function ( sourceURI ) {\n\n\t\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\t\tlet onLoad = resolve;\n\n\t\t\t\tif ( loader.isImageBitmapLoader === true ) {\n\n\t\t\t\t\tonLoad = function ( imageBitmap ) {\n\n\t\t\t\t\t\tconst texture = new Texture( imageBitmap );\n\t\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\t\tresolve( texture );\n\n\t\t\t\t\t};\n\n\t\t\t\t}\n\n\t\t\t\tloader.load( LoaderUtils.resolveURL( sourceURI, options.path ), onLoad, undefined, reject );\n\n\t\t\t} );\n\n\t\t} ).then( function ( texture ) {\n\n\t\t\t// Clean up resources and configure Texture.\n\n\t\t\tif ( isObjectURL === true ) {\n\n\t\t\t\tURL.revokeObjectURL( sourceURI );\n\n\t\t\t}\n\n\t\t\ttexture.userData.mimeType = sourceDef.mimeType || getImageURIMimeType( sourceDef.uri );\n\n\t\t\treturn texture;\n\n\t\t} ).catch( function ( error ) {\n\n\t\t\tconsole.error( 'THREE.GLTFLoader: Couldn\\'t load texture', sourceURI );\n\t\t\tthrow error;\n\n\t\t} );\n\n\t\tthis.sourceCache[ sourceIndex ] = promise;\n\t\treturn promise;\n\n\t}\n\n\t/**\n\t * Asynchronously assigns a texture to the given material parameters.\n\t * @param {Object} materialParams\n\t * @param {string} mapName\n\t * @param {Object} mapDef\n\t * @return {Promise}\n\t */\n\tassignTexture( materialParams, mapName, mapDef, encoding ) {\n\n\t\tconst parser = this;\n\n\t\treturn this.getDependency( 'texture', mapDef.index ).then( function ( texture ) {\n\n\t\t\t// Materials sample aoMap from UV set 1 and other maps from UV set 0 - this can't be configured\n\t\t\t// However, we will copy UV set 0 to UV set 1 on demand for aoMap\n\t\t\tif ( mapDef.texCoord !== undefined && mapDef.texCoord != 0 && ! ( mapName === 'aoMap' && mapDef.texCoord == 1 ) ) {\n\n\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Custom UV set ' + mapDef.texCoord + ' for texture ' + mapName + ' not yet supported.' );\n\n\t\t\t}\n\n\t\t\tif ( parser.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ] ) {\n\n\t\t\t\tconst transform = mapDef.extensions !== undefined ? mapDef.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ] : undefined;\n\n\t\t\t\tif ( transform ) {\n\n\t\t\t\t\tconst gltfReference = parser.associations.get( texture );\n\t\t\t\t\ttexture = parser.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ].extendTexture( texture, transform );\n\t\t\t\t\tparser.associations.set( texture, gltfReference );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( encoding !== undefined ) {\n\n\t\t\t\ttexture.encoding = encoding;\n\n\t\t\t}\n\n\t\t\tmaterialParams[ mapName ] = texture;\n\n\t\t\treturn texture;\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Assigns final material to a Mesh, Line, or Points instance. The instance\n\t * already has a material (generated from the glTF material options alone)\n\t * but reuse of the same glTF material may require multiple threejs materials\n\t * to accommodate different primitive types, defines, etc. New materials will\n\t * be created if necessary, and reused from a cache.\n\t * @param {Object3D} mesh Mesh, Line, or Points instance.\n\t */\n\tassignFinalMaterial( mesh ) {\n\n\t\tconst geometry = mesh.geometry;\n\t\tlet material = mesh.material;\n\n\t\tconst useDerivativeTangents = geometry.attributes.tangent === undefined;\n\t\tconst useVertexColors = geometry.attributes.color !== undefined;\n\t\tconst useFlatShading = geometry.attributes.normal === undefined;\n\n\t\tif ( mesh.isPoints ) {\n\n\t\t\tconst cacheKey = 'PointsMaterial:' + material.uuid;\n\n\t\t\tlet pointsMaterial = this.cache.get( cacheKey );\n\n\t\t\tif ( ! pointsMaterial ) {\n\n\t\t\t\tpointsMaterial = new PointsMaterial();\n\t\t\t\tMaterial.prototype.copy.call( pointsMaterial, material );\n\t\t\t\tpointsMaterial.color.copy( material.color );\n\t\t\t\tpointsMaterial.map = material.map;\n\t\t\t\tpointsMaterial.sizeAttenuation = false; // glTF spec says points should be 1px\n\n\t\t\t\tthis.cache.add( cacheKey, pointsMaterial );\n\n\t\t\t}\n\n\t\t\tmaterial = pointsMaterial;\n\n\t\t} else if ( mesh.isLine ) {\n\n\t\t\tconst cacheKey = 'LineBasicMaterial:' + material.uuid;\n\n\t\t\tlet lineMaterial = this.cache.get( cacheKey );\n\n\t\t\tif ( ! lineMaterial ) {\n\n\t\t\t\tlineMaterial = new LineBasicMaterial();\n\t\t\t\tMaterial.prototype.copy.call( lineMaterial, material );\n\t\t\t\tlineMaterial.color.copy( material.color );\n\n\t\t\t\tthis.cache.add( cacheKey, lineMaterial );\n\n\t\t\t}\n\n\t\t\tmaterial = lineMaterial;\n\n\t\t}\n\n\t\t// Clone the material if it will be modified\n\t\tif ( useDerivativeTangents || useVertexColors || useFlatShading ) {\n\n\t\t\tlet cacheKey = 'ClonedMaterial:' + material.uuid + ':';\n\n\t\t\tif ( material.isGLTFSpecularGlossinessMaterial ) cacheKey += 'specular-glossiness:';\n\t\t\tif ( useDerivativeTangents ) cacheKey += 'derivative-tangents:';\n\t\t\tif ( useVertexColors ) cacheKey += 'vertex-colors:';\n\t\t\tif ( useFlatShading ) cacheKey += 'flat-shading:';\n\n\t\t\tlet cachedMaterial = this.cache.get( cacheKey );\n\n\t\t\tif ( ! cachedMaterial ) {\n\n\t\t\t\tcachedMaterial = material.clone();\n\n\t\t\t\tif ( useVertexColors ) cachedMaterial.vertexColors = true;\n\t\t\t\tif ( useFlatShading ) cachedMaterial.flatShading = true;\n\n\t\t\t\tif ( useDerivativeTangents ) {\n\n\t\t\t\t\t// https://github.com/mrdoob/three.js/issues/11438#issuecomment-507003995\n\t\t\t\t\tif ( cachedMaterial.normalScale ) cachedMaterial.normalScale.y *= - 1;\n\t\t\t\t\tif ( cachedMaterial.clearcoatNormalScale ) cachedMaterial.clearcoatNormalScale.y *= - 1;\n\n\t\t\t\t}\n\n\t\t\t\tthis.cache.add( cacheKey, cachedMaterial );\n\n\t\t\t\tthis.associations.set( cachedMaterial, this.associations.get( material ) );\n\n\t\t\t}\n\n\t\t\tmaterial = cachedMaterial;\n\n\t\t}\n\n\t\t// workarounds for mesh and geometry\n\n\t\tif ( material.aoMap && geometry.attributes.uv2 === undefined && geometry.attributes.uv !== undefined ) {\n\n\t\t\tgeometry.setAttribute( 'uv2', geometry.attributes.uv );\n\n\t\t}\n\n\t\tmesh.material = material;\n\n\t}\n\n\tgetMaterialType( /* materialIndex */ ) {\n\n\t\treturn MeshStandardMaterial;\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#materials\n\t * @param {number} materialIndex\n\t * @return {Promise}\n\t */\n\tloadMaterial( materialIndex ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\t\tconst extensions = this.extensions;\n\t\tconst materialDef = json.materials[ materialIndex ];\n\n\t\tlet materialType;\n\t\tconst materialParams = {};\n\t\tconst materialExtensions = materialDef.extensions || {};\n\n\t\tconst pending = [];\n\n\t\tif ( materialExtensions[ EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS ] ) {\n\n\t\t\tconst sgExtension = extensions[ EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS ];\n\t\t\tmaterialType = sgExtension.getMaterialType();\n\t\t\tpending.push( sgExtension.extendParams( materialParams, materialDef, parser ) );\n\n\t\t} else if ( materialExtensions[ EXTENSIONS.KHR_MATERIALS_UNLIT ] ) {\n\n\t\t\tconst kmuExtension = extensions[ EXTENSIONS.KHR_MATERIALS_UNLIT ];\n\t\t\tmaterialType = kmuExtension.getMaterialType();\n\t\t\tpending.push( kmuExtension.extendParams( materialParams, materialDef, parser ) );\n\n\t\t} else {\n\n\t\t\t// Specification:\n\t\t\t// https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#metallic-roughness-material\n\n\t\t\tconst metallicRoughness = materialDef.pbrMetallicRoughness || {};\n\n\t\t\tmaterialParams.color = new Color( 1.0, 1.0, 1.0 );\n\t\t\tmaterialParams.opacity = 1.0;\n\n\t\t\tif ( Array.isArray( metallicRoughness.baseColorFactor ) ) {\n\n\t\t\t\tconst array = metallicRoughness.baseColorFactor;\n\n\t\t\t\tmaterialParams.color.fromArray( array );\n\t\t\t\tmaterialParams.opacity = array[ 3 ];\n\n\t\t\t}\n\n\t\t\tif ( metallicRoughness.baseColorTexture !== undefined ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'map', metallicRoughness.baseColorTexture, sRGBEncoding ) );\n\n\t\t\t}\n\n\t\t\tmaterialParams.metalness = metallicRoughness.metallicFactor !== undefined ? metallicRoughness.metallicFactor : 1.0;\n\t\t\tmaterialParams.roughness = metallicRoughness.roughnessFactor !== undefined ? metallicRoughness.roughnessFactor : 1.0;\n\n\t\t\tif ( metallicRoughness.metallicRoughnessTexture !== undefined ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'metalnessMap', metallicRoughness.metallicRoughnessTexture ) );\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'roughnessMap', metallicRoughness.metallicRoughnessTexture ) );\n\n\t\t\t}\n\n\t\t\tmaterialType = this._invokeOne( function ( ext ) {\n\n\t\t\t\treturn ext.getMaterialType && ext.getMaterialType( materialIndex );\n\n\t\t\t} );\n\n\t\t\tpending.push( Promise.all( this._invokeAll( function ( ext ) {\n\n\t\t\t\treturn ext.extendMaterialParams && ext.extendMaterialParams( materialIndex, materialParams );\n\n\t\t\t} ) ) );\n\n\t\t}\n\n\t\tif ( materialDef.doubleSided === true ) {\n\n\t\t\tmaterialParams.side = DoubleSide;\n\n\t\t}\n\n\t\tconst alphaMode = materialDef.alphaMode || ALPHA_MODES.OPAQUE;\n\n\t\tif ( alphaMode === ALPHA_MODES.BLEND ) {\n\n\t\t\tmaterialParams.transparent = true;\n\n\t\t\t// See: https://github.com/mrdoob/three.js/issues/17706\n\t\t\tmaterialParams.depthWrite = false;\n\n\t\t} else {\n\n\t\t\tmaterialParams.transparent = false;\n\n\t\t\tif ( alphaMode === ALPHA_MODES.MASK ) {\n\n\t\t\t\tmaterialParams.alphaTest = materialDef.alphaCutoff !== undefined ? materialDef.alphaCutoff : 0.5;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( materialDef.normalTexture !== undefined && materialType !== MeshBasicMaterial ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'normalMap', materialDef.normalTexture ) );\n\n\t\t\tmaterialParams.normalScale = new Vector2( 1, 1 );\n\n\t\t\tif ( materialDef.normalTexture.scale !== undefined ) {\n\n\t\t\t\tconst scale = materialDef.normalTexture.scale;\n\n\t\t\t\tmaterialParams.normalScale.set( scale, scale );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( materialDef.occlusionTexture !== undefined && materialType !== MeshBasicMaterial ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'aoMap', materialDef.occlusionTexture ) );\n\n\t\t\tif ( materialDef.occlusionTexture.strength !== undefined ) {\n\n\t\t\t\tmaterialParams.aoMapIntensity = materialDef.occlusionTexture.strength;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( materialDef.emissiveFactor !== undefined && materialType !== MeshBasicMaterial ) {\n\n\t\t\tmaterialParams.emissive = new Color().fromArray( materialDef.emissiveFactor );\n\n\t\t}\n\n\t\tif ( materialDef.emissiveTexture !== undefined && materialType !== MeshBasicMaterial ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'emissiveMap', materialDef.emissiveTexture, sRGBEncoding ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending ).then( function () {\n\n\t\t\tlet material;\n\n\t\t\tif ( materialType === GLTFMeshStandardSGMaterial ) {\n\n\t\t\t\tmaterial = extensions[ EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS ].createMaterial( materialParams );\n\n\t\t\t} else {\n\n\t\t\t\tmaterial = new materialType( materialParams );\n\n\t\t\t}\n\n\t\t\tif ( materialDef.name ) material.name = materialDef.name;\n\n\t\t\tassignExtrasToUserData( material, materialDef );\n\n\t\t\tparser.associations.set( material, { materials: materialIndex } );\n\n\t\t\tif ( materialDef.extensions ) addUnknownExtensionsToUserData( extensions, material, materialDef );\n\n\t\t\treturn material;\n\n\t\t} );\n\n\t}\n\n\t/** When Object3D instances are targeted by animation, they need unique names. */\n\tcreateUniqueName( originalName ) {\n\n\t\tconst sanitizedName = PropertyBinding.sanitizeNodeName( originalName || '' );\n\n\t\tlet name = sanitizedName;\n\n\t\tfor ( let i = 1; this.nodeNamesUsed[ name ]; ++ i ) {\n\n\t\t\tname = sanitizedName + '_' + i;\n\n\t\t}\n\n\t\tthis.nodeNamesUsed[ name ] = true;\n\n\t\treturn name;\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#geometry\n\t *\n\t * Creates BufferGeometries from primitives.\n\t *\n\t * @param {Array} primitives\n\t * @return {Promise>}\n\t */\n\tloadGeometries( primitives ) {\n\n\t\tconst parser = this;\n\t\tconst extensions = this.extensions;\n\t\tconst cache = this.primitiveCache;\n\n\t\tfunction createDracoPrimitive( primitive ) {\n\n\t\t\treturn extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ]\n\t\t\t\t.decodePrimitive( primitive, parser )\n\t\t\t\t.then( function ( geometry ) {\n\n\t\t\t\t\treturn addPrimitiveAttributes( geometry, primitive, parser );\n\n\t\t\t\t} );\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tfor ( let i = 0, il = primitives.length; i < il; i ++ ) {\n\n\t\t\tconst primitive = primitives[ i ];\n\t\t\tconst cacheKey = createPrimitiveKey( primitive );\n\n\t\t\t// See if we've already created this geometry\n\t\t\tconst cached = cache[ cacheKey ];\n\n\t\t\tif ( cached ) {\n\n\t\t\t\t// Use the cached geometry if it exists\n\t\t\t\tpending.push( cached.promise );\n\n\t\t\t} else {\n\n\t\t\t\tlet geometryPromise;\n\n\t\t\t\tif ( primitive.extensions && primitive.extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ] ) {\n\n\t\t\t\t\t// Use DRACO geometry if available\n\t\t\t\t\tgeometryPromise = createDracoPrimitive( primitive );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Otherwise create a new geometry\n\t\t\t\t\tgeometryPromise = addPrimitiveAttributes( new BufferGeometry(), primitive, parser );\n\n\t\t\t\t}\n\n\t\t\t\t// Cache this geometry\n\t\t\t\tcache[ cacheKey ] = { primitive: primitive, promise: geometryPromise };\n\n\t\t\t\tpending.push( geometryPromise );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#meshes\n\t * @param {number} meshIndex\n\t * @return {Promise}\n\t */\n\tloadMesh( meshIndex ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\t\tconst extensions = this.extensions;\n\n\t\tconst meshDef = json.meshes[ meshIndex ];\n\t\tconst primitives = meshDef.primitives;\n\n\t\tconst pending = [];\n\n\t\tfor ( let i = 0, il = primitives.length; i < il; i ++ ) {\n\n\t\t\tconst material = primitives[ i ].material === undefined\n\t\t\t\t? createDefaultMaterial( this.cache )\n\t\t\t\t: this.getDependency( 'material', primitives[ i ].material );\n\n\t\t\tpending.push( material );\n\n\t\t}\n\n\t\tpending.push( parser.loadGeometries( primitives ) );\n\n\t\treturn Promise.all( pending ).then( function ( results ) {\n\n\t\t\tconst materials = results.slice( 0, results.length - 1 );\n\t\t\tconst geometries = results[ results.length - 1 ];\n\n\t\t\tconst meshes = [];\n\n\t\t\tfor ( let i = 0, il = geometries.length; i < il; i ++ ) {\n\n\t\t\t\tconst geometry = geometries[ i ];\n\t\t\t\tconst primitive = primitives[ i ];\n\n\t\t\t\t// 1. create Mesh\n\n\t\t\t\tlet mesh;\n\n\t\t\t\tconst material = materials[ i ];\n\n\t\t\t\tif ( primitive.mode === WEBGL_CONSTANTS.TRIANGLES ||\n\t\t\t\t\t\tprimitive.mode === WEBGL_CONSTANTS.TRIANGLE_STRIP ||\n\t\t\t\t\t\tprimitive.mode === WEBGL_CONSTANTS.TRIANGLE_FAN ||\n\t\t\t\t\t\tprimitive.mode === undefined ) {\n\n\t\t\t\t\t// .isSkinnedMesh isn't in glTF spec. See ._markDefs()\n\t\t\t\t\tmesh = meshDef.isSkinnedMesh === true\n\t\t\t\t\t\t? new SkinnedMesh( geometry, material )\n\t\t\t\t\t\t: new Mesh( geometry, material );\n\n\t\t\t\t\tif ( mesh.isSkinnedMesh === true && ! mesh.geometry.attributes.skinWeight.normalized ) {\n\n\t\t\t\t\t\t// we normalize floating point skin weight array to fix malformed assets (see #15319)\n\t\t\t\t\t\t// it's important to skip this for non-float32 data since normalizeSkinWeights assumes non-normalized inputs\n\t\t\t\t\t\tmesh.normalizeSkinWeights();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( primitive.mode === WEBGL_CONSTANTS.TRIANGLE_STRIP ) {\n\n\t\t\t\t\t\tmesh.geometry = toTrianglesDrawMode( mesh.geometry, TriangleStripDrawMode );\n\n\t\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.TRIANGLE_FAN ) {\n\n\t\t\t\t\t\tmesh.geometry = toTrianglesDrawMode( mesh.geometry, TriangleFanDrawMode );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.LINES ) {\n\n\t\t\t\t\tmesh = new LineSegments( geometry, material );\n\n\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.LINE_STRIP ) {\n\n\t\t\t\t\tmesh = new Line( geometry, material );\n\n\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.LINE_LOOP ) {\n\n\t\t\t\t\tmesh = new LineLoop( geometry, material );\n\n\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.POINTS ) {\n\n\t\t\t\t\tmesh = new Points( geometry, material );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new Error( 'THREE.GLTFLoader: Primitive mode unsupported: ' + primitive.mode );\n\n\t\t\t\t}\n\n\t\t\t\tif ( Object.keys( mesh.geometry.morphAttributes ).length > 0 ) {\n\n\t\t\t\t\tupdateMorphTargets( mesh, meshDef );\n\n\t\t\t\t}\n\n\t\t\t\tmesh.name = parser.createUniqueName( meshDef.name || ( 'mesh_' + meshIndex ) );\n\n\t\t\t\tassignExtrasToUserData( mesh, meshDef );\n\n\t\t\t\tif ( primitive.extensions ) addUnknownExtensionsToUserData( extensions, mesh, primitive );\n\n\t\t\t\tparser.assignFinalMaterial( mesh );\n\n\t\t\t\tmeshes.push( mesh );\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0, il = meshes.length; i < il; i ++ ) {\n\n\t\t\t\tparser.associations.set( meshes[ i ], {\n\t\t\t\t\tmeshes: meshIndex,\n\t\t\t\t\tprimitives: i\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tif ( meshes.length === 1 ) {\n\n\t\t\t\treturn meshes[ 0 ];\n\n\t\t\t}\n\n\t\t\tconst group = new Group();\n\n\t\t\tparser.associations.set( group, { meshes: meshIndex } );\n\n\t\t\tfor ( let i = 0, il = meshes.length; i < il; i ++ ) {\n\n\t\t\t\tgroup.add( meshes[ i ] );\n\n\t\t\t}\n\n\t\t\treturn group;\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#cameras\n\t * @param {number} cameraIndex\n\t * @return {Promise}\n\t */\n\tloadCamera( cameraIndex ) {\n\n\t\tlet camera;\n\t\tconst cameraDef = this.json.cameras[ cameraIndex ];\n\t\tconst params = cameraDef[ cameraDef.type ];\n\n\t\tif ( ! params ) {\n\n\t\t\tconsole.warn( 'THREE.GLTFLoader: Missing camera parameters.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( cameraDef.type === 'perspective' ) {\n\n\t\t\tcamera = new PerspectiveCamera( MathUtils.radToDeg( params.yfov ), params.aspectRatio || 1, params.znear || 1, params.zfar || 2e6 );\n\n\t\t} else if ( cameraDef.type === 'orthographic' ) {\n\n\t\t\tcamera = new OrthographicCamera( - params.xmag, params.xmag, params.ymag, - params.ymag, params.znear, params.zfar );\n\n\t\t}\n\n\t\tif ( cameraDef.name ) camera.name = this.createUniqueName( cameraDef.name );\n\n\t\tassignExtrasToUserData( camera, cameraDef );\n\n\t\treturn Promise.resolve( camera );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#skins\n\t * @param {number} skinIndex\n\t * @return {Promise}\n\t */\n\tloadSkin( skinIndex ) {\n\n\t\tconst skinDef = this.json.skins[ skinIndex ];\n\n\t\tconst skinEntry = { joints: skinDef.joints };\n\n\t\tif ( skinDef.inverseBindMatrices === undefined ) {\n\n\t\t\treturn Promise.resolve( skinEntry );\n\n\t\t}\n\n\t\treturn this.getDependency( 'accessor', skinDef.inverseBindMatrices ).then( function ( accessor ) {\n\n\t\t\tskinEntry.inverseBindMatrices = accessor;\n\n\t\t\treturn skinEntry;\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#animations\n\t * @param {number} animationIndex\n\t * @return {Promise}\n\t */\n\tloadAnimation( animationIndex ) {\n\n\t\tconst json = this.json;\n\n\t\tconst animationDef = json.animations[ animationIndex ];\n\n\t\tconst pendingNodes = [];\n\t\tconst pendingInputAccessors = [];\n\t\tconst pendingOutputAccessors = [];\n\t\tconst pendingSamplers = [];\n\t\tconst pendingTargets = [];\n\n\t\tfor ( let i = 0, il = animationDef.channels.length; i < il; i ++ ) {\n\n\t\t\tconst channel = animationDef.channels[ i ];\n\t\t\tconst sampler = animationDef.samplers[ channel.sampler ];\n\t\t\tconst target = channel.target;\n\t\t\tconst name = target.node !== undefined ? target.node : target.id; // NOTE: target.id is deprecated.\n\t\t\tconst input = animationDef.parameters !== undefined ? animationDef.parameters[ sampler.input ] : sampler.input;\n\t\t\tconst output = animationDef.parameters !== undefined ? animationDef.parameters[ sampler.output ] : sampler.output;\n\n\t\t\tpendingNodes.push( this.getDependency( 'node', name ) );\n\t\t\tpendingInputAccessors.push( this.getDependency( 'accessor', input ) );\n\t\t\tpendingOutputAccessors.push( this.getDependency( 'accessor', output ) );\n\t\t\tpendingSamplers.push( sampler );\n\t\t\tpendingTargets.push( target );\n\n\t\t}\n\n\t\treturn Promise.all( [\n\n\t\t\tPromise.all( pendingNodes ),\n\t\t\tPromise.all( pendingInputAccessors ),\n\t\t\tPromise.all( pendingOutputAccessors ),\n\t\t\tPromise.all( pendingSamplers ),\n\t\t\tPromise.all( pendingTargets )\n\n\t\t] ).then( function ( dependencies ) {\n\n\t\t\tconst nodes = dependencies[ 0 ];\n\t\t\tconst inputAccessors = dependencies[ 1 ];\n\t\t\tconst outputAccessors = dependencies[ 2 ];\n\t\t\tconst samplers = dependencies[ 3 ];\n\t\t\tconst targets = dependencies[ 4 ];\n\n\t\t\tconst tracks = [];\n\n\t\t\tfor ( let i = 0, il = nodes.length; i < il; i ++ ) {\n\n\t\t\t\tconst node = nodes[ i ];\n\t\t\t\tconst inputAccessor = inputAccessors[ i ];\n\t\t\t\tconst outputAccessor = outputAccessors[ i ];\n\t\t\t\tconst sampler = samplers[ i ];\n\t\t\t\tconst target = targets[ i ];\n\n\t\t\t\tif ( node === undefined ) continue;\n\n\t\t\t\tnode.updateMatrix();\n\n\t\t\t\tlet TypedKeyframeTrack;\n\n\t\t\t\tswitch ( PATH_PROPERTIES[ target.path ] ) {\n\n\t\t\t\t\tcase PATH_PROPERTIES.weights:\n\n\t\t\t\t\t\tTypedKeyframeTrack = NumberKeyframeTrack;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase PATH_PROPERTIES.rotation:\n\n\t\t\t\t\t\tTypedKeyframeTrack = QuaternionKeyframeTrack;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase PATH_PROPERTIES.position:\n\t\t\t\t\tcase PATH_PROPERTIES.scale:\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tTypedKeyframeTrack = VectorKeyframeTrack;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tconst targetName = node.name ? node.name : node.uuid;\n\n\t\t\t\tconst interpolation = sampler.interpolation !== undefined ? INTERPOLATION[ sampler.interpolation ] : InterpolateLinear;\n\n\t\t\t\tconst targetNames = [];\n\n\t\t\t\tif ( PATH_PROPERTIES[ target.path ] === PATH_PROPERTIES.weights ) {\n\n\t\t\t\t\tnode.traverse( function ( object ) {\n\n\t\t\t\t\t\tif ( object.morphTargetInfluences ) {\n\n\t\t\t\t\t\t\ttargetNames.push( object.name ? object.name : object.uuid );\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\ttargetNames.push( targetName );\n\n\t\t\t\t}\n\n\t\t\t\tlet outputArray = outputAccessor.array;\n\n\t\t\t\tif ( outputAccessor.normalized ) {\n\n\t\t\t\t\tconst scale = getNormalizedComponentScale( outputArray.constructor );\n\t\t\t\t\tconst scaled = new Float32Array( outputArray.length );\n\n\t\t\t\t\tfor ( let j = 0, jl = outputArray.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tscaled[ j ] = outputArray[ j ] * scale;\n\n\t\t\t\t\t}\n\n\t\t\t\t\toutputArray = scaled;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let j = 0, jl = targetNames.length; j < jl; j ++ ) {\n\n\t\t\t\t\tconst track = new TypedKeyframeTrack(\n\t\t\t\t\t\ttargetNames[ j ] + '.' + PATH_PROPERTIES[ target.path ],\n\t\t\t\t\t\tinputAccessor.array,\n\t\t\t\t\t\toutputArray,\n\t\t\t\t\t\tinterpolation\n\t\t\t\t\t);\n\n\t\t\t\t\t// Override interpolation with custom factory method.\n\t\t\t\t\tif ( sampler.interpolation === 'CUBICSPLINE' ) {\n\n\t\t\t\t\t\ttrack.createInterpolant = function InterpolantFactoryMethodGLTFCubicSpline( result ) {\n\n\t\t\t\t\t\t\t// A CUBICSPLINE keyframe in glTF has three output values for each input value,\n\t\t\t\t\t\t\t// representing inTangent, splineVertex, and outTangent. As a result, track.getValueSize()\n\t\t\t\t\t\t\t// must be divided by three to get the interpolant's sampleSize argument.\n\n\t\t\t\t\t\t\tconst interpolantType = ( this instanceof QuaternionKeyframeTrack ) ? GLTFCubicSplineQuaternionInterpolant : GLTFCubicSplineInterpolant;\n\n\t\t\t\t\t\t\treturn new interpolantType( this.times, this.values, this.getValueSize() / 3, result );\n\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\t// Mark as CUBICSPLINE. `track.getInterpolation()` doesn't support custom interpolants.\n\t\t\t\t\t\ttrack.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttracks.push( track );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst name = animationDef.name ? animationDef.name : 'animation_' + animationIndex;\n\n\t\t\treturn new AnimationClip( name, undefined, tracks );\n\n\t\t} );\n\n\t}\n\n\tcreateNodeMesh( nodeIndex ) {\n\n\t\tconst json = this.json;\n\t\tconst parser = this;\n\t\tconst nodeDef = json.nodes[ nodeIndex ];\n\n\t\tif ( nodeDef.mesh === undefined ) return null;\n\n\t\treturn parser.getDependency( 'mesh', nodeDef.mesh ).then( function ( mesh ) {\n\n\t\t\tconst node = parser._getNodeRef( parser.meshCache, nodeDef.mesh, mesh );\n\n\t\t\t// if weights are provided on the node, override weights on the mesh.\n\t\t\tif ( nodeDef.weights !== undefined ) {\n\n\t\t\t\tnode.traverse( function ( o ) {\n\n\t\t\t\t\tif ( ! o.isMesh ) return;\n\n\t\t\t\t\tfor ( let i = 0, il = nodeDef.weights.length; i < il; i ++ ) {\n\n\t\t\t\t\t\to.morphTargetInfluences[ i ] = nodeDef.weights[ i ];\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\treturn node;\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#nodes-and-hierarchy\n\t * @param {number} nodeIndex\n\t * @return {Promise}\n\t */\n\tloadNode( nodeIndex ) {\n\n\t\tconst json = this.json;\n\t\tconst extensions = this.extensions;\n\t\tconst parser = this;\n\n\t\tconst nodeDef = json.nodes[ nodeIndex ];\n\n\t\t// reserve node's name before its dependencies, so the root has the intended name.\n\t\tconst nodeName = nodeDef.name ? parser.createUniqueName( nodeDef.name ) : '';\n\n\t\treturn ( function () {\n\n\t\t\tconst pending = [];\n\n\t\t\tconst meshPromise = parser._invokeOne( function ( ext ) {\n\n\t\t\t\treturn ext.createNodeMesh && ext.createNodeMesh( nodeIndex );\n\n\t\t\t} );\n\n\t\t\tif ( meshPromise ) {\n\n\t\t\t\tpending.push( meshPromise );\n\n\t\t\t}\n\n\t\t\tif ( nodeDef.camera !== undefined ) {\n\n\t\t\t\tpending.push( parser.getDependency( 'camera', nodeDef.camera ).then( function ( camera ) {\n\n\t\t\t\t\treturn parser._getNodeRef( parser.cameraCache, nodeDef.camera, camera );\n\n\t\t\t\t} ) );\n\n\t\t\t}\n\n\t\t\tparser._invokeAll( function ( ext ) {\n\n\t\t\t\treturn ext.createNodeAttachment && ext.createNodeAttachment( nodeIndex );\n\n\t\t\t} ).forEach( function ( promise ) {\n\n\t\t\t\tpending.push( promise );\n\n\t\t\t} );\n\n\t\t\treturn Promise.all( pending );\n\n\t\t}() ).then( function ( objects ) {\n\n\t\t\tlet node;\n\n\t\t\t// .isBone isn't in glTF spec. See ._markDefs\n\t\t\tif ( nodeDef.isBone === true ) {\n\n\t\t\t\tnode = new Bone();\n\n\t\t\t} else if ( objects.length > 1 ) {\n\n\t\t\t\tnode = new Group();\n\n\t\t\t} else if ( objects.length === 1 ) {\n\n\t\t\t\tnode = objects[ 0 ];\n\n\t\t\t} else {\n\n\t\t\t\tnode = new Object3D();\n\n\t\t\t}\n\n\t\t\tif ( node !== objects[ 0 ] ) {\n\n\t\t\t\tfor ( let i = 0, il = objects.length; i < il; i ++ ) {\n\n\t\t\t\t\tnode.add( objects[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( nodeDef.name ) {\n\n\t\t\t\tnode.userData.name = nodeDef.name;\n\t\t\t\tnode.name = nodeName;\n\n\t\t\t}\n\n\t\t\tassignExtrasToUserData( node, nodeDef );\n\n\t\t\tif ( nodeDef.extensions ) addUnknownExtensionsToUserData( extensions, node, nodeDef );\n\n\t\t\tif ( nodeDef.matrix !== undefined ) {\n\n\t\t\t\tconst matrix = new Matrix4();\n\t\t\t\tmatrix.fromArray( nodeDef.matrix );\n\t\t\t\tnode.applyMatrix4( matrix );\n\n\t\t\t} else {\n\n\t\t\t\tif ( nodeDef.translation !== undefined ) {\n\n\t\t\t\t\tnode.position.fromArray( nodeDef.translation );\n\n\t\t\t\t}\n\n\t\t\t\tif ( nodeDef.rotation !== undefined ) {\n\n\t\t\t\t\tnode.quaternion.fromArray( nodeDef.rotation );\n\n\t\t\t\t}\n\n\t\t\t\tif ( nodeDef.scale !== undefined ) {\n\n\t\t\t\t\tnode.scale.fromArray( nodeDef.scale );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( ! parser.associations.has( node ) ) {\n\n\t\t\t\tparser.associations.set( node, {} );\n\n\t\t\t}\n\n\t\t\tparser.associations.get( node ).nodes = nodeIndex;\n\n\t\t\treturn node;\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#scenes\n\t * @param {number} sceneIndex\n\t * @return {Promise}\n\t */\n\tloadScene( sceneIndex ) {\n\n\t\tconst json = this.json;\n\t\tconst extensions = this.extensions;\n\t\tconst sceneDef = this.json.scenes[ sceneIndex ];\n\t\tconst parser = this;\n\n\t\t// Loader returns Group, not Scene.\n\t\t// See: https://github.com/mrdoob/three.js/issues/18342#issuecomment-578981172\n\t\tconst scene = new Group();\n\t\tif ( sceneDef.name ) scene.name = parser.createUniqueName( sceneDef.name );\n\n\t\tassignExtrasToUserData( scene, sceneDef );\n\n\t\tif ( sceneDef.extensions ) addUnknownExtensionsToUserData( extensions, scene, sceneDef );\n\n\t\tconst nodeIds = sceneDef.nodes || [];\n\n\t\tconst pending = [];\n\n\t\tfor ( let i = 0, il = nodeIds.length; i < il; i ++ ) {\n\n\t\t\tpending.push( buildNodeHierarchy( nodeIds[ i ], scene, json, parser ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending ).then( function () {\n\n\t\t\t// Removes dangling associations, associations that reference a node that\n\t\t\t// didn't make it into the scene.\n\t\t\tconst reduceAssociations = ( node ) => {\n\n\t\t\t\tconst reducedAssociations = new Map();\n\n\t\t\t\tfor ( const [ key, value ] of parser.associations ) {\n\n\t\t\t\t\tif ( key instanceof Material || key instanceof Texture ) {\n\n\t\t\t\t\t\treducedAssociations.set( key, value );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tnode.traverse( ( node ) => {\n\n\t\t\t\t\tconst mappings = parser.associations.get( node );\n\n\t\t\t\t\tif ( mappings != null ) {\n\n\t\t\t\t\t\treducedAssociations.set( node, mappings );\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\treturn reducedAssociations;\n\n\t\t\t};\n\n\t\t\tparser.associations = reduceAssociations( scene );\n\n\t\t\treturn scene;\n\n\t\t} );\n\n\t}\n\n}\n\nfunction buildNodeHierarchy( nodeId, parentObject, json, parser ) {\n\n\tconst nodeDef = json.nodes[ nodeId ];\n\n\treturn parser.getDependency( 'node', nodeId ).then( function ( node ) {\n\n\t\tif ( nodeDef.skin === undefined ) return node;\n\n\t\t// build skeleton here as well\n\n\t\tlet skinEntry;\n\n\t\treturn parser.getDependency( 'skin', nodeDef.skin ).then( function ( skin ) {\n\n\t\t\tskinEntry = skin;\n\n\t\t\tconst pendingJoints = [];\n\n\t\t\tfor ( let i = 0, il = skinEntry.joints.length; i < il; i ++ ) {\n\n\t\t\t\tpendingJoints.push( parser.getDependency( 'node', skinEntry.joints[ i ] ) );\n\n\t\t\t}\n\n\t\t\treturn Promise.all( pendingJoints );\n\n\t\t} ).then( function ( jointNodes ) {\n\n\t\t\tnode.traverse( function ( mesh ) {\n\n\t\t\t\tif ( ! mesh.isMesh ) return;\n\n\t\t\t\tconst bones = [];\n\t\t\t\tconst boneInverses = [];\n\n\t\t\t\tfor ( let j = 0, jl = jointNodes.length; j < jl; j ++ ) {\n\n\t\t\t\t\tconst jointNode = jointNodes[ j ];\n\n\t\t\t\t\tif ( jointNode ) {\n\n\t\t\t\t\t\tbones.push( jointNode );\n\n\t\t\t\t\t\tconst mat = new Matrix4();\n\n\t\t\t\t\t\tif ( skinEntry.inverseBindMatrices !== undefined ) {\n\n\t\t\t\t\t\t\tmat.fromArray( skinEntry.inverseBindMatrices.array, j * 16 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tboneInverses.push( mat );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Joint \"%s\" could not be found.', skinEntry.joints[ j ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tmesh.bind( new Skeleton( bones, boneInverses ), mesh.matrixWorld );\n\n\t\t\t} );\n\n\t\t\treturn node;\n\n\t\t} );\n\n\t} ).then( function ( node ) {\n\n\t\t// build node hierachy\n\n\t\tparentObject.add( node );\n\n\t\tconst pending = [];\n\n\t\tif ( nodeDef.children ) {\n\n\t\t\tconst children = nodeDef.children;\n\n\t\t\tfor ( let i = 0, il = children.length; i < il; i ++ ) {\n\n\t\t\t\tconst child = children[ i ];\n\t\t\t\tpending.push( buildNodeHierarchy( child, node, json, parser ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t} );\n\n}\n\n/**\n * @param {BufferGeometry} geometry\n * @param {GLTF.Primitive} primitiveDef\n * @param {GLTFParser} parser\n */\nfunction computeBounds( geometry, primitiveDef, parser ) {\n\n\tconst attributes = primitiveDef.attributes;\n\n\tconst box = new Box3();\n\n\tif ( attributes.POSITION !== undefined ) {\n\n\t\tconst accessor = parser.json.accessors[ attributes.POSITION ];\n\n\t\tconst min = accessor.min;\n\t\tconst max = accessor.max;\n\n\t\t// glTF requires 'min' and 'max', but VRM (which extends glTF) currently ignores that requirement.\n\n\t\tif ( min !== undefined && max !== undefined ) {\n\n\t\t\tbox.set(\n\t\t\t\tnew Vector3( min[ 0 ], min[ 1 ], min[ 2 ] ),\n\t\t\t\tnew Vector3( max[ 0 ], max[ 1 ], max[ 2 ] )\n\t\t\t);\n\n\t\t\tif ( accessor.normalized ) {\n\n\t\t\t\tconst boxScale = getNormalizedComponentScale( WEBGL_COMPONENT_TYPES[ accessor.componentType ] );\n\t\t\t\tbox.min.multiplyScalar( boxScale );\n\t\t\t\tbox.max.multiplyScalar( boxScale );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.GLTFLoader: Missing min/max properties for accessor POSITION.' );\n\n\t\t\treturn;\n\n\t\t}\n\n\t} else {\n\n\t\treturn;\n\n\t}\n\n\tconst targets = primitiveDef.targets;\n\n\tif ( targets !== undefined ) {\n\n\t\tconst maxDisplacement = new Vector3();\n\t\tconst vector = new Vector3();\n\n\t\tfor ( let i = 0, il = targets.length; i < il; i ++ ) {\n\n\t\t\tconst target = targets[ i ];\n\n\t\t\tif ( target.POSITION !== undefined ) {\n\n\t\t\t\tconst accessor = parser.json.accessors[ target.POSITION ];\n\t\t\t\tconst min = accessor.min;\n\t\t\t\tconst max = accessor.max;\n\n\t\t\t\t// glTF requires 'min' and 'max', but VRM (which extends glTF) currently ignores that requirement.\n\n\t\t\t\tif ( min !== undefined && max !== undefined ) {\n\n\t\t\t\t\t// we need to get max of absolute components because target weight is [-1,1]\n\t\t\t\t\tvector.setX( Math.max( Math.abs( min[ 0 ] ), Math.abs( max[ 0 ] ) ) );\n\t\t\t\t\tvector.setY( Math.max( Math.abs( min[ 1 ] ), Math.abs( max[ 1 ] ) ) );\n\t\t\t\t\tvector.setZ( Math.max( Math.abs( min[ 2 ] ), Math.abs( max[ 2 ] ) ) );\n\n\n\t\t\t\t\tif ( accessor.normalized ) {\n\n\t\t\t\t\t\tconst boxScale = getNormalizedComponentScale( WEBGL_COMPONENT_TYPES[ accessor.componentType ] );\n\t\t\t\t\t\tvector.multiplyScalar( boxScale );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Note: this assumes that the sum of all weights is at most 1. This isn't quite correct - it's more conservative\n\t\t\t\t\t// to assume that each target can have a max weight of 1. However, for some use cases - notably, when morph targets\n\t\t\t\t\t// are used to implement key-frame animations and as such only two are active at a time - this results in very large\n\t\t\t\t\t// boxes. So for now we make a box that's sometimes a touch too small but is hopefully mostly of reasonable size.\n\t\t\t\t\tmaxDisplacement.max( vector );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Missing min/max properties for accessor POSITION.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// As per comment above this box isn't conservative, but has a reasonable size for a very large number of morph targets.\n\t\tbox.expandByVector( maxDisplacement );\n\n\t}\n\n\tgeometry.boundingBox = box;\n\n\tconst sphere = new Sphere();\n\n\tbox.getCenter( sphere.center );\n\tsphere.radius = box.min.distanceTo( box.max ) / 2;\n\n\tgeometry.boundingSphere = sphere;\n\n}\n\n/**\n * @param {BufferGeometry} geometry\n * @param {GLTF.Primitive} primitiveDef\n * @param {GLTFParser} parser\n * @return {Promise}\n */\nfunction addPrimitiveAttributes( geometry, primitiveDef, parser ) {\n\n\tconst attributes = primitiveDef.attributes;\n\n\tconst pending = [];\n\n\tfunction assignAttributeAccessor( accessorIndex, attributeName ) {\n\n\t\treturn parser.getDependency( 'accessor', accessorIndex )\n\t\t\t.then( function ( accessor ) {\n\n\t\t\t\tgeometry.setAttribute( attributeName, accessor );\n\n\t\t\t} );\n\n\t}\n\n\tfor ( const gltfAttributeName in attributes ) {\n\n\t\tconst threeAttributeName = ATTRIBUTES[ gltfAttributeName ] || gltfAttributeName.toLowerCase();\n\n\t\t// Skip attributes already provided by e.g. Draco extension.\n\t\tif ( threeAttributeName in geometry.attributes ) continue;\n\n\t\tpending.push( assignAttributeAccessor( attributes[ gltfAttributeName ], threeAttributeName ) );\n\n\t}\n\n\tif ( primitiveDef.indices !== undefined && ! geometry.index ) {\n\n\t\tconst accessor = parser.getDependency( 'accessor', primitiveDef.indices ).then( function ( accessor ) {\n\n\t\t\tgeometry.setIndex( accessor );\n\n\t\t} );\n\n\t\tpending.push( accessor );\n\n\t}\n\n\tassignExtrasToUserData( geometry, primitiveDef );\n\n\tcomputeBounds( geometry, primitiveDef, parser );\n\n\treturn Promise.all( pending ).then( function () {\n\n\t\treturn primitiveDef.targets !== undefined\n\t\t\t? addMorphTargets( geometry, primitiveDef.targets, parser )\n\t\t\t: geometry;\n\n\t} );\n\n}\n\n/**\n * @param {BufferGeometry} geometry\n * @param {Number} drawMode\n * @return {BufferGeometry}\n */\nfunction toTrianglesDrawMode( geometry, drawMode ) {\n\n\tlet index = geometry.getIndex();\n\n\t// generate index if not present\n\n\tif ( index === null ) {\n\n\t\tconst indices = [];\n\n\t\tconst position = geometry.getAttribute( 'position' );\n\n\t\tif ( position !== undefined ) {\n\n\t\t\tfor ( let i = 0; i < position.count; i ++ ) {\n\n\t\t\t\tindices.push( i );\n\n\t\t\t}\n\n\t\t\tgeometry.setIndex( indices );\n\t\t\tindex = geometry.getIndex();\n\n\t\t} else {\n\n\t\t\tconsole.error( 'THREE.GLTFLoader.toTrianglesDrawMode(): Undefined position attribute. Processing not possible.' );\n\t\t\treturn geometry;\n\n\t\t}\n\n\t}\n\n\t//\n\n\tconst numberOfTriangles = index.count - 2;\n\tconst newIndices = [];\n\n\tif ( drawMode === TriangleFanDrawMode ) {\n\n\t\t// gl.TRIANGLE_FAN\n\n\t\tfor ( let i = 1; i <= numberOfTriangles; i ++ ) {\n\n\t\t\tnewIndices.push( index.getX( 0 ) );\n\t\t\tnewIndices.push( index.getX( i ) );\n\t\t\tnewIndices.push( index.getX( i + 1 ) );\n\n\t\t}\n\n\t} else {\n\n\t\t// gl.TRIANGLE_STRIP\n\n\t\tfor ( let i = 0; i < numberOfTriangles; i ++ ) {\n\n\t\t\tif ( i % 2 === 0 ) {\n\n\t\t\t\tnewIndices.push( index.getX( i ) );\n\t\t\t\tnewIndices.push( index.getX( i + 1 ) );\n\t\t\t\tnewIndices.push( index.getX( i + 2 ) );\n\n\n\t\t\t} else {\n\n\t\t\t\tnewIndices.push( index.getX( i + 2 ) );\n\t\t\t\tnewIndices.push( index.getX( i + 1 ) );\n\t\t\t\tnewIndices.push( index.getX( i ) );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tif ( ( newIndices.length / 3 ) !== numberOfTriangles ) {\n\n\t\tconsole.error( 'THREE.GLTFLoader.toTrianglesDrawMode(): Unable to generate correct amount of triangles.' );\n\n\t}\n\n\t// build final geometry\n\n\tconst newGeometry = geometry.clone();\n\tnewGeometry.setIndex( newIndices );\n\n\treturn newGeometry;\n\n}\n\nexport { GLTFLoader };\n","import {DicePreset} from './DicePreset.js';\nimport {BASE_PRESETS_LIST, EXTRA_PRESETS_LIST} from './DiceDefaultPresets.js';\nimport {DiceColors, DICE_SCALE, COLORSETS} from './DiceColors.js';\nimport {DICE_MODELS} from './DiceModels.js';\nimport * as THREE from 'three';\nimport { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';\nimport { ShaderUtils } from './ShaderUtils';\nexport class DiceFactory {\n\n\tconstructor() {\n\t\tthis.geometries = {};\n\n\t\tthis.baseScale = 50;\n\n\t\tthis.preferredSystem = \"standard\";\n\t\tthis.preferredColorset = \"custom\";\n\n\t\tthis.cache_hits = 0;\n\t\tthis.cache_misses = 0;\n\n\t\tthis.realisticLighting = true;\n\n\t\tthis.loaderGLTF = new GLTFLoader();\n\t\tthis.fontLoadingPromises = [];\n\n\t\tthis.baseTextureCache = {};\n\n\t\t// fixes texture rotations on specific dice models\n\t\tthis.rotate = {\n\t\t\td8: {even: 7.5, odd: 127.5},\n\t\t\td12: {all: -5},\n\t\t\td20: {all: 8.5},\n\t\t};\n\n\t\tthis.systems = {\n\t\t\t'standard': {id: 'standard', name: game.i18n.localize(\"DICESONICE.System.Standard\"), dice:[], mode:\"default\"},\n\t\t\t'spectrum': {id: 'spectrum', name: game.i18n.localize(\"DICESONICE.System.SpectrumDice\"), dice:[], mode:\"default\"},\n\t\t\t'foundry_vtt': {id: 'foundry_vtt', name: game.i18n.localize(\"DICESONICE.System.FoundryVTT\"), dice:[], mode:\"default\"},\n\t\t\t'dot': {id: 'dot', name: game.i18n.localize(\"DICESONICE.System.Dot\"), dice:[], mode:\"default\"},\n\t\t\t'dot_b': {id: 'dot_b', name: game.i18n.localize(\"DICESONICE.System.DotBlack\"), dice:[], mode:\"default\"}\n\t\t};\n\t\t\n\t\tBASE_PRESETS_LIST.forEach((preset) => {\n\t\t\tthis.register(preset);\n\t\t});\n\t\t\n\t\tEXTRA_PRESETS_LIST.forEach((data) => {\n\t\t\tthis.addDicePreset(data);\n\t\t});\n\n\t\tfor(let i in CONFIG.Dice.terms){\n\t\t\tlet term = CONFIG.Dice.terms[i];\n\t\t\t//If this is not a core dice type\n\t\t\tif(![Coin, FateDie, Die].includes(term)){\n\t\t\t\tlet objTerm = new term({});\n\t\t\t\tif([2, 3, 4, 6, 8, 10, 12, 14, 16, 20, 24, 30].includes(objTerm.faces)){\n\t\t\t\t\tthis.internalAddDicePreset(objTerm);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tinitializeMaterials(){\n\t\tif(this.realisticLighting){\n\t\t\tthis.material_options = {\n\t\t\t\t'plastic': {\n\t\t\t\t\t'type':\"standard\",\n\t\t\t\t\t'options':{\n\t\t\t\t\t\tmetalness: 0,\n\t\t\t\t\t\troughness: 0.6,\n\t\t\t\t\t\tenvMapIntensity:1\n\t\t\t\t\t},\n\t\t\t\t\t'scopedOptions':{\n\t\t\t\t\t\troughnessMap : \"roughnessMap_fingerprint\",\n\t\t\t\t\t\tenvMap : true\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t'metal': {\n\t\t\t\t\t'type':'standard',\n\t\t\t\t\t'options': {\n\t\t\t\t\t\troughness: 0.6,\n\t\t\t\t\t\tmetalness: 1\n\t\t\t\t\t},\n\t\t\t\t\t'scopedOptions':{\n\t\t\t\t\t\troughnessMap : \"roughnessMap_metal\",\n\t\t\t\t\t\tenvMap : true\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t'wood': {\n\t\t\t\t\t'type':'standard',\n\t\t\t\t\t'options': {\n\t\t\t\t\t\troughness:1,\n\t\t\t\t\t\tmetalness:0\n\t\t\t\t\t},\n\t\t\t\t\t'scopedOptions':{\n\t\t\t\t\t\troughnessMap : \"roughnessMap_wood\",\n\t\t\t\t\t\tenvMap : true\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t'glass': {\n\t\t\t\t\t'type':'standard',\n\t\t\t\t\t'options': {\n\t\t\t\t\t\troughness: 0.3,\n\t\t\t\t\t\tmetalness: 0\n\t\t\t\t\t},\n\t\t\t\t\t'scopedOptions':{\n\t\t\t\t\t\troughnessMap : \"roughnessMap_fingerprint\",\n\t\t\t\t\t\tenvMap : true\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t'chrome': {\n\t\t\t\t\t'type':'standard',\n\t\t\t\t\t'options': {\n\t\t\t\t\t\tmetalness: 1,\n\t\t\t\t\t\troughness: 0.1\n\t\t\t\t\t},\n\t\t\t\t\t'scopedOptions':{\n\t\t\t\t\t\troughnessMap : \"roughnessMap_fingerprint\",\n\t\t\t\t\t\tenvMap : true\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t'pristine': {\n\t\t\t\t\t'type':'physical',\n\t\t\t\t\t'options': {\n\t\t\t\t\t\tmetalness: 0,\n\t\t\t\t\t\troughness: 0.8,\n\t\t\t\t\t\tenvMapIntensity:1,\n\t\t\t\t\t\tclearcoat: 1,\n\t\t\t\t\t\tclearcoatRoughness: 0.9\n\t\t\t\t\t},\n\t\t\t\t\t'scopedOptions':{\n\t\t\t\t\t\tenvMap : true\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t'iridescent': {\n\t\t\t\t\t'type':'standard',\n\t\t\t\t\t'options': {\n\t\t\t\t\t\tmetalness: 1,\n\t\t\t\t\t\troughness: 0.2,\n\t\t\t\t\t\tuserData:{\n\t\t\t\t\t\t\tiridescent:true\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\t'scopedOptions':{\n\t\t\t\t\t\tenvMap : true\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t'stone': {\n\t\t\t\t\t'type':'standard',\n\t\t\t\t\t'options': {\n\t\t\t\t\t\tmetalness: 0,\n\t\t\t\t\t\troughness: 1\n\t\t\t\t\t},\n\t\t\t\t\t'scopedOptions':{\n\t\t\t\t\t\troughnessMap : \"roughnessMap_stone\",\n\t\t\t\t\t\tenvMap : true\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tthis.material_options = {\n\t\t\t\t'plastic': {\n\t\t\t\t\t'type':\"phong\",\n\t\t\t\t\t'options':{\n\t\t\t\t\t\tspecular: 0xffffff,\n\t\t\t\t\t\tcolor: 0xb5b5b5,\n\t\t\t\t\t\tshininess: 3,\n\t\t\t\t\t\tflatShading: true\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t'metal': {\n\t\t\t\t\t'type':'standard',\n\t\t\t\t\t'options': {\n\t\t\t\t\t\tcolor: 0xdddddd,\n\t\t\t\t\t\temissive:0x111111,\n\t\t\t\t\t\troughness: 0.6,\n\t\t\t\t\t\tmetalness: 1,\n\t\t\t\t\t\tenvMapIntensity:2\n\t\t\t\t\t},\n\t\t\t\t\t'scopedOptions':{\n\t\t\t\t\t\tenvMap:true\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t'wood': {\n\t\t\t\t\t'type':'phong',\n\t\t\t\t\t'options': {\n\t\t\t\t\t\tspecular: 0xffffff,\n\t\t\t\t\t\tcolor: 0xb5b5b5,\n\t\t\t\t\t\tshininess: 1,\n\t\t\t\t\t\tflatShading: true\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t'glass': {\n\t\t\t\t\t'type':'phong',\n\t\t\t\t\t'options': {\n\t\t\t\t\t\tspecular: 0xffffff,\n\t\t\t\t\t\tcolor: 0xb5b5b5,\n\t\t\t\t\t\tshininess: 0.3,\n\t\t\t\t\t\treflectivity:0.1,\n\t\t\t\t\t\tcombine:THREE.MixOperation\n\t\t\t\t\t},\n\t\t\t\t\t'scopedOptions':{\n\t\t\t\t\t\tenvMap:true\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t'chrome': {\n\t\t\t\t\t'type':'phong',\n\t\t\t\t\t'options': {\n\t\t\t\t\t\tspecular: 0xffffff,\n\t\t\t\t\t\tcolor: 0xb5b5b5,\n\t\t\t\t\t\tshininess: 1,\n\t\t\t\t\t\treflectivity:0.7,\n\t\t\t\t\t\tcombine:THREE.AddOperation\n\t\t\t\t\t},\n\t\t\t\t\t'scopedOptions':{\n\t\t\t\t\t\tenvMap:true\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t//no difference with plastic without advanced ligthing\n\t\t\t\t'pristine': {\n\t\t\t\t\t'type':'phong',\n\t\t\t\t\t'options':{\n\t\t\t\t\t\tspecular: 0xffffff,\n\t\t\t\t\t\tcolor: 0xb5b5b5,\n\t\t\t\t\t\tshininess: 3,\n\t\t\t\t\t\tflatShading: true\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t'iridescent': {\n\t\t\t\t\t'type':'standard',\n\t\t\t\t\t'options': {\n\t\t\t\t\t\tcolor: 0xdddddd,\n\t\t\t\t\t\temissive:0x111111,\n\t\t\t\t\t\troughness: 0.2,\n\t\t\t\t\t\tmetalness: 1,\n\t\t\t\t\t\tenvMapIntensity:2,\n\t\t\t\t\t\tuserData:{\n\t\t\t\t\t\t\tiridescent:true\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\t'scopedOptions':{\n\t\t\t\t\t\tenvMap:true\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t'stone': {\n\t\t\t\t\t'type':'lambert',\n\t\t\t\t\t'options': {\n\t\t\t\t\t\tcolor: 0xb5b5b5,\n\t\t\t\t\t\treflectivity:0.01\n\t\t\t\t\t},\n\t\t\t\t\t'scopedOptions':{\n\t\t\t\t\t\tenvMap:true\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tsetScale(scale){\n\t\tthis.baseScale = scale;\n\t}\n\n\tsetQualitySettings(config){\n\t\tthis.realisticLighting = config.bumpMapping;\n\t\tthis.aa = config.antialiasing;\n\t\tthis.glow = config.glow;\n\t\tthis.useHighDPI = config.useHighDPI;\n\t\tthis.shadows = config.shadowQuality != \"none\";\n\t\tthis.shadowQuality = config.shadowQuality;\n\t}\n\n\tregister(diceobj) {\n\t\t//If it is added to standard, it can be from automated system detecting DiceTerm, or the basic dice list. In those case, the internalAdd preorperty is set to true\n\t\t//Everything should exist in the standard system\n\t\t//We check to see if there's already this Dice DONOMINATOR in the standard system\n\t\tlet index = this.systems.standard.dice.findIndex(el => el.type == diceobj.type);\n\n\t\t//If it exists in the standard system, and it was added there by the automated system, we want to override and load it\n\t\tif(index>=0 && (this.systems.standard.dice[index].internalAdd || diceobj.internalAdd)){\n\t\t\tthis.systems.standard.dice[index] = diceobj;\n\t\t\tif(diceobj.modelFile){\n\t\t\t\tdiceobj.loadModel(this.loaderGLTF);\n\t\t\t} else {\n\t\t\t\tdiceobj.loadTextures();\n\t\t\t}\n\t\t}\n\t\tif(diceobj.system == \"standard\"){\n\t\t\t//If we're adding to the standard system directly, we only do it if it didn't exist previously\n\t\t\tif(index < 0){\n\t\t\t\tthis.systems[diceobj.system].dice.push(diceobj);\n\t\t\t}\t\n\t\t} else {\n\t\t\t//If for some reasons, we try to register a dice type that doesnt exist on the standard system, we add it there first.\n\t\t\t//This should not happen because of internalAddDicePreset but I'm only 95% sure.\n\t\t\tif(index<0){\n\t\t\t\tthis.systems.standard.dice.push(diceobj);\n\t\t\t\tif(diceobj.modelFile){\n\t\t\t\t\tdiceobj.loadModel(this.loaderGLTF);\n\t\t\t\t} else {\n\t\t\t\t\tdiceobj.loadTextures();\n\t\t\t\t}\n\t\t\t}\n\t\t\t//Then we add it to its own system. No need to load it, that will be taken care of automatically\n\t\t\tthis.systems[diceobj.system].dice.push(diceobj);\n\t\t}\n\t}\n\n\tasync preloadPresets(waitForLoad = true, userID = null, config = {}){\n\t\tlet activePresets = [];\n\t\tconst preloadPresetsByUser = (user) => {\n\t\t\tlet appearance = user.getFlag(\"dice-so-nice\", \"appearance\") ? duplicate(user.getFlag(\"dice-so-nice\", \"appearance\")) : null;\n\t\t\tif(!appearance){\n\t\t\t\tappearance = {global:{}};\n\t\t\t\tif(this.preferredSystem != \"standard\")\n\t\t\t\t\tappearance.global.system = this.preferredSystem;\n\t\t\t\tif(this.preferredColorset != \"custom\")\n\t\t\t\t\tappearance.global.colorset = this.preferredColorset;\n\t\t\t}\n\t\t\t//load basic model\n\t\t\tthis.systems[\"standard\"].dice.forEach((obj) =>{\n\t\t\t\tactivePresets.push(obj);\n\t\t\t});\n\t\t\tmergeObject(appearance, config,{performDeletions:true});\n\t\t\tif(!isEmpty(appearance)){\n\t\t\t\tfor (let scope in appearance) {\n\t\t\t\t\tif (appearance.hasOwnProperty(scope)) {\n\t\t\t\t\t\tif(scope != \"global\")\n\t\t\t\t\t\t\tactivePresets.push(this.getPresetBySystem(scope, appearance[scope].system));\n\t\t\t\t\t\telse if(this.systems.hasOwnProperty(appearance[scope].system)){\n\t\t\t\t\t\t\tthis.systems[appearance[scope].system].dice.forEach((obj) =>{\n\t\t\t\t\t\t\t\tactivePresets.push(obj);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\tif(userID)\n\t\t\tpreloadPresetsByUser(game.users.get(userID));\n\t\telse\n \tgame.users.forEach((user) =>{\n\t\t\t\tpreloadPresetsByUser(user);\n\t\t\t});\n //remove duplicate\n activePresets = activePresets.filter((v, i, a) => a.indexOf(v) === i);\n\t\tlet promiseArray = [];\n\t\tactivePresets.forEach((preset)=>{\n\t\t\tif(preset){\n\t\t\t\tif(preset.modelFile){\n\t\t\t\t\t//Custom 3D model\n\t\t\t\t\tpromiseArray.push(preset.loadModel(this.loaderGLTF));\n\t\t\t\t} else {\n\t\t\t\t\t//Classic 3D model\n\t\t\t\t\tpromiseArray.push(preset.loadTextures());\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tif(waitForLoad)\n\t\t\tawait Promise.all(promiseArray);\n\t}\n\n\t//{id: 'standard', name: game.i18n.localize(\"DICESONICE.System.Standard\")}\n\taddSystem(system, mode=\"default\"){\n\t\tsystem.dice = [];\n\t\tsystem.mode = mode;\n\t\tif(mode != \"default\" && this.preferredSystem == \"standard\")\n\t\t\tthis.preferredSystem = system.id;\n\t\tthis.systems[system.id] = system;\n\t}\n\t//{type:\"\",labels:[],system:\"\"}\n\t//Should have been called \"addDicePresetFromModel\" but ¯\\_(ツ)_/¯\n\taddDicePreset(dice, shape = null){\n\t\tlet model = this.systems[\"standard\"].dice.find(el => el.type == dice.type);\n\t\tif(!model || !model.internalAdd){\n\t\t\tif(!shape)\n\t\t\t\tshape = dice.type;\n\t\t\tmodel = this.systems[\"standard\"].dice.find(el => el.type == shape);\n\t\t}\n\t\tlet preset = new DicePreset(dice.type, model.shape);\n\t\tlet denominator = dice.type.substr(1);\n\n\t\tpreset.term = isNaN(denominator) ? CONFIG.Dice.terms[denominator].name : \"Die\";\n\t\t\n\t\tpreset.setLabels(dice.labels);\n\t\tpreset.setModel(dice.modelFile);\n\t\tif(dice.values){\n\t\t\tif(dice.values.min == undefined)\n\t\t\t\tdice.values.min = 1;\n\t\t\tif(dice.values.max == undefined)\n\t\t\t\tdice.values.max = model.values.length;\n\t\t\tif(dice.values.step == undefined)\n\t\t\t\tdice.values.step = 1;\n\t\t\tpreset.setValues(dice.values.min,dice.values.max,dice.values.step);\n\t\t} else {\n\t\t\tpreset.values = model.values;\n\t\t\tpreset.valueMap = model.valueMap;\n\t\t}\n\t\tif(dice.valueMap){\n\t\t\tpreset.valueMap = dice.valueMap;\n\t\t}\n\t\tpreset.mass = model.mass;\n\t\tpreset.scale = model.scale;\n\t\tpreset.inertia = model.inertia;\n\t\tpreset.system = dice.system;\n\t\tpreset.font = dice.font;\n\t\tpreset.fontScale = dice.fontScale || null;\n\t\tpreset.colorset = dice.colorset || null;\n\t\t//If it overrides an existing model that isn't a numbered die, set a font scale to prevent undesired fontScale from previous model\n\t\tif(!preset.fontScale && ![\"d2\",\"d4\",\"d6\",\"d8\",\"d10\",\"d12\",\"d14\",\"d16\",\"d20\",\"d24\",\"d30\",\"d100\"].includes(dice.type) && this.systems[\"standard\"].dice.find(el => el.type == dice.type))\n\t\t\tpreset.fontScale = DICE_SCALE[shape];\n\t\t\n\t\tif(dice.bumpMaps && dice.bumpMaps.length)\n\t\t\tpreset.setBumpMaps(dice.bumpMaps);\n\n\t\tif(dice.emissiveMaps && dice.emissiveMaps.length)\n\t\t\tpreset.setEmissiveMaps(dice.emissiveMaps);\n\n\t\tif(dice.emissive)\n\t\t\tpreset.emissive = dice.emissive;\n\t\tthis.register(preset);\n\n\t\tif(dice.font && !FontConfig.getAvailableFonts().includes(dice.font)){\n\t\t\tthis.fontLoadingPromises.push(FontConfig.loadFont(dice.font,{editor:false,fonts:[]}));\n\t\t}\n\t}\n\n\t//Is called when trying to create a DicePreset by guessing its faces from the CONFIG entries\n\tinternalAddDicePreset(diceobj){\n\t\tlet shape = \"d\";\n\t\tlet fakeShape = [3,5,7];\n\t\tif(fakeShape.includes(diceobj.faces))\n\t\t\tshape += (diceobj.faces*2);\n\t\telse\n\t\t\tshape += diceobj.faces;\n\t\tlet type = \"d\" + diceobj.constructor.DENOMINATION;\n\t\tlet model = this.systems[\"standard\"].dice.find(el => el.type == shape);\n\t\tlet preset = new DicePreset(type, model.shape);\n\t\tpreset.term = diceobj.constructor.name;\n\t\tlet labels = [];\n\t\tfor(let i = 1;i<= diceobj.faces;i++){\n\t\t\tlabels.push(diceobj.getResultLabel({result:i}));\n\t\t}\n\t\tpreset.setLabels(labels);\n\t\tpreset.setValues(1,diceobj.faces);\n\t\tpreset.mass = model.mass;\n\t\tpreset.inertia = model.inertia;\n\t\tpreset.scale = model.scale;\n\t\tpreset.internalAdd = true;\n\t\tthis.register(preset);\n\t}\n\n\tdisposeCachedMaterials(type = null){\n\t\tfor (const material in this.baseTextureCache) {\n\t\t\tif(type == null || material.substr(0,type.length) == type){\n\t\t\t\tthis.baseTextureCache[material].map.dispose();\n\t\t\t\tif(this.baseTextureCache[material].bumpMap)\n\t\t\t\t\tthis.baseTextureCache[material].bumpMap.dispose();\n\t\t\t\tif(this.baseTextureCache[material].emissiveMap)\n\t\t\t\t\tthis.baseTextureCache[material].emissiveMap.dispose();\n\t\t\t\tthis.baseTextureCache[material].dispose();\n\t\t\t\tdelete this.baseTextureCache[material];\n\t\t\t}\n\t\t}\n\t}\n\n\t//Stripped version from the Foundry Core library to avoid reloading fonts\n\tasync _loadFonts(){\n\t\tconst timeout = new Promise(resolve => setTimeout(resolve, 4500));\n\t\tconst ready = Promise.all(this.fontLoadingPromises).then(() => document.fonts.ready);\n\t\tthis.fontLoadingPromises = [];\n\t\tawait Promise.race([ready, timeout]);\n\t}\n\n\tget(type) {\n\t\treturn this.getPresetBySystem(type);\n\t}\n\n\tgetPresetBySystem(type, system = \"standard\"){\n\t\tlet model = this.systems[\"standard\"].dice.find(obj => obj.type == type);\n\t\tif(!model)\n\t\t\treturn null;\n\t\tlet diceobj = null;\n\t\tif(system != \"standard\"){\n\t\t\tif(this.systems.hasOwnProperty(system)){\n\t\t\t\tdiceobj = this.systems[system].dice.find(obj => obj.type == type && obj.shape == model.shape);\n\t\t\t\tif(!diceobj && !['Coin', 'FateDie', 'Die'].includes(model.term)){\n\t\t\t\t\t//If it doesn't exist and is not a core DiceTerm, we look for a similar shape and values\n\t\t\t\t\tdiceobj = this.systems[system].dice.find(obj => obj.shape == model.shape && obj.values.length == model.values.length && !model.colorset);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif(!diceobj){\n\t\t\tdiceobj = this.systems.standard.dice.find(obj => obj.type == type);\n\t\t}\n\t\treturn diceobj;\n\t}\n\n\t// returns a dicemesh (THREE.Mesh) object\n\tcreate(scopedTextureCache, type, appearance) {\n\t\tlet diceobj = this.getPresetBySystem(type, appearance.system);\n\t\tif(diceobj.model && appearance.isGhost){\n\t\t\tdiceobj = this.getPresetBySystem(type, \"standard\");\n\t\t}\n\t\tlet scopedScale = scopedTextureCache.type == \"board\" ? this.baseScale : 60;\n\t\tif (!diceobj) return null;\n\t\tlet dicemesh;\n\n\t\tlet geom = this.geometries[type+scopedScale];\n\t\tif(!geom) {\n\t\t\tgeom = this.createGeometry(diceobj.shape, diceobj.scale, scopedScale);\n\t\t\tthis.geometries[type+scopedScale] = geom;\n\t\t}\n\t\tif (!geom) return null;\n\n\n\t\tif(diceobj.model){\n\t\t\tdicemesh = diceobj.model.scene.children[0].clone();\n\t\t\tlet scale = scopedScale/100;\n\t\t\tdicemesh.scale.set(scale,scale,scale);\n\t\t\tif(!dicemesh.geometry)\n\t\t\t\tdicemesh.geometry = {};\n\t\t\tdicemesh.geometry.cannon_shape = geom.cannon_shape;\n\t\t\tif(diceobj.model.animations.length>0){\n\t\t\t\tdicemesh.mixer = new THREE.AnimationMixer(dicemesh);\n\t\t\t\tdicemesh.mixer.clipAction(diceobj.model.animations[0]).play();\n\t\t\t}\n\t\t}else{\n\t\t\tlet materialData = this.generateMaterialData(diceobj, appearance);\n\n\t\t\tlet baseTextureCacheString = scopedTextureCache.type+type+materialData.cacheString;\n\t\t\tlet materials;\n\t\t\tif(this.baseTextureCache[baseTextureCacheString])\n\t\t\t\tmaterials = this.baseTextureCache[baseTextureCacheString];\n\t\t\telse\n\t\t\t\tmaterials = this.createMaterials(scopedTextureCache, baseTextureCacheString, diceobj, materialData);\n\t\t\t\n\t\t\tdicemesh = new THREE.Mesh(geom, materials);\n\n\t\t\tif (diceobj.color) {\n\t\t\t\tdicemesh.material[0].color = new THREE.Color(diceobj.color);\n\t\t\t\tif(this.realisticLighting)\n\t\t\t\t\tdicemesh.material[0].color.convertLinearToSRGB();\n\t\t\t\t//dicemesh.material[0].emissive = new THREE.Color(diceobj.color);\n\t\t\t\tdicemesh.material[0].emissiveIntensity = 1;\n\t\t\t\tdicemesh.material[0].needsUpdate = true;\n\t\t\t}\n\t\t}\n\t\t\n\t\tdicemesh.result = [];\n\t\tdicemesh.shape = diceobj.shape;\n\t\tdicemesh.rerolls = 0;\n\t\tdicemesh.resultReason = 'natural';\n\n\t\tlet factory = this;\n\t\tdicemesh.getFaceValue = function() {\n\t\t\tlet reason = this.resultReason;\n\t\t\tlet vector = new THREE.Vector3(0, 0, this.shape == 'd4' ? -1 : 1);\n\t\t\tlet faceCannon = new THREE.Vector3();\n\t\t\tlet closest_face, closest_angle = Math.PI * 2;\n\t\t\tfor (let i = 0, l = this.body_sim.shapes[0].faceNormals.length; i < l; ++i) {\n\t\t\t\tif(DICE_MODELS[this.shape].faceValues[i] == 0)\n\t\t\t\t\tcontinue;\n\t\t\t\tfaceCannon.copy(this.body_sim.shapes[0].faceNormals[i]);\n\t\t\t\t\n\t\t\t\tlet angle = faceCannon.applyQuaternion(this.body_sim.quaternion).angleTo(vector);\n\t\t\t\tif (angle < closest_angle) {\n\t\t\t\t\tclosest_angle = angle;\n\t\t\t\t\tclosest_face = i;\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst diceobj = factory.get(this.notation.type);\n\t\t\tlet dieValue = DICE_MODELS[this.shape].faceValues[closest_face];\n\n\t\t\tif (this.shape == 'd4') {\n\t\t\t\treturn {value: dieValue, label: diceobj.labels[dieValue-1], reason: reason};\n\t\t\t}\n\t\t\tlet labelIndex = dieValue;\n\t\t\tif (['d10','d2'].includes(this.shape)) labelIndex += 1;\n\t\t\tlet label = diceobj.labels[labelIndex+1];\n\n\t\t\t//console.log('Face Value', closest_face, dieValue, label)\n\n\t\t\treturn {value: dieValue, label: label, reason: reason};\n\t\t};\n\n\t\tdicemesh.storeRolledValue = function() {\n\t\t\tthis.result.push(this.getFaceValue());\n\t\t};\n\n\t\tdicemesh.getLastValue = function() {\n\t\t\tif (!this.result || this.result.length < 1) return {value: undefined, label: '', reason: ''};\n\n\t\t\treturn this.result[this.result.length-1];\n\t\t};\n\n\t\tdicemesh.setLastValue = function(result) {\n\t\t\tif (!this.result || this.result.length < 1) return;\n\t\t\tif (!result || result.length < 1) return;\n\n\t\t\treturn this.result[this.result.length-1] = result;\n\t\t};\n\n\t\treturn dicemesh;\n\t}\n\n\tcreateMaterials(scopedTextureCache, baseTextureCacheString, diceobj, materialData) {\n\t\tif(this.baseTextureCache[baseTextureCacheString])\n\t\t\treturn this.baseTextureCache[baseTextureCacheString];\n\n\t\tlet labels = diceobj.labels;\n\t\tif (diceobj.shape == 'd4') {\n\t\t\tlabels = diceobj.labels[0];\n\t\t}\n\t\t//If the texture is an array of texture (for random face texture), we look at the first element to determine the faces material and the edge texture\n\t\tlet dice_texture = Array.isArray(materialData.texture) ? materialData.texture[0] : materialData.texture;\n\n\t\tvar mat;\n\t\tlet materialSelected = this.material_options[materialData.material] ? this.material_options[materialData.material] : this.material_options[\"plastic\"];\n\t\tif(!this.realisticLighting){\n\t\t\tdelete materialSelected.roughnessMap;\n\t\t}\n\t\tswitch(materialSelected.type){\n\t\t\tcase \"phong\":\n\t\t\t\tmat = new THREE.MeshPhongMaterial(materialSelected.options);\n\t\t\t\tbreak;\n\t\t\tcase \"standard\":\n\t\t\t\tmat = new THREE.MeshStandardMaterial(materialSelected.options);\n\t\t\t\tbreak;\n\t\t\tcase \"lambert\":\n\t\t\t\tmat = new THREE.MeshLambertMaterial(materialSelected.options);\n\t\t\t\tbreak;\n\t\t\tcase \"physical\":\n\t\t\t\tmat = new THREE.MeshPhysicalMaterial(materialSelected.options);\n\t\t\t\tbreak;\n\t\t\tdefault: //plastic\n\t\t\t\tmat = new THREE.MeshPhongMaterial(this.material_options.plastic.options);\n\t\t}\n\t\tif(materialSelected.scopedOptions){\n\t\t\tif(materialSelected.scopedOptions.envMap)\n\t\t\t\tmat.envMap = scopedTextureCache.textureCube;\n\t\t\tif(materialSelected.scopedOptions.roughnessMap)\n\t\t\t\tmat.roughnessMap = scopedTextureCache[materialSelected.scopedOptions.roughnessMap];\n\t\t}\n\t\tlet font = {\n\t\t\t\"type\":diceobj.font,\n\t\t\t\"scale\": diceobj.fontScale ? diceobj.fontScale:null\n\t\t};\n\t\t\n\t\tif(!font.type){\n\t\t\tfont.type = materialData.font;\n\t\t}\n\t\tif(!font.scale){\n\t\t\tif(materialData.fontScale[diceobj.type])\n\t\t\t\tfont.scale = materialData.fontScale[diceobj.type];\n\t\t\telse{\n\t\t\t\tfont.scale = DICE_SCALE[diceobj.shape];\n\t\t\t}\t\n\t\t}\n\n\t\tlet canvas = document.createElement(\"canvas\");\n\t\tlet context = canvas.getContext(\"2d\", {alpha: true});\n\t\tcontext.globalAlpha = 0;\n\n\t\tlet canvasBump = document.createElement(\"canvas\");\n\t\tlet contextBump = canvasBump.getContext(\"2d\", {alpha: true});\n\t\tcontextBump.globalAlpha = 0;\n\n\t\tlet canvasEmissive = document.createElement(\"canvas\");\n\t\tlet contextEmissive = canvasEmissive.getContext(\"2d\");\n\t\t\n\t\tlet labelsTotal = labels.length;\n\t\tlet isHeritedFromShape = [\"d3\",\"d5\",\"d7\",\"dm\"].includes(diceobj.type) || (diceobj.type == \"df\"&&diceobj.shape == \"d6\");\n\t\tif(isHeritedFromShape){\n\t\t\tlabelsTotal = labelsTotal*2 -2;\n\t\t\tif(diceobj.shape == \"d2\" || diceobj.shape == \"d10\")\n\t\t\t\tlabelsTotal += 1;\n\t\t}\n\n\t\tlet texturesPerLine = Math.ceil(Math.sqrt(labelsTotal));\n\t\tlet sizeTexture = 256;\n\t\tlet ts = this.calc_texture_size(Math.sqrt(labelsTotal)*sizeTexture, true);\n\t\t\n\t\tcanvas.width = canvas.height = canvasBump.width = canvasBump.height = canvasEmissive.width = canvasEmissive.height = ts;\n\t\tlet x = 0;\n\t\tlet y = 0;\n\t\tlet texturesOnThisLine = 0;\n\t\tfor (var i = 0; i < labels.length; ++i) {\n\t\t\tif(texturesOnThisLine == texturesPerLine){\n\t\t\t\ty += sizeTexture;\n\t\t\t\tx = 0;\n\t\t\t\ttexturesOnThisLine = 0;\n\t\t\t}\n\t\t\tif(i==0)//edge\n\t\t\t{\n\t\t\t\t//if the texture is fully opaque, we do not use it for edge\n\t\t\t\tlet texture = {name:\"none\"};\n\t\t\t\tif(dice_texture.composite != \"source-over\")\n\t\t\t\t\ttexture = dice_texture;\n\t\t\t\tthis.createTextMaterial(context, contextBump, contextEmissive, x, y, sizeTexture, diceobj, labels, font, i, texture, materialData);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tthis.createTextMaterial(context, contextBump, contextEmissive, x, y, sizeTexture, diceobj, labels, font, i, materialData.texture, materialData);\n\t\t\t}\n\t\t\ttexturesOnThisLine++;\n\t\t\tx += sizeTexture;\n\t\t}\n\n\t\t//Special dice from shape divided by 2\n\t\t//D3\n\t\tif(isHeritedFromShape){\n\t\t\tlet startI = 2;\n\t\t\t//for some reason, there's an extra empty cell for all shape except d2 and d10. Should fix that at some point.\n\t\t\tif(diceobj.shape == \"d2\" || diceobj.shape == \"d10\")\n\t\t\t\tstartI = 1;\n\t\t\tfor(i=startI;i');\n\t\t//generate basetexture for caching\n\t\tif(!this.baseTextureCache[baseTextureCacheString]){\n\t\t\tlet texture = new THREE.CanvasTexture(canvas);\n\t\t\tif(this.realisticLighting)\n\t\t\t\ttexture.encoding = THREE.sRGBEncoding;\n\t\t\ttexture.flipY = false;\n\t\t\tmat.map = texture;\n\t\t\tmat.map.anisotropy = 4;\n\n\t\t\tif(this.realisticLighting){\n\t\t\t\tlet bumpMap = new THREE.CanvasTexture(canvasBump);\n\t\t\t\tbumpMap.flipY = false;\n\t\t\t\tmat.bumpMap = bumpMap;\n\t\t\t\tmat.bumpMap.anisotropy = 4;\n\n\t\t\t\tlet emissiveMap = new THREE.CanvasTexture(canvasEmissive);\n\t\t\t\tif(this.realisticLighting)\n\t\t\t\t\temissiveMap.encoding = THREE.sRGBEncoding;\n\t\t\t\temissiveMap.flipY = false;\n\t\t\t\tmat.emissiveMap = emissiveMap;\n\t\t\t\tmat.emissiveIntensity = 1;\n\t\t\t\tmat.emissive = new THREE.Color(diceobj.emissive);\n\t\t\t\tif(this.realisticLighting)\n\t\t\t\t\tmat.emissive.convertLinearToSRGB();\n\t\t\t}\n\t\t}\n\n\t\t//mat.displacementMap = mat.bumpMap;\n\n\t\tswitch(materialData.material){\n\t\t\tcase \"chrome\":\n\t\t\t\tif(this.realisticLighting)\n\t\t\t\t\tmat.metalnessMap = mat.bumpMap;\n\t\t\t\tbreak;\n\t\t\tcase \"iridescent\":\n\t\t\t\tif(this.realisticLighting)\n\t\t\t\t\tmat.metalnessMap = mat.bumpMap;\n\t\t\t\tbreak;\n\t\t}\n\t\t\n\t\tmat.opacity = 1;\n\t\tmat.transparent = true;\n\t\tmat.depthTest = true;\n\t\tmat.needUpdate = true;\n\n\t\tmat.onBeforeCompile = ShaderUtils.applyDiceSoNiceShader;\n\n\t\tthis.baseTextureCache[baseTextureCacheString] = mat;\n\t\treturn mat;\n\t}\n\tcreateTextMaterial(context, contextBump, contextEmissive, x, y, ts, diceobj, labels, font, index, texture, materialData) {\n\t\tif (labels[index] === undefined) return null;\n\n\t\tlet forecolor = materialData.foreground;\n\t\tlet outlinecolor = materialData.outline;\n\t\tlet backcolor = index > 0 ? materialData.background : materialData.edge != \"\" ? materialData.edge:materialData.background;\n\n\t\tif(Array.isArray(texture))\n\t\t\ttexture = texture[Math.floor(Math.random() * texture.length)];\n\t\t\n\t\tlet text = labels[index];\n\t\tlet bump = diceobj.bumps[index];\n\t\tlet emissive = diceobj.emissiveMaps[index];\n\t\tlet isTexture = false;\n\t\tlet margin = 1.0;\n\n\t\t// create color\n\t\tcontext.fillStyle = backcolor;\n\t\tcontext.fillRect(x, y, ts, ts);\n\n\t\tcontextBump.fillStyle = \"#FFFFFF\";\n\t\tcontextBump.fillRect(x, y, ts, ts);\n\n\t\tcontextEmissive.fillStyle = \"#000000\";\n\t\tcontextEmissive.fillRect(x, y, ts, ts);\n\n\t\t//context.rect(x, y, ts, ts);\n\t\t//context.stroke();\n\n\t\t//create underlying texture\n\t\tif (texture.name != '' && texture.name != 'none') {\n\t\t\tcontext.save();\n\t\t\tcontext.beginPath();\n\t\t\tcontext.rect(x,y,ts,ts);\n\t\t\tcontext.clip();\n\t\t\tcontext.globalCompositeOperation = texture.composite || 'source-over';\n\t\t\tcontext.drawImage(texture.texture, x, y, ts, ts);\n\t\t\tcontext.restore();\n\t\t\t\n\t\t\tif (texture.bump != '') {\n\t\t\t\tcontextBump.drawImage(texture.bump, x, y, ts, ts);\n\t\t\t}\n\t\t}\n\n\t\t// create text\n\t\tcontext.globalCompositeOperation = 'source-over';\n\t\tcontext.textAlign = \"center\";\n\t\tcontext.textBaseline = \"middle\";\n\n\t\tcontextBump.textAlign = \"center\";\n\t\tcontextBump.textBaseline = \"middle\";\n\t\tcontextBump.shadowColor = \"#000000\";\n\t\tcontextBump.shadowOffsetX = 1;\n\t\tcontextBump.shadowOffsetY = 1;\n\t\tcontextBump.shadowBlur = 3;\n\n\t\tcontextEmissive.textAlign = \"center\";\n\t\tcontextEmissive.textBaseline = \"middle\";\n\t\t\n\t\tif (diceobj.shape != 'd4') {\n\t\t\tif(materialData.isGhost && labels[index] != \"\")\n\t\t\t\ttext = \"?\";\n\t\t\t//custom texture face\n\t\t\tif(text instanceof HTMLImageElement){\n\t\t\t\tisTexture = true;\n\t\t\t\tcontext.drawImage(text, 0,0,text.width,text.height,x,y,ts,ts);\n\t\t\t\tif(bump)\n\t\t\t\t\tcontextBump.drawImage(bump, 0,0,text.width,text.height,x,y,ts,ts);\n\t\t\t\tif(emissive)\n\t\t\t\t\tcontextEmissive.drawImage(emissive, 0,0,text.width,text.height,x,y,ts,ts);\n\t\t\t}\n\t\t\telse{\n\t\t\t\tlet fontsize = ts / (1 + 2 * margin);\n\t\t\t\tlet textstarty = (ts / 2);\n\t\t\t\tlet textstartx = (ts / 2);\n\n\t\t\t\tif(font.scale)\n\t\t\t\t\tfontsize *= font.scale;\n\n\t\t\t\t//Needed for every fonts\n\t\t\t\tswitch(diceobj.shape){\n\t\t\t\t\tcase 'd10':\n\t\t\t\t\t\ttextstarty = textstartx*1.3;\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'd14':\n\t\t\t\t\t\ttextstarty = textstartx*1.4;\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'd16':\n\t\t\t\t\t\ttextstarty = textstartx*1.4;\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'd8':\n\t\t\t\t\t\ttextstarty = textstarty*1.1;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'd12':\n\t\t\t\t\t\ttextstarty = textstarty*1.08;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'd20':\n\t\t\t\t\t\ttextstarty = textstartx*1.2;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'd6':\n\t\t\t\t\t\ttextstarty = textstarty*1.1;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcontext.font = fontsize+ 'pt '+font.type;\n\t\t\t\tcontextBump.font = fontsize+ 'pt '+font.type;\n\t\t\t\tcontextEmissive.font = fontsize+ 'pt '+font.type;\n\n\t\t\t\tvar lineHeight = fontsize;\n\t\t\t\t\n\t\t\t\tlet textlines = text.split(\"\\n\");\n\n\t\t\t\tif (textlines.length > 1) {\n\t\t\t\t\tfontsize = fontsize / textlines.length;\n\t\t\t\t\tcontext.font = fontsize+ 'pt '+font.type;\n\t\t\t\t\tcontextBump.font = fontsize+ 'pt '+font.type;\n\t\t\t\t\tcontextEmissive.font = fontsize+ 'pt '+font.type;\n\n\t\t\t\t\t//to find the correct text height for every possible fonts, we have no choice but to use the great (and complex) pixi method\n\t\t\t\t\t//First we create a PIXI.TextStyle object, to pass later to the measure method\n\t\t\t\t\tlet pixiStyle = new PIXI.TextStyle({\n\t\t\t\t\t\tfontFamily: font.type,\n\t\t\t\t\t\tfontSize: fontsize,\n\t\t\t\t\t\tstroke: \"#0000FF\",\n\t\t\t\t\t\tstrokeThickness: (outlinecolor != 'none' && outlinecolor != backcolor) ? 1:0\n\t\t\t\t\t});\n\t\t\t\t\t//Then we call the PIXI measureText method\n\t\t\t\t\tlet textMetrics = PIXI.TextMetrics.measureText(textlines.join(\"\"),pixiStyle);\n\n\t\t\t\t\tlineHeight = textMetrics.lineHeight;\n\t\t\t\t\tif(textlines[0]!=\"\"){\n\t\t\t\t\t\ttextstarty -= (lineHeight * textlines.length) / 2;\n\t\t\t\t\t\t//On a D12, we add a little padding because it looks better to human eyes even tho it's not really the center anymore\n\t\t\t\t\t\tif(diceobj.shape == \"d12\")\n\t\t\t\t\t\t\ttextstarty = textstarty *1.08;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\ttextlines.shift();\n\t\t\t\t}\n\n\t\t\t\tfor(let i = 0, l = textlines.length; i < l; i++){\n\t\t\t\t\tlet textline = textlines[i].trim();\n\n\t\t\t\t\t// attempt to outline the text with a meaningful color\n\t\t\t\t\tif (outlinecolor != 'none' && outlinecolor != backcolor) {\n\t\t\t\t\t\tcontext.strokeStyle = outlinecolor;\n\t\t\t\t\t\tcontext.lineWidth = 5;\n\t\t\t\t\t\tcontext.strokeText(textlines[i], textstartx+x, textstarty+y);\n\n\t\t\t\t\t\tcontextBump.strokeStyle = \"#555555\";\n\t\t\t\t\t\tcontextBump.lineWidth = 5;\n\t\t\t\t\t\tcontextBump.strokeText(textlines[i], textstartx+x, textstarty+y);\n\n\t\t\t\t\t\tcontextEmissive.strokeStyle = \"#999999\";\n\t\t\t\t\t\tcontextEmissive.lineWidth = 5;\n\t\t\t\t\t\tcontextEmissive.strokeText(textlines[i], textstartx+x, textstarty+y);\n\n\t\t\t\t\t\tif (textline == '6' || textline == '9') {\n\t\t\t\t\t\t\tcontext.strokeText(' .', textstartx+x, textstarty+y);\n\t\t\t\t\t\t\tcontextBump.strokeText(' .', textstartx+x, textstarty+y);\n\t\t\t\t\t\t\tcontextEmissive.strokeText(' .', textstartx+x, textstarty+y);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tcontext.fillStyle = forecolor;\n\t\t\t\t\tcontext.fillText(textlines[i], textstartx+x, textstarty+y);\n\n\t\t\t\t\tcontextBump.fillStyle = \"#555555\";\n\t\t\t\t\tcontextBump.fillText(textlines[i], textstartx+x, textstarty+y);\n\n\t\t\t\t\tcontextEmissive.fillStyle = \"#999999\";\n\t\t\t\t\tcontextEmissive.fillText(textlines[i], textstartx+x, textstarty+y);\n\n\t\t\t\t\tif (textline == '6' || textline == '9') {\n\t\t\t\t\t\tcontext.fillText(' .', textstartx+x, textstarty+y);\n\t\t\t\t\t\tcontextBump.fillText(' .', textstartx+x, textstarty+y);\n\t\t\t\t\t\tcontextEmissive.fillText(' .', textstartx+x, textstarty+y);\n\t\t\t\t\t}\n\t\t\t\t\ttextstarty += (lineHeight * 1.5);\n\t\t\t\t}\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tvar hw = (ts / 2);\n\t\t\tvar hh = (ts / 2);\n\t\t\tlet fontsize = (ts / 128 * 24);\n\t\t\tif(font.scale)\n\t\t\t\tfontsize *= font.scale;\n\t\t\tcontext.font = fontsize+'pt '+font.type;\n\t\t\tcontextBump.font = fontsize+'pt '+font.type;\n\t\t\tcontextEmissive.font = fontsize+'pt '+font.type;\n\n\t\t\t//draw the numbers\n\t\t\tlet wShift = 1;\n\t\t\tlet hShift = 1;\n\t\t\tfor (let i=0;i');\n\t\t\t\t}\n\n\t\t\t\t//rotate 1/3 for next label\n\t\t\t\tcontext.translate(hw+x, hh+y);\n\t\t\t\tcontext.rotate(Math.PI * 2 / 3);\n\t\t\t\tcontext.translate(-hw-x, -hh-y);\n\n\t\t\t\tcontextBump.translate(hw+x, hh+y);\n\t\t\t\tcontextBump.rotate(Math.PI * 2 / 3);\n\t\t\t\tcontextBump.translate(-hw-x, -hh-y);\n\n\t\t\t\tcontextEmissive.translate(hw+x, hh+y);\n\t\t\t\tcontextEmissive.rotate(Math.PI * 2 / 3);\n\t\t\t\tcontextEmissive.translate(-hw-x, -hh-y);\n\t\t\t}\n\t\t}\n\t}\n\n\tgetAppearanceForDice(appearances, dicetype, dicenotation = null){\n\t\t/*\n\t\t\tWe use either (by order of priority): \n\t\t\t1) A notation appearance\n\t\t\t2) A flavor/notation colorset\n\t\t\t3) The colorset of the diceobj\n\t\t\t4) The colorset configured by the player for this dice type\n\t\t\t5) A preferred system set by a module/system (done in main.js)\n\t\t\t6) The global colorset of the player\n\t\t*/\n\t\t\n\t\tlet settings;\n\t\tif(appearances[dicetype])\n\t\t\tsettings = appearances[dicetype];\n\t\telse\n\t\t\tsettings = appearances.global;\n\n\t\t//To keep compatibility with both older integrations and user settings, we use the DiceColor naming convention from there\n\t\tlet appearance = {\n\t\t\tcolorset: settings.colorset ? settings.colorset : appearances.global.colorset ? appearances.global.colorset : \"custom\",\n\t\t\tforeground: settings.labelColor ? settings.labelColor:appearances.global.labelColor ? appearances.global.labelColor : \"#FFFFFF\",\n\t\t\tbackground: settings.diceColor ? settings.diceColor:appearances.global.diceColor ? appearances.global.diceColor : \"#000000\",\n\t\t\t//outline: settings.outlineColor ? settings.outlineColor: appearances.global.outlineColor ? appearances.global.outlineColor : \"\",\n\t\t\t//edge: settings.edgeColor ? settings.edgeColor:appearances.global.edgeColor ? appearances.global.edgeColor:\"\",\n\t\t\ttexture: settings.texture ? settings.texture:appearances.global.texture ? appearances.global.texture : \"none\",\n\t\t\tmaterial: settings.material ? settings.material:appearances.global.material ? appearances.global.material : \"auto\",\n\t\t\tfont: settings.font ? settings.font:appearances.global.font ? appearances.global.font : \"Arial\",\n\t\t\tsystem: settings.system ? settings.system:appearances.global.system ? appearances.global.system : \"standard\"\n\t\t};\n\n\t\tif(appearance.colorset == \"custom\"){\n\t\t\tappearance.outline = settings.outlineColor ? settings.outlineColor:\"\";\n\t\t\tappearance.edge = settings.edgeColor ? settings.edgeColor:\"\";\n\t\t} else {\n\t\t\tappearance.outline = settings.outlineColor ? settings.outlineColor: appearances.global.outlineColor ? appearances.global.outlineColor : \"\";\n\t\t\tappearance.edge = settings.edgeColor ? settings.edgeColor:appearances.global.edgeColor ? appearances.global.edgeColor:\"\";\n\t\t}\n\n\t\tif(appearance.colorset && appearance.colorset != \"custom\"){\n\t\t\tlet colorsetData = DiceColors.getColorSet(appearance.colorset);\n\t\t\tappearance.foreground = colorsetData.foreground;\n\t\t\tappearance.background = colorsetData.background;\n\t\t\tappearance.outline = colorsetData.outline;\n\t\t\tappearance.edge = colorsetData.edge ? colorsetData.edge : \"\";\n\t\t}\n\t\tlet diceobj = this.getPresetBySystem(dicetype,appearance.system);\n\t\tif(diceobj.colorset){\n\t\t\tlet colorsetData = {...DiceColors.getColorSet(diceobj.colorset)};\n\t\t\tObject.entries(colorsetData).forEach((opt) => {\n\t\t\t\tif(opt[1] == \"custom\")\n\t\t\t\t\tdelete colorsetData[opt[0]];\n\t\t\t});\n\t\t\tmergeObject(appearance, colorsetData,{performDeletions:true});\n\t\t\tappearance.colorset = diceobj.colorset;\n\t\t}\n\t\t\n\t\tif(dicenotation){\n\t\t\tlet colorset = null;\n\t\t\tif (dicenotation.options.colorset)\n\t\t\t\tcolorset = dicenotation.options.colorset;\n\t\t\telse if (dicenotation.options.flavor && COLORSETS[dicenotation.options.flavor]) {\n\t\t\t\tcolorset = dicenotation.options.flavor;\n\t\t\t}\n\t\t\tif(colorset){\n\t\t\t\tlet colorsetData = DiceColors.getColorSet(colorset);\n\t\t\t\tcolorsetData.edge = colorsetData.edge ? colorsetData.edge : \"\";\n\t\t\t\tappearance = colorsetData;\n\t\t\t}\n\t\t\tif(dicenotation.options.appearance){\n\t\t\t\tmergeObject(appearance, dicenotation.options.appearance,{performDeletions:true});\n\t\t\t}\n\t\t\tif(dicenotation.options.ghost){\n\t\t\t\tappearance.isGhost = true;\n\t\t\t}\n\t\t}\n\t\treturn appearance;\n\t}\n\n\tgenerateMaterialData(diceobj, appearance) {\n\t\tlet materialData = {};\n\t\tlet colorindex;\n\n\t\tif(appearance.texture && !appearance.texture.id)\n\t\t\tappearance.texture = DiceColors.getTexture(appearance.texture);\n\n\t\tlet colorsetData = DiceColors.getColorSet(appearance.colorset);\n\n\t\t// ignore custom colorset with unset properties\n\t\tif(colorsetData.foreground == \"custom\")\n\t\t\tcolorsetData.foreground = appearance.foreground;\n\t\tif(colorsetData.background == \"custom\")\n\t\t\tcolorsetData.background = appearance.background;\n\t\tif(colorsetData.texture == \"custom\")\n\t\t\tcolorsetData.texture = appearance.texture;\n\t\tif(colorsetData.material == \"custom\")\n\t\t\tcolorsetData.material = appearance.material;\n\t\tif(colorsetData.font == \"custom\")\n\t\t\tcolorsetData.font = appearance.font;\n\n\n\t\t// set base color first\n\t\tif (Array.isArray(appearance.background)) {\n\n\t\t\tcolorindex = Math.floor(Math.random() * appearance.background.length);\n\n\t\t\t// if color list and label list are same length, treat them as a parallel list\n\t\t\tif (Array.isArray(appearance.foreground) && appearance.foreground.length == appearance.background.length) {\n\t\t\t\tmaterialData.foreground = appearance.foreground[colorindex];\n\n\t\t\t\t// if label list and outline list are same length, treat them as a parallel list\n\t\t\t\tif (Array.isArray(appearance.outline) && appearance.outline.length == appearance.foreground.length) {\n\t\t\t\t\tmaterialData.outline = appearance.outline[colorindex];\n\t\t\t\t}\n\t\t\t}\n\t\t\t// if texture list is same length do the same\n\t\t\tif (Array.isArray(appearance.texture) && appearance.texture.length == appearance.background.length) {\n\t\t\t\tmaterialData.texture = appearance.texture[colorindex];\n\t\t\t}\n\n\t\t\t//if edge list and color list are same length, treat them as a parallel list\n\t\t\tif (Array.isArray(appearance.edge) && appearance.edge.length == appearance.background.length) {\n\t\t\t\tmaterialData.edge = appearance.edge[colorindex];\n\t\t\t}\n\n\t\t\tmaterialData.background = appearance.background[colorindex];\n\t\t} else {\n\t\t\tmaterialData.background = appearance.background;\n\t\t}\n\n\t\tif(!materialData.edge){\n\t\t\tif (Array.isArray(appearance.edge)) {\n\t\t\t\tcolorindex = Math.floor(Math.random() * appearance.edge.length);\n\t\t\t\tmaterialData.edge = appearance.edge[colorindex];\n\t\t\t}\n\t\t\telse\n\t\t\t\tmaterialData.edge = appearance.edge;\n\t\t}\n\n\t\t// if selected label color is still not set, pick one\n\t\tif(!materialData.foreground){\n\t\t\tif(Array.isArray(appearance.foreground)){\n\t\t\t\tcolorindex = appearance.foreground[Math.floor(Math.random() * appearance.foreground.length)];\n\n\t\t\t\t// if label list and outline list are same length, treat them as a parallel list\n\t\t\t\tif (Array.isArray(appearance.outline) && appearance.outline.length == appearance.foreground.length) {\n\t\t\t\t\tmaterialData.outline = appearance.outline[colorindex];\n\t\t\t\t}\n\n\t\t\t\tmaterialData.foreground = appearance.foreground[colorindex];\n\t\t\t}\n\t\t\telse\n\t\t\t\tmaterialData.foreground = appearance.foreground;\n\t\t}\n\n\t\t// if selected label outline is still not set, pick one\n\t\tif (!materialData.outline){\n\t\t\tif(Array.isArray(appearance.outline)) {\n\t\t\t\tcolorindex = appearance.outline[Math.floor(Math.random() * appearance.outline.length)];\n\n\t\t\t\tmaterialData.outline = appearance.outline[colorindex];\n\t\t\t} else {\n\t\t\t\tmaterialData.outline = appearance.outline;\n\t\t\t}\n\t\t}\n\n\t\t// same for textures list\n\t\tif(!materialData.texture){\n\t\t\tif (Array.isArray(appearance.texture)) {\n\t\t\t\tmaterialData.texture = appearance.texture[Math.floor(Math.random() * appearance.texture.length)];\n\t\t\t} else if(appearance.texture.name == \"none\"){\n\t\t\t\t//set to none/theme\n\t\t\t\tif (Array.isArray(colorsetData.texture)){\n\t\t\t\t\tmaterialData.texture = colorsetData.texture[Math.floor(Math.random() * colorsetData.texture.length)];\n\t\t\t\t} else {\n\t\t\t\t\tmaterialData.texture = colorsetData.texture;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tmaterialData.texture = appearance.texture;\n\t\t\t}\n\t\t}\n\n\t\t//Same for material\n\t\tlet baseTexture = Array.isArray(materialData.texture) ? materialData.texture[0]:materialData.texture;\n\n\t\tif(appearance.material == \"auto\" || appearance.material == \"\"){\n\t\t\tif(colorsetData.material)\n\t\t\t\tmaterialData.material = colorsetData.material;\n\t\t\telse\n\t\t\t\tmaterialData.material = baseTexture.material;\n\t\t} else {\n\t\t\tmaterialData.material = appearance.material;\n\t\t}\n\n\t\t//for font, we priorize the dicepreset font, then custom, then coloret\n\t\tif(appearance.font == \"auto\"){\n\t\t\tif(diceobj.font){\n\t\t\t\tmaterialData.font = diceobj.font;\n\t\t\t} else {\n\t\t\t\tmaterialData.font = colorsetData.font;\n\t\t\t}\n\t\t} else {\n\t\t\tmaterialData.font = appearance.font;\n\t\t}\n\n\t\tif(appearance.fontScale)\n\t\t\tmaterialData.fontScale = appearance.fontScale;\n\t\telse if(diceobj.fontScale){\n\t\t\tmaterialData.fontScale = diceobj.fontScale;\n\t\t} else {\n\t\t\tmaterialData.fontScale = colorsetData.fontScale;\n\t\t}\n\n\t\tmaterialData.isGhost = appearance.isGhost?appearance.isGhost:false;\n\n\t\tmaterialData.cacheString = appearance.system+materialData.background+materialData.foreground+materialData.outline+materialData.texture.name+materialData.edge+materialData.material+materialData.font+materialData.isGhost;\n\t\treturn materialData;\n\t}\n\n\tcalc_texture_size(approx, ceil = false) {\n\t\tlet size = 0;\n\t\tif(!ceil)\n\t\t\tsize = Math.pow(2, Math.floor(Math.log(approx) / Math.log(2)));\n\t\telse\n\t\t\tsize = Math.pow(2, Math.ceil(Math.log(approx) / Math.log(2)));\n\t\treturn size;\n\t}\n\n\tcreateGeometry(type, typeScale, scopedScale) {\n\t\tlet radius = typeScale * scopedScale;\n\t\tlet geom = null;\n\t\tswitch (type) {\n\t\t\tcase 'd2':\n\t\t\t\tgeom = this.create_d2_geometry(radius, scopedScale);\n\t\t\t\tbreak;\n\t\t\tcase 'd4':\n\t\t\t\tgeom = this.create_d4_geometry(radius, scopedScale);\n\t\t\t\tbreak;\n\t\t\tcase 'd6':\n\t\t\t\tgeom = this.create_d6_geometry(radius, scopedScale);\n\t\t\t\tbreak;\n\t\t\tcase 'd8':\n\t\t\t\tgeom = this.create_d8_geometry(radius, scopedScale);\n\t\t\t\tbreak;\n\t\t\tcase 'd10':\n\t\t\t\tgeom = this.create_d10_geometry(radius, scopedScale);\n\t\t\t\tbreak;\n\t\t\tcase 'd12':\n\t\t\t\tgeom = this.create_d12_geometry(radius, scopedScale);\n\t\t\t\tbreak;\n\t\t\tcase 'd14':\n\t\t\t\tgeom = this.create_d14_geometry(radius, scopedScale);\n\t\t\t\tbreak;\n\t\t\tcase 'd16':\n\t\t\t\tgeom = this.create_d16_geometry(radius, scopedScale);\n\t\t\t\tbreak;\n\t\t\tcase 'd20':\n\t\t\t\tgeom = this.create_d20_geometry(radius, scopedScale);\n\t\t\t\tbreak;\n\t\t\tcase 'd24':\n\t\t\t\tgeom = this.create_d24_geometry(radius, scopedScale);\n\t\t\t\tbreak;\n\t\t\tcase 'd30':\n\t\t\t\tgeom = this.create_d30_geometry(radius, scopedScale);\n\t\t\t\tbreak;\n\t\t}\n\t\treturn geom;\n\t}\n\n\tload_geometry(type, scopedScale){\n\t\tvar loader = new THREE.BufferGeometryLoader();\n\t\tlet bufferGeometry = loader.parse(DICE_MODELS[type]);\n\t\tbufferGeometry.scale(scopedScale/100,scopedScale/100,scopedScale/100);\n\t\treturn bufferGeometry;\n\t}\n\n\tcreate_d2_geometry(radius, scopedScale){\n\t\tlet geom = this.load_geometry(\"d2\",scopedScale);\n\t\tgeom.cannon_shape = new CANNON.Cylinder(1*radius,1*radius,0.1*radius,8);\n\t\treturn geom;\n\t}\n\n\tcreate_d4_geometry(radius, scopedScale) {\n\t\tlet geom = this.load_geometry(\"d4\",scopedScale);\n\t\tvar vertices = [[1, 1, 1], [-1, -1, 1], [-1, 1, -1], [1, -1, -1]];\n\t\tvar faces = [[1, 0, 2, 1], [0, 1, 3, 2], [0, 3, 2, 3], [1, 2, 3, 4]];\n\t\tgeom.cannon_shape = this.create_geom(vertices, faces, radius);\n\t\treturn geom;\n\t}\n\n\tcreate_d6_geometry(radius, scopedScale) {\n\t\tlet geom = this.load_geometry(\"d6\",scopedScale);\n\t\tvar vertices = [[-1, -1, -1], [1, -1, -1], [1, 1, -1], [-1, 1, -1],\n\t\t\t\t[-1, -1, 1], [1, -1, 1], [1, 1, 1], [-1, 1, 1]];\n\t\tvar faces = [[0, 3, 2, 1, 1], [1, 2, 6, 5, 2], [0, 1, 5, 4, 3],\n\t\t\t\t[3, 7, 6, 2, 4], [0, 4, 7, 3, 5], [4, 5, 6, 7, 6]];\n\t\tgeom.cannon_shape = this.create_geom(vertices, faces, radius);\n\t\treturn geom;\n\t}\n\n\tcreate_d8_geometry(radius, scopedScale) {\n\t\tlet geometry = this.load_geometry(\"d8\",scopedScale);\n\t\t\n\t\tvar vertices = [[1, 0, 0], [-1, 0, 0], [0, 1, 0], [0, -1, 0], [0, 0, 1], [0, 0, -1]];\n\t\tvar faces = [[0, 2, 4, 1], [0, 4, 3, 2], [0, 3, 5, 3], [0, 5, 2, 4], [1, 3, 4, 5],\n\t\t\t\t[1, 4, 2, 6], [1, 2, 5, 7], [1, 5, 3, 8]];\n\t\tgeometry.cannon_shape = this.create_geom(vertices, faces, radius);\n\t\treturn geometry;\n\t}\n\n\tcreate_d10_geometry(radius, scopedScale) {\n\t\tlet geom = this.load_geometry(\"d10\",scopedScale);\n\t\t//geom.scale(1.38,1.38,1.38);\n\t\t\n\t\tvar a = Math.PI * 2 / 10, h = 0.105, v = -1;\n\t\tvar vertices = [];\n\t\tfor (var i = 0, b = 0; i < 10; ++i, b += a) {\n\t\t\tvertices.push([Math.cos(b), Math.sin(b), h * (i % 2 ? 1 : -1)]);\n\t\t}\n\t\tvertices.push([0, 0, -1]);\n\t\tvertices.push([0, 0, 1]);\n\n\t\tvar faces = [\n [5, 6, 7, 11, 0],\n [4, 3, 2, 10, 1],\n [1, 2, 3, 11, 2],\n [0, 9, 8, 10, 3],\n [7, 8, 9, 11, 4],\n [8, 7, 6, 10, 5],\n [9, 0, 1, 11, 6],\n [2, 1, 0, 10, 7],\n [3, 4, 5, 11, 8],\n [6, 5, 4, 10, 9]\n ];\n\t\tgeom.cannon_shape = this.create_geom(vertices, faces, radius);\n\t\t//geom = this.scaleGeometryToShape(geom);\n\t\treturn geom;\n\t}\n\n\tcreate_d12_geometry(radius, scopedScale) {\n\t\tlet geom = this.load_geometry(\"d12\",scopedScale);\n\t\tvar p = (1 + Math.sqrt(5)) / 2, q = 1 / p;\n\t\tvar vertices = [[0, q, p], [0, q, -p], [0, -q, p], [0, -q, -p], [p, 0, q],\n\t\t\t\t[p, 0, -q], [-p, 0, q], [-p, 0, -q], [q, p, 0], [q, -p, 0], [-q, p, 0],\n\t\t\t\t[-q, -p, 0], [1, 1, 1], [1, 1, -1], [1, -1, 1], [1, -1, -1], [-1, 1, 1],\n\t\t\t\t[-1, 1, -1], [-1, -1, 1], [-1, -1, -1]];\n\t\tvar faces = [[2, 14, 4, 12, 0, 1], [15, 9, 11, 19, 3, 2], [16, 10, 17, 7, 6, 3], [6, 7, 19, 11, 18, 4],\n\t\t\t\t[6, 18, 2, 0, 16, 5], [18, 11, 9, 14, 2, 6], [1, 17, 10, 8, 13, 7], [1, 13, 5, 15, 3, 8],\n\t\t\t\t[13, 8, 12, 4, 5, 9], [5, 4, 14, 9, 15, 10], [0, 12, 8, 10, 16, 11], [3, 19, 7, 17, 1, 12]];\n\n\t\tgeom.cannon_shape = this.create_geom(vertices, faces, radius);\n\t\treturn geom;\n\t}\n\n\tcreate_d14_geometry(radius, scopedScale) {\n\t\tlet geom = this.load_geometry(\"d14\",scopedScale);\n\n\t\tvar vertices = [[-0.005093127489089966, 1.177548885345459, 0.002782404189929366], [-0.9908595681190491, 0.061759304255247116, 0.22585006058216095], [-0.9924551844596863, -0.06095181778073311, -0.23028047382831573], [-0.7984917163848877, 0.061637163162231445, -0.6402497291564941], [-0.4453684985637665, -0.06121010705828667, -0.9239609241485596], [-0.00504341721534729, 0.06129471957683563, -1.0241185426712036], [0.437289297580719, -0.06156954541802406, -0.9219886660575867], [0.7920035719871521, 0.06098949536681175, -0.6366959810256958], [0.9908595681190491, -0.06175928935408592, -0.22585000097751617], [0.9924551844596863, 0.0609518401324749, 0.23028059303760529], [0.7984917163848877, -0.061637137085199356, 0.6402497291564941], [0.4453684985637665, 0.061210136860609055, 0.9239609241485596], [0.00504341721534729, -0.06129469349980354, 1.0241185426712036], [-0.4372892379760742, 0.061569564044475555, 0.9219887852668762], [-0.7920035719871521, -0.060989461839199066, 0.6366960406303406], [0.005093127489089966, -1.177548885345459, -0.002782404189929366]];\n\t\tvar faces = [[0, 3, 2, 1], [1, 14, 13, 0], [12, 11, 0, 13], [10, 9, 0, 11], [8, 7, 0, 9], [6, 5, 0, 7], [4, 3, 0, 5], [10, 11, 12, 15], [14, 15, 12, 13], [2, 15, 14, 1], [2, 3, 4, 15], [4, 5, 6, 15], [6, 7, 8, 15], [8, 9, 10, 15]];\n\t\tgeom.cannon_shape = this.create_geom_dcc(vertices, faces, radius * 0.85);\n\t\treturn geom;\n\t}\n\n\tcreate_d16_geometry(radius, scopedScale) {\n\t\tlet geom = this.load_geometry(\"d16\",scopedScale);\n\n\t\tvar vertices = [[-1.0301814079284668, 0.002833150327205658, 1.0244150161743164], [-0.0018179342150688171, -0.006610371172428131, -1.4427297115325928], [1.4587815999984741, 0.0028328225016593933, -0.006545569747686386], [1.031739592552185, 0.0028328821063041687, -1.0375059843063354], [-1.4572231769561768, 0.0028332099318504333, -0.006545361131429672], [-1.0301814079284668, 0.002833150327205658, -1.0375059843063354], [1.031739592552185, 0.0028328821063041687, 1.0244150161743164], [-0.0018179342150688171, -0.006610371172428131, 1.4732751846313477], [0.0007793977856636047, 1.4608354568481445, -0.006545450538396835], [-0.0018181726336479187, -1.4646127223968506, 0.015272742137312889]];\n\t\tvar faces = [[5, 8, 1], [5, 4, 8], [4, 0, 8], [0, 7, 8], [8, 7, 6], [8, 6, 2], [2, 3, 8], [3, 1, 8], [3, 9, 1], [2, 9, 3], [6, 9, 2], [6, 7, 9], [0, 9, 7], [4, 9, 0], [5, 9, 4], [5, 1, 9]];\n\t\tgeom.cannon_shape = this.create_geom_dcc(vertices, faces, radius * 0.83);\n\t\treturn geom;\n\t}\n\n\tcreate_d20_geometry(radius, scopedScale) {\n\t\tlet geom = this.load_geometry(\"d20\",scopedScale);\n\n\t\tvar t = (1 + Math.sqrt(5)) / 2;\n\t\tvar vertices = [[-1, t, 0], [1, t, 0 ], [-1, -t, 0], [1, -t, 0],\n\t\t\t\t[0, -1, t], [0, 1, t], [0, -1, -t], [0, 1, -t],\n\t\t\t\t[t, 0, -1], [t, 0, 1], [-t, 0, -1], [-t, 0, 1]];\n\t\tvar faces = [[0, 11, 5, 1], [0, 5, 1, 2], [0, 1, 7, 3], [0, 7, 10, 4], [0, 10, 11, 5],\n\t\t\t\t[1, 5, 9, 6], [5, 11, 4, 7], [11, 10, 2, 8], [10, 7, 6, 9], [7, 1, 8, 10],\n\t\t\t\t[3, 9, 4, 11], [3, 4, 2, 12], [3, 2, 6, 13], [3, 6, 8, 14], [3, 8, 9, 15],\n\t\t\t\t[4, 9, 5, 16], [2, 4, 11, 17], [6, 2, 10, 18], [8, 6, 7, 19], [9, 8, 1, 20]];\n\t\tgeom.cannon_shape = this.create_geom(vertices, faces, radius);\n\t\treturn geom;\n\t}\n\n\tcreate_d24_geometry(radius, scopedScale) {\n\t\tlet geom = this.load_geometry(\"d24\",scopedScale);\n\n\t\tvar vertices = [[0.7070000171661377, -0.0, -0.7070000171661377], [0.7070000171661377, 0.7070000171661377, -0.0], [0.5468999743461609, 0.5468999743461609, -0.5468999743461609], [-0.0, -0.7070000171661377, -0.7070000171661377], [-0.0, 0.7070000171661377, -0.7070000171661377], [-0.5468999743461609, 0.5468999743461609, -0.5468999743461609], [-0.5468999743461609, -0.5468999743461609, -0.5468999743461609], [0.5468999743461609, 0.5468999743461609, 0.5468999743461609], [-0.0, -0.0, -1.0], [1.0, -0.0, -0.0], [0.5468999743461609, -0.5468999743461609, -0.5468999743461609], [-0.5468999743461609, 0.5468999743461609, 0.5468999743461609], [-0.0, -0.0, 1.0], [-0.0, 0.7070000171661377, 0.7070000171661377], [-0.0, 1.0, -0.0], [-0.7070000171661377, 0.7070000171661377, -0.0], [-0.7070000171661377, -0.0, -0.7070000171661377], [-0.7070000171661377, -0.7070000171661377, -0.0], [-0.0, -0.7070000171661377, 0.7070000171661377], [-0.5468999743461609, -0.5468999743461609, 0.5468999743461609], [-1.0, 0.0, -0.0], [0.5468999743461609, -0.5468999743461609, 0.5468999743461609], [0.7070000171661377, -0.0, 0.7070000171661377], [-0.0, -1.0, -0.0], [0.7070000171661377, -0.7070000171661377, -0.0], [-0.7070000171661377, -0.0, 0.7070000171661377]];\n\t\tvar faces = [[4, 5, 15, 14], [3, 10, 24, 23], [11, 15, 20, 25], [10, 3, 8, 0], [19, 18, 12, 25], [7, 22, 9, 1], [22, 21, 24, 9], [7, 13, 12, 22], [5, 4, 8, 16], [20, 17, 19, 25], [6, 3, 23, 17], [2, 4, 14, 1], [18, 19, 17, 23], [13, 7, 1, 14], [0, 2, 1, 9], [18, 21, 22, 12], [3, 6, 16, 8], [15, 5, 16, 20], [6, 17, 20, 16], [4, 2, 0, 8], [13, 11, 25, 12], [24, 10, 0, 9], [11, 13, 14, 15], [21, 18, 23, 24]];\n\t\tgeom.cannon_shape = this.create_geom(vertices, faces, radius);\n\t\treturn geom;\n\t}\n\n\tcreate_d30_geometry(radius, scopedScale) {\n\t\tlet geom = this.load_geometry(\"d30\",scopedScale);\n\n\t\tvar vertices = [[-1.6180000305175781, 0.0, 1.0], [-1.6180000305175781, 0.6179999709129333, -0.0], [-0.0, 1.6180000305175781, 0.6179999709129333], [0.6179999709129333, 0.0, 1.6180000305175781], [-1.0, -1.6180000305175781, -0.0], [1.6180000305175781, 0.0, 1.0], [-1.6180000305175781, -0.6179999709129333, -0.0], [-0.6179999709129333, 0.0, 1.6180000305175781], [-0.0, 1.0, -1.6180000305175781], [-1.0, 1.0, -1.0], [1.6180000305175781, 0.6179999709129333, -0.0], [1.0, -1.6180000305175781, -0.0], [-1.0, -1.0, -1.0], [1.6180000305175781, -0.6179999709129333, -0.0], [-1.0, 1.6180000305175781, -0.0], [1.0, 1.0, -1.0], [1.0, 1.6180000305175781, -0.0], [-0.0, 1.0, 1.6180000305175781], [1.0, -1.0, -1.0], [-0.6179999709129333, 0.0, -1.6180000305175781], [-0.0, -1.0, -1.6180000305175781], [-1.0, 1.0, 1.0], [0.6179999709129333, 0.0, -1.6180000305175781], [-0.0, -1.0, 1.6180000305175781], [-1.0, -1.0, 1.0], [-0.0, 1.6180000305175781, 0.6179999709129333], [-1.6180000305175781, 0.0, -1.0], [1.0, 1.0, 1.0], [-0.0, -1.6180000305175781, -0.6179999709129333], [1.6180000305175781, 0.0, -1.0], [1.0, -1.0, 1.0], [-0.0, 1.6180000305175781, -0.6179999709129333], [-0.0, -1.6180000305175781, 0.6179999709129333]];\n\t\tvar faces = [[25, 16, 31, 14], [7, 0, 24, 23], [19, 20, 12, 26], [13, 5, 30, 11], [1, 0, 21, 14], [10, 29, 15, 16], [6, 0, 1, 26], [22, 29, 18, 20], [9, 14, 31, 8], [28, 4, 12, 20], [30, 5, 3, 23], [12, 4, 6, 26], [31, 16, 15, 8], [21, 17, 25, 14], [22, 20, 19, 8], [3, 17, 7, 23], [18, 11, 28, 20], [32, 23, 24, 4], [27, 5, 10, 16], [9, 8, 19, 26], [25, 17, 27, 16], [30, 23, 32, 11], [7, 17, 21, 0], [10, 5, 13, 29], [24, 0, 6, 4], [13, 11, 18, 29], [9, 26, 1, 14], [3, 5, 27, 17], [15, 29, 22, 8], [28, 11, 32, 4]];\n\t\tgeom.cannon_shape = this.create_geom_dcc(vertices, faces, radius);\n\t\treturn geom;\n\t}\n\n\tcreate_shape(vertices, faces, radius) {\n\t\tvar cv = new Array(vertices.length), cf = new Array(faces.length);\n\t\tfor (var i = 0; i < vertices.length; ++i) {\n\t\t\tvar v = vertices[i];\n\t\t\tcv[i] = new CANNON.Vec3(v.x * radius, v.y * radius, v.z * radius);\n\t\t}\n\t\tfor (var i = 0; i < faces.length; ++i) {\n\t\t\tcf[i] = faces[i].slice(0, faces[i].length - 1);\n\t\t}\n\t\treturn new CANNON.ConvexPolyhedron(cv, cf);\n\t}\n\n\tcreate_geom(vertices, faces, radius) {\n\t\tvar vectors = new Array(vertices.length);\n\t\tfor (var i = 0; i < vertices.length; ++i) {\n\t\t\tvectors[i] = (new THREE.Vector3).fromArray(vertices[i]).normalize();\n\t\t}\n\t\tlet cannon_shape = this.create_shape(vectors, faces, radius);\n\t\treturn cannon_shape;\n\t}\n\n\tcreate_shape_dcc(vertices, faces, radius) {\n\t\tvar cv = new Array(vertices.length), cf = new Array(faces.length);\n\t\tfor (var i = 0; i < vertices.length; ++i) {\n\t\t\tvar v = vertices[i];\n\t\t\tcv[i] = new CANNON.Vec3(v.x * radius, v.y * radius, v.z * radius);\n\t\t}\n\t\tfor (var i = 0; i < faces.length; ++i) {\n\t\t\tcf[i] = faces[i];//.slice(0, faces[i].length - 1);\n\t\t}\n\t\treturn new CANNON.ConvexPolyhedron(cv, cf);\n\t}\n\n\tcreate_geom_dcc(vertices, faces, radius) {\n\t\tvar vectors = new Array(vertices.length);\n\t\tfor (var i = 0; i < vertices.length; ++i) {\n\t\t\tvectors[i] = (new THREE.Vector3).fromArray(vertices[i]).normalize();\n\t\t}\n\t\tlet cannon_shape = this.create_shape_dcc(vectors, faces, radius);\n\t\treturn cannon_shape;\n\t}\n}\n","export class DiceSFX {\n get nameLocalized(){\n return game.i18n.localize(this._name);\n }\n \n constructor(box, dicemesh){\n this.dicemesh = dicemesh;\n this.box = box;\n this.destroyed = false;\n this.enableGC = false;\n this.renderReady = false;\n this.volume = dicemesh.body_sim.secretRoll && box.muteSoundSecretRolls ? 0 : this.box.volume;\n }\n\n static async init(){\n return true;\n }\n\n async play(){\n return Promise.resolve();\n }\n\n static async loadAsset(loader,url) {\n return new Promise((resolve, reject) => {\n loader.load(url, data=> resolve(data), null, reject);\n });\n }\n\n static getDialogContent(sfxLine,id){\n let dialogContent = {};\n let disabled = game.user.isGM ? '':'disabled=\"disabled\"';\n dialogContent.content = `
\n \n \n
`;\n\n dialogContent.data = {\n isGlobal : sfxLine.options ? sfxLine.options.isGlobal:false,\n id:id\n };\n\n return dialogContent;\n }\n}","import { DiceSFX } from '../DiceSFX.js';\n\nexport class PlaySoundEpicFail extends DiceSFX {\n static id = \"PlaySoundEpicFail\";\n static specialEffectName = \"DICESONICE.PlaySoundEpicFail\";\n static path = 'modules/dice-so-nice/sfx/sounds/epic_fail.mp3';\n /**@override init */\n static async init(){\n game.audio.pending.push(function(){\n AudioHelper.preloadSound(PlaySoundEpicFail.path);\n }.bind(this));\n return true;\n }\n\n /**@override play */\n async play(){\n AudioHelper.play({\n src: PlaySoundEpicFail.path,\n volume: this.volume\n\t\t}, false);\n }\n}","import { DiceSFX } from '../DiceSFX.js';\n\nexport class PlaySoundEpicWin extends DiceSFX {\n static id = \"PlaySoundEpicWin\";\n static specialEffectName = \"DICESONICE.PlaySoundEpicWin\";\n static path = 'modules/dice-so-nice/sfx/sounds/epic_win.mp3';\n /**@override init */\n static async init(){\n game.audio.pending.push(function(){\n AudioHelper.preloadSound(PlaySoundEpicWin.path);\n }.bind(this));\n return true;\n }\n\n /**@override play */\n async play(){\n AudioHelper.play({\n src: PlaySoundEpicWin.path,\n volume: this.volume\n\t\t}, false);\n }\n}","/*!\n * three.proton v0.2.0\n * https://github.com/drawcall/three.proton\n *\n * Copyright 2011-2020, ajiemath\n * Licensed under the MIT license\n * http://www.opensource.org/licenses/mit-license\n *\n */\nimport * as THREE from 'three';\n //the max particle number in pool\n Proton.POOL_MAX = 500;\n Proton.TIME_STEP = 60;\n Proton.PI = 3.142;\n Proton.DR = Proton.PI / 180;\n\n //1:100\n Proton.MEASURE = 100;\n Proton.EULER = 'euler';\n Proton.RK2 = 'runge-kutta2';\n Proton.RK4 = 'runge-kutta4';\n Proton.VERLET = 'verlet';\n\n Proton.PARTICLE_CREATED = 'partilcleCreated';\n Proton.PARTICLE_UPDATE = 'partilcleUpdate';\n Proton.PARTICLE_SLEEP = 'particleSleep';\n Proton.PARTICLE_DEAD = 'partilcleDead';\n Proton.PROTON_UPDATE = 'protonUpdate';\n Proton.PROTON_UPDATE_AFTER = 'protonUpdateAfter';\n Proton.EMITTER_ADDED = 'emitterAdded';\n Proton.EMITTER_REMOVED = 'emitterRemoved';\n\n Proton.bindEmtterEvent = false;\n\n /**\n * @name Proton is a particle engine for three.js\n *\n * @class Proton\n * @param {number} preParticles input any number\n * @param {number} integrationType input any number\n * @example var proton = new Proton(200);\n */\n\n function Proton(preParticles, integrationType) {\n this.preParticles = Proton.Util.initValue(preParticles, Proton.POOL_MAX);\n this.integrationType = Proton.Util.initValue(integrationType, Proton.EULER);\n\n this.emitters = [];\n this.renderers = [];\n\n this.pool = new Proton.Pool();\n Proton.integrator = new Proton.Integration(this.integrationType);\n }\n\n\n Proton.prototype = {\n /**\n * @name add a type of Renderer\n *\n * @method addRender\n * @param {Renderer} render\n */\n addRender: function(renderer) {\n this.renderers.push(renderer);\n renderer.init(this);\n },\n\n /**\n * @name add a type of Renderer\n *\n * @method addRender\n * @param {Renderer} render\n */\n removeRender: function(renderer) {\n this.renderers.splice(this.renderers.indexOf(renderer), 1);\n renderer.remove(this);\n },\n\n /**\n * add the Emitter\n *\n * @method addEmitter\n * @param {Emitter} emitter\n */\n addEmitter: function(emitter) {\n this.emitters.push(emitter);\n emitter.parent = this;\n this.dispatchEvent(\"EMITTER_ADDED\", emitter);\n },\n\n removeEmitter: function(emitter) {\n if (emitter.parent != this) return;\n\n this.emitters.splice(this.emitters.indexOf(emitter), 1);\n emitter.parent = null;\n this.dispatchEvent(\"EMITTER_REMOVED\", emitter);\n },\n\n update: function($delta) {\n this.dispatchEvent(\"PROTON_UPDATE\", this);\n\n var delta = $delta || 0.0167;\n if (delta > 0) {\n var i = this.emitters.length;\n while (i--) this.emitters[i].update(delta);\n }\n\n this.dispatchEvent(\"PROTON_UPDATE_AFTER\", this);\n },\n\n /**\n * getCount\n * @name get the count of particle\n * @return (number) particles count\n */\n getCount: function() {\n var total = 0;\n var i, length = this.emitters.length;\n for (i = 0; i < length; i++) total += this.emitters[i].particles.length;\n return total;\n },\n\n /**\n * destroy\n * @name destroy the proton\n */\n destroy: function() {\n var i = this.emitters.length;\n\n while(i--){\n this.emitters[i].destroy();\n }\n\n this.emitters.length = 0;\n this.pool.destroy();\n }\n };\n\n \n\n\n/*\n * EventDispatcher\n * Visit http://createjs.com/ for documentation, updates and examples.\n *\n **/\n\n\n function EventDispatcher() {\n this.initialize();\n };\n\n EventDispatcher.initialize = function(target) {\n target.addEventListener = p.addEventListener;\n target.removeEventListener = p.removeEventListener;\n target.removeAllEventListeners = p.removeAllEventListeners;\n target.hasEventListener = p.hasEventListener;\n target.dispatchEvent = p.dispatchEvent;\n };\n\n var p = EventDispatcher.prototype;\n\n p._listeners = null;\n\n p.initialize = function() {};\n p.addEventListener = function(type, listener) {\n if (!this._listeners) {\n this._listeners = {};\n } else {\n this.removeEventListener(type, listener);\n }\n\n if (!this._listeners[type]) this._listeners[type] = []\n this._listeners[type].push(listener);\n\n return listener;\n };\n\n p.removeEventListener = function(type, listener) {\n if (!this._listeners) return;\n if (!this._listeners[type]) return;\n\n var arr = this._listeners[type];\n for (var i = 0, l = arr.length; i < l; i++) {\n if (arr[i] == listener) {\n if (l == 1) {\n delete(this._listeners[type]);\n }\n // allows for faster checks.\n else {\n arr.splice(i, 1);\n }\n break;\n }\n }\n };\n\n p.removeAllEventListeners = function(type) {\n if (!type)\n this._listeners = null;\n else if (this._listeners)\n delete(this._listeners[type]);\n };\n\n p.dispatchEvent = function(eventName, eventTarget) {\n var ret = false,\n listeners = this._listeners;\n\n if (eventName && listeners) {\n var arr = listeners[eventName];\n if (!arr) return ret;\n\n arr = arr.slice();\n // to avoid issues with items being removed or added during the dispatch\n\n var handler, i = arr.length;\n while (i--) {\n var handler = arr[i];\n ret = ret || handler(eventTarget);\n }\n \n }\n\n return !!ret;\n };\n\n p.hasEventListener = function(type) {\n var listeners = this._listeners;\n return !!(listeners && listeners[type]);\n };\n\n EventDispatcher.initialize(Proton.prototype);\n Proton.EventDispatcher = EventDispatcher;\n\n\n\n var Util = Util || {\n initValue: function(value, defaults) {\n var value = (value != null && value != undefined) ? value : defaults;\n return value;\n },\n\n isArray: function(value) {\n return Object.prototype.toString.call(value) === '[object Array]';\n },\n\n destroyArray: function(array) {\n array.length = 0;\n },\n\n destroyObject: function(obj) {\n for (var o in obj) delete obj[o];\n },\n\n isUndefined: function() {\n for (var id in arguments) {\n var arg = arguments[id];\n if (arg !== undefined)\n return false;\n }\n\n return true;\n },\n\n setVectorByObj: function(target, pOBJ) {\n if (pOBJ[\"x\"] !== undefined) target.p.x = pOBJ[\"x\"];\n if (pOBJ[\"y\"] !== undefined) target.p.y = pOBJ[\"y\"];\n if (pOBJ[\"z\"] !== undefined) target.p.z = pOBJ[\"z\"];\n\n if (pOBJ[\"vx\"] !== undefined) target.v.x = pOBJ[\"vx\"];\n if (pOBJ[\"vy\"] !== undefined) target.v.y = pOBJ[\"vy\"];\n if (pOBJ[\"vz\"] !== undefined) target.v.z = pOBJ[\"vz\"];\n\n if (pOBJ[\"ax\"] !== undefined) target.a.x = pOBJ[\"ax\"];\n if (pOBJ[\"ay\"] !== undefined) target.a.y = pOBJ[\"ay\"];\n if (pOBJ[\"az\"] !== undefined) target.a.z = pOBJ[\"az\"];\n\n if (pOBJ[\"p\"] !== undefined) target.p.copy(pOBJ[\"p\"]);\n if (pOBJ[\"v\"] !== undefined) target.v.copy(pOBJ[\"v\"]);\n if (pOBJ[\"a\"] !== undefined) target.a.copy(pOBJ[\"a\"]);\n\n if (pOBJ[\"position\"] !== undefined) target.p.copy(pOBJ[\"position\"]);\n if (pOBJ[\"velocity\"] !== undefined) target.v.copy(pOBJ[\"velocity\"]);\n if (pOBJ[\"accelerate\"] !== undefined) target.a.copy(pOBJ[\"accelerate\"]);\n },\n\n //set prototype\n setPrototypeByObj: function(target, proObj, filters) {\n for (var key in proObj) {\n if (target.hasOwnProperty(key)) {\n if (filters) {\n if (filters.indexOf(key) < 0) target[key] = Util._getValue(proObj[key]);\n } else {\n target[key] = Util._getValue(proObj[key]);\n }\n }\n }\n\n return target;\n },\n\n _getValue: function(pan) {\n if (pan instanceof Span)\n return pan.getValue();\n else\n return pan;\n },\n\n inherits: function(subClass, superClass) {\n subClass._super_ = superClass;\n if (Object['create']) {\n subClass.prototype = Object.create(superClass.prototype, {\n constructor: { value: subClass }\n });\n } else {\n var F = function() {};\n F.prototype = superClass.prototype;\n subClass.prototype = new F();\n subClass.prototype.constructor = subClass;\n }\n }\n };\n\n Proton.Util = Util;\n\n\n\n var ColorUtil = ColorUtil || {\n getRGB: function(color) {\n var rgb = {};\n if (typeof color === 'number') {\n hex = Math.floor(color);\n rgb.r = (color >> 16 & 255) / 255;\n rgb.g = (color >> 8 & 255) / 255;\n rgb.b = (color & 255) / 255;\n } else if (typeof color === 'string') {\n var m;\n if (m = /^(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(,\\s*([0-9]*\\.?[0-9]+)\\s*)?$/.exec(color)) {\n rgb.r = Math.min(255, parseInt(m[1], 10)) / 255;\n rgb.g = Math.min(255, parseInt(m[2], 10)) / 255;\n rgb.b = Math.min(255, parseInt(m[3], 10)) / 255;\n } else if (m = /^\\#([A-Fa-f0-9]+)$/.exec(color)) {\n var hex = m[1];\n rgb.r = parseInt(hex.charAt(0) + hex.charAt(1), 16) / 255;\n rgb.g = parseInt(hex.charAt(2) + hex.charAt(3), 16) / 255;\n rgb.b = parseInt(hex.charAt(4) + hex.charAt(5), 16) / 255;\n }\n } else if (color instanceof THREE.Color) {\n rgb.r = color.r;\n rgb.g = color.g;\n rgb.b = color.b;\n }\n\n return rgb;\n }\n };\n\n\n Proton.ColorUtil = ColorUtil;\n\n\n\n var THREEUtil = {\n toScreenPos: function() {\n var vector = new THREE.Vector3();\n\n return function(pos, camera, canvas) {\n vector.copy(pos);\n // map to normalized device coordinate (NDC) space\n vector.project(camera);\n // map to 2D screen space\n vector.x = Math.round((vector.x + 1) * canvas.width / 2);\n vector.y = Math.round((-vector.y + 1) * canvas.height / 2);\n vector.z = 0;\n\n return vector;\n }\n }(),\n\n toSpacePos: function() {\n var vector = new THREE.Vector3(),\n dir = new THREE.Vector3(),\n distance;\n\n return function(pos, camera, canvas) {\n vector.set((pos.x / canvas.width) * 2 - 1, -(pos.y / canvas.height) * 2 + 1, 0.5);\n vector.unproject(camera);\n\n dir.copy(vector.sub(camera.position).normalize());\n distance = -camera.position.z / dir.z;\n vector.copy(camera.position);\n vector.add(dir.multiplyScalar(distance));\n\n return vector;\n }\n }(),\n\n getTexture: function() {\n var store = {};\n\n return function(img) {\n if (img instanceof THREE.Texture) {\n return img;\n } else if (typeof img == \"string\") {\n var id = Proton.PUID.hash(img);\n if (!store[id]) store[id] = new THREE.Texture(img);;\n return store[id];\n } else if (img instanceof Image) {\n var id = Proton.PUID.hash(img.src);\n if (!store[id]) store[id] = new THREE.Texture(img);;\n return store[id];\n }\n }\n }()\n };\n\n Proton.THREEUtil = THREEUtil;\n\n\n\n var PUID = PUID || {\n _id: 0,\n _uids: {},\n id: function(obj) {\n for (var id in this._uids) {\n if (this._uids[id] == obj) return id;\n }\n\n var nid = \"PUID_\" + (this._id++);\n this._uids[nid] = obj;\n return nid;\n },\n\n hash: function(str) {\n return;\n }\n }\n\n Proton.PUID = PUID;\n\n\n\n\n Particle.ID = 0;\n\n /**\n * the Particle class\n * @param {Number} pObj - the parameters of particle config;\n * @example \n * var p = new Proton.Particle({life:3,dead:false});\n * or\n * var p = new Proton.Particle({mass:1,radius:100});\n * @constructor\n */\n function Particle(pOBJ) {\n /**\n * @property {Number} id - The particle's id\n */\n this.id = 'particle_' + Particle.ID++;\n this.name = 'Particle';\n this.reset(\"init\");\n Proton.Util.setPrototypeByObj(this, pOBJ);\n }\n\n Particle.prototype = {\n getDirection: function() {\n return Math.atan2(this.v.x, -this.v.y) * (180 / Proton.PI);\n },\n\n /**\n * @property {Number} life - The particle's life\n * @property {Number} age - The particle's age\n * @property {Number} energy - The particle's energy loss\n * @property {Boolean} dead - The particle is dead?\n * @property {Boolean} sleep - The particle is sleep?\n * @property {Object} target - The particle's target\n * @property {Object} body - The particle's body\n * @property {Number} mass - The particle's mass\n * @property {Number} radius - The particle's radius\n * @property {Number} alpha - The particle's alpha\n * @property {Number} scale - The particle's scale\n * @property {Number} rotation - The particle's rotation\n * @property {String|Number} color - The particle's color\n * @property {Function} easing - The particle's easing\n * @property {Proton.Vector3D} p - The particle's position\n * @property {Proton.Vector3D} v - The particle's velocity\n * @property {Proton.Vector3D} a - The particle's acceleration\n * @property {Array} behaviours - The particle's behaviours array\n * @property {Object} transform - The particle's transform collection\n */\n reset: function(init) {\n this.life = Infinity;\n this.age = 0;\n //energy loss\n this.energy = 1;\n this.dead = false;\n this.sleep = false;\n this.body = null;\n this.parent = null;\n this.mass = 1;\n this.radius = 10;\n\n this.alpha = 1;\n this.scale = 1;\n\n this.useColor = false;\n this.useAlpha = false;\n\n this.easing = Proton.ease.setEasingByName(Proton.ease.easeLinear);\n\n if (init) {\n this.p = new Proton.Vector3D();\n this.v = new Proton.Vector3D();\n this.a = new Proton.Vector3D();\n this.old = {};\n this.old.p = this.p.clone();\n this.old.v = this.v.clone();\n this.old.a = this.a.clone();\n\n this.behaviours = [];\n this.transform = {};\n this.color = { r: 0, g: 0, b: 0 };\n this.rotation = new Proton.Vector3D;\n } else {\n this.p.set(0, 0, 0);\n this.v.set(0, 0, 0);\n this.a.set(0, 0, 0);\n this.old.p.set(0, 0, 0);\n this.old.v.set(0, 0, 0);\n this.old.a.set(0, 0, 0);\n\n this.color.r = 0;\n this.color.g = 0;\n this.color.b = 0;\n\n this.rotation.clear();\n\n Proton.Util.destroyObject(this.transform);\n this.removeAllBehaviours();\n }\n\n return this;\n },\n\n update: function(time, index) {\n if (!this.sleep) {\n this.age += time;\n\n var i = this.behaviours.length;\n while (i--) {\n this.behaviours[i] && this.behaviours[i].applyBehaviour(this, time, index)\n }\n } else {\n //sleep\n }\n\n if (this.age >= this.life) {\n this.destroy();\n } else {\n var scale = this.easing(this.age / this.life);\n this.energy = Math.max(1 - scale, 0);\n }\n\n },\n\n addBehaviour: function(behaviour) {\n this.behaviours.push(behaviour);\n behaviour.initialize(this);\n },\n\n addBehaviours: function(behaviours) {\n var i = behaviours.length;\n while (i--) {\n this.addBehaviour(behaviours[i]);\n }\n },\n\n removeBehaviour: function(behaviour) {\n var index = this.behaviours.indexOf(behaviour);\n if (index > -1) {\n this.behaviours.splice(index, 1);\n }\n },\n\n removeAllBehaviours: function() {\n Proton.Util.destroyArray(this.behaviours);\n },\n\n /**\n * Destory this particle\n * @method destroy\n */\n destroy: function() {\n this.removeAllBehaviours();\n this.energy = 0;\n this.dead = true;\n this.parent = null;\n }\n };\n\n Proton.Particle = Particle;\n\n\n\n\n function Pool() {\n this.cID = 0;\n this.list = {};\n }\n\n Pool.prototype = {\n create: function(obj) {\n this.cID++;\n\n if (typeof obj == \"function\")\n return new obj;\n else\n return obj.clone();\n },\n\n getCount: function() {\n var count = 0;\n for (var id in this.list)\n count += this.list[id].length;\n\n return count++;;\n },\n\n get: function(obj) {\n var p, puid = obj.__puid || Proton.PUID.id(obj);\n if (this.list[puid] && this.list[puid].length > 0)\n p = this.list[puid].pop();\n else\n p = this.create(obj);\n\n p.__puid = obj.__puid || puid;\n return p;\n },\n\n expire: function(obj) {\n return this._getList(obj.__puid).push(obj);\n },\n\n destroy: function() {\n for (var id in this.list) {\n this.list[id].length = 0;\n delete this.list[id];\n }\n },\n\n _getList: function(uid) {\n uid = uid || \"default\";\n if (!this.list[uid]) this.list[uid] = [];\n return this.list[uid];\n }\n }\n\n Proton.Pool = Pool;\n\n\n\n\n var MathUtils = {\n randomAToB: function(a, b, INT) {\n if (!INT)\n return a + Math.random() * (b - a);\n else\n return ((Math.random() * (b - a)) >> 0) + a;\n },\n randomFloating: function(center, f, INT) {\n return MathUtils.randomAToB(center - f, center + f, INT);\n },\n\n randomZone: function(display) {\n\n },\n\n degreeTransform: function(a) {\n return a * Proton.PI / 180;\n },\n\n toColor16: function getRGB(num) {\n return \"#\" + num.toString(16);\n },\n\n randomColor: function() {\n return '#' + ('00000' + (Math.random() * 0x1000000 << 0).toString(16)).slice(-6);\n },\n\n lerp: function(a, b, energy) {\n return b + (a - b) * energy\n },\n\n getNormal: function(v, n) {\n if (v.x == 0 && v.y == 0) {\n if (v.z == 0)\n n.set(1, 0, 1);\n else\n n.set(1, 1, -v.y / v.z);\n } else {\n if (v.x == 0)\n n.set(1, 0, 1);\n else\n n.set(-v.y / v.x, 1, 1);\n }\n\n return n.normalize();\n },\n\n /** \n * Rodrigues' Rotation Formula \n * https://en.wikipedia.org/wiki/Rodrigues%27_rotation_formula\n * v′ = vcos(θ) + k(k⋅v)(1−cos(θ)) + (k*v)sin(θ)\n */\n axisRotate: function(v0, v, k, tha) {\n var cos = Math.cos(tha);\n var sin = Math.sin(tha);\n var p = k.dot(v) * (1 - cos);\n\n v0.copy(k);\n v0.cross(v).scalar(sin);\n v0.addValue(v.x * cos, v.y * cos, v.z * cos);\n v0.addValue(k.x * p, k.y * p, k.z * p);\n }\n }\n\n Proton.MathUtils = MathUtils;\n\n\n//数值积分\n\n var Integration = function(type) {\n this.type = Proton.Util.initValue(type, Proton.EULER);\n }\n\n Integration.prototype = {\n integrate: function(particles, time, damping) {\n this.euler(particles, time, damping);\n },\n\n euler: function(particle, time, damping) {\n if (!particle.sleep) {\n particle.old.p.copy(particle.p);\n particle.old.v.copy(particle.v);\n particle.a.scalar(1 / particle.mass);\n particle.v.add(particle.a.scalar(time));\n particle.p.add(particle.old.v.scalar(time));\n damping && particle.v.scalar(damping);\n particle.a.clear();\n }\n }\n }\n\n Proton.Integration = Integration;\n\n\n//@author mrdoob / http://mrdoob.com/\n\n var Vector3D = function(x, y, z) {\n this.x = x || 0;\n this.y = y || 0;\n this.z = z || 0;\n }\n\n Vector3D.prototype = {\n set: function(x, y, z) {\n this.x = x;\n this.y = y;\n this.z = z;\n return this;\n },\n\n setX: function(x) {\n this.x = x;\n return this;\n },\n\n setY: function(y) {\n this.y = y;\n return this;\n },\n\n setZ: function(z) {\n this.z = z;\n return this;\n },\n\n getGradient: function() {\n if (this.x != 0)\n return Math.atan2(this.y, this.x);\n else if (this.y > 0)\n return Proton.PI / 2;\n else if (this.y < 0)\n return -Proton.PI / 2;\n },\n\n copy: function(v) {\n this.x = v.x;\n this.y = v.y;\n this.z = v.z;\n return this;\n },\n\n add: function(v, w) {\n if (w !== undefined) return this.addVectors(v, w);\n\n this.x += v.x;\n this.y += v.y;\n this.z += v.z;\n\n return this;\n\n },\n\n addValue: function(a, b, c) {\n this.x += a;\n this.y += b;\n this.z += c;\n\n return this;\n\n },\n\n addVectors: function(a, b) {\n this.x = a.x + b.x;\n this.y = a.y + b.y;\n this.z = a.z + b.z;\n\n return this;\n },\n\n addScalar: function(s) {\n this.x += s;\n this.y += s;\n this.z += s;\n\n return this;\n },\n\n sub: function(v, w) {\n if (w !== undefined) return this.subVectors(v, w);\n\n this.x -= v.x;\n this.y -= v.y;\n this.z -= v.z;\n\n return this;\n },\n\n subVectors: function(a, b) {\n this.x = a.x - b.x;\n this.y = a.y - b.y;\n this.z = a.z - b.z;\n return this;\n },\n\n scalar: function(s) {\n this.x *= s;\n this.y *= s;\n this.z *= s;\n\n return this;\n },\n\n divideScalar: function(s) {\n if (s !== 0) {\n this.x /= s;\n this.y /= s;\n this.z /= s;\n } else {\n this.set(0, 0, 0);\n }\n\n return this;\n },\n\n negate: function() {\n return this.scalar(-1);\n },\n\n dot: function(v) {\n return this.x * v.x + this.y * v.y + this.z * v.z;\n },\n\n cross: function(v) {\n var x = this.x,\n y = this.y,\n z = this.z;\n\n this.x = y * v.z - z * v.y;\n this.y = z * v.x - x * v.z;\n this.z = x * v.y - y * v.x;\n\n return this;\n },\n\n lengthSq: function() {\n return this.x * this.x + this.y * this.y + this.z * this.z;\n },\n\n length: function() {\n return Math.sqrt(this.lengthSq());\n },\n\n normalize: function() {\n return this.divideScalar(this.length());\n },\n\n distanceTo: function(v) {\n return Math.sqrt(this.distanceToSquared(v));\n },\n\n crossVectors: function(a, b) {\n\n var ax = a.x,\n ay = a.y,\n az = a.z;\n var bx = b.x,\n by = b.y,\n bz = b.z;\n\n this.x = ay * bz - az * by;\n this.y = az * bx - ax * bz;\n this.z = ax * by - ay * bx;\n\n return this;\n\n },\n\n // eulerFromDir: function() {\n // var quaternion, dir, up;\n\n // return function rotateFromDir(direction) {\n // if (quaternion === undefined) quaternion = new Proton.Quaternion();\n // if (dir === undefined) dir = new Proton.Vector3D;\n // if (up === undefined) up = new Proton.Vector3D(0, 0, 1);\n\n // //quaternion.setFromUnitVectors(up, dir.copy(direction).normalize());\n // console.log(quaternion.setFromUnitVectors(up, dir.copy(direction).normalize()));\n\n // this.applyQuaternion(quaternion.setFromUnitVectors(up, dir.copy(direction).normalize()));\n // console.log(this);\n // return this;\n // };\n // }(),\n\n eulerFromDir: function(dir) {\n \n },\n\n applyEuler: function() {\n var quaternion;\n\n return function applyEuler(euler) {\n if (quaternion === undefined) quaternion = new Proton.Quaternion();\n this.applyQuaternion(quaternion.setFromEuler(euler));\n return this;\n };\n }(),\n\n applyAxisAngle: function() {\n var quaternion;\n return function applyAxisAngle(axis, angle) {\n if (quaternion === undefined) quaternion = new Proton.Quaternion();\n this.applyQuaternion(quaternion.setFromAxisAngle(axis, angle));\n return this;\n };\n }(),\n\n applyQuaternion: function(q) {\n var x = this.x;\n var y = this.y;\n var z = this.z;\n\n var qx = q.x;\n var qy = q.y;\n var qz = q.z;\n var qw = q.w;\n\n // calculate quat * vector\n\n var ix = qw * x + qy * z - qz * y;\n var iy = qw * y + qz * x - qx * z;\n var iz = qw * z + qx * y - qy * x;\n var iw = -qx * x - qy * y - qz * z;\n\n // calculate result * inverse quat\n this.x = ix * qw + iw * -qx + iy * -qz - iz * -qy;\n this.y = iy * qw + iw * -qy + iz * -qx - ix * -qz;\n this.z = iz * qw + iw * -qz + ix * -qy - iy * -qx;\n return this;\n },\n\n distanceToSquared: function(v) {\n var dx = this.x - v.x,\n dy = this.y - v.y,\n dz = this.z - v.z;\n\n return dx * dx + dy * dy + dz * dz;\n },\n\n lerp: function(v, alpha) {\n this.x += (v.x - this.x) * alpha;\n this.y += (v.y - this.y) * alpha;\n this.z += (v.z - this.z) * alpha;\n return this;\n },\n\n equals: function(v) {\n return ((v.x === this.x) && (v.y === this.y) && (v.z === this.z));\n },\n\n clear: function() {\n this.x = 0.0;\n this.y = 0.0;\n this.z = 0.0;\n return this;\n },\n\n clone: function() {\n return new Proton.Vector3D(this.x, this.y, this.z);\n },\n\n toString: function() {\n return \"x:\" + this.x + \"y:\" + this.y + \"z:\" + this.z;\n }\n };\n\n Proton.Vector3D = Vector3D;\n\n\n\n var Polar3D = function(radius, theta, phi) {\n this.radius = radius || 1;\n this.phi = phi || 0;\n this.theta = theta || 0;\n }\n\n Polar3D.prototype = {\n set: function(radius, theta, phi) {\n this.radius = radius || 1;\n this.phi = phi || 0;\n this.theta = theta || 0;\n\n return this;\n },\n\n setRadius: function(radius) {\n this.radius = radius;\n return this;\n },\n\n setPhi: function(phi) {\n this.phi = phi;\n return this;\n },\n\n setTheta: function(theta) {\n this.theta = theta;\n return this;\n },\n\n copy: function(p) {\n this.radius = p.radius;\n this.phi = p.phi;\n this.theta = p.theta;\n return this;\n },\n\n toVector3D: function() {\n return new Proton.Vector3D(this.getX(), this.getY(), this.getZ());\n },\n\n getX: function() {\n return this.radius * Math.sin(this.theta) * Math.cos(this.phi);\n },\n\n getY: function() {\n return -this.radius * Math.sin(this.theta) * Math.sin(this.phi);\n },\n\n getZ: function() {\n return this.radius * Math.cos(this.theta);\n },\n\n normalize: function() {\n this.radius = 1;\n return this;\n },\n\n equals: function(v) {\n return ((v.radius === this.radius) && (v.phi === this.phi) && (v.theta === this.theta));\n },\n\n clear: function() {\n this.radius = 0.0;\n this.phi = 0.0;\n this.theta = 0.0;\n return this;\n },\n\n clone: function() {\n return new Polar3D(this.radius, this.phi, this.theta);\n }\n };\n\n\n Proton.Polar3D = Polar3D;\n\n\n\n /**\n * Span Class. Get a random Number from a to b. Or from c-a to c+b\n * @param {Number|Array} a - min number\n * @param {Number} b - max number\n * @param {Number} center - the center's z value \n * @example \n * var span = new Proton.Span(0,30);\n * or\n * var span = new Proton.Span([\"#fff\",\"#ff0\",\"#000\"]);\n * or\n * var span = new Proton.Span(5,1,\"center\");\n * @extends {Zone}\n * @constructor\n */\n function Span(a, b, center) {\n this._isArray = false;\n\n if (Proton.Util.isArray(a)) {\n this._isArray = true;\n this.a = a;\n } else {\n this.a = Proton.Util.initValue(a, 1);\n this.b = Proton.Util.initValue(b, this.a);\n this._center = Proton.Util.initValue(center, false);\n }\n }\n\n /**\n * Span.getValue function\n * @name get a random Number from a to b. Or get a random Number from c-a to c+b\n * @param {number} INT or int\n * @return {number} a random Number\n */\n Span.prototype = {\n getValue: function(INT) {\n if (this._isArray) {\n return this.a[(this.a.length * Math.random()) >> 0];\n } else {\n if (!this._center)\n return Proton.MathUtils.randomAToB(this.a, this.b, INT);\n else\n return Proton.MathUtils.randomFloating(this.a, this.b, INT);\n }\n }\n }\n\n /**\n * Proton.createSpan function\n * @name get a instance of Span\n * @param {number} a min number\n * @param {number} b max number\n * @param {number} c center number\n * @return {number} return a instance of Span\n */\n Proton.createSpan = function(a, b, c) {\n if (a instanceof Span) return a;\n\n if (b === undefined) {\n return new Span(a);\n } else {\n if (c === undefined)\n return new Span(a, b);\n else\n return new Span(a, b, c);\n }\n }\n\n Proton.Span = Span;\n\n\n\n /**\n * ArraySpan name get a random Color from a colors array\n * @param {String|Array} colors - colors array\n * @example \n * var span = new Proton.ArraySpan([\"#fff\",\"#ff0\",\"#000\"]);\n * or\n * var span = new Proton.ArraySpan(\"#ff0\");\n * @extends {Proton.Span}\n * @constructor\n */\n\n function ArraySpan(colors) {\n this._arr = Proton.Util.isArray(colors) ? colors : [colors];\n }\n\n Proton.Util.inherits(ArraySpan, Proton.Span);\n\n /**\n * getValue function\n * @name get a random Color\n * @return {string} a hex color\n */\n ArraySpan.prototype.getValue = function() {\n var color = this._arr[(this._arr.length * Math.random()) >> 0];\n \n if (color == 'random' || color == 'Random')\n return Proton.MathUtils.randomColor();\n else\n return color;\n }\n\n /**\n * Proton.createArraySpan function\n * @name get a instance of Span\n * @param {number} a min number\n * @param {number} b max number\n * @param {number} c center number\n * @return {number} return a instance of Span\n */\n Proton.createArraySpan = function(arr) {\n if (!arr) return null;\n if (arr instanceof Proton.ArraySpan)\n return arr;\n else \n return new Proton.ArraySpan(arr);\n }\n\n Proton.ArraySpan = ArraySpan;\n\n\n\n\n\n var Quaternion = function(x, y, z, w) {\n this.x = x || 0;\n this.y = y || 0;\n this.z = z || 0;\n this.w = (w !== undefined) ? w : 1;\n };\n\n Quaternion.prototype = {\n set: function(x, y, z, w) {\n this.x = x;\n this.y = y;\n this.z = z;\n this.w = w;\n return this;\n },\n\n clone: function() {\n return new Proton.Quaternion(this.x, this.y, this.z, this.w);\n },\n\n copy: function(quaternion) {\n this.x = quaternion.x;\n this.y = quaternion.y;\n this.z = quaternion.z;\n this.w = quaternion.w;\n return this;\n },\n\n setFromEuler: function(euler) {\n // http://www.mathworks.com/matlabcentral/fileexchange/\n // 20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/\n // content/SpinCalc.m\n\n var c1 = Math.cos(euler.x / 2);\n var c2 = Math.cos(euler.y / 2);\n var c3 = Math.cos(euler.z / 2);\n var s1 = Math.sin(euler.x / 2);\n var s2 = Math.sin(euler.y / 2);\n var s3 = Math.sin(euler.z / 2);\n\n this.x = s1 * c2 * c3 + c1 * s2 * s3;\n this.y = c1 * s2 * c3 - s1 * c2 * s3;\n this.z = c1 * c2 * s3 + s1 * s2 * c3;\n this.w = c1 * c2 * c3 - s1 * s2 * s3;\n\n return this;\n\n },\n\n setFromAxisAngle: function(axis, angle) {\n // http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm\n // assumes axis is normalized\n var halfAngle = angle / 2,\n s = Math.sin(halfAngle);\n this.x = axis.x * s;\n this.y = axis.y * s;\n this.z = axis.z * s;\n this.w = Math.cos(halfAngle);\n\n return this;\n },\n\n // setFromUnitVectors: function() {\n // var v1, r;\n // var EPS = 0.000001;\n\n // return function(vFrom, vTo) {\n // if (v1 === undefined) v1 = new Proton.Vector3D();\n\n // r = vFrom.dot(vTo) + 1;\n // if (r < EPS) {\n // r = 0;\n // if (Math.abs(vFrom.x) > Math.abs(vFrom.z)) {\n // v1.set(-vFrom.y, vFrom.x, 0);\n // } else {\n // v1.set(0, -vFrom.z, vFrom.y);\n // }\n // } else {\n // v1.crossVectors(vFrom, vTo);\n // }\n\n // this.x = v1.x;\n // this.y = v1.y;\n // this.z = v1.z;\n // this.w = r;\n // return this.normalize();\n // };\n // }(),\n\n normalize: function() {\n\n var l = this.length();\n\n if (l === 0) {\n\n this.x = 0;\n this.y = 0;\n this.z = 0;\n this.w = 1;\n\n } else {\n l = 1 / l;\n this.x *= l;\n this.y *= l;\n this.z *= l;\n this.w *= l;\n\n }\n return this;\n },\n\n length: function() {\n\n return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w);\n\n },\n\n dot: function(v) {\n return this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w;\n }\n };\n\n Proton.Quaternion = Quaternion;\n\n\n\n function Box(x, y, z, w, h, d) {\n this.x = x;\n this.y = y;\n this.z = z;\n this.width = w;\n this.height = h;\n this.depth = d;\n this.bottom = this.y + this.height;\n this.right = this.x + this.width;\n this.right = this.x + this.width;\n }\n\n\n Box.prototype = {\n contains: function(x, y, z) {\n if (\n x <= this.right &&\n x >= this.x &&\n y <= this.bottom &&\n y >= this.y &&\n z <= this.depth &&\n z >= this.z\n )\n return true\n else\n return false\n }\n }\n\n Proton.Box = Box;\n\n\n\n /**\n * The Behaviour class is the base for the other Behaviour\n *\n * @class Behaviour\n * @constructor\n */\n function Behaviour(life, easing) {\n /**\n * The behaviour's id;\n * @property id\n * @type {String} id\n */\n this.id = 'Behaviour_' + Behaviour.id++;\n this.life = Proton.Util.initValue(life, Infinity);\n\n /**\n * The behaviour's decaying trend, for example Proton.easeOutQuart;\n * @property easing\n * @type {String}\n * @default Proton.easeLinear\n */\n this.easing = Proton.Util.initValue(easing, Proton.ease.setEasingByName(Proton.ease.easeLinear));\n this.age = 0;\n this.energy = 1;\n /**\n * The behaviour is Dead;\n * @property dead\n * @type {Boolean}\n */\n this.dead = false;\n\n /**\n * The behaviour name;\n * @property name\n * @type {string}\n */\n\n this.name = 'Behaviour';\n }\n\n Behaviour.id = 0;\n\n\n Behaviour.prototype = {\n /**\n * Reset this behaviour's parameters\n *\n * @method reset\n * @param {Number} this behaviour's life\n * @param {String} this behaviour's easing\n */\n reset: function(life, easing) {\n this.life = Proton.Util.initValue(life, Infinity);\n this.easing = Proton.Util.initValue(easing, Proton.ease.setEasingByName(Proton.ease.easeLinear));\n },\n /**\n * Normalize a force by 1:100;\n *\n * @method normalizeForce\n * @param {Proton.Vector2D} force \n */\n normalizeForce: function(force) {\n return force.scalar(Proton.MEASURE);\n },\n\n /**\n * Normalize a value by 1:100;\n *\n * @method normalizeValue\n * @param {Number} value\n */\n normalizeValue: function(value) {\n return value * Proton.MEASURE;\n },\n\n /**\n * Initialize the behaviour's parameters for all particles\n *\n * @method initialize\n * @param {Proton.Particle} particle\n */\n initialize: function(particle) {},\n\n /**\n * Apply this behaviour for all particles every time\n *\n * @method applyBehaviour\n * @param {Proton.Particle} particle\n * @param {Number} the integrate time 1/ms\n * @param {Int} the particle index\n */\n applyBehaviour: function(particle, time, index) {\n if (this.dead) return;\n\n this.age += time;\n if (this.age >= this.life) {\n this.energy = 0;\n this.dead = true;\n return;\n }\n\n var scale = this.easing(particle.age / particle.life);\n this.energy = Math.max(1 - scale, 0);\n },\n\n /**\n * Destory this behaviour\n * @method destroy\n */\n destroy: function() {\n\n }\n };\n\n Proton.Behaviour = Behaviour;\n\n\n\n /**\n * The number of particles per second emission (a [particle]/b [s]);\n * @class Proton.Rate\n * @constructor\n * @param {Array or Number or Proton.Span} numPan the number of each emission;\n * @param {Array or Number or Proton.Span} timePan the time of each emission;\n * for example: new Proton.Rate(new Proton.Span(10, 20), new Proton.Span(.1, .25));\n */\n \n function Rate(numPan, timePan) {\n this.numPan = Proton.createSpan(Proton.Util.initValue(numPan, 1));\n this.timePan = Proton.createSpan(Proton.Util.initValue(timePan, 1));\n\n this.startTime = 0;\n this.nextTime = 0;\n this.init();\n }\n\n Rate.prototype = {\n init: function() {\n this.startTime = 0;\n this.nextTime = this.timePan.getValue();\n },\n\n getValue: function(time) {\n this.startTime += time;\n\n if (this.startTime >= this.nextTime) {\n this.init();\n\n if (this.numPan.b == 1) {\n if (this.numPan.getValue(\"Float\") > 0.5)\n return 1;\n else\n return 0;\n } else {\n return this.numPan.getValue(\"Int\");\n }\n }\n\n return 0;\n }\n }\n\n Proton.Rate = Rate;\n\n\n\n function Initialize() {\n this.name = \"Initialize\";\n }\n\n\n Initialize.prototype.reset = function() {\n\n }\n\n Initialize.prototype.init = function(emitter, particle) {\n if (particle) {\n this.initialize(particle);\n } else {\n this.initialize(emitter);\n }\n };\n\n ///sub class init\n Initialize.prototype.initialize = function(target) {};\n Proton.Initialize = Initialize;\n\n\n\n var InitializeUtil = {\n\n initialize: function(emitter, particle, initializes) {\n var i = initializes.length;\n while (i--) {\n var initialize = initializes[i];\n if (initialize instanceof Proton.Initialize)\n initialize.init(emitter, particle);\n else\n InitializeUtil.init(emitter, particle, initialize);\n }\n\n InitializeUtil.bindEmitter(emitter, particle);\n },\n\n //////////////////////init//////////////////////\n init: function(emitter, particle, initialize) {\n Proton.Util.setPrototypeByObj(particle, initialize);\n Proton.Util.setVectorByObj(particle, initialize);\n },\n\n bindEmitter: function(emitter, particle) {\n if (emitter.bindEmitter) {\n particle.p.add(emitter.p);\n particle.v.add(emitter.v);\n particle.a.add(emitter.a);\n particle.v.applyEuler(emitter.rotation);\n }\n }\n }\n\n Proton.InitializeUtil = InitializeUtil;\n\n\n\n /**\n * Life is init particle's Life\n * @param {Number} a - the Life's start point\n * @param {Number} b - the Life's end point \n * @param {String} c - span's center \n * @example \n * var life = new Proton.Life(3,5);\n * or\n * var life = new Proton.Life(Infinity);\n * @extends {Initialize}\n * @constructor\n */\n function Life(a, b, c) {\n Life._super_.call(this);\n this.lifePan = Proton.createSpan(a, b, c);\n }\n\n\n Proton.Util.inherits(Life, Proton.Initialize);\n Life.prototype.initialize = function(target) {\n if (this.lifePan.a == Infinity || this.lifePan.a == \"infi\")\n target.life = Infinity;\n else\n target.life = this.lifePan.getValue();\n };\n\n\n Proton.Life = Life;\n\n\n\n /**\n * Position is init particle's Position\n * @param {Zone} zone - the Position zone\n * @example \n * var Position = new Proton.Position(new Proton.PointZone(30,100,0));\n * or\n * var Position = new Proton.Position(Infinity);\n * @extends {Proton.Initialize}\n * @constructor\n */\n function Position() {\n Position._super_.call(this);\n this.reset.apply(this, arguments);\n }\n\n\n Proton.Util.inherits(Position, Proton.Initialize);\n Position.prototype.reset = function() {\n if (!this.zones) this.zones = [];\n else this.zones.length = 0;\n\n var args = Array.prototype.slice.call(arguments);\n this.zones = this.zones.concat(args);\n };\n\n Position.prototype.addZone = function() {\n var args = Array.prototype.slice.call(arguments);\n this.zones = this.zones.concat(args);\n };\n\n Position.prototype.initialize = function() {\n var zone;\n return function(target) {\n var zone = this.zones[(Math.random() * this.zones.length) >> 0];\n zone.getPosition();\n\n target.p.x = zone.vector.x;\n target.p.y = zone.vector.y;\n target.p.z = zone.vector.z;\n }\n }();\n\n\n Proton.Position = Position;\n Proton.P = Position;\n\n\n\n\n /**\n * Velocity is init particle's Velocity\n * @param {Number} a - the Life's start point\n * @param {Number} b - the Life's end point \n * @param {String} c - span's center \n * @example \n * var life = new Proton.Life(3,5);\n * or\n * var life = new Proton.Life(Infinity);\n * @extends {Initialize}\n * @constructor\n */\n //radius and tha\n function Velocity(a, b, c) {\n Velocity._super_.call(this);\n this.reset(a, b, c);\n this.dirVec = new Proton.Vector3D(0, 0, 0);\n\n this.name = \"Velocity\";\n }\n\n Proton.Util.inherits(Velocity, Proton.Initialize);\n\n Velocity.prototype.reset = function(a, b, c) {\n //[vector,tha]\n if (a instanceof Proton.Vector3D) {\n this.radiusPan = Proton.createSpan(1);\n this.dir = a.clone();\n this.tha = b * Proton.DR;\n this._useV = true;\n }\n\n //[polar,tha]\n else if (a instanceof Proton.Polar3D) {\n this.tha = b * Proton.DR;\n this.dirVec = a.toVector3D();\n this._useV = false;\n }\n\n //[radius,vector,tha]\n else {\n this.radiusPan = Proton.createSpan(a);\n this.dir = b.clone().normalize();\n this.tha = c * Proton.DR;\n this._useV = true;\n }\n };\n\n Velocity.prototype.normalize = function(vr) {\n return vr * Proton.MEASURE;\n }\n\n Velocity.prototype.initialize = function() {\n var tha;\n var normal = new Proton.Vector3D(0, 0, 1);\n var v = new Proton.Vector3D(0, 0, 0);\n\n return function initialize(target) {\n tha = this.tha * Math.random();\n this._useV && this.dirVec.copy(this.dir).scalar(this.radiusPan.getValue());\n\n Proton.MathUtils.getNormal(this.dirVec, normal);\n v.copy(this.dirVec).applyAxisAngle(normal, tha);\n v.applyAxisAngle(this.dirVec.normalize(), Math.random() * Proton.PI * 2);\n\n //use axisRotate methods\n //Proton.MathUtils.axisRotate(this.v1, this.dirVec, normal, tha);\n //Proton.MathUtils.axisRotate(this.v2, this.v1, this.dirVec.normalize(), Math.random() * Proton.PI * 2);\n target.v.copy(v);\n return this;\n };\n }()\n\n Proton.Velocity = Velocity;\n Proton.V = Velocity;\n\n\n\n /**\n * Mass is init particle's Mass\n * @param {Number} a - the Mass's start point\n * @param {Number} b - the Mass's end point \n * @param {String} c - span's center \n * @example \n * var Mass = new Proton.Mass(3,5);\n * or\n * var Mass = new Proton.Mass(Infinity);\n * @extends {Initialize}\n * @constructor\n */\n function Mass(a, b, c) {\n Mass._super_.call(this);\n this.massPan = Proton.createSpan(a, b, c);\n }\n\n\n Proton.Util.inherits(Mass, Proton.Initialize);\n Mass.prototype.initialize = function(target) {\n target.mass = this.massPan.getValue();\n };\n\n Proton.Mass = Mass;\n\n\n\n\n /**\n * Radius is init particle's Radius\n * @param {Number} a - the Radius's start point\n * @param {Number} b - the Radius's end point \n * @param {String} c - span's center \n * @example \n * var Radius = new Proton.Radius(3,5);\n * or\n * var Radius = new Proton.Radius(3,1,\"center\");\n * @extends {Initialize}\n * @constructor\n */\n function Radius(a, b, c) {\n Radius._super_.call(this);\n this.radius = Proton.createSpan(a, b, c);\n }\n\n\n Proton.Util.inherits(Radius, Proton.Initialize);\n Radius.prototype.reset = function(a, b, c) {\n this.radius = Proton.createSpan(a, b, c);\n };\n\n Radius.prototype.initialize = function(particle) {\n particle.radius = this.radius.getValue();\n particle.transform.oldRadius = particle.radius;\n };\n\n Proton.Radius = Radius;\n\n\n\n function Body(body, w, h) {\n Body._super_.call(this);\n this.body = Proton.createArraySpan(body);\n this.w = w;\n this.h = Proton.Util.initValue(h, this.w);\n }\n\n Proton.Util.inherits(Body, Proton.Initialize);\n\n Body.prototype.initialize = function(particle) {\n var body = this.body.getValue();\n if (!!this.w) {\n particle.body = {\n width: this.w,\n height: this.h,\n body: body\n };\n } else {\n particle.body = body;\n }\n };\n\n Proton.Body = Body;\n\n\n\n\n /**\n * The Behaviour class is the base for the other Behaviour\n *\n * @class Behaviour\n * @constructor\n */\n function Force(fx, fy, fz, life, easing) {\n Force._super_.call(this, life, easing);\n Force.prototype.reset.call(this, fx, fy, fz);\n this.name = \"Force\";\n }\n\n Proton.Util.inherits(Force, Proton.Behaviour);\n Force.prototype.reset = function(fx, fy, fz) {\n this.force = this.normalizeForce(new Proton.Vector3D(fx, fy, fz));\n this.force.id = Math.random();\n }\n\n Force.prototype.applyBehaviour = function(particle, time, index) {\n Force._super_.prototype.applyBehaviour.call(this, particle, time, index);\n particle.a.add(this.force);\n };\n\n Proton.F = Proton.Force = Force;\n\n\n\n\tfunction Attraction(targetPosition, force, radius, life, easing) {\n\t\tAttraction._super_.call(this, life, easing);\n\t\tthis.targetPosition = Proton.Util.initValue(targetPosition, new Proton.Vector3D);\n\t\tthis.radius = Proton.Util.initValue(radius, 1000);\n\t\tthis.force = Proton.Util.initValue(this.normalizeValue(force), 100);\n\t\tthis.radiusSq = this.radius * this.radius\n\t\tthis.attractionForce = new Proton.Vector3D();\n\t\tthis.lengthSq = 0;\n\t\tthis.name = \"Attraction\";\n\t}\n\n\n\tProton.Util.inherits(Attraction, Proton.Behaviour);\n\tAttraction.prototype.reset = function(targetPosition, force, radius, life, easing) {\n\t\tthis.targetPosition = Proton.Util.initValue(targetPosition, new Proton.Vector3D);\n\t\tthis.radius = Proton.Util.initValue(radius, 1000);\n\t\tthis.force = Proton.Util.initValue(this.normalizeValue(force), 100);\n\t\tthis.radiusSq = this.radius * this.radius\n\t\tthis.attractionForce = new Proton.Vector3D();\n\t\tthis.lengthSq = 0;\n\t\tif (life)\n\t\t\tAttraction._super_.prototype.reset.call(this, life, easing);\n\t}\n\n\tAttraction.prototype.applyBehaviour = function(particle, time, index) {\n\t\tAttraction._super_.prototype.applyBehaviour.call(this, particle, time, index);\n\t\tthis.attractionForce.copy(this.targetPosition);\n\t\tthis.attractionForce.sub(particle.p);\n\t\tthis.lengthSq = this.attractionForce.lengthSq();\n\t\tif (this.lengthSq > 0.000004 && this.lengthSq < this.radiusSq) {\n\t\t\tthis.attractionForce.normalize();\n\t\t\tthis.attractionForce.scalar(1 - this.lengthSq / this.radiusSq);\n\t\t\tthis.attractionForce.scalar(this.force);\n\t\t\tparticle.a.add(this.attractionForce);\n\t\t}\n\t};\n\n\tProton.Attraction = Attraction;\n\n\n\n\n /**\n * The Behaviour class is the base for the other Behaviour\n *\n * @class Behaviour\n * @constructor\n */\n function RandomDrift(driftX, driftY, driftZ, delay, life, easing) {\n RandomDrift._super_.call(this, life, easing);\n this.reset(driftX, driftY, driftZ, delay);\n this.time = 0;\n this.name = \"RandomDrift\";\n }\n\n\n Proton.Util.inherits(RandomDrift, Proton.Behaviour);\n RandomDrift.prototype.reset = function(driftX, driftY, driftZ, delay, life, easing) {\n this.randomFoce = this.normalizeForce(new Proton.Vector3D(driftX, driftY, driftZ));\n this.delayPan = Proton.createSpan(delay || .03);\n this.time = 0;\n life && RandomDrift._super_.prototype.reset.call(this, life, easing);\n }\n\n RandomDrift.prototype.applyBehaviour = function(particle, time, index) {\n RandomDrift._super_.prototype.applyBehaviour.call(this, particle, time, index);\n\n this.time += time;\n if (this.time >= this.delayPan.getValue()) {\n var ax = Proton.MathUtils.randomAToB(-this.randomFoce.x, this.randomFoce.x);\n var ay = Proton.MathUtils.randomAToB(-this.randomFoce.y, this.randomFoce.y);\n var az = Proton.MathUtils.randomAToB(-this.randomFoce.z, this.randomFoce.z);\n particle.a.addValue(ax, ay, az);\n this.time = 0;\n };\n };\n\n Proton.RandomDrift = RandomDrift;\n\n\n\n\tfunction Repulsion(targetPosition, force, radius, life, easing) {\n\t\tRepulsion._super_.call(this, targetPosition, force, radius, life, easing);\n\t\tthis.force *= -1;\n\t\tthis.name = \"Repulsion\";\n\t}\n\n\n\tProton.Util.inherits(Repulsion, Proton.Attraction);\n\tRepulsion.prototype.reset = function(targetPosition, force, radius, life, easing) {\n\t\tRepulsion._super_.prototype.reset.call(this, targetPosition, force, radius, life, easing);\n\t\tthis.force *= -1;\n\t}\n\tProton.Repulsion = Repulsion;\n\n\n\n\n function Gravity(g, life, easing) {\n Gravity._super_.call(this, 0, -g, 0, life, easing);\n this.name = \"Gravity\";\n }\n\n Proton.Util.inherits(Gravity, Proton.Force);\n\n Gravity.prototype.reset = function(g, life, easing) {\n Gravity._super_.prototype.reset.call(this, 0, -g, 0, life, easing);\n }\n\n Proton.Gravity = Gravity;\n Proton.G = Gravity;\n\n\n\n /**\n * The Scale class is the base for the other Proton.Behaviour\n *\n * @class Proton.Behaviour\n * @constructor\n */\n //can use Collision(emitter,true,function(){}) or Collision();\n function Collision(emitter, useMass, callback, life, easing) {\n Collision._super_.call(this, life, easing);\n this.reset(emitter, useMass, callback);\n this.name = \"Collision\";\n }\n\n Proton.Util.inherits(Collision, Proton.Behaviour);\n Collision.prototype.reset = function(emitter, useMass, callback, life, easing) {\n this.emitter = emitter;\n this.useMass = useMass;\n this.callback = callback;\n this.particles = [];\n this.delta = new Proton.Vector3D();\n life && Collision._super_.prototype.reset.call(this, life, easing);\n }\n\n Collision.prototype.applyBehaviour = function(particle, time, index) {\n var particles = this.emitter ? this.emitter.particles.slice(index) : this.particles.slice(index);\n var otherParticle, lengthSq, overlap, distance;\n var averageMass1, averageMass2;\n \n var i = particles.length;\n while (i--) {\n otherParticle = particles[i];\n if (otherParticle == particle) continue;\n \n this.delta.copy(otherParticle.p).sub(particle.p);\n lengthSq = this.delta.lengthSq();\n distance = particle.radius + otherParticle.radius;\n\n if (lengthSq <= distance * distance) {\n overlap = distance - Math.sqrt(lengthSq);\n overlap += 0.5;\n\n averageMass1 = this._getAverageMass(particle, otherParticle);\n averageMass2 = this._getAverageMass(otherParticle, particle);\n\n particle.p.add(this.delta.clone().normalize().scalar(overlap * -averageMass1));\n otherParticle.p.add(this.delta.normalize().scalar(overlap * averageMass2));\n\n this.callback && this.callback(particle, otherParticle);\n }\n }\n };\n\n Collision.prototype._getAverageMass = function(aPartcile, bParticle) {\n return this.useMass ? bParticle.mass / (aPartcile.mass + bParticle.mass) : 0.5;\n }\n\n Proton.Collision = Collision;\n\n\n\n\n function CrossZone(a, b, life, easing) {\n CrossZone._super_.call(this, life, easing);\n this.reset(a, b);\n ///dead /bound /cross\n this.name = \"CrossZone\";\n }\n\n\n Proton.Util.inherits(CrossZone, Proton.Behaviour);\n CrossZone.prototype.reset = function(a, b, life, easing) {\n var zone, crossType;\n if (typeof a == \"string\") {\n crossType = a;\n zone = b;\n } else {\n crossType = b;\n zone = a;\n }\n \n this.zone = zone;\n this.zone.crossType = Proton.Util.initValue(crossType, \"dead\");\n if (life)\n CrossZone._super_.prototype.reset.call(this, life, easing);\n }\n\n CrossZone.prototype.applyBehaviour = function(particle, time, index) {\n CrossZone._super_.prototype.applyBehaviour.call(this, particle, time, index);\n this.zone.crossing.call(this.zone, particle);\n };\n\n Proton.CrossZone = CrossZone;\n\n\n\n\n /**\n * The Alpha class is the base for the other Proton.Behaviour\n *\n * @class Proton.Behaviour\n * @constructor\n */\n\n function Alpha(a, b, life, easing) {\n Alpha._super_.call(this, life, easing);\n this.reset(a, b);\n /**\n * The Proton.Behaviour name;\n * @property name\n * @type {string}\n */\n this.name = \"Alpha\";\n }\n\n\n Proton.Util.inherits(Alpha, Proton.Behaviour);\n Alpha.prototype.reset = function(a, b, life, easing) {\n if (b == null || b == undefined)\n this._same = true;\n else\n this._same = false;\n\n this.a = Proton.createSpan(Proton.Util.initValue(a, 1));\n this.b = Proton.createSpan(b);\n life && Alpha._super_.prototype.reset.call(this, life, easing);\n }\n\n Alpha.prototype.initialize = function(particle) {\n particle.useAlpha = true;\n particle.transform.alphaA = this.a.getValue();\n if (this._same)\n particle.transform.alphaB = particle.transform.alphaA;\n else\n particle.transform.alphaB = this.b.getValue();\n };\n\n Alpha.prototype.applyBehaviour = function(particle, time, index) {\n Alpha._super_.prototype.applyBehaviour.call(this, particle, time, index);\n\n particle.alpha = Proton.MathUtils.lerp(particle.transform.alphaA, particle.transform.alphaB, this.energy);\n if (particle.alpha < 0.002) particle.alpha = 0;\n };\n\n Proton.Alpha = Alpha;\n\n\n\n /**\n * The Scale class is the base for the other Behaviour\n *\n * @class Behaviour\n * @constructor\n */\n\n function Scale(a, b, life, easing) {\n Scale._super_.call(this, life, easing);\n this.reset(a, b);\n this.name = \"Scale\";\n }\n\n\n Proton.Util.inherits(Scale, Proton.Behaviour);\n Scale.prototype.reset = function(a, b, life, easing) {\n if (b == null || b == undefined)\n this._same = true;\n else\n this._same = false;\n\n this.a = Proton.createSpan(Proton.Util.initValue(a, 1));\n this.b = Proton.createSpan(b);\n\n life && Scale._super_.prototype.reset.call(this, life, easing);\n }\n\n Scale.prototype.initialize = function(particle) {\n particle.transform.scaleA = this.a.getValue();\n particle.transform.oldRadius = particle.radius;\n if (this._same)\n particle.transform.scaleB = particle.transform.scaleA;\n else\n particle.transform.scaleB = this.b.getValue();\n\n };\n\n Scale.prototype.applyBehaviour = function(particle, time, index) {\n Scale._super_.prototype.applyBehaviour.call(this, particle, time, index);\n particle.scale = Proton.MathUtils.lerp(particle.transform.scaleA, particle.transform.scaleB, this.energy);\n\n if (particle.scale < 0.0005) particle.scale = 0;\n particle.radius = particle.transform.oldRadius * particle.scale;\n };\n\n Proton.Scale = Scale;\n\n\n\n\n /* The Rotate class is the base\n * for the other Behaviour\n *\n * @class Behaviour * @constructor \n * @example new Proton.Rotate(Proton.createSpan(-1,1),Proton.createSpan(-1,1),Proton.createSpan(-1,1)); \n * @example new Proton.Rotate(); \n * @example new Proton.Rotate(\"random\"); \n */\n\n function Rotate(x, y, z, life, easing) {\n Rotate._super_.call(this, life, easing);\n this.reset(x, y, z);\n this.name = \"Rotate\";\n }\n\n Proton.Util.inherits(Rotate, Proton.Behaviour);\n Rotate.prototype.reset = function(a, b, c, life, easing) {\n this.a = a || 0;\n this.b = b || 0;\n this.c = c || 0;\n\n if (a === undefined || a == \"same\") {\n this._type = \"same\";\n } else if (b == undefined) {\n this._type = \"set\";\n } else if (c === undefined) {\n this._type = \"to\";\n } else {\n this._type = \"add\";\n this.a = Proton.createSpan(this.a * Proton.DR);\n this.b = Proton.createSpan(this.b * Proton.DR);\n this.c = Proton.createSpan(this.c * Proton.DR);\n }\n\n life && Rotate._super_.prototype.reset.call(this, life, easing);\n }\n\n Rotate.prototype.initialize = function(particle) {\n switch (this._type) {\n case \"same\":\n break;\n\n case \"set\":\n this._setRotation(particle.rotation, this.a);\n break;\n\n case \"to\":\n particle.transform.fR = particle.transform.fR || new Proton.Vector3D;\n particle.transform.tR = particle.transform.tR || new Proton.Vector3D;\n this._setRotation(particle.transform.fR, this.a);\n this._setRotation(particle.transform.tR, this.b);\n break;\n\n case \"add\":\n this._setRotation(particle.rotation, new Proton.Vector3D(0,0,Proton.MathUtils.randomAToB(-Proton.PI, Proton.PI)));\n particle.transform.addR = new Proton.Vector3D(this.a.getValue(), this.b.getValue(), this.c.getValue());\n break;\n }\n };\n\n Rotate.prototype._setRotation = function(vec3, value) {\n vec3 = vec3 || new Proton.Vector3D;\n if (value == \"random\") {\n var x = Proton.MathUtils.randomAToB(-Proton.PI, Proton.PI);\n var y = Proton.MathUtils.randomAToB(-Proton.PI, Proton.PI);\n var z = Proton.MathUtils.randomAToB(-Proton.PI, Proton.PI);\n vec3.set(x, y, z);\n } else if (value instanceof Proton.Vector3D) {\n vec3.copy(value);\n }\n };\n\n Rotate.prototype.applyBehaviour = function(particle, time, index) {\n Rotate._super_.prototype.applyBehaviour.call(this, particle, time, index);\n\n switch (this._type) {\n case \"same\":\n if (!particle.rotation) particle.rotation = new Proton.Vector3D;\n particle.rotation.eulerFromDir(particle.v);\n //http://stackoverflow.com/questions/21622956/how-to-convert-direction-vector-to-euler-angles\n //console.log(particle.rotation);\n break;\n\n case \"set\":\n //\n break;\n\n case \"to\":\n particle.rotation.x = Proton.MathUtils.lerp(particle.transform.fR.x, particle.transform.tR.x, this.energy);\n particle.rotation.y = Proton.MathUtils.lerp(particle.transform.fR.y, particle.transform.tR.y, this.energy);\n particle.rotation.z = Proton.MathUtils.lerp(particle.transform.fR.z, particle.transform.tR.z, this.energy);\n break;\n\n case \"add\":\n particle.rotation.add(particle.transform.addR);\n break;\n }\n };\n\n Proton.Rotate = Rotate;\n\n\n\n /**\n * The Scale class is the base for the other Proton.Behaviour\n *\n * @class Proton.Behaviour\n * @constructor\n */\n function Color(a, b, life, easing) {\n Color._super_.call(this, life, easing);\n this.reset(a, b);\n this.name = \"Color\";\n }\n\n\n Proton.Util.inherits(Color, Proton.Behaviour);\n Color.prototype.reset = function(a, b, life, easing) {\n if (b == null || b == undefined)\n this._same = true;\n else\n this._same = false;\n\n this.a = Proton.createArraySpan(a);\n this.b = Proton.createArraySpan(b);\n life && Color._super_.prototype.reset.call(this, life, easing);\n }\n\n Color.prototype.initialize = function(particle) {\n particle.transform.colorA = Proton.ColorUtil.getRGB(this.a.getValue());\n\n particle.useColor = true;\n if (this._same)\n particle.transform.colorB = particle.transform.colorA;\n else\n particle.transform.colorB = Proton.ColorUtil.getRGB(this.b.getValue());\n };\n\n Color.prototype.applyBehaviour = function(particle, time, index) {\n Color._super_.prototype.applyBehaviour.call(this, particle, time, index);\n\n if (!this._same) {\n particle.color.r = Proton.MathUtils.lerp(particle.transform.colorA.r, particle.transform.colorB.r, this.energy) ;\n particle.color.g = Proton.MathUtils.lerp(particle.transform.colorA.g, particle.transform.colorB.g, this.energy) ;\n particle.color.b = Proton.MathUtils.lerp(particle.transform.colorA.b, particle.transform.colorB.b, this.energy) ;\n } else {\n particle.color.r = particle.transform.colorA.r;\n particle.color.g = particle.transform.colorA.g;\n particle.color.b = particle.transform.colorA.b;\n }\n };\n\n\n Proton.Color = Color;\n\n\n\n /**\n * The Behaviour class is the base for the other Behaviour\n *\n * @class Behaviour\n * @constructor\n */\n function Spring(x, y, z, spring, friction, life, easing) {\n Spring._super_.call(this, life, easing);\n Spring.prototype.reset(x, y, z, spring, friction);\n this.name = \"Spring\";\n }\n\n Proton.Util.inherits(Spring, Proton.Behaviour);\n Spring.prototype.reset = function(x, y, z, spring, friction) {\n if (!this.pos)\n this.pos = new Proton.Vector3D(x, y, z);\n else\n this.pos.set(x, y, z);\n this.spring = spring || .1;\n this.friction = friction || .98;\n }\n\n Spring.prototype.applyBehaviour = function(particle, time, index) {\n Spring._super_.prototype.applyBehaviour.call(this, particle, time, index);\n\n particle.v.x += (this.pos.x - particle.p.x) * this.spring;\n particle.v.y += (this.pos.y - particle.p.y) * this.spring;\n particle.v.z += (this.pos.z - particle.p.z) * this.spring;\n\n };\n\n\n Proton.Spring = Spring;\n\n\n\n function Emitter(pObj) {\n this.initializes = [];\n this.particles = [];\n this.behaviours = [];\n this.currentEmitTime = 0;\n this.totalEmitTimes = -1;\n\n /**\n * @property {Number} damping -The friction coefficient for all particle emit by This;\n * @default 0.006\n */\n this.damping = .006;\n /**\n * If bindEmitter the particles can bind this emitter's property;\n * @property bindEmitter\n * @type {Boolean}\n * @default true\n */\n this.bindEmitter = true;\n /**\n * The number of particles per second emit (a [particle]/b [s]);\n * @property rate\n * @type {Rate}\n * @default Rate(1, .1)\n */\n this.rate = new Proton.Rate(1, .1);\n Emitter._super_.call(this, pObj);\n /**\n * The emitter's id;\n * @property id\n * @type {String} id\n */\n this.id = 'emitter_' + Emitter.ID++;\n this.cID = 0;\n this.name = 'Emitter';\n };\n Emitter.ID = 0;\n\n Proton.Util.inherits(Emitter, Proton.Particle);\n Proton.EventDispatcher.initialize(Emitter.prototype);\n\n /**\n * start emit particle\n * @method emit\n * @param {Number} totalEmitTimes total emit times;\n * @param {String} life the life of this emitter\n */\n Emitter.prototype.emit = function(totalEmitTimes, life) {\n this.currentEmitTime = 0;\n this.totalEmitTimes = Proton.Util.initValue(totalEmitTimes, Infinity);\n\n if (life == true || life == 'life' || life == 'destroy') {\n this.life = totalEmitTimes == 'once' ? 1 : this.totalEmitTimes;\n } else if (!isNaN(life)) {\n this.life = life;\n }\n\n this.rate.init();\n };\n\n /**\n * stop emiting\n * @method stopEmit\n */\n Emitter.prototype.stopEmit = function() {\n this.totalEmitTimes = -1;\n this.currentEmitTime = 0;\n };\n\n /**\n * remove current all particles\n * @method removeAllParticles\n */\n Emitter.prototype.removeAllParticles = function() {\n var i = this.particles.length;\n while (i--){\n this.particles[i].dead = true;\n this.particles[i].target.parent.remove(this.particles[i].target);\n }\n };\n\n /**\n * create single particle;\n * \n * can use emit({x:10},new Gravity(10),{'particleUpdate',fun}) or emit([{x:10},new Initialize],new Gravity(10),{'particleUpdate',fun})\n * @method createParticle\n */\n Emitter.prototype.createParticle = function(initialize, behaviour) {\n var particle = this.parent.pool.get(Proton.Particle);\n this.setupParticle(particle, initialize, behaviour);\n this.parent && this.parent.dispatchEvent(\"PARTICLE_CREATED\", particle);\n Proton.bindEmtterEvent && this.dispatchEvent(\"PARTICLE_CREATED\", particle);\n\n return particle;\n };\n /**\n * add initialize to this emitter\n * @method addSelfInitialize\n */\n Emitter.prototype.addSelfInitialize = function(pObj) {\n if (pObj['init']) {\n pObj.init(this);\n } else {\n this.initAll();\n }\n };\n\n\n /**\n * add the Initialize to particles;\n * \n * you can use initializes array:for example emitter.addInitialize(initialize1,initialize2,initialize3);\n * @method addInitialize\n * @param {Initialize} initialize like this new Radius(1, 12)\n */\n Emitter.prototype.addInitialize = function() {\n var i = arguments.length;\n while (i--) this.initializes.push(arguments[i]);\n };\n\n\n /**\n * remove the Initialize\n * @method removeInitialize\n * @param {Initialize} initialize a initialize\n */\n Emitter.prototype.removeInitialize = function(initializer) {\n var index = this.initializes.indexOf(initializer);\n if (index > -1) this.initializes.splice(index, 1);\n };\n\n /**\n * remove all Initializes\n * @method removeInitializers\n */\n Emitter.prototype.removeInitializers = function() {\n Proton.Util.destroyArray(this.initializes);\n };\n /**\n * add the Behaviour to particles;\n * \n * you can use Behaviours array:emitter.addBehaviour(Behaviour1,Behaviour2,Behaviour3);\n * @method addBehaviour\n * @param {Behaviour} behaviour like this new Color('random')\n */\n Emitter.prototype.addBehaviour = function() {\n var i = arguments.length;\n while (i--) this.behaviours.push(arguments[i]);\n };\n /**\n * remove the Behaviour\n * @method removeBehaviour\n * @param {Behaviour} behaviour a behaviour\n */\n Emitter.prototype.removeBehaviour = function(behaviour) {\n var index = this.behaviours.indexOf(behaviour);\n if (index > -1) this.behaviours.splice(index, 1);\n };\n /**\n * remove all behaviours\n * @method removeAllBehaviours\n */\n Emitter.prototype.removeAllBehaviours = function() {\n Proton.Util.destroyArray(this.behaviours);\n };\n\n Emitter.prototype.integrate = function(time) {\n var damping = 1 - this.damping;\n Proton.integrator.integrate(this, time, damping);\n\n var i = this.particles.length;\n while (i--) {\n var particle = this.particles[i];\n particle.update(time, i);\n Proton.integrator.integrate(particle, time, damping);\n\n this.parent && this.parent.dispatchEvent(\"PARTICLE_UPDATE\", particle);\n Proton.bindEmtterEvent && this.dispatchEvent(\"PARTICLE_UPDATE\", particle);\n }\n };\n\n Emitter.prototype.emitting = function(time) {\n if (this.totalEmitTimes == 'once') {\n var i = this.rate.getValue(99999);\n if (i > 0) this.cID = i;\n while (i--) this.createParticle();\n this.totalEmitTimes = 'none';\n\n } else if (!isNaN(this.totalEmitTimes)) {\n this.currentEmitTime += time;\n if (this.currentEmitTime < this.totalEmitTimes) {\n var i = this.rate.getValue(time);\n if (i > 0) this.cID = i;\n while (i--) this.createParticle();\n }\n }\n }\n\n Emitter.prototype.update = function(time) {\n this.age += time;\n if (this.dead || this.age >= this.life) {\n this.destroy();\n }\n\n this.emitting(time);\n this.integrate(time);\n\n var particle, i = this.particles.length;\n while (i--) {\n particle = this.particles[i];\n if (particle.dead) {\n this.parent && this.parent.dispatchEvent(\"PARTICLE_DEAD\", particle);\n Proton.bindEmtterEvent && this.dispatchEvent(\"PARTICLE_DEAD\", particle);\n\n this.parent.pool.expire(particle.reset());\n this.particles.splice(i, 1);\n }\n }\n };\n\n Emitter.prototype.setupParticle = function(particle, initialize, behaviour) {\n var initializes = this.initializes;\n var behaviours = this.behaviours;\n\n if (initialize) {\n if (Proton.Util.isArray(initialize))\n initializes = initialize;\n else\n initializes = [initialize];\n }\n\n if (behaviour) {\n if (Proton.Util.isArray(behaviour))\n behaviours = behaviour;\n else\n behaviours = [behaviour];\n }\n\n Proton.InitializeUtil.initialize(this, particle, initializes);\n particle.addBehaviours(behaviours);\n particle.parent = this;\n this.particles.push(particle);\n };\n\n /**\n * Destory this Emitter\n * @method destroy\n */\n Emitter.prototype.destroy = function() {\n this.dead = true;\n this.energy = 0;\n this.totalEmitTimes = -1;\n\n if (this.particles.length == 0) {\n this.removeInitializers();\n this.removeAllBehaviours();\n\n this.parent && this.parent.removeEmitter(this);\n }\n }\n\n\n Proton.Emitter = Emitter;\n\n\n\n /**\n * The BehaviourEmitter class inherits from Proton.Emitter\n *\n * use the BehaviourEmitter you can add behaviours to self;\n * @class Proton.BehaviourEmitter\n * @constructor\n * @param {Object} pObj the parameters object;\n */\n function BehaviourEmitter(pObj) {\n this.selfBehaviours = [];\n BehaviourEmitter._super_.call(this, pObj);\n };\n\n Proton.Util.inherits(BehaviourEmitter, Proton.Emitter);\n /**\n * add the Behaviour to emitter;\n *\n * you can use Behaviours array:emitter.addSelfBehaviour(Behaviour1,Behaviour2,Behaviour3);\n * @method addSelfBehaviour\n * @param {Proton.Behaviour} behaviour like this new Proton.Color('random')\n */\n BehaviourEmitter.prototype.addSelfBehaviour = function() {\n var length = arguments.length,\n i;\n for (i = 0; i < length; i++) {\n this.selfBehaviours.push(arguments[i]);\n }\n };\n /**\n * remove the Behaviour for self\n * @method removeSelfBehaviour\n * @param {Proton.Behaviour} behaviour a behaviour\n */\n BehaviourEmitter.prototype.removeSelfBehaviour = function(behaviour) {\n var index = this.selfBehaviours.indexOf(behaviour);\n if (index > -1) this.selfBehaviours.splice(index, 1);\n };\n\n BehaviourEmitter.prototype.update = function(time) {\n BehaviourEmitter._super_.prototype.update.call(this, time);\n\n if (!this.sleep) {\n var length = this.selfBehaviours.length,\n i;\n for (i = 0; i < length; i++) {\n this.selfBehaviours[i].applyBehaviour(this, time, i)\n }\n }\n }\n\n Proton.BehaviourEmitter = BehaviourEmitter;\n\n\n\n /**\n * The FollowEmitter class inherits from Proton.Emitter\n *\n * use the FollowEmitter will emit particle when mousemoving\n *\n * @class Proton.FollowEmitter\n * @constructor\n * @param {Element} mouseTarget mouseevent's target;\n * @param {Number} ease the easing of following speed;\n * @default 0.7\n * @param {Object} pObj the parameters object;\n */\n function FollowEmitter(mouseTarget, ease, pObj) {\n this.mouseTarget = Proton.Util.initValue(mouseTarget, window);\n this.ease = Proton.Util.initValue(ease, .7);\n this._allowEmitting = false;\n this.mouse = new Proton.Vector3D();\n this.initEventHandler();\n\n FollowEmitter._super_.call(this, pObj);\n };\n\n Proton.Util.inherits(FollowEmitter, Proton.Emitter);\n FollowEmitter.prototype.initEventHandler = function() {\n var self = this;\n this.mousemoveHandler = function(e) {\n self.mousemove.call(self, e);\n };\n\n this.mousedownHandler = function(e) {\n self.mousedown.call(self, e);\n };\n\n this.mouseupHandler = function(e) {\n self.mouseup.call(self, e);\n };\n \n this.mouseTarget.addEventListener('mousemove', this.mousemoveHandler, false);\n }\n\n /**\n * start emit particle\n * @method emit\n */\n FollowEmitter.prototype.emit = function() {\n this._allowEmitting = true;\n }\n\n /**\n * stop emiting\n * @method stopEmit\n */\n FollowEmitter.prototype.stopEmit = function() {\n this._allowEmitting = false;\n }\n\n FollowEmitter.prototype.setCameraAndCanvas = function(camera, canvas) {\n this.camera = camera;\n this.canvas = canvas;\n }\n\n FollowEmitter.prototype.setCameraAndRenderer = function(camera, renderer) {\n this.camera = camera;\n this.renderer = renderer;\n this.canvas = renderer.domElement;\n }\n\n FollowEmitter.prototype.mousemove = function(e) {\n var rect = this.canvas.getBoundingClientRect();\n var x = e.clientX - rect.left;\n var y = e.clientY - rect.top;\n var ratio = this.renderer? this.renderer.getPixelRatio() : 1;\n x *= ratio;\n y *= ratio;\n\n this.mouse.x += (x - this.mouse.x) * this.ease;\n this.mouse.y += (y - this.mouse.y) * this.ease;\n \n this.p.copy(Proton.THREEUtil.toSpacePos(this.mouse, this.camera, this.canvas, this.renderer));\n\n if (this._allowEmitting){\n FollowEmitter._super_.prototype.emit.call(this, 'once');\n }\n };\n\n /**\n * Destory this Emitter\n * @method destroy\n */\n FollowEmitter.prototype.destroy = function() {\n FollowEmitter._super_.prototype.destroy.call(this);\n this.mouseTarget.removeEventListener('mousemove', this.mousemoveHandler, false);\n }\n\n Proton.FollowEmitter = FollowEmitter;\n\n\n\n /**\n * The Ease class provides a collection of easing functions for use with Proton\n */\n var ease = ease || {\n easeLinear: function(value) {\n return value;\n },\n\n easeInQuad: function(value) {\n return Math.pow(value, 2);\n },\n\n easeOutQuad: function(value) {\n return -(Math.pow((value - 1), 2) - 1);\n },\n\n easeInOutQuad: function(value) {\n if ((value /= 0.5) < 1)\n return 0.5 * Math.pow(value, 2);\n return -0.5 * ((value -= 2) * value - 2);\n },\n\n easeInCubic: function(value) {\n return Math.pow(value, 3);\n },\n\n easeOutCubic: function(value) {\n return (Math.pow((value - 1), 3) + 1);\n },\n\n easeInOutCubic: function(value) {\n if ((value /= 0.5) < 1)\n return 0.5 * Math.pow(value, 3);\n return 0.5 * (Math.pow((value - 2), 3) + 2);\n },\n\n easeInQuart: function(value) {\n return Math.pow(value, 4);\n },\n\n easeOutQuart: function(value) {\n return -(Math.pow((value - 1), 4) - 1);\n },\n\n easeInOutQuart: function(value) {\n if ((value /= 0.5) < 1)\n return 0.5 * Math.pow(value, 4);\n return -0.5 * ((value -= 2) * Math.pow(value, 3) - 2);\n },\n\n easeInSine: function(value) {\n return -Math.cos(value * (Proton.PI / 2)) + 1;\n },\n\n easeOutSine: function(value) {\n return Math.sin(value * (Proton.PI / 2));\n },\n\n easeInOutSine: function(value) {\n return (-0.5 * (Math.cos(Proton.PI * value) - 1));\n },\n\n easeInExpo: function(value) {\n return (value === 0) ? 0 : Math.pow(2, 10 * (value - 1));\n },\n\n easeOutExpo: function(value) {\n return (value === 1) ? 1 : -Math.pow(2, -10 * value) + 1;\n },\n\n easeInOutExpo: function(value) {\n if (value === 0)\n return 0;\n if (value === 1)\n return 1;\n if ((value /= 0.5) < 1)\n return 0.5 * Math.pow(2, 10 * (value - 1));\n return 0.5 * (-Math.pow(2, -10 * --value) + 2);\n },\n\n easeInCirc: function(value) {\n return -(Math.sqrt(1 - (value * value)) - 1);\n },\n\n easeOutCirc: function(value) {\n return Math.sqrt(1 - Math.pow((value - 1), 2));\n },\n\n easeInOutCirc: function(value) {\n if ((value /= 0.5) < 1)\n return -0.5 * (Math.sqrt(1 - value * value) - 1);\n return 0.5 * (Math.sqrt(1 - (value -= 2) * value) + 1);\n },\n\n easeInBack: function(value) {\n var s = 1.70158;\n return (value) * value * ((s + 1) * value - s);\n },\n\n easeOutBack: function(value) {\n var s = 1.70158;\n return (value = value - 1) * value * ((s + 1) * value + s) + 1;\n },\n\n easeInOutBack: function(value) {\n var s = 1.70158;\n if ((value /= 0.5) < 1)\n return 0.5 * (value * value * (((s *= (1.525)) + 1) * value - s));\n return 0.5 * ((value -= 2) * value * (((s *= (1.525)) + 1) * value + s) + 2);\n },\n\n setEasingByName: function(easeName) {\n if (!!ease[easeName])\n return ease[easeName];\n else\n return ease.easeLinear;\n }\n }\n\n\n for (var id in ease) {\n if (id != \"setEasingByName\") Proton[id] = ease[id];\n }\n\n Proton.ease = ease;\n\n\n\n\n\n function BaseRender() { this.name = \"BaseRender\"; }\n\n BaseRender.prototype = {\n init: function(proton) {\n var self = this;\n this.proton = proton;\n \n this.proton.addEventListener(\"PROTON_UPDATE\", function(proton) {\n self.onProtonUpdate.call(self, proton);\n });\n\n this.proton.addEventListener(\"PARTICLE_CREATED\", function(particle) {\n self.onParticleCreated.call(self, particle);\n });\n\n this.proton.addEventListener(\"PARTICLE_UPDATE\", function(particle) {\n self.onParticleUpdate.call(self, particle);\n });\n\n this.proton.addEventListener(\"PARTICLE_DEAD\", function(particle) {\n self.onParticleDead.call(self, particle);\n });\n },\n\n remove: function(proton) {\n // this.proton.removeEventListener(\"PROTON_UPDATE\", this.onProtonUpdate);\n // this.proton.removeEventListener(\"PARTICLE_CREATED\", this.onParticleCreated);\n // this.proton.removeEventListener(\"PARTICLE_UPDATE\", this.onParticleUpdate);\n // this.proton.removeEventListener(\"PARTICLE_DEAD\", this.onParticleDead);\n this.proton = null;\n },\n\n onParticleCreated: function(particle) {\n\n },\n\n onParticleUpdate: function(particle) {\n\n },\n\n onParticleDead: function(particle) {\n\n },\n\n onProtonUpdate: function(proton) {\n\n }\n }\n\n Proton.BaseRender = BaseRender;\n\n\n\n\n function MeshRender(container) {\n MeshRender._super_.call(this);\n this.container = container;\n\n this._targetPool = new Proton.Pool();\n this._materialPool = new Proton.Pool();\n this._body = new THREE.Mesh(\n new THREE.BoxGeometry(50, 50, 50),\n new THREE.MeshLambertMaterial({ color: \"#ff0000\" })\n );\n \n this.name = \"MeshRender\";\n }\n\n Proton.Util.inherits(MeshRender, Proton.BaseRender);\n\n MeshRender.prototype.onProtonUpdate = function() {};\n\n MeshRender.prototype.onParticleCreated = function(particle) {\n if (!particle.target) {\n //set target\n if (!particle.body) particle.body = this._body;\n particle.target = this._targetPool.get(particle.body);\n \n //set material\n if (particle.useAlpha || particle.useColor) {\n particle.target.material.__puid = Proton.PUID.id(particle.body.material);;\n particle.target.material = this._materialPool.get(particle.target.material);\n }\n }\n\n if (particle.target) {\n particle.target.position.copy(particle.p);\n this.container.add(particle.target);\n }\n };\n\n MeshRender.prototype.onParticleUpdate = function(particle) {\n if (particle.target) {\n particle.target.position.copy(particle.p);\n particle.target.rotation.set(particle.rotation.x, particle.rotation.y, particle.rotation.z);\n this.scale(particle);\n\n if (particle.useAlpha) {\n particle.target.material.opacity = particle.alpha;\n particle.target.material.transparent = true;\n }\n\n if (particle.useColor) {\n particle.target.material.color.copy(particle.color);\n }\n }\n };\n\n MeshRender.prototype.scale = function(particle) {\n particle.target.scale.set(particle.scale*particle.radius, particle.scale*particle.radius, particle.scale*particle.radius);\n }\n\n MeshRender.prototype.onParticleDead = function(particle) {\n if (particle.target) {\n if (particle.useAlpha || particle.useColor)\n this._materialPool.expire(particle.target.material);\n\n this._targetPool.expire(particle.target);\n this.container.remove(particle.target);\n particle.target = null;\n }\n };\n\n Proton.MeshRender = MeshRender;\n\n\n\n\n function PointsRender(ps) {\n PointsRender._super_.call(this);\n this.points = ps;\n this.name = \"PointsRender\";\n }\n\n Proton.Util.inherits(PointsRender, Proton.BaseRender);\n\n PointsRender.prototype.onProtonUpdate = function() {\n \n };\n\n PointsRender.prototype.onParticleCreated = function(particle) {\n if (!particle.target) {\n particle.target = new THREE.Vector3();\n }\n\n particle.target.copy(particle.p);\n this.points.geometry.vertices.push(particle.target);\n };\n\n PointsRender.prototype.onParticleUpdate = function(particle) {\n if (particle.target) {\n particle.target.copy(particle.p);\n }\n };\n\n PointsRender.prototype.onParticleDead = function(particle) {\n if (particle.target) {\n var index = this.points.geometry.vertices.indexOf(particle.target);\n if (index > -1)\n this.points.geometry.vertices.splice(index, 1);\n \n particle.target = null;\n }\n };\n\n Proton.PointsRender = PointsRender;\n\n\n\n\n function SpriteRender(container) {\n SpriteRender._super_.call(this, container);\n\n this._body = new THREE.Sprite(new THREE.SpriteMaterial({ color: 0xffffff }));\n this.name = \"SpriteRender\";\n }\n\n Proton.Util.inherits(SpriteRender, Proton.MeshRender);\n\n SpriteRender.prototype.scale = function(particle) {\n particle.target.scale.set(particle.scale * particle.radius, particle.scale * particle.radius, 1);\n };\n\n Proton.SpriteRender = SpriteRender;\n\n\n\n\n function CustomRender() {\n CustomRender._super_.call(this);\n this.targetPool = new Proton.Pool();\n this.materialPool = new Proton.Pool();\n \n this.name = \"CustomRender\";\n }\n\n Proton.Util.inherits(CustomRender, Proton.BaseRender);\n\n CustomRender.prototype.onProtonUpdate = function() {};\n\n CustomRender.prototype.onParticleCreated = function(particle) {\n \n };\n\n CustomRender.prototype.onParticleUpdate = function(particle) {\n \n };\n\n CustomRender.prototype.onParticleDead = function(particle) {\n \n };\n\n Proton.CustomRender = CustomRender;\n\n\n\n /**\n * Zone is a base class.\n * @constructor\n */\n function Zone() {\n this.vector = new Proton.Vector3D(0, 0, 0);\n this.random = 0;\n this.crossType = \"dead\";\n this.log = true;\n }\n\n Zone.prototype = {\n getPosition: function() {\n return null;\n },\n\n crossing: function(particle) {\n switch (this.crossType) {\n case \"bound\":\n this._bound(particle);\n break;\n\n case \"cross\":\n this._cross(particle);\n break;\n\n case \"dead\":\n this._dead(particle);\n break;\n }\n },\n\n _dead: function(particle) {},\n _bound: function(particle) {},\n _cross: function(particle) {},\n };\n\n Proton.Zone = Zone;\n\n\n\n /**\n * LineZone is a 3d line zone\n * @param {Number|Vector3D} x1 - the line's start point of x value or a Vector3D Object\n * @param {Number|Vector3D} y1 - the line's start point of y value or a Vector3D Object\n * @param {Number} z1 - the line's start point of z value \n * @param {Number} x2 - the line's end point of x value \n * @param {Number} y2 - the line's end point of y value \n * @param {Number} z2 - the line's end point of z value \n * @example \n * var lineZone = new Proton.LineZone(0,0,0,100,100,0);\n * or\n * var lineZone = new Proton.LineZone(new Proton.Vector3D(0,0,0),new Proton.Vector3D(100,100,0));\n * @extends {Zone}\n * @constructor\n */\n function LineZone(x1, y1, z1, x2, y2, z2) {\n LineZone._super_.call(this);\n if (x1 instanceof Proton.Vector3D) {\n this.x1 = x1.x;\n this.y1 = x1.y;\n this.z1 = x1.z;\n\n this.x2 = x2.x;\n this.y2 = x2.y;\n this.z2 = x2.z;\n } else {\n this.x1 = x1;\n this.y1 = y1;\n this.z1 = z1;\n\n this.x2 = x2;\n this.y2 = y2;\n this.z2 = z2;\n }\n }\n\n\n Proton.Util.inherits(LineZone, Proton.Zone);\n LineZone.prototype.getPosition = function() {\n this.random = Math.random();\n this.vector.x = this.x1 + this.random * (this.x2 - this.x1);\n this.vector.y = this.y1 + this.random * (this.y2 - this.y1);\n this.vector.z = this.z1 + this.random * (this.z2 - this.z1);\n return this.vector;\n }\n\n LineZone.prototype.crossing = function(particle) {\n if (this.log) {\n console.error('Sorry LineZone does not support crossing method');\n this.log = false;\n }\n }\n\n Proton.LineZone = LineZone;\n\n\n\n /**\n * SphereZone is a sphere zone\n * @param {Number|Vector3D} x - the center's x value or a Vector3D Object\n * @param {Number} y - the center's y value or the Sphere's radius \n * @param {Number} z - the center's z value \n * @param {Number} r - the Sphere's radius \n * @example \n * var sphereZone = new Proton.SphereZone(0,0,0,100);\n * var sphereZone = new Proton.SphereZone(new Proton.Vector3D(0,0,0),100);\n * @extends {Proton.Zone}\n * @constructor\n */\n function SphereZone(a, b, c, d) {\n var x, y, z, r;\n SphereZone._super_.call(this);\n if (Proton.Util.isUndefined(b, c, d)) {\n x = y = z = 0;\n r = (a || 100);\n } else {\n x = a;\n y = b;\n z = c;\n r = d;\n }\n\n this.x = x;\n this.y = x;\n this.z = x;\n this.radius = r;\n this.tha = this.phi = 0;\n }\n\n Proton.Util.inherits(SphereZone, Proton.Zone);\n SphereZone.prototype.getPosition = function() {\n var tha, phi, r;\n return function() {\n this.random = Math.random();\n\n r = this.random * this.radius;\n tha = Proton.PI * Math.random(); //[0-pi]\n phi = Proton.PI * 2 * Math.random(); //[0-2pi]\n\n this.vector.x = this.x + r * Math.sin(tha) * Math.cos(phi);\n this.vector.y = this.y + r * Math.sin(phi) * Math.sin(tha);\n this.vector.z = this.z + r * Math.cos(tha);\n\n return this.vector;\n }\n }();\n\n SphereZone.prototype._dead = function(particle) {\n var d = particle.p.distanceTo(this);\n if (d - particle.radius > this.radius) particle.dead = true;\n }\n\n SphereZone.prototype._bound = function() {\n var normal = new Proton.Vector3D,\n v = new Proton.Vector3D,\n k;\n\n return function(particle) {\n var d = particle.p.distanceTo(this);\n if (d + particle.radius >= this.radius) {\n normal.copy(particle.p).sub(this).normalize();\n v.copy(particle.v);\n k = 2 * v.dot(normal);\n particle.v.sub(normal.scalar(k));\n }\n }\n }();\n\n SphereZone.prototype._cross = function(particle) {\n if (this.log) {\n console.error('Sorry SphereZone does not support _cross method');\n this.log = false;\n }\n }\n\n Proton.SphereZone = SphereZone;\n\n\n\n\n /**\n * MeshZone is a threejs mesh zone\n * @param {Mesh} geometry - a THREE.Mesh object\n * @example \n * var geometry = new THREE.CylinderGeometry( 5, 5, 20, 32 );\n * var cylinder = new THREE.Mesh( geometry, material );\n * var meshZone = new Proton.MeshZone(geometry);\n * or\n * var meshZone = new Proton.MeshZone(cylinder);\n * @extends {Proton.Zone}\n * @constructor\n */\n\n function MeshZone(geometry, scale) {\n MeshZone._super_.call(this);\n \n this.geometry = geometry.geometry.toBufferGeometry();\n\n this.scale = scale || 1;\n }\n\n Proton.Util.inherits(MeshZone, Proton.Zone);\n MeshZone.prototype.getPosition = function() {\n var vertices = this.geometry.vertices;\n var rVector = vertices[(vertices.length * Math.random()) >> 0];\n this.vector.x = rVector.x * this.scale;\n this.vector.y = rVector.y * this.scale;\n this.vector.z = rVector.z * this.scale;\n return this.vector;\n }\n\n MeshZone.prototype.crossing = function(particle) {\n if (this.log) {\n console.error('Sorry MeshZone does not support crossing method');\n this.log = false;\n }\n }\n\n Proton.MeshZone = MeshZone;\n\n\n\n /**\n * PointZone is a point zone\n * @param {Number|Vector3D} x - the center's x value or a Vector3D Object\n * @param {Number} y - the center's y value\n * @param {Number} z - the center's z value \n * @example \n * var pointZone = new Proton.PointZone(0,30,10);\n * or\n * var pointZone = new Proton.PointZone(new Proton.Vector3D(0,30,10));\n * @extends {Zone}\n * @constructor\n */\n function PointZone(a, b, c) {\n var x, y, z;\n PointZone._super_.call(this);\n\n if (Proton.Util.isUndefined(a, b, c)) {\n x = y = z = 0;\n } else {\n x = a;\n y = b;\n z = c;\n }\n\n this.x = x;\n this.y = y;\n this.z = z;\n }\n\n Proton.Util.inherits(PointZone, Proton.Zone);\n PointZone.prototype.getPosition = function() {\n this.vector.x = this.x;\n this.vector.y = this.y;\n this.vector.z = this.z;\n return this.vector;\n }\n\n PointZone.prototype.crossing = function(particle) {\n if (this.log) {\n console.error('Sorry PointZone does not support crossing method');\n this.log = false;\n }\n }\n\n Proton.PointZone = PointZone;\n\n\n\n /**\n * BoxZone is a box zone\n * @param {Number|Proton.Vector3D} x - the position's x value or a Proton.Vector3D Object\n * @param {Number} y - the position's y value \n * @param {Number} z - the position's z value \n * @param {Number} w - the Box's width \n * @param {Number} h - the Box's height \n * @param {Number} d - the Box's depth \n * @example \n * var boxZone = new Proton.BoxZone(0,0,0,50,50,50);\n * or\n * var boxZone = new Proton.BoxZone(new Proton.Proton.Vector3D(0,0,0), 50, 50, 50);\n * @extends {Proton.Zone}\n * @constructor\n */\n function BoxZone(a, b, c, d, e, f) {\n var x, y, z, w, h, d;\n BoxZone._super_.call(this);\n\n if (Proton.Util.isUndefined(b, c, d, e, f)) {\n x = y = z = 0;\n w = h = d = (a || 100);\n } else if (Proton.Util.isUndefined(d, e, f)) {\n x = y = z = 0;\n w = a;\n h = b;\n d = c;\n } else {\n x = a;\n y = b;\n z = c;\n w = d;\n h = e;\n d = f;\n }\n\n this.x = x;\n this.y = y;\n this.z = z;\n this.width = w;\n this.height = h;\n this.depth = d;\n\n //\n this.friction = 0.85;\n this.max = 6;\n }\n\n Proton.Util.inherits(BoxZone, Proton.Zone);\n BoxZone.prototype.getPosition = function() {\n this.vector.x = this.x + Proton.MathUtils.randomAToB(-.5, .5) * this.width;\n this.vector.y = this.y + Proton.MathUtils.randomAToB(-.5, .5) * this.height;\n this.vector.z = this.z + Proton.MathUtils.randomAToB(-.5, .5) * this.depth;\n return this.vector;\n }\n\n BoxZone.prototype._dead = function(particle) {\n if (particle.p.x + particle.radius < this.x - this.width / 2)\n particle.dead = true;\n else if (particle.p.x - particle.radius > this.x + this.width / 2)\n particle.dead = true;\n\n if (particle.p.y + particle.radius < this.y - this.height / 2)\n particle.dead = true;\n else if (particle.p.y - particle.radius > this.y + this.height / 2)\n particle.dead = true;\n\n if (particle.p.z + particle.radius < this.z - this.depth / 2)\n particle.dead = true;\n else if (particle.p.z - particle.radius > this.z + this.depth / 2)\n particle.dead = true;\n }\n\n BoxZone.prototype._bound = function(particle) {\n if (particle.p.x - particle.radius < this.x - this.width / 2) {\n particle.p.x = this.x - this.width / 2 + particle.radius;\n particle.v.x *= -this.friction;\n this._static(particle, \"x\");\n } else if (particle.p.x + particle.radius > this.x + this.width / 2) {\n particle.p.x = this.x + this.width / 2 - particle.radius;\n particle.v.x *= -this.friction;\n this._static(particle, \"x\");\n }\n\n if (particle.p.y - particle.radius < this.y - this.height / 2) {\n particle.p.y = this.y - this.height / 2 + particle.radius;\n particle.v.y *= -this.friction;\n this._static(particle, \"y\");\n } else if (particle.p.y + particle.radius > this.y + this.height / 2) {\n particle.p.y = this.y + this.height / 2 - particle.radius;\n particle.v.y *= -this.friction;\n this._static(particle, \"y\");\n }\n\n if (particle.p.z - particle.radius < this.z - this.depth / 2) {\n particle.p.z = this.z - this.depth / 2 + particle.radius;\n particle.v.z *= -this.friction;\n this._static(particle, \"z\");\n } else if (particle.p.z + particle.radius > this.z + this.depth / 2) {\n particle.p.z = this.z + this.depth / 2 - particle.radius;\n particle.v.z *= -this.friction;\n this._static(particle, \"z\");\n }\n }\n\n BoxZone.prototype._static = function(particle, axis) {\n if (particle.v[axis] * particle.a[axis] > 0) return;\n if (Math.abs(particle.v[axis]) < Math.abs(particle.a[axis]) * 0.0167 * this.max) {\n particle.v[axis] = 0;\n particle.a[axis] = 0;\n }\n }\n\n BoxZone.prototype._cross = function(particle) {\n if (particle.p.x + particle.radius < this.x - this.width / 2 && particle.v.x <= 0)\n particle.p.x = this.x + this.width / 2 + particle.radius;\n else if (particle.p.x - particle.radius > this.x + this.width / 2 && particle.v.x >= 0)\n particle.p.x = this.x - this.width / 2 - particle.radius;\n\n if (particle.p.y + particle.radius < this.y - this.height / 2 && particle.v.y <= 0)\n particle.p.y = this.y + this.height / 2 + particle.radius;\n else if (particle.p.y - particle.radius > this.y + this.height / 2 && particle.v.y >= 0)\n particle.p.y = this.y - this.height / 2 - particle.radius;\n\n if (particle.p.z + particle.radius < this.z - this.depth / 2 && particle.v.z <= 0)\n particle.p.z = this.z + this.depth / 2 + particle.radius;\n else if (particle.p.z - particle.radius > this.z + this.depth / 2 && particle.v.z >= 0)\n particle.p.z = this.z - this.depth / 2 - particle.radius;\n }\n\n Proton.BoxZone = BoxZone;\n\n\n\n /**\n * ScreenZone is a 3d line zone\n * @param {Number|Vector3D} x1 - the line's start point of x value or a Vector3D Object\n * @param {Number|Vector3D} y1 - the line's start point of y value or a Vector3D Object\n * @param {Number} z1 - the line's start point of z value \n * @param {Number} x2 - the line's end point of x value \n * @param {Number} y2 - the line's end point of y value \n * @param {Number} z2 - the line's end point of z value \n * @example \n * var lineZone = new Proton.ScreenZone(0,0,0,100,100,0);\n * or\n * var lineZone = new Proton.ScreenZone(new Proton.Vector3D(0,0,0),new Proton.Vector3D(100,100,0));\n * @extends {Zone}\n * @constructor\n */\n function ScreenZone(camera, renderer, dis, dir) {\n ScreenZone._super_.call(this);\n\n this.camera = camera;\n this.renderer = renderer;\n this.dis = dis || 20;\n dir = dir || \"1234\";\n for (var i = 1; i < 5; i++)\n this[\"d\" + i] = dir.indexOf(i + \"\") >= 0;\n\n this.name = \"ScreenZone\";\n }\n\n\n Proton.Util.inherits(ScreenZone, Proton.Zone);\n ScreenZone.prototype.getPosition = function() {\n var vec2 = new Proton.Vector3D,\n canvas;\n\n return function() {\n canvas = this.renderer.domElement;\n vec2.x = Math.random() * canvas.width;\n vec2.y = Math.random() * canvas.height;\n this.vector.copy(Proton.THREEUtil.toSpacePos(vec2, this.camera, canvas));\n return this.vector;\n }\n }();\n\n ScreenZone.prototype._dead = function(particle) {\n var pos = Proton.THREEUtil.toScreenPos(particle.p, this.camera, this.renderer.domElement);\n var canvas = this.renderer.domElement;\n\n if ((pos.y + particle.radius < -this.dis) && this.d1) {\n particle.dead = true;\n } else if ((pos.y - particle.radius > canvas.height + this.dis) && this.d3) {\n particle.dead = true;\n }\n\n if ((pos.x + particle.radius < -this.dis) && this.d4) {\n particle.dead = true;\n } else if ((pos.x - particle.radius > canvas.width + this.dis) && this.d2) {\n particle.dead = true;\n }\n }\n\n ScreenZone.prototype._cross = function() {\n var vec2 = new Proton.Vector3D;\n return function(particle) {\n var pos = Proton.THREEUtil.toScreenPos(particle.p, this.camera, this.renderer.domElement);\n var canvas = this.renderer.domElement;\n\n if (pos.y + particle.radius < -this.dis) {\n vec2.x = pos.x;\n vec2.y = canvas.height + this.dis + particle.radius;\n particle.p.y = Proton.THREEUtil.toSpacePos(vec2, this.camera, canvas).y;\n } else if (pos.y - particle.radius > canvas.height + this.dis) {\n vec2.x = pos.x;\n vec2.y = -this.dis - particle.radius;\n particle.p.y = Proton.THREEUtil.toSpacePos(vec2, this.camera, canvas).y;\n }\n\n if (pos.x + particle.radius < -this.dis) {\n vec2.y = pos.y;\n vec2.x = canvas.width + this.dis + particle.radius;\n particle.p.x = Proton.THREEUtil.toSpacePos(vec2, this.camera, canvas).x;\n } else if (pos.x - particle.radius > canvas.width + this.dis) {\n vec2.y = pos.y;\n vec2.x = -this.dis - particle.radius;\n particle.p.x = Proton.THREEUtil.toSpacePos(vec2, this.camera, canvas).x;\n }\n }\n }();\n\n ScreenZone.prototype._bound = function(particle) {\n var pos = Proton.THREEUtil.toScreenPos(particle.p, this.camera, this.renderer.domElement);\n var canvas = this.renderer.domElement;\n\n if (pos.y + particle.radius < -this.dis) {\n particle.v.y *= -1;\n } else if (pos.y - particle.radius > canvas.height + this.dis) {\n particle.v.y *= -1;\n }\n\n if (pos.x + particle.radius < -this.dis) {\n particle.v.y *= -1;\n } else if (pos.x - particle.radius > canvas.width + this.dis) {\n particle.v.y *= -1;\n }\n }\n\n Proton.ScreenZone = ScreenZone;\n\n\n/**\n * You can use this emit particles.\n *\n * This method will console.log the fixed number of your info in updata or requestAnimationFrame\n * \n * use like this Proton.log('+12',mc); log 12 times\n *\n * @class Proton.log\n * @constructor\n * @param {*} logInfo;\n */\n\n var log = function() {\n if (window.console && window.console.trace) {\n var arg = Array.prototype.slice.call(arguments);\n var s1 = arguments[0] + \"\";\n if (s1.indexOf('+') == 0) {\n var n = parseInt(arguments[0]);\n if (log.once < n) {\n arg.shift();\n console.trace.apply(console, arg);\n log.once++;\n }\n } else {\n arg.unshift(\"+15\");\n log.apply(console, arg);\n }\n }\n }\n\n log.once = 0;\n Proton.log = log;\n\n\n\n var Debug = Debug || {\n addEventListener: function(proton, fun) {\n proton.addEventListener(\"PROTON_UPDATE\", function(e) {\n fun(e);\n });\n },\n\n drawZone: function(proton, container, zone) {\n var geometry, material, mesh;\n\n if (zone instanceof Proton.PointZone) {\n geometry = new THREE.SphereGeometry(15);\n } else if (zone instanceof Proton.LineZone) {\n\n } else if (zone instanceof Proton.BoxZone) {\n geometry = new THREE.BoxGeometry(zone.width, zone.height, zone.depth);\n } else if (zone instanceof Proton.SphereZone) {\n geometry = new THREE.SphereGeometry(zone.radius, 10, 10);\n } else if (zone instanceof Proton.MeshZone) {\n //There's an error here but not sure what should be done. Leaving it for now.\n geometry = zone.geometry.geometry.toBufferGeometry();\n\n geometry = new THREE.SphereGeometry(zone.radius, 10, 10);\n }\n\n material = new THREE.MeshBasicMaterial({ color: \"#2194ce\", wireframe: true });\n mesh = new THREE.Mesh(geometry, material);\n container.add(mesh);\n\n this.addEventListener(proton, function(e) {\n mesh.position.set(zone.x, zone.y, zone.z);\n });\n },\n\n drawEmitter: function(proton, container, emitter, color) {\n var geometry = new THREE.OctahedronGeometry(15);\n var material = new THREE.MeshBasicMaterial({ color: color || \"#aaa\", wireframe: true });\n var mesh = new THREE.Mesh(geometry, material);\n container.add(mesh);\n\n this.addEventListener(proton, function() {\n mesh.position.copy(emitter.p);\n mesh.rotation.set(emitter.rotation.x, emitter.rotation.y, emitter.rotation.z);\n });\n },\n\n renderInfo: function() {\n function getCreatedNumber(proton, type) {\n var pool = type == \"material\" ? \"_materialPool\" : \"_targetPool\";\n var renderer = proton.renderers[0];\n return renderer[pool].cID;\n }\n\n function getEmitterPos(proton) {\n var e = proton.emitters[0];\n return Math.round(e.p.x) + \",\" + Math.round(e.p.y) + \",\" + Math.round(e.p.z);\n }\n\n return function(proton, style) {\n this.addInfo(style);\n var str = \"\";\n switch (this._infoType) {\n case 2:\n str += \"emitter:\" + proton.emitters.length + \"
\";\n str += \"em speed:\" + proton.emitters[0].cID + \"
\";\n str += \"pos:\" + getEmitterPos(proton);\n break;\n\n case 3:\n str += proton.renderers[0].name + \"
\";\n str += \"target:\" + getCreatedNumber(proton, \"target\") + \"
\";\n str += \"material:\" + getCreatedNumber(proton, \"material\");\n break;\n\n default:\n str += \"particles:\" + proton.getCount() + \"
\";\n str += \"pool:\" + proton.pool.getCount() + \"
\";\n str += \"total:\" + (proton.getCount() + proton.pool.getCount());\n }\n this._infoCon.innerHTML = str;\n }\n }(),\n\n addInfo: function() {\n return function(style) {\n var self = this;\n if (!this._infoCon) {\n this._infoCon = document.createElement('div');\n this._infoCon.style.cssText = [\n 'position:fixed;bottom:0px;left:0;cursor:pointer;',\n 'opacity:0.9;z-index:10000;padding:10px;font-size:12px;',\n 'width:120px;height:50px;background-color:#002;color:#0ff;'\n ].join('');\n\n this._infoType = 1;\n this._infoCon.addEventListener('click', function(event) {\n self._infoType++;\n if (self._infoType > 3) self._infoType = 1;\n }, false);\n\n var bg, color;\n switch (style) {\n case 2:\n bg = \"#201\";\n color = \"#f08\";\n break;\n\n case 3:\n bg = \"#020\";\n color = \"#0f0\";\n break;\n\n default:\n bg = \"#002\";\n color = \"#0ff\";\n }\n\n this._infoCon.style[\"background-color\"] = bg;\n this._infoCon.style[\"color\"] = color;\n }\n\n if (!this._infoCon.parentNode) document.body.appendChild(this._infoCon);\n }\n }()\n }\n\n Proton.Debug = Debug;\n\nexport { Proton };","import { DiceSFX } from '../DiceSFX.js';\nimport * as THREE from 'three';\nimport { Proton } from '../libs/three.proton.js';\nimport { DiceSFXManager } from './../DiceSFXManager';\n\nexport class PlayAnimationParticleSpiral extends DiceSFX {\n static id = \"PlayAnimationParticleSpiral\";\n static specialEffectName = \"DICESONICE.PlayAnimationParticleSpiral\";\n static sprite = null;\n static dot = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAKQWlDQ1BJQ0MgUHJvZmlsZQAAeAGdlndUU9kWh8+9N73QEiIgJfQaegkg0jtIFQRRiUmAUAKGhCZ2RAVGFBEpVmRUwAFHhyJjRRQLg4Ji1wnyEFDGwVFEReXdjGsJ7601896a/cdZ39nnt9fZZ+9917oAUPyCBMJ0WAGANKFYFO7rwVwSE8vE9wIYEAEOWAHA4WZmBEf4RALU/L09mZmoSMaz9u4ugGS72yy/UCZz1v9/kSI3QyQGAApF1TY8fiYX5QKUU7PFGTL/BMr0lSkyhjEyFqEJoqwi48SvbPan5iu7yZiXJuShGlnOGbw0noy7UN6aJeGjjAShXJgl4GejfAdlvVRJmgDl9yjT0/icTAAwFJlfzOcmoWyJMkUUGe6J8gIACJTEObxyDov5OWieAHimZ+SKBIlJYqYR15hp5ejIZvrxs1P5YjErlMNN4Yh4TM/0tAyOMBeAr2+WRQElWW2ZaJHtrRzt7VnW5mj5v9nfHn5T/T3IevtV8Sbsz55BjJ5Z32zsrC+9FgD2JFqbHbO+lVUAtG0GQOXhrE/vIADyBQC03pzzHoZsXpLE4gwnC4vs7GxzAZ9rLivoN/ufgm/Kv4Y595nL7vtWO6YXP4EjSRUzZUXlpqemS0TMzAwOl89k/fcQ/+PAOWnNycMsnJ/AF/GF6FVR6JQJhIlou4U8gViQLmQKhH/V4X8YNicHGX6daxRodV8AfYU5ULhJB8hvPQBDIwMkbj96An3rWxAxCsi+vGitka9zjzJ6/uf6Hwtcim7hTEEiU+b2DI9kciWiLBmj34RswQISkAd0oAo0gS4wAixgDRyAM3AD3iAAhIBIEAOWAy5IAmlABLJBPtgACkEx2AF2g2pwANSBetAEToI2cAZcBFfADXALDIBHQAqGwUswAd6BaQiC8BAVokGqkBakD5lC1hAbWgh5Q0FQOBQDxUOJkBCSQPnQJqgYKoOqoUNQPfQjdBq6CF2D+qAH0CA0Bv0BfYQRmALTYQ3YALaA2bA7HAhHwsvgRHgVnAcXwNvhSrgWPg63whfhG/AALIVfwpMIQMgIA9FGWAgb8URCkFgkAREha5EipAKpRZqQDqQbuY1IkXHkAwaHoWGYGBbGGeOHWYzhYlZh1mJKMNWYY5hWTBfmNmYQM4H5gqVi1bGmWCesP3YJNhGbjS3EVmCPYFuwl7ED2GHsOxwOx8AZ4hxwfrgYXDJuNa4Etw/XjLuA68MN4SbxeLwq3hTvgg/Bc/BifCG+Cn8cfx7fjx/GvyeQCVoEa4IPIZYgJGwkVBAaCOcI/YQRwjRRgahPdCKGEHnEXGIpsY7YQbxJHCZOkxRJhiQXUiQpmbSBVElqIl0mPSa9IZPJOmRHchhZQF5PriSfIF8lD5I/UJQoJhRPShxFQtlOOUq5QHlAeUOlUg2obtRYqpi6nVpPvUR9Sn0vR5Mzl/OX48mtk6uRa5Xrl3slT5TXl3eXXy6fJ18hf0r+pvy4AlHBQMFTgaOwVqFG4bTCPYVJRZqilWKIYppiiWKD4jXFUSW8koGStxJPqUDpsNIlpSEaQtOledK4tE20Otpl2jAdRzek+9OT6cX0H+i99AllJWVb5SjlHOUa5bPKUgbCMGD4M1IZpYyTjLuMj/M05rnP48/bNq9pXv+8KZX5Km4qfJUilWaVAZWPqkxVb9UU1Z2qbapP1DBqJmphatlq+9Uuq43Pp893ns+dXzT/5PyH6rC6iXq4+mr1w+o96pMamhq+GhkaVRqXNMY1GZpumsma5ZrnNMe0aFoLtQRa5VrntV4wlZnuzFRmJbOLOaGtru2nLdE+pN2rPa1jqLNYZ6NOs84TXZIuWzdBt1y3U3dCT0svWC9fr1HvoT5Rn62fpL9Hv1t/ysDQINpgi0GbwaihiqG/YZ5ho+FjI6qRq9Eqo1qjO8Y4Y7ZxivE+41smsImdSZJJjclNU9jU3lRgus+0zwxr5mgmNKs1u8eisNxZWaxG1qA5wzzIfKN5m/krCz2LWIudFt0WXyztLFMt6ywfWSlZBVhttOqw+sPaxJprXWN9x4Zq42Ozzqbd5rWtqS3fdr/tfTuaXbDdFrtOu8/2DvYi+yb7MQc9h3iHvQ732HR2KLuEfdUR6+jhuM7xjOMHJ3snsdNJp9+dWc4pzg3OowsMF/AX1C0YctFx4bgccpEuZC6MX3hwodRV25XjWuv6zE3Xjed2xG3E3dg92f24+ysPSw+RR4vHlKeT5xrPC16Il69XkVevt5L3Yu9q76c+Oj6JPo0+E752vqt9L/hh/QL9dvrd89fw5/rX+08EOASsCegKpARGBFYHPgsyCRIFdQTDwQHBu4IfL9JfJFzUFgJC/EN2hTwJNQxdFfpzGC4sNKwm7Hm4VXh+eHcELWJFREPEu0iPyNLIR4uNFksWd0bJR8VF1UdNRXtFl0VLl1gsWbPkRoxajCCmPRYfGxV7JHZyqffS3UuH4+ziCuPuLjNclrPs2nK15anLz66QX8FZcSoeGx8d3xD/iRPCqeVMrvRfuXflBNeTu4f7kufGK+eN8V34ZfyRBJeEsoTRRJfEXYljSa5JFUnjAk9BteB1sl/ygeSplJCUoykzqdGpzWmEtPi000IlYYqwK10zPSe9L8M0ozBDuspp1e5VE6JA0ZFMKHNZZruYjv5M9UiMJJslg1kLs2qy3mdHZZ/KUcwR5vTkmuRuyx3J88n7fjVmNXd1Z752/ob8wTXuaw6thdauXNu5Tnddwbrh9b7rj20gbUjZ8MtGy41lG99uit7UUaBRsL5gaLPv5sZCuUJR4b0tzlsObMVsFWzt3WazrWrblyJe0fViy+KK4k8l3JLr31l9V/ndzPaE7b2l9qX7d+B2CHfc3em681iZYlle2dCu4F2t5czyovK3u1fsvlZhW3FgD2mPZI+0MqiyvUqvakfVp+qk6oEaj5rmvep7t+2d2sfb17/fbX/TAY0DxQc+HhQcvH/I91BrrUFtxWHc4azDz+ui6rq/Z39ff0TtSPGRz0eFR6XHwo911TvU1zeoN5Q2wo2SxrHjccdv/eD1Q3sTq+lQM6O5+AQ4ITnx4sf4H++eDDzZeYp9qukn/Z/2ttBailqh1tzWibakNml7THvf6YDTnR3OHS0/m/989Iz2mZqzymdLz5HOFZybOZ93fvJCxoXxi4kXhzpXdD66tOTSna6wrt7LgZevXvG5cqnbvfv8VZerZ645XTt9nX297Yb9jdYeu56WX+x+aem172296XCz/ZbjrY6+BX3n+l37L972un3ljv+dGwOLBvruLr57/17cPel93v3RB6kPXj/Mejj9aP1j7OOiJwpPKp6qP6391fjXZqm99Oyg12DPs4hnj4a4Qy//lfmvT8MFz6nPK0a0RupHrUfPjPmM3Xqx9MXwy4yX0+OFvyn+tveV0auffnf7vWdiycTwa9HrmT9K3qi+OfrW9m3nZOjk03dp76anit6rvj/2gf2h+2P0x5Hp7E/4T5WfjT93fAn88ngmbWbm3/eE8/ul8iYiAAAJwUlEQVR4AeWb2Xbktg5F7ZvOzfj/f5p5cLApbfURilKpyu68BGvRAElM55AsD528vvwL8vb29vpImdfX17dH/J/1rb5eHmrsaqETwPfqTYF/KUI+lIAJ6BnY2VryOiNgt/aRZHwIAQ14AjyyAZx7zHcg2zz3NvsjiHgXAQfABXZPA3omAryqX95DBAR8mnVxtnYBOOCTgD43vT6CZV0b7XDdPeZKtbN8wD5LxEMEWKyq23xqgV7RAkgt4Cs647AHEc+QIICe8GZ+AL6D/V8FstZ19+t1j0D/XbnY67r7l8tyex4hoTDdfwIBnCIC0e5AmR8NY1OTp4MRMKD7INZ9NTmUcROYXCXi9AkEeAoj2Tx2B/vVutZ1+pmDfIokdMB/lQNrXZODdcTYZbZ8HURcIeGUgDUjxRAbRycgbADPBvndzxhz1fYGIMEL+M/ax3aQQ9scxtXWEAhhD31XDgmI0yeJxdAC6YDJxRo6R/cjnjwpNOtJCxANATlcSyLM441gPsCD4d4tmBIQ4BO44AFEA4JFf12DXOi0Z0RIoCQIPglI0H9UTuZoBvFo48vc7CSB9btP4YaAi+CJ68D/X2uA71pCjLlHgOAF/HvlxKYegzng8UPSZv4QCTcEkKGks2vTaIF42gB2fLPaaslIEsxljbwBM/AA/m2ti+7xtTSE2HH1S0OCNnW0y9zLjoA4fbwIdFDUE/DkBY0GMOPbsF3rJBBPvk6A7ztPHsCCp9cEb2+1PCRBYmd+3sL082BHwJrIxGgLSgD+efKCBDjju1U7d98Y4gWSDXJi/fQF/2vteYPsxx5r6+Z0AS8Z+RxcI2aTjYB2+jhYxKLeAGI8fQACejaSBP2J9QaQF6FJhjeAK++1T/AZl+QJmBzYamz8NuCzW7ARUI6IoNUdvCfptffUv69YB2Rg521IAqhJ3gRB094ACQA8cdSU/B7XwXcCJKFSDNnIcGEQcHL6NElRGsCXIRhOPwn4oeaMJEISjDFHBzIjQPDESEAnjbiz4UFuwPstILmis5omBW8D3oAE74lLQCcBkvA3llwzAngCfgDy/vEX/Mw/gRPrIL97AD+9BUlA+Q6RAHSSgC9NeZpHJPxYPnkLniGgg6cPBDACRfts0M7dJwYixLPdglrb5FO7/jp38LAKAZIA+CRAwGpvgU/AG0C8t4kaSIICCLdAvzx5T1WA+qqNY04N/KYk5DOgECLwZfZ5TgKGBMxugJ8DPgVJQEvAvfecoGbgIQkC8EvAfGACnPw+H3q17xmu2v78nUECWEQMQJtE8PgyJCFvQZIA6Bz4dQLITQ2kgxPA0T5A/U5BbmyfjD1Ckv0npptn0AmouCkJJJMIih2RABE5aJC5MdTLxmq6EcAJCx4fpJMjeD4kk1gJyHhyJHjy3UgSkM7aNktiCSBGQBKRH4w0ZnOevDobpAYiSAiwadbzzXvtAW6t7IGeGPZp3+JIPW7B+tn3lgRU/CYZYDKTW8wGbEiQrndtg+bbipUh2E6Kb95cs1r2Y3/mTwxZa2cTrCMb2qlNaAG0Rbu20b6eseQzPzU5kT4nHvDmOcrrfs+fNcyNRtTjJpBgJhmELQmpJUJNrmxEO2O0zU9tGhnNrFof41MnYOvpn9r8aupMJQnAOcXg1FnkzLbp7pO5ZvW6/1Ge7ue855/VkOyBNQkQfAZpp8bOQfGcH9nkzz3mCGtI6vSb2Uc1e56ROHI73zSJ/tMyIyCviHZq7Bx8guf8yIbo3GOO9LWcH9lHNc2XutvMN8knQLGUWXG/Xd3T/mjb/bjOZ3W6/1Ge7ud81nPHlPPxbWa3sE56Iguk9nu0mh9WbDh1xvR3TjlrpR925tCmhnXUPY65OdW1NBduAE6Ip2OQ2gI2gbaRrv2FJNf5JPdDizrk7U+v18h47Fne9MnezGX/qa3P2pB8Aq6hM8iEFrGwTfmLib+ZuU7uI/CdkKxh/EzPatmP/ZkrMSS2nZ0EZIC2yUxusWwum5r9JcfTJif1mB8RQH5zm5ecDtfQ+qHtyz7tWxypy72ue/2XaCXTz4B0NhGa5L1BG8s/YM5O3jzkmN2Knh+A5CbvbFg3iaA38lsLnVhqeit5A9jNABMJXJZh3AZt0l+EZuDJKUD3IcEPRPapYR3zA/yXyZCQToL9dSISU6XbiwTghGRTNm7zJLY5CaCZ/EXl3uleJUBiIeDnGBKSJNCLN+EIfLkMkQznL5/Wt9CBd/CejiTQIGAAn6B83xQwh7ESdUYSBDOOCJAMiIAEbwEx9CYB1PQGCxo9JP/J3BvgHjoDTCIICgGAOAdzh0TO4t5LwE9VBwLyFkDAlRuwgS//nSQB6YQNCAABnpNFSwCFPW214I1N0vDnc0LSiOn+nqCAOGHBevJHJNAXg5oOD4F+ctT0swwC2jNgNwNIJBgap0FBqxOMDfhc8PcvOY8SIAmevETkE5AwCaQ+PSeGmi6S15+VvAHMCVKw+y2AZcB6gtgJXrJoAl+a8/S9AX4GkAMhxjhACIg4P+y8Can9DMC/3wBzJgmJrUIW2Qg4uQUkAySg0DQp8A4+gUgAfyD1/V+5AYKBgCTB2yAp7EkWPXnzOvjaWqSfPqsbAasPKpkiGSIBy2z5muC9LfjTTIL3Z4T8juENIpOxADDWeElQe+oJXsIkQQLQ5HaUeSs7AtotIBCxwWW2kKFtcn0kQCCc0Oz0ZwT0WEkgh4DVnrzgPX30FPjs9AGxI4CFVQCUJ0xShDXApST4PMV+8tTK99/zU8N4CZSEmdbHGOId9KSk7dqmbwiIW9ADJYFgirvPOjaaZhieDPkd/qzA6R/dAOPJ7yCXYNMWONra9kI/jtP/bPaGgAr0NyVOSJAsIxRAct1CNkGz5KVZtMDVCb62h5DDeEkQoESgXUsfbGIZ9qI+BV/+h08gScCPhAqFFBu3AUDaJDYEABjbk5eAfAI9j6AE3QG7b90OvsotBzmMky/TG9D8aa7fhl4wAdCcgAGQwDt4SxGfOQQm0K7dn/VBTnJdEk/h0Hn9R0T38TcGLaDUHbBzY1OTV/CpE2C3JSp15sG+e/VHwCP/21wQkQQkGOwkIufdj3lKgk/bE+46fbCRoY++3S0u+6/8Rag3svdoswMS8JoBPFtrmce0g7o3J+hp8CP4UQLWoCRNO7XAcdfOfdYR1wTBmnaCd90156kvXXkCUh6+AS1YACxrX9WZKu0kgPV786eAW/BdBEQSQbN0xe5+zAWKjeR8aj/y1peUt18/hADTxueDS0nG2Zp76ATr+m7tI4BviZ/5DDD4TE/I0H1GinvoHVg3PhK0OUexL0VAFlkL3QO+C/lSgHdFasIT+AcDVfh0vBU3zQAAAABJRU5ErkJggg==\";\n static sound = \"modules/dice-so-nice/sfx/sounds/doublespiral.mp3\";\n\n /**@override init */\n static async init() {\n let map = await this.loadAsset(DiceSFXManager.TextureLoader, PlayAnimationParticleSpiral.dot);\n let material = new THREE.SpriteMaterial({\n map: map,\n color: 0xff0000,\n blending: THREE.CustomBlending,\n blendSrc: THREE.SrcAlphaFactor,\n blendDst: THREE.OneFactor,\n blendEquation: THREE.AddEquation,\n fog: true\n });\n PlayAnimationParticleSpiral.sprite = new THREE.Sprite(material);\n game.audio.pending.push(function(){\n AudioHelper.preloadSound(PlayAnimationParticleSpiral.sound);\n }.bind(this));\n }\n\n /**@override play */\n async play() {\n this.proton = new Proton();\n this.R = 70;\n this.tha = 0;\n this.emitter1 = this.createEmitter(this.R, this.R, '#4F1500', '#0029FF');\n this.emitter2 = this.createEmitter(-this.R, -this.R, '#004CFE', '#6600FF');\n this.proton.addEmitter(this.emitter1);\n this.proton.addEmitter(this.emitter2);\n this.proton.addRender(new Proton.SpriteRender(this.box.scene));\n\n AudioHelper.play({\n src: PlayAnimationParticleSpiral.sound,\n volume: this.volume\n\t\t}, false);\n this.renderReady = true;\n //Proton.Debug.drawZone(proton,scene,zone2);\n //Proton.Debug.drawEmitter(this.proton,this.box.scene,this.emitter);\n }\n\n createEmitter(x, y, color1, color2) {\n var emitter = new Proton.Emitter();\n emitter.rate = new Proton.Rate(new Proton.Span(5, 7), new Proton.Span(.01, .02));\n emitter.addInitialize(new Proton.Mass(1));\n emitter.addInitialize(new Proton.Life(1));\n emitter.addInitialize(new Proton.Body(PlayAnimationParticleSpiral.sprite));\n emitter.addInitialize(new Proton.Radius(30));\n emitter.addInitialize(new Proton.V(200, new Proton.Vector3D(0, 0, -1), 0));\n\n\n emitter.addBehaviour(new Proton.Alpha(1, 0));\n emitter.addBehaviour(new Proton.Color(color1, color2));\n emitter.addBehaviour(new Proton.Scale(1.5, 0.1));\n //emitter.addBehaviour(new Proton.CrossZone(new Proton.ScreenZone(this.box.camera, this.box.renderer), 'dead'));\n\n emitter.addBehaviour(new Proton.Force(0, 0, 17));\n emitter.p.x = this.dicemesh.parent.position.x + x;\n emitter.p.y = this.dicemesh.parent.position.y + y;\n emitter.p.z = 50;\n emitter.emit(0.7,true);\n return emitter;\n }\n\n animateEmitter() {\n this.tha += .2;\n this.emitter1.p.x = this.dicemesh.parent.position.x + this.R * Math.cos(this.tha);\n this.emitter1.p.y = this.dicemesh.parent.position.y + this.R * Math.sin(this.tha);\n\n this.emitter2.p.x = this.dicemesh.parent.position.x - this.R * Math.cos(this.tha);\n this.emitter2.p.y = this.dicemesh.parent.position.y - this.R * Math.sin(this.tha);\n }\n\n render() {\n if(!this.renderReady)\n return;\n this.animateEmitter();\n this.proton.update();\n if(this.proton.emitters.length == 0){\n this.destroy();\n }\n }\n\n destroy(){\n if(this.emitter1){\n this.emitter1.stopEmit();\n this.emitter1.removeAllParticles();\n } \n \n if(this.emitter2){\n this.emitter2.stopEmit();\n this.emitter2.removeAllParticles();\n }\n this.proton.update();\n this.proton.destroy();\n this.destroyed = true;\n }\n}","import { DiceSFX } from '../DiceSFX.js';\nimport * as THREE from 'three';\nimport { Proton } from '../libs/three.proton.js';\nimport { DiceSFXManager } from './../DiceSFXManager';\n\nexport class PlayAnimationParticleSparkles extends DiceSFX {\n static id = \"PlayAnimationParticleSparkles\";\n static specialEffectName = \"DICESONICE.PlayAnimationParticleSparkles\";\n static sprite = null;\n static sound = \"modules/dice-so-nice/sfx/sounds/sparkles.mp3\";\n /**@override init */\n static async init() {\n let map = await this.loadAsset(DiceSFXManager.TextureLoader, \"modules/dice-so-nice/sfx/textures/glow_point_red_gold.webp\");\n let material = new THREE.SpriteMaterial({\n map: map,\n fog: true,\n blending:THREE.AdditiveBlending,\n depthWrite:false,\n depthTest:true\n });\n PlayAnimationParticleSparkles.sprite = new THREE.Sprite(material);\n game.audio.pending.push(function(){\n AudioHelper.preloadSound(PlayAnimationParticleSparkles.sound);\n }.bind(this));\n }\n\n /**@override play */\n async play() {\n this.proton = new Proton();\n this.emitter = new Proton.Emitter();\n this.emitter.rate = new Proton.Rate(new Proton.Span(350, 450), 0.3);\n this.emitter.addInitialize(new Proton.Mass(1,0.3));\n this.emitter.addInitialize(new Proton.Life(1,3));\n this.emitter.addInitialize(new Proton.Body(PlayAnimationParticleSparkles.sprite));\n this.emitter.addInitialize(new Proton.Radius(100,60));\n this.emitter.addInitialize(new Proton.Position(new Proton.SphereZone(0,0,0,30)));\n this.emitter.addInitialize(new Proton.Velocity(200, new Proton.Vector3D(0, 0, 0), 0));\n\n this.emitter.addBehaviour(new Proton.RandomDrift(10,10,5,0.1,Infinity,Proton.easeOutQuart));\n this.emitter.addBehaviour(new Proton.Alpha(1, 0));\n this.emitter.addBehaviour(new Proton.Scale(1, 0.5));\n\n this.emitter.addBehaviour(new Proton.Force(0, 0, 1));\n\n let parent = null;\n if(this.dicemesh.isMesh){\n parent = this.dicemesh.parent;\n } else {\n parent = this.dicemesh.parent.clone();\n delete parent.children[0].geometry;\n }\n\n this.emitter.p.x = parent.position.x;\n this.emitter.p.y = parent.position.y;\n\n let boundingBox = new THREE.Vector3();\n new THREE.Box3().setFromObject(parent).getSize(boundingBox);\n\n this.emitter.p.z = boundingBox.z/2;\n this.emitter.emit('once',true);\n this.proton.addEmitter(this.emitter);\n this.proton.addRender(new Proton.SpriteRender(this.box.scene));\n\n AudioHelper.play({\n src: PlayAnimationParticleSparkles.sound,\n volume: this.volume\n\t\t}, false);\n this.renderReady = true;\n }\n\n render() {\n if(!this.renderReady)\n return;\n this.proton.update();\n if(this.proton.emitters.length == 0){\n this.destroy();\n }\n }\n\n destroy(){\n if(this.emitter){\n this.emitter.stopEmit();\n this.emitter.removeAllParticles();\n }\n this.proton.update();\n this.proton.destroy();\n this.destroyed = true;\n }\n}","import { DiceSFX } from '../DiceSFX.js';\nimport * as THREE from 'three';\nimport { Proton } from '../libs/three.proton.js';\nimport { DiceSFXManager } from './../DiceSFXManager';\n\nexport class PlayAnimationParticleVortex extends DiceSFX {\n static id = \"PlayAnimationParticleVortex\";\n static specialEffectName = \"DICESONICE.PlayAnimationParticleVortex\";\n static sprite = null;\n static sound = \"modules/dice-so-nice/sfx/sounds/vortex.mp3\";\n /**@override init */\n static async init() {\n let map = await this.loadAsset(DiceSFXManager.TextureLoader, \"modules/dice-so-nice/sfx/textures/magic01.webp\");\n let material = new THREE.MeshBasicMaterial({\n map: map,\n blending:THREE.NormalBlending,\n depthWrite:false,\n depthTest:true,\n transparent:true\n });\n let geometry = new THREE.PlaneGeometry(140,140);\n PlayAnimationParticleVortex.sprite = new THREE.Mesh(geometry,material);\n \n game.audio.pending.push(function(){\n AudioHelper.preloadSound(PlayAnimationParticleVortex.sound);\n }.bind(this));\n }\n\n /**@override play */\n async play() {\n this.proton = new Proton();\n this.emitter = new Proton.Emitter();\n this.emitter.rate = new Proton.Rate(new Proton.Span(6, 8), new Proton.Span(.1, .25));\n this.emitter.addInitialize(new Proton.Mass(1));\n this.emitter.addInitialize(new Proton.Life(0.8,2.4));\n this.emitter.addInitialize(new Proton.Body(PlayAnimationParticleVortex.sprite));\n this.emitter.addInitialize(new Proton.Velocity(50, new Proton.Vector3D(0,0,1), 0));\n let scale = this.box.dicefactory.baseScale/100;\n switch (this.dicemesh.shape) {\n case \"d2\":\n scale *= 1.3;\n break;\n case \"d4\":\n scale *= 1.2;\n break;\n case \"d6\":\n break;\n case \"d8\":\n scale *= 1.2;\n break;\n case \"d10\":\n break;\n case \"d12\":\n scale *= 1.3;\n break;\n case \"d20\":\n scale *= 1.4;\n break;\n }\n this.emitter.addInitialize(new Proton.Radius(scale));\n\n this.emitter.addBehaviour(new Proton.Color(['#1f0e26','#462634','#290088'],'#060206'));\n this.emitter.addBehaviour(new Proton.Alpha(0.7, 0, Infinity, Proton.easeInQuart));\n this.emitter.addBehaviour(new Proton.Scale(0.7, 1.3, Infinity, Proton.easeInSine));\n this.emitter.addBehaviour(new Proton.Rotate(0,0,-3));\n\n this.emitter.p.x = this.dicemesh.parent.position.x;\n this.emitter.p.y = this.dicemesh.parent.position.y;\n\n this.emitter.p.z = -5;\n this.emitter.emit(1.25,true);\n\n this.proton.addEmitter(this.emitter);\n this.proton.addRender(new Proton.MeshRender(this.box.scene));\n\n AudioHelper.play({\n src: PlayAnimationParticleVortex.sound,\n volume: this.volume\n\t\t}, false);\n this.renderReady = true;\n }\n\n render() {\n if(!this.renderReady)\n return;\n this.proton.update();\n if(this.proton.emitters.length == 0){\n this.destroy();\n }\n }\n\n destroy(){\n if(this.emitter){\n this.emitter.stopEmit();\n this.emitter.removeAllParticles();\n }\n this.proton.update();\n this.proton.destroy();\n this.destroyed = true;\n }\n}","import { DiceSFX } from '../DiceSFX.js';\nimport * as THREE from 'three';\nimport { ShaderUtils } from './../ShaderUtils';\n\nexport class PlayAnimationBright extends DiceSFX {\n static id = \"PlayAnimationBright\";\n static specialEffectName = \"DICESONICE.PlayAnimationBright\";\n static brightColor = null;\n static duration = 0.6;\n static sound = \"modules/dice-so-nice/sfx/sounds/bright.mp3\";\n /**@override init */\n static async init() {\n PlayAnimationBright.brightColor = new THREE.Color(0.3,0.3,0.3);\n this.glowingMesh=null;\n game.audio.pending.push(function(){\n AudioHelper.preloadSound(PlayAnimationBright.sound);\n }.bind(this));\n }\n\n /**@override play */\n async play() {\n \n if(!this.dicemesh.material && this.dicemesh.userData.glow){\n //We check if there's a glow target specified\n this.dicemesh.traverse(object => {\n if (object.userData && object.userData.name && object.userData.name === this.dicemesh.userData.glow) this.glowingMesh=object;\n });\n } else if(this.dicemesh.material){\n this.glowingMesh=this.dicemesh;\n } else {\n return false;\n }\n if(!this.glowingMesh.material.emissiveMap)\n return false;\n this.clock = new THREE.Clock();\n this.baseColor = this.glowingMesh.material.emissive.clone();\n this.baseMaterial = this.glowingMesh.material;\n this.glowingMesh.material = this.baseMaterial.clone();\n this.glowingMesh.material.onBeforeCompile = ShaderUtils.applyDiceSoNiceShader;\n AudioHelper.play({\n src: PlayAnimationBright.sound,\n volume: this.volume\n\t\t}, false);\n this.renderReady = true;\n }\n\n render() {\n if(!this.renderReady)\n return;\n let x = 1-((PlayAnimationBright.duration - this.clock.getElapsedTime())/PlayAnimationBright.duration);\n if(x>1){\n this.destroy();\n } else {\n let val = (Math.sin(2 * Math.PI * (x - 1/4)) + 1) / 2;\n this.glowingMesh.material.emissive.copy(this.baseColor);\n this.glowingMesh.material.emissive.lerp(PlayAnimationBright.brightColor, val);\n }\n }\n\n destroy(){\n let sfxMaterial = this.glowingMesh.material;\n this.glowingMesh.material = this.baseMaterial;\n sfxMaterial.dispose();\n this.destroyed = true;\n }\n}","import { DiceSFX } from '../DiceSFX.js';\nimport * as THREE from 'three';\nimport { ShaderUtils } from './../ShaderUtils';\n\nexport class PlayAnimationDark extends DiceSFX {\n static id = \"PlayAnimationDark\";\n static specialEffectName = \"DICESONICE.PlayAnimationDark\";\n static darkColor = null;\n static duration = 1.5;\n static sound = \"modules/dice-so-nice/sfx/sounds/darkness.mp3\";\n /**@override init */\n static async init() {\n PlayAnimationDark.darkColor = new THREE.Color(0.1,0.1,0.1);\n game.audio.pending.push(function(){\n AudioHelper.preloadSound(PlayAnimationDark.sound);\n }.bind(this));\n }\n\n /**@override play */\n async play() {\n if(!this.dicemesh.material && this.dicemesh.userData.glow){\n //We check if there's a glow target specified\n this.dicemesh.traverse(object => {\n if (object.userData && object.userData.name && object.userData.name === this.dicemesh.userData.glow) this.glowingMesh=object;\n });\n } else if(this.dicemesh.material){\n this.glowingMesh=this.dicemesh;\n } else {\n return false;\n }\n this.clock = new THREE.Clock();\n this.baseColor = this.glowingMesh.material.color.clone();\n this.baseMaterial = this.glowingMesh.material;\n this.glowingMesh.material = this.baseMaterial.clone();\n this.glowingMesh.material.onBeforeCompile = ShaderUtils.applyDiceSoNiceShader;\n AudioHelper.play({\n\t\t\tsrc: PlayAnimationDark.sound,\n volume: this.volume\n\t\t}, false);\n this.renderReady = true;\n }\n\n render() {\n if(!this.renderReady)\n return;\n let x = 1-((PlayAnimationDark.duration - this.clock.getElapsedTime())/PlayAnimationDark.duration);\n if(x>1){\n this.destroy();\n } else {\n let val = 0.05172144 + 9.269017*x - 26.55545*x**2 + 26.19969*x**3 - 8.977907*x**4;\n val = Math.min(Math.max(val, 0), 1);\n this.glowingMesh.material.color.copy(this.baseColor);\n this.glowingMesh.material.color.lerp(PlayAnimationDark.darkColor, val);\n }\n }\n\n destroy(){\n let sfxMaterial = this.glowingMesh.material;\n this.glowingMesh.material = this.baseMaterial;\n sfxMaterial.dispose();\n this.destroyed = true;\n }\n}","import { DiceSFX } from '../DiceSFX.js';\nimport * as THREE from 'three';\nimport { DiceSFXManager } from './../DiceSFXManager';\nimport { ShaderUtils } from './../ShaderUtils';\n\n\nexport class PlayAnimationThormund extends DiceSFX {\n static id = \"PlayAnimationThormund\";\n static specialEffectName = \"DICESONICE.PlayAnimationThormund\";\n static file = \"modules/dice-so-nice/sfx/models/thormund.glb\";\n static sound = \"modules/dice-so-nice/sfx/sounds/thormund.mp3\";\n static model = null;\n static curve = null;\n static duration1 = 2.5;\n static duration2 = 2.5;\n static up = new THREE.Vector3(0,0,1);\n /**@override init */\n static async init() {\n game.audio.pending.push(function(){\n AudioHelper.preloadSound(PlayAnimationThormund.sound);\n }.bind(this));\n\n let gltf = await this.loadAsset(DiceSFXManager.GLTFLoader, PlayAnimationThormund.file);\n gltf.scene.traverse(function (node) {\n if (node.isMesh) {\n node.castShadow = true; \n node.material.onBeforeCompile = ShaderUtils.applyDiceSoNiceShader;\n }\n });\n PlayAnimationThormund.model = gltf.scene.children[0];\n }\n\n /**@override play */\n async play() {\n this.step = 1;\n this.clock = new THREE.Clock();\n this.thormund = PlayAnimationThormund.model.clone();\n let scale = this.box.dicefactory.baseScale/100;\n\n let boundingBox = new THREE.Vector3();\n let parent = null;\n if(this.dicemesh.isMesh){\n parent = this.dicemesh.parent;\n } else {\n parent = this.dicemesh.parent.clone();\n delete parent.children[0].geometry;\n }\n new THREE.Box3().setFromObject(parent).getSize(boundingBox);\n \n\t\tthis.thormund.scale.set(scale,scale,scale);\n this.thormund.rotation.x = Math.PI/2;\n this.thormund.position.x = parent.position.x;\n this.thormund.position.y = parent.position.y;\n this.thormund.position.z = parent.position.z + (boundingBox.z/2);\n\n this.curve = new THREE.CatmullRomCurve3( [\n new THREE.Vector3( this.thormund.position.x, this.thormund.position.y,-50),\n new THREE.Vector3( this.thormund.position.x +0, this.thormund.position.y -100, this.thormund.position.z +0 ),\n new THREE.Vector3( this.thormund.position.x +100, this.thormund.position.y -30, this.thormund.position.z +0 ),\n new THREE.Vector3( this.thormund.position.x +100, this.thormund.position.y +30, this.thormund.position.z +0 ),\n new THREE.Vector3( this.thormund.position.x +30, this.thormund.position.y +100, this.thormund.position.z +0 ),\n new THREE.Vector3( this.thormund.position.x -30, this.thormund.position.y +100, this.thormund.position.z +0 ),\n new THREE.Vector3( this.thormund.position.x -100, this.thormund.position.y +30, this.thormund.position.z +80 ),\n new THREE.Vector3( this.thormund.position.x /2, this.thormund.position.y /2, this.thormund.position.z +100 )\n ],false,\"chordal\");\n\n this.curve2 = new THREE.CatmullRomCurve3([\n new THREE.Vector3( this.thormund.position.x /2, this.thormund.position.y /2, this.thormund.position.z +100 ),\n new THREE.Vector3( 100, 50, this.box.camera.position.z/4 ),\n new THREE.Vector3( -100, -50, this.box.camera.position.z/4*2 ),\n new THREE.Vector3( 0, -50, this.box.camera.position.z/4*3 ),\n new THREE.Vector3( 0, 0, this.box.camera.position.z )\n ],false,\"chordal\");\n\n this.axis = new THREE.Vector3();\n this.box.scene.add(this.thormund);\n AudioHelper.play({\n src: PlayAnimationThormund.sound,\n volume: this.volume\n\t\t}, false);\n this.renderReady = true;\n }\n\n render() {\n if(!this.renderReady)\n return;\n let duration = this.step == 1? PlayAnimationThormund.duration1:PlayAnimationThormund.duration2;\n let x = 1-((duration - this.clock.getElapsedTime())/duration);\n if(x>1){\n if(this.step == 1){\n this.step++;\n x = 0;\n this.clock.start();\n this.render();\n }\n else\n this.destroy();\n } else {\n let curve = this.step==1?this.curve:this.curve2;\n let p = curve.getPointAt(x);\n let t = curve.getTangentAt(x).normalize();\n this.axis.crossVectors(PlayAnimationThormund.up, t).normalize();\n let radians = Math.acos(PlayAnimationThormund.up.dot(t));\n\n this.thormund.position.copy(p);\n this.thormund.quaternion.setFromAxisAngle(this.axis,radians);\n }\n }\n\n destroy(){\n this.box.scene.remove(this.thormund);\n this.destroyed = true;\n }\n}","import { DiceSFX } from '../DiceSFX.js';\nimport * as THREE from 'three';\nimport { DiceSFXManager } from './../DiceSFXManager';\n\nexport class PlayAnimationImpact extends DiceSFX {\n static id = \"PlayAnimationImpact\";\n static specialEffectName = \"DICESONICE.PlayAnimationImpact\";\n static sound = \"modules/dice-so-nice/sfx/sounds/hit_glass.mp3\";\n static planeImpact = null;\n static duration = 0.1;\n /**@override constructor */\n constructor(box, dicemesh){\n super(box, dicemesh);\n this.enableGC = true;\n }\n /**@override init */\n static async init() {\n game.audio.pending.push(function () {\n AudioHelper.preloadSound(PlayAnimationImpact.sound);\n }.bind(this));\n \n let data = await this.loadAsset(DiceSFXManager.TextureLoader, \"modules/dice-so-nice/sfx/textures/glassimpact_color.webp\");\n const geometry = new THREE.PlaneGeometry(730, 730);\n const material = new THREE.MeshStandardMaterial({\n map: data,\n transparent: true,\n opacity: 2\n });\n PlayAnimationImpact.planeImpact = new THREE.Mesh(geometry, material);\n }\n\n /**@override play */\n async play() {\n this.clock = new THREE.Clock();\n this.plane = PlayAnimationImpact.planeImpact.clone();\n this.plane.receiveShadow = this.box.shadows;\n\n let scale = this.box.dicefactory.baseScale / 100;\n switch (this.dicemesh.shape) {\n case \"d2\":\n scale *= 1.3;\n break;\n case \"d4\":\n scale *= 1.1;\n break;\n case \"d6\":\n break;\n case \"d8\":\n scale *= 1.1;\n break;\n case \"d10\":\n break;\n case \"d12\":\n scale *= 1.2;\n break;\n case \"d20\":\n scale *= 1.3;\n break;\n }\n this.plane.scale.set(scale, scale, scale);\n\n this.plane.position.x = this.dicemesh.parent.position.x;\n this.plane.position.y = this.dicemesh.parent.position.y;\n this.plane.rotation.z = Math.random() * Math.PI * 2;\n this.box.scene.add(this.plane);\n AudioHelper.play({\n src: PlayAnimationImpact.sound,\n volume: this.volume\n }, false);\n this.dicemesh.position.z -= 1;\n\n }\n\n destroy() {\n this.box.scene.remove(this.plane);\n this.destroyed = true;\n }\n}","import * as THREE from 'three';\nimport { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';\n\nimport { PlaySoundEpicFail } from './sfx/PlaySoundEpicFail.js';\nimport { PlaySoundEpicWin } from './sfx/PlaySoundEpicWin.js';\nimport { PlaySoundCustom } from './sfx/PlaySoundCustom.js';\nimport { PlayConfettiStrength1 } from './sfx/PlayConfettiStrength1.js';\nimport { PlayConfettiStrength2 } from './sfx/PlayConfettiStrength2.js';\nimport { PlayConfettiStrength3 } from './sfx/PlayConfettiStrength3.js';\nimport { PlayAnimationParticleSpiral } from './sfx/PlayAnimationParticleSpiral.js';\nimport { PlayAnimationParticleSparkles } from './sfx/PlayAnimationParticleSparkles.js';\nimport { PlayAnimationParticleVortex } from './sfx/PlayAnimationParticleVortex.js';\nimport { PlayAnimationBright } from './sfx/PlayAnimationBright.js';\nimport { PlayAnimationDark } from './sfx/PlayAnimationDark.js';\nimport { PlayAnimationThormund } from './sfx/PlayAnimationThormund.js';\nimport { PlayAnimationImpact } from './sfx/PlayAnimationImpact.js';\nimport { PlayMacro } from './sfx/PlayMacro.js';\n\nexport const DiceSFXManager = {\n SFX_MODE_CLASS : {\n \"PlayAnimationBright\": PlayAnimationBright,\n \"PlayAnimationDark\": PlayAnimationDark,\n \"PlayAnimationImpact\": PlayAnimationImpact,\n \"PlayConfettiStrength1\": PlayConfettiStrength1,\n \"PlayConfettiStrength2\": PlayConfettiStrength2,\n \"PlayConfettiStrength3\": PlayConfettiStrength3,\n \"PlayAnimationThormund\": PlayAnimationThormund,\n \"PlayAnimationParticleSpiral\": PlayAnimationParticleSpiral,\n \"PlayAnimationParticleSparkles\": PlayAnimationParticleSparkles,\n \"PlayAnimationParticleVortex\": PlayAnimationParticleVortex,\n \"PlaySoundEpicWin\": PlaySoundEpicWin,\n \"PlaySoundEpicFail\": PlaySoundEpicFail,\n \"PlaySoundCustom\": PlaySoundCustom,\n \"PlayMacro\": PlayMacro\n },\n SFX_MODE_LIST : null,\n SFX_CLASS : {},\n EXTRA_TRIGGER_TYPE : [],\n EXTRA_TRIGGER_RESULTS : {},\n renderQueue : [],\n garbageCollector : [],\n GLTFLoader : null,\n TextureLoader: null,\n init : function(){\n if(!DiceSFXManager.SFX_MODE_LIST){\n DiceSFXManager.SFX_MODE_LIST = {};\n Object.values(DiceSFXManager.SFX_MODE_CLASS).forEach((sfx)=>{\n if(sfx.id.startsWith(\"PlayConfettiStrength\") && (!game.modules.get(\"confetti\") || !game.modules.get(\"confetti\").active))\n return;\n DiceSFXManager.SFX_MODE_LIST[sfx.id] = sfx.specialEffectName;\n });\n }\n\n DiceSFXManager.GLTFLoader = new GLTFLoader();\n DiceSFXManager.TextureLoader = new THREE.TextureLoader();\n\n let sfxUniqueList = [];\n game.users.forEach((user) => {\n let sfxList = user.getFlag(\"dice-so-nice\", \"sfxList\");\n if(sfxList){\n Object.values(sfxList).forEach((line) => {\n if(line.specialEffect && !Array.isArray(line.specialEffect)){\n sfxUniqueList.push(line.specialEffect);\n } \n });\n }\n });\n //remove duplicate\n sfxUniqueList = sfxUniqueList.filter((v, i, a) => a.indexOf(v) === i);\n\n //for each possible sfx, initialize\n sfxUniqueList.forEach((sfxClassName) => {\n if(sfxClassName.startsWith(\"PlayConfettiStrength\") && (!game.modules.get(\"confetti\") || !game.modules.get(\"confetti\").active))\n return;\n DiceSFXManager.addSFXMode(DiceSFXManager.SFX_MODE_CLASS[sfxClassName]);\n });\n },\n addSFXMode : async function(sfx){\n if(sfx.id && sfx.specialEffectName && !sfx.initialized){\n DiceSFXManager.SFX_CLASS[sfx.id] = sfx;\n sfx.initialized = true;\n await sfx.init();\n }\n },\n playSFX : async function(sfx, box, dicemesh){\n let id = sfx.specialEffect;\n return new Promise(async (resolve)=>{\n if(!DiceSFXManager.SFX_CLASS[id]){\n if(DiceSFXManager.SFX_MODE_CLASS[id]){\n await DiceSFXManager.addSFXMode(DiceSFXManager.SFX_MODE_CLASS[id]);\n } else {\n return;\n }\n }\n \n let sfxInstance = new DiceSFXManager.SFX_CLASS[id](box, dicemesh);\n\n sfxInstance.play(sfx.options).then(result => {\n if(result !== false){\n if(typeof sfxInstance.render === 'function')\n DiceSFXManager.renderQueue.push(sfxInstance);\n if(sfxInstance.enableGC)\n DiceSFXManager.garbageCollector.push(sfxInstance);\n }\n resolve();\n });\n });\n },\n renderSFX : function(){\n let queue = [...DiceSFXManager.renderQueue];\n for(let i =0;i\n \n
\n \n \n
\n `);\n\n dialogContent.data.path = sfxLine.options ? sfxLine.options.path:\"\";\n return dialogContent;\n }\n}","import { DiceSFX } from '../DiceSFX.js';\n\n/**\n * Options needed: macro ID\n */\nexport class PlayMacro extends DiceSFX {\n static id = \"PlayMacro\";\n static specialEffectName = \"DICESONICE.PlayMacro\";\n\n /**@override play */\n async play(options){\n let macro = game.macros.get(options.macroId);\n if(macro)\n macro.execute();\n }\n\n static getDialogContent(sfxLine,id){\n let dialogContent = super.getDialogContent(sfxLine,id);\n\n dialogContent.content = dialogContent.content.concat(`
\n \n
\n \n
\n
`);\n\n let permissionLevel = CONST.DOCUMENT_PERMISSION_LEVELS ? CONST.DOCUMENT_PERMISSION_LEVELS.OBSERVER : CONST.ENTITY_PERMISSIONS.OBSERVER;\n \n dialogContent.data.macroList = game.macros.filter(macro => macro.testUserPermission(game.user, permissionLevel)).map(macro => {return {id:macro.id,name:macro.name}});\n \n dialogContent.data.macroList.sort((a, b) => a.name > b.name && 1 || -1);\n dialogContent.data.macroId = sfxLine.options?sfxLine.options.macroId:null;\n return dialogContent;\n }\n}","import {\n\tDataTextureLoader,\n\tDataUtils,\n\tFloatType,\n\tHalfFloatType,\n\tLinearEncoding,\n\tLinearFilter\n} from 'three';\n\n// https://github.com/mrdoob/three.js/issues/5552\n// http://en.wikipedia.org/wiki/RGBE_image_format\n\nclass RGBELoader extends DataTextureLoader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\tthis.type = HalfFloatType;\n\n\t}\n\n\t// adapted from http://www.graphics.cornell.edu/~bjw/rgbe.html\n\n\tparse( buffer ) {\n\n\t\tconst\n\t\t\t/* return codes for rgbe routines */\n\t\t\t//RGBE_RETURN_SUCCESS = 0,\n\t\t\tRGBE_RETURN_FAILURE = - 1,\n\n\t\t\t/* default error routine. change this to change error handling */\n\t\t\trgbe_read_error = 1,\n\t\t\trgbe_write_error = 2,\n\t\t\trgbe_format_error = 3,\n\t\t\trgbe_memory_error = 4,\n\t\t\trgbe_error = function ( rgbe_error_code, msg ) {\n\n\t\t\t\tswitch ( rgbe_error_code ) {\n\n\t\t\t\t\tcase rgbe_read_error: console.error( 'THREE.RGBELoader Read Error: ' + ( msg || '' ) );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase rgbe_write_error: console.error( 'THREE.RGBELoader Write Error: ' + ( msg || '' ) );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase rgbe_format_error: console.error( 'THREE.RGBELoader Bad File Format: ' + ( msg || '' ) );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\tcase rgbe_memory_error: console.error( 'THREE.RGBELoader: Error: ' + ( msg || '' ) );\n\n\t\t\t\t}\n\n\t\t\t\treturn RGBE_RETURN_FAILURE;\n\n\t\t\t},\n\n\t\t\t/* offsets to red, green, and blue components in a data (float) pixel */\n\t\t\t//RGBE_DATA_RED = 0,\n\t\t\t//RGBE_DATA_GREEN = 1,\n\t\t\t//RGBE_DATA_BLUE = 2,\n\n\t\t\t/* number of floats per pixel, use 4 since stored in rgba image format */\n\t\t\t//RGBE_DATA_SIZE = 4,\n\n\t\t\t/* flags indicating which fields in an rgbe_header_info are valid */\n\t\t\tRGBE_VALID_PROGRAMTYPE = 1,\n\t\t\tRGBE_VALID_FORMAT = 2,\n\t\t\tRGBE_VALID_DIMENSIONS = 4,\n\n\t\t\tNEWLINE = '\\n',\n\n\t\t\tfgets = function ( buffer, lineLimit, consume ) {\n\n\t\t\t\tconst chunkSize = 128;\n\n\t\t\t\tlineLimit = ! lineLimit ? 1024 : lineLimit;\n\t\t\t\tlet p = buffer.pos,\n\t\t\t\t\ti = - 1, len = 0, s = '',\n\t\t\t\t\tchunk = String.fromCharCode.apply( null, new Uint16Array( buffer.subarray( p, p + chunkSize ) ) );\n\n\t\t\t\twhile ( ( 0 > ( i = chunk.indexOf( NEWLINE ) ) ) && ( len < lineLimit ) && ( p < buffer.byteLength ) ) {\n\n\t\t\t\t\ts += chunk; len += chunk.length;\n\t\t\t\t\tp += chunkSize;\n\t\t\t\t\tchunk += String.fromCharCode.apply( null, new Uint16Array( buffer.subarray( p, p + chunkSize ) ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( - 1 < i ) {\n\n\t\t\t\t\t/*for (i=l-1; i>=0; i--) {\n\t\t\t\t\t\tbyteCode = m.charCodeAt(i);\n\t\t\t\t\t\tif (byteCode > 0x7f && byteCode <= 0x7ff) byteLen++;\n\t\t\t\t\t\telse if (byteCode > 0x7ff && byteCode <= 0xffff) byteLen += 2;\n\t\t\t\t\t\tif (byteCode >= 0xDC00 && byteCode <= 0xDFFF) i--; //trail surrogate\n\t\t\t\t\t}*/\n\t\t\t\t\tif ( false !== consume ) buffer.pos += len + i + 1;\n\t\t\t\t\treturn s + chunk.slice( 0, i );\n\n\t\t\t\t}\n\n\t\t\t\treturn false;\n\n\t\t\t},\n\n\t\t\t/* minimal header reading. modify if you want to parse more information */\n\t\t\tRGBE_ReadHeader = function ( buffer ) {\n\n\n\t\t\t\t// regexes to parse header info fields\n\t\t\t\tconst magic_token_re = /^#\\?(\\S+)/,\n\t\t\t\t\tgamma_re = /^\\s*GAMMA\\s*=\\s*(\\d+(\\.\\d+)?)\\s*$/,\n\t\t\t\t\texposure_re = /^\\s*EXPOSURE\\s*=\\s*(\\d+(\\.\\d+)?)\\s*$/,\n\t\t\t\t\tformat_re = /^\\s*FORMAT=(\\S+)\\s*$/,\n\t\t\t\t\tdimensions_re = /^\\s*\\-Y\\s+(\\d+)\\s+\\+X\\s+(\\d+)\\s*$/,\n\n\t\t\t\t\t// RGBE format header struct\n\t\t\t\t\theader = {\n\n\t\t\t\t\t\tvalid: 0, /* indicate which fields are valid */\n\n\t\t\t\t\t\tstring: '', /* the actual header string */\n\n\t\t\t\t\t\tcomments: '', /* comments found in header */\n\n\t\t\t\t\t\tprogramtype: 'RGBE', /* listed at beginning of file to identify it after \"#?\". defaults to \"RGBE\" */\n\n\t\t\t\t\t\tformat: '', /* RGBE format, default 32-bit_rle_rgbe */\n\n\t\t\t\t\t\tgamma: 1.0, /* image has already been gamma corrected with given gamma. defaults to 1.0 (no correction) */\n\n\t\t\t\t\t\texposure: 1.0, /* a value of 1.0 in an image corresponds to watts/steradian/m^2. defaults to 1.0 */\n\n\t\t\t\t\t\twidth: 0, height: 0 /* image dimensions, width/height */\n\n\t\t\t\t\t};\n\n\t\t\t\tlet line, match;\n\n\t\t\t\tif ( buffer.pos >= buffer.byteLength || ! ( line = fgets( buffer ) ) ) {\n\n\t\t\t\t\treturn rgbe_error( rgbe_read_error, 'no header found' );\n\n\t\t\t\t}\n\n\t\t\t\t/* if you want to require the magic token then uncomment the next line */\n\t\t\t\tif ( ! ( match = line.match( magic_token_re ) ) ) {\n\n\t\t\t\t\treturn rgbe_error( rgbe_format_error, 'bad initial token' );\n\n\t\t\t\t}\n\n\t\t\t\theader.valid |= RGBE_VALID_PROGRAMTYPE;\n\t\t\t\theader.programtype = match[ 1 ];\n\t\t\t\theader.string += line + '\\n';\n\n\t\t\t\twhile ( true ) {\n\n\t\t\t\t\tline = fgets( buffer );\n\t\t\t\t\tif ( false === line ) break;\n\t\t\t\t\theader.string += line + '\\n';\n\n\t\t\t\t\tif ( '#' === line.charAt( 0 ) ) {\n\n\t\t\t\t\t\theader.comments += line + '\\n';\n\t\t\t\t\t\tcontinue; // comment line\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( match = line.match( gamma_re ) ) {\n\n\t\t\t\t\t\theader.gamma = parseFloat( match[ 1 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( match = line.match( exposure_re ) ) {\n\n\t\t\t\t\t\theader.exposure = parseFloat( match[ 1 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( match = line.match( format_re ) ) {\n\n\t\t\t\t\t\theader.valid |= RGBE_VALID_FORMAT;\n\t\t\t\t\t\theader.format = match[ 1 ];//'32-bit_rle_rgbe';\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( match = line.match( dimensions_re ) ) {\n\n\t\t\t\t\t\theader.valid |= RGBE_VALID_DIMENSIONS;\n\t\t\t\t\t\theader.height = parseInt( match[ 1 ], 10 );\n\t\t\t\t\t\theader.width = parseInt( match[ 2 ], 10 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ( header.valid & RGBE_VALID_FORMAT ) && ( header.valid & RGBE_VALID_DIMENSIONS ) ) break;\n\n\t\t\t\t}\n\n\t\t\t\tif ( ! ( header.valid & RGBE_VALID_FORMAT ) ) {\n\n\t\t\t\t\treturn rgbe_error( rgbe_format_error, 'missing format specifier' );\n\n\t\t\t\t}\n\n\t\t\t\tif ( ! ( header.valid & RGBE_VALID_DIMENSIONS ) ) {\n\n\t\t\t\t\treturn rgbe_error( rgbe_format_error, 'missing image size specifier' );\n\n\t\t\t\t}\n\n\t\t\t\treturn header;\n\n\t\t\t},\n\n\t\t\tRGBE_ReadPixels_RLE = function ( buffer, w, h ) {\n\n\t\t\t\tconst scanline_width = w;\n\n\t\t\t\tif (\n\t\t\t\t\t// run length encoding is not allowed so read flat\n\t\t\t\t\t( ( scanline_width < 8 ) || ( scanline_width > 0x7fff ) ) ||\n\t\t\t\t\t// this file is not run length encoded\n\t\t\t\t\t( ( 2 !== buffer[ 0 ] ) || ( 2 !== buffer[ 1 ] ) || ( buffer[ 2 ] & 0x80 ) )\n\t\t\t\t) {\n\n\t\t\t\t\t// return the flat buffer\n\t\t\t\t\treturn new Uint8Array( buffer );\n\n\t\t\t\t}\n\n\t\t\t\tif ( scanline_width !== ( ( buffer[ 2 ] << 8 ) | buffer[ 3 ] ) ) {\n\n\t\t\t\t\treturn rgbe_error( rgbe_format_error, 'wrong scanline width' );\n\n\t\t\t\t}\n\n\t\t\t\tconst data_rgba = new Uint8Array( 4 * w * h );\n\n\t\t\t\tif ( ! data_rgba.length ) {\n\n\t\t\t\t\treturn rgbe_error( rgbe_memory_error, 'unable to allocate buffer space' );\n\n\t\t\t\t}\n\n\t\t\t\tlet offset = 0, pos = 0;\n\n\t\t\t\tconst ptr_end = 4 * scanline_width;\n\t\t\t\tconst rgbeStart = new Uint8Array( 4 );\n\t\t\t\tconst scanline_buffer = new Uint8Array( ptr_end );\n\t\t\t\tlet num_scanlines = h;\n\n\t\t\t\t// read in each successive scanline\n\t\t\t\twhile ( ( num_scanlines > 0 ) && ( pos < buffer.byteLength ) ) {\n\n\t\t\t\t\tif ( pos + 4 > buffer.byteLength ) {\n\n\t\t\t\t\t\treturn rgbe_error( rgbe_read_error );\n\n\t\t\t\t\t}\n\n\t\t\t\t\trgbeStart[ 0 ] = buffer[ pos ++ ];\n\t\t\t\t\trgbeStart[ 1 ] = buffer[ pos ++ ];\n\t\t\t\t\trgbeStart[ 2 ] = buffer[ pos ++ ];\n\t\t\t\t\trgbeStart[ 3 ] = buffer[ pos ++ ];\n\n\t\t\t\t\tif ( ( 2 != rgbeStart[ 0 ] ) || ( 2 != rgbeStart[ 1 ] ) || ( ( ( rgbeStart[ 2 ] << 8 ) | rgbeStart[ 3 ] ) != scanline_width ) ) {\n\n\t\t\t\t\t\treturn rgbe_error( rgbe_format_error, 'bad rgbe scanline format' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// read each of the four channels for the scanline into the buffer\n\t\t\t\t\t// first red, then green, then blue, then exponent\n\t\t\t\t\tlet ptr = 0, count;\n\n\t\t\t\t\twhile ( ( ptr < ptr_end ) && ( pos < buffer.byteLength ) ) {\n\n\t\t\t\t\t\tcount = buffer[ pos ++ ];\n\t\t\t\t\t\tconst isEncodedRun = count > 128;\n\t\t\t\t\t\tif ( isEncodedRun ) count -= 128;\n\n\t\t\t\t\t\tif ( ( 0 === count ) || ( ptr + count > ptr_end ) ) {\n\n\t\t\t\t\t\t\treturn rgbe_error( rgbe_format_error, 'bad scanline data' );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( isEncodedRun ) {\n\n\t\t\t\t\t\t\t// a (encoded) run of the same value\n\t\t\t\t\t\t\tconst byteValue = buffer[ pos ++ ];\n\t\t\t\t\t\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\t\t\t\t\t\tscanline_buffer[ ptr ++ ] = byteValue;\n\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t//ptr += count;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// a literal-run\n\t\t\t\t\t\t\tscanline_buffer.set( buffer.subarray( pos, pos + count ), ptr );\n\t\t\t\t\t\t\tptr += count; pos += count;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\n\t\t\t\t\t// now convert data from buffer into rgba\n\t\t\t\t\t// first red, then green, then blue, then exponent (alpha)\n\t\t\t\t\tconst l = scanline_width; //scanline_buffer.byteLength;\n\t\t\t\t\tfor ( let i = 0; i < l; i ++ ) {\n\n\t\t\t\t\t\tlet off = 0;\n\t\t\t\t\t\tdata_rgba[ offset ] = scanline_buffer[ i + off ];\n\t\t\t\t\t\toff += scanline_width; //1;\n\t\t\t\t\t\tdata_rgba[ offset + 1 ] = scanline_buffer[ i + off ];\n\t\t\t\t\t\toff += scanline_width; //1;\n\t\t\t\t\t\tdata_rgba[ offset + 2 ] = scanline_buffer[ i + off ];\n\t\t\t\t\t\toff += scanline_width; //1;\n\t\t\t\t\t\tdata_rgba[ offset + 3 ] = scanline_buffer[ i + off ];\n\t\t\t\t\t\toffset += 4;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tnum_scanlines --;\n\n\t\t\t\t}\n\n\t\t\t\treturn data_rgba;\n\n\t\t\t};\n\n\t\tconst RGBEByteToRGBFloat = function ( sourceArray, sourceOffset, destArray, destOffset ) {\n\n\t\t\tconst e = sourceArray[ sourceOffset + 3 ];\n\t\t\tconst scale = Math.pow( 2.0, e - 128.0 ) / 255.0;\n\n\t\t\tdestArray[ destOffset + 0 ] = sourceArray[ sourceOffset + 0 ] * scale;\n\t\t\tdestArray[ destOffset + 1 ] = sourceArray[ sourceOffset + 1 ] * scale;\n\t\t\tdestArray[ destOffset + 2 ] = sourceArray[ sourceOffset + 2 ] * scale;\n\t\t\tdestArray[ destOffset + 3 ] = 1;\n\n\t\t};\n\n\t\tconst RGBEByteToRGBHalf = function ( sourceArray, sourceOffset, destArray, destOffset ) {\n\n\t\t\tconst e = sourceArray[ sourceOffset + 3 ];\n\t\t\tconst scale = Math.pow( 2.0, e - 128.0 ) / 255.0;\n\n\t\t\t// clamping to 65504, the maximum representable value in float16\n\t\t\tdestArray[ destOffset + 0 ] = DataUtils.toHalfFloat( Math.min( sourceArray[ sourceOffset + 0 ] * scale, 65504 ) );\n\t\t\tdestArray[ destOffset + 1 ] = DataUtils.toHalfFloat( Math.min( sourceArray[ sourceOffset + 1 ] * scale, 65504 ) );\n\t\t\tdestArray[ destOffset + 2 ] = DataUtils.toHalfFloat( Math.min( sourceArray[ sourceOffset + 2 ] * scale, 65504 ) );\n\t\t\tdestArray[ destOffset + 3 ] = DataUtils.toHalfFloat( 1 );\n\n\t\t};\n\n\t\tconst byteArray = new Uint8Array( buffer );\n\t\tbyteArray.pos = 0;\n\t\tconst rgbe_header_info = RGBE_ReadHeader( byteArray );\n\n\t\tif ( RGBE_RETURN_FAILURE !== rgbe_header_info ) {\n\n\t\t\tconst w = rgbe_header_info.width,\n\t\t\t\th = rgbe_header_info.height,\n\t\t\t\timage_rgba_data = RGBE_ReadPixels_RLE( byteArray.subarray( byteArray.pos ), w, h );\n\n\t\t\tif ( RGBE_RETURN_FAILURE !== image_rgba_data ) {\n\n\t\t\t\tlet data, type;\n\t\t\t\tlet numElements;\n\n\t\t\t\tswitch ( this.type ) {\n\n\t\t\t\t\tcase FloatType:\n\n\t\t\t\t\t\tnumElements = image_rgba_data.length / 4;\n\t\t\t\t\t\tconst floatArray = new Float32Array( numElements * 4 );\n\n\t\t\t\t\t\tfor ( let j = 0; j < numElements; j ++ ) {\n\n\t\t\t\t\t\t\tRGBEByteToRGBFloat( image_rgba_data, j * 4, floatArray, j * 4 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tdata = floatArray;\n\t\t\t\t\t\ttype = FloatType;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase HalfFloatType:\n\n\t\t\t\t\t\tnumElements = image_rgba_data.length / 4;\n\t\t\t\t\t\tconst halfArray = new Uint16Array( numElements * 4 );\n\n\t\t\t\t\t\tfor ( let j = 0; j < numElements; j ++ ) {\n\n\t\t\t\t\t\t\tRGBEByteToRGBHalf( image_rgba_data, j * 4, halfArray, j * 4 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tdata = halfArray;\n\t\t\t\t\t\ttype = HalfFloatType;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tconsole.error( 'THREE.RGBELoader: unsupported type: ', this.type );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\twidth: w, height: h,\n\t\t\t\t\tdata: data,\n\t\t\t\t\theader: rgbe_header_info.string,\n\t\t\t\t\tgamma: rgbe_header_info.gamma,\n\t\t\t\t\texposure: rgbe_header_info.exposure,\n\t\t\t\t\ttype: type\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\tsetDataType( value ) {\n\n\t\tthis.type = value;\n\t\treturn this;\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tfunction onLoadCallback( texture, texData ) {\n\n\t\t\tswitch ( texture.type ) {\n\n\t\t\t\tcase FloatType:\n\t\t\t\tcase HalfFloatType:\n\n\t\t\t\t\ttexture.encoding = LinearEncoding;\n\t\t\t\t\ttexture.minFilter = LinearFilter;\n\t\t\t\t\ttexture.magFilter = LinearFilter;\n\t\t\t\t\ttexture.generateMipmaps = false;\n\t\t\t\t\ttexture.flipY = true;\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tif ( onLoad ) onLoad( texture, texData );\n\n\t\t}\n\n\t\treturn super.load( url, onLoadCallback, onProgress, onError );\n\n\t}\n\n}\n\nexport { RGBELoader };\n","/**\n * Full-screen textured quad shader\n */\n\nconst CopyShader = {\n\n\tuniforms: {\n\n\t\t'tDiffuse': { value: null },\n\t\t'opacity': { value: 1.0 }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tuniform float opacity;\n\n\t\tuniform sampler2D tDiffuse;\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tgl_FragColor = texture2D( tDiffuse, vUv );\n\t\t\tgl_FragColor.a *= opacity;\n\n\n\t\t}`\n\n};\n\nexport { CopyShader };\n","import {\n\tBufferGeometry,\n\tFloat32BufferAttribute,\n\tOrthographicCamera,\n\tMesh\n} from 'three';\n\nclass Pass {\n\n\tconstructor() {\n\n\t\t// if set to true, the pass is processed by the composer\n\t\tthis.enabled = true;\n\n\t\t// if set to true, the pass indicates to swap read and write buffer after rendering\n\t\tthis.needsSwap = true;\n\n\t\t// if set to true, the pass clears its buffer before rendering\n\t\tthis.clear = false;\n\n\t\t// if set to true, the result of the pass is rendered to screen. This is set automatically by EffectComposer.\n\t\tthis.renderToScreen = false;\n\n\t}\n\n\tsetSize( /* width, height */ ) {}\n\n\trender( /* renderer, writeBuffer, readBuffer, deltaTime, maskActive */ ) {\n\n\t\tconsole.error( 'THREE.Pass: .render() must be implemented in derived pass.' );\n\n\t}\n\n}\n\n// Helper for passes that need to fill the viewport with a single quad.\n\nconst _camera = new OrthographicCamera( - 1, 1, 1, - 1, 0, 1 );\n\n// https://github.com/mrdoob/three.js/pull/21358\n\nconst _geometry = new BufferGeometry();\n_geometry.setAttribute( 'position', new Float32BufferAttribute( [ - 1, 3, 0, - 1, - 1, 0, 3, - 1, 0 ], 3 ) );\n_geometry.setAttribute( 'uv', new Float32BufferAttribute( [ 0, 2, 0, 0, 2, 0 ], 2 ) );\n\nclass FullScreenQuad {\n\n\tconstructor( material ) {\n\n\t\tthis._mesh = new Mesh( _geometry, material );\n\n\t}\n\n\tdispose() {\n\n\t\tthis._mesh.geometry.dispose();\n\n\t}\n\n\trender( renderer ) {\n\n\t\trenderer.render( this._mesh, _camera );\n\n\t}\n\n\tget material() {\n\n\t\treturn this._mesh.material;\n\n\t}\n\n\tset material( value ) {\n\n\t\tthis._mesh.material = value;\n\n\t}\n\n}\n\nexport { Pass, FullScreenQuad };\n","import {\n\tShaderMaterial,\n\tUniformsUtils\n} from 'three';\nimport { Pass, FullScreenQuad } from './Pass.js';\n\nclass ShaderPass extends Pass {\n\n\tconstructor( shader, textureID ) {\n\n\t\tsuper();\n\n\t\tthis.textureID = ( textureID !== undefined ) ? textureID : 'tDiffuse';\n\n\t\tif ( shader instanceof ShaderMaterial ) {\n\n\t\t\tthis.uniforms = shader.uniforms;\n\n\t\t\tthis.material = shader;\n\n\t\t} else if ( shader ) {\n\n\t\t\tthis.uniforms = UniformsUtils.clone( shader.uniforms );\n\n\t\t\tthis.material = new ShaderMaterial( {\n\n\t\t\t\tdefines: Object.assign( {}, shader.defines ),\n\t\t\t\tuniforms: this.uniforms,\n\t\t\t\tvertexShader: shader.vertexShader,\n\t\t\t\tfragmentShader: shader.fragmentShader\n\n\t\t\t} );\n\n\t\t}\n\n\t\tthis.fsQuad = new FullScreenQuad( this.material );\n\n\t}\n\n\trender( renderer, writeBuffer, readBuffer /*, deltaTime, maskActive */ ) {\n\n\t\tif ( this.uniforms[ this.textureID ] ) {\n\n\t\t\tthis.uniforms[ this.textureID ].value = readBuffer.texture;\n\n\t\t}\n\n\t\tthis.fsQuad.material = this.material;\n\n\t\tif ( this.renderToScreen ) {\n\n\t\t\trenderer.setRenderTarget( null );\n\t\t\tthis.fsQuad.render( renderer );\n\n\t\t} else {\n\n\t\t\trenderer.setRenderTarget( writeBuffer );\n\t\t\t// TODO: Avoid using autoClear properties, see https://github.com/mrdoob/three.js/pull/15571#issuecomment-465669600\n\t\t\tif ( this.clear ) renderer.clear( renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil );\n\t\t\tthis.fsQuad.render( renderer );\n\n\t\t}\n\n\t}\n\n}\n\nexport { ShaderPass };\n","import { Pass } from './Pass.js';\n\nclass MaskPass extends Pass {\n\n\tconstructor( scene, camera ) {\n\n\t\tsuper();\n\n\t\tthis.scene = scene;\n\t\tthis.camera = camera;\n\n\t\tthis.clear = true;\n\t\tthis.needsSwap = false;\n\n\t\tthis.inverse = false;\n\n\t}\n\n\trender( renderer, writeBuffer, readBuffer /*, deltaTime, maskActive */ ) {\n\n\t\tconst context = renderer.getContext();\n\t\tconst state = renderer.state;\n\n\t\t// don't update color or depth\n\n\t\tstate.buffers.color.setMask( false );\n\t\tstate.buffers.depth.setMask( false );\n\n\t\t// lock buffers\n\n\t\tstate.buffers.color.setLocked( true );\n\t\tstate.buffers.depth.setLocked( true );\n\n\t\t// set up stencil\n\n\t\tlet writeValue, clearValue;\n\n\t\tif ( this.inverse ) {\n\n\t\t\twriteValue = 0;\n\t\t\tclearValue = 1;\n\n\t\t} else {\n\n\t\t\twriteValue = 1;\n\t\t\tclearValue = 0;\n\n\t\t}\n\n\t\tstate.buffers.stencil.setTest( true );\n\t\tstate.buffers.stencil.setOp( context.REPLACE, context.REPLACE, context.REPLACE );\n\t\tstate.buffers.stencil.setFunc( context.ALWAYS, writeValue, 0xffffffff );\n\t\tstate.buffers.stencil.setClear( clearValue );\n\t\tstate.buffers.stencil.setLocked( true );\n\n\t\t// draw into the stencil buffer\n\n\t\trenderer.setRenderTarget( readBuffer );\n\t\tif ( this.clear ) renderer.clear();\n\t\trenderer.render( this.scene, this.camera );\n\n\t\trenderer.setRenderTarget( writeBuffer );\n\t\tif ( this.clear ) renderer.clear();\n\t\trenderer.render( this.scene, this.camera );\n\n\t\t// unlock color and depth buffer for subsequent rendering\n\n\t\tstate.buffers.color.setLocked( false );\n\t\tstate.buffers.depth.setLocked( false );\n\n\t\t// only render where stencil is set to 1\n\n\t\tstate.buffers.stencil.setLocked( false );\n\t\tstate.buffers.stencil.setFunc( context.EQUAL, 1, 0xffffffff ); // draw if == 1\n\t\tstate.buffers.stencil.setOp( context.KEEP, context.KEEP, context.KEEP );\n\t\tstate.buffers.stencil.setLocked( true );\n\n\t}\n\n}\n\nclass ClearMaskPass extends Pass {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.needsSwap = false;\n\n\t}\n\n\trender( renderer /*, writeBuffer, readBuffer, deltaTime, maskActive */ ) {\n\n\t\trenderer.state.buffers.stencil.setLocked( false );\n\t\trenderer.state.buffers.stencil.setTest( false );\n\n\t}\n\n}\n\nexport { MaskPass, ClearMaskPass };\n","import {\n\tBufferGeometry,\n\tClock,\n\tFloat32BufferAttribute,\n\tMesh,\n\tOrthographicCamera,\n\tVector2,\n\tWebGLRenderTarget\n} from 'three';\nimport { CopyShader } from '../shaders/CopyShader.js';\nimport { ShaderPass } from './ShaderPass.js';\nimport { MaskPass } from './MaskPass.js';\nimport { ClearMaskPass } from './MaskPass.js';\n\nclass EffectComposer {\n\n\tconstructor( renderer, renderTarget ) {\n\n\t\tthis.renderer = renderer;\n\n\t\tif ( renderTarget === undefined ) {\n\n\t\t\tconst size = renderer.getSize( new Vector2() );\n\t\t\tthis._pixelRatio = renderer.getPixelRatio();\n\t\t\tthis._width = size.width;\n\t\t\tthis._height = size.height;\n\n\t\t\trenderTarget = new WebGLRenderTarget( this._width * this._pixelRatio, this._height * this._pixelRatio );\n\t\t\trenderTarget.texture.name = 'EffectComposer.rt1';\n\n\t\t} else {\n\n\t\t\tthis._pixelRatio = 1;\n\t\t\tthis._width = renderTarget.width;\n\t\t\tthis._height = renderTarget.height;\n\n\t\t}\n\n\t\tthis.renderTarget1 = renderTarget;\n\t\tthis.renderTarget2 = renderTarget.clone();\n\t\tthis.renderTarget2.texture.name = 'EffectComposer.rt2';\n\n\t\tthis.writeBuffer = this.renderTarget1;\n\t\tthis.readBuffer = this.renderTarget2;\n\n\t\tthis.renderToScreen = true;\n\n\t\tthis.passes = [];\n\n\t\t// dependencies\n\n\t\tif ( CopyShader === undefined ) {\n\n\t\t\tconsole.error( 'THREE.EffectComposer relies on CopyShader' );\n\n\t\t}\n\n\t\tif ( ShaderPass === undefined ) {\n\n\t\t\tconsole.error( 'THREE.EffectComposer relies on ShaderPass' );\n\n\t\t}\n\n\t\tthis.copyPass = new ShaderPass( CopyShader );\n\n\t\tthis.clock = new Clock();\n\n\t}\n\n\tswapBuffers() {\n\n\t\tconst tmp = this.readBuffer;\n\t\tthis.readBuffer = this.writeBuffer;\n\t\tthis.writeBuffer = tmp;\n\n\t}\n\n\taddPass( pass ) {\n\n\t\tthis.passes.push( pass );\n\t\tpass.setSize( this._width * this._pixelRatio, this._height * this._pixelRatio );\n\n\t}\n\n\tinsertPass( pass, index ) {\n\n\t\tthis.passes.splice( index, 0, pass );\n\t\tpass.setSize( this._width * this._pixelRatio, this._height * this._pixelRatio );\n\n\t}\n\n\tremovePass( pass ) {\n\n\t\tconst index = this.passes.indexOf( pass );\n\n\t\tif ( index !== - 1 ) {\n\n\t\t\tthis.passes.splice( index, 1 );\n\n\t\t}\n\n\t}\n\n\tisLastEnabledPass( passIndex ) {\n\n\t\tfor ( let i = passIndex + 1; i < this.passes.length; i ++ ) {\n\n\t\t\tif ( this.passes[ i ].enabled ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\trender( deltaTime ) {\n\n\t\t// deltaTime value is in seconds\n\n\t\tif ( deltaTime === undefined ) {\n\n\t\t\tdeltaTime = this.clock.getDelta();\n\n\t\t}\n\n\t\tconst currentRenderTarget = this.renderer.getRenderTarget();\n\n\t\tlet maskActive = false;\n\n\t\tfor ( let i = 0, il = this.passes.length; i < il; i ++ ) {\n\n\t\t\tconst pass = this.passes[ i ];\n\n\t\t\tif ( pass.enabled === false ) continue;\n\n\t\t\tpass.renderToScreen = ( this.renderToScreen && this.isLastEnabledPass( i ) );\n\t\t\tpass.render( this.renderer, this.writeBuffer, this.readBuffer, deltaTime, maskActive );\n\n\t\t\tif ( pass.needsSwap ) {\n\n\t\t\t\tif ( maskActive ) {\n\n\t\t\t\t\tconst context = this.renderer.getContext();\n\t\t\t\t\tconst stencil = this.renderer.state.buffers.stencil;\n\n\t\t\t\t\t//context.stencilFunc( context.NOTEQUAL, 1, 0xffffffff );\n\t\t\t\t\tstencil.setFunc( context.NOTEQUAL, 1, 0xffffffff );\n\n\t\t\t\t\tthis.copyPass.render( this.renderer, this.writeBuffer, this.readBuffer, deltaTime );\n\n\t\t\t\t\t//context.stencilFunc( context.EQUAL, 1, 0xffffffff );\n\t\t\t\t\tstencil.setFunc( context.EQUAL, 1, 0xffffffff );\n\n\t\t\t\t}\n\n\t\t\t\tthis.swapBuffers();\n\n\t\t\t}\n\n\t\t\tif ( MaskPass !== undefined ) {\n\n\t\t\t\tif ( pass instanceof MaskPass ) {\n\n\t\t\t\t\tmaskActive = true;\n\n\t\t\t\t} else if ( pass instanceof ClearMaskPass ) {\n\n\t\t\t\t\tmaskActive = false;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.renderer.setRenderTarget( currentRenderTarget );\n\n\t}\n\n\treset( renderTarget ) {\n\n\t\tif ( renderTarget === undefined ) {\n\n\t\t\tconst size = this.renderer.getSize( new Vector2() );\n\t\t\tthis._pixelRatio = this.renderer.getPixelRatio();\n\t\t\tthis._width = size.width;\n\t\t\tthis._height = size.height;\n\n\t\t\trenderTarget = this.renderTarget1.clone();\n\t\t\trenderTarget.setSize( this._width * this._pixelRatio, this._height * this._pixelRatio );\n\n\t\t}\n\n\t\tthis.renderTarget1.dispose();\n\t\tthis.renderTarget2.dispose();\n\t\tthis.renderTarget1 = renderTarget;\n\t\tthis.renderTarget2 = renderTarget.clone();\n\n\t\tthis.writeBuffer = this.renderTarget1;\n\t\tthis.readBuffer = this.renderTarget2;\n\n\t}\n\n\tsetSize( width, height ) {\n\n\t\tthis._width = width;\n\t\tthis._height = height;\n\n\t\tconst effectiveWidth = this._width * this._pixelRatio;\n\t\tconst effectiveHeight = this._height * this._pixelRatio;\n\n\t\tthis.renderTarget1.setSize( effectiveWidth, effectiveHeight );\n\t\tthis.renderTarget2.setSize( effectiveWidth, effectiveHeight );\n\n\t\tfor ( let i = 0; i < this.passes.length; i ++ ) {\n\n\t\t\tthis.passes[ i ].setSize( effectiveWidth, effectiveHeight );\n\n\t\t}\n\n\t}\n\n\tsetPixelRatio( pixelRatio ) {\n\n\t\tthis._pixelRatio = pixelRatio;\n\n\t\tthis.setSize( this._width, this._height );\n\n\t}\n\n}\n\n\nclass Pass {\n\n\tconstructor() {\n\n\t\t// if set to true, the pass is processed by the composer\n\t\tthis.enabled = true;\n\n\t\t// if set to true, the pass indicates to swap read and write buffer after rendering\n\t\tthis.needsSwap = true;\n\n\t\t// if set to true, the pass clears its buffer before rendering\n\t\tthis.clear = false;\n\n\t\t// if set to true, the result of the pass is rendered to screen. This is set automatically by EffectComposer.\n\t\tthis.renderToScreen = false;\n\n\t}\n\n\tsetSize( /* width, height */ ) {}\n\n\trender( /* renderer, writeBuffer, readBuffer, deltaTime, maskActive */ ) {\n\n\t\tconsole.error( 'THREE.Pass: .render() must be implemented in derived pass.' );\n\n\t}\n\n}\n\n// Helper for passes that need to fill the viewport with a single quad.\n\nconst _camera = new OrthographicCamera( - 1, 1, 1, - 1, 0, 1 );\n\n// https://github.com/mrdoob/three.js/pull/21358\n\nconst _geometry = new BufferGeometry();\n_geometry.setAttribute( 'position', new Float32BufferAttribute( [ - 1, 3, 0, - 1, - 1, 0, 3, - 1, 0 ], 3 ) );\n_geometry.setAttribute( 'uv', new Float32BufferAttribute( [ 0, 2, 0, 0, 2, 0 ], 2 ) );\n\nclass FullScreenQuad {\n\n\tconstructor( material ) {\n\n\t\tthis._mesh = new Mesh( _geometry, material );\n\n\t}\n\n\tdispose() {\n\n\t\tthis._mesh.geometry.dispose();\n\n\t}\n\n\trender( renderer ) {\n\n\t\trenderer.render( this._mesh, _camera );\n\n\t}\n\n\tget material() {\n\n\t\treturn this._mesh.material;\n\n\t}\n\n\tset material( value ) {\n\n\t\tthis._mesh.material = value;\n\n\t}\n\n}\n\nexport { EffectComposer, Pass, FullScreenQuad };\n","import {\n\tColor\n} from 'three';\nimport { Pass } from './Pass.js';\n\nclass RenderPass extends Pass {\n\n\tconstructor( scene, camera, overrideMaterial, clearColor, clearAlpha ) {\n\n\t\tsuper();\n\n\t\tthis.scene = scene;\n\t\tthis.camera = camera;\n\n\t\tthis.overrideMaterial = overrideMaterial;\n\n\t\tthis.clearColor = clearColor;\n\t\tthis.clearAlpha = ( clearAlpha !== undefined ) ? clearAlpha : 0;\n\n\t\tthis.clear = true;\n\t\tthis.clearDepth = false;\n\t\tthis.needsSwap = false;\n\t\tthis._oldClearColor = new Color();\n\n\t}\n\n\trender( renderer, writeBuffer, readBuffer /*, deltaTime, maskActive */ ) {\n\n\t\tconst oldAutoClear = renderer.autoClear;\n\t\trenderer.autoClear = false;\n\n\t\tlet oldClearAlpha, oldOverrideMaterial;\n\n\t\tif ( this.overrideMaterial !== undefined ) {\n\n\t\t\toldOverrideMaterial = this.scene.overrideMaterial;\n\n\t\t\tthis.scene.overrideMaterial = this.overrideMaterial;\n\n\t\t}\n\n\t\tif ( this.clearColor ) {\n\n\t\t\trenderer.getClearColor( this._oldClearColor );\n\t\t\toldClearAlpha = renderer.getClearAlpha();\n\n\t\t\trenderer.setClearColor( this.clearColor, this.clearAlpha );\n\n\t\t}\n\n\t\tif ( this.clearDepth ) {\n\n\t\t\trenderer.clearDepth();\n\n\t\t}\n\n\t\trenderer.setRenderTarget( this.renderToScreen ? null : readBuffer );\n\n\t\t// TODO: Avoid using autoClear properties, see https://github.com/mrdoob/three.js/pull/15571#issuecomment-465669600\n\t\tif ( this.clear ) renderer.clear( renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil );\n\t\trenderer.render( this.scene, this.camera );\n\n\t\tif ( this.clearColor ) {\n\n\t\t\trenderer.setClearColor( this._oldClearColor, oldClearAlpha );\n\n\t\t}\n\n\t\tif ( this.overrideMaterial !== undefined ) {\n\n\t\t\tthis.scene.overrideMaterial = oldOverrideMaterial;\n\n\t\t}\n\n\t\trenderer.autoClear = oldAutoClear;\n\n\t}\n\n}\n\nexport { RenderPass };\n","import {\n\tVector2\n} from 'three';\n\n/**\n * WebGL port of Subpixel Morphological Antialiasing (SMAA) v2.8\n * Preset: SMAA 1x Medium (with color edge detection)\n * https://github.com/iryoku/smaa/releases/tag/v2.8\n */\n\nconst SMAAEdgesShader = {\n\n\tdefines: {\n\n\t\t'SMAA_THRESHOLD': '0.1'\n\n\t},\n\n\tuniforms: {\n\n\t\t'tDiffuse': { value: null },\n\t\t'resolution': { value: new Vector2( 1 / 1024, 1 / 512 ) }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tuniform vec2 resolution;\n\n\t\tvarying vec2 vUv;\n\t\tvarying vec4 vOffset[ 3 ];\n\n\t\tvoid SMAAEdgeDetectionVS( vec2 texcoord ) {\n\t\t\tvOffset[ 0 ] = texcoord.xyxy + resolution.xyxy * vec4( -1.0, 0.0, 0.0, 1.0 ); // WebGL port note: Changed sign in W component\n\t\t\tvOffset[ 1 ] = texcoord.xyxy + resolution.xyxy * vec4( 1.0, 0.0, 0.0, -1.0 ); // WebGL port note: Changed sign in W component\n\t\t\tvOffset[ 2 ] = texcoord.xyxy + resolution.xyxy * vec4( -2.0, 0.0, 0.0, 2.0 ); // WebGL port note: Changed sign in W component\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\n\t\t\tSMAAEdgeDetectionVS( vUv );\n\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tuniform sampler2D tDiffuse;\n\n\t\tvarying vec2 vUv;\n\t\tvarying vec4 vOffset[ 3 ];\n\n\t\tvec4 SMAAColorEdgeDetectionPS( vec2 texcoord, vec4 offset[3], sampler2D colorTex ) {\n\t\t\tvec2 threshold = vec2( SMAA_THRESHOLD, SMAA_THRESHOLD );\n\n\t\t\t// Calculate color deltas:\n\t\t\tvec4 delta;\n\t\t\tvec3 C = texture2D( colorTex, texcoord ).rgb;\n\n\t\t\tvec3 Cleft = texture2D( colorTex, offset[0].xy ).rgb;\n\t\t\tvec3 t = abs( C - Cleft );\n\t\t\tdelta.x = max( max( t.r, t.g ), t.b );\n\n\t\t\tvec3 Ctop = texture2D( colorTex, offset[0].zw ).rgb;\n\t\t\tt = abs( C - Ctop );\n\t\t\tdelta.y = max( max( t.r, t.g ), t.b );\n\n\t\t\t// We do the usual threshold:\n\t\t\tvec2 edges = step( threshold, delta.xy );\n\n\t\t\t// Then discard if there is no edge:\n\t\t\tif ( dot( edges, vec2( 1.0, 1.0 ) ) == 0.0 )\n\t\t\t\tdiscard;\n\n\t\t\t// Calculate right and bottom deltas:\n\t\t\tvec3 Cright = texture2D( colorTex, offset[1].xy ).rgb;\n\t\t\tt = abs( C - Cright );\n\t\t\tdelta.z = max( max( t.r, t.g ), t.b );\n\n\t\t\tvec3 Cbottom = texture2D( colorTex, offset[1].zw ).rgb;\n\t\t\tt = abs( C - Cbottom );\n\t\t\tdelta.w = max( max( t.r, t.g ), t.b );\n\n\t\t\t// Calculate the maximum delta in the direct neighborhood:\n\t\t\tfloat maxDelta = max( max( max( delta.x, delta.y ), delta.z ), delta.w );\n\n\t\t\t// Calculate left-left and top-top deltas:\n\t\t\tvec3 Cleftleft = texture2D( colorTex, offset[2].xy ).rgb;\n\t\t\tt = abs( C - Cleftleft );\n\t\t\tdelta.z = max( max( t.r, t.g ), t.b );\n\n\t\t\tvec3 Ctoptop = texture2D( colorTex, offset[2].zw ).rgb;\n\t\t\tt = abs( C - Ctoptop );\n\t\t\tdelta.w = max( max( t.r, t.g ), t.b );\n\n\t\t\t// Calculate the final maximum delta:\n\t\t\tmaxDelta = max( max( maxDelta, delta.z ), delta.w );\n\n\t\t\t// Local contrast adaptation in action:\n\t\t\tedges.xy *= step( 0.5 * maxDelta, delta.xy );\n\n\t\t\treturn vec4( edges, 0.0, 0.0 );\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tgl_FragColor = SMAAColorEdgeDetectionPS( vUv, vOffset, tDiffuse );\n\n\t\t}`\n\n};\n\nconst SMAAWeightsShader = {\n\n\tdefines: {\n\n\t\t'SMAA_MAX_SEARCH_STEPS': '8',\n\t\t'SMAA_AREATEX_MAX_DISTANCE': '16',\n\t\t'SMAA_AREATEX_PIXEL_SIZE': '( 1.0 / vec2( 160.0, 560.0 ) )',\n\t\t'SMAA_AREATEX_SUBTEX_SIZE': '( 1.0 / 7.0 )'\n\n\t},\n\n\tuniforms: {\n\n\t\t'tDiffuse': { value: null },\n\t\t'tArea': { value: null },\n\t\t'tSearch': { value: null },\n\t\t'resolution': { value: new Vector2( 1 / 1024, 1 / 512 ) }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tuniform vec2 resolution;\n\n\t\tvarying vec2 vUv;\n\t\tvarying vec4 vOffset[ 3 ];\n\t\tvarying vec2 vPixcoord;\n\n\t\tvoid SMAABlendingWeightCalculationVS( vec2 texcoord ) {\n\t\t\tvPixcoord = texcoord / resolution;\n\n\t\t\t// We will use these offsets for the searches later on (see @PSEUDO_GATHER4):\n\t\t\tvOffset[ 0 ] = texcoord.xyxy + resolution.xyxy * vec4( -0.25, 0.125, 1.25, 0.125 ); // WebGL port note: Changed sign in Y and W components\n\t\t\tvOffset[ 1 ] = texcoord.xyxy + resolution.xyxy * vec4( -0.125, 0.25, -0.125, -1.25 ); // WebGL port note: Changed sign in Y and W components\n\n\t\t\t// And these for the searches, they indicate the ends of the loops:\n\t\t\tvOffset[ 2 ] = vec4( vOffset[ 0 ].xz, vOffset[ 1 ].yw ) + vec4( -2.0, 2.0, -2.0, 2.0 ) * resolution.xxyy * float( SMAA_MAX_SEARCH_STEPS );\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\n\t\t\tSMAABlendingWeightCalculationVS( vUv );\n\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\t#define SMAASampleLevelZeroOffset( tex, coord, offset ) texture2D( tex, coord + float( offset ) * resolution, 0.0 )\n\n\t\tuniform sampler2D tDiffuse;\n\t\tuniform sampler2D tArea;\n\t\tuniform sampler2D tSearch;\n\t\tuniform vec2 resolution;\n\n\t\tvarying vec2 vUv;\n\t\tvarying vec4 vOffset[3];\n\t\tvarying vec2 vPixcoord;\n\n\t\t#if __VERSION__ == 100\n\t\tvec2 round( vec2 x ) {\n\t\t\treturn sign( x ) * floor( abs( x ) + 0.5 );\n\t\t}\n\t\t#endif\n\n\t\tfloat SMAASearchLength( sampler2D searchTex, vec2 e, float bias, float scale ) {\n\t\t\t// Not required if searchTex accesses are set to point:\n\t\t\t// float2 SEARCH_TEX_PIXEL_SIZE = 1.0 / float2(66.0, 33.0);\n\t\t\t// e = float2(bias, 0.0) + 0.5 * SEARCH_TEX_PIXEL_SIZE +\n\t\t\t// e * float2(scale, 1.0) * float2(64.0, 32.0) * SEARCH_TEX_PIXEL_SIZE;\n\t\t\te.r = bias + e.r * scale;\n\t\t\treturn 255.0 * texture2D( searchTex, e, 0.0 ).r;\n\t\t}\n\n\t\tfloat SMAASearchXLeft( sampler2D edgesTex, sampler2D searchTex, vec2 texcoord, float end ) {\n\t\t\t/**\n\t\t\t\t* @PSEUDO_GATHER4\n\t\t\t\t* This texcoord has been offset by (-0.25, -0.125) in the vertex shader to\n\t\t\t\t* sample between edge, thus fetching four edges in a row.\n\t\t\t\t* Sampling with different offsets in each direction allows to disambiguate\n\t\t\t\t* which edges are active from the four fetched ones.\n\t\t\t\t*/\n\t\t\tvec2 e = vec2( 0.0, 1.0 );\n\n\t\t\tfor ( int i = 0; i < SMAA_MAX_SEARCH_STEPS; i ++ ) { // WebGL port note: Changed while to for\n\t\t\t\te = texture2D( edgesTex, texcoord, 0.0 ).rg;\n\t\t\t\ttexcoord -= vec2( 2.0, 0.0 ) * resolution;\n\t\t\t\tif ( ! ( texcoord.x > end && e.g > 0.8281 && e.r == 0.0 ) ) break;\n\t\t\t}\n\n\t\t\t// We correct the previous (-0.25, -0.125) offset we applied:\n\t\t\ttexcoord.x += 0.25 * resolution.x;\n\n\t\t\t// The searches are bias by 1, so adjust the coords accordingly:\n\t\t\ttexcoord.x += resolution.x;\n\n\t\t\t// Disambiguate the length added by the last step:\n\t\t\ttexcoord.x += 2.0 * resolution.x; // Undo last step\n\t\t\ttexcoord.x -= resolution.x * SMAASearchLength(searchTex, e, 0.0, 0.5);\n\n\t\t\treturn texcoord.x;\n\t\t}\n\n\t\tfloat SMAASearchXRight( sampler2D edgesTex, sampler2D searchTex, vec2 texcoord, float end ) {\n\t\t\tvec2 e = vec2( 0.0, 1.0 );\n\n\t\t\tfor ( int i = 0; i < SMAA_MAX_SEARCH_STEPS; i ++ ) { // WebGL port note: Changed while to for\n\t\t\t\te = texture2D( edgesTex, texcoord, 0.0 ).rg;\n\t\t\t\ttexcoord += vec2( 2.0, 0.0 ) * resolution;\n\t\t\t\tif ( ! ( texcoord.x < end && e.g > 0.8281 && e.r == 0.0 ) ) break;\n\t\t\t}\n\n\t\t\ttexcoord.x -= 0.25 * resolution.x;\n\t\t\ttexcoord.x -= resolution.x;\n\t\t\ttexcoord.x -= 2.0 * resolution.x;\n\t\t\ttexcoord.x += resolution.x * SMAASearchLength( searchTex, e, 0.5, 0.5 );\n\n\t\t\treturn texcoord.x;\n\t\t}\n\n\t\tfloat SMAASearchYUp( sampler2D edgesTex, sampler2D searchTex, vec2 texcoord, float end ) {\n\t\t\tvec2 e = vec2( 1.0, 0.0 );\n\n\t\t\tfor ( int i = 0; i < SMAA_MAX_SEARCH_STEPS; i ++ ) { // WebGL port note: Changed while to for\n\t\t\t\te = texture2D( edgesTex, texcoord, 0.0 ).rg;\n\t\t\t\ttexcoord += vec2( 0.0, 2.0 ) * resolution; // WebGL port note: Changed sign\n\t\t\t\tif ( ! ( texcoord.y > end && e.r > 0.8281 && e.g == 0.0 ) ) break;\n\t\t\t}\n\n\t\t\ttexcoord.y -= 0.25 * resolution.y; // WebGL port note: Changed sign\n\t\t\ttexcoord.y -= resolution.y; // WebGL port note: Changed sign\n\t\t\ttexcoord.y -= 2.0 * resolution.y; // WebGL port note: Changed sign\n\t\t\ttexcoord.y += resolution.y * SMAASearchLength( searchTex, e.gr, 0.0, 0.5 ); // WebGL port note: Changed sign\n\n\t\t\treturn texcoord.y;\n\t\t}\n\n\t\tfloat SMAASearchYDown( sampler2D edgesTex, sampler2D searchTex, vec2 texcoord, float end ) {\n\t\t\tvec2 e = vec2( 1.0, 0.0 );\n\n\t\t\tfor ( int i = 0; i < SMAA_MAX_SEARCH_STEPS; i ++ ) { // WebGL port note: Changed while to for\n\t\t\t\te = texture2D( edgesTex, texcoord, 0.0 ).rg;\n\t\t\t\ttexcoord -= vec2( 0.0, 2.0 ) * resolution; // WebGL port note: Changed sign\n\t\t\t\tif ( ! ( texcoord.y < end && e.r > 0.8281 && e.g == 0.0 ) ) break;\n\t\t\t}\n\n\t\t\ttexcoord.y += 0.25 * resolution.y; // WebGL port note: Changed sign\n\t\t\ttexcoord.y += resolution.y; // WebGL port note: Changed sign\n\t\t\ttexcoord.y += 2.0 * resolution.y; // WebGL port note: Changed sign\n\t\t\ttexcoord.y -= resolution.y * SMAASearchLength( searchTex, e.gr, 0.5, 0.5 ); // WebGL port note: Changed sign\n\n\t\t\treturn texcoord.y;\n\t\t}\n\n\t\tvec2 SMAAArea( sampler2D areaTex, vec2 dist, float e1, float e2, float offset ) {\n\t\t\t// Rounding prevents precision errors of bilinear filtering:\n\t\t\tvec2 texcoord = float( SMAA_AREATEX_MAX_DISTANCE ) * round( 4.0 * vec2( e1, e2 ) ) + dist;\n\n\t\t\t// We do a scale and bias for mapping to texel space:\n\t\t\ttexcoord = SMAA_AREATEX_PIXEL_SIZE * texcoord + ( 0.5 * SMAA_AREATEX_PIXEL_SIZE );\n\n\t\t\t// Move to proper place, according to the subpixel offset:\n\t\t\ttexcoord.y += SMAA_AREATEX_SUBTEX_SIZE * offset;\n\n\t\t\treturn texture2D( areaTex, texcoord, 0.0 ).rg;\n\t\t}\n\n\t\tvec4 SMAABlendingWeightCalculationPS( vec2 texcoord, vec2 pixcoord, vec4 offset[ 3 ], sampler2D edgesTex, sampler2D areaTex, sampler2D searchTex, ivec4 subsampleIndices ) {\n\t\t\tvec4 weights = vec4( 0.0, 0.0, 0.0, 0.0 );\n\n\t\t\tvec2 e = texture2D( edgesTex, texcoord ).rg;\n\n\t\t\tif ( e.g > 0.0 ) { // Edge at north\n\t\t\t\tvec2 d;\n\n\t\t\t\t// Find the distance to the left:\n\t\t\t\tvec2 coords;\n\t\t\t\tcoords.x = SMAASearchXLeft( edgesTex, searchTex, offset[ 0 ].xy, offset[ 2 ].x );\n\t\t\t\tcoords.y = offset[ 1 ].y; // offset[1].y = texcoord.y - 0.25 * resolution.y (@CROSSING_OFFSET)\n\t\t\t\td.x = coords.x;\n\n\t\t\t\t// Now fetch the left crossing edges, two at a time using bilinear\n\t\t\t\t// filtering. Sampling at -0.25 (see @CROSSING_OFFSET) enables to\n\t\t\t\t// discern what value each edge has:\n\t\t\t\tfloat e1 = texture2D( edgesTex, coords, 0.0 ).r;\n\n\t\t\t\t// Find the distance to the right:\n\t\t\t\tcoords.x = SMAASearchXRight( edgesTex, searchTex, offset[ 0 ].zw, offset[ 2 ].y );\n\t\t\t\td.y = coords.x;\n\n\t\t\t\t// We want the distances to be in pixel units (doing this here allow to\n\t\t\t\t// better interleave arithmetic and memory accesses):\n\t\t\t\td = d / resolution.x - pixcoord.x;\n\n\t\t\t\t// SMAAArea below needs a sqrt, as the areas texture is compressed\n\t\t\t\t// quadratically:\n\t\t\t\tvec2 sqrt_d = sqrt( abs( d ) );\n\n\t\t\t\t// Fetch the right crossing edges:\n\t\t\t\tcoords.y -= 1.0 * resolution.y; // WebGL port note: Added\n\t\t\t\tfloat e2 = SMAASampleLevelZeroOffset( edgesTex, coords, ivec2( 1, 0 ) ).r;\n\n\t\t\t\t// Ok, we know how this pattern looks like, now it is time for getting\n\t\t\t\t// the actual area:\n\t\t\t\tweights.rg = SMAAArea( areaTex, sqrt_d, e1, e2, float( subsampleIndices.y ) );\n\t\t\t}\n\n\t\t\tif ( e.r > 0.0 ) { // Edge at west\n\t\t\t\tvec2 d;\n\n\t\t\t\t// Find the distance to the top:\n\t\t\t\tvec2 coords;\n\n\t\t\t\tcoords.y = SMAASearchYUp( edgesTex, searchTex, offset[ 1 ].xy, offset[ 2 ].z );\n\t\t\t\tcoords.x = offset[ 0 ].x; // offset[1].x = texcoord.x - 0.25 * resolution.x;\n\t\t\t\td.x = coords.y;\n\n\t\t\t\t// Fetch the top crossing edges:\n\t\t\t\tfloat e1 = texture2D( edgesTex, coords, 0.0 ).g;\n\n\t\t\t\t// Find the distance to the bottom:\n\t\t\t\tcoords.y = SMAASearchYDown( edgesTex, searchTex, offset[ 1 ].zw, offset[ 2 ].w );\n\t\t\t\td.y = coords.y;\n\n\t\t\t\t// We want the distances to be in pixel units:\n\t\t\t\td = d / resolution.y - pixcoord.y;\n\n\t\t\t\t// SMAAArea below needs a sqrt, as the areas texture is compressed\n\t\t\t\t// quadratically:\n\t\t\t\tvec2 sqrt_d = sqrt( abs( d ) );\n\n\t\t\t\t// Fetch the bottom crossing edges:\n\t\t\t\tcoords.y -= 1.0 * resolution.y; // WebGL port note: Added\n\t\t\t\tfloat e2 = SMAASampleLevelZeroOffset( edgesTex, coords, ivec2( 0, 1 ) ).g;\n\n\t\t\t\t// Get the area for this direction:\n\t\t\t\tweights.ba = SMAAArea( areaTex, sqrt_d, e1, e2, float( subsampleIndices.x ) );\n\t\t\t}\n\n\t\t\treturn weights;\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tgl_FragColor = SMAABlendingWeightCalculationPS( vUv, vPixcoord, vOffset, tDiffuse, tArea, tSearch, ivec4( 0.0 ) );\n\n\t\t}`\n\n};\n\nconst SMAABlendShader = {\n\n\tuniforms: {\n\n\t\t'tDiffuse': { value: null },\n\t\t'tColor': { value: null },\n\t\t'resolution': { value: new Vector2( 1 / 1024, 1 / 512 ) }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tuniform vec2 resolution;\n\n\t\tvarying vec2 vUv;\n\t\tvarying vec4 vOffset[ 2 ];\n\n\t\tvoid SMAANeighborhoodBlendingVS( vec2 texcoord ) {\n\t\t\tvOffset[ 0 ] = texcoord.xyxy + resolution.xyxy * vec4( -1.0, 0.0, 0.0, 1.0 ); // WebGL port note: Changed sign in W component\n\t\t\tvOffset[ 1 ] = texcoord.xyxy + resolution.xyxy * vec4( 1.0, 0.0, 0.0, -1.0 ); // WebGL port note: Changed sign in W component\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\n\t\t\tSMAANeighborhoodBlendingVS( vUv );\n\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tuniform sampler2D tDiffuse;\n\t\tuniform sampler2D tColor;\n\t\tuniform vec2 resolution;\n\n\t\tvarying vec2 vUv;\n\t\tvarying vec4 vOffset[ 2 ];\n\n\t\tvec4 SMAANeighborhoodBlendingPS( vec2 texcoord, vec4 offset[ 2 ], sampler2D colorTex, sampler2D blendTex ) {\n\t\t\t// Fetch the blending weights for current pixel:\n\t\t\tvec4 a;\n\t\t\ta.xz = texture2D( blendTex, texcoord ).xz;\n\t\t\ta.y = texture2D( blendTex, offset[ 1 ].zw ).g;\n\t\t\ta.w = texture2D( blendTex, offset[ 1 ].xy ).a;\n\n\t\t\t// Is there any blending weight with a value greater than 0.0?\n\t\t\tif ( dot(a, vec4( 1.0, 1.0, 1.0, 1.0 )) < 1e-5 ) {\n\t\t\t\treturn texture2D( colorTex, texcoord, 0.0 );\n\t\t\t} else {\n\t\t\t\t// Up to 4 lines can be crossing a pixel (one through each edge). We\n\t\t\t\t// favor blending by choosing the line with the maximum weight for each\n\t\t\t\t// direction:\n\t\t\t\tvec2 offset;\n\t\t\t\toffset.x = a.a > a.b ? a.a : -a.b; // left vs. right\n\t\t\t\toffset.y = a.g > a.r ? -a.g : a.r; // top vs. bottom // WebGL port note: Changed signs\n\n\t\t\t\t// Then we go in the direction that has the maximum weight:\n\t\t\t\tif ( abs( offset.x ) > abs( offset.y )) { // horizontal vs. vertical\n\t\t\t\t\toffset.y = 0.0;\n\t\t\t\t} else {\n\t\t\t\t\toffset.x = 0.0;\n\t\t\t\t}\n\n\t\t\t\t// Fetch the opposite color and lerp by hand:\n\t\t\t\tvec4 C = texture2D( colorTex, texcoord, 0.0 );\n\t\t\t\ttexcoord += sign( offset ) * resolution;\n\t\t\t\tvec4 Cop = texture2D( colorTex, texcoord, 0.0 );\n\t\t\t\tfloat s = abs( offset.x ) > abs( offset.y ) ? abs( offset.x ) : abs( offset.y );\n\n\t\t\t\t// WebGL port note: Added gamma correction\n\t\t\t\tC.xyz = pow(C.xyz, vec3(2.2));\n\t\t\t\tCop.xyz = pow(Cop.xyz, vec3(2.2));\n\t\t\t\tvec4 mixed = mix(C, Cop, s);\n\t\t\t\tmixed.xyz = pow(mixed.xyz, vec3(1.0 / 2.2));\n\n\t\t\t\treturn mixed;\n\t\t\t}\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tgl_FragColor = SMAANeighborhoodBlendingPS( vUv, vOffset, tColor, tDiffuse );\n\n\t\t}`\n\n};\n\nexport { SMAAEdgesShader, SMAAWeightsShader, SMAABlendShader };\n","import {\n\tLinearFilter,\n\tNearestFilter,\n\tShaderMaterial,\n\tTexture,\n\tUniformsUtils,\n\tWebGLRenderTarget\n} from 'three';\nimport { Pass, FullScreenQuad } from 'three/examples/jsm/postprocessing/Pass.js';\nimport { SMAAEdgesShader } from 'three/examples/jsm/shaders/SMAAShader.js';\nimport { SMAAWeightsShader } from 'three/examples/jsm/shaders/SMAAShader.js';\nimport { SMAABlendShader } from 'three/examples/jsm/shaders/SMAAShader.js';\n\nclass SMAAPass extends Pass {\n\n\tconstructor( width, height ) {\n\n\t\tsuper();\n\n\t\t// render targets\n\n\t\tthis.edgesRT = new WebGLRenderTarget( width, height, {\n\t\t\tdepthBuffer: false\n\t\t} );\n\t\tthis.edgesRT.texture.name = 'SMAAPass.edges';\n\n\t\tthis.weightsRT = new WebGLRenderTarget( width, height, {\n\t\t\tdepthBuffer: false\n\t\t} );\n\t\tthis.weightsRT.texture.name = 'SMAAPass.weights';\n\n\t\t// textures\n\t\tconst scope = this;\n\n\t\tconst areaTextureImage = new Image();\n\t\tareaTextureImage.crossOrigin = \"Anonymous\";\n\t\tareaTextureImage.src = this.getAreaTexture();\n\t\tareaTextureImage.onload = function () {\n\n\t\t\t// assigning data to HTMLImageElement.src is asynchronous (see #15162)\n\t\t\tscope.areaTexture.needsUpdate = true;\n\n\t\t};\n\n\t\tthis.areaTexture = new Texture();\n\t\tthis.areaTexture.name = 'SMAAPass.area';\n\t\tthis.areaTexture.image = areaTextureImage;\n\t\tthis.areaTexture.minFilter = LinearFilter;\n\t\tthis.areaTexture.generateMipmaps = false;\n\t\tthis.areaTexture.flipY = false;\n\n\t\tconst searchTextureImage = new Image();\n\t\tsearchTextureImage.crossOrigin = \"Anonymous\";\n\t\tsearchTextureImage.src = this.getSearchTexture();\n\t\tsearchTextureImage.onload = function () {\n\n\t\t\t// assigning data to HTMLImageElement.src is asynchronous (see #15162)\n\t\t\tscope.searchTexture.needsUpdate = true;\n\n\t\t};\n\n\t\tthis.searchTexture = new Texture();\n\t\tthis.searchTexture.name = 'SMAAPass.search';\n\t\tthis.searchTexture.image = searchTextureImage;\n\t\tthis.searchTexture.magFilter = NearestFilter;\n\t\tthis.searchTexture.minFilter = NearestFilter;\n\t\tthis.searchTexture.generateMipmaps = false;\n\t\tthis.searchTexture.flipY = false;\n\n\t\t// materials - pass 1\n\n\t\tif ( SMAAEdgesShader === undefined ) {\n\n\t\t\tconsole.error( 'THREE.SMAAPass relies on SMAAShader' );\n\n\t\t}\n\n\t\tthis.uniformsEdges = UniformsUtils.clone( SMAAEdgesShader.uniforms );\n\n\t\tthis.uniformsEdges[ 'resolution' ].value.set( 1 / width, 1 / height );\n\n\t\tthis.materialEdges = new ShaderMaterial( {\n\t\t\tdefines: Object.assign( {}, SMAAEdgesShader.defines ),\n\t\t\tuniforms: this.uniformsEdges,\n\t\t\tvertexShader: SMAAEdgesShader.vertexShader,\n\t\t\tfragmentShader: SMAAEdgesShader.fragmentShader\n\t\t} );\n\n\t\t// materials - pass 2\n\n\t\tthis.uniformsWeights = UniformsUtils.clone( SMAAWeightsShader.uniforms );\n\n\t\tthis.uniformsWeights[ 'resolution' ].value.set( 1 / width, 1 / height );\n\t\tthis.uniformsWeights[ 'tDiffuse' ].value = this.edgesRT.texture;\n\t\tthis.uniformsWeights[ 'tArea' ].value = this.areaTexture;\n\t\tthis.uniformsWeights[ 'tSearch' ].value = this.searchTexture;\n\n\t\tthis.materialWeights = new ShaderMaterial( {\n\t\t\tdefines: Object.assign( {}, SMAAWeightsShader.defines ),\n\t\t\tuniforms: this.uniformsWeights,\n\t\t\tvertexShader: SMAAWeightsShader.vertexShader,\n\t\t\tfragmentShader: SMAAWeightsShader.fragmentShader\n\t\t} );\n\n\t\t// materials - pass 3\n\n\t\tthis.uniformsBlend = UniformsUtils.clone( SMAABlendShader.uniforms );\n\n\t\tthis.uniformsBlend[ 'resolution' ].value.set( 1 / width, 1 / height );\n\t\tthis.uniformsBlend[ 'tDiffuse' ].value = this.weightsRT.texture;\n\n\t\tthis.materialBlend = new ShaderMaterial( {\n\t\t\tuniforms: this.uniformsBlend,\n\t\t\tvertexShader: SMAABlendShader.vertexShader,\n\t\t\tfragmentShader: SMAABlendShader.fragmentShader\n\t\t} );\n\n\t\tthis.needsSwap = false;\n\n\t\tthis.fsQuad = new FullScreenQuad( null );\n\n\t}\n\n\trender( renderer, writeBuffer, readBuffer/*, deltaTime, maskActive*/ ) {\n\n\t\t// pass 1\n\n\t\tthis.uniformsEdges[ 'tDiffuse' ].value = readBuffer.texture;\n\n\t\tthis.fsQuad.material = this.materialEdges;\n\n\t\trenderer.setRenderTarget( this.edgesRT );\n\t\tif ( this.clear ) renderer.clear();\n\t\tthis.fsQuad.render( renderer );\n\n\t\t// pass 2\n\n\t\tthis.fsQuad.material = this.materialWeights;\n\n\t\trenderer.setRenderTarget( this.weightsRT );\n\t\tif ( this.clear ) renderer.clear();\n\t\tthis.fsQuad.render( renderer );\n\n\t\t// pass 3\n\n\t\tthis.uniformsBlend[ 'tColor' ].value = readBuffer.texture;\n\n\t\tthis.fsQuad.material = this.materialBlend;\n\n\t\tif ( this.renderToScreen ) {\n\n\t\t\trenderer.setRenderTarget( null );\n\t\t\tthis.fsQuad.render( renderer );\n\n\t\t} else {\n\n\t\t\trenderer.setRenderTarget( writeBuffer );\n\t\t\tif ( this.clear ) renderer.clear();\n\t\t\tthis.fsQuad.render( renderer );\n\n\t\t}\n\n\t}\n\n\tsetSize( width, height ) {\n\n\t\tthis.edgesRT.setSize( width, height );\n\t\tthis.weightsRT.setSize( width, height );\n\n\t\tthis.materialEdges.uniforms[ 'resolution' ].value.set( 1 / width, 1 / height );\n\t\tthis.materialWeights.uniforms[ 'resolution' ].value.set( 1 / width, 1 / height );\n\t\tthis.materialBlend.uniforms[ 'resolution' ].value.set( 1 / width, 1 / height );\n\n\t}\n\n\tgetAreaTexture() {\n\n\t\treturn 'data:image/png;base64,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';\n\n\t}\n\n\tgetSearchTexture() {\n\n\t\treturn 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEIAAAAhCAAAAABIXyLAAAAAOElEQVRIx2NgGAWjYBSMglEwEICREYRgFBZBqDCSLA2MGPUIVQETE9iNUAqLR5gIeoQKRgwXjwAAGn4AtaFeYLEAAAAASUVORK5CYII=';\n\n\t}\n\n dispose(){\n this.edgesRT.dispose();\n this.weightsRT.dispose();\n }\n\n}\n\nexport { SMAAPass };\n","/**\n * Gamma Correction Shader\n * http://en.wikipedia.org/wiki/gamma_correction\n */\n\nconst GammaCorrectionShader = {\n\n\tuniforms: {\n\n\t\t'tDiffuse': { value: null }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tuniform sampler2D tDiffuse;\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvec4 tex = texture2D( tDiffuse, vUv );\n\n\t\t\tgl_FragColor = LinearTosRGB( tex );\n\n\t\t}`\n\n};\n\nexport { GammaCorrectionShader };\n","import {\n\tColor\n} from 'three';\n\n/**\n * Luminosity\n * http://en.wikipedia.org/wiki/Luminosity\n */\n\nconst LuminosityHighPassShader = {\n\n\tshaderID: 'luminosityHighPass',\n\n\tuniforms: {\n\n\t\t'tDiffuse': { value: null },\n\t\t'luminosityThreshold': { value: 1.0 },\n\t\t'smoothWidth': { value: 1.0 },\n\t\t'defaultColor': { value: new Color( 0x000000 ) },\n\t\t'defaultOpacity': { value: 0.0 }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tuniform sampler2D tDiffuse;\n\t\tuniform vec3 defaultColor;\n\t\tuniform float defaultOpacity;\n\t\tuniform float luminosityThreshold;\n\t\tuniform float smoothWidth;\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvec4 texel = texture2D( tDiffuse, vUv );\n\n\t\t\tvec3 luma = vec3( 0.299, 0.587, 0.114 );\n\n\t\t\tfloat v = dot( texel.xyz, luma );\n\n\t\t\tvec4 outputColor = vec4( defaultColor.rgb, defaultOpacity );\n\n\t\t\tfloat alpha = smoothstep( luminosityThreshold, luminosityThreshold + smoothWidth, v );\n\n\t\t\tgl_FragColor = mix( outputColor, texel, alpha );\n\n\t\t}`\n\n};\n\nexport { LuminosityHighPassShader };\n","import {\n\tAdditiveBlending,\n\tColor,\n\tFloatType,\n\tLinearFilter,\n\tMeshBasicMaterial,\n\tRGBAFormat,\n\tShaderMaterial,\n\tUniformsUtils,\n\tVector2,\n\tVector3,\n\tWebGLMultisampleRenderTarget,\n\tWebGLRenderTarget\n} from 'three';\nimport { Pass, FullScreenQuad } from 'three/examples/jsm/postprocessing/Pass.js';\nimport { CopyShader } from 'three/examples/jsm/shaders/CopyShader.js';\nimport { LuminosityHighPassShader } from 'three/examples/jsm/shaders/LuminosityHighPassShader.js';\n\n/**\n * UnrealBloomPass is inspired by the bloom pass of Unreal Engine. It creates a\n * mip map chain of bloom textures and blurs them with different radii. Because\n * of the weighted combination of mips, and because larger blurs are done on\n * higher mips, this effect provides good quality and performance.\n *\n * Reference:\n * - https://docs.unrealengine.com/latest/INT/Engine/Rendering/PostProcessEffects/Bloom/\n */\nclass TransparentUnrealBloomPass extends Pass {\n\n\tconstructor( resolution, strength, radius, threshold ) {\n\n\t\tsuper();\n\n\t\tthis.strength = ( strength !== undefined ) ? strength : 1;\n\t\tthis.radius = radius;\n\t\tthis.threshold = threshold;\n\t\tthis.resolution = ( resolution !== undefined ) ? new Vector2( resolution.x, resolution.y ) : new Vector2( 256, 256 );\n\n\t\t// create color only once here, reuse it later inside the render function\n\t\tthis.clearColor = new Color( 0, 0, 0);\n\n\t\t// render targets\n\t\tconst pars = { minFilter: LinearFilter, magFilter: LinearFilter, format: RGBAFormat, type: FloatType, stencilBuffer: false };\n\t\tthis.renderTargetsHorizontal = [];\n\t\tthis.renderTargetsVertical = [];\n\t\tthis.nMips = 5;\n\t\tlet resx = Math.round( this.resolution.x / 2 );\n\t\tlet resy = Math.round( this.resolution.y / 2 );\n\n\t\tthis.renderTargetBright = new WebGLRenderTarget( resx, resy, pars );\n\t\tthis.renderTargetBright.texture.name = 'UnrealBloomPass.bright';\n\t\tthis.renderTargetBright.texture.generateMipmaps = false;\n\n\t\tfor ( let i = 0; i < this.nMips; i ++ ) {\n\n\t\t\tconst renderTargetHorizonal = new WebGLRenderTarget( resx, resy, pars );\n\n\t\t\trenderTargetHorizonal.texture.name = 'UnrealBloomPass.h' + i;\n\t\t\trenderTargetHorizonal.texture.generateMipmaps = false;\n\n\t\t\tthis.renderTargetsHorizontal.push( renderTargetHorizonal );\n\n\t\t\tconst renderTargetVertical = new WebGLRenderTarget( resx, resy, pars );\n\n\t\t\trenderTargetVertical.texture.name = 'UnrealBloomPass.v' + i;\n\t\t\trenderTargetVertical.texture.generateMipmaps = false;\n\n\t\t\tthis.renderTargetsVertical.push( renderTargetVertical );\n\n\t\t\tresx = Math.round( resx / 2 );\n\n\t\t\tresy = Math.round( resy / 2 );\n\n\t\t}\n\n\t\t// luminosity high pass material\n\n\t\tif ( LuminosityHighPassShader === undefined )\n\t\t\tconsole.error( 'THREE.UnrealBloomPass relies on LuminosityHighPassShader' );\n\n\t\tconst highPassShader = LuminosityHighPassShader;\n\t\tthis.highPassUniforms = UniformsUtils.clone( highPassShader.uniforms );\n\n\t\tthis.highPassUniforms[ 'luminosityThreshold' ].value = threshold;\n\t\tthis.highPassUniforms[ 'smoothWidth' ].value = 0.01;\n\n\t\tthis.materialHighPassFilter = new ShaderMaterial( {\n\t\t\tuniforms: this.highPassUniforms,\n\t\t\tvertexShader: highPassShader.vertexShader,\n\t\t\tfragmentShader: highPassShader.fragmentShader,\n\t\t\tdefines: {}\n\t\t} );\n\n\t\t// Gaussian Blur Materials\n\t\tthis.separableBlurMaterials = [];\n\t\tconst kernelSizeArray = [ 3, 5, 7, 9, 11 ];\n\t\tresx = Math.round( this.resolution.x / 2 );\n\t\tresy = Math.round( this.resolution.y / 2 );\n\n\t\tfor ( let i = 0; i < this.nMips; i ++ ) {\n\n\t\t\tthis.separableBlurMaterials.push( this.getSeperableBlurMaterial( kernelSizeArray[ i ] ) );\n\n\t\t\tthis.separableBlurMaterials[ i ].uniforms[ 'texSize' ].value = new Vector2( resx, resy );\n\n\t\t\tresx = Math.round( resx / 2 );\n\n\t\t\tresy = Math.round( resy / 2 );\n\n\t\t}\n\n\t\t// Composite material\n\t\tthis.compositeMaterial = this.getCompositeMaterial( this.nMips );\n\t\tthis.compositeMaterial.uniforms[ 'blurTexture1' ].value = this.renderTargetsVertical[ 0 ].texture;\n\t\tthis.compositeMaterial.uniforms[ 'blurTexture2' ].value = this.renderTargetsVertical[ 1 ].texture;\n\t\tthis.compositeMaterial.uniforms[ 'blurTexture3' ].value = this.renderTargetsVertical[ 2 ].texture;\n\t\tthis.compositeMaterial.uniforms[ 'blurTexture4' ].value = this.renderTargetsVertical[ 3 ].texture;\n\t\tthis.compositeMaterial.uniforms[ 'blurTexture5' ].value = this.renderTargetsVertical[ 4 ].texture;\n\t\tthis.compositeMaterial.uniforms[ 'bloomStrength' ].value = strength;\n\t\tthis.compositeMaterial.uniforms[ 'bloomRadius' ].value = 0.1;\n\t\tthis.compositeMaterial.needsUpdate = true;\n\n\t\tconst bloomFactors = [ 1.0, 0.8, 0.6, 0.4, 0.2 ];\n\t\tthis.compositeMaterial.uniforms[ 'bloomFactors' ].value = bloomFactors;\n\t\tthis.bloomTintColors = [ new Vector3( 1, 1, 1 ), new Vector3( 1, 1, 1 ), new Vector3( 1, 1, 1 ), new Vector3( 1, 1, 1 ), new Vector3( 1, 1, 1 ) ];\n\t\tthis.compositeMaterial.uniforms[ 'bloomTintColors' ].value = this.bloomTintColors;\n\n\t\t// copy material\n\t\tif ( CopyShader === undefined ) {\n\n\t\t\tconsole.error( 'THREE.UnrealBloomPass relies on CopyShader' );\n\n\t\t}\n\n\t\tconst copyShader = CopyShader;\n\n\t\tthis.copyUniforms = UniformsUtils.clone( copyShader.uniforms );\n\t\tthis.copyUniforms[ 'opacity' ].value = 1.0;\n\n\t\tthis.materialCopy = new ShaderMaterial( {\n\t\t\tuniforms: this.copyUniforms,\n\t\t\tvertexShader: copyShader.vertexShader,\n\t\t\tfragmentShader: copyShader.fragmentShader,\n\t\t\tblending: AdditiveBlending,\n\t\t\tdepthTest: false,\n\t\t\tdepthWrite: false,\n\t\t\ttransparent: true\n\t\t} );\n\n\t\tthis.enabled = true;\n\t\tthis.needsSwap = false;\n\n\t\tthis._oldClearColor = new Color();\n\t\tthis.oldClearAlpha = 1;\n\n\t\tthis.basic = new MeshBasicMaterial();\n\n\t\tthis.fsQuad = new FullScreenQuad( null );\n\n\t}\n\n\tdispose() {\n\n\t\tfor ( let i = 0; i < this.renderTargetsHorizontal.length; i ++ ) {\n\n\t\t\tthis.renderTargetsHorizontal[ i ].dispose();\n\n\t\t}\n\n\t\tfor ( let i = 0; i < this.renderTargetsVertical.length; i ++ ) {\n\n\t\t\tthis.renderTargetsVertical[ i ].dispose();\n\n\t\t}\n\n\t\tthis.renderTargetBright.dispose();\n\n\t}\n\n\tsetSize( width, height ) {\n\n\t\tlet resx = Math.round( width / 2 );\n\t\tlet resy = Math.round( height / 2 );\n\n\t\tthis.renderTargetBright.setSize( resx, resy );\n\n\t\tfor ( let i = 0; i < this.nMips; i ++ ) {\n\n\t\t\tthis.renderTargetsHorizontal[ i ].setSize( resx, resy );\n\t\t\tthis.renderTargetsVertical[ i ].setSize( resx, resy );\n\n\t\t\tthis.separableBlurMaterials[ i ].uniforms[ 'texSize' ].value = new Vector2( resx, resy );\n\n\t\t\tresx = Math.round( resx / 2 );\n\t\t\tresy = Math.round( resy / 2 );\n\n\t\t}\n\n\t}\n\n\trender( renderer, writeBuffer, readBuffer, deltaTime, maskActive ) {\n\t\trenderer.getClearColor( this._oldClearColor );\n\t\tthis.oldClearAlpha = renderer.getClearAlpha();\n\t\tconst oldAutoClear = renderer.autoClear;\n\t\trenderer.autoClear = false;\n\n\t\trenderer.setClearColor( this.clearColor, 0 );\n\n\t\tif ( maskActive ) renderer.state.buffers.stencil.setTest( false );\n\n\t\t// Render input to screen\n\n\t\tif ( this.renderToScreen ) {\n\n\t\t\tthis.fsQuad.material = this.basic;\n\t\t\tthis.basic.map = readBuffer.texture;\n\n\t\t\trenderer.setRenderTarget( null );\n\t\t\trenderer.clear();\n\t\t\tthis.fsQuad.render( renderer );\n\n\t\t}\n\n\t\t// 1. Extract Bright Areas\n\n\t\tthis.highPassUniforms[ 'tDiffuse' ].value = readBuffer.texture;\n\t\tthis.highPassUniforms[ 'luminosityThreshold' ].value = this.threshold;\n\t\tthis.fsQuad.material = this.materialHighPassFilter;\n\n\t\trenderer.setRenderTarget( this.renderTargetBright );\n\t\trenderer.clear();\n\t\tthis.fsQuad.render( renderer );\n\n\t\t// 2. Blur All the mips progressively\n\n\t\tlet inputRenderTarget = this.renderTargetBright;\n\n\t\tfor ( let i = 0; i < this.nMips; i ++ ) {\n\n\t\t\tthis.fsQuad.material = this.separableBlurMaterials[ i ];\n\n\t\t\tthis.separableBlurMaterials[ i ].uniforms[ 'colorTexture' ].value = inputRenderTarget.texture;\n\t\t\tthis.separableBlurMaterials[ i ].uniforms[ 'direction' ].value = TransparentUnrealBloomPass.BlurDirectionX;\n\t\t\trenderer.setRenderTarget( this.renderTargetsHorizontal[ i ] );\n\t\t\trenderer.clear();\n\t\t\tthis.fsQuad.render( renderer );\n\n\t\t\tthis.separableBlurMaterials[ i ].uniforms[ 'colorTexture' ].value = this.renderTargetsHorizontal[ i ].texture;\n\t\t\tthis.separableBlurMaterials[ i ].uniforms[ 'direction' ].value = TransparentUnrealBloomPass.BlurDirectionY;\n\t\t\trenderer.setRenderTarget( this.renderTargetsVertical[ i ] );\n\t\t\trenderer.clear();\n\t\t\tthis.fsQuad.render( renderer );\n\n\t\t\tinputRenderTarget = this.renderTargetsVertical[ i ];\n\n\t\t}\n\n\t\t// Composite All the mips\n\n\t\tthis.fsQuad.material = this.compositeMaterial;\n\t\tthis.compositeMaterial.uniforms[ 'bloomStrength' ].value = this.strength;\n\t\tthis.compositeMaterial.uniforms[ 'bloomRadius' ].value = this.radius;\n\t\tthis.compositeMaterial.uniforms[ 'bloomTintColors' ].value = this.bloomTintColors;\n\n\t\trenderer.setRenderTarget( this.renderTargetsHorizontal[ 0 ] );\n\t\trenderer.clear();\n\t\tthis.fsQuad.render( renderer );\n\n\t\t// Blend it additively over the input texture\n\n\t\tthis.fsQuad.material = this.materialCopy;\n\t\tthis.copyUniforms[ 'tDiffuse' ].value = this.renderTargetsHorizontal[ 0 ].texture;\n\n\t\tif ( maskActive ) renderer.state.buffers.stencil.setTest( true );\n\n\t\tif ( this.renderToScreen ) {\n\n\t\t\trenderer.setRenderTarget( null );\n\t\t\tthis.fsQuad.render( renderer );\n\n\t\t} else {\n\n\t\t\trenderer.setRenderTarget( readBuffer );\n\t\t\tthis.fsQuad.render( renderer );\n\n\t\t}\n\n\t\t// Restore renderer settings\n\n\t\trenderer.setClearColor( this._oldClearColor, this.oldClearAlpha );\n\t\trenderer.autoClear = oldAutoClear;\n\n\t}\n\n\tgetSeperableBlurMaterial( kernelRadius ) {\n\n\t\treturn new ShaderMaterial( {\n\n\t\t\tdefines: {\n\t\t\t\t'KERNEL_RADIUS': kernelRadius,\n\t\t\t\t'SIGMA': kernelRadius\n\t\t\t},\n\n\t\t\tuniforms: {\n\t\t\t\t'colorTexture': { value: null },\n\t\t\t\t'texSize': { value: new Vector2( 0.5, 0.5 ) },\n\t\t\t\t'direction': { value: new Vector2( 0.5, 0.5 ) }\n\t\t\t},\n\n\t\t\tvertexShader:\n\t\t\t\t`varying vec2 vUv;\n\t\t\t\tvoid main() {\n\t\t\t\t\tvUv = uv;\n\t\t\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t\t\t}`,\n\n\t\t\tfragmentShader:\n\t\t\t\t`#include \n\t\t\t\tvarying vec2 vUv;\n\t\t\t\tuniform sampler2D colorTexture;\n\t\t\t\tuniform vec2 texSize;\n\t\t\t\tuniform vec2 direction;\n\n\t\t\t\tfloat gaussianPdf(in float x, in float sigma) {\n\t\t\t\t\treturn 0.39894 * exp( -0.5 * x * x/( sigma * sigma))/sigma;\n\t\t\t\t}\n\t\t\t\tvoid main() {\n\t\t\t\t\tvec2 invSize = 1.0 / texSize;\n\t\t\t\t\tfloat fSigma = float(SIGMA);\n\t\t\t\t\tfloat weightSum = gaussianPdf(0.0, fSigma);\n float alphaSum = 0.0;\n\t\t\t\t\tvec3 diffuseSum = texture2D( colorTexture, vUv).rgb * weightSum;\n\t\t\t\t\tfor( int i = 1; i < KERNEL_RADIUS; i ++ ) {\n\t\t\t\t\t\tfloat x = float(i);\n\t\t\t\t\t\tfloat w = gaussianPdf(x, fSigma);\n\t\t\t\t\t\tvec2 uvOffset = direction * invSize * x;\n\t\t\t\t\t\tvec4 sample1 = texture2D( colorTexture, vUv + uvOffset);\n\t\t\t\t\t\tvec4 sample2 = texture2D( colorTexture, vUv - uvOffset);\n\t\t\t\t\t\tdiffuseSum += (sample1.rgb + sample2.rgb) * w;\n alphaSum += (sample1.a + sample2.a) * w;\n\t\t\t\t\t\tweightSum += 2.0 * w;\n\t\t\t\t\t}\n\t\t\t\t\tgl_FragColor = vec4(diffuseSum/weightSum, alphaSum/weightSum);\n\t\t\t\t}`\n\t\t} );\n\n\t}\n\n\tgetCompositeMaterial( nMips ) {\n\n\t\treturn new ShaderMaterial( {\n\n\t\t\tdefines: {\n\t\t\t\t'NUM_MIPS': nMips\n\t\t\t},\n\n\t\t\tuniforms: {\n\t\t\t\t'blurTexture1': { value: null },\n\t\t\t\t'blurTexture2': { value: null },\n\t\t\t\t'blurTexture3': { value: null },\n\t\t\t\t'blurTexture4': { value: null },\n\t\t\t\t'blurTexture5': { value: null },\n\t\t\t\t'dirtTexture': { value: null },\n\t\t\t\t'bloomStrength': { value: 1.0 },\n\t\t\t\t'bloomFactors': { value: null },\n\t\t\t\t'bloomTintColors': { value: null },\n\t\t\t\t'bloomRadius': { value: 0.0 }\n\t\t\t},\n\n\t\t\tvertexShader:\n\t\t\t\t`varying vec2 vUv;\n\t\t\t\tvoid main() {\n\t\t\t\t\tvUv = uv;\n\t\t\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t\t\t}`,\n\n\t\t\tfragmentShader:\n\t\t\t\t`varying vec2 vUv;\n\t\t\t\tuniform sampler2D blurTexture1;\n\t\t\t\tuniform sampler2D blurTexture2;\n\t\t\t\tuniform sampler2D blurTexture3;\n\t\t\t\tuniform sampler2D blurTexture4;\n\t\t\t\tuniform sampler2D blurTexture5;\n\t\t\t\tuniform sampler2D dirtTexture;\n\t\t\t\tuniform float bloomStrength;\n\t\t\t\tuniform float bloomRadius;\n\t\t\t\tuniform float bloomFactors[NUM_MIPS];\n\t\t\t\tuniform vec3 bloomTintColors[NUM_MIPS];\n\n\t\t\t\tfloat lerpBloomFactor(const in float factor) {\n\t\t\t\t\tfloat mirrorFactor = 1.2 - factor;\n\t\t\t\t\treturn mix(factor, mirrorFactor, bloomRadius);\n\t\t\t\t}\n\n\t\t\t\tvoid main() {\n\t\t\t\t\tgl_FragColor = bloomStrength * ( lerpBloomFactor(bloomFactors[0]) * vec4(bloomTintColors[0], 1.0) * texture2D(blurTexture1, vUv) +\n\t\t\t\t\t\tlerpBloomFactor(bloomFactors[1]) * vec4(bloomTintColors[1], 1.0) * texture2D(blurTexture2, vUv) +\n\t\t\t\t\t\tlerpBloomFactor(bloomFactors[2]) * vec4(bloomTintColors[2], 1.0) * texture2D(blurTexture3, vUv) +\n\t\t\t\t\t\tlerpBloomFactor(bloomFactors[3]) * vec4(bloomTintColors[3], 1.0) * texture2D(blurTexture4, vUv) +\n\t\t\t\t\t\tlerpBloomFactor(bloomFactors[4]) * vec4(bloomTintColors[4], 1.0) * texture2D(blurTexture5, vUv) );\n\t\t\t\t}`\n\t\t} );\n\n\t}\n\n}\n\nTransparentUnrealBloomPass.BlurDirectionX = new Vector2( 1.0, 0.0 );\nTransparentUnrealBloomPass.BlurDirectionY = new Vector2( 0.0, 1.0 );\n\nexport { TransparentUnrealBloomPass };\n","import { DICE_MODELS } from './DiceModels.js';\nimport { DiceSFXManager } from './DiceSFXManager.js';\nimport { RendererStats } from './libs/threex.rendererstats.js';\n//import {GLTFExporter} from 'three/examples/jsm/loaders/exporters/GLTFExporter.js';\nimport { RGBELoader } from 'three/examples/jsm/loaders/RGBELoader.js';\nimport { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer.js';\nimport { RenderPass } from 'three/examples/jsm/postprocessing/RenderPass.js';\nimport { ShaderPass } from 'three/examples/jsm/postprocessing/ShaderPass.js';\nimport { SMAAPass } from './libs/SMAAPass.js';\nimport { GammaCorrectionShader } from 'three/examples/jsm/shaders/GammaCorrectionShader.js';\nimport { TransparentUnrealBloomPass } from './libs/TransparentUnrealBloomPass.js';\n\nimport * as THREE from 'three';\n\n\nexport class DiceBox {\n\n\tconstructor(element_container, dice_factory, config) {\n\t\t//private variables\n\t\tthis.known_types = ['d4', 'd6', 'd8', 'd10', 'd12', 'd14', 'd16', 'd20', 'd24', 'd30', 'd100'];\n\t\tthis.container = element_container;\n\t\tthis.dimensions = config.dimensions;\n\t\tthis.dicefactory = dice_factory;\n\t\tthis.config = config;\n\t\tthis.speed = 1;\n\t\tthis.isVisible = false;\n\t\tthis.last_time = 0;\n\t\tthis.running = false;\n\t\tthis.allowInteractivity = false;\n\t\tthis.raycaster = new THREE.Raycaster();\n\t\tthis.blackColor = new THREE.Color(0, 0, 0);\n\t\tthis.nbIterationsBetweenRolls = 15;\n\n\t\tthis.display = {\n\t\t\tcurrentWidth: null,\n\t\t\tcurrentHeight: null,\n\t\t\tcontainerWidth: null,\n\t\t\tcontainerHeight: null,\n\t\t\taspect: null,\n\t\t\tscale: null\n\t\t};\n\n\t\tthis.mouse = {\n\t\t\tpos: new THREE.Vector2(),\n\t\t\tstartDrag: undefined,\n\t\t\tstartDragTime: undefined,\n\t\t\tconstraintDown: false,\n\t\t\tconstraint: null\n\t\t};\n\n\t\tthis.cameraHeight = {\n\t\t\tmax: null,\n\t\t\tclose: null,\n\t\t\tmedium: null,\n\t\t\tfar: null\n\t\t};\n\n\n\t\tthis.clock = new THREE.Clock();\n\t\tthis.world_sim = new CANNON.World();\n\t\tthis.dice_body_material = new CANNON.Material();\n\t\tthis.desk_body_material = new CANNON.Material();\n\t\tthis.barrier_body_material = new CANNON.Material();\n\t\tthis.sounds_table = {};\n\t\tthis.sounds_dice = {};\n\t\tthis.sounds_coins = [];\n\t\tthis.lastSoundType = '';\n\t\tthis.lastSoundStep = 0;\n\t\tthis.lastSound = 0;\n\t\tthis.iteration;\n\t\tthis.renderer;\n\t\tthis.barrier;\n\t\tthis.camera;\n\t\tthis.light;\n\t\tthis.light_amb;\n\t\tthis.desk;\n\t\tthis.pane;\n\n\t\t//public variables\n\t\tthis.public_interface = {};\n\t\tthis.diceList = []; //'private' variable\n\t\tthis.deadDiceList = [];\n\t\tthis.framerate = (1 / 60);\n\t\tthis.sounds = true;\n\t\tthis.volume = 1;\n\t\tthis.soundDelay = 1; // time between sound effects in worldstep\n\t\tthis.soundsSurface = \"felt\";\n\t\tthis.animstate = '';\n\t\tthis.throwingForce = \"medium\";\n\t\tthis.immersiveDarkness = true;\n\n\t\tthis.selector = {\n\t\t\tanimate: true,\n\t\t\trotate: true,\n\t\t\tintersected: null,\n\t\t\tdice: []\n\t\t};\n\t\tthis.showExtraDice = false;\n\t\tthis.muteSoundSecretRolls = false;\n\n\t\tthis.colors = {\n\t\t\tambient: 0xffffff,\n\t\t\tspotlight: 0x333333,\n\t\t\tground: 0x242644\n\t\t};\n\n\t\tthis.rethrowFunctions = {};\n\t\tthis.afterThrowFunctions = {};\n\n\t}\n\n\tpreloadSounds() {\n\t\t//Surfaces\n\t\tfetch(`modules/dice-so-nice/sounds/surfaces.json`).then(res => {\n\t\t\tres.json().then(json => {\n\t\t\t\tAudioHelper.preloadSound(`modules/dice-so-nice/sounds/${json.resources[0]}`).then(src => this.sounds_table.source = src);\n\t\t\t\tObject.entries(json.spritemap).forEach(sound => {\n\t\t\t\t\tlet type = sound[0].match(/surface\\_([a-z\\_]*)/)[1];\n\t\t\t\t\tif (!this.sounds_table[type])\n\t\t\t\t\t\tthis.sounds_table[type] = [];\n\t\t\t\t\tthis.sounds_table[type].push(sound[1]);\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\n\t\t//Hits\n\t\tfetch(`modules/dice-so-nice/sounds/dicehit.json`).then(res => {\n\t\t\tres.json().then(json => {\n\t\t\t\tthis.sounds_dice.source = AudioHelper.preloadSound(`modules/dice-so-nice/sounds/${json.resources[0]}`).then(src => this.sounds_dice.source = src);\n\t\t\t\tObject.entries(json.spritemap).forEach(sound => {\n\t\t\t\t\tlet type = sound[0].match(/dicehit\\_([a-z\\_]*)/)[1];\n\t\t\t\t\tif (!this.sounds_dice[type])\n\t\t\t\t\t\tthis.sounds_dice[type] = [];\n\t\t\t\t\tthis.sounds_dice[type].push(sound[1]);\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t}\n\n\tplayAudioSprite(source, sprite, selfVolume) {\n\t\tif (!source || !source.context)\n\t\t\treturn false;\n\t\tlet gainNode = source.context.createGain();\n\t\tgainNode.gain.value = selfVolume * this.volume * game.settings.get(\"core\", \"globalInterfaceVolume\");\n\t\tconst startTime = sprite.start;\n\t\tconst duration = sprite.end - sprite.start;\n\t\tconst sampleSource = source.context.createBufferSource();\n\t\tsampleSource.buffer = source.container.buffer;\n\t\tsampleSource.connect(gainNode).connect(source.context.destination);\n\t\tsampleSource.start(source.context.currentTime, startTime, duration);\n\t}\n\n\tinitialize() {\n\t\treturn new Promise(async resolve => {\n\t\t\tgame.audio.pending.push(this.preloadSounds.bind(this));\n\n\t\t\tawait this.dicefactory.preloadPresets();\n\n\t\t\tthis.sounds = this.config.sounds == '1';\n\t\t\tthis.volume = this.config.soundsVolume;\n\t\t\tthis.soundsSurface = this.config.soundsSurface;\n\t\t\tthis.showExtraDice = this.config.showExtraDice;\n\t\t\tthis.muteSoundSecretRolls = this.config.muteSoundSecretRolls;\n\n\t\t\tthis.allowInteractivity = this.config.boxType == \"board\" && game.settings.get(\"dice-so-nice\", \"allowInteractivity\");\n\n\t\t\tthis.dicefactory.setQualitySettings(this.config);\n\t\t\tlet globalAnimationSpeed = game.settings.get(\"dice-so-nice\", \"globalAnimationSpeed\");\n\t\t\tif (globalAnimationSpeed === \"0\")\n\t\t\t\tthis.speed = this.config.speed;\n\t\t\telse\n\t\t\t\tthis.speed = parseInt(globalAnimationSpeed, 10);\n\t\t\tthis.throwingForce = this.config.throwingForce;\n\t\t\tthis.immersiveDarkness = this.config.immersiveDarkness;\n\t\t\tthis.scene = new THREE.Scene();\n\t\t\tif (game.dice3d.dice3dRenderers[this.config.boxType] != null) {\n\t\t\t\tthis.renderer = game.dice3d.dice3dRenderers[this.config.boxType];\n\t\t\t\tthis.scene.environment = this.renderer.scopedTextureCache.textureCube;\n\t\t\t\tthis.scene.traverse(object => {\n\t\t\t\t\tif (object.type === 'Mesh') object.material.needsUpdate = true;\n\t\t\t\t});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.renderer = new THREE.WebGLRenderer({ antialias: false, alpha: true, powerPreference: \"high-performance\" });\n\t\t\t\tif (this.dicefactory.useHighDPI)\n\t\t\t\t\tthis.renderer.setPixelRatio(window.devicePixelRatio);\n\t\t\t\tif (this.dicefactory.realisticLighting) {\n\t\t\t\t\tthis.renderer.physicallyCorrectLights = true;\n\t\t\t\t\tthis.renderer.toneMapping = THREE.ACESFilmicToneMapping;\n\t\t\t\t\tthis.renderer.toneMappingExposure = 1;\n\t\t\t\t\t//this.renderer.outputEncoding = THREE.sRGBEncoding;\n\t\t\t\t}\n\t\t\t\tawait this.loadContextScopedTextures(this.config.boxType);\n\t\t\t\tthis.dicefactory.initializeMaterials();\n\t\t\t\tgame.dice3d.dice3dRenderers[this.config.boxType] = this.renderer;\n\t\t\t}\n\n\t\t\tif (false && this.config.boxType == \"board\") {\n\t\t\t\tthis.rendererStats = new RendererStats()\n\n\t\t\t\tthis.rendererStats.domElement.style.position = 'absolute';\n\t\t\t\tthis.rendererStats.domElement.style.left = '44px';\n\t\t\t\tthis.rendererStats.domElement.style.bottom = '178px';\n\t\t\t\tthis.rendererStats.domElement.style.transform = 'scale(2)';\n\t\t\t\tdocument.body.appendChild(this.rendererStats.domElement);\n\t\t\t}\n\n\t\t\tthis.container.appendChild(this.renderer.domElement);\n\t\t\tthis.renderer.shadowMap.enabled = this.dicefactory.shadows;\n\t\t\tthis.renderer.shadowMap.type = this.dicefactory.shadowQuality == \"high\" ? THREE.PCFSoftShadowMap : THREE.PCFShadowMap;\n\t\t\tthis.renderer.setClearColor(0x000000, 0.0);\n\n\t\t\tthis.setScene(this.config.dimensions);\n\n\t\t\tthis.world_sim.gravity.set(0, 0, -9.8 * 800);\n\t\t\tthis.world_sim.broadphase = new CANNON.NaiveBroadphase();\n\t\t\tthis.world_sim.solver.iterations = 14;\n\t\t\tthis.world_sim.allowSleep = true;\n\n\t\t\tlet contactMaterial = new CANNON.ContactMaterial(this.desk_body_material, this.dice_body_material, { friction: 0.01, restitution: 0.5 });\n\t\t\tthis.world_sim.addContactMaterial(contactMaterial);\n\t\t\tcontactMaterial = new CANNON.ContactMaterial(this.barrier_body_material, this.dice_body_material, { friction: 0, restitution: 0.95 });\n\t\t\tthis.world_sim.addContactMaterial(contactMaterial);\n\t\t\tcontactMaterial = new CANNON.ContactMaterial(this.dice_body_material, this.dice_body_material, { friction: 0.01, restitution: 0.7 });\n\t\t\tthis.world_sim.addContactMaterial(contactMaterial);\n\t\t\tlet desk = new CANNON.Body({ allowSleep: false, mass: 0, shape: new CANNON.Plane(), material: this.desk_body_material });\n\t\t\tthis.world_sim.addBody(desk);\n\n\t\t\tlet barrier = new CANNON.Body({ allowSleep: false, mass: 0, shape: new CANNON.Plane(), material: this.barrier_body_material });\n\t\t\tbarrier.quaternion.setFromAxisAngle(new CANNON.Vec3(1, 0, 0), Math.PI / 2);\n\t\t\tbarrier.position.set(0, this.display.containerHeight * 0.93, 0);\n\t\t\tthis.world_sim.addBody(barrier);\n\n\t\t\tbarrier = new CANNON.Body({ allowSleep: false, mass: 0, shape: new CANNON.Plane(), material: this.barrier_body_material });\n\t\t\tbarrier.quaternion.setFromAxisAngle(new CANNON.Vec3(1, 0, 0), -Math.PI / 2);\n\t\t\tbarrier.position.set(0, -this.display.containerHeight * 0.93, 0);\n\t\t\tthis.world_sim.addBody(barrier);\n\n\t\t\tbarrier = new CANNON.Body({ allowSleep: false, mass: 0, shape: new CANNON.Plane(), material: this.barrier_body_material });\n\t\t\tbarrier.quaternion.setFromAxisAngle(new CANNON.Vec3(0, 1, 0), -Math.PI / 2);\n\t\t\tbarrier.position.set(this.display.containerWidth * 0.93, 0, 0);\n\t\t\tthis.world_sim.addBody(barrier);\n\n\t\t\tbarrier = new CANNON.Body({ allowSleep: false, mass: 0, shape: new CANNON.Plane(), material: this.barrier_body_material });\n\t\t\tbarrier.quaternion.setFromAxisAngle(new CANNON.Vec3(0, 1, 0), Math.PI / 2);\n\t\t\tbarrier.position.set(-this.display.containerWidth * 0.93, 0, 0);\n\t\t\tthis.world_sim.addBody(barrier);\n\n\t\t\tlet shape = new CANNON.Sphere(0.1);\n\t\t\tthis.jointBody = new CANNON.Body({ mass: 0 });\n\t\t\tthis.jointBody.addShape(shape);\n\t\t\tthis.jointBody.collisionFilterGroup = 0;\n\t\t\tthis.jointBody.collisionFilterMask = 0;\n\t\t\tthis.world_sim.addBody(this.jointBody)\n\n\t\t\t//this.renderer.render(this.scene, this.camera);\n\t\t\tresolve();\n\t\t});\n\t}\n\n\tloadContextScopedTextures(type) {\n\t\treturn new Promise(resolve => {\n\t\t\tthis.renderer.scopedTextureCache = { type: type };\n\t\t\tif (this.dicefactory.realisticLighting) {\n\t\t\t\tlet textureLoader = new THREE.TextureLoader();\n\t\t\t\tthis.renderer.scopedTextureCache.roughnessMap_fingerprint = textureLoader.load('modules/dice-so-nice/textures/roughnessMap_finger.webp');\n\t\t\t\tthis.renderer.scopedTextureCache.roughnessMap_wood = textureLoader.load('modules/dice-so-nice/textures/roughnessMap_wood.webp');\n\t\t\t\tthis.renderer.scopedTextureCache.roughnessMap_metal = textureLoader.load('modules/dice-so-nice/textures/roughnessMap_metal.webp');\n\t\t\t\tthis.renderer.scopedTextureCache.roughnessMap_stone = textureLoader.load('modules/dice-so-nice/textures/roughnessMap_stone.webp');\n\n\t\t\t\tthis.pmremGenerator = new THREE.PMREMGenerator(this.renderer);\n\t\t\t\tthis.pmremGenerator.compileEquirectangularShader();\n\n\t\t\t\tnew RGBELoader()\n\t\t\t\t\t.setDataType(THREE.HalfFloatType)\n\t\t\t\t\t.setPath('modules/dice-so-nice/textures/equirectangular/')\n\t\t\t\t\t.load('footprint_court.hdr', function (texture) {\n\t\t\t\t\t\tthis.renderer.scopedTextureCache.textureCube = this.pmremGenerator.fromEquirectangular(texture).texture;\n\t\t\t\t\t\tthis.renderer.scopedTextureCache.textureCube.encoding = THREE.sRGBEncoding;\n\t\t\t\t\t\tthis.scene.environment = this.renderer.scopedTextureCache.textureCube;\n\t\t\t\t\t\t//this.scene.background = this.renderer.scopedTextureCache.textureCube;\n\t\t\t\t\t\ttexture.dispose();\n\t\t\t\t\t\tthis.pmremGenerator.dispose();\n\t\t\t\t\t\tresolve();\n\n\t\t\t\t\t}.bind(this));\n\t\t\t} else {\n\t\t\t\tlet loader = new THREE.CubeTextureLoader();\n\t\t\t\tloader.setPath('modules/dice-so-nice/textures/cubemap/');\n\n\t\t\t\tthis.renderer.scopedTextureCache.textureCube = loader.load([\n\t\t\t\t\t'px.webp', 'nx.webp',\n\t\t\t\t\t'py.webp', 'ny.webp',\n\t\t\t\t\t'pz.webp', 'nz.webp'\n\t\t\t\t]);\n\t\t\t\tresolve();\n\t\t\t}\n\t\t});\n\t}\n\n\tsetScene(dimensions) {\n\t\tthis.display.currentWidth = this.container.clientWidth > 0 ? this.container.clientWidth : parseInt(this.container.style.width);\n\t\tthis.display.currentHeight = this.container.clientHeight > 0 ? this.container.clientHeight : parseInt(this.container.style.height);\n\n\t\tthis.display.currentWidth /= 2;\n\t\tthis.display.currentHeight /= 2;\n\n\t\tif (dimensions) {\n\t\t\tthis.display.containerWidth = dimensions.w;\n\t\t\tthis.display.containerHeight = dimensions.h;\n\n\t\t\tif (!this.display.currentWidth || !this.display.currentHeight) {\n\t\t\t\tthis.display.currentWidth = dimensions.w / 2;\n\t\t\t\tthis.display.currentHeight = dimensions.h / 2;\n\t\t\t}\n\t\t} else {\n\t\t\tthis.display.containerWidth = this.display.currentWidth;\n\t\t\tthis.display.containerHeight = this.display.currentHeight;\n\t\t}\n\t\n\t\tthis.display.aspect = Math.min(this.display.currentWidth / this.display.containerWidth, this.display.currentHeight / this.display.containerHeight);\n\n\t\tif (this.config.autoscale)\n\t\t\tthis.display.scale = Math.sqrt(this.display.containerWidth * this.display.containerWidth + this.display.containerHeight * this.display.containerHeight) / 13;\n\t\telse\n\t\t\tthis.display.scale = this.config.scale;\n\t\tif (this.config.boxType == \"board\")\n\t\t\tthis.dicefactory.setScale(this.display.scale);\n\t\tthis.renderer.setSize(this.display.currentWidth * 2, this.display.currentHeight * 2);\n\n\t\tthis.cameraHeight.max = this.display.currentHeight / this.display.aspect / Math.tan(10 * Math.PI / 180);\n\n\t\tthis.cameraHeight.medium = this.cameraHeight.max / 1.5;\n\t\tthis.cameraHeight.far = this.cameraHeight.max;\n\t\tthis.cameraHeight.close = this.cameraHeight.max / 2;\n\n\t\tif (this.camera) this.scene.remove(this.camera);\n\t\tthis.camera = new THREE.PerspectiveCamera(20, this.display.currentWidth / this.display.currentHeight, 1, this.cameraHeight.max * 1.3);\n\n\t\tswitch (this.animstate) {\n\t\t\tcase 'selector':\n\t\t\t\tthis.camera.position.z = this.selector.dice.length > 9 ? this.cameraHeight.far : (this.selector.dice.length < 6 ? this.cameraHeight.close : this.cameraHeight.medium);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tthis.camera.position.z = this.cameraHeight.far;\n\t\t}\n\t\tthis.camera.near = 10;\n\t\tthis.camera.lookAt(new THREE.Vector3(0, 0, 0));\n\n\t\tconst maxwidth = Math.max(this.display.containerWidth, this.display.containerHeight);\n\n\t\tif (this.light) this.scene.remove(this.light);\n\t\tif (this.light_amb) this.scene.remove(this.light_amb);\n\n\t\tlet intensity, intensity_amb;\n\t\tif (this.dicefactory.realisticLighting) { //advanced lighting\n\t\t\tintensity = 1.0;\n\t\t\tintensity_amb = 1.0;\n\t\t} else {\n\t\t\tif(this.config.boxType == \"board\") {\n\t\t\t\tintensity = 1.2;\n\t\t\t\tintensity_amb = 2.2;\n\t\t\t} else {\n\t\t\t\tintensity = 1.5;\n\t\t\t\tintensity_amb = 3;\n\t\t\t}\n\t\t}\n\n\t\tthis.light_amb = new THREE.HemisphereLight(this.colors.ambient, this.colors.ground, intensity_amb);\n\t\tthis.scene.add(this.light_amb);\n\n\t\tthis.light = new THREE.DirectionalLight(this.colors.spotlight, intensity);\n\t\tif (this.config.boxType == \"board\")\n\t\t\tthis.light.position.set(-this.display.containerWidth / 10, this.display.containerHeight / 10, maxwidth / 2);\n\t\telse\n\t\t\tthis.light.position.set(0, this.display.containerHeight / 10, maxwidth / 2);\n\t\tthis.light.target.position.set(0, 0, 0);\n\t\tthis.light.distance = 0;\n\t\tthis.light.castShadow = this.dicefactory.shadows;\n\t\tthis.light.shadow.camera.near = maxwidth / 10;\n\t\tthis.light.shadow.camera.far = maxwidth * 5;\n\t\tthis.light.shadow.camera.fov = 50;\n\t\tthis.light.shadow.bias = -0.0001;\n\t\tconst shadowMapSize = this.dicefactory.shadowQuality == \"high\" ? 2048 : 1024;\n\t\tthis.light.shadow.mapSize.width = shadowMapSize;\n\t\tthis.light.shadow.mapSize.height = shadowMapSize;\n\t\tconst d = 1000;\n\t\tthis.light.shadow.camera.left = - d;\n\t\tthis.light.shadow.camera.right = d;\n\t\tthis.light.shadow.camera.top = d;\n\t\tthis.light.shadow.camera.bottom = - d;\n\t\tthis.scene.add(this.light);\n\n\t\tif (this.desk)\n\t\t\tthis.scene.remove(this.desk);\n\n\t\tlet shadowplane = new THREE.ShadowMaterial();\n\t\tshadowplane.opacity = 0.5;\n\t\tthis.desk = new THREE.Mesh(new THREE.PlaneGeometry(this.display.containerWidth * 6, this.display.containerHeight * 6, 1, 1), shadowplane);\n\t\tthis.desk.receiveShadow = this.dicefactory.shadows;\n\t\tthis.desk.position.set(0, 0, -1);\n\t\tthis.scene.add(this.desk);\n\t\tif (this.dicefactory.realisticLighting) {\n\t\t\tlet renderScene = new RenderPass(this.scene, this.camera);\n\t\t\tconst canvasSize = new THREE.Vector2(this.display.currentWidth * 2, this.display.currentHeight * 2);\n\t\t\tthis.bloomPass = new TransparentUnrealBloomPass(canvasSize, game.dice3d.uniforms.bloomStrength.value, game.dice3d.uniforms.bloomRadius.value, game.dice3d.uniforms.bloomThreshold.value);\n\t\t\tthis.gammaPass = new ShaderPass(GammaCorrectionShader);\n\t\t\tlet size = canvasSize.multiplyScalar(this.renderer.getPixelRatio());\n\t\t\t//Create a RenderTarget with high precision\n\t\t\tlet options = {\n\t\t\t\ttype: THREE.FloatType,\n\t\t\t\tsamples: this.dicefactory.aa == \"msaa\" ? 4 : 0,\n\t\t\t\tanisotropy: 4\n\t\t\t};\n\t\t\t//Workaround for a bug on Chrome on OSX\n\t\t\tif (navigator.userAgent.indexOf('Mac OS X') != -1 && navigator.userAgent.indexOf('Chrome') != -1) {\n\t\t\t\toptions.stencilBuffer = true;\n\t\t\t}\n\t\t\tthis.composerTarget = new THREE.WebGLRenderTarget(size.x, size.y, options);\n\n\t\t\t// This EffectComposer is in charge of rendering the Bloom/Glow effect\n\t\t\tthis.bloomComposer = new EffectComposer(this.renderer, this.composerTarget);\n\t\t\tthis.bloomComposer.renderToScreen = false;\n\t\t\tthis.bloomComposer.addPass(renderScene);\n\t\t\tthis.bloomComposer.addPass(this.bloomPass);\n\n\t\t\t//This shader will blend the bloom effect with the scene. Only the alpha from the bloom effect will be used.\n\t\t\tthis.blendingPass = new ShaderPass(\n\t\t\t\tnew THREE.ShaderMaterial({\n\t\t\t\t\tuniforms: {\n\t\t\t\t\t\tbaseTexture: { value: null },\n\t\t\t\t\t\tbloomTexture: { value: this.bloomComposer.renderTarget2.texture },\n\t\t\t\t\t},\n\t\t\t\t\tvertexShader: `\n\t\t\t\t\t\tvarying vec2 vUv;\n\t\t\t\t\t\tvoid main() {\n\t\t\t\t\t\t\tvUv = uv;\n\t\t\t\t\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t\t\t\t\t}\n\t\t\t\t\t`,\n\t\t\t\t\tfragmentShader: `\n\t\t\t\t\t\tuniform sampler2D baseTexture;\n\t\t\t\t\t\tuniform sampler2D bloomTexture;\n\t\t\t\t\t\tvarying vec2 vUv;\n\t\t\t\t\t\tvoid main() {\n\t\t\t\t\t\t\tvec4 base = texture2D( baseTexture, vUv );\n\t\t\t\t\t\t\tvec4 bloom = texture2D( bloomTexture, vUv );\n\t\t\t\t\t\t\tgl_FragColor = vec4(base.rgb + ( vec3( 1.0 ) * bloom.rgb ), bloom.a);\n\t\t\t\t\t\t}\n\t\t\t\t\t`,\n\t\t\t\t\tdefines: {}\n\t\t\t\t}), \"baseTexture\"\n\t\t\t);\n\t\t\tthis.blendingPass.needsSwap = true;\n\n\t\t\t// This EffectComposer is in charge of rendering the final image\n\t\t\t// The blendingPass won't be rendered if no emissive textures are found during the render loop\n\t\t\tthis.finalComposer = new EffectComposer(this.renderer, this.composerTarget);\n\t\t\tthis.finalComposer.addPass(renderScene);\n\t\t\tthis.finalComposer.addPass(this.blendingPass);\n\n\t\t\t//Software Anti-aliasing pass. Should be rendered in a linear space.\n\t\t\tif (this.dicefactory.aa == \"smaa\") {\n\t\t\t\tthis.AAPass = new SMAAPass(size.x, size.y);\n\t\t\t\tthis.AAPass.renderToScreen = true;\n\t\t\t\tthis.finalComposer.addPass(this.AAPass);\n\t\t\t}\n\n\t\t\t//Gamma correction pass. Convert the image to a gamma space.\n\t\t\tthis.finalComposer.addPass(this.gammaPass);\n\t\t}\n\t\tthis.renderScene();\n\t}\n\n\tasync update(config) {\n\t\tthis.showExtraDice = config.showExtraDice;\n\t\tthis.muteSoundSecretRolls = config.muteSoundSecretRolls;\n\t\tif (this.config.boxType == \"board\") {\n\t\t\tif (config.autoscale) {\n\t\t\t\tthis.display.scale = Math.sqrt(this.display.containerWidth * this.display.containerWidth + this.display.containerHeight * this.display.containerHeight) / 13;\n\t\t\t} else {\n\t\t\t\tthis.display.scale = config.scale\n\t\t\t}\n\t\t\tthis.dicefactory.setScale(this.display.scale);\n\t\t}\n\t\tthis.dicefactory.setQualitySettings(config);\n\n\t\tlet globalAnimationSpeed = game.settings.get(\"dice-so-nice\", \"globalAnimationSpeed\");\n\t\tif (globalAnimationSpeed === \"0\")\n\t\t\tthis.speed = parseInt(config.speed, 10);\n\t\telse\n\t\t\tthis.speed = parseInt(globalAnimationSpeed, 10);\n\n\t\tthis.light.castShadow = this.dicefactory.shadows;\n\t\tthis.desk.receiveShadow = this.dicefactory.shadows;\n\t\tthis.renderer.shadowMap.enabled = this.dicefactory.shadows;\n\t\tthis.renderer.shadowMap.type = this.dicefactory.shadowQuality == \"high\" ? THREE.PCFSoftShadowMap : THREE.PCFShadowMap;\n\t\tthis.sounds = config.sounds;\n\t\tthis.volume = config.soundsVolume;\n\t\tthis.soundsSurface = config.soundsSurface;\n\n\t\tawait this.dicefactory.preloadPresets(true, null, config.appearance);\n\n\t\tthis.throwingForce = config.throwingForce;\n\t\tthis.immersiveDarkness = config.immersiveDarkness;\n\t\tthis.scene.traverse(object => {\n\t\t\tif (object.type === 'Mesh') object.material.needsUpdate = true;\n\t\t});\n\t}\n\n\n\tvectorRand({ x, y }) {\n\t\tlet angle = Math.random() * Math.PI / 5 - Math.PI / 5 / 2;\n\t\tlet vec = {\n\t\t\tx: x * Math.cos(angle) - y * Math.sin(angle),\n\t\t\ty: x * Math.sin(angle) + y * Math.cos(angle)\n\t\t};\n\t\tif (vec.x == 0) vec.x = 0.01;\n\t\tif (vec.y == 0) vec.y = 0.01;\n\t\treturn vec;\n\t}\n\n\t//returns an array of vectordata objects\n\tgetVectors(notationVectors, vector, boost, dist) {\n\n\t\tfor (let i = 0; i < notationVectors.dice.length; i++) {\n\n\t\t\tconst diceobj = this.dicefactory.get(notationVectors.dice[i].type);\n\n\t\t\tlet vec = this.vectorRand(vector);\n\n\t\t\tvec.x /= dist;\n\t\t\tvec.y /= dist;\n\n\t\t\tlet pos = {\n\t\t\t\tx: this.display.containerWidth * (vec.x > 0 ? -1 : 1) * 0.9 + Math.floor(Math.random() * 201) - 100,\n\t\t\t\ty: this.display.containerHeight * (vec.y > 0 ? -1 : 1) * 0.9 + Math.floor(Math.random() * 201) - 100,\n\t\t\t\tz: Math.random() * 200 + 200\n\t\t\t};\n\n\t\t\tlet projector = Math.abs(vec.x / vec.y);\n\t\t\tif (projector > 1.0) pos.y /= projector; else pos.x *= projector;\n\n\n\t\t\tlet velvec = this.vectorRand(vector);\n\n\t\t\tvelvec.x /= dist;\n\t\t\tvelvec.y /= dist;\n\t\t\tlet velocity, angle, axis;\n\n\t\t\tif (diceobj.shape != \"d2\") {\n\n\t\t\t\tvelocity = {\n\t\t\t\t\tx: velvec.x * boost,\n\t\t\t\t\ty: velvec.y * boost,\n\t\t\t\t\tz: -10\n\t\t\t\t};\n\n\t\t\t\tangle = {\n\t\t\t\t\tx: -(Math.random() * vec.y * 5 + diceobj.inertia * vec.y),\n\t\t\t\t\ty: Math.random() * vec.x * 5 + diceobj.inertia * vec.x,\n\t\t\t\t\tz: 0\n\t\t\t\t};\n\n\t\t\t\taxis = {\n\t\t\t\t\tx: Math.random(),\n\t\t\t\t\ty: Math.random(),\n\t\t\t\t\tz: Math.random(),\n\t\t\t\t\ta: Math.random()\n\t\t\t\t};\n\n\t\t\t\taxis = {\n\t\t\t\t\tx: 0,\n\t\t\t\t\ty: 0,\n\t\t\t\t\tz: 0,\n\t\t\t\t\ta: 0\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\t//coin flip\n\t\t\t\tvelocity = {\n\t\t\t\t\tx: velvec.x * boost / 10,\n\t\t\t\t\ty: velvec.y * boost / 10,\n\t\t\t\t\tz: 3000\n\t\t\t\t};\n\n\t\t\t\tangle = {\n\t\t\t\t\tx: 12 * diceobj.inertia,//-(Math.random() * velvec.y * 50 + diceobj.inertia * velvec.y ) ,\n\t\t\t\t\ty: 1 * diceobj.inertia,//Math.random() * velvec.x * 50 + diceobj.inertia * velvec.x ,\n\t\t\t\t\tz: 0\n\t\t\t\t};\n\n\t\t\t\taxis = {\n\t\t\t\t\tx: 1,//Math.random(), \n\t\t\t\t\ty: 1,//Math.random(), \n\t\t\t\t\tz: Math.random(),\n\t\t\t\t\ta: Math.random()\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tnotationVectors.dice[i].vectors = {\n\t\t\t\ttype: diceobj.type,\n\t\t\t\tpos,\n\t\t\t\tvelocity,\n\t\t\t\tangle,\n\t\t\t\taxis\n\t\t\t};\n\t\t}\n\t\treturn notationVectors;\n\t}\n\n\t// swaps dice faces to match desired result\n\tswapDiceFace(dicemesh) {\n\t\tconst diceobj = this.dicefactory.get(dicemesh.notation.type);\n\n\t\tlet value = parseInt(dicemesh.getLastValue().value);\n\t\tlet result = parseInt(dicemesh.forcedResult);\n\n\t\tif (diceobj.shape == 'd10' && result == 0) result = 10;\n\n\t\tif (diceobj.valueMap) { //die with special values\n\t\t\tresult = diceobj.valueMap[result];\n\t\t}\n\n\t\t// Make the last rolled dice and the DiceBox instance available for debugging\n\t\t//CONFIG.DiceSoNice = {\n\t\t//\tdicemesh,\n\t\t//\tdicebox: this\n\t\t//};\n\n\t\tif (value == result) return;\n\n\t\tlet rotIndex = value > result ? result + \",\" + value : value + \",\" + result;\n\t\t//console.log(`Needed ${result}, Rolled ${value}, Remap: ${rotIndex}`)\n\t\tlet rotationDegrees = DICE_MODELS[dicemesh.shape].rotationCombinations[rotIndex];\n\t\tif (!rotationDegrees) {\n\t\t\tconsole.error(`[Dice So Nice] No dice rotation found for ${dicemesh.shape} ${value} ${result}`);\n\t\t\treturn;\n\t\t}\n\t\tlet eulerAngle = new THREE.Euler(THREE.MathUtils.degToRad(rotationDegrees[0]), THREE.MathUtils.degToRad(rotationDegrees[1]), THREE.MathUtils.degToRad(rotationDegrees[2]));\n\t\tlet quaternion = new THREE.Quaternion().setFromEuler(eulerAngle);\n\t\tif (value > result)\n\t\t\tquaternion.invert();\n\n\t\tdicemesh.applyQuaternion(quaternion);\n\n\t\tdicemesh.resultReason = 'forced';\n\t}\n\n\t/*\n\t// Apply an euler angle from rotationCombinations for debugging\n\t swapTest(dicemesh, mapping, invert = false, revert = true) {\n \n\t\t let rotationDegrees = DICE_MODELS[dicemesh.shape].rotationCombinations[mapping];\n\t\t let eulerAngle = new THREE.Euler(THREE.MathUtils.degToRad(rotationDegrees[0]), THREE.MathUtils.degToRad(rotationDegrees[1]), THREE.MathUtils.degToRad(rotationDegrees[2]));\n\t\t let quaternion = new THREE.Quaternion().setFromEuler(eulerAngle);\n\t\t if (invert)\n\t\t\t quaternion.invert();\n \n\t\t dicemesh.applyQuaternion(quaternion);\n \n\t\t if (revert) {\n\t\t\t setTimeout(() => { this.swapTest(dicemesh, mapping, !invert, false) }, 2000 )\n\t\t }\n \n\t\t dicemesh.resultReason = 'forced';\n\t }\n \n\t// Apply an euler angle directly for debugging\n\t swapTest(dicemesh, mapping, invert = false, revert = true) {\n\t swapTestEuler(dicemesh, euler, invert = false, revert = true) {\n\t\t let eulerAngle = new THREE.Euler(THREE.MathUtils.degToRad(euler[0]), THREE.MathUtils.degToRad(euler[1]), THREE.MathUtils.degToRad(euler[2]));\n\t\t let quaternion = new THREE.Quaternion().setFromEuler(eulerAngle);\n\t\t if (invert)\n\t\t\t quaternion.invert();\n \n\t\t dicemesh.applyQuaternion(quaternion);\n \n\t\t if (revert) {\n\t\t\t setTimeout(() => { this.swapTestEuler(dicemesh, euler, !invert, false) }, 2000 )\n\t\t }\n \n\t\t dicemesh.resultReason = 'forced';\n\t }\n \n\t// Extract the euler angle from a mesh in degrees for debugging\n\t extractEuler(dicemesh) {\n\t\t let euler = dicemesh.rotation\n\t\t console.log(\"World Euler:\", THREE.MathUtils.radToDeg(euler.x), THREE.MathUtils.radToDeg(euler.y), THREE.MathUtils.radToDeg(euler.z), euler.order)\n\t }\n\t*/\n\n\t//spawns one dicemesh object from a single vectordata object\n\tspawnDice(dicedata, appearance) {\n\t\tlet vectordata = dicedata.vectors;\n\t\tconst diceobj = this.dicefactory.get(vectordata.type);\n\t\tif (!diceobj) return;\n\n\t\tlet dicemesh = this.dicefactory.create(this.renderer.scopedTextureCache, diceobj.type, appearance);\n\t\tif (!dicemesh) return;\n\n\t\tlet mass = diceobj.mass;\n\t\tswitch (appearance.material) {\n\t\t\tcase \"metal\":\n\t\t\t\tmass *= 7;\n\t\t\t\tbreak;\n\t\t\tcase \"wood\":\n\t\t\t\tmass *= 0.65;\n\t\t\t\tbreak;\n\t\t\tcase \"glass\":\n\t\t\t\tmass *= 2;\n\t\t\t\tbreak;\n\t\t\tcase \"stone\":\n\t\t\t\tmass *= 1.5;\n\t\t\t\tbreak;\n\t\t}\n\n\t\tdicemesh.notation = vectordata;\n\t\tdicemesh.result = [];\n\t\tdicemesh.forcedResult = dicedata.result;\n\t\tdicemesh.startAtIteration = dicedata.startAtIteration;\n\t\tdicemesh.stopped = 0;\n\t\tdicemesh.castShadow = this.dicefactory.shadows;\n\t\tdicemesh.receiveShadow = this.dicefactory.shadows;\n\t\tdicemesh.specialEffects = dicedata.specialEffects;\n\n\t\tdicemesh.body_sim = new CANNON.Body({ allowSleep: true, sleepSpeedLimit: 75, sleepTimeLimit: 0.9, mass: mass, shape: dicemesh.geometry.cannon_shape, material: this.dice_body_material });\n\t\tdicemesh.body_sim.type = CANNON.Body.DYNAMIC;\n\t\tdicemesh.body_sim.position.set(vectordata.pos.x, vectordata.pos.y, vectordata.pos.z);\n\t\tdicemesh.body_sim.quaternion.setFromAxisAngle(new CANNON.Vec3(vectordata.axis.x, vectordata.axis.y, vectordata.axis.z), vectordata.axis.a * Math.PI * 2);\n\t\tdicemesh.body_sim.angularVelocity.set(vectordata.angle.x, vectordata.angle.y, vectordata.angle.z);\n\t\tdicemesh.body_sim.velocity.set(vectordata.velocity.x, vectordata.velocity.y, vectordata.velocity.z);\n\t\tdicemesh.body_sim.linearDamping = 0.1;\n\t\tdicemesh.body_sim.angularDamping = 0.1;\n\t\tdicemesh.body_sim.addEventListener('collide', this.eventCollide.bind(this));\n\t\tdicemesh.body_sim.stepQuaternions = new Array(1000);\n\t\tdicemesh.body_sim.stepPositions = new Array(1000);\n\n\t\t//We add some informations about the dice to the CANNON body to be used in the collide event\n\t\tdicemesh.body_sim.diceType = diceobj.type;\n\t\tdicemesh.body_sim.diceMaterial = appearance.material;\n\t\tdicemesh.body_sim.secretRoll = dicedata.options?.secret;\n\n\t\t//dicemesh.meshCannon = this.body2mesh(dicemesh.body_sim,true);\n\n\t\t/*var gltfExporter = new GLTFExporter();\n\t\tgltfExporter.parse(dicemesh.meshCannon, function ( result ) {\n\t\t\tif ( result instanceof ArrayBuffer ) {\n\t\t\t\tsaveArrayBuffer( result, 'scene.glb' );\n\t\t\t} else {\n\t\t\t\tvar output = JSON.stringify( result, null, 2 );\n\t\t\t\tconsole.log( output );\n\t\t\t\tsaveString( output, 'scene.gltf' );\n\t\t\t}\n\t\t}, {});\n\n\t\tvar link = document.createElement( 'a' );\n\t\tlink.style.display = 'none';\n\t\tdocument.body.appendChild( link ); // Firefox workaround, see #6594\n\n\t\tfunction save( blob, filename ) {\n\t\t\tlink.href = URL.createObjectURL( blob );\n\t\t\tlink.download = filename;\n\t\t\tlink.click();\n\t\t\t// URL.revokeObjectURL( url ); breaks Firefox...\n\t\t}\n\n\t\tfunction saveString( text, filename ) {\n\t\t\tsave( new Blob( [ text ], { type: 'text/plain' } ), filename );\n\t\t}\n\n\t\tfunction saveArrayBuffer( buffer, filename ) {\n\t\t\tsave( new Blob( [ buffer ], { type: 'application/octet-stream' } ), filename );\n\t\t}*/\n\n\t\tlet objectContainer = new THREE.Group();\n\t\tobjectContainer.add(dicemesh);\n\n\t\tthis.diceList.push(dicemesh);\n\t\tif (dicemesh.startAtIteration == 0) {\n\t\t\tthis.scene.add(objectContainer);\n\t\t\t//this.scene.add(dicemesh.meshCannon);\n\t\t\tthis.world_sim.addBody(dicemesh.body_sim);\n\t\t}\n\t}\n\n\teventCollide({ body, target }) {\n\t\t// collision events happen simultaneously for both colliding bodies\n\t\t// all this sanity checking helps limits sounds being played\n\t\tif (!this.sounds || !body || !this.sounds_dice.source) return;\n\n\t\tlet now = body.world.stepnumber;\n\t\tlet currentSoundType = (body.mass > 0) ? 'dice' : 'table';\n\n\t\t// the idea here is that a dice clack should never be skipped in favor of a table sound\n\t\t// if ((don't play sounds if we played one this world step, or there hasn't been enough delay) AND 'this sound IS NOT a dice clack') then 'skip it'\n\t\tif ((this.lastSoundStep == body.world.stepnumber || this.lastSound > body.world.stepnumber) && currentSoundType != 'dice') return;\n\n\t\t// also skip if it's too early and both last sound and this sound are the same\n\t\tif ((this.lastSoundStep == body.world.stepnumber || this.lastSound > body.world.stepnumber) && currentSoundType == 'dice' && this.lastSoundType == 'dice') return;\n\n\t\tif (body.mass > 0) { // dice to dice collision\n\t\t\tlet speed = body.velocity.length();\n\t\t\t// also don't bother playing at low speeds\n\t\t\tif (speed < 250) return;\n\t\t\tlet strength = Math.max(Math.min(speed / (550), 1), 0.2);\n\t\t\tif (this.muteSoundSecretRolls && (body.secretRoll || target.secretRoll))\n\t\t\t\tstrength = 0;\n\t\t\tlet sound;\n\n\t\t\tif (body.diceType != \"dc\") {\n\t\t\t\tlet sounds_dice = this.sounds_dice['plastic'];\n\t\t\t\tif (this.sounds_dice[body.diceMaterial])\n\t\t\t\t\tsounds_dice = this.sounds_dice[body.diceMaterial];\n\t\t\t\tsound = sounds_dice[Math.floor(Math.random() * sounds_dice.length)];\n\t\t\t}\n\t\t\telse\n\t\t\t\tsound = this.sounds_dice['coin'][Math.floor(Math.random() * this.sounds_dice['coin'].length)];\n\t\t\tif (this.animstate == \"simulate\") {\n\t\t\t\tthis.detectedCollides[this.iteration] = [this.sounds_dice.source, sound, strength];\n\t\t\t} else {\n\t\t\t\tthis.playAudioSprite(this.sounds_dice.source, sound, strength);\n\t\t\t}\n\t\t\tthis.lastSoundType = 'dice';\n\n\n\t\t} else { // dice to table collision\n\t\t\tlet speed = target.velocity.length();\n\t\t\t// also don't bother playing at low speeds\n\t\t\tif (speed < 100) return;\n\n\t\t\tlet surface = this.soundsSurface;\n\t\t\tlet strength = Math.max(Math.min(speed / (500), 1), 0.2);\n\t\t\tif (this.muteSoundSecretRolls && (body.secretRoll || target.secretRoll))\n\t\t\t\tstrength = 0;\n\t\t\tlet soundlist = this.sounds_table[surface];\n\t\t\tlet sound = soundlist[Math.floor(Math.random() * soundlist.length)];\n\t\t\tif (this.animstate == \"simulate\") {\n\t\t\t\tthis.detectedCollides[this.iteration] = [this.sounds_table.source, sound, strength];\n\t\t\t} else {\n\t\t\t\tthis.playAudioSprite(this.sounds_table.source, sound, strength);\n\t\t\t}\n\n\t\t\tthis.lastSoundType = 'table';\n\t\t}\n\t\tthis.lastSoundStep = body.world.stepnumber;\n\t\tthis.lastSound = body.world.stepnumber + this.soundDelay;\n\t}\n\n\tthrowFinished(worldType = \"render\") {\n\n\t\tlet stopped = true;\n\t\tif (this.iteration > 1000) return true;\n\t\tif (this.iteration <= this.minIterations) return false;\n\t\tif (worldType == \"render\") {\n\t\t\tstopped = this.iteration >= this.iterationsNeeded;\n\t\t\tif (stopped) {\n\t\t\t\tfor (let i = 0, len = this.diceList.length; i < len; ++i) {\n\t\t\t\t\tthis.diceList[i].body_sim.stepPositions = new Array(1000);\n\t\t\t\t\tthis.diceList[i].body_sim.stepQuaternions = new Array(1000);\n\t\t\t\t\tthis.diceList[i].body_sim.detectedCollides = [];\n\t\t\t\t\tif (!this.diceList[i].body_sim.mass)\n\t\t\t\t\t\tthis.diceList[i].body_sim.dead = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tfor (let i = 0, len = this.diceList.length; i < len; ++i) {\n\t\t\t\tif (this.diceList[i].body_sim.sleepState < 2)\n\t\t\t\t\treturn false;\n\t\t\t\telse if (this.diceList[i].result.length == 0)\n\t\t\t\t\tthis.diceList[i].storeRolledValue();\n\t\t\t}\n\t\t\t//Throw is actually finished\n\t\t\tif (stopped) {\n\t\t\t\tthis.iterationsNeeded = this.iteration;\n\t\t\t\tlet canBeFlipped = game.settings.get(\"dice-so-nice\", \"diceCanBeFlipped\");\n\t\t\t\tif (!canBeFlipped) {\n\t\t\t\t\t//make the current dice on the board STATIC object so they can't be knocked\n\t\t\t\t\tfor (let i = 0, len = this.diceList.length; i < len; ++i) {\n\t\t\t\t\t\tthis.diceList[i].body_sim.mass = 0;\n\t\t\t\t\t\tthis.diceList[i].body_sim.updateMassProperties();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn stopped;\n\t}\n\n\tsimulateThrow() {\n\t\tthis.detectedCollides = new Array(1000);\n\t\tthis.iterationsNeeded = 0;\n\t\tthis.animstate = 'simulate';\n\t\tthis.rolling = true;\n\t\twhile (!this.throwFinished(\"sim\")) {\n\t\t\t//Before each step, we copy the quaternions of every die in an array\n\t\t\t++this.iteration;\n\n\t\t\tif (!(this.iteration % this.nbIterationsBetweenRolls)) {\n\t\t\t\tfor (let i = 0; i < this.diceList.length; i++) {\n\t\t\t\t\tif (this.diceList[i].startAtIteration == this.iteration)\n\t\t\t\t\t\tthis.world_sim.addBody(this.diceList[i].body_sim);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.world_sim.step(this.framerate);\n\n\t\t\tfor (let i = 0; i < this.world_sim.bodies.length; i++) {\n\t\t\t\tif (this.world_sim.bodies[i].stepPositions) {\n\t\t\t\t\tthis.world_sim.bodies[i].stepQuaternions[this.iteration] = {\n\t\t\t\t\t\t\"w\": this.world_sim.bodies[i].quaternion.w,\n\t\t\t\t\t\t\"x\": this.world_sim.bodies[i].quaternion.x,\n\t\t\t\t\t\t\"y\": this.world_sim.bodies[i].quaternion.y,\n\t\t\t\t\t\t\"z\": this.world_sim.bodies[i].quaternion.z\n\t\t\t\t\t};\n\t\t\t\t\tthis.world_sim.bodies[i].stepPositions[this.iteration] = {\n\t\t\t\t\t\t\"x\": this.world_sim.bodies[i].position.x,\n\t\t\t\t\t\t\"y\": this.world_sim.bodies[i].position.y,\n\t\t\t\t\t\t\"z\": this.world_sim.bodies[i].position.z\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t//This is the render loop\n\tanimateThrow() {\n\t\tthis.animstate = 'throw';\n\t\tlet time = (new Date()).getTime();\n\t\tthis.last_time = this.last_time || time - (this.framerate * 1000);\n\t\tlet time_diff = (time - this.last_time) / 1000;\n\n\t\tlet neededSteps = Math.floor(time_diff / this.framerate);\n\n\t\t//Update animated dice mixer\n\t\tif (this.animatedDiceDetected) {\n\t\t\tlet delta = this.clock.getDelta();\n\t\t\tfor (let i in this.scene.children) {\n\t\t\t\tlet container = this.scene.children[i];\n\t\t\t\tlet dicemesh = container.children && container.children.length && container.children[0].body_sim != undefined ? container.children[0] : null;\n\t\t\t\tif (dicemesh && dicemesh.mixer) {\n\t\t\t\t\tdicemesh.mixer.update(delta);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (neededSteps && this.rolling) {\n\t\t\tfor (let i = 0; i < neededSteps * this.speed; i++) {\n\t\t\t\t++this.iteration;\n\t\t\t\tif (!(this.iteration % this.nbIterationsBetweenRolls)) {\n\t\t\t\t\tfor (let i = 0; i < this.diceList.length; i++) {\n\t\t\t\t\t\tif (this.diceList[i].startAtIteration == this.iteration) {\n\t\t\t\t\t\t\tthis.scene.add(this.diceList[i].parent);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (this.iteration > this.iterationsNeeded)\n\t\t\t\tthis.iteration = this.iterationsNeeded;\n\n\t\t\t// update physics interactions visually\n\n\t\t\tfor (let i in this.scene.children) {\n\t\t\t\tlet container = this.scene.children[i];\n\t\t\t\tlet dicemesh = container.children && container.children.length && container.children[0].body_sim != undefined && !container.children[0].body_sim.dead ? container.children[0] : null;\n\t\t\t\tif (dicemesh && dicemesh.body_sim.stepPositions[this.iteration]) {\n\t\t\t\t\tcontainer.position.copy(dicemesh.body_sim.stepPositions[this.iteration]);\n\t\t\t\t\tcontainer.quaternion.copy(dicemesh.body_sim.stepQuaternions[this.iteration]);\n\n\t\t\t\t\tif (dicemesh.meshCannon) {\n\t\t\t\t\t\tdicemesh.meshCannon.position.copy(dicemesh.body_sim.stepPositions[this.iteration]);\n\t\t\t\t\t\tdicemesh.meshCannon.quaternion.copy(dicemesh.body_sim.stepQuaternions[this.iteration]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.detectedCollides[this.iteration]) {\n\t\t\t\tthis.playAudioSprite(...this.detectedCollides[this.iteration]);\n\t\t\t}\n\t\t} else if (!this.rolling) {\n\t\t\tlet worldAsleep = true;\n\t\t\tfor (let i = 0; i < this.world_sim.bodies.length; i++) {\n\t\t\t\tif (this.world_sim.bodies[i].allowSleep && this.world_sim.bodies[i].sleepState < 2) {\n\t\t\t\t\tworldAsleep = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!worldAsleep) {\n\t\t\t\tthis.world_sim.step(this.framerate, time_diff);\n\t\t\t\tfor (let i in this.scene.children) {\n\t\t\t\t\tlet container = this.scene.children[i];\n\t\t\t\t\tlet dicemesh = container.children && container.children.length && container.children[0].body_sim != undefined && !container.children[0].body_sim.dead ? container.children[0] : null;\n\t\t\t\t\tif (dicemesh) {\n\t\t\t\t\t\tcontainer.position.copy(dicemesh.body_sim.position);\n\t\t\t\t\t\tcontainer.quaternion.copy(dicemesh.body_sim.quaternion);\n\n\t\t\t\t\t\tif (dicemesh.meshCannon) {\n\t\t\t\t\t\t\tdicemesh.meshCannon.position.copy(dicemesh.body_sim.position);\n\t\t\t\t\t\t\tdicemesh.meshCannon.quaternion.copy(dicemesh.body_sim.quaternion);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (this.isVisible && (this.allowInteractivity || this.animatedDiceDetected || neededSteps || DiceSFXManager.renderQueue.length)) {\n\t\t\tDiceSFXManager.renderSFX();\n\t\t\t//use darknessLevel to change toneMapping\n\t\t\tif (this.dicefactory.realisticLighting && this.immersiveDarkness) {\n\t\t\t\t//If the darkness level is not defined, we set it to 0\n\t\t\t\tlet darknessLevel = this.darknessLevel || 0;\n\t\t\t\tthis.renderer.toneMappingExposure = 0.4 + (0.6 - darknessLevel * 0.6);\n\t\t\t}\n\t\t\tthis.renderScene();\n\t\t}\n\t\tif (this.rendererStats)\n\t\t\tthis.rendererStats.update(this.renderer);\n\t\tthis.last_time = this.last_time + neededSteps * this.framerate * 1000;\n\n\t\t// roll finished\n\t\tif (this.throwFinished(\"render\")) {\n\t\t\t//if animated dice still on the table, keep animating\n\t\t\tthis.rolling = false;\n\t\t\tif (this.running) {\n\t\t\t\tthis.handleSpecialEffectsInit().then(() => {\n\t\t\t\t\tthis.callback(this.throws);\n\t\t\t\t\tthis.callback = null;\n\t\t\t\t\tthis.throws = null;\n\t\t\t\t\tif (!this.animatedDiceDetected && !(this.allowInteractivity && (this.deadDiceList.length + this.diceList.length) > 0) && !DiceSFXManager.renderQueue.length)\n\t\t\t\t\t\tthis.removeTicker(this.animateThrow);\n\t\t\t\t});\n\t\t\t}\n\t\t\tthis.running = false;\n\t\t}\n\t}\n\n\tstart_throw(throws, callback) {\n\t\tif (this.rolling) return;\n\t\tlet countNewDice = 0;\n\t\tthrows.forEach(notation => {\n\t\t\tlet vector = { x: (Math.random() * 2 - 0.5) * this.display.currentWidth, y: -(Math.random() * 2 - 0.5) * this.display.currentHeight };\n\t\t\tlet dist = Math.sqrt(vector.x * vector.x + vector.y * vector.y);\n\t\t\tlet throwingForceModifier = 0.8;\n\t\t\tswitch (this.throwingForce) {\n\t\t\t\tcase \"weak\":\n\t\t\t\t\tthrowingForceModifier = 0.5;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"strong\":\n\t\t\t\t\tthrowingForceModifier = 1.8;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tlet boost = ((Math.random() + 3) * throwingForceModifier) * dist;\n\n\t\t\tnotation = this.getVectors(notation, vector, boost, dist);\n\t\t\tcountNewDice += notation.dice.length;\n\t\t});\n\n\t\tlet maxDiceNumber = game.settings.get(\"dice-so-nice\", \"maxDiceNumber\");\n\t\tif (this.deadDiceList.length + this.diceList.length + countNewDice > maxDiceNumber) {\n\t\t\tthis.clearAll();\n\t\t}\n\t\tthis.isVisible = true;\n\t\tthis.rollDice(throws, callback);\n\t}\n\n\tclearDice() {\n\t\tthis.running = false;\n\t\tthis.deadDiceList = this.deadDiceList.concat(this.diceList);\n\t\tthis.diceList = [];\n\t}\n\n\tclearAll() {\n\t\tthis.clearDice();\n\t\tlet dice;\n\t\twhile (dice = this.deadDiceList.pop()) {\n\t\t\tthis.scene.remove(dice.parent.type == \"Scene\" ? dice : dice.parent);\n\t\t\tif (dice.body_sim) this.world_sim.remove(dice.body_sim);\n\t\t}\n\n\t\tif (this.pane) this.scene.remove(this.pane);\n\n\t\tif (this.config.boxType == \"board\") {\n\t\t\tDiceSFXManager.clearQueue();\n\t\t\tthis.removeTicker(this.animateThrow);\n\t\t} else {\n\t\t\tthis.removeTicker(this.animateSelector);\n\t\t}\n\n\t\tthis.renderScene();\n\n\t\tthis.isVisible = false;\n\t}\n\n\trenderScene() {\n\t\tif (this.dicefactory.realisticLighting) {\n\t\t\tgame.dice3d.uniforms.globalBloom.value = 1;\n\t\t\tif (!this.finalComposer)\n\t\t\t\treturn;\n\n\t\t\t//Check if there is any emissive materials before rendering the bloom pass\n\t\t\tlet hasEmissive = false;\n\t\t\tlet black = this.blackColor;\n\t\t\tthis.scene.traverseVisible(function (object) {\n\t\t\t\tif (object.material && object.material.emissive != undefined && !object.material.emissive.equals(black)) {\n\t\t\t\t\thasEmissive = true;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t});\n\t\t\tif (hasEmissive && this.dicefactory.glow) {\n\t\t\t\tthis.bloomComposer.render();\n\t\t\t\tthis.blendingPass.enabled = true;\n\t\t\t} else {\n\t\t\t\tthis.blendingPass.enabled = false;\n\t\t\t}\n\t\t\tgame.dice3d.uniforms.globalBloom.value = 0;\n\t\t\tthis.finalComposer.render();\n\t\t} else {\n\t\t\tthis.renderer.render(this.scene, this.camera);\n\t\t}\n\t}\n\n\tclearScene() {\n\t\twhile (this.scene.children.length > 0) {\n\t\t\tthis.scene.remove(this.scene.children[0]);\n\t\t}\n\t\tthis.desk.material.dispose();\n\t\tthis.desk.geometry.dispose();\n\t\tif(this.composerTarget)\n\t\t\tthis.composerTarget.dispose();\n\t\tif(this.bloomPass)\n\t\t\tthis.bloomPass.dispose();\n\t\tif(this.AAPass)\n\t\t\tthis.AAPass.dispose();\n\t\tif(this.bloomComposer){\n\t\t\tthis.bloomComposer.renderTarget1.dispose();\n\t\t\tthis.bloomComposer.renderTarget2.dispose();\n\t\t}\n\t\tif(this.finalComposer){\n\t\t\tthis.finalComposer.renderTarget1.dispose();\n\t\t\tthis.finalComposer.renderTarget2.dispose();\n\t\t}\n\t\tif (this.dicefactory.shadows) {\n\t\t\tthis.light.shadow.map.dispose();\n\t\t}\n\t\tif (this.config.boxType == \"board\")\n\t\t\tthis.removeTicker(this.animateThrow);\n\t\telse\n\t\t\tthis.removeTicker(this.animateSelector);\n\t}\n\n\t//Allow to remove an handler from a PIXI ticker even when the context changed.\n\tremoveTicker(fn) {\n\t\tlet ticker = canvas.app.ticker;\n\t\tlet listener = ticker._head.next;\n\n\t\twhile (listener) {\n\t\t\t// We found a match, lets remove it\n\t\t\t// no break to delete all possible matches\n\t\t\t// incase a listener was added 2+ times\n\t\t\tif (listener.fn === fn) {\n\t\t\t\tlistener = listener.destroy();\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlistener = listener.next;\n\t\t\t}\n\t\t}\n\n\t\tif (!ticker._head.next) {\n\t\t\tticker._cancelIfNeeded();\n\t\t}\n\t\treturn ticker;\n\t}\n\n\trollDice(throws, callback) {\n\n\t\tthis.camera.position.z = this.cameraHeight.far;\n\t\tthis.clearDice();\n\t\tthis.minIterations = (throws.length - 1) * this.nbIterationsBetweenRolls;\n\n\t\tfor (let j = 0; j < throws.length; j++) {\n\t\t\tlet notationVectors = throws[j];\n\n\t\t\tfor (let i = 0, len = notationVectors.dice.length; i < len; ++i) {\n\t\t\t\tnotationVectors.dice[i].startAtIteration = j * this.nbIterationsBetweenRolls;\n\t\t\t\tlet appearance = this.dicefactory.getAppearanceForDice(notationVectors.dsnConfig.appearance, notationVectors.dice[i].type, notationVectors.dice[i]);\n\t\t\t\tthis.spawnDice(notationVectors.dice[i], appearance);\n\t\t\t}\n\t\t}\n\t\tthis.iteration = 0;\n\n\t\tthis.simulateThrow();\n\t\tthis.iteration = 0;\n\n\n\t\t//check forced results, fix dice faces if necessary\n\t\t//Detect if there's an animated dice\n\t\tthis.animatedDiceDetected = false;\n\t\tfor (let i = 0, len = this.diceList.length; i < len; ++i) {\n\t\t\tlet dicemesh = this.diceList[i];\n\t\t\tif (!dicemesh) continue;\n\t\t\tthis.swapDiceFace(dicemesh);\n\t\t\tif (dicemesh.mixer)\n\t\t\t\tthis.animatedDiceDetected = true;\n\t\t}\n\n\t\t//reset the result\n\t\tfor (let i = 0, len = this.diceList.length; i < len; ++i) {\n\t\t\tif (!this.diceList[i]) continue;\n\n\t\t\tif (this.diceList[i].resultReason != 'forced') {\n\t\t\t\tthis.diceList[i].result = [];\n\t\t\t}\n\t\t}\n\n\t\t// animate the previously simulated roll\n\t\tthis.rolling = true;\n\t\tthis.running = (new Date()).getTime();\n\t\tthis.last_time = 0;\n\t\tthis.callback = callback;\n\t\tthis.throws = throws;\n\t\tthis.removeTicker(this.animateThrow);\n\t\tcanvas.app.ticker.add(this.animateThrow, this);\n\t}\n\n\tshowcase(config) {\n\t\tthis.clearAll();\n\n\t\tlet selectordice = this.dicefactory.systems.standard.dice.map(dice => dice.type);\n\t\tconst extraDiceTypes = [\"d3\", \"d5\", \"d7\", \"d14\", \"d16\", \"d24\", \"d30\"];\n\t\tif (!this.showExtraDice)\n\t\t\tselectordice = selectordice.filter((die) => !extraDiceTypes.includes(die));\n\n\t\tlet proportion = this.display.containerWidth / this.display.containerHeight;\n\t\tlet columns = Math.min(selectordice.length, Math.round(Math.sqrt(proportion * selectordice.length)));\n\t\tlet rows = Math.floor((selectordice.length + columns - 1) / columns);\n\n\t\tthis.camera.position.z = this.cameraHeight.medium;\n\t\tthis.camera.position.x = this.display.containerWidth / 2 - (this.display.containerWidth / columns / 2);\n\t\tthis.camera.position.y = -this.display.containerHeight / 2 + (this.display.containerHeight / rows / 2);\n\t\tthis.camera.fov = 2 * Math.atan(this.display.containerHeight / (2 * this.camera.position.z)) * (180 / Math.PI);\n\t\tthis.camera.updateProjectionMatrix();\n\n\t\tif (this.pane) this.scene.remove(this.pane);\n\t\tif (this.desk) this.scene.remove(this.desk);\n\t\tif (this.dicefactory.shadows) {\n\n\t\t\tlet shadowplane = new THREE.ShadowMaterial();\n\t\t\tshadowplane.opacity = 0.5;\n\n\t\t\tthis.pane = new THREE.Mesh(new THREE.PlaneGeometry(this.display.containerWidth * 2, this.display.containerHeight * 2, 1, 1), shadowplane);\n\t\t\tthis.pane.receiveShadow = this.dicefactory.shadows;\n\t\t\tthis.pane.position.set(0, 0, -70);\n\t\t\tthis.scene.add(this.pane);\n\t\t}\n\n\t\tlet z = 0;\n\t\tlet count = 0;\n\t\tfor (let y = 0; y < rows; y++) {\n\t\t\tfor (let x = 0; x < columns; x++) {\n\t\t\t\tif (count >= selectordice.length)\n\t\t\t\t\tbreak;\n\t\t\t\tlet appearance = this.dicefactory.getAppearanceForDice(config.appearance, selectordice[count]);\n\t\t\t\tlet dicemesh = this.dicefactory.create(this.renderer.scopedTextureCache, selectordice[count], appearance);\n\t\t\t\tdicemesh.scale.set(\n\t\t\t\t\tMath.min(dicemesh.scale.x * 5 / columns, dicemesh.scale.x * 2 / rows),\n\t\t\t\t\tMath.min(dicemesh.scale.y * 5 / columns, dicemesh.scale.y * 2 / rows),\n\t\t\t\t\tMath.min(dicemesh.scale.z * 5 / columns, dicemesh.scale.z * 2 / rows)\n\t\t\t\t);\n\n\t\t\t\tdicemesh.position.set(x * this.display.containerWidth / columns, -(y * this.display.containerHeight / rows), z);\n\n\t\t\t\tdicemesh.castShadow = this.dicefactory.shadows;\n\n\t\t\t\tdicemesh.userData = selectordice[count];\n\n\t\t\t\tthis.diceList.push(dicemesh);\n\t\t\t\tthis.scene.add(dicemesh);\n\t\t\t\tcount++;\n\t\t\t}\n\t\t}\n\n\t\tthis.last_time = 0;\n\t\tif (this.selector.animate) {\n\t\t\tthis.container.style.opacity = 0;\n\t\t\tthis.last_time = window.performance.now();\n\t\t\tthis.start_time = this.last_time;\n\t\t\tthis.framerate = 1000 / 60;\n\t\t\tthis.removeTicker(this.animateSelector);\n\t\t\tcanvas.app.ticker.add(this.animateSelector, this);\n\t\t}\n\t\telse this.renderScene();\n\t\tsetTimeout(() => {\n\t\t\tthis.scene.traverse(object => {\n\t\t\t\tif (object.type === 'Mesh') object.material.needsUpdate = true;\n\t\t\t});\n\t\t}, 2000);\n\t}\n\n\tanimateSelector() {\n\t\tthis.animstate = 'selector';\n\t\tlet now = window.performance.now();\n\t\tlet elapsed = now - this.last_time;\n\t\tif (elapsed > this.framerate) {\n\t\t\tthis.last_time = now - (elapsed % this.framerate);\n\n\t\t\tif (this.container.style.opacity != '1') this.container.style.opacity = Math.min(1, (parseFloat(this.container.style.opacity) + 0.05));\n\n\t\t\tif (this.selector.rotate) {\n\t\t\t\tlet angle_change = 0.005 * Math.PI;\n\t\t\t\tfor (let i = 0; i < this.diceList.length; i++) {\n\t\t\t\t\tthis.diceList[i].rotation.y += angle_change;\n\t\t\t\t\tthis.diceList[i].rotation.x += angle_change / 4;\n\t\t\t\t\tthis.diceList[i].rotation.z += angle_change / 10;\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.renderScene();\n\t\t}\n\t}\n\n\t//used to debug cannon shape vs three shape\n\tbody2mesh(body) {\n\t\tvar obj = new THREE.Object3D();\n\t\tlet currentMaterial = new THREE.MeshBasicMaterial({ wireframe: true });\n\t\tfor (var l = 0; l < body.shapes.length; l++) {\n\t\t\tvar shape = body.shapes[l];\n\n\t\t\tvar mesh;\n\n\t\t\tswitch (shape.type) {\n\n\t\t\t\tcase CANNON.Shape.types.SPHERE:\n\t\t\t\t\tvar sphere_geometry = new THREE.SphereGeometry(shape.radius, 8, 8);\n\t\t\t\t\tmesh = new THREE.Mesh(sphere_geometry, currentMaterial);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase CANNON.Shape.types.PARTICLE:\n\t\t\t\t\tmesh = new THREE.Mesh(this.particleGeo, this.particleMaterial);\n\t\t\t\t\tvar s = this.settings;\n\t\t\t\t\tmesh.scale.set(s.particleSize, s.particleSize, s.particleSize);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase CANNON.Shape.types.PLANE:\n\t\t\t\t\tvar geometry = new THREE.PlaneGeometry(10, 10, 4, 4);\n\t\t\t\t\tmesh = new THREE.Object3D();\n\t\t\t\t\tvar submesh = new THREE.Object3D();\n\t\t\t\t\tvar ground = new THREE.Mesh(geometry, currentMaterial);\n\t\t\t\t\tground.scale.set(100, 100, 100);\n\t\t\t\t\tsubmesh.add(ground);\n\n\t\t\t\t\tground.castShadow = true;\n\t\t\t\t\tground.receiveShadow = true;\n\n\t\t\t\t\tmesh.add(submesh);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase CANNON.Shape.types.BOX:\n\t\t\t\t\tvar box_geometry = new THREE.BoxGeometry(shape.halfExtents.x * 2,\n\t\t\t\t\t\tshape.halfExtents.y * 2,\n\t\t\t\t\t\tshape.halfExtents.z * 2);\n\t\t\t\t\tmesh = new THREE.Mesh(box_geometry, currentMaterial);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase CANNON.Shape.types.CONVEXPOLYHEDRON:\n\t\t\t\t\tvar geo = new THREE.BufferGeometry()\n\t\t\t\t\tvar points = []\n\t\t\t\t\tfor (var i = 0; i < shape.faces.length; i++) {\n\t\t\t\t\t\tvar face = shape.faces[i];\n\n\t\t\t\t\t\tfor (var j = 0; j < face.length - 1; j++) {\n\t\t\t\t\t\t\tvar a = shape.vertices[face[j]];\n\t\t\t\t\t\t\tvar b = shape.vertices[face[j + 1]];\n\t\t\t\t\t\t\tpoints.push(a);\n\t\t\t\t\t\t\tpoints.push(b);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tgeo.setFromPoints(points);\n\t\t\t\t\tgeo.computeVertexNormals();\n\t\t\t\t\tmesh = new THREE.Mesh(geo, currentMaterial);\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tthrow \"Visual type not recognized: \" + shape.type;\n\t\t\t}\n\n\t\t\t//mesh.receiveShadow = this.dicefactory.shadows;\n\t\t\tmesh.castShadow = this.dicefactory.shadows;\n\t\t\tif (mesh.children) {\n\t\t\t\tfor (var i = 0; i < mesh.children.length; i++) {\n\t\t\t\t\tmesh.children[i].castShadow = true;\n\t\t\t\t\tmesh.children[i].receiveShadow = true;\n\t\t\t\t\tif (mesh.children[i]) {\n\t\t\t\t\t\tfor (var j = 0; j < mesh.children[i].length; j++) {\n\t\t\t\t\t\t\tmesh.children[i].children[j].castShadow = true;\n\t\t\t\t\t\t\tmesh.children[i].children[j].receiveShadow = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar o = body.shapeOffsets[l];\n\t\t\tvar q = body.shapeOrientations[l];\n\t\t\tmesh.position.set(o.x, o.y, o.z);\n\t\t\tmesh.quaternion.set(q.x, q.y, q.z, q.w);\n\n\t\t\tobj.add(mesh);\n\t\t}\n\n\t\treturn obj;\n\t}\n\n\tfindRootObject(object) {\n\t\tif (object.hasOwnProperty(\"shape\"))\n\t\t\treturn object;\n\t\telse if (object.parent)\n\t\t\treturn this.findRootObject(object.parent);\n\t\telse\n\t\t\treturn null;\n\t}\n\n\tfindShowcaseDie(pos) {\n\t\tthis.raycaster.setFromCamera(pos, this.camera);\n\t\tconst intersects = this.raycaster.intersectObjects([...this.diceList, ...this.deadDiceList], true);\n\t\tif (intersects.length) {\n\n\t\t\treturn intersects[0];\n\t\t}\n\t\telse\n\t\t\treturn null;\n\t}\n\n\tfindHoveredDie() {\n\t\tif (this.isVisible && !this.running && !this.mouse.constraintDown) {\n\t\t\tthis.raycaster.setFromCamera(this.mouse.pos, this.camera);\n\t\t\tconst intersects = this.raycaster.intersectObjects([...this.diceList, ...this.deadDiceList], true);\n\t\t\tif (intersects.length) {\n\t\t\t\tthis.hoveredDie = intersects[0];\n\t\t\t}\n\t\t\telse\n\t\t\t\tthis.hoveredDie = null;\n\t\t}\n\t}\n\n\tonMouseMove(event, ndc) {\n\t\tthis.mouse.pos.x = ndc.x;\n\t\tthis.mouse.pos.y = ndc.y;\n\n\t\tif (this.mouse.constraint) {\n\t\t\tthis.raycaster.setFromCamera(this.mouse.pos, this.camera);\n\t\t\tconst intersects = this.raycaster.intersectObjects([this.desk]);\n\t\t\tif (intersects.length) {\n\t\t\t\tlet pos = intersects[0].point;\n\t\t\t\tthis.jointBody.position.set(pos.x, pos.y, pos.z + 150);\n\t\t\t\tthis.mouse.constraint.update();\n\t\t\t}\n\t\t}\n\t}\n\n\tonMouseDown(event, ndc) {\n\t\tthis.mouse.pos.x = ndc.x;\n\t\tthis.mouse.pos.y = ndc.y;\n\t\tthis.hoveredDie = null;\n\t\tthis.findHoveredDie();\n\n\t\tlet entity = this.hoveredDie;\n\t\tif (!entity)\n\t\t\treturn;\n\t\tlet pos = entity.point;\n\t\tif (pos) {\n\t\t\tthis.mouse.constraintDown = true;\n\t\t\t//disable FVTT mouse events\n\t\t\tevent.stopPropagation();\n\t\t\tevent.preventDefault();\n\t\t\tif (canvas.mouseInteractionManager)\n\t\t\t\tcanvas.mouseInteractionManager.object.interactive = false;\n\n\t\t\t// Vector to the clicked point, relative to the body\n\t\t\tlet root = this.findRootObject(entity.object);\n\t\t\tlet v1 = new CANNON.Vec3(pos.x, pos.y, pos.z).vsub(root.body_sim.position);\n\n\t\t\t// Apply anti-quaternion to vector to tranform it into the local body coordinate system\n\t\t\tlet antiRot = root.body_sim.quaternion.inverse();\n\t\t\tlet pivot = antiRot.vmult(v1); // pivot is not in local body coordinates\n\n\t\t\t// Move the cannon click marker particle to the click position\n\t\t\tthis.jointBody.position.set(pos.x, pos.y, pos.z + 150);\n\n\t\t\t// Create a new constraint\n\t\t\t// The pivot for the jointBody is zero\n\t\t\tthis.mouse.constraint = new CANNON.PointToPointConstraint(root.body_sim, pivot, this.jointBody, new CANNON.Vec3(0, 0, 0));\n\n\t\t\t// Add the constriant to world\n\t\t\tthis.world_sim.addConstraint(this.mouse.constraint);\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tonMouseUp(event) {\n\t\tif (this.mouse.constraintDown) {\n\t\t\tthis.mouse.constraintDown = false;\n\t\t\tthis.world_sim.removeConstraint(this.mouse.constraint);\n\n\t\t\t//re-enable fvtt canvas events\n\t\t\tif (canvas.mouseInteractionManager)\n\t\t\t\tcanvas.mouseInteractionManager.activate();\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tasync handleSpecialEffectsInit() {\n\t\tlet promisesSFX = [];\n\t\tthis.diceList.forEach(dice => {\n\t\t\tif (dice.specialEffects) {\n\t\t\t\tdice.specialEffects.forEach(sfx => {\n\t\t\t\t\tpromisesSFX.push(DiceSFXManager.playSFX(sfx, this, dice));\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t\treturn Promise.all(promisesSFX);\n\t}\n}\n","\"use strict\"\n\nexport class DiceNotation {\n\n\t/**\n\t * A roll object from Foundry \n\t * @param {Roll} rolls \n\t */\n\tconstructor(rolls, userConfig = null) {\n\t\tthis.throws = [{dice:[]}];\n\t\tthis.userConfig = userConfig;\n\t\t\n\t\t//First we need to prepare the data\n\t\trolls.dice.forEach(die => {\n\t\t\t//We only are able to handle this list of number of face in 3D for now\n\t\t\tif([2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 30, 100].includes(die.faces)) {\n\t\t\t\t//We flag every single die with a throw number, to queue exploded dice\n\t\t\t\tlet cnt=die.number;\n\t\t\t\tlet countExploded = 0;\n\t\t\t\tlet localNbThrow = 0;\n\t\t\t\tfor(let i =0; i< die.results.length; i++){\n\t\t\t\t\tif(localNbThrow >= this.throws.length)\n\t\t\t\t\t\tthis.throws.push({dice:[]});\n\n\t\t\t\t\tif(die.results[i].exploded)\n\t\t\t\t\t\tcountExploded++;\n\t\t\t\t\tdie.results[i].indexThrow = localNbThrow;\n\t\t\t\t\tif (die.results[i].discarded) continue; //Continue if die result is discarded\n\t\t\t\t\t//If we have a new throw\n\t\t\t\t\tif(--cnt <= 0){\n\t\t\t\t\t\tlocalNbThrow++;\n\t\t\t\t\t\tcnt = countExploded;\n\t\t\t\t\t\tcountExploded = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tlet diceNumber = 0;\n\t\tlet maxDiceNumber = game.settings.get(\"dice-so-nice\", \"maxDiceNumber\");\n\t\t//Then we can create the throws\n\t\trolls.dice.some(die => {\n\t\t\t//We only are able to handle this list of number of face in 3D for now\n\t\t\tif([2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 30, 100].includes(die.faces)) {\n\t\t\t\tfor(let i =0; i< die.results.length; i++){\n\t\t\t\t\tif(++diceNumber >= maxDiceNumber)\n\t\t\t\t\t\treturn true;\n\t\t\t\t\tif(!die.results[i].hidden){\n\t\t\t\t\t\t//ghost can't be secret\n\t\t\t\t\t\tif(rolls.ghost)\n\t\t\t\t\t\t\tdie.options.ghost = true;\n\t\t\t\t\t\telse if(rolls.secret)\n\t\t\t\t\t\t\tdie.options.secret = true;\n\t\t\t\t\t\t\n\t\t\t\t\t\tthis.addDie(die, i);\n\t\t\t\t\t\tif(die.faces == 100){\n\t\t\t\t\t\t\tthis.addDie(die, i, true);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\taddDie(fvttDie, index, isd10of100 = false){\n\t\tlet dsnDie = {};\n\t\tlet dieValue = fvttDie.results[index].result;\n\t\tif(fvttDie.faces == 100) {\n\t\t\t//For d100, we create two d10 dice\n\t\t\tif(isd10of100) {\n\t\t\t\tdieValue = dieValue%10;\n\t\t\t\t\n\t\t\t\tdsnDie.resultLabel = fvttDie.getResultLabel({result:dieValue});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tdieValue = parseInt(dieValue/10);\n\t\t\t\tdsnDie.resultLabel = fvttDie.getResultLabel({result:dieValue*10});\n\t\t\t\t//On a d100, 0 is 10, because.\n\t\t\t\tif(dieValue==10)\n\t\t\t\t\tdieValue=0;\n\t\t\t}\n\t\t\tdsnDie.d100Result = fvttDie.results[index].result;\n\t\t} else\n\t\t\t\n\t\t\tdsnDie.resultLabel = fvttDie.getResultLabel({result:dieValue});\n\t\tdsnDie.result = dieValue;\n\t\tif(fvttDie.results[index].discarded)\n\t\t\tdsnDie.discarded = true;\n\n\t\t//If it is not a standard die (\"d\"), we need to prepend \"d\" to the denominator. If it is, we append the number of face\n\t\tdsnDie.type = fvttDie.constructor.DENOMINATION;\n\t\tif(fvttDie.constructor.name == CONFIG.Dice.terms[\"d\"].name)\n\t\t\tdsnDie.type += isd10of100 ? \"10\":fvttDie.faces;\n\t\telse {\n\t\t\tdsnDie.type = \"d\"+dsnDie.type;\n\t\t}\n\t\tdsnDie.vectors = [];\n\t\t//Contains optionals flavor (core) and colorset (dsn) infos.\n\t\tdsnDie.options = duplicate(fvttDie.options);\n\t\tif(this.userConfig && !this.userConfig.enableFlavorColorset && dsnDie.options.flavor)\n\t\t\tdelete dsnDie.options.flavor;\n\t\tthis.throws[fvttDie.results[index].indexThrow].dice.push(dsnDie);\n\t}\n\n\tstatic mergeQueuedRollCommands(queue){\n\t\tlet mergedRollCommands = [];\n\t\tqueue.forEach(command => {\n\t\t\tfor(let i = 0; i< command.params.throws.length; i++){\n\t\t\t\tif(!mergedRollCommands[i])\n\t\t\t\t\tmergedRollCommands.push([]);\n\t\t\t\tcommand.params.throws[i].dsnConfig = command.params.dsnConfig;\n\t\t\t\tmergedRollCommands[i].push(command.params.throws[i]);\n\t\t\t}\n\t\t});\n\t\t//commands\n\t\tfor(let i=0;i {\n\t\t\t\t\t\treturn !mergedRollCommands[i][j].dice[k].discarded && !mergedRollCommands[i][j].dice[k].options.ghost &&\n\t\t\t\t\t\t(((sfx.diceType != \"d100\" && sfx.diceType == mergedRollCommands[i][j].dice[k].type && sfx.onResult.includes(mergedRollCommands[i][j].dice[k].result.toString()))\n\t\t\t\t\t\t\t|| \n\t\t\t\t\t\t(sfx.diceType == \"d100\" && mergedRollCommands[i][j].dice[k].d100Result && sfx.onResult.includes(mergedRollCommands[i][j].dice[k].d100Result.toString())))\n\t\t\t\t\t\t\t||\n\t\t\t\t\t\t(mergedRollCommands[i][j].dice[k].options.sfx && mergedRollCommands[i][j].dice[k].options.sfx.id == sfx.diceType && sfx.onResult.includes(mergedRollCommands[i][j].dice[k].options.sfx.result.toString())))\n\t\t\t\t\t});\n\t\t\t\t\tif(mergedRollCommands[i][j].dice[k].options.sfx && mergedRollCommands[i][j].dice[k].options.sfx.specialEffect)\n\t\t\t\t\t\tspecialEffects.push({\n\t\t\t\t\t\t\tspecialEffect:mergedRollCommands[i][j].dice[k].options.sfx.specialEffect,\n\t\t\t\t\t\t\toptions:mergedRollCommands[i][j].dice[k].options.sfx.options\n\t\t\t\t\t\t});\n\t\t\t\t\tif(specialEffects.length){\n\t\t\t\t\t\t//remove duplicate\n\t\t\t\t\t\tspecialEffects = specialEffects.filter((v, i, a) => a.indexOf(v) === i);\n\t\t\t\t\t\tmergedRollCommands[i][j].dice[k].specialEffects = specialEffects;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn mergedRollCommands;\n\t}\n}\n","export class Accumulator {\n constructor(delay, onEnd) {\n this._timeout = null;\n this._delay = delay;\n this._onEnd = onEnd;\n this._items = [];\n }\n\n addItem(item) {\n this._items.push(item);\n if (this._timeout)\n clearTimeout(this._timeout);\n let callback = function () {\n this._onEnd(this._items)\n this._timeout = null\n this._items = [];\n }.bind(this);\n if (this._delay)\n this._timeout = setTimeout(callback, this._delay);\n else\n callback();\n }\n}","import { TEXTURELIST, COLORSETS } from './DiceColors.js';\n/**\n * Generic utilities class...\n */\n export class Utils {\n\n /**\n * Migrate old 1.0 or 2.0 setting to new 4.0 format.\n */\n static async migrateOldSettings() {\n\n //migrate settings to flags. This is a scoped migration, no GM needed\n let userSettings = game.settings.get(\"dice-so-nice\", \"settings\");\n if(userSettings.hasOwnProperty(\"enabled\")){\n await game.user.setFlag(\"dice-so-nice\", \"settings\", userSettings);\n await game.settings.set(\"dice-so-nice\",\"settings\",{});\n }\n\n let formatversion = game.settings.get(\"dice-so-nice\", \"formatVersion\");\n\n if (formatversion == \"\" || formatversion != \"4.1\") { //Never updated or first install\n if (!game.user.isGM) {\n ui.notifications.warn(game.i18n.localize(\"DICESONICE.migrateMessageNeedGM\"));\n return false;\n }\n } else if (formatversion == \"4.1\") {\n //Fuck it, lets do this so I'm sure it it not because of DsN itself.\n if (game.user.isGM) {\n await Promise.all(game.users.map(async (user) => {\n let appearance = user.getFlag(\"dice-so-nice\", \"appearance\") ? duplicate(user.getFlag(\"dice-so-nice\", \"appearance\")) : null;\n if (appearance && appearance.hasOwnProperty(\"labelColor\")) {\n let data = {\n \"-=colorset\":null,\n \"-=diceColor\":null,\n \"-=edgeColor\":null,\n \"-=font\":null,\n \"-=labelColor\":null,\n \"-=material\":null,\n \"-=outlineColor\":null,\n \"-=system\":null,\n \"-=texture\":null\n };\n await user.setFlag(\"dice-so-nice\", \"appearance\", data);\n }\n }));\n } else {\n let appearance = game.user.getFlag(\"dice-so-nice\", \"appearance\") ? duplicate(game.user.getFlag(\"dice-so-nice\", \"appearance\")) : null;\n if (appearance && appearance.hasOwnProperty(\"labelColor\")) {\n let data = {\n \"-=colorset\":null,\n \"-=diceColor\":null,\n \"-=edgeColor\":null,\n \"-=font\":null,\n \"-=labelColor\":null,\n \"-=material\":null,\n \"-=outlineColor\":null,\n \"-=system\":null,\n \"-=texture\":null\n };\n await game.user.setFlag(\"dice-so-nice\", \"appearance\", data);\n }\n }\n return true;\n }\n let migrated = false;\n \n if(formatversion == \"\"){\n //v1 to v2\n let settings = game.user.getFlag(\"dice-so-nice\", \"settings\") ? duplicate(game.user.getFlag(\"dice-so-nice\", \"settings\")):{};\n if (settings.diceColor || settings.labelColor) {\n let newSettings = mergeObject(game.dice3d.constructor.DEFAULT_OPTIONS, settings, { insertKeys: false, insertValues: false,performDeletions:true });\n let appearance = mergeObject(game.dice3d.constructor.DEFAULT_APPEARANCE(), settings, { insertKeys: false, insertValues: false,performDeletions:true});\n await game.settings.set(\"dice-so-nice\", \"settings\", mergeObject(newSettings, { \"-=dimensions\": null, \"-=fxList\": null },{performDeletions:true}));\n await game.user.setFlag(\"dice-so-nice\", \"appearance\", appearance);\n migrated = true;\n }\n\n //v2 to v4\n await Promise.all(game.users.map(async (user) => {\n let appearance = user.getFlag(\"dice-so-nice\", \"appearance\") ? duplicate(user.getFlag(\"dice-so-nice\", \"appearance\")) : null;\n if (appearance && appearance.hasOwnProperty(\"labelColor\")) {\n let data = {\n global: appearance\n };\n await user.unsetFlag(\"dice-so-nice\", \"appearance\");\n await user.setFlag(\"dice-so-nice\", \"appearance\", data);\n migrated = true;\n }\n\n let sfxList = user.getFlag(\"dice-so-nice\", \"sfxList\") ? duplicate(user.getFlag(\"dice-so-nice\", \"sfxList\")) : null;\n \n if(sfxList){\n if(!Array.isArray(sfxList))\n sfxList = Object.values(sfxList);\n sfxList.forEach((sfx)=>{\n sfx.onResult = [sfx.onResult];\n });\n await user.unsetFlag(\"dice-so-nice\", \"sfxList\");\n await user.setFlag(\"dice-so-nice\", \"sfxList\", sfxList);\n migrated = true;\n }\n }));\n }\n //v4 to v4.1 (fix)\n //Remove the extra properties, no idea why tho\n await Promise.all(game.users.map(async (user) => {\n let appearance = user.getFlag(\"dice-so-nice\", \"appearance\") ? duplicate(user.getFlag(\"dice-so-nice\", \"appearance\")) : null;\n if (appearance && appearance.hasOwnProperty(\"labelColor\")) {\n let data = {\n \"-=colorset\":null,\n \"-=diceColor\":null,\n \"-=edgeColor\":null,\n \"-=font\":null,\n \"-=labelColor\":null,\n \"-=material\":null,\n \"-=outlineColor\":null,\n \"-=system\":null,\n \"-=texture\":null\n };\n await user.setFlag(\"dice-so-nice\", \"appearance\", data);\n }\n }));\n\n game.settings.set(\"dice-so-nice\", \"formatVersion\", \"4.1\");\n if(migrated)\n ui.notifications.info(game.i18n.localize(\"DICESONICE.migrateMessage\"));\n return true;\n }\n\n\n /**\n *\n * @param cfg\n * @returns {{}}\n */\n static localize(cfg) {\n return Object.keys(cfg).reduce((i18nCfg, key) => {\n i18nCfg[key] = game.i18n.localize(cfg[key]);\n return i18nCfg;\n }, {}\n );\n };\n\n /**\n * Get the contrasting color for any hex color.\n *\n * @returns {String} The contrasting color (black or white)\n */\n static contrastOf(color) {\n\n if (color.slice(0, 1) === '#') {\n color = color.slice(1);\n }\n\n if (color.length === 3) {\n color = color.split('').map(function (hex) {\n return hex + hex;\n }).join('');\n }\n\n const r = parseInt(color.substr(0, 2), 16);\n const g = parseInt(color.substr(2, 2), 16);\n const b = parseInt(color.substr(4, 2), 16);\n\n var yiq = ((r * 299) + (g * 587) + (b * 114)) / 1000;\n\n return (yiq >= 128) ? '#000000' : '#FFFFFF';\n };\n\n static prepareTextureList() {\n return Object.keys(TEXTURELIST).reduce((i18nCfg, key) => {\n i18nCfg[key] = game.i18n.localize(TEXTURELIST[key].name);\n return i18nCfg;\n }, {}\n );\n };\n\n static prepareFontList() {\n let fontList = {\n \"auto\": game.i18n.localize(\"DICESONICE.FontAuto\")\n };\n return mergeObject(fontList,FontConfig.getAvailableFontChoices());\n };\n\n static prepareColorsetList() {\n let groupedSetsList = Object.values(COLORSETS);\n groupedSetsList.sort((set1, set2) => {\n if (game.i18n.localize(set1.description) < game.i18n.localize(set2.description)) return -1;\n if (game.i18n.localize(set1.description) > game.i18n.localize(set2.description)) return 1;\n });\n let preparedList = {};\n for (let i = 0; i < groupedSetsList.length; i++) {\n if (groupedSetsList[i].visibility == 'hidden')\n continue;\n let locCategory = game.i18n.localize(groupedSetsList[i].category);\n if (!preparedList.hasOwnProperty(locCategory))\n preparedList[locCategory] = {};\n preparedList[locCategory][groupedSetsList[i].name] = game.i18n.localize(groupedSetsList[i].description);\n }\n\n return preparedList;\n };\n\n static prepareSystemList() {\n let systems = game.dice3d.box.dicefactory.systems;\n return Object.keys(systems).reduce((i18nCfg, key) => {\n i18nCfg[key] = game.i18n.localize(systems[key].name);\n return i18nCfg;\n }, {});\n };\n\n static filterObject(obj, predicate) {\n return Object.keys(obj)\n .filter(key => predicate(obj[key]))\n .reduce((res, key) => (res[key] = obj[key], res), {});\n }\n\n static actionSaveAs(name){\n let savesObject = game.user.getFlag(\"dice-so-nice\", \"saves\");\n let saves;\n if (!savesObject) {\n saves = new Map();\n } else {\n //workaround for https://gitlab.com/foundrynet/foundryvtt/-/issues/5464\n saves = new Map(Object.entries(savesObject));\n }\n //save current settings first\n \n let saveObject = {\n appearance: game.user.getFlag(\"dice-so-nice\", \"appearance\"),\n sfxList: game.user.getFlag(\"dice-so-nice\", \"sfxList\"),\n settings: game.settings.get(\"dice-so-nice\", \"settings\")\n };\n\n saves.set(name, saveObject);\n game.user.unsetFlag(\"dice-so-nice\", \"saves\").then(() => {\n game.user.setFlag(\"dice-so-nice\", \"saves\", Object.fromEntries(saves));\n });\n }\n\n static async actionDeleteSave(name){\n let savesObject = game.user.getFlag(\"dice-so-nice\", \"saves\");\n let saves = new Map(Object.entries(savesObject));\n saves.delete(name);\n game.user.unsetFlag(\"dice-so-nice\", \"saves\").then(async () => {\n await game.user.setFlag(\"dice-so-nice\", \"saves\", Object.fromEntries(saves));\n ui.notifications.info(game.i18n.localize(\"DICESONICE.saveMessage\"));\n });\n }\n\n static async actionLoadSave(name) {\n let savesObject = game.user.getFlag(\"dice-so-nice\", \"saves\");\n let save = new Map(Object.entries(savesObject)).get(name);\n\n if (save.appearance) {\n await game.user.unsetFlag(\"dice-so-nice\", \"appearance\");\n await game.user.setFlag(\"dice-so-nice\", \"appearance\", save.appearance);\n }\n if (save.sfxList) {\n await game.user.unsetFlag(\"dice-so-nice\", \"sfxList\");\n await game.user.setFlag(\"dice-so-nice\", \"sfxList\", save.sfxList);\n }\n if (save.settings) {\n await game.user.unsetFlag(\"dice-so-nice\", \"settings\");\n await game.user.setFlag(\"dice-so-nice\", \"settings\", save.settings);\n }\n }\n}\n","export class DiceTour extends Tour {\n //This class overcharge the \"step\" data structure with the following properties:\n // - action: \"click\" or \"scrollTo\"\n // - target: CSS selector of the element to use for the action. If not set, the selector is used for the action\n\n /**\n * Wait for an element to exists in the DOM then resolves the promise\n * @param {string} selector CSS selector of the element to wait for\n * @returns {Promise}\n */\n async waitForElement(selector) {\n return new Promise((resolve, reject) => {\n let element = document.querySelector(selector);\n if (element) {\n resolve();\n return;\n }\n\n const observer = new MutationObserver((mutations, observer) => {\n document.querySelectorAll(selector).forEach((el) => {\n resolve(el);\n observer.disconnect();\n });\n })\n\n observer.observe(document.body, {\n childList: true,\n subtree: true\n });\n });\n }\n\n async _preStep() {\n await super._preStep();\n await this.waitForElement(this.currentStep.selector);\n }\n\n async _postStep() {\n await super._postStep();\n if (this.stepIndex < 0 || !this.hasNext)\n return;\n\n if (!this.currentStep.action)\n return;\n\n if(this.triggerReset) {\n this.triggerReset = false;\n return;\n }\n let target = this.currentStep.target ? this.currentStep.target : this.currentStep.selector;\n switch (this.currentStep.action) {\n case \"click\":\n document.querySelector(target).click();\n break;\n case \"scrollTo\":\n document.querySelector(target).scrollIntoView({ block: \"start\", inline: \"nearest\" });\n break;\n }\n }\n\n /**\n * Detect when a reset is triggered and stop the actions in _postStep\n */\n async reset() {\n if(this.status != \"completed\")\n this.triggerReset = true;\n await super.reset();\n }\n}","import { DiceTour } from \"./DiceTour.js\";\n\nexport class DiceTourMain extends DiceTour {\n constructor() {\n super({\n title: \"How to use Dice So Nice!\",\n description: \"Learn how to customize your 3D dice in this short tour of the module\",\n canBeResumed: false,\n display: true,\n steps: [\n {\n id: \"goto-settings\",\n selector: \"[data-tab=\\\"settings\\\"]\",\n title: game.i18n.localize(\"DICESONICE.TourMainTitleGotoSettings\"),\n content: game.i18n.localize(\"DICESONICE.TourMainContentGotoSettings\"),\n action: \"click\"\n },\n {\n id: \"goto-configure\",\n selector: \"[data-action=\\\"configure\\\"]\",\n title: game.i18n.localize(\"DICESONICE.TourMainTitleGotoConfigure\"),\n content: game.i18n.localize(\"DICESONICE.TourMainContentGotoConfigure\"),\n action: \"click\"\n },\n {\n id: \"goto-modulessettings\",\n title: game.i18n.localize(\"DICESONICE.TourMainTitleGotoModulesSettings\"),\n selector: \".category-filter [data-category=\\\"dice-so-nice\\\"]\",\n content: game.i18n.localize(\"DICESONICE.TourMainContentGotoModulesSettings\"),\n action: \"click\"\n },\n {\n id: \"goto-dicesonice\",\n title: game.i18n.localize(\"DICESONICE.TourMainTitleGotoDiceSoNice\"),\n selector: \"#client-settings form.categories div.scrollable\",\n content: game.i18n.localize(\"DICESONICE.TourMainContentGotoDiceSoNice\"),\n },\n {\n id: \"goto-dicesonice-settings\",\n title: game.i18n.localize(\"DICESONICE.TourMainTitleGotoDiceSoNiceSettings\"),\n selector: \"[data-key=\\\"dice-so-nice.dice-so-nice\\\"]\",\n content: game.i18n.localize(\"DICESONICE.TourMainContentGotoDiceSoNiceSettings\"),\n action: \"click\"\n },\n {\n id: \"show-3d-dice\",\n title: game.i18n.localize(\"DICESONICE.TourMainTitleShow3DDice\"),\n selector: \"#dice-configuration-canvas\",\n content: game.i18n.localize(\"DICESONICE.TourMainContentShow3DDice\")\n },\n {\n id: \"show-appearance\",\n title: game.i18n.localize(\"DICESONICE.TourMainTitleShowAppearance\"),\n selector: \"#dsn-appearance-content\",\n content: game.i18n.localize(\"DICESONICE.TourMainContentShowAppearance\"),\n action: \"click\",\n target: \".dice-so-nice a[data-tab=\\\"preferences\\\"]\"\n },\n {\n id:\"show-preferences\",\n title: game.i18n.localize(\"DICESONICE.TourMainTitleShowPreferences\"),\n selector: \".dice-so-nice div.tab.active[data-tab=\\\"preferences\\\"]\",\n content: game.i18n.localize(\"DICESONICE.TourMainContentShowPreferences\"),\n action: \"click\",\n target: \".dice-so-nice a[data-tab=\\\"sfx\\\"]\"\n },\n {\n id: \"show-sfx\",\n title: game.i18n.localize(\"DICESONICE.TourMainTitleShowSFX\"),\n selector: \".dice-so-nice div.tab.active[data-tab=\\\"sfx\\\"]\",\n content: game.i18n.localize(\"DICESONICE.TourMainContentShowSFX\"),\n action: \"click\",\n target: \".dice-so-nice a[data-tab=\\\"performance\\\"]\"\n },\n {\n id: \"show-performance\",\n title: game.i18n.localize(\"DICESONICE.TourMainTitleShowPerformance\"),\n selector: \".dice-so-nice div.tab.active[data-tab=\\\"performance\\\"]\",\n content: game.i18n.localize(\"DICESONICE.TourMainContentShowPerformance\"),\n action: \"click\",\n target: \".dice-so-nice a[data-tab=\\\"backup\\\"]\"\n },\n {\n id: \"show-backup\",\n title: game.i18n.localize(\"DICESONICE.TourMainTitleShowBackup\"),\n selector: \".dice-so-nice div.tab.active[data-tab=\\\"backup\\\"]\",\n content: game.i18n.localize(\"DICESONICE.TourMainContentShowBackup\")\n },\n {\n id: \"end-tour\",\n title: game.i18n.localize(\"DICESONICE.TourMainTitleEndTour\"),\n selector: \".dice-so-nice div.tab.active[data-tab=\\\"backup\\\"]\",\n content: game.i18n.localize(\"DICESONICE.TourMainContentEndTour\")\n }\n ]\n });\n }\n /**\n * Override the DiceTour _preStep method to wait for the element to exists in the DOM\n */\n async _preStep() {\n switch (this.currentStep.id) {\n case \"goto-settings\":\n //start on the chat tab\n document.querySelector('a[data-tab=\"chat\"]').click();\n break;\n case \"goto-dicesonice\":\n //There is no native selector available for this step so we add something to identify the element with jQuery\n $(\"[data-tab=\\\"modules\\\"] h2:contains('Dice So Nice!')\").addClass(\"dice-tour\");\n break;\n }\n\n await super._preStep();\n }\n\n async _postStep() {\n if(!this.currentStep)\n return;\n switch (this.currentStep.id) {\n case \"end-tour\":\n //end the tour with a bang\n document.querySelector('.dice-so-nice button[data-test]').click();\n break;\n }\n await super._postStep();\n }\n}","import { DiceFactory } from './DiceFactory.js';\nimport { DiceBox } from './DiceBox.js';\nimport { DiceColors, TEXTURELIST, COLORSETS } from './DiceColors.js';\nimport { DiceNotation } from './DiceNotation.js';\nimport { DiceSFXManager } from './DiceSFXManager.js';\nimport { Accumulator } from './Accumulator.js';\nimport { Utils } from './Utils.js';\nimport { ThinFilmFresnelMap } from './libs/ThinFilmFresnelMap.js';\nimport { TextureLoader } from 'three';\nimport { DiceTourMain } from './tours/DiceTourMain.js';\n/**\n * Main class to handle 3D Dice animations.\n */\nexport class Dice3D {\n\n static get DEFAULT_OPTIONS() {\n return {\n enabled: true,\n showExtraDice: game.dice3d && game.dice3d.hasOwnProperty(\"defaultShowExtraDice\") ? game.dice3d.defaultShowExtraDice : false,\n hideAfterRoll: true,\n timeBeforeHide: 2000,\n hideFX: 'fadeOut',\n autoscale: true,\n scale: 75,\n speed: 1,\n imageQuality: \"high\",\n shadowQuality: 'high',\n bumpMapping: true,\n sounds: true,\n soundsSurface: 'felt',\n soundsVolume: 0.5,\n canvasZIndex: 'over',\n throwingForce: 'medium',\n useHighDPI: true,\n antialiasing: game.canvas.app.renderer.context.webGLVersion === 2 ? \"msaa\" : \"smaa\",\n glow: true,\n showOthersSFX: true,\n immersiveDarkness: true,\n muteSoundSecretRolls: false,\n enableFlavorColorset: true,\n rollingArea: false\n };\n }\n\n static DEFAULT_APPEARANCE(user = game.user) {\n return {\n global: {\n labelColor: Utils.contrastOf(user.color),\n diceColor: user.color,\n outlineColor: user.color,\n edgeColor: user.color,\n texture: \"none\",\n material: \"auto\",\n font: \"auto\",\n colorset: \"custom\",\n system: \"standard\"\n }\n };\n }\n\n static ALL_DEFAULT_OPTIONS(user = game.user) {\n let options = mergeObject(Dice3D.DEFAULT_OPTIONS, { appearance: Dice3D.DEFAULT_APPEARANCE(user) }, { performDeletions: true });\n options.appearance.global.system = game.dice3d.DiceFactory.preferredSystem;\n options.appearance.global.colorset = game.dice3d.DiceFactory.preferredColorset;\n return options;\n }\n\n static CONFIG(user = game.user) {\n let userSettings = user.getFlag(\"dice-so-nice\", \"settings\") ? duplicate(user.getFlag(\"dice-so-nice\", \"settings\")) : null;\n let config = mergeObject(Dice3D.DEFAULT_OPTIONS, userSettings, { performDeletions: true });\n mergeObject(config, { \"-=appearance\": null, \"-=sfxLine\": null }, { performDeletions: true });\n return config;\n }\n\n static APPEARANCE(user = game.user) {\n let userAppearance = user.getFlag(\"dice-so-nice\", \"appearance\") ? duplicate(user.getFlag(\"dice-so-nice\", \"appearance\")) : null;\n let appearance = mergeObject(Dice3D.DEFAULT_APPEARANCE(user), userAppearance, { performDeletions: true });\n return mergeObject(appearance, { \"-=dimensions\": null }, { performDeletions: true });\n }\n\n static SFX(user = game.user) {\n let sfxArray;\n if (Dice3D.CONFIG().showOthersSFX || user.id == game.user.id)\n sfxArray = user.getFlag(\"dice-so-nice\", \"sfxList\") ? duplicate(user.getFlag(\"dice-so-nice\", \"sfxList\")) : [];\n else\n sfxArray = [];\n if (!Array.isArray(sfxArray)) {\n sfxArray = [];\n }\n return sfxArray;\n }\n\n /**\n * Get the full customizations settings for the _showAnimation method \n */\n static ALL_CUSTOMIZATION(user = game.user, dicefactory = null) {\n let specialEffects = Dice3D.SFX(user) || [];\n game.users.forEach((other) => {\n if (other.isGM && other.id != user.id) {\n let GMSFX = Dice3D.SFX(other);\n if (Array.isArray(GMSFX)) {\n GMSFX = GMSFX.filter(sfx => sfx.options && sfx.options.isGlobal);\n specialEffects = specialEffects.concat(GMSFX);\n }\n }\n });\n let config = mergeObject({ appearance: Dice3D.APPEARANCE(user) }, { specialEffects: specialEffects }, { performDeletions: true });\n if (dicefactory && !game.user.getFlag(\"dice-so-nice\", \"appearance\")) {\n if (dicefactory.preferredSystem != \"standard\")\n config.appearance.global.system = dicefactory.preferredSystem;\n if (dicefactory.preferredColorset != \"custom\")\n config.appearance.global.colorset = dicefactory.preferredColorset;\n }\n return config;\n }\n\n static ALL_CONFIG(user = game.user) {\n let ret = mergeObject(Dice3D.CONFIG(user), { appearance: Dice3D.APPEARANCE(user) }, { performDeletions: true });\n ret.specialEffects = Dice3D.SFX(user);\n return ret;\n }\n\n /**\n * Register a new system\n * The id is to be used with addDicePreset\n * The name can be a localized string\n * @param {Object} system {id, name}\n * @param {Boolean} mode \"default,preferred\". Default will add the system as a choice. Preferred will be enabled for all users unless they change their settings.\n */\n addSystem(system, mode = \"default\") {\n //retrocompatibility with API version < 3.1\n if (typeof mode == \"boolean\") {\n mode = mode ? \"preferred\" : \"default\";\n }\n\n this.DiceFactory.addSystem(system, mode);\n }\n\n /**\n * Register a new dice preset\n * Type should be a known dice type (d4,d6,d8,d10,d12,d14,d16,d20,d24,d30,d100)\n * Labels contains either strings (unicode) or a path to a texture (png, gif, jpg, webp)\n * The texture file size should be 256*256\n * The system should be a system id already registered\n * @param {Object} dice {type:\"\",labels:[],system:\"\"}\n */\n addDicePreset(dice, shape = null) {\n this.DiceFactory.addDicePreset(dice, shape);\n }\n\n /**\n * Add a texture to the list of textures and preload it\n * @param {String} textureID \n * @param {Object} textureData \n * @returns {Promise}\n */\n addTexture(textureID, textureData) {\n if (!textureData.bump)\n textureData.bump = '';\n return new Promise((resolve) => {\n let textureEntry = {};\n textureEntry[textureID] = textureData;\n TEXTURELIST[textureID] = textureData;\n DiceColors.loadTextures(textureEntry, (images) => {\n resolve();\n });\n });\n }\n\n /**\n * Add a colorset (theme)\n * @param {Object} colorset \n * @param {Object} mode = \"default\", \"preferred\"\n */\n async addColorset(colorset, mode = \"default\") {\n let defaultValues = {\n foreground: \"custom\",\n background: \"custom\",\n outline: \"\",\n edge: \"\",\n texture: \"custom\",\n material: \"custom\",\n font: \"custom\",\n visibility: \"visible\"\n }\n colorset = mergeObject(defaultValues, colorset, { performDeletions: true });\n COLORSETS[colorset.name] = colorset;\n DiceColors.initColorSets(colorset);\n\n if (colorset.font && !FontConfig.getAvailableFonts().includes(colorset.font)) {\n await FontConfig.loadFont(colorset.font, { editor: false, fonts: [] });\n }\n if (mode == \"preferred\")\n this.DiceFactory.preferredColorset = colorset.name;\n }\n\n /**\n * Add a new type if SFX trigger that can be customized by users.\n * This trigger can then be pulled by a system, a module or a macro\n * @param {String} id : Identifier of the trigger, ex: fate3df\n * @param {String} name : Localized name of the trigger, ex: Fate Roll\n * @param {Array(String)} results : Array of possible results for this trigger, ex: [\"-3\",\"3\",\"0\"]\n */\n addSFXTrigger(id, name, results) {\n if (DiceSFXManager.EXTRA_TRIGGER_RESULTS[id])\n return;\n DiceSFXManager.EXTRA_TRIGGER_TYPE.push({ id: id, name: name });\n DiceSFXManager.EXTRA_TRIGGER_RESULTS[id] = [];\n results.forEach((res) => {\n DiceSFXManager.EXTRA_TRIGGER_RESULTS[id].push({ id: res, name: res });\n });\n }\n\n /**\n * Load a save file by its name\n * @param {String} name \n * @returns {Promise}\n */\n async loadSaveFile(name) {\n if (game.user.getFlag(\"dice-so-nice\", \"saves\").hasOwnProperty(name))\n await Utils.actionLoadSave(name);\n }\n\n\n /**\n * Constructor. Create and initialize a new Dice3d.\n */\n constructor() {\n Hooks.call(\"diceSoNiceInit\", this);\n this.dice3dRenderers = {\n \"board\": null,\n \"showcase\": null\n };\n\n this.exports = {\n \"Utils\": Utils,\n \"DiceColors\": DiceColors,\n \"TEXTURELIST\": TEXTURELIST,\n \"COLORSETS\": COLORSETS\n };\n\n this.uniforms = {\n globalBloom: { value: 1 },\n bloomStrength: { value: 2.5 },\n bloomRadius: { value: 0.5 },\n bloomThreshold: { value: 0.03 },\n iridescenceLookUp: { value: new ThinFilmFresnelMap() },\n iridescenceNoise: { value: new TextureLoader().load(\"modules/dice-so-nice/textures/noise-thin-film.webp\") },\n boost: { value: 1.5 }\n };\n\n this.hiddenAnimationQueue = [];\n this.defaultShowExtraDice = Dice3D.DEFAULT_OPTIONS.showExtraDice;\n this._buildCanvas();\n this._initListeners();\n this._buildDiceBox();\n DiceColors.loadTextures(TEXTURELIST, async (images) => {\n DiceColors.initColorSets();\n\n Hooks.call(\"diceSoNiceReady\", this);\n await this.DiceFactory._loadFonts();\n await this.DiceFactory.preloadPresets();\n });\n DiceSFXManager.init();\n this._startQueueHandler();\n this._nextAnimationHandler();\n this._welcomeMessage();\n this._registerTours();\n }\n\n get canInteract() {\n return !this.box.running;\n }\n\n /**\n * Create and inject the dice box canvas resizing to the window total size.\n *\n * @private\n */\n _buildCanvas() {\n const config = Dice3D.CONFIG();\n const sidebarWidth = $('#sidebar').width();\n const sidebarOffset = sidebarWidth > window.innerWidth / 2 ? 0 : sidebarWidth;\n const area = config.rollingArea ? config.rollingArea : {\n left: 0,\n top: 0,\n width: window.innerWidth - sidebarOffset,\n height: window.innerHeight - 1\n };\n\n this.canvas = $(`
`);\n if (config.canvasZIndex === \"over\") {\n this.canvas.css(\"z-index\", 1000);\n this.canvas.appendTo($('body'));\n }\n else {\n $(\"#board\").after(this.canvas);\n }\n this.canvas.width(area.width + 'px');\n this.canvas.height(area.height + 'px');\n }\n\n /**\n * Build the dicebox.\n *\n * @private\n */\n _buildDiceBox() {\n this.DiceFactory = new DiceFactory();\n let config = Dice3D.ALL_CONFIG();\n config.boxType = \"board\";\n this.box = new DiceBox(this.canvas[0], this.DiceFactory, config);\n this.box.initialize();\n }\n\n /**\n * Init listeners on windows resize and on click if auto hide has been disabled within the settings.\n *\n * @private\n */\n _initListeners() {\n this._rtime;\n this._timeout = false;\n $(window).resize(() => {\n this._rtime = new Date();\n if (this._timeout === false) {\n this._timeout = true;\n setTimeout(this._resizeEnd.bind(this), 1000);\n }\n });\n\n $(document).on(\"click\", \".dice-so-nice-btn-settings\", (ev) => {\n ev.preventDefault();\n const menu = game.settings.menus.get(ev.currentTarget.dataset.key);\n const app = new menu.type();\n return app.render(true);\n });\n\n $(document).on(\"click\", \".dice-so-nice-btn-tour\", (ev) => {\n ev.preventDefault();\n game.tours.get(\"dice-so-nice.dice-so-nice-tour\").start();\n });\n\n game.socket.on('module.dice-so-nice', (request) => {\n switch (request.type) {\n case \"show\":\n if (!request.users || request.users.includes(game.user.id))\n this.show(request.data, game.users.get(request.user));\n break;\n case \"update\":\n if (request.user == game.user.id || Dice3D.CONFIG().showOthersSFX)\n DiceSFXManager.init();\n if (request.user != game.user.id) {\n this.DiceFactory.preloadPresets(false, request.user);\n }\n break;\n }\n });\n\n if (game.settings.get(\"dice-so-nice\", \"allowInteractivity\")) {\n $(document).on(\"mousemove.dicesonice\", \"body\", this._onMouseMove.bind(this));\n\n $(document).on(\"mousedown.dicesonice\", \"body\", this._onMouseDown.bind(this));\n\n $(document).on(\"mouseup.dicesonice\", \"body\", this._onMouseUp.bind(this));\n }\n }\n\n _mouseNDC(event) {\n let rect = this.canvas[0].getBoundingClientRect();\n let x = ((event.clientX - rect.left) / rect.width) * 2 - 1;\n if (x > 1)\n x = 1;\n let y = - ((event.clientY - rect.top) / rect.height) * 2 + 1;\n return { x: x, y: y };\n }\n\n _onMouseMove(event) {\n if (!this.canInteract)\n return;\n this.box.onMouseMove(event, this._mouseNDC(event));\n }\n\n _onMouseDown(event) {\n if (!this.canInteract)\n return;\n let hit = this.box.onMouseDown(event, this._mouseNDC(event));\n if (hit)\n this._beforeShow();\n else {\n const config = Dice3D.CONFIG();\n if (!config.hideAfterRoll && this.canvas.is(\":visible\") && !this.box.rolling) {\n this.canvas.hide();\n this.box.clearAll();\n }\n }\n\n }\n\n _onMouseUp(event) {\n if (!this.canInteract)\n return;\n let hit = this.box.onMouseUp(event);\n if (hit)\n this._afterShow();\n }\n\n _resizeEnd() {\n if (new Date() - this._rtime < 1000) {\n setTimeout(this._resizeEnd.bind(this), 1000);\n } else {\n this._timeout = false;\n //resize ended probably, lets remake the canvas\n this.resizeAndRebuild();\n }\n }\n\n resizeAndRebuild() {\n this.canvas[0].remove();\n this.box.clearScene();\n this._buildCanvas();\n let config = Dice3D.ALL_CONFIG();\n config.boxType = \"board\";\n this.box = new DiceBox(this.canvas[0], this.DiceFactory, config);\n this.box.initialize();\n this.box.preloadSounds();\n }\n\n /**\n * Start polling and watching te queue for animation requests.\n * Each request is resolved in sequence.\n *\n * @private\n */\n _startQueueHandler() {\n this.queue = [];\n setInterval(() => {\n if (this.queue.length > 0 && !this.box.rolling) {\n let animate = this.queue.shift();\n animate();\n }\n }, 100);\n }\n\n /**\n * Show a private message to new players\n */\n _welcomeMessage() {\n if (!game.user.getFlag(\"dice-so-nice\", \"welcomeMessageShown\")) {\n if (!game.user.getFlag(\"dice-so-nice\", \"appearance\")) {\n const content = [`\n
\n

${game.i18n.localize(\"DICESONICE.WelcomeTitle\")}

\n

${game.i18n.localize(\"DICESONICE.WelcomeMessage1\")}

\n

${game.i18n.localize(\"DICESONICE.WelcomeMessage2\")}

\n

\n \n

\n

${game.i18n.localize(\"DICESONICE.WelcomeMessage3\")}

\n

${game.i18n.localize(\"DICESONICE.WelcomeMessageTour\")}

\n

\n \n

\n

${game.i18n.localize(\"DICESONICE.WelcomeMessage4\")}

\n
${game.i18n.localize(\"NUE.FirstLaunchHint\")}
\n
\n `];\n const chatData = content.map(c => {\n return {\n whisper: [game.user.id],\n speaker: { alias: \"Dice So Nice!\" },\n flags: { core: { canPopout: true } },\n content: c\n };\n });\n ChatMessage.implementation.createDocuments(chatData);\n }\n game.user.setFlag(\"dice-so-nice\", \"welcomeMessageShown\", true);\n }\n }\n\n /**\n * Register the tours to the Tour Manager\n */\n _registerTours() {\n game.tours.register(\"dice-so-nice\", \"dice-so-nice-tour\", new DiceTourMain());\n }\n\n /**\n * Check if 3D simulation is enabled from the settings.\n */\n isEnabled() {\n let combatEnabled = (!game.combat || !game.combat.started) || (game.combat && game.combat.started && !game.settings.get(\"dice-so-nice\", \"disabledDuringCombat\"));\n return Dice3D.CONFIG().enabled && combatEnabled;\n }\n\n /**\n * Update the DiceBox with fresh new settgins.\n *\n * @param settings\n */\n update(settings) {\n this.box.update(settings);\n }\n\n /**\n * Parse, sort and add the dice animation to the queue for a chat message and an array of Roll\n * Used internally by the message Hooks. Not meant to be used outside of the module.\n * Please use the showForRoll method instead.\n * @param {ChatMessage} chatMessage \n * @param {Array} rolls \n */\n renderRolls(chatMessage, rolls) {\n const showMessage = () => {\n delete chatMessage._dice3danimating;\n\n window.ui.chat.element.find(`.message[data-message-id=\"${chatMessage.id}\"]`).removeClass(\"dsn-hide\").find(\".dice-roll\").removeClass(\"dsn-hide\");\n if (window.ui.sidebar.popouts.chat)\n window.ui.sidebar.popouts.chat.element.find(`.message[data-message-id=\"${chatMessage.id}\"]`).removeClass(\"dsn-hide\").find(\".dice-roll\").removeClass(\"dsn-hide\");\n\n Hooks.callAll(\"diceSoNiceRollComplete\", chatMessage.id);\n\n window.ui.chat.scrollBottom({ popout: true });\n }\n\n if (game.view == \"stream\" && !game.modules.get(\"0streamutils\")?.active) {\n setTimeout(showMessage, 2500, chatMessage);\n } else {\n //1- We create a list of all 3D rolls, ordered ASC\n //2- We create a Roll object with the correct formula and results\n //3- We queue the showForRoll calls and then show the message\n let orderedDiceList = [[]];\n rolls.forEach(roll => {\n roll.dice.forEach(diceTerm => {\n let index = 0;\n if (!game.settings.get(\"dice-so-nice\", \"enabledSimultaneousRollForMessage\") && diceTerm.options.hasOwnProperty(\"rollOrder\")) {\n index = diceTerm.options.rollOrder;\n if (orderedDiceList[index] == null) {\n orderedDiceList[index] = [];\n }\n }\n orderedDiceList[index].push(diceTerm);\n });\n });\n orderedDiceList = orderedDiceList.filter(el => el != null);\n\n let rollList = [];\n const plus = new OperatorTerm({ operator: \"+\" }).evaluate();\n orderedDiceList.forEach(dice => {\n //add a \"plus\" between each term\n if (Array.isArray(dice) && dice.length) {\n let termList = [...dice].map((e, i) => i < dice.length - 1 ? [e, plus] : [e]).reduce((a, b) => a.concat(b));\n //We use the Roll class registered in the CONFIG constant in case the system overwrites it (eg: HeXXen)\n rollList.push(CONFIG.Dice.rolls[0].fromTerms(termList));\n }\n });\n\n //call each promise one after the other, then call the showMessage function\n const recursShowForRoll = (rollList, index) => {\n this.showForRoll(rollList[index], chatMessage.user, false, null, false, chatMessage.id, chatMessage.speaker).then(() => {\n index++;\n if (rollList[index] != null)\n recursShowForRoll(rollList, index);\n else\n showMessage();\n });\n };\n\n recursShowForRoll(rollList, 0);\n }\n }\n\n /**\n * Show the 3D Dice animation for the Roll made by the User.\n *\n * @param roll an instance of Roll class to show 3D dice animation.\n * @param user the user who made the roll (game.user by default).\n * @param synchronize if the animation needs to be sent and played for each players (true/false).\n * @param users list of users or userId who can see the roll, leave it empty if everyone can see.\n * @param blind if the roll is blind for the current user\n * @param messageID ChatMessage related to this roll (default: null)\n * @param speaker Object based on the ChatSpeakerData data schema related to this roll. Useful to fully support DsN settings like \"hide npc rolls\". (Default: null)\n * @returns {Promise} when resolved true if the animation was displayed, false if not.\n */\n showForRoll(roll, user = game.user, synchronize, users = null, blind, messageID = null, speaker = null) {\n let context = {\n roll: roll,\n user: user,\n users: users,\n blind: blind\n };\n if (speaker) {\n let actor = game.actors.get(speaker.actor);\n const isNpc = actor ? actor.type === 'npc' : false;\n if (isNpc && game.settings.get(\"dice-so-nice\", \"hideNpcRolls\")) {\n return Promise.resolve(false);\n }\n }\n let chatMessage = game.messages.get(messageID);\n if (chatMessage) {\n if (chatMessage.whisper.length > 0)\n context.roll.secret = true;\n if (!chatMessage.isContentVisible)\n context.roll.ghost = true;\n }\n\n\n Hooks.callAll(\"diceSoNiceRollStart\", messageID, context);\n let notation = new DiceNotation(context.roll, Dice3D.ALL_CONFIG(user));\n return this.show(notation, context.user, synchronize, context.users, context.blind);\n }\n\n /**\n * Show the 3D Dice animation based on data configuration made by the User.\n *\n * @param data data containing the dice info.\n * @param user the user who made the roll (game.user by default).\n * @param synchronize\n * @param users list of users or userId who can see the roll, leave it empty if everyone can see.\n * @param blind if the roll is blind for the current user\n * @returns {Promise} when resolved true if the animation was displayed, false if not.\n */\n show(data, user = game.user, synchronize = false, users = null, blind) {\n return new Promise((resolve, reject) => {\n\n if (!data.throws) throw new Error(\"Roll data should be not null\");\n\n if (!data.throws.length || !this.isEnabled()) {\n resolve(false);\n } else {\n\n if (synchronize) {\n users = users && users.length > 0 ? (users[0]?.id ? users.map(user => user.id) : users) : users;\n game.socket.emit(\"module.dice-so-nice\", { type: \"show\", data: data, user: user.id, users: users });\n }\n\n if (!blind) {\n if (document.hidden) {\n this.hiddenAnimationQueue.push({\n data: data,\n config: Dice3D.ALL_CUSTOMIZATION(user, this.DiceFactory),\n timestamp: (new Date()).getTime(),\n resolve: resolve\n });\n } else {\n this._showAnimation(data, Dice3D.ALL_CUSTOMIZATION(user, this.DiceFactory)).then(displayed => {\n resolve(displayed);\n });\n }\n } else {\n resolve(false);\n }\n }\n if (game.settings.get(\"dice-so-nice\", \"immediatelyDisplayChatMessages\")) {\n resolve();\n }\n });\n }\n\n /**\n * Change the default value of the showExtraDice settings\n * @param {Boolean} show \n */\n showExtraDiceByDefault(show = true) {\n this.defaultShowExtraDice = show;\n }\n\n /**\n * Helper function to detect the end of a 3D animation for a message\n * @param {ChatMessage.ID} targetMessageId \n * @returns Promise\n */\n waitFor3DAnimationByMessageID(targetMessageId) {\n function buildHook(resolve) {\n Hooks.once('diceSoNiceRollComplete', (messageId) => {\n if (targetMessageId === messageId)\n resolve(true);\n else\n buildHook(resolve)\n });\n }\n return new Promise((resolve, reject) => {\n if (game.dice3d && Dice3D.CONFIG().enabled) {\n buildHook(resolve);\n } else {\n resolve(true);\n }\n });\n }\n\n\n /**\n *\n * @param formula\n * @param results\n * @param dsnConfig\n * @returns {Promise}\n * @private\n */\n _showAnimation(notation, dsnConfig) {\n notation.dsnConfig = dsnConfig;\n return new Promise((resolve, reject) => {\n this.nextAnimation.addItem({\n params: notation,\n resolve: resolve\n });\n });\n }\n\n _nextAnimationHandler() {\n let timing = game.settings.get(\"dice-so-nice\", \"enabledSimultaneousRolls\") ? 400 : 0;\n this.nextAnimation = new Accumulator(timing, (items) => {\n let commands = DiceNotation.mergeQueuedRollCommands(items);\n if (this.isEnabled() && this.queue.length < 10) {\n let count = commands.length;\n commands.forEach(aThrow => {\n this.queue.push(() => {\n this._beforeShow();\n this.box.start_throw(aThrow, () => {\n if (!--count) {\n for (let item of items)\n item.resolve(true);\n this._afterShow();\n }\n }\n );\n });\n });\n } else {\n for (let item of items)\n item.resolve(false);\n }\n });\n }\n\n /**\n *\n * @private\n */\n _beforeShow() {\n if (this.timeoutHandle) {\n clearTimeout(this.timeoutHandle);\n }\n this.canvas.stop(true);\n this.canvas.show();\n }\n\n /**\n *\n * @private\n */\n _afterShow() {\n if (Dice3D.CONFIG().hideAfterRoll) {\n if (DiceSFXManager.renderQueue.length) {\n clearTimeout(this.timeoutHandle);\n return;\n } else {\n this.timeoutHandle = setTimeout(() => {\n if (!this.box.rolling) {\n if (Dice3D.CONFIG().hideFX === 'none') {\n this.canvas.hide();\n this.box.clearAll();\n }\n if (Dice3D.CONFIG().hideFX === 'fadeOut') {\n this.canvas.fadeOut({\n duration: 1000,\n complete: () => {\n this.box.clearAll();\n },\n fail: () => {\n this.canvas.fadeIn(0);\n }\n });\n }\n }\n }, Dice3D.CONFIG().timeBeforeHide);\n }\n }\n }\n}","import { Dice3D } from './Dice3D.js';\nimport { DiceBox } from './DiceBox.js';\nimport { DiceSFXManager } from './DiceSFXManager.js';\nimport { Utils } from './Utils.js';\nimport { DiceNotation } from './DiceNotation.js';\nimport { DiceColors, DICE_SCALE } from './DiceColors.js';\n/**\n * Form application to configure settings of the 3D Dice.\n */\nexport class DiceConfig extends FormApplication {\n\n static get defaultOptions() {\n return mergeObject(super.defaultOptions, {\n title: game.i18n.localize(\"DICESONICE.configTitle\"),\n id: \"dice-config\",\n template: \"modules/dice-so-nice/templates/dice-config.html\",\n width: 650,\n height: \"auto\",\n closeOnSubmit: true,\n tabs: [\n { navSelector: \".tabs\", contentSelector: \"#config-tabs\", initial: \"general\" },\n { navSelector: \".dsn-appearance-tabs\", contentSelector: \"#dsn-appearance-content\", initial: \"global\" }\n ]\n })\n }\n\n async getData(options) {\n let data = mergeObject({\n fxList: Utils.localize({\n \"none\": \"DICESONICE.None\",\n \"fadeOut\": \"DICESONICE.FadeOut\"\n }),\n speedList: Utils.localize({\n \"1\": \"DICESONICE.NormalSpeed\",\n \"2\": \"DICESONICE.2xSpeed\",\n \"3\": \"DICESONICE.3xSpeed\"\n }),\n textureList: Utils.prepareTextureList(),\n materialList: Utils.localize({\n \"auto\": \"DICESONICE.MaterialAuto\",\n \"chrome\": \"DICESONICE.MaterialChrome\",\n \"glass\": \"DICESONICE.MaterialGlass\",\n \"iridescent\": \"DICESONICE.MaterialIridescent\",\n \"metal\": \"DICESONICE.MaterialMetal\",\n \"plastic\": \"DICESONICE.MaterialPlastic\",\n \"pristine\": \"DICESONICE.MaterialPristine\",\n \"stone\": \"DICESONICE.MaterialStone\",\n \"wood\": \"DICESONICE.MaterialWood\"\n }),\n fontList: Utils.prepareFontList(),\n colorsetList: Utils.prepareColorsetList(),\n imageQualityList: Utils.localize({\n \"low\": \"DICESONICE.Low\",\n \"medium\": \"DICESONICE.Medium\",\n \"high\": \"DICESONICE.High\",\n \"custom\": \"DICESONICE.Custom\"\n }),\n shadowQualityList: Utils.localize({\n \"none\": \"DICESONICE.None\",\n \"low\": \"DICESONICE.Low\",\n \"high\": \"DICESONICE.High\"\n }),\n antialiasingList: Utils.localize({\n \"none\": \"DICESONICE.None\",\n \"smaa\": \"DICESONICE.SMAA\",\n \"msaa\": \"DICESONICE.MSAA\"\n }),\n systemList: Utils.prepareSystemList(),\n soundsSurfaceList: Utils.localize({\n \"felt\": \"DICESONICE.SurfaceFelt\",\n \"wood_table\": \"DICESONICE.SurfaceWoodTable\",\n \"wood_tray\": \"DICESONICE.SurfaceWoodTray\",\n \"metal\": \"DICESONICE.SurfaceMetal\"\n }),\n canvasZIndexList: Utils.localize({\n \"over\": \"DICESONICE.CanvasZIndexOver\",\n \"under\": \"DICESONICE.CanvasZIndexUnder\",\n }),\n throwingForceList: Utils.localize({\n \"weak\": \"DICESONICE.ThrowingForceWeak\",\n \"medium\": \"DICESONICE.ThrowingForceMedium\",\n \"strong\": \"DICESONICE.ThrowingForceStrong\"\n })\n },\n this.reset ? Dice3D.ALL_DEFAULT_OPTIONS() : Dice3D.ALL_CONFIG()\n );\n delete data.sfxLine;\n\n //remove MSAA if not supported\n if (game.canvas.app.renderer.context.webGLVersion<2){\n delete data.antialiasingList.msaa;\n }\n\n //fix corupted save from #139\n if (data.specialEffects) {\n for (let [key, value] of Object.entries(data.specialEffects)) {\n if (Array.isArray(value.diceType) || Array.isArray(value.onResult) || Array.isArray(value.specialEffect))\n delete data.specialEffects[key];\n }\n }\n\n this.canvas = $('
')[0];\n let config = mergeObject(\n this.reset ? Dice3D.ALL_DEFAULT_OPTIONS() : Dice3D.ALL_CONFIG(),\n { dimensions: { w: 634, h: 245 }, autoscale: false, scale: 60, boxType: \"showcase\" }\n );\n\n this.box = new DiceBox(this.canvas, game.dice3d.box.dicefactory, config);\n await this.box.initialize();\n if (!game.user.getFlag(\"dice-so-nice\", \"appearance\")) {\n if (this.box.dicefactory.preferredSystem != \"standard\")\n config.appearance.global.system = this.box.dicefactory.preferredSystem;\n if (this.box.dicefactory.preferredColorset != \"standard\")\n config.appearance.global.colorset = this.box.dicefactory.preferredColorset;\n }\n this.box.showcase(config);\n\n this.navOrder = {};\n let triggerTypeList = [{ id: \"\", name: \"\" }];\n this.possibleResultList = {};\n let i = 0;\n this.box.diceList.forEach((el) => {\n this.navOrder[el.userData] = i++;\n triggerTypeList.push({ id: el.userData, name: el.userData });\n this.possibleResultList[el.userData] = [];\n let preset = this.box.dicefactory.systems.standard.dice.find(dice => dice.type == el.userData);\n let termClass = Object.values(CONFIG.Dice.terms).find(term => term.name == preset.term) || Die;\n let term = new termClass({});\n\n if(el.userData == \"d100\"){\n for(let i = 1; i<=100;i++){\n let label = term.getResultLabel({ result: i });\n let option = { id: i + \"\", name: label };\n this.possibleResultList[el.userData].push(option);\n }\n } else {\n preset.values.forEach((value) => {\n let label = term.getResultLabel({ result: value });\n let option = { id: value + \"\", name: label };\n this.possibleResultList[el.userData].push(option);\n });\n }\n });\n\n let specialEffectsList = [];\n let specialEffectsPromises = [];\n let specialEffects = Dice3D.SFX();\n if (this.reset)\n specialEffects = [];\n this.triggerTypeList = [...triggerTypeList, ...DiceSFXManager.EXTRA_TRIGGER_TYPE];\n mergeObject(this.possibleResultList, DiceSFXManager.EXTRA_TRIGGER_RESULTS,{performDeletions:true});\n\n //Filter out the SFX that are not registered\n if (specialEffects) {\n let registeredTriggerTypes = this.triggerTypeList.map(trigger => trigger.id);\n specialEffects = specialEffects.filter(sfx => registeredTriggerTypes.includes(sfx.diceType));\n }\n\n if (specialEffects) {\n specialEffects.forEach((sfx, index) => {\n let sfxClass = DiceSFXManager.SFX_MODE_CLASS[sfx.specialEffect];\n let dialogContent = sfxClass.getDialogContent(sfx, index);\n let hdbsTemplate = Handlebars.compile(dialogContent.content);\n\n specialEffectsPromises.push(renderTemplate(\"modules/dice-so-nice/templates/partial-sfx.html\", {\n id: index,\n diceType: sfx.diceType,\n onResult: sfx.onResult,\n specialEffect: sfx.specialEffect,\n specialEffectsMode: DiceSFXManager.SFX_MODE_LIST,\n triggerTypeList: this.triggerTypeList,\n possibleResultList: this.possibleResultList[sfx.diceType],\n options: hdbsTemplate(dialogContent.data)\n }).then((html) => {\n specialEffectsList.push(html);\n }));\n });\n await Promise.all(specialEffectsPromises);\n }\n data.specialEffectsList = specialEffectsList.join(\"\");\n\n let tabsList = [];\n for (let scope in data.appearance) {\n if (data.appearance.hasOwnProperty(scope)) {\n tabsList.push(scope);\n if (scope != \"global\") {\n if (!data.appearance[scope].labelColor)\n data.appearance[scope].labelColor = data.appearance.global.labelColor;\n if (!data.appearance[scope].diceColor)\n data.appearance[scope].diceColor = data.appearance.global.diceColor;\n if (!data.appearance[scope].outlineColor)\n data.appearance[scope].outlineColor = data.appearance.global.outlineColor;\n if (!data.appearance[scope].edgeColor)\n data.appearance[scope].edgeColor = data.appearance.global.edgeColor;\n }\n }\n }\n\n let tabsAppearance = [];\n let tabsPromises = [];\n data.navAppearance = {};\n tabsList.forEach((diceType) => {\n tabsPromises.push(renderTemplate(\"modules/dice-so-nice/templates/partial-appearance.html\", {\n dicetype: diceType,\n appearance: data.appearance[diceType],\n systemList: data.systemList,\n colorsetList: data.colorsetList,\n textureList: data.textureList,\n materialList: data.materialList,\n fontList: data.fontList\n }).then((html) => {\n tabsAppearance.push(html);\n }));\n if (diceType != \"global\")\n data.navAppearance[diceType] = diceType.toUpperCase();\n });\n await Promise.all(tabsPromises);\n\n if (tabsAppearance.length > 1)\n data.displayHint = \"style='display:none;'\";\n else\n data.displayHint = '';\n\n data.tabsAppearance = tabsAppearance.join(\"\");\n this.lastActiveAppearanceTab = \"global\";\n\n this.initializationData = data;\n this.currentGlobalAppearance = data.appearance.global;\n this.sfxDialogList = [];\n\n const templateSelect2 = (result) => {\n\n if (result.element) {\n let label = this.possibleResultList[result.element.parentElement.dataset.sfxResultDicetype].find(el => el.id == result.text).name;\n if (label != result.text)\n return `${label} (${result.text})`;\n else\n return result.text;\n } else {\n return result.text;\n }\n };\n\n this.select2Options = {\n dropdownCssClass: \"dice-so-nice\",\n escapeMarkup: function (text) { return text; },\n dropdownParent: \"form.dice-so-nice\",\n templateResult: templateSelect2,\n templateSelection: templateSelect2,\n width: \"306px\"\n }\n\n return data;\n }\n\n activateListeners(html) {\n super.activateListeners(html);\n\n $(html).find(\"#dice-configuration-canvas-container\").append(this.canvas);\n\n\n this.toggleHideAfterRoll();\n this.toggleAutoScale();\n this.toggleCustomization();\n this.filterSystems();\n this.setPreferredOptions();\n\n select2dsn.call($(this.element).find(\"[data-sfx-result]\"), this.select2Options);\n\n if (!this.reset) {\n $(this.element).on(\"change\", \"[data-showExtraDice]\", (ev) => {\n this.onApply(ev);\n });\n\n $(this.element).on(\"change\", \"[data-hideAfterRoll]\", (ev) => {\n this.toggleHideAfterRoll(ev);\n });\n\n $(this.element).on(\"change\", \"[data-sounds]\", (ev) => {\n this.toggleSounds(ev);\n });\n\n $(this.element).on(\"change\", \"[data-autoscale]\", (ev) => {\n this.toggleAutoScale(ev);\n });\n\n $(this.element).on(\"change\", \"[data-colorset]\", (ev) => {\n this.toggleCustomColors($(ev.target).data(\"dicetype\"));\n });\n\n $(this.element).on(\"change\", \"[data-system]\", (ev) => {\n this.toggleCustomization($(ev.target).data(\"dicetype\"));\n });\n\n $(this.element).on(\"change\", \"input,select\", (ev) => {\n this.onApply(ev);\n });\n\n $(this.element).on(\"click\", \"[data-reset]\", (ev) => {\n this.onReset(ev);\n });\n\n $(this.element).on(\"click\", \"[data-cancel]\", (ev) => {\n this.close();\n });\n\n $(this.element).on(\"click\", \"[data-close-tab]\", (ev) => {\n let diceType = $(ev.target).parent().data(\"tab\");\n this.closeAppearanceTab(diceType);\n });\n\n $(this.element).on(\"click\", \"[data-test]\", (ev) => {\n let config = this.getShowcaseAppearance();\n let denominationList = [];\n this.box.diceList.forEach((el) => {\n //the d100 will roll the d10 so we remove the d10 from the list\n if (el.userData != \"d10\")\n denominationList.push(el.userData);\n });\n let roll = new Roll(denominationList.join(\"+\")).evaluate({async:true}).then((roll) =>{\n let data = new DiceNotation(roll);\n\n let specialEffects = this.getShowcaseSFX();\n let customization = mergeObject({ appearance: config.appearance }, { specialEffects: specialEffects },{performDeletions:true});\n\n game.dice3d._showAnimation(data, customization);\n });\n });\n\n $(this.element).on(\"click\", \"[data-sfx-create]\", (ev) => {\n let ID = $(this.element).find(\".sfx-line\").length;\n let firstSFX = Object.keys(DiceSFXManager.SFX_MODE_LIST)[0];\n let sfxClass = DiceSFXManager.SFX_MODE_CLASS[firstSFX];\n let dialogContent = sfxClass.getDialogContent({}, ID);\n let hdbsTemplate = Handlebars.compile(dialogContent.content);\n renderTemplate(\"modules/dice-so-nice/templates/partial-sfx.html\", {\n id: ID,\n diceType: \"\",\n onResult: [],\n specialEffect: \"\",\n specialEffectsMode: DiceSFXManager.SFX_MODE_LIST,\n triggerTypeList: this.triggerTypeList,\n possibleResultList: [],\n options: hdbsTemplate(dialogContent.data)\n }).then((html) => {\n $(this.element).find(\"#sfxs-list\").append(html);\n select2dsn.call($(\"[data-sfx-result]\"), this.select2Options);\n this.setPosition();\n });\n });\n\n $(this.element).on(\"click\", \"[data-sfx-delete]\", (ev) => {\n $(ev.target).parents(\".sfx-line\").remove();\n $(this.element).find(\".sfx-line\").each(function (index) {\n $(this).find(\"input, select\").each(function () {\n let name = $(this).attr(\"name\");\n $(this).attr(\"name\", name.replace(/(\\w+\\[)(\\d+)(\\]\\[\\w+\\])/, \"$1\" + index + \"$3\"));\n });\n });\n this.setPosition();\n });\n\n $(this.element).on(\"click\", \"[data-sfx-options]\", (ev) => {\n let sfxLineOptions = $(ev.target).parents(\".sfx-line\").find(\"[data-sfx-hidden-options]\");\n\n if (sfxLineOptions.length < 1)\n return;\n\n let d = new Dialog({\n title: game.i18n.localize(\"DICESONICE.Options\"),\n content: `
`,\n buttons: {\n ok: {\n icon: '',\n label: 'OK'\n }\n },\n default: \"ok\",\n render: (html) => {\n sfxLineOptions.detach().appendTo($(html).find(\"form\"));\n },\n close: (html) => {\n $(html).find(\"[data-sfx-hidden-options]\").detach().appendTo($(ev.target).parents(\".sfx-line\").find(\".sfx-hidden\"));\n this.sfxDialogList = this.sfxDialogList.filter(dialog => dialog.appId != d.appId);\n }\n });\n d.render(true);\n this.sfxDialogList.push(d);\n });\n\n $(this.element).on(\"change\", \"[data-sfx-dicetype]\", (ev) => {\n let dicetype = $(ev.target).val();\n let optionHTML = $([]);\n if (dicetype != \"\") {\n this.possibleResultList[dicetype].forEach(opt => {\n let frag = $(\"\");\n frag.html(opt.id);\n frag.attr(\"value\", opt.id);\n optionHTML = optionHTML.add(frag);\n });\n $(ev.target).parents(\".sfx-line\").find(\"[data-sfx-result]\").html(optionHTML).attr(\"data-sfx-result-dicetype\", dicetype).trigger(\"change\");\n } else {\n $(ev.target).parents(\".sfx-line\").find(\"[data-sfx-result]\").empty().trigger(\"change\");\n }\n });\n\n $(this.element).on(\"change\", \"[data-sfx-result]\", (ev) => {\n this.setPosition();\n });\n\n $(this.element).on(\"change\", \"[data-sfx-specialeffect]\", (ev) => {\n this.sfxDialogList.forEach((dialog) => {\n dialog.close();\n });\n this.sfxDialogList = [];\n let sfxLine = $(ev.target).parents(\".sfx-line\");\n\n let ID = sfxLine.prevAll(\".sfx-line\").length;\n let sfxClass = DiceSFXManager.SFX_MODE_CLASS[$(ev.target).val()];\n let dialogContent = sfxClass.getDialogContent({}, ID);\n let hdbsTemplate = Handlebars.compile(dialogContent.content);\n\n sfxLine.find(\".sfx-hidden [data-sfx-hidden-options]\").html(hdbsTemplate(dialogContent.data));\n for (let fp of sfxLine.find(\".sfx-hidden [data-sfx-hidden-options] button.file-picker\")) {\n fp.onclick = this._activateFilePicker.bind(this);\n }\n });\n\n /**\n * Save As\n */\n $(this.element).on(\"click\", \"[data-saveas]\", async (ev) => {\n let saves = game.user.getFlag(\"dice-so-nice\", \"saves\");\n let saveList = new Map();\n if (saves)\n saveList = new Map(Object.entries(saves));\n\n let dialogSaveAs = new Dialog({\n title: game.i18n.localize(\"DICESONICE.SaveAs\"),\n width: 550,\n content: await renderTemplate(\"modules/dice-so-nice/templates/dialog-saveas.html\",\n {\n saveList: saveList.keys()\n }),\n buttons: {},\n render: html => {\n if (saveList.size) {\n $(html).on(\"click\", \"[data-overwrite]\", (ev) => {\n let name = $(html).find(\"[data-save-list]\").val();\n this.actionSaveAs(name);\n dialogSaveAs.close();\n });\n\n $(html).on(\"click\", \"[data-delete]\", async (ev) => {\n let name = $(html).find(\"[data-save-list]\").val();\n await this.actionDeleteSave(name);\n saveList.delete(name);\n $(html).find(\"[data-save-list] option:selected\").remove();\n if (!saveList.size) {\n $(html).find(\"[data-overwrite]\").prop(\"disabled\", true);\n $(html).find(\"[data-delete]\").prop(\"disabled\", true);\n }\n });\n\n } else {\n $(html).find(\"[data-overwrite]\").prop(\"disabled\", true);\n $(html).find(\"[data-delete]\").prop(\"disabled\", true);\n }\n\n $(html).on(\"click\", \"[data-add-new]\", (ev) => {\n let name = $(html).find(\"[data-save-name]\").val();\n if (name) {\n if (saveList.has(name)) {\n ui.notifications.error(game.i18n.localize(\"DICESONICE.SaveAsErrorAlreadyExist\"));\n } else {\n this.actionSaveAs(name);\n dialogSaveAs.close();\n }\n }\n else\n ui.notifications.error(game.i18n.localize(\"DICESONICE.SaveAsErrorName\"));\n });\n }\n }, {\n width: 450,\n classes: [\"dice-so-nice\"]\n }).render(true);\n });\n\n /**\n * Load\n */\n $(this.element).on(\"click\", \"[data-load]\", async (ev) => {\n let saves = game.user.getFlag(\"dice-so-nice\", \"saves\");\n let saveList = [];\n if (saves)\n saveList = new Map(Object.entries(saves));\n\n new Dialog({\n title: game.i18n.localize(\"DICESONICE.Load\"),\n content: await renderTemplate(\"modules/dice-so-nice/templates/dialog-load.html\",\n {\n saveList: saveList.keys()\n }),\n buttons: {\n load: {\n icon: '',\n label: game.i18n.localize(\"DICESONICE.Load\"),\n callback: async html => {\n let name = $(html).find(\"[data-save-list]\").val();\n await this.actionLoadSave(name);\n //Close Dice Settings\n this.close();\n }\n },\n no: {\n icon: '',\n label: game.i18n.localize(\"DICESONICE.Cancel\")\n }\n },\n render: html => {\n if (!saveList.size)\n $(html).find('[data-button=\"load\"]').prop(\"disabled\", true);\n },\n default: \"no\"\n }, {\n width: 550\n }).render(true);\n });\n\n\n /**\n * Import\n */\n $(this.element).on(\"click\", \"[data-import]\", async (ev) => {\n new Dialog({\n title: game.i18n.localize(\"DICESONICE.Import\"),\n content: await renderTemplate(\"modules/dice-so-nice/templates/dialog-import.html\"),\n buttons: {\n import: {\n icon: '',\n label: game.i18n.localize(\"DICESONICE.Import\"),\n callback: html => {\n const form = html.find(\"form\")[0];\n if (!form.data.files.length) return ui.notifications.error(game.i18n.localize(\"DICESONICE.ImportNoFile\"));\n readTextFromFile(form.data.files[0]).then(async json => {\n await this.actionImportFromJSON(json);\n this.close();\n });\n }\n },\n no: {\n icon: '',\n label: \"Cancel\"\n }\n },\n default: \"import\"\n }, {\n width: 400\n }).render(true);\n });\n\n $(this.element).on(\"click\", \"[data-export]\", async (ev) => {\n const filename = `fvtt-dicesonice-${Date.now()}.json`;\n this.actionExportToJSON().then((json) => {\n saveDataToFile(json, \"text/json\", filename);\n });\n });\n\n $(this.element).on(\"click\", \"[data-exportSFX]\", async (ev) => {\n const filename = `fvtt-dicesonice-SFX-${Date.now()}.json`;\n this.actionExportSFXToJSON().then((json) => {\n saveDataToFile(json, \"text/json\", filename);\n });\n });\n\n $(this.element).on(\"click\", \"#dice-configuration-canvas\", (event) => {\n let rect = event.target.getBoundingClientRect();\n let x = ((event.clientX - rect.left) / rect.width) * 2 - 1;\n if (x > 1)\n x = 1;\n let y = - ((event.clientY - rect.top) / rect.height) * 2 + 1;\n let pos = { x: x, y: y };\n let dice = this.box.findShowcaseDie(pos);\n if (dice) {\n let diceType = this.box.findRootObject(dice.object).userData;\n if (!game.user.getFlag(\"dice-so-nice\", \"appearance\") && (this.box.dicefactory.preferredSystem != \"standard\" || this.box.dicefactory.preferredColorset != \"custom\"))\n this.getShowcaseAppearance();\n if ($(this.element).find(`.dsn-appearance-tabs [data-tab=\"${diceType}\"]`).length) {\n this.activateAppearanceTab(diceType);\n } else {\n $(this.element).find(\".dsn-appearance-hint\").hide();\n renderTemplate(\"modules/dice-so-nice/templates/partial-appearance.html\", {\n dicetype: diceType,\n appearance: this.currentGlobalAppearance,\n systemList: this.initializationData.systemList,\n colorsetList: this.initializationData.colorsetList,\n textureList: this.initializationData.textureList,\n materialList: this.initializationData.materialList,\n fontList: this.initializationData.fontList\n }).then((html) => {\n let tabName = diceType.toUpperCase();\n\n let insertBefore = null;\n //let's find where to insert the tab so it keeps the same order as the dice list\n $(this.element).find(\".dsn-appearance-tabs .item\").each((index, el) => {\n if (this.navOrder[$(el).data(\"tab\")] >= this.navOrder[diceType]) {\n insertBefore = $(el).data(\"tab\");\n return false;\n }\n });\n let htmlNavString = `${tabName} `;\n if (insertBefore) {\n $(html).insertBefore($(this.element).find(`.tabAppearance[data-tab=\"${insertBefore}\"]`));\n $(htmlNavString).insertBefore($(this.element).find(`.dsn-appearance-tabs .item[data-tab=\"${insertBefore}\"]`));\n } else {\n $(this.element).find(\"#dsn-appearance-content\").append(html);\n $(this.element).find(\".dsn-appearance-tabs\").append(htmlNavString);\n }\n this.activateAppearanceTab(diceType);\n this.toggleCustomization(diceType);\n this.filterSystems(diceType);\n });\n }\n }\n });\n\n $(this.element).on(\"change\", \"[data-imageQuality]\", (event) => {\n let quality = {\n bumpMapping: true,\n shadowQuality: \"high\",\n glow: true,\n antialiasing: game.canvas.app.renderer.context.webGLVersion===2 ?\"msaa\":\"smaa\",\n useHighDPI: true\n };\n switch(event.target.value) {\n case \"low\":\n quality.bumpMapping = false;\n quality.shadowQuality = \"low\";\n quality.glow = false;\n quality.antialiasing = \"none\";\n quality.useHighDPI = false;\n break;\n case \"medium\":\n quality.bumpMapping = true;\n quality.shadowQuality = \"low\";\n quality.glow = false;\n quality.antialiasing = \"none\";\n quality.useHighDPI = false;\n break;\n case \"high\":\n quality.bumpMapping = true;\n quality.shadowQuality = \"high\";\n quality.glow = true;\n quality.antialiasing = game.canvas.app.renderer.context.webGLVersion===2 ?\"msaa\":\"smaa\";\n quality.useHighDPI = true;\n break;\n }\n $(this.element).find(\"[data-bumpMapping]\").prop(\"checked\", quality.bumpMapping);\n $(this.element).find(\"[data-shadowQuality]\").val(quality.shadowQuality);\n $(this.element).find(\"[data-glow]\").prop(\"checked\", quality.glow);\n $(this.element).find(\"[data-antialiasing]\").val(quality.antialiasing);\n $(this.element).find(\"[data-useHighDPI]\").prop(\"checked\", quality.useHighDPI);\n });\n\n $(this.element).on(\"change\", \"[data-bumpMapping],[data-shadowQuality],[data-glow],[data-antialiasing],[data-useHighDPI]\", (event) => {\n $(this.element).find(\"[data-imageQuality]\").val(\"custom\");\n });\n }\n }\n\n async actionSaveAs(name) {\n await this.submit({\n preventClose: true,\n preventRender: true\n });\n\n Utils.actionSaveAs(name);\n }\n\n async actionDeleteSave(name) {\n await Utils.actionDeleteSave(name);\n }\n\n async actionLoadSave(name) {\n await Utils.actionLoadSave(name);\n }\n\n async actionExportToJSON() {\n\n //save current settings first\n await this.submit({\n preventClose: true,\n preventRender: true\n });\n let data = {\n appearance: game.user.getFlag(\"dice-so-nice\", \"appearance\"),\n sfxList: game.user.getFlag(\"dice-so-nice\", \"sfxList\"),\n settings: game.user.getFlag(\"dice-so-nice\", \"settings\")\n };\n\n return JSON.stringify(data, null, 2);\n }\n\n async actionExportSFXToJSON() {\n\n //save current settings first\n await this.submit({\n preventClose: true,\n preventRender: true\n });\n let data = {\n sfxList: game.user.getFlag(\"dice-so-nice\", \"sfxList\")\n };\n\n return JSON.stringify(data, null, 2);\n }\n\n async actionImportFromJSON(json) {\n let data = JSON.parse(json);\n\n if (data.appearance) {\n await game.user.unsetFlag(\"dice-so-nice\", \"appearance\");\n await game.user.setFlag(\"dice-so-nice\", \"appearance\", data.appearance);\n }\n if (data.sfxList) {\n await game.user.unsetFlag(\"dice-so-nice\", \"sfxList\");\n await game.user.setFlag(\"dice-so-nice\", \"sfxList\", data.sfxList);\n }\n if (data.settings) {\n await game.user.unsetFlag(\"dice-so-nice\", \"settings\");\n await game.user.setFlag(\"dice-so-nice\", \"settings\", data.settings);\n }\n }\n\n activateAppearanceTab(diceType) {\n let tabs = this._tabs[1];\n if (tabs.active != diceType)\n tabs.activate(diceType, { triggerCallback: true });\n }\n\n closeAppearanceTab(diceType) {\n if (diceType == \"global\")\n return;\n let tabs = this._tabs[1];\n if (this._tabs[1].active == diceType)\n tabs.activate(\"global\", { triggerCallback: true });\n\n $(this.element).find(`.tabAppearance[data-tab=\"${diceType}\"]`).remove();\n $(this.element).find(`.dsn-appearance-tabs [data-tab=\"${diceType}\"]`).remove();\n\n this.onApply();\n }\n\n _onChangeTab(event, tabs, active) {\n super._onChangeTab(event, tabs, active);\n if (tabs._contentSelector == \"#dsn-appearance-content\") {\n if (this.lastActiveAppearanceTab != \"global\") {\n let appearanceArray = [];\n $(this.element).find(`.tabAppearance[data-tab=\"global\"],.tabAppearance[data-tab=\"${this.lastActiveAppearanceTab}\"]`).each((index, element) => {\n let obj = {\n labelColor: $(element).find('[data-labelColor]').val(),\n diceColor: $(element).find('[data-diceColor]').val(),\n outlineColor: $(element).find('[data-outlineColor]').val(),\n edgeColor: $(element).find('[data-edgeColor]').val(),\n colorset: $(element).find('[data-colorset]').val(),\n texture: $(element).find('[data-texture]').val(),\n material: $(element).find('[data-material]').val(),\n font: $(element).find('[data-font]').val(),\n system: $(element).find('[data-system]').val(),\n };\n //disabled systems arent returned\n if (obj.system == null) {\n obj.system = this.currentGlobalAppearance.system;\n }\n appearanceArray.push(obj);\n });\n if (appearanceArray.length > 1) {\n let diff = diffObject(appearanceArray[0], appearanceArray[1]);\n if (isEmpty(diff)) {\n this.closeAppearanceTab(this.lastActiveAppearanceTab)\n }\n }\n }\n this.lastActiveAppearanceTab = active;\n }\n }\n\n toggleHideAfterRoll() {\n let hideAfterRoll = $(this.element).find('[data-hideAfterRoll]')[0].checked;\n $(this.element).find('[data-timeBeforeHide]').prop(\"disabled\", !hideAfterRoll);\n $(this.element).find('[data-hideFX]').prop(\"disabled\", !hideAfterRoll);\n }\n\n toggleSounds() {\n let sounds = $(this.element).find('[data-sounds]')[0].checked;\n $(this.element).find('[data-soundsSurface]').prop(\"disabled\", !sounds);\n $(this.element).find('[data-soundsVolume]').prop(\"disabled\", !sounds);\n //$('.sounds-range-value').css({ 'opacity': !sounds ? 0.4 : 1 });\n }\n\n toggleAutoScale() {\n let autoscale = $(this.element).find('[data-autoscale]')[0].checked;\n $(this.element).find('[data-scale]').prop(\"disabled\", autoscale);\n //$('.scale-range-value').css({ 'opacity': autoscale ? 0.4 : 1 });\n }\n\n toggleCustomColors(dicetype) {\n let scope = $(this.element).find(\".tabAppearance\");\n if (dicetype) {\n scope = scope.filter(`[data-tab=\"${dicetype}\"]`);\n }\n scope.each((index, element) => {\n let colorset = $(element).find('[data-colorset]');\n let disabled = colorset.val() !== 'custom' || colorset.prop(\"disabled\");\n $(element).find('[data-labelColor]').prop(\"disabled\", disabled);\n $(element).find('[data-diceColor]').prop(\"disabled\", disabled);\n $(element).find('[data-outlineColor]').prop(\"disabled\", disabled);\n $(element).find('[data-edgeColor]').prop(\"disabled\", disabled);\n $(element).find('[data-labelColorSelector]').prop(\"disabled\", disabled);\n $(element).find('[data-diceColorSelector]').prop(\"disabled\", disabled);\n $(element).find('[data-outlineColorSelector]').prop(\"disabled\", disabled);\n $(element).find('[data-edgeColorSelector]').prop(\"disabled\", disabled);\n });\n }\n\n toggleCustomization(diceType = null) {\n let container;\n if (diceType) {\n container = $(this.element).find(`.tabAppearance[data-tab=\"${diceType}\"]`);\n } else {\n container = $(this.element).find(`.tabAppearance`);\n }\n\n container.each((index, element) => {\n let diceType = $(element).data(\"tab\");\n if (diceType != \"global\") {\n let system = $(element).find('[data-system]').val();\n let customizationElements = $(element).find('[data-colorset],[data-texture],[data-material],[data-font]');\n if (system != \"standard\") {\n let diceobj = this.box.dicefactory.systems[system].dice.find(obj => obj.type == diceType);\n if (diceobj) {\n let colorsetData = {};\n if (diceobj.colorset) {\n colorsetData = DiceColors.getColorSet(diceobj.colorset);\n }\n customizationElements.each((index, el) => {\n let colorsetForce = false;\n if ($(el).is(\"[data-colorset]\") && !isEmpty(colorsetData))\n colorsetForce = true;\n else if ($(el).is(\"[data-texture]\") && !isEmpty(colorsetData) && colorsetData.texture != \"custom\")\n colorsetForce = true;\n else if ($(el).is(\"[data-material]\") && !isEmpty(colorsetData) && colorsetData.material != \"custom\")\n colorsetForce = true;\n else if ($(el).is(\"[data-font]\") && ((!isEmpty(colorsetData) && colorsetData.font != \"custom\") || diceobj.font))\n colorsetForce = true;\n $(el).prop(\"disabled\", diceobj.modelFile || colorsetForce);\n });\n }\n } else {\n customizationElements.prop(\"disabled\", false);\n }\n }\n });\n this.toggleCustomColors(diceType);\n }\n\n filterSystems(diceType = null) {\n let container;\n if (diceType) {\n container = $(this.element).find(`.tabAppearance[data-tab=\"${diceType}\"] [data-system]`);\n } else {\n container = $(this.element).find(`.tabAppearance [data-system]`);\n }\n container.each((index, element) => {\n let diceType = $(element).data(\"dicetype\");\n if (diceType != \"global\") {\n $(element).find(\"option\").each((indexOpt, elementOpt) => {\n let model = this.box.dicefactory.systems[\"standard\"].dice.find(obj => obj.type == diceType);\n if (!this.box.dicefactory.systems[$(elementOpt).val()].dice.find(obj => obj.type == diceType || (model && obj.shape == model.shape && obj.values.length == model.values.length)))\n $(elementOpt).attr(\"disabled\", \"disabled\");\n });\n }\n });\n }\n\n setPreferredOptions() {\n if (!game.user.getFlag(\"dice-so-nice\", \"appearance\")) {\n if (this.box.dicefactory.preferredSystem != \"standard\")\n $(this.element).find('.tabAppearance[data-tab=\"global\"] [data-system]').val(this.box.dicefactory.preferredSystem);\n if (this.box.dicefactory.preferredColorset != \"custom\")\n $(this.element).find('.tabAppearance[data-tab=\"global\"] [data-colorset]').val(this.box.dicefactory.preferredColorset);\n }\n }\n\n getShowcaseAppearance() {\n let config = {\n autoscale: false,\n scale: 60,\n shadowQuality: $('[data-shadowQuality]').val(),\n imageQuality: $('[data-imageQuality]').val(),\n antialiasing: $('[data-antialiasing]').val(),\n bumpMapping: $('[data-bumpMapping]').is(':checked'),\n glow: $('[data-glow]').is(':checked'),\n sounds: $('[data-sounds]').is(':checked'),\n throwingForce: $('[data-throwingForce]').val(),\n useHighDPI: $('[data-useHighDPI]').is(':checked'),\n showExtraDice: $('[data-showExtraDice]').is(':checked'),\n muteSoundSecretRolls: $('[data-muteSoundSecretRolls]').is(':checked'),\n enableFlavorColorset: $('[data-enableFlavorColorset]').is(':checked'),\n immersiveDarkness: $('[data-immersiveDarkness]').is(':checked'),\n appearance: {}\n };\n $(this.element).find('.tabAppearance').each((index, element) => {\n config.appearance[$(element).data(\"tab\")] = {\n labelColor: $(element).find('[data-labelColor]').val(),\n diceColor: $(element).find('[data-diceColor]').val(),\n outlineColor: $(element).find('[data-outlineColor]').val(),\n edgeColor: $(element).find('[data-edgeColor]').val(),\n colorset: $(element).find('[data-colorset]').val(),\n texture: $(element).find('[data-texture]').val(),\n material: $(element).find('[data-material]').val(),\n font: $(element).find('[data-font]').val(),\n system: $(element).find('[data-system]').val(),\n };\n });\n this.currentGlobalAppearance = config.appearance.global;\n return config;\n }\n\n //Not used because SFX aren't initialized. Keeping it here for later use.\n getShowcaseSFX() {\n let sfxList = [];\n\n $(this.element).find('.sfx-line').each((index, element) => {\n let sfx = {\n diceType: $(element).find('[data-sfx-dicetype]').val(),\n onResult: $(element).find('[data-sfx-result]').val(),\n specialEffect: $(element).find('[data-sfx-specialeffect]').val(),\n options: {}\n };\n $(element).find(\"[data-sfx-hidden-options]\").find(\"input,select\").each((i, el) => {\n let name = $(el).attr(\"name\").match(/.*\\[(.*)\\]$/)[1];\n if ($(el).attr(\"type\") == \"checkbox\")\n sfx.options[name] = $(el).prop(\"checked\");\n else\n sfx.options[name] = $(el).val();\n });\n if (sfx.diceType && sfx.onResult && sfx.specialEffect)\n sfxList.push(sfx);\n });\n return sfxList;\n }\n\n onApply(event = null) {\n if (event)\n event.preventDefault();\n\n setTimeout(() => {\n let config = this.getShowcaseAppearance();\n this.box.dicefactory.disposeCachedMaterials(\"showcase\");\n this.box.update(config).then(() => {\n this.box.showcase(config);\n });\n }, 100);\n }\n\n onReset() {\n this.reset = true;\n this.render();\n this._tabs[0].activate(\"general\");\n }\n\n parseInputs(data) {\n var ret = {};\n retloop:\n for (var input in data) {\n var val = data[input];\n\n var parts = input.split('[');\n var last = ret;\n\n for (var i in parts) {\n var part = parts[i];\n if (part.substr(-1) == ']') {\n part = part.substr(0, part.length - 1);\n }\n\n if (i == parts.length - 1) {\n last[part] = val;\n continue retloop;\n } else if (!last.hasOwnProperty(part)) {\n last[part] = {};\n }\n last = last[part];\n }\n }\n return ret;\n }\n\n async _updateObject(event, formData) {\n //Remove custom settings if custom isn't selected to prevent losing them in the user save\n formData = this.parseInputs(formData);\n let sfxLine = formData.sfxLine;\n if (sfxLine) {\n sfxLine = Object.values(sfxLine);\n //Remove empty lines\n for (let i = sfxLine.length - 1; i >= 0; i--) {\n //also prevent bug #217, unknown cause\n if (sfxLine[i].diceType == undefined || sfxLine[i].diceType == \"\" || sfxLine[i].onResult == \"\" || Array.isArray(sfxLine[i].diceType) || Array.isArray(sfxLine[i].specialEffect))\n sfxLine.splice(i, 1);\n }\n //Remove duplicate lines\n let dataArr = sfxLine.map(item => {\n return [JSON.stringify(item), item]\n });\n let mapArr = new Map(dataArr);\n\n sfxLine = [...mapArr.values()];\n\n delete formData.sfxLine;\n }\n\n for (let scope in formData.appearance) {\n if (formData.appearance.hasOwnProperty(scope)) {\n if (formData.appearance[scope].colorset != \"custom\") {\n delete formData.appearance[scope].labelColor;\n delete formData.appearance[scope].diceColor;\n delete formData.appearance[scope].outlineColor;\n delete formData.appearance[scope].edgeColor;\n }\n }\n }\n let currentSettings = Dice3D.CONFIG();\n\n //required\n await game.user.unsetFlag(\"dice-so-nice\", \"sfxList\");\n await game.user.unsetFlag(\"dice-so-nice\", \"appearance\");\n await game.user.unsetFlag(\"dice-so-nice\", \"settings\");\n\n\n let appearance = mergeObject(Dice3D.APPEARANCE(), formData.appearance, { insertKeys: true, insertValues: false, performDeletions:true});\n delete formData.appearance;\n let settings = mergeObject(Dice3D.CONFIG(), formData, { insertKeys: false, insertValues: false ,performDeletions:true});\n\n // preserve rollingArea config\n settings.rollingArea = currentSettings.rollingArea;\n\n await game.user.setFlag('dice-so-nice', 'settings', settings);\n await game.user.setFlag(\"dice-so-nice\", \"appearance\", appearance);\n await game.user.setFlag(\"dice-so-nice\", \"sfxList\", sfxLine);\n\n game.socket.emit(\"module.dice-so-nice\", { type: \"update\", user: game.user.id });\n DiceSFXManager.init();\n ui.notifications.info(game.i18n.localize(\"DICESONICE.saveMessage\"));\n\n let reloadRequiredIfChanged = [\"canvasZIndex\", \"bumpMapping\", \"useHighDPI\", \"glow\", \"antialiasing\"];\n let reloadRequired = reloadRequiredIfChanged.some(setting => settings[setting] != currentSettings[setting]);\n\n if (reloadRequired) {\n window.location.reload();\n } else {\n game.dice3d.update(settings);\n }\n }\n\n close(options) {\n super.close(options);\n this.box.clearScene();\n this.box.dicefactory.disposeCachedMaterials(\"showcase\");\n }\n\n async _onSubmit(event, options) {\n this.sfxDialogList.forEach((dialog) => {\n dialog.close();\n });\n await super._onSubmit(event, options);\n }\n}","import {Dice3D} from \"./Dice3D.js\";\n\nexport class RollableAreaConfig extends FormApplication {\n\n static get defaultOptions() {\n return foundry.utils.mergeObject(super.defaultOptions, {\n title: game.i18n.localize(\"DICESONICE.RollableAreaConfigTitle\"),\n template: \"modules/dice-so-nice/templates/rollable-area-config.html\",\n width: 280,\n top: 70,\n left: window.innerWidth - 290\n });\n }\n\n render(force, context={}) {\n this.area = $(`\n
\n
\n
\n
\n
\n
\n
${game.i18n.localize(\"DICESONICE.RollableAreaText\")}
\n
\n
\n `);\n\n let rollingArea = Dice3D.CONFIG().rollingArea;\n if(!rollingArea) {\n const $diceBox = $(\"#dice-box-canvas\");\n rollingArea = {\n top: $diceBox.position().top,\n left: $diceBox.position().left,\n width: $diceBox.width(),\n height: $diceBox.height()\n }\n }\n console.log(rollingArea);\n this.area.appendTo($('body'));\n this.area.css(rollingArea);\n\n return super.render(force, context);\n }\n\n activateListeners(html) {\n super.activateListeners(html);\n html.find('button[name=\"restore\"]').click(this._onRestore.bind(this));\n\n let el = $(this.area).get(0);\n let resizing = false;\n this.area.mousedown(function(e) {\n let prevX = e.clientX;\n let prevY = e.clientY;\n\n window.addEventListener(\"mousemove\", onMouseMove);\n window.addEventListener(\"mouseup\", onMouseUp);\n\n function onMouseMove(e) {\n if (!resizing) {\n let newX = prevX - e.clientX;\n let newY = prevY - e.clientY;\n\n const rect = el.getBoundingClientRect();\n el.style.left = rect.left - newX + 'px';\n el.style.top = rect.top - newY + 'px';\n\n prevX = e.clientX;\n prevY = e.clientY;\n }\n }\n\n function onMouseUp() {\n window.removeEventListener(\"mousemove\", onMouseMove);\n window.removeEventListener(\"mouseup\", onMouseUp);\n }\n });\n\n const resizers = $(\".rollable-area > .resizers > .resizer\");\n for(let resizer of resizers) {\n $(resizer).mousedown(function (e) {\n resizing = true;\n let prevX = e.clientX;\n let prevY = e.clientY;\n\n window.addEventListener(\"mousemove\", onMouseMove);\n window.addEventListener(\"mouseup\", onMouseUp);\n\n function onMouseMove(e) {\n const rect = el.getBoundingClientRect();\n\n if(resizer.classList.contains(\"se\")) {\n el.style.width = rect.width - (prevX - e.clientX) + \"px\";\n el.style.height = rect.height - (prevY - e.clientY) + \"px\";\n }\n else if(resizer.classList.contains(\"sw\")) {\n el.style.width = rect.width + (prevX - e.clientX) + \"px\";\n el.style.height = rect.height - (prevY - e.clientY) + \"px\";\n el.style.left = rect.left - (prevX - e.clientX) + \"px\";\n }\n else if(resizer.classList.contains(\"ne\")) {\n el.style.width = rect.width - (prevX - e.clientX) + \"px\";\n el.style.height = rect.height + (prevY - e.clientY) + \"px\";\n el.style.top = rect.top - (prevY - e.clientY) + \"px\";\n }\n else {\n el.style.width = rect.width + (prevX - e.clientX) + \"px\";\n el.style.height = rect.height + (prevY - e.clientY) + \"px\";\n el.style.left = rect.left - (prevX - e.clientX) + \"px\";\n el.style.top = rect.top - (prevY - e.clientY) + \"px\";\n }\n\n prevX = e.clientX;\n prevY = e.clientY;\n }\n\n function onMouseUp() {\n window.removeEventListener(\"mousemove\", onMouseMove);\n window.removeEventListener(\"mouseup\", onMouseUp);\n resizing = false;\n }\n });\n }\n }\n\n async _onRestore() {\n await this.saveSettingsAndRebuild(false);\n await this.close();\n }\n\n async _updateObject() {\n await this.saveSettingsAndRebuild({\n top: this.area.position().top,\n left: this.area.position().left,\n width: this.area.width(),\n height: this.area.height()\n });\n }\n\n async saveSettingsAndRebuild(rollingArea) {\n let settings = mergeObject(Dice3D.CONFIG(), {\n rollingArea: rollingArea\n },{performDeletions:true});\n await game.user.setFlag('dice-so-nice', 'settings', settings);\n game.dice3d.resizeAndRebuild();\n }\n\n async close(options={}) {\n this.area.remove();\n return super.close(options);\n }\n}","import { Dice3D } from './Dice3D.js';\nimport { DiceConfig } from './DiceConfig.js';\nimport { RollableAreaConfig } from './RollableAreaConfig.js';\nimport { Utils } from './Utils.js';\n\n/**\n * Registers the exposed settings for the various 3D dice options.\n */\nHooks.once('init', () => {\n const debouncedReload = foundry.utils.debounce(() => {\n window.location.reload();\n }, 100);\n game.settings.registerMenu(\"dice-so-nice\", \"dice-so-nice\", {\n name: \"DICESONICE.config\",\n label: \"DICESONICE.configTitle\",\n hint: \"DICESONICE.configHint\",\n icon: \"fas fa-dice-d20\",\n type: DiceConfig,\n restricted: false\n });\n\n game.settings.registerMenu(\"dice-so-nice\", \"rollable-area\", {\n name: \"DICESONICE.RollableAreaConfig\",\n label: \"DICESONICE.RollableAreaConfigTitle\",\n hint: \"DICESONICE.RollableAreaConfigHint\",\n icon: \"fas fa-crop-alt\",\n type: RollableAreaConfig,\n restricted: false\n });\n\n //Not used anymore but kept for compatibility with migration\n game.settings.register(\"dice-so-nice\", \"settings\", {\n name: \"3D Dice Settings\",\n scope: \"client\",\n default: {},\n type: Object,\n config: false\n });\n\n game.settings.register(\"dice-so-nice\", \"maxDiceNumber\", {\n name: \"DICESONICE.maxDiceNumber\",\n hint: \"DICESONICE.maxDiceNumberHint\",\n scope: \"world\",\n type: Number,\n default: 20,\n range: {\n min: 20,\n max: 100,\n step: 5\n },\n config: true\n });\n\n game.settings.register(\"dice-so-nice\", \"globalAnimationSpeed\", {\n name: \"DICESONICE.globalAnimationSpeed\",\n hint: \"DICESONICE.globalAnimationSpeedHint\",\n scope: \"world\",\n type: String,\n choices: Utils.localize({\n \"0\": \"DICESONICE.PlayerSpeed\",\n \"1\": \"DICESONICE.NormalSpeed\",\n \"2\": \"DICESONICE.2xSpeed\",\n \"3\": \"DICESONICE.3xSpeed\"\n }),\n default: \"0\",\n config: true,\n onChange: debouncedReload\n });\n\n game.settings.register(\"dice-so-nice\", \"enabledSimultaneousRolls\", {\n name: \"DICESONICE.enabledSimultaneousRolls\",\n hint: \"DICESONICE.enabledSimultaneousRollsHint\",\n scope: \"world\",\n type: Boolean,\n default: true,\n config: true,\n onChange: debouncedReload\n });\n\n game.settings.register(\"dice-so-nice\", \"enabledSimultaneousRollForMessage\", {\n name: \"DICESONICE.enabledSimultaneousRollForMessage\",\n hint: \"DICESONICE.enabledSimultaneousRollForMessageHint\",\n scope: \"world\",\n type: Boolean,\n default: true,\n config: true\n });\n\n game.settings.register(\"dice-so-nice\", \"diceCanBeFlipped\", {\n name: \"DICESONICE.diceCanBeFlipped\",\n hint: \"DICESONICE.diceCanBeFlippedHint\",\n scope: \"world\",\n type: Boolean,\n default: true,\n config: true\n });\n\n game.settings.register(\"dice-so-nice\", \"formatVersion\", {\n scope: \"world\",\n type: String,\n default: \"\",\n config: false\n });\n\n game.settings.register(\"dice-so-nice\", \"disabledDuringCombat\", {\n name: \"DICESONICE.disabledDuringCombat\",\n hint: \"DICESONICE.disabledDuringCombatHint\",\n scope: \"world\",\n type: Boolean,\n default: false,\n config: true\n });\n\n game.settings.register(\"dice-so-nice\", \"disabledForInitiative\", {\n name: \"DICESONICE.disabledForInitiative\",\n hint: \"DICESONICE.disabledForInitiativeHint\",\n scope: \"world\",\n type: Boolean,\n default: false,\n config: true\n });\n\n game.settings.register(\"dice-so-nice\", \"immediatelyDisplayChatMessages\", {\n name: \"DICESONICE.immediatelyDisplayChatMessages\",\n hint: \"DICESONICE.immediatelyDisplayChatMessagesHint\",\n scope: \"world\",\n type: Boolean,\n default: false,\n config: true\n });\n\n game.settings.register(\"dice-so-nice\", \"animateRollTable\", {\n name: \"DICESONICE.animateRollTable\",\n hint: \"DICESONICE.animateRollTableHint\",\n scope: \"world\",\n type: Boolean,\n default: false,\n config: true\n });\n\n game.settings.register(\"dice-so-nice\", \"animateInlineRoll\", {\n name: \"DICESONICE.animateInlineRoll\",\n hint: \"DICESONICE.animateInlineRollHint\",\n scope: \"world\",\n type: Boolean,\n default: true,\n config: true\n });\n\n game.settings.register(\"dice-so-nice\", \"hideNpcRolls\", {\n name: \"DICESONICE.hideNpcRolls\",\n hint: \"DICESONICE.hideNpcRollsHint\",\n scope: \"world\",\n type: Boolean,\n default: false,\n config: true\n });\n\n game.settings.register(\"dice-so-nice\", \"allowInteractivity\", {\n name: \"DICESONICE.allowInteractivity\",\n hint: \"DICESONICE.allowInteractivityHint\",\n scope: \"world\",\n type: Boolean,\n default: true,\n config: true,\n onChange: debouncedReload\n });\n\n game.settings.register(\"dice-so-nice\", \"showGhostDice\", {\n name: \"DICESONICE.showGhostDice\",\n hint: \"DICESONICE.showGhostDiceHint\",\n scope: \"world\",\n type: Boolean,\n default: false,\n config: true\n });\n\n});\n\n/**\n * Foundry is ready, let's create a new Dice3D!\n */\nHooks.once('ready', () => {\n Utils.migrateOldSettings().then((updated) => {\n if (updated) {\n if (!game.settings.get(\"core\", \"noCanvas\"))\n game.dice3d = new Dice3D();\n else\n logger.warn(\"Dice So Nice! is disabled because the user has activated the 'No-Canvas' mode\");\n }\n });\n});\n\n/**\n * Intercepts all roll-type messages hiding the content until the animation is finished\n */\nHooks.on('createChatMessage', (chatMessage) => {\n //precheck for better perf\n let hasInlineRoll = game.settings.get(\"dice-so-nice\", \"animateInlineRoll\") && chatMessage.content.indexOf('inline-roll') !== -1;\n if ((!chatMessage.isRoll && !hasInlineRoll) || (!chatMessage.isContentVisible && !game.settings.get(\"dice-so-nice\", \"showGhostDice\")) ||\n (game.view != \"stream\" && (!game.dice3d || game.dice3d.messageHookDisabled)) ||\n (chatMessage.getFlag(\"core\", \"RollTable\") && !game.settings.get(\"dice-so-nice\", \"animateRollTable\"))) {\n return;\n }\n\n let rolls = chatMessage.isRoll ? chatMessage.rolls : null;\n let maxRollOrder = rolls ? 0 : -1;\n if (hasInlineRoll) {\n let JqInlineRolls = $($.parseHTML(`
${chatMessage.content}
`)).find(\".inline-roll.inline-result:not(.inline-dsn-hidden)\");\n if (JqInlineRolls.length == 0 && !chatMessage.isRoll) //it was a false positive\n return;\n let inlineRollList = [];\n JqInlineRolls.each((index, el) => {\n //We use the Roll class registered in the CONFIG constant in case the system overwrites it (eg: HeXXen)\n let roll = CONFIG.Dice.rolls[0].fromJSON(unescape(el.dataset.roll));\n maxRollOrder++;\n roll.dice.forEach(diceterm => {\n if (!diceterm.options.hasOwnProperty(\"rollOrder\"))\n diceterm.options.rollOrder = maxRollOrder;\n });\n inlineRollList.push(roll);\n });\n if (inlineRollList.length) {\n if (chatMessage.isRoll)\n inlineRollList = [...chatMessage.rolls, ...inlineRollList];\n\n let pool = PoolTerm.fromRolls(inlineRollList);\n //We use the Roll class registered in the CONFIG constant in case the system overwrites it (eg: HeXXen)\n rolls = [CONFIG.Dice.rolls[0].fromTerms([pool])];\n }\n else if (!chatMessage.isRoll)\n return;\n }\n\n //Because Better Roll 5e sends an empty roll object sometime\n if (!rolls.length || !rolls[0].dice.length)\n return;\n\n const isInitiativeRoll = chatMessage.getFlag(\"core\", \"initiativeRoll\");\n if (isInitiativeRoll && game.settings.get(\"dice-so-nice\", \"disabledForInitiative\"))\n return;\n\n //Remove the chatmessage sound if it is the core dice sound.\n if (Dice3D.CONFIG().enabled && chatMessage.sound == \"sounds/dice.wav\") {\n mergeObject(chatMessage, { \"-=sound\": null }, { performDeletions: true });\n }\n chatMessage._dice3danimating = true;\n\n game.dice3d.renderRolls(chatMessage, rolls);\n});\n\n/**\n * Hide messages which are animating rolls.\n */\nHooks.on(\"renderChatMessage\", (message, html, data) => {\n if (game.dice3d && game.dice3d.messageHookDisabled) {\n return;\n }\n if (message._dice3danimating && !game.settings.get(\"dice-so-nice\", \"immediatelyDisplayChatMessages\")) {\n\n if (message._countNewRolls)\n html.find(`.dice-roll:nth-last-child(-n+${message._countNewRolls})`).addClass(\"dsn-hide\");\n else\n html.addClass(\"dsn-hide\");\n }\n});\n\n/**\n * Save the number of new rolls in the message before it is updated.\n */\nHooks.on(\"preUpdateChatMessage\", (message, updateData, options) => {\n if (!(\"rolls\" in updateData)) return;\n // We test against the source data in case the system/macro/module has modified the scoped message variable\n options.dsnCountAddedRoll = updateData.rolls.length - message.toObject().rolls.length;\n});\n\n/**\n * Hide and roll new rolls added in a chat message in a update\n */\nHooks.on(\"updateChatMessage\", (message, updateData, options) => {\n //Todo: refactor this check into a function\n if (!message.rolls || !message.isRoll || (!message.isContentVisible && !game.settings.get(\"dice-so-nice\", \"showGhostDice\")) ||\n (game.view != \"stream\" && (!game.dice3d || game.dice3d.messageHookDisabled)) ||\n (message.getFlag(\"core\", \"RollTable\") && !game.settings.get(\"dice-so-nice\", \"animateRollTable\"))) {\n return;\n }\n if (options.dsnCountAddedRoll > 0) {\n message._dice3danimating = true;\n message._countNewRolls = options.dsnCountAddedRoll;\n game.dice3d.renderRolls(message, message.rolls.slice(-options.dsnCountAddedRoll));\n }\n});\n\ndocument.addEventListener(\"visibilitychange\", function () {\n //if there was roll while the tab was hidden\n if (!document.hidden && game.dice3d && game.dice3d.hiddenAnimationQueue && game.dice3d.hiddenAnimationQueue.length) {\n let now = (new Date()).getTime();\n for (let i = 0; i < game.dice3d.hiddenAnimationQueue.length; i++) {\n let anim = game.dice3d.hiddenAnimationQueue[i];\n if (now - anim.timestamp > 10000) {\n anim.resolve(false);\n } else {\n game.dice3d._showAnimation(anim.data, anim.config).then(displayed => {\n anim.resolve(displayed);\n });\n }\n }\n game.dice3d.hiddenAnimationQueue = [];\n }\n});"],"names":["EventDispatcher","addEventListener","type","listener","undefined","this","_listeners","listeners","indexOf","push","hasEventListener","removeEventListener","listenerArray","index","splice","dispatchEvent","event","target","array","slice","i","l","length","call","_lut","_seed","DEG2RAD","Math","PI","RAD2DEG","generateUUID","d0","random","d1","d2","d3","toLowerCase","clamp","value","min","max","euclideanModulo","n","m","lerp","x","y","t","isPowerOfTwo","ceilPowerOfTwo","pow","ceil","log","LN2","floorPowerOfTwo","floor","MathUtils","Object","freeze","__proto__","mapLinear","a1","a2","b1","b2","inverseLerp","damp","lambda","dt","exp","pingpong","abs","smoothstep","smootherstep","randInt","low","high","randFloat","randFloatSpread","range","seededRandom","s","imul","degToRad","degrees","radToDeg","radians","setQuaternionFromProperEuler","q","a","b","c","order","cos","sin","c2","s2","c13","s13","c1_3","s1_3","c3_1","s3_1","set","console","warn","normalize","constructor","Float32Array","Uint16Array","round","Uint8Array","Int16Array","Int8Array","Error","denormalize","denormalize$1","Vector2","prototype","isVector2","width","height","setScalar","scalar","setX","setY","setComponent","getComponent","clone","copy","v","add","addScalar","addVectors","addScaledVector","sub","subScalar","subVectors","multiply","multiplyScalar","divide","divideScalar","applyMatrix3","e","elements","clampScalar","minVal","maxVal","clampLength","roundToZero","negate","dot","cross","lengthSq","sqrt","manhattanLength","angle","atan2","distanceTo","distanceToSquared","dx","dy","manhattanDistanceTo","setLength","alpha","lerpVectors","v1","v2","equals","fromArray","offset","toArray","fromBufferAttribute","attribute","getX","getY","rotateAround","center","Symbol","iterator","Matrix3","isMatrix3","n11","n12","n13","n21","n22","n23","n31","n32","n33","te","identity","me","extractBasis","xAxis","yAxis","zAxis","setFromMatrix3Column","setFromMatrix4","multiplyMatrices","premultiply","ae","be","a11","a12","a13","a21","a22","a23","a31","a32","a33","b11","b12","b13","b21","b22","b23","b31","b32","b33","determinant","d","f","g","h","invert","t11","t12","t13","det","detInv","transpose","tmp","getNormalMatrix","matrix4","transposeIntoArray","r","setUvTransform","tx","ty","sx","sy","rotation","cx","cy","scale","rotate","theta","translate","matrix","arrayNeedsUint32","TYPED_ARRAYS","Uint8ClampedArray","Int32Array","Uint32Array","Float64Array","getTypedArray","buffer","createElementNS","name","document","SRGBToLinear","LinearToSRGB","FN","srgb","ColorManagement","legacyMode","workingColorSpace","colorSpace","convert","color","sourceColorSpace","targetColorSpace","fn","fromWorkingColorSpace","toWorkingColorSpace","_colorKeywords","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkgrey","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","green","greenyellow","grey","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightgrey","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen","_rgb","_hslA","_hslB","hue2rgb","p","toComponents","source","Color","isColor","setRGB","setHex","setStyle","hex","setHSL","style","handleAlpha","string","parseFloat","exec","components","parseInt","size","charAt","setColorName","copySRGBToLinear","copyLinearToSRGB","convertSRGBToLinear","convertLinearToSRGB","getHex","getHexString","toString","getHSL","hue","saturation","lightness","delta","getRGB","getStyle","offsetHSL","addColors","color1","color2","lerpColors","lerpHSL","getZ","normalized","toJSON","_canvas","NAMES","ImageUtils","static","image","test","src","HTMLCanvasElement","canvas","context","getContext","ImageData","putImageData","drawImage","toDataURL","HTMLImageElement","ImageBitmap","imageData","getImageData","data","Source","isSource","uuid","version","needsUpdate","meta","isRootObject","images","output","url","Array","isArray","isDataTexture","serializeImage","getDataURL","from","textureId","Texture","DEFAULT_IMAGE","mapping","DEFAULT_MAPPING","wrapS","wrapT","magFilter","minFilter","format","anisotropy","encoding","super","isTexture","defineProperty","mipmaps","internalFormat","repeat","matrixAutoUpdate","generateMipmaps","premultiplyAlpha","flipY","unpackAlignment","userData","onUpdate","isRenderTargetTexture","needsPMREMUpdate","updateMatrix","JSON","parse","stringify","textures","metadata","generator","wrap","dispose","transformUv","uv","Vector4","z","w","isVector4","setZ","setW","applyMatrix4","setAxisAngleFromQuaternion","acos","setAxisAngleFromRotationMatrix","epsilon","epsilon2","m11","m12","m13","m21","m22","m23","m31","m32","m33","xx","yy","zz","xy","xz","yz","getW","WebGLRenderTarget","options","isWebGLRenderTarget","depth","scissor","scissorTest","viewport","texture","depthBuffer","stencilBuffer","depthTexture","samples","setSize","assign","DataArrayTexture","isDataArrayTexture","wrapR","Data3DTexture","isData3DTexture","Quaternion","isQuaternion","_x","_y","_z","_w","dst","dstOffset","src0","srcOffset0","src1","srcOffset1","x0","y0","z0","w0","x1","y1","z1","w1","dir","sqrSin","Number","EPSILON","len","tDir","_onChangeCallback","quaternion","setFromEuler","euler","update","isEuler","_order","c1","c3","s1","s3","setFromAxisAngle","axis","halfAngle","setFromRotationMatrix","trace","setFromUnitVectors","vFrom","vTo","angleTo","rotateTowards","step","slerp","conjugate","multiplyQuaternions","qax","qay","qaz","qaw","qbx","qby","qbz","qbw","qb","cosHalfTheta","sqrSinHalfTheta","sinHalfTheta","halfTheta","ratioA","ratioB","slerpQuaternions","qa","u1","sqrt1u1","sqrtu1","u2","u3","_onChange","callback","Vector3","isVector3","multiplyVectors","applyEuler","applyQuaternion","_quaternion$4","applyAxisAngle","applyNormalMatrix","qx","qy","qz","qw","ix","iy","iz","iw","project","camera","matrixWorldInverse","projectionMatrix","unproject","projectionMatrixInverse","matrixWorld","transformDirection","crossVectors","ax","ay","az","bx","by","bz","projectOnVector","denominator","projectOnPlane","planeNormal","_vector$c","reflect","normal","dz","setFromSpherical","setFromSphericalCoords","radius","phi","sinPhiRadius","setFromCylindrical","setFromCylindricalCoords","setFromMatrixPosition","setFromMatrixScale","setFromMatrixColumn","sz","randomDirection","u","Box3","Infinity","isBox3","setFromArray","minX","minY","minZ","maxX","maxY","maxZ","setFromBufferAttribute","count","setFromPoints","points","makeEmpty","il","expandByPoint","setFromCenterAndSize","halfSize","_vector$b","setFromObject","object","precise","expandByObject","box","isEmpty","getCenter","getSize","point","expandByVector","vector","expandByScalar","updateWorldMatrix","geometry","attributes","position","boundingBox","computeBoundingBox","_box$3","union","children","containsPoint","containsBox","getParameter","intersectsBox","intersectsSphere","sphere","clampPoint","intersectsPlane","plane","constant","intersectsTriangle","triangle","_center","_extents","_v0$2","_v1$7","_v2$3","_f0","_f1","_f2","axes","satForAxes","_triangleNormal","distanceToPoint","getBoundingSphere","intersect","_points","_testAxis","v0","extents","j","p0","p1","p2","_box$2","_v1$6","_toFarthestPoint","_toPoint","Sphere","optionalCenter","maxRadiusSq","radiusSum","deltaLengthSq","getBoundingBox","getMaxScaleOnAxis","missingRadiusHalf","_vector$a","_segCenter","_segDir","_diff","_edge1","_edge2","_normal$1","Ray","origin","direction","ray","at","lookAt","recast","closestPointToPoint","directionDistance","distanceSqToPoint","distanceSqToSegment","optionalPointOnRay","optionalPointOnSegment","segExtent","a01","b0","s0","sqrDist","extDet","invDet","intersectSphere","tca","radius2","thc","t0","t1","distanceToPlane","intersectPlane","distToPoint","intersectBox","tmin","tmax","tymin","tymax","tzmin","tzmax","invdirx","invdiry","invdirz","intersectTriangle","backfaceCulling","sign","DdN","DdQxE2","DdE1xQ","QdN","Matrix4","isMatrix4","n14","n24","n34","n41","n42","n43","n44","copyPosition","setFromMatrix3","makeBasis","extractRotation","scaleX","_v1$5","scaleY","scaleZ","makeRotationFromEuler","af","bf","ce","cf","de","df","ac","ad","bc","bd","makeRotationFromQuaternion","compose","_zero","_one","eye","up","a14","a24","a34","a41","a42","a43","a44","b14","b24","b34","b41","b42","b43","b44","setPosition","t14","scaleXSq","scaleYSq","scaleZSq","makeTranslation","makeRotationX","makeRotationY","makeRotationZ","makeRotationAxis","makeScale","makeShear","yx","zx","zy","x2","y2","z2","wx","wy","wz","decompose","_m1$2","invSX","invSY","invSZ","makePerspective","left","right","top","bottom","near","far","makeOrthographic","_matrix$1","_quaternion$3","Euler","DefaultOrder","asin","setFromQuaternion","setFromVector3","reorder","newOrder","toVector3","error","RotationOrders","Layers","mask","channel","enable","enableAll","toggle","disable","disableAll","layers","isEnabled","_object3DId","_v1$4","_q1","_m1$1","_target","_position$3","_scale$2","_quaternion$2","_xAxis","_yAxis","_zAxis","_addedEvent","_removedEvent","Object3D","isObject3D","parent","DefaultUp","onRotationChange","onQuaternionChange","defineProperties","configurable","enumerable","modelViewMatrix","normalMatrix","DefaultMatrixAutoUpdate","matrixWorldNeedsUpdate","visible","castShadow","receiveShadow","frustumCulled","renderOrder","animations","onBeforeRender","onAfterRender","setRotationFromAxisAngle","setRotationFromEuler","setRotationFromMatrix","setRotationFromQuaternion","rotateOnAxis","rotateOnWorldAxis","rotateX","rotateY","rotateZ","translateOnAxis","distance","translateX","translateY","translateZ","localToWorld","worldToLocal","isCamera","isLight","arguments","remove","removeFromParent","clear","attach","getObjectById","id","getObjectByProperty","getObjectByName","getWorldPosition","getWorldQuaternion","getWorldScale","getWorldDirection","raycast","traverse","traverseVisible","traverseAncestors","updateMatrixWorld","force","updateParents","updateChildren","geometries","materials","shapes","skeletons","nodes","serialize","library","element","isInstancedMesh","instanceMatrix","instanceColor","isScene","background","environment","isMesh","isLine","isPoints","parameters","shape","isSkinnedMesh","bindMode","bindMatrix","skeleton","material","uuids","animation","extractFromCache","cache","values","key","recursive","child","_v0$1","_v1$3","_v2$2","_v3$1","_vab","_vac","_vbc","_vap","_vbp","_vcp","Triangle","targetLengthSq","dot00","dot01","dot02","dot11","dot12","denom","invDenom","getBarycoord","p3","uv1","uv2","uv3","setFromPointsAndIndices","i0","i1","i2","setFromAttributeAndIndices","getArea","getMidpoint","getNormal","getPlane","setFromCoplanarPoints","getUV","isFrontFacing","d4","vc","d5","d6","vb","va","materialId","Material","isMaterial","blending","side","vertexColors","opacity","transparent","blendSrc","blendDst","blendEquation","blendSrcAlpha","blendDstAlpha","blendEquationAlpha","depthFunc","depthTest","depthWrite","stencilWriteMask","stencilFunc","stencilRef","stencilFuncMask","stencilFail","stencilZFail","stencilZPass","stencilWrite","clippingPlanes","clipIntersection","clipShadows","shadowSide","colorWrite","precision","polygonOffset","polygonOffsetFactor","polygonOffsetUnits","dithering","alphaToCoverage","premultipliedAlpha","toneMapped","_alphaTest","alphaTest","onBuild","onBeforeCompile","customProgramCacheKey","setValues","newValue","flatShading","currentValue","roughness","metalness","sheen","sheenColor","sheenRoughness","emissive","emissiveIntensity","specular","specularIntensity","specularColor","shininess","clearcoat","clearcoatRoughness","clearcoatMap","clearcoatRoughnessMap","clearcoatNormalMap","clearcoatNormalScale","iridescence","iridescenceIOR","iridescenceThicknessRange","iridescenceMap","iridescenceThicknessMap","map","matcap","alphaMap","lightMap","lightMapIntensity","aoMap","aoMapIntensity","bumpMap","bumpScale","normalMap","normalMapType","normalScale","displacementMap","displacementScale","displacementBias","roughnessMap","metalnessMap","emissiveMap","specularMap","specularIntensityMap","specularColorMap","envMap","combine","envMapIntensity","reflectivity","refractionRatio","gradientMap","transmission","transmissionMap","thickness","thicknessMap","attenuationDistance","attenuationColor","sizeAttenuation","linewidth","dashSize","gapSize","wireframe","wireframeLinewidth","wireframeLinecap","wireframeLinejoin","fog","srcPlanes","dstPlanes","MeshBasicMaterial","isMeshBasicMaterial","_vector$9","_vector2$1","BufferAttribute","itemSize","TypeError","isBufferAttribute","usage","updateRange","onUploadCallback","setUsage","copyAt","index1","index2","copyArray","copyColorsArray","colors","copyVector2sArray","vectors","copyVector3sArray","copyVector4sArray","setXY","setXYZ","setXYZW","onUpload","Uint16BufferAttribute","Uint32BufferAttribute","Float32BufferAttribute","_id$1","_m1","_obj","_offset","_box$1","_boxMorphTargets","_vector$8","BufferGeometry","isBufferGeometry","morphAttributes","morphTargetsRelative","groups","boundingSphere","drawRange","start","getIndex","setIndex","getAttribute","setAttribute","deleteAttribute","hasAttribute","addGroup","materialIndex","clearGroups","setDrawRange","tangent","computeBoundingSphere","morphAttributesPosition","isGLBufferAttribute","morphAttribute","isNaN","jl","computeTangents","indices","positions","normals","uvs","nVertices","tangents","tan1","tan2","vA","vB","vC","uvA","uvB","uvC","sdir","tdir","handleTriangle","isFinite","group","tmp2","n2","handleVertex","computeVertexNormals","positionAttribute","normalAttribute","pA","pB","pC","nA","nB","nC","cb","ab","normalizeNormals","merge","attributeArray1","attribute2","attributeArray2","attributeOffset","toNonIndexed","convertBufferAttribute","array2","isInterleavedBufferAttribute","stride","geometry2","newAttribute","morphArray","keys","hasMorphAttributes","attributeArray","_inverseMatrix$2","_ray$2","_sphere$3","_vA$1","_vB$1","_vC$1","_tempA","_tempB","_tempC","_morphA","_morphB","_morphC","_uvA$1","_uvB$1","_uvC$1","_intersectionPoint","_intersectionPointWorld","Mesh","updateMorphTargets","morphTargetInfluences","morphTargetDictionary","ml","String","raycaster","intersects","intersection","morphPosition","groupMaterial","checkBufferGeometryIntersection","faceIndex","face","morphInfluences","influence","boneTransform","checkIntersection","BoxGeometry","widthSegments","heightSegments","depthSegments","scope","vertices","numberOfVertices","groupStart","buildPlane","udir","vdir","gridX","gridY","segmentWidth","segmentHeight","widthHalf","heightHalf","depthHalf","gridX1","gridY1","vertexCounter","groupCount","cloneUniforms","property","mergeUniforms","uniforms","merged","UniformsUtils","ShaderMaterial","isShaderMaterial","defines","uniformsGroups","vertexShader","fragmentShader","lights","clipping","extensions","derivatives","fragDepth","drawBuffers","shaderTextureLOD","defaultAttributeValues","index0AttributeName","uniformsNeedUpdate","glslVersion","cloneUniformsGroups","Camera","PerspectiveCamera","fov","aspect","isPerspectiveCamera","zoom","focus","view","filmGauge","filmOffset","updateProjectionMatrix","setFocalLength","focalLength","vExtentSlope","getFilmHeight","atan","getFocalLength","getEffectiveFOV","getFilmWidth","setViewOffset","fullWidth","fullHeight","enabled","offsetX","offsetY","clearViewOffset","skew","CubeCamera","renderTarget","isWebGLCubeRenderTarget","cameraPX","cameraNX","cameraPY","cameraNY","cameraPZ","cameraNZ","renderer","scene","currentRenderTarget","getRenderTarget","currentToneMapping","toneMapping","currentXrEnabled","xr","setRenderTarget","render","CubeTexture","isCubeTexture","WebGLCubeRenderTarget","fromEquirectangularTexture","shader","tEquirect","mesh","currentMinFilter","stencil","_vector1","_vector2","_normalMatrix","Plane","isPlane","setComponents","setFromNormalAndCoplanarPoint","inverseNormalLength","distanceToSphere","projectPoint","intersectLine","line","intersectsLine","startSign","endSign","end","coplanarPoint","optionalNormalMatrix","referencePoint","_sphere$2","_vector$7","Frustum","p4","p5","planes","frustum","setFromProjectionMatrix","me0","me1","me2","me3","me4","me5","me6","me7","me8","me9","me10","me11","me12","me13","me14","me15","intersectsObject","intersectsSprite","sprite","negRadius","WebGLAnimation","isAnimating","animationLoop","requestId","onAnimationFrame","time","frame","requestAnimationFrame","stop","cancelAnimationFrame","setAnimationLoop","setContext","WebGLAttributes","gl","capabilities","isWebGL2","buffers","WeakMap","get","deleteBuffer","delete","bufferType","cached","bytesPerElement","elementSize","createBuffer","bindBuffer","bufferData","isFloat16BufferAttribute","BYTES_PER_ELEMENT","updateBuffer","bufferSubData","subarray","PlaneGeometry","width_half","height_half","segment_width","segment_height","ShaderChunk","alphamap_fragment","alphamap_pars_fragment","alphatest_fragment","alphatest_pars_fragment","aomap_fragment","aomap_pars_fragment","begin_vertex","beginnormal_vertex","bsdfs","iridescence_fragment","bumpmap_pars_fragment","clipping_planes_fragment","clipping_planes_pars_fragment","clipping_planes_pars_vertex","clipping_planes_vertex","color_fragment","color_pars_fragment","color_pars_vertex","color_vertex","common","cube_uv_reflection_fragment","defaultnormal_vertex","displacementmap_pars_vertex","displacementmap_vertex","emissivemap_fragment","emissivemap_pars_fragment","encodings_fragment","encodings_pars_fragment","envmap_fragment","envmap_common_pars_fragment","envmap_pars_fragment","envmap_pars_vertex","envmap_physical_pars_fragment","envmap_vertex","fog_vertex","fog_pars_vertex","fog_fragment","fog_pars_fragment","gradientmap_pars_fragment","lightmap_fragment","lightmap_pars_fragment","lights_lambert_vertex","lights_pars_begin","lights_toon_fragment","lights_toon_pars_fragment","lights_phong_fragment","lights_phong_pars_fragment","lights_physical_fragment","lights_physical_pars_fragment","lights_fragment_begin","lights_fragment_maps","lights_fragment_end","logdepthbuf_fragment","logdepthbuf_pars_fragment","logdepthbuf_pars_vertex","logdepthbuf_vertex","map_fragment","map_pars_fragment","map_particle_fragment","map_particle_pars_fragment","metalnessmap_fragment","metalnessmap_pars_fragment","morphcolor_vertex","morphnormal_vertex","morphtarget_pars_vertex","morphtarget_vertex","normal_fragment_begin","normal_fragment_maps","normal_pars_fragment","normal_pars_vertex","normal_vertex","normalmap_pars_fragment","clearcoat_normal_fragment_begin","clearcoat_normal_fragment_maps","clearcoat_pars_fragment","iridescence_pars_fragment","output_fragment","packing","premultiplied_alpha_fragment","project_vertex","dithering_fragment","dithering_pars_fragment","roughnessmap_fragment","roughnessmap_pars_fragment","shadowmap_pars_fragment","shadowmap_pars_vertex","shadowmap_vertex","shadowmask_pars_fragment","skinbase_vertex","skinning_pars_vertex","skinning_vertex","skinnormal_vertex","specularmap_fragment","specularmap_pars_fragment","tonemapping_fragment","tonemapping_pars_fragment","transmission_fragment","transmission_pars_fragment","uv_pars_fragment","uv_pars_vertex","uv_vertex","uv2_pars_fragment","uv2_pars_vertex","uv2_vertex","worldpos_vertex","background_vert","background_frag","cube_vert","cube_frag","depth_vert","depth_frag","distanceRGBA_vert","distanceRGBA_frag","equirect_vert","equirect_frag","linedashed_vert","linedashed_frag","meshbasic_vert","meshbasic_frag","meshlambert_vert","meshlambert_frag","meshmatcap_vert","meshmatcap_frag","meshnormal_vert","meshnormal_frag","meshphong_vert","meshphong_frag","meshphysical_vert","meshphysical_frag","meshtoon_vert","meshtoon_frag","points_vert","points_frag","shadow_vert","shadow_frag","sprite_vert","sprite_frag","UniformsLib","diffuse","uvTransform","uv2Transform","specularmap","envmap","flipEnvMap","ior","aomap","lightmap","emissivemap","bumpmap","normalmap","displacementmap","roughnessmap","metalnessmap","gradientmap","fogDensity","fogNear","fogFar","fogColor","ambientLightColor","lightProbe","directionalLights","properties","directionalLightShadows","shadowBias","shadowNormalBias","shadowRadius","shadowMapSize","directionalShadowMap","directionalShadowMatrix","spotLights","coneCos","penumbraCos","decay","spotLightShadows","spotShadowMap","spotShadowMatrix","pointLights","pointLightShadows","shadowCameraNear","shadowCameraFar","pointShadowMap","pointShadowMatrix","hemisphereLights","skyColor","groundColor","rectAreaLights","ltc_1","ltc_2","ShaderLib","basic","lambert","phong","standard","toon","dashed","totalSize","t2D","cube","equirect","distanceRGBA","referencePosition","nearDistance","farDistance","shadow","WebGLBackground","cubemaps","state","objects","clearColor","planeMesh","boxMesh","clearAlpha","currentBackground","currentBackgroundVersion","currentTonemapping","setClear","getClearColor","setClearColor","getClearAlpha","setClearAlpha","renderList","forceClear","session","getSession","environmentBlendMode","autoClear","autoClearColor","autoClearDepth","autoClearStencil","unshift","WebGLBindingStates","maxVertexAttributes","extension","vaoAvailable","bindingStates","defaultState","createBindingState","currentState","forceUpdate","bindVertexArrayObject","vao","bindVertexArray","bindVertexArrayOES","deleteVertexArrayObject","deleteVertexArray","deleteVertexArrayOES","newAttributes","enabledAttributes","attributeDivisors","program","initAttributes","enableAttribute","enableAttributeAndDivisor","meshPerAttribute","enableVertexAttribArray","disableUnusedAttributes","disableVertexAttribArray","vertexAttribPointer","vertexAttribIPointer","reset","resetDefaultState","setup","updateBuffers","getBindingState","programMap","stateMap","createVertexArrayObject","createVertexArray","createVertexArrayOES","cachedAttributes","geometryAttributes","attributesNum","programAttributes","getAttributes","location","cachedAttribute","geometryAttribute","saveCache","setupVertexAttributes","isInstancedBufferGeometry","materialDefaultAttributeValues","programAttribute","isInstancedInterleavedBuffer","locationSize","_maxInstanceCount","isInstancedBufferAttribute","vertexAttrib2fv","vertexAttrib3fv","vertexAttrib4fv","vertexAttrib1fv","geometryId","programId","releaseStatesOfGeometry","releaseStatesOfProgram","WebGLBufferRenderer","info","mode","setMode","drawArrays","renderInstances","primcount","methodName","WebGLCapabilities","maxAnisotropy","getMaxPrecision","getShaderPrecisionFormat","WebGL2RenderingContext","WebGL2ComputeRenderingContext","maxPrecision","has","logarithmicDepthBuffer","maxTextures","maxVertexTextures","maxTextureSize","maxCubemapSize","maxAttributes","maxVertexUniforms","maxVaryings","maxFragmentUniforms","vertexTextures","floatFragmentTextures","getMaxAnisotropy","MAX_TEXTURE_MAX_ANISOTROPY_EXT","floatVertexTextures","maxSamples","WebGLClipping","globalState","numGlobalPlanes","localClippingEnabled","renderingShadows","viewNormalMatrix","uniform","resetGlobalState","numPlanes","numIntersection","projectPlanes","skipTransform","nPlanes","dstArray","flatSize","viewMatrix","i4","init","enableLocalClipping","beginShadows","endShadows","setState","useCache","materialProperties","nGlobal","lGlobal","clippingState","WebGLCubeMaps","mapTextureMapping","onTextureDispose","cubemap","physical","iridescenceThicknessMinimum","iridescenceThicknessMaximum","sheenColorMap","sheenRoughnessMap","transmissionSamplerSize","transmissionSamplerMap","OrthographicCamera","isOrthographicCamera","scaleW","scaleH","EXTRA_LOD_SIGMA","_flatCamera","_clearColor","_oldTarget","PHI","INV_PHI","_axisDirections","PMREMGenerator","_renderer","_pingPongRenderTarget","_lodMax","_cubeSize","_lodPlanes","_sizeLods","_sigmas","_blurMaterial","_cubemapMaterial","_equirectMaterial","_compileMaterial","fromScene","sigma","_setSize","cubeUVRenderTarget","_allocateTargets","_sceneToCubeUV","_blur","_applyPMREM","_cleanup","fromEquirectangular","equirectangular","_fromTexture","fromCubemap","compileCubemapShader","_getCubemapMaterial","compileEquirectangularShader","_getEquirectMaterial","_dispose","cubeSize","log2","outputTarget","_setViewport","_textureToCubeUV","params","_createRenderTarget","sizeLods","lodPlanes","sigmas","_createPlanes","lodMax","lod","totalLods","sizeLod","texelSize","cubeFaces","positionSize","uvSize","faceIndexSize","coordinates","fill","_getBlurShader","weights","poleAxis","CUBEUV_TEXEL_WIDTH","CUBEUV_TEXEL_HEIGHT","CUBEUV_MAX_MIP","latitudinal","dTheta","mipInt","_getCommonVertexShader","tmpMesh","compile","cubeCamera","upSign","forwardSign","originalAutoClear","backgroundMaterial","backgroundBox","useSolidColor","col","lodIn","lodOut","pingPongRenderTarget","_halfBlur","targetIn","targetOut","sigmaRadians","blurMaterial","blurMesh","blurUniforms","pixels","radiansPerPixel","sigmaPixels","sum","weight","outputSize","WebGLCubeUVMaps","cubeUVmaps","pmremGenerator","cubemapUV","isEquirectMap","isCubeMap","isCubeTextureComplete","WebGLExtensions","getExtension","WebGLGeometries","wireframeAttributes","onGeometryDispose","memory","updateWireframeAttribute","geometryIndex","geometryPosition","previousAttribute","getWireframeAttribute","currentAttribute","WebGLIndexedBufferRenderer","drawElements","WebGLInfo","calls","triangles","lines","programs","autoReset","instanceCount","numericalSort","absNumericalSort","morph","WebGLMorphtargets","influencesList","morphTextures","workInfluences","objectInfluences","morphTargetsCount","entry","hasMorphPosition","hasMorphNormals","hasMorphColors","morphTargets","morphNormals","morphColors","vertexDataCount","vertexDataStride","morphTarget","morphNormal","morphColor","disposeTexture","morphInfluencesSum","morphBaseInfluence","getUniforms","setValue","influences","sort","MAX_SAFE_INTEGER","WebGLObjects","updateMap","onInstancedMeshDispose","instancedMesh","buffergeometry","emptyTexture","emptyArrayTexture","empty3dTexture","emptyCubeTexture","arrayCacheF32","arrayCacheI32","mat4array","mat3array","mat2array","flatten","nBlocks","blockSize","firstElem","arraysEqual","allocTexUnits","allocateTextureUnit","setValueV1f","uniform1f","addr","setValueV2f","uniform2f","uniform2fv","setValueV3f","uniform3f","uniform3fv","setValueV4f","uniform4f","uniform4fv","setValueM2","uniformMatrix2fv","setValueM3","uniformMatrix3fv","setValueM4","uniformMatrix4fv","setValueV1i","uniform1i","setValueV2i","uniform2iv","setValueV3i","uniform3iv","setValueV4i","uniform4iv","setValueV1ui","uniform1ui","setValueV2ui","uniform2uiv","setValueV3ui","uniform3uiv","setValueV4ui","uniform4uiv","setValueT1","unit","setTexture2D","setValueT3D1","setTexture3D","setValueT6","setTextureCube","setValueT2DArray1","setTexture2DArray","setValueV1fArray","uniform1fv","setValueV2fArray","setValueV3fArray","setValueV4fArray","setValueM2Array","setValueM3Array","setValueM4Array","setValueV1iArray","uniform1iv","setValueV2iArray","setValueV3iArray","setValueV4iArray","setValueV1uiArray","uniform1uiv","setValueV2uiArray","setValueV3uiArray","setValueV4uiArray","setValueT1Array","units","setValueT3DArray","setValueT6Array","setValueT2DArrayArray","SingleUniform","activeInfo","getSingularSetter","PureArrayUniform","getPureArraySetter","StructuredUniform","seq","RePathPart","addUniform","container","uniformObject","parseUniform","path","pathLength","lastIndex","match","matchEnd","idIsIndex","subscript","next","WebGLUniforms","getProgramParameter","getActiveUniform","getUniformLocation","setOptional","WebGLShader","createShader","shaderSource","compileShader","programIdCount","getShaderErrors","status","getShaderParameter","errors","getShaderInfoLog","trim","errorMatches","errorLine","toUpperCase","handleSource","split","lines2","to","join","getShaderSource","getTexelEncodingFunction","functionName","getEncodingComponents","getToneMappingFunction","toneMappingName","filterEmptyLine","replaceLightNums","replace","numDirLights","numSpotLights","numRectAreaLights","numPointLights","numHemiLights","numDirLightShadows","numSpotLightShadows","numPointLightShadows","replaceClippingPlaneNums","numClippingPlanes","numClipIntersection","includePattern","resolveIncludes","includeReplacer","include","deprecatedUnrollLoopPattern","unrollLoopPattern","unrollLoops","loopReplacer","deprecatedLoopReplacer","snippet","generatePrecision","precisionstring","WebGLProgram","cacheKey","shadowMapTypeDefine","generateShadowMapTypeDefine","shadowMapType","envMapTypeDefine","generateEnvMapTypeDefine","envMapMode","envMapModeDefine","generateEnvMapModeDefine","envMapBlendingDefine","generateEnvMapBlendingDefine","envMapCubeUVSize","generateCubeUVSize","imageHeight","envMapCubeUVHeight","maxMip","texelHeight","texelWidth","customExtensions","generateExtensions","extensionDerivatives","tangentSpaceNormalMap","shaderID","extensionFragDepth","rendererExtensionFragDepth","extensionDrawBuffers","rendererExtensionDrawBuffers","extensionShaderTextureLOD","rendererExtensionShaderTextureLod","filter","customDefines","generateDefines","chunks","createProgram","prefixVertex","prefixFragment","versionString","isRawShaderMaterial","shaderName","instancing","instancingColor","supportsVertexTextures","useFog","fogExp2","objectSpaceNormalMap","vertexTangents","vertexAlphas","vertexUvs","uvsVertexOnly","skinning","morphTextureStride","doubleSided","flipSided","shadowMapEnabled","decodeVideoTexture","physicallyCorrectLights","opaque","outputEncoding","useDepthPacking","depthPacking","fragmentGlsl","glVertexShader","glFragmentShader","attachShader","bindAttribLocation","linkProgram","debug","checkShaderErrors","programLog","getProgramInfoLog","vertexLog","fragmentLog","runnable","haveDiagnostics","vertexErrors","fragmentErrors","getError","diagnostics","prefix","cachedUniforms","deleteShader","fetchAttributeLocations","getActiveAttrib","getAttribLocation","destroy","deleteProgram","usedTimes","_id","WebGLShaderCache","shaderCache","Map","materialCache","vertexShaderStage","_getShaderStage","fragmentShaderStage","materialShaders","_getShaderCacheForMaterial","shaderStage","code","getVertexShaderID","getFragmentShaderID","Set","stage","WebGLShaderStage","WebGLPrograms","cubeuvmaps","_programLayers","_customShaders","shaderIDs","MeshDepthMaterial","MeshDistanceMaterial","MeshNormalMaterial","MeshLambertMaterial","MeshPhongMaterial","MeshToonMaterial","MeshStandardMaterial","MeshPhysicalMaterial","MeshMatcapMaterial","LineBasicMaterial","LineDashedMaterial","PointsMaterial","ShadowMaterial","SpriteMaterial","getParameters","shadows","isMeshStandardMaterial","customVertexShaderID","customFragmentShaderID","useAlphaTest","useClearcoat","useIridescence","isXRRenderTarget","isVideoTexture","isFogExp2","directional","spot","rectArea","hemi","shadowMap","getProgramCacheKey","getProgramCacheKeyParameters","morphAttributeCount","getProgramCacheKeyBooleans","acquireProgram","pl","preexistingProgram","releaseProgram","pop","releaseShaderCache","WebGLProperties","painterSortStable","groupOrder","reversePainterSortStable","WebGLRenderList","renderItems","renderItemsIndex","transmissive","getNextRenderItem","renderItem","finish","customOpaqueSort","customTransparentSort","WebGLRenderLists","lists","renderCallDepth","list","UniformsCache","light","halfWidth","halfHeight","nextVersion","shadowCastingLightsFirst","lightA","lightB","WebGLLights","shadowCache","ShadowUniformsCache","hash","directionalLength","pointLength","spotLength","rectAreaLength","hemiLength","numDirectionalShadows","numPointShadows","numSpotShadows","ambient","probe","directionalShadow","spotShadow","rectAreaLTC1","rectAreaLTC2","pointShadow","vector3","matrix42","scaleFactor","intensity","isAmbientLight","isLightProbe","sh","coefficients","isDirectionalLight","shadowUniforms","bias","normalBias","mapSize","isSpotLight","penumbra","isRectAreaLight","isPointLight","isHemisphereLight","LTC_FLOAT_1","LTC_FLOAT_2","LTC_HALF_1","LTC_HALF_2","setupView","WebGLRenderState","lightsArray","shadowsArray","setupLights","setupLightsView","pushLight","pushShadow","shadowLight","WebGLRenderStates","renderStates","renderState","isMeshDepthMaterial","isMeshDistanceMaterial","WebGLShadowMap","_objects","_capabilities","_frustum","_shadowMapSize","_viewportSize","_viewport","_depthMaterial","_distanceMaterial","_materialCache","_maxTextureSize","shadowMaterialVertical","VSM_SAMPLES","shadow_pass","resolution","shadowMaterialHorizontal","HORIZONTAL_PASS","fullScreenTri","fullScreenMesh","VSMPass","blurSamples","mapPass","renderBufferDirect","getDepthMaterial","result","customMaterial","customDistanceMaterial","customDepthMaterial","keyA","keyB","materialsForVariant","cachedMaterial","renderObject","shadowCamera","k","kl","depthMaterial","autoUpdate","activeCubeFace","getActiveCubeFace","activeMipmapLevel","getActiveMipmapLevel","_state","setBlending","setTest","setScissorTest","shadowFrameExtents","getFrameExtents","pars","viewportCount","getViewportCount","vp","getViewport","updateMatrices","getFrustum","isPointLightShadow","WebGLState","colorBuffer","ColorBuffer","locked","currentColorMask","currentColorClear","setMask","colorMask","setLocked","lock","DepthBuffer","currentDepthMask","currentDepthFunc","currentDepthClear","depthMask","setFunc","clearDepth","StencilBuffer","currentStencilMask","currentStencilFunc","currentStencilRef","currentStencilFuncMask","currentStencilFail","currentStencilZFail","currentStencilZPass","currentStencilClear","stencilTest","stencilMask","setOp","stencilOp","clearStencil","uboBindings","uboProgamMap","enabledCapabilities","currentBoundFramebuffers","currentDrawbuffers","defaultDrawbuffers","currentProgram","currentBlendingEnabled","currentBlending","currentBlendEquation","currentBlendSrc","currentBlendDst","currentBlendEquationAlpha","currentBlendSrcAlpha","currentBlendDstAlpha","currentPremultipledAlpha","currentFlipSided","currentCullFace","currentLineWidth","currentPolygonOffsetFactor","currentPolygonOffsetUnits","lineWidthAvailable","glVersion","currentTextureSlot","currentBoundTextures","scissorParam","viewportParam","currentScissor","currentViewport","createTexture","bindTexture","texParameteri","texImage2D","emptyTextures","setFlipSided","setCullFace","equationToGL","MIN_EXT","MAX_EXT","factorToGL","blendEquationSeparate","blendFuncSeparate","blendFunc","frontFace","cullFace","setPolygonOffset","factor","activeTexture","webglSlot","bindFramebuffer","framebuffer","isWebGLMultipleRenderTargets","drawBuffersWEBGL","useProgram","setMaterial","frontFaceCW","setLineWidth","lineWidth","webglType","webglTexture","boundTexture","unbindTexture","compressedTexImage2D","apply","texImage3D","updateUBOMapping","uniformsGroup","blockIndex","getUniformBlockIndex","uniformBlockBinding","__bindingPointIndex","texStorage2D","texStorage3D","texSubImage2D","texSubImage3D","compressedTexSubImage2D","WebGLTextures","_gl","utils","multisampledRTTExt","supportsInvalidateFramebuffer","navigator","userAgent","_videoTextures","_sources","useOffscreenCanvas","OffscreenCanvas","err","createCanvas","resizeImage","needsPowerOfTwo","needsNewCanvas","maxSize","isPowerOfTwo$1","textureNeedsGenerateMipmaps","supportsMips","generateMipmap","getInternalFormat","internalFormatName","glFormat","glType","getMipLevels","isFramebufferTexture","isCompressedTexture","filterFallback","deallocateTexture","textureProperties","__webglInit","webglTextures","__cacheKey","deleteTexture","onRenderTargetDispose","deallocateRenderTarget","renderTargetProperties","__webglTexture","deleteFramebuffer","__webglFramebuffer","__webglDepthbuffer","deleteRenderbuffer","__webglMultisampledFramebuffer","__webglColorRenderbuffer","__webglDepthRenderbuffer","attachmentProperties","textureUnits","slot","updateVideoTexture","__version","complete","uploadTexture","wrappingToGL","filterToGL","setTextureParameters","textureType","__currentAnisotropy","texParameterf","TEXTURE_MAX_ANISOTROPY_EXT","initTexture","forceUpload","textureCacheKey","getTextureCacheKey","__currentVersion","pixelStorei","textureNeedsPowerOfTwo","verifyColorSpace","mipmap","glInternalFormat","useTexStorage","allocateMemory","levels","isDepthTexture","setupFrameBufferTexture","attachment","textureTarget","__hasExternalTextures","useMultisampledRTT","framebufferTexture2DMultisampleEXT","getRenderTargetSamples","framebufferTexture2D","setupRenderBufferStorage","renderbuffer","isMultisample","bindRenderbuffer","renderbufferStorageMultisampleEXT","renderbufferStorageMultisample","renderbufferStorage","framebufferRenderbuffer","setupDepthRenderbuffer","isCube","__autoAllocateDepthBuffer","setupDepthTexture","webglDepthTexture","createRenderbuffer","__useRenderToTexture","sRGBToLinear","textureUnit","resetTextureUnits","uploadCubeTexture","isCompressed","cubeImage","mipmapImage","rebindTextures","colorTexture","setupRenderTarget","isMultipleRenderTargets","createFramebuffer","glTextureType","isWebGL3DRenderTarget","isWebGLArrayRenderTarget","updateRenderTargetMipmap","updateMultisampleRenderTarget","invalidationArray","depthStyle","ignoreDepthValues","__ignoreDepthValues","invalidateFramebuffer","blitFramebuffer","WebGLUtils","HALF_FLOAT_OES","SRGB_ALPHA_EXT","COMPRESSED_SRGB_S3TC_DXT1_EXT","COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT","COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT","COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT","COMPRESSED_RGB_S3TC_DXT1_EXT","COMPRESSED_RGBA_S3TC_DXT1_EXT","COMPRESSED_RGBA_S3TC_DXT3_EXT","COMPRESSED_RGBA_S3TC_DXT5_EXT","COMPRESSED_RGB_PVRTC_4BPPV1_IMG","COMPRESSED_RGB_PVRTC_2BPPV1_IMG","COMPRESSED_RGBA_PVRTC_4BPPV1_IMG","COMPRESSED_RGBA_PVRTC_2BPPV1_IMG","COMPRESSED_RGB_ETC1_WEBGL","COMPRESSED_SRGB8_ETC2","COMPRESSED_RGB8_ETC2","COMPRESSED_SRGB8_ALPHA8_ETC2_EAC","COMPRESSED_RGBA8_ETC2_EAC","COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR","COMPRESSED_RGBA_ASTC_4x4_KHR","COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR","COMPRESSED_RGBA_ASTC_5x4_KHR","COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR","COMPRESSED_RGBA_ASTC_5x5_KHR","COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR","COMPRESSED_RGBA_ASTC_6x5_KHR","COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR","COMPRESSED_RGBA_ASTC_6x6_KHR","COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR","COMPRESSED_RGBA_ASTC_8x5_KHR","COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR","COMPRESSED_RGBA_ASTC_8x6_KHR","COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR","COMPRESSED_RGBA_ASTC_8x8_KHR","COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR","COMPRESSED_RGBA_ASTC_10x5_KHR","COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR","COMPRESSED_RGBA_ASTC_10x6_KHR","COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR","COMPRESSED_RGBA_ASTC_10x8_KHR","COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR","COMPRESSED_RGBA_ASTC_10x10_KHR","COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR","COMPRESSED_RGBA_ASTC_12x10_KHR","COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR","COMPRESSED_RGBA_ASTC_12x12_KHR","COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT","COMPRESSED_RGBA_BPTC_UNORM_EXT","UNSIGNED_INT_24_8_WEBGL","ArrayCamera","isArrayCamera","cameras","Group","isGroup","_moveEvent","WebXRController","_targetRay","_grip","_hand","getHandSpace","joints","inputState","pinching","getTargetRaySpace","hasLinearVelocity","linearVelocity","hasAngularVelocity","angularVelocity","getGripSpace","disconnect","inputSource","referenceSpace","inputPose","gripPose","handPose","targetRay","grip","hand","visibilityState","inputjoint","jointPose","getJointPose","jointName","joint","transform","jointRadius","indexTip","thumbTip","distanceToPinch","threshold","handedness","gripSpace","getPose","targetRaySpace","DepthTexture","WebXRManager","framebufferScaleFactor","referenceSpaceType","customReferenceSpace","pose","glBinding","glProjLayer","glBaseLayer","xrFrame","getContextAttributes","initialRenderTarget","newRenderTarget","controllers","controllerInputSources","cameraL","cameraR","cameraVR","_currentDepthNear","_currentDepthFar","onSessionEvent","controllerIndex","controller","onSessionEnd","onInputSourcesChange","isPresenting","removed","added","cameraAutoUpdate","getController","getControllerGrip","getHand","setFramebufferScaleFactor","setReferenceSpaceType","getReferenceSpace","setReferenceSpace","space","getBaseLayer","getBinding","getFrame","setSession","async","xrCompatible","makeXRCompatible","layerInit","antialias","XRWebGLLayer","updateRenderState","baseLayer","framebufferWidth","framebufferHeight","depthFormat","depthType","glDepthFormat","projectionlayerInit","colorFormat","XRWebGLBinding","createProjectionLayer","textureWidth","textureHeight","setFoveation","requestReferenceSpace","cameraLPos","cameraRPos","updateCamera","depthNear","depthFar","setProjectionFromUnion","ipd","projL","projR","topFov","bottomFov","leftFov","rightFov","zOffset","xOffset","near2","far2","left2","right2","top2","bottom2","getCamera","getFoveation","fixedFoveation","foveation","onAnimationFrameCallback","getViewerPose","views","setRenderTargetFramebuffer","cameraVRNeedsUpdate","glSubImage","getViewSubImage","setRenderTargetTextures","depthStencilTexture","WebGLMaterials","refreshUniformsCommon","uvScaleMap","uv2ScaleMap","refreshFogUniforms","isFog","density","refreshMaterialUniforms","pixelRatio","transmissionRenderTarget","isMeshLambertMaterial","isMeshToonMaterial","refreshUniformsToon","isMeshPhongMaterial","refreshUniformsPhong","refreshUniformsStandard","isMeshPhysicalMaterial","refreshUniformsPhysical","isMeshMatcapMaterial","refreshUniformsMatcap","refreshUniformsDistance","isMeshNormalMaterial","isLineBasicMaterial","refreshUniformsLine","isLineDashedMaterial","refreshUniformsDash","isPointsMaterial","refreshUniformsPoints","isSpriteMaterial","refreshUniformsSprites","isShadowMaterial","WebGLUniformsGroups","updateList","allocatedBindingPoints","maxBindingPoints","hasUniformChanged","cachedObject","getUniformSize","boundary","storage","onUniformsGroupsDispose","bind","webglProgram","prepareUniformsGroup","chunkSize","chunkOffset","__data","__offset","remainingSizeInChunk","__size","__cache","bindingPointIndex","allocateBindingPointIndex","bindBufferBase","updateBufferData","WebGLRenderer","isWebGLRenderer","createCanvasElement","display","_context","_depth","_stencil","_antialias","_premultipliedAlpha","_preserveDrawingBuffer","preserveDrawingBuffer","_powerPreference","powerPreference","_failIfMajorPerformanceCaveat","failIfMajorPerformanceCaveat","_alpha","currentRenderList","currentRenderState","renderListStack","renderStateStack","domElement","sortObjects","toneMappingExposure","gammaFactor","_this","_isContextLost","_currentActiveCubeFace","_currentActiveMipmapLevel","_currentRenderTarget","_currentMaterialId","_currentCamera","_currentViewport","_currentScissor","_currentScissorTest","_width","_height","_pixelRatio","_opaqueSort","_transparentSort","_scissor","_scissorTest","_clippingEnabled","_localClippingEnabled","_transmissionRenderTarget","_projScreenMatrix","_vector3","_emptyScene","overrideMaterial","getTargetPixelRatio","programCache","renderLists","morphtargets","bufferRenderer","indexedBufferRenderer","contextNames","contextAttributes","contextName","onContextLost","onContextRestore","onContextCreationError","isWebGL1Renderer","shift","rangeMin","rangeMax","message","initGLContext","preventDefault","infoAutoReset","shadowMapAutoUpdate","shadowMapNeedsUpdate","statusMessage","onMaterialDispose","deallocateMaterial","releaseMaterialProgramReferences","forEach","forceContextLoss","loseContext","forceContextRestore","restoreContext","getPixelRatio","setPixelRatio","updateStyle","setViewport","getDrawingBufferSize","setDrawingBufferSize","getCurrentViewport","getScissor","setScissor","getScissorTest","boolean","setOpaqueSort","method","setTransparentSort","bits","onXRSessionStart","onXRSessionEnd","setProgram","needsProgramChange","needsLights","lightsStateVersion","getProgram","refreshProgram","refreshMaterial","refreshLights","p_uniforms","m_uniforms","uCamPos","cameraPosition","boneTexture","computeBoneTexture","boneTextureSize","markUniformsLightsNeedsUpdate","upload","uniformsList","rangeFactor","dataCount","rangeStart","rangeCount","drawStart","drawEnd","drawCount","isLineSegments","isLineLoop","isSprite","projectObject","isLOD","renderScene","opaqueObjects","transmissiveObjects","transparentObjects","renderTransmissionPass","renderObjects","programCacheKey","updateCommonMaterialProperties","materialNeedsLights","progUniforms","seqWithValue","self","camera2","defaultFramebuffer","__useDefaultFramebuffer","useDefaultFramebuffer","isRenderTarget3D","layer","framebufferTextureLayer","readRenderTargetPixels","activeCubeFaceIndex","textureFormat","halfFloatSupportedByExt","readPixels","copyFramebufferToTexture","level","levelScale","copyTexSubImage2D","copyTextureToTexture","srcTexture","dstTexture","copyTextureToTexture3D","sourceBox","glTarget","unpackRowLen","unpackImageHeight","unpackSkipPixels","unpackSkipRows","unpackSkipImages","compressedTexSubImage3D","resetState","__THREE_DEVTOOLS__","CustomEvent","detail","WebGL1Renderer","Scene","InterleavedBuffer","isInterleavedBuffer","arrayBuffers","_uuid","ib","_vector$6","InterleavedBufferAttribute","interleavedBuffer","interleavedBuffers","_geometry","_intersectPoint","_worldScale","_mvPosition","_alignedPosition","_rotatedPosition","_viewWorldMatrix","_vA","_vB","_vC","_uvA","_uvB","_uvC","Sprite","float32Array","transformVertex","vertexPosition","mvPosition","_basePosition","_skinIndex","_skinWeight","_vector$5","_matrix","SkinnedMesh","bindMatrixInverse","calculateInverses","normalizeSkinWeights","skinWeight","skinIndex","boneIndex","bones","boneInverses","Bone","isBone","DataTexture","_offsetMatrix","_identityMatrix","Skeleton","boneMatrices","inverse","bone","getBoneByName","fromJSON","json","boneInverse","InstancedBufferAttribute","linecap","linejoin","_start$1","_end$1","_inverseMatrix$1","_ray$1","_sphere$1","Line","computeLineDistances","lineDistances","localThreshold","localThresholdSq","vStart","vEnd","interSegment","interRay","_start","_end","LineSegments","LineLoop","_inverseMatrix","_ray","_sphere","_position$2","Points","testPoint","rayPointDistanceSq","intersectPoint","distanceToRay","CanvasTexture","isCanvasTexture","CubicPoly","c0","initCatmullRom","x3","tension","initNonuniformCatmullRom","dt0","dt1","dt2","t2","calc","px","py","pz","CatmullRomCurve3","Curve","arcLengthDivisions","getPoint","getPointAt","optionalTarget","getUtoTmapping","getPoints","divisions","getSpacedPoints","getLength","lengths","getLengths","cacheArcLengths","current","last","updateArcLengths","arcLengths","targetArcLength","comparison","lengthBefore","getTangent","pt1","pt2","getTangentAt","computeFrenetFrames","segments","closed","binormals","vec","mat","MAX_VALUE","tz","curveType","isCatmullRomCurve3","intPoint","PolyhedronGeometry","vertexBuffer","uvBuffer","subdivideFace","cols","aj","bj","rows","pushVertex","vertex","getVertexByIndex","correctUV","azimuth","subdivide","applyRadius","generateUVs","correctUVs","centroid","azi","correctSeam","details","OctahedronGeometry","SphereGeometry","phiStart","phiLength","thetaStart","thetaLength","thetaEnd","grid","verticesRow","uOffset","STANDARD","PHYSICAL","_sheen","_clearcoat","_iridescence","_transmission","arraySlice","isTypedArray","convertArray","forceClone","ArrayBuffer","isView","DataView","getKeyframeOrder","times","compareTime","sortedArray","nValues","srcOffset","flattenJSON","jsonKeys","valuePropertyName","Interpolant","parameterPositions","sampleValues","sampleSize","resultBuffer","_cachedIndex","valueSize","settings","DefaultSettings_","evaluate","pp","validate_interval","seek","linear_scan","forward_scan","giveUpAt","copySampleValue_","t1global","mid","intervalChanged_","interpolate_","getSettings_","CubicInterpolant","_weightPrev","_offsetPrev","_weightNext","_offsetNext","endingStart","endingEnd","iPrev","iNext","tPrev","tNext","halfDt","o1","o0","oP","oN","wP","wN","ppp","sP","sN","LinearInterpolant","offset1","offset0","weight1","weight0","DiscreteInterpolant","KeyframeTrack","interpolation","TimeBufferType","ValueBufferType","setInterpolation","DefaultInterpolation","track","trackType","getInterpolation","ValueTypeName","InterpolantFactoryMethodDiscrete","getValueSize","InterpolantFactoryMethodLinear","InterpolantFactoryMethodSmooth","factoryMethod","createInterpolant","timeOffset","timeScale","startTime","endTime","nKeys","validate","valid","prevTime","currTime","optimize","smoothInterpolation","writeIndex","keep","offsetP","offsetN","readOffset","writeOffset","TypedKeyframeTrack","BooleanKeyframeTrack","ColorKeyframeTrack","NumberKeyframeTrack","QuaternionLinearInterpolant","slerpFlat","QuaternionKeyframeTrack","StringKeyframeTrack","VectorKeyframeTrack","AnimationClip","duration","tracks","blendMode","resetDuration","jsonTracks","frameTime","fps","parseKeyframeTrack","clip","clipTracks","morphTargetSequence","noLoop","numMorphTargets","objectOrClipArray","clipArray","o","animationToMorphTargets","pattern","parts","animationMorphTargets","clips","CreateFromMorphTargetSequence","addNonemptyTrack","trackName","animationKeys","propertyName","destTracks","clipName","hierarchyTracks","hierarchy","morphTargetNames","morphTargetName","animationKey","boneName","getTrackTypeForValueTypeName","typeName","Cache","files","file","LoadingManager","onLoad","onProgress","onError","urlModifier","isLoading","itemsLoaded","itemsTotal","handlers","onStart","itemStart","itemEnd","itemError","resolveURL","setURLModifier","addHandler","regex","loader","removeHandler","getHandler","global","DefaultLoadingManager","Loader","manager","crossOrigin","withCredentials","resourcePath","requestHeader","load","loadAsync","Promise","resolve","reject","setCrossOrigin","setWithCredentials","setPath","setResourcePath","setRequestHeader","loading","HttpError","response","FileLoader","setTimeout","req","Request","headers","Headers","credentials","mimeType","responseType","fetch","then","ReadableStream","body","getReader","callbacks","reader","contentLength","total","lengthComputable","loaded","stream","readData","read","done","close","byteLength","ProgressEvent","enqueue","Response","statusText","arrayBuffer","blob","text","DOMParser","parseFromString","label","decoder","TextDecoder","decode","catch","finally","setResponseType","setMimeType","ImageLoader","onImageLoad","removeEventListeners","onImageError","CubeTextureLoader","urls","loadTexture","DataTextureLoader","texData","mipmapCount","TextureLoader","Light","HemisphereLight","_projScreenMatrix$1","_lightPositionWorld$1","_lookTarget$1","LightShadow","_frameExtents","_viewportCount","_viewports","shadowMatrix","viewportIndex","SpotLightShadow","isSpotLightShadow","SpotLight","power","_lightPositionWorld","_lookTarget","PointLightShadow","_cubeDirections","_cubeUps","PointLight","DirectionalLightShadow","isDirectionalLightShadow","DirectionalLight","LoaderUtils","fromCharCode","decodeURIComponent","escape","lastIndexOf","InstancedBufferGeometry","BufferGeometryLoader","interleavedBufferMap","arrayBufferMap","getInterleavedBuffer","getArrayBuffer","typedArray","bufferAttribute","drawcalls","offsets","ImageBitmapLoader","isImageBitmapLoader","createImageBitmap","setOptions","fetchOptions","res","colorSpaceConversion","imageBitmap","Clock","autoStart","oldTime","elapsedTime","running","now","getElapsedTime","getDelta","diff","newTime","performance","Date","PropertyMixer","binding","mixFunction","mixFunctionAdditive","setIdentity","_slerp","_slerpAdditive","_setAdditiveIdentityQuaternion","_workIndex","_select","_setAdditiveIdentityOther","_lerp","_lerpAdditive","_setAdditiveIdentityNumeric","_mixBufferRegion","_mixBufferRegionAdditive","_setIdentity","_origIndex","_addIndex","cumulativeWeight","cumulativeWeightAdditive","useCount","referenceCount","accumulate","accuIndex","currentWeight","mix","accumulateAdditive","weightAdditive","originalValueOffset","saveOriginalState","getValue","restoreOriginalState","startIndex","endIndex","targetIndex","workOffset","multiplyQuaternionsFlat","_reservedRe","RegExp","_wordCharOrDot","_trackRe","_supportedObjectNames","PropertyBinding","rootNode","parsedPath","parseTrackName","node","findNode","nodeName","_getValue_unbound","_setValue_unbound","root","isAnimationObjectGroup","Composite","matches","results","objectName","objectIndex","propertyIndex","lastDot","substring","searchNodeSubtree","childNode","subTreeNode","_getValue_unavailable","_setValue_unavailable","_getValue_direct","targetObject","_getValue_array","resolvedProperty","_getValue_arrayElement","_getValue_toArray","_setValue_direct","_setValue_direct_setNeedsUpdate","_setValue_direct_setMatrixWorldNeedsUpdate","_setValue_array","dest","_setValue_array_setNeedsUpdate","_setValue_array_setMatrixWorldNeedsUpdate","_setValue_arrayElement","_setValue_arrayElement_setNeedsUpdate","_setValue_arrayElement_setMatrixWorldNeedsUpdate","_setValue_fromArray","_setValue_fromArray_setNeedsUpdate","_setValue_fromArray_setMatrixWorldNeedsUpdate","targetArray","sourceArray","nodeProperty","versioning","Versioning","None","NeedsUpdate","MatrixWorldNeedsUpdate","bindingType","BindingType","Direct","ArrayElement","HasFromToArray","EntireArray","GetterByBindingType","SetterByBindingTypeAndVersioning","unbind","targetGroup","optionalParsedPath","_targetGroup","_bindings","subscribe_","firstValidIndex","nCachedObjects_","bindings","AnimationAction","mixer","localRoot","_mixer","_clip","_localRoot","nTracks","interpolants","interpolantSettings","interpolant","_interpolantSettings","_interpolants","_propertyBindings","_cacheIndex","_byClipCacheIndex","_timeScaleInterpolant","_weightInterpolant","loop","_loopCount","_startTime","_effectiveTimeScale","_effectiveWeight","repetitions","paused","clampWhenFinished","zeroSlopeAtStart","zeroSlopeAtEnd","play","_activateAction","_deactivateAction","stopFading","stopWarping","isRunning","_isActiveAction","isScheduled","startAt","setLoop","setEffectiveWeight","getEffectiveWeight","fadeIn","_scheduleFading","fadeOut","crossFadeFrom","fadeOutAction","warp","fadeInDuration","fadeOutDuration","startEndRatio","endStartRatio","crossFadeTo","fadeInAction","weightInterpolant","_takeBackControlInterpolant","setEffectiveTimeScale","getEffectiveTimeScale","setDuration","syncWith","action","halt","startTimeScale","endTimeScale","_lendControlInterpolant","timeScaleInterpolant","getMixer","getClip","getRoot","_root","_update","deltaTime","timeDirection","_updateWeight","timeRunning","_updateTimeScale","clipTime","_updateTime","propertyMixers","interpolantValue","loopCount","pingPong","_setEndings","handle_stop","loopDelta","pending","atStart","atEnd","weightNow","weightThen","_controlInterpolantsResultBuffer","AnimationMixer","_initMemoryManager","_accuIndex","_bindAction","prototypeAction","rootUuid","bindingsByRoot","_bindingsByRootAndName","bindingsByName","_addInactiveBinding","create","clipUuid","actionsForClip","_actionsByClip","knownActions","_addInactiveAction","_lendBinding","_lendAction","_takeBackBinding","_takeBackAction","_actions","_nActiveActions","_nActiveBindings","_controlInterpolants","_nActiveControlInterpolants","stats","actions","inUse","controlInterpolants","actionsByClip","actionByRoot","_removeInactiveAction","lastInactiveAction","cacheIndex","knownActionsForClip","lastKnownAction","byClipCacheIndex","_removeInactiveBindingsForAction","_removeInactiveBinding","prevIndex","lastActiveIndex","firstInactiveAction","firstInactiveIndex","lastActiveAction","bindingByName","propBinding","lastInactiveBinding","firstInactiveBinding","lastActiveBinding","__cacheIndex","lastActiveInterpolant","clipAction","optionalRoot","clipObject","findByName","existingAction","newAction","stopAllAction","nActions","nBindings","setTime","timeInSeconds","uncacheClip","actionsToRemove","uncacheRoot","uncacheAction","Raycaster","LOD","setFromCamera","coords","intersectObject","ascSort","intersectObjects","_tables","_generateTables","floatView","uint32View","baseTable","shiftTable","mantissaTable","exponentTable","offsetTable","DataUtils","toHalfFloat","val","fromHalfFloat","revision","window","__THREE__","ThinFilmFresnelMap","filmThickness","refractiveIndexFilm","refractiveIndexBase","_filmThickness","_refractiveIndexFilm","_refractiveIndexBase","_size","_data","_updateData","updateSettings","_fresnelRefl","refractiveIndex1","refractiveIndex2","cos1","cos2","R","sin1Sqr","refrRatio","sqrRefrRatio","r_p","r_s","yFit_1931","zFit_1931","t3","phi12","phi21","phi23","R12","T12","R23","R_bi","T_tot","R_star","R_bi_sqr","R_12_star","R_star_t_tot","refrRatioSqr","refrRatioSqrBase","cosThetaI","cosThetaT","cosThetaT2","pathDiff","pathDiff2PI","totX","totY","totZ","waveLen","deltaPhase","cosPhiX","cosPhiY","ShaderUtils","game","dice3d","DiceFactory","realisticLighting","selectiveBloomShaderFragment","iridescent","iridescentShaderFragment","transmissionAlphaShaderFragment","globalBloom","iridescenceLookUp","iridescenceNoise","boost","DicePreset","term","labels","valueMap","bumps","emissiveMaps","mass","inertia","model","system","modelLoaded","modelLoading","modelFile","internalAdd","appearance","labelColor","diceColor","outlineColor","edgeColor","font","colorset","setValueMap","registerFaces","faces","tab","includes","setLabels","setBumpMaps","setEmissiveMaps","loadTextures","textureTypeLoaded","loadedImages","numImages","regexTexture","imgElements","hasTextures","Image","onload","onerror","setModel","loadModel","gltf","applyDiceSoNiceShader","Hooks","callAll","BASE_PRESETS_LIST","EXTRA_PRESETS_LIST","diceobj","bumpMaps","fontScale","TEXTURELIST","none","composite","bump","cloudy","cloudy_2","fire","marble","water","water_2","ice","ice_2","paper","speckles","glitter","glitter_2","stars","stainedglass","skulls","leopard","tiger","cheetah","dragon","lizard","bird","astral","wood","metal","stone","radial","bronze01","bronze02","bronze03","bronze03a","bronze03b","bronze04","COLORSETS","coin_default","description","category","foreground","outline","edge","visibility","spectrum_default","radiant","cold","poison","acid","thunder","lightning","air","earth","psychic","necrotic","breebaby","pinkdreams","inspired","bloodmoon","starynight","glitterparty","astralsea","foundry","dragons","birdup","tigerking","toxic","rainbow","prism","bronze","custom","DICE_SCALE","d8","d10","d12","d14","d16","d20","d24","d30","d7","d100","DiceColors","sources","itemprops","entries","diceTextures","mergeObject","performDeletions","diceBumps","texturename","getTexture","names","rgb","sets","uniqueSet","inplace","randcolor","randomColor","randtex","colorsetname","DICE_MODELS","faceValues","rotationCombinations","GLTFLoader","dracoLoader","ktx2Loader","meshoptDecoder","pluginCallbacks","register","parser","GLTFMaterialsClearcoatExtension","GLTFTextureBasisUExtension","GLTFTextureWebPExtension","GLTFMaterialsSheenExtension","GLTFMaterialsTransmissionExtension","GLTFMaterialsVolumeExtension","GLTFMaterialsIorExtension","GLTFMaterialsEmissiveStrengthExtension","GLTFMaterialsSpecularExtension","GLTFMaterialsIridescenceExtension","GLTFLightsExtension","GLTFMeshoptCompression","extractUrlBase","_onError","setDRACOLoader","setDDSLoader","setKTX2Loader","setMeshoptDecoder","unregister","content","plugins","decodeText","BINARY_EXTENSION_HEADER_MAGIC","EXTENSIONS","KHR_BINARY_GLTF","GLTFBinaryExtension","asset","GLTFParser","fileLoader","plugin","extensionsUsed","extensionName","extensionsRequired","KHR_MATERIALS_UNLIT","GLTFMaterialsUnlitExtension","KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS","GLTFMaterialsPbrSpecularGlossinessExtension","KHR_DRACO_MESH_COMPRESSION","GLTFDracoMeshCompressionExtension","KHR_TEXTURE_TRANSFORM","GLTFTextureTransformExtension","KHR_MESH_QUANTIZATION","GLTFMeshQuantizationExtension","setExtensions","setPlugins","parseAsync","GLTFRegistry","removeAll","KHR_LIGHTS_PUNCTUAL","KHR_MATERIALS_CLEARCOAT","KHR_MATERIALS_IOR","KHR_MATERIALS_SHEEN","KHR_MATERIALS_SPECULAR","KHR_MATERIALS_TRANSMISSION","KHR_MATERIALS_IRIDESCENCE","KHR_MATERIALS_VOLUME","KHR_TEXTURE_BASISU","KHR_MATERIALS_EMISSIVE_STRENGTH","EXT_TEXTURE_WEBP","EXT_MESHOPT_COMPRESSION","refs","uses","_markDefs","nodeDefs","nodeIndex","nodeLength","nodeDef","_addNodeRef","_loadLight","lightIndex","dependency","lightDef","lightNode","innerConeAngle","outerConeAngle","createUniqueName","createNodeAttachment","_getNodeRef","getMaterialType","extendParams","materialParams","materialDef","metallicRoughness","pbrMetallicRoughness","baseColorFactor","baseColorTexture","assignTexture","all","extendMaterialParams","emissiveStrength","clearcoatFactor","clearcoatTexture","clearcoatRoughnessFactor","clearcoatRoughnessTexture","clearcoatNormalTexture","iridescenceFactor","iridescenceTexture","iridescenceIor","iridescenceThicknessTexture","sheenColorFactor","sheenRoughnessFactor","sheenColorTexture","sheenRoughnessTexture","transmissionFactor","transmissionTexture","thicknessFactor","thicknessTexture","colorArray","specularFactor","specularTexture","specularColorFactor","specularColorTexture","textureIndex","textureDef","loadTextureImage","isSupported","textureLoader","uri","handler","detectSupport","loadBufferView","bufferView","bufferViews","extensionDef","getDependency","supported","ready","byteOffset","byteStride","decodeGltfBuffer","BINARY_EXTENSION_CHUNK_TYPES","headerView","header","magic","getUint32","chunkContentsLength","chunkView","chunkIndex","chunkLength","chunkType","contentArray","preload","decodePrimitive","primitive","bufferViewIndex","gltfAttributeMap","threeAttributeMap","attributeNormalizedMap","attributeTypeMap","attributeName","threeAttributeName","ATTRIBUTES","accessorDef","accessors","componentType","WEBGL_COMPONENT_TYPES","decodeDracoFile","extendTexture","texCoord","GLTFMeshStandardSGMaterial","isGLTFSpecularGlossinessMaterial","specularMapParsFragmentChunk","glossinessMapParsFragmentChunk","specularMapFragmentChunk","glossinessMapFragmentChunk","lightPhysicalFragmentChunk","glossiness","glossinessMap","_extraUniforms","uniformName","USE_SPECULARMAP","USE_GLOSSINESSMAP","USE_UV","specularGlossinessParams","pbrSpecularGlossiness","diffuseFactor","diffuseTexture","glossinessFactor","specularGlossinessTexture","specGlossMapDef","createMaterial","GLTFCubicSplineInterpolant","stride2","stride3","td","m0","m1","_q","GLTFCubicSplineQuaternionInterpolant","WEBGL_CONSTANTS","WEBGL_FILTERS","WEBGL_WRAPPINGS","WEBGL_TYPE_SIZES","SCALAR","VEC2","VEC3","VEC4","MAT2","MAT3","MAT4","POSITION","NORMAL","TANGENT","TEXCOORD_0","TEXCOORD_1","COLOR_0","WEIGHTS_0","JOINTS_0","PATH_PROPERTIES","translation","INTERPOLATION","CUBICSPLINE","LINEAR","STEP","ALPHA_MODES","addUnknownExtensionsToUserData","knownExtensions","objectDef","gltfExtensions","assignExtrasToUserData","gltfDef","extras","meshDef","targetNames","createPrimitiveKey","primitiveDef","dracoExtension","geometryKey","createAttributesKey","attributesKey","getNormalizedComponentScale","associations","primitiveCache","meshCache","cameraCache","lightCache","sourceCache","textureCache","nodeNamesUsed","isSafari","isFirefox","firefoxVersion","_invokeAll","ext","beforeRoot","getDependencies","dependencies","scenes","afterRoot","skinDefs","skins","meshDefs","meshes","skinLength","skin","ref","updateMappings","original","mappings","_invokeOne","func","loadScene","loadNode","loadMesh","loadAccessor","loadBuffer","loadMaterial","loadSkin","loadAnimation","loadCamera","defs","def","bufferIndex","bufferDef","bufferViewDef","accessorIndex","sparse","pendingBufferViews","TypedArray","elementBytes","itemBytes","ibSlice","ibCacheKey","itemSizeIndices","TypedArrayIndices","byteOffsetIndices","byteOffsetValues","sparseIndices","sparseValues","sourceIndex","sourceDef","sampler","promise","loadImageSource","samplers","URL","webkitURL","sourceURI","isObjectURL","Blob","createObjectURL","revokeObjectURL","getImageURIMimeType","search","mapName","mapDef","gltfReference","assignFinalMaterial","useDerivativeTangents","useVertexColors","useFlatShading","pointsMaterial","lineMaterial","materialType","materialExtensions","sgExtension","kmuExtension","metallicFactor","roughnessFactor","metallicRoughnessTexture","alphaMode","alphaCutoff","normalTexture","occlusionTexture","strength","emissiveFactor","emissiveTexture","originalName","sanitizedName","sanitizeNodeName","loadGeometries","primitives","createDracoPrimitive","addPrimitiveAttributes","geometryPromise","meshIndex","toTrianglesDrawMode","cameraIndex","cameraDef","yfov","aspectRatio","znear","zfar","xmag","ymag","skinDef","skinEntry","inverseBindMatrices","accessor","animationIndex","animationDef","pendingNodes","pendingInputAccessors","pendingOutputAccessors","pendingSamplers","pendingTargets","channels","input","inputAccessors","outputAccessors","targets","inputAccessor","outputAccessor","targetName","outputArray","scaled","InterpolantFactoryMethodGLTFCubicSpline","isInterpolantFactoryMethodGLTFCubicSpline","createNodeMesh","meshPromise","sceneIndex","sceneDef","nodeIds","buildNodeHierarchy","reducedAssociations","reduceAssociations","nodeId","parentObject","pendingJoints","jointNodes","jointNode","assignAttributeAccessor","gltfAttributeName","computeBounds","boxScale","maxDisplacement","addMorphTargets","hasMorphNormal","hasMorphColor","pendingPositionAccessors","pendingNormalAccessors","pendingColorAccessors","pendingAccessor","morphPositions","drawMode","numberOfTriangles","newIndices","newGeometry","baseScale","preferredSystem","preferredColorset","cache_hits","cache_misses","loaderGLTF","fontLoadingPromises","baseTextureCache","even","odd","systems","i18n","localize","dice","spectrum","foundry_vtt","dot_b","preset","addDicePreset","CONFIG","Dice","terms","Coin","FateDie","Die","objTerm","internalAddDicePreset","initializeMaterials","material_options","plastic","scopedOptions","glass","chrome","pristine","setScale","setQualitySettings","config","bumpMapping","aa","antialiasing","glow","useHighDPI","shadowQuality","findIndex","el","waitForLoad","userID","activePresets","preloadPresetsByUser","user","getFlag","duplicate","obj","hasOwnProperty","getPresetBySystem","users","promiseArray","addSystem","find","substr","FontConfig","getAvailableFonts","loadFont","editor","fonts","DENOMINATION","getResultLabel","disposeCachedMaterials","timeout","race","scopedTextureCache","isGhost","dicemesh","scopedScale","geom","createGeometry","cannon_shape","THREE.AnimationMixer","materialData","generateMaterialData","baseTextureCacheString","cacheString","createMaterials","THREE.Mesh","THREE.Color","rerolls","resultReason","factory","getFaceValue","closest_face","reason","THREE.Vector3","faceCannon","closest_angle","body_sim","faceNormals","notation","dieValue","labelIndex","storeRolledValue","getLastValue","setLastValue","dice_texture","materialSelected","THREE.MeshPhongMaterial","THREE.MeshStandardMaterial","THREE.MeshLambertMaterial","THREE.MeshPhysicalMaterial","textureCube","createElement","globalAlpha","canvasBump","contextBump","canvasEmissive","contextEmissive","labelsTotal","isHeritedFromShape","texturesPerLine","sizeTexture","ts","calc_texture_size","texturesOnThisLine","createTextMaterial","startI","THREE.CanvasTexture","needUpdate","forecolor","outlinecolor","backcolor","fillStyle","fillRect","save","beginPath","rect","globalCompositeOperation","restore","textAlign","textBaseline","shadowColor","shadowOffsetX","shadowOffsetY","shadowBlur","fontsize","textstarty","textstartx","lineHeight","textlines","pixiStyle","PIXI","TextStyle","fontFamily","fontSize","stroke","strokeThickness","TextMetrics","measureText","textline","strokeStyle","strokeText","fillText","hw","hh","wShift","hShift","destX","destY","textureSize","getAppearanceForDice","appearances","dicetype","dicenotation","colorsetData","getColorSet","opt","flavor","ghost","colorindex","baseTexture","approx","typeScale","create_d2_geometry","create_d4_geometry","create_d6_geometry","create_d8_geometry","create_d10_geometry","create_d12_geometry","create_d14_geometry","create_d16_geometry","create_d20_geometry","create_d24_geometry","create_d30_geometry","load_geometry","bufferGeometry","THREE.BufferGeometryLoader","CANNON","Cylinder","create_geom","create_geom_dcc","create_shape","cv","Vec3","ConvexPolyhedron","create_shape_dcc","DiceSFX","nameLocalized","_name","destroyed","enableGC","renderReady","volume","secretRoll","muteSoundSecretRolls","sfxLine","dialogContent","disabled","isGM","isGlobal","PlaySoundEpicFail","audio","AudioHelper","preloadSound","PlaySoundEpicWin","Proton","preParticles","integrationType","Util","initValue","POOL_MAX","EULER","emitters","renderers","pool","Pool","integrator","Integration","initialize","TIME_STEP","DR","MEASURE","RK2","RK4","VERLET","PARTICLE_CREATED","PARTICLE_UPDATE","PARTICLE_SLEEP","PARTICLE_DEAD","PROTON_UPDATE","PROTON_UPDATE_AFTER","EMITTER_ADDED","EMITTER_REMOVED","bindEmtterEvent","addRender","removeRender","addEmitter","emitter","removeEmitter","$delta","getCount","particles","removeAllEventListeners","arr","eventName","eventTarget","ret","defaults","destroyArray","destroyObject","isUndefined","arg","setVectorByObj","pOBJ","setPrototypeByObj","proObj","filters","_getValue","pan","Span","inherits","subClass","superClass","_super_","F","ColorUtil","store","THREEUtil","toScreenPos","pos","toSpacePos","img","THREE.Texture","PUID","_uids","nid","str","Particle","ID","cID","getDirection","life","age","energy","dead","sleep","useColor","useAlpha","easing","ease","setEasingByName","easeLinear","Vector3D","old","behaviours","removeAllBehaviours","applyBehaviour","addBehaviour","behaviour","addBehaviours","removeBehaviour","puid","__puid","expire","_getList","uid","randomAToB","INT","randomFloating","randomZone","degreeTransform","toColor16","num","axisRotate","tha","addValue","integrate","damping","particle","getGradient","eulerFromDir","Polar3D","_isArray","ArraySpan","_arr","setRadius","setPhi","setTheta","toVector3D","createSpan","createArraySpan","Box","Behaviour","Rate","numPan","timePan","nextTime","Initialize","contains","normalizeForce","normalizeValue","InitializeUtil","initializes","bindEmitter","Life","lifePan","Position","Velocity","dirVec","Mass","massPan","Radius","Body","Force","fx","fy","fz","Attraction","targetPosition","radiusSq","attractionForce","RandomDrift","driftX","driftY","driftZ","delay","Repulsion","Gravity","Collision","useMass","CrossZone","Alpha","Scale","Rotate","Spring","spring","friction","Emitter","pObj","currentEmitTime","totalEmitTimes","rate","BehaviourEmitter","selfBehaviours","FollowEmitter","mouseTarget","_allowEmitting","mouse","initEventHandler","zones","args","concat","addZone","zone","getPosition","P","radiusPan","_useV","vr","V","oldRadius","randomFoce","delayPan","G","otherParticle","overlap","averageMass1","averageMass2","_getAverageMass","aPartcile","bParticle","crossType","crossing","_same","alphaA","alphaB","scaleA","scaleB","_type","_setRotation","fR","tR","addR","vec3","colorA","colorB","emit","stopEmit","removeAllParticles","createParticle","setupParticle","addSelfInitialize","initAll","addInitialize","removeInitialize","initializer","removeInitializers","emitting","addSelfBehaviour","removeSelfBehaviour","mousemoveHandler","mousemove","mousedownHandler","mousedown","mouseupHandler","mouseup","setCameraAndCanvas","setCameraAndRenderer","getBoundingClientRect","clientX","clientY","ratio","vec2","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInSine","easeOutSine","easeInOutSine","easeInExpo","easeOutExpo","easeInOutExpo","easeInCirc","easeOutCirc","easeInOutCirc","easeInBack","easeOutBack","easeInOutBack","easeName","BaseRender","MeshRender","_targetPool","_materialPool","_body","THREE.BoxGeometry","PointsRender","ps","SpriteRender","THREE.Sprite","THREE.SpriteMaterial","CustomRender","targetPool","materialPool","Zone","LineZone","SphereZone","MeshZone","toBufferGeometry","PointZone","BoxZone","ScreenZone","dis","proton","onProtonUpdate","onParticleCreated","onParticleUpdate","onParticleDead","_bound","_cross","_dead","rVector","_static","once","Debug","fun","drawZone","THREE.SphereGeometry","THREE.MeshBasicMaterial","drawEmitter","THREE.OctahedronGeometry","renderInfo","getCreatedNumber","addInfo","_infoType","getEmitterPos","_infoCon","innerHTML","bg","cssText","parentNode","appendChild","PlayAnimationParticleSpiral","loadAsset","DiceSFXManager","sound","emitter1","createEmitter","emitter2","animateEmitter","PlayAnimationParticleSparkles","THREE.Box3","PlayAnimationParticleVortex","THREE.PlaneGeometry","dicefactory","PlayAnimationBright","brightColor","glowingMesh","clock","THREE.Clock","baseColor","baseMaterial","sfxMaterial","PlayAnimationDark","darkColor","PlayAnimationThormund","thormund","curve","THREE.CatmullRomCurve3","curve2","duration1","duration2","PlayAnimationImpact","planeImpact","SFX_MODE_CLASS","PlayConfettiStrength1","confetti","confettiStrength","shootConfettiProps","getShootConfettiProps","handleShootConfetti","PlayConfettiStrength2","med","PlayConfettiStrength3","PlaySoundCustom","getDialogContent","PlayMacro","macro","macros","macroId","execute","permissionLevel","CONST","DOCUMENT_PERMISSION_LEVELS","OBSERVER","ENTITY_PERMISSIONS","macroList","testUserPermission","SFX_MODE_LIST","SFX_CLASS","EXTRA_TRIGGER_TYPE","EXTRA_TRIGGER_RESULTS","renderQueue","garbageCollector","sfx","startsWith","modules","active","specialEffectName","THREE.TextureLoader","sfxUniqueList","sfxList","specialEffect","sfxClassName","addSFXMode","initialized","playSFX","sfxInstance","renderSFX","queue","endSFX","_afterShow","clearQueue","RGBELoader","rgbe_error","rgbe_error_code","msg","fgets","lineLimit","consume","chunk","RGBEByteToRGBFloat","sourceOffset","destArray","destOffset","RGBEByteToRGBHalf","byteArray","rgbe_header_info","gamma_re","exposure_re","format_re","dimensions_re","comments","programtype","gamma","exposure","RGBE_ReadHeader","image_rgba_data","scanline_width","data_rgba","ptr_end","rgbeStart","scanline_buffer","num_scanlines","ptr","isEncodedRun","byteValue","off","RGBE_ReadPixels_RLE","numElements","floatArray","halfArray","setDataType","onLoadCallback","CopyShader","tDiffuse","Pass","needsSwap","renderToScreen","_camera","FullScreenQuad","_mesh","ShaderPass","textureID","fsQuad","writeBuffer","readBuffer","MaskPass","writeValue","clearValue","REPLACE","ALWAYS","EQUAL","KEEP","ClearMaskPass","EffectComposer","renderTarget1","renderTarget2","passes","copyPass","swapBuffers","addPass","pass","insertPass","removePass","isLastEnabledPass","passIndex","maskActive","NOTEQUAL","effectiveWidth","effectiveHeight","RenderPass","_oldClearColor","oldAutoClear","oldClearAlpha","oldOverrideMaterial","SMAAEdgesShader","SMAA_THRESHOLD","SMAAWeightsShader","SMAA_MAX_SEARCH_STEPS","SMAA_AREATEX_MAX_DISTANCE","SMAA_AREATEX_PIXEL_SIZE","SMAA_AREATEX_SUBTEX_SIZE","tArea","tSearch","SMAABlendShader","tColor","SMAAPass","edgesRT","weightsRT","areaTextureImage","getAreaTexture","areaTexture","searchTextureImage","getSearchTexture","searchTexture","uniformsEdges","materialEdges","uniformsWeights","materialWeights","uniformsBlend","materialBlend","GammaCorrectionShader","LuminosityHighPassShader","luminosityThreshold","smoothWidth","defaultColor","defaultOpacity","TransparentUnrealBloomPass","renderTargetsHorizontal","renderTargetsVertical","nMips","resx","resy","renderTargetBright","renderTargetHorizonal","renderTargetVertical","highPassShader","highPassUniforms","materialHighPassFilter","separableBlurMaterials","kernelSizeArray","getSeperableBlurMaterial","compositeMaterial","getCompositeMaterial","bloomTintColors","copyShader","copyUniforms","materialCopy","inputRenderTarget","BlurDirectionX","BlurDirectionY","kernelRadius","KERNEL_RADIUS","SIGMA","texSize","NUM_MIPS","blurTexture1","blurTexture2","blurTexture3","blurTexture4","blurTexture5","dirtTexture","bloomStrength","bloomFactors","bloomRadius","DiceBox","element_container","dice_factory","known_types","dimensions","speed","isVisible","last_time","allowInteractivity","THREE.Raycaster","blackColor","nbIterationsBetweenRolls","currentWidth","currentHeight","containerWidth","containerHeight","THREE.Vector2","startDrag","startDragTime","constraintDown","constraint","cameraHeight","medium","world_sim","World","dice_body_material","desk_body_material","barrier_body_material","sounds_table","sounds_dice","sounds_coins","lastSoundType","lastSoundStep","lastSound","iteration","barrier","light_amb","desk","pane","public_interface","diceList","deadDiceList","framerate","sounds","soundDelay","soundsSurface","animstate","throwingForce","immersiveDarkness","selector","animate","intersected","showExtraDice","spotlight","ground","rethrowFunctions","afterThrowFunctions","preloadSounds","resources","spritemap","playAudioSprite","selfVolume","gainNode","createGain","gain","sampleSource","createBufferSource","connect","destination","currentTime","preloadPresets","soundsVolume","boxType","globalAnimationSpeed","THREE.Scene","dice3dRenderers","THREE.WebGLRenderer","devicePixelRatio","loadContextScopedTextures","setScene","gravity","broadphase","NaiveBroadphase","solver","iterations","allowSleep","contactMaterial","ContactMaterial","restitution","addContactMaterial","addBody","jointBody","addShape","collisionFilterGroup","collisionFilterMask","roughnessMap_fingerprint","roughnessMap_wood","roughnessMap_metal","roughnessMap_stone","THREE.PMREMGenerator","THREE.CubeTextureLoader","clientWidth","clientHeight","autoscale","THREE.PerspectiveCamera","maxwidth","intensity_amb","THREE.HemisphereLight","THREE.DirectionalLight","shadowplane","THREE.ShadowMaterial","canvasSize","bloomPass","bloomThreshold","gammaPass","composerTarget","THREE.WebGLRenderTarget","bloomComposer","blendingPass","THREE.ShaderMaterial","bloomTexture","finalComposer","AAPass","vectorRand","getVectors","notationVectors","dist","projector","velocity","velvec","swapDiceFace","forcedResult","rotIndex","rotationDegrees","eulerAngle","THREE.Euler","THREE.MathUtils","THREE.Quaternion","spawnDice","dicedata","vectordata","startAtIteration","stopped","specialEffects","sleepSpeedLimit","sleepTimeLimit","DYNAMIC","linearDamping","angularDamping","eventCollide","stepQuaternions","stepPositions","diceType","diceMaterial","secret","objectContainer","THREE.Group","world","stepnumber","currentSoundType","detectedCollides","surface","soundlist","throwFinished","worldType","minIterations","iterationsNeeded","sleepState","updateMassProperties","simulateThrow","rolling","bodies","animateThrow","getTime","time_diff","neededSteps","animatedDiceDetected","meshCannon","worldAsleep","darknessLevel","rendererStats","handleSpecialEffectsInit","throws","removeTicker","start_throw","countNewDice","throwingForceModifier","maxDiceNumber","clearAll","rollDice","clearDice","animateSelector","hasEmissive","clearScene","ticker","app","_head","_cancelIfNeeded","dsnConfig","showcase","selectordice","extraDiceTypes","die","proportion","columns","start_time","elapsed","angle_change","body2mesh","THREE.Object3D","currentMaterial","Shape","types","SPHERE","sphere_geometry","PARTICLE","particleGeo","particleMaterial","particleSize","PLANE","submesh","BOX","box_geometry","halfExtents","CONVEXPOLYHEDRON","geo","THREE.BufferGeometry","shapeOffsets","shapeOrientations","findRootObject","findShowcaseDie","findHoveredDie","hoveredDie","onMouseMove","ndc","onMouseDown","entity","stopPropagation","mouseInteractionManager","interactive","vsub","pivot","vmult","PointToPointConstraint","addConstraint","onMouseUp","removeConstraint","activate","promisesSFX","DiceNotation","rolls","userConfig","cnt","number","countExploded","localNbThrow","exploded","indexThrow","discarded","diceNumber","some","hidden","addDie","fvttDie","isd10of100","dsnDie","resultLabel","d100Result","enableFlavorColorset","mergedRollCommands","command","onResult","Accumulator","onEnd","_timeout","_delay","_onEnd","_items","addItem","item","clearTimeout","Utils","userSettings","setFlag","formatversion","ui","notifications","migrated","newSettings","DEFAULT_OPTIONS","insertKeys","insertValues","DEFAULT_APPEARANCE","unsetFlag","cfg","reduce","i18nCfg","fontList","auto","getAvailableFontChoices","groupedSetsList","set1","set2","preparedList","locCategory","predicate","saves","savesObject","saveObject","fromEntries","DiceTour","Tour","querySelector","MutationObserver","mutations","observer","querySelectorAll","observe","childList","subtree","_preStep","waitForElement","currentStep","_postStep","stepIndex","hasNext","triggerReset","click","scrollIntoView","block","inline","DiceTourMain","title","canBeResumed","steps","$","addClass","Dice3D","defaultShowExtraDice","hideAfterRoll","timeBeforeHide","hideFX","imageQuality","canvasZIndex","webGLVersion","showOthersSFX","rollingArea","contrastOf","userAppearance","sfxArray","SFX","other","GMSFX","APPEARANCE","addTexture","textureData","textureEntry","initColorSets","addSFXTrigger","actionLoadSave","board","exports","hiddenAnimationQueue","_buildCanvas","_initListeners","_buildDiceBox","_loadFonts","_startQueueHandler","_nextAnimationHandler","_welcomeMessage","_registerTours","canInteract","sidebarWidth","sidebarOffset","innerWidth","area","innerHeight","css","appendTo","after","ALL_CONFIG","_rtime","resize","_resizeEnd","on","ev","menus","currentTarget","dataset","tours","socket","request","show","_onMouseMove","_onMouseDown","_onMouseUp","_mouseNDC","_beforeShow","is","hide","resizeAndRebuild","setInterval","chatData","whisper","speaker","alias","flags","core","canPopout","ChatMessage","implementation","createDocuments","combatEnabled","combat","started","renderRolls","chatMessage","showMessage","_dice3danimating","chat","removeClass","sidebar","popouts","scrollBottom","popout","orderedDiceList","roll","diceTerm","rollOrder","rollList","plus","OperatorTerm","operator","termList","fromTerms","recursShowForRoll","showForRoll","synchronize","blind","messageID","actor","actors","messages","isContentVisible","ALL_CUSTOMIZATION","timestamp","_showAnimation","displayed","showExtraDiceByDefault","waitFor3DAnimationByMessageID","targetMessageId","buildHook","messageId","nextAnimation","timing","items","commands","mergeQueuedRollCommands","aThrow","timeoutHandle","fail","DiceConfig","FormApplication","defaultOptions","template","closeOnSubmit","tabs","navSelector","contentSelector","initial","fxList","speedList","textureList","prepareTextureList","materialList","prepareFontList","colorsetList","prepareColorsetList","imageQualityList","shadowQualityList","antialiasingList","smaa","msaa","systemList","prepareSystemList","soundsSurfaceList","felt","wood_table","wood_tray","canvasZIndexList","over","under","throwingForceList","weak","strong","ALL_DEFAULT_OPTIONS","navOrder","triggerTypeList","possibleResultList","termClass","option","specialEffectsList","specialEffectsPromises","registeredTriggerTypes","trigger","hdbsTemplate","Handlebars","renderTemplate","specialEffectsMode","html","tabsList","tabsAppearance","tabsPromises","navAppearance","displayHint","lastActiveAppearanceTab","initializationData","currentGlobalAppearance","sfxDialogList","templateSelect2","parentElement","sfxResultDicetype","select2Options","dropdownCssClass","escapeMarkup","dropdownParent","templateResult","templateSelection","activateListeners","append","toggleHideAfterRoll","toggleAutoScale","toggleCustomization","filterSystems","setPreferredOptions","select2dsn","onApply","toggleSounds","toggleCustomColors","onReset","closeAppearanceTab","getShowcaseAppearance","denominationList","Roll","getShowcaseSFX","customization","firstSFX","parents","each","attr","sfxLineOptions","Dialog","buttons","ok","icon","default","detach","dialog","appId","optionHTML","frag","empty","prevAll","fp","onclick","_activateFilePicker","saveList","dialogSaveAs","actionSaveAs","actionDeleteSave","prop","classes","no","import","form","readTextFromFile","actionImportFromJSON","filename","actionExportToJSON","saveDataToFile","actionExportSFXToJSON","activateAppearanceTab","tabName","insertBefore","htmlNavString","quality","submit","preventClose","preventRender","_tabs","triggerCallback","_onChangeTab","_contentSelector","appearanceArray","diffObject","checked","customizationElements","colorsetForce","indexOpt","elementOpt","parseInputs","retloop","part","formData","dataArr","currentSettings","setting","reload","_onSubmit","RollableAreaConfig","$diceBox","_onRestore","resizing","prevX","prevY","newX","newY","resizers","resizer","classList","saveSettingsAndRebuild","debouncedReload","debounce","registerMenu","hint","restricted","choices","onChange","Boolean","migrateOldSettings","updated","logger","hasInlineRoll","isRoll","messageHookDisabled","maxRollOrder","JqInlineRolls","parseHTML","inlineRollList","unescape","diceterm","PoolTerm","fromRolls","_countNewRolls","updateData","dsnCountAddedRoll","toObject","anim"],"mappings":"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,uDACA,uDACA,uDACA,uDACA,wDAEJG,aAAc,CACV,uDACA,uDACA,uDACA,uDACA,uDACA,wDAEJxxF,SAAU,SACVuyF,SAAU,mBACVX,OAAQ,aAGZqC,GAAmBr8H,KAAK,CACpBP,KAAM,KACNg6H,OAAQ,CACJ,uDACA,uDACA,uDACA,uDACA,uDACA,uDACA,uDACA,wDAEJG,aAAc,CACV,uDACA,uDACA,uDACA,uDACA,uDACA,uDACA,uDACA,wDAEJxxF,SAAU,SACVuyF,SAAU,mBACVX,OAAQ,aAGZqC,GAAmBr8H,KAAK,CACpBP,KAAM,MACNg6H,OAAQ,CACJ,wDACA,wDACA,wDACA,wDACA,wDACA,wDACA,wDACA,wDACA,wDACA,yDAEJG,aAAc,CACV,wDACA,wDACA,wDACA,wDACA,wDACA,wDACA,wDACA,wDACA,wDACA,yDAEJxxF,SAAU,SACVuyF,SAAU,mBACVX,OAAQ,aAGZqC,GAAmBr8H,KAAK,CACpBP,KAAM,MACNg6H,OAAQ,CACJ,wDACA,wDACA,wDACA,wDACA,wDACA,wDACA,wDACA,wDACA,wDACA,yDACA,yDACA,0DAEJG,aAAc,CACV,wDACA,wDACA,wDACA,wDACA,wDACA,wDACA,wDACA,wDACA,wDACA,yDACA,yDACA,0DAEJxxF,SAAU,SACVuyF,SAAU,mBACVX,OAAQ,aAGZqC,GAAmBr8H,KAAK,CACpBP,KAAM,OACNg6H,OAAQ,CACJ,0DACA,0DACA,0DACA,0DACA,0DACA,0DACA,0DACA,0DACA,0DACA,2DAEJG,aAAc,CACV,0DACA,0DACA,0DACA,0DACA,0DACA,0DACA,0DACA,0DACA,0DACA,2DAEJxxF,SAAU,SACVuyF,SAAU,mBACVX,OAAQ,aAGZqC,GAAmBr8H,KAAK,CACpBP,KAAM,MACNg6H,OAAQ,CACJ,wDACA,wDACA,wDACA,wDACA,wDACA,wDACA,wDACA,wDACA,wDACA,yDACA,yDACA,yDACA,yDACA,yDACA,yDACA,yDACA,yDACA,yDACA,yDACA,0DAEJG,aAAc,CACV,wDACA,wDACA,wDACA,wDACA,wDACA,wDACA,wDACA,wDACA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AwB,mBAAmB,oBAAoB,oBAAoB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,kBAAkB,sBAAuB,mBAAmB,kBAAkB,sBAAuB,mBAAmB,kBAAkB,sBAAuB,mBAAmB,kBAAkB,qBAAsB,mBAAmB,kBAAkB,qBAAsB,mBAAmB,aAAa,oBAAoB,mBAAmB,aAAa,oBAAoB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,mBAAmB,qBAAsB,kBAAkB,mBAAmB,qBAAsB,kBAAkB,mBAAmB,qBAAsB,kBAAkB,mBAAmB,oBAAqB,kBAAkB,mBAAmB,oBAAqB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBA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AmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,oBAAqB,kBAAmB,qBAAsB,iBAAkB,iBAAkB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,oBAAqB,kBAAmB,oBAAqB,iBAAkB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,iBAAkB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,cAAe,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,iBAAkB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBACrrKsc,YAAc,GAEhBxM,MAAS,CACP+7B,SAAY,EACZ7sC,KAAQ,cACRgB,MAAS,CAAC,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,OACpsGsc,YAAc,IAGlB3c,MAAS,CACPX,KAAQ,cACRgB,MAAS,CAAC,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,EAAE,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,GAAG,GAAG,EAAE,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GA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BAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAA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BAAqB,mBAAqB,oBAAsB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,oBAAsB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,kBAAoB,kBAAoB,kBAAoB,mBAAqB,oBAAsB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,oBAAsB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,oBAAsB,oBAAsB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,kBAAoB,kBAAoB,oBAAsB,oBAAsB,mBAAqB,oBAAsB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,qBAAuB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,oBAAsB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,iBAAmB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,oBAAsB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,kBAAoB,kBAAoB,oBAAsB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,qBAAuB,kBAAoB,oBAAsB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,oBAAsB,mBAA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AkB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,iBAAkB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,iBAAkB,kBAAmB,kBAAmB,iBAAkB,kBAAmB,kBAAmB,iBAAkB,kBAAmB,kBAAmB,iBAAkB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,iBAAkB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,oBAAqB,kBAAmB,iBAAkB,oBAAqB,kBAAmB,iBAAkB,oBAAqB,kBAAmB,iBAAkB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,iBAAkB,mBAAoB,kBAAmB,iBAAkB,mBAAoB,kBAAmB,iBAAkB,mBAAoB,kBAAmB,iBAAkB,mBAAoB,kBAAmB,iBAAkB,iBAAkB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,kBAAmB,iBAAkB,mBAAoB,kBAAmB,iBAAkB,mBAAoB,kBAAmB,iBAAkB,mBAAoB,kBAAmB,iBAAkB,oBAAqB,oBAAqB,iBAAkB,mBAAoB,oBAAqB,iBAAkB,mBAAoB,oBAAqB,iBAAkB,mBAAoB,oBAAqB,iBAAkB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,mBACv8Ksc,YAAc,GAEhB2O,OAAU,CACR4gB,SAAY,EACZ7sC,KAAQ,eACRgB,MAAS,EAAE,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,iBAAmB,mBAAqB,kBAAoB,iBAAmB,mBAAqB,kBAAoB,iBAAmB,mBAAqB,kBAAoB,iBAAmB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,iBAAmB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,iBAAmB,mBAAqB,kBAAoB,iBAAmB,mBAAqB,kBAAoB,iBAAmB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,iBAAmB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAA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AO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MA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mBAAoB,mBAAmB,kBAAkB,mBAAoB,mBAAmB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,mBAAmB,gBAAgB,oBAAoB,mBAAmB,gBAAgB,oBAAoB,mBAAmB,gBAAgB,oBAAoB,mBAAmB,gBAAgB,oBAAoB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,iBAAiB,kBAAkB,kBAAkB,iBAAiB,kBAAkB,kBAAkB,iBAAiB,kBAAkB,kBAAkB,iBAAiB,kBAAkB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,kBAAmB,mBAAmB,iBAAiB,kBAAmB,mBAAmB,iBAAiB,kBAAmB,mBAAmB,iBAAiB,kBAAmB,mBAAmB,kBAAkB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,oBAAoB,kBAAkB,oBAAoB,oBAAoB,kBAAkB,oBAAoB,oBAAoB,kBAAkB,oBAAoB,oBAAoB,kBAAkB,oBAAoB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,oBAAoB,mBAAmB,oBAAqB,mBAAmB,mBAAmB,oBAAqB,mBAAmB,mBAAmB,oBAAqB,mBAAmB,mBAAmB,oBAAqB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAoB,mBAAmB,kBAAkB,mBAAoB,mBAAmB,kBAAkB,mBAAoB,mBAAmB,kBAAkB,mBAAoB,mBAAmB,kBAAkB,oBAAoB,qBAAsB,mBAAmB,oBAAoB,qBAAsB,mBAAmB,oBAAoB,qBAAsB,mBAAmB,oBAAoB,qBAAsB,mBAAmB,kBAAmB,oBAAoB,mBAAmB,kBAAmB,oBAAoB,mBAAmB,kBAAmB,oBAAoB,mBAAmB,kBAAmB,oBAAoB,mBAC51Rsc,YAAc,GAEhB2O,OAAU,CACR4gB,SAAY,EACZ7sC,KAAQ,eACRgB,MAAS,EAAE,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,qBAAuB,kBAAmB,kBAAmB,qBAAuB,kBAAmB,kBAAmB,qBAAuB,kBAAmB,kBAAmB,qBAAuB,kBAAmB,kBAAmB,sBAAwB,kBAAmB,kBAAmB,sBAAwB,kBAAmB,kBAAmB,sBAAwB,kBAAmB,kBAAmB,sBAAwB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,iBAAkB,mBAAoB,kBAAmB,iBAAkB,mBAAoB,kBAAmB,iBAAkB,mBAAoB,kBAAmB,iBAAkB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,iBAAkB,mBAAoB,kBAAmB,iBAAkB,mBAAoB,kBAAmB,iBAAkB,mBAAoB,kBAAmB,iBAAkB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,qBAAsB,kBAAmB,kBAAmB,qBAAsB,kBAAmB,kBAAmB,qBAAsB,kBAAmB,kBAAmB,qBAAsB,iBAAkB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,iBAAkB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,mBAAoB,kBAAmB,uBAAyB,mBAAoB,kBAAmB,uBAAyB,mBAAoB,kBAAmB,uBAAyB,mBAAoB,kBAAmB,uBAAyB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,sBAAwB,mBAAoB,mBAAoB,sBAAwB,mBAAoB,mBAAoB,sBAAwB,mBAAoB,mBAAoB,sBAAwB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAC3wSsc,YAAc,GAEhB2E,GAAM,CACJ4qB,SAAY,EACZ7sC,KAAQ,eACRgB,MAAS,CAAC,kBAAmB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,kBAAmB,qBAAsB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,iBAAkB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,iBAAkB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,iBAAkB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,iBAAkB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,iBAAkB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,iBAAkB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,iBAAkB,qBAAsB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,iBAAkB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,iBAAkB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,oBAAqB,oBAAqB,kBAAmB,mBAAoB,iBAAkB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,sBACzsMsc,YAAc,GAEhBxM,MAAS,CACP+7B,SAAY,EACZ7sC,KAAQ,cACRgB,MAAS,CAAC,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM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BAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,iBAAkB,oBAAsB,kBAAmB,kBAAmB,oBAAsB,kBAAmB,kBAAmB,oBAAsB,kBAAmB,kBAAmB,oBAAsB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,uBAAyB,kBAAmB,kBAAmB,uBAAyB,kBAAmB,kBAAmB,uBAAyB,kBAAmB,kBAAmB,uBAAyB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,uBAAyB,mBAAoB,kBAAmB,uBAAyB,mBAAoB,kBAAmB,uBAAyB,mBAAoB,kBAAmB,uBAAyB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,iBAAkB,kBAAmB,oBAAqB,iBAAkB,kBAAmB,oBAAqB,iBAAkB,kBAAmB,oBAAqB,iBAAkB,qBAAuB,mBAAoB,mBAAoB,qBAAuB,mBAAoB,mBAAoB,qBAAuB,mBAAoB,mBAAoB,qBAAuB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,iBAAkB,mBAAoB,oBAAqB,iBAAkB,mBAAoB,oBAAqB,iBAAkB,mBAAoB,oBAAqB,iBAAkB,oBAAqB,oBAAqB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,iBAAkB,oBAAqB,oBAAqB,iBAAkB,oBAAqB,oBAAqB,iBAAkB,oBAAqB,oBAAqB,iBAAkB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,kBAAmB,mBAAoB,sBAAwB,kBAAmB,mBAAoB,sBAAwB,kBAAmB,mBAAoB,sBAAwB,kBAAmB,mBAAoB,sBAAwB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,qBAAuB,kBAAmB,kBAAmB,qBAAuB,kBAAmB,kBAAmB,qBAAuB,kBAAmB,kBAAmB,qBAAuB,kBAAmB,mBAAoB,kBAAmB,GAAI,kBAAmB,kBAAmB,GAAI,kBAAmB,kBAAmB,GAAI,kBAAmB,kBAAmB,GAAI,kBAAmB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,iBAAkB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,gBAAiB,kBAAmB,mBAAoB,gBAAiB,kBAAmB,mBAAoB,gBAAiB,kBAAmB,mBAAoB,iBACjsbsc,YAAc,GAEhB2O,OAAU,CACR4gB,SAAY,EACZ7sC,KAAQ,eACRgB,MAAS,EAAE,oBAAsB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,kBAAoB,oBAAsB,mBAAqB,kBAAoB,oBAAsB,mBAAqB,kBAAoB,oBAAsB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,qBAAwB,mBAAqB,mBAAqB,qBAAwB,mBAAqB,mBAAqB,qBAAwB,mBAAqB,mBAAqB,qBAAwB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,oBAAsB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,qBAAuB,mBAAqB,mBAAqB,qBAAuB,mBAAqB,mBAAqB,qBAAuB,mBAAqB,mBAAqB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,mBAAqB,qBAAuB,kBAAoB,mBAAqB,qBAAuB,kBAAoB,mBAAqB,qBAAuB,kBAAoB,mBAAqB,qBAAuB,iBAAmB,kBAAoB,qBAAuB,kBAAoB,kBAAoB,qBAAuB,kBAAoB,kBAAoB,qBAAuB,kBAAoB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,kBAAoB,qBAAuB,kBAAoB,kBAAoB,qBAAuB,kBAAoB,kBAAoB,qBAAuB,kBAAoB,kBAAoB,qBAAuB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,mBAAqB,kBAAoB,oBAAsB,mBAAqB,kBAAoB,oBAAsB,mBAAqB,kBAAoB,oBAAsB,mBAAqB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,mBAAqB,kBAAoB,oBAAsB,mBAAqB,kBAAoB,oBAAsB,mBAAqB,kBAAoB,oBAAsB,mBAAqB,mBAAqB,qBAAwB,kBAAoB,iBAAmB,qBAAwB,kBAAoB,iBAAmB,qBAAwB,kBAAoB,iBAAmB,qBAAwB,kBAAoB,gBAAkB,kBAAoB,sBAAyB,iBAAmB,kBAAoB,sBAAyB,iBAAmB,kBAAoB,sBAAyB,iBAAmB,kBAAoB,sBAAyB,iBAAmB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,qBAAuB,kBAAoB,mBAAqB,qBAAuB,kBAAoB,mBAAqB,qBAAuB,kBAAoB,mBAAqB,qBAAuB,kBAAoB,mBAAqB,sBAA0B,kBAAoB,mBAAqB,sBAA0B,kBAAoB,mBAAqB,sBAA0B,kBAAoB,mBAAqB,sBAA0B,kBAAoB,mBAAqB,mBAAqB,oBAAwB,mBAAqB,mBAAqB,oBAAwB,mBAAqB,mBAAqB,oBAAwB,mBAAqB,mBAAqB,qBAAyB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,kBAAoB,oBAAsB,mBAAqB,kBAAoB,oBAAsB,mBAAqB,kBAAoB,oBAAsB,mBAAqB,kBAAoB,oBAAsB,mBAAqB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,mBAAqB,sBAAyB,kBAAoB,kBAAoB,sBAAyB,kBAAoB,kBAAoB,sBAAyB,kBAAoB,kBAAoB,sBAAyB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,mBAAqB,kBAAoB,kBAAoB,sBAA0B,kBAAoB,kBAAoB,sBAA0B,kBAAoB,kBAAoB,sBAA0B,kBAAoB,kBAAoB,sBAA0B,oBAAsB,iBAAmB,kBAAoB,oBAAsB,iBAAmB,kBAAoB,oBAAsB,iBAAmB,kBAAoB,oBAAsB,iBAAmB,iBAAmB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,mBAAqB,mBAAqB,mBAAqB,qBAAuB,mBAAqB,mBAAqB,qBAAuB,mBAAqB,mBAAqB,qBAAuB,mBAAqB,mBAAqB,qBAAuB,mBAAqB,kBAAoB,sBAAyB,mBAAqB,kBAAoB,sBAAyB,mBAAqB,kBAAoB,sBAAyB,mBAAqB,kBAAoB,sBAAyB,kBAAoB,kBAAoB,qBAAuB,kBAAoB,kBAAoB,qBAAuB,kBAAoB,kBAAoB,qBAAuB,kBAAoB,kBAAoB,qBAAuB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,iBAAmB,uBAA0B,mBAAqB,kBAAoB,uBAA0B,mBAAqB,kBAAoB,uBAA0B,mBAAqB,kBAAoB,uBAA0B,mBAAqB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,kBAAoB,kBAAoB,qBAAuB,kBAAoB,kBAAoB,qBAAuB,kBAAoB,kBAAoB,qBAAuB,kBAAoB,mBAAqB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,iBAAmB,mBAAqB,qBAAuB,iBAAmB,mBAAqB,qBAAuB,iBAAmB,mBAAqB,qBAAuB,iBAAmB,mBAAqB,qBAAuB,kBAAoB,kBAAoB,kBAAoB,qBAAuB,kBAAoB,kBAAoB,qBAAuB,kBAAoB,kBAAoB,qBAAuB,kBAAoB,kBAAoB,qBAAuB,qBAAuB,kBAAoB,mBAAqB,qBAAuB,kBAAoB,mBAAqB,qBAAuB,kBAAoB,mBAAqB,qBAAuB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,iBAAmB,kBAAoB,sBAA0B,iBAAmB,kBAAoB,sBAA0B,iBAAmB,kBAAoB,sBAA0B,iBAAmB,kBAAoB,sBAA0B,qBAAuB,iBAAmB,iBAAmB,qBAAuB,iBAAmB,iBAAmB,qBAAuB,iBAAmB,iBAAmB,qBAAuB,iBAAmB,iBAAmB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,mBAAqB,sBAAyB,kBAAoB,mBAAqB,sBAAyB,kBAAoB,mBAAqB,sBAAyB,kBAAoB,mBAAqB,sBAAyB,kBAAoB,mBAAqB,kBAAoB,oBAAwB,mBAAqB,kBAAoB,oBAAwB,mBAAqB,kBAAoB,oBAAwB,mBAAqB,kBAAoB,oBAAwB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,kBAAoB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,qBAAuB,kBAAoB,kBAAoB,qBAAuB,kBAAoB,kBAAoB,qBAAuB,kBAAoB,kBAAoB,qBAAuB,kBAAoB,mBACt3dsc,YAAc,GAEhB2E,GAAM,CACJ4qB,SAAY,EACZ7sC,KAAQ,eACRgB,MAAS,CAAC,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,gBAAkB,mBAAqB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,oBAAsB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,oBAAsB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,oBAAsB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,kBAAoB,oBAAsB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,gBAAkB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,oBAAsB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,oBAAsB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,oBAAsB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,gBAAkB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,oBAAsB,oBAAsB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,qBAAuB,oBAAsB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,iBAAmB,oBAAsB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,oBAAsB,kBAAoB,iBAAmB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,oBAAsB,mBAAqB,mBAAqB,oBAAsB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,oBAAsB,mBAAqB,oBAAsB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,iBAAmB,oBAAsB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,kBAAoB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,oBAAsB,oBAAsB,mBAAqB,iBAAmB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,iBAAmB,mBAAqB,oBAAsB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,oBAAsB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,kBAAoB,oBAAsB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,qBAAuB,kBAAoB,oBAAsB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,oBAAsB,mBAAqB,mBAAqB,iBAAmB,mBAAqB,oBAAsB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,oBAAsB,kBAAoB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,iBAAmB,oBAAsB,kBAAoB,mBAAqB,qBAAuB,kBAAoB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,oBAAsB,oBAAsB,mBAAqB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,iBAAmB,kBAAoB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,mBAAqB,iBAAmB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,kBAAoB,mBACjvTsc,YAAc,GAEhBxM,MAAS,CACP+7B,SAAY,EACZ7sC,KAAQ,cACRgB,MAAS,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,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BAAmB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,oBAAoB,iBAAiB,cAAc,oBAAoB,iBAAiB,cAAc,oBAAoB,iBAAiB,cAAc,oBAAoB,iBAAiB,cAAc,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,iBAAiB,kBAAkB,iBAAiB,iBAAiB,kBAAkB,iBAAiB,iBAAiB,kBAAkB,iBAAiB,iBAAiB,kBAAkB,kBAAkB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,oBAAoB,mBAAmB,oBAAoB,oBAAoB,mBAAmB,oBAAoB,oBAAoB,mBAAmB,oBAAoB,oBAAoB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,oBAAoB,kBAAkB,oBAAoB,oBAAoB,kBAAkB,oBAAoB,oBAAoB,kBAAkB,oBAAoB,oBAAoB,kBAAkB,oBAAoB,oBAAoB,kBAAkB,mBAAmB,mBAAoB,kBAAkB,kBAAkB,mBAAoB,kBAAkB,kBAAkB,mBAAoB,kBAAkB,kBAAkB,mBAAoB,kBAAkB,kBAAkB,mBAAoB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAmB,mBAAmB,kBAAkB,kBAAmB,mBAAmB,kBAAkB,kBAAmB,mBAAmB,kBAAkB,kBAAmB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,iBAAiB,oBAAqB,kBAAkB,iBAAiB,oBAAqB,kBAAkB,iBAAiB,oBAAqB,kBAAkB,iBAAiB,oBAAqB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,oBAAoB,mBAAoB,iBAAiB,mBAAmB,mBAAoB,iBAAiB,mBAAmB,mBAAoB,iBAAiB,mBAAmB,mBAAoB,iBAAiB,mBAAmB,mBAAoB,iBAAiB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,mBAAoB,kBAAkB,oBAAqB,mBAAoB,kBAAkB,oBAAqB,mBAAoB,kBAAkB,oBAAqB,mBAAoB,kBAAkB,oBAAqB,mBAAoB,kBAAkB,oBAAqB,mBAAoB,kBAAkB,oBAAqB,mBAAoB,kBAAkB,mBAAoB,kBAAmB,mBAAmB,kBAAmB,kBAAmB,mBAAmB,kBAAmB,kBAAmB,mBAAmB,kBAAmB,kBAAmB,mBAAmB,kBAAmB,kBAAmB,mBAAmB,kBAAmB,kBAAmB,mBAAmB,kBAAmB,kBAAmB,mBAAmB,mBACjwbsc,YAAc,GAEhB2O,OAAU,CACR4gB,SAAY,EACZ7sC,KAAQ,eACRgB,MAAS,EAAE,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,sBAAuB,mBAAoB,kBAAmB,sBAAuB,mBAAoB,kBAAmB,sBAAuB,mBAAoB,kBAAmB,sBAAuB,mBAAoB,kBAAmB,sBAAuB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,sBAAuB,mBAAoB,kBAAmB,sBAAuB,mBAAoB,kBAAmB,sBAAuB,mBAAoB,kBAAmB,sBAAuB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,qBAAsB,kBAAmB,mBAAoB,qBAAsB,kBAAmB,mBAAoB,qBAAsB,kBAAmB,mBAAoB,qBAAsB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,mBAAoB,iBAAkB,oBAAqB,mBAAoB,iBAAkB,oBAAqB,mBAAoB,iBAAkB,oBAAqB,mBAAoB,iBAAkB,oBAAqB,gBAAiB,kBAAmB,oBAAqB,gBAAiB,kBAAmB,oBAAqB,gBAAiB,kBAAmB,oBAAqB,gBAAiB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,mBAAoB,qBAAsB,kBAAmB,mBAAoB,qBAAsB,kBAAmB,mBAAoB,qBAAsB,kBAAmB,mBAAoB,qBAAsB,kBAAmB,mBAAoB,qBAAsB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,qBAAsB,EAAE,qBAAuB,qBAAsB,EAAE,qBAAuB,qBAAsB,EAAE,qBAAuB,qBAAsB,EAAE,qBAAuB,qBAAsB,EAAE,qBAAuB,qBAAsB,EAAE,qBAAuB,qBAAsB,EAAE,sBAAwB,uBAAwB,GAAG,sBAAwB,uBAAwB,GAAG,sBAAwB,uBAAwB,GAAG,sBAAwB,uBAAwB,GAAG,sBAAwB,uBAAwB,GAAG,sBAAwB,uBAAwB,GAAG,sBAAwB,uBAAwB,GAAG,sBACx5csc,YAAc,GAEhB2E,GAAM,CACJ4qB,SAAY,EACZ7sC,KAAQ,eACRgB,MAAS,CAAC,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,iBAAkB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,iBAAkB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,iBAAkB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,iBAAkB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,iBAAkB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,iBAAkB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,iBAAkB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,iBAAkB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAo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AkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,oBAAoB,oBAAoB,kBAAkB,oBAAoB,oBAAoB,kBAAkB,oBAAoB,oBAAoB,kBAAkB,oBAAoB,oBAAoB,kBAAkB,oBAAoB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,kBAAkB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,oBAAoB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,mBAAmB,mBAAmB,oBAAoB,oBAAoB,mBAAmB,oBAAoB,oBAAoB,mBAAmB,oBAAoB,oBAAoB,mBAAmB,oBAAoB,oBAAoB,mBAAmB,oBAAoB,oBAAoB,mBAAmB,oBAAoB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,oBAAoB,oBAAoB,mBAAmB,oBAAoB,oBAAoB,mBAAmB,oBAAoB,oBAAoB,mBAAmB,oBAAoB,oBAAoB,mBAAmB,oBAAoB,oBAAoB,mBAAmB,oBAAoB,oBAAoB,kBAAkB,qBAAuB,kBAAkB,qBAAqB,qBAAuB,kBAAkB,qBAAqB,qBAAuB,kBAAkB,qBAAqB,qBAAuB,kBAAkB,qBAAqB,qBAAuB,kBAAkB,qBAAqB,qBAAuB,kBAAkB,qBAAqB,qBAAuB,kBAAkB,qBAAqB,qBAAuB,kBAAkB,sBAAsB,sBAAyB,kBAAkB,sBAAsB,sBAAyB,kBAAkB,sBAAsB,sBAAyB,kBAAkB,sBAAsB,sBAAyB,kBAAkB,sBAAsB,sBAAyB,kBAAkB,sBAAsB,sBAAyB,kBAAkB,sBAAsB,sBAAyB,kBAAkB,sBAAsB,sBAAyB,kBAAkB,sBAC7ofsc,YAAc,GAEhB2O,OAAU,CACR4gB,SAAY,EACZ7sC,KAAQ,eACRgB,MAAS,CAAC,kBAAmB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,iBAAkB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,eAAgB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,gBAAiB,mBAAoB,kBAAmB,iBAAkB,mBAAoB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,iBAAkB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,iBAAkB,kBAAmB,kBAAmB,iBAAkB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,iBAAkB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,iBAAkB,iBAAkB,iBAAkB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,iBAAkB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,iBAAkB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,eAAgB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,iBAAkB,iBAAkB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,iBAAkB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,iBAAkB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,iBAAkB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,gBAAiB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,iBAAkB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,qBAAwB,GAAG,qBAAqB,qBAAwB,GAAG,qBAAqB,qBAAwB,GAAG,qBAAqB,qBAAwB,GAAG,qBAAqB,qBAAwB,GAAG,qBAAqB,qBAAwB,GAAG,qBAAqB,qBAAwB,GAAG,qBAAqB,qBAAwB,GAAG,sBAAsB,sBAAsB,GAAG,sBAAsB,sBAAsB,GAAG,sBAAsB,sBAAsB,GAAG,sBAAsB,sBAAsB,GAAG,sBAAsB,sBAAsB,GAAG,sBAAsB,sBAAsB,GAAG,sBAAsB,sBAAsB,GAAG,sBAAsB,sBAAsB,GAAG,sBACt+fsc,YAAc,GAEhB2E,GAAM,CACJ4qB,SAAY,EACZ7sC,KAAQ,eACRgB,MAAS,CAAC,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,qBAAsB,oBAAqB,qBAAsB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,iBAAkB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,qBAAsB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,qBAAsB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,qBAAsB,mBAAoB,qBAAsB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,iBAAkB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,qBAAsB,mBAAoB,mBAAoB,qBAAsB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,qBAAsB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,qBAAsB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,qBAAsB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,qBAAsB,mBAAoB,qBAAsB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,qBAAsB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,qBAAsB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,qBAAsB,kBAAmB,qBAAsB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,qBAAsB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,qBAAsB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,qBAAsB,mBAAoB,oBAAqB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,m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AAoB,iBAAkB,oBAAqB,mBAAoB,iBAAkB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,sBAAwB,oBAAqB,mBAAoB,sBAAwB,oBAAqB,mBAAoB,sBAAwB,oBAAqB,mBAAoB,sBAAwB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,EAAG,mBAAoB,kBAAmB,EAAG,mBAAoB,kBAAmB,EAAG,mBAAoB,kBAAmB,EAAG,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,uBAAyB,oBAAqB,kBAAmB,uBAAyB,oBAAqB,kBAAmB,uBAAyB,oBAAqB,kBAAmB,uBAAyB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,qBAAuB,oBAAqB,mBAAoB,qBAAuB,oBAAqB,mBAAoB,qBAAuB,oBAAqB,mBAAoB,qBAAuB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,EAAG,mBAAoB,kBAAmB,EAAG,mBAAoB,kBAAmB,EAAG,mBAAoB,kBAAmB,EAAG,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,GAAI,oBAAqB,kBAAmB,GAAI,oBAAqB,kBAAmB,GAAI,oBAAqB,kBAAmB,GAAI,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,sBAAwB,mBAAoB,mBAAoB,sBAAwB,mBAAoB,mBAAoB,sBAAwB,mBAAoB,mBAAoB,sBAAwB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,GAAI,kBAAmB,kBAAmB,GAAI,kBAAmB,kBAAmB,GAAI,kBAAmB,kBAAmB,GAAI,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,oBAAqB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,oBAAqB,oBAAqB,mBAAoB,sBAAwB,oBAAqB,mBAAoB,sBAAwB,oBAAqB,mBAAoB,sBAAwB,oBAAqB,mBAAoB,sBAAwB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,iBAAkB,sBAAwB,mBAAoB,kBAAmB,sBAAwB,mBAAoB,kBAAmB,sBAAwB,mBAAoB,kBAAmB,sBAAwB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,iBAAkB,qBAAuB,mBAAoB,kBAAmB,qBAAuB,mBAAoB,kBAAmB,qBAAuB,mBAAoB,kBAAmB,qBAAuB,mBAAoB,mBAC/1bsc,YAAc,GAEhB2O,OAAU,CACR4gB,SAAY,EACZ7sC,KAAQ,eACRgB,MAAS,EAAE,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,mBAAqB,sBAAuB,kBAAoB,mBAAqB,sBAAuB,kBAAoB,mBAAqB,sBAAuB,kBAAoB,mBAAqB,sBAAuB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,mBAAqB,oBAAsB,oBAAsB,mBAAqB,oBAAsB,oBAAsB,mBAAqB,oBAAsB,oBAAsB,mBAAqB,oBAAsB,oBAAsB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,iBAAmB,mBAAqB,mBAAqB,iBAAmB,mBAAqB,mBAAqB,iBAAmB,mBAAqB,mBAAqB,iBAAmB,mBAAqB,mBAAqB,oBAAsB,kBAAoB,oBAAsB,oBAAsB,kBAAoB,oBAAsB,oBAAsB,kBAAoB,oBAAsB,oBAAsB,kBAAoB,mBAAqB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,mBAAqB,mBAAqB,qBAAyB,mBAAqB,mBAAqB,qBAAyB,mBAAqB,mBAAqB,qBAAyB,mBAAqB,mBAAqB,qBAAyB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,qBAAuB,kBAAoB,kBAAoB,qBAAuB,kBAAoB,kBAAoB,qBAAuB,kBAAoB,kBAAoB,qBAAuB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,mBAAqB,oBAAsB,mBAAqB,oBAAsB,oBAAsB,mBAAqB,oBAAsB,oBAAsB,mBAAqB,oBAAsB,oBAAsB,mBAAqB,oBAAsB,oBAAsB,oBAAsB,mBAAqB,oBAAsB,oBAAsB,mBAAqB,oBAAsB,oBAAsB,mBAAqB,oBAAsB,oBAAsB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,qBAAyB,mBAAqB,mBAAqB,qBAAyB,mBAAqB,mBAAqB,qBAAyB,mBAAqB,mBAAqB,qBAAyB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,qBAAuB,mBAAqB,mBAAqB,qBAAuB,mBAAqB,mBAAqB,qBAAuB,mBAAqB,mBAAqB,qBAAuB,kBAAoB,kBAAoB,qBAAuB,kBAAoB,kBAAoB,qBAAuB,kBAAoB,kBAAoB,qBAAuB,kBAAoB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,sBAA0B,mBAAqB,kBAAoB,sBAA0B,mBAAqB,kBAAoB,sBAA0B,mBAAqB,kBAAoB,sBAA0B,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,iBAAmB,kBAAoB,mBAAqB,iBAAmB,kBAAoB,mBAAqB,iBAAmB,kBAAoB,mBAAqB,iBAAmB,kBAAoB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,qBAAyB,mBAAqB,mBAAqB,qBAAyB,mBAAqB,mBAAqB,qBAAyB,mBAAqB,mBAAqB,qBAAyB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,iBAAmB,mBAAqB,mBAAqB,iBAAmB,mBAAqB,mBAAqB,iBAAmB,mBAAqB,mBAAqB,iBAAmB,mBAAqB,kBAAoB,oBAAsB,kBAAoB,gBAAkB,oBAAsB,kBAAoB,gBAAkB,oBAAsB,kBAAoB,gBAAkB,oBAAsB,kBAAoB,iBAAmB,oBAAsB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,sBAA0B,iBAAmB,kBAAoB,sBAA0B,iBAAmB,kBAAoB,sBAA0B,iBAAmB,kBAAoB,sBAA0B,iBAAmB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,qBAAuB,iBAAmB,kBAAoB,qBAAuB,iBAAmB,kBAAoB,qBAAuB,iBAAmB,kBAAoB,qBAAuB,iBAAmB,kBAAoB,mBAAqB,iBAAmB,kBAAoB,mBAAqB,iBAAmB,kBAAoB,mBAAqB,iBAAmB,kBAAoB,mBAAqB,iBAAmB,kBAAoB,qBAAuB,mBAAqB,mBAAqB,qBAAuB,mBAAqB,mBAAqB,qBAAuB,mBAAqB,mBAAqB,qBAAuB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,uBAA2B,mBAAqB,mBAAqB,uBAA2B,mBAAqB,mBAAqB,uBAA2B,mBAAqB,mBAAqB,uBAA2B,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,kBAAoB,qBAAsB,kBAAoB,kBAAoB,qBAAsB,kBAAoB,kBAAoB,qBAAsB,kBAAoB,kBAAoB,qBAAsB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,mBAAqB,iBAAmB,oBAAsB,mBAAqB,iBAAmB,oBAAsB,mBAAqB,iBAAmB,oBAAsB,mBAAqB,iBAAmB,oBAAsB,mBAAqB,oBAAsB,oBAAsB,mBAAqB,oBAAsB,oBAAsB,mBAAqB,oBAAsB,oBAAsB,mBAAqB,oBAAsB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,sBAA0B,kBAAoB,mBAAqB,sBAA0B,kBAAoB,mBAAqB,sBAA0B,kBAAoB,mBAAqB,sBAA0B,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,mBAAqB,qBAAuB,kBAAoB,oBAAsB,qBAAuB,kBAAoB,oBAAsB,qBAAuB,kBAAoB,oBAAsB,qBAAuB,kBAAoB,mBAAqB,oBAAsB,qBAAuB,kBAAoB,oBAAsB,qBAAuB,kBAAoB,oBAAsB,qBAAuB,kBAAoB,oBAAsB,qBAAuB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,uBAA2B,mBAAqB,kBAAoB,uBAA2B,mBAAqB,kBAAoB,uBAA2B,mBAAqB,kBAAoB,uBAA2B,mBAAqB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,uBAA2B,kBAAoB,mBAAqB,uBAA2B,kBAAoB,mBAAqB,uBAA2B,kBAAoB,mBAAqB,uBAA2B,kBAAoB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,qBAAyB,kBAAoB,mBAAqB,qBAAyB,kBAAoB,mBAAqB,qBAAyB,kBAAoB,mBAAqB,qBAAyB,kBAAoB,oBACjydsc,YAAc,GAEhB2E,GAAM,CACJ4qB,SAAY,EACZ7sC,KAAQ,eACRgB,MAAS,CAAC,oBAAsB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,iBAAmB,oBAAsB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,mBAAqB,qBAAuB,mBAAqB,mBAAqB,kBAAoB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,iBAAmB,oBAAsB,mBAAqB,kBAAoB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,sBAAwB,kBAAoB,mBAAqB,mBAAqB,iBAAmB,qBAAuB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,iBAAmB,kBAAoB,kBAAoB,oBAAuB,qBAAuB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,qBAAuB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,kBAAoB,qBAAuB,mBAAqB,mBAAqB,mBAAqB,qBAAuB,kBAAoB,kBAAoB,oBAAsB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,mBAAqB,oBAAsB,oBAAsB,mBAAqB,kBAAoB,iBAAmB,mBAAqB,mBAAqB,kBAAoB,oBAAsB,oBAAsB,oBAAsB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,kBAAoB,oBAAsB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,oBAAsB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,oBAAsB,iBAAmB,oBAAsB,mBAAqB,mBAAqB,mBAAqB,qBAAuB,oBAAsB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,qBAAuB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,kBAAoB,oBAAsB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,oBAAsB,mBAAqB,iBAAmB,kBAAoB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,sBAAwB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,qBAAuB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,iBAAmB,mBAAqB,mBAAqB,sBAAwB,mBAAqB,qBAAuB,kBAAoB,oBAAsB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,iBAAmB,kBAAoB,kBAAoB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,iBAAmB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,iBAAmB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,qBAAuB,mBAAqB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,sBAAwB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,oBAAsB,mBAAqB,mBAAqB,oBAAsB,oBAAsB,mBAAqB,kBAAoB,kBAAoB,oBAAsB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,iBAAmB,mBAAqB,kBAAoB,mBAAqB,oBAAsB,qBAAuB,oBAAsB,qBAAuB,iBAAmB,mBAAqB,kBAAoB,mBAAqB,oBAAsB,oBAAsB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,oBAAsB,qBAAuB,oBAAsB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,iBAAmB,oBAAsB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,kBAAoB,oBAAsB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,iBAAmB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,qBAAuB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,iBAAmB,mBAAqB,iBAAmB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,qBAAuB,kBAAoB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,qBAAuB,mBAAqB,qBAAuB,iBAAmB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,sBAAwB,mBAAqB,kBAAoB,mBAAqB,oBAAsB,qBAAuB,iBAAmB,oBAAsB,oBAAsB,qBAAuB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,oBAAsB,oBAAsB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,iBAAmB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,mBAAqB,oBAAsB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,mBAAqB,sBAAwB,mBAAqB,oBAAsB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,qBAAuB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,oBAAsB,mBAAqB,oBAAsB,mBAAqB,kBAAoB,oBAAsB,iBAAmB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,iBAAmB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,oBACjzTsc,YAAc,GAEhBxM,MAAS,CACP+7B,SAAY,EACZ7sC,KAAQ,cACRgB,MAAS,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OACnkNsc,YAAc,IAGlB3c,MAAS,CACPX,KAAQ,cACRgB,MAAS,CAAC,EAAG,GAAI,GAAI,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,EAAG,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,EAAG,GAAI,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,EAAG,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,EAAG,EAAG,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,EAAG,GAAI,EAAG,IAAK,GAAI,IAAK,GAAI,EAAG,GAAI,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,GAAI,GAAI,EAAG,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,IA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mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,iBAAiB,iBAAiB,oBAAoB,iBAAiB,iBAAiB,oBAAoB,iBAAiB,iBAAiB,oBAAoB,iBAAiB,iBAAiB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,oBAAoB,iBAAiB,kBAAkB,oBAAoB,iBAAiB,kBAAkB,oBAAoB,iBAAiB,kBAAkB,oBAAoB,iBAAiB,aAAa,mBAAmB,iBAAiB,aAAa,mBAAmB,iBAAiB,aAAa,mBAAmB,iBAAiB,aAAa,mBAAmB,iBAAiB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,oBAAoB,oBAAoB,mBAAmB,oBAAoB,oBAAoB,mBAAmB,oBAAoB,oBAAoB,mBAAmB,oBAAoB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,oBAAoB,kBAAkB,oBAAoB,oBAAoB,kBAAkB,oBAAoB,oBAAoB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,kBAAkB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,iBAAiB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,kBAAkB,oBAAoB,iBAAiB,kBAAkB,oBAAoB,iBAAiB,kBAAkB,oBAAoB,iBAAiB,kBAAkB,oBAAoB,kBAAkB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,kBAAkB,oBAAoB,oBAAoB,kBAAkB,oBAAoB,oBAAoB,kBAAkB,oBAAoB,oBAAoB,kBAAkB,oBAAoB,oBAAoB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,iBAAiB,iBAAiB,mBAAmB,iBAAiB,iBAAiB,mBAAmB,iBAAiB,iBAAiB,mBAAmB,iBAAiB,iBAAiB,oBAAoB,iBAAiB,iBAAiB,oBAAoB,iBAAiB,iBAAiB,oBAAoB,iBAAiB,iBAAiB,oBAAoB,iBAAiB,iBAAiB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,kBAAkB,oBAAoB,iBAAiB,kBAAkB,oBAAoB,iBAAiB,kBAAkB,oBAAoB,iBAAiB,kBAAkB,oBAAoB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,oBAAoB,iBAAiB,oBAAoB,oBAAoB,iBAAiB,oBAAoB,oBAAoB,iBAAiB,oBAAoB,oBAAoB,iBAAiB,oBAAoB,oBAAoB,iBAAiB,oBAAoB,oBAAoB,iBAAiB,oBAAoB,oBAAoB,iBAAiB,oBAAoB,oBAAoB,iBAAiB,oBAAoB,oBAAoB,oBAAoB,mBAAmB,oBAAoB,oBAAoB,mBAAmB,oBAAoB,oBAAoB,mBAAmB,oBAAoB,oBAAoB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,oBAAoB,oBAAoB,iBAAiB,oBAAoB,oBAAoB,iBAAiB,oBAAoB,oBAAoB,iBAAiB,oBAAoB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,kBAAkB,oBAAoB,oBAAoB,kBAAkB,oBAAoB,oBAAoB,kBAAkB,oBAAoB,oBAAoB,kBAAkB,oBAAoB,mBAAmB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,iBAAiB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,iBAAiB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,iBAAiB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,kBAAkB,iBAAiB,kBAAkB,kBAAkB,iBAAiB,kBAAkB,kBAAkB,iBAAiB,kBAAkB,kBAAkB,iBAAiB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,iBAAiB,oBAAoB,kBAAkB,iBAAiB,oBAAoB,kBAAkB,iBAAiB,oBAAoB,kBAAkB,iBAAiB,oBAAoB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,kBAAkB,cAAc,mBAAmB,iBAAiB,cAAc,mBAAmB,iBAAiB,cAAc,mBAAmB,iBAAiB,cAAc,mBAAmB,kBAC73pBsc,YAAc,GAEhB2O,OAAU,CACR4gB,SAAY,EACZ7sC,KAAQ,eACRgB,MAAS,EAAE,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,iBAAkB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,gBAAiB,kBAAmB,oBAAqB,gBAAiB,kBAAmB,oBAAqB,gBAAiB,kBAAmB,oBAAqB,gBAAiB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,iBAAkB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,kBAAmB,iBAAkB,kBAAmB,kBAAmB,iBAAkB,kBAAmB,kBAAmB,iBAAkB,kBAAmB,kBAAmB,iBAAkB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,iBAAkB,kBAAmB,kBAAmB,iBAAkB,kBAAmB,kBAAmB,iBAAkB,kBAAmB,kBAAmB,iBAAkB,mBAAoB,kBAAmB,iBAAkB,mBAAoB,kBAAmB,iBAAkB,mBAAoB,kBAAmB,iBAAkB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAClusBsc,YAAc,GAEhB2E,GAAM,CACJ4qB,SAAY,EACZ7sC,KAAQ,eACRgB,MAAS,CAAC,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,iBAAkB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,iBAAkB,mBAAoB,qBAAsB,kBAAmB,iBAAkB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,iBAAkB,oBAAqB,iBAAkB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,iBAAkB,oBAAqB,iBAAkB,mBAAoB,oBAAqB,kBAAmB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,iBAAkB,kBAAmB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,qBAAsB,mBAAoB,mBAAoB,oBAAqB,iBAAkB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,iBAAkB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,iBAAkB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,iBAAkB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,kBAAmB,qBAAsB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,iBAAkB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,iBAAkB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,iBAAkB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,iBAAkB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,iBAAkB,mBAAoB,oBAAqB,oBAAqB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,iBAAkB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAC17dsc,YAAc,IAGlB3c,MAAS,CACPX,KAAQ,cACRgB,MAAS,CAAC,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,EAAE,EAAE,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,EAAE,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,EAAE,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,EAAE,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,EAAE,IAAI,IAAI,GAAG,EAAE,IAAI,GAAG,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,EAAE,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,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AAiB,kBAAkB,kBAAkB,iBAAiB,kBAAkB,kBAAkB,iBAAiB,kBAAkB,kBAAkB,kBAAkB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,kBAAkB,kBAAkB,oBAAoB,sBAAuB,kBAAkB,oBAAoB,sBAAuB,kBAAkB,oBAAoB,sBAAuB,kBAAkB,oBAAoB,sBAAuB,qBAAsB,kBAAkB,kBAAkB,qBAAsB,kBAAkB,kBAAkB,qBAAsB,kBAAkB,kBAAkB,qBAAsB,kBAAkB,mBAAmB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,qBAAsB,mBAAmB,mBAAmB,qBAAsB,mBAAmB,mBAAmB,qBAAsB,mBAAmB,mBAAmB,qBAAsB,mBAAmB,oBAAoB,oBAAoB,mBAAmB,oBAAoB,oBAAoB,mBAAmB,oBAAoB,oBAAoB,mBAAmB,oBAAoB,oBAAoB,mBAAmB,oBAAoB,oBAAoB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,oBAAoB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,iBAAiB,kBAAkB,oBAAoB,iBAAiB,kBAAkB,oBAAoB,iBAAiB,kBAAkB,oBAAoB,iBAAiB,kBAAkB,mBAAmB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,iBAAiB,oBAAoB,oBAAoB,iBAAiB,oBAAoB,oBAAoB,iBAAiB,oBAAoB,oBAAoB,iBAAiB,oBAAoB,oBAAoB,iBAAiB,oBAAoB,mBAAmB,oBAAoB,qBAAqB,kBAAkB,oBAAoB,qBAAqB,kBAAkB,oBAAoB,qBAAqB,kBAAkB,oBAAoB,qBAAqB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,oBAAoB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,mBAAmB,qBAAqB,mBAAmB,mBAAmB,qBAAqB,mBAAmB,mBAAmB,qBAAqB,mBAAmB,mBAAmB,qBAAqB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,sBAAuB,mBAAmB,mBAAmB,sBAAuB,mBAAmB,mBAAmB,sBAAuB,mBAAmB,mBAAmB,sBAAuB,mBAAmB,mBAAmB,sBAAuB,mBAAmB,mBAAmB,sBAAuB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,sBAAuB,mBAAmB,mBAAmB,sBAAuB,mBAAmB,mBAAmB,sBAAuB,mBAAmB,mBAAmB,sBAAuB,mBAAmB,mBAAmB,sBAAuB,mBAAmB,mBAAmB,sBAAuB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,kBAAkB,uBAAwB,kBAAkB,kBAAkB,uBAAwB,kBAAkB,kBAAkB,uBAAwB,kBAAkB,kBAAkB,uBAAwB,kBAAkB,kBAAkB,uBAAwB,kBAAkB,kBAAkB,sBAAuB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,uBAAuB,mBAAmB,mBAAmB,uBAAuB,mBAAmB,mBAAmB,uBAAuB,mBAAmB,mBAAmB,uBAAuB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,kBAAkB,iBAAiB,oBAAoB,kBAAkB,iBAAiB,oBAAoB,kBAAkB,iBAAiB,oBAAoB,kBAAkB,iBAAiB,oBAAoB,kBAAkB,iBAAiB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,kBAAkB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,oBAAoB,uBAAwB,mBAAmB,oBAAoB,uBAAwB,mBAAmB,oBAAoB,uBAAwB,mBAAmB,oBAAoB,uBAAwB,mBAAmB,oBAAoB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,kBAAkB,iBAAiB,iBAAiB,kBAAkB,iBAAiB,iBAAiB,kBAAkB,iBAAiB,iBAAiB,kBAAkB,iBAAiB,iBAAiB,kBAAkB,iBAAiB,iBAAiB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,mBAAmB,sBAAuB,mBAAmB,mBAAmB,sBAAuB,mBAAmB,mBAAmB,sBAAuB,mBAAmB,mBAAmB,sBAAuB,mBAAmB,mBAAmB,sBAAuB,mBAAmB,mBAAmB,sBAAuB,mBAAmB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,kBAAkB,mBAAmB,sBAAuB,kBAAkB,mBAAmB,sBAAuB,kBAAkB,mBAAmB,sBAAuB,kBAAkB,mBAAmB,sBAAuB,kBAAkB,mBAAmB,sBAAuB,kBAAkB,mBAAmB,uBAAwB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,kBAAkB,mBAAmB,sBAAuB,kBAAkB,mBAAmB,sBAAuB,kBAAkB,mBAAmB,sBAAuB,kBAAkB,mBAAmB,sBAAuB,mBAAmB,qBAAqB,mBAAmB,mBAAmB,qBAAqB,mBAAmB,mBAAmB,qBAAqB,mBAAmB,mBAAmB,qBAAqB,mBAAmB,mBAAmB,qBAAqB,mBAAmB,mBAAmB,qBAAqB,mBAAmB,mBAAmB,qBAAqB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,kBAAkB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,uBAAwB,kBAAkB,kBAAkB,uBAAwB,kBAAkB,kBAAkB,uBAAwB,kBAAkB,kBAAkB,uBAAwB,kBAAkB,kBAAkB,uBAAwB,kBAAkB,kBAAkB,uBAAwB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,kBAAkB,uBAAwB,kBAAkB,kBAAkB,uBAAwB,kBAAkB,kBAAkB,uBAAwB,kBAAkB,kBAAkB,uBAAwB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,oBAAoB,qBAAsB,mBAAmB,oBAAoB,qBAAsB,mBAAmB,oBAAoB,qBAAsB,mBAAmB,oBAAoB,qBAAsB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,sBAAsB,iBAAiB,mBAAmB,sBAAsB,iBAAiB,mBAAmB,sBAAsB,iBAAiB,mBAAmB,sBAAsB,iBAAiB,mBAAmB,sBAAsB,iBAAiB,mBAAmB,sBAAsB,iBAAiB,mBAAmB,sBAAsB,iBAAiB,qBAAsB,kBAAkB,kBAAkB,qBAAsB,kBAAkB,kBAAkB,qBAAsB,kBAAkB,kBAAkB,qBAAsB,kBAAkB,kBAAkB,qBAAsB,kBAAkB,kBAAkB,qBAAsB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,oBAAoB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,mBAAmB,kBAAkB,uBAAwB,mBAAmB,kBAAkB,uBAAwB,mBAAmB,kBAAkB,uBAAwB,mBAAmB,kBAAkB,uBAAwB,mBAAmB,kBAAkB,uBAAwB,mBAAmB,kBAAkB,uBAAwB,mBAAmB,kBAAkB,uBAAwB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,mBAAmB,kBAAkB,sBAAsB,kBAAkB,kBAAkB,sBAAsB,kBAAkB,kBAAkB,sBAAsB,kBAAkB,kBAAkB,sBAAsB,kBAAkB,kBAAkB,sBAAsB,kBAAkB,kBAAkB,sBAAsB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,kBAAkB,uBAAuB,mBAAmB,kBAAkB,uBAAuB,mBAAmB,kBAAkB,uBAAuB,mBAAmB,kBAAkB,uBAAuB,mBAAmB,kBAAkB,uBAAuB,mBAAmB,kBAAkB,uBAAuB,mBAAmB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,kBAAkB,kBAAmB,mBAAmB,kBAAkB,kBAAmB,mBAAmB,kBAAkB,kBAA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BAAoB,kBAAmB,iBAAkB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,iBAAkB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,iBAAkB,oBAAqB,iBAAkB,kBAAmB,oBAAqB,kBAAmB,iBAAkB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,iBAAkB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,iBAAkB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,oBAA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AAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,kBAAmB,oBAAqB,uBAAyB,mBAAoB,mBAAoB,sBAAyB,oBAAqB,iBAAkB,uBAA0B,mBAAoB,kBAAmB,uBAA0B,mBAAoB,kBAAmB,sBAAyB,oBAAqB,kBAAmB,uBAAyB,oBAAqB,iBAAkB,mBAAoB,kBAAmB,iBAAkB,mBAAoB,iBAAkB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,iBAAkB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,iBAAkB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,uBAA0B,kBAAmB,mBAAoB,uBAA0B,kBAAmB,oBAAqB,sBAAyB,kBAAmB,oBAAqB,uBAAyB,kBAAmB,qBAAsB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAo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AmB,oBAAqB,oBAAqB,kBAAmB,iBAAkB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,kBAAmB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,MAAO,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,oBAAqB,eAAgB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,MAAO,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,MAAO,mBAAoB,MAAO,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,qBAAsB,kBAAmB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,oBAAqB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,eAAgB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,iBAAkB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,eAAgB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,oBAAqB,iBAAkB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,iBAAkB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,MAAO,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,MAAO,kBAAmB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,eAAgB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,qBAAsB,kBAAmB,oBAAqB,iBAAkB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,eAAgB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,oBAAqB,oBAAqB,oBAAqB,eAAgB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,oBAAqB,iBAAkB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,MAAO,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,MAAO,kBAAmB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,qBAAsB,kBAAmB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,MAAO,mBAAoB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,oBAAqB,oBAAqB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,MAAO,kBAAmB,mBAAoB,mBAAoB,qBAAsB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,qBACjyxBsc,YAAc,IAGlB3c,MAAS,CACPX,KAAQ,cACRgB,MAAS,CAAC,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,EAAE,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,EAAE,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,I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"}