7703 lines
		
	
	
	
		
			1.6 MiB
		
	
	
	
	
	
	
	
			
		
		
	
	
			7703 lines
		
	
	
	
		
			1.6 MiB
		
	
	
	
	
	
	
	
/*
 | 
						|
 * v0.5.1 generated at Thu May 22 07:30:49 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.AFRAME=t():e.AFRAME=t()}(self,(()=>(()=>{var e={8167:e=>{var t=Object.prototype.toString;e.exports=function(e){return e.BYTES_PER_ELEMENT&&"[object ArrayBuffer]"===t.call(e.buffer)||Array.isArray(e)}},5734:e=>{e.exports=function(e,t){return"number"==typeof e?e:"number"==typeof t?t:0}},7961:(e,t)=>{"use strict";t.byteLength=function(e){var t=a(e),n=t[0],i=t[1];return 3*(n+i)/4-i},t.toByteArray=function(e){var t,n,s=a(e),o=s[0],l=s[1],c=new r(function(e,t,n){return 3*(t+n)/4-n}(0,o,l)),h=0,u=l>0?o-4:o;for(n=0;n<u;n+=4)t=i[e.charCodeAt(n)]<<18|i[e.charCodeAt(n+1)]<<12|i[e.charCodeAt(n+2)]<<6|i[e.charCodeAt(n+3)],c[h++]=t>>16&255,c[h++]=t>>8&255,c[h++]=255&t;return 2===l&&(t=i[e.charCodeAt(n)]<<2|i[e.charCodeAt(n+1)]>>4,c[h++]=255&t),1===l&&(t=i[e.charCodeAt(n)]<<10|i[e.charCodeAt(n+1)]<<4|i[e.charCodeAt(n+2)]>>2,c[h++]=t>>8&255,c[h++]=255&t),c},t.fromByteArray=function(e){for(var t,i=e.length,r=i%3,s=[],o=16383,a=0,c=i-r;a<c;a+=o)s.push(l(e,a,a+o>c?c:a+o));return 1===r?(t=e[i-1],s.push(n[t>>2]+n[t<<4&63]+"==")):2===r&&(t=(e[i-2]<<8)+e[i-1],s.push(n[t>>10]+n[t>>4&63]+n[t<<2&63]+"=")),s.join("")};for(var n=[],i=[],r="undefined"!=typeof Uint8Array?Uint8Array:Array,s="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",o=0;o<64;++o)n[o]=s[o],i[s.charCodeAt(o)]=o;function a(e){var t=e.length;if(t%4>0)throw new Error("Invalid string. Length must be a multiple of 4");var n=e.indexOf("=");return-1===n&&(n=t),[n,n===t?0:4-n%4]}function l(e,t,i){for(var r,s,o=[],a=t;a<i;a+=3)r=(e[a]<<16&16711680)+(e[a+1]<<8&65280)+(255&e[a+2]),o.push(n[(s=r)>>18&63]+n[s>>12&63]+n[s>>6&63]+n[63&s]);return o.join("")}i["-".charCodeAt(0)]=62,i["_".charCodeAt(0)]=63},911:(e,t,n)=>{var i=n(9922).hp;e.exports=function(e,t){if(i.isBuffer(e)&&i.isBuffer(t)){if("function"==typeof e.equals)return e.equals(t);if(e.length!==t.length)return!1;for(var n=0;n<e.length;n++)if(e[n]!==t[n])return!1;return!0}}},9922:(e,t,n)=>{"use strict";const i=n(7961),r=n(1024),s="function"==typeof Symbol&&"function"==typeof Symbol.for?Symbol.for("nodejs.util.inspect.custom"):null;t.hp=l,t.IS=50;const o=2147483647;function a(e){if(e>o)throw new RangeError('The value "'+e+'" is invalid for option "size"');const t=new Uint8Array(e);return Object.setPrototypeOf(t,l.prototype),t}function l(e,t,n){if("number"==typeof e){if("string"==typeof t)throw new TypeError('The "string" argument must be of type string. Received type number');return u(e)}return c(e,t,n)}function c(e,t,n){if("string"==typeof e)return function(e,t){if("string"==typeof t&&""!==t||(t="utf8"),!l.isEncoding(t))throw new TypeError("Unknown encoding: "+t);const n=0|m(e,t);let i=a(n);const r=i.write(e,t);return r!==n&&(i=i.slice(0,r)),i}(e,t);if(ArrayBuffer.isView(e))return function(e){if(Y(e,Uint8Array)){const t=new Uint8Array(e);return p(t.buffer,t.byteOffset,t.byteLength)}return d(e)}(e);if(null==e)throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof e);if(Y(e,ArrayBuffer)||e&&Y(e.buffer,ArrayBuffer))return p(e,t,n);if("undefined"!=typeof SharedArrayBuffer&&(Y(e,SharedArrayBuffer)||e&&Y(e.buffer,SharedArrayBuffer)))return p(e,t,n);if("number"==typeof e)throw new TypeError('The "value" argument must not be of type number. Received type number');const i=e.valueOf&&e.valueOf();if(null!=i&&i!==e)return l.from(i,t,n);const r=function(e){if(l.isBuffer(e)){const t=0|f(e.length),n=a(t);return 0===n.length||e.copy(n,0,0,t),n}return void 0!==e.length?"number"!=typeof e.length||J(e.length)?a(0):d(e):"Buffer"===e.type&&Array.isArray(e.data)?d(e.data):void 0}(e);if(r)return r;if("undefined"!=typeof Symbol&&null!=Symbol.toPrimitive&&"function"==typeof e[Symbol.toPrimitive])return l.from(e[Symbol.toPrimitive]("string"),t,n);throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof e)}function h(e){if("number"!=typeof e)throw new TypeError('"size" argument must be of type number');if(e<0)throw new RangeError('The value "'+e+'" is invalid for option "size"')}function u(e){return h(e),a(e<0?0:0|f(e))}function d(e){const t=e.length<0?0:0|f(e.length),n=a(t);for(let i=0;i<t;i+=1)n[i]=255&e[i];return n}function p(e,t,n){if(t<0||e.byteLength<t)throw new RangeError('"offset" is outside of buffer bounds');if(e.byteLength<t+(n||0))throw new RangeError('"length" is outside of buffer bounds');let i;return i=void 0===t&&void 0===n?new Uint8Array(e):void 0===n?new Uint8Array(e,t):new Uint8Array(e,t,n),Object.setPrototypeOf(i,l.prototype),i}function f(e){if(e>=o)throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+o.toString(16)+" bytes");return 0|e}function m(e,t){if(l.isBuffer(e))return e.length;if(ArrayBuffer.isView(e)||Y(e,ArrayBuffer))return e.byteLength;if("string"!=typeof e)throw new TypeError('The "string" argument must be one of type string, Buffer, or ArrayBuffer. Received type '+typeof e);const n=e.length,i=arguments.length>2&&!0===arguments[2];if(!i&&0===n)return 0;let r=!1;for(;;)switch(t){case"ascii":case"latin1":case"binary":return n;case"utf8":case"utf-8":return W(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*n;case"hex":return n>>>1;case"base64":return q(e).length;default:if(r)return i?-1:W(e).length;t=(""+t).toLowerCase(),r=!0}}function A(e,t,n){let i=!1;if((void 0===t||t<0)&&(t=0),t>this.length)return"";if((void 0===n||n>this.length)&&(n=this.length),n<=0)return"";if((n>>>=0)<=(t>>>=0))return"";for(e||(e="utf8");;)switch(e){case"hex":return B(this,t,n);case"utf8":case"utf-8":return M(this,t,n);case"ascii":return S(this,t,n);case"latin1":case"binary":return T(this,t,n);case"base64":return _(this,t,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return R(this,t,n);default:if(i)throw new TypeError("Unknown encoding: "+e);e=(e+"").toLowerCase(),i=!0}}function g(e,t,n){const i=e[t];e[t]=e[n],e[n]=i}function v(e,t,n,i,r){if(0===e.length)return-1;if("string"==typeof n?(i=n,n=0):n>2147483647?n=2147483647:n<-2147483648&&(n=-2147483648),J(n=+n)&&(n=r?0:e.length-1),n<0&&(n=e.length+n),n>=e.length){if(r)return-1;n=e.length-1}else if(n<0){if(!r)return-1;n=0}if("string"==typeof t&&(t=l.from(t,i)),l.isBuffer(t))return 0===t.length?-1:y(e,t,n,i,r);if("number"==typeof t)return t&=255,"function"==typeof Uint8Array.prototype.indexOf?r?Uint8Array.prototype.indexOf.call(e,t,n):Uint8Array.prototype.lastIndexOf.call(e,t,n):y(e,[t],n,i,r);throw new TypeError("val must be string, number or Buffer")}function y(e,t,n,i,r){let s,o=1,a=e.length,l=t.length;if(void 0!==i&&("ucs2"===(i=String(i).toLowerCase())||"ucs-2"===i||"utf16le"===i||"utf-16le"===i)){if(e.length<2||t.length<2)return-1;o=2,a/=2,l/=2,n/=2}function c(e,t){return 1===o?e[t]:e.readUInt16BE(t*o)}if(r){let i=-1;for(s=n;s<a;s++)if(c(e,s)===c(t,-1===i?0:s-i)){if(-1===i&&(i=s),s-i+1===l)return i*o}else-1!==i&&(s-=s-i),i=-1}else for(n+l>a&&(n=a-l),s=n;s>=0;s--){let n=!0;for(let i=0;i<l;i++)if(c(e,s+i)!==c(t,i)){n=!1;break}if(n)return s}return-1}function E(e,t,n,i){n=Number(n)||0;const r=e.length-n;i?(i=Number(i))>r&&(i=r):i=r;const s=t.length;let o;for(i>s/2&&(i=s/2),o=0;o<i;++o){const i=parseInt(t.substr(2*o,2),16);if(J(i))return o;e[n+o]=i}return o}function b(e,t,n,i){return X(W(t,e.length-n),e,n,i)}function x(e,t,n,i){return X(function(e){const t=[];for(let n=0;n<e.length;++n)t.push(255&e.charCodeAt(n));return t}(t),e,n,i)}function C(e,t,n,i){return X(q(t),e,n,i)}function w(e,t,n,i){return X(function(e,t){let n,i,r;const s=[];for(let o=0;o<e.length&&!((t-=2)<0);++o)n=e.charCodeAt(o),i=n>>8,r=n%256,s.push(r),s.push(i);return s}(t,e.length-n),e,n,i)}function _(e,t,n){return 0===t&&n===e.length?i.fromByteArray(e):i.fromByteArray(e.slice(t,n))}function M(e,t,n){n=Math.min(e.length,n);const i=[];let r=t;for(;r<n;){const t=e[r];let s=null,o=t>239?4:t>223?3:t>191?2:1;if(r+o<=n){let n,i,a,l;switch(o){case 1:t<128&&(s=t);break;case 2:n=e[r+1],128==(192&n)&&(l=(31&t)<<6|63&n,l>127&&(s=l));break;case 3:n=e[r+1],i=e[r+2],128==(192&n)&&128==(192&i)&&(l=(15&t)<<12|(63&n)<<6|63&i,l>2047&&(l<55296||l>57343)&&(s=l));break;case 4:n=e[r+1],i=e[r+2],a=e[r+3],128==(192&n)&&128==(192&i)&&128==(192&a)&&(l=(15&t)<<18|(63&n)<<12|(63&i)<<6|63&a,l>65535&&l<1114112&&(s=l))}}null===s?(s=65533,o=1):s>65535&&(s-=65536,i.push(s>>>10&1023|55296),s=56320|1023&s),i.push(s),r+=o}return function(e){const t=e.length;if(t<=I)return String.fromCharCode.apply(String,e);let n="",i=0;for(;i<t;)n+=String.fromCharCode.apply(String,e.slice(i,i+=I));return n}(i)}l.TYPED_ARRAY_SUPPORT=function(){try{const e=new Uint8Array(1),t={foo:function(){return 42}};return Object.setPrototypeOf(t,Uint8Array.prototype),Object.setPrototypeOf(e,t),42===e.foo()}catch(e){return!1}}(),l.TYPED_ARRAY_SUPPORT||"undefined"==typeof console||"function"!=typeof console.error||console.error("This browser lacks typed array (Uint8Array) support which is required by `buffer` v5.x. Use `buffer` v4.x if you require old browser support."),Object.defineProperty(l.prototype,"parent",{enumerable:!0,get:function(){if(l.isBuffer(this))return this.buffer}}),Object.defineProperty(l.prototype,"offset",{enumerable:!0,get:function(){if(l.isBuffer(this))return this.byteOffset}}),l.poolSize=8192,l.from=function(e,t,n){return c(e,t,n)},Object.setPrototypeOf(l.prototype,Uint8Array.prototype),Object.setPrototypeOf(l,Uint8Array),l.alloc=function(e,t,n){return function(e,t,n){return h(e),e<=0?a(e):void 0!==t?"string"==typeof n?a(e).fill(t,n):a(e).fill(t):a(e)}(e,t,n)},l.allocUnsafe=function(e){return u(e)},l.allocUnsafeSlow=function(e){return u(e)},l.isBuffer=function(e){return null!=e&&!0===e._isBuffer&&e!==l.prototype},l.compare=function(e,t){if(Y(e,Uint8Array)&&(e=l.from(e,e.offset,e.byteLength)),Y(t,Uint8Array)&&(t=l.from(t,t.offset,t.byteLength)),!l.isBuffer(e)||!l.isBuffer(t))throw new TypeError('The "buf1", "buf2" arguments must be one of type Buffer or Uint8Array');if(e===t)return 0;let n=e.length,i=t.length;for(let r=0,s=Math.min(n,i);r<s;++r)if(e[r]!==t[r]){n=e[r],i=t[r];break}return n<i?-1:i<n?1:0},l.isEncoding=function(e){switch(String(e).toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"latin1":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return!0;default:return!1}},l.concat=function(e,t){if(!Array.isArray(e))throw new TypeError('"list" argument must be an Array of Buffers');if(0===e.length)return l.alloc(0);let n;if(void 0===t)for(t=0,n=0;n<e.length;++n)t+=e[n].length;const i=l.allocUnsafe(t);let r=0;for(n=0;n<e.length;++n){let t=e[n];if(Y(t,Uint8Array))r+t.length>i.length?(l.isBuffer(t)||(t=l.from(t)),t.copy(i,r)):Uint8Array.prototype.set.call(i,t,r);else{if(!l.isBuffer(t))throw new TypeError('"list" argument must be an Array of Buffers');t.copy(i,r)}r+=t.length}return i},l.byteLength=m,l.prototype._isBuffer=!0,l.prototype.swap16=function(){const e=this.length;if(e%2!=0)throw new RangeError("Buffer size must be a multiple of 16-bits");for(let t=0;t<e;t+=2)g(this,t,t+1);return this},l.prototype.swap32=function(){const e=this.length;if(e%4!=0)throw new RangeError("Buffer size must be a multiple of 32-bits");for(let t=0;t<e;t+=4)g(this,t,t+3),g(this,t+1,t+2);return this},l.prototype.swap64=function(){const e=this.length;if(e%8!=0)throw new RangeError("Buffer size must be a multiple of 64-bits");for(let t=0;t<e;t+=8)g(this,t,t+7),g(this,t+1,t+6),g(this,t+2,t+5),g(this,t+3,t+4);return this},l.prototype.toString=function(){const e=this.length;return 0===e?"":0===arguments.length?M(this,0,e):A.apply(this,arguments)},l.prototype.toLocaleString=l.prototype.toString,l.prototype.equals=function(e){if(!l.isBuffer(e))throw new TypeError("Argument must be a Buffer");return this===e||0===l.compare(this,e)},l.prototype.inspect=function(){let e="";const n=t.IS;return e=this.toString("hex",0,n).replace(/(.{2})/g,"$1 ").trim(),this.length>n&&(e+=" ... "),"<Buffer "+e+">"},s&&(l.prototype[s]=l.prototype.inspect),l.prototype.compare=function(e,t,n,i,r){if(Y(e,Uint8Array)&&(e=l.from(e,e.offset,e.byteLength)),!l.isBuffer(e))throw new TypeError('The "target" argument must be one of type Buffer or Uint8Array. Received type '+typeof e);if(void 0===t&&(t=0),void 0===n&&(n=e?e.length:0),void 0===i&&(i=0),void 0===r&&(r=this.length),t<0||n>e.length||i<0||r>this.length)throw new RangeError("out of range index");if(i>=r&&t>=n)return 0;if(i>=r)return-1;if(t>=n)return 1;if(this===e)return 0;let s=(r>>>=0)-(i>>>=0),o=(n>>>=0)-(t>>>=0);const a=Math.min(s,o),c=this.slice(i,r),h=e.slice(t,n);for(let e=0;e<a;++e)if(c[e]!==h[e]){s=c[e],o=h[e];break}return s<o?-1:o<s?1:0},l.prototype.includes=function(e,t,n){return-1!==this.indexOf(e,t,n)},l.prototype.indexOf=function(e,t,n){return v(this,e,t,n,!0)},l.prototype.lastIndexOf=function(e,t,n){return v(this,e,t,n,!1)},l.prototype.write=function(e,t,n,i){if(void 0===t)i="utf8",n=this.length,t=0;else if(void 0===n&&"string"==typeof t)i=t,n=this.length,t=0;else{if(!isFinite(t))throw new Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");t>>>=0,isFinite(n)?(n>>>=0,void 0===i&&(i="utf8")):(i=n,n=void 0)}const r=this.length-t;if((void 0===n||n>r)&&(n=r),e.length>0&&(n<0||t<0)||t>this.length)throw new RangeError("Attempt to write outside buffer bounds");i||(i="utf8");let s=!1;for(;;)switch(i){case"hex":return E(this,e,t,n);case"utf8":case"utf-8":return b(this,e,t,n);case"ascii":case"latin1":case"binary":return x(this,e,t,n);case"base64":return C(this,e,t,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return w(this,e,t,n);default:if(s)throw new TypeError("Unknown encoding: "+i);i=(""+i).toLowerCase(),s=!0}},l.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};const I=4096;function S(e,t,n){let i="";n=Math.min(e.length,n);for(let r=t;r<n;++r)i+=String.fromCharCode(127&e[r]);return i}function T(e,t,n){let i="";n=Math.min(e.length,n);for(let r=t;r<n;++r)i+=String.fromCharCode(e[r]);return i}function B(e,t,n){const i=e.length;(!t||t<0)&&(t=0),(!n||n<0||n>i)&&(n=i);let r="";for(let i=t;i<n;++i)r+=K[e[i]];return r}function R(e,t,n){const i=e.slice(t,n);let r="";for(let e=0;e<i.length-1;e+=2)r+=String.fromCharCode(i[e]+256*i[e+1]);return r}function L(e,t,n){if(e%1!=0||e<0)throw new RangeError("offset is not uint");if(e+t>n)throw new RangeError("Trying to access beyond buffer length")}function D(e,t,n,i,r,s){if(!l.isBuffer(e))throw new TypeError('"buffer" argument must be a Buffer instance');if(t>r||t<s)throw new RangeError('"value" argument is out of bounds');if(n+i>e.length)throw new RangeError("Index out of range")}function P(e,t,n,i,r){G(t,i,r,e,n,7);let s=Number(t&BigInt(4294967295));e[n++]=s,s>>=8,e[n++]=s,s>>=8,e[n++]=s,s>>=8,e[n++]=s;let o=Number(t>>BigInt(32)&BigInt(4294967295));return e[n++]=o,o>>=8,e[n++]=o,o>>=8,e[n++]=o,o>>=8,e[n++]=o,n}function U(e,t,n,i,r){G(t,i,r,e,n,7);let s=Number(t&BigInt(4294967295));e[n+7]=s,s>>=8,e[n+6]=s,s>>=8,e[n+5]=s,s>>=8,e[n+4]=s;let o=Number(t>>BigInt(32)&BigInt(4294967295));return e[n+3]=o,o>>=8,e[n+2]=o,o>>=8,e[n+1]=o,o>>=8,e[n]=o,n+8}function k(e,t,n,i,r,s){if(n+i>e.length)throw new RangeError("Index out of range");if(n<0)throw new RangeError("Index out of range")}function N(e,t,n,i,s){return t=+t,n>>>=0,s||k(e,0,n,4),r.write(e,t,n,i,23,4),n+4}function O(e,t,n,i,s){return t=+t,n>>>=0,s||k(e,0,n,8),r.write(e,t,n,i,52,8),n+8}l.prototype.slice=function(e,t){const n=this.length;(e=~~e)<0?(e+=n)<0&&(e=0):e>n&&(e=n),(t=void 0===t?n:~~t)<0?(t+=n)<0&&(t=0):t>n&&(t=n),t<e&&(t=e);const i=this.subarray(e,t);return Object.setPrototypeOf(i,l.prototype),i},l.prototype.readUintLE=l.prototype.readUIntLE=function(e,t,n){e>>>=0,t>>>=0,n||L(e,t,this.length);let i=this[e],r=1,s=0;for(;++s<t&&(r*=256);)i+=this[e+s]*r;return i},l.prototype.readUintBE=l.prototype.readUIntBE=function(e,t,n){e>>>=0,t>>>=0,n||L(e,t,this.length);let i=this[e+--t],r=1;for(;t>0&&(r*=256);)i+=this[e+--t]*r;return i},l.prototype.readUint8=l.prototype.readUInt8=function(e,t){return e>>>=0,t||L(e,1,this.length),this[e]},l.prototype.readUint16LE=l.prototype.readUInt16LE=function(e,t){return e>>>=0,t||L(e,2,this.length),this[e]|this[e+1]<<8},l.prototype.readUint16BE=l.prototype.readUInt16BE=function(e,t){return e>>>=0,t||L(e,2,this.length),this[e]<<8|this[e+1]},l.prototype.readUint32LE=l.prototype.readUInt32LE=function(e,t){return e>>>=0,t||L(e,4,this.length),(this[e]|this[e+1]<<8|this[e+2]<<16)+16777216*this[e+3]},l.prototype.readUint32BE=l.prototype.readUInt32BE=function(e,t){return e>>>=0,t||L(e,4,this.length),16777216*this[e]+(this[e+1]<<16|this[e+2]<<8|this[e+3])},l.prototype.readBigUInt64LE=Z((function(e){H(e>>>=0,"offset");const t=this[e],n=this[e+7];void 0!==t&&void 0!==n||V(e,this.length-8);const i=t+256*this[++e]+65536*this[++e]+this[++e]*2**24,r=this[++e]+256*this[++e]+65536*this[++e]+n*2**24;return BigInt(i)+(BigInt(r)<<BigInt(32))})),l.prototype.readBigUInt64BE=Z((function(e){H(e>>>=0,"offset");const t=this[e],n=this[e+7];void 0!==t&&void 0!==n||V(e,this.length-8);const i=t*2**24+65536*this[++e]+256*this[++e]+this[++e],r=this[++e]*2**24+65536*this[++e]+256*this[++e]+n;return(BigInt(i)<<BigInt(32))+BigInt(r)})),l.prototype.readIntLE=function(e,t,n){e>>>=0,t>>>=0,n||L(e,t,this.length);let i=this[e],r=1,s=0;for(;++s<t&&(r*=256);)i+=this[e+s]*r;return r*=128,i>=r&&(i-=Math.pow(2,8*t)),i},l.prototype.readIntBE=function(e,t,n){e>>>=0,t>>>=0,n||L(e,t,this.length);let i=t,r=1,s=this[e+--i];for(;i>0&&(r*=256);)s+=this[e+--i]*r;return r*=128,s>=r&&(s-=Math.pow(2,8*t)),s},l.prototype.readInt8=function(e,t){return e>>>=0,t||L(e,1,this.length),128&this[e]?-1*(255-this[e]+1):this[e]},l.prototype.readInt16LE=function(e,t){e>>>=0,t||L(e,2,this.length);const n=this[e]|this[e+1]<<8;return 32768&n?4294901760|n:n},l.prototype.readInt16BE=function(e,t){e>>>=0,t||L(e,2,this.length);const n=this[e+1]|this[e]<<8;return 32768&n?4294901760|n:n},l.prototype.readInt32LE=function(e,t){return e>>>=0,t||L(e,4,this.length),this[e]|this[e+1]<<8|this[e+2]<<16|this[e+3]<<24},l.prototype.readInt32BE=function(e,t){return e>>>=0,t||L(e,4,this.length),this[e]<<24|this[e+1]<<16|this[e+2]<<8|this[e+3]},l.prototype.readBigInt64LE=Z((function(e){H(e>>>=0,"offset");const t=this[e],n=this[e+7];void 0!==t&&void 0!==n||V(e,this.length-8);const i=this[e+4]+256*this[e+5]+65536*this[e+6]+(n<<24);return(BigInt(i)<<BigInt(32))+BigInt(t+256*this[++e]+65536*this[++e]+this[++e]*2**24)})),l.prototype.readBigInt64BE=Z((function(e){H(e>>>=0,"offset");const t=this[e],n=this[e+7];void 0!==t&&void 0!==n||V(e,this.length-8);const i=(t<<24)+65536*this[++e]+256*this[++e]+this[++e];return(BigInt(i)<<BigInt(32))+BigInt(this[++e]*2**24+65536*this[++e]+256*this[++e]+n)})),l.prototype.readFloatLE=function(e,t){return e>>>=0,t||L(e,4,this.length),r.read(this,e,!0,23,4)},l.prototype.readFloatBE=function(e,t){return e>>>=0,t||L(e,4,this.length),r.read(this,e,!1,23,4)},l.prototype.readDoubleLE=function(e,t){return e>>>=0,t||L(e,8,this.length),r.read(this,e,!0,52,8)},l.prototype.readDoubleBE=function(e,t){return e>>>=0,t||L(e,8,this.length),r.read(this,e,!1,52,8)},l.prototype.writeUintLE=l.prototype.writeUIntLE=function(e,t,n,i){e=+e,t>>>=0,n>>>=0,i||D(this,e,t,n,Math.pow(2,8*n)-1,0);let r=1,s=0;for(this[t]=255&e;++s<n&&(r*=256);)this[t+s]=e/r&255;return t+n},l.prototype.writeUintBE=l.prototype.writeUIntBE=function(e,t,n,i){e=+e,t>>>=0,n>>>=0,i||D(this,e,t,n,Math.pow(2,8*n)-1,0);let r=n-1,s=1;for(this[t+r]=255&e;--r>=0&&(s*=256);)this[t+r]=e/s&255;return t+n},l.prototype.writeUint8=l.prototype.writeUInt8=function(e,t,n){return e=+e,t>>>=0,n||D(this,e,t,1,255,0),this[t]=255&e,t+1},l.prototype.writeUint16LE=l.prototype.writeUInt16LE=function(e,t,n){return e=+e,t>>>=0,n||D(this,e,t,2,65535,0),this[t]=255&e,this[t+1]=e>>>8,t+2},l.prototype.writeUint16BE=l.prototype.writeUInt16BE=function(e,t,n){return e=+e,t>>>=0,n||D(this,e,t,2,65535,0),this[t]=e>>>8,this[t+1]=255&e,t+2},l.prototype.writeUint32LE=l.prototype.writeUInt32LE=function(e,t,n){return e=+e,t>>>=0,n||D(this,e,t,4,4294967295,0),this[t+3]=e>>>24,this[t+2]=e>>>16,this[t+1]=e>>>8,this[t]=255&e,t+4},l.prototype.writeUint32BE=l.prototype.writeUInt32BE=function(e,t,n){return e=+e,t>>>=0,n||D(this,e,t,4,4294967295,0),this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e,t+4},l.prototype.writeBigUInt64LE=Z((function(e,t=0){return P(this,e,t,BigInt(0),BigInt("0xffffffffffffffff"))})),l.prototype.writeBigUInt64BE=Z((function(e,t=0){return U(this,e,t,BigInt(0),BigInt("0xffffffffffffffff"))})),l.prototype.writeIntLE=function(e,t,n,i){if(e=+e,t>>>=0,!i){const i=Math.pow(2,8*n-1);D(this,e,t,n,i-1,-i)}let r=0,s=1,o=0;for(this[t]=255&e;++r<n&&(s*=256);)e<0&&0===o&&0!==this[t+r-1]&&(o=1),this[t+r]=(e/s|0)-o&255;return t+n},l.prototype.writeIntBE=function(e,t,n,i){if(e=+e,t>>>=0,!i){const i=Math.pow(2,8*n-1);D(this,e,t,n,i-1,-i)}let r=n-1,s=1,o=0;for(this[t+r]=255&e;--r>=0&&(s*=256);)e<0&&0===o&&0!==this[t+r+1]&&(o=1),this[t+r]=(e/s|0)-o&255;return t+n},l.prototype.writeInt8=function(e,t,n){return e=+e,t>>>=0,n||D(this,e,t,1,127,-128),e<0&&(e=255+e+1),this[t]=255&e,t+1},l.prototype.writeInt16LE=function(e,t,n){return e=+e,t>>>=0,n||D(this,e,t,2,32767,-32768),this[t]=255&e,this[t+1]=e>>>8,t+2},l.prototype.writeInt16BE=function(e,t,n){return e=+e,t>>>=0,n||D(this,e,t,2,32767,-32768),this[t]=e>>>8,this[t+1]=255&e,t+2},l.prototype.writeInt32LE=function(e,t,n){return e=+e,t>>>=0,n||D(this,e,t,4,2147483647,-2147483648),this[t]=255&e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24,t+4},l.prototype.writeInt32BE=function(e,t,n){return e=+e,t>>>=0,n||D(this,e,t,4,2147483647,-2147483648),e<0&&(e=4294967295+e+1),this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e,t+4},l.prototype.writeBigInt64LE=Z((function(e,t=0){return P(this,e,t,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))})),l.prototype.writeBigInt64BE=Z((function(e,t=0){return U(this,e,t,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))})),l.prototype.writeFloatLE=function(e,t,n){return N(this,e,t,!0,n)},l.prototype.writeFloatBE=function(e,t,n){return N(this,e,t,!1,n)},l.prototype.writeDoubleLE=function(e,t,n){return O(this,e,t,!0,n)},l.prototype.writeDoubleBE=function(e,t,n){return O(this,e,t,!1,n)},l.prototype.copy=function(e,t,n,i){if(!l.isBuffer(e))throw new TypeError("argument should be a Buffer");if(n||(n=0),i||0===i||(i=this.length),t>=e.length&&(t=e.length),t||(t=0),i>0&&i<n&&(i=n),i===n)return 0;if(0===e.length||0===this.length)return 0;if(t<0)throw new RangeError("targetStart out of bounds");if(n<0||n>=this.length)throw new RangeError("Index out of range");if(i<0)throw new RangeError("sourceEnd out of bounds");i>this.length&&(i=this.length),e.length-t<i-n&&(i=e.length-t+n);const r=i-n;return this===e&&"function"==typeof Uint8Array.prototype.copyWithin?this.copyWithin(t,n,i):Uint8Array.prototype.set.call(e,this.subarray(n,i),t),r},l.prototype.fill=function(e,t,n,i){if("string"==typeof e){if("string"==typeof t?(i=t,t=0,n=this.length):"string"==typeof n&&(i=n,n=this.length),void 0!==i&&"string"!=typeof i)throw new TypeError("encoding must be a string");if("string"==typeof i&&!l.isEncoding(i))throw new TypeError("Unknown encoding: "+i);if(1===e.length){const t=e.charCodeAt(0);("utf8"===i&&t<128||"latin1"===i)&&(e=t)}}else"number"==typeof e?e&=255:"boolean"==typeof e&&(e=Number(e));if(t<0||this.length<t||this.length<n)throw new RangeError("Out of range index");if(n<=t)return this;let r;if(t>>>=0,n=void 0===n?this.length:n>>>0,e||(e=0),"number"==typeof e)for(r=t;r<n;++r)this[r]=e;else{const s=l.isBuffer(e)?e:l.from(e,i),o=s.length;if(0===o)throw new TypeError('The value "'+e+'" is invalid for argument "value"');for(r=0;r<n-t;++r)this[r+t]=s[r%o]}return this};const F={};function Q(e,t,n){F[e]=class extends n{constructor(){super(),Object.defineProperty(this,"message",{value:t.apply(this,arguments),writable:!0,configurable:!0}),this.name=`${this.name} [${e}]`,this.stack,delete this.name}get code(){return e}set code(e){Object.defineProperty(this,"code",{configurable:!0,enumerable:!0,value:e,writable:!0})}toString(){return`${this.name} [${e}]: ${this.message}`}}}function z(e){let t="",n=e.length;const i="-"===e[0]?1:0;for(;n>=i+4;n-=3)t=`_${e.slice(n-3,n)}${t}`;return`${e.slice(0,n)}${t}`}function G(e,t,n,i,r,s){if(e>n||e<t){const i="bigint"==typeof t?"n":"";let r;throw r=s>3?0===t||t===BigInt(0)?`>= 0${i} and < 2${i} ** ${8*(s+1)}${i}`:`>= -(2${i} ** ${8*(s+1)-1}${i}) and < 2 ** ${8*(s+1)-1}${i}`:`>= ${t}${i} and <= ${n}${i}`,new F.ERR_OUT_OF_RANGE("value",r,e)}!function(e,t,n){H(t,"offset"),void 0!==e[t]&&void 0!==e[t+n]||V(t,e.length-(n+1))}(i,r,s)}function H(e,t){if("number"!=typeof e)throw new F.ERR_INVALID_ARG_TYPE(t,"number",e)}function V(e,t,n){if(Math.floor(e)!==e)throw H(e,n),new F.ERR_OUT_OF_RANGE(n||"offset","an integer",e);if(t<0)throw new F.ERR_BUFFER_OUT_OF_BOUNDS;throw new F.ERR_OUT_OF_RANGE(n||"offset",`>= ${n?1:0} and <= ${t}`,e)}Q("ERR_BUFFER_OUT_OF_BOUNDS",(function(e){return e?`${e} is outside of buffer bounds`:"Attempt to access memory outside buffer bounds"}),RangeError),Q("ERR_INVALID_ARG_TYPE",(function(e,t){return`The "${e}" argument must be of type number. Received type ${typeof t}`}),TypeError),Q("ERR_OUT_OF_RANGE",(function(e,t,n){let i=`The value of "${e}" is out of range.`,r=n;return Number.isInteger(n)&&Math.abs(n)>2**32?r=z(String(n)):"bigint"==typeof n&&(r=String(n),(n>BigInt(2)**BigInt(32)||n<-(BigInt(2)**BigInt(32)))&&(r=z(r)),r+="n"),i+=` It must be ${t}. Received ${r}`,i}),RangeError);const j=/[^+/0-9A-Za-z-_]/g;function W(e,t){let n;t=t||1/0;const i=e.length;let r=null;const s=[];for(let o=0;o<i;++o){if(n=e.charCodeAt(o),n>55295&&n<57344){if(!r){if(n>56319){(t-=3)>-1&&s.push(239,191,189);continue}if(o+1===i){(t-=3)>-1&&s.push(239,191,189);continue}r=n;continue}if(n<56320){(t-=3)>-1&&s.push(239,191,189),r=n;continue}n=65536+(r-55296<<10|n-56320)}else r&&(t-=3)>-1&&s.push(239,191,189);if(r=null,n<128){if((t-=1)<0)break;s.push(n)}else if(n<2048){if((t-=2)<0)break;s.push(n>>6|192,63&n|128)}else if(n<65536){if((t-=3)<0)break;s.push(n>>12|224,n>>6&63|128,63&n|128)}else{if(!(n<1114112))throw new Error("Invalid code point");if((t-=4)<0)break;s.push(n>>18|240,n>>12&63|128,n>>6&63|128,63&n|128)}}return s}function q(e){return i.toByteArray(function(e){if((e=(e=e.split("=")[0]).trim().replace(j,"")).length<2)return"";for(;e.length%4!=0;)e+="=";return e}(e))}function X(e,t,n,i){let r;for(r=0;r<i&&!(r+n>=t.length||r>=e.length);++r)t[r+n]=e[r];return r}function Y(e,t){return e instanceof t||null!=e&&null!=e.constructor&&null!=e.constructor.name&&e.constructor.name===t.name}function J(e){return e!=e}const K=function(){const e="0123456789abcdef",t=new Array(256);for(let n=0;n<16;++n){const i=16*n;for(let r=0;r<16;++r)t[i+r]=e[n]+e[r]}return t}();function Z(e){return"undefined"==typeof BigInt?$:e}function $(){throw new Error("BigInt not supported")}},9089:e=>{"use strict";e.exports=function(e){var t=[];return t.toString=function(){return this.map((function(t){var n="",i=void 0!==t[5];return t[4]&&(n+="@supports (".concat(t[4],") {")),t[2]&&(n+="@media ".concat(t[2]," {")),i&&(n+="@layer".concat(t[5].length>0?" ".concat(t[5]):""," {")),n+=e(t),i&&(n+="}"),t[2]&&(n+="}"),t[4]&&(n+="}"),n})).join("")},t.i=function(e,n,i,r,s){"string"==typeof e&&(e=[[null,e,void 0]]);var o={};if(i)for(var a=0;a<this.length;a++){var l=this[a][0];null!=l&&(o[l]=!0)}for(var c=0;c<e.length;c++){var h=[].concat(e[c]);i&&o[h[0]]||(void 0!==s&&(void 0===h[5]||(h[1]="@layer".concat(h[5].length>0?" ".concat(h[5]):""," {").concat(h[1],"}")),h[5]=s),n&&(h[2]?(h[1]="@media ".concat(h[2]," {").concat(h[1],"}"),h[2]=n):h[2]=n),r&&(h[4]?(h[1]="@supports (".concat(h[4],") {").concat(h[1],"}"),h[4]=r):h[4]="".concat(r)),t.push(h))}},t}},6492:e=>{"use strict";e.exports=function(e,t){return t||(t={}),e?(e=String(e.__esModule?e.default:e),/^['"].*['"]$/.test(e)&&(e=e.slice(1,-1)),t.hash&&(e+=t.hash),/["'() \t\n]|(%20)/.test(e)||t.needQuotes?'"'.concat(e.replace(/"/g,'\\"').replace(/\n/g,"\\n"),'"'):e):e}},963:e=>{"use strict";e.exports=function(e){var t=e[1],n=e[3];if(!n)return t;if("function"==typeof btoa){var i=btoa(unescape(encodeURIComponent(JSON.stringify(n)))),r="sourceMappingURL=data:application/json;charset=utf-8;base64,".concat(i),s="/*# ".concat(r," */");return[t].concat([s]).join("\n")}return[t].join("\n")}},8878:(e,t,n)=>{t.formatArgs=function(t){if(t[0]=(this.useColors?"%c":"")+this.namespace+(this.useColors?" %c":" ")+t[0]+(this.useColors?"%c ":" ")+"+"+e.exports.humanize(this.diff),!this.useColors)return;const n="color: "+this.color;t.splice(1,0,n,"color: inherit");let i=0,r=0;t[0].replace(/%[a-zA-Z%]/g,(e=>{"%%"!==e&&(i++,"%c"===e&&(r=i))})),t.splice(r,0,n)},t.save=function(e){try{e?t.storage.setItem("debug",e):t.storage.removeItem("debug")}catch(e){}},t.load=function(){let e;try{e=t.storage.getItem("debug")}catch(e){}return!e&&"undefined"!=typeof process&&"env"in process&&(e=process.env.DEBUG),e},t.useColors=function(){if("undefined"!=typeof window&&window.process&&("renderer"===window.process.type||window.process.__nwjs))return!0;if("undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/))return!1;let e;return"undefined"!=typeof document&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||"undefined"!=typeof window&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||"undefined"!=typeof navigator&&navigator.userAgent&&(e=navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/))&&parseInt(e[1],10)>=31||"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)},t.storage=function(){try{return localStorage}catch(e){}}(),t.destroy=(()=>{let e=!1;return()=>{e||(e=!0,console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."))}})(),t.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"],t.log=console.debug||console.log||(()=>{}),e.exports=n(8945)(t);const{formatters:i}=e.exports;i.j=function(e){try{return JSON.stringify(e)}catch(e){return"[UnexpectedJSONParseError]: "+e.message}}},8945:(e,t,n)=>{e.exports=function(e){function t(e){let n,r,s,o=null;function a(...e){if(!a.enabled)return;const i=a,r=Number(new Date),s=r-(n||r);i.diff=s,i.prev=n,i.curr=r,n=r,e[0]=t.coerce(e[0]),"string"!=typeof e[0]&&e.unshift("%O");let o=0;e[0]=e[0].replace(/%([a-zA-Z%])/g,((n,r)=>{if("%%"===n)return"%";o++;const s=t.formatters[r];if("function"==typeof s){const t=e[o];n=s.call(i,t),e.splice(o,1),o--}return n})),t.formatArgs.call(i,e),(i.log||t.log).apply(i,e)}return a.namespace=e,a.useColors=t.useColors(),a.color=t.selectColor(e),a.extend=i,a.destroy=t.destroy,Object.defineProperty(a,"enabled",{enumerable:!0,configurable:!1,get:()=>null!==o?o:(r!==t.namespaces&&(r=t.namespaces,s=t.enabled(e)),s),set:e=>{o=e}}),"function"==typeof t.init&&t.init(a),a}function i(e,n){const i=t(this.namespace+(void 0===n?":":n)+e);return i.log=this.log,i}function r(e,t){let n=0,i=0,r=-1,s=0;for(;n<e.length;)if(i<t.length&&(t[i]===e[n]||"*"===t[i]))"*"===t[i]?(r=i,s=n,i++):(n++,i++);else{if(-1===r)return!1;i=r+1,s++,n=s}for(;i<t.length&&"*"===t[i];)i++;return i===t.length}return t.debug=t,t.default=t,t.coerce=function(e){return e instanceof Error?e.stack||e.message:e},t.disable=function(){const e=[...t.names,...t.skips.map((e=>"-"+e))].join(",");return t.enable(""),e},t.enable=function(e){t.save(e),t.namespaces=e,t.names=[],t.skips=[];const n=("string"==typeof e?e:"").trim().replace(" ",",").split(",").filter(Boolean);for(const e of n)"-"===e[0]?t.skips.push(e.slice(1)):t.names.push(e)},t.enabled=function(e){for(const n of t.skips)if(r(e,n))return!1;for(const n of t.names)if(r(e,n))return!0;return!1},t.humanize=n(9192),t.destroy=function(){console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.")},Object.keys(e).forEach((n=>{t[n]=e[n]})),t.names=[],t.skips=[],t.formatters={},t.selectColor=function(e){let n=0;for(let t=0;t<e.length;t++)n=(n<<5)-n+e.charCodeAt(t),n|=0;return t.colors[Math.abs(n)%t.colors.length]},t.enable(t.load()),t}},1124:(e,t,n)=>{"use strict";var i=n(6240),r=Object.prototype.hasOwnProperty,s=Object.prototype.propertyIsEnumerable;function o(e,t,n){var s=t[n];if(null!=s){if(r.call(e,n)&&(void 0===e[n]||null===e[n]))throw new TypeError("Cannot convert undefined or null to object ("+n+")");r.call(e,n)&&i(s)?e[n]=a(Object(e[n]),t[n]):e[n]=s}}function a(e,t){if(e===t)return e;for(var n in t=Object(t))r.call(t,n)&&o(e,t,n);if(Object.getOwnPropertySymbols)for(var i=Object.getOwnPropertySymbols(t),a=0;a<i.length;a++)s.call(t,i[a])&&o(e,t,i[a]);return e}e.exports=function(e){e=function(e){if(null==e)throw new TypeError("Sources cannot be null or undefined");return Object(e)}(e);for(var t=1;t<arguments.length;t++)a(e,arguments[t]);return e}},8480:e=>{e.exports=function(e){switch(e){case"int8":return Int8Array;case"int16":return Int16Array;case"int32":return Int32Array;case"uint8":return Uint8Array;case"uint16":return Uint16Array;case"uint32":return Uint32Array;case"float32":return Float32Array;case"float64":return Float64Array;case"array":return Array;case"uint8_clamped":return Uint8ClampedArray}}},919:(e,t,n)=>{var i;i="undefined"!=typeof window?window:void 0!==n.g?n.g:"undefined"!=typeof self?self:{},e.exports=i},1024:(e,t)=>{t.read=function(e,t,n,i,r){var s,o,a=8*r-i-1,l=(1<<a)-1,c=l>>1,h=-7,u=n?r-1:0,d=n?-1:1,p=e[t+u];for(u+=d,s=p&(1<<-h)-1,p>>=-h,h+=a;h>0;s=256*s+e[t+u],u+=d,h-=8);for(o=s&(1<<-h)-1,s>>=-h,h+=i;h>0;o=256*o+e[t+u],u+=d,h-=8);if(0===s)s=1-c;else{if(s===l)return o?NaN:1/0*(p?-1:1);o+=Math.pow(2,i),s-=c}return(p?-1:1)*o*Math.pow(2,s-i)},t.write=function(e,t,n,i,r,s){var o,a,l,c=8*s-r-1,h=(1<<c)-1,u=h>>1,d=23===r?Math.pow(2,-24)-Math.pow(2,-77):0,p=i?0:s-1,f=i?1:-1,m=t<0||0===t&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(a=isNaN(t)?1:0,o=h):(o=Math.floor(Math.log(t)/Math.LN2),t*(l=Math.pow(2,-o))<1&&(o--,l*=2),(t+=o+u>=1?d/l:d*Math.pow(2,1-u))*l>=2&&(o++,l/=2),o+u>=h?(a=0,o=h):o+u>=1?(a=(t*l-1)*Math.pow(2,r),o+=u):(a=t*Math.pow(2,u-1)*Math.pow(2,r),o=0));r>=8;e[n+p]=255&a,p+=f,a/=256,r-=8);for(o=o<<r|a,c+=r;c>0;e[n+p]=255&o,p+=f,o/=256,c-=8);e[n+p-f]|=128*m}},2225:e=>{function t(e){return!!e.constructor&&"function"==typeof e.constructor.isBuffer&&e.constructor.isBuffer(e)}e.exports=function(e){return null!=e&&(t(e)||function(e){return"function"==typeof e.readFloatLE&&"function"==typeof e.slice&&t(e.slice(0,0))}(e)||!!e._isBuffer)}},8847:e=>{e.exports=function(e){if(!e)return!1;var n=t.call(e);return"[object Function]"===n||"function"==typeof e&&"[object RegExp]"!==n||"undefined"!=typeof window&&(e===window.setTimeout||e===window.alert||e===window.confirm||e===window.prompt)};var t=Object.prototype.toString},6240:e=>{"use strict";e.exports=function(e){var t=typeof e;return null!==e&&("object"===t||"function"===t)}},5651:(e,t,n)=>{var i=n(5406),r=n(4597),s=n(5734),o=["x","e","a","o","n","s","r","c","u","m","v","w","z"],a=["m","w"],l=["H","I","N","E","F","K","L","T","U","V","W","X","Y","Z"],c="\t".charCodeAt(0),h=" ".charCodeAt(0);function u(e){this.glyphs=[],this._measure=this.computeMetrics.bind(this),this.update(e)}function d(e){return new Function(["return function "+e+"() {","  return this._"+e,"}"].join("\n"))()}function p(e,t){if(!e.chars||0===e.chars.length)return null;var n=m(e.chars,t);return n>=0?e.chars[n]:null}function f(e,t,n){if(!e.kernings||0===e.kernings.length)return 0;for(var i=e.kernings,r=0;r<i.length;r++){var s=i[r];if(s.first===t&&s.second===n)return s.amount}return 0}function m(e,t,n){for(var i=n=n||0;i<e.length;i++)if(e[i].id===t)return i;return-1}e.exports=function(e){return new u(e)},u.prototype.update=function(e){if(e=r({measure:this._measure},e),this._opt=e,this._opt.tabSize=s(this._opt.tabSize,4),!e.font)throw new Error("must provide a valid bitmap font");var t=this.glyphs,n=e.text||"",a=e.font;this._setupSpaceGlyphs(a);var c=i.lines(n,e),h=e.width||0;t.length=0;var u=c.reduce((function(e,t){return Math.max(e,t.width,h)}),0),d=0,p=0,A=s(e.lineHeight,a.common.lineHeight),g=a.common.base,v=A-g,y=e.letterSpacing||0,E=A*c.length-v,b=function(e){return"center"===e?1:"right"===e?2:0}(this._opt.align);p-=E,this._width=u,this._height=E,this._descender=A-g,this._baseline=g,this._xHeight=function(e){for(var t=0;t<o.length;t++){var n=o[t].charCodeAt(0),i=m(e.chars,n);if(i>=0)return e.chars[i].height}return 0}(a),this._capHeight=function(e){for(var t=0;t<l.length;t++){var n=l[t].charCodeAt(0),i=m(e.chars,n);if(i>=0)return e.chars[i].height}return 0}(a),this._lineHeight=A,this._ascender=A-v-this._xHeight;var x=this;c.forEach((function(e,i){for(var r,s=e.start,o=e.end,l=e.width,c=s;c<o;c++){var h=n.charCodeAt(c),m=x.getGlyph(a,h);if(m){r&&(d+=f(a,r.id,m.id));var g=d;1===b?g+=(u-l)/2:2===b&&(g+=u-l),t.push({position:[g,p],data:m,index:c,line:i}),d+=m.xadvance+y,r=m}}p+=A,d=0})),this._linesTotal=c.length},u.prototype._setupSpaceGlyphs=function(e){if(this._fallbackSpaceGlyph=null,this._fallbackTabGlyph=null,e.chars&&0!==e.chars.length){var t=p(e,h)||function(e){for(var t=0;t<a.length;t++){var n=a[t].charCodeAt(0),i=m(e.chars,n);if(i>=0)return e.chars[i]}return 0}(e)||e.chars[0],n=this._opt.tabSize*t.xadvance;this._fallbackSpaceGlyph=t,this._fallbackTabGlyph=r(t,{x:0,y:0,xadvance:n,id:c,xoffset:0,yoffset:0,width:0,height:0})}},u.prototype.getGlyph=function(e,t){return p(e,t)||(t===c?this._fallbackTabGlyph:t===h?this._fallbackSpaceGlyph:null)},u.prototype.computeMetrics=function(e,t,n,i){var r,s=this._opt.letterSpacing||0,o=this._opt.font,a=0,l=0,c=0;if(!o.chars||0===o.chars.length)return{start:t,end:t,width:0};n=Math.min(e.length,n);for(var h=t;h<n;h++){var u,d=e.charCodeAt(h);if(u=this.getGlyph(o,d)){u.xoffset;var p=(a+=r?f(o,r.id,u.id):0)+u.xadvance+s,m=a+u.width;if(m>=i||p>=i)break;a=p,l=m,r=u}c++}return r&&(l+=r.xoffset),{start:t,end:t+c,width:l}},["width","height","descender","ascender","xHeight","baseline","capHeight","lineHeight"].forEach((function(e){Object.defineProperty(u.prototype,e,{get:d(e),configurable:!0})}))},5751:(e,t,n)=>{var i=n(9922).hp,r=n(3558),s=function(){},o=n(1476),a=n(7034),l=n(7480),c=n(573),h=n(4597),u=self.XMLHttpRequest&&"withCredentials"in new XMLHttpRequest;e.exports=function(e,t){t="function"==typeof t?t:s,"string"==typeof e?e={uri:e}:e||(e={}),e.binary&&(e=function(e){if(u)return h(e,{responseType:"arraybuffer"});if(void 0===self.XMLHttpRequest)throw new Error("your browser does not support XHR loading");var t=new self.XMLHttpRequest;return t.overrideMimeType("text/plain; charset=x-user-defined"),h({xhr:t},e)}(e)),r(e,(function(n,r,h){if(n)return t(n);if(!/^2/.test(r.statusCode))return t(new Error("http status code: "+r.statusCode));if(!h)return t(new Error("no body result"));var u,d,p=!1;if(u=h,"[object ArrayBuffer]"===Object.prototype.toString.call(u)){var f=new Uint8Array(h);h=i.from(f,"binary")}c(h)&&(p=!0,"string"==typeof h&&(h=i.from(h,"binary"))),p||(i.isBuffer(h)&&(h=h.toString(e.encoding)),h=h.trim());try{var m=r.headers["content-type"];d=p?l(h):/json/.test(m)||"{"===h.charAt(0)?JSON.parse(h):/xml/.test(m)||"<"===h.charAt(0)?a(h):o(h)}catch(e){t(new Error("error parsing font "+e.message)),t=s}t(null,d)}))}},573:(e,t,n)=>{var i=n(9922).hp,r=n(911),s=i.from([66,77,70,3]);e.exports=function(e){return"string"==typeof e?"BMF"===e.substring(0,3):e.length>4&&r(e.slice(0,4),s)}},9192:e=>{var t=1e3,n=60*t,i=60*n,r=24*i,s=7*r;function o(e,t,n,i){var r=t>=1.5*n;return Math.round(e/n)+" "+i+(r?"s":"")}e.exports=function(e,a){a=a||{};var l,c,h=typeof e;if("string"===h&&e.length>0)return function(e){if(!((e=String(e)).length>100)){var o=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(e);if(o){var a=parseFloat(o[1]);switch((o[2]||"ms").toLowerCase()){case"years":case"year":case"yrs":case"yr":case"y":return 315576e5*a;case"weeks":case"week":case"w":return a*s;case"days":case"day":case"d":return a*r;case"hours":case"hour":case"hrs":case"hr":case"h":return a*i;case"minutes":case"minute":case"mins":case"min":case"m":return a*n;case"seconds":case"second":case"secs":case"sec":case"s":return a*t;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return a;default:return}}}}(e);if("number"===h&&isFinite(e))return a.long?(l=e,(c=Math.abs(l))>=r?o(l,c,r,"day"):c>=i?o(l,c,i,"hour"):c>=n?o(l,c,n,"minute"):c>=t?o(l,c,t,"second"):l+" ms"):function(e){var s=Math.abs(e);return s>=r?Math.round(e/r)+"d":s>=i?Math.round(e/i)+"h":s>=n?Math.round(e/n)+"m":s>=t?Math.round(e/t)+"s":e+"ms"}(e);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(e))}},1476:e=>{function t(e,t){if(!(e=e.replace(/\t+/g," ").trim()))return null;var i=e.indexOf(" ");if(-1===i)throw new Error("no named row at line "+t);var r=e.substring(0,i);e=(e=(e=(e=e.substring(i+1)).replace(/letter=[\'\"]\S+[\'\"]/gi,"")).split("=")).map((function(e){return e.trim().match(/(".*?"|[^"\s]+)+(?=\s*|\s*$)/g)}));for(var s=[],o=0;o<e.length;o++){var a=e[o];0===o?s.push({key:a[0],data:""}):o===e.length-1?s[s.length-1].data=n(a[0]):(s[s.length-1].data=n(a[0]),s.push({key:a[1],data:""}))}var l={key:r,data:{}};return s.forEach((function(e){l.data[e.key]=e.data})),l}function n(e){return e&&0!==e.length?0===e.indexOf('"')||0===e.indexOf("'")?e.substring(1,e.length-1):-1!==e.indexOf(",")?function(e){return e.split(",").map((function(e){return parseInt(e,10)}))}(e):parseInt(e,10):""}e.exports=function(e){if(!e)throw new Error("no data provided");var n={pages:[],chars:[],kernings:[]},i=(e=e.toString().trim()).split(/\r\n?|\n/g);if(0===i.length)throw new Error("no data in BMFont file");for(var r=0;r<i.length;r++){var s=t(i[r],r);if(s)if("page"===s.key){if("number"!=typeof s.data.id)throw new Error("malformed file at line "+r+" -- needs page id=N");if("string"!=typeof s.data.file)throw new Error("malformed file at line "+r+' -- needs page file="path"');n.pages[s.data.id]=s.data.file}else"chars"===s.key||"kernings"===s.key||("char"===s.key?n.chars.push(s.data):"kerning"===s.key?n.kernings.push(s.data):n[s.key]=s.data)}return n}},7480:e=>{var t=[66,77,70];function n(e,t,n){if(n>t.length-1)return 0;var r=t.readUInt8(n++),s=t.readInt32LE(n);switch(n+=4,r){case 1:e.info=function(e,t){var n={};n.size=e.readInt16LE(t);var r=e.readUInt8(t+2);return n.smooth=r>>7&1,n.unicode=r>>6&1,n.italic=r>>5&1,n.bold=r>>4&1,r>>3&1&&(n.fixedHeight=1),n.charset=e.readUInt8(t+3)||"",n.stretchH=e.readUInt16LE(t+4),n.aa=e.readUInt8(t+6),n.padding=[e.readInt8(t+7),e.readInt8(t+8),e.readInt8(t+9),e.readInt8(t+10)],n.spacing=[e.readInt8(t+11),e.readInt8(t+12)],n.outline=e.readUInt8(t+13),n.face=function(e,t){return i(e,t).toString("utf8")}(e,t+14),n}(t,n);break;case 2:e.common=function(e,t){var n={};return n.lineHeight=e.readUInt16LE(t),n.base=e.readUInt16LE(t+2),n.scaleW=e.readUInt16LE(t+4),n.scaleH=e.readUInt16LE(t+6),n.pages=e.readUInt16LE(t+8),e.readUInt8(t+10),n.packed=0,n.alphaChnl=e.readUInt8(t+11),n.redChnl=e.readUInt8(t+12),n.greenChnl=e.readUInt8(t+13),n.blueChnl=e.readUInt8(t+14),n}(t,n);break;case 3:e.pages=function(e,t,n){for(var r=[],s=i(e,t),o=s.length+1,a=n/o,l=0;l<a;l++)r[l]=e.slice(t,t+s.length).toString("utf8"),t+=o;return r}(t,n,s);break;case 4:e.chars=function(e,t,n){for(var i=[],r=n/20,s=0;s<r;s++){var o={},a=20*s;o.id=e.readUInt32LE(t+0+a),o.x=e.readUInt16LE(t+4+a),o.y=e.readUInt16LE(t+6+a),o.width=e.readUInt16LE(t+8+a),o.height=e.readUInt16LE(t+10+a),o.xoffset=e.readInt16LE(t+12+a),o.yoffset=e.readInt16LE(t+14+a),o.xadvance=e.readInt16LE(t+16+a),o.page=e.readUInt8(t+18+a),o.chnl=e.readUInt8(t+19+a),i[s]=o}return i}(t,n,s);break;case 5:e.kernings=function(e,t,n){for(var i=[],r=n/10,s=0;s<r;s++){var o={},a=10*s;o.first=e.readUInt32LE(t+0+a),o.second=e.readUInt32LE(t+4+a),o.amount=e.readInt16LE(t+8+a),i[s]=o}return i}(t,n,s)}return 5+s}function i(e,t){for(var n=t;n<e.length&&0!==e[n];n++);return e.slice(t,n)}e.exports=function(e){if(e.length<6)throw new Error("invalid buffer length for BMFont");var i=t.every((function(t,n){return e.readUInt8(n)===t}));if(!i)throw new Error("BMFont missing BMF byte header");var r=3;if(e.readUInt8(r++)>3)throw new Error("Only supports BMFont Binary v3 (BMFont App v1.10)");for(var s={kernings:[],chars:[]},o=0;o<5;o++)r+=n(s,e,r);return s}},7034:(e,t,n)=>{var i=n(7829),r=n(1896),s={scaleh:"scaleH",scalew:"scaleW",stretchh:"stretchH",lineheight:"lineHeight",alphachnl:"alphaChnl",redchnl:"redChnl",greenchnl:"greenChnl",bluechnl:"blueChnl"};function o(e){var t=function(e){for(var t=[],n=0;n<e.attributes.length;n++)t.push(e.attributes[n]);return t}(e);return t.reduce((function(e,t){var n;return e[(n=t.nodeName,s[n.toLowerCase()]||n)]=t.nodeValue,e}),{})}e.exports=function(e){e=e.toString();var t=r(e),n={pages:[],chars:[],kernings:[]};["info","common"].forEach((function(e){var r=t.getElementsByTagName(e)[0];r&&(n[e]=i(o(r)))}));var s=t.getElementsByTagName("pages")[0];if(!s)throw new Error("malformed file -- no <pages> element");for(var a=s.getElementsByTagName("page"),l=0;l<a.length;l++){var c=a[l],h=parseInt(c.getAttribute("id"),10),u=c.getAttribute("file");if(isNaN(h))throw new Error('malformed file -- page "id" attribute is NaN');if(!u)throw new Error('malformed file -- needs page "file" attribute');n.pages[parseInt(h,10)]=u}return["chars","kernings"].forEach((function(e){var r=t.getElementsByTagName(e)[0];if(r)for(var s=e.substring(0,e.length-1),a=r.getElementsByTagName(s),l=0;l<a.length;l++){var c=a[l];n[e].push(i(o(c)))}})),n}},7829:e=>{var t="chasrset";e.exports=function(e){for(var n in e=Object.assign({},e),t in e&&(e.charset=e[t],delete e[t]),e)"face"!==n&&"charset"!==n&&(e[n]="padding"===n||"spacing"===n?e[n].split(",").map((function(e){return parseInt(e,10)})):parseInt(e[n],10));return e}},3216:e=>{var t=function(e){return e.replace(/^\s+|\s+$/g,"")};e.exports=function(e){if(!e)return{};for(var n,i={},r=t(e).split("\n"),s=0;s<r.length;s++){var o=r[s],a=o.indexOf(":"),l=t(o.slice(0,a)).toLowerCase(),c=t(o.slice(a+1));void 0===i[l]?i[l]=c:(n=i[l],"[object Array]"===Object.prototype.toString.call(n)?i[l].push(c):i[l]=[i[l],c])}return i}},9035:(e,t,n)=>{var i=n(8480),r=n(8167),s=n(2225),o=[0,2,3],a=[2,1,3];e.exports=function(e,t){e&&(r(e)||s(e))||(t=e||{},e=null);for(var n="string"==typeof(t="number"==typeof t?{count:t}:t||{}).type?t.type:"uint16",l="number"==typeof t.count?t.count:1,c=t.start||0,h=!1!==t.clockwise?o:a,u=h[0],d=h[1],p=h[2],f=6*l,m=e||new(i(n))(f),A=0,g=0;A<f;A+=6,g+=4){var v=A+c;m[v+0]=g+0,m[v+1]=g+1,m[v+2]=g+2,m[v+3]=g+u,m[v+4]=g+d,m[v+5]=g+p}return m}},4433:(e,t,n)=>{var i=n(5651),r=n(9035),s=n(7106),o=n(1684);e.exports=function(e){return new a(e)};class a extends THREE.BufferGeometry{constructor(e){super(),"string"==typeof e&&(e={text:e}),this._opt=Object.assign({},e),e&&this.update(e)}update(e){if("string"==typeof e&&(e={text:e}),!(e=Object.assign({},this._opt,e)).font)throw new TypeError("must specify a { font } in options");this.layout=i(e);var t=!1!==e.flipY,n=e.font,o=n.common.scaleW,a=n.common.scaleH,l=this.layout.glyphs.filter((function(e){var t=e.data;return t.width*t.height>0}));this.visibleGlyphs=l;var c=s.positions(l),h=s.uvs(l,o,a,t),u=r([],{clockwise:!0,type:"uint16",count:l.length});if(this.setIndex(u),this.setAttribute("position",new THREE.BufferAttribute(c,2)),this.setAttribute("uv",new THREE.BufferAttribute(h,2)),!e.multipage&&"page"in this.attributes)this.removeAttribute("page");else if(e.multipage){var d=s.pages(l);this.setAttribute("page",new THREE.BufferAttribute(d,1))}null!==this.boundingBox&&this.computeBoundingBox(),null!==this.boundingSphere&&this.computeBoundingSphere()}computeBoundingSphere(){null===this.boundingSphere&&(this.boundingSphere=new THREE.Sphere);var e=this.attributes.position.array,t=this.attributes.position.itemSize;if(!e||!t||e.length<2)return this.boundingSphere.radius=0,void this.boundingSphere.center.set(0,0,0);o.computeSphere(e,this.boundingSphere),isNaN(this.boundingSphere.radius)&&console.error('THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The "position" attribute is likely to have NaN values.')}computeBoundingBox(){null===this.boundingBox&&(this.boundingBox=new THREE.Box3);var e=this.boundingBox,t=this.attributes.position.array,n=this.attributes.position.itemSize;!t||!n||t.length<2?e.makeEmpty():o.computeBox(t,e)}}},1684:e=>{var t={min:[0,0],max:[0,0]};function n(e){var n=e.length/2;t.min[0]=e[0],t.min[1]=e[1],t.max[0]=e[0],t.max[1]=e[1];for(var i=0;i<n;i++){var r=e[2*i+0],s=e[2*i+1];t.min[0]=Math.min(r,t.min[0]),t.min[1]=Math.min(s,t.min[1]),t.max[0]=Math.max(r,t.max[0]),t.max[1]=Math.max(s,t.max[1])}}e.exports.computeBox=function(e,i){n(e),i.min.set(t.min[0],t.min[1],0),i.max.set(t.max[0],t.max[1],0)},e.exports.computeSphere=function(e,i){n(e);var r=t.min[0],s=t.min[1],o=t.max[0]-r,a=t.max[1]-s,l=Math.sqrt(o*o+a*a);i.center.set(r+o/2,s+a/2,0),i.radius=l/2}},7106:e=>{e.exports.pages=function(e){var t=new Float32Array(4*e.length*1),n=0;return e.forEach((function(e){var i=e.data.page||0;t[n++]=i,t[n++]=i,t[n++]=i,t[n++]=i})),t},e.exports.uvs=function(e,t,n,i){var r=new Float32Array(4*e.length*2),s=0;return e.forEach((function(e){var o=e.data,a=o.x+o.width,l=o.y+o.height,c=o.x/t,h=o.y/n,u=a/t,d=l/n;i&&(h=(n-o.y)/n,d=(n-l)/n),r[s++]=c,r[s++]=h,r[s++]=c,r[s++]=d,r[s++]=u,r[s++]=d,r[s++]=u,r[s++]=h})),r},e.exports.positions=function(e){var t=new Float32Array(4*e.length*2),n=0;return e.forEach((function(e){var i=e.data,r=e.position[0]+i.xoffset,s=e.position[1]+i.yoffset,o=i.width,a=i.height;t[n++]=r,t[n++]=s,t[n++]=r,t[n++]=s+a,t[n++]=r+o,t[n++]=s+a,t[n++]=r+o,t[n++]=s})),t}},5406:e=>{var t=/\n/,n=/\s/;function i(e,t,n,i){var r=e.indexOf(t,n);return-1===r||r>i?i:r}function r(e){return n.test(e)}function s(e,t,n,i){return{start:t,end:t+Math.min(i,n-t)}}e.exports=function(t,n){return e.exports.lines(t,n).map((function(e){return t.substring(e.start,e.end)})).join("\n")},e.exports.lines=function(e,n){if(0===(n=n||{}).width&&"nowrap"!==n.mode)return[];e=e||"";var o="number"==typeof n.width?n.width:Number.MAX_VALUE,a=Math.max(0,n.start||0),l="number"==typeof n.end?n.end:e.length,c=n.mode,h=n.measure||s;return"pre"===c?function(e,n,i,r,s){for(var o=[],a=i,l=i;l<r&&l<n.length;l++){var c=n.charAt(l),h=t.test(c);if(h||l===r-1){var u=e(n,a,h?l:l+1,s);o.push(u),a=l+1}}return o}(h,e,a,l,o):function(e,t,n,s,o,a){var l=[],c=o;for("nowrap"===a&&(c=Number.MAX_VALUE);n<s&&n<t.length;){for(var h=i(t,"\n",n,s);n<h&&r(t.charAt(n));)n++;var u=e(t,n,h,c),d=n+(u.end-u.start),p=d+1;if(d<h){for(;d>n&&!r(t.charAt(d));)d--;if(d===n)p>n+1&&p--,d=p;else for(p=d;d>n&&r(t.charAt(d-1));)d--}if(d>=n){var f=e(t,n,d,c);l.push(f)}n=p}return l}(h,e,a,l,o,c)}},3558:(e,t,n)=>{"use strict";var i=n(919),r=n(8847),s=n(3216),o=n(4597);function a(e,t,n){var i=e;return r(t)?(n=t,"string"==typeof e&&(i={uri:e})):i=o(t,{uri:e}),i.callback=n,i}function l(e,t,n){return c(t=a(e,t,n))}function c(e){if(void 0===e.callback)throw new Error("callback argument missing");var t=!1,n=function(n,i,r){t||(t=!0,e.callback(n,i,r))};function i(){var e=void 0;if(e=h.response?h.response:h.responseText||function(e){try{if("document"===e.responseType)return e.responseXML;var t=e.responseXML&&"parsererror"===e.responseXML.documentElement.nodeName;if(""===e.responseType&&!t)return e.responseXML}catch(e){}return null}(h),g)try{e=JSON.parse(e)}catch(e){}return e}function r(e){return clearTimeout(u),e instanceof Error||(e=new Error(""+(e||"Unknown XMLHttpRequest Error"))),e.statusCode=0,n(e,v)}function o(){if(!c){var t;clearTimeout(u),t=e.useXDR&&void 0===h.status?200:1223===h.status?204:h.status;var r=v,o=null;return 0!==t?(r={body:i(),statusCode:t,method:p,headers:{},url:d,rawRequest:h},h.getAllResponseHeaders&&(r.headers=s(h.getAllResponseHeaders()))):o=new Error("Internal XMLHttpRequest Error"),n(o,r,r.body)}}var a,c,h=e.xhr||null;h||(h=e.cors||e.useXDR?new l.XDomainRequest:new l.XMLHttpRequest);var u,d=h.url=e.uri||e.url,p=h.method=e.method||"GET",f=e.body||e.data,m=h.headers=e.headers||{},A=!!e.sync,g=!1,v={body:void 0,headers:{},statusCode:0,method:p,url:d,rawRequest:h};if("json"in e&&!1!==e.json&&(g=!0,m.accept||m.Accept||(m.Accept="application/json"),"GET"!==p&&"HEAD"!==p&&(m["content-type"]||m["Content-Type"]||(m["Content-Type"]="application/json"),f=JSON.stringify(!0===e.json?f:e.json))),h.onreadystatechange=function(){4===h.readyState&&setTimeout(o,0)},h.onload=o,h.onerror=r,h.onprogress=function(){},h.onabort=function(){c=!0},h.ontimeout=r,h.open(p,d,!A,e.username,e.password),A||(h.withCredentials=!!e.withCredentials),!A&&e.timeout>0&&(u=setTimeout((function(){if(!c){c=!0,h.abort("timeout");var e=new Error("XMLHttpRequest timeout");e.code="ETIMEDOUT",r(e)}}),e.timeout)),h.setRequestHeader)for(a in m)m.hasOwnProperty(a)&&h.setRequestHeader(a,m[a]);else if(e.headers&&!function(e){for(var t in e)if(e.hasOwnProperty(t))return!1;return!0}(e.headers))throw new Error("Headers cannot be set on an XDomainRequest object");return"responseType"in e&&(h.responseType=e.responseType),"beforeSend"in e&&"function"==typeof e.beforeSend&&e.beforeSend(h),h.send(f||null),h}e.exports=l,e.exports.default=l,l.XMLHttpRequest=i.XMLHttpRequest||function(){},l.XDomainRequest="withCredentials"in new l.XMLHttpRequest?l.XMLHttpRequest:i.XDomainRequest,function(e,t){for(var n=0;n<e.length;n++)t(e[n])}(["get","put","post","patch","head","delete"],(function(e){l["delete"===e?"del":e]=function(t,n,i){return(n=a(t,n,i)).method=e.toUpperCase(),c(n)}}))},1896:e=>{e.exports=void 0!==self.DOMParser?function(e){return(new self.DOMParser).parseFromString(e,"application/xml")}:void 0!==self.ActiveXObject&&new self.ActiveXObject("Microsoft.XMLDOM")?function(e){var t=new self.ActiveXObject("Microsoft.XMLDOM");return t.async="false",t.loadXML(e),t}:function(e){var t=document.createElement("div");return t.innerHTML=e,t}},4597:e=>{e.exports=function(){for(var e={},n=0;n<arguments.length;n++){var i=arguments[n];for(var r in i)t.call(i,r)&&(e[r]=i[r])}return e};var t=Object.prototype.hasOwnProperty},8132:()=>{window.aframeStats=function(e){var t=null,n=e;return{update:function(){var e;t("te").set((e=n.querySelectorAll("*"),Array.prototype.slice.call(e).filter((function(e){return e.isEntity})),e.length)),window.performance.getEntriesByName&&t("lt").set(window.performance.getEntriesByName("render-started")[0].startTime.toFixed(0))},start:function(){},end:function(){},attach:function(e){t=e},values:{te:{caption:"Entities"},lt:{caption:"Load Time"}},groups:[{caption:"A-Frame",values:["te","lt"]}],fractions:[]}}},3729:e=>{window.glStats=function(){var e=null,t=0,n=0,i=0,r=0,s=0,o=0,a=0;function l(e,t){return function(){t.apply(this,arguments),e.apply(this,arguments)}}return WebGLRenderingContext.prototype.drawArrays=l(WebGLRenderingContext.prototype.drawArrays,(function(){t++,arguments[0]==this.POINTS?o+=arguments[2]:s+=arguments[2]})),WebGLRenderingContext.prototype.drawElements=l(WebGLRenderingContext.prototype.drawElements,(function(){n++,r+=arguments[1]/3,s+=arguments[1]})),WebGLRenderingContext.prototype.useProgram=l(WebGLRenderingContext.prototype.useProgram,(function(){i++})),WebGLRenderingContext.prototype.bindTexture=l(WebGLRenderingContext.prototype.bindTexture,(function(){a++})),{update:function(){e("allcalls").set(t+n),e("drawElements").set(n),e("drawArrays").set(t),e("bindTexture").set(a),e("useProgram").set(i),e("glfaces").set(r),e("glvertices").set(s),e("glpoints").set(o)},start:function(){t=0,n=0,i=0,r=0,s=0,o=0,a=0},end:function(){},attach:function(t){e=t},values:{allcalls:{over:3e3,caption:"Calls (hook)"},drawelements:{caption:"drawElements (hook)"},drawarrays:{caption:"drawArrays (hook)"}},groups:[{caption:"WebGL",values:["allcalls","drawelements","drawarrays","useprogram","bindtexture","glfaces","glvertices","glpoints"]}],fractions:[{base:"allcalls",steps:["drawelements","drawarrays"]}]}},window.threeStats=function(e){var t=null;return{update:function(){t("renderer.info.memory.geometries").set(e.info.memory.geometries),t("renderer.info.programs").set(e.info.programs.length),t("renderer.info.memory.textures").set(e.info.memory.textures),t("renderer.info.render.calls").set(e.info.render.calls),t("renderer.info.render.triangles").set(e.info.render.triangles),t("renderer.info.render.points").set(e.info.render.points)},start:function(){},end:function(){},attach:function(e){t=e},values:{"renderer.info.memory.geometries":{caption:"Geometries"},"renderer.info.memory.textures":{caption:"Textures"},"renderer.info.programs":{caption:"Programs"},"renderer.info.render.calls":{caption:"Calls"},"renderer.info.render.triangles":{caption:"Triangles",over:1e3},"renderer.info.render.points":{caption:"Points"}},groups:[{caption:"Three.js - Memory",values:["renderer.info.memory.geometries","renderer.info.programs","renderer.info.memory.textures"]},{caption:"Three.js - Render",values:["renderer.info.render.calls","renderer.info.render.triangles","renderer.info.render.points"]}],fractions:[]}},window.BrowserStats=function(){var e=null,t=0,n=0;window.performance&&!performance.memory&&(performance.memory={usedJSHeapSize:0,totalJSHeapSize:0}),0===performance.memory.totalJSHeapSize&&console.warn("totalJSHeapSize === 0... performance.memory is only available in Chrome .");var i=Math.log(1024);function r(e){var t=Math.floor(Math.log(e)/i);return Math.round(100*e/Math.pow(1024,t))/100}return{update:function(){t=r(performance.memory.usedJSHeapSize),n=r(performance.memory.totalJSHeapSize),e("memory").set(t),e("total").set(n)},start:function(){t=0},end:function(){},attach:function(t){e=t},values:{memory:{caption:"Used Memory",average:!0,avgMs:1e3,over:22},total:{caption:"Total Memory"}},groups:[{caption:"Browser",values:["memory","total"]}],fractions:[{base:"total",steps:["memory"]}]}},e.exports={glStats:window.glStats,threeStats:window.threeStats,BrowserStats:window.BrowserStats}},282:e=>{"use strict";!function(){"performance"in window==0&&(window.performance={});var e=window.performance;if("now"in e==0){var t=Date.now();e.timing&&e.timing.navigationStart&&(t=e.timing.navigationStart),e.now=function(){return Date.now()-t}}e.mark||(e.mark=function(){}),e.measure||(e.measure=function(){})}(),window.rStats=function(e){function t(e,t){for(var n=Object.keys(e),i=0,r=n.length;i<r;i++)t(n[i])}var n=e||{},i=n.colours||["#850700","#c74900","#fcb300","#284280","#4c7c0c"],r=(n.CSSPath?n.CSSPath:"")+"rStats.css";(n.css||["https://fonts.googleapis.com/css?family=Roboto+Condensed:400,700,300",r]).forEach((function(e){var t,n;t=e,(n=document.createElement("link")).href=t,n.rel="stylesheet",n.type="text/css",document.getElementsByTagName("head")[0].appendChild(n)})),n.values||(n.values={});var s,o,a=10,l={};function c(e,t,n){var i=n||{},r=document.createElement("canvas"),s=r.getContext("2d"),o=0,l=0,c=i.color?i.color:"#666666",h=document.createElement("canvas"),u=h.getContext("2d");h.width=1,h.height=20,u.fillStyle="#444444",u.fillRect(0,0,1,20),u.fillStyle=c,u.fillRect(0,a,1,a),u.fillStyle="#ffffff",u.globalAlpha=.5,u.fillRect(0,a,1,1),u.globalAlpha=1;var d=document.createElement("canvas"),p=d.getContext("2d");return d.width=1,d.height=20,p.fillStyle="#444444",p.fillRect(0,0,1,20),p.fillStyle="#b70000",p.fillRect(0,a,1,a),p.globalAlpha=.5,p.fillStyle="#ffffff",p.fillRect(0,a,1,1),p.globalAlpha=1,r.width=200,r.height=a,r.style.width=r.width+"px",r.style.height=r.height+"px",r.className="rs-canvas",e.appendChild(r),s.fillStyle="#444444",s.fillRect(0,0,r.width,r.height),{draw:function(e,t){(l+=.1*(e-l))>(o*=.99)&&(o=l),s.drawImage(r,1,0,r.width-1,r.height,0,0,r.width-1,r.height),t?s.drawImage(d,r.width-1,r.height-l*r.height/o-a):s.drawImage(h,r.width-1,r.height-l*r.height/o-a)}}}function h(e,n){var r=document.createElement("canvas"),s=r.getContext("2d");return r.width=200,r.height=a*n,r.style.width=r.width+"px",r.style.height=r.height+"px",r.className="rs-canvas",e.appendChild(r),s.fillStyle="#444444",s.fillRect(0,0,r.width,r.height),{draw:function(e){s.drawImage(r,1,0,r.width-1,r.height,0,0,r.width-1,r.height);var n=0;t(e,(function(t){var o=e[t]*r.height;s.fillStyle=i[t],s.fillRect(r.width-1,n,1,o),n+=o}))}}}function u(e,t){var i,r=e,s=0,a=0,l=0,h=0,u=performance.now(),d=0,p=document.createElement("div"),f=document.createElement("span"),m=document.createElement("div"),A=document.createTextNode(""),g=n?n.values[r.toLowerCase()]:null,v=new c(p,r,g),y=!1;function E(e){if(g&&g.average){h+=e,d++;var t=performance.now();t-u>=(g.avgMs||1e3)&&(l=h/d,h=0,u=t,d=0)}}function b(){i=performance.now(),n.userTimingAPI&&performance.mark(r+"-start"),y=!0}function x(){s=performance.now()-i,n.userTimingAPI&&(performance.mark(r+"-end"),y&&performance.measure(r,r+"-start",r+"-end")),E(s)}return f.className="rs-counter-id",f.textContent=g&&g.caption?g.caption:r,m.className="rs-counter-value",m.appendChild(A),p.appendChild(f),p.appendChild(m),t?t.div.appendChild(p):o.appendChild(p),i=performance.now(),{set:function(e){E(s=e)},start:b,tick:function(){x(),b()},end:x,frame:function(){var e=performance.now(),t=e-i;a++,t>1e3&&(s=g&&!1===g.interpolate?a:1e3*a/t,a=0,i=e,E(s))},value:function(){return s},draw:function(){var e=g&&g.average?l:s;A.nodeValue=Math.round(100*e)/100;var t=g&&(g.below&&s<g.below||g.over&&s>g.over);v.draw(s,t),p.className=t?"rs-counter-base alarm":"rs-counter-base"}}}function d(e){var i=e.toLowerCase();if(void 0===i&&(i="default"),l[i])return l[i];var r=null;n&&n.groups&&t(n.groups,(function(e){var t=n.groups[parseInt(e,10)];r||-1===t.values.indexOf(i.toLowerCase())||(r=t)}));var s=new u(i,r);return l[i]=s,s}function p(){t(n.plugins,(function(e){n.plugins[e].update()})),t(l,(function(e){l[e].draw()})),n&&n.fractions&&t(n.fractions,(function(e){var i=n.fractions[parseInt(e,10)],r=[],s=l[i.base.toLowerCase()];s&&(s=s.value(),t(n.fractions[e].steps,(function(t){var i=n.fractions[e].steps[parseInt(t,10)].toLowerCase(),o=l[i];o&&r.push(o.value()/s)}))),i.graph.draw(r)}))}return function(){if(n.plugins){n.values||(n.values={}),n.groups||(n.groups=[]),n.fractions||(n.fractions=[]);for(var e=0;e<n.plugins.length;e++)n.plugins[e].attach(d),t(n.plugins[e].values,(function(t){n.values[t]=n.plugins[e].values[t]})),n.groups=n.groups.concat(n.plugins[e].groups),n.fractions=n.fractions.concat(n.plugins[e].fractions)}else n.plugins={};(s=document.createElement("div")).className="rs-base",(o=document.createElement("div")).className="rs-container",o.style.height="auto",s.appendChild(o),document.body.appendChild(s),n&&(n.groups&&t(n.groups,(function(e){var t=n.groups[parseInt(e,10)],i=document.createElement("div");i.className="rs-group",t.div=i;var r=document.createElement("h1");r.textContent=t.caption,r.addEventListener("click",function(e){this.classList.toggle("hidden"),e.preventDefault()}.bind(i)),o.appendChild(r),o.appendChild(i)})),n.fractions&&t(n.fractions,(function(e){var r=n.fractions[parseInt(e,10)],s=document.createElement("div");s.className="rs-fraction";var l=document.createElement("div");l.className="rs-legend";var c=0;t(n.fractions[e].steps,(function(t){var r=document.createElement("p");r.textContent=n.fractions[e].steps[t],r.style.color=i[c],l.appendChild(r),c++})),s.appendChild(l),s.style.height=c*a+"px",r.div=s;var u=new h(s,c);r.graph=u,o.appendChild(s)})))}(),function(e){return e?d(e):{element:s,update:p}}},e.exports=window.rStats},2535:e=>{var t={base64:function(e,t){return"data:"+e+";base64,"+t},isMobile:function(){var e,t=!1;return e=navigator.userAgent||navigator.vendor||window.opera,(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(e)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(e.substr(0,4)))&&(t=!0),t},isIOS:function(){return/(iPad|iPhone|iPod)/g.test(navigator.userAgent)},isIFrame:function(){try{return window.self!==window.top}catch(e){return!0}},appendQueryParameter:function(e,t,n){var i=e.indexOf("?")<0?"?":"&";return e+(i+t+"=")+n},getQueryParameter:function(e){e=e.replace(/[\[]/,"\\[").replace(/[\]]/,"\\]");var t=new RegExp("[\\?&]"+e+"=([^&#]*)").exec(location.search);return null===t?"":decodeURIComponent(t[1].replace(/\+/g," "))},isLandscapeMode:function(){return 90==window.orientation||-90==window.orientation}};e.exports=t},5928:(e,t,n)=>{var i,r=n(2535);e.exports=(i=navigator.userAgent||navigator.vendor||window.opera).match(/iPhone/i)||i.match(/iPod/i)?function(){var e=null;this.request=function(){e||(e=setInterval((function(){window.location.href="/",setTimeout(window.stop,0)}),15e3))},this.release=function(){e&&(clearInterval(e),e=null)}}:function(){var e=document.createElement("video");e.addEventListener("ended",(function(){e.play()})),this.request=function(){e.paused&&(e.src=r.base64("video/webm","GkXfowEAAAAAAAAfQoaBAUL3gQFC8oEEQvOBCEKChHdlYm1Ch4ECQoWBAhhTgGcBAAAAAAAH4xFNm3RALE27i1OrhBVJqWZTrIHfTbuMU6uEFlSua1OsggEwTbuMU6uEHFO7a1OsggfG7AEAAAAAAACkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVSalmAQAAAAAAAEUq17GDD0JATYCNTGF2ZjU2LjQwLjEwMVdBjUxhdmY1Ni40MC4xMDFzpJAGSJTMbsLpDt/ySkipgX1fRImIQO1MAAAAAAAWVK5rAQAAAAAAADuuAQAAAAAAADLXgQFzxYEBnIEAIrWcg3VuZIaFVl9WUDmDgQEj44OEO5rKAOABAAAAAAAABrCBsLqBkB9DtnUBAAAAAAAAo+eBAKOmgQAAgKJJg0IAAV4BHsAHBIODCoAACmH2MAAAZxgz4dPSTFi5JACjloED6ACmAECSnABMQAADYAAAWi0quoCjloEH0ACmAECSnABNwAADYAAAWi0quoCjloELuACmAECSnABNgAADYAAAWi0quoCjloEPoACmAECSnABNYAADYAAAWi0quoCjloETiACmAECSnABNIAADYAAAWi0quoAfQ7Z1AQAAAAAAAJTnghdwo5aBAAAApgBAkpwATOAAA2AAAFotKrqAo5aBA+gApgBAkpwATMAAA2AAAFotKrqAo5aBB9AApgBAkpwATIAAA2AAAFotKrqAo5aBC7gApgBAkpwATEAAA2AAAFotKrqAo5aBD6AApgDAkpwAQ2AAA2AAAFotKrqAo5aBE4gApgBAkpwATCAAA2AAAFotKrqAH0O2dQEAAAAAAACU54Iu4KOWgQAAAKYAQJKcAEvAAANgAABaLSq6gKOWgQPoAKYAQJKcAEtgAANgAABaLSq6gKOWgQfQAKYAQJKcAEsAAANgAABaLSq6gKOWgQu4AKYAQJKcAEqAAANgAABaLSq6gKOWgQ+gAKYAQJKcAEogAANgAABaLSq6gKOWgROIAKYAQJKcAEnAAANgAABaLSq6gB9DtnUBAAAAAAAAlOeCRlCjloEAAACmAECSnABJgAADYAAAWi0quoCjloED6ACmAECSnABJIAADYAAAWi0quoCjloEH0ACmAMCSnABDYAADYAAAWi0quoCjloELuACmAECSnABI4AADYAAAWi0quoCjloEPoACmAECSnABIoAADYAAAWi0quoCjloETiACmAECSnABIYAADYAAAWi0quoAfQ7Z1AQAAAAAAAJTngl3Ao5aBAAAApgBAkpwASCAAA2AAAFotKrqAo5aBA+gApgBAkpwASAAAA2AAAFotKrqAo5aBB9AApgBAkpwAR8AAA2AAAFotKrqAo5aBC7gApgBAkpwAR4AAA2AAAFotKrqAo5aBD6AApgBAkpwAR2AAA2AAAFotKrqAo5aBE4gApgBAkpwARyAAA2AAAFotKrqAH0O2dQEAAAAAAACU54J1MKOWgQAAAKYAwJKcAENgAANgAABaLSq6gKOWgQPoAKYAQJKcAEbgAANgAABaLSq6gKOWgQfQAKYAQJKcAEagAANgAABaLSq6gKOWgQu4AKYAQJKcAEaAAANgAABaLSq6gKOWgQ+gAKYAQJKcAEZAAANgAABaLSq6gKOWgROIAKYAQJKcAEYAAANgAABaLSq6gB9DtnUBAAAAAAAAlOeCjKCjloEAAACmAECSnABF4AADYAAAWi0quoCjloED6ACmAECSnABFwAADYAAAWi0quoCjloEH0ACmAECSnABFoAADYAAAWi0quoCjloELuACmAECSnABFgAADYAAAWi0quoCjloEPoACmAMCSnABDYAADYAAAWi0quoCjloETiACmAECSnABFYAADYAAAWi0quoAfQ7Z1AQAAAAAAAJTngqQQo5aBAAAApgBAkpwARUAAA2AAAFotKrqAo5aBA+gApgBAkpwARSAAA2AAAFotKrqAo5aBB9AApgBAkpwARQAAA2AAAFotKrqAo5aBC7gApgBAkpwARQAAA2AAAFotKrqAo5aBD6AApgBAkpwAROAAA2AAAFotKrqAo5aBE4gApgBAkpwARMAAA2AAAFotKrqAH0O2dQEAAAAAAACU54K7gKOWgQAAAKYAQJKcAESgAANgAABaLSq6gKOWgQPoAKYAQJKcAESAAANgAABaLSq6gKOWgQfQAKYAwJKcAENgAANgAABaLSq6gKOWgQu4AKYAQJKcAERgAANgAABaLSq6gKOWgQ+gAKYAQJKcAERAAANgAABaLSq6gKOWgROIAKYAQJKcAEQgAANgAABaLSq6gB9DtnUBAAAAAAAAlOeC0vCjloEAAACmAECSnABEIAADYAAAWi0quoCjloED6ACmAECSnABEAAADYAAAWi0quoCjloEH0ACmAECSnABD4AADYAAAWi0quoCjloELuACmAECSnABDwAADYAAAWi0quoCjloEPoACmAECSnABDoAADYAAAWi0quoCjloETiACmAECSnABDgAADYAAAWi0quoAcU7trAQAAAAAAABG7j7OBALeK94EB8YIBd/CBAw=="),e.play())},this.release=function(){e.pause(),e.src=""}}},8217:(e,t,n)=>{"use strict";n.d(t,{A:()=>E});var i=n(963),r=n.n(i),s=n(9089),o=n.n(s),a=n(6492),l=n.n(a),c=new URL(n(9169),n.b),h=new URL(n(6085),n.b),u=new URL(n(3931),n.b),d=new URL(n(7889),n.b),p=new URL(n(6517),n.b),f=o()(r()),m=l()(c),A=l()(h),g=l()(u),v=l()(d),y=l()(p);f.push([e.id,`/* .a-fullscreen means not embedded. */\nhtml.a-fullscreen {\n  bottom: 0;\n  left: 0;\n  position: fixed;\n  right: 0;\n  top: 0;\n}\n\nhtml.a-fullscreen body {\n  height: 100%;\n  margin: 0;\n  overflow: hidden;\n  padding: 0;\n  width: 100%;\n}\n\n/* Class is removed when doing <a-scene embedded>. */\nhtml.a-fullscreen .a-canvas {\n  width: 100% !important;\n  height: 100% !important;\n  top: 0 !important;\n  left: 0 !important;\n  right: 0 !important;\n  bottom: 0 !important;\n  position: fixed !important;\n}\n\nhtml:not(.a-fullscreen) .a-enter-vr,\nhtml:not(.a-fullscreen) .a-enter-ar {\n  right: 5px;\n  bottom: 5px;\n}\n\nhtml:not(.a-fullscreen) .a-enter-ar {\n  right: 60px;\n}\n\n/* In chrome mobile the user agent stylesheet set it to white  */\n:-webkit-full-screen {\n  background-color: transparent;\n}\n\n.a-hidden {\n  display: none !important;\n}\n\n.a-canvas {\n  height: 100%;\n  left: 0;\n  position: absolute;\n  top: 0;\n  width: 100%;\n}\n\n.a-canvas.a-grab-cursor:hover {\n  cursor: grab;\n  cursor: -moz-grab;\n  cursor: -webkit-grab;\n}\n\ncanvas.a-canvas.a-mouse-cursor-hover:hover {\n  cursor: pointer;\n}\n\n.a-inspector-loader {\n  background-color: #ed3160;\n  position: fixed;\n  left: 3px;\n  top: 3px;\n  padding: 6px 10px;\n  color: #fff;\n  text-decoration: none;\n  font-size: 12px;\n  font-family: Roboto,sans-serif;\n  text-align: center;\n  z-index: 99999;\n  width: 204px;\n}\n\n/* Inspector loader animation */\n@keyframes dots-1 { from { opacity: 0; } 25% { opacity: 1; } }\n@keyframes dots-2 { from { opacity: 0; } 50% { opacity: 1; } }\n@keyframes dots-3 { from { opacity: 0; } 75% { opacity: 1; } }\n@-webkit-keyframes dots-1 { from { opacity: 0; } 25% { opacity: 1; } }\n@-webkit-keyframes dots-2 { from { opacity: 0; } 50% { opacity: 1; } }\n@-webkit-keyframes dots-3 { from { opacity: 0; } 75% { opacity: 1; } }\n\n.a-inspector-loader .dots span {\n  animation: dots-1 2s infinite steps(1);\n  -webkit-animation: dots-1 2s infinite steps(1);\n}\n\n.a-inspector-loader .dots span:first-child + span {\n  animation-name: dots-2;\n  -webkit-animation-name: dots-2;\n}\n\n.a-inspector-loader .dots span:first-child + span + span {\n  animation-name: dots-3;\n  -webkit-animation-name: dots-3;\n}\n\na-scene {\n  display: block;\n  position: relative;\n  height: 100%;\n  width: 100%;\n}\n\na-assets,\na-scene video,\na-scene img,\na-scene audio {\n  display: none;\n}\n\n.a-enter-vr-modal,\n.a-orientation-modal {\n  font-family: Consolas, Andale Mono, Courier New, monospace;\n}\n\n.a-enter-vr-modal a {\n  border-bottom: 1px solid #fff;\n  padding: 2px 0;\n  text-decoration: none;\n  transition: .1s color ease-in;\n}\n\n.a-enter-vr-modal a:hover {\n  background-color: #fff;\n  color: #111;\n  padding: 2px 4px;\n  position: relative;\n  left: -4px;\n}\n\n.a-enter-vr,\n.a-enter-ar {\n  font-family: sans-serif, monospace;\n  font-size: 13px;\n  width: 100%;\n  font-weight: 200;\n  line-height: 16px;\n  position: absolute;\n  right: 20px;\n  bottom: 20px;\n}\n\n.a-enter-ar.xr {\n  right: 90px;\n}\n\n.a-enter-vr-button,\n.a-enter-vr-modal,\n.a-enter-vr-modal a {\n  color: #fff;\n  user-select: none;\n  outline: none;\n}\n\n.a-enter-vr-button {\n  background: rgba(0, 0, 0, 0.35) url(${m}) 50% 50% no-repeat;\n}\n\n.a-enter-ar-button {\n  background: rgba(0, 0, 0, 0.20) url(${A}) 50% 50% no-repeat;\n}\n\n.a-enter-vr.fullscreen .a-enter-vr-button {\n  background-image: url(${g});\n}\n\n.a-enter-vr-button,\n.a-enter-ar-button {\n  background-size: 90% 90%;\n  border: 0;\n  bottom: 0;\n  cursor: pointer;\n  min-width: 58px;\n  min-height: 34px;\n  /* 1.74418604651 */\n  /*\n    In order to keep the aspect ratio when resizing\n    padding-top percentages are relative to the containing block's width.\n    http://stackoverflow.com/questions/12121090/responsively-change-div-size-keeping-aspect-ratio\n  */\n  padding-right: 0;\n  padding-top: 0;\n  position: absolute;\n  right: 0;\n  transition: background-color .05s ease;\n  -webkit-transition: background-color .05s ease;\n  z-index: 9999;\n  border-radius: 8px;\n  touch-action: manipulation; /* Prevent iOS double tap zoom on the button */\n}\n\n.a-enter-ar-button {\n  background-size: 100% 90%;\n  border-radius: 7px;\n}\n\n.a-enter-ar-button:active,\n.a-enter-ar-button:hover,\n.a-enter-vr-button:active,\n.a-enter-vr-button:hover {\n  background-color: #ef2d5e;\n}\n\n.a-enter-vr-button.resethover {\n  background-color: rgba(0, 0, 0, 0.35);\n}\n\n.a-enter-vr-modal {\n  background-color: #666;\n  border-radius: 0;\n  display: none;\n  min-height: 32px;\n  margin-right: 70px;\n  padding: 9px;\n  width: 280px;\n  right: 2%;\n  position: absolute;\n}\n\n.a-enter-vr-modal:after {\n  border-bottom: 10px solid transparent;\n  border-left: 10px solid #666;\n  border-top: 10px solid transparent;\n  display: inline-block;\n  content: '';\n  position: absolute;\n  right: -5px;\n  top: 5px;\n  width: 0;\n  height: 0;\n}\n\n.a-enter-vr-modal p,\n.a-enter-vr-modal a {\n  display: inline;\n}\n\n.a-enter-vr-modal p {\n  margin: 0;\n}\n\n.a-enter-vr-modal p:after {\n  content: ' ';\n}\n\n.a-orientation-modal {\n  background: rgba(244, 244, 244, 1) url(${v}) center no-repeat;\n  background-size: 50% 50%;\n  bottom: 0;\n  font-size: 14px;\n  font-weight: 600;\n  left: 0;\n  line-height: 20px;\n  right: 0;\n  position: fixed;\n  top: 0;\n  z-index: 9999999;\n}\n\n.a-orientation-modal:after {\n  color: #666;\n  content: "Insert phone into Cardboard holder.";\n  display: block;\n  position: absolute;\n  text-align: center;\n  top: 70%;\n  transform: translateY(-70%);\n  width: 100%;\n}\n\n.a-orientation-modal button {\n  background: url(${y}) no-repeat;\n  border: none;\n  height: 50px;\n  text-indent: -9999px;\n  width: 50px;\n}\n\n.a-loader-title {\n  background-color: rgba(0, 0, 0, 0.6);\n  font-family: sans-serif, monospace;\n  text-align: center;\n  font-size: 20px;\n  height: 50px;\n  font-weight: 300;\n  line-height: 50px;\n  position: absolute;\n  right: 0px;\n  left: 0px;\n  top: 0px;\n  color: white;\n}\n\n.a-modal {\n  position: absolute;\n  background: rgba(0, 0, 0, 0.60);\n  background-size: 50% 50%;\n  bottom: 0;\n  font-size: 14px;\n  font-weight: 600;\n  left: 0;\n  line-height: 20px;\n  right: 0;\n  position: fixed;\n  top: 0;\n  z-index: 9999999;\n}\n\n.a-dialog {\n  position: relative;\n  left: 50%;\n  top: 50%;\n  transform: translate(-50%, -50%);\n  z-index: 199995;\n  width: 300px;\n  height: 200px;\n  background-size: contain;\n  background-color: white;\n  font-family: sans-serif, monospace;\n  font-size: 20px;\n  border-radius: 3px;\n  padding: 6px;\n}\n\n.a-dialog-text-container {\n  width: 100%;\n  height: 70%;\n  align-self: flex-start;\n  display: flex;\n  justify-content: center;\n  align-content: center;\n  flex-direction: column;\n}\n\n.a-dialog-text {\n  display: inline-block;\n  font-weight: normal;\n  font-size: 14pt;\n  margin: 8px;\n}\n\n.a-dialog-buttons-container {\n  display: inline-flex;\n  align-self: flex-end;\n  width: 100%;\n  height: 30%;\n}\n\n.a-dialog-button {\n  cursor: pointer;\n  align-self: center;\n  opacity: 0.9;\n  height: 80%;\n  width: 50%;\n  font-size: 12pt;\n  margin: 4px;\n  border-radius: 2px;\n  text-align:center;\n  border: none;\n  display: inline-block;\n  -webkit-transition: all 0.25s ease-in-out;\n  transition: all 0.25s ease-in-out;\n  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.10), 0 1px 2px rgba(0, 0, 0, 0.20);\n  user-select: none;\n}\n\n.a-dialog-permission-button:hover {\n  box-shadow: 0 7px 14px rgba(0,0,0,0.20), 0 2px 2px rgba(0,0,0,0.20);\n}\n\n.a-dialog-allow-button {\n  background-color: #00ceff;\n}\n\n.a-dialog-deny-button {\n  background-color: #ff005b;\n}\n\n.a-dialog-ok-button {\n  background-color: #00ceff;\n  width: 100%;\n}\n\n.a-dom-overlay:not(.a-no-style) {\n  overflow: hidden;\n  position: absolute;\n  pointer-events: none;\n  box-sizing: border-box;\n  bottom: 0;\n  left: 0;\n  right: 0;\n  top: 0;\n  padding: 1em;\n}\n\n.a-dom-overlay:not(.a-no-style)>* {\n  pointer-events: auto;\n}\n`,"",{version:3,sources:["webpack://./src/style/aframe.css"],names:[],mappings:"AAAA,sCAAsC;AACtC;EACE,SAAS;EACT,OAAO;EACP,eAAe;EACf,QAAQ;EACR,MAAM;AACR;;AAEA;EACE,YAAY;EACZ,SAAS;EACT,gBAAgB;EAChB,UAAU;EACV,WAAW;AACb;;AAEA,oDAAoD;AACpD;EACE,sBAAsB;EACtB,uBAAuB;EACvB,iBAAiB;EACjB,kBAAkB;EAClB,mBAAmB;EACnB,oBAAoB;EACpB,0BAA0B;AAC5B;;AAEA;;EAEE,UAAU;EACV,WAAW;AACb;;AAEA;EACE,WAAW;AACb;;AAEA,gEAAgE;AAChE;EACE,6BAA6B;AAC/B;;AAEA;EACE,wBAAwB;AAC1B;;AAEA;EACE,YAAY;EACZ,OAAO;EACP,kBAAkB;EAClB,MAAM;EACN,WAAW;AACb;;AAEA;EACE,YAAY;EACZ,iBAAiB;EACjB,oBAAoB;AACtB;;AAEA;EACE,eAAe;AACjB;;AAEA;EACE,yBAAyB;EACzB,eAAe;EACf,SAAS;EACT,QAAQ;EACR,iBAAiB;EACjB,WAAW;EACX,qBAAqB;EACrB,eAAe;EACf,8BAA8B;EAC9B,kBAAkB;EAClB,cAAc;EACd,YAAY;AACd;;AAEA,+BAA+B;AAC/B,oBAAoB,OAAO,UAAU,EAAE,EAAE,MAAM,UAAU,EAAE,EAAE;AAC7D,oBAAoB,OAAO,UAAU,EAAE,EAAE,MAAM,UAAU,EAAE,EAAE;AAC7D,oBAAoB,OAAO,UAAU,EAAE,EAAE,MAAM,UAAU,EAAE,EAAE;AAC7D,4BAA4B,OAAO,UAAU,EAAE,EAAE,MAAM,UAAU,EAAE,EAAE;AACrE,4BAA4B,OAAO,UAAU,EAAE,EAAE,MAAM,UAAU,EAAE,EAAE;AACrE,4BAA4B,OAAO,UAAU,EAAE,EAAE,MAAM,UAAU,EAAE,EAAE;;AAErE;EACE,sCAAsC;EACtC,8CAA8C;AAChD;;AAEA;EACE,sBAAsB;EACtB,8BAA8B;AAChC;;AAEA;EACE,sBAAsB;EACtB,8BAA8B;AAChC;;AAEA;EACE,cAAc;EACd,kBAAkB;EAClB,YAAY;EACZ,WAAW;AACb;;AAEA;;;;EAIE,aAAa;AACf;;AAEA;;EAEE,0DAA0D;AAC5D;;AAEA;EACE,6BAA6B;EAC7B,cAAc;EACd,qBAAqB;EACrB,6BAA6B;AAC/B;;AAEA;EACE,sBAAsB;EACtB,WAAW;EACX,gBAAgB;EAChB,kBAAkB;EAClB,UAAU;AACZ;;AAEA;;EAEE,kCAAkC;EAClC,eAAe;EACf,WAAW;EACX,gBAAgB;EAChB,iBAAiB;EACjB,kBAAkB;EAClB,WAAW;EACX,YAAY;AACd;;AAEA;EACE,WAAW;AACb;;AAEA;;;EAGE,WAAW;EACX,iBAAiB;EACjB,aAAa;AACf;;AAEA;EACE,yFAA4qB;AAC9qB;;AAEA;EACE,yFAAkzB;AACpzB;;AAEA;EACE,yDAA2qK;AAC7qK;;AAEA;;EAEE,wBAAwB;EACxB,SAAS;EACT,SAAS;EACT,eAAe;EACf,eAAe;EACf,gBAAgB;EAChB,kBAAkB;EAClB;;;;GAIC;EACD,gBAAgB;EAChB,cAAc;EACd,kBAAkB;EAClB,QAAQ;EACR,sCAAsC;EACtC,8CAA8C;EAC9C,aAAa;EACb,kBAAkB;EAClB,0BAA0B,EAAE,8CAA8C;AAC5E;;AAEA;EACE,yBAAyB;EACzB,kBAAkB;AACpB;;AAEA;;;;EAIE,yBAAyB;AAC3B;;AAEA;EACE,qCAAqC;AACvC;;AAEA;EACE,sBAAsB;EACtB,gBAAgB;EAChB,aAAa;EACb,gBAAgB;EAChB,kBAAkB;EAClB,YAAY;EACZ,YAAY;EACZ,SAAS;EACT,kBAAkB;AACpB;;AAEA;EACE,qCAAqC;EACrC,4BAA4B;EAC5B,kCAAkC;EAClC,qBAAqB;EACrB,WAAW;EACX,kBAAkB;EAClB,WAAW;EACX,QAAQ;EACR,QAAQ;EACR,SAAS;AACX;;AAEA;;EAEE,eAAe;AACjB;;AAEA;EACE,SAAS;AACX;;AAEA;EACE,YAAY;AACd;;AAEA;EACE,2FAAivF;EACjvF,wBAAwB;EACxB,SAAS;EACT,eAAe;EACf,gBAAgB;EAChB,OAAO;EACP,iBAAiB;EACjB,QAAQ;EACR,eAAe;EACf,MAAM;EACN,gBAAgB;AAClB;;AAEA;EACE,WAAW;EACX,8CAA8C;EAC9C,cAAc;EACd,kBAAkB;EAClB,kBAAkB;EAClB,QAAQ;EACR,2BAA2B;EAC3B,WAAW;AACb;;AAEA;EACE,6DAA25B;EAC35B,YAAY;EACZ,YAAY;EACZ,oBAAoB;EACpB,WAAW;AACb;;AAEA;EACE,oCAAoC;EACpC,kCAAkC;EAClC,kBAAkB;EAClB,eAAe;EACf,YAAY;EACZ,gBAAgB;EAChB,iBAAiB;EACjB,kBAAkB;EAClB,UAAU;EACV,SAAS;EACT,QAAQ;EACR,YAAY;AACd;;AAEA;EACE,kBAAkB;EAClB,+BAA+B;EAC/B,wBAAwB;EACxB,SAAS;EACT,eAAe;EACf,gBAAgB;EAChB,OAAO;EACP,iBAAiB;EACjB,QAAQ;EACR,eAAe;EACf,MAAM;EACN,gBAAgB;AAClB;;AAEA;EACE,kBAAkB;EAClB,SAAS;EACT,QAAQ;EACR,gCAAgC;EAChC,eAAe;EACf,YAAY;EACZ,aAAa;EACb,wBAAwB;EACxB,uBAAuB;EACvB,kCAAkC;EAClC,eAAe;EACf,kBAAkB;EAClB,YAAY;AACd;;AAEA;EACE,WAAW;EACX,WAAW;EACX,sBAAsB;EACtB,aAAa;EACb,uBAAuB;EACvB,qBAAqB;EACrB,sBAAsB;AACxB;;AAEA;EACE,qBAAqB;EACrB,mBAAmB;EACnB,eAAe;EACf,WAAW;AACb;;AAEA;EACE,oBAAoB;EACpB,oBAAoB;EACpB,WAAW;EACX,WAAW;AACb;;AAEA;EACE,eAAe;EACf,kBAAkB;EAClB,YAAY;EACZ,WAAW;EACX,UAAU;EACV,eAAe;EACf,WAAW;EACX,kBAAkB;EAClB,iBAAiB;EACjB,YAAY;EACZ,qBAAqB;EACrB,yCAAyC;EACzC,iCAAiC;EACjC,wEAAwE;EACxE,iBAAiB;AACnB;;AAEA;EACE,mEAAmE;AACrE;;AAEA;EACE,yBAAyB;AAC3B;;AAEA;EACE,yBAAyB;AAC3B;;AAEA;EACE,yBAAyB;EACzB,WAAW;AACb;;AAEA;EACE,gBAAgB;EAChB,kBAAkB;EAClB,oBAAoB;EACpB,sBAAsB;EACtB,SAAS;EACT,OAAO;EACP,QAAQ;EACR,MAAM;EACN,YAAY;AACd;;AAEA;EACE,oBAAoB;AACtB",sourcesContent:["/* .a-fullscreen means not embedded. */\nhtml.a-fullscreen {\n  bottom: 0;\n  left: 0;\n  position: fixed;\n  right: 0;\n  top: 0;\n}\n\nhtml.a-fullscreen body {\n  height: 100%;\n  margin: 0;\n  overflow: hidden;\n  padding: 0;\n  width: 100%;\n}\n\n/* Class is removed when doing <a-scene embedded>. */\nhtml.a-fullscreen .a-canvas {\n  width: 100% !important;\n  height: 100% !important;\n  top: 0 !important;\n  left: 0 !important;\n  right: 0 !important;\n  bottom: 0 !important;\n  position: fixed !important;\n}\n\nhtml:not(.a-fullscreen) .a-enter-vr,\nhtml:not(.a-fullscreen) .a-enter-ar {\n  right: 5px;\n  bottom: 5px;\n}\n\nhtml:not(.a-fullscreen) .a-enter-ar {\n  right: 60px;\n}\n\n/* In chrome mobile the user agent stylesheet set it to white  */\n:-webkit-full-screen {\n  background-color: transparent;\n}\n\n.a-hidden {\n  display: none !important;\n}\n\n.a-canvas {\n  height: 100%;\n  left: 0;\n  position: absolute;\n  top: 0;\n  width: 100%;\n}\n\n.a-canvas.a-grab-cursor:hover {\n  cursor: grab;\n  cursor: -moz-grab;\n  cursor: -webkit-grab;\n}\n\ncanvas.a-canvas.a-mouse-cursor-hover:hover {\n  cursor: pointer;\n}\n\n.a-inspector-loader {\n  background-color: #ed3160;\n  position: fixed;\n  left: 3px;\n  top: 3px;\n  padding: 6px 10px;\n  color: #fff;\n  text-decoration: none;\n  font-size: 12px;\n  font-family: Roboto,sans-serif;\n  text-align: center;\n  z-index: 99999;\n  width: 204px;\n}\n\n/* Inspector loader animation */\n@keyframes dots-1 { from { opacity: 0; } 25% { opacity: 1; } }\n@keyframes dots-2 { from { opacity: 0; } 50% { opacity: 1; } }\n@keyframes dots-3 { from { opacity: 0; } 75% { opacity: 1; } }\n@-webkit-keyframes dots-1 { from { opacity: 0; } 25% { opacity: 1; } }\n@-webkit-keyframes dots-2 { from { opacity: 0; } 50% { opacity: 1; } }\n@-webkit-keyframes dots-3 { from { opacity: 0; } 75% { opacity: 1; } }\n\n.a-inspector-loader .dots span {\n  animation: dots-1 2s infinite steps(1);\n  -webkit-animation: dots-1 2s infinite steps(1);\n}\n\n.a-inspector-loader .dots span:first-child + span {\n  animation-name: dots-2;\n  -webkit-animation-name: dots-2;\n}\n\n.a-inspector-loader .dots span:first-child + span + span {\n  animation-name: dots-3;\n  -webkit-animation-name: dots-3;\n}\n\na-scene {\n  display: block;\n  position: relative;\n  height: 100%;\n  width: 100%;\n}\n\na-assets,\na-scene video,\na-scene img,\na-scene audio {\n  display: none;\n}\n\n.a-enter-vr-modal,\n.a-orientation-modal {\n  font-family: Consolas, Andale Mono, Courier New, monospace;\n}\n\n.a-enter-vr-modal a {\n  border-bottom: 1px solid #fff;\n  padding: 2px 0;\n  text-decoration: none;\n  transition: .1s color ease-in;\n}\n\n.a-enter-vr-modal a:hover {\n  background-color: #fff;\n  color: #111;\n  padding: 2px 4px;\n  position: relative;\n  left: -4px;\n}\n\n.a-enter-vr,\n.a-enter-ar {\n  font-family: sans-serif, monospace;\n  font-size: 13px;\n  width: 100%;\n  font-weight: 200;\n  line-height: 16px;\n  position: absolute;\n  right: 20px;\n  bottom: 20px;\n}\n\n.a-enter-ar.xr {\n  right: 90px;\n}\n\n.a-enter-vr-button,\n.a-enter-vr-modal,\n.a-enter-vr-modal a {\n  color: #fff;\n  user-select: none;\n  outline: none;\n}\n\n.a-enter-vr-button {\n  background: rgba(0, 0, 0, 0.35) url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='108' height='62' viewBox='0 0 108 62'%3E%3Ctitle%3Eaframe-vrmode-noborder-reduced-tracking%3C/title%3E%3Cpath d='M68.81,21.56H64.23v8.27h4.58a4.13,4.13,0,0,0,3.1-1.09,4.2,4.2,0,0,0,1-3,4.24,4.24,0,0,0-1-3A4.05,4.05,0,0,0,68.81,21.56Z' fill='%23fff'/%3E%3Cpath d='M96,0H12A12,12,0,0,0,0,12V50A12,12,0,0,0,12,62H96a12,12,0,0,0,12-12V12A12,12,0,0,0,96,0ZM41.9,46H34L24,16h8l6,21.84,6-21.84H52Zm39.29,0H73.44L68.15,35.39H64.23V46H57V16H68.81q5.32,0,8.34,2.37a8,8,0,0,1,3,6.69,9.68,9.68,0,0,1-1.27,5.18,8.9,8.9,0,0,1-4,3.34l6.26,12.11Z' fill='%23fff'/%3E%3C/svg%3E\") 50% 50% no-repeat;\n}\n\n.a-enter-ar-button {\n  background: rgba(0, 0, 0, 0.20) url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='108' height='62' viewBox='0 0 108 62'%3E%3Ctitle%3Eaframe-armode-noborder-reduced-tracking%3C/title%3E%3Cpath d='M96,0H12A12,12,0,0,0,0,12V50A12,12,0,0,0,12,62H96a12,12,0,0,0,12-12V12A12,12,0,0,0,96,0Zm8,50a8,8,0,0,1-8,8H12a8,8,0,0,1-8-8V12a8,8,0,0,1,8-8H96a8,8,0,0,1,8,8Z' fill='%23fff'/%3E%3Cpath d='M43.35,39.82H32.51L30.45,46H23.88L35,16h5.73L52,46H45.43Zm-9.17-5h7.5L37.91,23.58Z' fill='%23fff'/%3E%3Cpath d='M68.11,35H63.18V46H57V16H68.15q5.31,0,8.2,2.37a8.18,8.18,0,0,1,2.88,6.7,9.22,9.22,0,0,1-1.33,5.12,9.09,9.09,0,0,1-4,3.26l6.49,12.26V46H73.73Zm-4.93-5h5a5.09,5.09,0,0,0,3.6-1.18,4.21,4.21,0,0,0,1.28-3.27,4.56,4.56,0,0,0-1.2-3.34A5,5,0,0,0,68.15,21h-5Z' fill='%23fff'/%3E%3C/svg%3E\") 50% 50% no-repeat;\n}\n\n.a-enter-vr.fullscreen .a-enter-vr-button {\n  background-image: url(\"data:image/svg+xml,%3C%3Fxml version='1.0' encoding='UTF-8' standalone='no'%3F%3E%3Csvg width='108' height='62' viewBox='0 0 108 62' version='1.1' id='svg320' sodipodi:docname='fullscreen-aframe.svg' xml:space='preserve' inkscape:version='1.2.1 (9c6d41e  2022-07-14)' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns='http://www.w3.org/2000/svg' xmlns:svg='http://www.w3.org/2000/svg' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns%23' xmlns:cc='http://creativecommons.org/ns%23' xmlns:dc='http://purl.org/dc/elements/1.1/'%3E%3Cdefs id='defs324' /%3E%3Csodipodi:namedview id='namedview322' pagecolor='%23ffffff' bordercolor='%23000000' borderopacity='0.25' inkscape:showpageshadow='2' inkscape:pageopacity='0.0' inkscape:pagecheckerboard='0' inkscape:deskcolor='%23d1d1d1' showgrid='false' inkscape:zoom='3.8064516' inkscape:cx='91.423729' inkscape:cy='-1.4449153' inkscape:window-width='1440' inkscape:window-height='847' inkscape:window-x='32' inkscape:window-y='25' inkscape:window-maximized='0' inkscape:current-layer='svg320' /%3E%3Ctitle id='title312'%3Eaframe-armode-noborder-reduced-tracking%3C/title%3E%3Cpath d='M96 0H12A12 12 0 0 0 0 12V50A12 12 0 0 0 12 62H96a12 12 0 0 0 12-12V12A12 12 0 0 0 96 0Zm8 50a8 8 0 0 1-8 8H12a8 8 0 0 1-8-8V12a8 8 0 0 1 8-8H96a8 8 0 0 1 8 8Z' fill='%23fff' id='path314' style='fill:%23ffffff' /%3E%3Cg id='g356' transform='translate(-206.61017 -232.61864)'%3E%3C/g%3E%3Cg id='g358' transform='translate(-206.61017 -232.61864)'%3E%3C/g%3E%3Cg id='g360' transform='translate(-206.61017 -232.61864)'%3E%3C/g%3E%3Cg id='g362' transform='translate(-206.61017 -232.61864)'%3E%3C/g%3E%3Cg id='g364' transform='translate(-206.61017 -232.61864)'%3E%3C/g%3E%3Cg id='g366' transform='translate(-206.61017 -232.61864)'%3E%3C/g%3E%3Cg id='g368' transform='translate(-206.61017 -232.61864)'%3E%3C/g%3E%3Cg id='g370' transform='translate(-206.61017 -232.61864)'%3E%3C/g%3E%3Cg id='g372' transform='translate(-206.61017 -232.61864)'%3E%3C/g%3E%3Cg id='g374' transform='translate(-206.61017 -232.61864)'%3E%3C/g%3E%3Cg id='g376' transform='translate(-206.61017 -232.61864)'%3E%3C/g%3E%3Cg id='g378' transform='translate(-206.61017 -232.61864)'%3E%3C/g%3E%3Cg id='g380' transform='translate(-206.61017 -232.61864)'%3E%3C/g%3E%3Cg id='g382' transform='translate(-206.61017 -232.61864)'%3E%3C/g%3E%3Cg id='g384' transform='translate(-206.61017 -232.61864)'%3E%3C/g%3E%3Cmetadata id='metadata561'%3E%3Crdf:RDF%3E%3Ccc:Work rdf:about=''%3E%3Cdc:title%3Eaframe-armode-noborder-reduced-tracking%3C/dc:title%3E%3C/cc:Work%3E%3C/rdf:RDF%3E%3C/metadata%3E%3Cpath d='m 98.168511 40.083649 c 0 -1.303681 -0.998788 -2.358041 -2.239389 -2.358041 -1.230088 0.0031 -2.240892 1.05436 -2.240892 2.358041 v 4.881296 l -9.041661 -9.041662 c -0.874129 -0.875631 -2.288954 -0.875631 -3.16308 0 -0.874129 0.874126 -0.874129 2.293459 0 3.167585 l 8.995101 8.992101 h -4.858767 c -1.323206 0.0031 -2.389583 1.004796 -2.389583 2.239386 0 1.237598 1.066377 2.237888 2.389583 2.237888 h 10.154599 c 1.323206 0 2.388082 -0.998789 2.392587 -2.237888 -0.0044 -0.03305 -0.009 -0.05858 -0.0134 -0.09161 0.0046 -0.04207 0.0134 -0.08712 0.0134 -0.13066 V 40.085172 h -1.52e-4' id='path596' style='fill:%23ffffff%3Bstroke-width:1.50194' /%3E%3Cpath d='m 23.091002 35.921781 -9.026643 9.041662 v -4.881296 c 0 -1.303681 -1.009302 -2.355037 -2.242393 -2.358041 -1.237598 0 -2.237888 1.05436 -2.237888 2.358041 l -0.0031 10.016421 c 0 0.04356 0.01211 0.08862 0.0015 0.130659 -0.0031 0.03153 -0.009 0.05709 -0.01211 0.09161 0.0031 1.239099 1.069379 2.237888 2.391085 2.237888 h 10.156101 c 1.320202 0 2.388079 -1.000291 2.388079 -2.237888 0 -1.234591 -1.067877 -2.236383 -2.388079 -2.239387 h -4.858767 l 8.995101 -8.9921 c 0.871126 -0.874127 0.871126 -2.293459 0 -3.167586 -0.875628 -0.877132 -2.291957 -0.877132 -3.169087 -1.52e-4' id='path598' style='fill:%23ffffff%3Bstroke-width:1.50194' /%3E%3Cpath d='m 84.649572 25.978033 9.041662 -9.041664 v 4.881298 c 0 1.299176 1.010806 2.350532 2.240891 2.355037 1.240601 0 2.23939 -1.055861 2.23939 -2.355037 V 11.798242 c 0 -0.04356 -0.009 -0.08862 -0.0134 -0.127671 0.0044 -0.03153 0.009 -0.06157 0.0134 -0.09313 -0.0044 -1.240598 -1.069379 -2.2393873 -2.391085 -2.2393873 h -10.1546 c -1.323205 0 -2.38958 0.9987893 -2.38958 2.2393873 0 1.233091 1.066375 2.237887 2.38958 2.240891 h 4.858768 l -8.995102 8.9921 c -0.874129 0.872625 -0.874129 2.288954 0 3.161578 0.874127 0.880137 2.288951 0.880137 3.16308 1.5e-4' id='path600' style='fill:%23ffffff%3Bstroke-width:1.50194' /%3E%3Cpath d='m 17.264988 13.822853 h 4.857265 c 1.320202 -0.0031 2.388079 -1.0078 2.388079 -2.240889 0 -1.240601 -1.067877 -2.2393893 -2.388079 -2.2393893 H 11.967654 c -1.321707 0 -2.388082 0.9987883 -2.391085 2.2393893 0.0031 0.03153 0.009 0.06157 0.01211 0.09313 -0.0031 0.03905 -0.0015 0.08262 -0.0015 0.127671 l 0.0031 10.020926 c 0 1.299176 1.00029 2.355038 2.237887 2.355038 1.233092 -0.0044 2.242393 -1.055862 2.242393 -2.355038 v -4.881295 l 9.026644 9.041661 c 0.877132 0.878635 2.293459 0.878635 3.169087 0 0.871125 -0.872624 0.871125 -2.288953 0 -3.161577 l -8.995282 -8.993616' id='path602' style='fill:%23ffffff%3Bstroke-width:1.50194' /%3E%3C/svg%3E\");\n}\n\n.a-enter-vr-button,\n.a-enter-ar-button {\n  background-size: 90% 90%;\n  border: 0;\n  bottom: 0;\n  cursor: pointer;\n  min-width: 58px;\n  min-height: 34px;\n  /* 1.74418604651 */\n  /*\n    In order to keep the aspect ratio when resizing\n    padding-top percentages are relative to the containing block's width.\n    http://stackoverflow.com/questions/12121090/responsively-change-div-size-keeping-aspect-ratio\n  */\n  padding-right: 0;\n  padding-top: 0;\n  position: absolute;\n  right: 0;\n  transition: background-color .05s ease;\n  -webkit-transition: background-color .05s ease;\n  z-index: 9999;\n  border-radius: 8px;\n  touch-action: manipulation; /* Prevent iOS double tap zoom on the button */\n}\n\n.a-enter-ar-button {\n  background-size: 100% 90%;\n  border-radius: 7px;\n}\n\n.a-enter-ar-button:active,\n.a-enter-ar-button:hover,\n.a-enter-vr-button:active,\n.a-enter-vr-button:hover {\n  background-color: #ef2d5e;\n}\n\n.a-enter-vr-button.resethover {\n  background-color: rgba(0, 0, 0, 0.35);\n}\n\n.a-enter-vr-modal {\n  background-color: #666;\n  border-radius: 0;\n  display: none;\n  min-height: 32px;\n  margin-right: 70px;\n  padding: 9px;\n  width: 280px;\n  right: 2%;\n  position: absolute;\n}\n\n.a-enter-vr-modal:after {\n  border-bottom: 10px solid transparent;\n  border-left: 10px solid #666;\n  border-top: 10px solid transparent;\n  display: inline-block;\n  content: '';\n  position: absolute;\n  right: -5px;\n  top: 5px;\n  width: 0;\n  height: 0;\n}\n\n.a-enter-vr-modal p,\n.a-enter-vr-modal a {\n  display: inline;\n}\n\n.a-enter-vr-modal p {\n  margin: 0;\n}\n\n.a-enter-vr-modal p:after {\n  content: ' ';\n}\n\n.a-orientation-modal {\n  background: rgba(244, 244, 244, 1) url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20xmlns%3Axlink%3D%22http%3A//www.w3.org/1999/xlink%22%20version%3D%221.1%22%20x%3D%220px%22%20y%3D%220px%22%20viewBox%3D%220%200%2090%2090%22%20enable-background%3D%22new%200%200%2090%2090%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20points%3D%220%2C0%200%2C0%200%2C0%20%22%3E%3C/polygon%3E%3Cg%3E%3Cpath%20d%3D%22M71.545%2C48.145h-31.98V20.743c0-2.627-2.138-4.765-4.765-4.765H18.456c-2.628%2C0-4.767%2C2.138-4.767%2C4.765v42.789%20%20%20c0%2C2.628%2C2.138%2C4.766%2C4.767%2C4.766h5.535v0.959c0%2C2.628%2C2.138%2C4.765%2C4.766%2C4.765h42.788c2.628%2C0%2C4.766-2.137%2C4.766-4.765V52.914%20%20%20C76.311%2C50.284%2C74.173%2C48.145%2C71.545%2C48.145z%20M18.455%2C16.935h16.344c2.1%2C0%2C3.808%2C1.708%2C3.808%2C3.808v27.401H37.25V22.636%20%20%20c0-0.264-0.215-0.478-0.479-0.478H16.482c-0.264%2C0-0.479%2C0.214-0.479%2C0.478v36.585c0%2C0.264%2C0.215%2C0.478%2C0.479%2C0.478h7.507v7.644%20%20%20h-5.534c-2.101%2C0-3.81-1.709-3.81-3.81V20.743C14.645%2C18.643%2C16.354%2C16.935%2C18.455%2C16.935z%20M16.96%2C23.116h19.331v25.031h-7.535%20%20%20c-2.628%2C0-4.766%2C2.139-4.766%2C4.768v5.828h-7.03V23.116z%20M71.545%2C73.064H28.757c-2.101%2C0-3.81-1.708-3.81-3.808V52.914%20%20%20c0-2.102%2C1.709-3.812%2C3.81-3.812h42.788c2.1%2C0%2C3.809%2C1.71%2C3.809%2C3.812v16.343C75.354%2C71.356%2C73.645%2C73.064%2C71.545%2C73.064z%22%3E%3C/path%3E%3Cpath%20d%3D%22M28.919%2C58.424c-1.466%2C0-2.659%2C1.193-2.659%2C2.66c0%2C1.466%2C1.193%2C2.658%2C2.659%2C2.658c1.468%2C0%2C2.662-1.192%2C2.662-2.658%20%20%20C31.581%2C59.617%2C30.387%2C58.424%2C28.919%2C58.424z%20M28.919%2C62.786c-0.939%2C0-1.703-0.764-1.703-1.702c0-0.939%2C0.764-1.704%2C1.703-1.704%20%20%20c0.94%2C0%2C1.705%2C0.765%2C1.705%2C1.704C30.623%2C62.022%2C29.858%2C62.786%2C28.919%2C62.786z%22%3E%3C/path%3E%3Cpath%20d%3D%22M69.654%2C50.461H33.069c-0.264%2C0-0.479%2C0.215-0.479%2C0.479v20.288c0%2C0.264%2C0.215%2C0.478%2C0.479%2C0.478h36.585%20%20%20c0.263%2C0%2C0.477-0.214%2C0.477-0.478V50.939C70.131%2C50.676%2C69.917%2C50.461%2C69.654%2C50.461z%20M69.174%2C51.417V70.75H33.548V51.417H69.174z%22%3E%3C/path%3E%3Cpath%20d%3D%22M45.201%2C30.296c6.651%2C0%2C12.233%2C5.351%2C12.551%2C11.977l-3.033-2.638c-0.193-0.165-0.507-0.142-0.675%2C0.048%20%20%20c-0.174%2C0.198-0.153%2C0.501%2C0.045%2C0.676l3.883%2C3.375c0.09%2C0.075%2C0.198%2C0.115%2C0.312%2C0.115c0.141%2C0%2C0.273-0.061%2C0.362-0.166%20%20%20l3.371-3.877c0.173-0.2%2C0.151-0.502-0.047-0.675c-0.194-0.166-0.508-0.144-0.676%2C0.048l-2.592%2C2.979%20%20%20c-0.18-3.417-1.629-6.605-4.099-9.001c-2.538-2.461-5.877-3.817-9.404-3.817c-0.264%2C0-0.479%2C0.215-0.479%2C0.479%20%20%20C44.72%2C30.083%2C44.936%2C30.296%2C45.201%2C30.296z%22%3E%3C/path%3E%3C/g%3E%3C/svg%3E) center no-repeat;\n  background-size: 50% 50%;\n  bottom: 0;\n  font-size: 14px;\n  font-weight: 600;\n  left: 0;\n  line-height: 20px;\n  right: 0;\n  position: fixed;\n  top: 0;\n  z-index: 9999999;\n}\n\n.a-orientation-modal:after {\n  color: #666;\n  content: \"Insert phone into Cardboard holder.\";\n  display: block;\n  position: absolute;\n  text-align: center;\n  top: 70%;\n  transform: translateY(-70%);\n  width: 100%;\n}\n\n.a-orientation-modal button {\n  background: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20xmlns%3Axlink%3D%22http%3A//www.w3.org/1999/xlink%22%20version%3D%221.1%22%20x%3D%220px%22%20y%3D%220px%22%20viewBox%3D%220%200%20100%20100%22%20enable-background%3D%22new%200%200%20100%20100%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20fill%3D%22%23000000%22%20d%3D%22M55.209%2C50l17.803-17.803c1.416-1.416%2C1.416-3.713%2C0-5.129c-1.416-1.417-3.713-1.417-5.129%2C0L50.08%2C44.872%20%20L32.278%2C27.069c-1.416-1.417-3.714-1.417-5.129%2C0c-1.417%2C1.416-1.417%2C3.713%2C0%2C5.129L44.951%2C50L27.149%2C67.803%20%20c-1.417%2C1.416-1.417%2C3.713%2C0%2C5.129c0.708%2C0.708%2C1.636%2C1.062%2C2.564%2C1.062c0.928%2C0%2C1.856-0.354%2C2.564-1.062L50.08%2C55.13l17.803%2C17.802%20%20c0.708%2C0.708%2C1.637%2C1.062%2C2.564%2C1.062s1.856-0.354%2C2.564-1.062c1.416-1.416%2C1.416-3.713%2C0-5.129L55.209%2C50z%22%3E%3C/path%3E%3C/svg%3E) no-repeat;\n  border: none;\n  height: 50px;\n  text-indent: -9999px;\n  width: 50px;\n}\n\n.a-loader-title {\n  background-color: rgba(0, 0, 0, 0.6);\n  font-family: sans-serif, monospace;\n  text-align: center;\n  font-size: 20px;\n  height: 50px;\n  font-weight: 300;\n  line-height: 50px;\n  position: absolute;\n  right: 0px;\n  left: 0px;\n  top: 0px;\n  color: white;\n}\n\n.a-modal {\n  position: absolute;\n  background: rgba(0, 0, 0, 0.60);\n  background-size: 50% 50%;\n  bottom: 0;\n  font-size: 14px;\n  font-weight: 600;\n  left: 0;\n  line-height: 20px;\n  right: 0;\n  position: fixed;\n  top: 0;\n  z-index: 9999999;\n}\n\n.a-dialog {\n  position: relative;\n  left: 50%;\n  top: 50%;\n  transform: translate(-50%, -50%);\n  z-index: 199995;\n  width: 300px;\n  height: 200px;\n  background-size: contain;\n  background-color: white;\n  font-family: sans-serif, monospace;\n  font-size: 20px;\n  border-radius: 3px;\n  padding: 6px;\n}\n\n.a-dialog-text-container {\n  width: 100%;\n  height: 70%;\n  align-self: flex-start;\n  display: flex;\n  justify-content: center;\n  align-content: center;\n  flex-direction: column;\n}\n\n.a-dialog-text {\n  display: inline-block;\n  font-weight: normal;\n  font-size: 14pt;\n  margin: 8px;\n}\n\n.a-dialog-buttons-container {\n  display: inline-flex;\n  align-self: flex-end;\n  width: 100%;\n  height: 30%;\n}\n\n.a-dialog-button {\n  cursor: pointer;\n  align-self: center;\n  opacity: 0.9;\n  height: 80%;\n  width: 50%;\n  font-size: 12pt;\n  margin: 4px;\n  border-radius: 2px;\n  text-align:center;\n  border: none;\n  display: inline-block;\n  -webkit-transition: all 0.25s ease-in-out;\n  transition: all 0.25s ease-in-out;\n  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.10), 0 1px 2px rgba(0, 0, 0, 0.20);\n  user-select: none;\n}\n\n.a-dialog-permission-button:hover {\n  box-shadow: 0 7px 14px rgba(0,0,0,0.20), 0 2px 2px rgba(0,0,0,0.20);\n}\n\n.a-dialog-allow-button {\n  background-color: #00ceff;\n}\n\n.a-dialog-deny-button {\n  background-color: #ff005b;\n}\n\n.a-dialog-ok-button {\n  background-color: #00ceff;\n  width: 100%;\n}\n\n.a-dom-overlay:not(.a-no-style) {\n  overflow: hidden;\n  position: absolute;\n  pointer-events: none;\n  box-sizing: border-box;\n  bottom: 0;\n  left: 0;\n  right: 0;\n  top: 0;\n  padding: 1em;\n}\n\n.a-dom-overlay:not(.a-no-style)>* {\n  pointer-events: auto;\n}\n"],sourceRoot:""}]);const E=f},2470:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var i=n(963),r=n.n(i),s=n(9089),o=n.n(s)()(r());o.push([e.id,".rs-base {\n  background-color: #333;\n  color: #fafafa;\n  border-radius: 0;\n  font: 10px monospace;\n  left: 5px;\n  line-height: 1em;\n  opacity: 0.85;\n  overflow: hidden;\n  padding: 10px;\n  position: fixed;\n  top: 5px;\n  width: 300px;\n  z-index: 10000;\n}\n\n.rs-base div.hidden {\n  display: none;\n}\n\n.rs-base h1 {\n  color: #fff;\n  cursor: pointer;\n  font-size: 1.4em;\n  font-weight: 300;\n  margin: 0 0 5px;\n  padding: 0;\n}\n\n.rs-group {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  -webkit-flex-direction: column-reverse;\n  flex-direction: column-reverse;\n  margin-bottom: 5px;\n}\n\n.rs-group:last-child {\n  margin-bottom: 0;\n}\n\n.rs-counter-base {\n  align-items: center;\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  height: 10px;\n  -webkit-justify-content: space-between;\n  justify-content: space-between;\n  margin: 2px 0;\n}\n\n.rs-counter-base.alarm {\n  color: #b70000;\n  text-shadow: 0 0 0 #b70000,\n               0 0 1px #fff,\n               0 0 1px #fff,\n               0 0 2px #fff,\n               0 0 2px #fff,\n               0 0 3px #fff,\n               0 0 3px #fff,\n               0 0 4px #fff,\n               0 0 4px #fff;\n}\n\n.rs-counter-id {\n  font-weight: 300;\n  -webkit-box-ordinal-group: 0;\n  -webkit-order: 0;\n  order: 0;\n  width: 54px;\n}\n\n.rs-counter-value {\n  font-weight: 300;\n  -webkit-box-ordinal-group: 1;\n  -webkit-order: 1;\n  order: 1;\n  text-align: right;\n  width: 35px;\n}\n\n.rs-canvas {\n  -webkit-box-ordinal-group: 2;\n  -webkit-order: 2;\n  order: 2;\n}\n\n@media (min-width: 480px) {\n  .rs-base {\n    left: 20px;\n    top: 20px;\n  }\n}\n","",{version:3,sources:["webpack://./src/style/rStats.css"],names:[],mappings:"AAAA;EACE,sBAAsB;EACtB,cAAc;EACd,gBAAgB;EAChB,oBAAoB;EACpB,SAAS;EACT,gBAAgB;EAChB,aAAa;EACb,gBAAgB;EAChB,aAAa;EACb,eAAe;EACf,QAAQ;EACR,YAAY;EACZ,cAAc;AAChB;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,WAAW;EACX,eAAe;EACf,gBAAgB;EAChB,gBAAgB;EAChB,eAAe;EACf,UAAU;AACZ;;AAEA;EACE,oBAAoB;EACpB,qBAAqB;EACrB,aAAa;EACb,sCAAsC;EACtC,8BAA8B;EAC9B,kBAAkB;AACpB;;AAEA;EACE,gBAAgB;AAClB;;AAEA;EACE,mBAAmB;EACnB,oBAAoB;EACpB,qBAAqB;EACrB,aAAa;EACb,YAAY;EACZ,sCAAsC;EACtC,8BAA8B;EAC9B,aAAa;AACf;;AAEA;EACE,cAAc;EACd;;;;;;;;2BAQyB;AAC3B;;AAEA;EACE,gBAAgB;EAChB,4BAA4B;EAC5B,gBAAgB;EAChB,QAAQ;EACR,WAAW;AACb;;AAEA;EACE,gBAAgB;EAChB,4BAA4B;EAC5B,gBAAgB;EAChB,QAAQ;EACR,iBAAiB;EACjB,WAAW;AACb;;AAEA;EACE,4BAA4B;EAC5B,gBAAgB;EAChB,QAAQ;AACV;;AAEA;EACE;IACE,UAAU;IACV,SAAS;EACX;AACF",sourcesContent:[".rs-base {\n  background-color: #333;\n  color: #fafafa;\n  border-radius: 0;\n  font: 10px monospace;\n  left: 5px;\n  line-height: 1em;\n  opacity: 0.85;\n  overflow: hidden;\n  padding: 10px;\n  position: fixed;\n  top: 5px;\n  width: 300px;\n  z-index: 10000;\n}\n\n.rs-base div.hidden {\n  display: none;\n}\n\n.rs-base h1 {\n  color: #fff;\n  cursor: pointer;\n  font-size: 1.4em;\n  font-weight: 300;\n  margin: 0 0 5px;\n  padding: 0;\n}\n\n.rs-group {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  -webkit-flex-direction: column-reverse;\n  flex-direction: column-reverse;\n  margin-bottom: 5px;\n}\n\n.rs-group:last-child {\n  margin-bottom: 0;\n}\n\n.rs-counter-base {\n  align-items: center;\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  height: 10px;\n  -webkit-justify-content: space-between;\n  justify-content: space-between;\n  margin: 2px 0;\n}\n\n.rs-counter-base.alarm {\n  color: #b70000;\n  text-shadow: 0 0 0 #b70000,\n               0 0 1px #fff,\n               0 0 1px #fff,\n               0 0 2px #fff,\n               0 0 2px #fff,\n               0 0 3px #fff,\n               0 0 3px #fff,\n               0 0 4px #fff,\n               0 0 4px #fff;\n}\n\n.rs-counter-id {\n  font-weight: 300;\n  -webkit-box-ordinal-group: 0;\n  -webkit-order: 0;\n  order: 0;\n  width: 54px;\n}\n\n.rs-counter-value {\n  font-weight: 300;\n  -webkit-box-ordinal-group: 1;\n  -webkit-order: 1;\n  order: 1;\n  text-align: right;\n  width: 35px;\n}\n\n.rs-canvas {\n  -webkit-box-ordinal-group: 2;\n  -webkit-order: 2;\n  order: 2;\n}\n\n@media (min-width: 480px) {\n  .rs-base {\n    left: 20px;\n    top: 20px;\n  }\n}\n"],sourceRoot:""}]);const a=o},7180:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>g});var i=n(5072),r=n.n(i),s=n(7825),o=n.n(s),a=n(7659),l=n.n(a),c=n(5056),h=n.n(c),u=n(540),d=n.n(u),p=n(1113),f=n.n(p),m=n(8217),A={};A.styleTagTransform=f(),A.setAttributes=h(),A.insert=l().bind(null,"head"),A.domAPI=o(),A.insertStyleElement=d(),r()(m.A,A);const g=m.A&&m.A.locals?m.A.locals:void 0},9379:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>g});var i=n(5072),r=n.n(i),s=n(7825),o=n.n(s),a=n(7659),l=n.n(a),c=n(5056),h=n.n(c),u=n(540),d=n.n(u),p=n(1113),f=n.n(p),m=n(2470),A={};A.styleTagTransform=f(),A.setAttributes=h(),A.insert=l().bind(null,"head"),A.domAPI=o(),A.insertStyleElement=d(),r()(m.A,A);const g=m.A&&m.A.locals?m.A.locals:void 0},5072:e=>{"use strict";var t=[];function n(e){for(var n=-1,i=0;i<t.length;i++)if(t[i].identifier===e){n=i;break}return n}function i(e,i){for(var s={},o=[],a=0;a<e.length;a++){var l=e[a],c=i.base?l[0]+i.base:l[0],h=s[c]||0,u="".concat(c," ").concat(h);s[c]=h+1;var d=n(u),p={css:l[1],media:l[2],sourceMap:l[3],supports:l[4],layer:l[5]};if(-1!==d)t[d].references++,t[d].updater(p);else{var f=r(p,i);i.byIndex=a,t.splice(a,0,{identifier:u,updater:f,references:1})}o.push(u)}return o}function r(e,t){var n=t.domAPI(t);return n.update(e),function(t){if(t){if(t.css===e.css&&t.media===e.media&&t.sourceMap===e.sourceMap&&t.supports===e.supports&&t.layer===e.layer)return;n.update(e=t)}else n.remove()}}e.exports=function(e,r){var s=i(e=e||[],r=r||{});return function(e){e=e||[];for(var o=0;o<s.length;o++){var a=n(s[o]);t[a].references--}for(var l=i(e,r),c=0;c<s.length;c++){var h=n(s[c]);0===t[h].references&&(t[h].updater(),t.splice(h,1))}s=l}}},7659:e=>{"use strict";var t={};e.exports=function(e,n){var i=function(e){if(void 0===t[e]){var n=document.querySelector(e);if(window.HTMLIFrameElement&&n instanceof window.HTMLIFrameElement)try{n=n.contentDocument.head}catch(e){n=null}t[e]=n}return t[e]}(e);if(!i)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");i.appendChild(n)}},540:e=>{"use strict";e.exports=function(e){var t=document.createElement("style");return e.setAttributes(t,e.attributes),e.insert(t,e.options),t}},5056:(e,t,n)=>{"use strict";e.exports=function(e){var t=n.nc;t&&e.setAttribute("nonce",t)}},7825:e=>{"use strict";e.exports=function(e){if("undefined"==typeof document)return{update:function(){},remove:function(){}};var t=e.insertStyleElement(e);return{update:function(n){!function(e,t,n){var i="";n.supports&&(i+="@supports (".concat(n.supports,") {")),n.media&&(i+="@media ".concat(n.media," {"));var r=void 0!==n.layer;r&&(i+="@layer".concat(n.layer.length>0?" ".concat(n.layer):""," {")),i+=n.css,r&&(i+="}"),n.media&&(i+="}"),n.supports&&(i+="}");var s=n.sourceMap;s&&"undefined"!=typeof btoa&&(i+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(s))))," */")),t.styleTagTransform(i,e,t.options)}(t,e,n)},remove:function(){!function(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e)}(t)}}}},1113:e=>{"use strict";e.exports=function(e,t){if(t.styleSheet)t.styleSheet.cssText=e;else{for(;t.firstChild;)t.removeChild(t.firstChild);t.appendChild(document.createTextNode(e))}}},3931:e=>{"use strict";e.exports="data:image/svg+xml,%3C%3Fxml version=%271.0%27 encoding=%27UTF-8%27 standalone=%27no%27%3F%3E%3Csvg width=%27108%27 height=%2762%27 viewBox=%270 0 108 62%27 version=%271.1%27 id=%27svg320%27 sodipodi:docname=%27fullscreen-aframe.svg%27 xml:space=%27preserve%27 inkscape:version=%271.2.1 %289c6d41e  2022-07-14%29%27 xmlns:inkscape=%27http://www.inkscape.org/namespaces/inkscape%27 xmlns:sodipodi=%27http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd%27 xmlns=%27http://www.w3.org/2000/svg%27 xmlns:svg=%27http://www.w3.org/2000/svg%27 xmlns:rdf=%27http://www.w3.org/1999/02/22-rdf-syntax-ns%23%27 xmlns:cc=%27http://creativecommons.org/ns%23%27 xmlns:dc=%27http://purl.org/dc/elements/1.1/%27%3E%3Cdefs id=%27defs324%27 /%3E%3Csodipodi:namedview id=%27namedview322%27 pagecolor=%27%23ffffff%27 bordercolor=%27%23000000%27 borderopacity=%270.25%27 inkscape:showpageshadow=%272%27 inkscape:pageopacity=%270.0%27 inkscape:pagecheckerboard=%270%27 inkscape:deskcolor=%27%23d1d1d1%27 showgrid=%27false%27 inkscape:zoom=%273.8064516%27 inkscape:cx=%2791.423729%27 inkscape:cy=%27-1.4449153%27 inkscape:window-width=%271440%27 inkscape:window-height=%27847%27 inkscape:window-x=%2732%27 inkscape:window-y=%2725%27 inkscape:window-maximized=%270%27 inkscape:current-layer=%27svg320%27 /%3E%3Ctitle id=%27title312%27%3Eaframe-armode-noborder-reduced-tracking%3C/title%3E%3Cpath d=%27M96 0H12A12 12 0 0 0 0 12V50A12 12 0 0 0 12 62H96a12 12 0 0 0 12-12V12A12 12 0 0 0 96 0Zm8 50a8 8 0 0 1-8 8H12a8 8 0 0 1-8-8V12a8 8 0 0 1 8-8H96a8 8 0 0 1 8 8Z%27 fill=%27%23fff%27 id=%27path314%27 style=%27fill:%23ffffff%27 /%3E%3Cg id=%27g356%27 transform=%27translate%28-206.61017 -232.61864%29%27%3E%3C/g%3E%3Cg id=%27g358%27 transform=%27translate%28-206.61017 -232.61864%29%27%3E%3C/g%3E%3Cg id=%27g360%27 transform=%27translate%28-206.61017 -232.61864%29%27%3E%3C/g%3E%3Cg id=%27g362%27 transform=%27translate%28-206.61017 -232.61864%29%27%3E%3C/g%3E%3Cg id=%27g364%27 transform=%27translate%28-206.61017 -232.61864%29%27%3E%3C/g%3E%3Cg id=%27g366%27 transform=%27translate%28-206.61017 -232.61864%29%27%3E%3C/g%3E%3Cg id=%27g368%27 transform=%27translate%28-206.61017 -232.61864%29%27%3E%3C/g%3E%3Cg id=%27g370%27 transform=%27translate%28-206.61017 -232.61864%29%27%3E%3C/g%3E%3Cg id=%27g372%27 transform=%27translate%28-206.61017 -232.61864%29%27%3E%3C/g%3E%3Cg id=%27g374%27 transform=%27translate%28-206.61017 -232.61864%29%27%3E%3C/g%3E%3Cg id=%27g376%27 transform=%27translate%28-206.61017 -232.61864%29%27%3E%3C/g%3E%3Cg id=%27g378%27 transform=%27translate%28-206.61017 -232.61864%29%27%3E%3C/g%3E%3Cg id=%27g380%27 transform=%27translate%28-206.61017 -232.61864%29%27%3E%3C/g%3E%3Cg id=%27g382%27 transform=%27translate%28-206.61017 -232.61864%29%27%3E%3C/g%3E%3Cg id=%27g384%27 transform=%27translate%28-206.61017 -232.61864%29%27%3E%3C/g%3E%3Cmetadata id=%27metadata561%27%3E%3Crdf:RDF%3E%3Ccc:Work rdf:about=%27%27%3E%3Cdc:title%3Eaframe-armode-noborder-reduced-tracking%3C/dc:title%3E%3C/cc:Work%3E%3C/rdf:RDF%3E%3C/metadata%3E%3Cpath d=%27m 98.168511 40.083649 c 0 -1.303681 -0.998788 -2.358041 -2.239389 -2.358041 -1.230088 0.0031 -2.240892 1.05436 -2.240892 2.358041 v 4.881296 l -9.041661 -9.041662 c -0.874129 -0.875631 -2.288954 -0.875631 -3.16308 0 -0.874129 0.874126 -0.874129 2.293459 0 3.167585 l 8.995101 8.992101 h -4.858767 c -1.323206 0.0031 -2.389583 1.004796 -2.389583 2.239386 0 1.237598 1.066377 2.237888 2.389583 2.237888 h 10.154599 c 1.323206 0 2.388082 -0.998789 2.392587 -2.237888 -0.0044 -0.03305 -0.009 -0.05858 -0.0134 -0.09161 0.0046 -0.04207 0.0134 -0.08712 0.0134 -0.13066 V 40.085172 h -1.52e-4%27 id=%27path596%27 style=%27fill:%23ffffff%3Bstroke-width:1.50194%27 /%3E%3Cpath d=%27m 23.091002 35.921781 -9.026643 9.041662 v -4.881296 c 0 -1.303681 -1.009302 -2.355037 -2.242393 -2.358041 -1.237598 0 -2.237888 1.05436 -2.237888 2.358041 l -0.0031 10.016421 c 0 0.04356 0.01211 0.08862 0.0015 0.130659 -0.0031 0.03153 -0.009 0.05709 -0.01211 0.09161 0.0031 1.239099 1.069379 2.237888 2.391085 2.237888 h 10.156101 c 1.320202 0 2.388079 -1.000291 2.388079 -2.237888 0 -1.234591 -1.067877 -2.236383 -2.388079 -2.239387 h -4.858767 l 8.995101 -8.9921 c 0.871126 -0.874127 0.871126 -2.293459 0 -3.167586 -0.875628 -0.877132 -2.291957 -0.877132 -3.169087 -1.52e-4%27 id=%27path598%27 style=%27fill:%23ffffff%3Bstroke-width:1.50194%27 /%3E%3Cpath d=%27m 84.649572 25.978033 9.041662 -9.041664 v 4.881298 c 0 1.299176 1.010806 2.350532 2.240891 2.355037 1.240601 0 2.23939 -1.055861 2.23939 -2.355037 V 11.798242 c 0 -0.04356 -0.009 -0.08862 -0.0134 -0.127671 0.0044 -0.03153 0.009 -0.06157 0.0134 -0.09313 -0.0044 -1.240598 -1.069379 -2.2393873 -2.391085 -2.2393873 h -10.1546 c -1.323205 0 -2.38958 0.9987893 -2.38958 2.2393873 0 1.233091 1.066375 2.237887 2.38958 2.240891 h 4.858768 l -8.995102 8.9921 c -0.874129 0.872625 -0.874129 2.288954 0 3.161578 0.874127 0.880137 2.288951 0.880137 3.16308 1.5e-4%27 id=%27path600%27 style=%27fill:%23ffffff%3Bstroke-width:1.50194%27 /%3E%3Cpath d=%27m 17.264988 13.822853 h 4.857265 c 1.320202 -0.0031 2.388079 -1.0078 2.388079 -2.240889 0 -1.240601 -1.067877 -2.2393893 -2.388079 -2.2393893 H 11.967654 c -1.321707 0 -2.388082 0.9987883 -2.391085 2.2393893 0.0031 0.03153 0.009 0.06157 0.01211 0.09313 -0.0031 0.03905 -0.0015 0.08262 -0.0015 0.127671 l 0.0031 10.020926 c 0 1.299176 1.00029 2.355038 2.237887 2.355038 1.233092 -0.0044 2.242393 -1.055862 2.242393 -2.355038 v -4.881295 l 9.026644 9.041661 c 0.877132 0.878635 2.293459 0.878635 3.169087 0 0.871125 -0.872624 0.871125 -2.288953 0 -3.161577 l -8.995282 -8.993616%27 id=%27path602%27 style=%27fill:%23ffffff%3Bstroke-width:1.50194%27 /%3E%3C/svg%3E"},6085:e=>{"use strict";e.exports="data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%27108%27 height=%2762%27 viewBox=%270 0 108 62%27%3E%3Ctitle%3Eaframe-armode-noborder-reduced-tracking%3C/title%3E%3Cpath d=%27M96,0H12A12,12,0,0,0,0,12V50A12,12,0,0,0,12,62H96a12,12,0,0,0,12-12V12A12,12,0,0,0,96,0Zm8,50a8,8,0,0,1-8,8H12a8,8,0,0,1-8-8V12a8,8,0,0,1,8-8H96a8,8,0,0,1,8,8Z%27 fill=%27%23fff%27/%3E%3Cpath d=%27M43.35,39.82H32.51L30.45,46H23.88L35,16h5.73L52,46H45.43Zm-9.17-5h7.5L37.91,23.58Z%27 fill=%27%23fff%27/%3E%3Cpath d=%27M68.11,35H63.18V46H57V16H68.15q5.31,0,8.2,2.37a8.18,8.18,0,0,1,2.88,6.7,9.22,9.22,0,0,1-1.33,5.12,9.09,9.09,0,0,1-4,3.26l6.49,12.26V46H73.73Zm-4.93-5h5a5.09,5.09,0,0,0,3.6-1.18,4.21,4.21,0,0,0,1.28-3.27,4.56,4.56,0,0,0-1.2-3.34A5,5,0,0,0,68.15,21h-5Z%27 fill=%27%23fff%27/%3E%3C/svg%3E"},9169:e=>{"use strict";e.exports="data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%27108%27 height=%2762%27 viewBox=%270 0 108 62%27%3E%3Ctitle%3Eaframe-vrmode-noborder-reduced-tracking%3C/title%3E%3Cpath d=%27M68.81,21.56H64.23v8.27h4.58a4.13,4.13,0,0,0,3.1-1.09,4.2,4.2,0,0,0,1-3,4.24,4.24,0,0,0-1-3A4.05,4.05,0,0,0,68.81,21.56Z%27 fill=%27%23fff%27/%3E%3Cpath d=%27M96,0H12A12,12,0,0,0,0,12V50A12,12,0,0,0,12,62H96a12,12,0,0,0,12-12V12A12,12,0,0,0,96,0ZM41.9,46H34L24,16h8l6,21.84,6-21.84H52Zm39.29,0H73.44L68.15,35.39H64.23V46H57V16H68.81q5.32,0,8.34,2.37a8,8,0,0,1,3,6.69,9.68,9.68,0,0,1-1.27,5.18,8.9,8.9,0,0,1-4,3.34l6.26,12.11Z%27 fill=%27%23fff%27/%3E%3C/svg%3E"},6517:e=>{"use strict";e.exports="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20xmlns%3Axlink%3D%22http%3A//www.w3.org/1999/xlink%22%20version%3D%221.1%22%20x%3D%220px%22%20y%3D%220px%22%20viewBox%3D%220%200%20100%20100%22%20enable-background%3D%22new%200%200%20100%20100%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20fill%3D%22%23000000%22%20d%3D%22M55.209%2C50l17.803-17.803c1.416-1.416%2C1.416-3.713%2C0-5.129c-1.416-1.417-3.713-1.417-5.129%2C0L50.08%2C44.872%20%20L32.278%2C27.069c-1.416-1.417-3.714-1.417-5.129%2C0c-1.417%2C1.416-1.417%2C3.713%2C0%2C5.129L44.951%2C50L27.149%2C67.803%20%20c-1.417%2C1.416-1.417%2C3.713%2C0%2C5.129c0.708%2C0.708%2C1.636%2C1.062%2C2.564%2C1.062c0.928%2C0%2C1.856-0.354%2C2.564-1.062L50.08%2C55.13l17.803%2C17.802%20%20c0.708%2C0.708%2C1.637%2C1.062%2C2.564%2C1.062s1.856-0.354%2C2.564-1.062c1.416-1.416%2C1.416-3.713%2C0-5.129L55.209%2C50z%22%3E%3C/path%3E%3C/svg%3E"},7889:e=>{"use strict";e.exports="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20xmlns%3Axlink%3D%22http%3A//www.w3.org/1999/xlink%22%20version%3D%221.1%22%20x%3D%220px%22%20y%3D%220px%22%20viewBox%3D%220%200%2090%2090%22%20enable-background%3D%22new%200%200%2090%2090%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20points%3D%220%2C0%200%2C0%200%2C0%20%22%3E%3C/polygon%3E%3Cg%3E%3Cpath%20d%3D%22M71.545%2C48.145h-31.98V20.743c0-2.627-2.138-4.765-4.765-4.765H18.456c-2.628%2C0-4.767%2C2.138-4.767%2C4.765v42.789%20%20%20c0%2C2.628%2C2.138%2C4.766%2C4.767%2C4.766h5.535v0.959c0%2C2.628%2C2.138%2C4.765%2C4.766%2C4.765h42.788c2.628%2C0%2C4.766-2.137%2C4.766-4.765V52.914%20%20%20C76.311%2C50.284%2C74.173%2C48.145%2C71.545%2C48.145z%20M18.455%2C16.935h16.344c2.1%2C0%2C3.808%2C1.708%2C3.808%2C3.808v27.401H37.25V22.636%20%20%20c0-0.264-0.215-0.478-0.479-0.478H16.482c-0.264%2C0-0.479%2C0.214-0.479%2C0.478v36.585c0%2C0.264%2C0.215%2C0.478%2C0.479%2C0.478h7.507v7.644%20%20%20h-5.534c-2.101%2C0-3.81-1.709-3.81-3.81V20.743C14.645%2C18.643%2C16.354%2C16.935%2C18.455%2C16.935z%20M16.96%2C23.116h19.331v25.031h-7.535%20%20%20c-2.628%2C0-4.766%2C2.139-4.766%2C4.768v5.828h-7.03V23.116z%20M71.545%2C73.064H28.757c-2.101%2C0-3.81-1.708-3.81-3.808V52.914%20%20%20c0-2.102%2C1.709-3.812%2C3.81-3.812h42.788c2.1%2C0%2C3.809%2C1.71%2C3.809%2C3.812v16.343C75.354%2C71.356%2C73.645%2C73.064%2C71.545%2C73.064z%22%3E%3C/path%3E%3Cpath%20d%3D%22M28.919%2C58.424c-1.466%2C0-2.659%2C1.193-2.659%2C2.66c0%2C1.466%2C1.193%2C2.658%2C2.659%2C2.658c1.468%2C0%2C2.662-1.192%2C2.662-2.658%20%20%20C31.581%2C59.617%2C30.387%2C58.424%2C28.919%2C58.424z%20M28.919%2C62.786c-0.939%2C0-1.703-0.764-1.703-1.702c0-0.939%2C0.764-1.704%2C1.703-1.704%20%20%20c0.94%2C0%2C1.705%2C0.765%2C1.705%2C1.704C30.623%2C62.022%2C29.858%2C62.786%2C28.919%2C62.786z%22%3E%3C/path%3E%3Cpath%20d%3D%22M69.654%2C50.461H33.069c-0.264%2C0-0.479%2C0.215-0.479%2C0.479v20.288c0%2C0.264%2C0.215%2C0.478%2C0.479%2C0.478h36.585%20%20%20c0.263%2C0%2C0.477-0.214%2C0.477-0.478V50.939C70.131%2C50.676%2C69.917%2C50.461%2C69.654%2C50.461z%20M69.174%2C51.417V70.75H33.548V51.417H69.174z%22%3E%3C/path%3E%3Cpath%20d%3D%22M45.201%2C30.296c6.651%2C0%2C12.233%2C5.351%2C12.551%2C11.977l-3.033-2.638c-0.193-0.165-0.507-0.142-0.675%2C0.048%20%20%20c-0.174%2C0.198-0.153%2C0.501%2C0.045%2C0.676l3.883%2C3.375c0.09%2C0.075%2C0.198%2C0.115%2C0.312%2C0.115c0.141%2C0%2C0.273-0.061%2C0.362-0.166%20%20%20l3.371-3.877c0.173-0.2%2C0.151-0.502-0.047-0.675c-0.194-0.166-0.508-0.144-0.676%2C0.048l-2.592%2C2.979%20%20%20c-0.18-3.417-1.629-6.605-4.099-9.001c-2.538-2.461-5.877-3.817-9.404-3.817c-0.264%2C0-0.479%2C0.215-0.479%2C0.479%20%20%20C44.72%2C30.083%2C44.936%2C30.296%2C45.201%2C30.296z%22%3E%3C/path%3E%3C/g%3E%3C/svg%3E"}},t={};function n(i){var r=t[i];if(void 0!==r)return r.exports;var s=t[i]={id:i,exports:{}};return e[i](s,s.exports,n),s.exports}n.m=e,n.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var i in t)n.o(t,i)&&!n.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:t[i]})},n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.b=document.baseURI||self.location.href,n.nc=void 0;var i={};return(()=>{"use strict";n.d(i,{default:()=>MT});var e={};n.r(e),n.d(e,{ACESFilmicToneMapping:()=>Dt,AddEquation:()=>Ze,AddOperation:()=>St,AdditiveAnimationBlendMode:()=>vi,AdditiveBlending:()=>Xe,AgXToneMapping:()=>Ut,AlphaFormat:()=>gn,AlwaysCompare:()=>nr,AlwaysDepth:()=>yt,AlwaysStencilFunc:()=>Xi,AmbientLight:()=>ld,AnimationAction:()=>Zd,AnimationClip:()=>Ru,AnimationLoader:()=>Qu,AnimationMixer:()=>ep,AnimationObjectGroup:()=>Kd,AnimationUtils:()=>vu,ArcCurve:()=>Pc,ArrayCamera:()=>Sd,ArrowHelper:()=>Yp,AttachedBindMode:()=>Nt,Audio:()=>kd,AudioAnalyser:()=>Gd,AudioContext:()=>xd,AudioListener:()=>Ud,AudioLoader:()=>Cd,AxesHelper:()=>Jp,BackSide:()=>Ve,BasicDepthPacking:()=>xi,BasicShadowMap:()=>Fe,BatchedMesh:()=>nc,Bone:()=>vl,BooleanKeyframeTrack:()=>wu,Box2:()=>Ap,Box3:()=>cs,Box3Helper:()=>Vp,BoxGeometry:()=>ya,BoxHelper:()=>Hp,BufferAttribute:()=>Go,BufferGeometry:()=>sa,BufferGeometryLoader:()=>md,ByteType:()=>on,Cache:()=>Du,Camera:()=>_a,CameraHelper:()=>Qp,CanvasTexture:()=>Bc,CapsuleGeometry:()=>th,CatmullRomCurve3:()=>Qc,CineonToneMapping:()=>Lt,CircleGeometry:()=>nh,ClampToEdgeWrapping:()=>Wt,Clock:()=>Td,Color:()=>To,ColorKeyframeTrack:()=>_u,ColorManagement:()=>Gr,CompressedArrayTexture:()=>Sc,CompressedCubeTexture:()=>Tc,CompressedTexture:()=>Ic,CompressedTextureLoader:()=>zu,ConeGeometry:()=>rh,ConstantAlphaFactor:()=>At,ConstantColorFactor:()=>ft,Controls:()=>Zp,CubeCamera:()=>Ra,CubeReflectionMapping:()=>Qt,CubeRefractionMapping:()=>zt,CubeTexture:()=>La,CubeTextureLoader:()=>Hu,CubeUVReflectionMapping:()=>Vt,CubicBezierCurve:()=>Vc,CubicBezierCurve3:()=>jc,CubicInterpolant:()=>Eu,CullFaceBack:()=>ke,CullFaceFront:()=>Ne,CullFaceFrontBack:()=>Oe,CullFaceNone:()=>Ue,Curve:()=>Lc,CurvePath:()=>Zc,CustomBlending:()=>Ke,CustomToneMapping:()=>Pt,CylinderGeometry:()=>ih,Cylindrical:()=>pp,Data3DTexture:()=>is,DataArrayTexture:()=>ts,DataTexture:()=>yl,DataTextureLoader:()=>Vu,DataUtils:()=>Oo,DecrementStencilOp:()=>Ni,DecrementWrapStencilOp:()=>Fi,DefaultLoadingManager:()=>Uu,DepthFormat:()=>xn,DepthStencilFormat:()=>Cn,DepthTexture:()=>Rc,DetachedBindMode:()=>Ot,DirectionalLight:()=>ad,DirectionalLightHelper:()=>Np,DiscreteInterpolant:()=>xu,DodecahedronGeometry:()=>oh,DoubleSide:()=>je,DstAlphaFactor:()=>ct,DstColorFactor:()=>ut,DynamicCopyUsage:()=>hr,DynamicDrawUsage:()=>rr,DynamicReadUsage:()=>ar,EdgesGeometry:()=>uh,EllipseCurve:()=>Dc,EqualCompare:()=>Ki,EqualDepth:()=>xt,EqualStencilFunc:()=>Hi,EquirectangularReflectionMapping:()=>Gt,EquirectangularRefractionMapping:()=>Ht,Euler:()=>Ws,EventDispatcher:()=>gr,ExtrudeGeometry:()=>Qh,FileLoader:()=>Fu,Float16BufferAttribute:()=>Jo,Float32BufferAttribute:()=>Ko,FloatType:()=>un,Fog:()=>Oa,FogExp2:()=>Na,FramebufferTexture:()=>Mc,FrontSide:()=>He,Frustum:()=>Ol,GLBufferAttribute:()=>ap,GLSL1:()=>dr,GLSL3:()=>pr,GreaterCompare:()=>$i,GreaterDepth:()=>wt,GreaterEqualCompare:()=>tr,GreaterEqualDepth:()=>Ct,GreaterEqualStencilFunc:()=>qi,GreaterStencilFunc:()=>ji,GridHelper:()=>Lp,Group:()=>Pa,HalfFloatType:()=>dn,HemisphereLight:()=>qu,HemisphereLightHelper:()=>Rp,IcosahedronGeometry:()=>Gh,ImageBitmapLoader:()=>Ed,ImageLoader:()=>Gu,ImageUtils:()=>Wr,IncrementStencilOp:()=>ki,IncrementWrapStencilOp:()=>Oi,InstancedBufferAttribute:()=>Cl,InstancedBufferGeometry:()=>fd,InstancedInterleavedBuffer:()=>op,InstancedMesh:()=>Rl,Int16BufferAttribute:()=>Wo,Int32BufferAttribute:()=>Xo,Int8BufferAttribute:()=>Ho,IntType:()=>cn,InterleavedBuffer:()=>Qa,InterleavedBufferAttribute:()=>Ga,Interpolant:()=>yu,InterpolateDiscrete:()=>ui,InterpolateLinear:()=>di,InterpolateSmooth:()=>pi,InvertStencilOp:()=>Qi,KeepStencilOp:()=>Pi,KeyframeTrack:()=>Cu,LOD:()=>al,LatheGeometry:()=>eh,Layers:()=>qs,LessCompare:()=>Ji,LessDepth:()=>Et,LessEqualCompare:()=>Zi,LessEqualDepth:()=>bt,LessEqualStencilFunc:()=>Vi,LessStencilFunc:()=>Gi,Light:()=>Wu,LightProbe:()=>ud,Line:()=>uc,Line3:()=>yp,LineBasicMaterial:()=>ic,LineCurve:()=>Wc,LineCurve3:()=>qc,LineDashedMaterial:()=>du,LineLoop:()=>Ac,LineSegments:()=>mc,LinearFilter:()=>$t,LinearInterpolant:()=>bu,LinearMipMapLinearFilter:()=>rn,LinearMipMapNearestFilter:()=>tn,LinearMipmapLinearFilter:()=>nn,LinearMipmapNearestFilter:()=>en,LinearSRGBColorSpace:()=>Bi,LinearToneMapping:()=>Bt,LinearTransfer:()=>Ri,Loader:()=>ku,LoaderUtils:()=>pd,LoadingManager:()=>Pu,LoopOnce:()=>li,LoopPingPong:()=>hi,LoopRepeat:()=>ci,LuminanceAlphaFormat:()=>bn,LuminanceFormat:()=>En,MOUSE:()=>De,Material:()=>Lo,MaterialLoader:()=>dd,MathUtils:()=>Sr,Matrix2:()=>fp,Matrix3:()=>Br,Matrix4:()=>ks,MaxEquation:()=>nt,Mesh:()=>ga,MeshBasicMaterial:()=>Do,MeshDepthMaterial:()=>cu,MeshDistanceMaterial:()=>hu,MeshLambertMaterial:()=>lu,MeshMatcapMaterial:()=>uu,MeshNormalMaterial:()=>au,MeshPhongMaterial:()=>su,MeshPhysicalMaterial:()=>ru,MeshStandardMaterial:()=>iu,MeshToonMaterial:()=>ou,MinEquation:()=>tt,MirroredRepeatWrapping:()=>qt,MixOperation:()=>It,MultiplyBlending:()=>Je,MultiplyOperation:()=>Mt,NearestFilter:()=>Xt,NearestMipMapLinearFilter:()=>Zt,NearestMipMapNearestFilter:()=>Jt,NearestMipmapLinearFilter:()=>Kt,NearestMipmapNearestFilter:()=>Yt,NeutralToneMapping:()=>kt,NeverCompare:()=>Yi,NeverDepth:()=>vt,NeverStencilFunc:()=>zi,NoBlending:()=>We,NoColorSpace:()=>Si,NoToneMapping:()=>Tt,NormalAnimationBlendMode:()=>gi,NormalBlending:()=>qe,NotEqualCompare:()=>er,NotEqualDepth:()=>_t,NotEqualStencilFunc:()=>Wi,NumberKeyframeTrack:()=>Mu,Object3D:()=>co,ObjectLoader:()=>Ad,ObjectSpaceNormalMap:()=>Ii,OctahedronGeometry:()=>Hh,OneFactor:()=>rt,OneMinusConstantAlphaFactor:()=>gt,OneMinusConstantColorFactor:()=>mt,OneMinusDstAlphaFactor:()=>ht,OneMinusDstColorFactor:()=>dt,OneMinusSrcAlphaFactor:()=>lt,OneMinusSrcColorFactor:()=>ot,OrthographicCamera:()=>sd,PCFShadowMap:()=>Qe,PCFSoftShadowMap:()=>ze,PMREMGenerator:()=>Mf,Path:()=>$c,PerspectiveCamera:()=>Ta,Plane:()=>Ul,PlaneGeometry:()=>Vh,PlaneHelper:()=>jp,PointLight:()=>rd,PointLightHelper:()=>Ip,Points:()=>xc,PointsMaterial:()=>gc,PolarGridHelper:()=>Dp,PolyhedronGeometry:()=>sh,PositionalAudio:()=>zd,PropertyBinding:()=>Jd,PropertyMixer:()=>Hd,QuadraticBezierCurve:()=>Xc,QuadraticBezierCurve3:()=>Yc,Quaternion:()=>ss,QuaternionKeyframeTrack:()=>Su,QuaternionLinearInterpolant:()=>Iu,RED_GREEN_RGTC2_Format:()=>oi,RED_RGTC1_Format:()=>ri,REVISION:()=>Le,RGBADepthPacking:()=>Ci,RGBAFormat:()=>yn,RGBAIntegerFormat:()=>Tn,RGBA_ASTC_10x10_Format:()=>Zn,RGBA_ASTC_10x5_Format:()=>Yn,RGBA_ASTC_10x6_Format:()=>Jn,RGBA_ASTC_10x8_Format:()=>Kn,RGBA_ASTC_12x10_Format:()=>$n,RGBA_ASTC_12x12_Format:()=>ei,RGBA_ASTC_4x4_Format:()=>zn,RGBA_ASTC_5x4_Format:()=>Gn,RGBA_ASTC_5x5_Format:()=>Hn,RGBA_ASTC_6x5_Format:()=>Vn,RGBA_ASTC_6x6_Format:()=>jn,RGBA_ASTC_8x5_Format:()=>Wn,RGBA_ASTC_8x6_Format:()=>qn,RGBA_ASTC_8x8_Format:()=>Xn,RGBA_BPTC_Format:()=>ti,RGBA_ETC2_EAC_Format:()=>Qn,RGBA_PVRTC_2BPPV1_Format:()=>Nn,RGBA_PVRTC_4BPPV1_Format:()=>kn,RGBA_S3TC_DXT1_Format:()=>Rn,RGBA_S3TC_DXT3_Format:()=>Ln,RGBA_S3TC_DXT5_Format:()=>Dn,RGBDepthPacking:()=>wi,RGBFormat:()=>vn,RGBIntegerFormat:()=>Sn,RGB_BPTC_SIGNED_Format:()=>ni,RGB_BPTC_UNSIGNED_Format:()=>ii,RGB_ETC1_Format:()=>On,RGB_ETC2_Format:()=>Fn,RGB_PVRTC_2BPPV1_Format:()=>Un,RGB_PVRTC_4BPPV1_Format:()=>Pn,RGB_S3TC_DXT1_Format:()=>Bn,RGDepthPacking:()=>_i,RGFormat:()=>Mn,RGIntegerFormat:()=>In,RawShaderMaterial:()=>nu,Ray:()=>Us,Raycaster:()=>cp,RectAreaLight:()=>cd,RedFormat:()=>wn,RedIntegerFormat:()=>_n,ReinhardToneMapping:()=>Rt,RenderTarget:()=>$r,RenderTarget3D:()=>tp,RenderTargetArray:()=>np,RepeatWrapping:()=>jt,ReplaceStencilOp:()=>Ui,ReverseSubtractEquation:()=>et,RingGeometry:()=>jh,SIGNED_RED_GREEN_RGTC2_Format:()=>ai,SIGNED_RED_RGTC1_Format:()=>si,SRGBColorSpace:()=>Ti,SRGBTransfer:()=>Li,Scene:()=>Fa,ShaderChunk:()=>rf,ShaderLib:()=>of,ShaderMaterial:()=>wa,ShadowMaterial:()=>tu,Shape:()=>dh,ShapeGeometry:()=>Wh,ShapePath:()=>Kp,ShapeUtils:()=>Nh,ShortType:()=>an,Skeleton:()=>xl,SkeletonHelper:()=>_p,SkinnedMesh:()=>gl,Source:()=>Xr,Sphere:()=>Is,SphereGeometry:()=>qh,Spherical:()=>dp,SphericalHarmonics3:()=>hd,SplineCurve:()=>Jc,SpotLight:()=>$u,SpotLightHelper:()=>bp,Sprite:()=>il,SpriteMaterial:()=>Ha,SrcAlphaFactor:()=>at,SrcAlphaSaturateFactor:()=>pt,SrcColorFactor:()=>st,StaticCopyUsage:()=>cr,StaticDrawUsage:()=>ir,StaticReadUsage:()=>or,StereoCamera:()=>Id,StreamCopyUsage:()=>ur,StreamDrawUsage:()=>sr,StreamReadUsage:()=>lr,StringKeyframeTrack:()=>Tu,SubtractEquation:()=>$e,SubtractiveBlending:()=>Ye,TOUCH:()=>Pe,TangentSpaceNormalMap:()=>Mi,TetrahedronGeometry:()=>Xh,Texture:()=>Kr,TextureLoader:()=>ju,TextureUtils:()=>ef,TimestampQuery:()=>Ar,TorusGeometry:()=>Yh,TorusKnotGeometry:()=>Jh,Triangle:()=>wo,TriangleFanDrawMode:()=>bi,TriangleStripDrawMode:()=>Ei,TrianglesDrawMode:()=>yi,TubeGeometry:()=>Kh,UVMapping:()=>Ft,Uint16BufferAttribute:()=>qo,Uint32BufferAttribute:()=>Yo,Uint8BufferAttribute:()=>Vo,Uint8ClampedBufferAttribute:()=>jo,Uniform:()=>ip,UniformsGroup:()=>sp,UniformsLib:()=>sf,UniformsUtils:()=>Ca,UnsignedByteType:()=>sn,UnsignedInt248Type:()=>mn,UnsignedInt5999Type:()=>An,UnsignedIntType:()=>hn,UnsignedShort4444Type:()=>pn,UnsignedShort5551Type:()=>fn,UnsignedShortType:()=>ln,VSMShadowMap:()=>Ge,Vector2:()=>Tr,Vector3:()=>os,Vector4:()=>Zr,VectorKeyframeTrack:()=>Bu,VideoFrameTexture:()=>_c,VideoTexture:()=>wc,WebGL3DRenderTarget:()=>rs,WebGLArrayRenderTarget:()=>ns,WebGLCoordinateSystem:()=>fr,WebGLCubeRenderTarget:()=>Da,WebGLRenderTarget:()=>es,WebGLRenderer:()=>kA,WebGLUtils:()=>SA,WebGPUCoordinateSystem:()=>mr,WebXRController:()=>ka,WireframeGeometry:()=>Zh,WrapAroundEnding:()=>Ai,ZeroCurvatureEnding:()=>fi,ZeroFactor:()=>it,ZeroSlopeEnding:()=>mi,ZeroStencilOp:()=>Di,createCanvasElement:()=>kr});var t={};n.r(t),n.d(t,{computeMikkTSpaceTangents:()=>FA,computeMorphedAttributes:()=>YA,deepCloneAttribute:()=>GA,deinterleaveAttribute:()=>VA,deinterleaveGeometry:()=>jA,estimateBytesUsed:()=>WA,interleaveAttributes:()=>HA,mergeAttributes:()=>zA,mergeGeometries:()=>QA,mergeGroups:()=>JA,mergeVertices:()=>qA,toCreasedNormals:()=>KA,toTrianglesDrawMode:()=>XA});var r={};n.r(r),n.d(r,{checkARSupport:()=>cx,checkHeadsetConnected:()=>lx,checkVRSupport:()=>hx,isAppleVisionPro:()=>Ax,isBrowserEnvironment:()=>wx,isFirefoxReality:()=>Ex,isIOS:()=>gx,isIpad:()=>mx,isLandscape:()=>Cx,isMobile:()=>px,isMobileDeviceRequestingDesktopSite:()=>vx,isMobileVR:()=>bx,isNodeEnvironment:()=>_x,isOculusBrowser:()=>yx,isR7:()=>xx,isTablet:()=>fx,isWebXRAvailable:()=>sx});var s={};n.r(s),n.d(s,{clearObject:()=>Tx,createPool:()=>Sx,removeUnusedKeys:()=>Bx});var o={};n.r(o),n.d(o,{equals:()=>Nx,isCoordinate:()=>Fx,isCoordinates:()=>Ox,parse:()=>Ux,regex:()=>Dx,stringify:()=>kx,toVector3:()=>zx});var a={};n.r(a),n.d(a,{getComponentProperty:()=>Vx,getComponentPropertyPath:()=>Hx,setComponentProperty:()=>jx});var l={};n.r(l),n.d(l,{parseUrl:()=>Kx,validateCubemapSrc:()=>Jx,validateEnvMapSrc:()=>Yx,validateSrc:()=>Xx});var c={};n.r(c),n.d(c,{createCompatibleTexture:()=>cC,handleTextureEvents:()=>aC,isCompatibleTexture:()=>lC,setTextureProperties:()=>tC,updateDistortionMap:()=>rC,updateEnvMap:()=>oC,updateMap:()=>iC,updateMapMaterialFromData:()=>nC});var h={};n.r(h),n.d(h,{parse:()=>uC,stringify:()=>dC,toCamelCase:()=>pC});var u={};n.r(u),n.d(u,{checkControllerPresentAndSetup:()=>yC,emitIfAxesChanged:()=>xC,findMatchingControllerWebXR:()=>bC,isControllerPresentWebXR:()=>EC,onButtonEvent:()=>CC});var d={};n.r(d),n.d(d,{bind:()=>_C,checkHeadsetConnected:()=>MC,clone:()=>UC,coordinates:()=>o,debounce:()=>LC,debug:()=>$b,deepEqual:()=>OC,device:()=>r,diff:()=>FC,entity:()=>a,extend:()=>DC,extendDeep:()=>PC,findAllScenes:()=>jC,forceCanvasResizeSafariMobile:()=>Wx,getElData:()=>GC,getUrlParameter:()=>HC,isIOS:()=>IC,isIframed:()=>VC,isMobile:()=>SC,material:()=>c,objectPool:()=>s,shouldCaptureKeyEvent:()=>QC,split:()=>Gx,splitString:()=>zC,srcLoader:()=>l,styleParser:()=>h,throttle:()=>TC,throttleLeadingAndTrailing:()=>BC,throttleTick:()=>RC,trackedControls:()=>u});var p={};n.r(p),n.d(p,{isSingleProperty:()=>xw,parseProperties:()=>Mw,parseProperty:()=>Iw,process:()=>Cw,processPropertyDefinition:()=>ww,stringifyProperties:()=>Sw,stringifyProperty:()=>Tw});var f={};n.r(f),n.d(f,{Component:()=>Vw,components:()=>Bw,registerComponent:()=>Ww,registrationOrderWarnings:()=>jw});var m={};n.r(m),n.d(m,{System:()=>$w,registerSystem:()=>e_,systems:()=>Zw});var A={update:null,begin:null,loopBegin:null,changeBegin:null,change:null,changeComplete:null,loopComplete:null,complete:null,loop:1,direction:"normal",autoplay:!0,timelineOffset:0},g={duration:1e3,delay:0,endDelay:0,easing:"easeOutElastic(1, .5)",round:0},v=["translateX","translateY","translateZ","rotate","rotateX","rotateY","rotateZ","scale","scaleX","scaleY","scaleZ","skew","skewX","skewY","perspective"],y={CSS:{},springs:{}};function E(e,t,n){return Math.min(Math.max(e,t),n)}function b(e,t){return e.indexOf(t)>-1}function x(e,t){return e.apply(null,t)}var C=/(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i,w=/^rgb/,_=/^hsl/,M={arr:function(e){return Array.isArray(e)},obj:function(e){return b(Object.prototype.toString.call(e),"Object")},pth:function(e){return M.obj(e)&&e.hasOwnProperty("totalLength")},svg:function(e){return e instanceof SVGElement},inp:function(e){return e instanceof HTMLInputElement},dom:function(e){return e.nodeType||M.svg(e)},str:function(e){return"string"==typeof e},fnc:function(e){return"function"==typeof e},und:function(e){return void 0===e},hex:function(e){return C.test(e)},rgb:function(e){return w.test(e)},hsl:function(e){return _.test(e)},col:function(e){return M.hex(e)||M.rgb(e)||M.hsl(e)},key:function(e){return!A.hasOwnProperty(e)&&!g.hasOwnProperty(e)&&"targets"!==e&&"keyframes"!==e}},I=/\(([^)]+)\)/;function S(e){var t=I.exec(e);return t?t[1].split(",").map((function(e){return parseFloat(e)})):[]}function T(e,t){var n=S(e),i=E(M.und(n[0])?1:n[0],.1,100),r=E(M.und(n[1])?100:n[1],.1,100),s=E(M.und(n[2])?10:n[2],.1,100),o=E(M.und(n[3])?0:n[3],.1,100),a=Math.sqrt(r/i),l=s/(2*Math.sqrt(r*i)),c=l<1?a*Math.sqrt(1-l*l):0,h=l<1?(l*a-o)/c:-o+a;function u(e){var n=t?t*e/1e3:e;return n=l<1?Math.exp(-n*l*a)*(1*Math.cos(c*n)+h*Math.sin(c*n)):(1+h*n)*Math.exp(-n*a),0===e||1===e?e:1-n}return t?u:function(){var t=y.springs[e];if(t)return t;for(var n=1/6,i=0,r=0;;)if(1===u(i+=n)){if(++r>=16)break}else r=0;var s=i*n*1e3;return y.springs[e]=s,s}}function B(e,t){void 0===e&&(e=1),void 0===t&&(t=.5);var n=E(e,1,10),i=E(t,.1,2);return function(e){return 0===e||1===e?e:-n*Math.pow(2,10*(e-1))*Math.sin((e-1-i/(2*Math.PI)*Math.asin(1/n))*(2*Math.PI)/i)}}function R(e){return void 0===e&&(e=10),function(t){return Math.round(t*e)*(1/e)}}var L=function(){var e=.1;function t(e,t){return 1-3*t+3*e}function n(e,t){return 3*t-6*e}function i(e){return 3*e}function r(e,r,s){return((t(r,s)*e+n(r,s))*e+i(r))*e}function s(e,r,s){return 3*t(r,s)*e*e+2*n(r,s)*e+i(r)}return function(t,n,i,o){if(0<=t&&t<=1&&0<=i&&i<=1){var a=new Float32Array(11);if(t!==n||i!==o)for(var l=0;l<11;++l)a[l]=r(l*e,t,i);return function(l){return t===n&&i===o||0===l||1===l?l:r(function(n){for(var o=0,l=1;10!==l&&a[l]<=n;++l)o+=e;--l;var c=o+(n-a[l])/(a[l+1]-a[l])*e,h=s(c,t,i);return h>=.001?function(e,t,n,i){for(var o=0;o<4;++o){var a=s(t,n,i);if(0===a)return t;t-=(r(t,n,i)-e)/a}return t}(n,c,t,i):0===h?c:function(e,t,n,i,s){var o,a,l=0;do{(o=r(a=t+(n-t)/2,i,s)-e)>0?n=a:t=a}while(Math.abs(o)>1e-7&&++l<10);return a}(n,o,o+e,t,i)}(l),n,o)}}}}(),D=function(){var e=["Quad","Cubic","Quart","Quint","Sine","Expo","Circ","Back","Elastic"],t={In:[[.55,.085,.68,.53],[.55,.055,.675,.19],[.895,.03,.685,.22],[.755,.05,.855,.06],[.47,0,.745,.715],[.95,.05,.795,.035],[.6,.04,.98,.335],[.6,-.28,.735,.045],B],Out:[[.25,.46,.45,.94],[.215,.61,.355,1],[.165,.84,.44,1],[.23,1,.32,1],[.39,.575,.565,1],[.19,1,.22,1],[.075,.82,.165,1],[.175,.885,.32,1.275],function(e,t){return function(n){return 1-B(e,t)(1-n)}}],InOut:[[.455,.03,.515,.955],[.645,.045,.355,1],[.77,0,.175,1],[.86,0,.07,1],[.445,.05,.55,.95],[1,0,0,1],[.785,.135,.15,.86],[.68,-.55,.265,1.55],function(e,t){return function(n){return n<.5?B(e,t)(2*n)/2:1-B(e,t)(-2*n+2)/2}}]},n={linear:[.25,.25,.75,.75]};for(var i in t)for(var r=0,s=t[i].length;r<s;r++)n["ease"+i+e[r]]=t[i][r];return n}();function P(e,t){if(M.fnc(e))return e;var n=e.split("(")[0],i=D[n],r=S(e);switch(n){case"spring":return T(e,t);case"cubicBezier":return x(L,r);case"steps":return x(R,r);default:return M.fnc(i)?x(i,r):x(L,i)}}function U(e){try{return document.querySelectorAll(e)}catch(e){return}}var k=[];function N(e,t){for(var n=k,i=e.length,r=arguments.length>=2?arguments[1]:void 0,s=0;s<i;s++)if(s in e){var o=e[s];t.call(r,o,s,e)&&n.push(o)}return(k=e).length=0,n}function O(e,t){t||(t=[]);for(var n=0,i=e.length;n<i;n++){var r=e[n];Array.isArray(r)?O(r,t):t.push(r)}return t}function F(e){return M.arr(e)?e:(M.str(e)&&(e=U(e)||e),e instanceof NodeList||e instanceof HTMLCollection?[].slice.call(e):[e])}function Q(e,t){return e.some((function(e){return e===t}))}function z(e){var t={};for(var n in e)t[n]=e[n];return t}function G(e,t){var n=z(e);for(var i in e)n[i]=t.hasOwnProperty(i)?t[i]:e[i];return n}function H(e,t){var n=z(e);for(var i in t)n[i]=M.und(e[i])?t[i]:e[i];return n}var V=/rgb\((\d+,\s*[\d]+,\s*[\d]+)\)/g,j=/^#?([a-f\d])([a-f\d])([a-f\d])$/i,W=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i,q=/hsl\((\d+),\s*([\d.]+)%,\s*([\d.]+)%\)/g,X=/hsla\((\d+),\s*([\d.]+)%,\s*([\d.]+)%,\s*([\d.]+)\)/g;var Y=/([\+\-]?[0-9#\.]+)(%|px|pt|em|rem|in|cm|mm|ex|ch|pc|vw|vh|vmin|vmax|deg|rad|turn)?$/;function J(e){var t=Y.exec(e);if(t)return t[2]}function K(e,t){return M.fnc(e)?e(t.target,t.id,t.total):e}function Z(e,t){return e.getAttribute(t)}function $(e,t,n){if(Q([n,"deg","rad","turn"],J(t)))return t;var i=y.CSS[t+n];if(!M.und(i))return i;var r=document.createElement(e.tagName),s=e.parentNode&&e.parentNode!==document?e.parentNode:document.body;s.appendChild(r),r.style.position="absolute",r.style.width=100+n;var o=100/r.offsetWidth;s.removeChild(r);var a=o*parseFloat(t);return y.CSS[t+n]=a,a}function ee(e,t,n){if(t in e.style){var i=t.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase(),r=e.style[t]||getComputedStyle(e).getPropertyValue(i)||"0";return n?$(e,r,n):r}}function te(e,t){return M.dom(e)&&!M.inp(e)&&(Z(e,t)||M.svg(e)&&e[t])?"attribute":M.dom(e)&&Q(v,t)?"transform":M.dom(e)&&"transform"!==t&&ee(e,t)?"css":null!=e[t]?"object":void 0}var ne=/(\w+)\(([^)]*)\)/g;function ie(e){if(M.dom(e)){for(var t,n=e.style.transform||"",i=new Map;t=ne.exec(n);)i.set(t[1],t[2]);return i}}function re(e,t,n,i){switch(te(e,t)){case"transform":return function(e,t,n,i){var r=b(t,"scale")?1:0+function(e){return b(e,"translate")||"perspective"===e?"px":b(e,"rotate")||b(e,"skew")?"deg":void 0}(t),s=ie(e).get(t)||r;return n&&(n.transforms.list.set(t,s),n.transforms.last=t),i?$(e,s,i):s}(e,t,i,n);case"css":return ee(e,t,n);case"attribute":return Z(e,t);default:return e[t]||0}}var se=/^(\*=|\+=|-=)/;function oe(e,t){var n=se.exec(e);if(!n)return e;var i=J(e)||0,r=parseFloat(t),s=parseFloat(e.replace(n[0],""));switch(n[0][0]){case"+":return r+s+i;case"-":return r-s+i;case"*":return r*s+i}}var ae=/\s/g;function le(e,t){if(M.col(e))return function(e){return M.rgb(e)?(t=e,(n=V.exec(t))?"rgba("+n[1]+",1)":t):M.hex(e)?function(e){var t=e.replace(j,(function(e,t,n,i){return t+t+n+n+i+i})),n=W.exec(t);return"rgba("+parseInt(n[1],16)+","+parseInt(n[2],16)+","+parseInt(n[3],16)+",1)"}(e):M.hsl(e)?function(e){var t,n,i,r=q.exec(e)||X.exec(e),s=parseInt(r[1],10)/360,o=parseInt(r[2],10)/100,a=parseInt(r[3],10)/100,l=r[4]||1;function c(e,t,n){return n<0&&(n+=1),n>1&&(n-=1),n<1/6?e+6*(t-e)*n:n<.5?t:n<2/3?e+(t-e)*(2/3-n)*6:e}if(0==o)t=n=i=a;else{var h=a<.5?a*(1+o):a+o-a*o,u=2*a-h;t=c(u,h,s+1/3),n=c(u,h,s),i=c(u,h,s-1/3)}return"rgba("+255*t+","+255*n+","+255*i+","+l+")"}(e):void 0;var t,n}(e);var n=J(e),i=n?e.substr(0,e.length-n.length):e;return t&&!ae.test(e)?i+t:i}function ce(e,t){return Math.sqrt(Math.pow(t.x-e.x,2)+Math.pow(t.y-e.y,2))}function he(e){for(var t,n=e.points,i=0,r=0;r<n.numberOfItems;r++){var s=n.getItem(r);r>0&&(i+=ce(t,s)),t=s}return i}function ue(e){if(e.getTotalLength)return e.getTotalLength();switch(e.tagName.toLowerCase()){case"circle":return function(e){return 2*Math.PI*Z(e,"r")}(e);case"rect":return function(e){return 2*Z(e,"width")+2*Z(e,"height")}(e);case"line":return function(e){return ce({x:Z(e,"x1"),y:Z(e,"y1")},{x:Z(e,"x2"),y:Z(e,"y2")})}(e);case"polyline":return he(e);case"polygon":return function(e){var t=e.points;return he(e)+ce(t.getItem(t.numberOfItems-1),t.getItem(0))}(e)}}function de(e,t){var n=t||{},i=n.el||function(e){for(var t=e.parentNode;M.svg(t)&&(t=t.parentNode,M.svg(t.parentNode)););return t}(e),r=i.getBoundingClientRect(),s=Z(i,"viewBox"),o=r.width,a=r.height,l=n.viewBox||(s?s.split(" "):[0,0,o,a]);return{el:i,viewBox:l,x:l[0]/1,y:l[1]/1,w:o/l[2],h:a/l[3]}}function pe(e,t){function n(n){void 0===n&&(n=0);var i=t+n>=1?t+n:0;return e.el.getPointAtLength(i)}var i=de(e.el,e.svg),r=n(),s=n(-1),o=n(1);switch(e.property){case"x":return(r.x-i.x)*i.w;case"y":return(r.y-i.y)*i.h;case"angle":return 180*Math.atan2(o.y-s.y,o.x-s.x)/Math.PI}}var fe=/-?\d*\.?\d+/g;function me(e,t){var n=le(M.pth(e)?e.totalLength:e,t)+"";return{original:n,numbers:n.match(fe)?n.match(fe).map(Number):[0],strings:M.str(e)||t?n.split(fe):[]}}function Ae(e){return N(e?O(M.arr(e)?e.map(F):F(e)):[],(function(e,t,n){return n.indexOf(e)===t}))}function ge(e){var t=Ae(e);return t.map((function(e,n){return{target:e,id:n,total:t.length,transforms:{list:ie(e)}}}))}var ve=/^spring/;function ye(e,t){var n=z(t);if(ve.test(n.easing)&&(n.duration=T(n.easing)),M.arr(e)){var i=e.length;2!==i||M.obj(e[0])?M.fnc(t.duration)||(n.duration=t.duration/i):e={value:e}}var r=M.arr(e)?e:[e];return r.map((function(e,n){var i=M.obj(e)&&!M.pth(e)?e:{value:e};return M.und(i.delay)&&(i.delay=n?0:t.delay),M.und(i.endDelay)&&(i.endDelay=n===r.length-1?t.endDelay:0),i})).map((function(e){return H(e,n)}))}var Ee={css:function(e,t,n){return e.style[t]=n},attribute:function(e,t,n){return e.setAttribute(t,n)},object:function(e,t,n){return e[t]=n},transform:function(e,t,n,i,r){if(i.list.set(t,n),t===i.last||r){var s="";i.list.forEach((function(e,t){s+=t+"("+e+") "})),e.style.transform=s}}};function be(e,t){for(var n=ge(e),i=0,r=n.length;i<r;i++){var s=n[i];for(var o in t){var a=K(t[o],s),l=s.target,c=J(a),h=re(l,o,c,s),u=oe(le(a,c||J(h)),h),d=te(l,o);Ee[d](l,o,u,s.transforms,!0)}}}function xe(e,t){return N(O(e.map((function(e){return t.map((function(t){return function(e,t){var n=te(e.target,t.name);if(n){var i=function(e,t){var n;return e.tweens.map((function(i){var r=function(e,t){var n={};for(var i in e){var r=K(e[i],t);M.arr(r)&&1===(r=r.map((function(e){return K(e,t)}))).length&&(r=r[0]),n[i]=r}return n.duration=parseFloat(n.duration),n.delay=parseFloat(n.delay),n}(i,t),s=r.value,o=M.arr(s)?s[1]:s,a=J(o),l=re(t.target,e.name,a,t),c=n?n.to.original:l,h=M.arr(s)?s[0]:c,u=J(h)||J(l),d=a||u;return M.und(o)&&(o=c),r.from=me(h,d),r.to=me(oe(o,h),d),r.start=n?n.end:0,r.end=r.start+r.delay+r.duration+r.endDelay,r.easing=P(r.easing,r.duration),r.isPath=M.pth(s),r.isColor=M.col(r.from.original),r.isColor&&(r.round=1),n=r,r}))}(t,e),r=i[i.length-1];return{type:n,property:t.name,animatable:e,tweens:i,duration:r.end,delay:i[0].delay,endDelay:r.endDelay}}}(e,t)}))}))),(function(e){return!M.und(e)}))}function Ce(e,t){var n=e.length,i=function(e){return e.timelineOffset?e.timelineOffset:0},r={};return r.duration=n?Math.max.apply(Math,e.map((function(e){return i(e)+e.duration}))):t.duration,r.delay=n?Math.min.apply(Math,e.map((function(e){return i(e)+e.delay}))):t.delay,r.endDelay=n?r.duration-Math.max.apply(Math,e.map((function(e){return i(e)+e.duration-e.endDelay}))):t.endDelay,r}var we,_e=0,Me=[],Ie=[],Se=function(){function e(){we=requestAnimationFrame(t)}function t(t){var n=Me.length;if(n){for(var i=0;i<n;){var r=Me[i];if(r.paused){var s=Me.indexOf(r);s>-1&&(Me.splice(s,1),n=Me.length)}else r.tick(t);i++}e()}else we=cancelAnimationFrame(we)}return e}();function Te(e){void 0===e&&(e={});var t,n=0,i=0,r=0,s=0,o=null;function a(){return window.Promise&&new Promise((function(e){return o=e}))}var l=a(),c=function(e){var t=G(A,e),n=G(g,e),i=function(e,t){var n=[],i=t.keyframes;for(var r in i&&(t=H(function(e){for(var t=N(O(e.map((function(e){return Object.keys(e)}))),(function(e){return M.key(e)})).reduce((function(e,t){return e.indexOf(t)<0&&e.push(t),e}),[]),n={},i=function(i){var r=t[i];n[r]=e.map((function(e){var t={};for(var n in e)M.key(n)?n==r&&(t.value=e[n]):t[n]=e[n];return t}))},r=0;r<t.length;r++)i(r);return n}(i),t)),t)M.key(r)&&n.push({name:r,tweens:ye(t[r],e)});return n}(n,e),r=ge(e.targets),s=xe(r,i),o=Ce(s,n),a=_e;return _e++,H(t,{id:a,children:[],animatables:r,animations:s,duration:o.duration,delay:o.delay,endDelay:o.endDelay})}(e);function h(){c.reversed=!c.reversed;for(var e=0,n=t.length;e<n;e++)t[e].reversed=c.reversed}function u(e){return c.reversed?c.duration-e:e}function d(){n=0,i=u(c.currentTime)*(1/Te.speed)}function p(e,t){t&&t.seek(e-t.timelineOffset)}function f(e){for(var t=0,n=c.animations,i=n.length;t<i;){var r=n[t],s=r.animatable,o=r.tweens,a=o.length-1,l=o[a];a&&(l=N(o,(function(t){return e<t.end}))[0]||l);for(var h=E(e-l.start-l.delay,0,l.duration)/l.duration,u=isNaN(h)?1:l.easing(h),d=l.to.strings,p=l.round,f=[],m=l.to.numbers.length,A=void 0,g=0;g<m;g++){var v=void 0,y=l.to.numbers[g],b=l.from.numbers[g]||0;v=l.isPath?pe(l.value,u*y):b+u*(y-b),p&&(l.isColor&&g>2||(v=Math.round(v*p)/p)),f.push(v)}var x=d.length;if(x){A=d[0];for(var C=0;C<x;C++){d[C];var w=d[C+1],_=f[C];isNaN(_)||(A+=w?_+w:_+" ")}}else A=f[0];Ee[r.type](s.target,r.property,A,s.transforms),r.currentValue=A,t++}}function m(e){c[e]&&!c.passThrough&&c[e](c)}function v(e){var d=c.duration,A=c.delay,g=d-c.endDelay,v=u(e);c.progress=E(v/d*100,0,100),c.reversePlayback=v<c.currentTime,t&&function(e){if(c.reversePlayback)for(var n=s;n--;)p(e,t[n]);else for(var i=0;i<s;i++)p(e,t[i])}(v),!c.began&&c.currentTime>0&&(c.began=!0,m("begin"),m("loopBegin")),v<=A&&0!==c.currentTime&&f(0),(v>=g&&c.currentTime!==d||!d)&&f(d),v>A&&v<g?(c.changeBegan||(c.changeBegan=!0,c.changeCompleted=!1,m("changeBegin")),m("change"),f(v)):c.changeBegan&&(c.changeCompleted=!0,c.changeBegan=!1,m("changeComplete")),c.currentTime=E(v,0,d),c.began&&m("update"),e>=d&&(i=0,c.remaining&&!0!==c.remaining&&c.remaining--,c.remaining?(n=r,m("loopComplete"),m("loopBegin"),"alternate"===c.direction&&h()):(c.paused=!0,c.completed||(c.completed=!0,m("loopComplete"),m("complete"),"Promise"in window&&(o(),l=a()))))}return c.reset=function(){var e=c.direction;c.passThrough=!1,c.currentTime=0,c.progress=0,c.paused=!0,c.began=!1,c.changeBegan=!1,c.completed=!1,c.changeCompleted=!1,c.reversePlayback=!1,c.reversed="reverse"===e,c.remaining=c.loop,t=c.children;for(var n=s=t.length;n--;)c.children[n].reset();(c.reversed&&!0!==c.loop||"alternate"===e&&1===c.loop)&&c.remaining++,f(0)},c.set=function(e,t){return be(e,t),c},c.tick=function(e){r=e,n||(n=r),v((r+(i-n))*Te.speed)},c.seek=function(e){v(u(e))},c.pause=function(){c.paused=!0,d()},c.play=function(){c.paused&&(c.paused=!1,Me.push(c),d(),we||Se())},c.reverse=function(){h(),d()},c.restart=function(){c.reset(),c.play()},c.finished=l,c.reset(),c.autoplay&&c.play(),c}function Be(e,t){for(var n=t.length;n--;)Q(e,t[n].animatable.target)&&t.splice(n,1)}document.addEventListener("visibilitychange",(function(){if(document.hidden){for(var e=0,t=Me.length;e<t;e++)activeInstance[e].pause();Ie=Me.slice(0),Me=[]}else for(var n=0,i=Ie.length;n<i;n++)Ie[n].play()})),Te.version="3.0.0",Te.speed=1,Te.running=Me,Te.remove=function(e){for(var t=Ae(e),n=Me.length;n--;){var i=Me[n],r=i.animations,s=i.children;Be(t,r);for(var o=s.length;o--;){var a=s[o],l=a.animations;Be(t,l),l.length||a.children.length||s.splice(o,1)}r.length||s.length||i.pause()}},Te.get=re,Te.set=be,Te.convertPx=$,Te.path=function(e,t){var n=M.str(e)?U(e)[0]:e,i=t||100;return function(e){return{property:e,el:n,svg:de(n),totalLength:ue(n)*(i/100)}}},Te.setDashoffset=function(e){var t=ue(e);return e.setAttribute("stroke-dasharray",t),t},Te.stagger=function(e,t){void 0===t&&(t={});var n=t.direction||"normal",i=t.easing?P(t.easing):null,r=t.grid,s=t.axis,o=t.from||0,a="first"===o,l="center"===o,c="last"===o,h=M.arr(e),u=h?parseFloat(e[0]):parseFloat(e),d=h?parseFloat(e[1]):0,p=J(h?e[1]:e)||0,f=t.start||0+(h?u:0),m=[],A=0;return function(e,t,g){if(a&&(o=0),l&&(o=(g-1)/2),c&&(o=g-1),!m.length){for(var v=0;v<g;v++){if(r){var y=l?(r[0]-1)/2:o%r[0],E=l?(r[1]-1)/2:Math.floor(o/r[0]),b=y-v%r[0],x=E-Math.floor(v/r[0]),C=Math.sqrt(b*b+x*x);"x"===s&&(C=-b),"y"===s&&(C=-x),m.push(C)}else m.push(Math.abs(o-v));A=Math.max.apply(Math,m)}i&&(m=m.map((function(e){return i(e/A)*A}))),"reverse"===n&&(m=m.map((function(e){return s?e<0?-1*e:-e:Math.abs(A-e)})))}return f+(h?(d-u)/A:u)*(Math.round(100*m[t])/100)+p}},Te.timeline=function(e){void 0===e&&(e={});var t=Te(e);return t.duration=0,t.add=function(n,i){var r=Me.indexOf(t),s=t.children;function o(e){e.passThrough=!0}r>-1&&Me.splice(r,1);for(var a=0;a<s.length;a++)o(s[a]);var l=H(n,G(g,e));l.targets=l.targets||e.targets;var c=t.duration;l.autoplay=!1,l.direction=t.direction,l.timelineOffset=M.und(i)?c:oe(i,c),o(t),t.seek(l.timelineOffset);var h=Te(l);o(h),s.push(h);var u=Ce(s,e);return t.delay=u.delay,t.endDelay=u.endDelay,t.duration=u.duration,t.seek(0),t.reset(),t.autoplay&&t.play(),t},t},Te.easing=P,Te.penner=D,Te.random=function(e,t){return Math.floor(Math.random()*(t-e+1))+e};const Re=Te,Le="173",De={LEFT:0,MIDDLE:1,RIGHT:2,ROTATE:0,DOLLY:1,PAN:2},Pe={ROTATE:0,PAN:1,DOLLY_PAN:2,DOLLY_ROTATE:3},Ue=0,ke=1,Ne=2,Oe=3,Fe=0,Qe=1,ze=2,Ge=3,He=0,Ve=1,je=2,We=0,qe=1,Xe=2,Ye=3,Je=4,Ke=5,Ze=100,$e=101,et=102,tt=103,nt=104,it=200,rt=201,st=202,ot=203,at=204,lt=205,ct=206,ht=207,ut=208,dt=209,pt=210,ft=211,mt=212,At=213,gt=214,vt=0,yt=1,Et=2,bt=3,xt=4,Ct=5,wt=6,_t=7,Mt=0,It=1,St=2,Tt=0,Bt=1,Rt=2,Lt=3,Dt=4,Pt=5,Ut=6,kt=7,Nt="attached",Ot="detached",Ft=300,Qt=301,zt=302,Gt=303,Ht=304,Vt=306,jt=1e3,Wt=1001,qt=1002,Xt=1003,Yt=1004,Jt=1004,Kt=1005,Zt=1005,$t=1006,en=1007,tn=1007,nn=1008,rn=1008,sn=1009,on=1010,an=1011,ln=1012,cn=1013,hn=1014,un=1015,dn=1016,pn=1017,fn=1018,mn=1020,An=35902,gn=1021,vn=1022,yn=1023,En=1024,bn=1025,xn=1026,Cn=1027,wn=1028,_n=1029,Mn=1030,In=1031,Sn=1032,Tn=1033,Bn=33776,Rn=33777,Ln=33778,Dn=33779,Pn=35840,Un=35841,kn=35842,Nn=35843,On=36196,Fn=37492,Qn=37496,zn=37808,Gn=37809,Hn=37810,Vn=37811,jn=37812,Wn=37813,qn=37814,Xn=37815,Yn=37816,Jn=37817,Kn=37818,Zn=37819,$n=37820,ei=37821,ti=36492,ni=36494,ii=36495,ri=36283,si=36284,oi=36285,ai=36286,li=2200,ci=2201,hi=2202,ui=2300,di=2301,pi=2302,fi=2400,mi=2401,Ai=2402,gi=2500,vi=2501,yi=0,Ei=1,bi=2,xi=3200,Ci=3201,wi=3202,_i=3203,Mi=0,Ii=1,Si="",Ti="srgb",Bi="srgb-linear",Ri="linear",Li="srgb",Di=0,Pi=7680,Ui=7681,ki=7682,Ni=7683,Oi=34055,Fi=34056,Qi=5386,zi=512,Gi=513,Hi=514,Vi=515,ji=516,Wi=517,qi=518,Xi=519,Yi=512,Ji=513,Ki=514,Zi=515,$i=516,er=517,tr=518,nr=519,ir=35044,rr=35048,sr=35040,or=35045,ar=35049,lr=35041,cr=35046,hr=35050,ur=35042,dr="100",pr="300 es",fr=2e3,mr=2001,Ar={COMPUTE:"compute",RENDER:"render"};class gr{addEventListener(e,t){void 0===this._listeners&&(this._listeners={});const n=this._listeners;void 0===n[e]&&(n[e]=[]),-1===n[e].indexOf(t)&&n[e].push(t)}hasEventListener(e,t){const n=this._listeners;return void 0!==n&&void 0!==n[e]&&-1!==n[e].indexOf(t)}removeEventListener(e,t){const n=this._listeners;if(void 0===n)return;const i=n[e];if(void 0!==i){const e=i.indexOf(t);-1!==e&&i.splice(e,1)}}dispatchEvent(e){const t=this._listeners;if(void 0===t)return;const n=t[e.type];if(void 0!==n){e.target=this;const t=n.slice(0);for(let n=0,i=t.length;n<i;n++)t[n].call(this,e);e.target=null}}}const vr=["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"];let yr=1234567;const Er=Math.PI/180,br=180/Math.PI;function xr(){const e=4294967295*Math.random()|0,t=4294967295*Math.random()|0,n=4294967295*Math.random()|0,i=4294967295*Math.random()|0;return(vr[255&e]+vr[e>>8&255]+vr[e>>16&255]+vr[e>>24&255]+"-"+vr[255&t]+vr[t>>8&255]+"-"+vr[t>>16&15|64]+vr[t>>24&255]+"-"+vr[63&n|128]+vr[n>>8&255]+"-"+vr[n>>16&255]+vr[n>>24&255]+vr[255&i]+vr[i>>8&255]+vr[i>>16&255]+vr[i>>24&255]).toLowerCase()}function Cr(e,t,n){return Math.max(t,Math.min(n,e))}function wr(e,t){return(e%t+t)%t}function _r(e,t,n){return(1-n)*e+n*t}function Mr(e,t){switch(t.constructor){case Float32Array:return e;case Uint32Array:return e/4294967295;case Uint16Array:return e/65535;case Uint8Array:return e/255;case Int32Array:return Math.max(e/2147483647,-1);case Int16Array:return Math.max(e/32767,-1);case Int8Array:return Math.max(e/127,-1);default:throw new Error("Invalid component type.")}}function Ir(e,t){switch(t.constructor){case Float32Array:return e;case Uint32Array:return Math.round(4294967295*e);case Uint16Array:return Math.round(65535*e);case Uint8Array:return Math.round(255*e);case Int32Array:return Math.round(2147483647*e);case Int16Array:return Math.round(32767*e);case Int8Array:return Math.round(127*e);default:throw new Error("Invalid component type.")}}const Sr={DEG2RAD:Er,RAD2DEG:br,generateUUID:xr,clamp:Cr,euclideanModulo:wr,mapLinear:function(e,t,n,i,r){return i+(e-t)*(r-i)/(n-t)},inverseLerp:function(e,t,n){return e!==t?(n-e)/(t-e):0},lerp:_r,damp:function(e,t,n,i){return _r(e,t,1-Math.exp(-n*i))},pingpong:function(e,t=1){return t-Math.abs(wr(e,2*t)-t)},smoothstep:function(e,t,n){return e<=t?0:e>=n?1:(e=(e-t)/(n-t))*e*(3-2*e)},smootherstep:function(e,t,n){return e<=t?0:e>=n?1:(e=(e-t)/(n-t))*e*e*(e*(6*e-15)+10)},randInt:function(e,t){return e+Math.floor(Math.random()*(t-e+1))},randFloat:function(e,t){return e+Math.random()*(t-e)},randFloatSpread:function(e){return e*(.5-Math.random())},seededRandom:function(e){void 0!==e&&(yr=e);let t=yr+=1831565813;return t=Math.imul(t^t>>>15,1|t),t^=t+Math.imul(t^t>>>7,61|t),((t^t>>>14)>>>0)/4294967296},degToRad:function(e){return e*Er},radToDeg:function(e){return e*br},isPowerOfTwo:function(e){return!(e&e-1)&&0!==e},ceilPowerOfTwo:function(e){return Math.pow(2,Math.ceil(Math.log(e)/Math.LN2))},floorPowerOfTwo:function(e){return Math.pow(2,Math.floor(Math.log(e)/Math.LN2))},setQuaternionFromProperEuler:function(e,t,n,i,r){const s=Math.cos,o=Math.sin,a=s(n/2),l=o(n/2),c=s((t+i)/2),h=o((t+i)/2),u=s((t-i)/2),d=o((t-i)/2),p=s((i-t)/2),f=o((i-t)/2);switch(r){case"XYX":e.set(a*h,l*u,l*d,a*c);break;case"YZY":e.set(l*d,a*h,l*u,a*c);break;case"ZXZ":e.set(l*u,l*d,a*h,a*c);break;case"XZX":e.set(a*h,l*f,l*p,a*c);break;case"YXY":e.set(l*p,a*h,l*f,a*c);break;case"ZYZ":e.set(l*f,l*p,a*h,a*c);break;default:console.warn("THREE.MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: "+r)}},normalize:Ir,denormalize:Mr};class Tr{constructor(e=0,t=0){Tr.prototype.isVector2=!0,this.x=e,this.y=t}get width(){return this.x}set width(e){this.x=e}get height(){return this.y}set height(e){this.y=e}set(e,t){return this.x=e,this.y=t,this}setScalar(e){return this.x=e,this.y=e,this}setX(e){return this.x=e,this}setY(e){return this.y=e,this}setComponent(e,t){switch(e){case 0:this.x=t;break;case 1:this.y=t;break;default:throw new Error("index is out of range: "+e)}return this}getComponent(e){switch(e){case 0:return this.x;case 1:return this.y;default:throw new Error("index is out of range: "+e)}}clone(){return new this.constructor(this.x,this.y)}copy(e){return this.x=e.x,this.y=e.y,this}add(e){return this.x+=e.x,this.y+=e.y,this}addScalar(e){return this.x+=e,this.y+=e,this}addVectors(e,t){return this.x=e.x+t.x,this.y=e.y+t.y,this}addScaledVector(e,t){return this.x+=e.x*t,this.y+=e.y*t,this}sub(e){return this.x-=e.x,this.y-=e.y,this}subScalar(e){return this.x-=e,this.y-=e,this}subVectors(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this}multiply(e){return this.x*=e.x,this.y*=e.y,this}multiplyScalar(e){return this.x*=e,this.y*=e,this}divide(e){return this.x/=e.x,this.y/=e.y,this}divideScalar(e){return this.multiplyScalar(1/e)}applyMatrix3(e){const t=this.x,n=this.y,i=e.elements;return this.x=i[0]*t+i[3]*n+i[6],this.y=i[1]*t+i[4]*n+i[7],this}min(e){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this}max(e){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this}clamp(e,t){return this.x=Cr(this.x,e.x,t.x),this.y=Cr(this.y,e.y,t.y),this}clampScalar(e,t){return this.x=Cr(this.x,e,t),this.y=Cr(this.y,e,t),this}clampLength(e,t){const n=this.length();return this.divideScalar(n||1).multiplyScalar(Cr(n,e,t))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this}negate(){return this.x=-this.x,this.y=-this.y,this}dot(e){return this.x*e.x+this.y*e.y}cross(e){return this.x*e.y-this.y*e.x}lengthSq(){return this.x*this.x+this.y*this.y}length(){return Math.sqrt(this.x*this.x+this.y*this.y)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)}normalize(){return this.divideScalar(this.length()||1)}angle(){return Math.atan2(-this.y,-this.x)+Math.PI}angleTo(e){const t=Math.sqrt(this.lengthSq()*e.lengthSq());if(0===t)return Math.PI/2;const n=this.dot(e)/t;return Math.acos(Cr(n,-1,1))}distanceTo(e){return Math.sqrt(this.distanceToSquared(e))}distanceToSquared(e){const t=this.x-e.x,n=this.y-e.y;return t*t+n*n}manhattanDistanceTo(e){return Math.abs(this.x-e.x)+Math.abs(this.y-e.y)}setLength(e){return this.normalize().multiplyScalar(e)}lerp(e,t){return this.x+=(e.x-this.x)*t,this.y+=(e.y-this.y)*t,this}lerpVectors(e,t,n){return this.x=e.x+(t.x-e.x)*n,this.y=e.y+(t.y-e.y)*n,this}equals(e){return e.x===this.x&&e.y===this.y}fromArray(e,t=0){return this.x=e[t],this.y=e[t+1],this}toArray(e=[],t=0){return e[t]=this.x,e[t+1]=this.y,e}fromBufferAttribute(e,t){return this.x=e.getX(t),this.y=e.getY(t),this}rotateAround(e,t){const n=Math.cos(t),i=Math.sin(t),r=this.x-e.x,s=this.y-e.y;return this.x=r*n-s*i+e.x,this.y=r*i+s*n+e.y,this}random(){return this.x=Math.random(),this.y=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y}}class Br{constructor(e,t,n,i,r,s,o,a,l){Br.prototype.isMatrix3=!0,this.elements=[1,0,0,0,1,0,0,0,1],void 0!==e&&this.set(e,t,n,i,r,s,o,a,l)}set(e,t,n,i,r,s,o,a,l){const c=this.elements;return c[0]=e,c[1]=i,c[2]=o,c[3]=t,c[4]=r,c[5]=a,c[6]=n,c[7]=s,c[8]=l,this}identity(){return this.set(1,0,0,0,1,0,0,0,1),this}copy(e){const t=this.elements,n=e.elements;return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t[4]=n[4],t[5]=n[5],t[6]=n[6],t[7]=n[7],t[8]=n[8],this}extractBasis(e,t,n){return e.setFromMatrix3Column(this,0),t.setFromMatrix3Column(this,1),n.setFromMatrix3Column(this,2),this}setFromMatrix4(e){const t=e.elements;return this.set(t[0],t[4],t[8],t[1],t[5],t[9],t[2],t[6],t[10]),this}multiply(e){return this.multiplyMatrices(this,e)}premultiply(e){return this.multiplyMatrices(e,this)}multiplyMatrices(e,t){const n=e.elements,i=t.elements,r=this.elements,s=n[0],o=n[3],a=n[6],l=n[1],c=n[4],h=n[7],u=n[2],d=n[5],p=n[8],f=i[0],m=i[3],A=i[6],g=i[1],v=i[4],y=i[7],E=i[2],b=i[5],x=i[8];return r[0]=s*f+o*g+a*E,r[3]=s*m+o*v+a*b,r[6]=s*A+o*y+a*x,r[1]=l*f+c*g+h*E,r[4]=l*m+c*v+h*b,r[7]=l*A+c*y+h*x,r[2]=u*f+d*g+p*E,r[5]=u*m+d*v+p*b,r[8]=u*A+d*y+p*x,this}multiplyScalar(e){const t=this.elements;return t[0]*=e,t[3]*=e,t[6]*=e,t[1]*=e,t[4]*=e,t[7]*=e,t[2]*=e,t[5]*=e,t[8]*=e,this}determinant(){const e=this.elements,t=e[0],n=e[1],i=e[2],r=e[3],s=e[4],o=e[5],a=e[6],l=e[7],c=e[8];return t*s*c-t*o*l-n*r*c+n*o*a+i*r*l-i*s*a}invert(){const e=this.elements,t=e[0],n=e[1],i=e[2],r=e[3],s=e[4],o=e[5],a=e[6],l=e[7],c=e[8],h=c*s-o*l,u=o*a-c*r,d=l*r-s*a,p=t*h+n*u+i*d;if(0===p)return this.set(0,0,0,0,0,0,0,0,0);const f=1/p;return e[0]=h*f,e[1]=(i*l-c*n)*f,e[2]=(o*n-i*s)*f,e[3]=u*f,e[4]=(c*t-i*a)*f,e[5]=(i*r-o*t)*f,e[6]=d*f,e[7]=(n*a-l*t)*f,e[8]=(s*t-n*r)*f,this}transpose(){let e;const t=this.elements;return e=t[1],t[1]=t[3],t[3]=e,e=t[2],t[2]=t[6],t[6]=e,e=t[5],t[5]=t[7],t[7]=e,this}getNormalMatrix(e){return this.setFromMatrix4(e).invert().transpose()}transposeIntoArray(e){const t=this.elements;return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],this}setUvTransform(e,t,n,i,r,s,o){const a=Math.cos(r),l=Math.sin(r);return this.set(n*a,n*l,-n*(a*s+l*o)+s+e,-i*l,i*a,-i*(-l*s+a*o)+o+t,0,0,1),this}scale(e,t){return this.premultiply(Rr.makeScale(e,t)),this}rotate(e){return this.premultiply(Rr.makeRotation(-e)),this}translate(e,t){return this.premultiply(Rr.makeTranslation(e,t)),this}makeTranslation(e,t){return e.isVector2?this.set(1,0,e.x,0,1,e.y,0,0,1):this.set(1,0,e,0,1,t,0,0,1),this}makeRotation(e){const t=Math.cos(e),n=Math.sin(e);return this.set(t,-n,0,n,t,0,0,0,1),this}makeScale(e,t){return this.set(e,0,0,0,t,0,0,0,1),this}equals(e){const t=this.elements,n=e.elements;for(let e=0;e<9;e++)if(t[e]!==n[e])return!1;return!0}fromArray(e,t=0){for(let n=0;n<9;n++)this.elements[n]=e[n+t];return this}toArray(e=[],t=0){const n=this.elements;return e[t]=n[0],e[t+1]=n[1],e[t+2]=n[2],e[t+3]=n[3],e[t+4]=n[4],e[t+5]=n[5],e[t+6]=n[6],e[t+7]=n[7],e[t+8]=n[8],e}clone(){return(new this.constructor).fromArray(this.elements)}}const Rr=new Br;function Lr(e){for(let t=e.length-1;t>=0;--t)if(e[t]>=65535)return!0;return!1}const Dr={Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array};function Pr(e,t){return new Dr[e](t)}function Ur(e){return document.createElementNS("http://www.w3.org/1999/xhtml",e)}function kr(){const e=Ur("canvas");return e.style.display="block",e}const Nr={};function Or(e){e in Nr||(Nr[e]=!0,console.warn(e))}const Fr=(new Br).set(.4123908,.3575843,.1804808,.212639,.7151687,.0721923,.0193308,.1191948,.9505322),Qr=(new Br).set(3.2409699,-1.5373832,-.4986108,-.9692436,1.8759675,.0415551,.0556301,-.203977,1.0569715);function zr(){const e={enabled:!0,workingColorSpace:Bi,spaces:{},convert:function(e,t,n){return!1!==this.enabled&&t!==n&&t&&n?(this.spaces[t].transfer===Li&&(e.r=Hr(e.r),e.g=Hr(e.g),e.b=Hr(e.b)),this.spaces[t].primaries!==this.spaces[n].primaries&&(e.applyMatrix3(this.spaces[t].toXYZ),e.applyMatrix3(this.spaces[n].fromXYZ)),this.spaces[n].transfer===Li&&(e.r=Vr(e.r),e.g=Vr(e.g),e.b=Vr(e.b)),e):e},fromWorkingColorSpace:function(e,t){return this.convert(e,this.workingColorSpace,t)},toWorkingColorSpace:function(e,t){return this.convert(e,t,this.workingColorSpace)},getPrimaries:function(e){return this.spaces[e].primaries},getTransfer:function(e){return e===Si?Ri:this.spaces[e].transfer},getLuminanceCoefficients:function(e,t=this.workingColorSpace){return e.fromArray(this.spaces[t].luminanceCoefficients)},define:function(e){Object.assign(this.spaces,e)},_getMatrix:function(e,t,n){return e.copy(this.spaces[t].toXYZ).multiply(this.spaces[n].fromXYZ)},_getDrawingBufferColorSpace:function(e){return this.spaces[e].outputColorSpaceConfig.drawingBufferColorSpace},_getUnpackColorSpace:function(e=this.workingColorSpace){return this.spaces[e].workingColorSpaceConfig.unpackColorSpace}},t=[.64,.33,.3,.6,.15,.06],n=[.2126,.7152,.0722],i=[.3127,.329];return e.define({[Bi]:{primaries:t,whitePoint:i,transfer:Ri,toXYZ:Fr,fromXYZ:Qr,luminanceCoefficients:n,workingColorSpaceConfig:{unpackColorSpace:Ti},outputColorSpaceConfig:{drawingBufferColorSpace:Ti}},[Ti]:{primaries:t,whitePoint:i,transfer:Li,toXYZ:Fr,fromXYZ:Qr,luminanceCoefficients:n,outputColorSpaceConfig:{drawingBufferColorSpace:Ti}}}),e}const Gr=zr();function Hr(e){return e<.04045?.0773993808*e:Math.pow(.9478672986*e+.0521327014,2.4)}function Vr(e){return e<.0031308?12.92*e:1.055*Math.pow(e,.41666)-.055}let jr;class Wr{static getDataURL(e){if(/^data:/i.test(e.src))return e.src;if("undefined"==typeof HTMLCanvasElement)return e.src;let t;if(e instanceof HTMLCanvasElement)t=e;else{void 0===jr&&(jr=Ur("canvas")),jr.width=e.width,jr.height=e.height;const n=jr.getContext("2d");e instanceof ImageData?n.putImageData(e,0,0):n.drawImage(e,0,0,e.width,e.height),t=jr}return t.toDataURL("image/png")}static sRGBToLinear(e){if("undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&e instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&e instanceof ImageBitmap){const t=Ur("canvas");t.width=e.width,t.height=e.height;const n=t.getContext("2d");n.drawImage(e,0,0,e.width,e.height);const i=n.getImageData(0,0,e.width,e.height),r=i.data;for(let e=0;e<r.length;e++)r[e]=255*Hr(r[e]/255);return n.putImageData(i,0,0),t}if(e.data){const t=e.data.slice(0);for(let e=0;e<t.length;e++)t instanceof Uint8Array||t instanceof Uint8ClampedArray?t[e]=Math.floor(255*Hr(t[e]/255)):t[e]=Hr(t[e]);return{data:t,width:e.width,height:e.height}}return console.warn("THREE.ImageUtils.sRGBToLinear(): Unsupported image type. No color space conversion applied."),e}}let qr=0;class Xr{constructor(e=null){this.isSource=!0,Object.defineProperty(this,"id",{value:qr++}),this.uuid=xr(),this.data=e,this.dataReady=!0,this.version=0}set needsUpdate(e){!0===e&&this.version++}toJSON(e){const t=void 0===e||"string"==typeof e;if(!t&&void 0!==e.images[this.uuid])return e.images[this.uuid];const n={uuid:this.uuid,url:""},i=this.data;if(null!==i){let e;if(Array.isArray(i)){e=[];for(let t=0,n=i.length;t<n;t++)i[t].isDataTexture?e.push(Yr(i[t].image)):e.push(Yr(i[t]))}else e=Yr(i);n.url=e}return t||(e.images[this.uuid]=n),n}}function Yr(e){return"undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&e instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&e instanceof ImageBitmap?Wr.getDataURL(e):e.data?{data:Array.from(e.data),width:e.width,height:e.height,type:e.data.constructor.name}:(console.warn("THREE.Texture: Unable to serialize Texture."),{})}let Jr=0;class Kr extends gr{constructor(e=Kr.DEFAULT_IMAGE,t=Kr.DEFAULT_MAPPING,n=Wt,i=Wt,r=$t,s=nn,o=yn,a=sn,l=Kr.DEFAULT_ANISOTROPY,c=Si){super(),this.isTexture=!0,Object.defineProperty(this,"id",{value:Jr++}),this.uuid=xr(),this.name="",this.source=new Xr(e),this.mipmaps=[],this.mapping=t,this.channel=0,this.wrapS=n,this.wrapT=i,this.magFilter=r,this.minFilter=s,this.anisotropy=l,this.format=o,this.internalFormat=null,this.type=a,this.offset=new Tr(0,0),this.repeat=new Tr(1,1),this.center=new Tr(0,0),this.rotation=0,this.matrixAutoUpdate=!0,this.matrix=new Br,this.generateMipmaps=!0,this.premultiplyAlpha=!1,this.flipY=!0,this.unpackAlignment=4,this.colorSpace=c,this.userData={},this.version=0,this.onUpdate=null,this.renderTarget=null,this.isRenderTargetTexture=!1,this.pmremVersion=0}get image(){return this.source.data}set image(e=null){this.source.data=e}updateMatrix(){this.matrix.setUvTransform(this.offset.x,this.offset.y,this.repeat.x,this.repeat.y,this.rotation,this.center.x,this.center.y)}clone(){return(new this.constructor).copy(this)}copy(e){return this.name=e.name,this.source=e.source,this.mipmaps=e.mipmaps.slice(0),this.mapping=e.mapping,this.channel=e.channel,this.wrapS=e.wrapS,this.wrapT=e.wrapT,this.magFilter=e.magFilter,this.minFilter=e.minFilter,this.anisotropy=e.anisotropy,this.format=e.format,this.internalFormat=e.internalFormat,this.type=e.type,this.offset.copy(e.offset),this.repeat.copy(e.repeat),this.center.copy(e.center),this.rotation=e.rotation,this.matrixAutoUpdate=e.matrixAutoUpdate,this.matrix.copy(e.matrix),this.generateMipmaps=e.generateMipmaps,this.premultiplyAlpha=e.premultiplyAlpha,this.flipY=e.flipY,this.unpackAlignment=e.unpackAlignment,this.colorSpace=e.colorSpace,this.renderTarget=e.renderTarget,this.isRenderTargetTexture=e.isRenderTargetTexture,this.userData=JSON.parse(JSON.stringify(e.userData)),this.needsUpdate=!0,this}toJSON(e){const t=void 0===e||"string"==typeof e;if(!t&&void 0!==e.textures[this.uuid])return e.textures[this.uuid];const n={metadata:{version:4.6,type:"Texture",generator:"Texture.toJSON"},uuid:this.uuid,name:this.name,image:this.source.toJSON(e).uuid,mapping:this.mapping,channel:this.channel,repeat:[this.repeat.x,this.repeat.y],offset:[this.offset.x,this.offset.y],center:[this.center.x,this.center.y],rotation:this.rotation,wrap:[this.wrapS,this.wrapT],format:this.format,internalFormat:this.internalFormat,type:this.type,colorSpace:this.colorSpace,minFilter:this.minFilter,magFilter:this.magFilter,anisotropy:this.anisotropy,flipY:this.flipY,generateMipmaps:this.generateMipmaps,premultiplyAlpha:this.premultiplyAlpha,unpackAlignment:this.unpackAlignment};return Object.keys(this.userData).length>0&&(n.userData=this.userData),t||(e.textures[this.uuid]=n),n}dispose(){this.dispatchEvent({type:"dispose"})}transformUv(e){if(this.mapping!==Ft)return e;if(e.applyMatrix3(this.matrix),e.x<0||e.x>1)switch(this.wrapS){case jt:e.x=e.x-Math.floor(e.x);break;case Wt:e.x=e.x<0?0:1;break;case qt:1===Math.abs(Math.floor(e.x)%2)?e.x=Math.ceil(e.x)-e.x:e.x=e.x-Math.floor(e.x)}if(e.y<0||e.y>1)switch(this.wrapT){case jt:e.y=e.y-Math.floor(e.y);break;case Wt:e.y=e.y<0?0:1;break;case qt:1===Math.abs(Math.floor(e.y)%2)?e.y=Math.ceil(e.y)-e.y:e.y=e.y-Math.floor(e.y)}return this.flipY&&(e.y=1-e.y),e}set needsUpdate(e){!0===e&&(this.version++,this.source.needsUpdate=!0)}set needsPMREMUpdate(e){!0===e&&this.pmremVersion++}}Kr.DEFAULT_IMAGE=null,Kr.DEFAULT_MAPPING=Ft,Kr.DEFAULT_ANISOTROPY=1;class Zr{constructor(e=0,t=0,n=0,i=1){Zr.prototype.isVector4=!0,this.x=e,this.y=t,this.z=n,this.w=i}get width(){return this.z}set width(e){this.z=e}get height(){return this.w}set height(e){this.w=e}set(e,t,n,i){return this.x=e,this.y=t,this.z=n,this.w=i,this}setScalar(e){return this.x=e,this.y=e,this.z=e,this.w=e,this}setX(e){return this.x=e,this}setY(e){return this.y=e,this}setZ(e){return this.z=e,this}setW(e){return this.w=e,this}setComponent(e,t){switch(e){case 0:this.x=t;break;case 1:this.y=t;break;case 2:this.z=t;break;case 3:this.w=t;break;default:throw new Error("index is out of range: "+e)}return this}getComponent(e){switch(e){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw new Error("index is out of range: "+e)}}clone(){return new this.constructor(this.x,this.y,this.z,this.w)}copy(e){return this.x=e.x,this.y=e.y,this.z=e.z,this.w=void 0!==e.w?e.w:1,this}add(e){return this.x+=e.x,this.y+=e.y,this.z+=e.z,this.w+=e.w,this}addScalar(e){return this.x+=e,this.y+=e,this.z+=e,this.w+=e,this}addVectors(e,t){return this.x=e.x+t.x,this.y=e.y+t.y,this.z=e.z+t.z,this.w=e.w+t.w,this}addScaledVector(e,t){return this.x+=e.x*t,this.y+=e.y*t,this.z+=e.z*t,this.w+=e.w*t,this}sub(e){return this.x-=e.x,this.y-=e.y,this.z-=e.z,this.w-=e.w,this}subScalar(e){return this.x-=e,this.y-=e,this.z-=e,this.w-=e,this}subVectors(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this.z=e.z-t.z,this.w=e.w-t.w,this}multiply(e){return this.x*=e.x,this.y*=e.y,this.z*=e.z,this.w*=e.w,this}multiplyScalar(e){return this.x*=e,this.y*=e,this.z*=e,this.w*=e,this}applyMatrix4(e){const t=this.x,n=this.y,i=this.z,r=this.w,s=e.elements;return this.x=s[0]*t+s[4]*n+s[8]*i+s[12]*r,this.y=s[1]*t+s[5]*n+s[9]*i+s[13]*r,this.z=s[2]*t+s[6]*n+s[10]*i+s[14]*r,this.w=s[3]*t+s[7]*n+s[11]*i+s[15]*r,this}divide(e){return this.x/=e.x,this.y/=e.y,this.z/=e.z,this.w/=e.w,this}divideScalar(e){return this.multiplyScalar(1/e)}setAxisAngleFromQuaternion(e){this.w=2*Math.acos(e.w);const t=Math.sqrt(1-e.w*e.w);return t<1e-4?(this.x=1,this.y=0,this.z=0):(this.x=e.x/t,this.y=e.y/t,this.z=e.z/t),this}setAxisAngleFromRotationMatrix(e){let t,n,i,r;const s=.01,o=.1,a=e.elements,l=a[0],c=a[4],h=a[8],u=a[1],d=a[5],p=a[9],f=a[2],m=a[6],A=a[10];if(Math.abs(c-u)<s&&Math.abs(h-f)<s&&Math.abs(p-m)<s){if(Math.abs(c+u)<o&&Math.abs(h+f)<o&&Math.abs(p+m)<o&&Math.abs(l+d+A-3)<o)return this.set(1,0,0,0),this;t=Math.PI;const e=(l+1)/2,a=(d+1)/2,g=(A+1)/2,v=(c+u)/4,y=(h+f)/4,E=(p+m)/4;return e>a&&e>g?e<s?(n=0,i=.707106781,r=.707106781):(n=Math.sqrt(e),i=v/n,r=y/n):a>g?a<s?(n=.707106781,i=0,r=.707106781):(i=Math.sqrt(a),n=v/i,r=E/i):g<s?(n=.707106781,i=.707106781,r=0):(r=Math.sqrt(g),n=y/r,i=E/r),this.set(n,i,r,t),this}let g=Math.sqrt((m-p)*(m-p)+(h-f)*(h-f)+(u-c)*(u-c));return Math.abs(g)<.001&&(g=1),this.x=(m-p)/g,this.y=(h-f)/g,this.z=(u-c)/g,this.w=Math.acos((l+d+A-1)/2),this}setFromMatrixPosition(e){const t=e.elements;return this.x=t[12],this.y=t[13],this.z=t[14],this.w=t[15],this}min(e){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this.z=Math.min(this.z,e.z),this.w=Math.min(this.w,e.w),this}max(e){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this.z=Math.max(this.z,e.z),this.w=Math.max(this.w,e.w),this}clamp(e,t){return this.x=Cr(this.x,e.x,t.x),this.y=Cr(this.y,e.y,t.y),this.z=Cr(this.z,e.z,t.z),this.w=Cr(this.w,e.w,t.w),this}clampScalar(e,t){return this.x=Cr(this.x,e,t),this.y=Cr(this.y,e,t),this.z=Cr(this.z,e,t),this.w=Cr(this.w,e,t),this}clampLength(e,t){const n=this.length();return this.divideScalar(n||1).multiplyScalar(Cr(n,e,t))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this.w=Math.floor(this.w),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this.w=Math.ceil(this.w),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this.w=Math.round(this.w),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this.z=Math.trunc(this.z),this.w=Math.trunc(this.w),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this.w=-this.w,this}dot(e){return this.x*e.x+this.y*e.y+this.z*e.z+this.w*e.w}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)+Math.abs(this.w)}normalize(){return this.divideScalar(this.length()||1)}setLength(e){return this.normalize().multiplyScalar(e)}lerp(e,t){return this.x+=(e.x-this.x)*t,this.y+=(e.y-this.y)*t,this.z+=(e.z-this.z)*t,this.w+=(e.w-this.w)*t,this}lerpVectors(e,t,n){return this.x=e.x+(t.x-e.x)*n,this.y=e.y+(t.y-e.y)*n,this.z=e.z+(t.z-e.z)*n,this.w=e.w+(t.w-e.w)*n,this}equals(e){return e.x===this.x&&e.y===this.y&&e.z===this.z&&e.w===this.w}fromArray(e,t=0){return this.x=e[t],this.y=e[t+1],this.z=e[t+2],this.w=e[t+3],this}toArray(e=[],t=0){return e[t]=this.x,e[t+1]=this.y,e[t+2]=this.z,e[t+3]=this.w,e}fromBufferAttribute(e,t){return this.x=e.getX(t),this.y=e.getY(t),this.z=e.getZ(t),this.w=e.getW(t),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this.w=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z,yield this.w}}class $r extends gr{constructor(e=1,t=1,n={}){super(),this.isRenderTarget=!0,this.width=e,this.height=t,this.depth=1,this.scissor=new Zr(0,0,e,t),this.scissorTest=!1,this.viewport=new Zr(0,0,e,t);const i={width:e,height:t,depth:1};n=Object.assign({generateMipmaps:!1,internalFormat:null,minFilter:$t,depthBuffer:!0,stencilBuffer:!1,resolveDepthBuffer:!0,resolveStencilBuffer:!0,depthTexture:null,samples:0,count:1},n);const r=new Kr(i,n.mapping,n.wrapS,n.wrapT,n.magFilter,n.minFilter,n.format,n.type,n.anisotropy,n.colorSpace);r.flipY=!1,r.generateMipmaps=n.generateMipmaps,r.internalFormat=n.internalFormat,this.textures=[];const s=n.count;for(let e=0;e<s;e++)this.textures[e]=r.clone(),this.textures[e].isRenderTargetTexture=!0,this.textures[e].renderTarget=this;this.depthBuffer=n.depthBuffer,this.stencilBuffer=n.stencilBuffer,this.resolveDepthBuffer=n.resolveDepthBuffer,this.resolveStencilBuffer=n.resolveStencilBuffer,this._depthTexture=null,this.depthTexture=n.depthTexture,this.samples=n.samples}get texture(){return this.textures[0]}set texture(e){this.textures[0]=e}set depthTexture(e){null!==this._depthTexture&&(this._depthTexture.renderTarget=null),null!==e&&(e.renderTarget=this),this._depthTexture=e}get depthTexture(){return this._depthTexture}setSize(e,t,n=1){if(this.width!==e||this.height!==t||this.depth!==n){this.width=e,this.height=t,this.depth=n;for(let i=0,r=this.textures.length;i<r;i++)this.textures[i].image.width=e,this.textures[i].image.height=t,this.textures[i].image.depth=n;this.dispose()}this.viewport.set(0,0,e,t),this.scissor.set(0,0,e,t)}clone(){return(new this.constructor).copy(this)}copy(e){this.width=e.width,this.height=e.height,this.depth=e.depth,this.scissor.copy(e.scissor),this.scissorTest=e.scissorTest,this.viewport.copy(e.viewport),this.textures.length=0;for(let t=0,n=e.textures.length;t<n;t++)this.textures[t]=e.textures[t].clone(),this.textures[t].isRenderTargetTexture=!0,this.textures[t].renderTarget=this;const t=Object.assign({},e.texture.image);return this.texture.source=new Xr(t),this.depthBuffer=e.depthBuffer,this.stencilBuffer=e.stencilBuffer,this.resolveDepthBuffer=e.resolveDepthBuffer,this.resolveStencilBuffer=e.resolveStencilBuffer,null!==e.depthTexture&&(this.depthTexture=e.depthTexture.clone()),this.samples=e.samples,this}dispose(){this.dispatchEvent({type:"dispose"})}}class es extends $r{constructor(e=1,t=1,n={}){super(e,t,n),this.isWebGLRenderTarget=!0}}class ts extends Kr{constructor(e=null,t=1,n=1,i=1){super(null),this.isDataArrayTexture=!0,this.image={data:e,width:t,height:n,depth:i},this.magFilter=Xt,this.minFilter=Xt,this.wrapR=Wt,this.generateMipmaps=!1,this.flipY=!1,this.unpackAlignment=1,this.layerUpdates=new Set}addLayerUpdate(e){this.layerUpdates.add(e)}clearLayerUpdates(){this.layerUpdates.clear()}}class ns extends es{constructor(e=1,t=1,n=1,i={}){super(e,t,i),this.isWebGLArrayRenderTarget=!0,this.depth=n,this.texture=new ts(null,e,t,n),this.texture.isRenderTargetTexture=!0}}class is extends Kr{constructor(e=null,t=1,n=1,i=1){super(null),this.isData3DTexture=!0,this.image={data:e,width:t,height:n,depth:i},this.magFilter=Xt,this.minFilter=Xt,this.wrapR=Wt,this.generateMipmaps=!1,this.flipY=!1,this.unpackAlignment=1}}class rs extends es{constructor(e=1,t=1,n=1,i={}){super(e,t,i),this.isWebGL3DRenderTarget=!0,this.depth=n,this.texture=new is(null,e,t,n),this.texture.isRenderTargetTexture=!0}}class ss{constructor(e=0,t=0,n=0,i=1){this.isQuaternion=!0,this._x=e,this._y=t,this._z=n,this._w=i}static slerpFlat(e,t,n,i,r,s,o){let a=n[i+0],l=n[i+1],c=n[i+2],h=n[i+3];const u=r[s+0],d=r[s+1],p=r[s+2],f=r[s+3];if(0===o)return e[t+0]=a,e[t+1]=l,e[t+2]=c,void(e[t+3]=h);if(1===o)return e[t+0]=u,e[t+1]=d,e[t+2]=p,void(e[t+3]=f);if(h!==f||a!==u||l!==d||c!==p){let e=1-o;const t=a*u+l*d+c*p+h*f,n=t>=0?1:-1,i=1-t*t;if(i>Number.EPSILON){const r=Math.sqrt(i),s=Math.atan2(r,t*n);e=Math.sin(e*s)/r,o=Math.sin(o*s)/r}const r=o*n;if(a=a*e+u*r,l=l*e+d*r,c=c*e+p*r,h=h*e+f*r,e===1-o){const e=1/Math.sqrt(a*a+l*l+c*c+h*h);a*=e,l*=e,c*=e,h*=e}}e[t]=a,e[t+1]=l,e[t+2]=c,e[t+3]=h}static multiplyQuaternionsFlat(e,t,n,i,r,s){const o=n[i],a=n[i+1],l=n[i+2],c=n[i+3],h=r[s],u=r[s+1],d=r[s+2],p=r[s+3];return e[t]=o*p+c*h+a*d-l*u,e[t+1]=a*p+c*u+l*h-o*d,e[t+2]=l*p+c*d+o*u-a*h,e[t+3]=c*p-o*h-a*u-l*d,e}get x(){return this._x}set x(e){this._x=e,this._onChangeCallback()}get y(){return this._y}set y(e){this._y=e,this._onChangeCallback()}get z(){return this._z}set z(e){this._z=e,this._onChangeCallback()}get w(){return this._w}set w(e){this._w=e,this._onChangeCallback()}set(e,t,n,i){return this._x=e,this._y=t,this._z=n,this._w=i,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._w)}copy(e){return this._x=e.x,this._y=e.y,this._z=e.z,this._w=e.w,this._onChangeCallback(),this}setFromEuler(e,t=!0){const n=e._x,i=e._y,r=e._z,s=e._order,o=Math.cos,a=Math.sin,l=o(n/2),c=o(i/2),h=o(r/2),u=a(n/2),d=a(i/2),p=a(r/2);switch(s){case"XYZ":this._x=u*c*h+l*d*p,this._y=l*d*h-u*c*p,this._z=l*c*p+u*d*h,this._w=l*c*h-u*d*p;break;case"YXZ":this._x=u*c*h+l*d*p,this._y=l*d*h-u*c*p,this._z=l*c*p-u*d*h,this._w=l*c*h+u*d*p;break;case"ZXY":this._x=u*c*h-l*d*p,this._y=l*d*h+u*c*p,this._z=l*c*p+u*d*h,this._w=l*c*h-u*d*p;break;case"ZYX":this._x=u*c*h-l*d*p,this._y=l*d*h+u*c*p,this._z=l*c*p-u*d*h,this._w=l*c*h+u*d*p;break;case"YZX":this._x=u*c*h+l*d*p,this._y=l*d*h+u*c*p,this._z=l*c*p-u*d*h,this._w=l*c*h-u*d*p;break;case"XZY":this._x=u*c*h-l*d*p,this._y=l*d*h-u*c*p,this._z=l*c*p+u*d*h,this._w=l*c*h+u*d*p;break;default:console.warn("THREE.Quaternion: .setFromEuler() encountered an unknown order: "+s)}return!0===t&&this._onChangeCallback(),this}setFromAxisAngle(e,t){const n=t/2,i=Math.sin(n);return this._x=e.x*i,this._y=e.y*i,this._z=e.z*i,this._w=Math.cos(n),this._onChangeCallback(),this}setFromRotationMatrix(e){const t=e.elements,n=t[0],i=t[4],r=t[8],s=t[1],o=t[5],a=t[9],l=t[2],c=t[6],h=t[10],u=n+o+h;if(u>0){const e=.5/Math.sqrt(u+1);this._w=.25/e,this._x=(c-a)*e,this._y=(r-l)*e,this._z=(s-i)*e}else if(n>o&&n>h){const e=2*Math.sqrt(1+n-o-h);this._w=(c-a)/e,this._x=.25*e,this._y=(i+s)/e,this._z=(r+l)/e}else if(o>h){const e=2*Math.sqrt(1+o-n-h);this._w=(r-l)/e,this._x=(i+s)/e,this._y=.25*e,this._z=(a+c)/e}else{const e=2*Math.sqrt(1+h-n-o);this._w=(s-i)/e,this._x=(r+l)/e,this._y=(a+c)/e,this._z=.25*e}return this._onChangeCallback(),this}setFromUnitVectors(e,t){let n=e.dot(t)+1;return n<Number.EPSILON?(n=0,Math.abs(e.x)>Math.abs(e.z)?(this._x=-e.y,this._y=e.x,this._z=0,this._w=n):(this._x=0,this._y=-e.z,this._z=e.y,this._w=n)):(this._x=e.y*t.z-e.z*t.y,this._y=e.z*t.x-e.x*t.z,this._z=e.x*t.y-e.y*t.x,this._w=n),this.normalize()}angleTo(e){return 2*Math.acos(Math.abs(Cr(this.dot(e),-1,1)))}rotateTowards(e,t){const n=this.angleTo(e);if(0===n)return this;const i=Math.min(1,t/n);return this.slerp(e,i),this}identity(){return this.set(0,0,0,1)}invert(){return this.conjugate()}conjugate(){return this._x*=-1,this._y*=-1,this._z*=-1,this._onChangeCallback(),this}dot(e){return this._x*e._x+this._y*e._y+this._z*e._z+this._w*e._w}lengthSq(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w}length(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)}normalize(){let e=this.length();return 0===e?(this._x=0,this._y=0,this._z=0,this._w=1):(e=1/e,this._x=this._x*e,this._y=this._y*e,this._z=this._z*e,this._w=this._w*e),this._onChangeCallback(),this}multiply(e){return this.multiplyQuaternions(this,e)}premultiply(e){return this.multiplyQuaternions(e,this)}multiplyQuaternions(e,t){const n=e._x,i=e._y,r=e._z,s=e._w,o=t._x,a=t._y,l=t._z,c=t._w;return this._x=n*c+s*o+i*l-r*a,this._y=i*c+s*a+r*o-n*l,this._z=r*c+s*l+n*a-i*o,this._w=s*c-n*o-i*a-r*l,this._onChangeCallback(),this}slerp(e,t){if(0===t)return this;if(1===t)return this.copy(e);const n=this._x,i=this._y,r=this._z,s=this._w;let o=s*e._w+n*e._x+i*e._y+r*e._z;if(o<0?(this._w=-e._w,this._x=-e._x,this._y=-e._y,this._z=-e._z,o=-o):this.copy(e),o>=1)return this._w=s,this._x=n,this._y=i,this._z=r,this;const a=1-o*o;if(a<=Number.EPSILON){const e=1-t;return this._w=e*s+t*this._w,this._x=e*n+t*this._x,this._y=e*i+t*this._y,this._z=e*r+t*this._z,this.normalize(),this}const l=Math.sqrt(a),c=Math.atan2(l,o),h=Math.sin((1-t)*c)/l,u=Math.sin(t*c)/l;return this._w=s*h+this._w*u,this._x=n*h+this._x*u,this._y=i*h+this._y*u,this._z=r*h+this._z*u,this._onChangeCallback(),this}slerpQuaternions(e,t,n){return this.copy(e).slerp(t,n)}random(){const e=2*Math.PI*Math.random(),t=2*Math.PI*Math.random(),n=Math.random(),i=Math.sqrt(1-n),r=Math.sqrt(n);return this.set(i*Math.sin(e),i*Math.cos(e),r*Math.sin(t),r*Math.cos(t))}equals(e){return e._x===this._x&&e._y===this._y&&e._z===this._z&&e._w===this._w}fromArray(e,t=0){return this._x=e[t],this._y=e[t+1],this._z=e[t+2],this._w=e[t+3],this._onChangeCallback(),this}toArray(e=[],t=0){return e[t]=this._x,e[t+1]=this._y,e[t+2]=this._z,e[t+3]=this._w,e}fromBufferAttribute(e,t){return this._x=e.getX(t),this._y=e.getY(t),this._z=e.getZ(t),this._w=e.getW(t),this._onChangeCallback(),this}toJSON(){return this.toArray()}_onChange(e){return this._onChangeCallback=e,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._w}}class os{constructor(e=0,t=0,n=0){os.prototype.isVector3=!0,this.x=e,this.y=t,this.z=n}set(e,t,n){return void 0===n&&(n=this.z),this.x=e,this.y=t,this.z=n,this}setScalar(e){return this.x=e,this.y=e,this.z=e,this}setX(e){return this.x=e,this}setY(e){return this.y=e,this}setZ(e){return this.z=e,this}setComponent(e,t){switch(e){case 0:this.x=t;break;case 1:this.y=t;break;case 2:this.z=t;break;default:throw new Error("index is out of range: "+e)}return this}getComponent(e){switch(e){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw new Error("index is out of range: "+e)}}clone(){return new this.constructor(this.x,this.y,this.z)}copy(e){return this.x=e.x,this.y=e.y,this.z=e.z,this}add(e){return this.x+=e.x,this.y+=e.y,this.z+=e.z,this}addScalar(e){return this.x+=e,this.y+=e,this.z+=e,this}addVectors(e,t){return this.x=e.x+t.x,this.y=e.y+t.y,this.z=e.z+t.z,this}addScaledVector(e,t){return this.x+=e.x*t,this.y+=e.y*t,this.z+=e.z*t,this}sub(e){return this.x-=e.x,this.y-=e.y,this.z-=e.z,this}subScalar(e){return this.x-=e,this.y-=e,this.z-=e,this}subVectors(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this.z=e.z-t.z,this}multiply(e){return this.x*=e.x,this.y*=e.y,this.z*=e.z,this}multiplyScalar(e){return this.x*=e,this.y*=e,this.z*=e,this}multiplyVectors(e,t){return this.x=e.x*t.x,this.y=e.y*t.y,this.z=e.z*t.z,this}applyEuler(e){return this.applyQuaternion(ls.setFromEuler(e))}applyAxisAngle(e,t){return this.applyQuaternion(ls.setFromAxisAngle(e,t))}applyMatrix3(e){const t=this.x,n=this.y,i=this.z,r=e.elements;return this.x=r[0]*t+r[3]*n+r[6]*i,this.y=r[1]*t+r[4]*n+r[7]*i,this.z=r[2]*t+r[5]*n+r[8]*i,this}applyNormalMatrix(e){return this.applyMatrix3(e).normalize()}applyMatrix4(e){const t=this.x,n=this.y,i=this.z,r=e.elements,s=1/(r[3]*t+r[7]*n+r[11]*i+r[15]);return this.x=(r[0]*t+r[4]*n+r[8]*i+r[12])*s,this.y=(r[1]*t+r[5]*n+r[9]*i+r[13])*s,this.z=(r[2]*t+r[6]*n+r[10]*i+r[14])*s,this}applyQuaternion(e){const t=this.x,n=this.y,i=this.z,r=e.x,s=e.y,o=e.z,a=e.w,l=2*(s*i-o*n),c=2*(o*t-r*i),h=2*(r*n-s*t);return this.x=t+a*l+s*h-o*c,this.y=n+a*c+o*l-r*h,this.z=i+a*h+r*c-s*l,this}project(e){return this.applyMatrix4(e.matrixWorldInverse).applyMatrix4(e.projectionMatrix)}unproject(e){return this.applyMatrix4(e.projectionMatrixInverse).applyMatrix4(e.matrixWorld)}transformDirection(e){const t=this.x,n=this.y,i=this.z,r=e.elements;return this.x=r[0]*t+r[4]*n+r[8]*i,this.y=r[1]*t+r[5]*n+r[9]*i,this.z=r[2]*t+r[6]*n+r[10]*i,this.normalize()}divide(e){return this.x/=e.x,this.y/=e.y,this.z/=e.z,this}divideScalar(e){return this.multiplyScalar(1/e)}min(e){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this.z=Math.min(this.z,e.z),this}max(e){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this.z=Math.max(this.z,e.z),this}clamp(e,t){return this.x=Cr(this.x,e.x,t.x),this.y=Cr(this.y,e.y,t.y),this.z=Cr(this.z,e.z,t.z),this}clampScalar(e,t){return this.x=Cr(this.x,e,t),this.y=Cr(this.y,e,t),this.z=Cr(this.z,e,t),this}clampLength(e,t){const n=this.length();return this.divideScalar(n||1).multiplyScalar(Cr(n,e,t))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this.z=Math.trunc(this.z),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this}dot(e){return this.x*e.x+this.y*e.y+this.z*e.z}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)}normalize(){return this.divideScalar(this.length()||1)}setLength(e){return this.normalize().multiplyScalar(e)}lerp(e,t){return this.x+=(e.x-this.x)*t,this.y+=(e.y-this.y)*t,this.z+=(e.z-this.z)*t,this}lerpVectors(e,t,n){return this.x=e.x+(t.x-e.x)*n,this.y=e.y+(t.y-e.y)*n,this.z=e.z+(t.z-e.z)*n,this}cross(e){return this.crossVectors(this,e)}crossVectors(e,t){const n=e.x,i=e.y,r=e.z,s=t.x,o=t.y,a=t.z;return this.x=i*a-r*o,this.y=r*s-n*a,this.z=n*o-i*s,this}projectOnVector(e){const t=e.lengthSq();if(0===t)return this.set(0,0,0);const n=e.dot(this)/t;return this.copy(e).multiplyScalar(n)}projectOnPlane(e){return as.copy(this).projectOnVector(e),this.sub(as)}reflect(e){return this.sub(as.copy(e).multiplyScalar(2*this.dot(e)))}angleTo(e){const t=Math.sqrt(this.lengthSq()*e.lengthSq());if(0===t)return Math.PI/2;const n=this.dot(e)/t;return Math.acos(Cr(n,-1,1))}distanceTo(e){return Math.sqrt(this.distanceToSquared(e))}distanceToSquared(e){const t=this.x-e.x,n=this.y-e.y,i=this.z-e.z;return t*t+n*n+i*i}manhattanDistanceTo(e){return Math.abs(this.x-e.x)+Math.abs(this.y-e.y)+Math.abs(this.z-e.z)}setFromSpherical(e){return this.setFromSphericalCoords(e.radius,e.phi,e.theta)}setFromSphericalCoords(e,t,n){const i=Math.sin(t)*e;return this.x=i*Math.sin(n),this.y=Math.cos(t)*e,this.z=i*Math.cos(n),this}setFromCylindrical(e){return this.setFromCylindricalCoords(e.radius,e.theta,e.y)}setFromCylindricalCoords(e,t,n){return this.x=e*Math.sin(t),this.y=n,this.z=e*Math.cos(t),this}setFromMatrixPosition(e){const t=e.elements;return this.x=t[12],this.y=t[13],this.z=t[14],this}setFromMatrixScale(e){const t=this.setFromMatrixColumn(e,0).length(),n=this.setFromMatrixColumn(e,1).length(),i=this.setFromMatrixColumn(e,2).length();return this.x=t,this.y=n,this.z=i,this}setFromMatrixColumn(e,t){return this.fromArray(e.elements,4*t)}setFromMatrix3Column(e,t){return this.fromArray(e.elements,3*t)}setFromEuler(e){return this.x=e._x,this.y=e._y,this.z=e._z,this}setFromColor(e){return this.x=e.r,this.y=e.g,this.z=e.b,this}equals(e){return e.x===this.x&&e.y===this.y&&e.z===this.z}fromArray(e,t=0){return this.x=e[t],this.y=e[t+1],this.z=e[t+2],this}toArray(e=[],t=0){return e[t]=this.x,e[t+1]=this.y,e[t+2]=this.z,e}fromBufferAttribute(e,t){return this.x=e.getX(t),this.y=e.getY(t),this.z=e.getZ(t),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this}randomDirection(){const e=Math.random()*Math.PI*2,t=2*Math.random()-1,n=Math.sqrt(1-t*t);return this.x=n*Math.cos(e),this.y=t,this.z=n*Math.sin(e),this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z}}const as=new os,ls=new ss;class cs{constructor(e=new os(1/0,1/0,1/0),t=new os(-1/0,-1/0,-1/0)){this.isBox3=!0,this.min=e,this.max=t}set(e,t){return this.min.copy(e),this.max.copy(t),this}setFromArray(e){this.makeEmpty();for(let t=0,n=e.length;t<n;t+=3)this.expandByPoint(us.fromArray(e,t));return this}setFromBufferAttribute(e){this.makeEmpty();for(let t=0,n=e.count;t<n;t++)this.expandByPoint(us.fromBufferAttribute(e,t));return this}setFromPoints(e){this.makeEmpty();for(let t=0,n=e.length;t<n;t++)this.expandByPoint(e[t]);return this}setFromCenterAndSize(e,t){const n=us.copy(t).multiplyScalar(.5);return this.min.copy(e).sub(n),this.max.copy(e).add(n),this}setFromObject(e,t=!1){return this.makeEmpty(),this.expandByObject(e,t)}clone(){return(new this.constructor).copy(this)}copy(e){return this.min.copy(e.min),this.max.copy(e.max),this}makeEmpty(){return this.min.x=this.min.y=this.min.z=1/0,this.max.x=this.max.y=this.max.z=-1/0,this}isEmpty(){return this.max.x<this.min.x||this.max.y<this.min.y||this.max.z<this.min.z}getCenter(e){return this.isEmpty()?e.set(0,0,0):e.addVectors(this.min,this.max).multiplyScalar(.5)}getSize(e){return this.isEmpty()?e.set(0,0,0):e.subVectors(this.max,this.min)}expandByPoint(e){return this.min.min(e),this.max.max(e),this}expandByVector(e){return this.min.sub(e),this.max.add(e),this}expandByScalar(e){return this.min.addScalar(-e),this.max.addScalar(e),this}expandByObject(e,t=!1){e.updateWorldMatrix(!1,!1);const n=e.geometry;if(void 0!==n){const i=n.getAttribute("position");if(!0===t&&void 0!==i&&!0!==e.isInstancedMesh)for(let t=0,n=i.count;t<n;t++)!0===e.isMesh?e.getVertexPosition(t,us):us.fromBufferAttribute(i,t),us.applyMatrix4(e.matrixWorld),this.expandByPoint(us);else void 0!==e.boundingBox?(null===e.boundingBox&&e.computeBoundingBox(),ds.copy(e.boundingBox)):(null===n.boundingBox&&n.computeBoundingBox(),ds.copy(n.boundingBox)),ds.applyMatrix4(e.matrixWorld),this.union(ds)}const i=e.children;for(let e=0,n=i.length;e<n;e++)this.expandByObject(i[e],t);return this}containsPoint(e){return e.x>=this.min.x&&e.x<=this.max.x&&e.y>=this.min.y&&e.y<=this.max.y&&e.z>=this.min.z&&e.z<=this.max.z}containsBox(e){return this.min.x<=e.min.x&&e.max.x<=this.max.x&&this.min.y<=e.min.y&&e.max.y<=this.max.y&&this.min.z<=e.min.z&&e.max.z<=this.max.z}getParameter(e,t){return t.set((e.x-this.min.x)/(this.max.x-this.min.x),(e.y-this.min.y)/(this.max.y-this.min.y),(e.z-this.min.z)/(this.max.z-this.min.z))}intersectsBox(e){return e.max.x>=this.min.x&&e.min.x<=this.max.x&&e.max.y>=this.min.y&&e.min.y<=this.max.y&&e.max.z>=this.min.z&&e.min.z<=this.max.z}intersectsSphere(e){return this.clampPoint(e.center,us),us.distanceToSquared(e.center)<=e.radius*e.radius}intersectsPlane(e){let t,n;return e.normal.x>0?(t=e.normal.x*this.min.x,n=e.normal.x*this.max.x):(t=e.normal.x*this.max.x,n=e.normal.x*this.min.x),e.normal.y>0?(t+=e.normal.y*this.min.y,n+=e.normal.y*this.max.y):(t+=e.normal.y*this.max.y,n+=e.normal.y*this.min.y),e.normal.z>0?(t+=e.normal.z*this.min.z,n+=e.normal.z*this.max.z):(t+=e.normal.z*this.max.z,n+=e.normal.z*this.min.z),t<=-e.constant&&n>=-e.constant}intersectsTriangle(e){if(this.isEmpty())return!1;this.getCenter(ys),Es.subVectors(this.max,ys),ps.subVectors(e.a,ys),fs.subVectors(e.b,ys),ms.subVectors(e.c,ys),As.subVectors(fs,ps),gs.subVectors(ms,fs),vs.subVectors(ps,ms);let t=[0,-As.z,As.y,0,-gs.z,gs.y,0,-vs.z,vs.y,As.z,0,-As.x,gs.z,0,-gs.x,vs.z,0,-vs.x,-As.y,As.x,0,-gs.y,gs.x,0,-vs.y,vs.x,0];return!!Cs(t,ps,fs,ms,Es)&&(t=[1,0,0,0,1,0,0,0,1],!!Cs(t,ps,fs,ms,Es)&&(bs.crossVectors(As,gs),t=[bs.x,bs.y,bs.z],Cs(t,ps,fs,ms,Es)))}clampPoint(e,t){return t.copy(e).clamp(this.min,this.max)}distanceToPoint(e){return this.clampPoint(e,us).distanceTo(e)}getBoundingSphere(e){return this.isEmpty()?e.makeEmpty():(this.getCenter(e.center),e.radius=.5*this.getSize(us).length()),e}intersect(e){return this.min.max(e.min),this.max.min(e.max),this.isEmpty()&&this.makeEmpty(),this}union(e){return this.min.min(e.min),this.max.max(e.max),this}applyMatrix4(e){return this.isEmpty()||(hs[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(e),hs[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(e),hs[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(e),hs[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(e),hs[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(e),hs[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(e),hs[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(e),hs[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(e),this.setFromPoints(hs)),this}translate(e){return this.min.add(e),this.max.add(e),this}equals(e){return e.min.equals(this.min)&&e.max.equals(this.max)}}const hs=[new os,new os,new os,new os,new os,new os,new os,new os],us=new os,ds=new cs,ps=new os,fs=new os,ms=new os,As=new os,gs=new os,vs=new os,ys=new os,Es=new os,bs=new os,xs=new os;function Cs(e,t,n,i,r){for(let s=0,o=e.length-3;s<=o;s+=3){xs.fromArray(e,s);const o=r.x*Math.abs(xs.x)+r.y*Math.abs(xs.y)+r.z*Math.abs(xs.z),a=t.dot(xs),l=n.dot(xs),c=i.dot(xs);if(Math.max(-Math.max(a,l,c),Math.min(a,l,c))>o)return!1}return!0}const ws=new cs,_s=new os,Ms=new os;class Is{constructor(e=new os,t=-1){this.isSphere=!0,this.center=e,this.radius=t}set(e,t){return this.center.copy(e),this.radius=t,this}setFromPoints(e,t){const n=this.center;void 0!==t?n.copy(t):ws.setFromPoints(e).getCenter(n);let i=0;for(let t=0,r=e.length;t<r;t++)i=Math.max(i,n.distanceToSquared(e[t]));return this.radius=Math.sqrt(i),this}copy(e){return this.center.copy(e.center),this.radius=e.radius,this}isEmpty(){return this.radius<0}makeEmpty(){return this.center.set(0,0,0),this.radius=-1,this}containsPoint(e){return e.distanceToSquared(this.center)<=this.radius*this.radius}distanceToPoint(e){return e.distanceTo(this.center)-this.radius}intersectsSphere(e){const t=this.radius+e.radius;return e.center.distanceToSquared(this.center)<=t*t}intersectsBox(e){return e.intersectsSphere(this)}intersectsPlane(e){return Math.abs(e.distanceToPoint(this.center))<=this.radius}clampPoint(e,t){const n=this.center.distanceToSquared(e);return t.copy(e),n>this.radius*this.radius&&(t.sub(this.center).normalize(),t.multiplyScalar(this.radius).add(this.center)),t}getBoundingBox(e){return this.isEmpty()?(e.makeEmpty(),e):(e.set(this.center,this.center),e.expandByScalar(this.radius),e)}applyMatrix4(e){return this.center.applyMatrix4(e),this.radius=this.radius*e.getMaxScaleOnAxis(),this}translate(e){return this.center.add(e),this}expandByPoint(e){if(this.isEmpty())return this.center.copy(e),this.radius=0,this;_s.subVectors(e,this.center);const t=_s.lengthSq();if(t>this.radius*this.radius){const e=Math.sqrt(t),n=.5*(e-this.radius);this.center.addScaledVector(_s,n/e),this.radius+=n}return this}union(e){return e.isEmpty()?this:this.isEmpty()?(this.copy(e),this):(!0===this.center.equals(e.center)?this.radius=Math.max(this.radius,e.radius):(Ms.subVectors(e.center,this.center).setLength(e.radius),this.expandByPoint(_s.copy(e.center).add(Ms)),this.expandByPoint(_s.copy(e.center).sub(Ms))),this)}equals(e){return e.center.equals(this.center)&&e.radius===this.radius}clone(){return(new this.constructor).copy(this)}}const Ss=new os,Ts=new os,Bs=new os,Rs=new os,Ls=new os,Ds=new os,Ps=new os;class Us{constructor(e=new os,t=new os(0,0,-1)){this.origin=e,this.direction=t}set(e,t){return this.origin.copy(e),this.direction.copy(t),this}copy(e){return this.origin.copy(e.origin),this.direction.copy(e.direction),this}at(e,t){return t.copy(this.origin).addScaledVector(this.direction,e)}lookAt(e){return this.direction.copy(e).sub(this.origin).normalize(),this}recast(e){return this.origin.copy(this.at(e,Ss)),this}closestPointToPoint(e,t){t.subVectors(e,this.origin);const n=t.dot(this.direction);return n<0?t.copy(this.origin):t.copy(this.origin).addScaledVector(this.direction,n)}distanceToPoint(e){return Math.sqrt(this.distanceSqToPoint(e))}distanceSqToPoint(e){const t=Ss.subVectors(e,this.origin).dot(this.direction);return t<0?this.origin.distanceToSquared(e):(Ss.copy(this.origin).addScaledVector(this.direction,t),Ss.distanceToSquared(e))}distanceSqToSegment(e,t,n,i){Ts.copy(e).add(t).multiplyScalar(.5),Bs.copy(t).sub(e).normalize(),Rs.copy(this.origin).sub(Ts);const r=.5*e.distanceTo(t),s=-this.direction.dot(Bs),o=Rs.dot(this.direction),a=-Rs.dot(Bs),l=Rs.lengthSq(),c=Math.abs(1-s*s);let h,u,d,p;if(c>0)if(h=s*a-o,u=s*o-a,p=r*c,h>=0)if(u>=-p)if(u<=p){const e=1/c;h*=e,u*=e,d=h*(h+s*u+2*o)+u*(s*h+u+2*a)+l}else u=r,h=Math.max(0,-(s*u+o)),d=-h*h+u*(u+2*a)+l;else u=-r,h=Math.max(0,-(s*u+o)),d=-h*h+u*(u+2*a)+l;else u<=-p?(h=Math.max(0,-(-s*r+o)),u=h>0?-r:Math.min(Math.max(-r,-a),r),d=-h*h+u*(u+2*a)+l):u<=p?(h=0,u=Math.min(Math.max(-r,-a),r),d=u*(u+2*a)+l):(h=Math.max(0,-(s*r+o)),u=h>0?r:Math.min(Math.max(-r,-a),r),d=-h*h+u*(u+2*a)+l);else u=s>0?-r:r,h=Math.max(0,-(s*u+o)),d=-h*h+u*(u+2*a)+l;return n&&n.copy(this.origin).addScaledVector(this.direction,h),i&&i.copy(Ts).addScaledVector(Bs,u),d}intersectSphere(e,t){Ss.subVectors(e.center,this.origin);const n=Ss.dot(this.direction),i=Ss.dot(Ss)-n*n,r=e.radius*e.radius;if(i>r)return null;const s=Math.sqrt(r-i),o=n-s,a=n+s;return a<0?null:o<0?this.at(a,t):this.at(o,t)}intersectsSphere(e){return this.distanceSqToPoint(e.center)<=e.radius*e.radius}distanceToPlane(e){const t=e.normal.dot(this.direction);if(0===t)return 0===e.distanceToPoint(this.origin)?0:null;const n=-(this.origin.dot(e.normal)+e.constant)/t;return n>=0?n:null}intersectPlane(e,t){const n=this.distanceToPlane(e);return null===n?null:this.at(n,t)}intersectsPlane(e){const t=e.distanceToPoint(this.origin);return 0===t||e.normal.dot(this.direction)*t<0}intersectBox(e,t){let n,i,r,s,o,a;const l=1/this.direction.x,c=1/this.direction.y,h=1/this.direction.z,u=this.origin;return l>=0?(n=(e.min.x-u.x)*l,i=(e.max.x-u.x)*l):(n=(e.max.x-u.x)*l,i=(e.min.x-u.x)*l),c>=0?(r=(e.min.y-u.y)*c,s=(e.max.y-u.y)*c):(r=(e.max.y-u.y)*c,s=(e.min.y-u.y)*c),n>s||r>i?null:((r>n||isNaN(n))&&(n=r),(s<i||isNaN(i))&&(i=s),h>=0?(o=(e.min.z-u.z)*h,a=(e.max.z-u.z)*h):(o=(e.max.z-u.z)*h,a=(e.min.z-u.z)*h),n>a||o>i?null:((o>n||n!=n)&&(n=o),(a<i||i!=i)&&(i=a),i<0?null:this.at(n>=0?n:i,t)))}intersectsBox(e){return null!==this.intersectBox(e,Ss)}intersectTriangle(e,t,n,i,r){Ls.subVectors(t,e),Ds.subVectors(n,e),Ps.crossVectors(Ls,Ds);let s,o=this.direction.dot(Ps);if(o>0){if(i)return null;s=1}else{if(!(o<0))return null;s=-1,o=-o}Rs.subVectors(this.origin,e);const a=s*this.direction.dot(Ds.crossVectors(Rs,Ds));if(a<0)return null;const l=s*this.direction.dot(Ls.cross(Rs));if(l<0)return null;if(a+l>o)return null;const c=-s*Rs.dot(Ps);return c<0?null:this.at(c/o,r)}applyMatrix4(e){return this.origin.applyMatrix4(e),this.direction.transformDirection(e),this}equals(e){return e.origin.equals(this.origin)&&e.direction.equals(this.direction)}clone(){return(new this.constructor).copy(this)}}class ks{constructor(e,t,n,i,r,s,o,a,l,c,h,u,d,p,f,m){ks.prototype.isMatrix4=!0,this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],void 0!==e&&this.set(e,t,n,i,r,s,o,a,l,c,h,u,d,p,f,m)}set(e,t,n,i,r,s,o,a,l,c,h,u,d,p,f,m){const A=this.elements;return A[0]=e,A[4]=t,A[8]=n,A[12]=i,A[1]=r,A[5]=s,A[9]=o,A[13]=a,A[2]=l,A[6]=c,A[10]=h,A[14]=u,A[3]=d,A[7]=p,A[11]=f,A[15]=m,this}identity(){return this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1),this}clone(){return(new ks).fromArray(this.elements)}copy(e){const t=this.elements,n=e.elements;return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t[4]=n[4],t[5]=n[5],t[6]=n[6],t[7]=n[7],t[8]=n[8],t[9]=n[9],t[10]=n[10],t[11]=n[11],t[12]=n[12],t[13]=n[13],t[14]=n[14],t[15]=n[15],this}copyPosition(e){const t=this.elements,n=e.elements;return t[12]=n[12],t[13]=n[13],t[14]=n[14],this}setFromMatrix3(e){const t=e.elements;return this.set(t[0],t[3],t[6],0,t[1],t[4],t[7],0,t[2],t[5],t[8],0,0,0,0,1),this}extractBasis(e,t,n){return e.setFromMatrixColumn(this,0),t.setFromMatrixColumn(this,1),n.setFromMatrixColumn(this,2),this}makeBasis(e,t,n){return this.set(e.x,t.x,n.x,0,e.y,t.y,n.y,0,e.z,t.z,n.z,0,0,0,0,1),this}extractRotation(e){const t=this.elements,n=e.elements,i=1/Ns.setFromMatrixColumn(e,0).length(),r=1/Ns.setFromMatrixColumn(e,1).length(),s=1/Ns.setFromMatrixColumn(e,2).length();return t[0]=n[0]*i,t[1]=n[1]*i,t[2]=n[2]*i,t[3]=0,t[4]=n[4]*r,t[5]=n[5]*r,t[6]=n[6]*r,t[7]=0,t[8]=n[8]*s,t[9]=n[9]*s,t[10]=n[10]*s,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,this}makeRotationFromEuler(e){const t=this.elements,n=e.x,i=e.y,r=e.z,s=Math.cos(n),o=Math.sin(n),a=Math.cos(i),l=Math.sin(i),c=Math.cos(r),h=Math.sin(r);if("XYZ"===e.order){const e=s*c,n=s*h,i=o*c,r=o*h;t[0]=a*c,t[4]=-a*h,t[8]=l,t[1]=n+i*l,t[5]=e-r*l,t[9]=-o*a,t[2]=r-e*l,t[6]=i+n*l,t[10]=s*a}else if("YXZ"===e.order){const e=a*c,n=a*h,i=l*c,r=l*h;t[0]=e+r*o,t[4]=i*o-n,t[8]=s*l,t[1]=s*h,t[5]=s*c,t[9]=-o,t[2]=n*o-i,t[6]=r+e*o,t[10]=s*a}else if("ZXY"===e.order){const e=a*c,n=a*h,i=l*c,r=l*h;t[0]=e-r*o,t[4]=-s*h,t[8]=i+n*o,t[1]=n+i*o,t[5]=s*c,t[9]=r-e*o,t[2]=-s*l,t[6]=o,t[10]=s*a}else if("ZYX"===e.order){const e=s*c,n=s*h,i=o*c,r=o*h;t[0]=a*c,t[4]=i*l-n,t[8]=e*l+r,t[1]=a*h,t[5]=r*l+e,t[9]=n*l-i,t[2]=-l,t[6]=o*a,t[10]=s*a}else if("YZX"===e.order){const e=s*a,n=s*l,i=o*a,r=o*l;t[0]=a*c,t[4]=r-e*h,t[8]=i*h+n,t[1]=h,t[5]=s*c,t[9]=-o*c,t[2]=-l*c,t[6]=n*h+i,t[10]=e-r*h}else if("XZY"===e.order){const e=s*a,n=s*l,i=o*a,r=o*l;t[0]=a*c,t[4]=-h,t[8]=l*c,t[1]=e*h+r,t[5]=s*c,t[9]=n*h-i,t[2]=i*h-n,t[6]=o*c,t[10]=r*h+e}return t[3]=0,t[7]=0,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,this}makeRotationFromQuaternion(e){return this.compose(Fs,e,Qs)}lookAt(e,t,n){const i=this.elements;return Hs.subVectors(e,t),0===Hs.lengthSq()&&(Hs.z=1),Hs.normalize(),zs.crossVectors(n,Hs),0===zs.lengthSq()&&(1===Math.abs(n.z)?Hs.x+=1e-4:Hs.z+=1e-4,Hs.normalize(),zs.crossVectors(n,Hs)),zs.normalize(),Gs.crossVectors(Hs,zs),i[0]=zs.x,i[4]=Gs.x,i[8]=Hs.x,i[1]=zs.y,i[5]=Gs.y,i[9]=Hs.y,i[2]=zs.z,i[6]=Gs.z,i[10]=Hs.z,this}multiply(e){return this.multiplyMatrices(this,e)}premultiply(e){return this.multiplyMatrices(e,this)}multiplyMatrices(e,t){const n=e.elements,i=t.elements,r=this.elements,s=n[0],o=n[4],a=n[8],l=n[12],c=n[1],h=n[5],u=n[9],d=n[13],p=n[2],f=n[6],m=n[10],A=n[14],g=n[3],v=n[7],y=n[11],E=n[15],b=i[0],x=i[4],C=i[8],w=i[12],_=i[1],M=i[5],I=i[9],S=i[13],T=i[2],B=i[6],R=i[10],L=i[14],D=i[3],P=i[7],U=i[11],k=i[15];return r[0]=s*b+o*_+a*T+l*D,r[4]=s*x+o*M+a*B+l*P,r[8]=s*C+o*I+a*R+l*U,r[12]=s*w+o*S+a*L+l*k,r[1]=c*b+h*_+u*T+d*D,r[5]=c*x+h*M+u*B+d*P,r[9]=c*C+h*I+u*R+d*U,r[13]=c*w+h*S+u*L+d*k,r[2]=p*b+f*_+m*T+A*D,r[6]=p*x+f*M+m*B+A*P,r[10]=p*C+f*I+m*R+A*U,r[14]=p*w+f*S+m*L+A*k,r[3]=g*b+v*_+y*T+E*D,r[7]=g*x+v*M+y*B+E*P,r[11]=g*C+v*I+y*R+E*U,r[15]=g*w+v*S+y*L+E*k,this}multiplyScalar(e){const t=this.elements;return t[0]*=e,t[4]*=e,t[8]*=e,t[12]*=e,t[1]*=e,t[5]*=e,t[9]*=e,t[13]*=e,t[2]*=e,t[6]*=e,t[10]*=e,t[14]*=e,t[3]*=e,t[7]*=e,t[11]*=e,t[15]*=e,this}determinant(){const e=this.elements,t=e[0],n=e[4],i=e[8],r=e[12],s=e[1],o=e[5],a=e[9],l=e[13],c=e[2],h=e[6],u=e[10],d=e[14];return e[3]*(+r*a*h-i*l*h-r*o*u+n*l*u+i*o*d-n*a*d)+e[7]*(+t*a*d-t*l*u+r*s*u-i*s*d+i*l*c-r*a*c)+e[11]*(+t*l*h-t*o*d-r*s*h+n*s*d+r*o*c-n*l*c)+e[15]*(-i*o*c-t*a*h+t*o*u+i*s*h-n*s*u+n*a*c)}transpose(){const e=this.elements;let t;return t=e[1],e[1]=e[4],e[4]=t,t=e[2],e[2]=e[8],e[8]=t,t=e[6],e[6]=e[9],e[9]=t,t=e[3],e[3]=e[12],e[12]=t,t=e[7],e[7]=e[13],e[13]=t,t=e[11],e[11]=e[14],e[14]=t,this}setPosition(e,t,n){const i=this.elements;return e.isVector3?(i[12]=e.x,i[13]=e.y,i[14]=e.z):(i[12]=e,i[13]=t,i[14]=n),this}invert(){const e=this.elements,t=e[0],n=e[1],i=e[2],r=e[3],s=e[4],o=e[5],a=e[6],l=e[7],c=e[8],h=e[9],u=e[10],d=e[11],p=e[12],f=e[13],m=e[14],A=e[15],g=h*m*l-f*u*l+f*a*d-o*m*d-h*a*A+o*u*A,v=p*u*l-c*m*l-p*a*d+s*m*d+c*a*A-s*u*A,y=c*f*l-p*h*l+p*o*d-s*f*d-c*o*A+s*h*A,E=p*h*a-c*f*a-p*o*u+s*f*u+c*o*m-s*h*m,b=t*g+n*v+i*y+r*E;if(0===b)return this.set(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);const x=1/b;return e[0]=g*x,e[1]=(f*u*r-h*m*r-f*i*d+n*m*d+h*i*A-n*u*A)*x,e[2]=(o*m*r-f*a*r+f*i*l-n*m*l-o*i*A+n*a*A)*x,e[3]=(h*a*r-o*u*r-h*i*l+n*u*l+o*i*d-n*a*d)*x,e[4]=v*x,e[5]=(c*m*r-p*u*r+p*i*d-t*m*d-c*i*A+t*u*A)*x,e[6]=(p*a*r-s*m*r-p*i*l+t*m*l+s*i*A-t*a*A)*x,e[7]=(s*u*r-c*a*r+c*i*l-t*u*l-s*i*d+t*a*d)*x,e[8]=y*x,e[9]=(p*h*r-c*f*r-p*n*d+t*f*d+c*n*A-t*h*A)*x,e[10]=(s*f*r-p*o*r+p*n*l-t*f*l-s*n*A+t*o*A)*x,e[11]=(c*o*r-s*h*r-c*n*l+t*h*l+s*n*d-t*o*d)*x,e[12]=E*x,e[13]=(c*f*i-p*h*i+p*n*u-t*f*u-c*n*m+t*h*m)*x,e[14]=(p*o*i-s*f*i-p*n*a+t*f*a+s*n*m-t*o*m)*x,e[15]=(s*h*i-c*o*i+c*n*a-t*h*a-s*n*u+t*o*u)*x,this}scale(e){const t=this.elements,n=e.x,i=e.y,r=e.z;return t[0]*=n,t[4]*=i,t[8]*=r,t[1]*=n,t[5]*=i,t[9]*=r,t[2]*=n,t[6]*=i,t[10]*=r,t[3]*=n,t[7]*=i,t[11]*=r,this}getMaxScaleOnAxis(){const e=this.elements,t=e[0]*e[0]+e[1]*e[1]+e[2]*e[2],n=e[4]*e[4]+e[5]*e[5]+e[6]*e[6],i=e[8]*e[8]+e[9]*e[9]+e[10]*e[10];return Math.sqrt(Math.max(t,n,i))}makeTranslation(e,t,n){return e.isVector3?this.set(1,0,0,e.x,0,1,0,e.y,0,0,1,e.z,0,0,0,1):this.set(1,0,0,e,0,1,0,t,0,0,1,n,0,0,0,1),this}makeRotationX(e){const t=Math.cos(e),n=Math.sin(e);return this.set(1,0,0,0,0,t,-n,0,0,n,t,0,0,0,0,1),this}makeRotationY(e){const t=Math.cos(e),n=Math.sin(e);return this.set(t,0,n,0,0,1,0,0,-n,0,t,0,0,0,0,1),this}makeRotationZ(e){const t=Math.cos(e),n=Math.sin(e);return this.set(t,-n,0,0,n,t,0,0,0,0,1,0,0,0,0,1),this}makeRotationAxis(e,t){const n=Math.cos(t),i=Math.sin(t),r=1-n,s=e.x,o=e.y,a=e.z,l=r*s,c=r*o;return this.set(l*s+n,l*o-i*a,l*a+i*o,0,l*o+i*a,c*o+n,c*a-i*s,0,l*a-i*o,c*a+i*s,r*a*a+n,0,0,0,0,1),this}makeScale(e,t,n){return this.set(e,0,0,0,0,t,0,0,0,0,n,0,0,0,0,1),this}makeShear(e,t,n,i,r,s){return this.set(1,n,r,0,e,1,s,0,t,i,1,0,0,0,0,1),this}compose(e,t,n){const i=this.elements,r=t._x,s=t._y,o=t._z,a=t._w,l=r+r,c=s+s,h=o+o,u=r*l,d=r*c,p=r*h,f=s*c,m=s*h,A=o*h,g=a*l,v=a*c,y=a*h,E=n.x,b=n.y,x=n.z;return i[0]=(1-(f+A))*E,i[1]=(d+y)*E,i[2]=(p-v)*E,i[3]=0,i[4]=(d-y)*b,i[5]=(1-(u+A))*b,i[6]=(m+g)*b,i[7]=0,i[8]=(p+v)*x,i[9]=(m-g)*x,i[10]=(1-(u+f))*x,i[11]=0,i[12]=e.x,i[13]=e.y,i[14]=e.z,i[15]=1,this}decompose(e,t,n){const i=this.elements;let r=Ns.set(i[0],i[1],i[2]).length();const s=Ns.set(i[4],i[5],i[6]).length(),o=Ns.set(i[8],i[9],i[10]).length();this.determinant()<0&&(r=-r),e.x=i[12],e.y=i[13],e.z=i[14],Os.copy(this);const a=1/r,l=1/s,c=1/o;return Os.elements[0]*=a,Os.elements[1]*=a,Os.elements[2]*=a,Os.elements[4]*=l,Os.elements[5]*=l,Os.elements[6]*=l,Os.elements[8]*=c,Os.elements[9]*=c,Os.elements[10]*=c,t.setFromRotationMatrix(Os),n.x=r,n.y=s,n.z=o,this}makePerspective(e,t,n,i,r,s,o=fr){const a=this.elements,l=2*r/(t-e),c=2*r/(n-i),h=(t+e)/(t-e),u=(n+i)/(n-i);let d,p;if(o===fr)d=-(s+r)/(s-r),p=-2*s*r/(s-r);else{if(o!==mr)throw new Error("THREE.Matrix4.makePerspective(): Invalid coordinate system: "+o);d=-s/(s-r),p=-s*r/(s-r)}return a[0]=l,a[4]=0,a[8]=h,a[12]=0,a[1]=0,a[5]=c,a[9]=u,a[13]=0,a[2]=0,a[6]=0,a[10]=d,a[14]=p,a[3]=0,a[7]=0,a[11]=-1,a[15]=0,this}makeOrthographic(e,t,n,i,r,s,o=fr){const a=this.elements,l=1/(t-e),c=1/(n-i),h=1/(s-r),u=(t+e)*l,d=(n+i)*c;let p,f;if(o===fr)p=(s+r)*h,f=-2*h;else{if(o!==mr)throw new Error("THREE.Matrix4.makeOrthographic(): Invalid coordinate system: "+o);p=r*h,f=-1*h}return a[0]=2*l,a[4]=0,a[8]=0,a[12]=-u,a[1]=0,a[5]=2*c,a[9]=0,a[13]=-d,a[2]=0,a[6]=0,a[10]=f,a[14]=-p,a[3]=0,a[7]=0,a[11]=0,a[15]=1,this}equals(e){const t=this.elements,n=e.elements;for(let e=0;e<16;e++)if(t[e]!==n[e])return!1;return!0}fromArray(e,t=0){for(let n=0;n<16;n++)this.elements[n]=e[n+t];return this}toArray(e=[],t=0){const n=this.elements;return e[t]=n[0],e[t+1]=n[1],e[t+2]=n[2],e[t+3]=n[3],e[t+4]=n[4],e[t+5]=n[5],e[t+6]=n[6],e[t+7]=n[7],e[t+8]=n[8],e[t+9]=n[9],e[t+10]=n[10],e[t+11]=n[11],e[t+12]=n[12],e[t+13]=n[13],e[t+14]=n[14],e[t+15]=n[15],e}}const Ns=new os,Os=new ks,Fs=new os(0,0,0),Qs=new os(1,1,1),zs=new os,Gs=new os,Hs=new os,Vs=new ks,js=new ss;class Ws{constructor(e=0,t=0,n=0,i=Ws.DEFAULT_ORDER){this.isEuler=!0,this._x=e,this._y=t,this._z=n,this._order=i}get x(){return this._x}set x(e){this._x=e,this._onChangeCallback()}get y(){return this._y}set y(e){this._y=e,this._onChangeCallback()}get z(){return this._z}set z(e){this._z=e,this._onChangeCallback()}get order(){return this._order}set order(e){this._order=e,this._onChangeCallback()}set(e,t,n,i=this._order){return this._x=e,this._y=t,this._z=n,this._order=i,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._order)}copy(e){return this._x=e._x,this._y=e._y,this._z=e._z,this._order=e._order,this._onChangeCallback(),this}setFromRotationMatrix(e,t=this._order,n=!0){const i=e.elements,r=i[0],s=i[4],o=i[8],a=i[1],l=i[5],c=i[9],h=i[2],u=i[6],d=i[10];switch(t){case"XYZ":this._y=Math.asin(Cr(o,-1,1)),Math.abs(o)<.9999999?(this._x=Math.atan2(-c,d),this._z=Math.atan2(-s,r)):(this._x=Math.atan2(u,l),this._z=0);break;case"YXZ":this._x=Math.asin(-Cr(c,-1,1)),Math.abs(c)<.9999999?(this._y=Math.atan2(o,d),this._z=Math.atan2(a,l)):(this._y=Math.atan2(-h,r),this._z=0);break;case"ZXY":this._x=Math.asin(Cr(u,-1,1)),Math.abs(u)<.9999999?(this._y=Math.atan2(-h,d),this._z=Math.atan2(-s,l)):(this._y=0,this._z=Math.atan2(a,r));break;case"ZYX":this._y=Math.asin(-Cr(h,-1,1)),Math.abs(h)<.9999999?(this._x=Math.atan2(u,d),this._z=Math.atan2(a,r)):(this._x=0,this._z=Math.atan2(-s,l));break;case"YZX":this._z=Math.asin(Cr(a,-1,1)),Math.abs(a)<.9999999?(this._x=Math.atan2(-c,l),this._y=Math.atan2(-h,r)):(this._x=0,this._y=Math.atan2(o,d));break;case"XZY":this._z=Math.asin(-Cr(s,-1,1)),Math.abs(s)<.9999999?(this._x=Math.atan2(u,l),this._y=Math.atan2(o,r)):(this._x=Math.atan2(-c,d),this._y=0);break;default:console.warn("THREE.Euler: .setFromRotationMatrix() encountered an unknown order: "+t)}return this._order=t,!0===n&&this._onChangeCallback(),this}setFromQuaternion(e,t,n){return Vs.makeRotationFromQuaternion(e),this.setFromRotationMatrix(Vs,t,n)}setFromVector3(e,t=this._order){return this.set(e.x,e.y,e.z,t)}reorder(e){return js.setFromEuler(this),this.setFromQuaternion(js,e)}equals(e){return e._x===this._x&&e._y===this._y&&e._z===this._z&&e._order===this._order}fromArray(e){return this._x=e[0],this._y=e[1],this._z=e[2],void 0!==e[3]&&(this._order=e[3]),this._onChangeCallback(),this}toArray(e=[],t=0){return e[t]=this._x,e[t+1]=this._y,e[t+2]=this._z,e[t+3]=this._order,e}_onChange(e){return this._onChangeCallback=e,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._order}}Ws.DEFAULT_ORDER="XYZ";class qs{constructor(){this.mask=1}set(e){this.mask=1<<e>>>0}enable(e){this.mask|=1<<e}enableAll(){this.mask=-1}toggle(e){this.mask^=1<<e}disable(e){this.mask&=~(1<<e)}disableAll(){this.mask=0}test(e){return!!(this.mask&e.mask)}isEnabled(e){return!!(this.mask&1<<e)}}let Xs=0;const Ys=new os,Js=new ss,Ks=new ks,Zs=new os,$s=new os,eo=new os,to=new ss,no=new os(1,0,0),io=new os(0,1,0),ro=new os(0,0,1),so={type:"added"},oo={type:"removed"},ao={type:"childadded",child:null},lo={type:"childremoved",child:null};class co extends gr{constructor(){super(),this.isObject3D=!0,Object.defineProperty(this,"id",{value:Xs++}),this.uuid=xr(),this.name="",this.type="Object3D",this.parent=null,this.children=[],this.up=co.DEFAULT_UP.clone();const e=new os,t=new Ws,n=new ss,i=new os(1,1,1);t._onChange((function(){n.setFromEuler(t,!1)})),n._onChange((function(){t.setFromQuaternion(n,void 0,!1)})),Object.defineProperties(this,{position:{configurable:!0,enumerable:!0,value:e},rotation:{configurable:!0,enumerable:!0,value:t},quaternion:{configurable:!0,enumerable:!0,value:n},scale:{configurable:!0,enumerable:!0,value:i},modelViewMatrix:{value:new ks},normalMatrix:{value:new Br}}),this.matrix=new ks,this.matrixWorld=new ks,this.matrixAutoUpdate=co.DEFAULT_MATRIX_AUTO_UPDATE,this.matrixWorldAutoUpdate=co.DEFAULT_MATRIX_WORLD_AUTO_UPDATE,this.matrixWorldNeedsUpdate=!1,this.layers=new qs,this.visible=!0,this.castShadow=!1,this.receiveShadow=!1,this.frustumCulled=!0,this.renderOrder=0,this.animations=[],this.userData={}}onBeforeShadow(){}onAfterShadow(){}onBeforeRender(){}onAfterRender(){}applyMatrix4(e){this.matrixAutoUpdate&&this.updateMatrix(),this.matrix.premultiply(e),this.matrix.decompose(this.position,this.quaternion,this.scale)}applyQuaternion(e){return this.quaternion.premultiply(e),this}setRotationFromAxisAngle(e,t){this.quaternion.setFromAxisAngle(e,t)}setRotationFromEuler(e){this.quaternion.setFromEuler(e,!0)}setRotationFromMatrix(e){this.quaternion.setFromRotationMatrix(e)}setRotationFromQuaternion(e){this.quaternion.copy(e)}rotateOnAxis(e,t){return Js.setFromAxisAngle(e,t),this.quaternion.multiply(Js),this}rotateOnWorldAxis(e,t){return Js.setFromAxisAngle(e,t),this.quaternion.premultiply(Js),this}rotateX(e){return this.rotateOnAxis(no,e)}rotateY(e){return this.rotateOnAxis(io,e)}rotateZ(e){return this.rotateOnAxis(ro,e)}translateOnAxis(e,t){return Ys.copy(e).applyQuaternion(this.quaternion),this.position.add(Ys.multiplyScalar(t)),this}translateX(e){return this.translateOnAxis(no,e)}translateY(e){return this.translateOnAxis(io,e)}translateZ(e){return this.translateOnAxis(ro,e)}localToWorld(e){return this.updateWorldMatrix(!0,!1),e.applyMatrix4(this.matrixWorld)}worldToLocal(e){return this.updateWorldMatrix(!0,!1),e.applyMatrix4(Ks.copy(this.matrixWorld).invert())}lookAt(e,t,n){e.isVector3?Zs.copy(e):Zs.set(e,t,n);const i=this.parent;this.updateWorldMatrix(!0,!1),$s.setFromMatrixPosition(this.matrixWorld),this.isCamera||this.isLight?Ks.lookAt($s,Zs,this.up):Ks.lookAt(Zs,$s,this.up),this.quaternion.setFromRotationMatrix(Ks),i&&(Ks.extractRotation(i.matrixWorld),Js.setFromRotationMatrix(Ks),this.quaternion.premultiply(Js.invert()))}add(e){if(arguments.length>1){for(let e=0;e<arguments.length;e++)this.add(arguments[e]);return this}return e===this?(console.error("THREE.Object3D.add: object can't be added as a child of itself.",e),this):(e&&e.isObject3D?(e.removeFromParent(),e.parent=this,this.children.push(e),e.dispatchEvent(so),ao.child=e,this.dispatchEvent(ao),ao.child=null):console.error("THREE.Object3D.add: object not an instance of THREE.Object3D.",e),this)}remove(e){if(arguments.length>1){for(let e=0;e<arguments.length;e++)this.remove(arguments[e]);return this}const t=this.children.indexOf(e);return-1!==t&&(e.parent=null,this.children.splice(t,1),e.dispatchEvent(oo),lo.child=e,this.dispatchEvent(lo),lo.child=null),this}removeFromParent(){const e=this.parent;return null!==e&&e.remove(this),this}clear(){return this.remove(...this.children)}attach(e){return this.updateWorldMatrix(!0,!1),Ks.copy(this.matrixWorld).invert(),null!==e.parent&&(e.parent.updateWorldMatrix(!0,!1),Ks.multiply(e.parent.matrixWorld)),e.applyMatrix4(Ks),e.removeFromParent(),e.parent=this,this.children.push(e),e.updateWorldMatrix(!1,!0),e.dispatchEvent(so),ao.child=e,this.dispatchEvent(ao),ao.child=null,this}getObjectById(e){return this.getObjectByProperty("id",e)}getObjectByName(e){return this.getObjectByProperty("name",e)}getObjectByProperty(e,t){if(this[e]===t)return this;for(let n=0,i=this.children.length;n<i;n++){const i=this.children[n].getObjectByProperty(e,t);if(void 0!==i)return i}}getObjectsByProperty(e,t,n=[]){this[e]===t&&n.push(this);const i=this.children;for(let r=0,s=i.length;r<s;r++)i[r].getObjectsByProperty(e,t,n);return n}getWorldPosition(e){return this.updateWorldMatrix(!0,!1),e.setFromMatrixPosition(this.matrixWorld)}getWorldQuaternion(e){return this.updateWorldMatrix(!0,!1),this.matrixWorld.decompose($s,e,eo),e}getWorldScale(e){return this.updateWorldMatrix(!0,!1),this.matrixWorld.decompose($s,to,e),e}getWorldDirection(e){this.updateWorldMatrix(!0,!1);const t=this.matrixWorld.elements;return e.set(t[8],t[9],t[10]).normalize()}raycast(){}traverse(e){e(this);const t=this.children;for(let n=0,i=t.length;n<i;n++)t[n].traverse(e)}traverseVisible(e){if(!1===this.visible)return;e(this);const t=this.children;for(let n=0,i=t.length;n<i;n++)t[n].traverseVisible(e)}traverseAncestors(e){const t=this.parent;null!==t&&(e(t),t.traverseAncestors(e))}updateMatrix(){this.matrix.compose(this.position,this.quaternion,this.scale),this.matrixWorldNeedsUpdate=!0}updateMatrixWorld(e){this.matrixAutoUpdate&&this.updateMatrix(),(this.matrixWorldNeedsUpdate||e)&&(!0===this.matrixWorldAutoUpdate&&(null===this.parent?this.matrixWorld.copy(this.matrix):this.matrixWorld.multiplyMatrices(this.parent.matrixWorld,this.matrix)),this.matrixWorldNeedsUpdate=!1,e=!0);const t=this.children;for(let n=0,i=t.length;n<i;n++)t[n].updateMatrixWorld(e)}updateWorldMatrix(e,t){const n=this.parent;if(!0===e&&null!==n&&n.updateWorldMatrix(!0,!1),this.matrixAutoUpdate&&this.updateMatrix(),!0===this.matrixWorldAutoUpdate&&(null===this.parent?this.matrixWorld.copy(this.matrix):this.matrixWorld.multiplyMatrices(this.parent.matrixWorld,this.matrix)),!0===t){const e=this.children;for(let t=0,n=e.length;t<n;t++)e[t].updateWorldMatrix(!1,!0)}}toJSON(e){const t=void 0===e||"string"==typeof e,n={};t&&(e={geometries:{},materials:{},textures:{},images:{},shapes:{},skeletons:{},animations:{},nodes:{}},n.metadata={version:4.6,type:"Object",generator:"Object3D.toJSON"});const i={};function r(t,n){return void 0===t[n.uuid]&&(t[n.uuid]=n.toJSON(e)),n.uuid}if(i.uuid=this.uuid,i.type=this.type,""!==this.name&&(i.name=this.name),!0===this.castShadow&&(i.castShadow=!0),!0===this.receiveShadow&&(i.receiveShadow=!0),!1===this.visible&&(i.visible=!1),!1===this.frustumCulled&&(i.frustumCulled=!1),0!==this.renderOrder&&(i.renderOrder=this.renderOrder),Object.keys(this.userData).length>0&&(i.userData=this.userData),i.layers=this.layers.mask,i.matrix=this.matrix.toArray(),i.up=this.up.toArray(),!1===this.matrixAutoUpdate&&(i.matrixAutoUpdate=!1),this.isInstancedMesh&&(i.type="InstancedMesh",i.count=this.count,i.instanceMatrix=this.instanceMatrix.toJSON(),null!==this.instanceColor&&(i.instanceColor=this.instanceColor.toJSON())),this.isBatchedMesh&&(i.type="BatchedMesh",i.perObjectFrustumCulled=this.perObjectFrustumCulled,i.sortObjects=this.sortObjects,i.drawRanges=this._drawRanges,i.reservedRanges=this._reservedRanges,i.visibility=this._visibility,i.active=this._active,i.bounds=this._bounds.map((e=>({boxInitialized:e.boxInitialized,boxMin:e.box.min.toArray(),boxMax:e.box.max.toArray(),sphereInitialized:e.sphereInitialized,sphereRadius:e.sphere.radius,sphereCenter:e.sphere.center.toArray()}))),i.maxInstanceCount=this._maxInstanceCount,i.maxVertexCount=this._maxVertexCount,i.maxIndexCount=this._maxIndexCount,i.geometryInitialized=this._geometryInitialized,i.geometryCount=this._geometryCount,i.matricesTexture=this._matricesTexture.toJSON(e),null!==this._colorsTexture&&(i.colorsTexture=this._colorsTexture.toJSON(e)),null!==this.boundingSphere&&(i.boundingSphere={center:i.boundingSphere.center.toArray(),radius:i.boundingSphere.radius}),null!==this.boundingBox&&(i.boundingBox={min:i.boundingBox.min.toArray(),max:i.boundingBox.max.toArray()})),this.isScene)this.background&&(this.background.isColor?i.background=this.background.toJSON():this.background.isTexture&&(i.background=this.background.toJSON(e).uuid)),this.environment&&this.environment.isTexture&&!0!==this.environment.isRenderTargetTexture&&(i.environment=this.environment.toJSON(e).uuid);else if(this.isMesh||this.isLine||this.isPoints){i.geometry=r(e.geometries,this.geometry);const t=this.geometry.parameters;if(void 0!==t&&void 0!==t.shapes){const n=t.shapes;if(Array.isArray(n))for(let t=0,i=n.length;t<i;t++){const i=n[t];r(e.shapes,i)}else r(e.shapes,n)}}if(this.isSkinnedMesh&&(i.bindMode=this.bindMode,i.bindMatrix=this.bindMatrix.toArray(),void 0!==this.skeleton&&(r(e.skeletons,this.skeleton),i.skeleton=this.skeleton.uuid)),void 0!==this.material)if(Array.isArray(this.material)){const t=[];for(let n=0,i=this.material.length;n<i;n++)t.push(r(e.materials,this.material[n]));i.material=t}else i.material=r(e.materials,this.material);if(this.children.length>0){i.children=[];for(let t=0;t<this.children.length;t++)i.children.push(this.children[t].toJSON(e).object)}if(this.animations.length>0){i.animations=[];for(let t=0;t<this.animations.length;t++){const n=this.animations[t];i.animations.push(r(e.animations,n))}}if(t){const t=s(e.geometries),i=s(e.materials),r=s(e.textures),o=s(e.images),a=s(e.shapes),l=s(e.skeletons),c=s(e.animations),h=s(e.nodes);t.length>0&&(n.geometries=t),i.length>0&&(n.materials=i),r.length>0&&(n.textures=r),o.length>0&&(n.images=o),a.length>0&&(n.shapes=a),l.length>0&&(n.skeletons=l),c.length>0&&(n.animations=c),h.length>0&&(n.nodes=h)}return n.object=i,n;function s(e){const t=[];for(const n in e){const i=e[n];delete i.metadata,t.push(i)}return t}}clone(e){return(new this.constructor).copy(this,e)}copy(e,t=!0){if(this.name=e.name,this.up.copy(e.up),this.position.copy(e.position),this.rotation.order=e.rotation.order,this.quaternion.copy(e.quaternion),this.scale.copy(e.scale),this.matrix.copy(e.matrix),this.matrixWorld.copy(e.matrixWorld),this.matrixAutoUpdate=e.matrixAutoUpdate,this.matrixWorldAutoUpdate=e.matrixWorldAutoUpdate,this.matrixWorldNeedsUpdate=e.matrixWorldNeedsUpdate,this.layers.mask=e.layers.mask,this.visible=e.visible,this.castShadow=e.castShadow,this.receiveShadow=e.receiveShadow,this.frustumCulled=e.frustumCulled,this.renderOrder=e.renderOrder,this.animations=e.animations.slice(),this.userData=JSON.parse(JSON.stringify(e.userData)),!0===t)for(let t=0;t<e.children.length;t++){const n=e.children[t];this.add(n.clone())}return this}}co.DEFAULT_UP=new os(0,1,0),co.DEFAULT_MATRIX_AUTO_UPDATE=!0,co.DEFAULT_MATRIX_WORLD_AUTO_UPDATE=!0;const ho=new os,uo=new os,po=new os,fo=new os,mo=new os,Ao=new os,go=new os,vo=new os,yo=new os,Eo=new os,bo=new Zr,xo=new Zr,Co=new Zr;class wo{constructor(e=new os,t=new os,n=new os){this.a=e,this.b=t,this.c=n}static getNormal(e,t,n,i){i.subVectors(n,t),ho.subVectors(e,t),i.cross(ho);const r=i.lengthSq();return r>0?i.multiplyScalar(1/Math.sqrt(r)):i.set(0,0,0)}static getBarycoord(e,t,n,i,r){ho.subVectors(i,t),uo.subVectors(n,t),po.subVectors(e,t);const s=ho.dot(ho),o=ho.dot(uo),a=ho.dot(po),l=uo.dot(uo),c=uo.dot(po),h=s*l-o*o;if(0===h)return r.set(0,0,0),null;const u=1/h,d=(l*a-o*c)*u,p=(s*c-o*a)*u;return r.set(1-d-p,p,d)}static containsPoint(e,t,n,i){return null!==this.getBarycoord(e,t,n,i,fo)&&fo.x>=0&&fo.y>=0&&fo.x+fo.y<=1}static getInterpolation(e,t,n,i,r,s,o,a){return null===this.getBarycoord(e,t,n,i,fo)?(a.x=0,a.y=0,"z"in a&&(a.z=0),"w"in a&&(a.w=0),null):(a.setScalar(0),a.addScaledVector(r,fo.x),a.addScaledVector(s,fo.y),a.addScaledVector(o,fo.z),a)}static getInterpolatedAttribute(e,t,n,i,r,s){return bo.setScalar(0),xo.setScalar(0),Co.setScalar(0),bo.fromBufferAttribute(e,t),xo.fromBufferAttribute(e,n),Co.fromBufferAttribute(e,i),s.setScalar(0),s.addScaledVector(bo,r.x),s.addScaledVector(xo,r.y),s.addScaledVector(Co,r.z),s}static isFrontFacing(e,t,n,i){return ho.subVectors(n,t),uo.subVectors(e,t),ho.cross(uo).dot(i)<0}set(e,t,n){return this.a.copy(e),this.b.copy(t),this.c.copy(n),this}setFromPointsAndIndices(e,t,n,i){return this.a.copy(e[t]),this.b.copy(e[n]),this.c.copy(e[i]),this}setFromAttributeAndIndices(e,t,n,i){return this.a.fromBufferAttribute(e,t),this.b.fromBufferAttribute(e,n),this.c.fromBufferAttribute(e,i),this}clone(){return(new this.constructor).copy(this)}copy(e){return this.a.copy(e.a),this.b.copy(e.b),this.c.copy(e.c),this}getArea(){return ho.subVectors(this.c,this.b),uo.subVectors(this.a,this.b),.5*ho.cross(uo).length()}getMidpoint(e){return e.addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)}getNormal(e){return wo.getNormal(this.a,this.b,this.c,e)}getPlane(e){return e.setFromCoplanarPoints(this.a,this.b,this.c)}getBarycoord(e,t){return wo.getBarycoord(e,this.a,this.b,this.c,t)}getInterpolation(e,t,n,i,r){return wo.getInterpolation(e,this.a,this.b,this.c,t,n,i,r)}containsPoint(e){return wo.containsPoint(e,this.a,this.b,this.c)}isFrontFacing(e){return wo.isFrontFacing(this.a,this.b,this.c,e)}intersectsBox(e){return e.intersectsTriangle(this)}closestPointToPoint(e,t){const n=this.a,i=this.b,r=this.c;let s,o;mo.subVectors(i,n),Ao.subVectors(r,n),vo.subVectors(e,n);const a=mo.dot(vo),l=Ao.dot(vo);if(a<=0&&l<=0)return t.copy(n);yo.subVectors(e,i);const c=mo.dot(yo),h=Ao.dot(yo);if(c>=0&&h<=c)return t.copy(i);const u=a*h-c*l;if(u<=0&&a>=0&&c<=0)return s=a/(a-c),t.copy(n).addScaledVector(mo,s);Eo.subVectors(e,r);const d=mo.dot(Eo),p=Ao.dot(Eo);if(p>=0&&d<=p)return t.copy(r);const f=d*l-a*p;if(f<=0&&l>=0&&p<=0)return o=l/(l-p),t.copy(n).addScaledVector(Ao,o);const m=c*p-d*h;if(m<=0&&h-c>=0&&d-p>=0)return go.subVectors(r,i),o=(h-c)/(h-c+(d-p)),t.copy(i).addScaledVector(go,o);const A=1/(m+f+u);return s=f*A,o=u*A,t.copy(n).addScaledVector(mo,s).addScaledVector(Ao,o)}equals(e){return e.a.equals(this.a)&&e.b.equals(this.b)&&e.c.equals(this.c)}}const _o={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074},Mo={h:0,s:0,l:0},Io={h:0,s:0,l:0};function So(e,t,n){return n<0&&(n+=1),n>1&&(n-=1),n<1/6?e+6*(t-e)*n:n<.5?t:n<2/3?e+6*(t-e)*(2/3-n):e}class To{constructor(e,t,n){return this.isColor=!0,this.r=1,this.g=1,this.b=1,this.set(e,t,n)}set(e,t,n){if(void 0===t&&void 0===n){const t=e;t&&t.isColor?this.copy(t):"number"==typeof t?this.setHex(t):"string"==typeof t&&this.setStyle(t)}else this.setRGB(e,t,n);return this}setScalar(e){return this.r=e,this.g=e,this.b=e,this}setHex(e,t=Ti){return e=Math.floor(e),this.r=(e>>16&255)/255,this.g=(e>>8&255)/255,this.b=(255&e)/255,Gr.toWorkingColorSpace(this,t),this}setRGB(e,t,n,i=Gr.workingColorSpace){return this.r=e,this.g=t,this.b=n,Gr.toWorkingColorSpace(this,i),this}setHSL(e,t,n,i=Gr.workingColorSpace){if(e=wr(e,1),t=Cr(t,0,1),n=Cr(n,0,1),0===t)this.r=this.g=this.b=n;else{const i=n<=.5?n*(1+t):n+t-n*t,r=2*n-i;this.r=So(r,i,e+1/3),this.g=So(r,i,e),this.b=So(r,i,e-1/3)}return Gr.toWorkingColorSpace(this,i),this}setStyle(e,t=Ti){function n(t){void 0!==t&&parseFloat(t)<1&&console.warn("THREE.Color: Alpha component of "+e+" will be ignored.")}let i;if(i=/^(\w+)\(([^\)]*)\)/.exec(e)){let r;const s=i[1],o=i[2];switch(s){case"rgb":case"rgba":if(r=/^\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(o))return n(r[4]),this.setRGB(Math.min(255,parseInt(r[1],10))/255,Math.min(255,parseInt(r[2],10))/255,Math.min(255,parseInt(r[3],10))/255,t);if(r=/^\s*(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(o))return n(r[4]),this.setRGB(Math.min(100,parseInt(r[1],10))/100,Math.min(100,parseInt(r[2],10))/100,Math.min(100,parseInt(r[3],10))/100,t);break;case"hsl":case"hsla":if(r=/^\s*(\d*\.?\d+)\s*,\s*(\d*\.?\d+)\%\s*,\s*(\d*\.?\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(o))return n(r[4]),this.setHSL(parseFloat(r[1])/360,parseFloat(r[2])/100,parseFloat(r[3])/100,t);break;default:console.warn("THREE.Color: Unknown color model "+e)}}else if(i=/^\#([A-Fa-f\d]+)$/.exec(e)){const n=i[1],r=n.length;if(3===r)return this.setRGB(parseInt(n.charAt(0),16)/15,parseInt(n.charAt(1),16)/15,parseInt(n.charAt(2),16)/15,t);if(6===r)return this.setHex(parseInt(n,16),t);console.warn("THREE.Color: Invalid hex color "+e)}else if(e&&e.length>0)return this.setColorName(e,t);return this}setColorName(e,t=Ti){const n=_o[e.toLowerCase()];return void 0!==n?this.setHex(n,t):console.warn("THREE.Color: Unknown color "+e),this}clone(){return new this.constructor(this.r,this.g,this.b)}copy(e){return this.r=e.r,this.g=e.g,this.b=e.b,this}copySRGBToLinear(e){return this.r=Hr(e.r),this.g=Hr(e.g),this.b=Hr(e.b),this}copyLinearToSRGB(e){return this.r=Vr(e.r),this.g=Vr(e.g),this.b=Vr(e.b),this}convertSRGBToLinear(){return this.copySRGBToLinear(this),this}convertLinearToSRGB(){return this.copyLinearToSRGB(this),this}getHex(e=Ti){return Gr.fromWorkingColorSpace(Bo.copy(this),e),65536*Math.round(Cr(255*Bo.r,0,255))+256*Math.round(Cr(255*Bo.g,0,255))+Math.round(Cr(255*Bo.b,0,255))}getHexString(e=Ti){return("000000"+this.getHex(e).toString(16)).slice(-6)}getHSL(e,t=Gr.workingColorSpace){Gr.fromWorkingColorSpace(Bo.copy(this),t);const n=Bo.r,i=Bo.g,r=Bo.b,s=Math.max(n,i,r),o=Math.min(n,i,r);let a,l;const c=(o+s)/2;if(o===s)a=0,l=0;else{const e=s-o;switch(l=c<=.5?e/(s+o):e/(2-s-o),s){case n:a=(i-r)/e+(i<r?6:0);break;case i:a=(r-n)/e+2;break;case r:a=(n-i)/e+4}a/=6}return e.h=a,e.s=l,e.l=c,e}getRGB(e,t=Gr.workingColorSpace){return Gr.fromWorkingColorSpace(Bo.copy(this),t),e.r=Bo.r,e.g=Bo.g,e.b=Bo.b,e}getStyle(e=Ti){Gr.fromWorkingColorSpace(Bo.copy(this),e);const t=Bo.r,n=Bo.g,i=Bo.b;return e!==Ti?`color(${e} ${t.toFixed(3)} ${n.toFixed(3)} ${i.toFixed(3)})`:`rgb(${Math.round(255*t)},${Math.round(255*n)},${Math.round(255*i)})`}offsetHSL(e,t,n){return this.getHSL(Mo),this.setHSL(Mo.h+e,Mo.s+t,Mo.l+n)}add(e){return this.r+=e.r,this.g+=e.g,this.b+=e.b,this}addColors(e,t){return this.r=e.r+t.r,this.g=e.g+t.g,this.b=e.b+t.b,this}addScalar(e){return this.r+=e,this.g+=e,this.b+=e,this}sub(e){return this.r=Math.max(0,this.r-e.r),this.g=Math.max(0,this.g-e.g),this.b=Math.max(0,this.b-e.b),this}multiply(e){return this.r*=e.r,this.g*=e.g,this.b*=e.b,this}multiplyScalar(e){return this.r*=e,this.g*=e,this.b*=e,this}lerp(e,t){return this.r+=(e.r-this.r)*t,this.g+=(e.g-this.g)*t,this.b+=(e.b-this.b)*t,this}lerpColors(e,t,n){return this.r=e.r+(t.r-e.r)*n,this.g=e.g+(t.g-e.g)*n,this.b=e.b+(t.b-e.b)*n,this}lerpHSL(e,t){this.getHSL(Mo),e.getHSL(Io);const n=_r(Mo.h,Io.h,t),i=_r(Mo.s,Io.s,t),r=_r(Mo.l,Io.l,t);return this.setHSL(n,i,r),this}setFromVector3(e){return this.r=e.x,this.g=e.y,this.b=e.z,this}applyMatrix3(e){const t=this.r,n=this.g,i=this.b,r=e.elements;return this.r=r[0]*t+r[3]*n+r[6]*i,this.g=r[1]*t+r[4]*n+r[7]*i,this.b=r[2]*t+r[5]*n+r[8]*i,this}equals(e){return e.r===this.r&&e.g===this.g&&e.b===this.b}fromArray(e,t=0){return this.r=e[t],this.g=e[t+1],this.b=e[t+2],this}toArray(e=[],t=0){return e[t]=this.r,e[t+1]=this.g,e[t+2]=this.b,e}fromBufferAttribute(e,t){return this.r=e.getX(t),this.g=e.getY(t),this.b=e.getZ(t),this}toJSON(){return this.getHex()}*[Symbol.iterator](){yield this.r,yield this.g,yield this.b}}const Bo=new To;To.NAMES=_o;let Ro=0;class Lo extends gr{constructor(){super(),this.isMaterial=!0,Object.defineProperty(this,"id",{value:Ro++}),this.uuid=xr(),this.name="",this.type="Material",this.blending=qe,this.side=He,this.vertexColors=!1,this.opacity=1,this.transparent=!1,this.alphaHash=!1,this.blendSrc=at,this.blendDst=lt,this.blendEquation=Ze,this.blendSrcAlpha=null,this.blendDstAlpha=null,this.blendEquationAlpha=null,this.blendColor=new To(0,0,0),this.blendAlpha=0,this.depthFunc=bt,this.depthTest=!0,this.depthWrite=!0,this.stencilWriteMask=255,this.stencilFunc=Xi,this.stencilRef=0,this.stencilFuncMask=255,this.stencilFail=Pi,this.stencilZFail=Pi,this.stencilZPass=Pi,this.stencilWrite=!1,this.clippingPlanes=null,this.clipIntersection=!1,this.clipShadows=!1,this.shadowSide=null,this.colorWrite=!0,this.precision=null,this.polygonOffset=!1,this.polygonOffsetFactor=0,this.polygonOffsetUnits=0,this.dithering=!1,this.alphaToCoverage=!1,this.premultipliedAlpha=!1,this.forceSinglePass=!1,this.visible=!0,this.toneMapped=!0,this.userData={},this.version=0,this._alphaTest=0}get alphaTest(){return this._alphaTest}set alphaTest(e){this._alphaTest>0!=e>0&&this.version++,this._alphaTest=e}onBeforeRender(){}onBeforeCompile(){}customProgramCacheKey(){return this.onBeforeCompile.toString()}setValues(e){if(void 0!==e)for(const t in e){const n=e[t];if(void 0===n){console.warn(`THREE.Material: parameter '${t}' has value of undefined.`);continue}const i=this[t];void 0!==i?i&&i.isColor?i.set(n):i&&i.isVector3&&n&&n.isVector3?i.copy(n):this[t]=n:console.warn(`THREE.Material: '${t}' is not a property of THREE.${this.type}.`)}}toJSON(e){const t=void 0===e||"string"==typeof e;t&&(e={textures:{},images:{}});const n={metadata:{version:4.6,type:"Material",generator:"Material.toJSON"}};function i(e){const t=[];for(const n in e){const i=e[n];delete i.metadata,t.push(i)}return t}if(n.uuid=this.uuid,n.type=this.type,""!==this.name&&(n.name=this.name),this.color&&this.color.isColor&&(n.color=this.color.getHex()),void 0!==this.roughness&&(n.roughness=this.roughness),void 0!==this.metalness&&(n.metalness=this.metalness),void 0!==this.sheen&&(n.sheen=this.sheen),this.sheenColor&&this.sheenColor.isColor&&(n.sheenColor=this.sheenColor.getHex()),void 0!==this.sheenRoughness&&(n.sheenRoughness=this.sheenRoughness),this.emissive&&this.emissive.isColor&&(n.emissive=this.emissive.getHex()),void 0!==this.emissiveIntensity&&1!==this.emissiveIntensity&&(n.emissiveIntensity=this.emissiveIntensity),this.specular&&this.specular.isColor&&(n.specular=this.specular.getHex()),void 0!==this.specularIntensity&&(n.specularIntensity=this.specularIntensity),this.specularColor&&this.specularColor.isColor&&(n.specularColor=this.specularColor.getHex()),void 0!==this.shininess&&(n.shininess=this.shininess),void 0!==this.clearcoat&&(n.clearcoat=this.clearcoat),void 0!==this.clearcoatRoughness&&(n.clearcoatRoughness=this.clearcoatRoughness),this.clearcoatMap&&this.clearcoatMap.isTexture&&(n.clearcoatMap=this.clearcoatMap.toJSON(e).uuid),this.clearcoatRoughnessMap&&this.clearcoatRoughnessMap.isTexture&&(n.clearcoatRoughnessMap=this.clearcoatRoughnessMap.toJSON(e).uuid),this.clearcoatNormalMap&&this.clearcoatNormalMap.isTexture&&(n.clearcoatNormalMap=this.clearcoatNormalMap.toJSON(e).uuid,n.clearcoatNormalScale=this.clearcoatNormalScale.toArray()),void 0!==this.dispersion&&(n.dispersion=this.dispersion),void 0!==this.iridescence&&(n.iridescence=this.iridescence),void 0!==this.iridescenceIOR&&(n.iridescenceIOR=this.iridescenceIOR),void 0!==this.iridescenceThicknessRange&&(n.iridescenceThicknessRange=this.iridescenceThicknessRange),this.iridescenceMap&&this.iridescenceMap.isTexture&&(n.iridescenceMap=this.iridescenceMap.toJSON(e).uuid),this.iridescenceThicknessMap&&this.iridescenceThicknessMap.isTexture&&(n.iridescenceThicknessMap=this.iridescenceThicknessMap.toJSON(e).uuid),void 0!==this.anisotropy&&(n.anisotropy=this.anisotropy),void 0!==this.anisotropyRotation&&(n.anisotropyRotation=this.anisotropyRotation),this.anisotropyMap&&this.anisotropyMap.isTexture&&(n.anisotropyMap=this.anisotropyMap.toJSON(e).uuid),this.map&&this.map.isTexture&&(n.map=this.map.toJSON(e).uuid),this.matcap&&this.matcap.isTexture&&(n.matcap=this.matcap.toJSON(e).uuid),this.alphaMap&&this.alphaMap.isTexture&&(n.alphaMap=this.alphaMap.toJSON(e).uuid),this.lightMap&&this.lightMap.isTexture&&(n.lightMap=this.lightMap.toJSON(e).uuid,n.lightMapIntensity=this.lightMapIntensity),this.aoMap&&this.aoMap.isTexture&&(n.aoMap=this.aoMap.toJSON(e).uuid,n.aoMapIntensity=this.aoMapIntensity),this.bumpMap&&this.bumpMap.isTexture&&(n.bumpMap=this.bumpMap.toJSON(e).uuid,n.bumpScale=this.bumpScale),this.normalMap&&this.normalMap.isTexture&&(n.normalMap=this.normalMap.toJSON(e).uuid,n.normalMapType=this.normalMapType,n.normalScale=this.normalScale.toArray()),this.displacementMap&&this.displacementMap.isTexture&&(n.displacementMap=this.displacementMap.toJSON(e).uuid,n.displacementScale=this.displacementScale,n.displacementBias=this.displacementBias),this.roughnessMap&&this.roughnessMap.isTexture&&(n.roughnessMap=this.roughnessMap.toJSON(e).uuid),this.metalnessMap&&this.metalnessMap.isTexture&&(n.metalnessMap=this.metalnessMap.toJSON(e).uuid),this.emissiveMap&&this.emissiveMap.isTexture&&(n.emissiveMap=this.emissiveMap.toJSON(e).uuid),this.specularMap&&this.specularMap.isTexture&&(n.specularMap=this.specularMap.toJSON(e).uuid),this.specularIntensityMap&&this.specularIntensityMap.isTexture&&(n.specularIntensityMap=this.specularIntensityMap.toJSON(e).uuid),this.specularColorMap&&this.specularColorMap.isTexture&&(n.specularColorMap=this.specularColorMap.toJSON(e).uuid),this.envMap&&this.envMap.isTexture&&(n.envMap=this.envMap.toJSON(e).uuid,void 0!==this.combine&&(n.combine=this.combine)),void 0!==this.envMapRotation&&(n.envMapRotation=this.envMapRotation.toArray()),void 0!==this.envMapIntensity&&(n.envMapIntensity=this.envMapIntensity),void 0!==this.reflectivity&&(n.reflectivity=this.reflectivity),void 0!==this.refractionRatio&&(n.refractionRatio=this.refractionRatio),this.gradientMap&&this.gradientMap.isTexture&&(n.gradientMap=this.gradientMap.toJSON(e).uuid),void 0!==this.transmission&&(n.transmission=this.transmission),this.transmissionMap&&this.transmissionMap.isTexture&&(n.transmissionMap=this.transmissionMap.toJSON(e).uuid),void 0!==this.thickness&&(n.thickness=this.thickness),this.thicknessMap&&this.thicknessMap.isTexture&&(n.thicknessMap=this.thicknessMap.toJSON(e).uuid),void 0!==this.attenuationDistance&&this.attenuationDistance!==1/0&&(n.attenuationDistance=this.attenuationDistance),void 0!==this.attenuationColor&&(n.attenuationColor=this.attenuationColor.getHex()),void 0!==this.size&&(n.size=this.size),null!==this.shadowSide&&(n.shadowSide=this.shadowSide),void 0!==this.sizeAttenuation&&(n.sizeAttenuation=this.sizeAttenuation),this.blending!==qe&&(n.blending=this.blending),this.side!==He&&(n.side=this.side),!0===this.vertexColors&&(n.vertexColors=!0),this.opacity<1&&(n.opacity=this.opacity),!0===this.transparent&&(n.transparent=!0),this.blendSrc!==at&&(n.blendSrc=this.blendSrc),this.blendDst!==lt&&(n.blendDst=this.blendDst),this.blendEquation!==Ze&&(n.blendEquation=this.blendEquation),null!==this.blendSrcAlpha&&(n.blendSrcAlpha=this.blendSrcAlpha),null!==this.blendDstAlpha&&(n.blendDstAlpha=this.blendDstAlpha),null!==this.blendEquationAlpha&&(n.blendEquationAlpha=this.blendEquationAlpha),this.blendColor&&this.blendColor.isColor&&(n.blendColor=this.blendColor.getHex()),0!==this.blendAlpha&&(n.blendAlpha=this.blendAlpha),this.depthFunc!==bt&&(n.depthFunc=this.depthFunc),!1===this.depthTest&&(n.depthTest=this.depthTest),!1===this.depthWrite&&(n.depthWrite=this.depthWrite),!1===this.colorWrite&&(n.colorWrite=this.colorWrite),255!==this.stencilWriteMask&&(n.stencilWriteMask=this.stencilWriteMask),this.stencilFunc!==Xi&&(n.stencilFunc=this.stencilFunc),0!==this.stencilRef&&(n.stencilRef=this.stencilRef),255!==this.stencilFuncMask&&(n.stencilFuncMask=this.stencilFuncMask),this.stencilFail!==Pi&&(n.stencilFail=this.stencilFail),this.stencilZFail!==Pi&&(n.stencilZFail=this.stencilZFail),this.stencilZPass!==Pi&&(n.stencilZPass=this.stencilZPass),!0===this.stencilWrite&&(n.stencilWrite=this.stencilWrite),void 0!==this.rotation&&0!==this.rotation&&(n.rotation=this.rotation),!0===this.polygonOffset&&(n.polygonOffset=!0),0!==this.polygonOffsetFactor&&(n.polygonOffsetFactor=this.polygonOffsetFactor),0!==this.polygonOffsetUnits&&(n.polygonOffsetUnits=this.polygonOffsetUnits),void 0!==this.linewidth&&1!==this.linewidth&&(n.linewidth=this.linewidth),void 0!==this.dashSize&&(n.dashSize=this.dashSize),void 0!==this.gapSize&&(n.gapSize=this.gapSize),void 0!==this.scale&&(n.scale=this.scale),!0===this.dithering&&(n.dithering=!0),this.alphaTest>0&&(n.alphaTest=this.alphaTest),!0===this.alphaHash&&(n.alphaHash=!0),!0===this.alphaToCoverage&&(n.alphaToCoverage=!0),!0===this.premultipliedAlpha&&(n.premultipliedAlpha=!0),!0===this.forceSinglePass&&(n.forceSinglePass=!0),!0===this.wireframe&&(n.wireframe=!0),this.wireframeLinewidth>1&&(n.wireframeLinewidth=this.wireframeLinewidth),"round"!==this.wireframeLinecap&&(n.wireframeLinecap=this.wireframeLinecap),"round"!==this.wireframeLinejoin&&(n.wireframeLinejoin=this.wireframeLinejoin),!0===this.flatShading&&(n.flatShading=!0),!1===this.visible&&(n.visible=!1),!1===this.toneMapped&&(n.toneMapped=!1),!1===this.fog&&(n.fog=!1),Object.keys(this.userData).length>0&&(n.userData=this.userData),t){const t=i(e.textures),r=i(e.images);t.length>0&&(n.textures=t),r.length>0&&(n.images=r)}return n}clone(){return(new this.constructor).copy(this)}copy(e){this.name=e.name,this.blending=e.blending,this.side=e.side,this.vertexColors=e.vertexColors,this.opacity=e.opacity,this.transparent=e.transparent,this.blendSrc=e.blendSrc,this.blendDst=e.blendDst,this.blendEquation=e.blendEquation,this.blendSrcAlpha=e.blendSrcAlpha,this.blendDstAlpha=e.blendDstAlpha,this.blendEquationAlpha=e.blendEquationAlpha,this.blendColor.copy(e.blendColor),this.blendAlpha=e.blendAlpha,this.depthFunc=e.depthFunc,this.depthTest=e.depthTest,this.depthWrite=e.depthWrite,this.stencilWriteMask=e.stencilWriteMask,this.stencilFunc=e.stencilFunc,this.stencilRef=e.stencilRef,this.stencilFuncMask=e.stencilFuncMask,this.stencilFail=e.stencilFail,this.stencilZFail=e.stencilZFail,this.stencilZPass=e.stencilZPass,this.stencilWrite=e.stencilWrite;const t=e.clippingPlanes;let n=null;if(null!==t){const e=t.length;n=new Array(e);for(let i=0;i!==e;++i)n[i]=t[i].clone()}return this.clippingPlanes=n,this.clipIntersection=e.clipIntersection,this.clipShadows=e.clipShadows,this.shadowSide=e.shadowSide,this.colorWrite=e.colorWrite,this.precision=e.precision,this.polygonOffset=e.polygonOffset,this.polygonOffsetFactor=e.polygonOffsetFactor,this.polygonOffsetUnits=e.polygonOffsetUnits,this.dithering=e.dithering,this.alphaTest=e.alphaTest,this.alphaHash=e.alphaHash,this.alphaToCoverage=e.alphaToCoverage,this.premultipliedAlpha=e.premultipliedAlpha,this.forceSinglePass=e.forceSinglePass,this.visible=e.visible,this.toneMapped=e.toneMapped,this.userData=JSON.parse(JSON.stringify(e.userData)),this}dispose(){this.dispatchEvent({type:"dispose"})}set needsUpdate(e){!0===e&&this.version++}onBuild(){console.warn("Material: onBuild() has been removed.")}}class Do extends Lo{constructor(e){super(),this.isMeshBasicMaterial=!0,this.type="MeshBasicMaterial",this.color=new To(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.envMapRotation=new Ws,this.combine=Mt,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.fog=!0,this.setValues(e)}copy(e){return super.copy(e),this.color.copy(e.color),this.map=e.map,this.lightMap=e.lightMap,this.lightMapIntensity=e.lightMapIntensity,this.aoMap=e.aoMap,this.aoMapIntensity=e.aoMapIntensity,this.specularMap=e.specularMap,this.alphaMap=e.alphaMap,this.envMap=e.envMap,this.envMapRotation.copy(e.envMapRotation),this.combine=e.combine,this.reflectivity=e.reflectivity,this.refractionRatio=e.refractionRatio,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.wireframeLinecap=e.wireframeLinecap,this.wireframeLinejoin=e.wireframeLinejoin,this.fog=e.fog,this}}const Po=Uo();function Uo(){const e=new ArrayBuffer(4),t=new Float32Array(e),n=new Uint32Array(e),i=new Uint32Array(512),r=new Uint32Array(512);for(let e=0;e<256;++e){const t=e-127;t<-27?(i[e]=0,i[256|e]=32768,r[e]=24,r[256|e]=24):t<-14?(i[e]=1024>>-t-14,i[256|e]=1024>>-t-14|32768,r[e]=-t-1,r[256|e]=-t-1):t<=15?(i[e]=t+15<<10,i[256|e]=t+15<<10|32768,r[e]=13,r[256|e]=13):t<128?(i[e]=31744,i[256|e]=64512,r[e]=24,r[256|e]=24):(i[e]=31744,i[256|e]=64512,r[e]=13,r[256|e]=13)}const s=new Uint32Array(2048),o=new Uint32Array(64),a=new Uint32Array(64);for(let e=1;e<1024;++e){let t=e<<13,n=0;for(;!(8388608&t);)t<<=1,n-=8388608;t&=-8388609,n+=947912704,s[e]=t|n}for(let e=1024;e<2048;++e)s[e]=939524096+(e-1024<<13);for(let e=1;e<31;++e)o[e]=e<<23;o[31]=1199570944,o[32]=2147483648;for(let e=33;e<63;++e)o[e]=2147483648+(e-32<<23);o[63]=3347054592;for(let e=1;e<64;++e)32!==e&&(a[e]=1024);return{floatView:t,uint32View:n,baseTable:i,shiftTable:r,mantissaTable:s,exponentTable:o,offsetTable:a}}function ko(e){Math.abs(e)>65504&&console.warn("THREE.DataUtils.toHalfFloat(): Value out of range."),e=Cr(e,-65504,65504),Po.floatView[0]=e;const t=Po.uint32View[0],n=t>>23&511;return Po.baseTable[n]+((8388607&t)>>Po.shiftTable[n])}function No(e){const t=e>>10;return Po.uint32View[0]=Po.mantissaTable[Po.offsetTable[t]+(1023&e)]+Po.exponentTable[t],Po.floatView[0]}const Oo={toHalfFloat:ko,fromHalfFloat:No},Fo=new os,Qo=new Tr;let zo=0;class Go{constructor(e,t,n=!1){if(Array.isArray(e))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");this.isBufferAttribute=!0,Object.defineProperty(this,"id",{value:zo++}),this.name="",this.array=e,this.itemSize=t,this.count=void 0!==e?e.length/t:0,this.normalized=n,this.usage=ir,this.updateRanges=[],this.gpuType=un,this.version=0}onUploadCallback(){}set needsUpdate(e){!0===e&&this.version++}setUsage(e){return this.usage=e,this}addUpdateRange(e,t){this.updateRanges.push({start:e,count:t})}clearUpdateRanges(){this.updateRanges.length=0}copy(e){return this.name=e.name,this.array=new e.array.constructor(e.array),this.itemSize=e.itemSize,this.count=e.count,this.normalized=e.normalized,this.usage=e.usage,this.gpuType=e.gpuType,this}copyAt(e,t,n){e*=this.itemSize,n*=t.itemSize;for(let i=0,r=this.itemSize;i<r;i++)this.array[e+i]=t.array[n+i];return this}copyArray(e){return this.array.set(e),this}applyMatrix3(e){if(2===this.itemSize)for(let t=0,n=this.count;t<n;t++)Qo.fromBufferAttribute(this,t),Qo.applyMatrix3(e),this.setXY(t,Qo.x,Qo.y);else if(3===this.itemSize)for(let t=0,n=this.count;t<n;t++)Fo.fromBufferAttribute(this,t),Fo.applyMatrix3(e),this.setXYZ(t,Fo.x,Fo.y,Fo.z);return this}applyMatrix4(e){for(let t=0,n=this.count;t<n;t++)Fo.fromBufferAttribute(this,t),Fo.applyMatrix4(e),this.setXYZ(t,Fo.x,Fo.y,Fo.z);return this}applyNormalMatrix(e){for(let t=0,n=this.count;t<n;t++)Fo.fromBufferAttribute(this,t),Fo.applyNormalMatrix(e),this.setXYZ(t,Fo.x,Fo.y,Fo.z);return this}transformDirection(e){for(let t=0,n=this.count;t<n;t++)Fo.fromBufferAttribute(this,t),Fo.transformDirection(e),this.setXYZ(t,Fo.x,Fo.y,Fo.z);return this}set(e,t=0){return this.array.set(e,t),this}getComponent(e,t){let n=this.array[e*this.itemSize+t];return this.normalized&&(n=Mr(n,this.array)),n}setComponent(e,t,n){return this.normalized&&(n=Ir(n,this.array)),this.array[e*this.itemSize+t]=n,this}getX(e){let t=this.array[e*this.itemSize];return this.normalized&&(t=Mr(t,this.array)),t}setX(e,t){return this.normalized&&(t=Ir(t,this.array)),this.array[e*this.itemSize]=t,this}getY(e){let t=this.array[e*this.itemSize+1];return this.normalized&&(t=Mr(t,this.array)),t}setY(e,t){return this.normalized&&(t=Ir(t,this.array)),this.array[e*this.itemSize+1]=t,this}getZ(e){let t=this.array[e*this.itemSize+2];return this.normalized&&(t=Mr(t,this.array)),t}setZ(e,t){return this.normalized&&(t=Ir(t,this.array)),this.array[e*this.itemSize+2]=t,this}getW(e){let t=this.array[e*this.itemSize+3];return this.normalized&&(t=Mr(t,this.array)),t}setW(e,t){return this.normalized&&(t=Ir(t,this.array)),this.array[e*this.itemSize+3]=t,this}setXY(e,t,n){return e*=this.itemSize,this.normalized&&(t=Ir(t,this.array),n=Ir(n,this.array)),this.array[e+0]=t,this.array[e+1]=n,this}setXYZ(e,t,n,i){return e*=this.itemSize,this.normalized&&(t=Ir(t,this.array),n=Ir(n,this.array),i=Ir(i,this.array)),this.array[e+0]=t,this.array[e+1]=n,this.array[e+2]=i,this}setXYZW(e,t,n,i,r){return e*=this.itemSize,this.normalized&&(t=Ir(t,this.array),n=Ir(n,this.array),i=Ir(i,this.array),r=Ir(r,this.array)),this.array[e+0]=t,this.array[e+1]=n,this.array[e+2]=i,this.array[e+3]=r,this}onUpload(e){return this.onUploadCallback=e,this}clone(){return new this.constructor(this.array,this.itemSize).copy(this)}toJSON(){const e={itemSize:this.itemSize,type:this.array.constructor.name,array:Array.from(this.array),normalized:this.normalized};return""!==this.name&&(e.name=this.name),this.usage!==ir&&(e.usage=this.usage),e}}class Ho extends Go{constructor(e,t,n){super(new Int8Array(e),t,n)}}class Vo extends Go{constructor(e,t,n){super(new Uint8Array(e),t,n)}}class jo extends Go{constructor(e,t,n){super(new Uint8ClampedArray(e),t,n)}}class Wo extends Go{constructor(e,t,n){super(new Int16Array(e),t,n)}}class qo extends Go{constructor(e,t,n){super(new Uint16Array(e),t,n)}}class Xo extends Go{constructor(e,t,n){super(new Int32Array(e),t,n)}}class Yo extends Go{constructor(e,t,n){super(new Uint32Array(e),t,n)}}class Jo extends Go{constructor(e,t,n){super(new Uint16Array(e),t,n),this.isFloat16BufferAttribute=!0}getX(e){let t=No(this.array[e*this.itemSize]);return this.normalized&&(t=Mr(t,this.array)),t}setX(e,t){return this.normalized&&(t=Ir(t,this.array)),this.array[e*this.itemSize]=ko(t),this}getY(e){let t=No(this.array[e*this.itemSize+1]);return this.normalized&&(t=Mr(t,this.array)),t}setY(e,t){return this.normalized&&(t=Ir(t,this.array)),this.array[e*this.itemSize+1]=ko(t),this}getZ(e){let t=No(this.array[e*this.itemSize+2]);return this.normalized&&(t=Mr(t,this.array)),t}setZ(e,t){return this.normalized&&(t=Ir(t,this.array)),this.array[e*this.itemSize+2]=ko(t),this}getW(e){let t=No(this.array[e*this.itemSize+3]);return this.normalized&&(t=Mr(t,this.array)),t}setW(e,t){return this.normalized&&(t=Ir(t,this.array)),this.array[e*this.itemSize+3]=ko(t),this}setXY(e,t,n){return e*=this.itemSize,this.normalized&&(t=Ir(t,this.array),n=Ir(n,this.array)),this.array[e+0]=ko(t),this.array[e+1]=ko(n),this}setXYZ(e,t,n,i){return e*=this.itemSize,this.normalized&&(t=Ir(t,this.array),n=Ir(n,this.array),i=Ir(i,this.array)),this.array[e+0]=ko(t),this.array[e+1]=ko(n),this.array[e+2]=ko(i),this}setXYZW(e,t,n,i,r){return e*=this.itemSize,this.normalized&&(t=Ir(t,this.array),n=Ir(n,this.array),i=Ir(i,this.array),r=Ir(r,this.array)),this.array[e+0]=ko(t),this.array[e+1]=ko(n),this.array[e+2]=ko(i),this.array[e+3]=ko(r),this}}class Ko extends Go{constructor(e,t,n){super(new Float32Array(e),t,n)}}let Zo=0;const $o=new ks,ea=new co,ta=new os,na=new cs,ia=new cs,ra=new os;class sa extends gr{constructor(){super(),this.isBufferGeometry=!0,Object.defineProperty(this,"id",{value:Zo++}),this.uuid=xr(),this.name="",this.type="BufferGeometry",this.index=null,this.indirect=null,this.attributes={},this.morphAttributes={},this.morphTargetsRelative=!1,this.groups=[],this.boundingBox=null,this.boundingSphere=null,this.drawRange={start:0,count:1/0},this.userData={}}getIndex(){return this.index}setIndex(e){return Array.isArray(e)?this.index=new(Lr(e)?Yo:qo)(e,1):this.index=e,this}setIndirect(e){return this.indirect=e,this}getIndirect(){return this.indirect}getAttribute(e){return this.attributes[e]}setAttribute(e,t){return this.attributes[e]=t,this}deleteAttribute(e){return delete this.attributes[e],this}hasAttribute(e){return void 0!==this.attributes[e]}addGroup(e,t,n=0){this.groups.push({start:e,count:t,materialIndex:n})}clearGroups(){this.groups=[]}setDrawRange(e,t){this.drawRange.start=e,this.drawRange.count=t}applyMatrix4(e){const t=this.attributes.position;void 0!==t&&(t.applyMatrix4(e),t.needsUpdate=!0);const n=this.attributes.normal;if(void 0!==n){const t=(new Br).getNormalMatrix(e);n.applyNormalMatrix(t),n.needsUpdate=!0}const i=this.attributes.tangent;return void 0!==i&&(i.transformDirection(e),i.needsUpdate=!0),null!==this.boundingBox&&this.computeBoundingBox(),null!==this.boundingSphere&&this.computeBoundingSphere(),this}applyQuaternion(e){return $o.makeRotationFromQuaternion(e),this.applyMatrix4($o),this}rotateX(e){return $o.makeRotationX(e),this.applyMatrix4($o),this}rotateY(e){return $o.makeRotationY(e),this.applyMatrix4($o),this}rotateZ(e){return $o.makeRotationZ(e),this.applyMatrix4($o),this}translate(e,t,n){return $o.makeTranslation(e,t,n),this.applyMatrix4($o),this}scale(e,t,n){return $o.makeScale(e,t,n),this.applyMatrix4($o),this}lookAt(e){return ea.lookAt(e),ea.updateMatrix(),this.applyMatrix4(ea.matrix),this}center(){return this.computeBoundingBox(),this.boundingBox.getCenter(ta).negate(),this.translate(ta.x,ta.y,ta.z),this}setFromPoints(e){const t=this.getAttribute("position");if(void 0===t){const t=[];for(let n=0,i=e.length;n<i;n++){const i=e[n];t.push(i.x,i.y,i.z||0)}this.setAttribute("position",new Ko(t,3))}else{const n=Math.min(e.length,t.count);for(let i=0;i<n;i++){const n=e[i];t.setXYZ(i,n.x,n.y,n.z||0)}e.length>t.count&&console.warn("THREE.BufferGeometry: Buffer size too small for points data. Use .dispose() and create a new geometry."),t.needsUpdate=!0}return this}computeBoundingBox(){null===this.boundingBox&&(this.boundingBox=new cs);const e=this.attributes.position,t=this.morphAttributes.position;if(e&&e.isGLBufferAttribute)return console.error("THREE.BufferGeometry.computeBoundingBox(): GLBufferAttribute requires a manual bounding box.",this),void this.boundingBox.set(new os(-1/0,-1/0,-1/0),new os(1/0,1/0,1/0));if(void 0!==e){if(this.boundingBox.setFromBufferAttribute(e),t)for(let e=0,n=t.length;e<n;e++){const n=t[e];na.setFromBufferAttribute(n),this.morphTargetsRelative?(ra.addVectors(this.boundingBox.min,na.min),this.boundingBox.expandByPoint(ra),ra.addVectors(this.boundingBox.max,na.max),this.boundingBox.expandByPoint(ra)):(this.boundingBox.expandByPoint(na.min),this.boundingBox.expandByPoint(na.max))}}else this.boundingBox.makeEmpty();(isNaN(this.boundingBox.min.x)||isNaN(this.boundingBox.min.y)||isNaN(this.boundingBox.min.z))&&console.error('THREE.BufferGeometry.computeBoundingBox(): Computed min/max have NaN values. The "position" attribute is likely to have NaN values.',this)}computeBoundingSphere(){null===this.boundingSphere&&(this.boundingSphere=new Is);const e=this.attributes.position,t=this.morphAttributes.position;if(e&&e.isGLBufferAttribute)return console.error("THREE.BufferGeometry.computeBoundingSphere(): GLBufferAttribute requires a manual bounding sphere.",this),void this.boundingSphere.set(new os,1/0);if(e){const n=this.boundingSphere.center;if(na.setFromBufferAttribute(e),t)for(let e=0,n=t.length;e<n;e++){const n=t[e];ia.setFromBufferAttribute(n),this.morphTargetsRelative?(ra.addVectors(na.min,ia.min),na.expandByPoint(ra),ra.addVectors(na.max,ia.max),na.expandByPoint(ra)):(na.expandByPoint(ia.min),na.expandByPoint(ia.max))}na.getCenter(n);let i=0;for(let t=0,r=e.count;t<r;t++)ra.fromBufferAttribute(e,t),i=Math.max(i,n.distanceToSquared(ra));if(t)for(let r=0,s=t.length;r<s;r++){const s=t[r],o=this.morphTargetsRelative;for(let t=0,r=s.count;t<r;t++)ra.fromBufferAttribute(s,t),o&&(ta.fromBufferAttribute(e,t),ra.add(ta)),i=Math.max(i,n.distanceToSquared(ra))}this.boundingSphere.radius=Math.sqrt(i),isNaN(this.boundingSphere.radius)&&console.error('THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The "position" attribute is likely to have NaN values.',this)}}computeTangents(){const e=this.index,t=this.attributes;if(null===e||void 0===t.position||void 0===t.normal||void 0===t.uv)return void console.error("THREE.BufferGeometry: .computeTangents() failed. Missing required attributes (index, position, normal or uv)");const n=t.position,i=t.normal,r=t.uv;!1===this.hasAttribute("tangent")&&this.setAttribute("tangent",new Go(new Float32Array(4*n.count),4));const s=this.getAttribute("tangent"),o=[],a=[];for(let e=0;e<n.count;e++)o[e]=new os,a[e]=new os;const l=new os,c=new os,h=new os,u=new Tr,d=new Tr,p=new Tr,f=new os,m=new os;function A(e,t,i){l.fromBufferAttribute(n,e),c.fromBufferAttribute(n,t),h.fromBufferAttribute(n,i),u.fromBufferAttribute(r,e),d.fromBufferAttribute(r,t),p.fromBufferAttribute(r,i),c.sub(l),h.sub(l),d.sub(u),p.sub(u);const s=1/(d.x*p.y-p.x*d.y);isFinite(s)&&(f.copy(c).multiplyScalar(p.y).addScaledVector(h,-d.y).multiplyScalar(s),m.copy(h).multiplyScalar(d.x).addScaledVector(c,-p.x).multiplyScalar(s),o[e].add(f),o[t].add(f),o[i].add(f),a[e].add(m),a[t].add(m),a[i].add(m))}let g=this.groups;0===g.length&&(g=[{start:0,count:e.count}]);for(let t=0,n=g.length;t<n;++t){const n=g[t],i=n.start;for(let t=i,r=i+n.count;t<r;t+=3)A(e.getX(t+0),e.getX(t+1),e.getX(t+2))}const v=new os,y=new os,E=new os,b=new os;function x(e){E.fromBufferAttribute(i,e),b.copy(E);const t=o[e];v.copy(t),v.sub(E.multiplyScalar(E.dot(t))).normalize(),y.crossVectors(b,t);const n=y.dot(a[e])<0?-1:1;s.setXYZW(e,v.x,v.y,v.z,n)}for(let t=0,n=g.length;t<n;++t){const n=g[t],i=n.start;for(let t=i,r=i+n.count;t<r;t+=3)x(e.getX(t+0)),x(e.getX(t+1)),x(e.getX(t+2))}}computeVertexNormals(){const e=this.index,t=this.getAttribute("position");if(void 0!==t){let n=this.getAttribute("normal");if(void 0===n)n=new Go(new Float32Array(3*t.count),3),this.setAttribute("normal",n);else for(let e=0,t=n.count;e<t;e++)n.setXYZ(e,0,0,0);const i=new os,r=new os,s=new os,o=new os,a=new os,l=new os,c=new os,h=new os;if(e)for(let u=0,d=e.count;u<d;u+=3){const d=e.getX(u+0),p=e.getX(u+1),f=e.getX(u+2);i.fromBufferAttribute(t,d),r.fromBufferAttribute(t,p),s.fromBufferAttribute(t,f),c.subVectors(s,r),h.subVectors(i,r),c.cross(h),o.fromBufferAttribute(n,d),a.fromBufferAttribute(n,p),l.fromBufferAttribute(n,f),o.add(c),a.add(c),l.add(c),n.setXYZ(d,o.x,o.y,o.z),n.setXYZ(p,a.x,a.y,a.z),n.setXYZ(f,l.x,l.y,l.z)}else for(let e=0,o=t.count;e<o;e+=3)i.fromBufferAttribute(t,e+0),r.fromBufferAttribute(t,e+1),s.fromBufferAttribute(t,e+2),c.subVectors(s,r),h.subVectors(i,r),c.cross(h),n.setXYZ(e+0,c.x,c.y,c.z),n.setXYZ(e+1,c.x,c.y,c.z),n.setXYZ(e+2,c.x,c.y,c.z);this.normalizeNormals(),n.needsUpdate=!0}}normalizeNormals(){const e=this.attributes.normal;for(let t=0,n=e.count;t<n;t++)ra.fromBufferAttribute(e,t),ra.normalize(),e.setXYZ(t,ra.x,ra.y,ra.z)}toNonIndexed(){function e(e,t){const n=e.array,i=e.itemSize,r=e.normalized,s=new n.constructor(t.length*i);let o=0,a=0;for(let r=0,l=t.length;r<l;r++){o=e.isInterleavedBufferAttribute?t[r]*e.data.stride+e.offset:t[r]*i;for(let e=0;e<i;e++)s[a++]=n[o++]}return new Go(s,i,r)}if(null===this.index)return console.warn("THREE.BufferGeometry.toNonIndexed(): BufferGeometry is already non-indexed."),this;const t=new sa,n=this.index.array,i=this.attributes;for(const r in i){const s=e(i[r],n);t.setAttribute(r,s)}const r=this.morphAttributes;for(const i in r){const s=[],o=r[i];for(let t=0,i=o.length;t<i;t++){const i=e(o[t],n);s.push(i)}t.morphAttributes[i]=s}t.morphTargetsRelative=this.morphTargetsRelative;const s=this.groups;for(let e=0,n=s.length;e<n;e++){const n=s[e];t.addGroup(n.start,n.count,n.materialIndex)}return t}toJSON(){const e={metadata:{version:4.6,type:"BufferGeometry",generator:"BufferGeometry.toJSON"}};if(e.uuid=this.uuid,e.type=this.type,""!==this.name&&(e.name=this.name),Object.keys(this.userData).length>0&&(e.userData=this.userData),void 0!==this.parameters){const t=this.parameters;for(const n in t)void 0!==t[n]&&(e[n]=t[n]);return e}e.data={attributes:{}};const t=this.index;null!==t&&(e.data.index={type:t.array.constructor.name,array:Array.prototype.slice.call(t.array)});const n=this.attributes;for(const t in n){const i=n[t];e.data.attributes[t]=i.toJSON(e.data)}const i={};let r=!1;for(const t in this.morphAttributes){const n=this.morphAttributes[t],s=[];for(let t=0,i=n.length;t<i;t++){const i=n[t];s.push(i.toJSON(e.data))}s.length>0&&(i[t]=s,r=!0)}r&&(e.data.morphAttributes=i,e.data.morphTargetsRelative=this.morphTargetsRelative);const s=this.groups;s.length>0&&(e.data.groups=JSON.parse(JSON.stringify(s)));const o=this.boundingSphere;return null!==o&&(e.data.boundingSphere={center:o.center.toArray(),radius:o.radius}),e}clone(){return(new this.constructor).copy(this)}copy(e){this.index=null,this.attributes={},this.morphAttributes={},this.groups=[],this.boundingBox=null,this.boundingSphere=null;const t={};this.name=e.name;const n=e.index;null!==n&&this.setIndex(n.clone(t));const i=e.attributes;for(const e in i){const n=i[e];this.setAttribute(e,n.clone(t))}const r=e.morphAttributes;for(const e in r){const n=[],i=r[e];for(let e=0,r=i.length;e<r;e++)n.push(i[e].clone(t));this.morphAttributes[e]=n}this.morphTargetsRelative=e.morphTargetsRelative;const s=e.groups;for(let e=0,t=s.length;e<t;e++){const t=s[e];this.addGroup(t.start,t.count,t.materialIndex)}const o=e.boundingBox;null!==o&&(this.boundingBox=o.clone());const a=e.boundingSphere;return null!==a&&(this.boundingSphere=a.clone()),this.drawRange.start=e.drawRange.start,this.drawRange.count=e.drawRange.count,this.userData=e.userData,this}dispose(){this.dispatchEvent({type:"dispose"})}}const oa=new ks,aa=new Us,la=new Is,ca=new os,ha=new os,ua=new os,da=new os,pa=new os,fa=new os,ma=new os,Aa=new os;class ga extends co{constructor(e=new sa,t=new Do){super(),this.isMesh=!0,this.type="Mesh",this.geometry=e,this.material=t,this.updateMorphTargets()}copy(e,t){return super.copy(e,t),void 0!==e.morphTargetInfluences&&(this.morphTargetInfluences=e.morphTargetInfluences.slice()),void 0!==e.morphTargetDictionary&&(this.morphTargetDictionary=Object.assign({},e.morphTargetDictionary)),this.material=Array.isArray(e.material)?e.material.slice():e.material,this.geometry=e.geometry,this}updateMorphTargets(){const e=this.geometry.morphAttributes,t=Object.keys(e);if(t.length>0){const n=e[t[0]];if(void 0!==n){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let e=0,t=n.length;e<t;e++){const t=n[e].name||String(e);this.morphTargetInfluences.push(0),this.morphTargetDictionary[t]=e}}}}getVertexPosition(e,t){const n=this.geometry,i=n.attributes.position,r=n.morphAttributes.position,s=n.morphTargetsRelative;t.fromBufferAttribute(i,e);const o=this.morphTargetInfluences;if(r&&o){fa.set(0,0,0);for(let n=0,i=r.length;n<i;n++){const i=o[n],a=r[n];0!==i&&(pa.fromBufferAttribute(a,e),s?fa.addScaledVector(pa,i):fa.addScaledVector(pa.sub(t),i))}t.add(fa)}return t}raycast(e,t){const n=this.geometry,i=this.material,r=this.matrixWorld;if(void 0!==i){if(null===n.boundingSphere&&n.computeBoundingSphere(),la.copy(n.boundingSphere),la.applyMatrix4(r),aa.copy(e.ray).recast(e.near),!1===la.containsPoint(aa.origin)){if(null===aa.intersectSphere(la,ca))return;if(aa.origin.distanceToSquared(ca)>(e.far-e.near)**2)return}oa.copy(r).invert(),aa.copy(e.ray).applyMatrix4(oa),null!==n.boundingBox&&!1===aa.intersectsBox(n.boundingBox)||this._computeIntersections(e,t,aa)}}_computeIntersections(e,t,n){let i;const r=this.geometry,s=this.material,o=r.index,a=r.attributes.position,l=r.attributes.uv,c=r.attributes.uv1,h=r.attributes.normal,u=r.groups,d=r.drawRange;if(null!==o)if(Array.isArray(s))for(let r=0,a=u.length;r<a;r++){const a=u[r],p=s[a.materialIndex];for(let r=Math.max(a.start,d.start),s=Math.min(o.count,Math.min(a.start+a.count,d.start+d.count));r<s;r+=3)i=va(this,p,e,n,l,c,h,o.getX(r),o.getX(r+1),o.getX(r+2)),i&&(i.faceIndex=Math.floor(r/3),i.face.materialIndex=a.materialIndex,t.push(i))}else for(let r=Math.max(0,d.start),a=Math.min(o.count,d.start+d.count);r<a;r+=3)i=va(this,s,e,n,l,c,h,o.getX(r),o.getX(r+1),o.getX(r+2)),i&&(i.faceIndex=Math.floor(r/3),t.push(i));else if(void 0!==a)if(Array.isArray(s))for(let r=0,o=u.length;r<o;r++){const o=u[r],p=s[o.materialIndex];for(let r=Math.max(o.start,d.start),s=Math.min(a.count,Math.min(o.start+o.count,d.start+d.count));r<s;r+=3)i=va(this,p,e,n,l,c,h,r,r+1,r+2),i&&(i.faceIndex=Math.floor(r/3),i.face.materialIndex=o.materialIndex,t.push(i))}else for(let r=Math.max(0,d.start),o=Math.min(a.count,d.start+d.count);r<o;r+=3)i=va(this,s,e,n,l,c,h,r,r+1,r+2),i&&(i.faceIndex=Math.floor(r/3),t.push(i))}}function va(e,t,n,i,r,s,o,a,l,c){e.getVertexPosition(a,ha),e.getVertexPosition(l,ua),e.getVertexPosition(c,da);const h=function(e,t,n,i,r,s,o,a){let l;if(l=t.side===Ve?i.intersectTriangle(o,s,r,!0,a):i.intersectTriangle(r,s,o,t.side===He,a),null===l)return null;Aa.copy(a),Aa.applyMatrix4(e.matrixWorld);const c=n.ray.origin.distanceTo(Aa);return c<n.near||c>n.far?null:{distance:c,point:Aa.clone(),object:e}}(e,t,n,i,ha,ua,da,ma);if(h){const e=new os;wo.getBarycoord(ma,ha,ua,da,e),r&&(h.uv=wo.getInterpolatedAttribute(r,a,l,c,e,new Tr)),s&&(h.uv1=wo.getInterpolatedAttribute(s,a,l,c,e,new Tr)),o&&(h.normal=wo.getInterpolatedAttribute(o,a,l,c,e,new os),h.normal.dot(i.direction)>0&&h.normal.multiplyScalar(-1));const t={a,b:l,c,normal:new os,materialIndex:0};wo.getNormal(ha,ua,da,t.normal),h.face=t,h.barycoord=e}return h}class ya extends sa{constructor(e=1,t=1,n=1,i=1,r=1,s=1){super(),this.type="BoxGeometry",this.parameters={width:e,height:t,depth:n,widthSegments:i,heightSegments:r,depthSegments:s};const o=this;i=Math.floor(i),r=Math.floor(r),s=Math.floor(s);const a=[],l=[],c=[],h=[];let u=0,d=0;function p(e,t,n,i,r,s,p,f,m,A,g){const v=s/m,y=p/A,E=s/2,b=p/2,x=f/2,C=m+1,w=A+1;let _=0,M=0;const I=new os;for(let s=0;s<w;s++){const o=s*y-b;for(let a=0;a<C;a++){const u=a*v-E;I[e]=u*i,I[t]=o*r,I[n]=x,l.push(I.x,I.y,I.z),I[e]=0,I[t]=0,I[n]=f>0?1:-1,c.push(I.x,I.y,I.z),h.push(a/m),h.push(1-s/A),_+=1}}for(let e=0;e<A;e++)for(let t=0;t<m;t++){const n=u+t+C*e,i=u+t+C*(e+1),r=u+(t+1)+C*(e+1),s=u+(t+1)+C*e;a.push(n,i,s),a.push(i,r,s),M+=6}o.addGroup(d,M,g),d+=M,u+=_}p("z","y","x",-1,-1,n,t,e,s,r,0),p("z","y","x",1,-1,n,t,-e,s,r,1),p("x","z","y",1,1,e,n,t,i,s,2),p("x","z","y",1,-1,e,n,-t,i,s,3),p("x","y","z",1,-1,e,t,n,i,r,4),p("x","y","z",-1,-1,e,t,-n,i,r,5),this.setIndex(a),this.setAttribute("position",new Ko(l,3)),this.setAttribute("normal",new Ko(c,3)),this.setAttribute("uv",new Ko(h,2))}copy(e){return super.copy(e),this.parameters=Object.assign({},e.parameters),this}static fromJSON(e){return new ya(e.width,e.height,e.depth,e.widthSegments,e.heightSegments,e.depthSegments)}}function Ea(e){const t={};for(const n in e){t[n]={};for(const i in e[n]){const r=e[n][i];r&&(r.isColor||r.isMatrix3||r.isMatrix4||r.isVector2||r.isVector3||r.isVector4||r.isTexture||r.isQuaternion)?r.isRenderTargetTexture?(console.warn("UniformsUtils: Textures of render targets cannot be cloned via cloneUniforms() or mergeUniforms()."),t[n][i]=null):t[n][i]=r.clone():Array.isArray(r)?t[n][i]=r.slice():t[n][i]=r}}return t}function ba(e){const t={};for(let n=0;n<e.length;n++){const i=Ea(e[n]);for(const e in i)t[e]=i[e]}return t}function xa(e){const t=e.getRenderTarget();return null===t?e.outputColorSpace:!0===t.isXRRenderTarget?t.texture.colorSpace:Gr.workingColorSpace}const Ca={clone:Ea,merge:ba};class wa extends Lo{constructor(e){super(),this.isShaderMaterial=!0,this.type="ShaderMaterial",this.defines={},this.uniforms={},this.uniformsGroups=[],this.vertexShader="void main() {\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}",this.fragmentShader="void main() {\n\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\n}",this.linewidth=1,this.wireframe=!1,this.wireframeLinewidth=1,this.fog=!1,this.lights=!1,this.clipping=!1,this.forceSinglePass=!0,this.extensions={clipCullDistance:!1,multiDraw:!1},this.defaultAttributeValues={color:[1,1,1],uv:[0,0],uv1:[0,0]},this.index0AttributeName=void 0,this.uniformsNeedUpdate=!1,this.glslVersion=null,void 0!==e&&this.setValues(e)}copy(e){return super.copy(e),this.fragmentShader=e.fragmentShader,this.vertexShader=e.vertexShader,this.uniforms=Ea(e.uniforms),this.uniformsGroups=function(e){const t=[];for(let n=0;n<e.length;n++)t.push(e[n].clone());return t}(e.uniformsGroups),this.defines=Object.assign({},e.defines),this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.fog=e.fog,this.lights=e.lights,this.clipping=e.clipping,this.extensions=Object.assign({},e.extensions),this.glslVersion=e.glslVersion,this}toJSON(e){const t=super.toJSON(e);t.glslVersion=this.glslVersion,t.uniforms={};for(const n in this.uniforms){const i=this.uniforms[n].value;i&&i.isTexture?t.uniforms[n]={type:"t",value:i.toJSON(e).uuid}:i&&i.isColor?t.uniforms[n]={type:"c",value:i.getHex()}:i&&i.isVector2?t.uniforms[n]={type:"v2",value:i.toArray()}:i&&i.isVector3?t.uniforms[n]={type:"v3",value:i.toArray()}:i&&i.isVector4?t.uniforms[n]={type:"v4",value:i.toArray()}:i&&i.isMatrix3?t.uniforms[n]={type:"m3",value:i.toArray()}:i&&i.isMatrix4?t.uniforms[n]={type:"m4",value:i.toArray()}:t.uniforms[n]={value:i}}Object.keys(this.defines).length>0&&(t.defines=this.defines),t.vertexShader=this.vertexShader,t.fragmentShader=this.fragmentShader,t.lights=this.lights,t.clipping=this.clipping;const n={};for(const e in this.extensions)!0===this.extensions[e]&&(n[e]=!0);return Object.keys(n).length>0&&(t.extensions=n),t}}class _a extends co{constructor(){super(),this.isCamera=!0,this.type="Camera",this.matrixWorldInverse=new ks,this.projectionMatrix=new ks,this.projectionMatrixInverse=new ks,this.coordinateSystem=fr}copy(e,t){return super.copy(e,t),this.matrixWorldInverse.copy(e.matrixWorldInverse),this.projectionMatrix.copy(e.projectionMatrix),this.projectionMatrixInverse.copy(e.projectionMatrixInverse),this.coordinateSystem=e.coordinateSystem,this}getWorldDirection(e){return super.getWorldDirection(e).negate()}updateMatrixWorld(e){super.updateMatrixWorld(e),this.matrixWorldInverse.copy(this.matrixWorld).invert()}updateWorldMatrix(e,t){super.updateWorldMatrix(e,t),this.matrixWorldInverse.copy(this.matrixWorld).invert()}clone(){return(new this.constructor).copy(this)}}const Ma=new os,Ia=new Tr,Sa=new Tr;class Ta extends _a{constructor(e=50,t=1,n=.1,i=2e3){super(),this.isPerspectiveCamera=!0,this.type="PerspectiveCamera",this.fov=e,this.zoom=1,this.near=n,this.far=i,this.focus=10,this.aspect=t,this.view=null,this.filmGauge=35,this.filmOffset=0,this.updateProjectionMatrix()}copy(e,t){return super.copy(e,t),this.fov=e.fov,this.zoom=e.zoom,this.near=e.near,this.far=e.far,this.focus=e.focus,this.aspect=e.aspect,this.view=null===e.view?null:Object.assign({},e.view),this.filmGauge=e.filmGauge,this.filmOffset=e.filmOffset,this}setFocalLength(e){const t=.5*this.getFilmHeight()/e;this.fov=2*br*Math.atan(t),this.updateProjectionMatrix()}getFocalLength(){const e=Math.tan(.5*Er*this.fov);return.5*this.getFilmHeight()/e}getEffectiveFOV(){return 2*br*Math.atan(Math.tan(.5*Er*this.fov)/this.zoom)}getFilmWidth(){return this.filmGauge*Math.min(this.aspect,1)}getFilmHeight(){return this.filmGauge/Math.max(this.aspect,1)}getViewBounds(e,t,n){Ma.set(-1,-1,.5).applyMatrix4(this.projectionMatrixInverse),t.set(Ma.x,Ma.y).multiplyScalar(-e/Ma.z),Ma.set(1,1,.5).applyMatrix4(this.projectionMatrixInverse),n.set(Ma.x,Ma.y).multiplyScalar(-e/Ma.z)}getViewSize(e,t){return this.getViewBounds(e,Ia,Sa),t.subVectors(Sa,Ia)}setViewOffset(e,t,n,i,r,s){this.aspect=e/t,null===this.view&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1}),this.view.enabled=!0,this.view.fullWidth=e,this.view.fullHeight=t,this.view.offsetX=n,this.view.offsetY=i,this.view.width=r,this.view.height=s,this.updateProjectionMatrix()}clearViewOffset(){null!==this.view&&(this.view.enabled=!1),this.updateProjectionMatrix()}updateProjectionMatrix(){const e=this.near;let t=e*Math.tan(.5*Er*this.fov)/this.zoom,n=2*t,i=this.aspect*n,r=-.5*i;const s=this.view;if(null!==this.view&&this.view.enabled){const e=s.fullWidth,o=s.fullHeight;r+=s.offsetX*i/e,t-=s.offsetY*n/o,i*=s.width/e,n*=s.height/o}const o=this.filmOffset;0!==o&&(r+=e*o/this.getFilmWidth()),this.projectionMatrix.makePerspective(r,r+i,t,t-n,e,this.far,this.coordinateSystem),this.projectionMatrixInverse.copy(this.projectionMatrix).invert()}toJSON(e){const t=super.toJSON(e);return t.object.fov=this.fov,t.object.zoom=this.zoom,t.object.near=this.near,t.object.far=this.far,t.object.focus=this.focus,t.object.aspect=this.aspect,null!==this.view&&(t.object.view=Object.assign({},this.view)),t.object.filmGauge=this.filmGauge,t.object.filmOffset=this.filmOffset,t}}const Ba=-90;class Ra extends co{constructor(e,t,n){super(),this.type="CubeCamera",this.renderTarget=n,this.coordinateSystem=null,this.activeMipmapLevel=0;const i=new Ta(Ba,1,e,t);i.layers=this.layers,this.add(i);const r=new Ta(Ba,1,e,t);r.layers=this.layers,this.add(r);const s=new Ta(Ba,1,e,t);s.layers=this.layers,this.add(s);const o=new Ta(Ba,1,e,t);o.layers=this.layers,this.add(o);const a=new Ta(Ba,1,e,t);a.layers=this.layers,this.add(a);const l=new Ta(Ba,1,e,t);l.layers=this.layers,this.add(l)}updateCoordinateSystem(){const e=this.coordinateSystem,t=this.children.concat(),[n,i,r,s,o,a]=t;for(const e of t)this.remove(e);if(e===fr)n.up.set(0,1,0),n.lookAt(1,0,0),i.up.set(0,1,0),i.lookAt(-1,0,0),r.up.set(0,0,-1),r.lookAt(0,1,0),s.up.set(0,0,1),s.lookAt(0,-1,0),o.up.set(0,1,0),o.lookAt(0,0,1),a.up.set(0,1,0),a.lookAt(0,0,-1);else{if(e!==mr)throw new Error("THREE.CubeCamera.updateCoordinateSystem(): Invalid coordinate system: "+e);n.up.set(0,-1,0),n.lookAt(-1,0,0),i.up.set(0,-1,0),i.lookAt(1,0,0),r.up.set(0,0,1),r.lookAt(0,1,0),s.up.set(0,0,-1),s.lookAt(0,-1,0),o.up.set(0,-1,0),o.lookAt(0,0,1),a.up.set(0,-1,0),a.lookAt(0,0,-1)}for(const e of t)this.add(e),e.updateMatrixWorld()}update(e,t){null===this.parent&&this.updateMatrixWorld();const{renderTarget:n,activeMipmapLevel:i}=this;this.coordinateSystem!==e.coordinateSystem&&(this.coordinateSystem=e.coordinateSystem,this.updateCoordinateSystem());const[r,s,o,a,l,c]=this.children,h=e.getRenderTarget(),u=e.getActiveCubeFace(),d=e.getActiveMipmapLevel(),p=e.xr.enabled;e.xr.enabled=!1;const f=n.texture.generateMipmaps;n.texture.generateMipmaps=!1,e.setRenderTarget(n,0,i),e.render(t,r),e.setRenderTarget(n,1,i),e.render(t,s),e.setRenderTarget(n,2,i),e.render(t,o),e.setRenderTarget(n,3,i),e.render(t,a),e.setRenderTarget(n,4,i),e.render(t,l),n.texture.generateMipmaps=f,e.setRenderTarget(n,5,i),e.render(t,c),e.setRenderTarget(h,u,d),e.xr.enabled=p,n.texture.needsPMREMUpdate=!0}}class La extends Kr{constructor(e,t,n,i,r,s,o,a,l,c){super(e=void 0!==e?e:[],t=void 0!==t?t:Qt,n,i,r,s,o,a,l,c),this.isCubeTexture=!0,this.flipY=!1}get images(){return this.image}set images(e){this.image=e}}class Da extends es{constructor(e=1,t={}){super(e,e,t),this.isWebGLCubeRenderTarget=!0;const n={width:e,height:e,depth:1},i=[n,n,n,n,n,n];this.texture=new La(i,t.mapping,t.wrapS,t.wrapT,t.magFilter,t.minFilter,t.format,t.type,t.anisotropy,t.colorSpace),this.texture.isRenderTargetTexture=!0,this.texture.generateMipmaps=void 0!==t.generateMipmaps&&t.generateMipmaps,this.texture.minFilter=void 0!==t.minFilter?t.minFilter:$t}fromEquirectangularTexture(e,t){this.texture.type=t.type,this.texture.colorSpace=t.colorSpace,this.texture.generateMipmaps=t.generateMipmaps,this.texture.minFilter=t.minFilter,this.texture.magFilter=t.magFilter;const n={tEquirect:{value:null}},i="\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 <begin_vertex>\n\t\t\t\t\t#include <project_vertex>\n\n\t\t\t\t}\n\t\t\t",r="\n\n\t\t\t\tuniform sampler2D tEquirect;\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\t#include <common>\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",s=new ya(5,5,5),o=new wa({name:"CubemapFromEquirect",uniforms:Ea(n),vertexShader:i,fragmentShader:r,side:Ve,blending:We});o.uniforms.tEquirect.value=t;const a=new ga(s,o),l=t.minFilter;return t.minFilter===nn&&(t.minFilter=$t),new Ra(1,10,this).update(e,a),t.minFilter=l,a.geometry.dispose(),a.material.dispose(),this}clear(e,t,n,i){const r=e.getRenderTarget();for(let r=0;r<6;r++)e.setRenderTarget(this,r),e.clear(t,n,i);e.setRenderTarget(r)}}class Pa extends co{constructor(){super(),this.isGroup=!0,this.type="Group"}}const Ua={type:"move"};class ka{constructor(){this._targetRay=null,this._grip=null,this._hand=null}getHandSpace(){return null===this._hand&&(this._hand=new Pa,this._hand.matrixAutoUpdate=!1,this._hand.visible=!1,this._hand.joints={},this._hand.inputState={pinching:!1}),this._hand}getTargetRaySpace(){return null===this._targetRay&&(this._targetRay=new Pa,this._targetRay.matrixAutoUpdate=!1,this._targetRay.visible=!1,this._targetRay.hasLinearVelocity=!1,this._targetRay.linearVelocity=new os,this._targetRay.hasAngularVelocity=!1,this._targetRay.angularVelocity=new os),this._targetRay}getGripSpace(){return null===this._grip&&(this._grip=new Pa,this._grip.matrixAutoUpdate=!1,this._grip.visible=!1,this._grip.hasLinearVelocity=!1,this._grip.linearVelocity=new os,this._grip.hasAngularVelocity=!1,this._grip.angularVelocity=new os),this._grip}dispatchEvent(e){return null!==this._targetRay&&this._targetRay.dispatchEvent(e),null!==this._grip&&this._grip.dispatchEvent(e),null!==this._hand&&this._hand.dispatchEvent(e),this}connect(e){if(e&&e.hand){const t=this._hand;if(t)for(const n of e.hand.values())this._getHandJoint(t,n)}return this.dispatchEvent({type:"connected",data:e}),this}disconnect(e){return this.dispatchEvent({type:"disconnected",data:e}),null!==this._targetRay&&(this._targetRay.visible=!1),null!==this._grip&&(this._grip.visible=!1),null!==this._hand&&(this._hand.visible=!1),this}update(e,t,n){let i=null,r=null,s=null;const o=this._targetRay,a=this._grip,l=this._hand;if(e&&"visible-blurred"!==t.session.visibilityState){if(l&&e.hand){s=!0;for(const i of e.hand.values()){const e=t.getJointPose(i,n),r=this._getHandJoint(l,i);null!==e&&(r.matrix.fromArray(e.transform.matrix),r.matrix.decompose(r.position,r.rotation,r.scale),r.matrixWorldNeedsUpdate=!0,r.jointRadius=e.radius),r.visible=null!==e}const i=l.joints["index-finger-tip"],r=l.joints["thumb-tip"],o=i.position.distanceTo(r.position),a=.02,c=.005;l.inputState.pinching&&o>a+c?(l.inputState.pinching=!1,this.dispatchEvent({type:"pinchend",handedness:e.handedness,target:this})):!l.inputState.pinching&&o<=a-c&&(l.inputState.pinching=!0,this.dispatchEvent({type:"pinchstart",handedness:e.handedness,target:this}))}else null!==a&&e.gripSpace&&(r=t.getPose(e.gripSpace,n),null!==r&&(a.matrix.fromArray(r.transform.matrix),a.matrix.decompose(a.position,a.rotation,a.scale),a.matrixWorldNeedsUpdate=!0,r.linearVelocity?(a.hasLinearVelocity=!0,a.linearVelocity.copy(r.linearVelocity)):a.hasLinearVelocity=!1,r.angularVelocity?(a.hasAngularVelocity=!0,a.angularVelocity.copy(r.angularVelocity)):a.hasAngularVelocity=!1));null!==o&&(i=t.getPose(e.targetRaySpace,n),null===i&&null!==r&&(i=r),null!==i&&(o.matrix.fromArray(i.transform.matrix),o.matrix.decompose(o.position,o.rotation,o.scale),o.matrixWorldNeedsUpdate=!0,i.linearVelocity?(o.hasLinearVelocity=!0,o.linearVelocity.copy(i.linearVelocity)):o.hasLinearVelocity=!1,i.angularVelocity?(o.hasAngularVelocity=!0,o.angularVelocity.copy(i.angularVelocity)):o.hasAngularVelocity=!1,this.dispatchEvent(Ua)))}return null!==o&&(o.visible=null!==i),null!==a&&(a.visible=null!==r),null!==l&&(l.visible=null!==s),this}_getHandJoint(e,t){if(void 0===e.joints[t.jointName]){const n=new Pa;n.matrixAutoUpdate=!1,n.visible=!1,e.joints[t.jointName]=n,e.add(n)}return e.joints[t.jointName]}}class Na{constructor(e,t=25e-5){this.isFogExp2=!0,this.name="",this.color=new To(e),this.density=t}clone(){return new Na(this.color,this.density)}toJSON(){return{type:"FogExp2",name:this.name,color:this.color.getHex(),density:this.density}}}class Oa{constructor(e,t=1,n=1e3){this.isFog=!0,this.name="",this.color=new To(e),this.near=t,this.far=n}clone(){return new Oa(this.color,this.near,this.far)}toJSON(){return{type:"Fog",name:this.name,color:this.color.getHex(),near:this.near,far:this.far}}}class Fa extends co{constructor(){super(),this.isScene=!0,this.type="Scene",this.background=null,this.environment=null,this.fog=null,this.backgroundBlurriness=0,this.backgroundIntensity=1,this.backgroundRotation=new Ws,this.environmentIntensity=1,this.environmentRotation=new Ws,this.overrideMaterial=null,"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}copy(e,t){return super.copy(e,t),null!==e.background&&(this.background=e.background.clone()),null!==e.environment&&(this.environment=e.environment.clone()),null!==e.fog&&(this.fog=e.fog.clone()),this.backgroundBlurriness=e.backgroundBlurriness,this.backgroundIntensity=e.backgroundIntensity,this.backgroundRotation.copy(e.backgroundRotation),this.environmentIntensity=e.environmentIntensity,this.environmentRotation.copy(e.environmentRotation),null!==e.overrideMaterial&&(this.overrideMaterial=e.overrideMaterial.clone()),this.matrixAutoUpdate=e.matrixAutoUpdate,this}toJSON(e){const t=super.toJSON(e);return null!==this.fog&&(t.object.fog=this.fog.toJSON()),this.backgroundBlurriness>0&&(t.object.backgroundBlurriness=this.backgroundBlurriness),1!==this.backgroundIntensity&&(t.object.backgroundIntensity=this.backgroundIntensity),t.object.backgroundRotation=this.backgroundRotation.toArray(),1!==this.environmentIntensity&&(t.object.environmentIntensity=this.environmentIntensity),t.object.environmentRotation=this.environmentRotation.toArray(),t}}class Qa{constructor(e,t){this.isInterleavedBuffer=!0,this.array=e,this.stride=t,this.count=void 0!==e?e.length/t:0,this.usage=ir,this.updateRanges=[],this.version=0,this.uuid=xr()}onUploadCallback(){}set needsUpdate(e){!0===e&&this.version++}setUsage(e){return this.usage=e,this}addUpdateRange(e,t){this.updateRanges.push({start:e,count:t})}clearUpdateRanges(){this.updateRanges.length=0}copy(e){return this.array=new e.array.constructor(e.array),this.count=e.count,this.stride=e.stride,this.usage=e.usage,this}copyAt(e,t,n){e*=this.stride,n*=t.stride;for(let i=0,r=this.stride;i<r;i++)this.array[e+i]=t.array[n+i];return this}set(e,t=0){return this.array.set(e,t),this}clone(e){void 0===e.arrayBuffers&&(e.arrayBuffers={}),void 0===this.array.buffer._uuid&&(this.array.buffer._uuid=xr()),void 0===e.arrayBuffers[this.array.buffer._uuid]&&(e.arrayBuffers[this.array.buffer._uuid]=this.array.slice(0).buffer);const t=new this.array.constructor(e.arrayBuffers[this.array.buffer._uuid]),n=new this.constructor(t,this.stride);return n.setUsage(this.usage),n}onUpload(e){return this.onUploadCallback=e,this}toJSON(e){return void 0===e.arrayBuffers&&(e.arrayBuffers={}),void 0===this.array.buffer._uuid&&(this.array.buffer._uuid=xr()),void 0===e.arrayBuffers[this.array.buffer._uuid]&&(e.arrayBuffers[this.array.buffer._uuid]=Array.from(new Uint32Array(this.array.buffer))),{uuid:this.uuid,buffer:this.array.buffer._uuid,type:this.array.constructor.name,stride:this.stride}}}const za=new os;class Ga{constructor(e,t,n,i=!1){this.isInterleavedBufferAttribute=!0,this.name="",this.data=e,this.itemSize=t,this.offset=n,this.normalized=i}get count(){return this.data.count}get array(){return this.data.array}set needsUpdate(e){this.data.needsUpdate=e}applyMatrix4(e){for(let t=0,n=this.data.count;t<n;t++)za.fromBufferAttribute(this,t),za.applyMatrix4(e),this.setXYZ(t,za.x,za.y,za.z);return this}applyNormalMatrix(e){for(let t=0,n=this.count;t<n;t++)za.fromBufferAttribute(this,t),za.applyNormalMatrix(e),this.setXYZ(t,za.x,za.y,za.z);return this}transformDirection(e){for(let t=0,n=this.count;t<n;t++)za.fromBufferAttribute(this,t),za.transformDirection(e),this.setXYZ(t,za.x,za.y,za.z);return this}getComponent(e,t){let n=this.array[e*this.data.stride+this.offset+t];return this.normalized&&(n=Mr(n,this.array)),n}setComponent(e,t,n){return this.normalized&&(n=Ir(n,this.array)),this.data.array[e*this.data.stride+this.offset+t]=n,this}setX(e,t){return this.normalized&&(t=Ir(t,this.array)),this.data.array[e*this.data.stride+this.offset]=t,this}setY(e,t){return this.normalized&&(t=Ir(t,this.array)),this.data.array[e*this.data.stride+this.offset+1]=t,this}setZ(e,t){return this.normalized&&(t=Ir(t,this.array)),this.data.array[e*this.data.stride+this.offset+2]=t,this}setW(e,t){return this.normalized&&(t=Ir(t,this.array)),this.data.array[e*this.data.stride+this.offset+3]=t,this}getX(e){let t=this.data.array[e*this.data.stride+this.offset];return this.normalized&&(t=Mr(t,this.array)),t}getY(e){let t=this.data.array[e*this.data.stride+this.offset+1];return this.normalized&&(t=Mr(t,this.array)),t}getZ(e){let t=this.data.array[e*this.data.stride+this.offset+2];return this.normalized&&(t=Mr(t,this.array)),t}getW(e){let t=this.data.array[e*this.data.stride+this.offset+3];return this.normalized&&(t=Mr(t,this.array)),t}setXY(e,t,n){return e=e*this.data.stride+this.offset,this.normalized&&(t=Ir(t,this.array),n=Ir(n,this.array)),this.data.array[e+0]=t,this.data.array[e+1]=n,this}setXYZ(e,t,n,i){return e=e*this.data.stride+this.offset,this.normalized&&(t=Ir(t,this.array),n=Ir(n,this.array),i=Ir(i,this.array)),this.data.array[e+0]=t,this.data.array[e+1]=n,this.data.array[e+2]=i,this}setXYZW(e,t,n,i,r){return e=e*this.data.stride+this.offset,this.normalized&&(t=Ir(t,this.array),n=Ir(n,this.array),i=Ir(i,this.array),r=Ir(r,this.array)),this.data.array[e+0]=t,this.data.array[e+1]=n,this.data.array[e+2]=i,this.data.array[e+3]=r,this}clone(e){if(void 0===e){console.log("THREE.InterleavedBufferAttribute.clone(): Cloning an interleaved buffer attribute will de-interleave buffer data.");const e=[];for(let t=0;t<this.count;t++){const n=t*this.data.stride+this.offset;for(let t=0;t<this.itemSize;t++)e.push(this.data.array[n+t])}return new Go(new this.array.constructor(e),this.itemSize,this.normalized)}return void 0===e.interleavedBuffers&&(e.interleavedBuffers={}),void 0===e.interleavedBuffers[this.data.uuid]&&(e.interleavedBuffers[this.data.uuid]=this.data.clone(e)),new Ga(e.interleavedBuffers[this.data.uuid],this.itemSize,this.offset,this.normalized)}toJSON(e){if(void 0===e){console.log("THREE.InterleavedBufferAttribute.toJSON(): Serializing an interleaved buffer attribute will de-interleave buffer data.");const e=[];for(let t=0;t<this.count;t++){const n=t*this.data.stride+this.offset;for(let t=0;t<this.itemSize;t++)e.push(this.data.array[n+t])}return{itemSize:this.itemSize,type:this.array.constructor.name,array:e,normalized:this.normalized}}return void 0===e.interleavedBuffers&&(e.interleavedBuffers={}),void 0===e.interleavedBuffers[this.data.uuid]&&(e.interleavedBuffers[this.data.uuid]=this.data.toJSON(e)),{isInterleavedBufferAttribute:!0,itemSize:this.itemSize,data:this.data.uuid,offset:this.offset,normalized:this.normalized}}}class Ha extends Lo{constructor(e){super(),this.isSpriteMaterial=!0,this.type="SpriteMaterial",this.color=new To(16777215),this.map=null,this.alphaMap=null,this.rotation=0,this.sizeAttenuation=!0,this.transparent=!0,this.fog=!0,this.setValues(e)}copy(e){return super.copy(e),this.color.copy(e.color),this.map=e.map,this.alphaMap=e.alphaMap,this.rotation=e.rotation,this.sizeAttenuation=e.sizeAttenuation,this.fog=e.fog,this}}let Va;const ja=new os,Wa=new os,qa=new os,Xa=new Tr,Ya=new Tr,Ja=new ks,Ka=new os,Za=new os,$a=new os,el=new Tr,tl=new Tr,nl=new Tr;class il extends co{constructor(e=new Ha){if(super(),this.isSprite=!0,this.type="Sprite",void 0===Va){Va=new sa;const e=new Float32Array([-.5,-.5,0,0,0,.5,-.5,0,1,0,.5,.5,0,1,1,-.5,.5,0,0,1]),t=new Qa(e,5);Va.setIndex([0,1,2,0,2,3]),Va.setAttribute("position",new Ga(t,3,0,!1)),Va.setAttribute("uv",new Ga(t,2,3,!1))}this.geometry=Va,this.material=e,this.center=new Tr(.5,.5)}raycast(e,t){null===e.camera&&console.error('THREE.Sprite: "Raycaster.camera" needs to be set in order to raycast against sprites.'),Wa.setFromMatrixScale(this.matrixWorld),Ja.copy(e.camera.matrixWorld),this.modelViewMatrix.multiplyMatrices(e.camera.matrixWorldInverse,this.matrixWorld),qa.setFromMatrixPosition(this.modelViewMatrix),e.camera.isPerspectiveCamera&&!1===this.material.sizeAttenuation&&Wa.multiplyScalar(-qa.z);const n=this.material.rotation;let i,r;0!==n&&(r=Math.cos(n),i=Math.sin(n));const s=this.center;rl(Ka.set(-.5,-.5,0),qa,s,Wa,i,r),rl(Za.set(.5,-.5,0),qa,s,Wa,i,r),rl($a.set(.5,.5,0),qa,s,Wa,i,r),el.set(0,0),tl.set(1,0),nl.set(1,1);let o=e.ray.intersectTriangle(Ka,Za,$a,!1,ja);if(null===o&&(rl(Za.set(-.5,.5,0),qa,s,Wa,i,r),tl.set(0,1),o=e.ray.intersectTriangle(Ka,$a,Za,!1,ja),null===o))return;const a=e.ray.origin.distanceTo(ja);a<e.near||a>e.far||t.push({distance:a,point:ja.clone(),uv:wo.getInterpolation(ja,Ka,Za,$a,el,tl,nl,new Tr),face:null,object:this})}copy(e,t){return super.copy(e,t),void 0!==e.center&&this.center.copy(e.center),this.material=e.material,this}}function rl(e,t,n,i,r,s){Xa.subVectors(e,n).addScalar(.5).multiply(i),void 0!==r?(Ya.x=s*Xa.x-r*Xa.y,Ya.y=r*Xa.x+s*Xa.y):Ya.copy(Xa),e.copy(t),e.x+=Ya.x,e.y+=Ya.y,e.applyMatrix4(Ja)}const sl=new os,ol=new os;class al extends co{constructor(){super(),this._currentLevel=0,this.type="LOD",Object.defineProperties(this,{levels:{enumerable:!0,value:[]},isLOD:{value:!0}}),this.autoUpdate=!0}copy(e){super.copy(e,!1);const t=e.levels;for(let e=0,n=t.length;e<n;e++){const n=t[e];this.addLevel(n.object.clone(),n.distance,n.hysteresis)}return this.autoUpdate=e.autoUpdate,this}addLevel(e,t=0,n=0){t=Math.abs(t);const i=this.levels;let r;for(r=0;r<i.length&&!(t<i[r].distance);r++);return i.splice(r,0,{distance:t,hysteresis:n,object:e}),this.add(e),this}removeLevel(e){const t=this.levels;for(let n=0;n<t.length;n++)if(t[n].distance===e){const e=t.splice(n,1);return this.remove(e[0].object),!0}return!1}getCurrentLevel(){return this._currentLevel}getObjectForDistance(e){const t=this.levels;if(t.length>0){let n,i;for(n=1,i=t.length;n<i;n++){let i=t[n].distance;if(t[n].object.visible&&(i-=i*t[n].hysteresis),e<i)break}return t[n-1].object}return null}raycast(e,t){if(this.levels.length>0){sl.setFromMatrixPosition(this.matrixWorld);const n=e.ray.origin.distanceTo(sl);this.getObjectForDistance(n).raycast(e,t)}}update(e){const t=this.levels;if(t.length>1){sl.setFromMatrixPosition(e.matrixWorld),ol.setFromMatrixPosition(this.matrixWorld);const n=sl.distanceTo(ol)/e.zoom;let i,r;for(t[0].object.visible=!0,i=1,r=t.length;i<r;i++){let e=t[i].distance;if(t[i].object.visible&&(e-=e*t[i].hysteresis),!(n>=e))break;t[i-1].object.visible=!1,t[i].object.visible=!0}for(this._currentLevel=i-1;i<r;i++)t[i].object.visible=!1}}toJSON(e){const t=super.toJSON(e);!1===this.autoUpdate&&(t.object.autoUpdate=!1),t.object.levels=[];const n=this.levels;for(let e=0,i=n.length;e<i;e++){const i=n[e];t.object.levels.push({object:i.object.uuid,distance:i.distance,hysteresis:i.hysteresis})}return t}}const ll=new os,cl=new Zr,hl=new Zr,ul=new os,dl=new ks,pl=new os,fl=new Is,ml=new ks,Al=new Us;class gl extends ga{constructor(e,t){super(e,t),this.isSkinnedMesh=!0,this.type="SkinnedMesh",this.bindMode=Nt,this.bindMatrix=new ks,this.bindMatrixInverse=new ks,this.boundingBox=null,this.boundingSphere=null}computeBoundingBox(){const e=this.geometry;null===this.boundingBox&&(this.boundingBox=new cs),this.boundingBox.makeEmpty();const t=e.getAttribute("position");for(let e=0;e<t.count;e++)this.getVertexPosition(e,pl),this.boundingBox.expandByPoint(pl)}computeBoundingSphere(){const e=this.geometry;null===this.boundingSphere&&(this.boundingSphere=new Is),this.boundingSphere.makeEmpty();const t=e.getAttribute("position");for(let e=0;e<t.count;e++)this.getVertexPosition(e,pl),this.boundingSphere.expandByPoint(pl)}copy(e,t){return super.copy(e,t),this.bindMode=e.bindMode,this.bindMatrix.copy(e.bindMatrix),this.bindMatrixInverse.copy(e.bindMatrixInverse),this.skeleton=e.skeleton,null!==e.boundingBox&&(this.boundingBox=e.boundingBox.clone()),null!==e.boundingSphere&&(this.boundingSphere=e.boundingSphere.clone()),this}raycast(e,t){const n=this.material,i=this.matrixWorld;void 0!==n&&(null===this.boundingSphere&&this.computeBoundingSphere(),fl.copy(this.boundingSphere),fl.applyMatrix4(i),!1!==e.ray.intersectsSphere(fl)&&(ml.copy(i).invert(),Al.copy(e.ray).applyMatrix4(ml),null!==this.boundingBox&&!1===Al.intersectsBox(this.boundingBox)||this._computeIntersections(e,t,Al)))}getVertexPosition(e,t){return super.getVertexPosition(e,t),this.applyBoneTransform(e,t),t}bind(e,t){this.skeleton=e,void 0===t&&(this.updateMatrixWorld(!0),this.skeleton.calculateInverses(),t=this.matrixWorld),this.bindMatrix.copy(t),this.bindMatrixInverse.copy(t).invert()}pose(){this.skeleton.pose()}normalizeSkinWeights(){const e=new Zr,t=this.geometry.attributes.skinWeight;for(let n=0,i=t.count;n<i;n++){e.fromBufferAttribute(t,n);const i=1/e.manhattanLength();i!==1/0?e.multiplyScalar(i):e.set(1,0,0,0),t.setXYZW(n,e.x,e.y,e.z,e.w)}}updateMatrixWorld(e){super.updateMatrixWorld(e),this.bindMode===Nt?this.bindMatrixInverse.copy(this.matrixWorld).invert():this.bindMode===Ot?this.bindMatrixInverse.copy(this.bindMatrix).invert():console.warn("THREE.SkinnedMesh: Unrecognized bindMode: "+this.bindMode)}applyBoneTransform(e,t){const n=this.skeleton,i=this.geometry;cl.fromBufferAttribute(i.attributes.skinIndex,e),hl.fromBufferAttribute(i.attributes.skinWeight,e),ll.copy(t).applyMatrix4(this.bindMatrix),t.set(0,0,0);for(let e=0;e<4;e++){const i=hl.getComponent(e);if(0!==i){const r=cl.getComponent(e);dl.multiplyMatrices(n.bones[r].matrixWorld,n.boneInverses[r]),t.addScaledVector(ul.copy(ll).applyMatrix4(dl),i)}}return t.applyMatrix4(this.bindMatrixInverse)}}class vl extends co{constructor(){super(),this.isBone=!0,this.type="Bone"}}class yl extends Kr{constructor(e=null,t=1,n=1,i,r,s,o,a,l=Xt,c=Xt,h,u){super(null,s,o,a,l,c,i,r,h,u),this.isDataTexture=!0,this.image={data:e,width:t,height:n},this.generateMipmaps=!1,this.flipY=!1,this.unpackAlignment=1}}const El=new ks,bl=new ks;class xl{constructor(e=[],t=[]){this.uuid=xr(),this.bones=e.slice(0),this.boneInverses=t,this.boneMatrices=null,this.boneTexture=null,this.init()}init(){const e=this.bones,t=this.boneInverses;if(this.boneMatrices=new Float32Array(16*e.length),0===t.length)this.calculateInverses();else if(e.length!==t.length){console.warn("THREE.Skeleton: Number of inverse bone matrices does not match amount of bones."),this.boneInverses=[];for(let e=0,t=this.bones.length;e<t;e++)this.boneInverses.push(new ks)}}calculateInverses(){this.boneInverses.length=0;for(let e=0,t=this.bones.length;e<t;e++){const t=new ks;this.bones[e]&&t.copy(this.bones[e].matrixWorld).invert(),this.boneInverses.push(t)}}pose(){for(let e=0,t=this.bones.length;e<t;e++){const t=this.bones[e];t&&t.matrixWorld.copy(this.boneInverses[e]).invert()}for(let e=0,t=this.bones.length;e<t;e++){const t=this.bones[e];t&&(t.parent&&t.parent.isBone?(t.matrix.copy(t.parent.matrixWorld).invert(),t.matrix.multiply(t.matrixWorld)):t.matrix.copy(t.matrixWorld),t.matrix.decompose(t.position,t.quaternion,t.scale))}}update(){const e=this.bones,t=this.boneInverses,n=this.boneMatrices,i=this.boneTexture;for(let i=0,r=e.length;i<r;i++){const r=e[i]?e[i].matrixWorld:bl;El.multiplyMatrices(r,t[i]),El.toArray(n,16*i)}null!==i&&(i.needsUpdate=!0)}clone(){return new xl(this.bones,this.boneInverses)}computeBoneTexture(){let e=Math.sqrt(4*this.bones.length);e=4*Math.ceil(e/4),e=Math.max(e,4);const t=new Float32Array(e*e*4);t.set(this.boneMatrices);const n=new yl(t,e,e,yn,un);return n.needsUpdate=!0,this.boneMatrices=t,this.boneTexture=n,this}getBoneByName(e){for(let t=0,n=this.bones.length;t<n;t++){const n=this.bones[t];if(n.name===e)return n}}dispose(){null!==this.boneTexture&&(this.boneTexture.dispose(),this.boneTexture=null)}fromJSON(e,t){this.uuid=e.uuid;for(let n=0,i=e.bones.length;n<i;n++){const i=e.bones[n];let r=t[i];void 0===r&&(console.warn("THREE.Skeleton: No bone found with UUID:",i),r=new vl),this.bones.push(r),this.boneInverses.push((new ks).fromArray(e.boneInverses[n]))}return this.init(),this}toJSON(){const e={metadata:{version:4.6,type:"Skeleton",generator:"Skeleton.toJSON"},bones:[],boneInverses:[]};e.uuid=this.uuid;const t=this.bones,n=this.boneInverses;for(let i=0,r=t.length;i<r;i++){const r=t[i];e.bones.push(r.uuid);const s=n[i];e.boneInverses.push(s.toArray())}return e}}class Cl extends Go{constructor(e,t,n,i=1){super(e,t,n),this.isInstancedBufferAttribute=!0,this.meshPerAttribute=i}copy(e){return super.copy(e),this.meshPerAttribute=e.meshPerAttribute,this}toJSON(){const e=super.toJSON();return e.meshPerAttribute=this.meshPerAttribute,e.isInstancedBufferAttribute=!0,e}}const wl=new ks,_l=new ks,Ml=[],Il=new cs,Sl=new ks,Tl=new ga,Bl=new Is;class Rl extends ga{constructor(e,t,n){super(e,t),this.isInstancedMesh=!0,this.instanceMatrix=new Cl(new Float32Array(16*n),16),this.instanceColor=null,this.morphTexture=null,this.count=n,this.boundingBox=null,this.boundingSphere=null;for(let e=0;e<n;e++)this.setMatrixAt(e,Sl)}computeBoundingBox(){const e=this.geometry,t=this.count;null===this.boundingBox&&(this.boundingBox=new cs),null===e.boundingBox&&e.computeBoundingBox(),this.boundingBox.makeEmpty();for(let n=0;n<t;n++)this.getMatrixAt(n,wl),Il.copy(e.boundingBox).applyMatrix4(wl),this.boundingBox.union(Il)}computeBoundingSphere(){const e=this.geometry,t=this.count;null===this.boundingSphere&&(this.boundingSphere=new Is),null===e.boundingSphere&&e.computeBoundingSphere(),this.boundingSphere.makeEmpty();for(let n=0;n<t;n++)this.getMatrixAt(n,wl),Bl.copy(e.boundingSphere).applyMatrix4(wl),this.boundingSphere.union(Bl)}copy(e,t){return super.copy(e,t),this.instanceMatrix.copy(e.instanceMatrix),null!==e.morphTexture&&(this.morphTexture=e.morphTexture.clone()),null!==e.instanceColor&&(this.instanceColor=e.instanceColor.clone()),this.count=e.count,null!==e.boundingBox&&(this.boundingBox=e.boundingBox.clone()),null!==e.boundingSphere&&(this.boundingSphere=e.boundingSphere.clone()),this}getColorAt(e,t){t.fromArray(this.instanceColor.array,3*e)}getMatrixAt(e,t){t.fromArray(this.instanceMatrix.array,16*e)}getMorphAt(e,t){const n=t.morphTargetInfluences,i=this.morphTexture.source.data.data,r=e*(n.length+1)+1;for(let e=0;e<n.length;e++)n[e]=i[r+e]}raycast(e,t){const n=this.matrixWorld,i=this.count;if(Tl.geometry=this.geometry,Tl.material=this.material,void 0!==Tl.material&&(null===this.boundingSphere&&this.computeBoundingSphere(),Bl.copy(this.boundingSphere),Bl.applyMatrix4(n),!1!==e.ray.intersectsSphere(Bl)))for(let r=0;r<i;r++){this.getMatrixAt(r,wl),_l.multiplyMatrices(n,wl),Tl.matrixWorld=_l,Tl.raycast(e,Ml);for(let e=0,n=Ml.length;e<n;e++){const n=Ml[e];n.instanceId=r,n.object=this,t.push(n)}Ml.length=0}}setColorAt(e,t){null===this.instanceColor&&(this.instanceColor=new Cl(new Float32Array(3*this.instanceMatrix.count).fill(1),3)),t.toArray(this.instanceColor.array,3*e)}setMatrixAt(e,t){t.toArray(this.instanceMatrix.array,16*e)}setMorphAt(e,t){const n=t.morphTargetInfluences,i=n.length+1;null===this.morphTexture&&(this.morphTexture=new yl(new Float32Array(i*this.count),i,this.count,wn,un));const r=this.morphTexture.source.data.data;let s=0;for(let e=0;e<n.length;e++)s+=n[e];const o=this.geometry.morphTargetsRelative?1:1-s,a=i*e;r[a]=o,r.set(n,a+1)}updateMorphTargets(){}dispose(){return this.dispatchEvent({type:"dispose"}),null!==this.morphTexture&&(this.morphTexture.dispose(),this.morphTexture=null),this}}const Ll=new os,Dl=new os,Pl=new Br;class Ul{constructor(e=new os(1,0,0),t=0){this.isPlane=!0,this.normal=e,this.constant=t}set(e,t){return this.normal.copy(e),this.constant=t,this}setComponents(e,t,n,i){return this.normal.set(e,t,n),this.constant=i,this}setFromNormalAndCoplanarPoint(e,t){return this.normal.copy(e),this.constant=-t.dot(this.normal),this}setFromCoplanarPoints(e,t,n){const i=Ll.subVectors(n,t).cross(Dl.subVectors(e,t)).normalize();return this.setFromNormalAndCoplanarPoint(i,e),this}copy(e){return this.normal.copy(e.normal),this.constant=e.constant,this}normalize(){const e=1/this.normal.length();return this.normal.multiplyScalar(e),this.constant*=e,this}negate(){return this.constant*=-1,this.normal.negate(),this}distanceToPoint(e){return this.normal.dot(e)+this.constant}distanceToSphere(e){return this.distanceToPoint(e.center)-e.radius}projectPoint(e,t){return t.copy(e).addScaledVector(this.normal,-this.distanceToPoint(e))}intersectLine(e,t){const n=e.delta(Ll),i=this.normal.dot(n);if(0===i)return 0===this.distanceToPoint(e.start)?t.copy(e.start):null;const r=-(e.start.dot(this.normal)+this.constant)/i;return r<0||r>1?null:t.copy(e.start).addScaledVector(n,r)}intersectsLine(e){const t=this.distanceToPoint(e.start),n=this.distanceToPoint(e.end);return t<0&&n>0||n<0&&t>0}intersectsBox(e){return e.intersectsPlane(this)}intersectsSphere(e){return e.intersectsPlane(this)}coplanarPoint(e){return e.copy(this.normal).multiplyScalar(-this.constant)}applyMatrix4(e,t){const n=t||Pl.getNormalMatrix(e),i=this.coplanarPoint(Ll).applyMatrix4(e),r=this.normal.applyMatrix3(n).normalize();return this.constant=-i.dot(r),this}translate(e){return this.constant-=e.dot(this.normal),this}equals(e){return e.normal.equals(this.normal)&&e.constant===this.constant}clone(){return(new this.constructor).copy(this)}}const kl=new Is,Nl=new os;class Ol{constructor(e=new Ul,t=new Ul,n=new Ul,i=new Ul,r=new Ul,s=new Ul){this.planes=[e,t,n,i,r,s]}set(e,t,n,i,r,s){const o=this.planes;return o[0].copy(e),o[1].copy(t),o[2].copy(n),o[3].copy(i),o[4].copy(r),o[5].copy(s),this}copy(e){const t=this.planes;for(let n=0;n<6;n++)t[n].copy(e.planes[n]);return this}setFromProjectionMatrix(e,t=fr){const n=this.planes,i=e.elements,r=i[0],s=i[1],o=i[2],a=i[3],l=i[4],c=i[5],h=i[6],u=i[7],d=i[8],p=i[9],f=i[10],m=i[11],A=i[12],g=i[13],v=i[14],y=i[15];if(n[0].setComponents(a-r,u-l,m-d,y-A).normalize(),n[1].setComponents(a+r,u+l,m+d,y+A).normalize(),n[2].setComponents(a+s,u+c,m+p,y+g).normalize(),n[3].setComponents(a-s,u-c,m-p,y-g).normalize(),n[4].setComponents(a-o,u-h,m-f,y-v).normalize(),t===fr)n[5].setComponents(a+o,u+h,m+f,y+v).normalize();else{if(t!==mr)throw new Error("THREE.Frustum.setFromProjectionMatrix(): Invalid coordinate system: "+t);n[5].setComponents(o,h,f,v).normalize()}return this}intersectsObject(e){if(void 0!==e.boundingSphere)null===e.boundingSphere&&e.computeBoundingSphere(),kl.copy(e.boundingSphere).applyMatrix4(e.matrixWorld);else{const t=e.geometry;null===t.boundingSphere&&t.computeBoundingSphere(),kl.copy(t.boundingSphere).applyMatrix4(e.matrixWorld)}return this.intersectsSphere(kl)}intersectsSprite(e){return kl.center.set(0,0,0),kl.radius=.7071067811865476,kl.applyMatrix4(e.matrixWorld),this.intersectsSphere(kl)}intersectsSphere(e){const t=this.planes,n=e.center,i=-e.radius;for(let e=0;e<6;e++)if(t[e].distanceToPoint(n)<i)return!1;return!0}intersectsBox(e){const t=this.planes;for(let n=0;n<6;n++){const i=t[n];if(Nl.x=i.normal.x>0?e.max.x:e.min.x,Nl.y=i.normal.y>0?e.max.y:e.min.y,Nl.z=i.normal.z>0?e.max.z:e.min.z,i.distanceToPoint(Nl)<0)return!1}return!0}containsPoint(e){const t=this.planes;for(let n=0;n<6;n++)if(t[n].distanceToPoint(e)<0)return!1;return!0}clone(){return(new this.constructor).copy(this)}}function Fl(e,t){return e-t}function Ql(e,t){return e.z-t.z}function zl(e,t){return t.z-e.z}class Gl{constructor(){this.index=0,this.pool=[],this.list=[]}push(e,t,n,i){const r=this.pool,s=this.list;this.index>=r.length&&r.push({start:-1,count:-1,z:-1,index:-1});const o=r[this.index];s.push(o),this.index++,o.start=e,o.count=t,o.z=n,o.index=i}reset(){this.list.length=0,this.index=0}}const Hl=new ks,Vl=new To(1,1,1),jl=new Ol,Wl=new cs,ql=new Is,Xl=new os,Yl=new os,Jl=new os,Kl=new Gl,Zl=new ga,$l=[];function ec(e,t,n=0){const i=t.itemSize;if(e.isInterleavedBufferAttribute||e.array.constructor!==t.array.constructor){const r=e.count;for(let s=0;s<r;s++)for(let r=0;r<i;r++)t.setComponent(s+n,r,e.getComponent(s,r))}else t.array.set(e.array,n*i);t.needsUpdate=!0}function tc(e,t){if(e.constructor!==t.constructor){const n=Math.min(e.length,t.length);for(let i=0;i<n;i++)t[i]=e[i]}else{const n=Math.min(e.length,t.length);t.set(new e.constructor(e.buffer,0,n))}}class nc extends ga{get maxInstanceCount(){return this._maxInstanceCount}get instanceCount(){return this._instanceInfo.length-this._availableInstanceIds.length}get unusedVertexCount(){return this._maxVertexCount-this._nextVertexStart}get unusedIndexCount(){return this._maxIndexCount-this._nextIndexStart}constructor(e,t,n=2*t,i){super(new sa,i),this.isBatchedMesh=!0,this.perObjectFrustumCulled=!0,this.sortObjects=!0,this.boundingBox=null,this.boundingSphere=null,this.customSort=null,this._instanceInfo=[],this._geometryInfo=[],this._availableInstanceIds=[],this._availableGeometryIds=[],this._nextIndexStart=0,this._nextVertexStart=0,this._geometryCount=0,this._visibilityChanged=!0,this._geometryInitialized=!1,this._maxInstanceCount=e,this._maxVertexCount=t,this._maxIndexCount=n,this._multiDrawCounts=new Int32Array(e),this._multiDrawStarts=new Int32Array(e),this._multiDrawCount=0,this._multiDrawInstances=null,this._matricesTexture=null,this._indirectTexture=null,this._colorsTexture=null,this._initMatricesTexture(),this._initIndirectTexture()}_initMatricesTexture(){let e=Math.sqrt(4*this._maxInstanceCount);e=4*Math.ceil(e/4),e=Math.max(e,4);const t=new Float32Array(e*e*4),n=new yl(t,e,e,yn,un);this._matricesTexture=n}_initIndirectTexture(){let e=Math.sqrt(this._maxInstanceCount);e=Math.ceil(e);const t=new Uint32Array(e*e),n=new yl(t,e,e,_n,hn);this._indirectTexture=n}_initColorsTexture(){let e=Math.sqrt(this._maxInstanceCount);e=Math.ceil(e);const t=new Float32Array(e*e*4).fill(1),n=new yl(t,e,e,yn,un);n.colorSpace=Gr.workingColorSpace,this._colorsTexture=n}_initializeGeometry(e){const t=this.geometry,n=this._maxVertexCount,i=this._maxIndexCount;if(!1===this._geometryInitialized){for(const i in e.attributes){const r=e.getAttribute(i),{array:s,itemSize:o,normalized:a}=r,l=new s.constructor(n*o),c=new Go(l,o,a);t.setAttribute(i,c)}if(null!==e.getIndex()){const e=n>65535?new Uint32Array(i):new Uint16Array(i);t.setIndex(new Go(e,1))}this._geometryInitialized=!0}}_validateGeometry(e){const t=this.geometry;if(Boolean(e.getIndex())!==Boolean(t.getIndex()))throw new Error('THREE.BatchedMesh: All geometries must consistently have "index".');for(const n in t.attributes){if(!e.hasAttribute(n))throw new Error(`THREE.BatchedMesh: Added geometry missing "${n}". All geometries must have consistent attributes.`);const i=e.getAttribute(n),r=t.getAttribute(n);if(i.itemSize!==r.itemSize||i.normalized!==r.normalized)throw new Error("THREE.BatchedMesh: All attributes must have a consistent itemSize and normalized value.")}}validateInstanceId(e){const t=this._instanceInfo;if(e<0||e>=t.length||!1===t[e].active)throw new Error(`THREE.BatchedMesh: Invalid instanceId ${e}. Instance is either out of range or has been deleted.`)}validateGeometryId(e){const t=this._geometryInfo;if(e<0||e>=t.length||!1===t[e].active)throw new Error(`THREE.BatchedMesh: Invalid geometryId ${e}. Geometry is either out of range or has been deleted.`)}setCustomSort(e){return this.customSort=e,this}computeBoundingBox(){null===this.boundingBox&&(this.boundingBox=new cs);const e=this.boundingBox,t=this._instanceInfo;e.makeEmpty();for(let n=0,i=t.length;n<i;n++){if(!1===t[n].active)continue;const i=t[n].geometryIndex;this.getMatrixAt(n,Hl),this.getBoundingBoxAt(i,Wl).applyMatrix4(Hl),e.union(Wl)}}computeBoundingSphere(){null===this.boundingSphere&&(this.boundingSphere=new Is);const e=this.boundingSphere,t=this._instanceInfo;e.makeEmpty();for(let n=0,i=t.length;n<i;n++){if(!1===t[n].active)continue;const i=t[n].geometryIndex;this.getMatrixAt(n,Hl),this.getBoundingSphereAt(i,ql).applyMatrix4(Hl),e.union(ql)}}addInstance(e){if(this._instanceInfo.length>=this.maxInstanceCount&&0===this._availableInstanceIds.length)throw new Error("THREE.BatchedMesh: Maximum item count reached.");const t={visible:!0,active:!0,geometryIndex:e};let n=null;this._availableInstanceIds.length>0?(this._availableInstanceIds.sort(Fl),n=this._availableInstanceIds.shift(),this._instanceInfo[n]=t):(n=this._instanceInfo.length,this._instanceInfo.push(t));const i=this._matricesTexture;Hl.identity().toArray(i.image.data,16*n),i.needsUpdate=!0;const r=this._colorsTexture;return r&&(Vl.toArray(r.image.data,4*n),r.needsUpdate=!0),this._visibilityChanged=!0,n}addGeometry(e,t=-1,n=-1){this._initializeGeometry(e),this._validateGeometry(e);const i={vertexStart:-1,vertexCount:-1,reservedVertexCount:-1,indexStart:-1,indexCount:-1,reservedIndexCount:-1,start:-1,count:-1,boundingBox:null,boundingSphere:null,active:!0},r=this._geometryInfo;i.vertexStart=this._nextVertexStart,i.reservedVertexCount=-1===t?e.getAttribute("position").count:t;const s=e.getIndex();if(null!==s&&(i.indexStart=this._nextIndexStart,i.reservedIndexCount=-1===n?s.count:n),-1!==i.indexStart&&i.indexStart+i.reservedIndexCount>this._maxIndexCount||i.vertexStart+i.reservedVertexCount>this._maxVertexCount)throw new Error("THREE.BatchedMesh: Reserved space request exceeds the maximum buffer size.");let o;return this._availableGeometryIds.length>0?(this._availableGeometryIds.sort(Fl),o=this._availableGeometryIds.shift(),r[o]=i):(o=this._geometryCount,this._geometryCount++,r.push(i)),this.setGeometryAt(o,e),this._nextIndexStart=i.indexStart+i.reservedIndexCount,this._nextVertexStart=i.vertexStart+i.reservedVertexCount,o}setGeometryAt(e,t){if(e>=this._geometryCount)throw new Error("THREE.BatchedMesh: Maximum geometry count reached.");this._validateGeometry(t);const n=this.geometry,i=null!==n.getIndex(),r=n.getIndex(),s=t.getIndex(),o=this._geometryInfo[e];if(i&&s.count>o.reservedIndexCount||t.attributes.position.count>o.reservedVertexCount)throw new Error("THREE.BatchedMesh: Reserved space not large enough for provided geometry.");const a=o.vertexStart,l=o.reservedVertexCount;o.vertexCount=t.getAttribute("position").count;for(const e in n.attributes){const i=t.getAttribute(e),r=n.getAttribute(e);ec(i,r,a);const s=i.itemSize;for(let e=i.count,t=l;e<t;e++){const t=a+e;for(let e=0;e<s;e++)r.setComponent(t,e,0)}r.needsUpdate=!0,r.addUpdateRange(a*s,l*s)}if(i){const e=o.indexStart,n=o.reservedIndexCount;o.indexCount=t.getIndex().count;for(let t=0;t<s.count;t++)r.setX(e+t,a+s.getX(t));for(let t=s.count,i=n;t<i;t++)r.setX(e+t,a);r.needsUpdate=!0,r.addUpdateRange(e,o.reservedIndexCount)}return o.start=i?o.indexStart:o.vertexStart,o.count=i?o.indexCount:o.vertexCount,o.boundingBox=null,null!==t.boundingBox&&(o.boundingBox=t.boundingBox.clone()),o.boundingSphere=null,null!==t.boundingSphere&&(o.boundingSphere=t.boundingSphere.clone()),this._visibilityChanged=!0,e}deleteGeometry(e){const t=this._geometryInfo;if(e>=t.length||!1===t[e].active)return this;const n=this._instanceInfo;for(let t=0,i=n.length;t<i;t++)n[t].active&&n[t].geometryIndex===e&&this.deleteInstance(t);return t[e].active=!1,this._availableGeometryIds.push(e),this._visibilityChanged=!0,this}deleteInstance(e){return this.validateInstanceId(e),this._instanceInfo[e].active=!1,this._availableInstanceIds.push(e),this._visibilityChanged=!0,this}optimize(){let e=0,t=0;const n=this._geometryInfo,i=n.map(((e,t)=>t)).sort(((e,t)=>n[e].vertexStart-n[t].vertexStart)),r=this.geometry;for(let s=0,o=n.length;s<o;s++){const o=i[s],a=n[o];if(!1!==a.active){if(null!==r.index){if(a.indexStart!==t){const{indexStart:n,vertexStart:i,reservedIndexCount:s}=a,o=r.index,l=o.array,c=e-i;for(let e=n;e<n+s;e++)l[e]=l[e]+c;o.array.copyWithin(t,n,n+s),o.addUpdateRange(t,s),a.indexStart=t}t+=a.reservedIndexCount}if(a.vertexStart!==e){const{vertexStart:t,reservedVertexCount:n}=a,i=r.attributes;for(const r in i){const s=i[r],{array:o,itemSize:a}=s;o.copyWithin(e*a,t*a,(t+n)*a),s.addUpdateRange(e*a,n*a)}a.vertexStart=e}e+=a.reservedVertexCount,a.start=r.index?a.indexStart:a.vertexStart,this._nextIndexStart=r.index?a.indexStart+a.reservedIndexCount:0,this._nextVertexStart=a.vertexStart+a.reservedVertexCount}}return this}getBoundingBoxAt(e,t){if(e>=this._geometryCount)return null;const n=this.geometry,i=this._geometryInfo[e];if(null===i.boundingBox){const e=new cs,t=n.index,r=n.attributes.position;for(let n=i.start,s=i.start+i.count;n<s;n++){let i=n;t&&(i=t.getX(i)),e.expandByPoint(Xl.fromBufferAttribute(r,i))}i.boundingBox=e}return t.copy(i.boundingBox),t}getBoundingSphereAt(e,t){if(e>=this._geometryCount)return null;const n=this.geometry,i=this._geometryInfo[e];if(null===i.boundingSphere){const t=new Is;this.getBoundingBoxAt(e,Wl),Wl.getCenter(t.center);const r=n.index,s=n.attributes.position;let o=0;for(let e=i.start,n=i.start+i.count;e<n;e++){let n=e;r&&(n=r.getX(n)),Xl.fromBufferAttribute(s,n),o=Math.max(o,t.center.distanceToSquared(Xl))}t.radius=Math.sqrt(o),i.boundingSphere=t}return t.copy(i.boundingSphere),t}setMatrixAt(e,t){this.validateInstanceId(e);const n=this._matricesTexture,i=this._matricesTexture.image.data;return t.toArray(i,16*e),n.needsUpdate=!0,this}getMatrixAt(e,t){return this.validateInstanceId(e),t.fromArray(this._matricesTexture.image.data,16*e)}setColorAt(e,t){return this.validateInstanceId(e),null===this._colorsTexture&&this._initColorsTexture(),t.toArray(this._colorsTexture.image.data,4*e),this._colorsTexture.needsUpdate=!0,this}getColorAt(e,t){return this.validateInstanceId(e),t.fromArray(this._colorsTexture.image.data,4*e)}setVisibleAt(e,t){return this.validateInstanceId(e),this._instanceInfo[e].visible===t||(this._instanceInfo[e].visible=t,this._visibilityChanged=!0),this}getVisibleAt(e){return this.validateInstanceId(e),this._instanceInfo[e].visible}setGeometryIdAt(e,t){return this.validateInstanceId(e),this.validateGeometryId(t),this._instanceInfo[e].geometryIndex=t,this}getGeometryIdAt(e){return this.validateInstanceId(e),this._instanceInfo[e].geometryIndex}getGeometryRangeAt(e,t={}){this.validateGeometryId(e);const n=this._geometryInfo[e];return t.vertexStart=n.vertexStart,t.vertexCount=n.vertexCount,t.reservedVertexCount=n.reservedVertexCount,t.indexStart=n.indexStart,t.indexCount=n.indexCount,t.reservedIndexCount=n.reservedIndexCount,t.start=n.start,t.count=n.count,t}setInstanceCount(e){const t=this._availableInstanceIds,n=this._instanceInfo;for(t.sort(Fl);t[t.length-1]===n.length;)n.pop(),t.pop();if(e<n.length)throw new Error(`BatchedMesh: Instance ids outside the range ${e} are being used. Cannot shrink instance count.`);const i=new Int32Array(e),r=new Int32Array(e);tc(this._multiDrawCounts,i),tc(this._multiDrawStarts,r),this._multiDrawCounts=i,this._multiDrawStarts=r,this._maxInstanceCount=e;const s=this._indirectTexture,o=this._matricesTexture,a=this._colorsTexture;s.dispose(),this._initIndirectTexture(),tc(s.image.data,this._indirectTexture.image.data),o.dispose(),this._initMatricesTexture(),tc(o.image.data,this._matricesTexture.image.data),a&&(a.dispose(),this._initColorsTexture(),tc(a.image.data,this._colorsTexture.image.data))}setGeometrySize(e,t){const n=[...this._geometryInfo].filter((e=>e.active));if(Math.max(...n.map((e=>e.vertexStart+e.reservedVertexCount)))>e)throw new Error(`BatchedMesh: Geometry vertex values are being used outside the range ${t}. Cannot shrink further.`);if(this.geometry.index&&Math.max(...n.map((e=>e.indexStart+e.reservedIndexCount)))>t)throw new Error(`BatchedMesh: Geometry index values are being used outside the range ${t}. Cannot shrink further.`);const i=this.geometry;i.dispose(),this._maxVertexCount=e,this._maxIndexCount=t,this._geometryInitialized&&(this._geometryInitialized=!1,this.geometry=new sa,this._initializeGeometry(i));const r=this.geometry;i.index&&tc(i.index.array,r.index.array);for(const e in i.attributes)tc(i.attributes[e].array,r.attributes[e].array)}raycast(e,t){const n=this._instanceInfo,i=this._geometryInfo,r=this.matrixWorld,s=this.geometry;Zl.material=this.material,Zl.geometry.index=s.index,Zl.geometry.attributes=s.attributes,null===Zl.geometry.boundingBox&&(Zl.geometry.boundingBox=new cs),null===Zl.geometry.boundingSphere&&(Zl.geometry.boundingSphere=new Is);for(let s=0,o=n.length;s<o;s++){if(!n[s].visible||!n[s].active)continue;const o=n[s].geometryIndex,a=i[o];Zl.geometry.setDrawRange(a.start,a.count),this.getMatrixAt(s,Zl.matrixWorld).premultiply(r),this.getBoundingBoxAt(o,Zl.geometry.boundingBox),this.getBoundingSphereAt(o,Zl.geometry.boundingSphere),Zl.raycast(e,$l);for(let e=0,n=$l.length;e<n;e++){const n=$l[e];n.object=this,n.batchId=s,t.push(n)}$l.length=0}Zl.material=null,Zl.geometry.index=null,Zl.geometry.attributes={},Zl.geometry.setDrawRange(0,1/0)}copy(e){return super.copy(e),this.geometry=e.geometry.clone(),this.perObjectFrustumCulled=e.perObjectFrustumCulled,this.sortObjects=e.sortObjects,this.boundingBox=null!==e.boundingBox?e.boundingBox.clone():null,this.boundingSphere=null!==e.boundingSphere?e.boundingSphere.clone():null,this._geometryInfo=e._geometryInfo.map((e=>({...e,boundingBox:null!==e.boundingBox?e.boundingBox.clone():null,boundingSphere:null!==e.boundingSphere?e.boundingSphere.clone():null}))),this._instanceInfo=e._instanceInfo.map((e=>({...e}))),this._maxInstanceCount=e._maxInstanceCount,this._maxVertexCount=e._maxVertexCount,this._maxIndexCount=e._maxIndexCount,this._geometryInitialized=e._geometryInitialized,this._geometryCount=e._geometryCount,this._multiDrawCounts=e._multiDrawCounts.slice(),this._multiDrawStarts=e._multiDrawStarts.slice(),this._matricesTexture=e._matricesTexture.clone(),this._matricesTexture.image.data=this._matricesTexture.image.data.slice(),null!==this._colorsTexture&&(this._colorsTexture=e._colorsTexture.clone(),this._colorsTexture.image.data=this._colorsTexture.image.data.slice()),this}dispose(){return this.geometry.dispose(),this._matricesTexture.dispose(),this._matricesTexture=null,this._indirectTexture.dispose(),this._indirectTexture=null,null!==this._colorsTexture&&(this._colorsTexture.dispose(),this._colorsTexture=null),this}onBeforeRender(e,t,n,i,r){if(!this._visibilityChanged&&!this.perObjectFrustumCulled&&!this.sortObjects)return;const s=i.getIndex(),o=null===s?1:s.array.BYTES_PER_ELEMENT,a=this._instanceInfo,l=this._multiDrawStarts,c=this._multiDrawCounts,h=this._geometryInfo,u=this.perObjectFrustumCulled,d=this._indirectTexture,p=d.image.data;u&&(Hl.multiplyMatrices(n.projectionMatrix,n.matrixWorldInverse).multiply(this.matrixWorld),jl.setFromProjectionMatrix(Hl,e.coordinateSystem));let f=0;if(this.sortObjects){Hl.copy(this.matrixWorld).invert(),Xl.setFromMatrixPosition(n.matrixWorld).applyMatrix4(Hl),Yl.set(0,0,-1).transformDirection(n.matrixWorld).transformDirection(Hl);for(let e=0,t=a.length;e<t;e++)if(a[e].visible&&a[e].active){const t=a[e].geometryIndex;this.getMatrixAt(e,Hl),this.getBoundingSphereAt(t,ql).applyMatrix4(Hl);let n=!1;if(u&&(n=!jl.intersectsSphere(ql)),!n){const n=h[t],i=Jl.subVectors(ql.center,Xl).dot(Yl);Kl.push(n.start,n.count,i,e)}}const e=Kl.list,t=this.customSort;null===t?e.sort(r.transparent?zl:Ql):t.call(this,e,n);for(let t=0,n=e.length;t<n;t++){const n=e[t];l[f]=n.start*o,c[f]=n.count,p[f]=n.index,f++}Kl.reset()}else for(let e=0,t=a.length;e<t;e++)if(a[e].visible&&a[e].active){const t=a[e].geometryIndex;let n=!1;if(u&&(this.getMatrixAt(e,Hl),this.getBoundingSphereAt(t,ql).applyMatrix4(Hl),n=!jl.intersectsSphere(ql)),!n){const n=h[t];l[f]=n.start*o,c[f]=n.count,p[f]=e,f++}}d.needsUpdate=!0,this._multiDrawCount=f,this._visibilityChanged=!1}onBeforeShadow(e,t,n,i,r,s){this.onBeforeRender(e,null,i,r,s)}}class ic extends Lo{constructor(e){super(),this.isLineBasicMaterial=!0,this.type="LineBasicMaterial",this.color=new To(16777215),this.map=null,this.linewidth=1,this.linecap="round",this.linejoin="round",this.fog=!0,this.setValues(e)}copy(e){return super.copy(e),this.color.copy(e.color),this.map=e.map,this.linewidth=e.linewidth,this.linecap=e.linecap,this.linejoin=e.linejoin,this.fog=e.fog,this}}const rc=new os,sc=new os,oc=new ks,ac=new Us,lc=new Is,cc=new os,hc=new os;class uc extends co{constructor(e=new sa,t=new ic){super(),this.isLine=!0,this.type="Line",this.geometry=e,this.material=t,this.updateMorphTargets()}copy(e,t){return super.copy(e,t),this.material=Array.isArray(e.material)?e.material.slice():e.material,this.geometry=e.geometry,this}computeLineDistances(){const e=this.geometry;if(null===e.index){const t=e.attributes.position,n=[0];for(let e=1,i=t.count;e<i;e++)rc.fromBufferAttribute(t,e-1),sc.fromBufferAttribute(t,e),n[e]=n[e-1],n[e]+=rc.distanceTo(sc);e.setAttribute("lineDistance",new Ko(n,1))}else console.warn("THREE.Line.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.");return this}raycast(e,t){const n=this.geometry,i=this.matrixWorld,r=e.params.Line.threshold,s=n.drawRange;if(null===n.boundingSphere&&n.computeBoundingSphere(),lc.copy(n.boundingSphere),lc.applyMatrix4(i),lc.radius+=r,!1===e.ray.intersectsSphere(lc))return;oc.copy(i).invert(),ac.copy(e.ray).applyMatrix4(oc);const o=r/((this.scale.x+this.scale.y+this.scale.z)/3),a=o*o,l=this.isLineSegments?2:1,c=n.index,h=n.attributes.position;if(null!==c){const n=Math.max(0,s.start),i=Math.min(c.count,s.start+s.count);for(let r=n,s=i-1;r<s;r+=l){const n=c.getX(r),i=c.getX(r+1),s=dc(this,e,ac,a,n,i,r);s&&t.push(s)}if(this.isLineLoop){const r=c.getX(i-1),s=c.getX(n),o=dc(this,e,ac,a,r,s,i-1);o&&t.push(o)}}else{const n=Math.max(0,s.start),i=Math.min(h.count,s.start+s.count);for(let r=n,s=i-1;r<s;r+=l){const n=dc(this,e,ac,a,r,r+1,r);n&&t.push(n)}if(this.isLineLoop){const r=dc(this,e,ac,a,i-1,n,i-1);r&&t.push(r)}}}updateMorphTargets(){const e=this.geometry.morphAttributes,t=Object.keys(e);if(t.length>0){const n=e[t[0]];if(void 0!==n){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let e=0,t=n.length;e<t;e++){const t=n[e].name||String(e);this.morphTargetInfluences.push(0),this.morphTargetDictionary[t]=e}}}}}function dc(e,t,n,i,r,s,o){const a=e.geometry.attributes.position;if(rc.fromBufferAttribute(a,r),sc.fromBufferAttribute(a,s),n.distanceSqToSegment(rc,sc,cc,hc)>i)return;cc.applyMatrix4(e.matrixWorld);const l=t.ray.origin.distanceTo(cc);return l<t.near||l>t.far?void 0:{distance:l,point:hc.clone().applyMatrix4(e.matrixWorld),index:o,face:null,faceIndex:null,barycoord:null,object:e}}const pc=new os,fc=new os;class mc extends uc{constructor(e,t){super(e,t),this.isLineSegments=!0,this.type="LineSegments"}computeLineDistances(){const e=this.geometry;if(null===e.index){const t=e.attributes.position,n=[];for(let e=0,i=t.count;e<i;e+=2)pc.fromBufferAttribute(t,e),fc.fromBufferAttribute(t,e+1),n[e]=0===e?0:n[e-1],n[e+1]=n[e]+pc.distanceTo(fc);e.setAttribute("lineDistance",new Ko(n,1))}else console.warn("THREE.LineSegments.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.");return this}}class Ac extends uc{constructor(e,t){super(e,t),this.isLineLoop=!0,this.type="LineLoop"}}class gc extends Lo{constructor(e){super(),this.isPointsMaterial=!0,this.type="PointsMaterial",this.color=new To(16777215),this.map=null,this.alphaMap=null,this.size=1,this.sizeAttenuation=!0,this.fog=!0,this.setValues(e)}copy(e){return super.copy(e),this.color.copy(e.color),this.map=e.map,this.alphaMap=e.alphaMap,this.size=e.size,this.sizeAttenuation=e.sizeAttenuation,this.fog=e.fog,this}}const vc=new ks,yc=new Us,Ec=new Is,bc=new os;class xc extends co{constructor(e=new sa,t=new gc){super(),this.isPoints=!0,this.type="Points",this.geometry=e,this.material=t,this.updateMorphTargets()}copy(e,t){return super.copy(e,t),this.material=Array.isArray(e.material)?e.material.slice():e.material,this.geometry=e.geometry,this}raycast(e,t){const n=this.geometry,i=this.matrixWorld,r=e.params.Points.threshold,s=n.drawRange;if(null===n.boundingSphere&&n.computeBoundingSphere(),Ec.copy(n.boundingSphere),Ec.applyMatrix4(i),Ec.radius+=r,!1===e.ray.intersectsSphere(Ec))return;vc.copy(i).invert(),yc.copy(e.ray).applyMatrix4(vc);const o=r/((this.scale.x+this.scale.y+this.scale.z)/3),a=o*o,l=n.index,c=n.attributes.position;if(null!==l)for(let n=Math.max(0,s.start),r=Math.min(l.count,s.start+s.count);n<r;n++){const r=l.getX(n);bc.fromBufferAttribute(c,r),Cc(bc,r,a,i,e,t,this)}else for(let n=Math.max(0,s.start),r=Math.min(c.count,s.start+s.count);n<r;n++)bc.fromBufferAttribute(c,n),Cc(bc,n,a,i,e,t,this)}updateMorphTargets(){const e=this.geometry.morphAttributes,t=Object.keys(e);if(t.length>0){const n=e[t[0]];if(void 0!==n){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let e=0,t=n.length;e<t;e++){const t=n[e].name||String(e);this.morphTargetInfluences.push(0),this.morphTargetDictionary[t]=e}}}}}function Cc(e,t,n,i,r,s,o){const a=yc.distanceSqToPoint(e);if(a<n){const n=new os;yc.closestPointToPoint(e,n),n.applyMatrix4(i);const l=r.ray.origin.distanceTo(n);if(l<r.near||l>r.far)return;s.push({distance:l,distanceToRay:Math.sqrt(a),point:n,index:t,face:null,faceIndex:null,barycoord:null,object:o})}}class wc extends Kr{constructor(e,t,n,i,r,s,o,a,l){super(e,t,n,i,r,s,o,a,l),this.isVideoTexture=!0,this.minFilter=void 0!==s?s:$t,this.magFilter=void 0!==r?r:$t,this.generateMipmaps=!1;const c=this;"requestVideoFrameCallback"in e&&e.requestVideoFrameCallback((function t(){c.needsUpdate=!0,e.requestVideoFrameCallback(t)}))}clone(){return new this.constructor(this.image).copy(this)}update(){const e=this.image;!1=="requestVideoFrameCallback"in e&&e.readyState>=e.HAVE_CURRENT_DATA&&(this.needsUpdate=!0)}}class _c extends wc{constructor(e,t,n,i,r,s,o,a){super({},e,t,n,i,r,s,o,a),this.isVideoFrameTexture=!0}update(){}clone(){return(new this.constructor).copy(this)}setFrame(e){this.image=e,this.needsUpdate=!0}}class Mc extends Kr{constructor(e,t){super({width:e,height:t}),this.isFramebufferTexture=!0,this.magFilter=Xt,this.minFilter=Xt,this.generateMipmaps=!1,this.needsUpdate=!0}}class Ic extends Kr{constructor(e,t,n,i,r,s,o,a,l,c,h,u){super(null,s,o,a,l,c,i,r,h,u),this.isCompressedTexture=!0,this.image={width:t,height:n},this.mipmaps=e,this.flipY=!1,this.generateMipmaps=!1}}class Sc extends Ic{constructor(e,t,n,i,r,s){super(e,t,n,r,s),this.isCompressedArrayTexture=!0,this.image.depth=i,this.wrapR=Wt,this.layerUpdates=new Set}addLayerUpdate(e){this.layerUpdates.add(e)}clearLayerUpdates(){this.layerUpdates.clear()}}class Tc extends Ic{constructor(e,t,n){super(void 0,e[0].width,e[0].height,t,n,Qt),this.isCompressedCubeTexture=!0,this.isCubeTexture=!0,this.image=e}}class Bc extends Kr{constructor(e,t,n,i,r,s,o,a,l){super(e,t,n,i,r,s,o,a,l),this.isCanvasTexture=!0,this.needsUpdate=!0}}class Rc extends Kr{constructor(e,t,n,i,r,s,o,a,l,c=xn){if(c!==xn&&c!==Cn)throw new Error("DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat");void 0===n&&c===xn&&(n=hn),void 0===n&&c===Cn&&(n=mn),super(null,i,r,s,o,a,c,n,l),this.isDepthTexture=!0,this.image={width:e,height:t},this.magFilter=void 0!==o?o:Xt,this.minFilter=void 0!==a?a:Xt,this.flipY=!1,this.generateMipmaps=!1,this.compareFunction=null}copy(e){return super.copy(e),this.compareFunction=e.compareFunction,this}toJSON(e){const t=super.toJSON(e);return null!==this.compareFunction&&(t.compareFunction=this.compareFunction),t}}class Lc{constructor(){this.type="Curve",this.arcLengthDivisions=200}getPoint(){return console.warn("THREE.Curve: .getPoint() not implemented."),null}getPointAt(e,t){const n=this.getUtoTmapping(e);return this.getPoint(n,t)}getPoints(e=5){const t=[];for(let n=0;n<=e;n++)t.push(this.getPoint(n/e));return t}getSpacedPoints(e=5){const t=[];for(let n=0;n<=e;n++)t.push(this.getPointAt(n/e));return t}getLength(){const e=this.getLengths();return e[e.length-1]}getLengths(e=this.arcLengthDivisions){if(this.cacheArcLengths&&this.cacheArcLengths.length===e+1&&!this.needsUpdate)return this.cacheArcLengths;this.needsUpdate=!1;const t=[];let n,i=this.getPoint(0),r=0;t.push(0);for(let s=1;s<=e;s++)n=this.getPoint(s/e),r+=n.distanceTo(i),t.push(r),i=n;return this.cacheArcLengths=t,t}updateArcLengths(){this.needsUpdate=!0,this.getLengths()}getUtoTmapping(e,t){const n=this.getLengths();let i=0;const r=n.length;let s;s=t||e*n[r-1];let o,a=0,l=r-1;for(;a<=l;)if(i=Math.floor(a+(l-a)/2),o=n[i]-s,o<0)a=i+1;else{if(!(o>0)){l=i;break}l=i-1}if(i=l,n[i]===s)return i/(r-1);const c=n[i];return(i+(s-c)/(n[i+1]-c))/(r-1)}getTangent(e,t){const n=1e-4;let i=e-n,r=e+n;i<0&&(i=0),r>1&&(r=1);const s=this.getPoint(i),o=this.getPoint(r),a=t||(s.isVector2?new Tr:new os);return a.copy(o).sub(s).normalize(),a}getTangentAt(e,t){const n=this.getUtoTmapping(e);return this.getTangent(n,t)}computeFrenetFrames(e,t){const n=new os,i=[],r=[],s=[],o=new os,a=new ks;for(let t=0;t<=e;t++){const n=t/e;i[t]=this.getTangentAt(n,new os)}r[0]=new os,s[0]=new os;let l=Number.MAX_VALUE;const c=Math.abs(i[0].x),h=Math.abs(i[0].y),u=Math.abs(i[0].z);c<=l&&(l=c,n.set(1,0,0)),h<=l&&(l=h,n.set(0,1,0)),u<=l&&n.set(0,0,1),o.crossVectors(i[0],n).normalize(),r[0].crossVectors(i[0],o),s[0].crossVectors(i[0],r[0]);for(let t=1;t<=e;t++){if(r[t]=r[t-1].clone(),s[t]=s[t-1].clone(),o.crossVectors(i[t-1],i[t]),o.length()>Number.EPSILON){o.normalize();const e=Math.acos(Cr(i[t-1].dot(i[t]),-1,1));r[t].applyMatrix4(a.makeRotationAxis(o,e))}s[t].crossVectors(i[t],r[t])}if(!0===t){let t=Math.acos(Cr(r[0].dot(r[e]),-1,1));t/=e,i[0].dot(o.crossVectors(r[0],r[e]))>0&&(t=-t);for(let n=1;n<=e;n++)r[n].applyMatrix4(a.makeRotationAxis(i[n],t*n)),s[n].crossVectors(i[n],r[n])}return{tangents:i,normals:r,binormals:s}}clone(){return(new this.constructor).copy(this)}copy(e){return this.arcLengthDivisions=e.arcLengthDivisions,this}toJSON(){const e={metadata:{version:4.6,type:"Curve",generator:"Curve.toJSON"}};return e.arcLengthDivisions=this.arcLengthDivisions,e.type=this.type,e}fromJSON(e){return this.arcLengthDivisions=e.arcLengthDivisions,this}}class Dc extends Lc{constructor(e=0,t=0,n=1,i=1,r=0,s=2*Math.PI,o=!1,a=0){super(),this.isEllipseCurve=!0,this.type="EllipseCurve",this.aX=e,this.aY=t,this.xRadius=n,this.yRadius=i,this.aStartAngle=r,this.aEndAngle=s,this.aClockwise=o,this.aRotation=a}getPoint(e,t=new Tr){const n=t,i=2*Math.PI;let r=this.aEndAngle-this.aStartAngle;const s=Math.abs(r)<Number.EPSILON;for(;r<0;)r+=i;for(;r>i;)r-=i;r<Number.EPSILON&&(r=s?0:i),!0!==this.aClockwise||s||(r===i?r=-i:r-=i);const o=this.aStartAngle+e*r;let a=this.aX+this.xRadius*Math.cos(o),l=this.aY+this.yRadius*Math.sin(o);if(0!==this.aRotation){const e=Math.cos(this.aRotation),t=Math.sin(this.aRotation),n=a-this.aX,i=l-this.aY;a=n*e-i*t+this.aX,l=n*t+i*e+this.aY}return n.set(a,l)}copy(e){return super.copy(e),this.aX=e.aX,this.aY=e.aY,this.xRadius=e.xRadius,this.yRadius=e.yRadius,this.aStartAngle=e.aStartAngle,this.aEndAngle=e.aEndAngle,this.aClockwise=e.aClockwise,this.aRotation=e.aRotation,this}toJSON(){const e=super.toJSON();return e.aX=this.aX,e.aY=this.aY,e.xRadius=this.xRadius,e.yRadius=this.yRadius,e.aStartAngle=this.aStartAngle,e.aEndAngle=this.aEndAngle,e.aClockwise=this.aClockwise,e.aRotation=this.aRotation,e}fromJSON(e){return super.fromJSON(e),this.aX=e.aX,this.aY=e.aY,this.xRadius=e.xRadius,this.yRadius=e.yRadius,this.aStartAngle=e.aStartAngle,this.aEndAngle=e.aEndAngle,this.aClockwise=e.aClockwise,this.aRotation=e.aRotation,this}}class Pc extends Dc{constructor(e,t,n,i,r,s){super(e,t,n,n,i,r,s),this.isArcCurve=!0,this.type="ArcCurve"}}function Uc(){let e=0,t=0,n=0,i=0;function r(r,s,o,a){e=r,t=o,n=-3*r+3*s-2*o-a,i=2*r-2*s+o+a}return{initCatmullRom:function(e,t,n,i,s){r(t,n,s*(n-e),s*(i-t))},initNonuniformCatmullRom:function(e,t,n,i,s,o,a){let l=(t-e)/s-(n-e)/(s+o)+(n-t)/o,c=(n-t)/o-(i-t)/(o+a)+(i-n)/a;l*=o,c*=o,r(t,n,l,c)},calc:function(r){const s=r*r;return e+t*r+n*s+i*(s*r)}}}const kc=new os,Nc=new Uc,Oc=new Uc,Fc=new Uc;class Qc extends Lc{constructor(e=[],t=!1,n="centripetal",i=.5){super(),this.isCatmullRomCurve3=!0,this.type="CatmullRomCurve3",this.points=e,this.closed=t,this.curveType=n,this.tension=i}getPoint(e,t=new os){const n=t,i=this.points,r=i.length,s=(r-(this.closed?0:1))*e;let o,a,l=Math.floor(s),c=s-l;this.closed?l+=l>0?0:(Math.floor(Math.abs(l)/r)+1)*r:0===c&&l===r-1&&(l=r-2,c=1),this.closed||l>0?o=i[(l-1)%r]:(kc.subVectors(i[0],i[1]).add(i[0]),o=kc);const h=i[l%r],u=i[(l+1)%r];if(this.closed||l+2<r?a=i[(l+2)%r]:(kc.subVectors(i[r-1],i[r-2]).add(i[r-1]),a=kc),"centripetal"===this.curveType||"chordal"===this.curveType){const e="chordal"===this.curveType?.5:.25;let t=Math.pow(o.distanceToSquared(h),e),n=Math.pow(h.distanceToSquared(u),e),i=Math.pow(u.distanceToSquared(a),e);n<1e-4&&(n=1),t<1e-4&&(t=n),i<1e-4&&(i=n),Nc.initNonuniformCatmullRom(o.x,h.x,u.x,a.x,t,n,i),Oc.initNonuniformCatmullRom(o.y,h.y,u.y,a.y,t,n,i),Fc.initNonuniformCatmullRom(o.z,h.z,u.z,a.z,t,n,i)}else"catmullrom"===this.curveType&&(Nc.initCatmullRom(o.x,h.x,u.x,a.x,this.tension),Oc.initCatmullRom(o.y,h.y,u.y,a.y,this.tension),Fc.initCatmullRom(o.z,h.z,u.z,a.z,this.tension));return n.set(Nc.calc(c),Oc.calc(c),Fc.calc(c)),n}copy(e){super.copy(e),this.points=[];for(let t=0,n=e.points.length;t<n;t++){const n=e.points[t];this.points.push(n.clone())}return this.closed=e.closed,this.curveType=e.curveType,this.tension=e.tension,this}toJSON(){const e=super.toJSON();e.points=[];for(let t=0,n=this.points.length;t<n;t++){const n=this.points[t];e.points.push(n.toArray())}return e.closed=this.closed,e.curveType=this.curveType,e.tension=this.tension,e}fromJSON(e){super.fromJSON(e),this.points=[];for(let t=0,n=e.points.length;t<n;t++){const n=e.points[t];this.points.push((new os).fromArray(n))}return this.closed=e.closed,this.curveType=e.curveType,this.tension=e.tension,this}}function zc(e,t,n,i,r){const s=.5*(i-t),o=.5*(r-n),a=e*e;return(2*n-2*i+s+o)*(e*a)+(-3*n+3*i-2*s-o)*a+s*e+n}function Gc(e,t,n,i){return function(e,t){const n=1-e;return n*n*t}(e,t)+function(e,t){return 2*(1-e)*e*t}(e,n)+function(e,t){return e*e*t}(e,i)}function Hc(e,t,n,i,r){return function(e,t){const n=1-e;return n*n*n*t}(e,t)+function(e,t){const n=1-e;return 3*n*n*e*t}(e,n)+function(e,t){return 3*(1-e)*e*e*t}(e,i)+function(e,t){return e*e*e*t}(e,r)}class Vc extends Lc{constructor(e=new Tr,t=new Tr,n=new Tr,i=new Tr){super(),this.isCubicBezierCurve=!0,this.type="CubicBezierCurve",this.v0=e,this.v1=t,this.v2=n,this.v3=i}getPoint(e,t=new Tr){const n=t,i=this.v0,r=this.v1,s=this.v2,o=this.v3;return n.set(Hc(e,i.x,r.x,s.x,o.x),Hc(e,i.y,r.y,s.y,o.y)),n}copy(e){return super.copy(e),this.v0.copy(e.v0),this.v1.copy(e.v1),this.v2.copy(e.v2),this.v3.copy(e.v3),this}toJSON(){const e=super.toJSON();return e.v0=this.v0.toArray(),e.v1=this.v1.toArray(),e.v2=this.v2.toArray(),e.v3=this.v3.toArray(),e}fromJSON(e){return super.fromJSON(e),this.v0.fromArray(e.v0),this.v1.fromArray(e.v1),this.v2.fromArray(e.v2),this.v3.fromArray(e.v3),this}}class jc extends Lc{constructor(e=new os,t=new os,n=new os,i=new os){super(),this.isCubicBezierCurve3=!0,this.type="CubicBezierCurve3",this.v0=e,this.v1=t,this.v2=n,this.v3=i}getPoint(e,t=new os){const n=t,i=this.v0,r=this.v1,s=this.v2,o=this.v3;return n.set(Hc(e,i.x,r.x,s.x,o.x),Hc(e,i.y,r.y,s.y,o.y),Hc(e,i.z,r.z,s.z,o.z)),n}copy(e){return super.copy(e),this.v0.copy(e.v0),this.v1.copy(e.v1),this.v2.copy(e.v2),this.v3.copy(e.v3),this}toJSON(){const e=super.toJSON();return e.v0=this.v0.toArray(),e.v1=this.v1.toArray(),e.v2=this.v2.toArray(),e.v3=this.v3.toArray(),e}fromJSON(e){return super.fromJSON(e),this.v0.fromArray(e.v0),this.v1.fromArray(e.v1),this.v2.fromArray(e.v2),this.v3.fromArray(e.v3),this}}class Wc extends Lc{constructor(e=new Tr,t=new Tr){super(),this.isLineCurve=!0,this.type="LineCurve",this.v1=e,this.v2=t}getPoint(e,t=new Tr){const n=t;return 1===e?n.copy(this.v2):(n.copy(this.v2).sub(this.v1),n.multiplyScalar(e).add(this.v1)),n}getPointAt(e,t){return this.getPoint(e,t)}getTangent(e,t=new Tr){return t.subVectors(this.v2,this.v1).normalize()}getTangentAt(e,t){return this.getTangent(e,t)}copy(e){return super.copy(e),this.v1.copy(e.v1),this.v2.copy(e.v2),this}toJSON(){const e=super.toJSON();return e.v1=this.v1.toArray(),e.v2=this.v2.toArray(),e}fromJSON(e){return super.fromJSON(e),this.v1.fromArray(e.v1),this.v2.fromArray(e.v2),this}}class qc extends Lc{constructor(e=new os,t=new os){super(),this.isLineCurve3=!0,this.type="LineCurve3",this.v1=e,this.v2=t}getPoint(e,t=new os){const n=t;return 1===e?n.copy(this.v2):(n.copy(this.v2).sub(this.v1),n.multiplyScalar(e).add(this.v1)),n}getPointAt(e,t){return this.getPoint(e,t)}getTangent(e,t=new os){return t.subVectors(this.v2,this.v1).normalize()}getTangentAt(e,t){return this.getTangent(e,t)}copy(e){return super.copy(e),this.v1.copy(e.v1),this.v2.copy(e.v2),this}toJSON(){const e=super.toJSON();return e.v1=this.v1.toArray(),e.v2=this.v2.toArray(),e}fromJSON(e){return super.fromJSON(e),this.v1.fromArray(e.v1),this.v2.fromArray(e.v2),this}}class Xc extends Lc{constructor(e=new Tr,t=new Tr,n=new Tr){super(),this.isQuadraticBezierCurve=!0,this.type="QuadraticBezierCurve",this.v0=e,this.v1=t,this.v2=n}getPoint(e,t=new Tr){const n=t,i=this.v0,r=this.v1,s=this.v2;return n.set(Gc(e,i.x,r.x,s.x),Gc(e,i.y,r.y,s.y)),n}copy(e){return super.copy(e),this.v0.copy(e.v0),this.v1.copy(e.v1),this.v2.copy(e.v2),this}toJSON(){const e=super.toJSON();return e.v0=this.v0.toArray(),e.v1=this.v1.toArray(),e.v2=this.v2.toArray(),e}fromJSON(e){return super.fromJSON(e),this.v0.fromArray(e.v0),this.v1.fromArray(e.v1),this.v2.fromArray(e.v2),this}}class Yc extends Lc{constructor(e=new os,t=new os,n=new os){super(),this.isQuadraticBezierCurve3=!0,this.type="QuadraticBezierCurve3",this.v0=e,this.v1=t,this.v2=n}getPoint(e,t=new os){const n=t,i=this.v0,r=this.v1,s=this.v2;return n.set(Gc(e,i.x,r.x,s.x),Gc(e,i.y,r.y,s.y),Gc(e,i.z,r.z,s.z)),n}copy(e){return super.copy(e),this.v0.copy(e.v0),this.v1.copy(e.v1),this.v2.copy(e.v2),this}toJSON(){const e=super.toJSON();return e.v0=this.v0.toArray(),e.v1=this.v1.toArray(),e.v2=this.v2.toArray(),e}fromJSON(e){return super.fromJSON(e),this.v0.fromArray(e.v0),this.v1.fromArray(e.v1),this.v2.fromArray(e.v2),this}}class Jc extends Lc{constructor(e=[]){super(),this.isSplineCurve=!0,this.type="SplineCurve",this.points=e}getPoint(e,t=new Tr){const n=t,i=this.points,r=(i.length-1)*e,s=Math.floor(r),o=r-s,a=i[0===s?s:s-1],l=i[s],c=i[s>i.length-2?i.length-1:s+1],h=i[s>i.length-3?i.length-1:s+2];return n.set(zc(o,a.x,l.x,c.x,h.x),zc(o,a.y,l.y,c.y,h.y)),n}copy(e){super.copy(e),this.points=[];for(let t=0,n=e.points.length;t<n;t++){const n=e.points[t];this.points.push(n.clone())}return this}toJSON(){const e=super.toJSON();e.points=[];for(let t=0,n=this.points.length;t<n;t++){const n=this.points[t];e.points.push(n.toArray())}return e}fromJSON(e){super.fromJSON(e),this.points=[];for(let t=0,n=e.points.length;t<n;t++){const n=e.points[t];this.points.push((new Tr).fromArray(n))}return this}}var Kc=Object.freeze({__proto__:null,ArcCurve:Pc,CatmullRomCurve3:Qc,CubicBezierCurve:Vc,CubicBezierCurve3:jc,EllipseCurve:Dc,LineCurve:Wc,LineCurve3:qc,QuadraticBezierCurve:Xc,QuadraticBezierCurve3:Yc,SplineCurve:Jc});class Zc extends Lc{constructor(){super(),this.type="CurvePath",this.curves=[],this.autoClose=!1}add(e){this.curves.push(e)}closePath(){const e=this.curves[0].getPoint(0),t=this.curves[this.curves.length-1].getPoint(1);if(!e.equals(t)){const n=!0===e.isVector2?"LineCurve":"LineCurve3";this.curves.push(new Kc[n](t,e))}return this}getPoint(e,t){const n=e*this.getLength(),i=this.getCurveLengths();let r=0;for(;r<i.length;){if(i[r]>=n){const e=i[r]-n,s=this.curves[r],o=s.getLength(),a=0===o?0:1-e/o;return s.getPointAt(a,t)}r++}return null}getLength(){const e=this.getCurveLengths();return e[e.length-1]}updateArcLengths(){this.needsUpdate=!0,this.cacheLengths=null,this.getCurveLengths()}getCurveLengths(){if(this.cacheLengths&&this.cacheLengths.length===this.curves.length)return this.cacheLengths;const e=[];let t=0;for(let n=0,i=this.curves.length;n<i;n++)t+=this.curves[n].getLength(),e.push(t);return this.cacheLengths=e,e}getSpacedPoints(e=40){const t=[];for(let n=0;n<=e;n++)t.push(this.getPoint(n/e));return this.autoClose&&t.push(t[0]),t}getPoints(e=12){const t=[];let n;for(let i=0,r=this.curves;i<r.length;i++){const s=r[i],o=s.isEllipseCurve?2*e:s.isLineCurve||s.isLineCurve3?1:s.isSplineCurve?e*s.points.length:e,a=s.getPoints(o);for(let e=0;e<a.length;e++){const i=a[e];n&&n.equals(i)||(t.push(i),n=i)}}return this.autoClose&&t.length>1&&!t[t.length-1].equals(t[0])&&t.push(t[0]),t}copy(e){super.copy(e),this.curves=[];for(let t=0,n=e.curves.length;t<n;t++){const n=e.curves[t];this.curves.push(n.clone())}return this.autoClose=e.autoClose,this}toJSON(){const e=super.toJSON();e.autoClose=this.autoClose,e.curves=[];for(let t=0,n=this.curves.length;t<n;t++){const n=this.curves[t];e.curves.push(n.toJSON())}return e}fromJSON(e){super.fromJSON(e),this.autoClose=e.autoClose,this.curves=[];for(let t=0,n=e.curves.length;t<n;t++){const n=e.curves[t];this.curves.push((new Kc[n.type]).fromJSON(n))}return this}}class $c extends Zc{constructor(e){super(),this.type="Path",this.currentPoint=new Tr,e&&this.setFromPoints(e)}setFromPoints(e){this.moveTo(e[0].x,e[0].y);for(let t=1,n=e.length;t<n;t++)this.lineTo(e[t].x,e[t].y);return this}moveTo(e,t){return this.currentPoint.set(e,t),this}lineTo(e,t){const n=new Wc(this.currentPoint.clone(),new Tr(e,t));return this.curves.push(n),this.currentPoint.set(e,t),this}quadraticCurveTo(e,t,n,i){const r=new Xc(this.currentPoint.clone(),new Tr(e,t),new Tr(n,i));return this.curves.push(r),this.currentPoint.set(n,i),this}bezierCurveTo(e,t,n,i,r,s){const o=new Vc(this.currentPoint.clone(),new Tr(e,t),new Tr(n,i),new Tr(r,s));return this.curves.push(o),this.currentPoint.set(r,s),this}splineThru(e){const t=[this.currentPoint.clone()].concat(e),n=new Jc(t);return this.curves.push(n),this.currentPoint.copy(e[e.length-1]),this}arc(e,t,n,i,r,s){const o=this.currentPoint.x,a=this.currentPoint.y;return this.absarc(e+o,t+a,n,i,r,s),this}absarc(e,t,n,i,r,s){return this.absellipse(e,t,n,n,i,r,s),this}ellipse(e,t,n,i,r,s,o,a){const l=this.currentPoint.x,c=this.currentPoint.y;return this.absellipse(e+l,t+c,n,i,r,s,o,a),this}absellipse(e,t,n,i,r,s,o,a){const l=new Dc(e,t,n,i,r,s,o,a);if(this.curves.length>0){const e=l.getPoint(0);e.equals(this.currentPoint)||this.lineTo(e.x,e.y)}this.curves.push(l);const c=l.getPoint(1);return this.currentPoint.copy(c),this}copy(e){return super.copy(e),this.currentPoint.copy(e.currentPoint),this}toJSON(){const e=super.toJSON();return e.currentPoint=this.currentPoint.toArray(),e}fromJSON(e){return super.fromJSON(e),this.currentPoint.fromArray(e.currentPoint),this}}class eh extends sa{constructor(e=[new Tr(0,-.5),new Tr(.5,0),new Tr(0,.5)],t=12,n=0,i=2*Math.PI){super(),this.type="LatheGeometry",this.parameters={points:e,segments:t,phiStart:n,phiLength:i},t=Math.floor(t),i=Cr(i,0,2*Math.PI);const r=[],s=[],o=[],a=[],l=[],c=1/t,h=new os,u=new Tr,d=new os,p=new os,f=new os;let m=0,A=0;for(let t=0;t<=e.length-1;t++)switch(t){case 0:m=e[t+1].x-e[t].x,A=e[t+1].y-e[t].y,d.x=1*A,d.y=-m,d.z=0*A,f.copy(d),d.normalize(),a.push(d.x,d.y,d.z);break;case e.length-1:a.push(f.x,f.y,f.z);break;default:m=e[t+1].x-e[t].x,A=e[t+1].y-e[t].y,d.x=1*A,d.y=-m,d.z=0*A,p.copy(d),d.x+=f.x,d.y+=f.y,d.z+=f.z,d.normalize(),a.push(d.x,d.y,d.z),f.copy(p)}for(let r=0;r<=t;r++){const d=n+r*c*i,p=Math.sin(d),f=Math.cos(d);for(let n=0;n<=e.length-1;n++){h.x=e[n].x*p,h.y=e[n].y,h.z=e[n].x*f,s.push(h.x,h.y,h.z),u.x=r/t,u.y=n/(e.length-1),o.push(u.x,u.y);const i=a[3*n+0]*p,c=a[3*n+1],d=a[3*n+0]*f;l.push(i,c,d)}}for(let n=0;n<t;n++)for(let t=0;t<e.length-1;t++){const i=t+n*e.length,s=i,o=i+e.length,a=i+e.length+1,l=i+1;r.push(s,o,l),r.push(a,l,o)}this.setIndex(r),this.setAttribute("position",new Ko(s,3)),this.setAttribute("uv",new Ko(o,2)),this.setAttribute("normal",new Ko(l,3))}copy(e){return super.copy(e),this.parameters=Object.assign({},e.parameters),this}static fromJSON(e){return new eh(e.points,e.segments,e.phiStart,e.phiLength)}}class th extends eh{constructor(e=1,t=1,n=4,i=8){const r=new $c;r.absarc(0,-t/2,e,1.5*Math.PI,0),r.absarc(0,t/2,e,0,.5*Math.PI),super(r.getPoints(n),i),this.type="CapsuleGeometry",this.parameters={radius:e,length:t,capSegments:n,radialSegments:i}}static fromJSON(e){return new th(e.radius,e.length,e.capSegments,e.radialSegments)}}class nh extends sa{constructor(e=1,t=32,n=0,i=2*Math.PI){super(),this.type="CircleGeometry",this.parameters={radius:e,segments:t,thetaStart:n,thetaLength:i},t=Math.max(3,t);const r=[],s=[],o=[],a=[],l=new os,c=new Tr;s.push(0,0,0),o.push(0,0,1),a.push(.5,.5);for(let r=0,h=3;r<=t;r++,h+=3){const u=n+r/t*i;l.x=e*Math.cos(u),l.y=e*Math.sin(u),s.push(l.x,l.y,l.z),o.push(0,0,1),c.x=(s[h]/e+1)/2,c.y=(s[h+1]/e+1)/2,a.push(c.x,c.y)}for(let e=1;e<=t;e++)r.push(e,e+1,0);this.setIndex(r),this.setAttribute("position",new Ko(s,3)),this.setAttribute("normal",new Ko(o,3)),this.setAttribute("uv",new Ko(a,2))}copy(e){return super.copy(e),this.parameters=Object.assign({},e.parameters),this}static fromJSON(e){return new nh(e.radius,e.segments,e.thetaStart,e.thetaLength)}}class ih extends sa{constructor(e=1,t=1,n=1,i=32,r=1,s=!1,o=0,a=2*Math.PI){super(),this.type="CylinderGeometry",this.parameters={radiusTop:e,radiusBottom:t,height:n,radialSegments:i,heightSegments:r,openEnded:s,thetaStart:o,thetaLength:a};const l=this;i=Math.floor(i),r=Math.floor(r);const c=[],h=[],u=[],d=[];let p=0;const f=[],m=n/2;let A=0;function g(n){const r=p,s=new Tr,f=new os;let g=0;const v=!0===n?e:t,y=!0===n?1:-1;for(let e=1;e<=i;e++)h.push(0,m*y,0),u.push(0,y,0),d.push(.5,.5),p++;const E=p;for(let e=0;e<=i;e++){const t=e/i*a+o,n=Math.cos(t),r=Math.sin(t);f.x=v*r,f.y=m*y,f.z=v*n,h.push(f.x,f.y,f.z),u.push(0,y,0),s.x=.5*n+.5,s.y=.5*r*y+.5,d.push(s.x,s.y),p++}for(let e=0;e<i;e++){const t=r+e,i=E+e;!0===n?c.push(i,i+1,t):c.push(i+1,i,t),g+=3}l.addGroup(A,g,!0===n?1:2),A+=g}!function(){const s=new os,g=new os;let v=0;const y=(t-e)/n;for(let l=0;l<=r;l++){const c=[],A=l/r,v=A*(t-e)+e;for(let e=0;e<=i;e++){const t=e/i,r=t*a+o,l=Math.sin(r),f=Math.cos(r);g.x=v*l,g.y=-A*n+m,g.z=v*f,h.push(g.x,g.y,g.z),s.set(l,y,f).normalize(),u.push(s.x,s.y,s.z),d.push(t,1-A),c.push(p++)}f.push(c)}for(let n=0;n<i;n++)for(let i=0;i<r;i++){const s=f[i][n],o=f[i+1][n],a=f[i+1][n+1],l=f[i][n+1];(e>0||0!==i)&&(c.push(s,o,l),v+=3),(t>0||i!==r-1)&&(c.push(o,a,l),v+=3)}l.addGroup(A,v,0),A+=v}(),!1===s&&(e>0&&g(!0),t>0&&g(!1)),this.setIndex(c),this.setAttribute("position",new Ko(h,3)),this.setAttribute("normal",new Ko(u,3)),this.setAttribute("uv",new Ko(d,2))}copy(e){return super.copy(e),this.parameters=Object.assign({},e.parameters),this}static fromJSON(e){return new ih(e.radiusTop,e.radiusBottom,e.height,e.radialSegments,e.heightSegments,e.openEnded,e.thetaStart,e.thetaLength)}}class rh extends ih{constructor(e=1,t=1,n=32,i=1,r=!1,s=0,o=2*Math.PI){super(0,e,t,n,i,r,s,o),this.type="ConeGeometry",this.parameters={radius:e,height:t,radialSegments:n,heightSegments:i,openEnded:r,thetaStart:s,thetaLength:o}}static fromJSON(e){return new rh(e.radius,e.height,e.radialSegments,e.heightSegments,e.openEnded,e.thetaStart,e.thetaLength)}}class sh extends sa{constructor(e=[],t=[],n=1,i=0){super(),this.type="PolyhedronGeometry",this.parameters={vertices:e,indices:t,radius:n,detail:i};const r=[],s=[];function o(e,t,n,i){const r=i+1,s=[];for(let i=0;i<=r;i++){s[i]=[];const o=e.clone().lerp(n,i/r),a=t.clone().lerp(n,i/r),l=r-i;for(let e=0;e<=l;e++)s[i][e]=0===e&&i===r?o:o.clone().lerp(a,e/l)}for(let e=0;e<r;e++)for(let t=0;t<2*(r-e)-1;t++){const n=Math.floor(t/2);t%2==0?(a(s[e][n+1]),a(s[e+1][n]),a(s[e][n])):(a(s[e][n+1]),a(s[e+1][n+1]),a(s[e+1][n]))}}function a(e){r.push(e.x,e.y,e.z)}function l(t,n){const i=3*t;n.x=e[i+0],n.y=e[i+1],n.z=e[i+2]}function c(e,t,n,i){i<0&&1===e.x&&(s[t]=e.x-1),0===n.x&&0===n.z&&(s[t]=i/2/Math.PI+.5)}function h(e){return Math.atan2(e.z,-e.x)}!function(e){const n=new os,i=new os,r=new os;for(let s=0;s<t.length;s+=3)l(t[s+0],n),l(t[s+1],i),l(t[s+2],r),o(n,i,r,e)}(i),function(e){const t=new os;for(let n=0;n<r.length;n+=3)t.x=r[n+0],t.y=r[n+1],t.z=r[n+2],t.normalize().multiplyScalar(e),r[n+0]=t.x,r[n+1]=t.y,r[n+2]=t.z}(n),function(){const e=new os;for(let n=0;n<r.length;n+=3){e.x=r[n+0],e.y=r[n+1],e.z=r[n+2];const i=h(e)/2/Math.PI+.5,o=(t=e,Math.atan2(-t.y,Math.sqrt(t.x*t.x+t.z*t.z))/Math.PI+.5);s.push(i,1-o)}var t;(function(){const e=new os,t=new os,n=new os,i=new os,o=new Tr,a=new Tr,l=new Tr;for(let u=0,d=0;u<r.length;u+=9,d+=6){e.set(r[u+0],r[u+1],r[u+2]),t.set(r[u+3],r[u+4],r[u+5]),n.set(r[u+6],r[u+7],r[u+8]),o.set(s[d+0],s[d+1]),a.set(s[d+2],s[d+3]),l.set(s[d+4],s[d+5]),i.copy(e).add(t).add(n).divideScalar(3);const p=h(i);c(o,d+0,e,p),c(a,d+2,t,p),c(l,d+4,n,p)}})(),function(){for(let e=0;e<s.length;e+=6){const t=s[e+0],n=s[e+2],i=s[e+4],r=Math.max(t,n,i),o=Math.min(t,n,i);r>.9&&o<.1&&(t<.2&&(s[e+0]+=1),n<.2&&(s[e+2]+=1),i<.2&&(s[e+4]+=1))}}()}(),this.setAttribute("position",new Ko(r,3)),this.setAttribute("normal",new Ko(r.slice(),3)),this.setAttribute("uv",new Ko(s,2)),0===i?this.computeVertexNormals():this.normalizeNormals()}copy(e){return super.copy(e),this.parameters=Object.assign({},e.parameters),this}static fromJSON(e){return new sh(e.vertices,e.indices,e.radius,e.details)}}class oh extends sh{constructor(e=1,t=0){const n=(1+Math.sqrt(5))/2,i=1/n;super([-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,0,-i,-n,0,-i,n,0,i,-n,0,i,n,-i,-n,0,-i,n,0,i,-n,0,i,n,0,-n,0,-i,n,0,-i,-n,0,i,n,0,i],[3,11,7,3,7,15,3,15,13,7,19,17,7,17,6,7,6,15,17,4,8,17,8,10,17,10,6,8,0,16,8,16,2,8,2,10,0,12,1,0,1,18,0,18,16,6,10,2,6,2,13,6,13,15,2,16,18,2,18,3,2,3,13,18,1,9,18,9,11,18,11,3,4,14,12,4,12,0,4,0,8,11,9,5,11,5,19,11,19,7,19,5,14,19,14,4,19,4,17,1,12,14,1,14,5,1,5,9],e,t),this.type="DodecahedronGeometry",this.parameters={radius:e,detail:t}}static fromJSON(e){return new oh(e.radius,e.detail)}}const ah=new os,lh=new os,ch=new os,hh=new wo;class uh extends sa{constructor(e=null,t=1){if(super(),this.type="EdgesGeometry",this.parameters={geometry:e,thresholdAngle:t},null!==e){const n=4,i=Math.pow(10,n),r=Math.cos(Er*t),s=e.getIndex(),o=e.getAttribute("position"),a=s?s.count:o.count,l=[0,0,0],c=["a","b","c"],h=new Array(3),u={},d=[];for(let e=0;e<a;e+=3){s?(l[0]=s.getX(e),l[1]=s.getX(e+1),l[2]=s.getX(e+2)):(l[0]=e,l[1]=e+1,l[2]=e+2);const{a:t,b:n,c:a}=hh;if(t.fromBufferAttribute(o,l[0]),n.fromBufferAttribute(o,l[1]),a.fromBufferAttribute(o,l[2]),hh.getNormal(ch),h[0]=`${Math.round(t.x*i)},${Math.round(t.y*i)},${Math.round(t.z*i)}`,h[1]=`${Math.round(n.x*i)},${Math.round(n.y*i)},${Math.round(n.z*i)}`,h[2]=`${Math.round(a.x*i)},${Math.round(a.y*i)},${Math.round(a.z*i)}`,h[0]!==h[1]&&h[1]!==h[2]&&h[2]!==h[0])for(let e=0;e<3;e++){const t=(e+1)%3,n=h[e],i=h[t],s=hh[c[e]],o=hh[c[t]],a=`${n}_${i}`,p=`${i}_${n}`;p in u&&u[p]?(ch.dot(u[p].normal)<=r&&(d.push(s.x,s.y,s.z),d.push(o.x,o.y,o.z)),u[p]=null):a in u||(u[a]={index0:l[e],index1:l[t],normal:ch.clone()})}}for(const e in u)if(u[e]){const{index0:t,index1:n}=u[e];ah.fromBufferAttribute(o,t),lh.fromBufferAttribute(o,n),d.push(ah.x,ah.y,ah.z),d.push(lh.x,lh.y,lh.z)}this.setAttribute("position",new Ko(d,3))}}copy(e){return super.copy(e),this.parameters=Object.assign({},e.parameters),this}}class dh extends $c{constructor(e){super(e),this.uuid=xr(),this.type="Shape",this.holes=[]}getPointsHoles(e){const t=[];for(let n=0,i=this.holes.length;n<i;n++)t[n]=this.holes[n].getPoints(e);return t}extractPoints(e){return{shape:this.getPoints(e),holes:this.getPointsHoles(e)}}copy(e){super.copy(e),this.holes=[];for(let t=0,n=e.holes.length;t<n;t++){const n=e.holes[t];this.holes.push(n.clone())}return this}toJSON(){const e=super.toJSON();e.uuid=this.uuid,e.holes=[];for(let t=0,n=this.holes.length;t<n;t++){const n=this.holes[t];e.holes.push(n.toJSON())}return e}fromJSON(e){super.fromJSON(e),this.uuid=e.uuid,this.holes=[];for(let t=0,n=e.holes.length;t<n;t++){const n=e.holes[t];this.holes.push((new $c).fromJSON(n))}return this}}function ph(e,t,n,i,r){let s,o;if(r===function(e,t,n,i){let r=0;for(let s=t,o=n-i;s<n;s+=i)r+=(e[o]-e[s])*(e[s+1]+e[o+1]),o=s;return r}(e,t,n,i)>0)for(s=t;s<n;s+=i)o=Ph(s,e[s],e[s+1],o);else for(s=n-i;s>=t;s-=i)o=Ph(s,e[s],e[s+1],o);return o&&Sh(o,o.next)&&(Uh(o),o=o.next),o}function fh(e,t){if(!e)return e;t||(t=e);let n,i=e;do{if(n=!1,i.steiner||!Sh(i,i.next)&&0!==Ih(i.prev,i,i.next))i=i.next;else{if(Uh(i),i=t=i.prev,i===i.next)break;n=!0}}while(n||i!==t);return t}function mh(e,t,n,i,r,s,o){if(!e)return;!o&&s&&function(e,t,n,i){let r=e;do{0===r.z&&(r.z=Ch(r.x,r.y,t,n,i)),r.prevZ=r.prev,r.nextZ=r.next,r=r.next}while(r!==e);r.prevZ.nextZ=null,r.prevZ=null,function(e){let t,n,i,r,s,o,a,l,c=1;do{for(n=e,e=null,s=null,o=0;n;){for(o++,i=n,a=0,t=0;t<c&&(a++,i=i.nextZ,i);t++);for(l=c;a>0||l>0&&i;)0!==a&&(0===l||!i||n.z<=i.z)?(r=n,n=n.nextZ,a--):(r=i,i=i.nextZ,l--),s?s.nextZ=r:e=r,r.prevZ=s,s=r;n=i}s.nextZ=null,c*=2}while(o>1)}(r)}(e,i,r,s);let a,l,c=e;for(;e.prev!==e.next;)if(a=e.prev,l=e.next,s?gh(e,i,r,s):Ah(e))t.push(a.i/n|0),t.push(e.i/n|0),t.push(l.i/n|0),Uh(e),e=l.next,c=l.next;else if((e=l)===c){o?1===o?mh(e=vh(fh(e),t,n),t,n,i,r,s,2):2===o&&yh(e,t,n,i,r,s):mh(fh(e),t,n,i,r,s,1);break}}function Ah(e){const t=e.prev,n=e,i=e.next;if(Ih(t,n,i)>=0)return!1;const r=t.x,s=n.x,o=i.x,a=t.y,l=n.y,c=i.y,h=r<s?r<o?r:o:s<o?s:o,u=a<l?a<c?a:c:l<c?l:c,d=r>s?r>o?r:o:s>o?s:o,p=a>l?a>c?a:c:l>c?l:c;let f=i.next;for(;f!==t;){if(f.x>=h&&f.x<=d&&f.y>=u&&f.y<=p&&_h(r,a,s,l,o,c,f.x,f.y)&&Ih(f.prev,f,f.next)>=0)return!1;f=f.next}return!0}function gh(e,t,n,i){const r=e.prev,s=e,o=e.next;if(Ih(r,s,o)>=0)return!1;const a=r.x,l=s.x,c=o.x,h=r.y,u=s.y,d=o.y,p=a<l?a<c?a:c:l<c?l:c,f=h<u?h<d?h:d:u<d?u:d,m=a>l?a>c?a:c:l>c?l:c,A=h>u?h>d?h:d:u>d?u:d,g=Ch(p,f,t,n,i),v=Ch(m,A,t,n,i);let y=e.prevZ,E=e.nextZ;for(;y&&y.z>=g&&E&&E.z<=v;){if(y.x>=p&&y.x<=m&&y.y>=f&&y.y<=A&&y!==r&&y!==o&&_h(a,h,l,u,c,d,y.x,y.y)&&Ih(y.prev,y,y.next)>=0)return!1;if(y=y.prevZ,E.x>=p&&E.x<=m&&E.y>=f&&E.y<=A&&E!==r&&E!==o&&_h(a,h,l,u,c,d,E.x,E.y)&&Ih(E.prev,E,E.next)>=0)return!1;E=E.nextZ}for(;y&&y.z>=g;){if(y.x>=p&&y.x<=m&&y.y>=f&&y.y<=A&&y!==r&&y!==o&&_h(a,h,l,u,c,d,y.x,y.y)&&Ih(y.prev,y,y.next)>=0)return!1;y=y.prevZ}for(;E&&E.z<=v;){if(E.x>=p&&E.x<=m&&E.y>=f&&E.y<=A&&E!==r&&E!==o&&_h(a,h,l,u,c,d,E.x,E.y)&&Ih(E.prev,E,E.next)>=0)return!1;E=E.nextZ}return!0}function vh(e,t,n){let i=e;do{const r=i.prev,s=i.next.next;!Sh(r,s)&&Th(r,i,i.next,s)&&Lh(r,s)&&Lh(s,r)&&(t.push(r.i/n|0),t.push(i.i/n|0),t.push(s.i/n|0),Uh(i),Uh(i.next),i=e=s),i=i.next}while(i!==e);return fh(i)}function yh(e,t,n,i,r,s){let o=e;do{let e=o.next.next;for(;e!==o.prev;){if(o.i!==e.i&&Mh(o,e)){let a=Dh(o,e);return o=fh(o,o.next),a=fh(a,a.next),mh(o,t,n,i,r,s,0),void mh(a,t,n,i,r,s,0)}e=e.next}o=o.next}while(o!==e)}function Eh(e,t){return e.x-t.x}function bh(e,t){const n=function(e,t){let n,i=t,r=-1/0;const s=e.x,o=e.y;do{if(o<=i.y&&o>=i.next.y&&i.next.y!==i.y){const e=i.x+(o-i.y)*(i.next.x-i.x)/(i.next.y-i.y);if(e<=s&&e>r&&(r=e,n=i.x<i.next.x?i:i.next,e===s))return n}i=i.next}while(i!==t);if(!n)return null;const a=n,l=n.x,c=n.y;let h,u=1/0;i=n;do{s>=i.x&&i.x>=l&&s!==i.x&&_h(o<c?s:r,o,l,c,o<c?r:s,o,i.x,i.y)&&(h=Math.abs(o-i.y)/(s-i.x),Lh(i,e)&&(h<u||h===u&&(i.x>n.x||i.x===n.x&&xh(n,i)))&&(n=i,u=h)),i=i.next}while(i!==a);return n}(e,t);if(!n)return t;const i=Dh(n,e);return fh(i,i.next),fh(n,n.next)}function xh(e,t){return Ih(e.prev,e,t.prev)<0&&Ih(t.next,e,e.next)<0}function Ch(e,t,n,i,r){return(e=1431655765&((e=858993459&((e=252645135&((e=16711935&((e=(e-n)*r|0)|e<<8))|e<<4))|e<<2))|e<<1))|(t=1431655765&((t=858993459&((t=252645135&((t=16711935&((t=(t-i)*r|0)|t<<8))|t<<4))|t<<2))|t<<1))<<1}function wh(e){let t=e,n=e;do{(t.x<n.x||t.x===n.x&&t.y<n.y)&&(n=t),t=t.next}while(t!==e);return n}function _h(e,t,n,i,r,s,o,a){return(r-o)*(t-a)>=(e-o)*(s-a)&&(e-o)*(i-a)>=(n-o)*(t-a)&&(n-o)*(s-a)>=(r-o)*(i-a)}function Mh(e,t){return e.next.i!==t.i&&e.prev.i!==t.i&&!function(e,t){let n=e;do{if(n.i!==e.i&&n.next.i!==e.i&&n.i!==t.i&&n.next.i!==t.i&&Th(n,n.next,e,t))return!0;n=n.next}while(n!==e);return!1}(e,t)&&(Lh(e,t)&&Lh(t,e)&&function(e,t){let n=e,i=!1;const r=(e.x+t.x)/2,s=(e.y+t.y)/2;do{n.y>s!=n.next.y>s&&n.next.y!==n.y&&r<(n.next.x-n.x)*(s-n.y)/(n.next.y-n.y)+n.x&&(i=!i),n=n.next}while(n!==e);return i}(e,t)&&(Ih(e.prev,e,t.prev)||Ih(e,t.prev,t))||Sh(e,t)&&Ih(e.prev,e,e.next)>0&&Ih(t.prev,t,t.next)>0)}function Ih(e,t,n){return(t.y-e.y)*(n.x-t.x)-(t.x-e.x)*(n.y-t.y)}function Sh(e,t){return e.x===t.x&&e.y===t.y}function Th(e,t,n,i){const r=Rh(Ih(e,t,n)),s=Rh(Ih(e,t,i)),o=Rh(Ih(n,i,e)),a=Rh(Ih(n,i,t));return r!==s&&o!==a||!(0!==r||!Bh(e,n,t))||!(0!==s||!Bh(e,i,t))||!(0!==o||!Bh(n,e,i))||!(0!==a||!Bh(n,t,i))}function Bh(e,t,n){return t.x<=Math.max(e.x,n.x)&&t.x>=Math.min(e.x,n.x)&&t.y<=Math.max(e.y,n.y)&&t.y>=Math.min(e.y,n.y)}function Rh(e){return e>0?1:e<0?-1:0}function Lh(e,t){return Ih(e.prev,e,e.next)<0?Ih(e,t,e.next)>=0&&Ih(e,e.prev,t)>=0:Ih(e,t,e.prev)<0||Ih(e,e.next,t)<0}function Dh(e,t){const n=new kh(e.i,e.x,e.y),i=new kh(t.i,t.x,t.y),r=e.next,s=t.prev;return e.next=t,t.prev=e,n.next=r,r.prev=n,i.next=n,n.prev=i,s.next=i,i.prev=s,i}function Ph(e,t,n,i){const r=new kh(e,t,n);return i?(r.next=i.next,r.prev=i,i.next.prev=r,i.next=r):(r.prev=r,r.next=r),r}function Uh(e){e.next.prev=e.prev,e.prev.next=e.next,e.prevZ&&(e.prevZ.nextZ=e.nextZ),e.nextZ&&(e.nextZ.prevZ=e.prevZ)}function kh(e,t,n){this.i=e,this.x=t,this.y=n,this.prev=null,this.next=null,this.z=0,this.prevZ=null,this.nextZ=null,this.steiner=!1}class Nh{static area(e){const t=e.length;let n=0;for(let i=t-1,r=0;r<t;i=r++)n+=e[i].x*e[r].y-e[r].x*e[i].y;return.5*n}static isClockWise(e){return Nh.area(e)<0}static triangulateShape(e,t){const n=[],i=[],r=[];Oh(e),Fh(n,e);let s=e.length;t.forEach(Oh);for(let e=0;e<t.length;e++)i.push(s),s+=t[e].length,Fh(n,t[e]);const o=function(e,t,n=2){const i=t&&t.length,r=i?t[0]*n:e.length;let s=ph(e,0,r,n,!0);const o=[];if(!s||s.next===s.prev)return o;let a,l,c,h,u,d,p;if(i&&(s=function(e,t,n,i){const r=[];let s,o,a,l,c;for(s=0,o=t.length;s<o;s++)a=t[s]*i,l=s<o-1?t[s+1]*i:e.length,c=ph(e,a,l,i,!1),c===c.next&&(c.steiner=!0),r.push(wh(c));for(r.sort(Eh),s=0;s<r.length;s++)n=bh(r[s],n);return n}(e,t,s,n)),e.length>80*n){a=c=e[0],l=h=e[1];for(let t=n;t<r;t+=n)u=e[t],d=e[t+1],u<a&&(a=u),d<l&&(l=d),u>c&&(c=u),d>h&&(h=d);p=Math.max(c-a,h-l),p=0!==p?32767/p:0}return mh(s,o,n,a,l,p,0),o}(n,i);for(let e=0;e<o.length;e+=3)r.push(o.slice(e,e+3));return r}}function Oh(e){const t=e.length;t>2&&e[t-1].equals(e[0])&&e.pop()}function Fh(e,t){for(let n=0;n<t.length;n++)e.push(t[n].x),e.push(t[n].y)}class Qh extends sa{constructor(e=new dh([new Tr(.5,.5),new Tr(-.5,.5),new Tr(-.5,-.5),new Tr(.5,-.5)]),t={}){super(),this.type="ExtrudeGeometry",this.parameters={shapes:e,options:t},e=Array.isArray(e)?e:[e];const n=this,i=[],r=[];for(let t=0,n=e.length;t<n;t++)s(e[t]);function s(e){const s=[],o=void 0!==t.curveSegments?t.curveSegments:12,a=void 0!==t.steps?t.steps:1,l=void 0!==t.depth?t.depth:1;let c=void 0===t.bevelEnabled||t.bevelEnabled,h=void 0!==t.bevelThickness?t.bevelThickness:.2,u=void 0!==t.bevelSize?t.bevelSize:h-.1,d=void 0!==t.bevelOffset?t.bevelOffset:0,p=void 0!==t.bevelSegments?t.bevelSegments:3;const f=t.extrudePath,m=void 0!==t.UVGenerator?t.UVGenerator:zh;let A,g,v,y,E,b=!1;f&&(A=f.getSpacedPoints(a),b=!0,c=!1,g=f.computeFrenetFrames(a,!1),v=new os,y=new os,E=new os),c||(p=0,h=0,u=0,d=0);const x=e.extractPoints(o);let C=x.shape;const w=x.holes;if(!Nh.isClockWise(C)){C=C.reverse();for(let e=0,t=w.length;e<t;e++){const t=w[e];Nh.isClockWise(t)&&(w[e]=t.reverse())}}const _=Nh.triangulateShape(C,w),M=C;for(let e=0,t=w.length;e<t;e++){const t=w[e];C=C.concat(t)}function I(e,t,n){return t||console.error("THREE.ExtrudeGeometry: vec does not exist"),e.clone().addScaledVector(t,n)}const S=C.length,T=_.length;function B(e,t,n){let i,r,s;const o=e.x-t.x,a=e.y-t.y,l=n.x-e.x,c=n.y-e.y,h=o*o+a*a,u=o*c-a*l;if(Math.abs(u)>Number.EPSILON){const u=Math.sqrt(h),d=Math.sqrt(l*l+c*c),p=t.x-a/u,f=t.y+o/u,m=((n.x-c/d-p)*c-(n.y+l/d-f)*l)/(o*c-a*l);i=p+o*m-e.x,r=f+a*m-e.y;const A=i*i+r*r;if(A<=2)return new Tr(i,r);s=Math.sqrt(A/2)}else{let e=!1;o>Number.EPSILON?l>Number.EPSILON&&(e=!0):o<-Number.EPSILON?l<-Number.EPSILON&&(e=!0):Math.sign(a)===Math.sign(c)&&(e=!0),e?(i=-a,r=o,s=Math.sqrt(h)):(i=o,r=a,s=Math.sqrt(h/2))}return new Tr(i/s,r/s)}const R=[];for(let e=0,t=M.length,n=t-1,i=e+1;e<t;e++,n++,i++)n===t&&(n=0),i===t&&(i=0),R[e]=B(M[e],M[n],M[i]);const L=[];let D,P=R.concat();for(let e=0,t=w.length;e<t;e++){const t=w[e];D=[];for(let e=0,n=t.length,i=n-1,r=e+1;e<n;e++,i++,r++)i===n&&(i=0),r===n&&(r=0),D[e]=B(t[e],t[i],t[r]);L.push(D),P=P.concat(D)}for(let e=0;e<p;e++){const t=e/p,n=h*Math.cos(t*Math.PI/2),i=u*Math.sin(t*Math.PI/2)+d;for(let e=0,t=M.length;e<t;e++){const t=I(M[e],R[e],i);N(t.x,t.y,-n)}for(let e=0,t=w.length;e<t;e++){const t=w[e];D=L[e];for(let e=0,r=t.length;e<r;e++){const r=I(t[e],D[e],i);N(r.x,r.y,-n)}}}const U=u+d;for(let e=0;e<S;e++){const t=c?I(C[e],P[e],U):C[e];b?(y.copy(g.normals[0]).multiplyScalar(t.x),v.copy(g.binormals[0]).multiplyScalar(t.y),E.copy(A[0]).add(y).add(v),N(E.x,E.y,E.z)):N(t.x,t.y,0)}for(let e=1;e<=a;e++)for(let t=0;t<S;t++){const n=c?I(C[t],P[t],U):C[t];b?(y.copy(g.normals[e]).multiplyScalar(n.x),v.copy(g.binormals[e]).multiplyScalar(n.y),E.copy(A[e]).add(y).add(v),N(E.x,E.y,E.z)):N(n.x,n.y,l/a*e)}for(let e=p-1;e>=0;e--){const t=e/p,n=h*Math.cos(t*Math.PI/2),i=u*Math.sin(t*Math.PI/2)+d;for(let e=0,t=M.length;e<t;e++){const t=I(M[e],R[e],i);N(t.x,t.y,l+n)}for(let e=0,t=w.length;e<t;e++){const t=w[e];D=L[e];for(let e=0,r=t.length;e<r;e++){const r=I(t[e],D[e],i);b?N(r.x,r.y+A[a-1].y,A[a-1].x+n):N(r.x,r.y,l+n)}}}function k(e,t){let n=e.length;for(;--n>=0;){const i=n;let r=n-1;r<0&&(r=e.length-1);for(let e=0,n=a+2*p;e<n;e++){const n=S*e,s=S*(e+1);F(t+i+n,t+r+n,t+r+s,t+i+s)}}}function N(e,t,n){s.push(e),s.push(t),s.push(n)}function O(e,t,r){Q(e),Q(t),Q(r);const s=i.length/3,o=m.generateTopUV(n,i,s-3,s-2,s-1);z(o[0]),z(o[1]),z(o[2])}function F(e,t,r,s){Q(e),Q(t),Q(s),Q(t),Q(r),Q(s);const o=i.length/3,a=m.generateSideWallUV(n,i,o-6,o-3,o-2,o-1);z(a[0]),z(a[1]),z(a[3]),z(a[1]),z(a[2]),z(a[3])}function Q(e){i.push(s[3*e+0]),i.push(s[3*e+1]),i.push(s[3*e+2])}function z(e){r.push(e.x),r.push(e.y)}!function(){const e=i.length/3;if(c){let e=0,t=S*e;for(let e=0;e<T;e++){const n=_[e];O(n[2]+t,n[1]+t,n[0]+t)}e=a+2*p,t=S*e;for(let e=0;e<T;e++){const n=_[e];O(n[0]+t,n[1]+t,n[2]+t)}}else{for(let e=0;e<T;e++){const t=_[e];O(t[2],t[1],t[0])}for(let e=0;e<T;e++){const t=_[e];O(t[0]+S*a,t[1]+S*a,t[2]+S*a)}}n.addGroup(e,i.length/3-e,0)}(),function(){const e=i.length/3;let t=0;k(M,t),t+=M.length;for(let e=0,n=w.length;e<n;e++){const n=w[e];k(n,t),t+=n.length}n.addGroup(e,i.length/3-e,1)}()}this.setAttribute("position",new Ko(i,3)),this.setAttribute("uv",new Ko(r,2)),this.computeVertexNormals()}copy(e){return super.copy(e),this.parameters=Object.assign({},e.parameters),this}toJSON(){const e=super.toJSON();return function(e,t,n){if(n.shapes=[],Array.isArray(e))for(let t=0,i=e.length;t<i;t++){const i=e[t];n.shapes.push(i.uuid)}else n.shapes.push(e.uuid);return n.options=Object.assign({},t),void 0!==t.extrudePath&&(n.options.extrudePath=t.extrudePath.toJSON()),n}(this.parameters.shapes,this.parameters.options,e)}static fromJSON(e,t){const n=[];for(let i=0,r=e.shapes.length;i<r;i++){const r=t[e.shapes[i]];n.push(r)}const i=e.options.extrudePath;return void 0!==i&&(e.options.extrudePath=(new Kc[i.type]).fromJSON(i)),new Qh(n,e.options)}}const zh={generateTopUV:function(e,t,n,i,r){const s=t[3*n],o=t[3*n+1],a=t[3*i],l=t[3*i+1],c=t[3*r],h=t[3*r+1];return[new Tr(s,o),new Tr(a,l),new Tr(c,h)]},generateSideWallUV:function(e,t,n,i,r,s){const o=t[3*n],a=t[3*n+1],l=t[3*n+2],c=t[3*i],h=t[3*i+1],u=t[3*i+2],d=t[3*r],p=t[3*r+1],f=t[3*r+2],m=t[3*s],A=t[3*s+1],g=t[3*s+2];return Math.abs(a-h)<Math.abs(o-c)?[new Tr(o,1-l),new Tr(c,1-u),new Tr(d,1-f),new Tr(m,1-g)]:[new Tr(a,1-l),new Tr(h,1-u),new Tr(p,1-f),new Tr(A,1-g)]}};class Gh extends sh{constructor(e=1,t=0){const n=(1+Math.sqrt(5))/2;super([-1,n,0,1,n,0,-1,-n,0,1,-n,0,0,-1,n,0,1,n,0,-1,-n,0,1,-n,n,0,-1,n,0,1,-n,0,-1,-n,0,1],[0,11,5,0,5,1,0,1,7,0,7,10,0,10,11,1,5,9,5,11,4,11,10,2,10,7,6,7,1,8,3,9,4,3,4,2,3,2,6,3,6,8,3,8,9,4,9,5,2,4,11,6,2,10,8,6,7,9,8,1],e,t),this.type="IcosahedronGeometry",this.parameters={radius:e,detail:t}}static fromJSON(e){return new Gh(e.radius,e.detail)}}class Hh extends sh{constructor(e=1,t=0){super([1,0,0,-1,0,0,0,1,0,0,-1,0,0,0,1,0,0,-1],[0,2,4,0,4,3,0,3,5,0,5,2,1,2,5,1,5,3,1,3,4,1,4,2],e,t),this.type="OctahedronGeometry",this.parameters={radius:e,detail:t}}static fromJSON(e){return new Hh(e.radius,e.detail)}}class Vh extends sa{constructor(e=1,t=1,n=1,i=1){super(),this.type="PlaneGeometry",this.parameters={width:e,height:t,widthSegments:n,heightSegments:i};const r=e/2,s=t/2,o=Math.floor(n),a=Math.floor(i),l=o+1,c=a+1,h=e/o,u=t/a,d=[],p=[],f=[],m=[];for(let e=0;e<c;e++){const t=e*u-s;for(let n=0;n<l;n++){const i=n*h-r;p.push(i,-t,0),f.push(0,0,1),m.push(n/o),m.push(1-e/a)}}for(let e=0;e<a;e++)for(let t=0;t<o;t++){const n=t+l*e,i=t+l*(e+1),r=t+1+l*(e+1),s=t+1+l*e;d.push(n,i,s),d.push(i,r,s)}this.setIndex(d),this.setAttribute("position",new Ko(p,3)),this.setAttribute("normal",new Ko(f,3)),this.setAttribute("uv",new Ko(m,2))}copy(e){return super.copy(e),this.parameters=Object.assign({},e.parameters),this}static fromJSON(e){return new Vh(e.width,e.height,e.widthSegments,e.heightSegments)}}class jh extends sa{constructor(e=.5,t=1,n=32,i=1,r=0,s=2*Math.PI){super(),this.type="RingGeometry",this.parameters={innerRadius:e,outerRadius:t,thetaSegments:n,phiSegments:i,thetaStart:r,thetaLength:s},n=Math.max(3,n);const o=[],a=[],l=[],c=[];let h=e;const u=(t-e)/(i=Math.max(1,i)),d=new os,p=new Tr;for(let e=0;e<=i;e++){for(let e=0;e<=n;e++){const i=r+e/n*s;d.x=h*Math.cos(i),d.y=h*Math.sin(i),a.push(d.x,d.y,d.z),l.push(0,0,1),p.x=(d.x/t+1)/2,p.y=(d.y/t+1)/2,c.push(p.x,p.y)}h+=u}for(let e=0;e<i;e++){const t=e*(n+1);for(let e=0;e<n;e++){const i=e+t,r=i,s=i+n+1,a=i+n+2,l=i+1;o.push(r,s,l),o.push(s,a,l)}}this.setIndex(o),this.setAttribute("position",new Ko(a,3)),this.setAttribute("normal",new Ko(l,3)),this.setAttribute("uv",new Ko(c,2))}copy(e){return super.copy(e),this.parameters=Object.assign({},e.parameters),this}static fromJSON(e){return new jh(e.innerRadius,e.outerRadius,e.thetaSegments,e.phiSegments,e.thetaStart,e.thetaLength)}}class Wh extends sa{constructor(e=new dh([new Tr(0,.5),new Tr(-.5,-.5),new Tr(.5,-.5)]),t=12){super(),this.type="ShapeGeometry",this.parameters={shapes:e,curveSegments:t};const n=[],i=[],r=[],s=[];let o=0,a=0;if(!1===Array.isArray(e))l(e);else for(let t=0;t<e.length;t++)l(e[t]),this.addGroup(o,a,t),o+=a,a=0;function l(e){const o=i.length/3,l=e.extractPoints(t);let c=l.shape;const h=l.holes;!1===Nh.isClockWise(c)&&(c=c.reverse());for(let e=0,t=h.length;e<t;e++){const t=h[e];!0===Nh.isClockWise(t)&&(h[e]=t.reverse())}const u=Nh.triangulateShape(c,h);for(let e=0,t=h.length;e<t;e++){const t=h[e];c=c.concat(t)}for(let e=0,t=c.length;e<t;e++){const t=c[e];i.push(t.x,t.y,0),r.push(0,0,1),s.push(t.x,t.y)}for(let e=0,t=u.length;e<t;e++){const t=u[e],i=t[0]+o,r=t[1]+o,s=t[2]+o;n.push(i,r,s),a+=3}}this.setIndex(n),this.setAttribute("position",new Ko(i,3)),this.setAttribute("normal",new Ko(r,3)),this.setAttribute("uv",new Ko(s,2))}copy(e){return super.copy(e),this.parameters=Object.assign({},e.parameters),this}toJSON(){const e=super.toJSON();return function(e,t){if(t.shapes=[],Array.isArray(e))for(let n=0,i=e.length;n<i;n++){const i=e[n];t.shapes.push(i.uuid)}else t.shapes.push(e.uuid);return t}(this.parameters.shapes,e)}static fromJSON(e,t){const n=[];for(let i=0,r=e.shapes.length;i<r;i++){const r=t[e.shapes[i]];n.push(r)}return new Wh(n,e.curveSegments)}}class qh extends sa{constructor(e=1,t=32,n=16,i=0,r=2*Math.PI,s=0,o=Math.PI){super(),this.type="SphereGeometry",this.parameters={radius:e,widthSegments:t,heightSegments:n,phiStart:i,phiLength:r,thetaStart:s,thetaLength:o},t=Math.max(3,Math.floor(t)),n=Math.max(2,Math.floor(n));const a=Math.min(s+o,Math.PI);let l=0;const c=[],h=new os,u=new os,d=[],p=[],f=[],m=[];for(let d=0;d<=n;d++){const A=[],g=d/n;let v=0;0===d&&0===s?v=.5/t:d===n&&a===Math.PI&&(v=-.5/t);for(let n=0;n<=t;n++){const a=n/t;h.x=-e*Math.cos(i+a*r)*Math.sin(s+g*o),h.y=e*Math.cos(s+g*o),h.z=e*Math.sin(i+a*r)*Math.sin(s+g*o),p.push(h.x,h.y,h.z),u.copy(h).normalize(),f.push(u.x,u.y,u.z),m.push(a+v,1-g),A.push(l++)}c.push(A)}for(let e=0;e<n;e++)for(let i=0;i<t;i++){const t=c[e][i+1],r=c[e][i],o=c[e+1][i],l=c[e+1][i+1];(0!==e||s>0)&&d.push(t,r,l),(e!==n-1||a<Math.PI)&&d.push(r,o,l)}this.setIndex(d),this.setAttribute("position",new Ko(p,3)),this.setAttribute("normal",new Ko(f,3)),this.setAttribute("uv",new Ko(m,2))}copy(e){return super.copy(e),this.parameters=Object.assign({},e.parameters),this}static fromJSON(e){return new qh(e.radius,e.widthSegments,e.heightSegments,e.phiStart,e.phiLength,e.thetaStart,e.thetaLength)}}class Xh extends sh{constructor(e=1,t=0){super([1,1,1,-1,-1,1,-1,1,-1,1,-1,-1],[2,1,0,0,3,2,1,3,0,2,3,1],e,t),this.type="TetrahedronGeometry",this.parameters={radius:e,detail:t}}static fromJSON(e){return new Xh(e.radius,e.detail)}}class Yh extends sa{constructor(e=1,t=.4,n=12,i=48,r=2*Math.PI){super(),this.type="TorusGeometry",this.parameters={radius:e,tube:t,radialSegments:n,tubularSegments:i,arc:r},n=Math.floor(n),i=Math.floor(i);const s=[],o=[],a=[],l=[],c=new os,h=new os,u=new os;for(let s=0;s<=n;s++)for(let d=0;d<=i;d++){const p=d/i*r,f=s/n*Math.PI*2;h.x=(e+t*Math.cos(f))*Math.cos(p),h.y=(e+t*Math.cos(f))*Math.sin(p),h.z=t*Math.sin(f),o.push(h.x,h.y,h.z),c.x=e*Math.cos(p),c.y=e*Math.sin(p),u.subVectors(h,c).normalize(),a.push(u.x,u.y,u.z),l.push(d/i),l.push(s/n)}for(let e=1;e<=n;e++)for(let t=1;t<=i;t++){const n=(i+1)*e+t-1,r=(i+1)*(e-1)+t-1,o=(i+1)*(e-1)+t,a=(i+1)*e+t;s.push(n,r,a),s.push(r,o,a)}this.setIndex(s),this.setAttribute("position",new Ko(o,3)),this.setAttribute("normal",new Ko(a,3)),this.setAttribute("uv",new Ko(l,2))}copy(e){return super.copy(e),this.parameters=Object.assign({},e.parameters),this}static fromJSON(e){return new Yh(e.radius,e.tube,e.radialSegments,e.tubularSegments,e.arc)}}class Jh extends sa{constructor(e=1,t=.4,n=64,i=8,r=2,s=3){super(),this.type="TorusKnotGeometry",this.parameters={radius:e,tube:t,tubularSegments:n,radialSegments:i,p:r,q:s},n=Math.floor(n),i=Math.floor(i);const o=[],a=[],l=[],c=[],h=new os,u=new os,d=new os,p=new os,f=new os,m=new os,A=new os;for(let o=0;o<=n;++o){const v=o/n*r*Math.PI*2;g(v,r,s,e,d),g(v+.01,r,s,e,p),m.subVectors(p,d),A.addVectors(p,d),f.crossVectors(m,A),A.crossVectors(f,m),f.normalize(),A.normalize();for(let e=0;e<=i;++e){const r=e/i*Math.PI*2,s=-t*Math.cos(r),p=t*Math.sin(r);h.x=d.x+(s*A.x+p*f.x),h.y=d.y+(s*A.y+p*f.y),h.z=d.z+(s*A.z+p*f.z),a.push(h.x,h.y,h.z),u.subVectors(h,d).normalize(),l.push(u.x,u.y,u.z),c.push(o/n),c.push(e/i)}}for(let e=1;e<=n;e++)for(let t=1;t<=i;t++){const n=(i+1)*(e-1)+(t-1),r=(i+1)*e+(t-1),s=(i+1)*e+t,a=(i+1)*(e-1)+t;o.push(n,r,a),o.push(r,s,a)}function g(e,t,n,i,r){const s=Math.cos(e),o=Math.sin(e),a=n/t*e,l=Math.cos(a);r.x=i*(2+l)*.5*s,r.y=i*(2+l)*o*.5,r.z=i*Math.sin(a)*.5}this.setIndex(o),this.setAttribute("position",new Ko(a,3)),this.setAttribute("normal",new Ko(l,3)),this.setAttribute("uv",new Ko(c,2))}copy(e){return super.copy(e),this.parameters=Object.assign({},e.parameters),this}static fromJSON(e){return new Jh(e.radius,e.tube,e.tubularSegments,e.radialSegments,e.p,e.q)}}class Kh extends sa{constructor(e=new Yc(new os(-1,-1,0),new os(-1,1,0),new os(1,1,0)),t=64,n=1,i=8,r=!1){super(),this.type="TubeGeometry",this.parameters={path:e,tubularSegments:t,radius:n,radialSegments:i,closed:r};const s=e.computeFrenetFrames(t,r);this.tangents=s.tangents,this.normals=s.normals,this.binormals=s.binormals;const o=new os,a=new os,l=new Tr;let c=new os;const h=[],u=[],d=[],p=[];function f(r){c=e.getPointAt(r/t,c);const l=s.normals[r],d=s.binormals[r];for(let e=0;e<=i;e++){const t=e/i*Math.PI*2,r=Math.sin(t),s=-Math.cos(t);a.x=s*l.x+r*d.x,a.y=s*l.y+r*d.y,a.z=s*l.z+r*d.z,a.normalize(),u.push(a.x,a.y,a.z),o.x=c.x+n*a.x,o.y=c.y+n*a.y,o.z=c.z+n*a.z,h.push(o.x,o.y,o.z)}}!function(){for(let e=0;e<t;e++)f(e);f(!1===r?t:0),function(){for(let e=0;e<=t;e++)for(let n=0;n<=i;n++)l.x=e/t,l.y=n/i,d.push(l.x,l.y)}(),function(){for(let e=1;e<=t;e++)for(let t=1;t<=i;t++){const n=(i+1)*(e-1)+(t-1),r=(i+1)*e+(t-1),s=(i+1)*e+t,o=(i+1)*(e-1)+t;p.push(n,r,o),p.push(r,s,o)}}()}(),this.setIndex(p),this.setAttribute("position",new Ko(h,3)),this.setAttribute("normal",new Ko(u,3)),this.setAttribute("uv",new Ko(d,2))}copy(e){return super.copy(e),this.parameters=Object.assign({},e.parameters),this}toJSON(){const e=super.toJSON();return e.path=this.parameters.path.toJSON(),e}static fromJSON(e){return new Kh((new Kc[e.path.type]).fromJSON(e.path),e.tubularSegments,e.radius,e.radialSegments,e.closed)}}class Zh extends sa{constructor(e=null){if(super(),this.type="WireframeGeometry",this.parameters={geometry:e},null!==e){const t=[],n=new Set,i=new os,r=new os;if(null!==e.index){const s=e.attributes.position,o=e.index;let a=e.groups;0===a.length&&(a=[{start:0,count:o.count,materialIndex:0}]);for(let e=0,l=a.length;e<l;++e){const l=a[e],c=l.start;for(let e=c,a=c+l.count;e<a;e+=3)for(let a=0;a<3;a++){const l=o.getX(e+a),c=o.getX(e+(a+1)%3);i.fromBufferAttribute(s,l),r.fromBufferAttribute(s,c),!0===$h(i,r,n)&&(t.push(i.x,i.y,i.z),t.push(r.x,r.y,r.z))}}}else{const s=e.attributes.position;for(let e=0,o=s.count/3;e<o;e++)for(let o=0;o<3;o++){const a=3*e+o,l=3*e+(o+1)%3;i.fromBufferAttribute(s,a),r.fromBufferAttribute(s,l),!0===$h(i,r,n)&&(t.push(i.x,i.y,i.z),t.push(r.x,r.y,r.z))}}this.setAttribute("position",new Ko(t,3))}}copy(e){return super.copy(e),this.parameters=Object.assign({},e.parameters),this}}function $h(e,t,n){const i=`${e.x},${e.y},${e.z}-${t.x},${t.y},${t.z}`,r=`${t.x},${t.y},${t.z}-${e.x},${e.y},${e.z}`;return!0!==n.has(i)&&!0!==n.has(r)&&(n.add(i),n.add(r),!0)}var eu=Object.freeze({__proto__:null,BoxGeometry:ya,CapsuleGeometry:th,CircleGeometry:nh,ConeGeometry:rh,CylinderGeometry:ih,DodecahedronGeometry:oh,EdgesGeometry:uh,ExtrudeGeometry:Qh,IcosahedronGeometry:Gh,LatheGeometry:eh,OctahedronGeometry:Hh,PlaneGeometry:Vh,PolyhedronGeometry:sh,RingGeometry:jh,ShapeGeometry:Wh,SphereGeometry:qh,TetrahedronGeometry:Xh,TorusGeometry:Yh,TorusKnotGeometry:Jh,TubeGeometry:Kh,WireframeGeometry:Zh});class tu extends Lo{constructor(e){super(),this.isShadowMaterial=!0,this.type="ShadowMaterial",this.color=new To(0),this.transparent=!0,this.fog=!0,this.setValues(e)}copy(e){return super.copy(e),this.color.copy(e.color),this.fog=e.fog,this}}class nu extends wa{constructor(e){super(e),this.isRawShaderMaterial=!0,this.type="RawShaderMaterial"}}class iu extends Lo{constructor(e){super(),this.isMeshStandardMaterial=!0,this.type="MeshStandardMaterial",this.defines={STANDARD:""},this.color=new To(16777215),this.roughness=1,this.metalness=0,this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new To(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=Mi,this.normalScale=new Tr(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.roughnessMap=null,this.metalnessMap=null,this.alphaMap=null,this.envMap=null,this.envMapRotation=new Ws,this.envMapIntensity=1,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.flatShading=!1,this.fog=!0,this.setValues(e)}copy(e){return super.copy(e),this.defines={STANDARD:""},this.color.copy(e.color),this.roughness=e.roughness,this.metalness=e.metalness,this.map=e.map,this.lightMap=e.lightMap,this.lightMapIntensity=e.lightMapIntensity,this.aoMap=e.aoMap,this.aoMapIntensity=e.aoMapIntensity,this.emissive.copy(e.emissive),this.emissiveMap=e.emissiveMap,this.emissiveIntensity=e.emissiveIntensity,this.bumpMap=e.bumpMap,this.bumpScale=e.bumpScale,this.normalMap=e.normalMap,this.normalMapType=e.normalMapType,this.normalScale.copy(e.normalScale),this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.roughnessMap=e.roughnessMap,this.metalnessMap=e.metalnessMap,this.alphaMap=e.alphaMap,this.envMap=e.envMap,this.envMapRotation.copy(e.envMapRotation),this.envMapIntensity=e.envMapIntensity,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.wireframeLinecap=e.wireframeLinecap,this.wireframeLinejoin=e.wireframeLinejoin,this.flatShading=e.flatShading,this.fog=e.fog,this}}class ru extends iu{constructor(e){super(),this.isMeshPhysicalMaterial=!0,this.defines={STANDARD:"",PHYSICAL:""},this.type="MeshPhysicalMaterial",this.anisotropyRotation=0,this.anisotropyMap=null,this.clearcoatMap=null,this.clearcoatRoughness=0,this.clearcoatRoughnessMap=null,this.clearcoatNormalScale=new Tr(1,1),this.clearcoatNormalMap=null,this.ior=1.5,Object.defineProperty(this,"reflectivity",{get:function(){return Cr(2.5*(this.ior-1)/(this.ior+1),0,1)},set:function(e){this.ior=(1+.4*e)/(1-.4*e)}}),this.iridescenceMap=null,this.iridescenceIOR=1.3,this.iridescenceThicknessRange=[100,400],this.iridescenceThicknessMap=null,this.sheenColor=new To(0),this.sheenColorMap=null,this.sheenRoughness=1,this.sheenRoughnessMap=null,this.transmissionMap=null,this.thickness=0,this.thicknessMap=null,this.attenuationDistance=1/0,this.attenuationColor=new To(1,1,1),this.specularIntensity=1,this.specularIntensityMap=null,this.specularColor=new To(1,1,1),this.specularColorMap=null,this._anisotropy=0,this._clearcoat=0,this._dispersion=0,this._iridescence=0,this._sheen=0,this._transmission=0,this.setValues(e)}get anisotropy(){return this._anisotropy}set anisotropy(e){this._anisotropy>0!=e>0&&this.version++,this._anisotropy=e}get clearcoat(){return this._clearcoat}set clearcoat(e){this._clearcoat>0!=e>0&&this.version++,this._clearcoat=e}get iridescence(){return this._iridescence}set iridescence(e){this._iridescence>0!=e>0&&this.version++,this._iridescence=e}get dispersion(){return this._dispersion}set dispersion(e){this._dispersion>0!=e>0&&this.version++,this._dispersion=e}get sheen(){return this._sheen}set sheen(e){this._sheen>0!=e>0&&this.version++,this._sheen=e}get transmission(){return this._transmission}set transmission(e){this._transmission>0!=e>0&&this.version++,this._transmission=e}copy(e){return super.copy(e),this.defines={STANDARD:"",PHYSICAL:""},this.anisotropy=e.anisotropy,this.anisotropyRotation=e.anisotropyRotation,this.anisotropyMap=e.anisotropyMap,this.clearcoat=e.clearcoat,this.clearcoatMap=e.clearcoatMap,this.clearcoatRoughness=e.clearcoatRoughness,this.clearcoatRoughnessMap=e.clearcoatRoughnessMap,this.clearcoatNormalMap=e.clearcoatNormalMap,this.clearcoatNormalScale.copy(e.clearcoatNormalScale),this.dispersion=e.dispersion,this.ior=e.ior,this.iridescence=e.iridescence,this.iridescenceMap=e.iridescenceMap,this.iridescenceIOR=e.iridescenceIOR,this.iridescenceThicknessRange=[...e.iridescenceThicknessRange],this.iridescenceThicknessMap=e.iridescenceThicknessMap,this.sheen=e.sheen,this.sheenColor.copy(e.sheenColor),this.sheenColorMap=e.sheenColorMap,this.sheenRoughness=e.sheenRoughness,this.sheenRoughnessMap=e.sheenRoughnessMap,this.transmission=e.transmission,this.transmissionMap=e.transmissionMap,this.thickness=e.thickness,this.thicknessMap=e.thicknessMap,this.attenuationDistance=e.attenuationDistance,this.attenuationColor.copy(e.attenuationColor),this.specularIntensity=e.specularIntensity,this.specularIntensityMap=e.specularIntensityMap,this.specularColor.copy(e.specularColor),this.specularColorMap=e.specularColorMap,this}}class su extends Lo{constructor(e){super(),this.isMeshPhongMaterial=!0,this.type="MeshPhongMaterial",this.color=new To(16777215),this.specular=new To(1118481),this.shininess=30,this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new To(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=Mi,this.normalScale=new Tr(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.envMapRotation=new Ws,this.combine=Mt,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.flatShading=!1,this.fog=!0,this.setValues(e)}copy(e){return super.copy(e),this.color.copy(e.color),this.specular.copy(e.specular),this.shininess=e.shininess,this.map=e.map,this.lightMap=e.lightMap,this.lightMapIntensity=e.lightMapIntensity,this.aoMap=e.aoMap,this.aoMapIntensity=e.aoMapIntensity,this.emissive.copy(e.emissive),this.emissiveMap=e.emissiveMap,this.emissiveIntensity=e.emissiveIntensity,this.bumpMap=e.bumpMap,this.bumpScale=e.bumpScale,this.normalMap=e.normalMap,this.normalMapType=e.normalMapType,this.normalScale.copy(e.normalScale),this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.specularMap=e.specularMap,this.alphaMap=e.alphaMap,this.envMap=e.envMap,this.envMapRotation.copy(e.envMapRotation),this.combine=e.combine,this.reflectivity=e.reflectivity,this.refractionRatio=e.refractionRatio,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.wireframeLinecap=e.wireframeLinecap,this.wireframeLinejoin=e.wireframeLinejoin,this.flatShading=e.flatShading,this.fog=e.fog,this}}class ou extends Lo{constructor(e){super(),this.isMeshToonMaterial=!0,this.defines={TOON:""},this.type="MeshToonMaterial",this.color=new To(16777215),this.map=null,this.gradientMap=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new To(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=Mi,this.normalScale=new Tr(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.alphaMap=null,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.fog=!0,this.setValues(e)}copy(e){return super.copy(e),this.color.copy(e.color),this.map=e.map,this.gradientMap=e.gradientMap,this.lightMap=e.lightMap,this.lightMapIntensity=e.lightMapIntensity,this.aoMap=e.aoMap,this.aoMapIntensity=e.aoMapIntensity,this.emissive.copy(e.emissive),this.emissiveMap=e.emissiveMap,this.emissiveIntensity=e.emissiveIntensity,this.bumpMap=e.bumpMap,this.bumpScale=e.bumpScale,this.normalMap=e.normalMap,this.normalMapType=e.normalMapType,this.normalScale.copy(e.normalScale),this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.alphaMap=e.alphaMap,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.wireframeLinecap=e.wireframeLinecap,this.wireframeLinejoin=e.wireframeLinejoin,this.fog=e.fog,this}}class au extends Lo{constructor(e){super(),this.isMeshNormalMaterial=!0,this.type="MeshNormalMaterial",this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=Mi,this.normalScale=new Tr(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.flatShading=!1,this.setValues(e)}copy(e){return super.copy(e),this.bumpMap=e.bumpMap,this.bumpScale=e.bumpScale,this.normalMap=e.normalMap,this.normalMapType=e.normalMapType,this.normalScale.copy(e.normalScale),this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.flatShading=e.flatShading,this}}class lu extends Lo{constructor(e){super(),this.isMeshLambertMaterial=!0,this.type="MeshLambertMaterial",this.color=new To(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new To(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=Mi,this.normalScale=new Tr(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.envMapRotation=new Ws,this.combine=Mt,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.flatShading=!1,this.fog=!0,this.setValues(e)}copy(e){return super.copy(e),this.color.copy(e.color),this.map=e.map,this.lightMap=e.lightMap,this.lightMapIntensity=e.lightMapIntensity,this.aoMap=e.aoMap,this.aoMapIntensity=e.aoMapIntensity,this.emissive.copy(e.emissive),this.emissiveMap=e.emissiveMap,this.emissiveIntensity=e.emissiveIntensity,this.bumpMap=e.bumpMap,this.bumpScale=e.bumpScale,this.normalMap=e.normalMap,this.normalMapType=e.normalMapType,this.normalScale.copy(e.normalScale),this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.specularMap=e.specularMap,this.alphaMap=e.alphaMap,this.envMap=e.envMap,this.envMapRotation.copy(e.envMapRotation),this.combine=e.combine,this.reflectivity=e.reflectivity,this.refractionRatio=e.refractionRatio,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.wireframeLinecap=e.wireframeLinecap,this.wireframeLinejoin=e.wireframeLinejoin,this.flatShading=e.flatShading,this.fog=e.fog,this}}class cu extends Lo{constructor(e){super(),this.isMeshDepthMaterial=!0,this.type="MeshDepthMaterial",this.depthPacking=xi,this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.setValues(e)}copy(e){return super.copy(e),this.depthPacking=e.depthPacking,this.map=e.map,this.alphaMap=e.alphaMap,this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this}}class hu extends Lo{constructor(e){super(),this.isMeshDistanceMaterial=!0,this.type="MeshDistanceMaterial",this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.setValues(e)}copy(e){return super.copy(e),this.map=e.map,this.alphaMap=e.alphaMap,this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this}}class uu extends Lo{constructor(e){super(),this.isMeshMatcapMaterial=!0,this.defines={MATCAP:""},this.type="MeshMatcapMaterial",this.color=new To(16777215),this.matcap=null,this.map=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=Mi,this.normalScale=new Tr(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.alphaMap=null,this.flatShading=!1,this.fog=!0,this.setValues(e)}copy(e){return super.copy(e),this.defines={MATCAP:""},this.color.copy(e.color),this.matcap=e.matcap,this.map=e.map,this.bumpMap=e.bumpMap,this.bumpScale=e.bumpScale,this.normalMap=e.normalMap,this.normalMapType=e.normalMapType,this.normalScale.copy(e.normalScale),this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.alphaMap=e.alphaMap,this.flatShading=e.flatShading,this.fog=e.fog,this}}class du extends ic{constructor(e){super(),this.isLineDashedMaterial=!0,this.type="LineDashedMaterial",this.scale=1,this.dashSize=3,this.gapSize=1,this.setValues(e)}copy(e){return super.copy(e),this.scale=e.scale,this.dashSize=e.dashSize,this.gapSize=e.gapSize,this}}function pu(e,t,n){return!e||!n&&e.constructor===t?e:"number"==typeof t.BYTES_PER_ELEMENT?new t(e):Array.prototype.slice.call(e)}function fu(e){return ArrayBuffer.isView(e)&&!(e instanceof DataView)}function mu(e){const t=e.length,n=new Array(t);for(let e=0;e!==t;++e)n[e]=e;return n.sort((function(t,n){return e[t]-e[n]})),n}function Au(e,t,n){const i=e.length,r=new e.constructor(i);for(let s=0,o=0;o!==i;++s){const i=n[s]*t;for(let n=0;n!==t;++n)r[o++]=e[i+n]}return r}function gu(e,t,n,i){let r=1,s=e[0];for(;void 0!==s&&void 0===s[i];)s=e[r++];if(void 0===s)return;let o=s[i];if(void 0!==o)if(Array.isArray(o))do{o=s[i],void 0!==o&&(t.push(s.time),n.push.apply(n,o)),s=e[r++]}while(void 0!==s);else if(void 0!==o.toArray)do{o=s[i],void 0!==o&&(t.push(s.time),o.toArray(n,n.length)),s=e[r++]}while(void 0!==s);else do{o=s[i],void 0!==o&&(t.push(s.time),n.push(o)),s=e[r++]}while(void 0!==s)}const vu={convertArray:pu,isTypedArray:fu,getKeyframeOrder:mu,sortedArray:Au,flattenJSON:gu,subclip:function(e,t,n,i,r=30){const s=e.clone();s.name=t;const o=[];for(let e=0;e<s.tracks.length;++e){const t=s.tracks[e],a=t.getValueSize(),l=[],c=[];for(let e=0;e<t.times.length;++e){const s=t.times[e]*r;if(!(s<n||s>=i)){l.push(t.times[e]);for(let n=0;n<a;++n)c.push(t.values[e*a+n])}}0!==l.length&&(t.times=pu(l,t.times.constructor),t.values=pu(c,t.values.constructor),o.push(t))}s.tracks=o;let a=1/0;for(let e=0;e<s.tracks.length;++e)a>s.tracks[e].times[0]&&(a=s.tracks[e].times[0]);for(let e=0;e<s.tracks.length;++e)s.tracks[e].shift(-1*a);return s.resetDuration(),s},makeClipAdditive:function(e,t=0,n=e,i=30){i<=0&&(i=30);const r=n.tracks.length,s=t/i;for(let t=0;t<r;++t){const i=n.tracks[t],r=i.ValueTypeName;if("bool"===r||"string"===r)continue;const o=e.tracks.find((function(e){return e.name===i.name&&e.ValueTypeName===r}));if(void 0===o)continue;let a=0;const l=i.getValueSize();i.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline&&(a=l/3);let c=0;const h=o.getValueSize();o.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline&&(c=h/3);const u=i.times.length-1;let d;if(s<=i.times[0]){const e=a,t=l-a;d=i.values.slice(e,t)}else if(s>=i.times[u]){const e=u*l+a,t=e+l-a;d=i.values.slice(e,t)}else{const e=i.createInterpolant(),t=a,n=l-a;e.evaluate(s),d=e.resultBuffer.slice(t,n)}"quaternion"===r&&(new ss).fromArray(d).normalize().conjugate().toArray(d);const p=o.times.length;for(let e=0;e<p;++e){const t=e*h+c;if("quaternion"===r)ss.multiplyQuaternionsFlat(o.values,t,d,0,o.values,t);else{const e=h-2*c;for(let n=0;n<e;++n)o.values[t+n]-=d[n]}}}return e.blendMode=vi,e}};class yu{constructor(e,t,n,i){this.parameterPositions=e,this._cachedIndex=0,this.resultBuffer=void 0!==i?i:new t.constructor(n),this.sampleValues=t,this.valueSize=n,this.settings=null,this.DefaultSettings_={}}evaluate(e){const t=this.parameterPositions;let n=this._cachedIndex,i=t[n],r=t[n-1];e:{t:{let s;n:{i:if(!(e<i)){for(let s=n+2;;){if(void 0===i){if(e<r)break i;return n=t.length,this._cachedIndex=n,this.copySampleValue_(n-1)}if(n===s)break;if(r=i,i=t[++n],e<i)break t}s=t.length;break n}if(e>=r)break e;{const o=t[1];e<o&&(n=2,r=o);for(let s=n-2;;){if(void 0===r)return this._cachedIndex=0,this.copySampleValue_(0);if(n===s)break;if(i=r,r=t[--n-1],e>=r)break t}s=n,n=0}}for(;n<s;){const i=n+s>>>1;e<t[i]?s=i:n=i+1}if(i=t[n],r=t[n-1],void 0===r)return this._cachedIndex=0,this.copySampleValue_(0);if(void 0===i)return n=t.length,this._cachedIndex=n,this.copySampleValue_(n-1)}this._cachedIndex=n,this.intervalChanged_(n,r,i)}return this.interpolate_(n,r,e,i)}getSettings_(){return this.settings||this.DefaultSettings_}copySampleValue_(e){const t=this.resultBuffer,n=this.sampleValues,i=this.valueSize,r=e*i;for(let e=0;e!==i;++e)t[e]=n[r+e];return t}interpolate_(){throw new Error("call to abstract method")}intervalChanged_(){}}class Eu extends yu{constructor(e,t,n,i){super(e,t,n,i),this._weightPrev=-0,this._offsetPrev=-0,this._weightNext=-0,this._offsetNext=-0,this.DefaultSettings_={endingStart:fi,endingEnd:fi}}intervalChanged_(e,t,n){const i=this.parameterPositions;let r=e-2,s=e+1,o=i[r],a=i[s];if(void 0===o)switch(this.getSettings_().endingStart){case mi:r=e,o=2*t-n;break;case Ai:r=i.length-2,o=t+i[r]-i[r+1];break;default:r=e,o=n}if(void 0===a)switch(this.getSettings_().endingEnd){case mi:s=e,a=2*n-t;break;case Ai:s=1,a=n+i[1]-i[0];break;default:s=e-1,a=t}const l=.5*(n-t),c=this.valueSize;this._weightPrev=l/(t-o),this._weightNext=l/(a-n),this._offsetPrev=r*c,this._offsetNext=s*c}interpolate_(e,t,n,i){const r=this.resultBuffer,s=this.sampleValues,o=this.valueSize,a=e*o,l=a-o,c=this._offsetPrev,h=this._offsetNext,u=this._weightPrev,d=this._weightNext,p=(n-t)/(i-t),f=p*p,m=f*p,A=-u*m+2*u*f-u*p,g=(1+u)*m+(-1.5-2*u)*f+(-.5+u)*p+1,v=(-1-d)*m+(1.5+d)*f+.5*p,y=d*m-d*f;for(let e=0;e!==o;++e)r[e]=A*s[c+e]+g*s[l+e]+v*s[a+e]+y*s[h+e];return r}}class bu extends yu{constructor(e,t,n,i){super(e,t,n,i)}interpolate_(e,t,n,i){const r=this.resultBuffer,s=this.sampleValues,o=this.valueSize,a=e*o,l=a-o,c=(n-t)/(i-t),h=1-c;for(let e=0;e!==o;++e)r[e]=s[l+e]*h+s[a+e]*c;return r}}class xu extends yu{constructor(e,t,n,i){super(e,t,n,i)}interpolate_(e){return this.copySampleValue_(e-1)}}class Cu{constructor(e,t,n,i){if(void 0===e)throw new Error("THREE.KeyframeTrack: track name is undefined");if(void 0===t||0===t.length)throw new Error("THREE.KeyframeTrack: no keyframes in track named "+e);this.name=e,this.times=pu(t,this.TimeBufferType),this.values=pu(n,this.ValueBufferType),this.setInterpolation(i||this.DefaultInterpolation)}static toJSON(e){const t=e.constructor;let n;if(t.toJSON!==this.toJSON)n=t.toJSON(e);else{n={name:e.name,times:pu(e.times,Array),values:pu(e.values,Array)};const t=e.getInterpolation();t!==e.DefaultInterpolation&&(n.interpolation=t)}return n.type=e.ValueTypeName,n}InterpolantFactoryMethodDiscrete(e){return new xu(this.times,this.values,this.getValueSize(),e)}InterpolantFactoryMethodLinear(e){return new bu(this.times,this.values,this.getValueSize(),e)}InterpolantFactoryMethodSmooth(e){return new Eu(this.times,this.values,this.getValueSize(),e)}setInterpolation(e){let t;switch(e){case ui:t=this.InterpolantFactoryMethodDiscrete;break;case di:t=this.InterpolantFactoryMethodLinear;break;case pi:t=this.InterpolantFactoryMethodSmooth}if(void 0===t){const t="unsupported interpolation for "+this.ValueTypeName+" keyframe track named "+this.name;if(void 0===this.createInterpolant){if(e===this.DefaultInterpolation)throw new Error(t);this.setInterpolation(this.DefaultInterpolation)}return console.warn("THREE.KeyframeTrack:",t),this}return this.createInterpolant=t,this}getInterpolation(){switch(this.createInterpolant){case this.InterpolantFactoryMethodDiscrete:return ui;case this.InterpolantFactoryMethodLinear:return di;case this.InterpolantFactoryMethodSmooth:return pi}}getValueSize(){return this.values.length/this.times.length}shift(e){if(0!==e){const t=this.times;for(let n=0,i=t.length;n!==i;++n)t[n]+=e}return this}scale(e){if(1!==e){const t=this.times;for(let n=0,i=t.length;n!==i;++n)t[n]*=e}return this}trim(e,t){const n=this.times,i=n.length;let r=0,s=i-1;for(;r!==i&&n[r]<e;)++r;for(;-1!==s&&n[s]>t;)--s;if(++s,0!==r||s!==i){r>=s&&(s=Math.max(s,1),r=s-1);const e=this.getValueSize();this.times=n.slice(r,s),this.values=this.values.slice(r*e,s*e)}return this}validate(){let e=!0;const t=this.getValueSize();t-Math.floor(t)!=0&&(console.error("THREE.KeyframeTrack: Invalid value size in track.",this),e=!1);const n=this.times,i=this.values,r=n.length;0===r&&(console.error("THREE.KeyframeTrack: Track is empty.",this),e=!1);let s=null;for(let t=0;t!==r;t++){const i=n[t];if("number"==typeof i&&isNaN(i)){console.error("THREE.KeyframeTrack: Time is not a valid number.",this,t,i),e=!1;break}if(null!==s&&s>i){console.error("THREE.KeyframeTrack: Out of order keys.",this,t,i,s),e=!1;break}s=i}if(void 0!==i&&fu(i))for(let t=0,n=i.length;t!==n;++t){const n=i[t];if(isNaN(n)){console.error("THREE.KeyframeTrack: Value is not a valid number.",this,t,n),e=!1;break}}return e}optimize(){const e=this.times.slice(),t=this.values.slice(),n=this.getValueSize(),i=this.getInterpolation()===pi,r=e.length-1;let s=1;for(let o=1;o<r;++o){let r=!1;const a=e[o];if(a!==e[o+1]&&(1!==o||a!==e[0]))if(i)r=!0;else{const e=o*n,i=e-n,s=e+n;for(let o=0;o!==n;++o){const n=t[e+o];if(n!==t[i+o]||n!==t[s+o]){r=!0;break}}}if(r){if(o!==s){e[s]=e[o];const i=o*n,r=s*n;for(let e=0;e!==n;++e)t[r+e]=t[i+e]}++s}}if(r>0){e[s]=e[r];for(let e=r*n,i=s*n,o=0;o!==n;++o)t[i+o]=t[e+o];++s}return s!==e.length?(this.times=e.slice(0,s),this.values=t.slice(0,s*n)):(this.times=e,this.values=t),this}clone(){const e=this.times.slice(),t=this.values.slice(),n=new(0,this.constructor)(this.name,e,t);return n.createInterpolant=this.createInterpolant,n}}Cu.prototype.TimeBufferType=Float32Array,Cu.prototype.ValueBufferType=Float32Array,Cu.prototype.DefaultInterpolation=di;class wu extends Cu{constructor(e,t,n){super(e,t,n)}}wu.prototype.ValueTypeName="bool",wu.prototype.ValueBufferType=Array,wu.prototype.DefaultInterpolation=ui,wu.prototype.InterpolantFactoryMethodLinear=void 0,wu.prototype.InterpolantFactoryMethodSmooth=void 0;class _u extends Cu{}_u.prototype.ValueTypeName="color";class Mu extends Cu{}Mu.prototype.ValueTypeName="number";class Iu extends yu{constructor(e,t,n,i){super(e,t,n,i)}interpolate_(e,t,n,i){const r=this.resultBuffer,s=this.sampleValues,o=this.valueSize,a=(n-t)/(i-t);let l=e*o;for(let e=l+o;l!==e;l+=4)ss.slerpFlat(r,0,s,l-o,s,l,a);return r}}class Su extends Cu{InterpolantFactoryMethodLinear(e){return new Iu(this.times,this.values,this.getValueSize(),e)}}Su.prototype.ValueTypeName="quaternion",Su.prototype.InterpolantFactoryMethodSmooth=void 0;class Tu extends Cu{constructor(e,t,n){super(e,t,n)}}Tu.prototype.ValueTypeName="string",Tu.prototype.ValueBufferType=Array,Tu.prototype.DefaultInterpolation=ui,Tu.prototype.InterpolantFactoryMethodLinear=void 0,Tu.prototype.InterpolantFactoryMethodSmooth=void 0;class Bu extends Cu{}Bu.prototype.ValueTypeName="vector";class Ru{constructor(e="",t=-1,n=[],i=gi){this.name=e,this.tracks=n,this.duration=t,this.blendMode=i,this.uuid=xr(),this.duration<0&&this.resetDuration()}static parse(e){const t=[],n=e.tracks,i=1/(e.fps||1);for(let e=0,r=n.length;e!==r;++e)t.push(Lu(n[e]).scale(i));const r=new this(e.name,e.duration,t,e.blendMode);return r.uuid=e.uuid,r}static toJSON(e){const t=[],n=e.tracks,i={name:e.name,duration:e.duration,tracks:t,uuid:e.uuid,blendMode:e.blendMode};for(let e=0,i=n.length;e!==i;++e)t.push(Cu.toJSON(n[e]));return i}static CreateFromMorphTargetSequence(e,t,n,i){const r=t.length,s=[];for(let e=0;e<r;e++){let o=[],a=[];o.push((e+r-1)%r,e,(e+1)%r),a.push(0,1,0);const l=mu(o);o=Au(o,1,l),a=Au(a,1,l),i||0!==o[0]||(o.push(r),a.push(a[0])),s.push(new Mu(".morphTargetInfluences["+t[e].name+"]",o,a).scale(1/n))}return new this(e,-1,s)}static findByName(e,t){let n=e;if(!Array.isArray(e)){const t=e;n=t.geometry&&t.geometry.animations||t.animations}for(let e=0;e<n.length;e++)if(n[e].name===t)return n[e];return null}static CreateClipsFromMorphTargetSequences(e,t,n){const i={},r=/^([\w-]*?)([\d]+)$/;for(let t=0,n=e.length;t<n;t++){const n=e[t],s=n.name.match(r);if(s&&s.length>1){const e=s[1];let t=i[e];t||(i[e]=t=[]),t.push(n)}}const s=[];for(const e in i)s.push(this.CreateFromMorphTargetSequence(e,i[e],t,n));return s}static parseAnimation(e,t){if(!e)return console.error("THREE.AnimationClip: No animation in JSONLoader data."),null;const n=function(e,t,n,i,r){if(0!==n.length){const s=[],o=[];gu(n,s,o,i),0!==s.length&&r.push(new e(t,s,o))}},i=[],r=e.name||"default",s=e.fps||30,o=e.blendMode;let a=e.length||-1;const l=e.hierarchy||[];for(let e=0;e<l.length;e++){const r=l[e].keys;if(r&&0!==r.length)if(r[0].morphTargets){const e={};let t;for(t=0;t<r.length;t++)if(r[t].morphTargets)for(let n=0;n<r[t].morphTargets.length;n++)e[r[t].morphTargets[n]]=-1;for(const n in e){const e=[],s=[];for(let i=0;i!==r[t].morphTargets.length;++i){const i=r[t];e.push(i.time),s.push(i.morphTarget===n?1:0)}i.push(new Mu(".morphTargetInfluence["+n+"]",e,s))}a=e.length*s}else{const s=".bones["+t[e].name+"]";n(Bu,s+".position",r,"pos",i),n(Su,s+".quaternion",r,"rot",i),n(Bu,s+".scale",r,"scl",i)}}return 0===i.length?null:new this(r,a,i,o)}resetDuration(){let e=0;for(let t=0,n=this.tracks.length;t!==n;++t){const n=this.tracks[t];e=Math.max(e,n.times[n.times.length-1])}return this.duration=e,this}trim(){for(let e=0;e<this.tracks.length;e++)this.tracks[e].trim(0,this.duration);return this}validate(){let e=!0;for(let t=0;t<this.tracks.length;t++)e=e&&this.tracks[t].validate();return e}optimize(){for(let e=0;e<this.tracks.length;e++)this.tracks[e].optimize();return this}clone(){const e=[];for(let t=0;t<this.tracks.length;t++)e.push(this.tracks[t].clone());return new this.constructor(this.name,this.duration,e,this.blendMode)}toJSON(){return this.constructor.toJSON(this)}}function Lu(e){if(void 0===e.type)throw new Error("THREE.KeyframeTrack: track type undefined, can not parse");const t=function(e){switch(e.toLowerCase()){case"scalar":case"double":case"float":case"number":case"integer":return Mu;case"vector":case"vector2":case"vector3":case"vector4":return Bu;case"color":return _u;case"quaternion":return Su;case"bool":case"boolean":return wu;case"string":return Tu}throw new Error("THREE.KeyframeTrack: Unsupported typeName: "+e)}(e.type);if(void 0===e.times){const t=[],n=[];gu(e.keys,t,n,"value"),e.times=t,e.values=n}return void 0!==t.parse?t.parse(e):new t(e.name,e.times,e.values,e.interpolation)}const Du={enabled:!1,files:{},add:function(e,t){!1!==this.enabled&&(this.files[e]=t)},get:function(e){if(!1!==this.enabled)return this.files[e]},remove:function(e){delete this.files[e]},clear:function(){this.files={}}};class Pu{constructor(e,t,n){const i=this;let r,s=!1,o=0,a=0;const l=[];this.onStart=void 0,this.onLoad=e,this.onProgress=t,this.onError=n,this.itemStart=function(e){a++,!1===s&&void 0!==i.onStart&&i.onStart(e,o,a),s=!0},this.itemEnd=function(e){o++,void 0!==i.onProgress&&i.onProgress(e,o,a),o===a&&(s=!1,void 0!==i.onLoad&&i.onLoad())},this.itemError=function(e){void 0!==i.onError&&i.onError(e)},this.resolveURL=function(e){return r?r(e):e},this.setURLModifier=function(e){return r=e,this},this.addHandler=function(e,t){return l.push(e,t),this},this.removeHandler=function(e){const t=l.indexOf(e);return-1!==t&&l.splice(t,2),this},this.getHandler=function(e){for(let t=0,n=l.length;t<n;t+=2){const n=l[t],i=l[t+1];if(n.global&&(n.lastIndex=0),n.test(e))return i}return null}}}const Uu=new Pu;class ku{constructor(e){this.manager=void 0!==e?e:Uu,this.crossOrigin="anonymous",this.withCredentials=!1,this.path="",this.resourcePath="",this.requestHeader={}}load(){}loadAsync(e,t){const n=this;return new Promise((function(i,r){n.load(e,i,t,r)}))}parse(){}setCrossOrigin(e){return this.crossOrigin=e,this}setWithCredentials(e){return this.withCredentials=e,this}setPath(e){return this.path=e,this}setResourcePath(e){return this.resourcePath=e,this}setRequestHeader(e){return this.requestHeader=e,this}}ku.DEFAULT_MATERIAL_NAME="__DEFAULT";const Nu={};class Ou extends Error{constructor(e,t){super(e),this.response=t}}class Fu extends ku{constructor(e){super(e)}load(e,t,n,i){void 0===e&&(e=""),void 0!==this.path&&(e=this.path+e),e=this.manager.resolveURL(e);const r=Du.get(e);if(void 0!==r)return this.manager.itemStart(e),setTimeout((()=>{t&&t(r),this.manager.itemEnd(e)}),0),r;if(void 0!==Nu[e])return void Nu[e].push({onLoad:t,onProgress:n,onError:i});Nu[e]=[],Nu[e].push({onLoad:t,onProgress:n,onError:i});const s=new Request(e,{headers:new Headers(this.requestHeader),credentials:this.withCredentials?"include":"same-origin"}),o=this.mimeType,a=this.responseType;fetch(s).then((t=>{if(200===t.status||0===t.status){if(0===t.status&&console.warn("THREE.FileLoader: HTTP Status 0 received."),"undefined"==typeof ReadableStream||void 0===t.body||void 0===t.body.getReader)return t;const n=Nu[e],i=t.body.getReader(),r=t.headers.get("X-File-Size")||t.headers.get("Content-Length"),s=r?parseInt(r):0,o=0!==s;let a=0;const l=new ReadableStream({start(e){!function t(){i.read().then((({done:i,value:r})=>{if(i)e.close();else{a+=r.byteLength;const i=new ProgressEvent("progress",{lengthComputable:o,loaded:a,total:s});for(let e=0,t=n.length;e<t;e++){const t=n[e];t.onProgress&&t.onProgress(i)}e.enqueue(r),t()}}),(t=>{e.error(t)}))}()}});return new Response(l)}throw new Ou(`fetch for "${t.url}" responded with ${t.status}: ${t.statusText}`,t)})).then((e=>{switch(a){case"arraybuffer":return e.arrayBuffer();case"blob":return e.blob();case"document":return e.text().then((e=>(new DOMParser).parseFromString(e,o)));case"json":return e.json();default:if(void 0===o)return e.text();{const t=/charset="?([^;"\s]*)"?/i.exec(o),n=t&&t[1]?t[1].toLowerCase():void 0,i=new TextDecoder(n);return e.arrayBuffer().then((e=>i.decode(e)))}}})).then((t=>{Du.add(e,t);const n=Nu[e];delete Nu[e];for(let e=0,i=n.length;e<i;e++){const i=n[e];i.onLoad&&i.onLoad(t)}})).catch((t=>{const n=Nu[e];if(void 0===n)throw this.manager.itemError(e),t;delete Nu[e];for(let e=0,i=n.length;e<i;e++){const i=n[e];i.onError&&i.onError(t)}this.manager.itemError(e)})).finally((()=>{this.manager.itemEnd(e)})),this.manager.itemStart(e)}setResponseType(e){return this.responseType=e,this}setMimeType(e){return this.mimeType=e,this}}class Qu extends ku{constructor(e){super(e)}load(e,t,n,i){const r=this,s=new Fu(this.manager);s.setPath(this.path),s.setRequestHeader(this.requestHeader),s.setWithCredentials(this.withCredentials),s.load(e,(function(n){try{t(r.parse(JSON.parse(n)))}catch(t){i?i(t):console.error(t),r.manager.itemError(e)}}),n,i)}parse(e){const t=[];for(let n=0;n<e.length;n++){const i=Ru.parse(e[n]);t.push(i)}return t}}class zu extends ku{constructor(e){super(e)}load(e,t,n,i){const r=this,s=[],o=new Ic,a=new Fu(this.manager);a.setPath(this.path),a.setResponseType("arraybuffer"),a.setRequestHeader(this.requestHeader),a.setWithCredentials(r.withCredentials);let l=0;function c(c){a.load(e[c],(function(e){const n=r.parse(e,!0);s[c]={width:n.width,height:n.height,format:n.format,mipmaps:n.mipmaps},l+=1,6===l&&(1===n.mipmapCount&&(o.minFilter=$t),o.image=s,o.format=n.format,o.needsUpdate=!0,t&&t(o))}),n,i)}if(Array.isArray(e))for(let t=0,n=e.length;t<n;++t)c(t);else a.load(e,(function(e){const n=r.parse(e,!0);if(n.isCubemap){const e=n.mipmaps.length/n.mipmapCount;for(let t=0;t<e;t++){s[t]={mipmaps:[]};for(let e=0;e<n.mipmapCount;e++)s[t].mipmaps.push(n.mipmaps[t*n.mipmapCount+e]),s[t].format=n.format,s[t].width=n.width,s[t].height=n.height}o.image=s}else o.image.width=n.width,o.image.height=n.height,o.mipmaps=n.mipmaps;1===n.mipmapCount&&(o.minFilter=$t),o.format=n.format,o.needsUpdate=!0,t&&t(o)}),n,i);return o}}class Gu extends ku{constructor(e){super(e)}load(e,t,n,i){void 0!==this.path&&(e=this.path+e),e=this.manager.resolveURL(e);const r=this,s=Du.get(e);if(void 0!==s)return r.manager.itemStart(e),setTimeout((function(){t&&t(s),r.manager.itemEnd(e)}),0),s;const o=Ur("img");function a(){c(),Du.add(e,this),t&&t(this),r.manager.itemEnd(e)}function l(t){c(),i&&i(t),r.manager.itemError(e),r.manager.itemEnd(e)}function c(){o.removeEventListener("load",a,!1),o.removeEventListener("error",l,!1)}return o.addEventListener("load",a,!1),o.addEventListener("error",l,!1),"data:"!==e.slice(0,5)&&void 0!==this.crossOrigin&&(o.crossOrigin=this.crossOrigin),r.manager.itemStart(e),o.src=e,o}}class Hu extends ku{constructor(e){super(e)}load(e,t,n,i){const r=new La;r.colorSpace=Ti;const s=new Gu(this.manager);s.setCrossOrigin(this.crossOrigin),s.setPath(this.path);let o=0;function a(n){s.load(e[n],(function(e){r.images[n]=e,o++,6===o&&(r.needsUpdate=!0,t&&t(r))}),void 0,i)}for(let t=0;t<e.length;++t)a(t);return r}}class Vu extends ku{constructor(e){super(e)}load(e,t,n,i){const r=this,s=new yl,o=new Fu(this.manager);return o.setResponseType("arraybuffer"),o.setRequestHeader(this.requestHeader),o.setPath(this.path),o.setWithCredentials(r.withCredentials),o.load(e,(function(e){let n;try{n=r.parse(e)}catch(e){if(void 0===i)return void console.error(e);i(e)}void 0!==n.image?s.image=n.image:void 0!==n.data&&(s.image.width=n.width,s.image.height=n.height,s.image.data=n.data),s.wrapS=void 0!==n.wrapS?n.wrapS:Wt,s.wrapT=void 0!==n.wrapT?n.wrapT:Wt,s.magFilter=void 0!==n.magFilter?n.magFilter:$t,s.minFilter=void 0!==n.minFilter?n.minFilter:$t,s.anisotropy=void 0!==n.anisotropy?n.anisotropy:1,void 0!==n.colorSpace&&(s.colorSpace=n.colorSpace),void 0!==n.flipY&&(s.flipY=n.flipY),void 0!==n.format&&(s.format=n.format),void 0!==n.type&&(s.type=n.type),void 0!==n.mipmaps&&(s.mipmaps=n.mipmaps,s.minFilter=nn),1===n.mipmapCount&&(s.minFilter=$t),void 0!==n.generateMipmaps&&(s.generateMipmaps=n.generateMipmaps),s.needsUpdate=!0,t&&t(s,n)}),n,i),s}}class ju extends ku{constructor(e){super(e)}load(e,t,n,i){const r=new Kr,s=new Gu(this.manager);return s.setCrossOrigin(this.crossOrigin),s.setPath(this.path),s.load(e,(function(e){r.image=e,r.needsUpdate=!0,void 0!==t&&t(r)}),n,i),r}}class Wu extends co{constructor(e,t=1){super(),this.isLight=!0,this.type="Light",this.color=new To(e),this.intensity=t}dispose(){}copy(e,t){return super.copy(e,t),this.color.copy(e.color),this.intensity=e.intensity,this}toJSON(e){const t=super.toJSON(e);return t.object.color=this.color.getHex(),t.object.intensity=this.intensity,void 0!==this.groundColor&&(t.object.groundColor=this.groundColor.getHex()),void 0!==this.distance&&(t.object.distance=this.distance),void 0!==this.angle&&(t.object.angle=this.angle),void 0!==this.decay&&(t.object.decay=this.decay),void 0!==this.penumbra&&(t.object.penumbra=this.penumbra),void 0!==this.shadow&&(t.object.shadow=this.shadow.toJSON()),void 0!==this.target&&(t.object.target=this.target.uuid),t}}class qu extends Wu{constructor(e,t,n){super(e,n),this.isHemisphereLight=!0,this.type="HemisphereLight",this.position.copy(co.DEFAULT_UP),this.updateMatrix(),this.groundColor=new To(t)}copy(e,t){return super.copy(e,t),this.groundColor.copy(e.groundColor),this}}const Xu=new ks,Yu=new os,Ju=new os;class Ku{constructor(e){this.camera=e,this.intensity=1,this.bias=0,this.normalBias=0,this.radius=1,this.blurSamples=8,this.mapSize=new Tr(512,512),this.map=null,this.mapPass=null,this.matrix=new ks,this.autoUpdate=!0,this.needsUpdate=!1,this._frustum=new Ol,this._frameExtents=new Tr(1,1),this._viewportCount=1,this._viewports=[new Zr(0,0,1,1)]}getViewportCount(){return this._viewportCount}getFrustum(){return this._frustum}updateMatrices(e){const t=this.camera,n=this.matrix;Yu.setFromMatrixPosition(e.matrixWorld),t.position.copy(Yu),Ju.setFromMatrixPosition(e.target.matrixWorld),t.lookAt(Ju),t.updateMatrixWorld(),Xu.multiplyMatrices(t.projectionMatrix,t.matrixWorldInverse),this._frustum.setFromProjectionMatrix(Xu),n.set(.5,0,0,.5,0,.5,0,.5,0,0,.5,.5,0,0,0,1),n.multiply(Xu)}getViewport(e){return this._viewports[e]}getFrameExtents(){return this._frameExtents}dispose(){this.map&&this.map.dispose(),this.mapPass&&this.mapPass.dispose()}copy(e){return this.camera=e.camera.clone(),this.intensity=e.intensity,this.bias=e.bias,this.radius=e.radius,this.mapSize.copy(e.mapSize),this}clone(){return(new this.constructor).copy(this)}toJSON(){const e={};return 1!==this.intensity&&(e.intensity=this.intensity),0!==this.bias&&(e.bias=this.bias),0!==this.normalBias&&(e.normalBias=this.normalBias),1!==this.radius&&(e.radius=this.radius),512===this.mapSize.x&&512===this.mapSize.y||(e.mapSize=this.mapSize.toArray()),e.camera=this.camera.toJSON(!1).object,delete e.camera.matrix,e}}class Zu extends Ku{constructor(){super(new Ta(50,1,.5,500)),this.isSpotLightShadow=!0,this.focus=1}updateMatrices(e){const t=this.camera,n=2*br*e.angle*this.focus,i=this.mapSize.width/this.mapSize.height,r=e.distance||t.far;n===t.fov&&i===t.aspect&&r===t.far||(t.fov=n,t.aspect=i,t.far=r,t.updateProjectionMatrix()),super.updateMatrices(e)}copy(e){return super.copy(e),this.focus=e.focus,this}}class $u extends Wu{constructor(e,t,n=0,i=Math.PI/3,r=0,s=2){super(e,t),this.isSpotLight=!0,this.type="SpotLight",this.position.copy(co.DEFAULT_UP),this.updateMatrix(),this.target=new co,this.distance=n,this.angle=i,this.penumbra=r,this.decay=s,this.map=null,this.shadow=new Zu}get power(){return this.intensity*Math.PI}set power(e){this.intensity=e/Math.PI}dispose(){this.shadow.dispose()}copy(e,t){return super.copy(e,t),this.distance=e.distance,this.angle=e.angle,this.penumbra=e.penumbra,this.decay=e.decay,this.target=e.target.clone(),this.shadow=e.shadow.clone(),this}}const ed=new ks,td=new os,nd=new os;class id extends Ku{constructor(){super(new Ta(90,1,.5,500)),this.isPointLightShadow=!0,this._frameExtents=new Tr(4,2),this._viewportCount=6,this._viewports=[new Zr(2,1,1,1),new Zr(0,1,1,1),new Zr(3,1,1,1),new Zr(1,1,1,1),new Zr(3,0,1,1),new Zr(1,0,1,1)],this._cubeDirections=[new os(1,0,0),new os(-1,0,0),new os(0,0,1),new os(0,0,-1),new os(0,1,0),new os(0,-1,0)],this._cubeUps=[new os(0,1,0),new os(0,1,0),new os(0,1,0),new os(0,1,0),new os(0,0,1),new os(0,0,-1)]}updateMatrices(e,t=0){const n=this.camera,i=this.matrix,r=e.distance||n.far;r!==n.far&&(n.far=r,n.updateProjectionMatrix()),td.setFromMatrixPosition(e.matrixWorld),n.position.copy(td),nd.copy(n.position),nd.add(this._cubeDirections[t]),n.up.copy(this._cubeUps[t]),n.lookAt(nd),n.updateMatrixWorld(),i.makeTranslation(-td.x,-td.y,-td.z),ed.multiplyMatrices(n.projectionMatrix,n.matrixWorldInverse),this._frustum.setFromProjectionMatrix(ed)}}class rd extends Wu{constructor(e,t,n=0,i=2){super(e,t),this.isPointLight=!0,this.type="PointLight",this.distance=n,this.decay=i,this.shadow=new id}get power(){return 4*this.intensity*Math.PI}set power(e){this.intensity=e/(4*Math.PI)}dispose(){this.shadow.dispose()}copy(e,t){return super.copy(e,t),this.distance=e.distance,this.decay=e.decay,this.shadow=e.shadow.clone(),this}}class sd extends _a{constructor(e=-1,t=1,n=1,i=-1,r=.1,s=2e3){super(),this.isOrthographicCamera=!0,this.type="OrthographicCamera",this.zoom=1,this.view=null,this.left=e,this.right=t,this.top=n,this.bottom=i,this.near=r,this.far=s,this.updateProjectionMatrix()}copy(e,t){return super.copy(e,t),this.left=e.left,this.right=e.right,this.top=e.top,this.bottom=e.bottom,this.near=e.near,this.far=e.far,this.zoom=e.zoom,this.view=null===e.view?null:Object.assign({},e.view),this}setViewOffset(e,t,n,i,r,s){null===this.view&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1}),this.view.enabled=!0,this.view.fullWidth=e,this.view.fullHeight=t,this.view.offsetX=n,this.view.offsetY=i,this.view.width=r,this.view.height=s,this.updateProjectionMatrix()}clearViewOffset(){null!==this.view&&(this.view.enabled=!1),this.updateProjectionMatrix()}updateProjectionMatrix(){const e=(this.right-this.left)/(2*this.zoom),t=(this.top-this.bottom)/(2*this.zoom),n=(this.right+this.left)/2,i=(this.top+this.bottom)/2;let r=n-e,s=n+e,o=i+t,a=i-t;if(null!==this.view&&this.view.enabled){const e=(this.right-this.left)/this.view.fullWidth/this.zoom,t=(this.top-this.bottom)/this.view.fullHeight/this.zoom;r+=e*this.view.offsetX,s=r+e*this.view.width,o-=t*this.view.offsetY,a=o-t*this.view.height}this.projectionMatrix.makeOrthographic(r,s,o,a,this.near,this.far,this.coordinateSystem),this.projectionMatrixInverse.copy(this.projectionMatrix).invert()}toJSON(e){const t=super.toJSON(e);return t.object.zoom=this.zoom,t.object.left=this.left,t.object.right=this.right,t.object.top=this.top,t.object.bottom=this.bottom,t.object.near=this.near,t.object.far=this.far,null!==this.view&&(t.object.view=Object.assign({},this.view)),t}}class od extends Ku{constructor(){super(new sd(-5,5,5,-5,.5,500)),this.isDirectionalLightShadow=!0}}class ad extends Wu{constructor(e,t){super(e,t),this.isDirectionalLight=!0,this.type="DirectionalLight",this.position.copy(co.DEFAULT_UP),this.updateMatrix(),this.target=new co,this.shadow=new od}dispose(){this.shadow.dispose()}copy(e){return super.copy(e),this.target=e.target.clone(),this.shadow=e.shadow.clone(),this}}class ld extends Wu{constructor(e,t){super(e,t),this.isAmbientLight=!0,this.type="AmbientLight"}}class cd extends Wu{constructor(e,t,n=10,i=10){super(e,t),this.isRectAreaLight=!0,this.type="RectAreaLight",this.width=n,this.height=i}get power(){return this.intensity*this.width*this.height*Math.PI}set power(e){this.intensity=e/(this.width*this.height*Math.PI)}copy(e){return super.copy(e),this.width=e.width,this.height=e.height,this}toJSON(e){const t=super.toJSON(e);return t.object.width=this.width,t.object.height=this.height,t}}class hd{constructor(){this.isSphericalHarmonics3=!0,this.coefficients=[];for(let e=0;e<9;e++)this.coefficients.push(new os)}set(e){for(let t=0;t<9;t++)this.coefficients[t].copy(e[t]);return this}zero(){for(let e=0;e<9;e++)this.coefficients[e].set(0,0,0);return this}getAt(e,t){const n=e.x,i=e.y,r=e.z,s=this.coefficients;return t.copy(s[0]).multiplyScalar(.282095),t.addScaledVector(s[1],.488603*i),t.addScaledVector(s[2],.488603*r),t.addScaledVector(s[3],.488603*n),t.addScaledVector(s[4],n*i*1.092548),t.addScaledVector(s[5],i*r*1.092548),t.addScaledVector(s[6],.315392*(3*r*r-1)),t.addScaledVector(s[7],n*r*1.092548),t.addScaledVector(s[8],.546274*(n*n-i*i)),t}getIrradianceAt(e,t){const n=e.x,i=e.y,r=e.z,s=this.coefficients;return t.copy(s[0]).multiplyScalar(.886227),t.addScaledVector(s[1],1.023328*i),t.addScaledVector(s[2],1.023328*r),t.addScaledVector(s[3],1.023328*n),t.addScaledVector(s[4],.858086*n*i),t.addScaledVector(s[5],.858086*i*r),t.addScaledVector(s[6],.743125*r*r-.247708),t.addScaledVector(s[7],.858086*n*r),t.addScaledVector(s[8],.429043*(n*n-i*i)),t}add(e){for(let t=0;t<9;t++)this.coefficients[t].add(e.coefficients[t]);return this}addScaledSH(e,t){for(let n=0;n<9;n++)this.coefficients[n].addScaledVector(e.coefficients[n],t);return this}scale(e){for(let t=0;t<9;t++)this.coefficients[t].multiplyScalar(e);return this}lerp(e,t){for(let n=0;n<9;n++)this.coefficients[n].lerp(e.coefficients[n],t);return this}equals(e){for(let t=0;t<9;t++)if(!this.coefficients[t].equals(e.coefficients[t]))return!1;return!0}copy(e){return this.set(e.coefficients)}clone(){return(new this.constructor).copy(this)}fromArray(e,t=0){const n=this.coefficients;for(let i=0;i<9;i++)n[i].fromArray(e,t+3*i);return this}toArray(e=[],t=0){const n=this.coefficients;for(let i=0;i<9;i++)n[i].toArray(e,t+3*i);return e}static getBasisAt(e,t){const n=e.x,i=e.y,r=e.z;t[0]=.282095,t[1]=.488603*i,t[2]=.488603*r,t[3]=.488603*n,t[4]=1.092548*n*i,t[5]=1.092548*i*r,t[6]=.315392*(3*r*r-1),t[7]=1.092548*n*r,t[8]=.546274*(n*n-i*i)}}class ud extends Wu{constructor(e=new hd,t=1){super(void 0,t),this.isLightProbe=!0,this.sh=e}copy(e){return super.copy(e),this.sh.copy(e.sh),this}fromJSON(e){return this.intensity=e.intensity,this.sh.fromArray(e.sh),this}toJSON(e){const t=super.toJSON(e);return t.object.sh=this.sh.toArray(),t}}class dd extends ku{constructor(e){super(e),this.textures={}}load(e,t,n,i){const r=this,s=new Fu(r.manager);s.setPath(r.path),s.setRequestHeader(r.requestHeader),s.setWithCredentials(r.withCredentials),s.load(e,(function(n){try{t(r.parse(JSON.parse(n)))}catch(t){i?i(t):console.error(t),r.manager.itemError(e)}}),n,i)}parse(e){const t=this.textures;function n(e){return void 0===t[e]&&console.warn("THREE.MaterialLoader: Undefined texture",e),t[e]}const i=this.createMaterialFromType(e.type);if(void 0!==e.uuid&&(i.uuid=e.uuid),void 0!==e.name&&(i.name=e.name),void 0!==e.color&&void 0!==i.color&&i.color.setHex(e.color),void 0!==e.roughness&&(i.roughness=e.roughness),void 0!==e.metalness&&(i.metalness=e.metalness),void 0!==e.sheen&&(i.sheen=e.sheen),void 0!==e.sheenColor&&(i.sheenColor=(new To).setHex(e.sheenColor)),void 0!==e.sheenRoughness&&(i.sheenRoughness=e.sheenRoughness),void 0!==e.emissive&&void 0!==i.emissive&&i.emissive.setHex(e.emissive),void 0!==e.specular&&void 0!==i.specular&&i.specular.setHex(e.specular),void 0!==e.specularIntensity&&(i.specularIntensity=e.specularIntensity),void 0!==e.specularColor&&void 0!==i.specularColor&&i.specularColor.setHex(e.specularColor),void 0!==e.shininess&&(i.shininess=e.shininess),void 0!==e.clearcoat&&(i.clearcoat=e.clearcoat),void 0!==e.clearcoatRoughness&&(i.clearcoatRoughness=e.clearcoatRoughness),void 0!==e.dispersion&&(i.dispersion=e.dispersion),void 0!==e.iridescence&&(i.iridescence=e.iridescence),void 0!==e.iridescenceIOR&&(i.iridescenceIOR=e.iridescenceIOR),void 0!==e.iridescenceThicknessRange&&(i.iridescenceThicknessRange=e.iridescenceThicknessRange),void 0!==e.transmission&&(i.transmission=e.transmission),void 0!==e.thickness&&(i.thickness=e.thickness),void 0!==e.attenuationDistance&&(i.attenuationDistance=e.attenuationDistance),void 0!==e.attenuationColor&&void 0!==i.attenuationColor&&i.attenuationColor.setHex(e.attenuationColor),void 0!==e.anisotropy&&(i.anisotropy=e.anisotropy),void 0!==e.anisotropyRotation&&(i.anisotropyRotation=e.anisotropyRotation),void 0!==e.fog&&(i.fog=e.fog),void 0!==e.flatShading&&(i.flatShading=e.flatShading),void 0!==e.blending&&(i.blending=e.blending),void 0!==e.combine&&(i.combine=e.combine),void 0!==e.side&&(i.side=e.side),void 0!==e.shadowSide&&(i.shadowSide=e.shadowSide),void 0!==e.opacity&&(i.opacity=e.opacity),void 0!==e.transparent&&(i.transparent=e.transparent),void 0!==e.alphaTest&&(i.alphaTest=e.alphaTest),void 0!==e.alphaHash&&(i.alphaHash=e.alphaHash),void 0!==e.depthFunc&&(i.depthFunc=e.depthFunc),void 0!==e.depthTest&&(i.depthTest=e.depthTest),void 0!==e.depthWrite&&(i.depthWrite=e.depthWrite),void 0!==e.colorWrite&&(i.colorWrite=e.colorWrite),void 0!==e.blendSrc&&(i.blendSrc=e.blendSrc),void 0!==e.blendDst&&(i.blendDst=e.blendDst),void 0!==e.blendEquation&&(i.blendEquation=e.blendEquation),void 0!==e.blendSrcAlpha&&(i.blendSrcAlpha=e.blendSrcAlpha),void 0!==e.blendDstAlpha&&(i.blendDstAlpha=e.blendDstAlpha),void 0!==e.blendEquationAlpha&&(i.blendEquationAlpha=e.blendEquationAlpha),void 0!==e.blendColor&&void 0!==i.blendColor&&i.blendColor.setHex(e.blendColor),void 0!==e.blendAlpha&&(i.blendAlpha=e.blendAlpha),void 0!==e.stencilWriteMask&&(i.stencilWriteMask=e.stencilWriteMask),void 0!==e.stencilFunc&&(i.stencilFunc=e.stencilFunc),void 0!==e.stencilRef&&(i.stencilRef=e.stencilRef),void 0!==e.stencilFuncMask&&(i.stencilFuncMask=e.stencilFuncMask),void 0!==e.stencilFail&&(i.stencilFail=e.stencilFail),void 0!==e.stencilZFail&&(i.stencilZFail=e.stencilZFail),void 0!==e.stencilZPass&&(i.stencilZPass=e.stencilZPass),void 0!==e.stencilWrite&&(i.stencilWrite=e.stencilWrite),void 0!==e.wireframe&&(i.wireframe=e.wireframe),void 0!==e.wireframeLinewidth&&(i.wireframeLinewidth=e.wireframeLinewidth),void 0!==e.wireframeLinecap&&(i.wireframeLinecap=e.wireframeLinecap),void 0!==e.wireframeLinejoin&&(i.wireframeLinejoin=e.wireframeLinejoin),void 0!==e.rotation&&(i.rotation=e.rotation),void 0!==e.linewidth&&(i.linewidth=e.linewidth),void 0!==e.dashSize&&(i.dashSize=e.dashSize),void 0!==e.gapSize&&(i.gapSize=e.gapSize),void 0!==e.scale&&(i.scale=e.scale),void 0!==e.polygonOffset&&(i.polygonOffset=e.polygonOffset),void 0!==e.polygonOffsetFactor&&(i.polygonOffsetFactor=e.polygonOffsetFactor),void 0!==e.polygonOffsetUnits&&(i.polygonOffsetUnits=e.polygonOffsetUnits),void 0!==e.dithering&&(i.dithering=e.dithering),void 0!==e.alphaToCoverage&&(i.alphaToCoverage=e.alphaToCoverage),void 0!==e.premultipliedAlpha&&(i.premultipliedAlpha=e.premultipliedAlpha),void 0!==e.forceSinglePass&&(i.forceSinglePass=e.forceSinglePass),void 0!==e.visible&&(i.visible=e.visible),void 0!==e.toneMapped&&(i.toneMapped=e.toneMapped),void 0!==e.userData&&(i.userData=e.userData),void 0!==e.vertexColors&&("number"==typeof e.vertexColors?i.vertexColors=e.vertexColors>0:i.vertexColors=e.vertexColors),void 0!==e.uniforms)for(const t in e.uniforms){const r=e.uniforms[t];switch(i.uniforms[t]={},r.type){case"t":i.uniforms[t].value=n(r.value);break;case"c":i.uniforms[t].value=(new To).setHex(r.value);break;case"v2":i.uniforms[t].value=(new Tr).fromArray(r.value);break;case"v3":i.uniforms[t].value=(new os).fromArray(r.value);break;case"v4":i.uniforms[t].value=(new Zr).fromArray(r.value);break;case"m3":i.uniforms[t].value=(new Br).fromArray(r.value);break;case"m4":i.uniforms[t].value=(new ks).fromArray(r.value);break;default:i.uniforms[t].value=r.value}}if(void 0!==e.defines&&(i.defines=e.defines),void 0!==e.vertexShader&&(i.vertexShader=e.vertexShader),void 0!==e.fragmentShader&&(i.fragmentShader=e.fragmentShader),void 0!==e.glslVersion&&(i.glslVersion=e.glslVersion),void 0!==e.extensions)for(const t in e.extensions)i.extensions[t]=e.extensions[t];if(void 0!==e.lights&&(i.lights=e.lights),void 0!==e.clipping&&(i.clipping=e.clipping),void 0!==e.size&&(i.size=e.size),void 0!==e.sizeAttenuation&&(i.sizeAttenuation=e.sizeAttenuation),void 0!==e.map&&(i.map=n(e.map)),void 0!==e.matcap&&(i.matcap=n(e.matcap)),void 0!==e.alphaMap&&(i.alphaMap=n(e.alphaMap)),void 0!==e.bumpMap&&(i.bumpMap=n(e.bumpMap)),void 0!==e.bumpScale&&(i.bumpScale=e.bumpScale),void 0!==e.normalMap&&(i.normalMap=n(e.normalMap)),void 0!==e.normalMapType&&(i.normalMapType=e.normalMapType),void 0!==e.normalScale){let t=e.normalScale;!1===Array.isArray(t)&&(t=[t,t]),i.normalScale=(new Tr).fromArray(t)}return void 0!==e.displacementMap&&(i.displacementMap=n(e.displacementMap)),void 0!==e.displacementScale&&(i.displacementScale=e.displacementScale),void 0!==e.displacementBias&&(i.displacementBias=e.displacementBias),void 0!==e.roughnessMap&&(i.roughnessMap=n(e.roughnessMap)),void 0!==e.metalnessMap&&(i.metalnessMap=n(e.metalnessMap)),void 0!==e.emissiveMap&&(i.emissiveMap=n(e.emissiveMap)),void 0!==e.emissiveIntensity&&(i.emissiveIntensity=e.emissiveIntensity),void 0!==e.specularMap&&(i.specularMap=n(e.specularMap)),void 0!==e.specularIntensityMap&&(i.specularIntensityMap=n(e.specularIntensityMap)),void 0!==e.specularColorMap&&(i.specularColorMap=n(e.specularColorMap)),void 0!==e.envMap&&(i.envMap=n(e.envMap)),void 0!==e.envMapRotation&&i.envMapRotation.fromArray(e.envMapRotation),void 0!==e.envMapIntensity&&(i.envMapIntensity=e.envMapIntensity),void 0!==e.reflectivity&&(i.reflectivity=e.reflectivity),void 0!==e.refractionRatio&&(i.refractionRatio=e.refractionRatio),void 0!==e.lightMap&&(i.lightMap=n(e.lightMap)),void 0!==e.lightMapIntensity&&(i.lightMapIntensity=e.lightMapIntensity),void 0!==e.aoMap&&(i.aoMap=n(e.aoMap)),void 0!==e.aoMapIntensity&&(i.aoMapIntensity=e.aoMapIntensity),void 0!==e.gradientMap&&(i.gradientMap=n(e.gradientMap)),void 0!==e.clearcoatMap&&(i.clearcoatMap=n(e.clearcoatMap)),void 0!==e.clearcoatRoughnessMap&&(i.clearcoatRoughnessMap=n(e.clearcoatRoughnessMap)),void 0!==e.clearcoatNormalMap&&(i.clearcoatNormalMap=n(e.clearcoatNormalMap)),void 0!==e.clearcoatNormalScale&&(i.clearcoatNormalScale=(new Tr).fromArray(e.clearcoatNormalScale)),void 0!==e.iridescenceMap&&(i.iridescenceMap=n(e.iridescenceMap)),void 0!==e.iridescenceThicknessMap&&(i.iridescenceThicknessMap=n(e.iridescenceThicknessMap)),void 0!==e.transmissionMap&&(i.transmissionMap=n(e.transmissionMap)),void 0!==e.thicknessMap&&(i.thicknessMap=n(e.thicknessMap)),void 0!==e.anisotropyMap&&(i.anisotropyMap=n(e.anisotropyMap)),void 0!==e.sheenColorMap&&(i.sheenColorMap=n(e.sheenColorMap)),void 0!==e.sheenRoughnessMap&&(i.sheenRoughnessMap=n(e.sheenRoughnessMap)),i}setTextures(e){return this.textures=e,this}createMaterialFromType(e){return dd.createMaterialFromType(e)}static createMaterialFromType(e){return new{ShadowMaterial:tu,SpriteMaterial:Ha,RawShaderMaterial:nu,ShaderMaterial:wa,PointsMaterial:gc,MeshPhysicalMaterial:ru,MeshStandardMaterial:iu,MeshPhongMaterial:su,MeshToonMaterial:ou,MeshNormalMaterial:au,MeshLambertMaterial:lu,MeshDepthMaterial:cu,MeshDistanceMaterial:hu,MeshBasicMaterial:Do,MeshMatcapMaterial:uu,LineDashedMaterial:du,LineBasicMaterial:ic,Material:Lo}[e]}}class pd{static decodeText(e){if(console.warn("THREE.LoaderUtils: decodeText() has been deprecated with r165 and will be removed with r175. Use TextDecoder instead."),"undefined"!=typeof TextDecoder)return(new TextDecoder).decode(e);let t="";for(let n=0,i=e.length;n<i;n++)t+=String.fromCharCode(e[n]);try{return decodeURIComponent(escape(t))}catch(e){return t}}static extractUrlBase(e){const t=e.lastIndexOf("/");return-1===t?"./":e.slice(0,t+1)}static resolveURL(e,t){return"string"!=typeof e||""===e?"":(/^https?:\/\//i.test(t)&&/^\//.test(e)&&(t=t.replace(/(^https?:\/\/[^\/]+).*/i,"$1")),/^(https?:)?\/\//i.test(e)||/^data:.*,.*$/i.test(e)||/^blob:.*$/i.test(e)?e:t+e)}}class fd extends sa{constructor(){super(),this.isInstancedBufferGeometry=!0,this.type="InstancedBufferGeometry",this.instanceCount=1/0}copy(e){return super.copy(e),this.instanceCount=e.instanceCount,this}toJSON(){const e=super.toJSON();return e.instanceCount=this.instanceCount,e.isInstancedBufferGeometry=!0,e}}class md extends ku{constructor(e){super(e)}load(e,t,n,i){const r=this,s=new Fu(r.manager);s.setPath(r.path),s.setRequestHeader(r.requestHeader),s.setWithCredentials(r.withCredentials),s.load(e,(function(n){try{t(r.parse(JSON.parse(n)))}catch(t){i?i(t):console.error(t),r.manager.itemError(e)}}),n,i)}parse(e){const t={},n={};function i(e,i){if(void 0!==t[i])return t[i];const r=e.interleavedBuffers[i],s=function(e,t){if(void 0!==n[t])return n[t];const i=e.arrayBuffers[t],r=new Uint32Array(i).buffer;return n[t]=r,r}(e,r.buffer),o=Pr(r.type,s),a=new Qa(o,r.stride);return a.uuid=r.uuid,t[i]=a,a}const r=e.isInstancedBufferGeometry?new fd:new sa,s=e.data.index;if(void 0!==s){const e=Pr(s.type,s.array);r.setIndex(new Go(e,1))}const o=e.data.attributes;for(const t in o){const n=o[t];let s;if(n.isInterleavedBufferAttribute){const t=i(e.data,n.data);s=new Ga(t,n.itemSize,n.offset,n.normalized)}else{const e=Pr(n.type,n.array);s=new(n.isInstancedBufferAttribute?Cl:Go)(e,n.itemSize,n.normalized)}void 0!==n.name&&(s.name=n.name),void 0!==n.usage&&s.setUsage(n.usage),r.setAttribute(t,s)}const a=e.data.morphAttributes;if(a)for(const t in a){const n=a[t],s=[];for(let t=0,r=n.length;t<r;t++){const r=n[t];let o;if(r.isInterleavedBufferAttribute){const t=i(e.data,r.data);o=new Ga(t,r.itemSize,r.offset,r.normalized)}else{const e=Pr(r.type,r.array);o=new Go(e,r.itemSize,r.normalized)}void 0!==r.name&&(o.name=r.name),s.push(o)}r.morphAttributes[t]=s}e.data.morphTargetsRelative&&(r.morphTargetsRelative=!0);const l=e.data.groups||e.data.drawcalls||e.data.offsets;if(void 0!==l)for(let e=0,t=l.length;e!==t;++e){const t=l[e];r.addGroup(t.start,t.count,t.materialIndex)}const c=e.data.boundingSphere;if(void 0!==c){const e=new os;void 0!==c.center&&e.fromArray(c.center),r.boundingSphere=new Is(e,c.radius)}return e.name&&(r.name=e.name),e.userData&&(r.userData=e.userData),r}}class Ad extends ku{constructor(e){super(e)}load(e,t,n,i){const r=this,s=""===this.path?pd.extractUrlBase(e):this.path;this.resourcePath=this.resourcePath||s;const o=new Fu(this.manager);o.setPath(this.path),o.setRequestHeader(this.requestHeader),o.setWithCredentials(this.withCredentials),o.load(e,(function(n){let s=null;try{s=JSON.parse(n)}catch(t){return void 0!==i&&i(t),void console.error("THREE:ObjectLoader: Can't parse "+e+".",t.message)}const o=s.metadata;if(void 0===o||void 0===o.type||"geometry"===o.type.toLowerCase())return void 0!==i&&i(new Error("THREE.ObjectLoader: Can't load "+e)),void console.error("THREE.ObjectLoader: Can't load "+e);r.parse(s,t)}),n,i)}async loadAsync(e,t){const n=""===this.path?pd.extractUrlBase(e):this.path;this.resourcePath=this.resourcePath||n;const i=new Fu(this.manager);i.setPath(this.path),i.setRequestHeader(this.requestHeader),i.setWithCredentials(this.withCredentials);const r=await i.loadAsync(e,t),s=JSON.parse(r),o=s.metadata;if(void 0===o||void 0===o.type||"geometry"===o.type.toLowerCase())throw new Error("THREE.ObjectLoader: Can't load "+e);return await this.parseAsync(s)}parse(e,t){const n=this.parseAnimations(e.animations),i=this.parseShapes(e.shapes),r=this.parseGeometries(e.geometries,i),s=this.parseImages(e.images,(function(){void 0!==t&&t(l)})),o=this.parseTextures(e.textures,s),a=this.parseMaterials(e.materials,o),l=this.parseObject(e.object,r,a,o,n),c=this.parseSkeletons(e.skeletons,l);if(this.bindSkeletons(l,c),this.bindLightTargets(l),void 0!==t){let e=!1;for(const t in s)if(s[t].data instanceof HTMLImageElement){e=!0;break}!1===e&&t(l)}return l}async parseAsync(e){const t=this.parseAnimations(e.animations),n=this.parseShapes(e.shapes),i=this.parseGeometries(e.geometries,n),r=await this.parseImagesAsync(e.images),s=this.parseTextures(e.textures,r),o=this.parseMaterials(e.materials,s),a=this.parseObject(e.object,i,o,s,t),l=this.parseSkeletons(e.skeletons,a);return this.bindSkeletons(a,l),this.bindLightTargets(a),a}parseShapes(e){const t={};if(void 0!==e)for(let n=0,i=e.length;n<i;n++){const i=(new dh).fromJSON(e[n]);t[i.uuid]=i}return t}parseSkeletons(e,t){const n={},i={};if(t.traverse((function(e){e.isBone&&(i[e.uuid]=e)})),void 0!==e)for(let t=0,r=e.length;t<r;t++){const r=(new xl).fromJSON(e[t],i);n[r.uuid]=r}return n}parseGeometries(e,t){const n={};if(void 0!==e){const i=new md;for(let r=0,s=e.length;r<s;r++){let s;const o=e[r];switch(o.type){case"BufferGeometry":case"InstancedBufferGeometry":s=i.parse(o);break;case"Geometry":"THREE"in window&&"LegacyJSONLoader"in THREE?s=(new THREE.LegacyJSONLoader).parse(o,this.resourcePath).geometry:console.error('THREE.ObjectLoader: You have to import LegacyJSONLoader in order load geometry data of type "Geometry".');break;default:o.type in eu?s=eu[o.type].fromJSON(o,t):console.warn(`THREE.ObjectLoader: Unsupported geometry type "${o.type}"`)}s.uuid=o.uuid,void 0!==o.name&&(s.name=o.name),void 0!==o.userData&&(s.userData=o.userData),n[o.uuid]=s}}return n}parseMaterials(e,t){const n={},i={};if(void 0!==e){const r=new dd;r.setTextures(t);for(let t=0,s=e.length;t<s;t++){const s=e[t];void 0===n[s.uuid]&&(n[s.uuid]=r.parse(s)),i[s.uuid]=n[s.uuid]}}return i}parseAnimations(e){const t={};if(void 0!==e)for(let n=0;n<e.length;n++){const i=e[n],r=Ru.parse(i);t[r.uuid]=r}return t}parseImages(e,t){const n=this,i={};let r;function s(e){if("string"==typeof e){const t=e;return function(e){return n.manager.itemStart(e),r.load(e,(function(){n.manager.itemEnd(e)}),void 0,(function(){n.manager.itemError(e),n.manager.itemEnd(e)}))}(/^(\/\/)|([a-z]+:(\/\/)?)/i.test(t)?t:n.resourcePath+t)}return e.data?{data:Pr(e.type,e.data),width:e.width,height:e.height}:null}if(void 0!==e&&e.length>0){const n=new Pu(t);r=new Gu(n),r.setCrossOrigin(this.crossOrigin);for(let t=0,n=e.length;t<n;t++){const n=e[t],r=n.url;if(Array.isArray(r)){const e=[];for(let t=0,n=r.length;t<n;t++){const n=s(r[t]);null!==n&&(n instanceof HTMLImageElement?e.push(n):e.push(new yl(n.data,n.width,n.height)))}i[n.uuid]=new Xr(e)}else{const e=s(n.url);i[n.uuid]=new Xr(e)}}}return i}async parseImagesAsync(e){const t=this,n={};let i;async function r(e){if("string"==typeof e){const n=e,r=/^(\/\/)|([a-z]+:(\/\/)?)/i.test(n)?n:t.resourcePath+n;return await i.loadAsync(r)}return e.data?{data:Pr(e.type,e.data),width:e.width,height:e.height}:null}if(void 0!==e&&e.length>0){i=new Gu(this.manager),i.setCrossOrigin(this.crossOrigin);for(let t=0,i=e.length;t<i;t++){const i=e[t],s=i.url;if(Array.isArray(s)){const e=[];for(let t=0,n=s.length;t<n;t++){const n=s[t],i=await r(n);null!==i&&(i instanceof HTMLImageElement?e.push(i):e.push(new yl(i.data,i.width,i.height)))}n[i.uuid]=new Xr(e)}else{const e=await r(i.url);n[i.uuid]=new Xr(e)}}}return n}parseTextures(e,t){function n(e,t){return"number"==typeof e?e:(console.warn("THREE.ObjectLoader.parseTexture: Constant should be in numeric form.",e),t[e])}const i={};if(void 0!==e)for(let r=0,s=e.length;r<s;r++){const s=e[r];void 0===s.image&&console.warn('THREE.ObjectLoader: No "image" specified for',s.uuid),void 0===t[s.image]&&console.warn("THREE.ObjectLoader: Undefined image",s.image);const o=t[s.image],a=o.data;let l;Array.isArray(a)?(l=new La,6===a.length&&(l.needsUpdate=!0)):(l=a&&a.data?new yl:new Kr,a&&(l.needsUpdate=!0)),l.source=o,l.uuid=s.uuid,void 0!==s.name&&(l.name=s.name),void 0!==s.mapping&&(l.mapping=n(s.mapping,gd)),void 0!==s.channel&&(l.channel=s.channel),void 0!==s.offset&&l.offset.fromArray(s.offset),void 0!==s.repeat&&l.repeat.fromArray(s.repeat),void 0!==s.center&&l.center.fromArray(s.center),void 0!==s.rotation&&(l.rotation=s.rotation),void 0!==s.wrap&&(l.wrapS=n(s.wrap[0],vd),l.wrapT=n(s.wrap[1],vd)),void 0!==s.format&&(l.format=s.format),void 0!==s.internalFormat&&(l.internalFormat=s.internalFormat),void 0!==s.type&&(l.type=s.type),void 0!==s.colorSpace&&(l.colorSpace=s.colorSpace),void 0!==s.minFilter&&(l.minFilter=n(s.minFilter,yd)),void 0!==s.magFilter&&(l.magFilter=n(s.magFilter,yd)),void 0!==s.anisotropy&&(l.anisotropy=s.anisotropy),void 0!==s.flipY&&(l.flipY=s.flipY),void 0!==s.generateMipmaps&&(l.generateMipmaps=s.generateMipmaps),void 0!==s.premultiplyAlpha&&(l.premultiplyAlpha=s.premultiplyAlpha),void 0!==s.unpackAlignment&&(l.unpackAlignment=s.unpackAlignment),void 0!==s.compareFunction&&(l.compareFunction=s.compareFunction),void 0!==s.userData&&(l.userData=s.userData),i[s.uuid]=l}return i}parseObject(e,t,n,i,r){let s,o,a;function l(e){return void 0===t[e]&&console.warn("THREE.ObjectLoader: Undefined geometry",e),t[e]}function c(e){if(void 0!==e){if(Array.isArray(e)){const t=[];for(let i=0,r=e.length;i<r;i++){const r=e[i];void 0===n[r]&&console.warn("THREE.ObjectLoader: Undefined material",r),t.push(n[r])}return t}return void 0===n[e]&&console.warn("THREE.ObjectLoader: Undefined material",e),n[e]}}function h(e){return void 0===i[e]&&console.warn("THREE.ObjectLoader: Undefined texture",e),i[e]}switch(e.type){case"Scene":s=new Fa,void 0!==e.background&&(Number.isInteger(e.background)?s.background=new To(e.background):s.background=h(e.background)),void 0!==e.environment&&(s.environment=h(e.environment)),void 0!==e.fog&&("Fog"===e.fog.type?s.fog=new Oa(e.fog.color,e.fog.near,e.fog.far):"FogExp2"===e.fog.type&&(s.fog=new Na(e.fog.color,e.fog.density)),""!==e.fog.name&&(s.fog.name=e.fog.name)),void 0!==e.backgroundBlurriness&&(s.backgroundBlurriness=e.backgroundBlurriness),void 0!==e.backgroundIntensity&&(s.backgroundIntensity=e.backgroundIntensity),void 0!==e.backgroundRotation&&s.backgroundRotation.fromArray(e.backgroundRotation),void 0!==e.environmentIntensity&&(s.environmentIntensity=e.environmentIntensity),void 0!==e.environmentRotation&&s.environmentRotation.fromArray(e.environmentRotation);break;case"PerspectiveCamera":s=new Ta(e.fov,e.aspect,e.near,e.far),void 0!==e.focus&&(s.focus=e.focus),void 0!==e.zoom&&(s.zoom=e.zoom),void 0!==e.filmGauge&&(s.filmGauge=e.filmGauge),void 0!==e.filmOffset&&(s.filmOffset=e.filmOffset),void 0!==e.view&&(s.view=Object.assign({},e.view));break;case"OrthographicCamera":s=new sd(e.left,e.right,e.top,e.bottom,e.near,e.far),void 0!==e.zoom&&(s.zoom=e.zoom),void 0!==e.view&&(s.view=Object.assign({},e.view));break;case"AmbientLight":s=new ld(e.color,e.intensity);break;case"DirectionalLight":s=new ad(e.color,e.intensity),s.target=e.target||"";break;case"PointLight":s=new rd(e.color,e.intensity,e.distance,e.decay);break;case"RectAreaLight":s=new cd(e.color,e.intensity,e.width,e.height);break;case"SpotLight":s=new $u(e.color,e.intensity,e.distance,e.angle,e.penumbra,e.decay),s.target=e.target||"";break;case"HemisphereLight":s=new qu(e.color,e.groundColor,e.intensity);break;case"LightProbe":s=(new ud).fromJSON(e);break;case"SkinnedMesh":o=l(e.geometry),a=c(e.material),s=new gl(o,a),void 0!==e.bindMode&&(s.bindMode=e.bindMode),void 0!==e.bindMatrix&&s.bindMatrix.fromArray(e.bindMatrix),void 0!==e.skeleton&&(s.skeleton=e.skeleton);break;case"Mesh":o=l(e.geometry),a=c(e.material),s=new ga(o,a);break;case"InstancedMesh":o=l(e.geometry),a=c(e.material);const t=e.count,n=e.instanceMatrix,i=e.instanceColor;s=new Rl(o,a,t),s.instanceMatrix=new Cl(new Float32Array(n.array),16),void 0!==i&&(s.instanceColor=new Cl(new Float32Array(i.array),i.itemSize));break;case"BatchedMesh":o=l(e.geometry),a=c(e.material),s=new nc(e.maxInstanceCount,e.maxVertexCount,e.maxIndexCount,a),s.geometry=o,s.perObjectFrustumCulled=e.perObjectFrustumCulled,s.sortObjects=e.sortObjects,s._drawRanges=e.drawRanges,s._reservedRanges=e.reservedRanges,s._visibility=e.visibility,s._active=e.active,s._bounds=e.bounds.map((e=>{const t=new cs;t.min.fromArray(e.boxMin),t.max.fromArray(e.boxMax);const n=new Is;return n.radius=e.sphereRadius,n.center.fromArray(e.sphereCenter),{boxInitialized:e.boxInitialized,box:t,sphereInitialized:e.sphereInitialized,sphere:n}})),s._maxInstanceCount=e.maxInstanceCount,s._maxVertexCount=e.maxVertexCount,s._maxIndexCount=e.maxIndexCount,s._geometryInitialized=e.geometryInitialized,s._geometryCount=e.geometryCount,s._matricesTexture=h(e.matricesTexture.uuid),void 0!==e.colorsTexture&&(s._colorsTexture=h(e.colorsTexture.uuid));break;case"LOD":s=new al;break;case"Line":s=new uc(l(e.geometry),c(e.material));break;case"LineLoop":s=new Ac(l(e.geometry),c(e.material));break;case"LineSegments":s=new mc(l(e.geometry),c(e.material));break;case"PointCloud":case"Points":s=new xc(l(e.geometry),c(e.material));break;case"Sprite":s=new il(c(e.material));break;case"Group":s=new Pa;break;case"Bone":s=new vl;break;default:s=new co}if(s.uuid=e.uuid,void 0!==e.name&&(s.name=e.name),void 0!==e.matrix?(s.matrix.fromArray(e.matrix),void 0!==e.matrixAutoUpdate&&(s.matrixAutoUpdate=e.matrixAutoUpdate),s.matrixAutoUpdate&&s.matrix.decompose(s.position,s.quaternion,s.scale)):(void 0!==e.position&&s.position.fromArray(e.position),void 0!==e.rotation&&s.rotation.fromArray(e.rotation),void 0!==e.quaternion&&s.quaternion.fromArray(e.quaternion),void 0!==e.scale&&s.scale.fromArray(e.scale)),void 0!==e.up&&s.up.fromArray(e.up),void 0!==e.castShadow&&(s.castShadow=e.castShadow),void 0!==e.receiveShadow&&(s.receiveShadow=e.receiveShadow),e.shadow&&(void 0!==e.shadow.intensity&&(s.shadow.intensity=e.shadow.intensity),void 0!==e.shadow.bias&&(s.shadow.bias=e.shadow.bias),void 0!==e.shadow.normalBias&&(s.shadow.normalBias=e.shadow.normalBias),void 0!==e.shadow.radius&&(s.shadow.radius=e.shadow.radius),void 0!==e.shadow.mapSize&&s.shadow.mapSize.fromArray(e.shadow.mapSize),void 0!==e.shadow.camera&&(s.shadow.camera=this.parseObject(e.shadow.camera))),void 0!==e.visible&&(s.visible=e.visible),void 0!==e.frustumCulled&&(s.frustumCulled=e.frustumCulled),void 0!==e.renderOrder&&(s.renderOrder=e.renderOrder),void 0!==e.userData&&(s.userData=e.userData),void 0!==e.layers&&(s.layers.mask=e.layers),void 0!==e.children){const o=e.children;for(let e=0;e<o.length;e++)s.add(this.parseObject(o[e],t,n,i,r))}if(void 0!==e.animations){const t=e.animations;for(let e=0;e<t.length;e++){const n=t[e];s.animations.push(r[n])}}if("LOD"===e.type){void 0!==e.autoUpdate&&(s.autoUpdate=e.autoUpdate);const t=e.levels;for(let e=0;e<t.length;e++){const n=t[e],i=s.getObjectByProperty("uuid",n.object);void 0!==i&&s.addLevel(i,n.distance,n.hysteresis)}}return s}bindSkeletons(e,t){0!==Object.keys(t).length&&e.traverse((function(e){if(!0===e.isSkinnedMesh&&void 0!==e.skeleton){const n=t[e.skeleton];void 0===n?console.warn("THREE.ObjectLoader: No skeleton found with UUID:",e.skeleton):e.bind(n,e.bindMatrix)}}))}bindLightTargets(e){e.traverse((function(t){if(t.isDirectionalLight||t.isSpotLight){const n=t.target,i=e.getObjectByProperty("uuid",n);t.target=void 0!==i?i:new co}}))}}const gd={UVMapping:Ft,CubeReflectionMapping:Qt,CubeRefractionMapping:zt,EquirectangularReflectionMapping:Gt,EquirectangularRefractionMapping:Ht,CubeUVReflectionMapping:Vt},vd={RepeatWrapping:jt,ClampToEdgeWrapping:Wt,MirroredRepeatWrapping:qt},yd={NearestFilter:Xt,NearestMipmapNearestFilter:Yt,NearestMipmapLinearFilter:Kt,LinearFilter:$t,LinearMipmapNearestFilter:en,LinearMipmapLinearFilter:nn};class Ed extends ku{constructor(e){super(e),this.isImageBitmapLoader=!0,"undefined"==typeof createImageBitmap&&console.warn("THREE.ImageBitmapLoader: createImageBitmap() not supported."),"undefined"==typeof fetch&&console.warn("THREE.ImageBitmapLoader: fetch() not supported."),this.options={premultiplyAlpha:"none"}}setOptions(e){return this.options=e,this}load(e,t,n,i){void 0===e&&(e=""),void 0!==this.path&&(e=this.path+e),e=this.manager.resolveURL(e);const r=this,s=Du.get(e);if(void 0!==s)return r.manager.itemStart(e),s.then?void s.then((n=>{t&&t(n),r.manager.itemEnd(e)})).catch((e=>{i&&i(e)})):(setTimeout((function(){t&&t(s),r.manager.itemEnd(e)}),0),s);const o={};o.credentials="anonymous"===this.crossOrigin?"same-origin":"include",o.headers=this.requestHeader;const a=fetch(e,o).then((function(e){return e.blob()})).then((function(e){return createImageBitmap(e,Object.assign(r.options,{colorSpaceConversion:"none"}))})).then((function(n){return Du.add(e,n),t&&t(n),r.manager.itemEnd(e),n})).catch((function(t){i&&i(t),Du.remove(e),r.manager.itemError(e),r.manager.itemEnd(e)}));Du.add(e,a),r.manager.itemStart(e)}}let bd;class xd{static getContext(){return void 0===bd&&(bd=new(window.AudioContext||window.webkitAudioContext)),bd}static setContext(e){bd=e}}class Cd extends ku{constructor(e){super(e)}load(e,t,n,i){const r=this,s=new Fu(this.manager);function o(t){i?i(t):console.error(t),r.manager.itemError(e)}s.setResponseType("arraybuffer"),s.setPath(this.path),s.setRequestHeader(this.requestHeader),s.setWithCredentials(this.withCredentials),s.load(e,(function(e){try{const n=e.slice(0);xd.getContext().decodeAudioData(n,(function(e){t(e)})).catch(o)}catch(e){o(e)}}),n,i)}}const wd=new ks,_d=new ks,Md=new ks;class Id{constructor(){this.type="StereoCamera",this.aspect=1,this.eyeSep=.064,this.cameraL=new Ta,this.cameraL.layers.enable(1),this.cameraL.matrixAutoUpdate=!1,this.cameraR=new Ta,this.cameraR.layers.enable(2),this.cameraR.matrixAutoUpdate=!1,this._cache={focus:null,fov:null,aspect:null,near:null,far:null,zoom:null,eyeSep:null}}update(e){const t=this._cache;if(t.focus!==e.focus||t.fov!==e.fov||t.aspect!==e.aspect*this.aspect||t.near!==e.near||t.far!==e.far||t.zoom!==e.zoom||t.eyeSep!==this.eyeSep){t.focus=e.focus,t.fov=e.fov,t.aspect=e.aspect*this.aspect,t.near=e.near,t.far=e.far,t.zoom=e.zoom,t.eyeSep=this.eyeSep,Md.copy(e.projectionMatrix);const n=t.eyeSep/2,i=n*t.near/t.focus,r=t.near*Math.tan(Er*t.fov*.5)/t.zoom;let s,o;_d.elements[12]=-n,wd.elements[12]=n,s=-r*t.aspect+i,o=r*t.aspect+i,Md.elements[0]=2*t.near/(o-s),Md.elements[8]=(o+s)/(o-s),this.cameraL.projectionMatrix.copy(Md),s=-r*t.aspect-i,o=r*t.aspect-i,Md.elements[0]=2*t.near/(o-s),Md.elements[8]=(o+s)/(o-s),this.cameraR.projectionMatrix.copy(Md)}this.cameraL.matrixWorld.copy(e.matrixWorld).multiply(_d),this.cameraR.matrixWorld.copy(e.matrixWorld).multiply(wd)}}class Sd extends Ta{constructor(e=[]){super(),this.isArrayCamera=!0,this.cameras=e,this.index=0}}class Td{constructor(e=!0){this.autoStart=e,this.startTime=0,this.oldTime=0,this.elapsedTime=0,this.running=!1}start(){this.startTime=Bd(),this.oldTime=this.startTime,this.elapsedTime=0,this.running=!0}stop(){this.getElapsedTime(),this.running=!1,this.autoStart=!1}getElapsedTime(){return this.getDelta(),this.elapsedTime}getDelta(){let e=0;if(this.autoStart&&!this.running)return this.start(),0;if(this.running){const t=Bd();e=(t-this.oldTime)/1e3,this.oldTime=t,this.elapsedTime+=e}return e}}function Bd(){return performance.now()}const Rd=new os,Ld=new ss,Dd=new os,Pd=new os;class Ud extends co{constructor(){super(),this.type="AudioListener",this.context=xd.getContext(),this.gain=this.context.createGain(),this.gain.connect(this.context.destination),this.filter=null,this.timeDelta=0,this._clock=new Td}getInput(){return this.gain}removeFilter(){return null!==this.filter&&(this.gain.disconnect(this.filter),this.filter.disconnect(this.context.destination),this.gain.connect(this.context.destination),this.filter=null),this}getFilter(){return this.filter}setFilter(e){return null!==this.filter?(this.gain.disconnect(this.filter),this.filter.disconnect(this.context.destination)):this.gain.disconnect(this.context.destination),this.filter=e,this.gain.connect(this.filter),this.filter.connect(this.context.destination),this}getMasterVolume(){return this.gain.gain.value}setMasterVolume(e){return this.gain.gain.setTargetAtTime(e,this.context.currentTime,.01),this}updateMatrixWorld(e){super.updateMatrixWorld(e);const t=this.context.listener,n=this.up;if(this.timeDelta=this._clock.getDelta(),this.matrixWorld.decompose(Rd,Ld,Dd),Pd.set(0,0,-1).applyQuaternion(Ld),t.positionX){const e=this.context.currentTime+this.timeDelta;t.positionX.linearRampToValueAtTime(Rd.x,e),t.positionY.linearRampToValueAtTime(Rd.y,e),t.positionZ.linearRampToValueAtTime(Rd.z,e),t.forwardX.linearRampToValueAtTime(Pd.x,e),t.forwardY.linearRampToValueAtTime(Pd.y,e),t.forwardZ.linearRampToValueAtTime(Pd.z,e),t.upX.linearRampToValueAtTime(n.x,e),t.upY.linearRampToValueAtTime(n.y,e),t.upZ.linearRampToValueAtTime(n.z,e)}else t.setPosition(Rd.x,Rd.y,Rd.z),t.setOrientation(Pd.x,Pd.y,Pd.z,n.x,n.y,n.z)}}class kd extends co{constructor(e){super(),this.type="Audio",this.listener=e,this.context=e.context,this.gain=this.context.createGain(),this.gain.connect(e.getInput()),this.autoplay=!1,this.buffer=null,this.detune=0,this.loop=!1,this.loopStart=0,this.loopEnd=0,this.offset=0,this.duration=void 0,this.playbackRate=1,this.isPlaying=!1,this.hasPlaybackControl=!0,this.source=null,this.sourceType="empty",this._startedAt=0,this._progress=0,this._connected=!1,this.filters=[]}getOutput(){return this.gain}setNodeSource(e){return this.hasPlaybackControl=!1,this.sourceType="audioNode",this.source=e,this.connect(),this}setMediaElementSource(e){return this.hasPlaybackControl=!1,this.sourceType="mediaNode",this.source=this.context.createMediaElementSource(e),this.connect(),this}setMediaStreamSource(e){return this.hasPlaybackControl=!1,this.sourceType="mediaStreamNode",this.source=this.context.createMediaStreamSource(e),this.connect(),this}setBuffer(e){return this.buffer=e,this.sourceType="buffer",this.autoplay&&this.play(),this}play(e=0){if(!0===this.isPlaying)return void console.warn("THREE.Audio: Audio is already playing.");if(!1===this.hasPlaybackControl)return void console.warn("THREE.Audio: this Audio has no playback control.");this._startedAt=this.context.currentTime+e;const t=this.context.createBufferSource();return t.buffer=this.buffer,t.loop=this.loop,t.loopStart=this.loopStart,t.loopEnd=this.loopEnd,t.onended=this.onEnded.bind(this),t.start(this._startedAt,this._progress+this.offset,this.duration),this.isPlaying=!0,this.source=t,this.setDetune(this.detune),this.setPlaybackRate(this.playbackRate),this.connect()}pause(){if(!1!==this.hasPlaybackControl)return!0===this.isPlaying&&(this._progress+=Math.max(this.context.currentTime-this._startedAt,0)*this.playbackRate,!0===this.loop&&(this._progress=this._progress%(this.duration||this.buffer.duration)),this.source.stop(),this.source.onended=null,this.isPlaying=!1),this;console.warn("THREE.Audio: this Audio has no playback control.")}stop(e=0){if(!1!==this.hasPlaybackControl)return this._progress=0,null!==this.source&&(this.source.stop(this.context.currentTime+e),this.source.onended=null),this.isPlaying=!1,this;console.warn("THREE.Audio: this Audio has no playback control.")}connect(){if(this.filters.length>0){this.source.connect(this.filters[0]);for(let e=1,t=this.filters.length;e<t;e++)this.filters[e-1].connect(this.filters[e]);this.filters[this.filters.length-1].connect(this.getOutput())}else this.source.connect(this.getOutput());return this._connected=!0,this}disconnect(){if(!1!==this._connected){if(this.filters.length>0){this.source.disconnect(this.filters[0]);for(let e=1,t=this.filters.length;e<t;e++)this.filters[e-1].disconnect(this.filters[e]);this.filters[this.filters.length-1].disconnect(this.getOutput())}else this.source.disconnect(this.getOutput());return this._connected=!1,this}}getFilters(){return this.filters}setFilters(e){return e||(e=[]),!0===this._connected?(this.disconnect(),this.filters=e.slice(),this.connect()):this.filters=e.slice(),this}setDetune(e){return this.detune=e,!0===this.isPlaying&&void 0!==this.source.detune&&this.source.detune.setTargetAtTime(this.detune,this.context.currentTime,.01),this}getDetune(){return this.detune}getFilter(){return this.getFilters()[0]}setFilter(e){return this.setFilters(e?[e]:[])}setPlaybackRate(e){if(!1!==this.hasPlaybackControl)return this.playbackRate=e,!0===this.isPlaying&&this.source.playbackRate.setTargetAtTime(this.playbackRate,this.context.currentTime,.01),this;console.warn("THREE.Audio: this Audio has no playback control.")}getPlaybackRate(){return this.playbackRate}onEnded(){this.isPlaying=!1,this._progress=0}getLoop(){return!1===this.hasPlaybackControl?(console.warn("THREE.Audio: this Audio has no playback control."),!1):this.loop}setLoop(e){if(!1!==this.hasPlaybackControl)return this.loop=e,!0===this.isPlaying&&(this.source.loop=this.loop),this;console.warn("THREE.Audio: this Audio has no playback control.")}setLoopStart(e){return this.loopStart=e,this}setLoopEnd(e){return this.loopEnd=e,this}getVolume(){return this.gain.gain.value}setVolume(e){return this.gain.gain.setTargetAtTime(e,this.context.currentTime,.01),this}copy(e,t){return super.copy(e,t),"buffer"!==e.sourceType?(console.warn("THREE.Audio: Audio source type cannot be copied."),this):(this.autoplay=e.autoplay,this.buffer=e.buffer,this.detune=e.detune,this.loop=e.loop,this.loopStart=e.loopStart,this.loopEnd=e.loopEnd,this.offset=e.offset,this.duration=e.duration,this.playbackRate=e.playbackRate,this.hasPlaybackControl=e.hasPlaybackControl,this.sourceType=e.sourceType,this.filters=e.filters.slice(),this)}clone(e){return new this.constructor(this.listener).copy(this,e)}}const Nd=new os,Od=new ss,Fd=new os,Qd=new os;class zd extends kd{constructor(e){super(e),this.panner=this.context.createPanner(),this.panner.panningModel="HRTF",this.panner.connect(this.gain)}connect(){super.connect(),this.panner.connect(this.gain)}disconnect(){super.disconnect(),this.panner.disconnect(this.gain)}getOutput(){return this.panner}getRefDistance(){return this.panner.refDistance}setRefDistance(e){return this.panner.refDistance=e,this}getRolloffFactor(){return this.panner.rolloffFactor}setRolloffFactor(e){return this.panner.rolloffFactor=e,this}getDistanceModel(){return this.panner.distanceModel}setDistanceModel(e){return this.panner.distanceModel=e,this}getMaxDistance(){return this.panner.maxDistance}setMaxDistance(e){return this.panner.maxDistance=e,this}setDirectionalCone(e,t,n){return this.panner.coneInnerAngle=e,this.panner.coneOuterAngle=t,this.panner.coneOuterGain=n,this}updateMatrixWorld(e){if(super.updateMatrixWorld(e),!0===this.hasPlaybackControl&&!1===this.isPlaying)return;this.matrixWorld.decompose(Nd,Od,Fd),Qd.set(0,0,1).applyQuaternion(Od);const t=this.panner;if(t.positionX){const e=this.context.currentTime+this.listener.timeDelta;t.positionX.linearRampToValueAtTime(Nd.x,e),t.positionY.linearRampToValueAtTime(Nd.y,e),t.positionZ.linearRampToValueAtTime(Nd.z,e),t.orientationX.linearRampToValueAtTime(Qd.x,e),t.orientationY.linearRampToValueAtTime(Qd.y,e),t.orientationZ.linearRampToValueAtTime(Qd.z,e)}else t.setPosition(Nd.x,Nd.y,Nd.z),t.setOrientation(Qd.x,Qd.y,Qd.z)}}class Gd{constructor(e,t=2048){this.analyser=e.context.createAnalyser(),this.analyser.fftSize=t,this.data=new Uint8Array(this.analyser.frequencyBinCount),e.getOutput().connect(this.analyser)}getFrequencyData(){return this.analyser.getByteFrequencyData(this.data),this.data}getAverageFrequency(){let e=0;const t=this.getFrequencyData();for(let n=0;n<t.length;n++)e+=t[n];return e/t.length}}class Hd{constructor(e,t,n){let i,r,s;switch(this.binding=e,this.valueSize=n,t){case"quaternion":i=this._slerp,r=this._slerpAdditive,s=this._setAdditiveIdentityQuaternion,this.buffer=new Float64Array(6*n),this._workIndex=5;break;case"string":case"bool":i=this._select,r=this._select,s=this._setAdditiveIdentityOther,this.buffer=new Array(5*n);break;default:i=this._lerp,r=this._lerpAdditive,s=this._setAdditiveIdentityNumeric,this.buffer=new Float64Array(5*n)}this._mixBufferRegion=i,this._mixBufferRegionAdditive=r,this._setIdentity=s,this._origIndex=3,this._addIndex=4,this.cumulativeWeight=0,this.cumulativeWeightAdditive=0,this.useCount=0,this.referenceCount=0}accumulate(e,t){const n=this.buffer,i=this.valueSize,r=e*i+i;let s=this.cumulativeWeight;if(0===s){for(let e=0;e!==i;++e)n[r+e]=n[e];s=t}else{s+=t;const e=t/s;this._mixBufferRegion(n,r,0,e,i)}this.cumulativeWeight=s}accumulateAdditive(e){const t=this.buffer,n=this.valueSize,i=n*this._addIndex;0===this.cumulativeWeightAdditive&&this._setIdentity(),this._mixBufferRegionAdditive(t,i,0,e,n),this.cumulativeWeightAdditive+=e}apply(e){const t=this.valueSize,n=this.buffer,i=e*t+t,r=this.cumulativeWeight,s=this.cumulativeWeightAdditive,o=this.binding;if(this.cumulativeWeight=0,this.cumulativeWeightAdditive=0,r<1){const e=t*this._origIndex;this._mixBufferRegion(n,i,e,1-r,t)}s>0&&this._mixBufferRegionAdditive(n,i,this._addIndex*t,1,t);for(let e=t,r=t+t;e!==r;++e)if(n[e]!==n[e+t]){o.setValue(n,i);break}}saveOriginalState(){const e=this.binding,t=this.buffer,n=this.valueSize,i=n*this._origIndex;e.getValue(t,i);for(let e=n,r=i;e!==r;++e)t[e]=t[i+e%n];this._setIdentity(),this.cumulativeWeight=0,this.cumulativeWeightAdditive=0}restoreOriginalState(){const e=3*this.valueSize;this.binding.setValue(this.buffer,e)}_setAdditiveIdentityNumeric(){const e=this._addIndex*this.valueSize,t=e+this.valueSize;for(let n=e;n<t;n++)this.buffer[n]=0}_setAdditiveIdentityQuaternion(){this._setAdditiveIdentityNumeric(),this.buffer[this._addIndex*this.valueSize+3]=1}_setAdditiveIdentityOther(){const e=this._origIndex*this.valueSize,t=this._addIndex*this.valueSize;for(let n=0;n<this.valueSize;n++)this.buffer[t+n]=this.buffer[e+n]}_select(e,t,n,i,r){if(i>=.5)for(let i=0;i!==r;++i)e[t+i]=e[n+i]}_slerp(e,t,n,i){ss.slerpFlat(e,t,e,t,e,n,i)}_slerpAdditive(e,t,n,i,r){const s=this._workIndex*r;ss.multiplyQuaternionsFlat(e,s,e,t,e,n),ss.slerpFlat(e,t,e,t,e,s,i)}_lerp(e,t,n,i,r){const s=1-i;for(let o=0;o!==r;++o){const r=t+o;e[r]=e[r]*s+e[n+o]*i}}_lerpAdditive(e,t,n,i,r){for(let s=0;s!==r;++s){const r=t+s;e[r]=e[r]+e[n+s]*i}}}const Vd="\\[\\]\\.:\\/",jd=new RegExp("["+Vd+"]","g"),Wd="[^"+Vd+"]",qd="[^"+Vd.replace("\\.","")+"]",Xd=new RegExp("^"+/((?:WC+[\/:])*)/.source.replace("WC",Wd)+/(WCOD+)?/.source.replace("WCOD",qd)+/(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace("WC",Wd)+/\.(WC+)(?:\[(.+)\])?/.source.replace("WC",Wd)+"$"),Yd=["material","materials","bones","map"];class Jd{constructor(e,t,n){this.path=t,this.parsedPath=n||Jd.parseTrackName(t),this.node=Jd.findNode(e,this.parsedPath.nodeName),this.rootNode=e,this.getValue=this._getValue_unbound,this.setValue=this._setValue_unbound}static create(e,t,n){return e&&e.isAnimationObjectGroup?new Jd.Composite(e,t,n):new Jd(e,t,n)}static sanitizeNodeName(e){return e.replace(/\s/g,"_").replace(jd,"")}static parseTrackName(e){const t=Xd.exec(e);if(null===t)throw new Error("PropertyBinding: Cannot parse trackName: "+e);const n={nodeName:t[2],objectName:t[3],objectIndex:t[4],propertyName:t[5],propertyIndex:t[6]},i=n.nodeName&&n.nodeName.lastIndexOf(".");if(void 0!==i&&-1!==i){const e=n.nodeName.substring(i+1);-1!==Yd.indexOf(e)&&(n.nodeName=n.nodeName.substring(0,i),n.objectName=e)}if(null===n.propertyName||0===n.propertyName.length)throw new Error("PropertyBinding: can not parse propertyName from trackName: "+e);return n}static findNode(e,t){if(void 0===t||""===t||"."===t||-1===t||t===e.name||t===e.uuid)return e;if(e.skeleton){const n=e.skeleton.getBoneByName(t);if(void 0!==n)return n}if(e.children){const n=function(e){for(let i=0;i<e.length;i++){const r=e[i];if(r.name===t||r.uuid===t)return r;const s=n(r.children);if(s)return s}return null},i=n(e.children);if(i)return i}return null}_getValue_unavailable(){}_setValue_unavailable(){}_getValue_direct(e,t){e[t]=this.targetObject[this.propertyName]}_getValue_array(e,t){const n=this.resolvedProperty;for(let i=0,r=n.length;i!==r;++i)e[t++]=n[i]}_getValue_arrayElement(e,t){e[t]=this.resolvedProperty[this.propertyIndex]}_getValue_toArray(e,t){this.resolvedProperty.toArray(e,t)}_setValue_direct(e,t){this.targetObject[this.propertyName]=e[t]}_setValue_direct_setNeedsUpdate(e,t){this.targetObject[this.propertyName]=e[t],this.targetObject.needsUpdate=!0}_setValue_direct_setMatrixWorldNeedsUpdate(e,t){this.targetObject[this.propertyName]=e[t],this.targetObject.matrixWorldNeedsUpdate=!0}_setValue_array(e,t){const n=this.resolvedProperty;for(let i=0,r=n.length;i!==r;++i)n[i]=e[t++]}_setValue_array_setNeedsUpdate(e,t){const n=this.resolvedProperty;for(let i=0,r=n.length;i!==r;++i)n[i]=e[t++];this.targetObject.needsUpdate=!0}_setValue_array_setMatrixWorldNeedsUpdate(e,t){const n=this.resolvedProperty;for(let i=0,r=n.length;i!==r;++i)n[i]=e[t++];this.targetObject.matrixWorldNeedsUpdate=!0}_setValue_arrayElement(e,t){this.resolvedProperty[this.propertyIndex]=e[t]}_setValue_arrayElement_setNeedsUpdate(e,t){this.resolvedProperty[this.propertyIndex]=e[t],this.targetObject.needsUpdate=!0}_setValue_arrayElement_setMatrixWorldNeedsUpdate(e,t){this.resolvedProperty[this.propertyIndex]=e[t],this.targetObject.matrixWorldNeedsUpdate=!0}_setValue_fromArray(e,t){this.resolvedProperty.fromArray(e,t)}_setValue_fromArray_setNeedsUpdate(e,t){this.resolvedProperty.fromArray(e,t),this.targetObject.needsUpdate=!0}_setValue_fromArray_setMatrixWorldNeedsUpdate(e,t){this.resolvedProperty.fromArray(e,t),this.targetObject.matrixWorldNeedsUpdate=!0}_getValue_unbound(e,t){this.bind(),this.getValue(e,t)}_setValue_unbound(e,t){this.bind(),this.setValue(e,t)}bind(){let e=this.node;const t=this.parsedPath,n=t.objectName,i=t.propertyName;let r=t.propertyIndex;if(e||(e=Jd.findNode(this.rootNode,t.nodeName),this.node=e),this.getValue=this._getValue_unavailable,this.setValue=this._setValue_unavailable,!e)return void console.warn("THREE.PropertyBinding: No target node found for track: "+this.path+".");if(n){let i=t.objectIndex;switch(n){case"materials":if(!e.material)return void console.error("THREE.PropertyBinding: Can not bind to material as node does not have a material.",this);if(!e.material.materials)return void console.error("THREE.PropertyBinding: Can not bind to material.materials as node.material does not have a materials array.",this);e=e.material.materials;break;case"bones":if(!e.skeleton)return void console.error("THREE.PropertyBinding: Can not bind to bones as node does not have a skeleton.",this);e=e.skeleton.bones;for(let t=0;t<e.length;t++)if(e[t].name===i){i=t;break}break;case"map":if("map"in e){e=e.map;break}if(!e.material)return void console.error("THREE.PropertyBinding: Can not bind to material as node does not have a material.",this);if(!e.material.map)return void console.error("THREE.PropertyBinding: Can not bind to material.map as node.material does not have a map.",this);e=e.material.map;break;default:if(void 0===e[n])return void console.error("THREE.PropertyBinding: Can not bind to objectName of node undefined.",this);e=e[n]}if(void 0!==i){if(void 0===e[i])return void console.error("THREE.PropertyBinding: Trying to bind to objectIndex of objectName, but is undefined.",this,e);e=e[i]}}const s=e[i];if(void 0===s){const n=t.nodeName;return void console.error("THREE.PropertyBinding: Trying to update property for track: "+n+"."+i+" but it wasn't found.",e)}let o=this.Versioning.None;this.targetObject=e,!0===e.isMaterial?o=this.Versioning.NeedsUpdate:!0===e.isObject3D&&(o=this.Versioning.MatrixWorldNeedsUpdate);let a=this.BindingType.Direct;if(void 0!==r){if("morphTargetInfluences"===i){if(!e.geometry)return void console.error("THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.",this);if(!e.geometry.morphAttributes)return void console.error("THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphAttributes.",this);void 0!==e.morphTargetDictionary[r]&&(r=e.morphTargetDictionary[r])}a=this.BindingType.ArrayElement,this.resolvedProperty=s,this.propertyIndex=r}else void 0!==s.fromArray&&void 0!==s.toArray?(a=this.BindingType.HasFromToArray,this.resolvedProperty=s):Array.isArray(s)?(a=this.BindingType.EntireArray,this.resolvedProperty=s):this.propertyName=i;this.getValue=this.GetterByBindingType[a],this.setValue=this.SetterByBindingTypeAndVersioning[a][o]}unbind(){this.node=null,this.getValue=this._getValue_unbound,this.setValue=this._setValue_unbound}}Jd.Composite=class{constructor(e,t,n){const i=n||Jd.parseTrackName(t);this._targetGroup=e,this._bindings=e.subscribe_(t,i)}getValue(e,t){this.bind();const n=this._targetGroup.nCachedObjects_,i=this._bindings[n];void 0!==i&&i.getValue(e,t)}setValue(e,t){const n=this._bindings;for(let i=this._targetGroup.nCachedObjects_,r=n.length;i!==r;++i)n[i].setValue(e,t)}bind(){const e=this._bindings;for(let t=this._targetGroup.nCachedObjects_,n=e.length;t!==n;++t)e[t].bind()}unbind(){const e=this._bindings;for(let t=this._targetGroup.nCachedObjects_,n=e.length;t!==n;++t)e[t].unbind()}},Jd.prototype.BindingType={Direct:0,EntireArray:1,ArrayElement:2,HasFromToArray:3},Jd.prototype.Versioning={None:0,NeedsUpdate:1,MatrixWorldNeedsUpdate:2},Jd.prototype.GetterByBindingType=[Jd.prototype._getValue_direct,Jd.prototype._getValue_array,Jd.prototype._getValue_arrayElement,Jd.prototype._getValue_toArray],Jd.prototype.SetterByBindingTypeAndVersioning=[[Jd.prototype._setValue_direct,Jd.prototype._setValue_direct_setNeedsUpdate,Jd.prototype._setValue_direct_setMatrixWorldNeedsUpdate],[Jd.prototype._setValue_array,Jd.prototype._setValue_array_setNeedsUpdate,Jd.prototype._setValue_array_setMatrixWorldNeedsUpdate],[Jd.prototype._setValue_arrayElement,Jd.prototype._setValue_arrayElement_setNeedsUpdate,Jd.prototype._setValue_arrayElement_setMatrixWorldNeedsUpdate],[Jd.prototype._setValue_fromArray,Jd.prototype._setValue_fromArray_setNeedsUpdate,Jd.prototype._setValue_fromArray_setMatrixWorldNeedsUpdate]];class Kd{constructor(){this.isAnimationObjectGroup=!0,this.uuid=xr(),this._objects=Array.prototype.slice.call(arguments),this.nCachedObjects_=0;const e={};this._indicesByUUID=e;for(let t=0,n=arguments.length;t!==n;++t)e[arguments[t].uuid]=t;this._paths=[],this._parsedPaths=[],this._bindings=[],this._bindingsIndicesByPath={};const t=this;this.stats={objects:{get total(){return t._objects.length},get inUse(){return this.total-t.nCachedObjects_}},get bindingsPerObject(){return t._bindings.length}}}add(){const e=this._objects,t=this._indicesByUUID,n=this._paths,i=this._parsedPaths,r=this._bindings,s=r.length;let o,a=e.length,l=this.nCachedObjects_;for(let c=0,h=arguments.length;c!==h;++c){const h=arguments[c],u=h.uuid;let d=t[u];if(void 0===d){d=a++,t[u]=d,e.push(h);for(let e=0,t=s;e!==t;++e)r[e].push(new Jd(h,n[e],i[e]))}else if(d<l){o=e[d];const a=--l,c=e[a];t[c.uuid]=d,e[d]=c,t[u]=a,e[a]=h;for(let e=0,t=s;e!==t;++e){const t=r[e],s=t[a];let o=t[d];t[d]=s,void 0===o&&(o=new Jd(h,n[e],i[e])),t[a]=o}}else e[d]!==o&&console.error("THREE.AnimationObjectGroup: Different objects with the same UUID detected. Clean the caches or recreate your infrastructure when reloading scenes.")}this.nCachedObjects_=l}remove(){const e=this._objects,t=this._indicesByUUID,n=this._bindings,i=n.length;let r=this.nCachedObjects_;for(let s=0,o=arguments.length;s!==o;++s){const o=arguments[s],a=o.uuid,l=t[a];if(void 0!==l&&l>=r){const s=r++,c=e[s];t[c.uuid]=l,e[l]=c,t[a]=s,e[s]=o;for(let e=0,t=i;e!==t;++e){const t=n[e],i=t[s],r=t[l];t[l]=i,t[s]=r}}}this.nCachedObjects_=r}uncache(){const e=this._objects,t=this._indicesByUUID,n=this._bindings,i=n.length;let r=this.nCachedObjects_,s=e.length;for(let o=0,a=arguments.length;o!==a;++o){const a=arguments[o].uuid,l=t[a];if(void 0!==l)if(delete t[a],l<r){const o=--r,a=e[o],c=--s,h=e[c];t[a.uuid]=l,e[l]=a,t[h.uuid]=o,e[o]=h,e.pop();for(let e=0,t=i;e!==t;++e){const t=n[e],i=t[o],r=t[c];t[l]=i,t[o]=r,t.pop()}}else{const r=--s,o=e[r];r>0&&(t[o.uuid]=l),e[l]=o,e.pop();for(let e=0,t=i;e!==t;++e){const t=n[e];t[l]=t[r],t.pop()}}}this.nCachedObjects_=r}subscribe_(e,t){const n=this._bindingsIndicesByPath;let i=n[e];const r=this._bindings;if(void 0!==i)return r[i];const s=this._paths,o=this._parsedPaths,a=this._objects,l=a.length,c=this.nCachedObjects_,h=new Array(l);i=r.length,n[e]=i,s.push(e),o.push(t),r.push(h);for(let n=c,i=a.length;n!==i;++n){const i=a[n];h[n]=new Jd(i,e,t)}return h}unsubscribe_(e){const t=this._bindingsIndicesByPath,n=t[e];if(void 0!==n){const i=this._paths,r=this._parsedPaths,s=this._bindings,o=s.length-1,a=s[o];t[e[o]]=n,s[n]=a,s.pop(),r[n]=r[o],r.pop(),i[n]=i[o],i.pop()}}}class Zd{constructor(e,t,n=null,i=t.blendMode){this._mixer=e,this._clip=t,this._localRoot=n,this.blendMode=i;const r=t.tracks,s=r.length,o=new Array(s),a={endingStart:fi,endingEnd:fi};for(let e=0;e!==s;++e){const t=r[e].createInterpolant(null);o[e]=t,t.settings=a}this._interpolantSettings=a,this._interpolants=o,this._propertyBindings=new Array(s),this._cacheIndex=null,this._byClipCacheIndex=null,this._timeScaleInterpolant=null,this._weightInterpolant=null,this.loop=ci,this._loopCount=-1,this._startTime=null,this.time=0,this.timeScale=1,this._effectiveTimeScale=1,this.weight=1,this._effectiveWeight=1,this.repetitions=1/0,this.paused=!1,this.enabled=!0,this.clampWhenFinished=!1,this.zeroSlopeAtStart=!0,this.zeroSlopeAtEnd=!0}play(){return this._mixer._activateAction(this),this}stop(){return this._mixer._deactivateAction(this),this.reset()}reset(){return this.paused=!1,this.enabled=!0,this.time=0,this._loopCount=-1,this._startTime=null,this.stopFading().stopWarping()}isRunning(){return this.enabled&&!this.paused&&0!==this.timeScale&&null===this._startTime&&this._mixer._isActiveAction(this)}isScheduled(){return this._mixer._isActiveAction(this)}startAt(e){return this._startTime=e,this}setLoop(e,t){return this.loop=e,this.repetitions=t,this}setEffectiveWeight(e){return this.weight=e,this._effectiveWeight=this.enabled?e:0,this.stopFading()}getEffectiveWeight(){return this._effectiveWeight}fadeIn(e){return this._scheduleFading(e,0,1)}fadeOut(e){return this._scheduleFading(e,1,0)}crossFadeFrom(e,t,n){if(e.fadeOut(t),this.fadeIn(t),n){const n=this._clip.duration,i=e._clip.duration,r=i/n,s=n/i;e.warp(1,r,t),this.warp(s,1,t)}return this}crossFadeTo(e,t,n){return e.crossFadeFrom(this,t,n)}stopFading(){const e=this._weightInterpolant;return null!==e&&(this._weightInterpolant=null,this._mixer._takeBackControlInterpolant(e)),this}setEffectiveTimeScale(e){return this.timeScale=e,this._effectiveTimeScale=this.paused?0:e,this.stopWarping()}getEffectiveTimeScale(){return this._effectiveTimeScale}setDuration(e){return this.timeScale=this._clip.duration/e,this.stopWarping()}syncWith(e){return this.time=e.time,this.timeScale=e.timeScale,this.stopWarping()}halt(e){return this.warp(this._effectiveTimeScale,0,e)}warp(e,t,n){const i=this._mixer,r=i.time,s=this.timeScale;let o=this._timeScaleInterpolant;null===o&&(o=i._lendControlInterpolant(),this._timeScaleInterpolant=o);const a=o.parameterPositions,l=o.sampleValues;return a[0]=r,a[1]=r+n,l[0]=e/s,l[1]=t/s,this}stopWarping(){const e=this._timeScaleInterpolant;return null!==e&&(this._timeScaleInterpolant=null,this._mixer._takeBackControlInterpolant(e)),this}getMixer(){return this._mixer}getClip(){return this._clip}getRoot(){return this._localRoot||this._mixer._root}_update(e,t,n,i){if(!this.enabled)return void this._updateWeight(e);const r=this._startTime;if(null!==r){const i=(e-r)*n;i<0||0===n?t=0:(this._startTime=null,t=n*i)}t*=this._updateTimeScale(e);const s=this._updateTime(t),o=this._updateWeight(e);if(o>0){const e=this._interpolants,t=this._propertyBindings;if(this.blendMode===vi)for(let n=0,i=e.length;n!==i;++n)e[n].evaluate(s),t[n].accumulateAdditive(o);else for(let n=0,r=e.length;n!==r;++n)e[n].evaluate(s),t[n].accumulate(i,o)}}_updateWeight(e){let t=0;if(this.enabled){t=this.weight;const n=this._weightInterpolant;if(null!==n){const i=n.evaluate(e)[0];t*=i,e>n.parameterPositions[1]&&(this.stopFading(),0===i&&(this.enabled=!1))}}return this._effectiveWeight=t,t}_updateTimeScale(e){let t=0;if(!this.paused){t=this.timeScale;const n=this._timeScaleInterpolant;null!==n&&(t*=n.evaluate(e)[0],e>n.parameterPositions[1]&&(this.stopWarping(),0===t?this.paused=!0:this.timeScale=t))}return this._effectiveTimeScale=t,t}_updateTime(e){const t=this._clip.duration,n=this.loop;let i=this.time+e,r=this._loopCount;const s=n===hi;if(0===e)return-1===r||!s||1&~r?i:t-i;if(n===li){-1===r&&(this._loopCount=0,this._setEndings(!0,!0,!1));e:{if(i>=t)i=t;else{if(!(i<0)){this.time=i;break e}i=0}this.clampWhenFinished?this.paused=!0:this.enabled=!1,this.time=i,this._mixer.dispatchEvent({type:"finished",action:this,direction:e<0?-1:1})}}else{if(-1===r&&(e>=0?(r=0,this._setEndings(!0,0===this.repetitions,s)):this._setEndings(0===this.repetitions,!0,s)),i>=t||i<0){const n=Math.floor(i/t);i-=t*n,r+=Math.abs(n);const o=this.repetitions-r;if(o<=0)this.clampWhenFinished?this.paused=!0:this.enabled=!1,i=e>0?t:0,this.time=i,this._mixer.dispatchEvent({type:"finished",action:this,direction:e>0?1:-1});else{if(1===o){const t=e<0;this._setEndings(t,!t,s)}else this._setEndings(!1,!1,s);this._loopCount=r,this.time=i,this._mixer.dispatchEvent({type:"loop",action:this,loopDelta:n})}}else this.time=i;if(s&&!(1&~r))return t-i}return i}_setEndings(e,t,n){const i=this._interpolantSettings;n?(i.endingStart=mi,i.endingEnd=mi):(i.endingStart=e?this.zeroSlopeAtStart?mi:fi:Ai,i.endingEnd=t?this.zeroSlopeAtEnd?mi:fi:Ai)}_scheduleFading(e,t,n){const i=this._mixer,r=i.time;let s=this._weightInterpolant;null===s&&(s=i._lendControlInterpolant(),this._weightInterpolant=s);const o=s.parameterPositions,a=s.sampleValues;return o[0]=r,a[0]=t,o[1]=r+e,a[1]=n,this}}const $d=new Float32Array(1);class ep extends gr{constructor(e){super(),this._root=e,this._initMemoryManager(),this._accuIndex=0,this.time=0,this.timeScale=1}_bindAction(e,t){const n=e._localRoot||this._root,i=e._clip.tracks,r=i.length,s=e._propertyBindings,o=e._interpolants,a=n.uuid,l=this._bindingsByRootAndName;let c=l[a];void 0===c&&(c={},l[a]=c);for(let e=0;e!==r;++e){const r=i[e],l=r.name;let h=c[l];if(void 0!==h)++h.referenceCount,s[e]=h;else{if(h=s[e],void 0!==h){null===h._cacheIndex&&(++h.referenceCount,this._addInactiveBinding(h,a,l));continue}const i=t&&t._propertyBindings[e].binding.parsedPath;h=new Hd(Jd.create(n,l,i),r.ValueTypeName,r.getValueSize()),++h.referenceCount,this._addInactiveBinding(h,a,l),s[e]=h}o[e].resultBuffer=h.buffer}}_activateAction(e){if(!this._isActiveAction(e)){if(null===e._cacheIndex){const t=(e._localRoot||this._root).uuid,n=e._clip.uuid,i=this._actionsByClip[n];this._bindAction(e,i&&i.knownActions[0]),this._addInactiveAction(e,n,t)}const t=e._propertyBindings;for(let e=0,n=t.length;e!==n;++e){const n=t[e];0==n.useCount++&&(this._lendBinding(n),n.saveOriginalState())}this._lendAction(e)}}_deactivateAction(e){if(this._isActiveAction(e)){const t=e._propertyBindings;for(let e=0,n=t.length;e!==n;++e){const n=t[e];0==--n.useCount&&(n.restoreOriginalState(),this._takeBackBinding(n))}this._takeBackAction(e)}}_initMemoryManager(){this._actions=[],this._nActiveActions=0,this._actionsByClip={},this._bindings=[],this._nActiveBindings=0,this._bindingsByRootAndName={},this._controlInterpolants=[],this._nActiveControlInterpolants=0;const e=this;this.stats={actions:{get total(){return e._actions.length},get inUse(){return e._nActiveActions}},bindings:{get total(){return e._bindings.length},get inUse(){return e._nActiveBindings}},controlInterpolants:{get total(){return e._controlInterpolants.length},get inUse(){return e._nActiveControlInterpolants}}}}_isActiveAction(e){const t=e._cacheIndex;return null!==t&&t<this._nActiveActions}_addInactiveAction(e,t,n){const i=this._actions,r=this._actionsByClip;let s=r[t];if(void 0===s)s={knownActions:[e],actionByRoot:{}},e._byClipCacheIndex=0,r[t]=s;else{const t=s.knownActions;e._byClipCacheIndex=t.length,t.push(e)}e._cacheIndex=i.length,i.push(e),s.actionByRoot[n]=e}_removeInactiveAction(e){const t=this._actions,n=t[t.length-1],i=e._cacheIndex;n._cacheIndex=i,t[i]=n,t.pop(),e._cacheIndex=null;const r=e._clip.uuid,s=this._actionsByClip,o=s[r],a=o.knownActions,l=a[a.length-1],c=e._byClipCacheIndex;l._byClipCacheIndex=c,a[c]=l,a.pop(),e._byClipCacheIndex=null,delete o.actionByRoot[(e._localRoot||this._root).uuid],0===a.length&&delete s[r],this._removeInactiveBindingsForAction(e)}_removeInactiveBindingsForAction(e){const t=e._propertyBindings;for(let e=0,n=t.length;e!==n;++e){const n=t[e];0==--n.referenceCount&&this._removeInactiveBinding(n)}}_lendAction(e){const t=this._actions,n=e._cacheIndex,i=this._nActiveActions++,r=t[i];e._cacheIndex=i,t[i]=e,r._cacheIndex=n,t[n]=r}_takeBackAction(e){const t=this._actions,n=e._cacheIndex,i=--this._nActiveActions,r=t[i];e._cacheIndex=i,t[i]=e,r._cacheIndex=n,t[n]=r}_addInactiveBinding(e,t,n){const i=this._bindingsByRootAndName,r=this._bindings;let s=i[t];void 0===s&&(s={},i[t]=s),s[n]=e,e._cacheIndex=r.length,r.push(e)}_removeInactiveBinding(e){const t=this._bindings,n=e.binding,i=n.rootNode.uuid,r=n.path,s=this._bindingsByRootAndName,o=s[i],a=t[t.length-1],l=e._cacheIndex;a._cacheIndex=l,t[l]=a,t.pop(),delete o[r],0===Object.keys(o).length&&delete s[i]}_lendBinding(e){const t=this._bindings,n=e._cacheIndex,i=this._nActiveBindings++,r=t[i];e._cacheIndex=i,t[i]=e,r._cacheIndex=n,t[n]=r}_takeBackBinding(e){const t=this._bindings,n=e._cacheIndex,i=--this._nActiveBindings,r=t[i];e._cacheIndex=i,t[i]=e,r._cacheIndex=n,t[n]=r}_lendControlInterpolant(){const e=this._controlInterpolants,t=this._nActiveControlInterpolants++;let n=e[t];return void 0===n&&(n=new bu(new Float32Array(2),new Float32Array(2),1,$d),n.__cacheIndex=t,e[t]=n),n}_takeBackControlInterpolant(e){const t=this._controlInterpolants,n=e.__cacheIndex,i=--this._nActiveControlInterpolants,r=t[i];e.__cacheIndex=i,t[i]=e,r.__cacheIndex=n,t[n]=r}clipAction(e,t,n){const i=t||this._root,r=i.uuid;let s="string"==typeof e?Ru.findByName(i,e):e;const o=null!==s?s.uuid:e,a=this._actionsByClip[o];let l=null;if(void 0===n&&(n=null!==s?s.blendMode:gi),void 0!==a){const e=a.actionByRoot[r];if(void 0!==e&&e.blendMode===n)return e;l=a.knownActions[0],null===s&&(s=l._clip)}if(null===s)return null;const c=new Zd(this,s,t,n);return this._bindAction(c,l),this._addInactiveAction(c,o,r),c}existingAction(e,t){const n=t||this._root,i=n.uuid,r="string"==typeof e?Ru.findByName(n,e):e,s=r?r.uuid:e,o=this._actionsByClip[s];return void 0!==o&&o.actionByRoot[i]||null}stopAllAction(){const e=this._actions;for(let t=this._nActiveActions-1;t>=0;--t)e[t].stop();return this}update(e){e*=this.timeScale;const t=this._actions,n=this._nActiveActions,i=this.time+=e,r=Math.sign(e),s=this._accuIndex^=1;for(let o=0;o!==n;++o)t[o]._update(i,e,r,s);const o=this._bindings,a=this._nActiveBindings;for(let e=0;e!==a;++e)o[e].apply(s);return this}setTime(e){this.time=0;for(let e=0;e<this._actions.length;e++)this._actions[e].time=0;return this.update(e)}getRoot(){return this._root}uncacheClip(e){const t=this._actions,n=e.uuid,i=this._actionsByClip,r=i[n];if(void 0!==r){const e=r.knownActions;for(let n=0,i=e.length;n!==i;++n){const i=e[n];this._deactivateAction(i);const r=i._cacheIndex,s=t[t.length-1];i._cacheIndex=null,i._byClipCacheIndex=null,s._cacheIndex=r,t[r]=s,t.pop(),this._removeInactiveBindingsForAction(i)}delete i[n]}}uncacheRoot(e){const t=e.uuid,n=this._actionsByClip;for(const e in n){const i=n[e].actionByRoot[t];void 0!==i&&(this._deactivateAction(i),this._removeInactiveAction(i))}const i=this._bindingsByRootAndName[t];if(void 0!==i)for(const e in i){const t=i[e];t.restoreOriginalState(),this._removeInactiveBinding(t)}}uncacheAction(e,t){const n=this.existingAction(e,t);null!==n&&(this._deactivateAction(n),this._removeInactiveAction(n))}}class tp extends $r{constructor(e=1,t=1,n=1,i={}){super(e,t,i),this.isRenderTarget3D=!0,this.depth=n,this.texture=new is(null,e,t,n),this.texture.isRenderTargetTexture=!0}}class np extends $r{constructor(e=1,t=1,n=1,i={}){super(e,t,i),this.isRenderTargetArray=!0,this.depth=n,this.texture=new ts(null,e,t,n),this.texture.isRenderTargetTexture=!0}}class ip{constructor(e){this.value=e}clone(){return new ip(void 0===this.value.clone?this.value:this.value.clone())}}let rp=0;class sp extends gr{constructor(){super(),this.isUniformsGroup=!0,Object.defineProperty(this,"id",{value:rp++}),this.name="",this.usage=ir,this.uniforms=[]}add(e){return this.uniforms.push(e),this}remove(e){const t=this.uniforms.indexOf(e);return-1!==t&&this.uniforms.splice(t,1),this}setName(e){return this.name=e,this}setUsage(e){return this.usage=e,this}dispose(){return this.dispatchEvent({type:"dispose"}),this}copy(e){this.name=e.name,this.usage=e.usage;const t=e.uniforms;this.uniforms.length=0;for(let e=0,n=t.length;e<n;e++){const n=Array.isArray(t[e])?t[e]:[t[e]];for(let e=0;e<n.length;e++)this.uniforms.push(n[e].clone())}return this}clone(){return(new this.constructor).copy(this)}}class op extends Qa{constructor(e,t,n=1){super(e,t),this.isInstancedInterleavedBuffer=!0,this.meshPerAttribute=n}copy(e){return super.copy(e),this.meshPerAttribute=e.meshPerAttribute,this}clone(e){const t=super.clone(e);return t.meshPerAttribute=this.meshPerAttribute,t}toJSON(e){const t=super.toJSON(e);return t.isInstancedInterleavedBuffer=!0,t.meshPerAttribute=this.meshPerAttribute,t}}class ap{constructor(e,t,n,i,r){this.isGLBufferAttribute=!0,this.name="",this.buffer=e,this.type=t,this.itemSize=n,this.elementSize=i,this.count=r,this.version=0}set needsUpdate(e){!0===e&&this.version++}setBuffer(e){return this.buffer=e,this}setType(e,t){return this.type=e,this.elementSize=t,this}setItemSize(e){return this.itemSize=e,this}setCount(e){return this.count=e,this}}const lp=new ks;class cp{constructor(e,t,n=0,i=1/0){this.ray=new Us(e,t),this.near=n,this.far=i,this.camera=null,this.layers=new qs,this.params={Mesh:{},Line:{threshold:1},LOD:{},Points:{threshold:1},Sprite:{}}}set(e,t){this.ray.set(e,t)}setFromCamera(e,t){t.isPerspectiveCamera?(this.ray.origin.setFromMatrixPosition(t.matrixWorld),this.ray.direction.set(e.x,e.y,.5).unproject(t).sub(this.ray.origin).normalize(),this.camera=t):t.isOrthographicCamera?(this.ray.origin.set(e.x,e.y,(t.near+t.far)/(t.near-t.far)).unproject(t),this.ray.direction.set(0,0,-1).transformDirection(t.matrixWorld),this.camera=t):console.error("THREE.Raycaster: Unsupported camera type: "+t.type)}setFromXRController(e){return lp.identity().extractRotation(e.matrixWorld),this.ray.origin.setFromMatrixPosition(e.matrixWorld),this.ray.direction.set(0,0,-1).applyMatrix4(lp),this}intersectObject(e,t=!0,n=[]){return up(e,this,n,t),n.sort(hp),n}intersectObjects(e,t=!0,n=[]){for(let i=0,r=e.length;i<r;i++)up(e[i],this,n,t);return n.sort(hp),n}}function hp(e,t){return e.distance-t.distance}function up(e,t,n,i){let r=!0;if(e.layers.test(t.layers)&&!1===e.raycast(t,n)&&(r=!1),!0===r&&!0===i){const i=e.children;for(let e=0,r=i.length;e<r;e++)up(i[e],t,n,!0)}}class dp{constructor(e=1,t=0,n=0){return this.radius=e,this.phi=t,this.theta=n,this}set(e,t,n){return this.radius=e,this.phi=t,this.theta=n,this}copy(e){return this.radius=e.radius,this.phi=e.phi,this.theta=e.theta,this}makeSafe(){const e=1e-6;return this.phi=Cr(this.phi,e,Math.PI-e),this}setFromVector3(e){return this.setFromCartesianCoords(e.x,e.y,e.z)}setFromCartesianCoords(e,t,n){return this.radius=Math.sqrt(e*e+t*t+n*n),0===this.radius?(this.theta=0,this.phi=0):(this.theta=Math.atan2(e,n),this.phi=Math.acos(Cr(t/this.radius,-1,1))),this}clone(){return(new this.constructor).copy(this)}}class pp{constructor(e=1,t=0,n=0){return this.radius=e,this.theta=t,this.y=n,this}set(e,t,n){return this.radius=e,this.theta=t,this.y=n,this}copy(e){return this.radius=e.radius,this.theta=e.theta,this.y=e.y,this}setFromVector3(e){return this.setFromCartesianCoords(e.x,e.y,e.z)}setFromCartesianCoords(e,t,n){return this.radius=Math.sqrt(e*e+n*n),this.theta=Math.atan2(e,n),this.y=t,this}clone(){return(new this.constructor).copy(this)}}class fp{constructor(e,t,n,i){fp.prototype.isMatrix2=!0,this.elements=[1,0,0,1],void 0!==e&&this.set(e,t,n,i)}identity(){return this.set(1,0,0,1),this}fromArray(e,t=0){for(let n=0;n<4;n++)this.elements[n]=e[n+t];return this}set(e,t,n,i){const r=this.elements;return r[0]=e,r[2]=t,r[1]=n,r[3]=i,this}}const mp=new Tr;class Ap{constructor(e=new Tr(1/0,1/0),t=new Tr(-1/0,-1/0)){this.isBox2=!0,this.min=e,this.max=t}set(e,t){return this.min.copy(e),this.max.copy(t),this}setFromPoints(e){this.makeEmpty();for(let t=0,n=e.length;t<n;t++)this.expandByPoint(e[t]);return this}setFromCenterAndSize(e,t){const n=mp.copy(t).multiplyScalar(.5);return this.min.copy(e).sub(n),this.max.copy(e).add(n),this}clone(){return(new this.constructor).copy(this)}copy(e){return this.min.copy(e.min),this.max.copy(e.max),this}makeEmpty(){return this.min.x=this.min.y=1/0,this.max.x=this.max.y=-1/0,this}isEmpty(){return this.max.x<this.min.x||this.max.y<this.min.y}getCenter(e){return this.isEmpty()?e.set(0,0):e.addVectors(this.min,this.max).multiplyScalar(.5)}getSize(e){return this.isEmpty()?e.set(0,0):e.subVectors(this.max,this.min)}expandByPoint(e){return this.min.min(e),this.max.max(e),this}expandByVector(e){return this.min.sub(e),this.max.add(e),this}expandByScalar(e){return this.min.addScalar(-e),this.max.addScalar(e),this}containsPoint(e){return e.x>=this.min.x&&e.x<=this.max.x&&e.y>=this.min.y&&e.y<=this.max.y}containsBox(e){return this.min.x<=e.min.x&&e.max.x<=this.max.x&&this.min.y<=e.min.y&&e.max.y<=this.max.y}getParameter(e,t){return t.set((e.x-this.min.x)/(this.max.x-this.min.x),(e.y-this.min.y)/(this.max.y-this.min.y))}intersectsBox(e){return e.max.x>=this.min.x&&e.min.x<=this.max.x&&e.max.y>=this.min.y&&e.min.y<=this.max.y}clampPoint(e,t){return t.copy(e).clamp(this.min,this.max)}distanceToPoint(e){return this.clampPoint(e,mp).distanceTo(e)}intersect(e){return this.min.max(e.min),this.max.min(e.max),this.isEmpty()&&this.makeEmpty(),this}union(e){return this.min.min(e.min),this.max.max(e.max),this}translate(e){return this.min.add(e),this.max.add(e),this}equals(e){return e.min.equals(this.min)&&e.max.equals(this.max)}}const gp=new os,vp=new os;class yp{constructor(e=new os,t=new os){this.start=e,this.end=t}set(e,t){return this.start.copy(e),this.end.copy(t),this}copy(e){return this.start.copy(e.start),this.end.copy(e.end),this}getCenter(e){return e.addVectors(this.start,this.end).multiplyScalar(.5)}delta(e){return e.subVectors(this.end,this.start)}distanceSq(){return this.start.distanceToSquared(this.end)}distance(){return this.start.distanceTo(this.end)}at(e,t){return this.delta(t).multiplyScalar(e).add(this.start)}closestPointToPointParameter(e,t){gp.subVectors(e,this.start),vp.subVectors(this.end,this.start);const n=vp.dot(vp);let i=vp.dot(gp)/n;return t&&(i=Cr(i,0,1)),i}closestPointToPoint(e,t,n){const i=this.closestPointToPointParameter(e,t);return this.delta(n).multiplyScalar(i).add(this.start)}applyMatrix4(e){return this.start.applyMatrix4(e),this.end.applyMatrix4(e),this}equals(e){return e.start.equals(this.start)&&e.end.equals(this.end)}clone(){return(new this.constructor).copy(this)}}const Ep=new os;class bp extends co{constructor(e,t){super(),this.light=e,this.matrixAutoUpdate=!1,this.color=t,this.type="SpotLightHelper";const n=new sa,i=[0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,-1,0,1,0,0,0,0,1,1,0,0,0,0,-1,1];for(let e=0,t=1,n=32;e<n;e++,t++){const r=e/n*Math.PI*2,s=t/n*Math.PI*2;i.push(Math.cos(r),Math.sin(r),1,Math.cos(s),Math.sin(s),1)}n.setAttribute("position",new Ko(i,3));const r=new ic({fog:!1,toneMapped:!1});this.cone=new mc(n,r),this.add(this.cone),this.update()}dispose(){this.cone.geometry.dispose(),this.cone.material.dispose()}update(){this.light.updateWorldMatrix(!0,!1),this.light.target.updateWorldMatrix(!0,!1),this.parent?(this.parent.updateWorldMatrix(!0),this.matrix.copy(this.parent.matrixWorld).invert().multiply(this.light.matrixWorld)):this.matrix.copy(this.light.matrixWorld),this.matrixWorld.copy(this.light.matrixWorld);const e=this.light.distance?this.light.distance:1e3,t=e*Math.tan(this.light.angle);this.cone.scale.set(t,t,e),Ep.setFromMatrixPosition(this.light.target.matrixWorld),this.cone.lookAt(Ep),void 0!==this.color?this.cone.material.color.set(this.color):this.cone.material.color.copy(this.light.color)}}const xp=new os,Cp=new ks,wp=new ks;class _p extends mc{constructor(e){const t=Mp(e),n=new sa,i=[],r=[],s=new To(0,0,1),o=new To(0,1,0);for(let e=0;e<t.length;e++){const n=t[e];n.parent&&n.parent.isBone&&(i.push(0,0,0),i.push(0,0,0),r.push(s.r,s.g,s.b),r.push(o.r,o.g,o.b))}n.setAttribute("position",new Ko(i,3)),n.setAttribute("color",new Ko(r,3)),super(n,new ic({vertexColors:!0,depthTest:!1,depthWrite:!1,toneMapped:!1,transparent:!0})),this.isSkeletonHelper=!0,this.type="SkeletonHelper",this.root=e,this.bones=t,this.matrix=e.matrixWorld,this.matrixAutoUpdate=!1}updateMatrixWorld(e){const t=this.bones,n=this.geometry,i=n.getAttribute("position");wp.copy(this.root.matrixWorld).invert();for(let e=0,n=0;e<t.length;e++){const r=t[e];r.parent&&r.parent.isBone&&(Cp.multiplyMatrices(wp,r.matrixWorld),xp.setFromMatrixPosition(Cp),i.setXYZ(n,xp.x,xp.y,xp.z),Cp.multiplyMatrices(wp,r.parent.matrixWorld),xp.setFromMatrixPosition(Cp),i.setXYZ(n+1,xp.x,xp.y,xp.z),n+=2)}n.getAttribute("position").needsUpdate=!0,super.updateMatrixWorld(e)}dispose(){this.geometry.dispose(),this.material.dispose()}}function Mp(e){const t=[];!0===e.isBone&&t.push(e);for(let n=0;n<e.children.length;n++)t.push.apply(t,Mp(e.children[n]));return t}class Ip extends ga{constructor(e,t,n){super(new qh(t,4,2),new Do({wireframe:!0,fog:!1,toneMapped:!1})),this.light=e,this.color=n,this.type="PointLightHelper",this.matrix=this.light.matrixWorld,this.matrixAutoUpdate=!1,this.update()}dispose(){this.geometry.dispose(),this.material.dispose()}update(){this.light.updateWorldMatrix(!0,!1),void 0!==this.color?this.material.color.set(this.color):this.material.color.copy(this.light.color)}}const Sp=new os,Tp=new To,Bp=new To;class Rp extends co{constructor(e,t,n){super(),this.light=e,this.matrix=e.matrixWorld,this.matrixAutoUpdate=!1,this.color=n,this.type="HemisphereLightHelper";const i=new Hh(t);i.rotateY(.5*Math.PI),this.material=new Do({wireframe:!0,fog:!1,toneMapped:!1}),void 0===this.color&&(this.material.vertexColors=!0);const r=i.getAttribute("position"),s=new Float32Array(3*r.count);i.setAttribute("color",new Go(s,3)),this.add(new ga(i,this.material)),this.update()}dispose(){this.children[0].geometry.dispose(),this.children[0].material.dispose()}update(){const e=this.children[0];if(void 0!==this.color)this.material.color.set(this.color);else{const t=e.geometry.getAttribute("color");Tp.copy(this.light.color),Bp.copy(this.light.groundColor);for(let e=0,n=t.count;e<n;e++){const i=e<n/2?Tp:Bp;t.setXYZ(e,i.r,i.g,i.b)}t.needsUpdate=!0}this.light.updateWorldMatrix(!0,!1),e.lookAt(Sp.setFromMatrixPosition(this.light.matrixWorld).negate())}}class Lp extends mc{constructor(e=10,t=10,n=4473924,i=8947848){n=new To(n),i=new To(i);const r=t/2,s=e/t,o=e/2,a=[],l=[];for(let e=0,c=0,h=-o;e<=t;e++,h+=s){a.push(-o,0,h,o,0,h),a.push(h,0,-o,h,0,o);const t=e===r?n:i;t.toArray(l,c),c+=3,t.toArray(l,c),c+=3,t.toArray(l,c),c+=3,t.toArray(l,c),c+=3}const c=new sa;c.setAttribute("position",new Ko(a,3)),c.setAttribute("color",new Ko(l,3)),super(c,new ic({vertexColors:!0,toneMapped:!1})),this.type="GridHelper"}dispose(){this.geometry.dispose(),this.material.dispose()}}class Dp extends mc{constructor(e=10,t=16,n=8,i=64,r=4473924,s=8947848){r=new To(r),s=new To(s);const o=[],a=[];if(t>1)for(let n=0;n<t;n++){const i=n/t*(2*Math.PI),l=Math.sin(i)*e,c=Math.cos(i)*e;o.push(0,0,0),o.push(l,0,c);const h=1&n?r:s;a.push(h.r,h.g,h.b),a.push(h.r,h.g,h.b)}for(let t=0;t<n;t++){const l=1&t?r:s,c=e-e/n*t;for(let e=0;e<i;e++){let t=e/i*(2*Math.PI),n=Math.sin(t)*c,r=Math.cos(t)*c;o.push(n,0,r),a.push(l.r,l.g,l.b),t=(e+1)/i*(2*Math.PI),n=Math.sin(t)*c,r=Math.cos(t)*c,o.push(n,0,r),a.push(l.r,l.g,l.b)}}const l=new sa;l.setAttribute("position",new Ko(o,3)),l.setAttribute("color",new Ko(a,3)),super(l,new ic({vertexColors:!0,toneMapped:!1})),this.type="PolarGridHelper"}dispose(){this.geometry.dispose(),this.material.dispose()}}const Pp=new os,Up=new os,kp=new os;class Np extends co{constructor(e,t,n){super(),this.light=e,this.matrix=e.matrixWorld,this.matrixAutoUpdate=!1,this.color=n,this.type="DirectionalLightHelper",void 0===t&&(t=1);let i=new sa;i.setAttribute("position",new Ko([-t,t,0,t,t,0,t,-t,0,-t,-t,0,-t,t,0],3));const r=new ic({fog:!1,toneMapped:!1});this.lightPlane=new uc(i,r),this.add(this.lightPlane),i=new sa,i.setAttribute("position",new Ko([0,0,0,0,0,1],3)),this.targetLine=new uc(i,r),this.add(this.targetLine),this.update()}dispose(){this.lightPlane.geometry.dispose(),this.lightPlane.material.dispose(),this.targetLine.geometry.dispose(),this.targetLine.material.dispose()}update(){this.light.updateWorldMatrix(!0,!1),this.light.target.updateWorldMatrix(!0,!1),Pp.setFromMatrixPosition(this.light.matrixWorld),Up.setFromMatrixPosition(this.light.target.matrixWorld),kp.subVectors(Up,Pp),this.lightPlane.lookAt(Up),void 0!==this.color?(this.lightPlane.material.color.set(this.color),this.targetLine.material.color.set(this.color)):(this.lightPlane.material.color.copy(this.light.color),this.targetLine.material.color.copy(this.light.color)),this.targetLine.lookAt(Up),this.targetLine.scale.z=kp.length()}}const Op=new os,Fp=new _a;class Qp extends mc{constructor(e){const t=new sa,n=new ic({color:16777215,vertexColors:!0,toneMapped:!1}),i=[],r=[],s={};function o(e,t){a(e),a(t)}function a(e){i.push(0,0,0),r.push(0,0,0),void 0===s[e]&&(s[e]=[]),s[e].push(i.length/3-1)}o("n1","n2"),o("n2","n4"),o("n4","n3"),o("n3","n1"),o("f1","f2"),o("f2","f4"),o("f4","f3"),o("f3","f1"),o("n1","f1"),o("n2","f2"),o("n3","f3"),o("n4","f4"),o("p","n1"),o("p","n2"),o("p","n3"),o("p","n4"),o("u1","u2"),o("u2","u3"),o("u3","u1"),o("c","t"),o("p","c"),o("cn1","cn2"),o("cn3","cn4"),o("cf1","cf2"),o("cf3","cf4"),t.setAttribute("position",new Ko(i,3)),t.setAttribute("color",new Ko(r,3)),super(t,n),this.type="CameraHelper",this.camera=e,this.camera.updateProjectionMatrix&&this.camera.updateProjectionMatrix(),this.matrix=e.matrixWorld,this.matrixAutoUpdate=!1,this.pointMap=s,this.update();const l=new To(16755200),c=new To(16711680),h=new To(43775),u=new To(16777215),d=new To(3355443);this.setColors(l,c,h,u,d)}setColors(e,t,n,i,r){const s=this.geometry.getAttribute("color");s.setXYZ(0,e.r,e.g,e.b),s.setXYZ(1,e.r,e.g,e.b),s.setXYZ(2,e.r,e.g,e.b),s.setXYZ(3,e.r,e.g,e.b),s.setXYZ(4,e.r,e.g,e.b),s.setXYZ(5,e.r,e.g,e.b),s.setXYZ(6,e.r,e.g,e.b),s.setXYZ(7,e.r,e.g,e.b),s.setXYZ(8,e.r,e.g,e.b),s.setXYZ(9,e.r,e.g,e.b),s.setXYZ(10,e.r,e.g,e.b),s.setXYZ(11,e.r,e.g,e.b),s.setXYZ(12,e.r,e.g,e.b),s.setXYZ(13,e.r,e.g,e.b),s.setXYZ(14,e.r,e.g,e.b),s.setXYZ(15,e.r,e.g,e.b),s.setXYZ(16,e.r,e.g,e.b),s.setXYZ(17,e.r,e.g,e.b),s.setXYZ(18,e.r,e.g,e.b),s.setXYZ(19,e.r,e.g,e.b),s.setXYZ(20,e.r,e.g,e.b),s.setXYZ(21,e.r,e.g,e.b),s.setXYZ(22,e.r,e.g,e.b),s.setXYZ(23,e.r,e.g,e.b),s.setXYZ(24,t.r,t.g,t.b),s.setXYZ(25,t.r,t.g,t.b),s.setXYZ(26,t.r,t.g,t.b),s.setXYZ(27,t.r,t.g,t.b),s.setXYZ(28,t.r,t.g,t.b),s.setXYZ(29,t.r,t.g,t.b),s.setXYZ(30,t.r,t.g,t.b),s.setXYZ(31,t.r,t.g,t.b),s.setXYZ(32,n.r,n.g,n.b),s.setXYZ(33,n.r,n.g,n.b),s.setXYZ(34,n.r,n.g,n.b),s.setXYZ(35,n.r,n.g,n.b),s.setXYZ(36,n.r,n.g,n.b),s.setXYZ(37,n.r,n.g,n.b),s.setXYZ(38,i.r,i.g,i.b),s.setXYZ(39,i.r,i.g,i.b),s.setXYZ(40,r.r,r.g,r.b),s.setXYZ(41,r.r,r.g,r.b),s.setXYZ(42,r.r,r.g,r.b),s.setXYZ(43,r.r,r.g,r.b),s.setXYZ(44,r.r,r.g,r.b),s.setXYZ(45,r.r,r.g,r.b),s.setXYZ(46,r.r,r.g,r.b),s.setXYZ(47,r.r,r.g,r.b),s.setXYZ(48,r.r,r.g,r.b),s.setXYZ(49,r.r,r.g,r.b),s.needsUpdate=!0}update(){const e=this.geometry,t=this.pointMap;Fp.projectionMatrixInverse.copy(this.camera.projectionMatrixInverse);const n=this.camera.coordinateSystem===fr?-1:0;zp("c",t,e,Fp,0,0,n),zp("t",t,e,Fp,0,0,1),zp("n1",t,e,Fp,-1,-1,n),zp("n2",t,e,Fp,1,-1,n),zp("n3",t,e,Fp,-1,1,n),zp("n4",t,e,Fp,1,1,n),zp("f1",t,e,Fp,-1,-1,1),zp("f2",t,e,Fp,1,-1,1),zp("f3",t,e,Fp,-1,1,1),zp("f4",t,e,Fp,1,1,1),zp("u1",t,e,Fp,.7,1.1,n),zp("u2",t,e,Fp,-.7,1.1,n),zp("u3",t,e,Fp,0,2,n),zp("cf1",t,e,Fp,-1,0,1),zp("cf2",t,e,Fp,1,0,1),zp("cf3",t,e,Fp,0,-1,1),zp("cf4",t,e,Fp,0,1,1),zp("cn1",t,e,Fp,-1,0,n),zp("cn2",t,e,Fp,1,0,n),zp("cn3",t,e,Fp,0,-1,n),zp("cn4",t,e,Fp,0,1,n),e.getAttribute("position").needsUpdate=!0}dispose(){this.geometry.dispose(),this.material.dispose()}}function zp(e,t,n,i,r,s,o){Op.set(r,s,o).unproject(i);const a=t[e];if(void 0!==a){const e=n.getAttribute("position");for(let t=0,n=a.length;t<n;t++)e.setXYZ(a[t],Op.x,Op.y,Op.z)}}const Gp=new cs;class Hp extends mc{constructor(e,t=16776960){const n=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]),i=new Float32Array(24),r=new sa;r.setIndex(new Go(n,1)),r.setAttribute("position",new Go(i,3)),super(r,new ic({color:t,toneMapped:!1})),this.object=e,this.type="BoxHelper",this.matrixAutoUpdate=!1,this.update()}update(e){if(void 0!==e&&console.warn("THREE.BoxHelper: .update() has no longer arguments."),void 0!==this.object&&Gp.setFromObject(this.object),Gp.isEmpty())return;const t=Gp.min,n=Gp.max,i=this.geometry.attributes.position,r=i.array;r[0]=n.x,r[1]=n.y,r[2]=n.z,r[3]=t.x,r[4]=n.y,r[5]=n.z,r[6]=t.x,r[7]=t.y,r[8]=n.z,r[9]=n.x,r[10]=t.y,r[11]=n.z,r[12]=n.x,r[13]=n.y,r[14]=t.z,r[15]=t.x,r[16]=n.y,r[17]=t.z,r[18]=t.x,r[19]=t.y,r[20]=t.z,r[21]=n.x,r[22]=t.y,r[23]=t.z,i.needsUpdate=!0,this.geometry.computeBoundingSphere()}setFromObject(e){return this.object=e,this.update(),this}copy(e,t){return super.copy(e,t),this.object=e.object,this}dispose(){this.geometry.dispose(),this.material.dispose()}}class Vp extends mc{constructor(e,t=16776960){const n=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]),i=new sa;i.setIndex(new Go(n,1)),i.setAttribute("position",new Ko([1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1],3)),super(i,new ic({color:t,toneMapped:!1})),this.box=e,this.type="Box3Helper",this.geometry.computeBoundingSphere()}updateMatrixWorld(e){const t=this.box;t.isEmpty()||(t.getCenter(this.position),t.getSize(this.scale),this.scale.multiplyScalar(.5),super.updateMatrixWorld(e))}dispose(){this.geometry.dispose(),this.material.dispose()}}class jp extends uc{constructor(e,t=1,n=16776960){const i=n,r=new sa;r.setAttribute("position",new Ko([1,-1,0,-1,1,0,-1,-1,0,1,1,0,-1,1,0,-1,-1,0,1,-1,0,1,1,0],3)),r.computeBoundingSphere(),super(r,new ic({color:i,toneMapped:!1})),this.type="PlaneHelper",this.plane=e,this.size=t;const s=new sa;s.setAttribute("position",new Ko([1,1,0,-1,1,0,-1,-1,0,1,1,0,-1,-1,0,1,-1,0],3)),s.computeBoundingSphere(),this.add(new ga(s,new Do({color:i,opacity:.2,transparent:!0,depthWrite:!1,toneMapped:!1})))}updateMatrixWorld(e){this.position.set(0,0,0),this.scale.set(.5*this.size,.5*this.size,1),this.lookAt(this.plane.normal),this.translateZ(-this.plane.constant),super.updateMatrixWorld(e)}dispose(){this.geometry.dispose(),this.material.dispose(),this.children[0].geometry.dispose(),this.children[0].material.dispose()}}const Wp=new os;let qp,Xp;class Yp extends co{constructor(e=new os(0,0,1),t=new os(0,0,0),n=1,i=16776960,r=.2*n,s=.2*r){super(),this.type="ArrowHelper",void 0===qp&&(qp=new sa,qp.setAttribute("position",new Ko([0,0,0,0,1,0],3)),Xp=new ih(0,.5,1,5,1),Xp.translate(0,-.5,0)),this.position.copy(t),this.line=new uc(qp,new ic({color:i,toneMapped:!1})),this.line.matrixAutoUpdate=!1,this.add(this.line),this.cone=new ga(Xp,new Do({color:i,toneMapped:!1})),this.cone.matrixAutoUpdate=!1,this.add(this.cone),this.setDirection(e),this.setLength(n,r,s)}setDirection(e){if(e.y>.99999)this.quaternion.set(0,0,0,1);else if(e.y<-.99999)this.quaternion.set(1,0,0,0);else{Wp.set(e.z,0,-e.x).normalize();const t=Math.acos(e.y);this.quaternion.setFromAxisAngle(Wp,t)}}setLength(e,t=.2*e,n=.2*t){this.line.scale.set(1,Math.max(1e-4,e-t),1),this.line.updateMatrix(),this.cone.scale.set(n,t,n),this.cone.position.y=e,this.cone.updateMatrix()}setColor(e){this.line.material.color.set(e),this.cone.material.color.set(e)}copy(e){return super.copy(e,!1),this.line.copy(e.line),this.cone.copy(e.cone),this}dispose(){this.line.geometry.dispose(),this.line.material.dispose(),this.cone.geometry.dispose(),this.cone.material.dispose()}}class Jp extends mc{constructor(e=1){const t=[0,0,0,e,0,0,0,0,0,0,e,0,0,0,0,0,0,e],n=new sa;n.setAttribute("position",new Ko(t,3)),n.setAttribute("color",new Ko([1,0,0,1,.6,0,0,1,0,.6,1,0,0,0,1,0,.6,1],3)),super(n,new ic({vertexColors:!0,toneMapped:!1})),this.type="AxesHelper"}setColors(e,t,n){const i=new To,r=this.geometry.attributes.color.array;return i.set(e),i.toArray(r,0),i.toArray(r,3),i.set(t),i.toArray(r,6),i.toArray(r,9),i.set(n),i.toArray(r,12),i.toArray(r,15),this.geometry.attributes.color.needsUpdate=!0,this}dispose(){this.geometry.dispose(),this.material.dispose()}}class Kp{constructor(){this.type="ShapePath",this.color=new To,this.subPaths=[],this.currentPath=null}moveTo(e,t){return this.currentPath=new $c,this.subPaths.push(this.currentPath),this.currentPath.moveTo(e,t),this}lineTo(e,t){return this.currentPath.lineTo(e,t),this}quadraticCurveTo(e,t,n,i){return this.currentPath.quadraticCurveTo(e,t,n,i),this}bezierCurveTo(e,t,n,i,r,s){return this.currentPath.bezierCurveTo(e,t,n,i,r,s),this}splineThru(e){return this.currentPath.splineThru(e),this}toShapes(e){function t(e,t){const n=t.length;let i=!1;for(let r=n-1,s=0;s<n;r=s++){let n=t[r],o=t[s],a=o.x-n.x,l=o.y-n.y;if(Math.abs(l)>Number.EPSILON){if(l<0&&(n=t[s],a=-a,o=t[r],l=-l),e.y<n.y||e.y>o.y)continue;if(e.y===n.y){if(e.x===n.x)return!0}else{const t=l*(e.x-n.x)-a*(e.y-n.y);if(0===t)return!0;if(t<0)continue;i=!i}}else{if(e.y!==n.y)continue;if(o.x<=e.x&&e.x<=n.x||n.x<=e.x&&e.x<=o.x)return!0}}return i}const n=Nh.isClockWise,i=this.subPaths;if(0===i.length)return[];let r,s,o;const a=[];if(1===i.length)return s=i[0],o=new dh,o.curves=s.curves,a.push(o),a;let l=!n(i[0].getPoints());l=e?!l:l;const c=[],h=[];let u,d,p=[],f=0;h[f]=void 0,p[f]=[];for(let t=0,o=i.length;t<o;t++)s=i[t],u=s.getPoints(),r=n(u),r=e?!r:r,r?(!l&&h[f]&&f++,h[f]={s:new dh,p:u},h[f].s.curves=s.curves,l&&f++,p[f]=[]):p[f].push({h:s,p:u[0]});if(!h[0])return function(e){const t=[];for(let n=0,i=e.length;n<i;n++){const i=e[n],r=new dh;r.curves=i.curves,t.push(r)}return t}(i);if(h.length>1){let e=!1,n=0;for(let e=0,t=h.length;e<t;e++)c[e]=[];for(let i=0,r=h.length;i<r;i++){const r=p[i];for(let s=0;s<r.length;s++){const o=r[s];let a=!0;for(let r=0;r<h.length;r++)t(o.p,h[r].p)&&(i!==r&&n++,a?(a=!1,c[r].push(o)):e=!0);a&&c[i].push(o)}}n>0&&!1===e&&(p=c)}for(let e=0,t=h.length;e<t;e++){o=h[e].s,a.push(o),d=p[e];for(let e=0,t=d.length;e<t;e++)o.holes.push(d[e].h)}return a}}class Zp extends gr{constructor(e,t=null){super(),this.object=e,this.domElement=t,this.enabled=!0,this.state=-1,this.keys={},this.mouseButtons={LEFT:null,MIDDLE:null,RIGHT:null},this.touches={ONE:null,TWO:null}}connect(){}disconnect(){}dispose(){}update(){}}function $p(e,t,n,i){const r=function(e){switch(e){case sn:case on:return{byteLength:1,components:1};case ln:case an:case dn:return{byteLength:2,components:1};case pn:case fn:return{byteLength:2,components:4};case hn:case cn:case un:return{byteLength:4,components:1};case An:return{byteLength:4,components:3}}throw new Error(`Unknown texture type ${e}.`)}(i);switch(n){case gn:case En:return e*t;case bn:return e*t*2;case wn:case _n:return e*t/r.components*r.byteLength;case Mn:case In:return e*t*2/r.components*r.byteLength;case vn:return e*t*3/r.components*r.byteLength;case yn:case Tn:return e*t*4/r.components*r.byteLength;case Bn:case Rn:return Math.floor((e+3)/4)*Math.floor((t+3)/4)*8;case Ln:case Dn:return Math.floor((e+3)/4)*Math.floor((t+3)/4)*16;case Un:case Nn:return Math.max(e,16)*Math.max(t,8)/4;case Pn:case kn:return Math.max(e,8)*Math.max(t,8)/2;case On:case Fn:return Math.floor((e+3)/4)*Math.floor((t+3)/4)*8;case Qn:case zn:return Math.floor((e+3)/4)*Math.floor((t+3)/4)*16;case Gn:return Math.floor((e+4)/5)*Math.floor((t+3)/4)*16;case Hn:return Math.floor((e+4)/5)*Math.floor((t+4)/5)*16;case Vn:return Math.floor((e+5)/6)*Math.floor((t+4)/5)*16;case jn:return Math.floor((e+5)/6)*Math.floor((t+5)/6)*16;case Wn:return Math.floor((e+7)/8)*Math.floor((t+4)/5)*16;case qn:return Math.floor((e+7)/8)*Math.floor((t+5)/6)*16;case Xn:return Math.floor((e+7)/8)*Math.floor((t+7)/8)*16;case Yn:return Math.floor((e+9)/10)*Math.floor((t+4)/5)*16;case Jn:return Math.floor((e+9)/10)*Math.floor((t+5)/6)*16;case Kn:return Math.floor((e+9)/10)*Math.floor((t+7)/8)*16;case Zn:return Math.floor((e+9)/10)*Math.floor((t+9)/10)*16;case $n:return Math.floor((e+11)/12)*Math.floor((t+9)/10)*16;case ei:return Math.floor((e+11)/12)*Math.floor((t+11)/12)*16;case ti:case ni:case ii:return Math.ceil(e/4)*Math.ceil(t/4)*16;case ri:case si:return Math.ceil(e/4)*Math.ceil(t/4)*8;case oi:case ai:return Math.ceil(e/4)*Math.ceil(t/4)*16}throw new Error(`Unable to determine texture byte length for ${n} format.`)}const ef={contain:function(e,t){const n=e.image&&e.image.width?e.image.width/e.image.height:1;return n>t?(e.repeat.x=1,e.repeat.y=n/t,e.offset.x=0,e.offset.y=(1-e.repeat.y)/2):(e.repeat.x=t/n,e.repeat.y=1,e.offset.x=(1-e.repeat.x)/2,e.offset.y=0),e},cover:function(e,t){const n=e.image&&e.image.width?e.image.width/e.image.height:1;return n>t?(e.repeat.x=t/n,e.repeat.y=1,e.offset.x=(1-e.repeat.x)/2,e.offset.y=0):(e.repeat.x=1,e.repeat.y=n/t,e.offset.x=0,e.offset.y=(1-e.repeat.y)/2),e},fill:function(e){return e.repeat.x=1,e.repeat.y=1,e.offset.x=0,e.offset.y=0,e},getByteLength:$p};function tf(){let e=null,t=!1,n=null,i=null;function r(t,s){n(t,s),i=e.requestAnimationFrame(r)}return{start:function(){!0!==t&&null!==n&&(i=e.requestAnimationFrame(r),t=!0)},stop:function(){e.cancelAnimationFrame(i),t=!1},setAnimationLoop:function(e){n=e},setContext:function(t){e=t}}}function nf(e){const t=new WeakMap;return{get:function(e){return e.isInterleavedBufferAttribute&&(e=e.data),t.get(e)},remove:function(n){n.isInterleavedBufferAttribute&&(n=n.data);const i=t.get(n);i&&(e.deleteBuffer(i.buffer),t.delete(n))},update:function(n,i){if(n.isInterleavedBufferAttribute&&(n=n.data),n.isGLBufferAttribute){const e=t.get(n);return void((!e||e.version<n.version)&&t.set(n,{buffer:n.buffer,type:n.type,bytesPerElement:n.elementSize,version:n.version}))}const r=t.get(n);if(void 0===r)t.set(n,function(t,n){const i=t.array,r=t.usage,s=i.byteLength,o=e.createBuffer();let a;if(e.bindBuffer(n,o),e.bufferData(n,i,r),t.onUploadCallback(),i instanceof Float32Array)a=e.FLOAT;else if(i instanceof Uint16Array)a=t.isFloat16BufferAttribute?e.HALF_FLOAT:e.UNSIGNED_SHORT;else if(i instanceof Int16Array)a=e.SHORT;else if(i instanceof Uint32Array)a=e.UNSIGNED_INT;else if(i instanceof Int32Array)a=e.INT;else if(i instanceof Int8Array)a=e.BYTE;else if(i instanceof Uint8Array)a=e.UNSIGNED_BYTE;else{if(!(i instanceof Uint8ClampedArray))throw new Error("THREE.WebGLAttributes: Unsupported buffer data format: "+i);a=e.UNSIGNED_BYTE}return{buffer:o,type:a,bytesPerElement:i.BYTES_PER_ELEMENT,version:t.version,size:s}}(n,i));else if(r.version<n.version){if(r.size!==n.array.byteLength)throw new Error("THREE.WebGLAttributes: The size of the buffer attribute's array buffer does not match the original size. Resizing buffer attributes is not supported.");!function(t,n,i){const r=n.array,s=n.updateRanges;if(e.bindBuffer(i,t),0===s.length)e.bufferSubData(i,0,r);else{s.sort(((e,t)=>e.start-t.start));let t=0;for(let e=1;e<s.length;e++){const n=s[t],i=s[e];i.start<=n.start+n.count+1?n.count=Math.max(n.count,i.start+i.count-n.start):(++t,s[t]=i)}s.length=t+1;for(let t=0,n=s.length;t<n;t++){const n=s[t];e.bufferSubData(i,n.start*r.BYTES_PER_ELEMENT,r,n.start,n.count)}n.clearUpdateRanges()}n.onUploadCallback()}(r.buffer,n,i),r.version=n.version}}}}"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("register",{detail:{revision:Le}})),"undefined"!=typeof window&&(window.__THREE__?console.warn("WARNING: Multiple instances of Three.js being imported."):window.__THREE__=Le);const rf={alphahash_fragment:"#ifdef USE_ALPHAHASH\n\tif ( diffuseColor.a < getAlphaHashThreshold( vPosition ) ) discard;\n#endif",alphahash_pars_fragment:"#ifdef USE_ALPHAHASH\n\tconst float ALPHA_HASH_SCALE = 0.05;\n\tfloat hash2D( vec2 value ) {\n\t\treturn fract( 1.0e4 * sin( 17.0 * value.x + 0.1 * value.y ) * ( 0.1 + abs( sin( 13.0 * value.y + value.x ) ) ) );\n\t}\n\tfloat hash3D( vec3 value ) {\n\t\treturn hash2D( vec2( hash2D( value.xy ), value.z ) );\n\t}\n\tfloat getAlphaHashThreshold( vec3 position ) {\n\t\tfloat maxDeriv = max(\n\t\t\tlength( dFdx( position.xyz ) ),\n\t\t\tlength( dFdy( position.xyz ) )\n\t\t);\n\t\tfloat pixScale = 1.0 / ( ALPHA_HASH_SCALE * maxDeriv );\n\t\tvec2 pixScales = vec2(\n\t\t\texp2( floor( log2( pixScale ) ) ),\n\t\t\texp2( ceil( log2( pixScale ) ) )\n\t\t);\n\t\tvec2 alpha = vec2(\n\t\t\thash3D( floor( pixScales.x * position.xyz ) ),\n\t\t\thash3D( floor( pixScales.y * position.xyz ) )\n\t\t);\n\t\tfloat lerpFactor = fract( log2( pixScale ) );\n\t\tfloat x = ( 1.0 - lerpFactor ) * alpha.x + lerpFactor * alpha.y;\n\t\tfloat a = min( lerpFactor, 1.0 - lerpFactor );\n\t\tvec3 cases = vec3(\n\t\t\tx * x / ( 2.0 * a * ( 1.0 - a ) ),\n\t\t\t( x - 0.5 * a ) / ( 1.0 - a ),\n\t\t\t1.0 - ( ( 1.0 - x ) * ( 1.0 - x ) / ( 2.0 * a * ( 1.0 - a ) ) )\n\t\t);\n\t\tfloat threshold = ( x < ( 1.0 - a ) )\n\t\t\t? ( ( x < a ) ? cases.x : cases.y )\n\t\t\t: cases.z;\n\t\treturn clamp( threshold , 1.0e-6, 1.0 );\n\t}\n#endif",alphamap_fragment:"#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, vAlphaMapUv ).g;\n#endif",alphamap_pars_fragment:"#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif",alphatest_fragment:"#ifdef USE_ALPHATEST\n\t#ifdef ALPHA_TO_COVERAGE\n\tdiffuseColor.a = smoothstep( alphaTest, alphaTest + fwidth( diffuseColor.a ), diffuseColor.a );\n\tif ( diffuseColor.a == 0.0 ) discard;\n\t#else\n\tif ( diffuseColor.a < alphaTest ) discard;\n\t#endif\n#endif",alphatest_pars_fragment:"#ifdef USE_ALPHATEST\n\tuniform float alphaTest;\n#endif",aomap_fragment:"#ifdef USE_AOMAP\n\tfloat ambientOcclusion = ( texture2D( aoMap, vAoMapUv ).r - 1.0 ) * aoMapIntensity + 1.0;\n\treflectedLight.indirectDiffuse *= ambientOcclusion;\n\t#if defined( USE_CLEARCOAT ) \n\t\tclearcoatSpecularIndirect *= ambientOcclusion;\n\t#endif\n\t#if defined( USE_SHEEN ) \n\t\tsheenSpecularIndirect *= ambientOcclusion;\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( STANDARD )\n\t\tfloat dotNV = saturate( dot( geometryNormal, geometryViewDir ) );\n\t\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.roughness );\n\t#endif\n#endif",aomap_pars_fragment:"#ifdef USE_AOMAP\n\tuniform sampler2D aoMap;\n\tuniform float aoMapIntensity;\n#endif",batching_pars_vertex:"#ifdef USE_BATCHING\n\t#if ! defined( GL_ANGLE_multi_draw )\n\t#define gl_DrawID _gl_DrawID\n\tuniform int _gl_DrawID;\n\t#endif\n\tuniform highp sampler2D batchingTexture;\n\tuniform highp usampler2D batchingIdTexture;\n\tmat4 getBatchingMatrix( const in float i ) {\n\t\tint size = textureSize( batchingTexture, 0 ).x;\n\t\tint j = int( i ) * 4;\n\t\tint x = j % size;\n\t\tint y = j / size;\n\t\tvec4 v1 = texelFetch( batchingTexture, ivec2( x, y ), 0 );\n\t\tvec4 v2 = texelFetch( batchingTexture, ivec2( x + 1, y ), 0 );\n\t\tvec4 v3 = texelFetch( batchingTexture, ivec2( x + 2, y ), 0 );\n\t\tvec4 v4 = texelFetch( batchingTexture, ivec2( x + 3, y ), 0 );\n\t\treturn mat4( v1, v2, v3, v4 );\n\t}\n\tfloat getIndirectIndex( const in int i ) {\n\t\tint size = textureSize( batchingIdTexture, 0 ).x;\n\t\tint x = i % size;\n\t\tint y = i / size;\n\t\treturn float( texelFetch( batchingIdTexture, ivec2( x, y ), 0 ).r );\n\t}\n#endif\n#ifdef USE_BATCHING_COLOR\n\tuniform sampler2D batchingColorTexture;\n\tvec3 getBatchingColor( const in float i ) {\n\t\tint size = textureSize( batchingColorTexture, 0 ).x;\n\t\tint j = int( i );\n\t\tint x = j % size;\n\t\tint y = j / size;\n\t\treturn texelFetch( batchingColorTexture, ivec2( x, y ), 0 ).rgb;\n\t}\n#endif",batching_vertex:"#ifdef USE_BATCHING\n\tmat4 batchingMatrix = getBatchingMatrix( getIndirectIndex( gl_DrawID ) );\n#endif",begin_vertex:"vec3 transformed = vec3( position );\n#ifdef USE_ALPHAHASH\n\tvPosition = vec3( position );\n#endif",beginnormal_vertex:"vec3 objectNormal = vec3( normal );\n#ifdef USE_TANGENT\n\tvec3 objectTangent = vec3( tangent.xyz );\n#endif",bsdfs:"float 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} // validated",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\treturn 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 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",bumpmap_pars_fragment:"#ifdef USE_BUMPMAP\n\tuniform sampler2D bumpMap;\n\tuniform float bumpScale;\n\tvec2 dHdxy_fwd() {\n\t\tvec2 dSTdx = dFdx( vBumpMapUv );\n\t\tvec2 dSTdy = dFdy( vBumpMapUv );\n\t\tfloat Hll = bumpScale * texture2D( bumpMap, vBumpMapUv ).x;\n\t\tfloat dBx = bumpScale * texture2D( bumpMap, vBumpMapUv + dSTdx ).x - Hll;\n\t\tfloat dBy = bumpScale * texture2D( bumpMap, vBumpMapUv + 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 = normalize( dFdx( surf_pos.xyz ) );\n\t\tvec3 vSigmaY = normalize( 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",clipping_planes_fragment:"#if NUM_CLIPPING_PLANES > 0\n\tvec4 plane;\n\t#ifdef ALPHA_TO_COVERAGE\n\t\tfloat distanceToPlane, distanceGradient;\n\t\tfloat clipOpacity = 1.0;\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tdistanceToPlane = - dot( vClipPosition, plane.xyz ) + plane.w;\n\t\t\tdistanceGradient = fwidth( distanceToPlane ) / 2.0;\n\t\t\tclipOpacity *= smoothstep( - distanceGradient, distanceGradient, distanceToPlane );\n\t\t\tif ( clipOpacity == 0.0 ) discard;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\t\tfloat unionClipOpacity = 1.0;\n\t\t\t#pragma unroll_loop_start\n\t\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\t\t\t\tplane = clippingPlanes[ i ];\n\t\t\t\tdistanceToPlane = - dot( vClipPosition, plane.xyz ) + plane.w;\n\t\t\t\tdistanceGradient = fwidth( distanceToPlane ) / 2.0;\n\t\t\t\tunionClipOpacity *= 1.0 - smoothstep( - distanceGradient, distanceGradient, distanceToPlane );\n\t\t\t}\n\t\t\t#pragma unroll_loop_end\n\t\t\tclipOpacity *= 1.0 - unionClipOpacity;\n\t\t#endif\n\t\tdiffuseColor.a *= clipOpacity;\n\t\tif ( diffuseColor.a == 0.0 ) discard;\n\t#else\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tif ( dot( vClipPosition, plane.xyz ) > plane.w ) discard;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\t\tbool clipped = true;\n\t\t\t#pragma unroll_loop_start\n\t\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\t\t\t\tplane = clippingPlanes[ i ];\n\t\t\t\tclipped = ( dot( vClipPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t\t}\n\t\t\t#pragma unroll_loop_end\n\t\t\tif ( clipped ) discard;\n\t\t#endif\n\t#endif\n#endif",clipping_planes_pars_fragment:"#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif",clipping_planes_pars_vertex:"#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n#endif",clipping_planes_vertex:"#if NUM_CLIPPING_PLANES > 0\n\tvClipPosition = - mvPosition.xyz;\n#endif",color_fragment:"#if defined( USE_COLOR_ALPHA )\n\tdiffuseColor *= vColor;\n#elif defined( USE_COLOR )\n\tdiffuseColor.rgb *= vColor;\n#endif",color_pars_fragment:"#if defined( USE_COLOR_ALPHA )\n\tvarying vec4 vColor;\n#elif defined( USE_COLOR )\n\tvarying vec3 vColor;\n#endif",color_pars_vertex:"#if defined( USE_COLOR_ALPHA )\n\tvarying vec4 vColor;\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR )\n\tvarying vec3 vColor;\n#endif",color_vertex:"#if defined( USE_COLOR_ALPHA )\n\tvColor = vec4( 1.0 );\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_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#ifdef USE_BATCHING_COLOR\n\tvec3 batchingColor = getBatchingColor( getIndirectIndex( gl_DrawID ) );\n\tvColor.xyz *= batchingColor.xyz;\n#endif",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};\n#ifdef USE_ALPHAHASH\n\tvarying vec3 vPosition;\n#endif\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}\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}\nvec3 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} // validated",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\thighp vec2 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 cubeUV_r0 1.0\n\t#define cubeUV_m0 - 2.0\n\t#define cubeUV_r1 0.8\n\t#define cubeUV_m1 - 1.0\n\t#define cubeUV_r4 0.4\n\t#define cubeUV_m4 2.0\n\t#define cubeUV_r5 0.305\n\t#define cubeUV_m5 3.0\n\t#define cubeUV_r6 0.21\n\t#define cubeUV_m6 4.0\n\tfloat roughnessToMip( float roughness ) {\n\t\tfloat mip = 0.0;\n\t\tif ( roughness >= cubeUV_r1 ) {\n\t\t\tmip = ( cubeUV_r0 - roughness ) * ( cubeUV_m1 - cubeUV_m0 ) / ( cubeUV_r0 - cubeUV_r1 ) + cubeUV_m0;\n\t\t} else if ( roughness >= cubeUV_r4 ) {\n\t\t\tmip = ( cubeUV_r1 - roughness ) * ( cubeUV_m4 - cubeUV_m1 ) / ( cubeUV_r1 - cubeUV_r4 ) + cubeUV_m1;\n\t\t} else if ( roughness >= cubeUV_r5 ) {\n\t\t\tmip = ( cubeUV_r4 - roughness ) * ( cubeUV_m5 - cubeUV_m4 ) / ( cubeUV_r4 - cubeUV_r5 ) + cubeUV_m4;\n\t\t} else if ( roughness >= cubeUV_r6 ) {\n\t\t\tmip = ( cubeUV_r5 - roughness ) * ( cubeUV_m6 - cubeUV_m5 ) / ( cubeUV_r5 - cubeUV_r6 ) + cubeUV_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 ), cubeUV_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",defaultnormal_vertex:"vec3 transformedNormal = objectNormal;\n#ifdef USE_TANGENT\n\tvec3 transformedTangent = objectTangent;\n#endif\n#ifdef USE_BATCHING\n\tmat3 bm = mat3( batchingMatrix );\n\ttransformedNormal /= vec3( dot( bm[ 0 ], bm[ 0 ] ), dot( bm[ 1 ], bm[ 1 ] ), dot( bm[ 2 ], bm[ 2 ] ) );\n\ttransformedNormal = bm * transformedNormal;\n\t#ifdef USE_TANGENT\n\t\ttransformedTangent = bm * transformedTangent;\n\t#endif\n#endif\n#ifdef USE_INSTANCING\n\tmat3 im = mat3( instanceMatrix );\n\ttransformedNormal /= vec3( dot( im[ 0 ], im[ 0 ] ), dot( im[ 1 ], im[ 1 ] ), dot( im[ 2 ], im[ 2 ] ) );\n\ttransformedNormal = im * transformedNormal;\n\t#ifdef USE_TANGENT\n\t\ttransformedTangent = im * transformedTangent;\n\t#endif\n#endif\ntransformedNormal = normalMatrix * transformedNormal;\n#ifdef FLIP_SIDED\n\ttransformedNormal = - transformedNormal;\n#endif\n#ifdef USE_TANGENT\n\ttransformedTangent = ( modelViewMatrix * vec4( transformedTangent, 0.0 ) ).xyz;\n\t#ifdef FLIP_SIDED\n\t\ttransformedTangent = - transformedTangent;\n\t#endif\n#endif",displacementmap_pars_vertex:"#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif",displacementmap_vertex:"#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, vDisplacementMapUv ).x * displacementScale + displacementBias );\n#endif",emissivemap_fragment:"#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vEmissiveMapUv );\n\t#ifdef DECODE_VIDEO_TEXTURE_EMISSIVE\n\t\temissiveColor = sRGBTransferEOTF( emissiveColor );\n\t#endif\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif",emissivemap_pars_fragment:"#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif",colorspace_fragment:"gl_FragColor = linearToOutputTexel( gl_FragColor );",colorspace_pars_fragment:"vec4 LinearTransferOETF( in vec4 value ) {\n\treturn value;\n}\nvec4 sRGBTransferEOTF( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.a );\n}\nvec4 sRGBTransferOETF( 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}",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, envMapRotation * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\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",envmap_common_pars_fragment:"#ifdef USE_ENVMAP\n\tuniform float envMapIntensity;\n\tuniform float flipEnvMap;\n\tuniform mat3 envMapRotation;\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",envmap_pars_fragment:"#ifdef USE_ENVMAP\n\tuniform float reflectivity;\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT )\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",envmap_pars_vertex:"#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT )\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",envmap_physical_pars_fragment:"#ifdef USE_ENVMAP\n\tvec3 getIBLIrradiance( const in vec3 normal ) {\n\t\t#ifdef ENVMAP_TYPE_CUBE_UV\n\t\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, envMapRotation * 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#ifdef 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, envMapRotation * 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\t#ifdef USE_ANISOTROPY\n\t\tvec3 getIBLAnisotropyRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness, const in vec3 bitangent, const in float anisotropy ) {\n\t\t\t#ifdef ENVMAP_TYPE_CUBE_UV\n\t\t\t\tvec3 bentNormal = cross( bitangent, viewDir );\n\t\t\t\tbentNormal = normalize( cross( bentNormal, bitangent ) );\n\t\t\t\tbentNormal = normalize( mix( bentNormal, normal, pow2( pow2( 1.0 - anisotropy * ( 1.0 - roughness ) ) ) ) );\n\t\t\t\treturn getIBLRadiance( viewDir, bentNormal, roughness );\n\t\t\t#else\n\t\t\t\treturn vec3( 0.0 );\n\t\t\t#endif\n\t\t}\n\t#endif\n#endif",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",fog_vertex:"#ifdef USE_FOG\n\tvFogDepth = - mvPosition.z;\n#endif",fog_pars_vertex:"#ifdef USE_FOG\n\tvarying float vFogDepth;\n#endif",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",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",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\tvec2 fw = fwidth( coord ) * 0.5;\n\t\treturn mix( vec3( 0.7 ), vec3( 1.0 ), smoothstep( 0.7 - fw.x, 0.7 + fw.x, coord.x ) );\n\t#endif\n}",lightmap_pars_fragment:"#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif",lights_lambert_fragment:"LambertMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularStrength = specularStrength;",lights_lambert_pars_fragment:"varying vec3 vViewPosition;\nstruct LambertMaterial {\n\tvec3 diffuseColor;\n\tfloat specularStrength;\n};\nvoid RE_Direct_Lambert( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in LambertMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Lambert( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in LambertMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_Lambert\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Lambert",lights_pars_begin:"uniform bool receiveShadow;\nuniform vec3 ambientLightColor;\n#if defined( USE_LIGHT_PROBES )\n\tuniform vec3 lightProbe[ 9 ];\n#endif\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\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\tif ( cutoffDistance > 0.0 ) {\n\t\tdistanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t}\n\treturn distanceFalloff;\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, 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 vec3 geometryPosition, out IncidentLight light ) {\n\t\tvec3 lVector = pointLight.position - geometryPosition;\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 vec3 geometryPosition, out IncidentLight light ) {\n\t\tvec3 lVector = spotLight.position - geometryPosition;\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",lights_toon_fragment:"ToonMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;",lights_toon_pars_fragment:"varying vec3 vViewPosition;\nstruct ToonMaterial {\n\tvec3 diffuseColor;\n};\nvoid RE_Direct_Toon( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\tvec3 irradiance = getGradientIrradiance( geometryNormal, directLight.direction ) * directLight.color;\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Toon( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, 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",lights_phong_fragment:"BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;",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 vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_BlinnPhong( directLight.direction, geometryViewDir, geometryNormal, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, 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",lights_physical_fragment:"PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nvec3 dxy = max( abs( dFdx( nonPerturbedNormal ) ), abs( dFdy( nonPerturbedNormal ) ) );\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\tmaterial.ior = ior;\n\t#ifdef USE_SPECULAR\n\t\tfloat specularIntensityFactor = specularIntensity;\n\t\tvec3 specularColorFactor = specularColor;\n\t\t#ifdef USE_SPECULAR_COLORMAP\n\t\t\tspecularColorFactor *= texture2D( specularColorMap, vSpecularColorMapUv ).rgb;\n\t\t#endif\n\t\t#ifdef USE_SPECULAR_INTENSITYMAP\n\t\t\tspecularIntensityFactor *= texture2D( specularIntensityMap, vSpecularIntensityMapUv ).a;\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( ( material.ior - 1.0 ) / ( material.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, vClearcoatMapUv ).x;\n\t#endif\n\t#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\t\tmaterial.clearcoatRoughness *= texture2D( clearcoatRoughnessMap, vClearcoatRoughnessMapUv ).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_DISPERSION\n\tmaterial.dispersion = dispersion;\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, vIridescenceMapUv ).r;\n\t#endif\n\t#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\t\tmaterial.iridescenceThickness = (iridescenceThicknessMaximum - iridescenceThicknessMinimum) * texture2D( iridescenceThicknessMap, vIridescenceThicknessMapUv ).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_SHEEN_COLORMAP\n\t\tmaterial.sheenColor *= texture2D( sheenColorMap, vSheenColorMapUv ).rgb;\n\t#endif\n\tmaterial.sheenRoughness = clamp( sheenRoughness, 0.07, 1.0 );\n\t#ifdef USE_SHEEN_ROUGHNESSMAP\n\t\tmaterial.sheenRoughness *= texture2D( sheenRoughnessMap, vSheenRoughnessMapUv ).a;\n\t#endif\n#endif\n#ifdef USE_ANISOTROPY\n\t#ifdef USE_ANISOTROPYMAP\n\t\tmat2 anisotropyMat = mat2( anisotropyVector.x, anisotropyVector.y, - anisotropyVector.y, anisotropyVector.x );\n\t\tvec3 anisotropyPolar = texture2D( anisotropyMap, vAnisotropyMapUv ).rgb;\n\t\tvec2 anisotropyV = anisotropyMat * normalize( 2.0 * anisotropyPolar.rg - vec2( 1.0 ) ) * anisotropyPolar.b;\n\t#else\n\t\tvec2 anisotropyV = anisotropyVector;\n\t#endif\n\tmaterial.anisotropy = length( anisotropyV );\n\tif( material.anisotropy == 0.0 ) {\n\t\tanisotropyV = vec2( 1.0, 0.0 );\n\t} else {\n\t\tanisotropyV /= material.anisotropy;\n\t\tmaterial.anisotropy = saturate( material.anisotropy );\n\t}\n\tmaterial.alphaT = mix( pow2( material.roughness ), 1.0, pow2( material.anisotropy ) );\n\tmaterial.anisotropyT = tbn[ 0 ] * anisotropyV.x + tbn[ 1 ] * anisotropyV.y;\n\tmaterial.anisotropyB = tbn[ 1 ] * anisotropyV.x - tbn[ 0 ] * anisotropyV.y;\n#endif",lights_physical_pars_fragment:"struct PhysicalMaterial {\n\tvec3 diffuseColor;\n\tfloat roughness;\n\tvec3 specularColor;\n\tfloat specularF90;\n\tfloat dispersion;\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\t#ifdef IOR\n\t\tfloat ior;\n\t#endif\n\t#ifdef USE_TRANSMISSION\n\t\tfloat transmission;\n\t\tfloat transmissionAlpha;\n\t\tfloat thickness;\n\t\tfloat attenuationDistance;\n\t\tvec3 attenuationColor;\n\t#endif\n\t#ifdef USE_ANISOTROPY\n\t\tfloat anisotropy;\n\t\tfloat alphaT;\n\t\tvec3 anisotropyT;\n\t\tvec3 anisotropyB;\n\t#endif\n};\nvec3 clearcoatSpecularDirect = vec3( 0.0 );\nvec3 clearcoatSpecularIndirect = vec3( 0.0 );\nvec3 sheenSpecularDirect = vec3( 0.0 );\nvec3 sheenSpecularIndirect = vec3(0.0 );\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}\n#ifdef USE_ANISOTROPY\n\tfloat V_GGX_SmithCorrelated_Anisotropic( const in float alphaT, const in float alphaB, const in float dotTV, const in float dotBV, const in float dotTL, const in float dotBL, const in float dotNV, const in float dotNL ) {\n\t\tfloat gv = dotNL * length( vec3( alphaT * dotTV, alphaB * dotBV, dotNV ) );\n\t\tfloat gl = dotNV * length( vec3( alphaT * dotTL, alphaB * dotBL, dotNL ) );\n\t\tfloat v = 0.5 / ( gv + gl );\n\t\treturn saturate(v);\n\t}\n\tfloat D_GGX_Anisotropic( const in float alphaT, const in float alphaB, const in float dotNH, const in float dotTH, const in float dotBH ) {\n\t\tfloat a2 = alphaT * alphaB;\n\t\thighp vec3 v = vec3( alphaB * dotTH, alphaT * dotBH, a2 * dotNH );\n\t\thighp float v2 = dot( v, v );\n\t\tfloat w2 = a2 / v2;\n\t\treturn RECIPROCAL_PI * a2 * pow2 ( w2 );\n\t}\n#endif\n#ifdef USE_CLEARCOAT\n\tvec3 BRDF_GGX_Clearcoat( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material) {\n\t\tvec3 f0 = material.clearcoatF0;\n\t\tfloat f90 = material.clearcoatF90;\n\t\tfloat roughness = material.clearcoatRoughness;\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 = F_Schlick( f0, f90, dotVH );\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\nvec3 BRDF_GGX( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material ) {\n\tvec3 f0 = material.specularColor;\n\tfloat f90 = material.specularF90;\n\tfloat roughness = material.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\t#ifdef USE_IRIDESCENCE\n\t\tF = mix( F, material.iridescenceFresnel, material.iridescence );\n\t#endif\n\t#ifdef USE_ANISOTROPY\n\t\tfloat dotTL = dot( material.anisotropyT, lightDir );\n\t\tfloat dotTV = dot( material.anisotropyT, viewDir );\n\t\tfloat dotTH = dot( material.anisotropyT, halfDir );\n\t\tfloat dotBL = dot( material.anisotropyB, lightDir );\n\t\tfloat dotBV = dot( material.anisotropyB, viewDir );\n\t\tfloat dotBH = dot( material.anisotropyB, halfDir );\n\t\tfloat V = V_GGX_SmithCorrelated_Anisotropic( material.alphaT, alpha, dotTV, dotBV, dotTL, dotBL, dotNV, dotNL );\n\t\tfloat D = D_GGX_Anisotropic( material.alphaT, alpha, dotNH, dotTH, dotBH );\n\t#else\n\t\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\t\tfloat D = D_GGX( alpha, dotNH );\n\t#endif\n\treturn F * ( V * D );\n}\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}\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\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 vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometryNormal;\n\t\tvec3 viewDir = geometryViewDir;\n\t\tvec3 position = geometryPosition;\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 vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifdef USE_CLEARCOAT\n\t\tfloat dotNLcc = saturate( dot( geometryClearcoatNormal, directLight.direction ) );\n\t\tvec3 ccIrradiance = dotNLcc * directLight.color;\n\t\tclearcoatSpecularDirect += ccIrradiance * BRDF_GGX_Clearcoat( directLight.direction, geometryViewDir, geometryClearcoatNormal, material );\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tsheenSpecularDirect += irradiance * BRDF_Sheen( directLight.direction, geometryViewDir, geometryNormal, material.sheenColor, material.sheenRoughness );\n\t#endif\n\treflectedLight.directSpecular += irradiance * BRDF_GGX( directLight.direction, geometryViewDir, geometryNormal, material );\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, 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 vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {\n\t#ifdef USE_CLEARCOAT\n\t\tclearcoatSpecularIndirect += clearcoatRadiance * EnvironmentBRDF( geometryClearcoatNormal, geometryViewDir, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tsheenSpecularIndirect += irradiance * material.sheenColor * IBLSheenBRDF( geometryNormal, geometryViewDir, 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( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.iridescence, material.iridescenceFresnel, material.roughness, singleScattering, multiScattering );\n\t#else\n\t\tcomputeMultiscattering( geometryNormal, geometryViewDir, 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}",lights_fragment_begin:"\nvec3 geometryPosition = - vViewPosition;\nvec3 geometryNormal = normal;\nvec3 geometryViewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\nvec3 geometryClearcoatNormal = vec3( 0.0 );\n#ifdef USE_CLEARCOAT\n\tgeometryClearcoatNormal = clearcoatNormal;\n#endif\n#ifdef USE_IRIDESCENCE\n\tfloat dotNVi = saturate( dot( normal, geometryViewDir ) );\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, geometryPosition, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS )\n\t\tpointLightShadow = pointLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowIntensity, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, 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\tvec4 spotColor;\n\tvec3 spotLightCoord;\n\tbool inSpotLightMap;\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, geometryPosition, directLight );\n\t\t#if ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\n\t\t#define SPOT_LIGHT_MAP_INDEX UNROLLED_LOOP_INDEX\n\t\t#elif ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\t#define SPOT_LIGHT_MAP_INDEX NUM_SPOT_LIGHT_MAPS\n\t\t#else\n\t\t#define SPOT_LIGHT_MAP_INDEX ( UNROLLED_LOOP_INDEX - NUM_SPOT_LIGHT_SHADOWS + NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\n\t\t#endif\n\t\t#if ( SPOT_LIGHT_MAP_INDEX < NUM_SPOT_LIGHT_MAPS )\n\t\t\tspotLightCoord = vSpotLightCoord[ i ].xyz / vSpotLightCoord[ i ].w;\n\t\t\tinSpotLightMap = all( lessThan( abs( spotLightCoord * 2. - 1. ), vec3( 1.0 ) ) );\n\t\t\tspotColor = texture2D( spotLightMap[ SPOT_LIGHT_MAP_INDEX ], spotLightCoord.xy );\n\t\t\tdirectLight.color = inSpotLightMap ? directLight.color * spotColor.rgb : directLight.color;\n\t\t#endif\n\t\t#undef SPOT_LIGHT_MAP_INDEX\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\tspotLightShadow = spotLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowIntensity, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, 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, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\n\t\tdirectionalLightShadow = directionalLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowIntensity, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, 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, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, 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\t#if defined( USE_LIGHT_PROBES )\n\t\tirradiance += getLightProbeIrradiance( lightProbe, geometryNormal );\n\t#endif\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 ], geometryNormal );\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",lights_fragment_maps:"#if defined( RE_IndirectDiffuse )\n\t#ifdef USE_LIGHTMAP\n\t\tvec4 lightMapTexel = texture2D( lightMap, vLightMapUv );\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( geometryNormal );\n\t#endif\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\t#ifdef USE_ANISOTROPY\n\t\tradiance += getIBLAnisotropyRadiance( geometryViewDir, geometryNormal, material.roughness, material.anisotropyB, material.anisotropy );\n\t#else\n\t\tradiance += getIBLRadiance( geometryViewDir, geometryNormal, material.roughness );\n\t#endif\n\t#ifdef USE_CLEARCOAT\n\t\tclearcoatRadiance += getIBLRadiance( geometryViewDir, geometryClearcoatNormal, material.clearcoatRoughness );\n\t#endif\n#endif",lights_fragment_end:"#if defined( RE_IndirectDiffuse )\n\tRE_IndirectDiffuse( irradiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n#endif\n#if defined( RE_IndirectSpecular )\n\tRE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n#endif",logdepthbuf_fragment:"#if defined( USE_LOGDEPTHBUF )\n\tgl_FragDepth = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\n#endif",logdepthbuf_pars_fragment:"#if defined( USE_LOGDEPTHBUF )\n\tuniform float logDepthBufFC;\n\tvarying float vFragDepth;\n\tvarying float vIsPerspective;\n#endif",logdepthbuf_pars_vertex:"#ifdef USE_LOGDEPTHBUF\n\tvarying float vFragDepth;\n\tvarying float vIsPerspective;\n#endif",logdepthbuf_vertex:"#ifdef USE_LOGDEPTHBUF\n\tvFragDepth = 1.0 + gl_Position.w;\n\tvIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) );\n#endif",map_fragment:"#ifdef USE_MAP\n\tvec4 sampledDiffuseColor = texture2D( map, vMapUv );\n\t#ifdef DECODE_VIDEO_TEXTURE\n\t\tsampledDiffuseColor = sRGBTransferEOTF( sampledDiffuseColor );\n\t#endif\n\tdiffuseColor *= sampledDiffuseColor;\n#endif",map_pars_fragment:"#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif",map_particle_fragment:"#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\t#if defined( USE_POINTS_UV )\n\t\tvec2 uv = vUv;\n\t#else\n\t\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\n\t#endif\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",map_particle_pars_fragment:"#if defined( USE_POINTS_UV )\n\tvarying vec2 vUv;\n#else\n\t#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\t\tuniform mat3 uvTransform;\n\t#endif\n#endif\n#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif\n#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif",metalnessmap_fragment:"float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n\tvec4 texelMetalness = texture2D( metalnessMap, vMetalnessMapUv );\n\tmetalnessFactor *= texelMetalness.b;\n#endif",metalnessmap_pars_fragment:"#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif",morphinstance_vertex:"#ifdef USE_INSTANCING_MORPH\n\tfloat morphTargetInfluences[ MORPHTARGETS_COUNT ];\n\tfloat morphTargetBaseInfluence = texelFetch( morphTexture, ivec2( 0, gl_InstanceID ), 0 ).r;\n\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\tmorphTargetInfluences[i] =  texelFetch( morphTexture, ivec2( i + 1, gl_InstanceID ), 0 ).r;\n\t}\n#endif",morphcolor_vertex:"#if defined( USE_MORPHCOLORS )\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",morphnormal_vertex:"#ifdef USE_MORPHNORMALS\n\tobjectNormal *= morphTargetBaseInfluence;\n\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\tif ( morphTargetInfluences[ i ] != 0.0 ) objectNormal += getMorph( gl_VertexID, i, 1 ).xyz * morphTargetInfluences[ i ];\n\t}\n#endif",morphtarget_pars_vertex:"#ifdef USE_MORPHTARGETS\n\t#ifndef USE_INSTANCING_MORPH\n\t\tuniform float morphTargetBaseInfluence;\n\t\tuniform float morphTargetInfluences[ MORPHTARGETS_COUNT ];\n\t#endif\n\tuniform sampler2DArray morphTargetsTexture;\n\tuniform ivec2 morphTargetsTextureSize;\n\tvec4 getMorph( const in int vertexIndex, const in int morphTargetIndex, const in int offset ) {\n\t\tint texelIndex = vertexIndex * MORPHTARGETS_TEXTURE_STRIDE + offset;\n\t\tint y = texelIndex / morphTargetsTextureSize.x;\n\t\tint x = texelIndex - y * morphTargetsTextureSize.x;\n\t\tivec3 morphUV = ivec3( x, y, morphTargetIndex );\n\t\treturn texelFetch( morphTargetsTexture, morphUV, 0 );\n\t}\n#endif",morphtarget_vertex:"#ifdef USE_MORPHTARGETS\n\ttransformed *= morphTargetBaseInfluence;\n\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\tif ( morphTargetInfluences[ i ] != 0.0 ) transformed += getMorph( gl_VertexID, i, 0 ).xyz * morphTargetInfluences[ i ];\n\t}\n#endif",normal_fragment_begin:"float faceDirection = gl_FrontFacing ? 1.0 : - 1.0;\n#ifdef FLAT_SHADED\n\tvec3 fdx = dFdx( vViewPosition );\n\tvec3 fdy = dFdy( vViewPosition );\n\tvec3 normal = normalize( cross( fdx, fdy ) );\n#else\n\tvec3 normal = normalize( vNormal );\n\t#ifdef DOUBLE_SIDED\n\t\tnormal *= faceDirection;\n\t#endif\n#endif\n#if defined( USE_NORMALMAP_TANGENTSPACE ) || defined( USE_CLEARCOAT_NORMALMAP ) || defined( USE_ANISOTROPY )\n\t#ifdef USE_TANGENT\n\t\tmat3 tbn = mat3( normalize( vTangent ), normalize( vBitangent ), normal );\n\t#else\n\t\tmat3 tbn = getTangentFrame( - vViewPosition, normal,\n\t\t#if defined( USE_NORMALMAP )\n\t\t\tvNormalMapUv\n\t\t#elif defined( USE_CLEARCOAT_NORMALMAP )\n\t\t\tvClearcoatNormalMapUv\n\t\t#else\n\t\t\tvUv\n\t\t#endif\n\t\t);\n\t#endif\n\t#if defined( DOUBLE_SIDED ) && ! defined( FLAT_SHADED )\n\t\ttbn[0] *= faceDirection;\n\t\ttbn[1] *= faceDirection;\n\t#endif\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\t#ifdef USE_TANGENT\n\t\tmat3 tbn2 = mat3( normalize( vTangent ), normalize( vBitangent ), normal );\n\t#else\n\t\tmat3 tbn2 = getTangentFrame( - vViewPosition, normal, vClearcoatNormalMapUv );\n\t#endif\n\t#if defined( DOUBLE_SIDED ) && ! defined( FLAT_SHADED )\n\t\ttbn2[0] *= faceDirection;\n\t\ttbn2[1] *= faceDirection;\n\t#endif\n#endif\nvec3 nonPerturbedNormal = normal;",normal_fragment_maps:"#ifdef USE_NORMALMAP_OBJECTSPACE\n\tnormal = texture2D( normalMap, vNormalMapUv ).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( USE_NORMALMAP_TANGENTSPACE )\n\tvec3 mapN = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0;\n\tmapN.xy *= normalScale;\n\tnormal = normalize( tbn * mapN );\n#elif defined( USE_BUMPMAP )\n\tnormal = perturbNormalArb( - vViewPosition, normal, dHdxy_fwd(), faceDirection );\n#endif",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",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",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",normalmap_pars_fragment:"#ifdef USE_NORMALMAP\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n#endif\n#ifdef USE_NORMALMAP_OBJECTSPACE\n\tuniform mat3 normalMatrix;\n#endif\n#if ! defined ( USE_TANGENT ) && ( defined ( USE_NORMALMAP_TANGENTSPACE ) || defined ( USE_CLEARCOAT_NORMALMAP ) || defined( USE_ANISOTROPY ) )\n\tmat3 getTangentFrame( vec3 eye_pos, vec3 surf_norm, vec2 uv ) {\n\t\tvec3 q0 = dFdx( eye_pos.xyz );\n\t\tvec3 q1 = dFdy( eye_pos.xyz );\n\t\tvec2 st0 = dFdx( uv.st );\n\t\tvec2 st1 = dFdy( uv.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 : inversesqrt( det );\n\t\treturn mat3( T * scale, B * scale, N );\n\t}\n#endif",clearcoat_normal_fragment_begin:"#ifdef USE_CLEARCOAT\n\tvec3 clearcoatNormal = nonPerturbedNormal;\n#endif",clearcoat_normal_fragment_maps:"#ifdef USE_CLEARCOAT_NORMALMAP\n\tvec3 clearcoatMapN = texture2D( clearcoatNormalMap, vClearcoatNormalMapUv ).xyz * 2.0 - 1.0;\n\tclearcoatMapN.xy *= clearcoatNormalScale;\n\tclearcoatNormal = normalize( tbn2 * clearcoatMapN );\n#endif",clearcoat_pars_fragment:"#ifdef USE_CLEARCOATMAP\n\tuniform sampler2D clearcoatMap;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tuniform sampler2D clearcoatNormalMap;\n\tuniform vec2 clearcoatNormalScale;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tuniform sampler2D clearcoatRoughnessMap;\n#endif",iridescence_pars_fragment:"#ifdef USE_IRIDESCENCEMAP\n\tuniform sampler2D iridescenceMap;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\tuniform sampler2D iridescenceThicknessMap;\n#endif",opaque_fragment:"#ifdef OPAQUE\ndiffuseColor.a = 1.0;\n#endif\n#ifdef USE_TRANSMISSION\ndiffuseColor.a *= material.transmissionAlpha;\n#endif\ngl_FragColor = vec4( outgoingLight, diffuseColor.a );",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.;const float ShiftRight8 = 1. / 256.;\nconst float Inv255 = 1. / 255.;\nconst vec4 PackFactors = vec4( 1.0, 256.0, 256.0 * 256.0, 256.0 * 256.0 * 256.0 );\nconst vec2 UnpackFactors2 = vec2( UnpackDownscale, 1.0 / PackFactors.g );\nconst vec3 UnpackFactors3 = vec3( UnpackDownscale / PackFactors.rg, 1.0 / PackFactors.b );\nconst vec4 UnpackFactors4 = vec4( UnpackDownscale / PackFactors.rgb, 1.0 / PackFactors.a );\nvec4 packDepthToRGBA( const in float v ) {\n\tif( v <= 0.0 )\n\t\treturn vec4( 0., 0., 0., 0. );\n\tif( v >= 1.0 )\n\t\treturn vec4( 1., 1., 1., 1. );\n\tfloat vuf;\n\tfloat af = modf( v * PackFactors.a, vuf );\n\tfloat bf = modf( vuf * ShiftRight8, vuf );\n\tfloat gf = modf( vuf * ShiftRight8, vuf );\n\treturn vec4( vuf * Inv255, gf * PackUpscale, bf * PackUpscale, af );\n}\nvec3 packDepthToRGB( const in float v ) {\n\tif( v <= 0.0 )\n\t\treturn vec3( 0., 0., 0. );\n\tif( v >= 1.0 )\n\t\treturn vec3( 1., 1., 1. );\n\tfloat vuf;\n\tfloat bf = modf( v * PackFactors.b, vuf );\n\tfloat gf = modf( vuf * ShiftRight8, vuf );\n\treturn vec3( vuf * Inv255, gf * PackUpscale, bf );\n}\nvec2 packDepthToRG( const in float v ) {\n\tif( v <= 0.0 )\n\t\treturn vec2( 0., 0. );\n\tif( v >= 1.0 )\n\t\treturn vec2( 1., 1. );\n\tfloat vuf;\n\tfloat gf = modf( v * 256., vuf );\n\treturn vec2( vuf * Inv255, gf );\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors4 );\n}\nfloat unpackRGBToDepth( const in vec3 v ) {\n\treturn dot( v, UnpackFactors3 );\n}\nfloat unpackRGToDepth( const in vec2 v ) {\n\treturn v.r * UnpackFactors2.r + v.g * UnpackFactors2.g;\n}\nvec4 pack2HalfToRGBA( const in 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( const in 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 depth, const in float near, const in float far ) {\n\treturn depth * ( 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 depth, const in float near, const in float far ) {\n\treturn ( near * far ) / ( ( far - near ) * depth - far );\n}",premultiplied_alpha_fragment:"#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif",project_vertex:"vec4 mvPosition = vec4( transformed, 1.0 );\n#ifdef USE_BATCHING\n\tmvPosition = batchingMatrix * mvPosition;\n#endif\n#ifdef USE_INSTANCING\n\tmvPosition = instanceMatrix * mvPosition;\n#endif\nmvPosition = modelViewMatrix * mvPosition;\ngl_Position = projectionMatrix * mvPosition;",dithering_fragment:"#ifdef DITHERING\n\tgl_FragColor.rgb = dithering( gl_FragColor.rgb );\n#endif",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",roughnessmap_fragment:"float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vRoughnessMapUv );\n\troughnessFactor *= texelRoughness.g;\n#endif",roughnessmap_pars_fragment:"#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif",shadowmap_pars_fragment:"#if NUM_SPOT_LIGHT_COORDS > 0\n\tvarying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\n#endif\n#if NUM_SPOT_LIGHT_MAPS > 0\n\tuniform sampler2D spotLightMap[ NUM_SPOT_LIGHT_MAPS ];\n#endif\n#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 shadowIntensity;\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\tstruct SpotLightShadow {\n\t\t\tfloat shadowIntensity;\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 shadowIntensity;\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 shadowIntensity, 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\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n\t\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\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 mix( 1.0, shadow, shadowIntensity );\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 shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tfloat shadow = 1.0;\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\t\n\t\tfloat lightToPositionLength = length( lightToPosition );\n\t\tif ( lightToPositionLength - shadowCameraFar <= 0.0 && lightToPositionLength - shadowCameraNear >= 0.0 ) {\n\t\t\tfloat dp = ( lightToPositionLength - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\t\t\tdp += shadowBias;\n\t\t\tvec3 bd3D = normalize( lightToPosition );\n\t\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\t\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT ) || defined( SHADOWMAP_TYPE_VSM )\n\t\t\t\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\n\t\t\t\tshadow = (\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\n\t\t\t\t) * ( 1.0 / 9.0 );\n\t\t\t#else\n\t\t\t\tshadow = texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n\t\t\t#endif\n\t\t}\n\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t}\n#endif",shadowmap_pars_vertex:"#if NUM_SPOT_LIGHT_COORDS > 0\n\tuniform mat4 spotLightMatrix[ NUM_SPOT_LIGHT_COORDS ];\n\tvarying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\n#endif\n#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 shadowIntensity;\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\tstruct SpotLightShadow {\n\t\t\tfloat shadowIntensity;\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 shadowIntensity;\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",shadowmap_vertex:"#if ( defined( USE_SHADOWMAP ) && ( NUM_DIR_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0 ) ) || ( NUM_SPOT_LIGHT_COORDS > 0 )\n\tvec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\tvec4 shadowWorldPosition;\n#endif\n#if defined( USE_SHADOWMAP )\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * directionalLightShadows[ i ].shadowNormalBias, 0 );\n\t\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * shadowWorldPosition;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * pointLightShadows[ i ].shadowNormalBias, 0 );\n\t\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * shadowWorldPosition;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n#endif\n#if NUM_SPOT_LIGHT_COORDS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_COORDS; i ++ ) {\n\t\tshadowWorldPosition = worldPosition;\n\t\t#if ( defined( USE_SHADOWMAP ) && UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\t\tshadowWorldPosition.xyz += shadowWorldNormal * spotLightShadows[ i ].shadowNormalBias;\n\t\t#endif\n\t\tvSpotLightCoord[ i ] = spotLightMatrix[ i ] * shadowWorldPosition;\n\t}\n\t#pragma unroll_loop_end\n#endif",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.shadowIntensity, 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.shadowIntensity, spotLight.shadowBias, spotLight.shadowRadius, vSpotLightCoord[ 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.shadowIntensity, 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}",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",skinning_pars_vertex:"#ifdef USE_SKINNING\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\tuniform highp sampler2D boneTexture;\n\tmat4 getBoneMatrix( const in float i ) {\n\t\tint size = textureSize( boneTexture, 0 ).x;\n\t\tint j = int( i ) * 4;\n\t\tint x = j % size;\n\t\tint y = j / size;\n\t\tvec4 v1 = texelFetch( boneTexture, ivec2( x, y ), 0 );\n\t\tvec4 v2 = texelFetch( boneTexture, ivec2( x + 1, y ), 0 );\n\t\tvec4 v3 = texelFetch( boneTexture, ivec2( x + 2, y ), 0 );\n\t\tvec4 v4 = texelFetch( boneTexture, ivec2( x + 3, y ), 0 );\n\t\treturn mat4( v1, v2, v3, v4 );\n\t}\n#endif",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",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",specularmap_fragment:"float specularStrength;\n#ifdef USE_SPECULARMAP\n\tvec4 texelSpecular = texture2D( specularMap, vSpecularMapUv );\n\tspecularStrength = texelSpecular.r;\n#else\n\tspecularStrength = 1.0;\n#endif",specularmap_pars_fragment:"#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif",tonemapping_fragment:"#if defined( TONE_MAPPING )\n\tgl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif",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 saturate( toneMappingExposure * color );\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( color / ( vec3( 1.0 ) + color ) );\n}\nvec3 CineonToneMapping( 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}\nconst mat3 LINEAR_REC2020_TO_LINEAR_SRGB = mat3(\n\tvec3( 1.6605, - 0.1246, - 0.0182 ),\n\tvec3( - 0.5876, 1.1329, - 0.1006 ),\n\tvec3( - 0.0728, - 0.0083, 1.1187 )\n);\nconst mat3 LINEAR_SRGB_TO_LINEAR_REC2020 = mat3(\n\tvec3( 0.6274, 0.0691, 0.0164 ),\n\tvec3( 0.3293, 0.9195, 0.0880 ),\n\tvec3( 0.0433, 0.0113, 0.8956 )\n);\nvec3 agxDefaultContrastApprox( vec3 x ) {\n\tvec3 x2 = x * x;\n\tvec3 x4 = x2 * x2;\n\treturn + 15.5 * x4 * x2\n\t\t- 40.14 * x4 * x\n\t\t+ 31.96 * x4\n\t\t- 6.868 * x2 * x\n\t\t+ 0.4298 * x2\n\t\t+ 0.1191 * x\n\t\t- 0.00232;\n}\nvec3 AgXToneMapping( vec3 color ) {\n\tconst mat3 AgXInsetMatrix = mat3(\n\t\tvec3( 0.856627153315983, 0.137318972929847, 0.11189821299995 ),\n\t\tvec3( 0.0951212405381588, 0.761241990602591, 0.0767994186031903 ),\n\t\tvec3( 0.0482516061458583, 0.101439036467562, 0.811302368396859 )\n\t);\n\tconst mat3 AgXOutsetMatrix = mat3(\n\t\tvec3( 1.1271005818144368, - 0.1413297634984383, - 0.14132976349843826 ),\n\t\tvec3( - 0.11060664309660323, 1.157823702216272, - 0.11060664309660294 ),\n\t\tvec3( - 0.016493938717834573, - 0.016493938717834257, 1.2519364065950405 )\n\t);\n\tconst float AgxMinEv = - 12.47393;\tconst float AgxMaxEv = 4.026069;\n\tcolor *= toneMappingExposure;\n\tcolor = LINEAR_SRGB_TO_LINEAR_REC2020 * color;\n\tcolor = AgXInsetMatrix * color;\n\tcolor = max( color, 1e-10 );\tcolor = log2( color );\n\tcolor = ( color - AgxMinEv ) / ( AgxMaxEv - AgxMinEv );\n\tcolor = clamp( color, 0.0, 1.0 );\n\tcolor = agxDefaultContrastApprox( color );\n\tcolor = AgXOutsetMatrix * color;\n\tcolor = pow( max( vec3( 0.0 ), color ), vec3( 2.2 ) );\n\tcolor = LINEAR_REC2020_TO_LINEAR_SRGB * color;\n\tcolor = clamp( color, 0.0, 1.0 );\n\treturn color;\n}\nvec3 NeutralToneMapping( vec3 color ) {\n\tconst float StartCompression = 0.8 - 0.04;\n\tconst float Desaturation = 0.15;\n\tcolor *= toneMappingExposure;\n\tfloat x = min( color.r, min( color.g, color.b ) );\n\tfloat offset = x < 0.08 ? x - 6.25 * x * x : 0.04;\n\tcolor -= offset;\n\tfloat peak = max( color.r, max( color.g, color.b ) );\n\tif ( peak < StartCompression ) return color;\n\tfloat d = 1. - StartCompression;\n\tfloat newPeak = 1. - d * d / ( peak + d - StartCompression );\n\tcolor *= newPeak / peak;\n\tfloat g = 1. - 1. / ( Desaturation * ( peak - newPeak ) + 1. );\n\treturn mix( color, vec3( newPeak ), g );\n}\nvec3 CustomToneMapping( vec3 color ) { return color; }",transmission_fragment:"#ifdef USE_TRANSMISSION\n\tmaterial.transmission = transmission;\n\tmaterial.transmissionAlpha = 1.0;\n\tmaterial.thickness = thickness;\n\tmaterial.attenuationDistance = attenuationDistance;\n\tmaterial.attenuationColor = attenuationColor;\n\t#ifdef USE_TRANSMISSIONMAP\n\t\tmaterial.transmission *= texture2D( transmissionMap, vTransmissionMapUv ).r;\n\t#endif\n\t#ifdef USE_THICKNESSMAP\n\t\tmaterial.thickness *= texture2D( thicknessMap, vThicknessMapUv ).g;\n\t#endif\n\tvec3 pos = vWorldPosition;\n\tvec3 v = normalize( cameraPosition - pos );\n\tvec3 n = inverseTransformDirection( normal, viewMatrix );\n\tvec4 transmitted = getIBLVolumeRefraction(\n\t\tn, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90,\n\t\tpos, modelMatrix, viewMatrix, projectionMatrix, material.dispersion, material.ior, material.thickness,\n\t\tmaterial.attenuationColor, material.attenuationDistance );\n\tmaterial.transmissionAlpha = mix( material.transmissionAlpha, transmitted.a, material.transmission );\n\ttotalDiffuse = mix( totalDiffuse, transmitted.rgb, material.transmission );\n#endif",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\tfloat w0( float a ) {\n\t\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - a + 3.0 ) - 3.0 ) + 1.0 );\n\t}\n\tfloat w1( float a ) {\n\t\treturn ( 1.0 / 6.0 ) * ( a *  a * ( 3.0 * a - 6.0 ) + 4.0 );\n\t}\n\tfloat w2( float a ){\n\t\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - 3.0 * a + 3.0 ) + 3.0 ) + 1.0 );\n\t}\n\tfloat w3( float a ) {\n\t\treturn ( 1.0 / 6.0 ) * ( a * a * a );\n\t}\n\tfloat g0( float a ) {\n\t\treturn w0( a ) + w1( a );\n\t}\n\tfloat g1( float a ) {\n\t\treturn w2( a ) + w3( a );\n\t}\n\tfloat h0( float a ) {\n\t\treturn - 1.0 + w1( a ) / ( w0( a ) + w1( a ) );\n\t}\n\tfloat h1( float a ) {\n\t\treturn 1.0 + w3( a ) / ( w2( a ) + w3( a ) );\n\t}\n\tvec4 bicubic( sampler2D tex, vec2 uv, vec4 texelSize, float lod ) {\n\t\tuv = uv * texelSize.zw + 0.5;\n\t\tvec2 iuv = floor( uv );\n\t\tvec2 fuv = fract( uv );\n\t\tfloat g0x = g0( fuv.x );\n\t\tfloat g1x = g1( fuv.x );\n\t\tfloat h0x = h0( fuv.x );\n\t\tfloat h1x = h1( fuv.x );\n\t\tfloat h0y = h0( fuv.y );\n\t\tfloat h1y = h1( fuv.y );\n\t\tvec2 p0 = ( vec2( iuv.x + h0x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p1 = ( vec2( iuv.x + h1x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p2 = ( vec2( iuv.x + h0x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p3 = ( vec2( iuv.x + h1x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\n\t\treturn g0( fuv.y ) * ( g0x * textureLod( tex, p0, lod ) + g1x * textureLod( tex, p1, lod ) ) +\n\t\t\tg1( fuv.y ) * ( g0x * textureLod( tex, p2, lod ) + g1x * textureLod( tex, p3, lod ) );\n\t}\n\tvec4 textureBicubic( sampler2D sampler, vec2 uv, float lod ) {\n\t\tvec2 fLodSize = vec2( textureSize( sampler, int( lod ) ) );\n\t\tvec2 cLodSize = vec2( textureSize( sampler, int( lod + 1.0 ) ) );\n\t\tvec2 fLodSizeInv = 1.0 / fLodSize;\n\t\tvec2 cLodSizeInv = 1.0 / cLodSize;\n\t\tvec4 fSample = bicubic( sampler, uv, vec4( fLodSizeInv, fLodSize ), floor( lod ) );\n\t\tvec4 cSample = bicubic( sampler, uv, vec4( cLodSizeInv, cLodSize ), ceil( lod ) );\n\t\treturn mix( fSample, cSample, fract( lod ) );\n\t}\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 lod = log2( transmissionSamplerSize.x ) * applyIorToRoughness( roughness, ior );\n\t\treturn textureBicubic( transmissionSamplerMap, fragCoord.xy, lod );\n\t}\n\tvec3 volumeAttenuation( const in float transmissionDistance, const in vec3 attenuationColor, const in float attenuationDistance ) {\n\t\tif ( isinf( attenuationDistance ) ) {\n\t\t\treturn vec3( 1.0 );\n\t\t} else {\n\t\t\tvec3 attenuationCoefficient = -log( attenuationColor ) / attenuationDistance;\n\t\t\tvec3 transmittance = exp( - attenuationCoefficient * transmissionDistance );\t\t\treturn transmittance;\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 dispersion, const in float ior, const in float thickness,\n\t\tconst in vec3 attenuationColor, const in float attenuationDistance ) {\n\t\tvec4 transmittedLight;\n\t\tvec3 transmittance;\n\t\t#ifdef USE_DISPERSION\n\t\t\tfloat halfSpread = ( ior - 1.0 ) * 0.025 * dispersion;\n\t\t\tvec3 iors = vec3( ior - halfSpread, ior, ior + halfSpread );\n\t\t\tfor ( int i = 0; i < 3; i ++ ) {\n\t\t\t\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, iors[ i ], modelMatrix );\n\t\t\t\tvec3 refractedRayExit = position + transmissionRay;\n\t\t\t\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\n\t\t\t\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\n\t\t\t\trefractionCoords += 1.0;\n\t\t\t\trefractionCoords /= 2.0;\n\t\t\t\tvec4 transmissionSample = getTransmissionSample( refractionCoords, roughness, iors[ i ] );\n\t\t\t\ttransmittedLight[ i ] = transmissionSample[ i ];\n\t\t\t\ttransmittedLight.a += transmissionSample.a;\n\t\t\t\ttransmittance[ i ] = diffuseColor[ i ] * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance )[ i ];\n\t\t\t}\n\t\t\ttransmittedLight.a /= 3.0;\n\t\t#else\n\t\t\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, ior, modelMatrix );\n\t\t\tvec3 refractedRayExit = position + transmissionRay;\n\t\t\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\n\t\t\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\n\t\t\trefractionCoords += 1.0;\n\t\t\trefractionCoords /= 2.0;\n\t\t\ttransmittedLight = getTransmissionSample( refractionCoords, roughness, ior );\n\t\t\ttransmittance = diffuseColor * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance );\n\t\t#endif\n\t\tvec3 attenuatedColor = transmittance * transmittedLight.rgb;\n\t\tvec3 F = EnvironmentBRDF( n, v, specularColor, specularF90, roughness );\n\t\tfloat transmittanceFactor = ( transmittance.r + transmittance.g + transmittance.b ) / 3.0;\n\t\treturn vec4( ( 1.0 - F ) * attenuatedColor, 1.0 - ( 1.0 - transmittedLight.a ) * transmittanceFactor );\n\t}\n#endif",uv_pars_fragment:"#if defined( USE_UV ) || defined( USE_ANISOTROPY )\n\tvarying vec2 vUv;\n#endif\n#ifdef USE_MAP\n\tvarying vec2 vMapUv;\n#endif\n#ifdef USE_ALPHAMAP\n\tvarying vec2 vAlphaMapUv;\n#endif\n#ifdef USE_LIGHTMAP\n\tvarying vec2 vLightMapUv;\n#endif\n#ifdef USE_AOMAP\n\tvarying vec2 vAoMapUv;\n#endif\n#ifdef USE_BUMPMAP\n\tvarying vec2 vBumpMapUv;\n#endif\n#ifdef USE_NORMALMAP\n\tvarying vec2 vNormalMapUv;\n#endif\n#ifdef USE_EMISSIVEMAP\n\tvarying vec2 vEmissiveMapUv;\n#endif\n#ifdef USE_METALNESSMAP\n\tvarying vec2 vMetalnessMapUv;\n#endif\n#ifdef USE_ROUGHNESSMAP\n\tvarying vec2 vRoughnessMapUv;\n#endif\n#ifdef USE_ANISOTROPYMAP\n\tvarying vec2 vAnisotropyMapUv;\n#endif\n#ifdef USE_CLEARCOATMAP\n\tvarying vec2 vClearcoatMapUv;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tvarying vec2 vClearcoatNormalMapUv;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tvarying vec2 vClearcoatRoughnessMapUv;\n#endif\n#ifdef USE_IRIDESCENCEMAP\n\tvarying vec2 vIridescenceMapUv;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\tvarying vec2 vIridescenceThicknessMapUv;\n#endif\n#ifdef USE_SHEEN_COLORMAP\n\tvarying vec2 vSheenColorMapUv;\n#endif\n#ifdef USE_SHEEN_ROUGHNESSMAP\n\tvarying vec2 vSheenRoughnessMapUv;\n#endif\n#ifdef USE_SPECULARMAP\n\tvarying vec2 vSpecularMapUv;\n#endif\n#ifdef USE_SPECULAR_COLORMAP\n\tvarying vec2 vSpecularColorMapUv;\n#endif\n#ifdef USE_SPECULAR_INTENSITYMAP\n\tvarying vec2 vSpecularIntensityMapUv;\n#endif\n#ifdef USE_TRANSMISSIONMAP\n\tuniform mat3 transmissionMapTransform;\n\tvarying vec2 vTransmissionMapUv;\n#endif\n#ifdef USE_THICKNESSMAP\n\tuniform mat3 thicknessMapTransform;\n\tvarying vec2 vThicknessMapUv;\n#endif",uv_pars_vertex:"#if defined( USE_UV ) || defined( USE_ANISOTROPY )\n\tvarying vec2 vUv;\n#endif\n#ifdef USE_MAP\n\tuniform mat3 mapTransform;\n\tvarying vec2 vMapUv;\n#endif\n#ifdef USE_ALPHAMAP\n\tuniform mat3 alphaMapTransform;\n\tvarying vec2 vAlphaMapUv;\n#endif\n#ifdef USE_LIGHTMAP\n\tuniform mat3 lightMapTransform;\n\tvarying vec2 vLightMapUv;\n#endif\n#ifdef USE_AOMAP\n\tuniform mat3 aoMapTransform;\n\tvarying vec2 vAoMapUv;\n#endif\n#ifdef USE_BUMPMAP\n\tuniform mat3 bumpMapTransform;\n\tvarying vec2 vBumpMapUv;\n#endif\n#ifdef USE_NORMALMAP\n\tuniform mat3 normalMapTransform;\n\tvarying vec2 vNormalMapUv;\n#endif\n#ifdef USE_DISPLACEMENTMAP\n\tuniform mat3 displacementMapTransform;\n\tvarying vec2 vDisplacementMapUv;\n#endif\n#ifdef USE_EMISSIVEMAP\n\tuniform mat3 emissiveMapTransform;\n\tvarying vec2 vEmissiveMapUv;\n#endif\n#ifdef USE_METALNESSMAP\n\tuniform mat3 metalnessMapTransform;\n\tvarying vec2 vMetalnessMapUv;\n#endif\n#ifdef USE_ROUGHNESSMAP\n\tuniform mat3 roughnessMapTransform;\n\tvarying vec2 vRoughnessMapUv;\n#endif\n#ifdef USE_ANISOTROPYMAP\n\tuniform mat3 anisotropyMapTransform;\n\tvarying vec2 vAnisotropyMapUv;\n#endif\n#ifdef USE_CLEARCOATMAP\n\tuniform mat3 clearcoatMapTransform;\n\tvarying vec2 vClearcoatMapUv;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tuniform mat3 clearcoatNormalMapTransform;\n\tvarying vec2 vClearcoatNormalMapUv;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tuniform mat3 clearcoatRoughnessMapTransform;\n\tvarying vec2 vClearcoatRoughnessMapUv;\n#endif\n#ifdef USE_SHEEN_COLORMAP\n\tuniform mat3 sheenColorMapTransform;\n\tvarying vec2 vSheenColorMapUv;\n#endif\n#ifdef USE_SHEEN_ROUGHNESSMAP\n\tuniform mat3 sheenRoughnessMapTransform;\n\tvarying vec2 vSheenRoughnessMapUv;\n#endif\n#ifdef USE_IRIDESCENCEMAP\n\tuniform mat3 iridescenceMapTransform;\n\tvarying vec2 vIridescenceMapUv;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\tuniform mat3 iridescenceThicknessMapTransform;\n\tvarying vec2 vIridescenceThicknessMapUv;\n#endif\n#ifdef USE_SPECULARMAP\n\tuniform mat3 specularMapTransform;\n\tvarying vec2 vSpecularMapUv;\n#endif\n#ifdef USE_SPECULAR_COLORMAP\n\tuniform mat3 specularColorMapTransform;\n\tvarying vec2 vSpecularColorMapUv;\n#endif\n#ifdef USE_SPECULAR_INTENSITYMAP\n\tuniform mat3 specularIntensityMapTransform;\n\tvarying vec2 vSpecularIntensityMapUv;\n#endif\n#ifdef USE_TRANSMISSIONMAP\n\tuniform mat3 transmissionMapTransform;\n\tvarying vec2 vTransmissionMapUv;\n#endif\n#ifdef USE_THICKNESSMAP\n\tuniform mat3 thicknessMapTransform;\n\tvarying vec2 vThicknessMapUv;\n#endif",uv_vertex:"#if defined( USE_UV ) || defined( USE_ANISOTROPY )\n\tvUv = vec3( uv, 1 ).xy;\n#endif\n#ifdef USE_MAP\n\tvMapUv = ( mapTransform * vec3( MAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_ALPHAMAP\n\tvAlphaMapUv = ( alphaMapTransform * vec3( ALPHAMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_LIGHTMAP\n\tvLightMapUv = ( lightMapTransform * vec3( LIGHTMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_AOMAP\n\tvAoMapUv = ( aoMapTransform * vec3( AOMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_BUMPMAP\n\tvBumpMapUv = ( bumpMapTransform * vec3( BUMPMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_NORMALMAP\n\tvNormalMapUv = ( normalMapTransform * vec3( NORMALMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_DISPLACEMENTMAP\n\tvDisplacementMapUv = ( displacementMapTransform * vec3( DISPLACEMENTMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_EMISSIVEMAP\n\tvEmissiveMapUv = ( emissiveMapTransform * vec3( EMISSIVEMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_METALNESSMAP\n\tvMetalnessMapUv = ( metalnessMapTransform * vec3( METALNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_ROUGHNESSMAP\n\tvRoughnessMapUv = ( roughnessMapTransform * vec3( ROUGHNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_ANISOTROPYMAP\n\tvAnisotropyMapUv = ( anisotropyMapTransform * vec3( ANISOTROPYMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_CLEARCOATMAP\n\tvClearcoatMapUv = ( clearcoatMapTransform * vec3( CLEARCOATMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tvClearcoatNormalMapUv = ( clearcoatNormalMapTransform * vec3( CLEARCOAT_NORMALMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tvClearcoatRoughnessMapUv = ( clearcoatRoughnessMapTransform * vec3( CLEARCOAT_ROUGHNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_IRIDESCENCEMAP\n\tvIridescenceMapUv = ( iridescenceMapTransform * vec3( IRIDESCENCEMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\tvIridescenceThicknessMapUv = ( iridescenceThicknessMapTransform * vec3( IRIDESCENCE_THICKNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SHEEN_COLORMAP\n\tvSheenColorMapUv = ( sheenColorMapTransform * vec3( SHEEN_COLORMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SHEEN_ROUGHNESSMAP\n\tvSheenRoughnessMapUv = ( sheenRoughnessMapTransform * vec3( SHEEN_ROUGHNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SPECULARMAP\n\tvSpecularMapUv = ( specularMapTransform * vec3( SPECULARMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SPECULAR_COLORMAP\n\tvSpecularColorMapUv = ( specularColorMapTransform * vec3( SPECULAR_COLORMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SPECULAR_INTENSITYMAP\n\tvSpecularIntensityMapUv = ( specularIntensityMapTransform * vec3( SPECULAR_INTENSITYMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_TRANSMISSIONMAP\n\tvTransmissionMapUv = ( transmissionMapTransform * vec3( TRANSMISSIONMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_THICKNESSMAP\n\tvThicknessMapUv = ( thicknessMapTransform * vec3( THICKNESSMAP_UV, 1 ) ).xy;\n#endif",worldpos_vertex:"#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP ) || defined ( USE_TRANSMISSION ) || NUM_SPOT_LIGHT_COORDS > 0\n\tvec4 worldPosition = vec4( transformed, 1.0 );\n\t#ifdef USE_BATCHING\n\t\tworldPosition = batchingMatrix * worldPosition;\n\t#endif\n\t#ifdef USE_INSTANCING\n\t\tworldPosition = instanceMatrix * worldPosition;\n\t#endif\n\tworldPosition = modelMatrix * worldPosition;\n#endif",background_vert:"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}",background_frag:"uniform sampler2D t2D;\nuniform float backgroundIntensity;\nvarying vec2 vUv;\nvoid main() {\n\tvec4 texColor = texture2D( t2D, vUv );\n\t#ifdef DECODE_VIDEO_TEXTURE\n\t\ttexColor = vec4( mix( pow( texColor.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), texColor.rgb * 0.0773993808, vec3( lessThanEqual( texColor.rgb, vec3( 0.04045 ) ) ) ), texColor.w );\n\t#endif\n\ttexColor.rgb *= backgroundIntensity;\n\tgl_FragColor = texColor;\n\t#include <tonemapping_fragment>\n\t#include <colorspace_fragment>\n}",backgroundCube_vert:"varying vec3 vWorldDirection;\n#include <common>\nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\tgl_Position.z = gl_Position.w;\n}",backgroundCube_frag:"#ifdef ENVMAP_TYPE_CUBE\n\tuniform samplerCube envMap;\n#elif defined( ENVMAP_TYPE_CUBE_UV )\n\tuniform sampler2D envMap;\n#endif\nuniform float flipEnvMap;\nuniform float backgroundBlurriness;\nuniform float backgroundIntensity;\nuniform mat3 backgroundRotation;\nvarying vec3 vWorldDirection;\n#include <cube_uv_reflection_fragment>\nvoid main() {\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 texColor = textureCube( envMap, backgroundRotation * vec3( flipEnvMap * vWorldDirection.x, vWorldDirection.yz ) );\n\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\tvec4 texColor = textureCubeUV( envMap, backgroundRotation * vWorldDirection, backgroundBlurriness );\n\t#else\n\t\tvec4 texColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t#endif\n\ttexColor.rgb *= backgroundIntensity;\n\tgl_FragColor = texColor;\n\t#include <tonemapping_fragment>\n\t#include <colorspace_fragment>\n}",cube_vert:"varying vec3 vWorldDirection;\n#include <common>\nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\tgl_Position.z = gl_Position.w;\n}",cube_frag:"uniform samplerCube tCube;\nuniform float tFlip;\nuniform float opacity;\nvarying vec3 vWorldDirection;\nvoid main() {\n\tvec4 texColor = textureCube( tCube, vec3( tFlip * vWorldDirection.x, vWorldDirection.yz ) );\n\tgl_FragColor = texColor;\n\tgl_FragColor.a *= opacity;\n\t#include <tonemapping_fragment>\n\t#include <colorspace_fragment>\n}",depth_vert:"#include <common>\n#include <batching_pars_vertex>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\t#include <uv_vertex>\n\t#include <batching_vertex>\n\t#include <skinbase_vertex>\n\t#include <morphinstance_vertex>\n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include <beginnormal_vertex>\n\t\t#include <morphnormal_vertex>\n\t\t#include <skinnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvHighPrecisionZW = gl_Position.zw;\n}",depth_frag:"#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <alphahash_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include <clipping_planes_fragment>\n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <alphahash_fragment>\n\t#include <logdepthbuf_fragment>\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#elif DEPTH_PACKING == 3202\n\t\tgl_FragColor = vec4( packDepthToRGB( fragCoordZ ), 1.0 );\n\t#elif DEPTH_PACKING == 3203\n\t\tgl_FragColor = vec4( packDepthToRG( fragCoordZ ), 0.0, 1.0 );\n\t#endif\n}",distanceRGBA_vert:"#define DISTANCE\nvarying vec3 vWorldPosition;\n#include <common>\n#include <batching_pars_vertex>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <batching_vertex>\n\t#include <skinbase_vertex>\n\t#include <morphinstance_vertex>\n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include <beginnormal_vertex>\n\t\t#include <morphnormal_vertex>\n\t\t#include <skinnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <clipping_planes_vertex>\n\tvWorldPosition = worldPosition.xyz;\n}",distanceRGBA_frag:"#define DISTANCE\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <alphahash_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main () {\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include <clipping_planes_fragment>\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <alphahash_fragment>\n\tfloat dist = length( vWorldPosition - referencePosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist );\n\tgl_FragColor = packDepthToRGBA( dist );\n}",equirect_vert:"varying vec3 vWorldDirection;\n#include <common>\nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n}",equirect_frag:"uniform sampler2D tEquirect;\nvarying vec3 vWorldDirection;\n#include <common>\nvoid main() {\n\tvec3 direction = normalize( vWorldDirection );\n\tvec2 sampleUV = equirectUv( direction );\n\tgl_FragColor = texture2D( tEquirect, sampleUV );\n\t#include <tonemapping_fragment>\n\t#include <colorspace_fragment>\n}",linedashed_vert:"uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include <common>\n#include <uv_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\tvLineDistance = scale * lineDistance;\n\t#include <uv_vertex>\n\t#include <color_vertex>\n\t#include <morphinstance_vertex>\n\t#include <morphcolor_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n}",linedashed_frag:"uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include <common>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <clipping_planes_fragment>\n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\t#include <opaque_fragment>\n\t#include <tonemapping_fragment>\n\t#include <colorspace_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n}",meshbasic_vert:"#include <common>\n#include <batching_pars_vertex>\n#include <uv_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <color_vertex>\n\t#include <morphinstance_vertex>\n\t#include <morphcolor_vertex>\n\t#include <batching_vertex>\n\t#if defined ( USE_ENVMAP ) || defined ( USE_SKINNING )\n\t\t#include <beginnormal_vertex>\n\t\t#include <morphnormal_vertex>\n\t\t#include <skinbase_vertex>\n\t\t#include <skinnormal_vertex>\n\t\t#include <defaultnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <fog_vertex>\n}",meshbasic_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <alphahash_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <envmap_common_pars_fragment>\n#include <envmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <clipping_planes_fragment>\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <alphahash_fragment>\n\t#include <specularmap_fragment>\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, vLightMapUv );\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 <aomap_fragment>\n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include <envmap_fragment>\n\t#include <opaque_fragment>\n\t#include <tonemapping_fragment>\n\t#include <colorspace_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}",meshlambert_vert:"#define LAMBERT\nvarying vec3 vViewPosition;\n#include <common>\n#include <batching_pars_vertex>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <normal_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <color_vertex>\n\t#include <morphinstance_vertex>\n\t#include <morphcolor_vertex>\n\t#include <batching_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <normal_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}",meshlambert_frag:"#define LAMBERT\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <alphahash_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_common_pars_fragment>\n#include <envmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <normal_pars_fragment>\n#include <lights_lambert_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <clipping_planes_fragment>\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <alphahash_fragment>\n\t#include <specularmap_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\t#include <emissivemap_fragment>\n\t#include <lights_lambert_fragment>\n\t#include <lights_fragment_begin>\n\t#include <lights_fragment_maps>\n\t#include <lights_fragment_end>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include <envmap_fragment>\n\t#include <opaque_fragment>\n\t#include <tonemapping_fragment>\n\t#include <colorspace_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}",meshmatcap_vert:"#define MATCAP\nvarying vec3 vViewPosition;\n#include <common>\n#include <batching_pars_vertex>\n#include <uv_pars_vertex>\n#include <color_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <fog_pars_vertex>\n#include <normal_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <color_vertex>\n\t#include <morphinstance_vertex>\n\t#include <morphcolor_vertex>\n\t#include <batching_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <normal_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n\tvViewPosition = - mvPosition.xyz;\n}",meshmatcap_frag:"#define MATCAP\nuniform vec3 diffuse;\nuniform float opacity;\nuniform sampler2D matcap;\nvarying vec3 vViewPosition;\n#include <common>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <alphahash_pars_fragment>\n#include <fog_pars_fragment>\n#include <normal_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <clipping_planes_fragment>\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <alphahash_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\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 <opaque_fragment>\n\t#include <tonemapping_fragment>\n\t#include <colorspace_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}",meshnormal_vert:"#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\n\tvarying vec3 vViewPosition;\n#endif\n#include <common>\n#include <batching_pars_vertex>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <normal_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <batching_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphinstance_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <normal_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}",meshnormal_frag:"#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\n\tvarying vec3 vViewPosition;\n#endif\n#include <packing>\n#include <uv_pars_fragment>\n#include <normal_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\tvec4 diffuseColor = vec4( 0.0, 0.0, 0.0, opacity );\n\t#include <clipping_planes_fragment>\n\t#include <logdepthbuf_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\tgl_FragColor = vec4( packNormalToRGB( normal ), diffuseColor.a );\n\t#ifdef OPAQUE\n\t\tgl_FragColor.a = 1.0;\n\t#endif\n}",meshphong_vert:"#define PHONG\nvarying vec3 vViewPosition;\n#include <common>\n#include <batching_pars_vertex>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <normal_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <color_vertex>\n\t#include <morphcolor_vertex>\n\t#include <batching_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphinstance_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <normal_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}",meshphong_frag:"#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <alphahash_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_common_pars_fragment>\n#include <envmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <normal_pars_fragment>\n#include <lights_phong_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <clipping_planes_fragment>\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <alphahash_fragment>\n\t#include <specularmap_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\t#include <emissivemap_fragment>\n\t#include <lights_phong_fragment>\n\t#include <lights_fragment_begin>\n\t#include <lights_fragment_maps>\n\t#include <lights_fragment_end>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include <envmap_fragment>\n\t#include <opaque_fragment>\n\t#include <tonemapping_fragment>\n\t#include <colorspace_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}",meshphysical_vert:"#define STANDARD\nvarying vec3 vViewPosition;\n#ifdef USE_TRANSMISSION\n\tvarying vec3 vWorldPosition;\n#endif\n#include <common>\n#include <batching_pars_vertex>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <normal_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <color_vertex>\n\t#include <morphinstance_vertex>\n\t#include <morphcolor_vertex>\n\t#include <batching_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <normal_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n#ifdef USE_TRANSMISSION\n\tvWorldPosition = worldPosition.xyz;\n#endif\n}",meshphysical_frag:"#define STANDARD\n#ifdef PHYSICAL\n\t#define IOR\n\t#define USE_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 USE_SPECULAR\n\tuniform float specularIntensity;\n\tuniform vec3 specularColor;\n\t#ifdef USE_SPECULAR_COLORMAP\n\t\tuniform sampler2D specularColorMap;\n\t#endif\n\t#ifdef USE_SPECULAR_INTENSITYMAP\n\t\tuniform sampler2D specularIntensityMap;\n\t#endif\n#endif\n#ifdef USE_CLEARCOAT\n\tuniform float clearcoat;\n\tuniform float clearcoatRoughness;\n#endif\n#ifdef USE_DISPERSION\n\tuniform float dispersion;\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_SHEEN_COLORMAP\n\t\tuniform sampler2D sheenColorMap;\n\t#endif\n\t#ifdef USE_SHEEN_ROUGHNESSMAP\n\t\tuniform sampler2D sheenRoughnessMap;\n\t#endif\n#endif\n#ifdef USE_ANISOTROPY\n\tuniform vec2 anisotropyVector;\n\t#ifdef USE_ANISOTROPYMAP\n\t\tuniform sampler2D anisotropyMap;\n\t#endif\n#endif\nvarying vec3 vViewPosition;\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <alphahash_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <iridescence_fragment>\n#include <cube_uv_reflection_fragment>\n#include <envmap_common_pars_fragment>\n#include <envmap_physical_pars_fragment>\n#include <fog_pars_fragment>\n#include <lights_pars_begin>\n#include <normal_pars_fragment>\n#include <lights_physical_pars_fragment>\n#include <transmission_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <clearcoat_pars_fragment>\n#include <iridescence_pars_fragment>\n#include <roughnessmap_pars_fragment>\n#include <metalnessmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <clipping_planes_fragment>\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <alphahash_fragment>\n\t#include <roughnessmap_fragment>\n\t#include <metalnessmap_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\t#include <clearcoat_normal_fragment_begin>\n\t#include <clearcoat_normal_fragment_maps>\n\t#include <emissivemap_fragment>\n\t#include <lights_physical_fragment>\n\t#include <lights_fragment_begin>\n\t#include <lights_fragment_maps>\n\t#include <lights_fragment_end>\n\t#include <aomap_fragment>\n\tvec3 totalDiffuse = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse;\n\tvec3 totalSpecular = reflectedLight.directSpecular + reflectedLight.indirectSpecular;\n\t#include <transmission_fragment>\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 + sheenSpecularDirect + sheenSpecularIndirect;\n\t#endif\n\t#ifdef USE_CLEARCOAT\n\t\tfloat dotNVcc = saturate( dot( geometryClearcoatNormal, geometryViewDir ) );\n\t\tvec3 Fcc = F_Schlick( material.clearcoatF0, material.clearcoatF90, dotNVcc );\n\t\toutgoingLight = outgoingLight * ( 1.0 - material.clearcoat * Fcc ) + ( clearcoatSpecularDirect + clearcoatSpecularIndirect ) * material.clearcoat;\n\t#endif\n\t#include <opaque_fragment>\n\t#include <tonemapping_fragment>\n\t#include <colorspace_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}",meshtoon_vert:"#define TOON\nvarying vec3 vViewPosition;\n#include <common>\n#include <batching_pars_vertex>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <normal_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <color_vertex>\n\t#include <morphinstance_vertex>\n\t#include <morphcolor_vertex>\n\t#include <batching_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <normal_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}",meshtoon_frag:"#define TOON\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <alphahash_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <gradientmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <normal_pars_fragment>\n#include <lights_toon_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <clipping_planes_fragment>\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <alphahash_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\t#include <emissivemap_fragment>\n\t#include <lights_toon_fragment>\n\t#include <lights_fragment_begin>\n\t#include <lights_fragment_maps>\n\t#include <lights_fragment_end>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include <opaque_fragment>\n\t#include <tonemapping_fragment>\n\t#include <colorspace_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}",points_vert:"uniform float size;\nuniform float scale;\n#include <common>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\n#ifdef USE_POINTS_UV\n\tvarying vec2 vUv;\n\tuniform mat3 uvTransform;\n#endif\nvoid main() {\n\t#ifdef USE_POINTS_UV\n\t\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n\t#endif\n\t#include <color_vertex>\n\t#include <morphinstance_vertex>\n\t#include <morphcolor_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <project_vertex>\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 <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <fog_vertex>\n}",points_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include <common>\n#include <color_pars_fragment>\n#include <map_particle_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <alphahash_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <clipping_planes_fragment>\n\tvec3 outgoingLight = vec3( 0.0 );\n\t#include <logdepthbuf_fragment>\n\t#include <map_particle_fragment>\n\t#include <color_fragment>\n\t#include <alphatest_fragment>\n\t#include <alphahash_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\t#include <opaque_fragment>\n\t#include <tonemapping_fragment>\n\t#include <colorspace_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n}",shadow_vert:"#include <common>\n#include <batching_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <shadowmap_pars_vertex>\nvoid main() {\n\t#include <batching_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphinstance_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}",shadow_frag:"uniform vec3 color;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <logdepthbuf_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\nvoid main() {\n\t#include <logdepthbuf_fragment>\n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\t#include <tonemapping_fragment>\n\t#include <colorspace_fragment>\n\t#include <fog_fragment>\n}",sprite_vert:"uniform float rotation;\nuniform vec2 center;\n#include <common>\n#include <uv_pars_vertex>\n#include <fog_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\tvec4 mvPosition = modelViewMatrix[ 3 ];\n\tvec2 scale = vec2( length( modelMatrix[ 0 ].xyz ), length( modelMatrix[ 1 ].xyz ) );\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 <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n}",sprite_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include <common>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <alphahash_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <clipping_planes_fragment>\n\tvec3 outgoingLight = vec3( 0.0 );\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <alphahash_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\t#include <opaque_fragment>\n\t#include <tonemapping_fragment>\n\t#include <colorspace_fragment>\n\t#include <fog_fragment>\n}"},sf={common:{diffuse:{value:new To(16777215)},opacity:{value:1},map:{value:null},mapTransform:{value:new Br},alphaMap:{value:null},alphaMapTransform:{value:new Br},alphaTest:{value:0}},specularmap:{specularMap:{value:null},specularMapTransform:{value:new Br}},envmap:{envMap:{value:null},envMapRotation:{value:new Br},flipEnvMap:{value:-1},reflectivity:{value:1},ior:{value:1.5},refractionRatio:{value:.98}},aomap:{aoMap:{value:null},aoMapIntensity:{value:1},aoMapTransform:{value:new Br}},lightmap:{lightMap:{value:null},lightMapIntensity:{value:1},lightMapTransform:{value:new Br}},bumpmap:{bumpMap:{value:null},bumpMapTransform:{value:new Br},bumpScale:{value:1}},normalmap:{normalMap:{value:null},normalMapTransform:{value:new Br},normalScale:{value:new Tr(1,1)}},displacementmap:{displacementMap:{value:null},displacementMapTransform:{value:new Br},displacementScale:{value:1},displacementBias:{value:0}},emissivemap:{emissiveMap:{value:null},emissiveMapTransform:{value:new Br}},metalnessmap:{metalnessMap:{value:null},metalnessMapTransform:{value:new Br}},roughnessmap:{roughnessMap:{value:null},roughnessMapTransform:{value:new Br}},gradientmap:{gradientMap:{value:null}},fog:{fogDensity:{value:25e-5},fogNear:{value:1},fogFar:{value:2e3},fogColor:{value:new To(16777215)}},lights:{ambientLightColor:{value:[]},lightProbe:{value:[]},directionalLights:{value:[],properties:{direction:{},color:{}}},directionalLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},directionalShadowMap:{value:[]},directionalShadowMatrix:{value:[]},spotLights:{value:[],properties:{color:{},position:{},direction:{},distance:{},coneCos:{},penumbraCos:{},decay:{}}},spotLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},spotLightMap:{value:[]},spotShadowMap:{value:[]},spotLightMatrix:{value:[]},pointLights:{value:[],properties:{color:{},position:{},decay:{},distance:{}}},pointLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{},shadowCameraNear:{},shadowCameraFar:{}}},pointShadowMap:{value:[]},pointShadowMatrix:{value:[]},hemisphereLights:{value:[],properties:{direction:{},skyColor:{},groundColor:{}}},rectAreaLights:{value:[],properties:{color:{},position:{},width:{},height:{}}},ltc_1:{value:null},ltc_2:{value:null}},points:{diffuse:{value:new To(16777215)},opacity:{value:1},size:{value:1},scale:{value:1},map:{value:null},alphaMap:{value:null},alphaMapTransform:{value:new Br},alphaTest:{value:0},uvTransform:{value:new Br}},sprite:{diffuse:{value:new To(16777215)},opacity:{value:1},center:{value:new Tr(.5,.5)},rotation:{value:0},map:{value:null},mapTransform:{value:new Br},alphaMap:{value:null},alphaMapTransform:{value:new Br},alphaTest:{value:0}}},of={basic:{uniforms:ba([sf.common,sf.specularmap,sf.envmap,sf.aomap,sf.lightmap,sf.fog]),vertexShader:rf.meshbasic_vert,fragmentShader:rf.meshbasic_frag},lambert:{uniforms:ba([sf.common,sf.specularmap,sf.envmap,sf.aomap,sf.lightmap,sf.emissivemap,sf.bumpmap,sf.normalmap,sf.displacementmap,sf.fog,sf.lights,{emissive:{value:new To(0)}}]),vertexShader:rf.meshlambert_vert,fragmentShader:rf.meshlambert_frag},phong:{uniforms:ba([sf.common,sf.specularmap,sf.envmap,sf.aomap,sf.lightmap,sf.emissivemap,sf.bumpmap,sf.normalmap,sf.displacementmap,sf.fog,sf.lights,{emissive:{value:new To(0)},specular:{value:new To(1118481)},shininess:{value:30}}]),vertexShader:rf.meshphong_vert,fragmentShader:rf.meshphong_frag},standard:{uniforms:ba([sf.common,sf.envmap,sf.aomap,sf.lightmap,sf.emissivemap,sf.bumpmap,sf.normalmap,sf.displacementmap,sf.roughnessmap,sf.metalnessmap,sf.fog,sf.lights,{emissive:{value:new To(0)},roughness:{value:1},metalness:{value:0},envMapIntensity:{value:1}}]),vertexShader:rf.meshphysical_vert,fragmentShader:rf.meshphysical_frag},toon:{uniforms:ba([sf.common,sf.aomap,sf.lightmap,sf.emissivemap,sf.bumpmap,sf.normalmap,sf.displacementmap,sf.gradientmap,sf.fog,sf.lights,{emissive:{value:new To(0)}}]),vertexShader:rf.meshtoon_vert,fragmentShader:rf.meshtoon_frag},matcap:{uniforms:ba([sf.common,sf.bumpmap,sf.normalmap,sf.displacementmap,sf.fog,{matcap:{value:null}}]),vertexShader:rf.meshmatcap_vert,fragmentShader:rf.meshmatcap_frag},points:{uniforms:ba([sf.points,sf.fog]),vertexShader:rf.points_vert,fragmentShader:rf.points_frag},dashed:{uniforms:ba([sf.common,sf.fog,{scale:{value:1},dashSize:{value:1},totalSize:{value:2}}]),vertexShader:rf.linedashed_vert,fragmentShader:rf.linedashed_frag},depth:{uniforms:ba([sf.common,sf.displacementmap]),vertexShader:rf.depth_vert,fragmentShader:rf.depth_frag},normal:{uniforms:ba([sf.common,sf.bumpmap,sf.normalmap,sf.displacementmap,{opacity:{value:1}}]),vertexShader:rf.meshnormal_vert,fragmentShader:rf.meshnormal_frag},sprite:{uniforms:ba([sf.sprite,sf.fog]),vertexShader:rf.sprite_vert,fragmentShader:rf.sprite_frag},background:{uniforms:{uvTransform:{value:new Br},t2D:{value:null},backgroundIntensity:{value:1}},vertexShader:rf.background_vert,fragmentShader:rf.background_frag},backgroundCube:{uniforms:{envMap:{value:null},flipEnvMap:{value:-1},backgroundBlurriness:{value:0},backgroundIntensity:{value:1},backgroundRotation:{value:new Br}},vertexShader:rf.backgroundCube_vert,fragmentShader:rf.backgroundCube_frag},cube:{uniforms:{tCube:{value:null},tFlip:{value:-1},opacity:{value:1}},vertexShader:rf.cube_vert,fragmentShader:rf.cube_frag},equirect:{uniforms:{tEquirect:{value:null}},vertexShader:rf.equirect_vert,fragmentShader:rf.equirect_frag},distanceRGBA:{uniforms:ba([sf.common,sf.displacementmap,{referencePosition:{value:new os},nearDistance:{value:1},farDistance:{value:1e3}}]),vertexShader:rf.distanceRGBA_vert,fragmentShader:rf.distanceRGBA_frag},shadow:{uniforms:ba([sf.lights,sf.fog,{color:{value:new To(0)},opacity:{value:1}}]),vertexShader:rf.shadow_vert,fragmentShader:rf.shadow_frag}};of.physical={uniforms:ba([of.standard.uniforms,{clearcoat:{value:0},clearcoatMap:{value:null},clearcoatMapTransform:{value:new Br},clearcoatNormalMap:{value:null},clearcoatNormalMapTransform:{value:new Br},clearcoatNormalScale:{value:new Tr(1,1)},clearcoatRoughness:{value:0},clearcoatRoughnessMap:{value:null},clearcoatRoughnessMapTransform:{value:new Br},dispersion:{value:0},iridescence:{value:0},iridescenceMap:{value:null},iridescenceMapTransform:{value:new Br},iridescenceIOR:{value:1.3},iridescenceThicknessMinimum:{value:100},iridescenceThicknessMaximum:{value:400},iridescenceThicknessMap:{value:null},iridescenceThicknessMapTransform:{value:new Br},sheen:{value:0},sheenColor:{value:new To(0)},sheenColorMap:{value:null},sheenColorMapTransform:{value:new Br},sheenRoughness:{value:1},sheenRoughnessMap:{value:null},sheenRoughnessMapTransform:{value:new Br},transmission:{value:0},transmissionMap:{value:null},transmissionMapTransform:{value:new Br},transmissionSamplerSize:{value:new Tr},transmissionSamplerMap:{value:null},thickness:{value:0},thicknessMap:{value:null},thicknessMapTransform:{value:new Br},attenuationDistance:{value:0},attenuationColor:{value:new To(0)},specularColor:{value:new To(1,1,1)},specularColorMap:{value:null},specularColorMapTransform:{value:new Br},specularIntensity:{value:1},specularIntensityMap:{value:null},specularIntensityMapTransform:{value:new Br},anisotropyVector:{value:new Tr},anisotropyMap:{value:null},anisotropyMapTransform:{value:new Br}}]),vertexShader:rf.meshphysical_vert,fragmentShader:rf.meshphysical_frag};const af={r:0,b:0,g:0},lf=new Ws,cf=new ks;function hf(e,t,n,i,r,s,o){const a=new To(0);let l,c,h=!0===s?0:1,u=null,d=0,p=null;function f(e){let i=!0===e.isScene?e.background:null;return i&&i.isTexture&&(i=(e.backgroundBlurriness>0?n:t).get(i)),i}function m(t,n){t.getRGB(af,xa(e)),i.buffers.color.setClear(af.r,af.g,af.b,n,o)}return{getClearColor:function(){return a},setClearColor:function(e,t=1){a.set(e),h=t,m(a,h)},getClearAlpha:function(){return h},setClearAlpha:function(e){h=e,m(a,h)},render:function(t){let n=!1;const r=f(t);null===r?m(a,h):r&&r.isColor&&(m(r,1),n=!0);const s=e.xr.getEnvironmentBlendMode();"additive"===s?i.buffers.color.setClear(0,0,0,1,o):"alpha-blend"===s&&i.buffers.color.setClear(0,0,0,0,o),(e.autoClear||n)&&(i.buffers.depth.setTest(!0),i.buffers.depth.setMask(!0),i.buffers.color.setMask(!0),e.clear(e.autoClearColor,e.autoClearDepth,e.autoClearStencil))},addToRenderList:function(t,n){const i=f(n);i&&(i.isCubeTexture||i.mapping===Vt)?(void 0===c&&(c=new ga(new ya(1e4,1e4,1e4),new wa({name:"BackgroundCubeMaterial",uniforms:Ea(of.backgroundCube.uniforms),vertexShader:of.backgroundCube.vertexShader,fragmentShader:of.backgroundCube.fragmentShader,side:Ve,depthTest:!1,depthWrite:!1,fog:!1})),c.geometry.deleteAttribute("normal"),c.geometry.deleteAttribute("uv"),c.onBeforeRender=function(e,t,n){this.matrixWorld.copyPosition(n.matrixWorld)},Object.defineProperty(c.material,"envMap",{get:function(){return this.uniforms.envMap.value}}),r.update(c)),lf.copy(n.backgroundRotation),lf.x*=-1,lf.y*=-1,lf.z*=-1,i.isCubeTexture&&!1===i.isRenderTargetTexture&&(lf.y*=-1,lf.z*=-1),c.material.uniforms.envMap.value=i,c.material.uniforms.flipEnvMap.value=i.isCubeTexture&&!1===i.isRenderTargetTexture?-1:1,c.material.uniforms.backgroundBlurriness.value=n.backgroundBlurriness,c.material.uniforms.backgroundIntensity.value=n.backgroundIntensity,c.material.uniforms.backgroundRotation.value.setFromMatrix4(cf.makeRotationFromEuler(lf)),c.material.toneMapped=Gr.getTransfer(i.colorSpace)!==Li,u===i&&d===i.version&&p===e.toneMapping||(c.material.needsUpdate=!0,u=i,d=i.version,p=e.toneMapping),c.layers.enableAll(),t.unshift(c,c.geometry,c.material,0,0,null)):i&&i.isTexture&&(void 0===l&&(l=new ga(new Vh(2,2),new wa({name:"BackgroundMaterial",uniforms:Ea(of.background.uniforms),vertexShader:of.background.vertexShader,fragmentShader:of.background.fragmentShader,side:He,depthTest:!1,depthWrite:!1,fog:!1})),l.geometry.deleteAttribute("normal"),Object.defineProperty(l.material,"map",{get:function(){return this.uniforms.t2D.value}}),r.update(l)),l.material.uniforms.t2D.value=i,l.material.uniforms.backgroundIntensity.value=n.backgroundIntensity,l.material.toneMapped=Gr.getTransfer(i.colorSpace)!==Li,!0===i.matrixAutoUpdate&&i.updateMatrix(),l.material.uniforms.uvTransform.value.copy(i.matrix),u===i&&d===i.version&&p===e.toneMapping||(l.material.needsUpdate=!0,u=i,d=i.version,p=e.toneMapping),l.layers.enableAll(),t.unshift(l,l.geometry,l.material,0,0,null))},dispose:function(){void 0!==c&&(c.geometry.dispose(),c.material.dispose(),c=void 0),void 0!==l&&(l.geometry.dispose(),l.material.dispose(),l=void 0)}}}function uf(e,t){const n=e.getParameter(e.MAX_VERTEX_ATTRIBS),i={},r=c(null);let s=r,o=!1;function a(t){return e.bindVertexArray(t)}function l(t){return e.deleteVertexArray(t)}function c(e){const t=[],i=[],r=[];for(let e=0;e<n;e++)t[e]=0,i[e]=0,r[e]=0;return{geometry:null,program:null,wireframe:!1,newAttributes:t,enabledAttributes:i,attributeDivisors:r,object:e,attributes:{},index:null}}function h(){const e=s.newAttributes;for(let t=0,n=e.length;t<n;t++)e[t]=0}function u(e){d(e,0)}function d(t,n){const i=s.newAttributes,r=s.enabledAttributes,o=s.attributeDivisors;i[t]=1,0===r[t]&&(e.enableVertexAttribArray(t),r[t]=1),o[t]!==n&&(e.vertexAttribDivisor(t,n),o[t]=n)}function p(){const t=s.newAttributes,n=s.enabledAttributes;for(let i=0,r=n.length;i<r;i++)n[i]!==t[i]&&(e.disableVertexAttribArray(i),n[i]=0)}function f(t,n,i,r,s,o,a){!0===a?e.vertexAttribIPointer(t,n,i,s,o):e.vertexAttribPointer(t,n,i,r,s,o)}function m(){A(),o=!0,s!==r&&(s=r,a(s.object))}function A(){r.geometry=null,r.program=null,r.wireframe=!1}return{setup:function(n,r,l,m,A){let g=!1;const v=function(t,n,r){const s=!0===r.wireframe;let o=i[t.id];void 0===o&&(o={},i[t.id]=o);let a=o[n.id];void 0===a&&(a={},o[n.id]=a);let l=a[s];return void 0===l&&(l=c(e.createVertexArray()),a[s]=l),l}(m,l,r);s!==v&&(s=v,a(s.object)),g=function(e,t,n,i){const r=s.attributes,o=t.attributes;let a=0;const l=n.getAttributes();for(const t in l)if(l[t].location>=0){const n=r[t];let i=o[t];if(void 0===i&&("instanceMatrix"===t&&e.instanceMatrix&&(i=e.instanceMatrix),"instanceColor"===t&&e.instanceColor&&(i=e.instanceColor)),void 0===n)return!0;if(n.attribute!==i)return!0;if(i&&n.data!==i.data)return!0;a++}return s.attributesNum!==a||s.index!==i}(n,m,l,A),g&&function(e,t,n,i){const r={},o=t.attributes;let a=0;const l=n.getAttributes();for(const t in l)if(l[t].location>=0){let n=o[t];void 0===n&&("instanceMatrix"===t&&e.instanceMatrix&&(n=e.instanceMatrix),"instanceColor"===t&&e.instanceColor&&(n=e.instanceColor));const i={};i.attribute=n,n&&n.data&&(i.data=n.data),r[t]=i,a++}s.attributes=r,s.attributesNum=a,s.index=i}(n,m,l,A),null!==A&&t.update(A,e.ELEMENT_ARRAY_BUFFER),(g||o)&&(o=!1,function(n,i,r,s){h();const o=s.attributes,a=r.getAttributes(),l=i.defaultAttributeValues;for(const i in a){const r=a[i];if(r.location>=0){let a=o[i];if(void 0===a&&("instanceMatrix"===i&&n.instanceMatrix&&(a=n.instanceMatrix),"instanceColor"===i&&n.instanceColor&&(a=n.instanceColor)),void 0!==a){const i=a.normalized,o=a.itemSize,l=t.get(a);if(void 0===l)continue;const c=l.buffer,h=l.type,p=l.bytesPerElement,m=h===e.INT||h===e.UNSIGNED_INT||a.gpuType===cn;if(a.isInterleavedBufferAttribute){const t=a.data,l=t.stride,A=a.offset;if(t.isInstancedInterleavedBuffer){for(let e=0;e<r.locationSize;e++)d(r.location+e,t.meshPerAttribute);!0!==n.isInstancedMesh&&void 0===s._maxInstanceCount&&(s._maxInstanceCount=t.meshPerAttribute*t.count)}else for(let e=0;e<r.locationSize;e++)u(r.location+e);e.bindBuffer(e.ARRAY_BUFFER,c);for(let e=0;e<r.locationSize;e++)f(r.location+e,o/r.locationSize,h,i,l*p,(A+o/r.locationSize*e)*p,m)}else{if(a.isInstancedBufferAttribute){for(let e=0;e<r.locationSize;e++)d(r.location+e,a.meshPerAttribute);!0!==n.isInstancedMesh&&void 0===s._maxInstanceCount&&(s._maxInstanceCount=a.meshPerAttribute*a.count)}else for(let e=0;e<r.locationSize;e++)u(r.location+e);e.bindBuffer(e.ARRAY_BUFFER,c);for(let e=0;e<r.locationSize;e++)f(r.location+e,o/r.locationSize,h,i,o*p,o/r.locationSize*e*p,m)}}else if(void 0!==l){const t=l[i];if(void 0!==t)switch(t.length){case 2:e.vertexAttrib2fv(r.location,t);break;case 3:e.vertexAttrib3fv(r.location,t);break;case 4:e.vertexAttrib4fv(r.location,t);break;default:e.vertexAttrib1fv(r.location,t)}}}}p()}(n,r,l,m),null!==A&&e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t.get(A).buffer))},reset:m,resetDefaultState:A,dispose:function(){m();for(const e in i){const t=i[e];for(const e in t){const n=t[e];for(const e in n)l(n[e].object),delete n[e];delete t[e]}delete i[e]}},releaseStatesOfGeometry:function(e){if(void 0===i[e.id])return;const t=i[e.id];for(const e in t){const n=t[e];for(const e in n)l(n[e].object),delete n[e];delete t[e]}delete i[e.id]},releaseStatesOfProgram:function(e){for(const t in i){const n=i[t];if(void 0===n[e.id])continue;const r=n[e.id];for(const e in r)l(r[e].object),delete r[e];delete n[e.id]}},initAttributes:h,enableAttribute:u,disableUnusedAttributes:p}}function df(e,t,n){let i;function r(t,r,s){0!==s&&(e.drawArraysInstanced(i,t,r,s),n.update(r,i,s))}this.setMode=function(e){i=e},this.render=function(t,r){e.drawArrays(i,t,r),n.update(r,i,1)},this.renderInstances=r,this.renderMultiDraw=function(e,r,s){if(0===s)return;t.get("WEBGL_multi_draw").multiDrawArraysWEBGL(i,e,0,r,0,s);let o=0;for(let e=0;e<s;e++)o+=r[e];n.update(o,i,1)},this.renderMultiDrawInstances=function(e,s,o,a){if(0===o)return;const l=t.get("WEBGL_multi_draw");if(null===l)for(let t=0;t<e.length;t++)r(e[t],s[t],a[t]);else{l.multiDrawArraysInstancedWEBGL(i,e,0,s,0,a,0,o);let t=0;for(let e=0;e<o;e++)t+=s[e]*a[e];n.update(t,i,1)}}}function pf(e,t,n,i){let r;function s(t){if("highp"===t){if(e.getShaderPrecisionFormat(e.VERTEX_SHADER,e.HIGH_FLOAT).precision>0&&e.getShaderPrecisionFormat(e.FRAGMENT_SHADER,e.HIGH_FLOAT).precision>0)return"highp";t="mediump"}return"mediump"===t&&e.getShaderPrecisionFormat(e.VERTEX_SHADER,e.MEDIUM_FLOAT).precision>0&&e.getShaderPrecisionFormat(e.FRAGMENT_SHADER,e.MEDIUM_FLOAT).precision>0?"mediump":"lowp"}let o=void 0!==n.precision?n.precision:"highp";const a=s(o);a!==o&&(console.warn("THREE.WebGLRenderer:",o,"not supported, using",a,"instead."),o=a);const l=!0===n.logarithmicDepthBuffer,c=!0===n.reverseDepthBuffer&&t.has("EXT_clip_control"),h=e.getParameter(e.MAX_TEXTURE_IMAGE_UNITS),u=e.getParameter(e.MAX_VERTEX_TEXTURE_IMAGE_UNITS);return{isWebGL2:!0,getMaxAnisotropy:function(){if(void 0!==r)return r;if(!0===t.has("EXT_texture_filter_anisotropic")){const n=t.get("EXT_texture_filter_anisotropic");r=e.getParameter(n.MAX_TEXTURE_MAX_ANISOTROPY_EXT)}else r=0;return r},getMaxPrecision:s,textureFormatReadable:function(t){return t===yn||i.convert(t)===e.getParameter(e.IMPLEMENTATION_COLOR_READ_FORMAT)},textureTypeReadable:function(n){const r=n===dn&&(t.has("EXT_color_buffer_half_float")||t.has("EXT_color_buffer_float"));return!(n!==sn&&i.convert(n)!==e.getParameter(e.IMPLEMENTATION_COLOR_READ_TYPE)&&n!==un&&!r)},precision:o,logarithmicDepthBuffer:l,reverseDepthBuffer:c,maxTextures:h,maxVertexTextures:u,maxTextureSize:e.getParameter(e.MAX_TEXTURE_SIZE),maxCubemapSize:e.getParameter(e.MAX_CUBE_MAP_TEXTURE_SIZE),maxAttributes:e.getParameter(e.MAX_VERTEX_ATTRIBS),maxVertexUniforms:e.getParameter(e.MAX_VERTEX_UNIFORM_VECTORS),maxVaryings:e.getParameter(e.MAX_VARYING_VECTORS),maxFragmentUniforms:e.getParameter(e.MAX_FRAGMENT_UNIFORM_VECTORS),vertexTextures:u>0,maxSamples:e.getParameter(e.MAX_SAMPLES)}}function ff(e){const t=this;let n=null,i=0,r=!1,s=!1;const o=new Ul,a=new Br,l={value:null,needsUpdate:!1};function c(e,n,i,r){const s=null!==e?e.length:0;let c=null;if(0!==s){if(c=l.value,!0!==r||null===c){const t=i+4*s,r=n.matrixWorldInverse;a.getNormalMatrix(r),(null===c||c.length<t)&&(c=new Float32Array(t));for(let t=0,n=i;t!==s;++t,n+=4)o.copy(e[t]).applyMatrix4(r,a),o.normal.toArray(c,n),c[n+3]=o.constant}l.value=c,l.needsUpdate=!0}return t.numPlanes=s,t.numIntersection=0,c}this.uniform=l,this.numPlanes=0,this.numIntersection=0,this.init=function(e,t){const n=0!==e.length||t||0!==i||r;return r=t,i=e.length,n},this.beginShadows=function(){s=!0,c(null)},this.endShadows=function(){s=!1},this.setGlobalState=function(e,t){n=c(e,t,0)},this.setState=function(o,a,h){const u=o.clippingPlanes,d=o.clipIntersection,p=o.clipShadows,f=e.get(o);if(!r||null===u||0===u.length||s&&!p)s?c(null):(l.value!==n&&(l.value=n,l.needsUpdate=i>0),t.numPlanes=i,t.numIntersection=0);else{const e=s?0:i,t=4*e;let r=f.clippingState||null;l.value=r,r=c(u,a,t,h);for(let e=0;e!==t;++e)r[e]=n[e];f.clippingState=r,this.numIntersection=d?this.numPlanes:0,this.numPlanes+=e}}}function mf(e){let t=new WeakMap;function n(e,t){return t===Gt?e.mapping=Qt:t===Ht&&(e.mapping=zt),e}function i(e){const n=e.target;n.removeEventListener("dispose",i);const r=t.get(n);void 0!==r&&(t.delete(n),r.dispose())}return{get:function(r){if(r&&r.isTexture){const s=r.mapping;if(s===Gt||s===Ht){if(t.has(r))return n(t.get(r).texture,r.mapping);{const s=r.image;if(s&&s.height>0){const o=new Da(s.height);return o.fromEquirectangularTexture(e,r),t.set(r,o),r.addEventListener("dispose",i),n(o.texture,r.mapping)}return null}}}return r},dispose:function(){t=new WeakMap}}}const Af=[.125,.215,.35,.446,.526,.582],gf=new sd,vf=new To;let yf=null,Ef=0,bf=0,xf=!1;const Cf=(1+Math.sqrt(5))/2,wf=1/Cf,_f=[new os(-Cf,wf,0),new os(Cf,wf,0),new os(-wf,0,Cf),new os(wf,0,Cf),new os(0,Cf,-wf),new os(0,Cf,wf),new os(-1,1,-1),new os(1,1,-1),new os(-1,1,1),new os(1,1,1)];class Mf{constructor(e){this._renderer=e,this._pingPongRenderTarget=null,this._lodMax=0,this._cubeSize=0,this._lodPlanes=[],this._sizeLods=[],this._sigmas=[],this._blurMaterial=null,this._cubemapMaterial=null,this._equirectMaterial=null,this._compileMaterial(this._blurMaterial)}fromScene(e,t=0,n=.1,i=100){yf=this._renderer.getRenderTarget(),Ef=this._renderer.getActiveCubeFace(),bf=this._renderer.getActiveMipmapLevel(),xf=this._renderer.xr.enabled,this._renderer.xr.enabled=!1,this._setSize(256);const r=this._allocateTargets();return r.depthBuffer=!0,this._sceneToCubeUV(e,n,i,r),t>0&&this._blur(r,0,0,t),this._applyPMREM(r),this._cleanup(r),r}fromEquirectangular(e,t=null){return this._fromTexture(e,t)}fromCubemap(e,t=null){return this._fromTexture(e,t)}compileCubemapShader(){null===this._cubemapMaterial&&(this._cubemapMaterial=Bf(),this._compileMaterial(this._cubemapMaterial))}compileEquirectangularShader(){null===this._equirectMaterial&&(this._equirectMaterial=Tf(),this._compileMaterial(this._equirectMaterial))}dispose(){this._dispose(),null!==this._cubemapMaterial&&this._cubemapMaterial.dispose(),null!==this._equirectMaterial&&this._equirectMaterial.dispose()}_setSize(e){this._lodMax=Math.floor(Math.log2(e)),this._cubeSize=Math.pow(2,this._lodMax)}_dispose(){null!==this._blurMaterial&&this._blurMaterial.dispose(),null!==this._pingPongRenderTarget&&this._pingPongRenderTarget.dispose();for(let e=0;e<this._lodPlanes.length;e++)this._lodPlanes[e].dispose()}_cleanup(e){this._renderer.setRenderTarget(yf,Ef,bf),this._renderer.xr.enabled=xf,e.scissorTest=!1,Sf(e,0,0,e.width,e.height)}_fromTexture(e,t){e.mapping===Qt||e.mapping===zt?this._setSize(0===e.image.length?16:e.image[0].width||e.image[0].image.width):this._setSize(e.image.width/4),yf=this._renderer.getRenderTarget(),Ef=this._renderer.getActiveCubeFace(),bf=this._renderer.getActiveMipmapLevel(),xf=this._renderer.xr.enabled,this._renderer.xr.enabled=!1;const n=t||this._allocateTargets();return this._textureToCubeUV(e,n),this._applyPMREM(n),this._cleanup(n),n}_allocateTargets(){const e=3*Math.max(this._cubeSize,112),t=4*this._cubeSize,n={magFilter:$t,minFilter:$t,generateMipmaps:!1,type:dn,format:yn,colorSpace:Bi,depthBuffer:!1},i=If(e,t,n);if(null===this._pingPongRenderTarget||this._pingPongRenderTarget.width!==e||this._pingPongRenderTarget.height!==t){null!==this._pingPongRenderTarget&&this._dispose(),this._pingPongRenderTarget=If(e,t,n);const{_lodMax:i}=this;({sizeLods:this._sizeLods,lodPlanes:this._lodPlanes,sigmas:this._sigmas}=function(e){const t=[],n=[],i=[];let r=e;const s=e-4+1+Af.length;for(let o=0;o<s;o++){const s=Math.pow(2,r);n.push(s);let a=1/s;o>e-4?a=Af[o-e+4-1]:0===o&&(a=0),i.push(a);const l=1/(s-2),c=-l,h=1+l,u=[c,c,h,c,h,h,c,c,h,h,c,h],d=6,p=6,f=3,m=2,A=1,g=new Float32Array(f*p*d),v=new Float32Array(m*p*d),y=new Float32Array(A*p*d);for(let e=0;e<d;e++){const t=e%3*2/3-1,n=e>2?0:-1,i=[t,n,0,t+2/3,n,0,t+2/3,n+1,0,t,n,0,t+2/3,n+1,0,t,n+1,0];g.set(i,f*p*e),v.set(u,m*p*e);const r=[e,e,e,e,e,e];y.set(r,A*p*e)}const E=new sa;E.setAttribute("position",new Go(g,f)),E.setAttribute("uv",new Go(v,m)),E.setAttribute("faceIndex",new Go(y,A)),t.push(E),r>4&&r--}return{lodPlanes:t,sizeLods:n,sigmas:i}}(i)),this._blurMaterial=function(e,t,n){const i=new Float32Array(20),r=new os(0,1,0);return new wa({name:"SphericalGaussianBlur",defines:{n:20,CUBEUV_TEXEL_WIDTH:1/t,CUBEUV_TEXEL_HEIGHT:1/n,CUBEUV_MAX_MIP:`${e}.0`},uniforms:{envMap:{value:null},samples:{value:1},weights:{value:i},latitudinal:{value:!1},dTheta:{value:0},mipInt:{value:0},poleAxis:{value:r}},vertexShader:"\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",fragmentShader:"\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 <cube_uv_reflection_fragment>\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",blending:We,depthTest:!1,depthWrite:!1})}(i,e,t)}return i}_compileMaterial(e){const t=new ga(this._lodPlanes[0],e);this._renderer.compile(t,gf)}_sceneToCubeUV(e,t,n,i){const r=new Ta(90,1,t,n),s=[1,-1,1,1,1,1],o=[1,1,1,-1,-1,-1],a=this._renderer,l=a.autoClear,c=a.toneMapping;a.getClearColor(vf),a.toneMapping=Tt,a.autoClear=!1;const h=new Do({name:"PMREM.Background",side:Ve,depthWrite:!1,depthTest:!1}),u=new ga(new ya,h);let d=!1;const p=e.background;p?p.isColor&&(h.color.copy(p),e.background=null,d=!0):(h.color.copy(vf),d=!0);for(let t=0;t<6;t++){const n=t%3;0===n?(r.up.set(0,s[t],0),r.lookAt(o[t],0,0)):1===n?(r.up.set(0,0,s[t]),r.lookAt(0,o[t],0)):(r.up.set(0,s[t],0),r.lookAt(0,0,o[t]));const l=this._cubeSize;Sf(i,n*l,t>2?l:0,l,l),a.setRenderTarget(i),d&&a.render(u,r),a.render(e,r)}u.geometry.dispose(),u.material.dispose(),a.toneMapping=c,a.autoClear=l,e.background=p}_textureToCubeUV(e,t){const n=this._renderer,i=e.mapping===Qt||e.mapping===zt;i?(null===this._cubemapMaterial&&(this._cubemapMaterial=Bf()),this._cubemapMaterial.uniforms.flipEnvMap.value=!1===e.isRenderTargetTexture?-1:1):null===this._equirectMaterial&&(this._equirectMaterial=Tf());const r=i?this._cubemapMaterial:this._equirectMaterial,s=new ga(this._lodPlanes[0],r);r.uniforms.envMap.value=e;const o=this._cubeSize;Sf(t,0,0,3*o,2*o),n.setRenderTarget(t),n.render(s,gf)}_applyPMREM(e){const t=this._renderer,n=t.autoClear;t.autoClear=!1;const i=this._lodPlanes.length;for(let t=1;t<i;t++){const n=Math.sqrt(this._sigmas[t]*this._sigmas[t]-this._sigmas[t-1]*this._sigmas[t-1]),r=_f[(i-t-1)%_f.length];this._blur(e,t-1,t,n,r)}t.autoClear=n}_blur(e,t,n,i,r){const s=this._pingPongRenderTarget;this._halfBlur(e,s,t,n,i,"latitudinal",r),this._halfBlur(s,e,n,n,i,"longitudinal",r)}_halfBlur(e,t,n,i,r,s,o){const a=this._renderer,l=this._blurMaterial;"latitudinal"!==s&&"longitudinal"!==s&&console.error("blur direction must be either latitudinal or longitudinal!");const c=new ga(this._lodPlanes[i],l),h=l.uniforms,u=this._sizeLods[n]-1,d=isFinite(r)?Math.PI/(2*u):2*Math.PI/39,p=r/d,f=isFinite(r)?1+Math.floor(3*p):20;f>20&&console.warn(`sigmaRadians, ${r}, is too large and will clip, as it requested ${f} samples when the maximum is set to 20`);const m=[];let A=0;for(let e=0;e<20;++e){const t=e/p,n=Math.exp(-t*t/2);m.push(n),0===e?A+=n:e<f&&(A+=2*n)}for(let e=0;e<m.length;e++)m[e]=m[e]/A;h.envMap.value=e.texture,h.samples.value=f,h.weights.value=m,h.latitudinal.value="latitudinal"===s,o&&(h.poleAxis.value=o);const{_lodMax:g}=this;h.dTheta.value=d,h.mipInt.value=g-n;const v=this._sizeLods[i];Sf(t,3*v*(i>g-4?i-g+4:0),4*(this._cubeSize-v),3*v,2*v),a.setRenderTarget(t),a.render(c,gf)}}function If(e,t,n){const i=new es(e,t,n);return i.texture.mapping=Vt,i.texture.name="PMREM.cubeUv",i.scissorTest=!0,i}function Sf(e,t,n,i,r){e.viewport.set(t,n,i,r),e.scissor.set(t,n,i,r)}function Tf(){return new wa({name:"EquirectangularToCubeUV",uniforms:{envMap:{value:null}},vertexShader:"\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",fragmentShader:"\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 <common>\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",blending:We,depthTest:!1,depthWrite:!1})}function Bf(){return new wa({name:"CubemapToCubeUV",uniforms:{envMap:{value:null},flipEnvMap:{value:-1}},vertexShader:"\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",fragmentShader:"\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",blending:We,depthTest:!1,depthWrite:!1})}function Rf(e){let t=new WeakMap,n=null;function i(e){const n=e.target;n.removeEventListener("dispose",i);const r=t.get(n);void 0!==r&&(t.delete(n),r.dispose())}return{get:function(r){if(r&&r.isTexture){const s=r.mapping,o=s===Gt||s===Ht,a=s===Qt||s===zt;if(o||a){let s=t.get(r);const l=void 0!==s?s.texture.pmremVersion:0;if(r.isRenderTargetTexture&&r.pmremVersion!==l)return null===n&&(n=new Mf(e)),s=o?n.fromEquirectangular(r,s):n.fromCubemap(r,s),s.texture.pmremVersion=r.pmremVersion,t.set(r,s),s.texture;if(void 0!==s)return s.texture;{const l=r.image;return o&&l&&l.height>0||a&&l&&function(e){let t=0;for(let n=0;n<6;n++)void 0!==e[n]&&t++;return 6===t}(l)?(null===n&&(n=new Mf(e)),s=o?n.fromEquirectangular(r):n.fromCubemap(r),s.texture.pmremVersion=r.pmremVersion,t.set(r,s),r.addEventListener("dispose",i),s.texture):null}}}return r},dispose:function(){t=new WeakMap,null!==n&&(n.dispose(),n=null)}}}function Lf(e){const t={};function n(n){if(void 0!==t[n])return t[n];let i;switch(n){case"WEBGL_depth_texture":i=e.getExtension("WEBGL_depth_texture")||e.getExtension("MOZ_WEBGL_depth_texture")||e.getExtension("WEBKIT_WEBGL_depth_texture");break;case"EXT_texture_filter_anisotropic":i=e.getExtension("EXT_texture_filter_anisotropic")||e.getExtension("MOZ_EXT_texture_filter_anisotropic")||e.getExtension("WEBKIT_EXT_texture_filter_anisotropic");break;case"WEBGL_compressed_texture_s3tc":i=e.getExtension("WEBGL_compressed_texture_s3tc")||e.getExtension("MOZ_WEBGL_compressed_texture_s3tc")||e.getExtension("WEBKIT_WEBGL_compressed_texture_s3tc");break;case"WEBGL_compressed_texture_pvrtc":i=e.getExtension("WEBGL_compressed_texture_pvrtc")||e.getExtension("WEBKIT_WEBGL_compressed_texture_pvrtc");break;default:i=e.getExtension(n)}return t[n]=i,i}return{has:function(e){return null!==n(e)},init:function(){n("EXT_color_buffer_float"),n("WEBGL_clip_cull_distance"),n("OES_texture_float_linear"),n("EXT_color_buffer_half_float"),n("WEBGL_multisampled_render_to_texture"),n("WEBGL_render_shared_exponent")},get:function(e){const t=n(e);return null===t&&Or("THREE.WebGLRenderer: "+e+" extension not supported."),t}}}function Df(e,t,n,i){const r={},s=new WeakMap;function o(e){const a=e.target;null!==a.index&&t.remove(a.index);for(const e in a.attributes)t.remove(a.attributes[e]);a.removeEventListener("dispose",o),delete r[a.id];const l=s.get(a);l&&(t.remove(l),s.delete(a)),i.releaseStatesOfGeometry(a),!0===a.isInstancedBufferGeometry&&delete a._maxInstanceCount,n.memory.geometries--}function a(e){const n=[],i=e.index,r=e.attributes.position;let o=0;if(null!==i){const e=i.array;o=i.version;for(let t=0,i=e.length;t<i;t+=3){const i=e[t+0],r=e[t+1],s=e[t+2];n.push(i,r,r,s,s,i)}}else{if(void 0===r)return;{const e=r.array;o=r.version;for(let t=0,i=e.length/3-1;t<i;t+=3){const e=t+0,i=t+1,r=t+2;n.push(e,i,i,r,r,e)}}}const a=new(Lr(n)?Yo:qo)(n,1);a.version=o;const l=s.get(e);l&&t.remove(l),s.set(e,a)}return{get:function(e,t){return!0===r[t.id]||(t.addEventListener("dispose",o),r[t.id]=!0,n.memory.geometries++),t},update:function(n){const i=n.attributes;for(const n in i)t.update(i[n],e.ARRAY_BUFFER)},getWireframeAttribute:function(e){const t=s.get(e);if(t){const n=e.index;null!==n&&t.version<n.version&&a(e)}else a(e);return s.get(e)}}}function Pf(e,t,n){let i,r,s;function o(t,o,a){0!==a&&(e.drawElementsInstanced(i,o,r,t*s,a),n.update(o,i,a))}this.setMode=function(e){i=e},this.setIndex=function(e){r=e.type,s=e.bytesPerElement},this.render=function(t,o){e.drawElements(i,o,r,t*s),n.update(o,i,1)},this.renderInstances=o,this.renderMultiDraw=function(e,s,o){if(0===o)return;t.get("WEBGL_multi_draw").multiDrawElementsWEBGL(i,s,0,r,e,0,o);let a=0;for(let e=0;e<o;e++)a+=s[e];n.update(a,i,1)},this.renderMultiDrawInstances=function(e,a,l,c){if(0===l)return;const h=t.get("WEBGL_multi_draw");if(null===h)for(let t=0;t<e.length;t++)o(e[t]/s,a[t],c[t]);else{h.multiDrawElementsInstancedWEBGL(i,a,0,r,e,0,c,0,l);let t=0;for(let e=0;e<l;e++)t+=a[e]*c[e];n.update(t,i,1)}}}function Uf(e){const t={frame:0,calls:0,triangles:0,points:0,lines:0};return{memory:{geometries:0,textures:0},render:t,programs:null,autoReset:!0,reset:function(){t.calls=0,t.triangles=0,t.points=0,t.lines=0},update:function(n,i,r){switch(t.calls++,i){case e.TRIANGLES:t.triangles+=r*(n/3);break;case e.LINES:t.lines+=r*(n/2);break;case e.LINE_STRIP:t.lines+=r*(n-1);break;case e.LINE_LOOP:t.lines+=r*n;break;case e.POINTS:t.points+=r*n;break;default:console.error("THREE.WebGLInfo: Unknown draw mode:",i)}}}}function kf(e,t,n){const i=new WeakMap,r=new Zr;return{update:function(s,o,a){const l=s.morphTargetInfluences,c=o.morphAttributes.position||o.morphAttributes.normal||o.morphAttributes.color,h=void 0!==c?c.length:0;let u=i.get(o);if(void 0===u||u.count!==h){void 0!==u&&u.texture.dispose();const d=void 0!==o.morphAttributes.position,p=void 0!==o.morphAttributes.normal,f=void 0!==o.morphAttributes.color,m=o.morphAttributes.position||[],A=o.morphAttributes.normal||[],g=o.morphAttributes.color||[];let v=0;!0===d&&(v=1),!0===p&&(v=2),!0===f&&(v=3);let y=o.attributes.position.count*v,E=1;y>t.maxTextureSize&&(E=Math.ceil(y/t.maxTextureSize),y=t.maxTextureSize);const b=new Float32Array(y*E*4*h),x=new ts(b,y,E,h);x.type=un,x.needsUpdate=!0;const C=4*v;for(let _=0;_<h;_++){const M=m[_],I=A[_],S=g[_],T=y*E*4*_;for(let B=0;B<M.count;B++){const R=B*C;!0===d&&(r.fromBufferAttribute(M,B),b[T+R+0]=r.x,b[T+R+1]=r.y,b[T+R+2]=r.z,b[T+R+3]=0),!0===p&&(r.fromBufferAttribute(I,B),b[T+R+4]=r.x,b[T+R+5]=r.y,b[T+R+6]=r.z,b[T+R+7]=0),!0===f&&(r.fromBufferAttribute(S,B),b[T+R+8]=r.x,b[T+R+9]=r.y,b[T+R+10]=r.z,b[T+R+11]=4===S.itemSize?r.w:1)}}function w(){x.dispose(),i.delete(o),o.removeEventListener("dispose",w)}u={count:h,texture:x,size:new Tr(y,E)},i.set(o,u),o.addEventListener("dispose",w)}if(!0===s.isInstancedMesh&&null!==s.morphTexture)a.getUniforms().setValue(e,"morphTexture",s.morphTexture,n);else{let L=0;for(let P=0;P<l.length;P++)L+=l[P];const D=o.morphTargetsRelative?1:1-L;a.getUniforms().setValue(e,"morphTargetBaseInfluence",D),a.getUniforms().setValue(e,"morphTargetInfluences",l)}a.getUniforms().setValue(e,"morphTargetsTexture",u.texture,n),a.getUniforms().setValue(e,"morphTargetsTextureSize",u.size)}}}class Nf{constructor(e,t,n){if(this.renderer=e,this.DEFAULT_NUMVIEWS=2,this.maxNumViews=0,this.gl=n,this.extensions=t,this.available=this.extensions.has("OCULUS_multiview"),this.available){const e=this.extensions.get("OCULUS_multiview");this.maxNumViews=this.gl.getParameter(e.MAX_VIEWS_OVR),this.mat4=[],this.mat3=[],this.cameraArray=[];for(var i=0;i<this.maxNumViews;i++)this.mat4[i]=new ks,this.mat3[i]=new Br}}getCameraArray(e){return e.isArrayCamera?e.cameras:(this.cameraArray[0]=e,this.cameraArray)}updateCameraProjectionMatricesUniform(e,t){for(var n=this.getCameraArray(e),i=0;i<n.length;i++)this.mat4[i].copy(n[i].projectionMatrix);t.setValue(this.gl,"projectionMatrices",this.mat4)}updateCameraViewMatricesUniform(e,t){for(var n=this.getCameraArray(e),i=0;i<n.length;i++)this.mat4[i].copy(n[i].matrixWorldInverse);t.setValue(this.gl,"viewMatrices",this.mat4)}updateObjectMatricesUniforms(e,t,n){for(var i=this.getCameraArray(t),r=0;r<i.length;r++)this.mat4[r].multiplyMatrices(i[r].matrixWorldInverse,e.matrixWorld),this.mat3[r].getNormalMatrix(this.mat4[r]);n.setValue(this.gl,"modelViewMatrices",this.mat4),n.setValue(this.gl,"normalMatrices",this.mat3)}}function Of(e,t,n,i){let r=new WeakMap;function s(e){const t=e.target;t.removeEventListener("dispose",s),n.remove(t.instanceMatrix),null!==t.instanceColor&&n.remove(t.instanceColor)}return{update:function(o){const a=i.render.frame,l=o.geometry,c=t.get(o,l);if(r.get(c)!==a&&(t.update(c),r.set(c,a)),o.isInstancedMesh&&(!1===o.hasEventListener("dispose",s)&&o.addEventListener("dispose",s),r.get(o)!==a&&(n.update(o.instanceMatrix,e.ARRAY_BUFFER),null!==o.instanceColor&&n.update(o.instanceColor,e.ARRAY_BUFFER),r.set(o,a))),o.isSkinnedMesh){const e=o.skeleton;r.get(e)!==a&&(e.update(),r.set(e,a))}return c},dispose:function(){r=new WeakMap}}}const Ff=new Kr,Qf=new Rc(1,1),zf=new ts,Gf=new is,Hf=new La,Vf=[],jf=[],Wf=new Float32Array(16),qf=new Float32Array(9),Xf=new Float32Array(4);function Yf(e,t,n){const i=e[0];if(i<=0||i>0)return e;const r=t*n;let s=Vf[r];if(void 0===s&&(s=new Float32Array(r),Vf[r]=s),0!==t){i.toArray(s,0);for(let i=1,r=0;i!==t;++i)r+=n,e[i].toArray(s,r)}return s}function Jf(e,t){if(e.length!==t.length)return!1;for(let n=0,i=e.length;n<i;n++)if(e[n]!==t[n])return!1;return!0}function Kf(e,t){for(let n=0,i=t.length;n<i;n++)e[n]=t[n]}function Zf(e,t){let n=jf[t];void 0===n&&(n=new Int32Array(t),jf[t]=n);for(let i=0;i!==t;++i)n[i]=e.allocateTextureUnit();return n}function $f(e,t){const n=this.cache;n[0]!==t&&(e.uniform1f(this.addr,t),n[0]=t)}function em(e,t){const n=this.cache;if(void 0!==t.x)n[0]===t.x&&n[1]===t.y||(e.uniform2f(this.addr,t.x,t.y),n[0]=t.x,n[1]=t.y);else{if(Jf(n,t))return;e.uniform2fv(this.addr,t),Kf(n,t)}}function tm(e,t){const n=this.cache;if(void 0!==t.x)n[0]===t.x&&n[1]===t.y&&n[2]===t.z||(e.uniform3f(this.addr,t.x,t.y,t.z),n[0]=t.x,n[1]=t.y,n[2]=t.z);else if(void 0!==t.r)n[0]===t.r&&n[1]===t.g&&n[2]===t.b||(e.uniform3f(this.addr,t.r,t.g,t.b),n[0]=t.r,n[1]=t.g,n[2]=t.b);else{if(Jf(n,t))return;e.uniform3fv(this.addr,t),Kf(n,t)}}function nm(e,t){const n=this.cache;if(void 0!==t.x)n[0]===t.x&&n[1]===t.y&&n[2]===t.z&&n[3]===t.w||(e.uniform4f(this.addr,t.x,t.y,t.z,t.w),n[0]=t.x,n[1]=t.y,n[2]=t.z,n[3]=t.w);else{if(Jf(n,t))return;e.uniform4fv(this.addr,t),Kf(n,t)}}function im(e,t){const n=this.cache,i=t.elements;if(void 0===i){if(Jf(n,t))return;e.uniformMatrix2fv(this.addr,!1,t),Kf(n,t)}else{if(Jf(n,i))return;Xf.set(i),e.uniformMatrix2fv(this.addr,!1,Xf),Kf(n,i)}}function rm(e,t){const n=this.cache,i=t.elements;if(void 0===i){if(Jf(n,t))return;e.uniformMatrix3fv(this.addr,!1,t),Kf(n,t)}else{if(Jf(n,i))return;qf.set(i),e.uniformMatrix3fv(this.addr,!1,qf),Kf(n,i)}}function sm(e,t){const n=this.cache,i=t.elements;if(void 0===i){if(Jf(n,t))return;e.uniformMatrix4fv(this.addr,!1,t),Kf(n,t)}else{if(Jf(n,i))return;Wf.set(i),e.uniformMatrix4fv(this.addr,!1,Wf),Kf(n,i)}}function om(e,t){const n=this.cache;n[0]!==t&&(e.uniform1i(this.addr,t),n[0]=t)}function am(e,t){const n=this.cache;if(void 0!==t.x)n[0]===t.x&&n[1]===t.y||(e.uniform2i(this.addr,t.x,t.y),n[0]=t.x,n[1]=t.y);else{if(Jf(n,t))return;e.uniform2iv(this.addr,t),Kf(n,t)}}function lm(e,t){const n=this.cache;if(void 0!==t.x)n[0]===t.x&&n[1]===t.y&&n[2]===t.z||(e.uniform3i(this.addr,t.x,t.y,t.z),n[0]=t.x,n[1]=t.y,n[2]=t.z);else{if(Jf(n,t))return;e.uniform3iv(this.addr,t),Kf(n,t)}}function cm(e,t){const n=this.cache;if(void 0!==t.x)n[0]===t.x&&n[1]===t.y&&n[2]===t.z&&n[3]===t.w||(e.uniform4i(this.addr,t.x,t.y,t.z,t.w),n[0]=t.x,n[1]=t.y,n[2]=t.z,n[3]=t.w);else{if(Jf(n,t))return;e.uniform4iv(this.addr,t),Kf(n,t)}}function hm(e,t){const n=this.cache;n[0]!==t&&(e.uniform1ui(this.addr,t),n[0]=t)}function um(e,t){const n=this.cache;if(void 0!==t.x)n[0]===t.x&&n[1]===t.y||(e.uniform2ui(this.addr,t.x,t.y),n[0]=t.x,n[1]=t.y);else{if(Jf(n,t))return;e.uniform2uiv(this.addr,t),Kf(n,t)}}function dm(e,t){const n=this.cache;if(void 0!==t.x)n[0]===t.x&&n[1]===t.y&&n[2]===t.z||(e.uniform3ui(this.addr,t.x,t.y,t.z),n[0]=t.x,n[1]=t.y,n[2]=t.z);else{if(Jf(n,t))return;e.uniform3uiv(this.addr,t),Kf(n,t)}}function pm(e,t){const n=this.cache;if(void 0!==t.x)n[0]===t.x&&n[1]===t.y&&n[2]===t.z&&n[3]===t.w||(e.uniform4ui(this.addr,t.x,t.y,t.z,t.w),n[0]=t.x,n[1]=t.y,n[2]=t.z,n[3]=t.w);else{if(Jf(n,t))return;e.uniform4uiv(this.addr,t),Kf(n,t)}}function fm(e,t,n){const i=this.cache,r=n.allocateTextureUnit();let s;i[0]!==r&&(e.uniform1i(this.addr,r),i[0]=r),this.type===e.SAMPLER_2D_SHADOW?(Qf.compareFunction=Zi,s=Qf):s=Ff,n.setTexture2D(t||s,r)}function mm(e,t,n){const i=this.cache,r=n.allocateTextureUnit();i[0]!==r&&(e.uniform1i(this.addr,r),i[0]=r),n.setTexture3D(t||Gf,r)}function Am(e,t,n){const i=this.cache,r=n.allocateTextureUnit();i[0]!==r&&(e.uniform1i(this.addr,r),i[0]=r),n.setTextureCube(t||Hf,r)}function gm(e,t,n){const i=this.cache,r=n.allocateTextureUnit();i[0]!==r&&(e.uniform1i(this.addr,r),i[0]=r),n.setTexture2DArray(t||zf,r)}function vm(e,t){e.uniform1fv(this.addr,t)}function ym(e,t){const n=Yf(t,this.size,2);e.uniform2fv(this.addr,n)}function Em(e,t){const n=Yf(t,this.size,3);e.uniform3fv(this.addr,n)}function bm(e,t){const n=Yf(t,this.size,4);e.uniform4fv(this.addr,n)}function xm(e,t){const n=Yf(t,this.size,4);e.uniformMatrix2fv(this.addr,!1,n)}function Cm(e,t){const n=Yf(t,this.size,9);e.uniformMatrix3fv(this.addr,!1,n)}function wm(e,t){const n=Yf(t,this.size,16);e.uniformMatrix4fv(this.addr,!1,n)}function _m(e,t){e.uniform1iv(this.addr,t)}function Mm(e,t){e.uniform2iv(this.addr,t)}function Im(e,t){e.uniform3iv(this.addr,t)}function Sm(e,t){e.uniform4iv(this.addr,t)}function Tm(e,t){e.uniform1uiv(this.addr,t)}function Bm(e,t){e.uniform2uiv(this.addr,t)}function Rm(e,t){e.uniform3uiv(this.addr,t)}function Lm(e,t){e.uniform4uiv(this.addr,t)}function Dm(e,t,n){const i=this.cache,r=t.length,s=Zf(n,r);Jf(i,s)||(e.uniform1iv(this.addr,s),Kf(i,s));for(let e=0;e!==r;++e)n.setTexture2D(t[e]||Ff,s[e])}function Pm(e,t,n){const i=this.cache,r=t.length,s=Zf(n,r);Jf(i,s)||(e.uniform1iv(this.addr,s),Kf(i,s));for(let e=0;e!==r;++e)n.setTexture3D(t[e]||Gf,s[e])}function Um(e,t,n){const i=this.cache,r=t.length,s=Zf(n,r);Jf(i,s)||(e.uniform1iv(this.addr,s),Kf(i,s));for(let e=0;e!==r;++e)n.setTextureCube(t[e]||Hf,s[e])}function km(e,t,n){const i=this.cache,r=t.length,s=Zf(n,r);Jf(i,s)||(e.uniform1iv(this.addr,s),Kf(i,s));for(let e=0;e!==r;++e)n.setTexture2DArray(t[e]||zf,s[e])}class Nm{constructor(e,t,n){this.id=e,this.addr=n,this.cache=[],this.type=t.type,this.setValue=function(e){switch(e){case 5126:return $f;case 35664:return em;case 35665:return tm;case 35666:return nm;case 35674:return im;case 35675:return rm;case 35676:return sm;case 5124:case 35670:return om;case 35667:case 35671:return am;case 35668:case 35672:return lm;case 35669:case 35673:return cm;case 5125:return hm;case 36294:return um;case 36295:return dm;case 36296:return pm;case 35678:case 36198:case 36298:case 36306:case 35682:return fm;case 35679:case 36299:case 36307:return mm;case 35680:case 36300:case 36308:case 36293:return Am;case 36289:case 36303:case 36311:case 36292:return gm}}(t.type)}}class Om{constructor(e,t,n){this.id=e,this.addr=n,this.cache=[],this.type=t.type,this.size=t.size,this.setValue=function(e){switch(e){case 5126:return vm;case 35664:return ym;case 35665:return Em;case 35666:return bm;case 35674:return xm;case 35675:return Cm;case 35676:return wm;case 5124:case 35670:return _m;case 35667:case 35671:return Mm;case 35668:case 35672:return Im;case 35669:case 35673:return Sm;case 5125:return Tm;case 36294:return Bm;case 36295:return Rm;case 36296:return Lm;case 35678:case 36198:case 36298:case 36306:case 35682:return Dm;case 35679:case 36299:case 36307:return Pm;case 35680:case 36300:case 36308:case 36293:return Um;case 36289:case 36303:case 36311:case 36292:return km}}(t.type)}}class Fm{constructor(e){this.id=e,this.seq=[],this.map={}}setValue(e,t,n){const i=this.seq;for(let r=0,s=i.length;r!==s;++r){const s=i[r];s.setValue(e,t[s.id],n)}}}const Qm=/(\w+)(\])?(\[|\.)?/g;function zm(e,t){e.seq.push(t),e.map[t.id]=t}function Gm(e,t,n){const i=e.name,r=i.length;for(Qm.lastIndex=0;;){const s=Qm.exec(i),o=Qm.lastIndex;let a=s[1];const l="]"===s[2],c=s[3];if(l&&(a|=0),void 0===c||"["===c&&o+2===r){zm(n,void 0===c?new Nm(a,e,t):new Om(a,e,t));break}{let e=n.map[a];void 0===e&&(e=new Fm(a),zm(n,e)),n=e}}}class Hm{constructor(e,t){this.seq=[],this.map={};const n=e.getProgramParameter(t,e.ACTIVE_UNIFORMS);for(let i=0;i<n;++i){const n=e.getActiveUniform(t,i);Gm(n,e.getUniformLocation(t,n.name),this)}}setValue(e,t,n,i){const r=this.map[t];void 0!==r&&r.setValue(e,n,i)}setOptional(e,t,n){const i=t[n];void 0!==i&&this.setValue(e,n,i)}static upload(e,t,n,i){for(let r=0,s=t.length;r!==s;++r){const s=t[r],o=n[s.id];!1!==o.needsUpdate&&s.setValue(e,o.value,i)}}static seqWithValue(e,t){const n=[];for(let i=0,r=e.length;i!==r;++i){const r=e[i];r.id in t&&n.push(r)}return n}}function Vm(e,t,n){const i=e.createShader(t);return e.shaderSource(i,n),e.compileShader(i),i}let jm=0;const Wm=new Br;function qm(e,t,n){const i=e.getShaderParameter(t,e.COMPILE_STATUS),r=e.getShaderInfoLog(t).trim();if(i&&""===r)return"";const s=/ERROR: 0:(\d+)/.exec(r);if(s){const i=parseInt(s[1]);return n.toUpperCase()+"\n\n"+r+"\n\n"+function(e,t){const n=e.split("\n"),i=[],r=Math.max(t-6,0),s=Math.min(t+6,n.length);for(let e=r;e<s;e++){const r=e+1;i.push(`${r===t?">":" "} ${r}: ${n[e]}`)}return i.join("\n")}(e.getShaderSource(t),i)}return r}function Xm(e,t){const n=function(e){Gr._getMatrix(Wm,Gr.workingColorSpace,e);const t=`mat3( ${Wm.elements.map((e=>e.toFixed(4)))} )`;switch(Gr.getTransfer(e)){case Ri:return[t,"LinearTransferOETF"];case Li:return[t,"sRGBTransferOETF"];default:return console.warn("THREE.WebGLProgram: Unsupported color space: ",e),[t,"LinearTransferOETF"]}}(t);return[`vec4 ${e}( vec4 value ) {`,`\treturn ${n[1]}( vec4( value.rgb * ${n[0]}, value.a ) );`,"}"].join("\n")}function Ym(e,t){let n;switch(t){case Bt:n="Linear";break;case Rt:n="Reinhard";break;case Lt:n="Cineon";break;case Dt:n="ACESFilmic";break;case Ut:n="AgX";break;case kt:n="Neutral";break;case Pt:n="Custom";break;default:console.warn("THREE.WebGLProgram: Unsupported toneMapping:",t),n="Linear"}return"vec3 "+e+"( vec3 color ) { return "+n+"ToneMapping( color ); }"}const Jm=new os;function Km(e){return""!==e}function Zm(e,t){const n=t.numSpotLightShadows+t.numSpotLightMaps-t.numSpotLightShadowsWithMaps;return e.replace(/NUM_DIR_LIGHTS/g,t.numDirLights).replace(/NUM_SPOT_LIGHTS/g,t.numSpotLights).replace(/NUM_SPOT_LIGHT_MAPS/g,t.numSpotLightMaps).replace(/NUM_SPOT_LIGHT_COORDS/g,n).replace(/NUM_RECT_AREA_LIGHTS/g,t.numRectAreaLights).replace(/NUM_POINT_LIGHTS/g,t.numPointLights).replace(/NUM_HEMI_LIGHTS/g,t.numHemiLights).replace(/NUM_DIR_LIGHT_SHADOWS/g,t.numDirLightShadows).replace(/NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS/g,t.numSpotLightShadowsWithMaps).replace(/NUM_SPOT_LIGHT_SHADOWS/g,t.numSpotLightShadows).replace(/NUM_POINT_LIGHT_SHADOWS/g,t.numPointLightShadows)}function $m(e,t){return e.replace(/NUM_CLIPPING_PLANES/g,t.numClippingPlanes).replace(/UNION_CLIPPING_PLANES/g,t.numClippingPlanes-t.numClipIntersection)}const eA=/^[ \t]*#include +<([\w\d./]+)>/gm;function tA(e){return e.replace(eA,iA)}const nA=new Map;function iA(e,t){let n=rf[t];if(void 0===n){const e=nA.get(t);if(void 0===e)throw new Error("Can not resolve #include <"+t+">");n=rf[e],console.warn('THREE.WebGLRenderer: Shader chunk "%s" has been deprecated. Use "%s" instead.',t,e)}return tA(n)}const rA=/#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;function sA(e){return e.replace(rA,oA)}function oA(e,t,n,i){let r="";for(let e=parseInt(t);e<parseInt(n);e++)r+=i.replace(/\[\s*i\s*\]/g,"[ "+e+" ]").replace(/UNROLLED_LOOP_INDEX/g,e);return r}function aA(e){let t=`precision ${e.precision} float;\n\tprecision ${e.precision} int;\n\tprecision ${e.precision} sampler2D;\n\tprecision ${e.precision} samplerCube;\n\tprecision ${e.precision} sampler3D;\n\tprecision ${e.precision} sampler2DArray;\n\tprecision ${e.precision} sampler2DShadow;\n\tprecision ${e.precision} samplerCubeShadow;\n\tprecision ${e.precision} sampler2DArrayShadow;\n\tprecision ${e.precision} isampler2D;\n\tprecision ${e.precision} isampler3D;\n\tprecision ${e.precision} isamplerCube;\n\tprecision ${e.precision} isampler2DArray;\n\tprecision ${e.precision} usampler2D;\n\tprecision ${e.precision} usampler3D;\n\tprecision ${e.precision} usamplerCube;\n\tprecision ${e.precision} usampler2DArray;\n\t`;return"highp"===e.precision?t+="\n#define HIGH_PRECISION":"mediump"===e.precision?t+="\n#define MEDIUM_PRECISION":"lowp"===e.precision&&(t+="\n#define LOW_PRECISION"),t}function lA(e,t,n,i){const r=e.getContext(),s=n.defines;let o=n.vertexShader,a=n.fragmentShader;const l=function(e){let t="SHADOWMAP_TYPE_BASIC";return e.shadowMapType===Qe?t="SHADOWMAP_TYPE_PCF":e.shadowMapType===ze?t="SHADOWMAP_TYPE_PCF_SOFT":e.shadowMapType===Ge&&(t="SHADOWMAP_TYPE_VSM"),t}(n),c=function(e){let t="ENVMAP_TYPE_CUBE";if(e.envMap)switch(e.envMapMode){case Qt:case zt:t="ENVMAP_TYPE_CUBE";break;case Vt:t="ENVMAP_TYPE_CUBE_UV"}return t}(n),h=function(e){let t="ENVMAP_MODE_REFLECTION";return e.envMap&&e.envMapMode===zt&&(t="ENVMAP_MODE_REFRACTION"),t}(n),u=function(e){let t="ENVMAP_BLENDING_NONE";if(e.envMap)switch(e.combine){case Mt:t="ENVMAP_BLENDING_MULTIPLY";break;case It:t="ENVMAP_BLENDING_MIX";break;case St:t="ENVMAP_BLENDING_ADD"}return t}(n),d=function(e){const t=e.envMapCubeUVHeight;if(null===t)return null;const n=Math.log2(t)-2,i=1/t;return{texelWidth:1/(3*Math.max(Math.pow(2,n),112)),texelHeight:i,maxMip:n}}(n),p=function(e){return[e.extensionClipCullDistance?"#extension GL_ANGLE_clip_cull_distance : require":"",e.extensionMultiDraw?"#extension GL_ANGLE_multi_draw : require":""].filter(Km).join("\n")}(n),f=function(e){const t=[];for(const n in e){const i=e[n];!1!==i&&t.push("#define "+n+" "+i)}return t.join("\n")}(s),m=r.createProgram();let A,g,v=n.glslVersion?"#version "+n.glslVersion+"\n":"";const y=n.numMultiviewViews;n.isRawShaderMaterial?(A=["#define SHADER_TYPE "+n.shaderType,"#define SHADER_NAME "+n.shaderName,f].filter(Km).join("\n"),A.length>0&&(A+="\n"),g=["#define SHADER_TYPE "+n.shaderType,"#define SHADER_NAME "+n.shaderName,f].filter(Km).join("\n"),g.length>0&&(g+="\n")):(A=[aA(n),"#define SHADER_TYPE "+n.shaderType,"#define SHADER_NAME "+n.shaderName,f,n.extensionClipCullDistance?"#define USE_CLIP_DISTANCE":"",n.batching?"#define USE_BATCHING":"",n.batchingColor?"#define USE_BATCHING_COLOR":"",n.instancing?"#define USE_INSTANCING":"",n.instancingColor?"#define USE_INSTANCING_COLOR":"",n.instancingMorph?"#define USE_INSTANCING_MORPH":"",n.useFog&&n.fog?"#define USE_FOG":"",n.useFog&&n.fogExp2?"#define FOG_EXP2":"",n.map?"#define USE_MAP":"",n.envMap?"#define USE_ENVMAP":"",n.envMap?"#define "+h:"",n.lightMap?"#define USE_LIGHTMAP":"",n.aoMap?"#define USE_AOMAP":"",n.bumpMap?"#define USE_BUMPMAP":"",n.normalMap?"#define USE_NORMALMAP":"",n.normalMapObjectSpace?"#define USE_NORMALMAP_OBJECTSPACE":"",n.normalMapTangentSpace?"#define USE_NORMALMAP_TANGENTSPACE":"",n.displacementMap?"#define USE_DISPLACEMENTMAP":"",n.emissiveMap?"#define USE_EMISSIVEMAP":"",n.anisotropy?"#define USE_ANISOTROPY":"",n.anisotropyMap?"#define USE_ANISOTROPYMAP":"",n.clearcoatMap?"#define USE_CLEARCOATMAP":"",n.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",n.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",n.iridescenceMap?"#define USE_IRIDESCENCEMAP":"",n.iridescenceThicknessMap?"#define USE_IRIDESCENCE_THICKNESSMAP":"",n.specularMap?"#define USE_SPECULARMAP":"",n.specularColorMap?"#define USE_SPECULAR_COLORMAP":"",n.specularIntensityMap?"#define USE_SPECULAR_INTENSITYMAP":"",n.roughnessMap?"#define USE_ROUGHNESSMAP":"",n.metalnessMap?"#define USE_METALNESSMAP":"",n.alphaMap?"#define USE_ALPHAMAP":"",n.alphaHash?"#define USE_ALPHAHASH":"",n.transmission?"#define USE_TRANSMISSION":"",n.transmissionMap?"#define USE_TRANSMISSIONMAP":"",n.thicknessMap?"#define USE_THICKNESSMAP":"",n.sheenColorMap?"#define USE_SHEEN_COLORMAP":"",n.sheenRoughnessMap?"#define USE_SHEEN_ROUGHNESSMAP":"",n.mapUv?"#define MAP_UV "+n.mapUv:"",n.alphaMapUv?"#define ALPHAMAP_UV "+n.alphaMapUv:"",n.lightMapUv?"#define LIGHTMAP_UV "+n.lightMapUv:"",n.aoMapUv?"#define AOMAP_UV "+n.aoMapUv:"",n.emissiveMapUv?"#define EMISSIVEMAP_UV "+n.emissiveMapUv:"",n.bumpMapUv?"#define BUMPMAP_UV "+n.bumpMapUv:"",n.normalMapUv?"#define NORMALMAP_UV "+n.normalMapUv:"",n.displacementMapUv?"#define DISPLACEMENTMAP_UV "+n.displacementMapUv:"",n.metalnessMapUv?"#define METALNESSMAP_UV "+n.metalnessMapUv:"",n.roughnessMapUv?"#define ROUGHNESSMAP_UV "+n.roughnessMapUv:"",n.anisotropyMapUv?"#define ANISOTROPYMAP_UV "+n.anisotropyMapUv:"",n.clearcoatMapUv?"#define CLEARCOATMAP_UV "+n.clearcoatMapUv:"",n.clearcoatNormalMapUv?"#define CLEARCOAT_NORMALMAP_UV "+n.clearcoatNormalMapUv:"",n.clearcoatRoughnessMapUv?"#define CLEARCOAT_ROUGHNESSMAP_UV "+n.clearcoatRoughnessMapUv:"",n.iridescenceMapUv?"#define IRIDESCENCEMAP_UV "+n.iridescenceMapUv:"",n.iridescenceThicknessMapUv?"#define IRIDESCENCE_THICKNESSMAP_UV "+n.iridescenceThicknessMapUv:"",n.sheenColorMapUv?"#define SHEEN_COLORMAP_UV "+n.sheenColorMapUv:"",n.sheenRoughnessMapUv?"#define SHEEN_ROUGHNESSMAP_UV "+n.sheenRoughnessMapUv:"",n.specularMapUv?"#define SPECULARMAP_UV "+n.specularMapUv:"",n.specularColorMapUv?"#define SPECULAR_COLORMAP_UV "+n.specularColorMapUv:"",n.specularIntensityMapUv?"#define SPECULAR_INTENSITYMAP_UV "+n.specularIntensityMapUv:"",n.transmissionMapUv?"#define TRANSMISSIONMAP_UV "+n.transmissionMapUv:"",n.thicknessMapUv?"#define THICKNESSMAP_UV "+n.thicknessMapUv:"",n.vertexTangents&&!1===n.flatShading?"#define USE_TANGENT":"",n.vertexColors?"#define USE_COLOR":"",n.vertexAlphas?"#define USE_COLOR_ALPHA":"",n.vertexUv1s?"#define USE_UV1":"",n.vertexUv2s?"#define USE_UV2":"",n.vertexUv3s?"#define USE_UV3":"",n.pointsUvs?"#define USE_POINTS_UV":"",n.flatShading?"#define FLAT_SHADED":"",n.skinning?"#define USE_SKINNING":"",n.morphTargets?"#define USE_MORPHTARGETS":"",n.morphNormals&&!1===n.flatShading?"#define USE_MORPHNORMALS":"",n.morphColors?"#define USE_MORPHCOLORS":"",n.morphTargetsCount>0?"#define MORPHTARGETS_TEXTURE_STRIDE "+n.morphTextureStride:"",n.morphTargetsCount>0?"#define MORPHTARGETS_COUNT "+n.morphTargetsCount:"",n.doubleSided?"#define DOUBLE_SIDED":"",n.flipSided?"#define FLIP_SIDED":"",n.shadowMapEnabled?"#define USE_SHADOWMAP":"",n.shadowMapEnabled?"#define "+l:"",n.sizeAttenuation?"#define USE_SIZEATTENUATION":"",n.numLightProbes>0?"#define USE_LIGHT_PROBES":"",n.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",n.reverseDepthBuffer?"#define USE_REVERSEDEPTHBUF":"","uniform mat4 modelMatrix;","uniform mat4 modelViewMatrix;","uniform mat4 projectionMatrix;","uniform mat4 viewMatrix;","uniform mat3 normalMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;","#ifdef USE_INSTANCING","\tattribute mat4 instanceMatrix;","#endif","#ifdef USE_INSTANCING_COLOR","\tattribute vec3 instanceColor;","#endif","#ifdef USE_INSTANCING_MORPH","\tuniform sampler2D morphTexture;","#endif","attribute vec3 position;","attribute vec3 normal;","attribute vec2 uv;","#ifdef USE_UV1","\tattribute vec2 uv1;","#endif","#ifdef USE_UV2","\tattribute vec2 uv2;","#endif","#ifdef USE_UV3","\tattribute vec2 uv3;","#endif","#ifdef USE_TANGENT","\tattribute vec4 tangent;","#endif","#if defined( USE_COLOR_ALPHA )","\tattribute vec4 color;","#elif defined( USE_COLOR )","\tattribute vec3 color;","#endif","#ifdef USE_SKINNING","\tattribute vec4 skinIndex;","\tattribute vec4 skinWeight;","#endif","\n"].filter(Km).join("\n"),g=[aA(n),"#define SHADER_TYPE "+n.shaderType,"#define SHADER_NAME "+n.shaderName,f,n.useFog&&n.fog?"#define USE_FOG":"",n.useFog&&n.fogExp2?"#define FOG_EXP2":"",n.alphaToCoverage?"#define ALPHA_TO_COVERAGE":"",n.map?"#define USE_MAP":"",n.matcap?"#define USE_MATCAP":"",n.envMap?"#define USE_ENVMAP":"",n.envMap?"#define "+c:"",n.envMap?"#define "+h:"",n.envMap?"#define "+u:"",d?"#define CUBEUV_TEXEL_WIDTH "+d.texelWidth:"",d?"#define CUBEUV_TEXEL_HEIGHT "+d.texelHeight:"",d?"#define CUBEUV_MAX_MIP "+d.maxMip+".0":"",n.lightMap?"#define USE_LIGHTMAP":"",n.aoMap?"#define USE_AOMAP":"",n.bumpMap?"#define USE_BUMPMAP":"",n.normalMap?"#define USE_NORMALMAP":"",n.normalMapObjectSpace?"#define USE_NORMALMAP_OBJECTSPACE":"",n.normalMapTangentSpace?"#define USE_NORMALMAP_TANGENTSPACE":"",n.emissiveMap?"#define USE_EMISSIVEMAP":"",n.anisotropy?"#define USE_ANISOTROPY":"",n.anisotropyMap?"#define USE_ANISOTROPYMAP":"",n.clearcoat?"#define USE_CLEARCOAT":"",n.clearcoatMap?"#define USE_CLEARCOATMAP":"",n.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",n.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",n.dispersion?"#define USE_DISPERSION":"",n.iridescence?"#define USE_IRIDESCENCE":"",n.iridescenceMap?"#define USE_IRIDESCENCEMAP":"",n.iridescenceThicknessMap?"#define USE_IRIDESCENCE_THICKNESSMAP":"",n.specularMap?"#define USE_SPECULARMAP":"",n.specularColorMap?"#define USE_SPECULAR_COLORMAP":"",n.specularIntensityMap?"#define USE_SPECULAR_INTENSITYMAP":"",n.roughnessMap?"#define USE_ROUGHNESSMAP":"",n.metalnessMap?"#define USE_METALNESSMAP":"",n.alphaMap?"#define USE_ALPHAMAP":"",n.alphaTest?"#define USE_ALPHATEST":"",n.alphaHash?"#define USE_ALPHAHASH":"",n.sheen?"#define USE_SHEEN":"",n.sheenColorMap?"#define USE_SHEEN_COLORMAP":"",n.sheenRoughnessMap?"#define USE_SHEEN_ROUGHNESSMAP":"",n.transmission?"#define USE_TRANSMISSION":"",n.transmissionMap?"#define USE_TRANSMISSIONMAP":"",n.thicknessMap?"#define USE_THICKNESSMAP":"",n.vertexTangents&&!1===n.flatShading?"#define USE_TANGENT":"",n.vertexColors||n.instancingColor||n.batchingColor?"#define USE_COLOR":"",n.vertexAlphas?"#define USE_COLOR_ALPHA":"",n.vertexUv1s?"#define USE_UV1":"",n.vertexUv2s?"#define USE_UV2":"",n.vertexUv3s?"#define USE_UV3":"",n.pointsUvs?"#define USE_POINTS_UV":"",n.gradientMap?"#define USE_GRADIENTMAP":"",n.flatShading?"#define FLAT_SHADED":"",n.doubleSided?"#define DOUBLE_SIDED":"",n.flipSided?"#define FLIP_SIDED":"",n.shadowMapEnabled?"#define USE_SHADOWMAP":"",n.shadowMapEnabled?"#define "+l:"",n.premultipliedAlpha?"#define PREMULTIPLIED_ALPHA":"",n.numLightProbes>0?"#define USE_LIGHT_PROBES":"",n.decodeVideoTexture?"#define DECODE_VIDEO_TEXTURE":"",n.decodeVideoTextureEmissive?"#define DECODE_VIDEO_TEXTURE_EMISSIVE":"",n.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",n.reverseDepthBuffer?"#define USE_REVERSEDEPTHBUF":"","uniform mat4 viewMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;",n.toneMapping!==Tt?"#define TONE_MAPPING":"",n.toneMapping!==Tt?rf.tonemapping_pars_fragment:"",n.toneMapping!==Tt?Ym("toneMapping",n.toneMapping):"",n.dithering?"#define DITHERING":"",n.opaque?"#define OPAQUE":"",rf.colorspace_pars_fragment,Xm("linearToOutputTexel",n.outputColorSpace),(Gr.getLuminanceCoefficients(Jm),["float luminance( const in vec3 rgb ) {",`\tconst vec3 weights = vec3( ${Jm.x.toFixed(4)}, ${Jm.y.toFixed(4)}, ${Jm.z.toFixed(4)} );`,"\treturn dot( weights, rgb );","}"].join("\n")),n.useDepthPacking?"#define DEPTH_PACKING "+n.depthPacking:"","\n"].filter(Km).join("\n")),o=tA(o),o=Zm(o,n),o=$m(o,n),a=tA(a),a=Zm(a,n),a=$m(a,n),o=sA(o),a=sA(a),!0!==n.isRawShaderMaterial&&(v="#version 300 es\n",A=[p,"#define attribute in","#define varying out","#define texture2D texture"].join("\n")+"\n"+A,g=["#define varying in",n.glslVersion===pr?"":"layout(location = 0) out highp vec4 pc_fragColor;",n.glslVersion===pr?"":"#define gl_FragColor pc_fragColor","#define gl_FragDepthEXT gl_FragDepth","#define texture2D texture","#define textureCube texture","#define texture2DProj textureProj","#define texture2DLodEXT textureLod","#define texture2DProjLodEXT textureProjLod","#define textureCubeLodEXT textureLod","#define texture2DGradEXT textureGrad","#define texture2DProjGradEXT textureProjGrad","#define textureCubeGradEXT textureGrad"].join("\n")+"\n"+g,y>0&&(A=["#extension GL_OVR_multiview : require","layout(num_views = "+y+") in;","#define VIEW_ID gl_ViewID_OVR"].join("\n")+"\n"+A,A=A.replace(["uniform mat4 modelViewMatrix;","uniform mat4 projectionMatrix;","uniform mat4 viewMatrix;","uniform mat3 normalMatrix;"].join("\n"),["uniform mat4 modelViewMatrices["+y+"];","uniform mat4 projectionMatrices["+y+"];","uniform mat4 viewMatrices["+y+"];","uniform mat3 normalMatrices["+y+"];","#define modelViewMatrix modelViewMatrices[VIEW_ID]","#define projectionMatrix projectionMatrices[VIEW_ID]","#define viewMatrix viewMatrices[VIEW_ID]","#define normalMatrix normalMatrices[VIEW_ID]"].join("\n")),g=["#extension GL_OVR_multiview : require","#define VIEW_ID gl_ViewID_OVR"].join("\n")+"\n"+g,g=g.replace("uniform mat4 viewMatrix;",["uniform mat4 viewMatrices["+y+"];","#define viewMatrix viewMatrices[VIEW_ID]"].join("\n"))));const E=v+A+o,b=v+g+a,x=Vm(r,r.VERTEX_SHADER,E),C=Vm(r,r.FRAGMENT_SHADER,b);function w(t){if(e.debug.checkShaderErrors){const n=r.getProgramInfoLog(m).trim(),i=r.getShaderInfoLog(x).trim(),s=r.getShaderInfoLog(C).trim();let o=!0,a=!0;if(!1===r.getProgramParameter(m,r.LINK_STATUS))if(o=!1,"function"==typeof e.debug.onShaderError)e.debug.onShaderError(r,m,x,C);else{const e=qm(r,x,"vertex"),i=qm(r,C,"fragment");console.error("THREE.WebGLProgram: Shader Error "+r.getError()+" - VALIDATE_STATUS "+r.getProgramParameter(m,r.VALIDATE_STATUS)+"\n\nMaterial Name: "+t.name+"\nMaterial Type: "+t.type+"\n\nProgram Info Log: "+n+"\n"+e+"\n"+i)}else""!==n?console.warn("THREE.WebGLProgram: Program Info Log:",n):""!==i&&""!==s||(a=!1);a&&(t.diagnostics={runnable:o,programLog:n,vertexShader:{log:i,prefix:A},fragmentShader:{log:s,prefix:g}})}r.deleteShader(x),r.deleteShader(C),_=new Hm(r,m),M=function(e,t){const n={},i=e.getProgramParameter(t,e.ACTIVE_ATTRIBUTES);for(let r=0;r<i;r++){const i=e.getActiveAttrib(t,r),s=i.name;let o=1;i.type===e.FLOAT_MAT2&&(o=2),i.type===e.FLOAT_MAT3&&(o=3),i.type===e.FLOAT_MAT4&&(o=4),n[s]={type:i.type,location:e.getAttribLocation(t,s),locationSize:o}}return n}(r,m)}let _,M;r.attachShader(m,x),r.attachShader(m,C),void 0!==n.index0AttributeName?r.bindAttribLocation(m,0,n.index0AttributeName):!0===n.morphTargets&&r.bindAttribLocation(m,0,"position"),r.linkProgram(m),this.getUniforms=function(){return void 0===_&&w(this),_},this.getAttributes=function(){return void 0===M&&w(this),M};let I=!1===n.rendererExtensionParallelShaderCompile;return this.isReady=function(){return!1===I&&(I=r.getProgramParameter(m,37297)),I},this.destroy=function(){i.releaseStatesOfProgram(this),r.deleteProgram(m),this.program=void 0},this.type=n.shaderType,this.name=n.shaderName,this.id=jm++,this.cacheKey=t,this.usedTimes=1,this.program=m,this.vertexShader=x,this.fragmentShader=C,this.numMultiviewViews=y,this}let cA=0;class hA{constructor(){this.shaderCache=new Map,this.materialCache=new Map}update(e){const t=e.vertexShader,n=e.fragmentShader,i=this._getShaderStage(t),r=this._getShaderStage(n),s=this._getShaderCacheForMaterial(e);return!1===s.has(i)&&(s.add(i),i.usedTimes++),!1===s.has(r)&&(s.add(r),r.usedTimes++),this}remove(e){const t=this.materialCache.get(e);for(const e of t)e.usedTimes--,0===e.usedTimes&&this.shaderCache.delete(e.code);return this.materialCache.delete(e),this}getVertexShaderID(e){return this._getShaderStage(e.vertexShader).id}getFragmentShaderID(e){return this._getShaderStage(e.fragmentShader).id}dispose(){this.shaderCache.clear(),this.materialCache.clear()}_getShaderCacheForMaterial(e){const t=this.materialCache;let n=t.get(e);return void 0===n&&(n=new Set,t.set(e,n)),n}_getShaderStage(e){const t=this.shaderCache;let n=t.get(e);return void 0===n&&(n=new uA(e),t.set(e,n)),n}}class uA{constructor(e){this.id=cA++,this.code=e,this.usedTimes=0}}function dA(e,t,n,i,r,s,o){const a=new qs,l=new hA,c=new Set,h=[],u=r.logarithmicDepthBuffer,d=r.vertexTextures;let p=r.precision;const f={MeshDepthMaterial:"depth",MeshDistanceMaterial:"distanceRGBA",MeshNormalMaterial:"normal",MeshBasicMaterial:"basic",MeshLambertMaterial:"lambert",MeshPhongMaterial:"phong",MeshToonMaterial:"toon",MeshStandardMaterial:"physical",MeshPhysicalMaterial:"physical",MeshMatcapMaterial:"matcap",LineBasicMaterial:"basic",LineDashedMaterial:"dashed",PointsMaterial:"points",ShadowMaterial:"shadow",SpriteMaterial:"sprite"};function m(e){return c.add(e),0===e?"uv":`uv${e}`}return{getParameters:function(s,a,h,A,g){const v=A.fog,y=g.geometry,E=s.isMeshStandardMaterial?A.environment:null,b=(s.isMeshStandardMaterial?n:t).get(s.envMap||E),x=b&&b.mapping===Vt?b.image.height:null,C=f[s.type];null!==s.precision&&(p=r.getMaxPrecision(s.precision),p!==s.precision&&console.warn("THREE.WebGLProgram.getParameters:",s.precision,"not supported, using",p,"instead."));const w=y.morphAttributes.position||y.morphAttributes.normal||y.morphAttributes.color,_=void 0!==w?w.length:0;let M,I,S,T,B=0;if(void 0!==y.morphAttributes.position&&(B=1),void 0!==y.morphAttributes.normal&&(B=2),void 0!==y.morphAttributes.color&&(B=3),C){const e=of[C];M=e.vertexShader,I=e.fragmentShader}else M=s.vertexShader,I=s.fragmentShader,l.update(s),S=l.getVertexShaderID(s),T=l.getFragmentShaderID(s);const R=e.getRenderTarget(),L=e.state.buffers.depth.getReversed(),D=R&&R.isWebGLMultiviewRenderTarget?R.numViews:0,P=!0===g.isInstancedMesh,U=!0===g.isBatchedMesh,k=!!s.map,N=!!s.matcap,O=!!b,F=!!s.aoMap,Q=!!s.lightMap,z=!!s.bumpMap,G=!!s.normalMap,H=!!s.displacementMap,V=!!s.emissiveMap,j=!!s.metalnessMap,W=!!s.roughnessMap,q=s.anisotropy>0,X=s.clearcoat>0,Y=s.dispersion>0,J=s.iridescence>0,K=s.sheen>0,Z=s.transmission>0,$=q&&!!s.anisotropyMap,ee=X&&!!s.clearcoatMap,te=X&&!!s.clearcoatNormalMap,ne=X&&!!s.clearcoatRoughnessMap,ie=J&&!!s.iridescenceMap,re=J&&!!s.iridescenceThicknessMap,se=K&&!!s.sheenColorMap,oe=K&&!!s.sheenRoughnessMap,ae=!!s.specularMap,le=!!s.specularColorMap,ce=!!s.specularIntensityMap,he=Z&&!!s.transmissionMap,ue=Z&&!!s.thicknessMap,de=!!s.gradientMap,pe=!!s.alphaMap,fe=s.alphaTest>0,me=!!s.alphaHash,Ae=!!s.extensions;let ge=Tt;s.toneMapped&&(null!==R&&!0!==R.isXRRenderTarget||(ge=e.toneMapping));const ve={shaderID:C,shaderType:s.type,shaderName:s.name,vertexShader:M,fragmentShader:I,defines:s.defines,customVertexShaderID:S,customFragmentShaderID:T,isRawShaderMaterial:!0===s.isRawShaderMaterial,glslVersion:s.glslVersion,precision:p,batching:U,batchingColor:U&&null!==g._colorsTexture,instancing:P,instancingColor:P&&null!==g.instanceColor,instancingMorph:P&&null!==g.morphTexture,supportsVertexTextures:d,numMultiviewViews:D,outputColorSpace:null===R?e.outputColorSpace:!0===R.isXRRenderTarget?R.texture.colorSpace:Bi,alphaToCoverage:!!s.alphaToCoverage,map:k,matcap:N,envMap:O,envMapMode:O&&b.mapping,envMapCubeUVHeight:x,aoMap:F,lightMap:Q,bumpMap:z,normalMap:G,displacementMap:d&&H,emissiveMap:V,normalMapObjectSpace:G&&s.normalMapType===Ii,normalMapTangentSpace:G&&s.normalMapType===Mi,metalnessMap:j,roughnessMap:W,anisotropy:q,anisotropyMap:$,clearcoat:X,clearcoatMap:ee,clearcoatNormalMap:te,clearcoatRoughnessMap:ne,dispersion:Y,iridescence:J,iridescenceMap:ie,iridescenceThicknessMap:re,sheen:K,sheenColorMap:se,sheenRoughnessMap:oe,specularMap:ae,specularColorMap:le,specularIntensityMap:ce,transmission:Z,transmissionMap:he,thicknessMap:ue,gradientMap:de,opaque:!1===s.transparent&&s.blending===qe&&!1===s.alphaToCoverage,alphaMap:pe,alphaTest:fe,alphaHash:me,combine:s.combine,mapUv:k&&m(s.map.channel),aoMapUv:F&&m(s.aoMap.channel),lightMapUv:Q&&m(s.lightMap.channel),bumpMapUv:z&&m(s.bumpMap.channel),normalMapUv:G&&m(s.normalMap.channel),displacementMapUv:H&&m(s.displacementMap.channel),emissiveMapUv:V&&m(s.emissiveMap.channel),metalnessMapUv:j&&m(s.metalnessMap.channel),roughnessMapUv:W&&m(s.roughnessMap.channel),anisotropyMapUv:$&&m(s.anisotropyMap.channel),clearcoatMapUv:ee&&m(s.clearcoatMap.channel),clearcoatNormalMapUv:te&&m(s.clearcoatNormalMap.channel),clearcoatRoughnessMapUv:ne&&m(s.clearcoatRoughnessMap.channel),iridescenceMapUv:ie&&m(s.iridescenceMap.channel),iridescenceThicknessMapUv:re&&m(s.iridescenceThicknessMap.channel),sheenColorMapUv:se&&m(s.sheenColorMap.channel),sheenRoughnessMapUv:oe&&m(s.sheenRoughnessMap.channel),specularMapUv:ae&&m(s.specularMap.channel),specularColorMapUv:le&&m(s.specularColorMap.channel),specularIntensityMapUv:ce&&m(s.specularIntensityMap.channel),transmissionMapUv:he&&m(s.transmissionMap.channel),thicknessMapUv:ue&&m(s.thicknessMap.channel),alphaMapUv:pe&&m(s.alphaMap.channel),vertexTangents:!!y.attributes.tangent&&(G||q),vertexColors:s.vertexColors,vertexAlphas:!0===s.vertexColors&&!!y.attributes.color&&4===y.attributes.color.itemSize,pointsUvs:!0===g.isPoints&&!!y.attributes.uv&&(k||pe),fog:!!v,useFog:!0===s.fog,fogExp2:!!v&&v.isFogExp2,flatShading:!0===s.flatShading,sizeAttenuation:!0===s.sizeAttenuation,logarithmicDepthBuffer:u,reverseDepthBuffer:L,skinning:!0===g.isSkinnedMesh,morphTargets:void 0!==y.morphAttributes.position,morphNormals:void 0!==y.morphAttributes.normal,morphColors:void 0!==y.morphAttributes.color,morphTargetsCount:_,morphTextureStride:B,numDirLights:a.directional.length,numPointLights:a.point.length,numSpotLights:a.spot.length,numSpotLightMaps:a.spotLightMap.length,numRectAreaLights:a.rectArea.length,numHemiLights:a.hemi.length,numDirLightShadows:a.directionalShadowMap.length,numPointLightShadows:a.pointShadowMap.length,numSpotLightShadows:a.spotShadowMap.length,numSpotLightShadowsWithMaps:a.numSpotLightShadowsWithMaps,numLightProbes:a.numLightProbes,numClippingPlanes:o.numPlanes,numClipIntersection:o.numIntersection,dithering:s.dithering,shadowMapEnabled:e.shadowMap.enabled&&h.length>0,shadowMapType:e.shadowMap.type,toneMapping:ge,decodeVideoTexture:k&&!0===s.map.isVideoTexture&&Gr.getTransfer(s.map.colorSpace)===Li,decodeVideoTextureEmissive:V&&!0===s.emissiveMap.isVideoTexture&&Gr.getTransfer(s.emissiveMap.colorSpace)===Li,premultipliedAlpha:s.premultipliedAlpha,doubleSided:s.side===je,flipSided:s.side===Ve,useDepthPacking:s.depthPacking>=0,depthPacking:s.depthPacking||0,index0AttributeName:s.index0AttributeName,extensionClipCullDistance:Ae&&!0===s.extensions.clipCullDistance&&i.has("WEBGL_clip_cull_distance"),extensionMultiDraw:(Ae&&!0===s.extensions.multiDraw||U)&&i.has("WEBGL_multi_draw"),rendererExtensionParallelShaderCompile:i.has("KHR_parallel_shader_compile"),customProgramCacheKey:s.customProgramCacheKey()};return ve.vertexUv1s=c.has(1),ve.vertexUv2s=c.has(2),ve.vertexUv3s=c.has(3),c.clear(),ve},getProgramCacheKey:function(t){const n=[];if(t.shaderID?n.push(t.shaderID):(n.push(t.customVertexShaderID),n.push(t.customFragmentShaderID)),void 0!==t.defines)for(const e in t.defines)n.push(e),n.push(t.defines[e]);return!1===t.isRawShaderMaterial&&(function(e,t){e.push(t.precision),e.push(t.outputColorSpace),e.push(t.envMapMode),e.push(t.envMapCubeUVHeight),e.push(t.mapUv),e.push(t.alphaMapUv),e.push(t.lightMapUv),e.push(t.aoMapUv),e.push(t.bumpMapUv),e.push(t.normalMapUv),e.push(t.displacementMapUv),e.push(t.emissiveMapUv),e.push(t.metalnessMapUv),e.push(t.roughnessMapUv),e.push(t.anisotropyMapUv),e.push(t.clearcoatMapUv),e.push(t.clearcoatNormalMapUv),e.push(t.clearcoatRoughnessMapUv),e.push(t.iridescenceMapUv),e.push(t.iridescenceThicknessMapUv),e.push(t.sheenColorMapUv),e.push(t.sheenRoughnessMapUv),e.push(t.specularMapUv),e.push(t.specularColorMapUv),e.push(t.specularIntensityMapUv),e.push(t.transmissionMapUv),e.push(t.thicknessMapUv),e.push(t.combine),e.push(t.fogExp2),e.push(t.sizeAttenuation),e.push(t.morphTargetsCount),e.push(t.morphAttributeCount),e.push(t.numDirLights),e.push(t.numPointLights),e.push(t.numSpotLights),e.push(t.numSpotLightMaps),e.push(t.numHemiLights),e.push(t.numRectAreaLights),e.push(t.numDirLightShadows),e.push(t.numPointLightShadows),e.push(t.numSpotLightShadows),e.push(t.numSpotLightShadowsWithMaps),e.push(t.numLightProbes),e.push(t.shadowMapType),e.push(t.toneMapping),e.push(t.numClippingPlanes),e.push(t.numClipIntersection),e.push(t.depthPacking)}(n,t),function(e,t){a.disableAll(),t.supportsVertexTextures&&a.enable(0),t.instancing&&a.enable(1),t.instancingColor&&a.enable(2),t.instancingMorph&&a.enable(3),t.matcap&&a.enable(4),t.envMap&&a.enable(5),t.normalMapObjectSpace&&a.enable(6),t.normalMapTangentSpace&&a.enable(7),t.clearcoat&&a.enable(8),t.iridescence&&a.enable(9),t.alphaTest&&a.enable(10),t.vertexColors&&a.enable(11),t.vertexAlphas&&a.enable(12),t.vertexUv1s&&a.enable(13),t.vertexUv2s&&a.enable(14),t.vertexUv3s&&a.enable(15),t.vertexTangents&&a.enable(16),t.anisotropy&&a.enable(17),t.alphaHash&&a.enable(18),t.batching&&a.enable(19),t.dispersion&&a.enable(20),t.batchingColor&&a.enable(21),e.push(a.mask),a.disableAll(),t.fog&&a.enable(0),t.useFog&&a.enable(1),t.flatShading&&a.enable(2),t.logarithmicDepthBuffer&&a.enable(3),t.reverseDepthBuffer&&a.enable(4),t.skinning&&a.enable(5),t.morphTargets&&a.enable(6),t.morphNormals&&a.enable(7),t.morphColors&&a.enable(8),t.premultipliedAlpha&&a.enable(9),t.shadowMapEnabled&&a.enable(10),t.doubleSided&&a.enable(11),t.flipSided&&a.enable(12),t.useDepthPacking&&a.enable(13),t.dithering&&a.enable(14),t.transmission&&a.enable(15),t.sheen&&a.enable(16),t.opaque&&a.enable(17),t.pointsUvs&&a.enable(18),t.decodeVideoTexture&&a.enable(19),t.decodeVideoTextureEmissive&&a.enable(20),t.alphaToCoverage&&a.enable(21),t.numMultiviewViews&&a.enable(21),e.push(a.mask)}(n,t),n.push(e.outputColorSpace)),n.push(t.customProgramCacheKey),n.join()},getUniforms:function(e){const t=f[e.type];let n;if(t){const e=of[t];n=Ca.clone(e.uniforms)}else n=e.uniforms;return n},acquireProgram:function(t,n){let i;for(let e=0,t=h.length;e<t;e++){const t=h[e];if(t.cacheKey===n){i=t,++i.usedTimes;break}}return void 0===i&&(i=new lA(e,n,t,s),h.push(i)),i},releaseProgram:function(e){if(0==--e.usedTimes){const t=h.indexOf(e);h[t]=h[h.length-1],h.pop(),e.destroy()}},releaseShaderCache:function(e){l.remove(e)},programs:h,dispose:function(){l.dispose()}}}function pA(){let e=new WeakMap;return{has:function(t){return e.has(t)},get:function(t){let n=e.get(t);return void 0===n&&(n={},e.set(t,n)),n},remove:function(t){e.delete(t)},update:function(t,n,i){e.get(t)[n]=i},dispose:function(){e=new WeakMap}}}function fA(e,t){return e.groupOrder!==t.groupOrder?e.groupOrder-t.groupOrder:e.renderOrder!==t.renderOrder?e.renderOrder-t.renderOrder:e.material.id!==t.material.id?e.material.id-t.material.id:e.z!==t.z?e.z-t.z:e.id-t.id}function mA(e,t){return e.groupOrder!==t.groupOrder?e.groupOrder-t.groupOrder:e.renderOrder!==t.renderOrder?e.renderOrder-t.renderOrder:e.z!==t.z?t.z-e.z:e.id-t.id}function AA(){const e=[];let t=0;const n=[],i=[],r=[];function s(n,i,r,s,o,a){let l=e[t];return void 0===l?(l={id:n.id,object:n,geometry:i,material:r,groupOrder:s,renderOrder:n.renderOrder,z:o,group:a},e[t]=l):(l.id=n.id,l.object=n,l.geometry=i,l.material=r,l.groupOrder=s,l.renderOrder=n.renderOrder,l.z=o,l.group=a),t++,l}return{opaque:n,transmissive:i,transparent:r,init:function(){t=0,n.length=0,i.length=0,r.length=0},push:function(e,t,o,a,l,c){const h=s(e,t,o,a,l,c);o.transmission>0?i.push(h):!0===o.transparent?r.push(h):n.push(h)},unshift:function(e,t,o,a,l,c){const h=s(e,t,o,a,l,c);o.transmission>0?i.unshift(h):!0===o.transparent?r.unshift(h):n.unshift(h)},finish:function(){for(let n=t,i=e.length;n<i;n++){const t=e[n];if(null===t.id)break;t.id=null,t.object=null,t.geometry=null,t.material=null,t.group=null}},sort:function(e,t){n.length>1&&n.sort(e||fA),i.length>1&&i.sort(t||mA),r.length>1&&r.sort(t||mA)}}}function gA(){let e=new WeakMap;return{get:function(t,n){const i=e.get(t);let r;return void 0===i?(r=new AA,e.set(t,[r])):n>=i.length?(r=new AA,i.push(r)):r=i[n],r},dispose:function(){e=new WeakMap}}}function vA(){const e={};return{get:function(t){if(void 0!==e[t.id])return e[t.id];let n;switch(t.type){case"DirectionalLight":n={direction:new os,color:new To};break;case"SpotLight":n={position:new os,direction:new os,color:new To,distance:0,coneCos:0,penumbraCos:0,decay:0};break;case"PointLight":n={position:new os,color:new To,distance:0,decay:0};break;case"HemisphereLight":n={direction:new os,skyColor:new To,groundColor:new To};break;case"RectAreaLight":n={color:new To,position:new os,halfWidth:new os,halfHeight:new os}}return e[t.id]=n,n}}}let yA=0;function EA(e,t){return(t.castShadow?2:0)-(e.castShadow?2:0)+(t.map?1:0)-(e.map?1:0)}function bA(e){const t=new vA,n=function(){const e={};return{get:function(t){if(void 0!==e[t.id])return e[t.id];let n;switch(t.type){case"DirectionalLight":case"SpotLight":n={shadowIntensity:1,shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new Tr};break;case"PointLight":n={shadowIntensity:1,shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new Tr,shadowCameraNear:1,shadowCameraFar:1e3}}return e[t.id]=n,n}}}(),i={version:0,hash:{directionalLength:-1,pointLength:-1,spotLength:-1,rectAreaLength:-1,hemiLength:-1,numDirectionalShadows:-1,numPointShadows:-1,numSpotShadows:-1,numSpotMaps:-1,numLightProbes:-1},ambient:[0,0,0],probe:[],directional:[],directionalShadow:[],directionalShadowMap:[],directionalShadowMatrix:[],spot:[],spotLightMap:[],spotShadow:[],spotShadowMap:[],spotLightMatrix:[],rectArea:[],rectAreaLTC1:null,rectAreaLTC2:null,point:[],pointShadow:[],pointShadowMap:[],pointShadowMatrix:[],hemi:[],numSpotLightShadowsWithMaps:0,numLightProbes:0};for(let e=0;e<9;e++)i.probe.push(new os);const r=new os,s=new ks,o=new ks;return{setup:function(r){let s=0,o=0,a=0;for(let e=0;e<9;e++)i.probe[e].set(0,0,0);let l=0,c=0,h=0,u=0,d=0,p=0,f=0,m=0,A=0,g=0,v=0;r.sort(EA);for(let e=0,y=r.length;e<y;e++){const y=r[e],E=y.color,b=y.intensity,x=y.distance,C=y.shadow&&y.shadow.map?y.shadow.map.texture:null;if(y.isAmbientLight)s+=E.r*b,o+=E.g*b,a+=E.b*b;else if(y.isLightProbe){for(let e=0;e<9;e++)i.probe[e].addScaledVector(y.sh.coefficients[e],b);v++}else if(y.isDirectionalLight){const e=t.get(y);if(e.color.copy(y.color).multiplyScalar(y.intensity),y.castShadow){const e=y.shadow,t=n.get(y);t.shadowIntensity=e.intensity,t.shadowBias=e.bias,t.shadowNormalBias=e.normalBias,t.shadowRadius=e.radius,t.shadowMapSize=e.mapSize,i.directionalShadow[l]=t,i.directionalShadowMap[l]=C,i.directionalShadowMatrix[l]=y.shadow.matrix,p++}i.directional[l]=e,l++}else if(y.isSpotLight){const e=t.get(y);e.position.setFromMatrixPosition(y.matrixWorld),e.color.copy(E).multiplyScalar(b),e.distance=x,e.coneCos=Math.cos(y.angle),e.penumbraCos=Math.cos(y.angle*(1-y.penumbra)),e.decay=y.decay,i.spot[h]=e;const r=y.shadow;if(y.map&&(i.spotLightMap[A]=y.map,A++,r.updateMatrices(y),y.castShadow&&g++),i.spotLightMatrix[h]=r.matrix,y.castShadow){const e=n.get(y);e.shadowIntensity=r.intensity,e.shadowBias=r.bias,e.shadowNormalBias=r.normalBias,e.shadowRadius=r.radius,e.shadowMapSize=r.mapSize,i.spotShadow[h]=e,i.spotShadowMap[h]=C,m++}h++}else if(y.isRectAreaLight){const e=t.get(y);e.color.copy(E).multiplyScalar(b),e.halfWidth.set(.5*y.width,0,0),e.halfHeight.set(0,.5*y.height,0),i.rectArea[u]=e,u++}else if(y.isPointLight){const e=t.get(y);if(e.color.copy(y.color).multiplyScalar(y.intensity),e.distance=y.distance,e.decay=y.decay,y.castShadow){const e=y.shadow,t=n.get(y);t.shadowIntensity=e.intensity,t.shadowBias=e.bias,t.shadowNormalBias=e.normalBias,t.shadowRadius=e.radius,t.shadowMapSize=e.mapSize,t.shadowCameraNear=e.camera.near,t.shadowCameraFar=e.camera.far,i.pointShadow[c]=t,i.pointShadowMap[c]=C,i.pointShadowMatrix[c]=y.shadow.matrix,f++}i.point[c]=e,c++}else if(y.isHemisphereLight){const e=t.get(y);e.skyColor.copy(y.color).multiplyScalar(b),e.groundColor.copy(y.groundColor).multiplyScalar(b),i.hemi[d]=e,d++}}u>0&&(!0===e.has("OES_texture_float_linear")?(i.rectAreaLTC1=sf.LTC_FLOAT_1,i.rectAreaLTC2=sf.LTC_FLOAT_2):(i.rectAreaLTC1=sf.LTC_HALF_1,i.rectAreaLTC2=sf.LTC_HALF_2)),i.ambient[0]=s,i.ambient[1]=o,i.ambient[2]=a;const y=i.hash;y.directionalLength===l&&y.pointLength===c&&y.spotLength===h&&y.rectAreaLength===u&&y.hemiLength===d&&y.numDirectionalShadows===p&&y.numPointShadows===f&&y.numSpotShadows===m&&y.numSpotMaps===A&&y.numLightProbes===v||(i.directional.length=l,i.spot.length=h,i.rectArea.length=u,i.point.length=c,i.hemi.length=d,i.directionalShadow.length=p,i.directionalShadowMap.length=p,i.pointShadow.length=f,i.pointShadowMap.length=f,i.spotShadow.length=m,i.spotShadowMap.length=m,i.directionalShadowMatrix.length=p,i.pointShadowMatrix.length=f,i.spotLightMatrix.length=m+A-g,i.spotLightMap.length=A,i.numSpotLightShadowsWithMaps=g,i.numLightProbes=v,y.directionalLength=l,y.pointLength=c,y.spotLength=h,y.rectAreaLength=u,y.hemiLength=d,y.numDirectionalShadows=p,y.numPointShadows=f,y.numSpotShadows=m,y.numSpotMaps=A,y.numLightProbes=v,i.version=yA++)},setupView:function(e,t){let n=0,a=0,l=0,c=0,h=0;const u=t.matrixWorldInverse;for(let t=0,d=e.length;t<d;t++){const d=e[t];if(d.isDirectionalLight){const e=i.directional[n];e.direction.setFromMatrixPosition(d.matrixWorld),r.setFromMatrixPosition(d.target.matrixWorld),e.direction.sub(r),e.direction.transformDirection(u),n++}else if(d.isSpotLight){const e=i.spot[l];e.position.setFromMatrixPosition(d.matrixWorld),e.position.applyMatrix4(u),e.direction.setFromMatrixPosition(d.matrixWorld),r.setFromMatrixPosition(d.target.matrixWorld),e.direction.sub(r),e.direction.transformDirection(u),l++}else if(d.isRectAreaLight){const e=i.rectArea[c];e.position.setFromMatrixPosition(d.matrixWorld),e.position.applyMatrix4(u),o.identity(),s.copy(d.matrixWorld),s.premultiply(u),o.extractRotation(s),e.halfWidth.set(.5*d.width,0,0),e.halfHeight.set(0,.5*d.height,0),e.halfWidth.applyMatrix4(o),e.halfHeight.applyMatrix4(o),c++}else if(d.isPointLight){const e=i.point[a];e.position.setFromMatrixPosition(d.matrixWorld),e.position.applyMatrix4(u),a++}else if(d.isHemisphereLight){const e=i.hemi[h];e.direction.setFromMatrixPosition(d.matrixWorld),e.direction.transformDirection(u),h++}}},state:i}}function xA(e){const t=new bA(e),n=[],i=[],r={lightsArray:n,shadowsArray:i,camera:null,lights:t,transmissionRenderTarget:{}};return{init:function(e){r.camera=e,n.length=0,i.length=0},state:r,setupLights:function(){t.setup(n)},setupLightsView:function(e){t.setupView(n,e)},pushLight:function(e){n.push(e)},pushShadow:function(e){i.push(e)}}}function CA(e){let t=new WeakMap;return{get:function(n,i=0){const r=t.get(n);let s;return void 0===r?(s=new xA(e),t.set(n,[s])):i>=r.length?(s=new xA(e),r.push(s)):s=r[i],s},dispose:function(){t=new WeakMap}}}function wA(e,t,n){let i=new Ol;const r=new Tr,s=new Tr,o=new Zr,a=new cu({depthPacking:Ci}),l=new hu,c={},h=n.maxTextureSize,u={[He]:Ve,[Ve]:He,[je]:je},d=new wa({defines:{VSM_SAMPLES:8},uniforms:{shadow_pass:{value:null},resolution:{value:new Tr},radius:{value:4}},vertexShader:"void main() {\n\tgl_Position = vec4( position, 1.0 );\n}",fragmentShader:"uniform sampler2D shadow_pass;\nuniform vec2 resolution;\nuniform float radius;\n#include <packing>\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}"}),p=d.clone();p.defines.HORIZONTAL_PASS=1;const f=new sa;f.setAttribute("position",new Go(new Float32Array([-1,-1,.5,3,-1,.5,-1,3,.5]),3));const m=new ga(f,d),A=this;this.enabled=!1,this.autoUpdate=!0,this.needsUpdate=!1,this.type=Qe;let g=this.type;function v(n,i){const s=t.update(m);d.defines.VSM_SAMPLES!==n.blurSamples&&(d.defines.VSM_SAMPLES=n.blurSamples,p.defines.VSM_SAMPLES=n.blurSamples,d.needsUpdate=!0,p.needsUpdate=!0),null===n.mapPass&&(n.mapPass=new es(r.x,r.y)),d.uniforms.shadow_pass.value=n.map.texture,d.uniforms.resolution.value=n.mapSize,d.uniforms.radius.value=n.radius,e.setRenderTarget(n.mapPass),e.clear(),e.renderBufferDirect(i,null,s,d,m,null),p.uniforms.shadow_pass.value=n.mapPass.texture,p.uniforms.resolution.value=n.mapSize,p.uniforms.radius.value=n.radius,e.setRenderTarget(n.map),e.clear(),e.renderBufferDirect(i,null,s,p,m,null)}function y(t,n,i,r){let s=null;const o=!0===i.isPointLight?t.customDistanceMaterial:t.customDepthMaterial;if(void 0!==o)s=o;else if(s=!0===i.isPointLight?l:a,e.localClippingEnabled&&!0===n.clipShadows&&Array.isArray(n.clippingPlanes)&&0!==n.clippingPlanes.length||n.displacementMap&&0!==n.displacementScale||n.alphaMap&&n.alphaTest>0||n.map&&n.alphaTest>0){const e=s.uuid,t=n.uuid;let i=c[e];void 0===i&&(i={},c[e]=i);let r=i[t];void 0===r&&(r=s.clone(),i[t]=r,n.addEventListener("dispose",b)),s=r}return s.visible=n.visible,s.wireframe=n.wireframe,s.side=r===Ge?null!==n.shadowSide?n.shadowSide:n.side:null!==n.shadowSide?n.shadowSide:u[n.side],s.alphaMap=n.alphaMap,s.alphaTest=n.alphaTest,s.map=n.map,s.clipShadows=n.clipShadows,s.clippingPlanes=n.clippingPlanes,s.clipIntersection=n.clipIntersection,s.displacementMap=n.displacementMap,s.displacementScale=n.displacementScale,s.displacementBias=n.displacementBias,s.wireframeLinewidth=n.wireframeLinewidth,s.linewidth=n.linewidth,!0===i.isPointLight&&!0===s.isMeshDistanceMaterial&&(e.properties.get(s).light=i),s}function E(n,r,s,o,a){if(!1===n.visible)return;if(n.layers.test(r.layers)&&(n.isMesh||n.isLine||n.isPoints)&&(n.castShadow||n.receiveShadow&&a===Ge)&&(!n.frustumCulled||i.intersectsObject(n))){n.modelViewMatrix.multiplyMatrices(s.matrixWorldInverse,n.matrixWorld);const i=t.update(n),l=n.material;if(Array.isArray(l)){const t=i.groups;for(let c=0,h=t.length;c<h;c++){const h=t[c],u=l[h.materialIndex];if(u&&u.visible){const t=y(n,u,o,a);n.onBeforeShadow(e,n,r,s,i,t,h),e.renderBufferDirect(s,null,i,t,n,h),n.onAfterShadow(e,n,r,s,i,t,h)}}}else if(l.visible){const t=y(n,l,o,a);n.onBeforeShadow(e,n,r,s,i,t,null),e.renderBufferDirect(s,null,i,t,n,null),n.onAfterShadow(e,n,r,s,i,t,null)}}const l=n.children;for(let e=0,t=l.length;e<t;e++)E(l[e],r,s,o,a)}function b(e){e.target.removeEventListener("dispose",b);for(const t in c){const n=c[t],i=e.target.uuid;i in n&&(n[i].dispose(),delete n[i])}}this.render=function(t,n,a){if(!1===A.enabled)return;if(!1===A.autoUpdate&&!1===A.needsUpdate)return;if(0===t.length)return;const l=e.getRenderTarget(),c=e.getActiveCubeFace(),u=e.getActiveMipmapLevel(),d=e.state;d.setBlending(We),d.buffers.color.setClear(1,1,1,1),d.buffers.depth.setTest(!0),d.setScissorTest(!1);const p=g!==Ge&&this.type===Ge,f=g===Ge&&this.type!==Ge;for(let l=0,c=t.length;l<c;l++){const c=t[l],u=c.shadow;if(void 0===u){console.warn("THREE.WebGLShadowMap:",c,"has no shadow.");continue}if(!1===u.autoUpdate&&!1===u.needsUpdate)continue;r.copy(u.mapSize);const m=u.getFrameExtents();if(r.multiply(m),s.copy(u.mapSize),(r.x>h||r.y>h)&&(r.x>h&&(s.x=Math.floor(h/m.x),r.x=s.x*m.x,u.mapSize.x=s.x),r.y>h&&(s.y=Math.floor(h/m.y),r.y=s.y*m.y,u.mapSize.y=s.y)),null===u.map||!0===p||!0===f){const e=this.type!==Ge?{minFilter:Xt,magFilter:Xt}:{};null!==u.map&&u.map.dispose(),u.map=new es(r.x,r.y,e),u.map.texture.name=c.name+".shadowMap",u.camera.updateProjectionMatrix()}e.setRenderTarget(u.map),e.clear();const A=u.getViewportCount();for(let e=0;e<A;e++){const t=u.getViewport(e);o.set(s.x*t.x,s.y*t.y,s.x*t.z,s.y*t.w),d.viewport(o),u.updateMatrices(c,e),i=u.getFrustum(),E(n,a,u.camera,c,this.type)}!0!==u.isPointLightShadow&&this.type===Ge&&v(u,a),u.needsUpdate=!1}g=this.type,A.needsUpdate=!1,e.setRenderTarget(l,c,u)}}const _A={[vt]:yt,[Et]:wt,[xt]:_t,[bt]:Ct,[yt]:vt,[wt]:Et,[_t]:xt,[Ct]:bt};function MA(e,t){const n=new function(){let t=!1;const n=new Zr;let i=null;const r=new Zr(0,0,0,0);return{setMask:function(n){i===n||t||(e.colorMask(n,n,n,n),i=n)},setLocked:function(e){t=e},setClear:function(t,i,s,o,a){!0===a&&(t*=o,i*=o,s*=o),n.set(t,i,s,o),!1===r.equals(n)&&(e.clearColor(t,i,s,o),r.copy(n))},reset:function(){t=!1,i=null,r.set(-1,0,0,0)}}},i=new function(){let n=!1,i=!1,r=null,s=null,o=null;return{setReversed:function(e){if(i!==e){const e=t.get("EXT_clip_control");i?e.clipControlEXT(e.LOWER_LEFT_EXT,e.ZERO_TO_ONE_EXT):e.clipControlEXT(e.LOWER_LEFT_EXT,e.NEGATIVE_ONE_TO_ONE_EXT);const n=o;o=null,this.setClear(n)}i=e},getReversed:function(){return i},setTest:function(t){t?Q(e.DEPTH_TEST):z(e.DEPTH_TEST)},setMask:function(t){r===t||n||(e.depthMask(t),r=t)},setFunc:function(t){if(i&&(t=_A[t]),s!==t){switch(t){case vt:e.depthFunc(e.NEVER);break;case yt:e.depthFunc(e.ALWAYS);break;case Et:e.depthFunc(e.LESS);break;case bt:e.depthFunc(e.LEQUAL);break;case xt:e.depthFunc(e.EQUAL);break;case Ct:e.depthFunc(e.GEQUAL);break;case wt:e.depthFunc(e.GREATER);break;case _t:e.depthFunc(e.NOTEQUAL);break;default:e.depthFunc(e.LEQUAL)}s=t}},setLocked:function(e){n=e},setClear:function(t){o!==t&&(i&&(t=1-t),e.clearDepth(t),o=t)},reset:function(){n=!1,r=null,s=null,o=null,i=!1}}},r=new function(){let t=!1,n=null,i=null,r=null,s=null,o=null,a=null,l=null,c=null;return{setTest:function(n){t||(n?Q(e.STENCIL_TEST):z(e.STENCIL_TEST))},setMask:function(i){n===i||t||(e.stencilMask(i),n=i)},setFunc:function(t,n,o){i===t&&r===n&&s===o||(e.stencilFunc(t,n,o),i=t,r=n,s=o)},setOp:function(t,n,i){o===t&&a===n&&l===i||(e.stencilOp(t,n,i),o=t,a=n,l=i)},setLocked:function(e){t=e},setClear:function(t){c!==t&&(e.clearStencil(t),c=t)},reset:function(){t=!1,n=null,i=null,r=null,s=null,o=null,a=null,l=null,c=null}}},s=new WeakMap,o=new WeakMap;let a={},l={},c=new WeakMap,h=[],u=null,d=!1,p=null,f=null,m=null,A=null,g=null,v=null,y=null,E=new To(0,0,0),b=0,x=!1,C=null,w=null,_=null,M=null,I=null;const S=e.getParameter(e.MAX_COMBINED_TEXTURE_IMAGE_UNITS);let T=!1,B=0;const R=e.getParameter(e.VERSION);-1!==R.indexOf("WebGL")?(B=parseFloat(/^WebGL (\d)/.exec(R)[1]),T=B>=1):-1!==R.indexOf("OpenGL ES")&&(B=parseFloat(/^OpenGL ES (\d)/.exec(R)[1]),T=B>=2);let L=null,D={};const P=e.getParameter(e.SCISSOR_BOX),U=e.getParameter(e.VIEWPORT),k=(new Zr).fromArray(P),N=(new Zr).fromArray(U);function O(t,n,i,r){const s=new Uint8Array(4),o=e.createTexture();e.bindTexture(t,o),e.texParameteri(t,e.TEXTURE_MIN_FILTER,e.NEAREST),e.texParameteri(t,e.TEXTURE_MAG_FILTER,e.NEAREST);for(let o=0;o<i;o++)t===e.TEXTURE_3D||t===e.TEXTURE_2D_ARRAY?e.texImage3D(n,0,e.RGBA,1,1,r,0,e.RGBA,e.UNSIGNED_BYTE,s):e.texImage2D(n+o,0,e.RGBA,1,1,0,e.RGBA,e.UNSIGNED_BYTE,s);return o}const F={};function Q(t){!0!==a[t]&&(e.enable(t),a[t]=!0)}function z(t){!1!==a[t]&&(e.disable(t),a[t]=!1)}F[e.TEXTURE_2D]=O(e.TEXTURE_2D,e.TEXTURE_2D,1),F[e.TEXTURE_CUBE_MAP]=O(e.TEXTURE_CUBE_MAP,e.TEXTURE_CUBE_MAP_POSITIVE_X,6),F[e.TEXTURE_2D_ARRAY]=O(e.TEXTURE_2D_ARRAY,e.TEXTURE_2D_ARRAY,1,1),F[e.TEXTURE_3D]=O(e.TEXTURE_3D,e.TEXTURE_3D,1,1),n.setClear(0,0,0,1),i.setClear(1),r.setClear(0),Q(e.DEPTH_TEST),i.setFunc(bt),j(!1),W(ke),Q(e.CULL_FACE),V(We);const G={[Ze]:e.FUNC_ADD,[$e]:e.FUNC_SUBTRACT,[et]:e.FUNC_REVERSE_SUBTRACT};G[tt]=e.MIN,G[nt]=e.MAX;const H={[it]:e.ZERO,[rt]:e.ONE,[st]:e.SRC_COLOR,[at]:e.SRC_ALPHA,[pt]:e.SRC_ALPHA_SATURATE,[ut]:e.DST_COLOR,[ct]:e.DST_ALPHA,[ot]:e.ONE_MINUS_SRC_COLOR,[lt]:e.ONE_MINUS_SRC_ALPHA,[dt]:e.ONE_MINUS_DST_COLOR,[ht]:e.ONE_MINUS_DST_ALPHA,[ft]:e.CONSTANT_COLOR,[mt]:e.ONE_MINUS_CONSTANT_COLOR,[At]:e.CONSTANT_ALPHA,[gt]:e.ONE_MINUS_CONSTANT_ALPHA};function V(t,n,i,r,s,o,a,l,c,h){if(t!==We){if(!1===d&&(Q(e.BLEND),d=!0),t===Ke)s=s||n,o=o||i,a=a||r,n===f&&s===g||(e.blendEquationSeparate(G[n],G[s]),f=n,g=s),i===m&&r===A&&o===v&&a===y||(e.blendFuncSeparate(H[i],H[r],H[o],H[a]),m=i,A=r,v=o,y=a),!1!==l.equals(E)&&c===b||(e.blendColor(l.r,l.g,l.b,c),E.copy(l),b=c),p=t,x=!1;else if(t!==p||h!==x){if(f===Ze&&g===Ze||(e.blendEquation(e.FUNC_ADD),f=Ze,g=Ze),h)switch(t){case qe:e.blendFuncSeparate(e.ONE,e.ONE_MINUS_SRC_ALPHA,e.ONE,e.ONE_MINUS_SRC_ALPHA);break;case Xe:e.blendFunc(e.ONE,e.ONE);break;case Ye:e.blendFuncSeparate(e.ZERO,e.ONE_MINUS_SRC_COLOR,e.ZERO,e.ONE);break;case Je:e.blendFuncSeparate(e.ZERO,e.SRC_COLOR,e.ZERO,e.SRC_ALPHA);break;default:console.error("THREE.WebGLState: Invalid blending: ",t)}else switch(t){case qe:e.blendFuncSeparate(e.SRC_ALPHA,e.ONE_MINUS_SRC_ALPHA,e.ONE,e.ONE_MINUS_SRC_ALPHA);break;case Xe:e.blendFunc(e.SRC_ALPHA,e.ONE);break;case Ye:e.blendFuncSeparate(e.ZERO,e.ONE_MINUS_SRC_COLOR,e.ZERO,e.ONE);break;case Je:e.blendFunc(e.ZERO,e.SRC_COLOR);break;default:console.error("THREE.WebGLState: Invalid blending: ",t)}m=null,A=null,v=null,y=null,E.set(0,0,0),b=0,p=t,x=h}}else!0===d&&(z(e.BLEND),d=!1)}function j(t){C!==t&&(t?e.frontFace(e.CW):e.frontFace(e.CCW),C=t)}function W(t){t!==Ue?(Q(e.CULL_FACE),t!==w&&(t===ke?e.cullFace(e.BACK):t===Ne?e.cullFace(e.FRONT):e.cullFace(e.FRONT_AND_BACK))):z(e.CULL_FACE),w=t}function q(t,n,i){t?(Q(e.POLYGON_OFFSET_FILL),M===n&&I===i||(e.polygonOffset(n,i),M=n,I=i)):z(e.POLYGON_OFFSET_FILL)}return{buffers:{color:n,depth:i,stencil:r},enable:Q,disable:z,bindFramebuffer:function(t,n){return l[t]!==n&&(e.bindFramebuffer(t,n),l[t]=n,t===e.DRAW_FRAMEBUFFER&&(l[e.FRAMEBUFFER]=n),t===e.FRAMEBUFFER&&(l[e.DRAW_FRAMEBUFFER]=n),!0)},drawBuffers:function(t,n){let i=h,r=!1;if(t){i=c.get(n),void 0===i&&(i=[],c.set(n,i));const s=t.textures;if(i.length!==s.length||i[0]!==e.COLOR_ATTACHMENT0){for(let t=0,n=s.length;t<n;t++)i[t]=e.COLOR_ATTACHMENT0+t;i.length=s.length,r=!0}}else i[0]!==e.BACK&&(i[0]=e.BACK,r=!0);r&&e.drawBuffers(i)},useProgram:function(t){return u!==t&&(e.useProgram(t),u=t,!0)},setBlending:V,setMaterial:function(t,s){t.side===je?z(e.CULL_FACE):Q(e.CULL_FACE);let o=t.side===Ve;s&&(o=!o),j(o),t.blending===qe&&!1===t.transparent?V(We):V(t.blending,t.blendEquation,t.blendSrc,t.blendDst,t.blendEquationAlpha,t.blendSrcAlpha,t.blendDstAlpha,t.blendColor,t.blendAlpha,t.premultipliedAlpha),i.setFunc(t.depthFunc),i.setTest(t.depthTest),i.setMask(t.depthWrite),n.setMask(t.colorWrite);const a=t.stencilWrite;r.setTest(a),a&&(r.setMask(t.stencilWriteMask),r.setFunc(t.stencilFunc,t.stencilRef,t.stencilFuncMask),r.setOp(t.stencilFail,t.stencilZFail,t.stencilZPass)),q(t.polygonOffset,t.polygonOffsetFactor,t.polygonOffsetUnits),!0===t.alphaToCoverage?Q(e.SAMPLE_ALPHA_TO_COVERAGE):z(e.SAMPLE_ALPHA_TO_COVERAGE)},setFlipSided:j,setCullFace:W,setLineWidth:function(t){t!==_&&(T&&e.lineWidth(t),_=t)},setPolygonOffset:q,setScissorTest:function(t){t?Q(e.SCISSOR_TEST):z(e.SCISSOR_TEST)},activeTexture:function(t){void 0===t&&(t=e.TEXTURE0+S-1),L!==t&&(e.activeTexture(t),L=t)},bindTexture:function(t,n,i){void 0===i&&(i=null===L?e.TEXTURE0+S-1:L);let r=D[i];void 0===r&&(r={type:void 0,texture:void 0},D[i]=r),r.type===t&&r.texture===n||(L!==i&&(e.activeTexture(i),L=i),e.bindTexture(t,n||F[t]),r.type=t,r.texture=n)},unbindTexture:function(){const t=D[L];void 0!==t&&void 0!==t.type&&(e.bindTexture(t.type,null),t.type=void 0,t.texture=void 0)},compressedTexImage2D:function(){try{e.compressedTexImage2D.apply(e,arguments)}catch(e){console.error("THREE.WebGLState:",e)}},compressedTexImage3D:function(){try{e.compressedTexImage3D.apply(e,arguments)}catch(e){console.error("THREE.WebGLState:",e)}},texImage2D:function(){try{e.texImage2D.apply(e,arguments)}catch(e){console.error("THREE.WebGLState:",e)}},texImage3D:function(){try{e.texImage3D.apply(e,arguments)}catch(e){console.error("THREE.WebGLState:",e)}},updateUBOMapping:function(t,n){let i=o.get(n);void 0===i&&(i=new WeakMap,o.set(n,i));let r=i.get(t);void 0===r&&(r=e.getUniformBlockIndex(n,t.name),i.set(t,r))},uniformBlockBinding:function(t,n){const i=o.get(n).get(t);s.get(n)!==i&&(e.uniformBlockBinding(n,i,t.__bindingPointIndex),s.set(n,i))},texStorage2D:function(){try{e.texStorage2D.apply(e,arguments)}catch(e){console.error("THREE.WebGLState:",e)}},texStorage3D:function(){try{e.texStorage3D.apply(e,arguments)}catch(e){console.error("THREE.WebGLState:",e)}},texSubImage2D:function(){try{e.texSubImage2D.apply(e,arguments)}catch(e){console.error("THREE.WebGLState:",e)}},texSubImage3D:function(){try{e.texSubImage3D.apply(e,arguments)}catch(e){console.error("THREE.WebGLState:",e)}},compressedTexSubImage2D:function(){try{e.compressedTexSubImage2D.apply(e,arguments)}catch(e){console.error("THREE.WebGLState:",e)}},compressedTexSubImage3D:function(){try{e.compressedTexSubImage3D.apply(e,arguments)}catch(e){console.error("THREE.WebGLState:",e)}},scissor:function(t){!1===k.equals(t)&&(e.scissor(t.x,t.y,t.z,t.w),k.copy(t))},viewport:function(t){!1===N.equals(t)&&(e.viewport(t.x,t.y,t.z,t.w),N.copy(t))},reset:function(){e.disable(e.BLEND),e.disable(e.CULL_FACE),e.disable(e.DEPTH_TEST),e.disable(e.POLYGON_OFFSET_FILL),e.disable(e.SCISSOR_TEST),e.disable(e.STENCIL_TEST),e.disable(e.SAMPLE_ALPHA_TO_COVERAGE),e.blendEquation(e.FUNC_ADD),e.blendFunc(e.ONE,e.ZERO),e.blendFuncSeparate(e.ONE,e.ZERO,e.ONE,e.ZERO),e.blendColor(0,0,0,0),e.colorMask(!0,!0,!0,!0),e.clearColor(0,0,0,0),e.depthMask(!0),e.depthFunc(e.LESS),i.setReversed(!1),e.clearDepth(1),e.stencilMask(4294967295),e.stencilFunc(e.ALWAYS,0,4294967295),e.stencilOp(e.KEEP,e.KEEP,e.KEEP),e.clearStencil(0),e.cullFace(e.BACK),e.frontFace(e.CCW),e.polygonOffset(0,0),e.activeTexture(e.TEXTURE0),e.bindFramebuffer(e.FRAMEBUFFER,null),e.bindFramebuffer(e.DRAW_FRAMEBUFFER,null),e.bindFramebuffer(e.READ_FRAMEBUFFER,null),e.useProgram(null),e.lineWidth(1),e.scissor(0,0,e.canvas.width,e.canvas.height),e.viewport(0,0,e.canvas.width,e.canvas.height),a={},L=null,D={},l={},c=new WeakMap,h=[],u=null,d=!1,p=null,f=null,m=null,A=null,g=null,v=null,y=null,E=new To(0,0,0),b=0,x=!1,C=null,w=null,_=null,M=null,I=null,k.set(0,0,e.canvas.width,e.canvas.height),N.set(0,0,e.canvas.width,e.canvas.height),n.reset(),i.reset(),r.reset()}}}function IA(e,t,n,i,r,s,o){const a=t.has("WEBGL_multisampled_render_to_texture")?t.get("WEBGL_multisampled_render_to_texture"):null,l="undefined"!=typeof navigator&&/OculusBrowser/g.test(navigator.userAgent),c=t.has("OCULUS_multiview")?t.get("OCULUS_multiview"):null,h=new Tr,u=new WeakMap;let d;const p=new WeakMap;let f=[],m=!1,A=!1;try{A="undefined"!=typeof OffscreenCanvas&&null!==new OffscreenCanvas(1,1).getContext("2d")}catch(e){}function g(e,t){return A?new OffscreenCanvas(e,t):Ur("canvas")}function v(e,t,n){let i=1;const r=W(e);if((r.width>n||r.height>n)&&(i=n/Math.max(r.width,r.height)),i<1){if("undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&e instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&e instanceof ImageBitmap||"undefined"!=typeof VideoFrame&&e instanceof VideoFrame){const n=Math.floor(i*r.width),s=Math.floor(i*r.height);void 0===d&&(d=g(n,s));const o=t?g(n,s):d;return o.width=n,o.height=s,o.getContext("2d").drawImage(e,0,0,n,s),console.warn("THREE.WebGLRenderer: Texture has been resized from ("+r.width+"x"+r.height+") to ("+n+"x"+s+")."),o}return"data"in e&&console.warn("THREE.WebGLRenderer: Image in DataTexture is too big ("+r.width+"x"+r.height+")."),e}return e}function y(e){return e.generateMipmaps}function E(t){e.generateMipmap(t)}function b(t){return t.isWebGLCubeRenderTarget?e.TEXTURE_CUBE_MAP:t.isWebGL3DRenderTarget?e.TEXTURE_3D:t.isWebGLArrayRenderTarget||t.isCompressedArrayTexture?e.TEXTURE_2D_ARRAY:e.TEXTURE_2D}function x(n,i,r,s,o=!1){if(null!==n){if(void 0!==e[n])return e[n];console.warn("THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format '"+n+"'")}let a=i;if(i===e.RED&&(r===e.FLOAT&&(a=e.R32F),r===e.HALF_FLOAT&&(a=e.R16F),r===e.UNSIGNED_BYTE&&(a=e.R8)),i===e.RED_INTEGER&&(r===e.UNSIGNED_BYTE&&(a=e.R8UI),r===e.UNSIGNED_SHORT&&(a=e.R16UI),r===e.UNSIGNED_INT&&(a=e.R32UI),r===e.BYTE&&(a=e.R8I),r===e.SHORT&&(a=e.R16I),r===e.INT&&(a=e.R32I)),i===e.RG&&(r===e.FLOAT&&(a=e.RG32F),r===e.HALF_FLOAT&&(a=e.RG16F),r===e.UNSIGNED_BYTE&&(a=e.RG8)),i===e.RG_INTEGER&&(r===e.UNSIGNED_BYTE&&(a=e.RG8UI),r===e.UNSIGNED_SHORT&&(a=e.RG16UI),r===e.UNSIGNED_INT&&(a=e.RG32UI),r===e.BYTE&&(a=e.RG8I),r===e.SHORT&&(a=e.RG16I),r===e.INT&&(a=e.RG32I)),i===e.RGB_INTEGER&&(r===e.UNSIGNED_BYTE&&(a=e.RGB8UI),r===e.UNSIGNED_SHORT&&(a=e.RGB16UI),r===e.UNSIGNED_INT&&(a=e.RGB32UI),r===e.BYTE&&(a=e.RGB8I),r===e.SHORT&&(a=e.RGB16I),r===e.INT&&(a=e.RGB32I)),i===e.RGBA_INTEGER&&(r===e.UNSIGNED_BYTE&&(a=e.RGBA8UI),r===e.UNSIGNED_SHORT&&(a=e.RGBA16UI),r===e.UNSIGNED_INT&&(a=e.RGBA32UI),r===e.BYTE&&(a=e.RGBA8I),r===e.SHORT&&(a=e.RGBA16I),r===e.INT&&(a=e.RGBA32I)),i===e.RGB&&r===e.UNSIGNED_INT_5_9_9_9_REV&&(a=e.RGB9_E5),i===e.RGBA){const t=o?Ri:Gr.getTransfer(s);r===e.FLOAT&&(a=e.RGBA32F),r===e.HALF_FLOAT&&(a=e.RGBA16F),r===e.UNSIGNED_BYTE&&(a=t===Li?e.SRGB8_ALPHA8:e.RGBA8),r===e.UNSIGNED_SHORT_4_4_4_4&&(a=e.RGBA4),r===e.UNSIGNED_SHORT_5_5_5_1&&(a=e.RGB5_A1)}return a!==e.R16F&&a!==e.R32F&&a!==e.RG16F&&a!==e.RG32F&&a!==e.RGBA16F&&a!==e.RGBA32F||t.get("EXT_color_buffer_float"),a}function C(t,n){let i;return t?null===n||n===hn||n===mn?i=e.DEPTH24_STENCIL8:n===un?i=e.DEPTH32F_STENCIL8:n===ln&&(i=e.DEPTH24_STENCIL8,console.warn("DepthTexture: 16 bit depth attachment is not supported with stencil. Using 24-bit attachment.")):null===n||n===hn||n===mn?i=e.DEPTH_COMPONENT24:n===un?i=e.DEPTH_COMPONENT32F:n===ln&&(i=e.DEPTH_COMPONENT16),i}function w(e,t){return!0===y(e)||e.isFramebufferTexture&&e.minFilter!==Xt&&e.minFilter!==$t?Math.log2(Math.max(t.width,t.height))+1:void 0!==e.mipmaps&&e.mipmaps.length>0?e.mipmaps.length:e.isCompressedTexture&&Array.isArray(e.image)?t.mipmaps.length:1}function _(e){const t=e.target;t.removeEventListener("dispose",_),function(e){const t=i.get(e);if(void 0===t.__webglInit)return;const n=e.source,r=p.get(n);if(r){const i=r[t.__cacheKey];i.usedTimes--,0===i.usedTimes&&I(e),0===Object.keys(r).length&&p.delete(n)}i.remove(e)}(t),t.isVideoTexture&&u.delete(t)}function M(t){const n=t.target;n.removeEventListener("dispose",M),function(t){const n=i.get(t);if(t.depthTexture&&(t.depthTexture.dispose(),i.remove(t.depthTexture)),t.isWebGLCubeRenderTarget)for(let t=0;t<6;t++){if(Array.isArray(n.__webglFramebuffer[t]))for(let i=0;i<n.__webglFramebuffer[t].length;i++)e.deleteFramebuffer(n.__webglFramebuffer[t][i]);else e.deleteFramebuffer(n.__webglFramebuffer[t]);n.__webglDepthbuffer&&e.deleteRenderbuffer(n.__webglDepthbuffer[t])}else{if(Array.isArray(n.__webglFramebuffer))for(let t=0;t<n.__webglFramebuffer.length;t++)e.deleteFramebuffer(n.__webglFramebuffer[t]);else e.deleteFramebuffer(n.__webglFramebuffer);if(n.__webglDepthbuffer&&e.deleteRenderbuffer(n.__webglDepthbuffer),n.__webglMultisampledFramebuffer&&e.deleteFramebuffer(n.__webglMultisampledFramebuffer),n.__webglColorRenderbuffer)for(let t=0;t<n.__webglColorRenderbuffer.length;t++)n.__webglColorRenderbuffer[t]&&e.deleteRenderbuffer(n.__webglColorRenderbuffer[t]);n.__webglDepthRenderbuffer&&e.deleteRenderbuffer(n.__webglDepthRenderbuffer)}const r=t.textures;for(let t=0,n=r.length;t<n;t++){const n=i.get(r[t]);n.__webglTexture&&(e.deleteTexture(n.__webglTexture),o.memory.textures--),i.remove(r[t])}i.remove(t)}(n)}function I(t){const n=i.get(t);e.deleteTexture(n.__webglTexture);const r=t.source;delete p.get(r)[n.__cacheKey],o.memory.textures--}let S=0;function T(t,r){const s=i.get(t);if(t.isVideoTexture&&function(e){const t=o.render.frame;u.get(e)!==t&&(u.set(e,t),e.update())}(t),!1===t.isRenderTargetTexture&&t.version>0&&s.__version!==t.version){const e=t.image;if(null===e)console.warn("THREE.WebGLRenderer: Texture marked for update but no image data found.");else if(!1===e.complete)console.warn("THREE.WebGLRenderer: Texture marked for update but image is incomplete");else if(k(s,t,r))return}n.bindTexture(e.TEXTURE_2D,s.__webglTexture,e.TEXTURE0+r)}function B(t,r){const s=i.get(t);t.version>0&&s.__version!==t.version?k(s,t,r):n.bindTexture(e.TEXTURE_2D_ARRAY,s.__webglTexture,e.TEXTURE0+r)}const R={[jt]:e.REPEAT,[Wt]:e.CLAMP_TO_EDGE,[qt]:e.MIRRORED_REPEAT},L={[Xt]:e.NEAREST,[Yt]:e.NEAREST_MIPMAP_NEAREST,[Kt]:e.NEAREST_MIPMAP_LINEAR,[$t]:e.LINEAR,[en]:e.LINEAR_MIPMAP_NEAREST,[nn]:e.LINEAR_MIPMAP_LINEAR},D={[Yi]:e.NEVER,[nr]:e.ALWAYS,[Ji]:e.LESS,[Zi]:e.LEQUAL,[Ki]:e.EQUAL,[tr]:e.GEQUAL,[$i]:e.GREATER,[er]:e.NOTEQUAL};function P(n,s){if(s.type!==un||!1!==t.has("OES_texture_float_linear")||s.magFilter!==$t&&s.magFilter!==en&&s.magFilter!==Kt&&s.magFilter!==nn&&s.minFilter!==$t&&s.minFilter!==en&&s.minFilter!==Kt&&s.minFilter!==nn||console.warn("THREE.WebGLRenderer: Unable to use linear filtering with floating point textures. OES_texture_float_linear not supported on this device."),e.texParameteri(n,e.TEXTURE_WRAP_S,R[s.wrapS]),e.texParameteri(n,e.TEXTURE_WRAP_T,R[s.wrapT]),n!==e.TEXTURE_3D&&n!==e.TEXTURE_2D_ARRAY||e.texParameteri(n,e.TEXTURE_WRAP_R,R[s.wrapR]),e.texParameteri(n,e.TEXTURE_MAG_FILTER,L[s.magFilter]),e.texParameteri(n,e.TEXTURE_MIN_FILTER,L[s.minFilter]),s.compareFunction&&(e.texParameteri(n,e.TEXTURE_COMPARE_MODE,e.COMPARE_REF_TO_TEXTURE),e.texParameteri(n,e.TEXTURE_COMPARE_FUNC,D[s.compareFunction])),!0===t.has("EXT_texture_filter_anisotropic")){if(s.magFilter===Xt)return;if(s.minFilter!==Kt&&s.minFilter!==nn)return;if(s.type===un&&!1===t.has("OES_texture_float_linear"))return;if(s.anisotropy>1||i.get(s).__currentAnisotropy){const o=t.get("EXT_texture_filter_anisotropic");e.texParameterf(n,o.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(s.anisotropy,r.getMaxAnisotropy())),i.get(s).__currentAnisotropy=s.anisotropy}}}function U(t,n){let i=!1;void 0===t.__webglInit&&(t.__webglInit=!0,n.addEventListener("dispose",_));const r=n.source;let s=p.get(r);void 0===s&&(s={},p.set(r,s));const a=function(e){const t=[];return t.push(e.wrapS),t.push(e.wrapT),t.push(e.wrapR||0),t.push(e.magFilter),t.push(e.minFilter),t.push(e.anisotropy),t.push(e.internalFormat),t.push(e.format),t.push(e.type),t.push(e.generateMipmaps),t.push(e.premultiplyAlpha),t.push(e.flipY),t.push(e.unpackAlignment),t.push(e.colorSpace),t.join()}(n);if(a!==t.__cacheKey){void 0===s[a]&&(s[a]={texture:e.createTexture(),usedTimes:0},o.memory.textures++,i=!0),s[a].usedTimes++;const r=s[t.__cacheKey];void 0!==r&&(s[t.__cacheKey].usedTimes--,0===r.usedTimes&&I(n)),t.__cacheKey=a,t.__webglTexture=s[a].texture}return i}function k(t,o,a){if(m)return o.isPendingDeferredUpload||(o.isPendingDeferredUpload=!0,f.push({textureProperties:t,texture:o,slot:a})),!1;let l=e.TEXTURE_2D;(o.isDataArrayTexture||o.isCompressedArrayTexture)&&(l=e.TEXTURE_2D_ARRAY),o.isData3DTexture&&(l=e.TEXTURE_3D);const c=U(t,o),h=o.source;n.bindTexture(l,t.__webglTexture,e.TEXTURE0+a);const u=i.get(h);if(h.version!==u.__version||!0===c){n.activeTexture(e.TEXTURE0+a);const t=Gr.getPrimaries(Gr.workingColorSpace),i=o.colorSpace===Si?null:Gr.getPrimaries(o.colorSpace),d=o.colorSpace===Si||t===i?e.NONE:e.BROWSER_DEFAULT_WEBGL;e.pixelStorei(e.UNPACK_FLIP_Y_WEBGL,o.flipY),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,o.premultiplyAlpha),e.pixelStorei(e.UNPACK_ALIGNMENT,o.unpackAlignment),e.pixelStorei(e.UNPACK_COLORSPACE_CONVERSION_WEBGL,d);let p=v(o.image,!1,r.maxTextureSize);p=j(o,p);const f=s.convert(o.format,o.colorSpace),m=s.convert(o.type);let A,g=x(o.internalFormat,f,m,o.colorSpace,o.isVideoTexture);P(l,o);const b=o.mipmaps,_=!0!==o.isVideoTexture,M=void 0===u.__version||!0===c,I=h.dataReady,S=w(o,p);if(o.isDepthTexture)g=C(o.format===Cn,o.type),M&&(_?n.texStorage2D(e.TEXTURE_2D,1,g,p.width,p.height):n.texImage2D(e.TEXTURE_2D,0,g,p.width,p.height,0,f,m,null));else if(o.isDataTexture)if(b.length>0){_&&M&&n.texStorage2D(e.TEXTURE_2D,S,g,b[0].width,b[0].height);for(let t=0,i=b.length;t<i;t++)A=b[t],_?I&&n.texSubImage2D(e.TEXTURE_2D,t,0,0,A.width,A.height,f,m,A.data):n.texImage2D(e.TEXTURE_2D,t,g,A.width,A.height,0,f,m,A.data);o.generateMipmaps=!1}else _?(M&&n.texStorage2D(e.TEXTURE_2D,S,g,p.width,p.height),I&&n.texSubImage2D(e.TEXTURE_2D,0,0,0,p.width,p.height,f,m,p.data)):n.texImage2D(e.TEXTURE_2D,0,g,p.width,p.height,0,f,m,p.data);else if(o.isCompressedTexture)if(o.isCompressedArrayTexture){_&&M&&n.texStorage3D(e.TEXTURE_2D_ARRAY,S,g,b[0].width,b[0].height,p.depth);for(let t=0,i=b.length;t<i;t++)if(A=b[t],o.format!==yn)if(null!==f)if(_){if(I)if(o.layerUpdates.size>0){const i=$p(A.width,A.height,o.format,o.type);for(const r of o.layerUpdates){const s=A.data.subarray(r*i/A.data.BYTES_PER_ELEMENT,(r+1)*i/A.data.BYTES_PER_ELEMENT);n.compressedTexSubImage3D(e.TEXTURE_2D_ARRAY,t,0,0,r,A.width,A.height,1,f,s)}o.clearLayerUpdates()}else n.compressedTexSubImage3D(e.TEXTURE_2D_ARRAY,t,0,0,0,A.width,A.height,p.depth,f,A.data)}else n.compressedTexImage3D(e.TEXTURE_2D_ARRAY,t,g,A.width,A.height,p.depth,0,A.data,0,0);else console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()");else _?I&&n.texSubImage3D(e.TEXTURE_2D_ARRAY,t,0,0,0,A.width,A.height,p.depth,f,m,A.data):n.texImage3D(e.TEXTURE_2D_ARRAY,t,g,A.width,A.height,p.depth,0,f,m,A.data)}else{_&&M&&n.texStorage2D(e.TEXTURE_2D,S,g,b[0].width,b[0].height);for(let t=0,i=b.length;t<i;t++)A=b[t],o.format!==yn?null!==f?_?I&&n.compressedTexSubImage2D(e.TEXTURE_2D,t,0,0,A.width,A.height,f,A.data):n.compressedTexImage2D(e.TEXTURE_2D,t,g,A.width,A.height,0,A.data):console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()"):_?I&&n.texSubImage2D(e.TEXTURE_2D,t,0,0,A.width,A.height,f,m,A.data):n.texImage2D(e.TEXTURE_2D,t,g,A.width,A.height,0,f,m,A.data)}else if(o.isDataArrayTexture)if(_){if(M&&n.texStorage3D(e.TEXTURE_2D_ARRAY,S,g,p.width,p.height,p.depth),I)if(o.layerUpdates.size>0){const t=$p(p.width,p.height,o.format,o.type);for(const i of o.layerUpdates){const r=p.data.subarray(i*t/p.data.BYTES_PER_ELEMENT,(i+1)*t/p.data.BYTES_PER_ELEMENT);n.texSubImage3D(e.TEXTURE_2D_ARRAY,0,0,0,i,p.width,p.height,1,f,m,r)}o.clearLayerUpdates()}else n.texSubImage3D(e.TEXTURE_2D_ARRAY,0,0,0,0,p.width,p.height,p.depth,f,m,p.data)}else n.texImage3D(e.TEXTURE_2D_ARRAY,0,g,p.width,p.height,p.depth,0,f,m,p.data);else if(o.isData3DTexture)_?(M&&n.texStorage3D(e.TEXTURE_3D,S,g,p.width,p.height,p.depth),I&&n.texSubImage3D(e.TEXTURE_3D,0,0,0,0,p.width,p.height,p.depth,f,m,p.data)):n.texImage3D(e.TEXTURE_3D,0,g,p.width,p.height,p.depth,0,f,m,p.data);else if(o.isFramebufferTexture){if(M)if(_)n.texStorage2D(e.TEXTURE_2D,S,g,p.width,p.height);else{let t=p.width,i=p.height;for(let r=0;r<S;r++)n.texImage2D(e.TEXTURE_2D,r,g,t,i,0,f,m,null),t>>=1,i>>=1}}else if(b.length>0){if(_&&M){const t=W(b[0]);n.texStorage2D(e.TEXTURE_2D,S,g,t.width,t.height)}for(let t=0,i=b.length;t<i;t++)A=b[t],_?I&&n.texSubImage2D(e.TEXTURE_2D,t,0,0,f,m,A):n.texImage2D(e.TEXTURE_2D,t,g,f,m,A);o.generateMipmaps=!1}else if(_){if(M){const t=W(p);n.texStorage2D(e.TEXTURE_2D,S,g,t.width,t.height)}I&&n.texSubImage2D(e.TEXTURE_2D,0,0,0,f,m,p)}else n.texImage2D(e.TEXTURE_2D,0,g,f,m,p);y(o)&&E(l),u.__version=h.version,o.onUpdate&&o.onUpdate(o)}return t.__version=o.version,!0}function N(t,r,o,l,h,u){const d=s.convert(o.format,o.colorSpace),p=s.convert(o.type),f=x(o.internalFormat,d,p,o.colorSpace),m=i.get(r),A=i.get(o);if(A.__renderTarget=r,!m.__hasExternalTextures){const t=Math.max(1,r.width>>u),i=Math.max(1,r.height>>u);!0===r.isWebGLMultiviewRenderTarget?n.texStorage3D(e.TEXTURE_2D_ARRAY,0,f,r.width,r.height,r.numViews):h===e.TEXTURE_3D||h===e.TEXTURE_2D_ARRAY?n.texImage3D(h,u,f,t,i,r.depth,0,d,p,null):n.texImage2D(h,u,f,t,i,0,d,p,null)}n.bindFramebuffer(e.FRAMEBUFFER,t);const g=V(r);!0===r.isWebGLMultiviewRenderTarget?g?c.framebufferTextureMultisampleMultiviewOVR(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,A.__webglTexture,0,H(r),0,r.numViews):c.framebufferTextureMultiviewOVR(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,A.__webglTexture,0,0,r.numViews):(h===e.TEXTURE_2D||h>=e.TEXTURE_CUBE_MAP_POSITIVE_X&&h<=e.TEXTURE_CUBE_MAP_NEGATIVE_Z)&&(g?a.framebufferTexture2DMultisampleEXT(e.FRAMEBUFFER,l,h,A.__webglTexture,0,H(r)):e.framebufferTexture2D(e.FRAMEBUFFER,l,h,A.__webglTexture,u)),n.bindFramebuffer(e.FRAMEBUFFER,null)}function O(t,n,r){if(e.bindRenderbuffer(e.RENDERBUFFER,t),!0===n.isWebGLMultiviewRenderTarget){const t=V(n),r=n.numViews,s=n.depthTexture;let o=e.DEPTH_COMPONENT24,a=e.DEPTH_ATTACHMENT;s&&s.isDepthTexture&&(s.type===un?o=e.DEPTH_COMPONENT32F:s.type===mn&&(o=e.DEPTH24_STENCIL8,a=e.DEPTH_STENCIL_ATTACHMENT));let l=i.get(n.depthTexture).__webglTexture;void 0===l&&(l=e.createTexture(),e.bindTexture(e.TEXTURE_2D_ARRAY,l),e.texStorage3D(e.TEXTURE_2D_ARRAY,1,o,n.width,n.height,r)),t?c.framebufferTextureMultisampleMultiviewOVR(e.FRAMEBUFFER,a,l,0,H(n),0,r):c.framebufferTextureMultiviewOVR(e.FRAMEBUFFER,a,l,0,0,r)}else if(n.depthBuffer){const i=n.depthTexture,s=i&&i.isDepthTexture?i.type:null,o=C(n.stencilBuffer,s),l=n.stencilBuffer?e.DEPTH_STENCIL_ATTACHMENT:e.DEPTH_ATTACHMENT,c=H(n);V(n)?a.renderbufferStorageMultisampleEXT(e.RENDERBUFFER,c,o,n.width,n.height):r?e.renderbufferStorageMultisample(e.RENDERBUFFER,c,o,n.width,n.height):e.renderbufferStorage(e.RENDERBUFFER,o,n.width,n.height),e.framebufferRenderbuffer(e.FRAMEBUFFER,l,e.RENDERBUFFER,t)}else{const t=n.textures;for(let i=0;i<t.length;i++){const o=t[i],l=s.convert(o.format,o.colorSpace),c=s.convert(o.type),h=x(o.internalFormat,l,c,o.colorSpace),u=H(n);r&&!1===V(n)?e.renderbufferStorageMultisample(e.RENDERBUFFER,u,h,n.width,n.height):V(n)?a.renderbufferStorageMultisampleEXT(e.RENDERBUFFER,u,h,n.width,n.height):e.renderbufferStorage(e.RENDERBUFFER,h,n.width,n.height)}}e.bindRenderbuffer(e.RENDERBUFFER,null)}function F(t,r){if(r&&r.isWebGLCubeRenderTarget)throw new Error("Depth Texture with cube render targets is not supported");if(n.bindFramebuffer(e.FRAMEBUFFER,t),!r.depthTexture||!r.depthTexture.isDepthTexture)throw new Error("renderTarget.depthTexture must be an instance of THREE.DepthTexture");const s=i.get(r.depthTexture);s.__renderTarget=r,s.__webglTexture&&r.depthTexture.image.width===r.width&&r.depthTexture.image.height===r.height||(r.depthTexture.image.width=r.width,r.depthTexture.image.height=r.height,r.depthTexture.needsUpdate=!0),1!=r.depthTexture.image.depth?B(r.depthTexture,0):T(r.depthTexture,0);const o=s.__webglTexture,l=H(r);if(!0===r.isWebGLMultiviewRenderTarget){const t=V(r),n=r.numViews;if(r.depthTexture.format===xn)t?c.framebufferTextureMultisampleMultiviewOVR(e.FRAMEBUFFER,e.DEPTH_ATTACHMENT,o,0,l,0,n):c.framebufferTextureMultiviewOVR(e.FRAMEBUFFER,e.DEPTH_ATTACHMENT,o,0,0,n);else{if(r.depthTexture.format!==Cn)throw new Error("Unknown depthTexture format");t?c.framebufferTextureMultisampleMultiviewOVR(e.FRAMEBUFFER,e.DEPTH_STENCIL_ATTACHMENT,o,0,l,0,n):c.framebufferTextureMultiviewOVR(e.FRAMEBUFFER,e.DEPTH_STENCIL_ATTACHMENT,o,0,0,n)}}else if(r.depthTexture.format===xn)V(r)?a.framebufferTexture2DMultisampleEXT(e.FRAMEBUFFER,e.DEPTH_ATTACHMENT,e.TEXTURE_2D,o,0,l):e.framebufferTexture2D(e.FRAMEBUFFER,e.DEPTH_ATTACHMENT,e.TEXTURE_2D,o,0);else{if(r.depthTexture.format!==Cn)throw new Error("Unknown depthTexture format");V(r)?a.framebufferTexture2DMultisampleEXT(e.FRAMEBUFFER,e.DEPTH_STENCIL_ATTACHMENT,e.TEXTURE_2D,o,0,l):e.framebufferTexture2D(e.FRAMEBUFFER,e.DEPTH_STENCIL_ATTACHMENT,e.TEXTURE_2D,o,0)}}function Q(t){const r=i.get(t),s=!0===t.isWebGLCubeRenderTarget;if(r.__boundDepthTexture!==t.depthTexture){const e=t.depthTexture;if(r.__depthDisposeCallback&&r.__depthDisposeCallback(),e){const t=()=>{delete r.__boundDepthTexture,delete r.__depthDisposeCallback,e.removeEventListener("dispose",t)};e.addEventListener("dispose",t),r.__depthDisposeCallback=t}r.__boundDepthTexture=e}if(t.depthTexture&&!r.__autoAllocateDepthBuffer){if(s)throw new Error("target.depthTexture not supported in Cube render targets");F(r.__webglFramebuffer,t)}else if(s){r.__webglDepthbuffer=[];for(let i=0;i<6;i++)if(n.bindFramebuffer(e.FRAMEBUFFER,r.__webglFramebuffer[i]),void 0===r.__webglDepthbuffer[i])r.__webglDepthbuffer[i]=e.createRenderbuffer(),O(r.__webglDepthbuffer[i],t,!1);else{const n=t.stencilBuffer?e.DEPTH_STENCIL_ATTACHMENT:e.DEPTH_ATTACHMENT,s=r.__webglDepthbuffer[i];e.bindRenderbuffer(e.RENDERBUFFER,s),e.framebufferRenderbuffer(e.FRAMEBUFFER,n,e.RENDERBUFFER,s)}}else if(n.bindFramebuffer(e.FRAMEBUFFER,r.__webglFramebuffer),void 0===r.__webglDepthbuffer)r.__webglDepthbuffer=e.createRenderbuffer(),O(r.__webglDepthbuffer,t,!1);else{const n=t.stencilBuffer?e.DEPTH_STENCIL_ATTACHMENT:e.DEPTH_ATTACHMENT,i=r.__webglDepthbuffer;e.bindRenderbuffer(e.RENDERBUFFER,i),e.framebufferRenderbuffer(e.FRAMEBUFFER,n,e.RENDERBUFFER,i)}n.bindFramebuffer(e.FRAMEBUFFER,null)}const z=[],G=[];function H(e){return Math.min(r.maxSamples,e.samples)}function V(e){const n=i.get(e);return e.samples>0&&!0===t.has("WEBGL_multisampled_render_to_texture")&&!1!==n.__useRenderToTexture}function j(e,t){const n=e.colorSpace,i=e.format,r=e.type;return!0===e.isCompressedTexture||!0===e.isVideoTexture||n!==Bi&&n!==Si&&(Gr.getTransfer(n)===Li?i===yn&&r===sn||console.warn("THREE.WebGLTextures: sRGB encoded textures have to use RGBAFormat and UnsignedByteType."):console.error("THREE.WebGLTextures: Unsupported texture color space:",n)),t}function W(e){return"undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement?(h.width=e.naturalWidth||e.width,h.height=e.naturalHeight||e.height):"undefined"!=typeof VideoFrame&&e instanceof VideoFrame?(h.width=e.displayWidth,h.height=e.displayHeight):(h.width=e.width,h.height=e.height),h}this.allocateTextureUnit=function(){const e=S;return e>=r.maxTextures&&console.warn("THREE.WebGLTextures: Trying to use "+e+" texture units while this GPU supports only "+r.maxTextures),S+=1,e},this.resetTextureUnits=function(){S=0},this.setTexture2D=T,this.setTexture2DArray=B,this.setTexture3D=function(t,r){const s=i.get(t);t.version>0&&s.__version!==t.version?k(s,t,r):n.bindTexture(e.TEXTURE_3D,s.__webglTexture,e.TEXTURE0+r)},this.setTextureCube=function(t,o){const a=i.get(t);t.version>0&&a.__version!==t.version?function(t,o,a){if(6!==o.image.length)return;const l=U(t,o),c=o.source;n.bindTexture(e.TEXTURE_CUBE_MAP,t.__webglTexture,e.TEXTURE0+a);const h=i.get(c);if(c.version!==h.__version||!0===l){n.activeTexture(e.TEXTURE0+a);const t=Gr.getPrimaries(Gr.workingColorSpace),i=o.colorSpace===Si?null:Gr.getPrimaries(o.colorSpace),u=o.colorSpace===Si||t===i?e.NONE:e.BROWSER_DEFAULT_WEBGL;e.pixelStorei(e.UNPACK_FLIP_Y_WEBGL,o.flipY),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,o.premultiplyAlpha),e.pixelStorei(e.UNPACK_ALIGNMENT,o.unpackAlignment),e.pixelStorei(e.UNPACK_COLORSPACE_CONVERSION_WEBGL,u);const d=o.isCompressedTexture||o.image[0].isCompressedTexture,p=o.image[0]&&o.image[0].isDataTexture,f=[];for(let e=0;e<6;e++)f[e]=d||p?p?o.image[e].image:o.image[e]:v(o.image[e],!0,r.maxCubemapSize),f[e]=j(o,f[e]);const m=f[0],A=s.convert(o.format,o.colorSpace),g=s.convert(o.type),b=x(o.internalFormat,A,g,o.colorSpace),C=!0!==o.isVideoTexture,_=void 0===h.__version||!0===l,M=c.dataReady;let I,S=w(o,m);if(P(e.TEXTURE_CUBE_MAP,o),d){C&&_&&n.texStorage2D(e.TEXTURE_CUBE_MAP,S,b,m.width,m.height);for(let t=0;t<6;t++){I=f[t].mipmaps;for(let i=0;i<I.length;i++){const r=I[i];o.format!==yn?null!==A?C?M&&n.compressedTexSubImage2D(e.TEXTURE_CUBE_MAP_POSITIVE_X+t,i,0,0,r.width,r.height,A,r.data):n.compressedTexImage2D(e.TEXTURE_CUBE_MAP_POSITIVE_X+t,i,b,r.width,r.height,0,r.data):console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()"):C?M&&n.texSubImage2D(e.TEXTURE_CUBE_MAP_POSITIVE_X+t,i,0,0,r.width,r.height,A,g,r.data):n.texImage2D(e.TEXTURE_CUBE_MAP_POSITIVE_X+t,i,b,r.width,r.height,0,A,g,r.data)}}}else{if(I=o.mipmaps,C&&_){I.length>0&&S++;const t=W(f[0]);n.texStorage2D(e.TEXTURE_CUBE_MAP,S,b,t.width,t.height)}for(let t=0;t<6;t++)if(p){C?M&&n.texSubImage2D(e.TEXTURE_CUBE_MAP_POSITIVE_X+t,0,0,0,f[t].width,f[t].height,A,g,f[t].data):n.texImage2D(e.TEXTURE_CUBE_MAP_POSITIVE_X+t,0,b,f[t].width,f[t].height,0,A,g,f[t].data);for(let i=0;i<I.length;i++){const r=I[i].image[t].image;C?M&&n.texSubImage2D(e.TEXTURE_CUBE_MAP_POSITIVE_X+t,i+1,0,0,r.width,r.height,A,g,r.data):n.texImage2D(e.TEXTURE_CUBE_MAP_POSITIVE_X+t,i+1,b,r.width,r.height,0,A,g,r.data)}}else{C?M&&n.texSubImage2D(e.TEXTURE_CUBE_MAP_POSITIVE_X+t,0,0,0,A,g,f[t]):n.texImage2D(e.TEXTURE_CUBE_MAP_POSITIVE_X+t,0,b,A,g,f[t]);for(let i=0;i<I.length;i++){const r=I[i];C?M&&n.texSubImage2D(e.TEXTURE_CUBE_MAP_POSITIVE_X+t,i+1,0,0,A,g,r.image[t]):n.texImage2D(e.TEXTURE_CUBE_MAP_POSITIVE_X+t,i+1,b,A,g,r.image[t])}}}y(o)&&E(e.TEXTURE_CUBE_MAP),h.__version=c.version,o.onUpdate&&o.onUpdate(o)}t.__version=o.version}(a,t,o):n.bindTexture(e.TEXTURE_CUBE_MAP,a.__webglTexture,e.TEXTURE0+o)},this.rebindTextures=function(t,n,r){const s=i.get(t);void 0!==n&&N(s.__webglFramebuffer,t,t.texture,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,0),void 0!==r&&Q(t)},this.uploadTexture=k,this.setupRenderTarget=function(t){const r=t.texture,a=i.get(t),l=i.get(r);t.addEventListener("dispose",M);const c=t.textures,h=!0===t.isWebGLCubeRenderTarget,u=c.length>1;if(u||(void 0===l.__webglTexture&&(l.__webglTexture=e.createTexture()),l.__version=r.version,o.memory.textures++),h){a.__webglFramebuffer=[];for(let t=0;t<6;t++)if(r.mipmaps&&r.mipmaps.length>0){a.__webglFramebuffer[t]=[];for(let n=0;n<r.mipmaps.length;n++)a.__webglFramebuffer[t][n]=e.createFramebuffer()}else a.__webglFramebuffer[t]=e.createFramebuffer()}else{if(r.mipmaps&&r.mipmaps.length>0){a.__webglFramebuffer=[];for(let t=0;t<r.mipmaps.length;t++)a.__webglFramebuffer[t]=e.createFramebuffer()}else a.__webglFramebuffer=e.createFramebuffer();if(u)for(let t=0,n=c.length;t<n;t++){const n=i.get(c[t]);void 0===n.__webglTexture&&(n.__webglTexture=e.createTexture(),o.memory.textures++)}if(t.samples>0&&!1===V(t)){a.__webglMultisampledFramebuffer=e.createFramebuffer(),a.__webglColorRenderbuffer=[],n.bindFramebuffer(e.FRAMEBUFFER,a.__webglMultisampledFramebuffer);for(let n=0;n<c.length;n++){const i=c[n];a.__webglColorRenderbuffer[n]=e.createRenderbuffer(),e.bindRenderbuffer(e.RENDERBUFFER,a.__webglColorRenderbuffer[n]);const r=s.convert(i.format,i.colorSpace),o=s.convert(i.type),l=x(i.internalFormat,r,o,i.colorSpace,!0===t.isXRRenderTarget),h=H(t);e.renderbufferStorageMultisample(e.RENDERBUFFER,h,l,t.width,t.height),e.framebufferRenderbuffer(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0+n,e.RENDERBUFFER,a.__webglColorRenderbuffer[n])}e.bindRenderbuffer(e.RENDERBUFFER,null),t.depthBuffer&&(a.__webglDepthRenderbuffer=e.createRenderbuffer(),O(a.__webglDepthRenderbuffer,t,!0)),n.bindFramebuffer(e.FRAMEBUFFER,null)}}if(h){n.bindTexture(e.TEXTURE_CUBE_MAP,l.__webglTexture),P(e.TEXTURE_CUBE_MAP,r);for(let n=0;n<6;n++)if(r.mipmaps&&r.mipmaps.length>0)for(let i=0;i<r.mipmaps.length;i++)N(a.__webglFramebuffer[n][i],t,r,e.COLOR_ATTACHMENT0,e.TEXTURE_CUBE_MAP_POSITIVE_X+n,i);else N(a.__webglFramebuffer[n],t,r,e.COLOR_ATTACHMENT0,e.TEXTURE_CUBE_MAP_POSITIVE_X+n,0);y(r)&&E(e.TEXTURE_CUBE_MAP),n.unbindTexture()}else if(u){for(let r=0,s=c.length;r<s;r++){const s=c[r],o=i.get(s);n.bindTexture(e.TEXTURE_2D,o.__webglTexture),P(e.TEXTURE_2D,s),N(a.__webglFramebuffer,t,s,e.COLOR_ATTACHMENT0+r,e.TEXTURE_2D,0),y(s)&&E(e.TEXTURE_2D)}n.unbindTexture()}else{let i=e.TEXTURE_2D;if((t.isWebGL3DRenderTarget||t.isWebGLArrayRenderTarget)&&(i=t.isWebGL3DRenderTarget?e.TEXTURE_3D:e.TEXTURE_2D_ARRAY),!0===t.isWebGLMultiviewRenderTarget&&(i=e.TEXTURE_2D_ARRAY),n.bindTexture(i,l.__webglTexture),P(i,r),r.mipmaps&&r.mipmaps.length>0)for(let n=0;n<r.mipmaps.length;n++)N(a.__webglFramebuffer[n],t,r,e.COLOR_ATTACHMENT0,i,n);else N(a.__webglFramebuffer,t,r,e.COLOR_ATTACHMENT0,i,0);y(r)&&E(i),n.unbindTexture()}(t.depthBuffer||!0===t.isWebGLMultiviewRenderTarget)&&this.setupDepthRenderbuffer(t)},this.updateRenderTargetMipmap=function(e){const t=e.textures;for(let r=0,s=t.length;r<s;r++){const s=t[r];if(y(s)){const t=b(e),r=i.get(s).__webglTexture;n.bindTexture(t,r),E(t),n.unbindTexture()}}},this.updateMultisampleRenderTarget=function(t){if(t.samples>0)if(!1===V(t)){const r=t.textures,s=t.width,o=t.height;let a=e.COLOR_BUFFER_BIT;const c=t.stencilBuffer?e.DEPTH_STENCIL_ATTACHMENT:e.DEPTH_ATTACHMENT,h=i.get(t),u=r.length>1;if(u)for(let t=0;t<r.length;t++)n.bindFramebuffer(e.FRAMEBUFFER,h.__webglMultisampledFramebuffer),e.framebufferRenderbuffer(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0+t,e.RENDERBUFFER,null),n.bindFramebuffer(e.FRAMEBUFFER,h.__webglFramebuffer),e.framebufferTexture2D(e.DRAW_FRAMEBUFFER,e.COLOR_ATTACHMENT0+t,e.TEXTURE_2D,null,0);n.bindFramebuffer(e.READ_FRAMEBUFFER,h.__webglMultisampledFramebuffer),n.bindFramebuffer(e.DRAW_FRAMEBUFFER,h.__webglFramebuffer);for(let n=0;n<r.length;n++){if(t.resolveDepthBuffer&&(t.depthBuffer&&(a|=e.DEPTH_BUFFER_BIT),t.stencilBuffer&&t.resolveStencilBuffer&&(a|=e.STENCIL_BUFFER_BIT)),u){e.framebufferRenderbuffer(e.READ_FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.RENDERBUFFER,h.__webglColorRenderbuffer[n]);const t=i.get(r[n]).__webglTexture;e.framebufferTexture2D(e.DRAW_FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,t,0)}e.blitFramebuffer(0,0,s,o,0,0,s,o,a,e.NEAREST),!0===l&&(z.length=0,G.length=0,z.push(e.COLOR_ATTACHMENT0+n),t.depthBuffer&&!1===t.resolveDepthBuffer&&(z.push(c),G.push(c),e.invalidateFramebuffer(e.DRAW_FRAMEBUFFER,G)),e.invalidateFramebuffer(e.READ_FRAMEBUFFER,z))}if(n.bindFramebuffer(e.READ_FRAMEBUFFER,null),n.bindFramebuffer(e.DRAW_FRAMEBUFFER,null),u)for(let t=0;t<r.length;t++){n.bindFramebuffer(e.FRAMEBUFFER,h.__webglMultisampledFramebuffer),e.framebufferRenderbuffer(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0+t,e.RENDERBUFFER,h.__webglColorRenderbuffer[t]);const s=i.get(r[t]).__webglTexture;n.bindFramebuffer(e.FRAMEBUFFER,h.__webglFramebuffer),e.framebufferTexture2D(e.DRAW_FRAMEBUFFER,e.COLOR_ATTACHMENT0+t,e.TEXTURE_2D,s,0)}n.bindFramebuffer(e.DRAW_FRAMEBUFFER,h.__webglMultisampledFramebuffer)}else if(t.depthBuffer&&!1===t.resolveDepthBuffer&&l){const n=t.stencilBuffer?e.DEPTH_STENCIL_ATTACHMENT:e.DEPTH_ATTACHMENT;e.invalidateFramebuffer(e.DRAW_FRAMEBUFFER,[n])}},this.setupDepthTexture=F,this.setupDepthRenderbuffer=Q,this.setupFrameBufferTexture=N,this.useMultisampledRTT=V,this.runDeferredUploads=function(){const e=m;m=!1;for(const e of f)k(e.textureProperties,e.texture,e.slot),e.texture.isPendingDeferredUpload=!1;f=[],m=e},this.setDeferTextureUploads=function(e){m=e}}function SA(e,t){return{convert:function(n,i=Si){let r;const s=Gr.getTransfer(i);if(n===sn)return e.UNSIGNED_BYTE;if(n===pn)return e.UNSIGNED_SHORT_4_4_4_4;if(n===fn)return e.UNSIGNED_SHORT_5_5_5_1;if(n===An)return e.UNSIGNED_INT_5_9_9_9_REV;if(n===on)return e.BYTE;if(n===an)return e.SHORT;if(n===ln)return e.UNSIGNED_SHORT;if(n===cn)return e.INT;if(n===hn)return e.UNSIGNED_INT;if(n===un)return e.FLOAT;if(n===dn)return e.HALF_FLOAT;if(n===gn)return e.ALPHA;if(n===vn)return e.RGB;if(n===yn)return e.RGBA;if(n===En)return e.LUMINANCE;if(n===bn)return e.LUMINANCE_ALPHA;if(n===xn)return e.DEPTH_COMPONENT;if(n===Cn)return e.DEPTH_STENCIL;if(n===wn)return e.RED;if(n===_n)return e.RED_INTEGER;if(n===Mn)return e.RG;if(n===In)return e.RG_INTEGER;if(n===Tn)return e.RGBA_INTEGER;if(n===Bn||n===Rn||n===Ln||n===Dn)if(s===Li){if(r=t.get("WEBGL_compressed_texture_s3tc_srgb"),null===r)return null;if(n===Bn)return r.COMPRESSED_SRGB_S3TC_DXT1_EXT;if(n===Rn)return r.COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT;if(n===Ln)return r.COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT;if(n===Dn)return r.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT}else{if(r=t.get("WEBGL_compressed_texture_s3tc"),null===r)return null;if(n===Bn)return r.COMPRESSED_RGB_S3TC_DXT1_EXT;if(n===Rn)return r.COMPRESSED_RGBA_S3TC_DXT1_EXT;if(n===Ln)return r.COMPRESSED_RGBA_S3TC_DXT3_EXT;if(n===Dn)return r.COMPRESSED_RGBA_S3TC_DXT5_EXT}if(n===Pn||n===Un||n===kn||n===Nn){if(r=t.get("WEBGL_compressed_texture_pvrtc"),null===r)return null;if(n===Pn)return r.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;if(n===Un)return r.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;if(n===kn)return r.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;if(n===Nn)return r.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG}if(n===On||n===Fn||n===Qn){if(r=t.get("WEBGL_compressed_texture_etc"),null===r)return null;if(n===On||n===Fn)return s===Li?r.COMPRESSED_SRGB8_ETC2:r.COMPRESSED_RGB8_ETC2;if(n===Qn)return s===Li?r.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:r.COMPRESSED_RGBA8_ETC2_EAC}if(n===zn||n===Gn||n===Hn||n===Vn||n===jn||n===Wn||n===qn||n===Xn||n===Yn||n===Jn||n===Kn||n===Zn||n===$n||n===ei){if(r=t.get("WEBGL_compressed_texture_astc"),null===r)return null;if(n===zn)return s===Li?r.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR:r.COMPRESSED_RGBA_ASTC_4x4_KHR;if(n===Gn)return s===Li?r.COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR:r.COMPRESSED_RGBA_ASTC_5x4_KHR;if(n===Hn)return s===Li?r.COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR:r.COMPRESSED_RGBA_ASTC_5x5_KHR;if(n===Vn)return s===Li?r.COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR:r.COMPRESSED_RGBA_ASTC_6x5_KHR;if(n===jn)return s===Li?r.COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR:r.COMPRESSED_RGBA_ASTC_6x6_KHR;if(n===Wn)return s===Li?r.COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR:r.COMPRESSED_RGBA_ASTC_8x5_KHR;if(n===qn)return s===Li?r.COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR:r.COMPRESSED_RGBA_ASTC_8x6_KHR;if(n===Xn)return s===Li?r.COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR:r.COMPRESSED_RGBA_ASTC_8x8_KHR;if(n===Yn)return s===Li?r.COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR:r.COMPRESSED_RGBA_ASTC_10x5_KHR;if(n===Jn)return s===Li?r.COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR:r.COMPRESSED_RGBA_ASTC_10x6_KHR;if(n===Kn)return s===Li?r.COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR:r.COMPRESSED_RGBA_ASTC_10x8_KHR;if(n===Zn)return s===Li?r.COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR:r.COMPRESSED_RGBA_ASTC_10x10_KHR;if(n===$n)return s===Li?r.COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR:r.COMPRESSED_RGBA_ASTC_12x10_KHR;if(n===ei)return s===Li?r.COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR:r.COMPRESSED_RGBA_ASTC_12x12_KHR}if(n===ti||n===ni||n===ii){if(r=t.get("EXT_texture_compression_bptc"),null===r)return null;if(n===ti)return s===Li?r.COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT:r.COMPRESSED_RGBA_BPTC_UNORM_EXT;if(n===ni)return r.COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT;if(n===ii)return r.COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT}if(n===ri||n===si||n===oi||n===ai){if(r=t.get("EXT_texture_compression_rgtc"),null===r)return null;if(n===ti)return r.COMPRESSED_RED_RGTC1_EXT;if(n===si)return r.COMPRESSED_SIGNED_RED_RGTC1_EXT;if(n===oi)return r.COMPRESSED_RED_GREEN_RGTC2_EXT;if(n===ai)return r.COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT}return n===mn?e.UNSIGNED_INT_24_8:void 0!==e[n]?e[n]:null}}}class TA extends es{constructor(e,t,n,i={}){super(e,t,i),this.depthBuffer=!1,this.stencilBuffer=!1,this.numViews=n}copy(e){return super.copy(e),this.numViews=e.numViews,this}}TA.prototype.isWebGLMultiviewRenderTarget=!0;class BA{constructor(){this.texture=null,this.mesh=null,this.depthNear=0,this.depthFar=0}init(e,t,n){if(null===this.texture){const i=new Kr;e.properties.get(i).__webglTexture=t.texture,t.depthNear===n.depthNear&&t.depthFar===n.depthFar||(this.depthNear=t.depthNear,this.depthFar=t.depthFar),this.texture=i}}getMesh(e){if(null!==this.texture&&null===this.mesh){const t=e.cameras[0].viewport,n=new wa({vertexShader:"\nvoid main() {\n\n\tgl_Position = vec4( position, 1.0 );\n\n}",fragmentShader:"\nuniform sampler2DArray depthColor;\nuniform float depthWidth;\nuniform float depthHeight;\n\nvoid main() {\n\n\tvec2 coord = vec2( gl_FragCoord.x / depthWidth, gl_FragCoord.y / depthHeight );\n\n\tif ( coord.x >= 1.0 ) {\n\n\t\tgl_FragDepth = texture( depthColor, vec3( coord.x - 1.0, coord.y, 1 ) ).r;\n\n\t} else {\n\n\t\tgl_FragDepth = texture( depthColor, vec3( coord.x, coord.y, 0 ) ).r;\n\n\t}\n\n}",uniforms:{depthColor:{value:this.texture},depthWidth:{value:t.z},depthHeight:{value:t.w}}});this.mesh=new ga(new Vh(20,20),n)}return this.mesh}reset(){this.texture=null,this.mesh=null}getDepthTexture(){return this.texture}}class RA extends gr{constructor(e,t,n,i){super();const r=this;let s=null,o=1;var a=null;let l=null,c="local-floor",h=1,u=null,d=null;var p=[];let f=null,m=null,A=null,g=null;const v=new BA,y=t.getContextAttributes();let E=null,b=null;const x=[],C=[],w=new Tr;let _=null;const M=new Ta;M.viewport=new Zr;const I=new Ta;I.viewport=new Zr;const S=[M,I],T=new Sd;let B=null,R=null;function L(e){const t=C.indexOf(e.inputSource);if(-1===t)return;const n=x[t];void 0!==n&&(n.update(e.inputSource,e.frame,u||l),n.dispatchEvent({type:e.type,data:e.inputSource}))}function D(){s.removeEventListener("select",L),s.removeEventListener("selectstart",L),s.removeEventListener("selectend",L),s.removeEventListener("squeeze",L),s.removeEventListener("squeezestart",L),s.removeEventListener("squeezeend",L),s.removeEventListener("end",D),s.removeEventListener("inputsourceschange",P);for(let e=0;e<x.length;e++){const t=C[e];null!==t&&(C[e]=null,x[e].disconnect(t))}B=null,R=null,v.reset(),e.setRenderTarget(E),A=null,m=null,f=null,s=null,b=null,F.stop(),r.isPresenting=!1,e.setPixelRatio(_),e.setSize(w.width,w.height,!1),r.dispatchEvent({type:"sessionend"})}function P(e){for(let t=0;t<e.removed.length;t++){const n=e.removed[t],i=C.indexOf(n);i>=0&&(C[i]=null,x[i].disconnect(n))}for(let t=0;t<e.added.length;t++){const n=e.added[t];let i=C.indexOf(n);if(-1===i){for(let e=0;e<x.length;e++){if(e>=C.length){C.push(n),i=e;break}if(null===C[e]){C[e]=n,i=e;break}}if(-1===i)break}const r=x[i];r&&r.connect(n)}}this.cameraAutoUpdate=!0,this.layersEnabled=!1,this.enabled=!1,this.isPresenting=!1,this.isMultiview=!1,this.getCameraPose=function(){return d},this.getController=function(e){let t=x[e];return void 0===t&&(t=new ka,x[e]=t),t.getTargetRaySpace()},this.getControllerGrip=function(e){let t=x[e];return void 0===t&&(t=new ka,x[e]=t),t.getGripSpace()},this.getHand=function(e){let t=x[e];return void 0===t&&(t=new ka,x[e]=t),t.getHandSpace()},this.setFramebufferScaleFactor=function(e){o=e,!0===r.isPresenting&&console.warn("THREE.WebXRManager: Cannot change framebuffer scale while presenting.")},this.setReferenceSpaceType=function(e){c=e,!0===r.isPresenting&&console.warn("THREE.WebXRManager: Cannot change reference space type while presenting.")},this.getReferenceSpace=function(){return u||l},this.setReferenceSpace=function(e){u=e},this.getBaseLayer=function(){return null!==m?m:A},this.getBinding=function(){return f},this.getRenderTarget=function(){return b},this.getFrame=function(){return g},this.getSession=function(){return s},this.setSession=async function(a){if(s=a,null!==s){if(E=e.getRenderTarget(),s.addEventListener("select",L),s.addEventListener("selectstart",L),s.addEventListener("selectend",L),s.addEventListener("squeeze",L),s.addEventListener("squeezestart",L),s.addEventListener("squeezeend",L),s.addEventListener("end",D),s.addEventListener("inputsourceschange",P),!0!==y.xrCompatible&&await t.makeXRCompatible(),_=e.getPixelRatio(),e.getSize(w),"undefined"!=typeof XRWebGLBinding&&"createProjectionLayer"in XRWebGLBinding.prototype){let a=null,l=null,c=null;y.depth&&(c=y.stencil?t.DEPTH24_STENCIL8:t.DEPTH_COMPONENT24,a=y.stencil?Cn:xn,l=y.stencil?mn:hn),r.isMultiview=i&&n.has("OCULUS_multiview");const h={colorFormat:t.RGBA8,depthFormat:c,scaleFactor:o};r.isMultiview&&(h.textureType="texture-array"),f=new XRWebGLBinding(s,t),m=f.createProjectionLayer(h),s.updateRenderState({layers:[m]}),e.setPixelRatio(1),e.setSize(m.textureWidth,m.textureHeight,!1);const u={format:yn,type:sn,depthTexture:new Rc(m.textureWidth,m.textureHeight,l,void 0,void 0,void 0,void 0,void 0,void 0,a),stencilBuffer:y.stencil,colorSpace:e.outputColorSpace,samples:y.antialias?4:0,resolveDepthBuffer:!1===m.ignoreDepthValues};if(r.isMultiview){const e=n.get("OCULUS_multiview");this.maxNumViews=t.getParameter(e.MAX_VIEWS_OVR),b=new TA(m.textureWidth,m.textureHeight,2,u)}else b=new es(m.textureWidth,m.textureHeight,u)}else{const n={antialias:y.antialias,alpha:!0,depth:y.depth,stencil:y.stencil,framebufferScaleFactor:o};A=new XRWebGLLayer(s,t,n),s.updateRenderState({baseLayer:A}),e.setPixelRatio(1),e.setSize(A.framebufferWidth,A.framebufferHeight,!1),b=new es(A.framebufferWidth,A.framebufferHeight,{format:yn,type:sn,colorSpace:e.outputColorSpace,stencilBuffer:y.stencil})}b.isXRRenderTarget=!0,this.setFoveation(h),u=null,l=await s.requestReferenceSpace(c),F.setContext(s),F.start(),r.isPresenting=!0,r.dispatchEvent({type:"sessionstart"})}},this.getEnvironmentBlendMode=function(){if(null!==s)return s.environmentBlendMode},this.addLayer=function(e){window.XRWebGLBinding&&this.layersEnabled&&s&&(p.push(e),this.updateLayers())},this.removeLayer=function(e){p.splice(p.indexOf(e),1),window.XRWebGLBinding&&this.layersEnabled&&s&&this.updateLayers()},this.updateLayers=function(){var e=p.map((function(e){return e}));e.unshift(s.renderState.layers[0]),s.updateRenderState({layers:e})},this.getDepthTexture=function(){return v.getDepthTexture()};const U=new os,k=new os;function N(e,t){null===t?e.matrixWorld.copy(e.matrix):e.matrixWorld.multiplyMatrices(t.matrixWorld,e.matrix),e.matrixWorldInverse.copy(e.matrixWorld).invert()}this.setPoseTarget=function(e){void 0!==e&&(a=e)},this.updateCamera=function(e){if(null===s)return;let t=e.near,n=e.far;null!==v.texture&&(v.depthNear>0&&(t=v.depthNear),v.depthFar>0&&(n=v.depthFar)),T.near=I.near=M.near=t,T.far=I.far=M.far=n,B===T.near&&R===T.far||(s.updateRenderState({depthNear:T.near,depthFar:T.far}),B=T.near,R=T.far),M.layers.mask=2|e.layers.mask,I.layers.mask=4|e.layers.mask,T.layers.mask=M.layers.mask|I.layers.mask;const i=T.cameras;var r=a||e;const o=r.parent;N(T,o);for(let e=0;e<i.length;e++)N(i[e],o);2===i.length?function(e,t,n){U.setFromMatrixPosition(t.matrixWorld),k.setFromMatrixPosition(n.matrixWorld);const i=U.distanceTo(k),r=t.projectionMatrix.elements,s=n.projectionMatrix.elements,o=r[14]/(r[10]-1),a=r[14]/(r[10]+1),l=(r[9]+1)/r[5],c=(r[9]-1)/r[5],h=(r[8]-1)/r[0],u=(s[8]+1)/s[0],d=o*h,p=o*u,f=i/(-h+u),m=f*-h;if(t.matrixWorld.decompose(e.position,e.quaternion,e.scale),e.translateX(m),e.translateZ(f),e.matrixWorld.compose(e.position,e.quaternion,e.scale),e.matrixWorldInverse.copy(e.matrixWorld).invert(),-1===r[10])e.projectionMatrix.copy(t.projectionMatrix),e.projectionMatrixInverse.copy(t.projectionMatrixInverse);else{const t=o+f,n=a+f,r=d-m,s=p+(i-m),h=l*a/n*t,u=c*a/n*t;e.projectionMatrix.makePerspective(r,s,h,u,t,n),e.projectionMatrixInverse.copy(e.projectionMatrix).invert()}}(T,M,I):T.projectionMatrix.copy(M.projectionMatrix),function(e,t,n){t.matrixWorld.decompose(t.position,t.quaternion,t.scale),null===n.parent?n.matrix.copy(t.matrixWorld):(n.matrix.copy(n.parent.matrixWorld),n.matrix.invert(),n.matrix.multiply(t.matrixWorld)),n.matrix.decompose(n.position,n.quaternion,n.scale),n.updateMatrixWorld(!0),e.projectionMatrix.copy(t.projectionMatrix),e.projectionMatrixInverse.copy(t.projectionMatrixInverse),e.isPerspectiveCamera&&(e.fov=2*br*Math.atan(1/e.projectionMatrix.elements[5]),e.zoom=1)}(e,T,r)},this.getCamera=function(){return T},this.getFoveation=function(){if(null!==m||null!==A)return h},this.setFoveation=function(e){h=e,null!==m&&(m.fixedFoveation=e),null!==A&&void 0!==A.fixedFoveation&&(A.fixedFoveation=e)},this.hasDepthSensing=function(){return null!==v.texture},this.getDepthSensingMesh=function(){return v.getMesh(T)};let O=null;const F=new tf;F.setAnimationLoop((function(t,n){if(d=n.getViewerPose(u||l),g=n,null!==d){const t=d.views;null!==A&&(e.setRenderTargetFramebuffer(b,A.framebuffer),e.setRenderTarget(b));let n=!1;t.length!==T.cameras.length&&(T.cameras.length=0,n=!0);for(let i=0;i<t.length;i++){const r=t[i];let s=null;if(null!==A)s=A.getViewport(r);else{const t=f.getViewSubImage(m,r);s=t.viewport,0===i&&(e.setRenderTargetTextures(b,t.colorTexture,m.ignoreDepthValues?void 0:t.depthStencilTexture),e.setRenderTarget(b))}let o=S[i];void 0===o&&(o=new Ta,o.layers.enable(i),o.viewport=new Zr,S[i]=o),o.matrix.fromArray(r.transform.matrix),o.matrix.decompose(o.position,o.quaternion,o.scale),o.projectionMatrix.fromArray(r.projectionMatrix),o.projectionMatrixInverse.copy(o.projectionMatrix).invert(),o.viewport.set(s.x,s.y,s.width,s.height),0===i&&(T.matrix.copy(o.matrix),T.matrix.decompose(T.position,T.quaternion,T.scale)),!0===n&&T.cameras.push(o)}const i=s.enabledFeatures;if(i&&i.includes("depth-sensing")&&"gpu-optimized"==s.depthUsage&&f){const n=f.getDepthInformation(t[0]);n&&n.isValid&&n.texture&&v.init(e,n,s.renderState)}}for(let e=0;e<x.length;e++){const t=C[e],i=x[e];null!==t&&void 0!==i&&i.update(t,n,u||l)}O&&O(t,n),n.detectedPlanes&&r.dispatchEvent({type:"planesdetected",data:n}),g=null})),this.setAnimationLoop=function(e){O=e},this.dispose=function(){}}}const LA=new Ws,DA=new ks;function PA(e,t){function n(e,t){!0===e.matrixAutoUpdate&&e.updateMatrix(),t.value.copy(e.matrix)}function i(e,i){e.opacity.value=i.opacity,i.color&&e.diffuse.value.copy(i.color),i.emissive&&e.emissive.value.copy(i.emissive).multiplyScalar(i.emissiveIntensity),i.map&&(e.map.value=i.map,n(i.map,e.mapTransform)),i.alphaMap&&(e.alphaMap.value=i.alphaMap,n(i.alphaMap,e.alphaMapTransform)),i.bumpMap&&(e.bumpMap.value=i.bumpMap,n(i.bumpMap,e.bumpMapTransform),e.bumpScale.value=i.bumpScale,i.side===Ve&&(e.bumpScale.value*=-1)),i.normalMap&&(e.normalMap.value=i.normalMap,n(i.normalMap,e.normalMapTransform),e.normalScale.value.copy(i.normalScale),i.side===Ve&&e.normalScale.value.negate()),i.displacementMap&&(e.displacementMap.value=i.displacementMap,n(i.displacementMap,e.displacementMapTransform),e.displacementScale.value=i.displacementScale,e.displacementBias.value=i.displacementBias),i.emissiveMap&&(e.emissiveMap.value=i.emissiveMap,n(i.emissiveMap,e.emissiveMapTransform)),i.specularMap&&(e.specularMap.value=i.specularMap,n(i.specularMap,e.specularMapTransform)),i.alphaTest>0&&(e.alphaTest.value=i.alphaTest);const r=t.get(i),s=r.envMap,o=r.envMapRotation;s&&(e.envMap.value=s,LA.copy(o),LA.x*=-1,LA.y*=-1,LA.z*=-1,s.isCubeTexture&&!1===s.isRenderTargetTexture&&(LA.y*=-1,LA.z*=-1),e.envMapRotation.value.setFromMatrix4(DA.makeRotationFromEuler(LA)),e.flipEnvMap.value=s.isCubeTexture&&!1===s.isRenderTargetTexture?-1:1,e.reflectivity.value=i.reflectivity,e.ior.value=i.ior,e.refractionRatio.value=i.refractionRatio),i.lightMap&&(e.lightMap.value=i.lightMap,e.lightMapIntensity.value=i.lightMapIntensity,n(i.lightMap,e.lightMapTransform)),i.aoMap&&(e.aoMap.value=i.aoMap,e.aoMapIntensity.value=i.aoMapIntensity,n(i.aoMap,e.aoMapTransform))}return{refreshFogUniforms:function(t,n){n.color.getRGB(t.fogColor.value,xa(e)),n.isFog?(t.fogNear.value=n.near,t.fogFar.value=n.far):n.isFogExp2&&(t.fogDensity.value=n.density)},refreshMaterialUniforms:function(e,r,s,o,a){r.isMeshBasicMaterial||r.isMeshLambertMaterial?i(e,r):r.isMeshToonMaterial?(i(e,r),function(e,t){t.gradientMap&&(e.gradientMap.value=t.gradientMap)}(e,r)):r.isMeshPhongMaterial?(i(e,r),function(e,t){e.specular.value.copy(t.specular),e.shininess.value=Math.max(t.shininess,1e-4)}(e,r)):r.isMeshStandardMaterial?(i(e,r),function(e,t){e.metalness.value=t.metalness,t.metalnessMap&&(e.metalnessMap.value=t.metalnessMap,n(t.metalnessMap,e.metalnessMapTransform)),e.roughness.value=t.roughness,t.roughnessMap&&(e.roughnessMap.value=t.roughnessMap,n(t.roughnessMap,e.roughnessMapTransform)),t.envMap&&(e.envMapIntensity.value=t.envMapIntensity)}(e,r),r.isMeshPhysicalMaterial&&function(e,t,i){e.ior.value=t.ior,t.sheen>0&&(e.sheenColor.value.copy(t.sheenColor).multiplyScalar(t.sheen),e.sheenRoughness.value=t.sheenRoughness,t.sheenColorMap&&(e.sheenColorMap.value=t.sheenColorMap,n(t.sheenColorMap,e.sheenColorMapTransform)),t.sheenRoughnessMap&&(e.sheenRoughnessMap.value=t.sheenRoughnessMap,n(t.sheenRoughnessMap,e.sheenRoughnessMapTransform))),t.clearcoat>0&&(e.clearcoat.value=t.clearcoat,e.clearcoatRoughness.value=t.clearcoatRoughness,t.clearcoatMap&&(e.clearcoatMap.value=t.clearcoatMap,n(t.clearcoatMap,e.clearcoatMapTransform)),t.clearcoatRoughnessMap&&(e.clearcoatRoughnessMap.value=t.clearcoatRoughnessMap,n(t.clearcoatRoughnessMap,e.clearcoatRoughnessMapTransform)),t.clearcoatNormalMap&&(e.clearcoatNormalMap.value=t.clearcoatNormalMap,n(t.clearcoatNormalMap,e.clearcoatNormalMapTransform),e.clearcoatNormalScale.value.copy(t.clearcoatNormalScale),t.side===Ve&&e.clearcoatNormalScale.value.negate())),t.dispersion>0&&(e.dispersion.value=t.dispersion),t.iridescence>0&&(e.iridescence.value=t.iridescence,e.iridescenceIOR.value=t.iridescenceIOR,e.iridescenceThicknessMinimum.value=t.iridescenceThicknessRange[0],e.iridescenceThicknessMaximum.value=t.iridescenceThicknessRange[1],t.iridescenceMap&&(e.iridescenceMap.value=t.iridescenceMap,n(t.iridescenceMap,e.iridescenceMapTransform)),t.iridescenceThicknessMap&&(e.iridescenceThicknessMap.value=t.iridescenceThicknessMap,n(t.iridescenceThicknessMap,e.iridescenceThicknessMapTransform))),t.transmission>0&&(e.transmission.value=t.transmission,e.transmissionSamplerMap.value=i.texture,e.transmissionSamplerSize.value.set(i.width,i.height),t.transmissionMap&&(e.transmissionMap.value=t.transmissionMap,n(t.transmissionMap,e.transmissionMapTransform)),e.thickness.value=t.thickness,t.thicknessMap&&(e.thicknessMap.value=t.thicknessMap,n(t.thicknessMap,e.thicknessMapTransform)),e.attenuationDistance.value=t.attenuationDistance,e.attenuationColor.value.copy(t.attenuationColor)),t.anisotropy>0&&(e.anisotropyVector.value.set(t.anisotropy*Math.cos(t.anisotropyRotation),t.anisotropy*Math.sin(t.anisotropyRotation)),t.anisotropyMap&&(e.anisotropyMap.value=t.anisotropyMap,n(t.anisotropyMap,e.anisotropyMapTransform))),e.specularIntensity.value=t.specularIntensity,e.specularColor.value.copy(t.specularColor),t.specularColorMap&&(e.specularColorMap.value=t.specularColorMap,n(t.specularColorMap,e.specularColorMapTransform)),t.specularIntensityMap&&(e.specularIntensityMap.value=t.specularIntensityMap,n(t.specularIntensityMap,e.specularIntensityMapTransform))}(e,r,a)):r.isMeshMatcapMaterial?(i(e,r),function(e,t){t.matcap&&(e.matcap.value=t.matcap)}(e,r)):r.isMeshDepthMaterial?i(e,r):r.isMeshDistanceMaterial?(i(e,r),function(e,n){const i=t.get(n).light;e.referencePosition.value.setFromMatrixPosition(i.matrixWorld),e.nearDistance.value=i.shadow.camera.near,e.farDistance.value=i.shadow.camera.far}(e,r)):r.isMeshNormalMaterial?i(e,r):r.isLineBasicMaterial?(function(e,t){e.diffuse.value.copy(t.color),e.opacity.value=t.opacity,t.map&&(e.map.value=t.map,n(t.map,e.mapTransform))}(e,r),r.isLineDashedMaterial&&function(e,t){e.dashSize.value=t.dashSize,e.totalSize.value=t.dashSize+t.gapSize,e.scale.value=t.scale}(e,r)):r.isPointsMaterial?function(e,t,i,r){e.diffuse.value.copy(t.color),e.opacity.value=t.opacity,e.size.value=t.size*i,e.scale.value=.5*r,t.map&&(e.map.value=t.map,n(t.map,e.uvTransform)),t.alphaMap&&(e.alphaMap.value=t.alphaMap,n(t.alphaMap,e.alphaMapTransform)),t.alphaTest>0&&(e.alphaTest.value=t.alphaTest)}(e,r,s,o):r.isSpriteMaterial?function(e,t){e.diffuse.value.copy(t.color),e.opacity.value=t.opacity,e.rotation.value=t.rotation,t.map&&(e.map.value=t.map,n(t.map,e.mapTransform)),t.alphaMap&&(e.alphaMap.value=t.alphaMap,n(t.alphaMap,e.alphaMapTransform)),t.alphaTest>0&&(e.alphaTest.value=t.alphaTest)}(e,r):r.isShadowMaterial?(e.color.value.copy(r.color),e.opacity.value=r.opacity):r.isShaderMaterial&&(r.uniformsNeedUpdate=!1)}}}function UA(e,t,n,i){let r={},s={},o=[];const a=e.getParameter(e.MAX_UNIFORM_BUFFER_BINDINGS);function l(e,t,n,i){const r=e.value,s=t+"_"+n;if(void 0===i[s])return i[s]="number"==typeof r||"boolean"==typeof r?r:r.clone(),!0;{const e=i[s];if("number"==typeof r||"boolean"==typeof r){if(e!==r)return i[s]=r,!0}else if(!1===e.equals(r))return e.copy(r),!0}return!1}function c(e){const t={boundary:0,storage:0};return"number"==typeof e||"boolean"==typeof e?(t.boundary=4,t.storage=4):e.isVector2?(t.boundary=8,t.storage=8):e.isVector3||e.isColor?(t.boundary=16,t.storage=12):e.isVector4?(t.boundary=16,t.storage=16):e.isMatrix3?(t.boundary=48,t.storage=48):e.isMatrix4?(t.boundary=64,t.storage=64):e.isTexture?console.warn("THREE.WebGLRenderer: Texture samplers can not be part of an uniforms group."):console.warn("THREE.WebGLRenderer: Unsupported uniform value type.",e),t}function h(t){const n=t.target;n.removeEventListener("dispose",h);const i=o.indexOf(n.__bindingPointIndex);o.splice(i,1),e.deleteBuffer(r[n.id]),delete r[n.id],delete s[n.id]}return{bind:function(e,t){const n=t.program;i.uniformBlockBinding(e,n)},update:function(n,u){let d=r[n.id];void 0===d&&(function(e){const t=e.uniforms;let n=0;for(let e=0,i=t.length;e<i;e++){const i=Array.isArray(t[e])?t[e]:[t[e]];for(let e=0,t=i.length;e<t;e++){const t=i[e],r=Array.isArray(t.value)?t.value:[t.value];for(let e=0,i=r.length;e<i;e++){const i=c(r[e]),s=n%16,o=s%i.boundary,a=s+o;n+=o,0!==a&&16-a<i.storage&&(n+=16-a),t.__data=new Float32Array(i.storage/Float32Array.BYTES_PER_ELEMENT),t.__offset=n,n+=i.storage}}}const i=n%16;i>0&&(n+=16-i),e.__size=n,e.__cache={}}(n),d=function(t){const n=function(){for(let e=0;e<a;e++)if(-1===o.indexOf(e))return o.push(e),e;return console.error("THREE.WebGLRenderer: Maximum number of simultaneously usable uniforms groups reached."),0}();t.__bindingPointIndex=n;const i=e.createBuffer(),r=t.__size,s=t.usage;return e.bindBuffer(e.UNIFORM_BUFFER,i),e.bufferData(e.UNIFORM_BUFFER,r,s),e.bindBuffer(e.UNIFORM_BUFFER,null),e.bindBufferBase(e.UNIFORM_BUFFER,n,i),i}(n),r[n.id]=d,n.addEventListener("dispose",h));const p=u.program;i.updateUBOMapping(n,p);const f=t.render.frame;s[n.id]!==f&&(function(t){const n=r[t.id],i=t.uniforms,s=t.__cache;e.bindBuffer(e.UNIFORM_BUFFER,n);for(let t=0,n=i.length;t<n;t++){const n=Array.isArray(i[t])?i[t]:[i[t]];for(let i=0,r=n.length;i<r;i++){const r=n[i];if(!0===l(r,t,i,s)){const t=r.__offset,n=Array.isArray(r.value)?r.value:[r.value];let i=0;for(let s=0;s<n.length;s++){const o=n[s],a=c(o);"number"==typeof o||"boolean"==typeof o?(r.__data[0]=o,e.bufferSubData(e.UNIFORM_BUFFER,t+i,r.__data)):o.isMatrix3?(r.__data[0]=o.elements[0],r.__data[1]=o.elements[1],r.__data[2]=o.elements[2],r.__data[3]=0,r.__data[4]=o.elements[3],r.__data[5]=o.elements[4],r.__data[6]=o.elements[5],r.__data[7]=0,r.__data[8]=o.elements[6],r.__data[9]=o.elements[7],r.__data[10]=o.elements[8],r.__data[11]=0):(o.toArray(r.__data,i),i+=a.storage/Float32Array.BYTES_PER_ELEMENT)}e.bufferSubData(e.UNIFORM_BUFFER,t,r.__data)}}}e.bindBuffer(e.UNIFORM_BUFFER,null)}(n),s[n.id]=f)},dispose:function(){for(const t in r)e.deleteBuffer(r[t]);o=[],r={},s={}}}}class kA{constructor(e={}){const{canvas:t=kr(),context:n=null,depth:i=!0,stencil:r=!1,alpha:s=!1,antialias:o=!1,premultipliedAlpha:a=!0,preserveDrawingBuffer:l=!1,powerPreference:c="default",failIfMajorPerformanceCaveat:h=!1,reverseDepthBuffer:u=!1,multiviewStereo:d=!1}=e;let p;if(this.isWebGLRenderer=!0,null!==n){if("undefined"!=typeof WebGLRenderingContext&&n instanceof WebGLRenderingContext)throw new Error("THREE.WebGLRenderer: WebGL 1 is not supported since r163.");p=n.getContextAttributes().alpha}else p=s;const f=new Uint32Array(4),m=new Int32Array(4);let A=null,g=null;const v=[],y=[];this.domElement=t,this.debug={checkShaderErrors:!0,onShaderError:null},this.autoClear=!0,this.autoClearColor=!0,this.autoClearDepth=!0,this.autoClearStencil=!0,this.sortObjects=!0,this.clippingPlanes=[],this.localClippingEnabled=!1,this._outputColorSpace=Ti,this.toneMapping=Tt,this.toneMappingExposure=1;const E=this;let b=!1,x=0,C=0,w=null,_=-1,M=null;const I=new Zr,S=new Zr;let T=null;const B=new To(0);let R=0,L=t.width,D=t.height,P=1,U=null,k=null;const N=new Zr(0,0,L,D),O=new Zr(0,0,L,D);let F=!1;const Q=new Ol;let z=!1,G=!1;this.transmissionResolutionScale=1;const H=new ks,V=new ks,j=new os,W=new Zr,q={background:null,fog:null,environment:null,overrideMaterial:null,isScene:!0};let X=!1;function Y(){return null===w?P:1}let J,K,Z,$,ee,te,ne,ie,re,se,oe,ae,le,ce,he,ue,de,pe,fe,me,Ae,ge,ve,ye,Ee,be=n;function xe(e,n){return t.getContext(e,n)}try{const e={alpha:!0,depth:i,stencil:r,antialias:o,premultipliedAlpha:a,preserveDrawingBuffer:l,powerPreference:c,failIfMajorPerformanceCaveat:h};if("setAttribute"in t&&t.setAttribute("data-engine",`three.js r${Le}`),t.addEventListener("webglcontextlost",_e,!1),t.addEventListener("webglcontextrestored",Me,!1),t.addEventListener("webglcontextcreationerror",Ie,!1),null===be){const t="webgl2";if(be=xe(t,e),null===be)throw xe(t)?new Error("Error creating WebGL context with your selected attributes."):new Error("Error creating WebGL context.")}}catch(e){throw console.error("THREE.WebGLRenderer: "+e.message),e}function Ce(){J=new Lf(be),J.init(),ve=new SA(be,J),K=new pf(be,J,e,ve),Z=new MA(be,J),K.reverseDepthBuffer&&u&&Z.buffers.depth.setReversed(!0),$=new Uf(be),ee=new pA,te=new IA(be,J,Z,ee,K,ve,$),ne=new mf(E),ie=new Rf(E),re=new nf(be),ye=new uf(be,re),se=new Df(be,re,$,ye),oe=new Of(be,se,re,$),me=new kf(be,K,te),ue=new ff(ee),ae=new dA(E,ne,ie,J,K,ye,ue),le=new PA(E,ee),ce=new gA,he=new CA(J),fe=new hf(E,ne,ie,Z,oe,p,a),pe=new Nf(E,J,be),de=new wA(E,oe,K),Ee=new UA(be,$,K,Z),Ae=new df(be,J,$),ge=new Pf(be,J,$),$.programs=ae.programs,E.capabilities=K,E.extensions=J,E.properties=ee,E.renderLists=ce,E.shadowMap=de,E.state=Z,E.info=$}Ce();const we=new RA(E,be);function _e(e){e.preventDefault(),console.log("THREE.WebGLRenderer: Context Lost."),b=!0}function Me(){console.log("THREE.WebGLRenderer: Context Restored."),b=!1;const e=$.autoReset,t=de.enabled,n=de.autoUpdate,i=de.needsUpdate,r=de.type;Ce(),$.autoReset=e,de.enabled=t,de.autoUpdate=n,de.needsUpdate=i,de.type=r}function Ie(e){console.error("THREE.WebGLRenderer: A WebGL context could not be created. Reason: ",e.statusMessage)}function Se(e){const t=e.target;t.removeEventListener("dispose",Se),function(e){(function(e){const t=ee.get(e).programs;void 0!==t&&(t.forEach((function(e){ae.releaseProgram(e)})),e.isShaderMaterial&&ae.releaseShaderCache(e))})(e),ee.remove(e)}(t)}function Te(e,t,n){!0===e.transparent&&e.side===je&&!1===e.forceSinglePass?(e.side=Ve,e.needsUpdate=!0,Qe(e,t,n),e.side=He,e.needsUpdate=!0,Qe(e,t,n),e.side=je):Qe(e,t,n)}this.xr=we,this.getContext=function(){return be},this.getContextAttributes=function(){return be.getContextAttributes()},this.forceContextLoss=function(){const e=J.get("WEBGL_lose_context");e&&e.loseContext()},this.forceContextRestore=function(){const e=J.get("WEBGL_lose_context");e&&e.restoreContext()},this.getPixelRatio=function(){return P},this.setPixelRatio=function(e){void 0!==e&&(P=e,this.setSize(L,D,!1))},this.getSize=function(e){return e.set(L,D)},this.setSize=function(e,n,i=!0){we.isPresenting?console.warn("THREE.WebGLRenderer: Can't change size while VR device is presenting."):(L=e,D=n,t.width=Math.floor(e*P),t.height=Math.floor(n*P),!0===i&&(t.style.width=e+"px",t.style.height=n+"px"),this.setViewport(0,0,e,n))},this.getDrawingBufferSize=function(e){return e.set(L*P,D*P).floor()},this.setDrawingBufferSize=function(e,n,i){L=e,D=n,P=i,t.width=Math.floor(e*i),t.height=Math.floor(n*i),this.setViewport(0,0,e,n)},this.getCurrentViewport=function(e){return e.copy(I)},this.getViewport=function(e){return e.copy(N)},this.setViewport=function(e,t,n,i){e.isVector4?N.set(e.x,e.y,e.z,e.w):N.set(e,t,n,i),Z.viewport(I.copy(N).multiplyScalar(P).round())},this.getScissor=function(e){return e.copy(O)},this.setScissor=function(e,t,n,i){e.isVector4?O.set(e.x,e.y,e.z,e.w):O.set(e,t,n,i),Z.scissor(S.copy(O).multiplyScalar(P).round())},this.getScissorTest=function(){return F},this.setScissorTest=function(e){Z.setScissorTest(F=e)},this.setOpaqueSort=function(e){U=e},this.setTransparentSort=function(e){k=e},this.getClearColor=function(e){return e.copy(fe.getClearColor())},this.setClearColor=function(){fe.setClearColor.apply(fe,arguments)},this.getClearAlpha=function(){return fe.getClearAlpha()},this.setClearAlpha=function(){fe.setClearAlpha.apply(fe,arguments)},this.clear=function(e=!0,t=!0,n=!0){let i=0;if(e){let e=!1;if(null!==w){const t=w.texture.format;e=t===Tn||t===In||t===_n}if(e){const e=w.texture.type,t=e===sn||e===hn||e===ln||e===mn||e===pn||e===fn,n=fe.getClearColor(),i=fe.getClearAlpha(),r=n.r,s=n.g,o=n.b;t?(f[0]=r,f[1]=s,f[2]=o,f[3]=i,be.clearBufferuiv(be.COLOR,0,f)):(m[0]=r,m[1]=s,m[2]=o,m[3]=i,be.clearBufferiv(be.COLOR,0,m))}else i|=be.COLOR_BUFFER_BIT}t&&(i|=be.DEPTH_BUFFER_BIT),n&&(i|=be.STENCIL_BUFFER_BIT,this.state.buffers.stencil.setMask(4294967295)),be.clear(i)},this.clearColor=function(){this.clear(!0,!1,!1)},this.clearDepth=function(){this.clear(!1,!0,!1)},this.clearStencil=function(){this.clear(!1,!1,!0)},this.dispose=function(){t.removeEventListener("webglcontextlost",_e,!1),t.removeEventListener("webglcontextrestored",Me,!1),t.removeEventListener("webglcontextcreationerror",Ie,!1),fe.dispose(),ce.dispose(),he.dispose(),ee.dispose(),ne.dispose(),ie.dispose(),oe.dispose(),ye.dispose(),Ee.dispose(),ae.dispose(),we.dispose(),we.removeEventListener("sessionstart",Re),we.removeEventListener("sessionend",De),Pe.stop()},this.renderBufferDirect=function(e,t,n,i,r,s){null===t&&(t=q);const o=r.isMesh&&r.matrixWorld.determinant()<0,a=function(e,t,n,i,r){!0!==t.isScene&&(t=q),te.resetTextureUnits();const s=t.fog,o=i.isMeshStandardMaterial?t.environment:null,a=null===w?E.outputColorSpace:!0===w.isXRRenderTarget?w.texture.colorSpace:Bi,l=(i.isMeshStandardMaterial?ie:ne).get(i.envMap||o),c=!0===i.vertexColors&&!!n.attributes.color&&4===n.attributes.color.itemSize,h=!!n.attributes.tangent&&(!!i.normalMap||i.anisotropy>0),u=!!n.morphAttributes.position,d=!!n.morphAttributes.normal,p=!!n.morphAttributes.color;let f=Tt;i.toneMapped&&(null!==w&&!0!==w.isXRRenderTarget||(f=E.toneMapping));const m=w&&w.isWebGLMultiviewRenderTarget?w.numViews:0,A=n.morphAttributes.position||n.morphAttributes.normal||n.morphAttributes.color,v=void 0!==A?A.length:0,y=ee.get(i),b=g.state.lights;if(!0===z&&(!0===G||e!==M)){const t=e===M&&i.id===_;ue.setState(i,e,t)}let x=!1;i.version===y.__version?y.needsLights&&y.lightsStateVersion!==b.state.version||y.outputColorSpace!==a||r.isBatchedMesh&&!1===y.batching?x=!0:r.isBatchedMesh||!0!==y.batching?r.isBatchedMesh&&!0===y.batchingColor&&null===r.colorTexture||r.isBatchedMesh&&!1===y.batchingColor&&null!==r.colorTexture||r.isInstancedMesh&&!1===y.instancing?x=!0:r.isInstancedMesh||!0!==y.instancing?r.isSkinnedMesh&&!1===y.skinning?x=!0:r.isSkinnedMesh||!0!==y.skinning?r.isInstancedMesh&&!0===y.instancingColor&&null===r.instanceColor||r.isInstancedMesh&&!1===y.instancingColor&&null!==r.instanceColor||r.isInstancedMesh&&!0===y.instancingMorph&&null===r.morphTexture||r.isInstancedMesh&&!1===y.instancingMorph&&null!==r.morphTexture||y.envMap!==l||!0===i.fog&&y.fog!==s?x=!0:void 0===y.numClippingPlanes||y.numClippingPlanes===ue.numPlanes&&y.numIntersection===ue.numIntersection?(y.vertexAlphas!==c||y.vertexTangents!==h||y.morphTargets!==u||y.morphNormals!==d||y.morphColors!==p||y.toneMapping!==f||y.morphTargetsCount!==v||y.numMultiviewViews!==m)&&(x=!0):x=!0:x=!0:x=!0:x=!0:(x=!0,y.__version=i.version);let C=y.currentProgram;!0===x&&(C=Qe(i,t,r));let I=!1,S=!1,T=!1;const B=C.getUniforms(),R=y.uniforms;if(Z.useProgram(C.program)&&(I=!0,S=!0,T=!0),i.id!==_&&(_=i.id,S=!0),I||M!==e){C.numMultiviewViews>0?(pe.updateCameraProjectionMatricesUniform(e,B),pe.updateCameraViewMatricesUniform(e,B)):(Z.buffers.depth.getReversed()?(H.copy(e.projectionMatrix),function(e){const t=e.elements;t[2]=.5*t[2]+.5*t[3],t[6]=.5*t[6]+.5*t[7],t[10]=.5*t[10]+.5*t[11],t[14]=.5*t[14]+.5*t[15]}(H),function(e){const t=e.elements;-1===t[11]?(t[10]=-t[10]-1,t[14]=-t[14]):(t[10]=-t[10],t[14]=1-t[14])}(H),B.setValue(be,"projectionMatrix",H)):B.setValue(be,"projectionMatrix",e.projectionMatrix),B.setValue(be,"viewMatrix",e.matrixWorldInverse));const t=B.map.cameraPosition;void 0!==t&&t.setValue(be,j.setFromMatrixPosition(e.matrixWorld)),K.logarithmicDepthBuffer&&B.setValue(be,"logDepthBufFC",2/(Math.log(e.far+1)/Math.LN2)),(i.isMeshPhongMaterial||i.isMeshToonMaterial||i.isMeshLambertMaterial||i.isMeshBasicMaterial||i.isMeshStandardMaterial||i.isShaderMaterial)&&B.setValue(be,"isOrthographic",!0===e.isOrthographicCamera),M!==e&&(M=e,S=!0,T=!0)}if(r.isSkinnedMesh){B.setOptional(be,r,"bindMatrix"),B.setOptional(be,r,"bindMatrixInverse");const e=r.skeleton;e&&(null===e.boneTexture&&e.computeBoneTexture(),B.setValue(be,"boneTexture",e.boneTexture,te))}r.isBatchedMesh&&(B.setOptional(be,r,"batchingTexture"),B.setValue(be,"batchingTexture",r._matricesTexture,te),B.setOptional(be,r,"batchingIdTexture"),B.setValue(be,"batchingIdTexture",r._indirectTexture,te),B.setOptional(be,r,"batchingColorTexture"),null!==r._colorsTexture&&B.setValue(be,"batchingColorTexture",r._colorsTexture,te));const L=n.morphAttributes;var U,k;if(void 0===L.position&&void 0===L.normal&&void 0===L.color||me.update(r,n,C),(S||y.receiveShadow!==r.receiveShadow)&&(y.receiveShadow=r.receiveShadow,B.setValue(be,"receiveShadow",r.receiveShadow)),i.isMeshGouraudMaterial&&null!==i.envMap&&(R.envMap.value=l,R.flipEnvMap.value=l.isCubeTexture&&!1===l.isRenderTargetTexture?-1:1),i.isMeshStandardMaterial&&null===i.envMap&&null!==t.environment&&(R.envMapIntensity.value=t.environmentIntensity),S&&(B.setValue(be,"toneMappingExposure",E.toneMappingExposure),y.needsLights&&(k=T,(U=R).ambientLightColor.needsUpdate=k,U.lightProbe.needsUpdate=k,U.directionalLights.needsUpdate=k,U.directionalLightShadows.needsUpdate=k,U.pointLights.needsUpdate=k,U.pointLightShadows.needsUpdate=k,U.spotLights.needsUpdate=k,U.spotLightShadows.needsUpdate=k,U.rectAreaLights.needsUpdate=k,U.hemisphereLights.needsUpdate=k),s&&!0===i.fog&&le.refreshFogUniforms(R,s),le.refreshMaterialUniforms(R,i,P,D,g.state.transmissionRenderTarget[e.id]),Hm.upload(be,ze(y),R,te)),i.isShaderMaterial&&!0===i.uniformsNeedUpdate&&(Hm.upload(be,ze(y),R,te),i.uniformsNeedUpdate=!1),i.isSpriteMaterial&&B.setValue(be,"center",r.center),C.numMultiviewViews>0?pe.updateObjectMatricesUniforms(r,e,B):(B.setValue(be,"modelViewMatrix",r.modelViewMatrix),B.setValue(be,"normalMatrix",r.normalMatrix)),B.setValue(be,"modelMatrix",r.matrixWorld),i.isShaderMaterial||i.isRawShaderMaterial){const e=i.uniformsGroups;for(let t=0,n=e.length;t<n;t++){const n=e[t];Ee.update(n,C),Ee.bind(n,C)}}return C}(e,t,n,i,r);Z.setMaterial(i,o);let l=n.index,c=1;if(!0===i.wireframe){if(l=se.getWireframeAttribute(n),void 0===l)return;c=2}const h=n.drawRange,u=n.attributes.position;let d=h.start*c,p=(h.start+h.count)*c;null!==s&&(d=Math.max(d,s.start*c),p=Math.min(p,(s.start+s.count)*c)),null!==l?(d=Math.max(d,0),p=Math.min(p,l.count)):null!=u&&(d=Math.max(d,0),p=Math.min(p,u.count));const f=p-d;if(f<0||f===1/0)return;let m;ye.setup(r,i,a,n,l);let A=Ae;if(null!==l&&(m=re.get(l),A=ge,A.setIndex(m)),r.isMesh)!0===i.wireframe?(Z.setLineWidth(i.wireframeLinewidth*Y()),A.setMode(be.LINES)):A.setMode(be.TRIANGLES);else if(r.isLine){let e=i.linewidth;void 0===e&&(e=1),Z.setLineWidth(e*Y()),r.isLineSegments?A.setMode(be.LINES):r.isLineLoop?A.setMode(be.LINE_LOOP):A.setMode(be.LINE_STRIP)}else r.isPoints?A.setMode(be.POINTS):r.isSprite&&A.setMode(be.TRIANGLES);if(r.isBatchedMesh)if(null!==r._multiDrawInstances)A.renderMultiDrawInstances(r._multiDrawStarts,r._multiDrawCounts,r._multiDrawCount,r._multiDrawInstances);else if(J.get("WEBGL_multi_draw"))A.renderMultiDraw(r._multiDrawStarts,r._multiDrawCounts,r._multiDrawCount);else{const e=r._multiDrawStarts,t=r._multiDrawCounts,n=r._multiDrawCount,s=l?re.get(l).bytesPerElement:1,o=ee.get(i).currentProgram.getUniforms();for(let i=0;i<n;i++)o.setValue(be,"_gl_DrawID",i),A.render(e[i]/s,t[i])}else if(r.isInstancedMesh)A.renderInstances(d,f,r.count);else if(n.isInstancedBufferGeometry){const e=void 0!==n._maxInstanceCount?n._maxInstanceCount:1/0,t=Math.min(n.instanceCount,e);A.renderInstances(d,f,t)}else A.render(d,f)},this.compile=function(e,t,n=null){null===n&&(n=e),g=he.get(n),g.init(t),y.push(g),n.traverseVisible((function(e){e.isLight&&e.layers.test(t.layers)&&(g.pushLight(e),e.castShadow&&g.pushShadow(e))})),e!==n&&e.traverseVisible((function(e){e.isLight&&e.layers.test(t.layers)&&(g.pushLight(e),e.castShadow&&g.pushShadow(e))})),g.setupLights();const i=new Set;return e.traverse((function(e){if(!(e.isMesh||e.isPoints||e.isLine||e.isSprite))return;const t=e.material;if(t)if(Array.isArray(t))for(let r=0;r<t.length;r++){const s=t[r];Te(s,n,e),i.add(s)}else Te(t,n,e),i.add(t)})),y.pop(),g=null,i},this.compileAsync=function(e,t,n=null){const i=this.compile(e,t,n);return new Promise((t=>{function n(){i.forEach((function(e){ee.get(e).currentProgram.isReady()&&i.delete(e)})),0!==i.size?setTimeout(n,10):t(e)}null!==J.get("KHR_parallel_shader_compile")?n():setTimeout(n,10)}))};let Be=null;function Re(){Pe.stop()}function De(){Pe.start()}const Pe=new tf;function Ue(e,t,n,i){if(!1===e.visible)return;if(e.layers.test(t.layers))if(e.isGroup)n=e.renderOrder;else if(e.isLOD)!0===e.autoUpdate&&e.update(t);else if(e.isLight)g.pushLight(e),e.castShadow&&g.pushShadow(e);else if(e.isSprite){if(!e.frustumCulled||Q.intersectsSprite(e)){i&&W.setFromMatrixPosition(e.matrixWorld).applyMatrix4(V);const t=oe.update(e),r=e.material;r.visible&&A.push(e,t,r,n,W.z,null)}}else if((e.isMesh||e.isLine||e.isPoints)&&(!e.frustumCulled||Q.intersectsObject(e))){const t=oe.update(e),r=e.material;if(i&&(void 0!==e.boundingSphere?(null===e.boundingSphere&&e.computeBoundingSphere(),W.copy(e.boundingSphere.center)):(null===t.boundingSphere&&t.computeBoundingSphere(),W.copy(t.boundingSphere.center)),W.applyMatrix4(e.matrixWorld).applyMatrix4(V)),Array.isArray(r)){const i=t.groups;for(let s=0,o=i.length;s<o;s++){const o=i[s],a=r[o.materialIndex];a&&a.visible&&A.push(e,t,a,n,W.z,o)}}else r.visible&&A.push(e,t,r,n,W.z,null)}const r=e.children;for(let e=0,s=r.length;e<s;e++)Ue(r[e],t,n,i)}function ke(e,t,n,i){const r=e.opaque,s=e.transmissive,o=e.transparent;g.setupLightsView(n),!0===z&&ue.setGlobalState(E.clippingPlanes,n),i&&Z.viewport(I.copy(i)),r.length>0&&Oe(r,t,n),s.length>0&&Oe(s,t,n),o.length>0&&Oe(o,t,n),Z.buffers.depth.setTest(!0),Z.buffers.depth.setMask(!0),Z.buffers.color.setMask(!0),Z.setPolygonOffset(!1)}function Ne(e,t,n,i){if(null!==(!0===n.isScene?n.overrideMaterial:null))return;void 0===g.state.transmissionRenderTarget[i.id]&&(g.state.transmissionRenderTarget[i.id]=new es(1,1,{generateMipmaps:!0,type:J.has("EXT_color_buffer_half_float")||J.has("EXT_color_buffer_float")?dn:sn,minFilter:nn,samples:4,stencilBuffer:r,resolveDepthBuffer:!1,resolveStencilBuffer:!1,colorSpace:Gr.workingColorSpace}));const s=g.state.transmissionRenderTarget[i.id],o=i.viewport||I;s.setSize(o.z*E.transmissionResolutionScale,o.w*E.transmissionResolutionScale);const a=E.getRenderTarget();E.setRenderTarget(s),E.getClearColor(B),R=E.getClearAlpha(),R<1&&E.setClearColor(16777215,.5),E.clear(),X&&fe.render(n);const l=E.toneMapping;E.toneMapping=Tt;const c=i.viewport;if(void 0!==i.viewport&&(i.viewport=void 0),g.setupLightsView(i),!0===z&&ue.setGlobalState(E.clippingPlanes,i),Oe(e,n,i),te.updateMultisampleRenderTarget(s),te.updateRenderTargetMipmap(s),!1===J.has("WEBGL_multisampled_render_to_texture")){let e=!1;for(let r=0,s=t.length;r<s;r++){const s=t[r],o=s.object,a=s.geometry,l=s.material,c=s.group;if(l.side===je&&o.layers.test(i.layers)){const t=l.side;l.side=Ve,l.needsUpdate=!0,Fe(o,n,i,a,l,c),l.side=t,l.needsUpdate=!0,e=!0}}!0===e&&(te.updateMultisampleRenderTarget(s),te.updateRenderTargetMipmap(s))}E.setRenderTarget(a),E.setClearColor(B,R),void 0!==c&&(i.viewport=c),E.toneMapping=l}function Oe(e,t,n){const i=!0===t.isScene?t.overrideMaterial:null;for(let r=0,s=e.length;r<s;r++){const s=e[r],o=s.object,a=s.geometry,l=null===i?s.material:i,c=s.group;o.layers.test(n.layers)&&Fe(o,t,n,a,l,c)}}function Fe(e,t,n,i,r,s){e.onBeforeRender(E,t,n,i,r,s),e.modelViewMatrix.multiplyMatrices(n.matrixWorldInverse,e.matrixWorld),e.normalMatrix.getNormalMatrix(e.modelViewMatrix),r.onBeforeRender(E,t,n,i,e,s),!0===r.transparent&&r.side===je&&!1===r.forceSinglePass?(r.side=Ve,r.needsUpdate=!0,E.renderBufferDirect(n,t,i,r,e,s),r.side=He,r.needsUpdate=!0,E.renderBufferDirect(n,t,i,r,e,s),r.side=je):E.renderBufferDirect(n,t,i,r,e,s),e.onAfterRender(E,t,n,i,r,s)}function Qe(e,t,n){!0!==t.isScene&&(t=q);const i=ee.get(e),r=g.state.lights,s=g.state.shadowsArray,o=r.state.version,a=ae.getParameters(e,r.state,s,t,n),l=ae.getProgramCacheKey(a);let c=i.programs;i.environment=e.isMeshStandardMaterial?t.environment:null,i.fog=t.fog,i.envMap=(e.isMeshStandardMaterial?ie:ne).get(e.envMap||i.environment),i.envMapRotation=null!==i.environment&&null===e.envMap?t.environmentRotation:e.envMapRotation,void 0===c&&(e.addEventListener("dispose",Se),c=new Map,i.programs=c);let h=c.get(l);if(void 0!==h){if(i.currentProgram===h&&i.lightsStateVersion===o)return Ge(e,a),h}else a.uniforms=ae.getUniforms(e),e.onBeforeCompile(a,E),h=ae.acquireProgram(a,l),c.set(l,h),i.uniforms=a.uniforms;const u=i.uniforms;return(e.isShaderMaterial||e.isRawShaderMaterial)&&!0!==e.clipping||(u.clippingPlanes=ue.uniform),Ge(e,a),i.needsLights=function(e){return e.isMeshLambertMaterial||e.isMeshToonMaterial||e.isMeshPhongMaterial||e.isMeshStandardMaterial||e.isShadowMaterial||e.isShaderMaterial&&!0===e.lights}(e),i.lightsStateVersion=o,i.needsLights&&(u.ambientLightColor.value=r.state.ambient,u.lightProbe.value=r.state.probe,u.directionalLights.value=r.state.directional,u.directionalLightShadows.value=r.state.directionalShadow,u.spotLights.value=r.state.spot,u.spotLightShadows.value=r.state.spotShadow,u.rectAreaLights.value=r.state.rectArea,u.ltc_1.value=r.state.rectAreaLTC1,u.ltc_2.value=r.state.rectAreaLTC2,u.pointLights.value=r.state.point,u.pointLightShadows.value=r.state.pointShadow,u.hemisphereLights.value=r.state.hemi,u.directionalShadowMap.value=r.state.directionalShadowMap,u.directionalShadowMatrix.value=r.state.directionalShadowMatrix,u.spotShadowMap.value=r.state.spotShadowMap,u.spotLightMatrix.value=r.state.spotLightMatrix,u.spotLightMap.value=r.state.spotLightMap,u.pointShadowMap.value=r.state.pointShadowMap,u.pointShadowMatrix.value=r.state.pointShadowMatrix),i.currentProgram=h,i.uniformsList=null,h}function ze(e){if(null===e.uniformsList){const t=e.currentProgram.getUniforms();e.uniformsList=Hm.seqWithValue(t.seq,e.uniforms)}return e.uniformsList}function Ge(e,t){const n=ee.get(e);n.outputColorSpace=t.outputColorSpace,n.batching=t.batching,n.batchingColor=t.batchingColor,n.instancing=t.instancing,n.instancingColor=t.instancingColor,n.instancingMorph=t.instancingMorph,n.skinning=t.skinning,n.morphTargets=t.morphTargets,n.morphNormals=t.morphNormals,n.morphColors=t.morphColors,n.morphTargetsCount=t.morphTargetsCount,n.numClippingPlanes=t.numClippingPlanes,n.numIntersection=t.numClipIntersection,n.vertexAlphas=t.vertexAlphas,n.vertexTangents=t.vertexTangents,n.toneMapping=t.toneMapping,n.numMultiviewViews=t.numMultiviewViews}var We;Pe.setAnimationLoop((function(e){Be&&Be(e)})),"undefined"!=typeof self&&Pe.setContext(self),this.setAnimationLoop=function(e){Be=e,we.setAnimationLoop(e),null===e?Pe.stop():Pe.start()},we.addEventListener("sessionstart",Re),we.addEventListener("sessionend",De),this.render=function(e,t){if(void 0!==t&&!0!==t.isCamera)return void console.error("THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.");if(!0===b)return;if(!0===e.matrixWorldAutoUpdate&&e.updateMatrixWorld(),null===t.parent&&!0===t.matrixWorldAutoUpdate&&t.updateMatrixWorld(),!0===we.enabled&&!0===we.isPresenting&&(!0===we.cameraAutoUpdate&&we.updateCamera(t),t=we.getCamera()),!0===e.isScene&&e.onBeforeRender(E,e,t,w),g=he.get(e,y.length),g.init(t),y.push(g),V.multiplyMatrices(t.projectionMatrix,t.matrixWorldInverse),Q.setFromProjectionMatrix(V),G=this.localClippingEnabled,z=ue.init(this.clippingPlanes,G),A=ce.get(e,v.length),A.init(),v.push(A),!0===we.enabled&&!0===we.isPresenting){const e=E.xr.getDepthSensingMesh();null!==e&&Ue(e,t,-1/0,E.sortObjects)}Ue(e,t,0,E.sortObjects),A.finish(),!0===E.sortObjects&&A.sort(U,k),X=!1===we.enabled||!1===we.isPresenting||!1===we.hasDepthSensing(),X&&fe.addToRenderList(A,e),this.info.render.frame++,!0===z&&ue.beginShadows();const n=g.state.shadowsArray;de.render(n,e,t),!0===z&&ue.endShadows(),!0===this.info.autoReset&&this.info.reset();const i=A.opaque,r=A.transmissive;if(g.setupLights(),t.isArrayCamera){const n=t.cameras;if(r.length>0)for(let t=0,s=n.length;t<s;t++)Ne(i,r,e,n[t]);if(X&&fe.render(e),we.enabled&&we.isMultiview)te.setDeferTextureUploads(!0),ke(A,e,t,t.cameras[0].viewport);else for(let t=0,i=n.length;t<i;t++){const i=n[t];ke(A,e,i,i.viewport)}}else r.length>0&&Ne(i,r,e,t),X&&fe.render(e),ke(A,e,t);null!==w&&0===C&&(te.updateMultisampleRenderTarget(w),te.updateRenderTargetMipmap(w)),!0===e.isScene&&e.onAfterRender(E,e,t),ye.resetDefaultState(),_=-1,M=null,y.pop(),y.length>0?(g=y[y.length-1],!0===z&&ue.setGlobalState(E.clippingPlanes,g.state.camera)):g=null,v.pop(),A=v.length>0?v[v.length-1]:null},this.setTexture2D=(We=!1,function(e,t){e&&e.isWebGLRenderTarget&&(We||(console.warn("THREE.WebGLRenderer.setTexture2D: don't use render targets as textures. Use their .texture property instead."),We=!0),e=e.texture),te.setTexture2D(e,t)}),this.getActiveCubeFace=function(){return x},this.getActiveMipmapLevel=function(){return C},this.getRenderTarget=function(){return w},this.setRenderTargetTextures=function(e,t,n){ee.get(e.texture).__webglTexture=t,ee.get(e.depthTexture).__webglTexture=n;const i=ee.get(e);i.__hasExternalTextures=!0,i.__autoAllocateDepthBuffer=void 0===n,i.__autoAllocateDepthBuffer||w&&w.isWebGLMultiviewRenderTarget||!0===J.has("WEBGL_multisampled_render_to_texture")&&(console.warn("THREE.WebGLRenderer: Render-to-texture extension was disabled because an external texture was provided"),i.__useRenderToTexture=!1)},this.setRenderTargetFramebuffer=function(e,t){const n=ee.get(e);n.__webglFramebuffer=t,n.__useDefaultFramebuffer=void 0===t};const qe=be.createFramebuffer();this.setRenderTarget=function(e,t=0,n=0){null===e&&this.xr.isPresenting&&(e=this.xr.getRenderTarget()),w=e,x=t,C=n;let i=!0,r=null,s=!1,o=!1;if(e){const a=ee.get(e);if(void 0!==a.__useDefaultFramebuffer)Z.bindFramebuffer(be.FRAMEBUFFER,null),i=!1;else if(void 0===a.__webglFramebuffer)te.setupRenderTarget(e);else if(a.__hasExternalTextures)te.rebindTextures(e,ee.get(e.texture).__webglTexture,ee.get(e.depthTexture).__webglTexture);else if(e.depthBuffer){const t=e.depthTexture;if(a.__boundDepthTexture!==t){if(null!==t&&ee.has(t)&&(e.width!==t.image.width||e.height!==t.image.height))throw new Error("WebGLRenderTarget: Attached DepthTexture is initialized to the incorrect size.");te.setupDepthRenderbuffer(e)}}const l=e.texture;(l.isData3DTexture||l.isDataArrayTexture||l.isCompressedArrayTexture)&&(o=!0);const c=ee.get(e).__webglFramebuffer;e.isWebGLCubeRenderTarget?(r=Array.isArray(c[t])?c[t][n]:c[t],s=!0):r=e.samples>0&&!1===te.useMultisampledRTT(e)?ee.get(e).__webglMultisampledFramebuffer:Array.isArray(c)?c[n]:c,I.copy(e.viewport),S.copy(e.scissor),T=e.scissorTest}else I.copy(N).multiplyScalar(P).floor(),S.copy(O).multiplyScalar(P).floor(),T=F;if(0!==n&&(r=qe),Z.bindFramebuffer(be.FRAMEBUFFER,r)&&i&&Z.drawBuffers(e,r),Z.viewport(I),Z.scissor(S),Z.setScissorTest(T),s){const i=ee.get(e.texture);be.framebufferTexture2D(be.FRAMEBUFFER,be.COLOR_ATTACHMENT0,be.TEXTURE_CUBE_MAP_POSITIVE_X+t,i.__webglTexture,n)}else if(o){const i=ee.get(e.texture),r=t;be.framebufferTextureLayer(be.FRAMEBUFFER,be.COLOR_ATTACHMENT0,i.__webglTexture,n,r)}else if(null!==e&&0!==n){const t=ee.get(e.texture);be.framebufferTexture2D(be.FRAMEBUFFER,be.COLOR_ATTACHMENT0,be.TEXTURE_2D,t.__webglTexture,n)}_=-1},this.readRenderTargetPixels=function(e,t,n,i,r,s,o){if(!e||!e.isWebGLRenderTarget)return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.");let a=ee.get(e).__webglFramebuffer;if(e.isWebGLCubeRenderTarget&&void 0!==o&&(a=a[o]),a){Z.bindFramebuffer(be.FRAMEBUFFER,a);try{const o=e.texture,a=o.format,l=o.type;if(!K.textureFormatReadable(a))return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.");if(!K.textureTypeReadable(l))return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.");t>=0&&t<=e.width-i&&n>=0&&n<=e.height-r&&be.readPixels(t,n,i,r,ve.convert(a),ve.convert(l),s)}finally{const e=null!==w?ee.get(w).__webglFramebuffer:null;Z.bindFramebuffer(be.FRAMEBUFFER,e)}}},this.readRenderTargetPixelsAsync=async function(e,t,n,i,r,s,o){if(!e||!e.isWebGLRenderTarget)throw new Error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.");let a=ee.get(e).__webglFramebuffer;if(e.isWebGLCubeRenderTarget&&void 0!==o&&(a=a[o]),a){const o=e.texture,l=o.format,c=o.type;if(!K.textureFormatReadable(l))throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in RGBA or implementation defined format.");if(!K.textureTypeReadable(c))throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in UnsignedByteType or implementation defined type.");if(t>=0&&t<=e.width-i&&n>=0&&n<=e.height-r){Z.bindFramebuffer(be.FRAMEBUFFER,a);const e=be.createBuffer();be.bindBuffer(be.PIXEL_PACK_BUFFER,e),be.bufferData(be.PIXEL_PACK_BUFFER,s.byteLength,be.STREAM_READ),be.readPixels(t,n,i,r,ve.convert(l),ve.convert(c),0);const o=null!==w?ee.get(w).__webglFramebuffer:null;Z.bindFramebuffer(be.FRAMEBUFFER,o);const h=be.fenceSync(be.SYNC_GPU_COMMANDS_COMPLETE,0);return be.flush(),await function(e,t){return new Promise((function(n,i){setTimeout((function r(){switch(e.clientWaitSync(t,e.SYNC_FLUSH_COMMANDS_BIT,0)){case e.WAIT_FAILED:i();break;case e.TIMEOUT_EXPIRED:setTimeout(r,4);break;default:n()}}),4)}))}(be,h),be.bindBuffer(be.PIXEL_PACK_BUFFER,e),be.getBufferSubData(be.PIXEL_PACK_BUFFER,0,s),be.deleteBuffer(e),be.deleteSync(h),s}throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: requested read bounds are out of range.")}},this.copyFramebufferToTexture=function(e,t=null,n=0){!0!==e.isTexture&&(Or("WebGLRenderer: copyFramebufferToTexture function signature has changed."),t=arguments[0]||null,e=arguments[1]);const i=Math.pow(2,-n),r=Math.floor(e.image.width*i),s=Math.floor(e.image.height*i),o=null!==t?t.x:0,a=null!==t?t.y:0;te.setTexture2D(e,0),be.copyTexSubImage2D(be.TEXTURE_2D,n,0,0,o,a,r,s),Z.unbindTexture()};const Xe=be.createFramebuffer(),Ye=be.createFramebuffer();this.copyTextureToTexture=function(e,t,n=null,i=null,r=0,s=null){let o,a,l,c,h,u,d,p,f;!0!==e.isTexture&&(Or("WebGLRenderer: copyTextureToTexture function signature has changed."),i=arguments[0]||null,e=arguments[1],t=arguments[2],s=arguments[3]||0,n=null),null===s&&(0!==r?(Or("WebGLRenderer: copyTextureToTexture function signature has changed to support src and dst mipmap levels."),s=r,r=0):s=0);const m=e.isCompressedTexture?e.mipmaps[s]:e.image;if(null!==n)o=n.max.x-n.min.x,a=n.max.y-n.min.y,l=n.isBox3?n.max.z-n.min.z:1,c=n.min.x,h=n.min.y,u=n.isBox3?n.min.z:0;else{const t=Math.pow(2,-r);o=Math.floor(m.width*t),a=Math.floor(m.height*t),l=e.isDataArrayTexture?m.depth:e.isData3DTexture?Math.floor(m.depth*t):1,c=0,h=0,u=0}null!==i?(d=i.x,p=i.y,f=i.z):(d=0,p=0,f=0);const A=ve.convert(t.format),g=ve.convert(t.type);let v;t.isData3DTexture?(te.setTexture3D(t,0),v=be.TEXTURE_3D):t.isDataArrayTexture||t.isCompressedArrayTexture?(te.setTexture2DArray(t,0),v=be.TEXTURE_2D_ARRAY):(te.setTexture2D(t,0),v=be.TEXTURE_2D),be.pixelStorei(be.UNPACK_FLIP_Y_WEBGL,t.flipY),be.pixelStorei(be.UNPACK_PREMULTIPLY_ALPHA_WEBGL,t.premultiplyAlpha),be.pixelStorei(be.UNPACK_ALIGNMENT,t.unpackAlignment);const y=be.getParameter(be.UNPACK_ROW_LENGTH),E=be.getParameter(be.UNPACK_IMAGE_HEIGHT),b=be.getParameter(be.UNPACK_SKIP_PIXELS),x=be.getParameter(be.UNPACK_SKIP_ROWS),C=be.getParameter(be.UNPACK_SKIP_IMAGES);be.pixelStorei(be.UNPACK_ROW_LENGTH,m.width),be.pixelStorei(be.UNPACK_IMAGE_HEIGHT,m.height),be.pixelStorei(be.UNPACK_SKIP_PIXELS,c),be.pixelStorei(be.UNPACK_SKIP_ROWS,h),be.pixelStorei(be.UNPACK_SKIP_IMAGES,u);const w=e.isDataArrayTexture||e.isData3DTexture,_=t.isDataArrayTexture||t.isData3DTexture;if(e.isDepthTexture){const n=ee.get(e),i=ee.get(t),m=ee.get(n.__renderTarget),A=ee.get(i.__renderTarget);Z.bindFramebuffer(be.READ_FRAMEBUFFER,m.__webglFramebuffer),Z.bindFramebuffer(be.DRAW_FRAMEBUFFER,A.__webglFramebuffer);for(let n=0;n<l;n++)w&&(be.framebufferTextureLayer(be.READ_FRAMEBUFFER,be.COLOR_ATTACHMENT0,ee.get(e).__webglTexture,r,u+n),be.framebufferTextureLayer(be.DRAW_FRAMEBUFFER,be.COLOR_ATTACHMENT0,ee.get(t).__webglTexture,s,f+n)),be.blitFramebuffer(c,h,o,a,d,p,o,a,be.DEPTH_BUFFER_BIT,be.NEAREST);Z.bindFramebuffer(be.READ_FRAMEBUFFER,null),Z.bindFramebuffer(be.DRAW_FRAMEBUFFER,null)}else if(0!==r||e.isRenderTargetTexture||ee.has(e)){const n=ee.get(e),i=ee.get(t);Z.bindFramebuffer(be.READ_FRAMEBUFFER,Xe),Z.bindFramebuffer(be.DRAW_FRAMEBUFFER,Ye);for(let e=0;e<l;e++)w?be.framebufferTextureLayer(be.READ_FRAMEBUFFER,be.COLOR_ATTACHMENT0,n.__webglTexture,r,u+e):be.framebufferTexture2D(be.READ_FRAMEBUFFER,be.COLOR_ATTACHMENT0,be.TEXTURE_2D,n.__webglTexture,r),_?be.framebufferTextureLayer(be.DRAW_FRAMEBUFFER,be.COLOR_ATTACHMENT0,i.__webglTexture,s,f+e):be.framebufferTexture2D(be.DRAW_FRAMEBUFFER,be.COLOR_ATTACHMENT0,be.TEXTURE_2D,i.__webglTexture,s),0!==r?be.blitFramebuffer(c,h,o,a,d,p,o,a,be.COLOR_BUFFER_BIT,be.NEAREST):_?be.copyTexSubImage3D(v,s,d,p,f+e,c,h,o,a):be.copyTexSubImage2D(v,s,d,p,c,h,o,a);Z.bindFramebuffer(be.READ_FRAMEBUFFER,null),Z.bindFramebuffer(be.DRAW_FRAMEBUFFER,null)}else _?e.isDataTexture||e.isData3DTexture?be.texSubImage3D(v,s,d,p,f,o,a,l,A,g,m.data):t.isCompressedArrayTexture?be.compressedTexSubImage3D(v,s,d,p,f,o,a,l,A,m.data):be.texSubImage3D(v,s,d,p,f,o,a,l,A,g,m):e.isDataTexture?be.texSubImage2D(be.TEXTURE_2D,s,d,p,o,a,A,g,m.data):e.isCompressedTexture?be.compressedTexSubImage2D(be.TEXTURE_2D,s,d,p,m.width,m.height,A,m.data):be.texSubImage2D(be.TEXTURE_2D,s,d,p,o,a,A,g,m);be.pixelStorei(be.UNPACK_ROW_LENGTH,y),be.pixelStorei(be.UNPACK_IMAGE_HEIGHT,E),be.pixelStorei(be.UNPACK_SKIP_PIXELS,b),be.pixelStorei(be.UNPACK_SKIP_ROWS,x),be.pixelStorei(be.UNPACK_SKIP_IMAGES,C),0===s&&t.generateMipmaps&&be.generateMipmap(v),Z.unbindTexture()},this.copyTextureToTexture3D=function(e,t,n=null,i=null,r=0){return!0!==e.isTexture&&(Or("WebGLRenderer: copyTextureToTexture3D function signature has changed."),n=arguments[0]||null,i=arguments[1]||null,e=arguments[2],t=arguments[3],r=arguments[4]||0),Or('WebGLRenderer: copyTextureToTexture3D function has been deprecated. Use "copyTextureToTexture" instead.'),this.copyTextureToTexture(e,t,n,i,r)},this.initRenderTarget=function(e){void 0===ee.get(e).__webglFramebuffer&&te.setupRenderTarget(e)},this.initTexture=function(e){e.isCubeTexture?te.setTextureCube(e,0):e.isData3DTexture?te.setTexture3D(e,0):e.isDataArrayTexture||e.isCompressedArrayTexture?te.setTexture2DArray(e,0):te.setTexture2D(e,0),Z.unbindTexture()},this.resetState=function(){x=0,C=0,w=null,Z.reset(),ye.reset()},"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}get coordinateSystem(){return fr}get outputColorSpace(){return this._outputColorSpace}set outputColorSpace(e){this._outputColorSpace=e;const t=this.getContext();t.drawingBufferColorspace=Gr._getDrawingBufferColorSpace(e),t.unpackColorSpace=Gr._getUnpackColorSpace()}}const NA=new WeakMap;function OA(){let e,t;function n(e,t,n,i,r,s){const o=s.num_components(),a=n.num_points()*o,l=a*r.BYTES_PER_ELEMENT,c=function(e,t){switch(t){case Float32Array:return e.DT_FLOAT32;case Int8Array:return e.DT_INT8;case Int16Array:return e.DT_INT16;case Int32Array:return e.DT_INT32;case Uint8Array:return e.DT_UINT8;case Uint16Array:return e.DT_UINT16;case Uint32Array:return e.DT_UINT32}}(e,r),h=e._malloc(l);t.GetAttributeDataArrayForAllPoints(n,s,c,l,h);const u=new r(e.HEAPF32.buffer,h,a).slice();return e._free(h),{name:i,array:u,itemSize:o}}onmessage=function(i){const r=i.data;switch(r.type){case"init":e=r.decoderConfig,t=new Promise((function(t){e.onModuleLoaded=function(e){t({draco:e})},DracoDecoderModule(e)}));break;case"decode":const i=r.buffer,s=r.taskConfig;t.then((e=>{const t=e.draco,o=new t.Decoder;try{const e=function(e,t,i,r){const s=r.attributeIDs,o=r.attributeTypes;let a,l;const c=t.GetEncodedGeometryType(i);if(c===e.TRIANGULAR_MESH)a=new e.Mesh,l=t.DecodeArrayToMesh(i,i.byteLength,a);else{if(c!==e.POINT_CLOUD)throw new Error("THREE.DRACOLoader: Unexpected geometry type.");a=new e.PointCloud,l=t.DecodeArrayToPointCloud(i,i.byteLength,a)}if(!l.ok()||0===a.ptr)throw new Error("THREE.DRACOLoader: Decoding failed: "+l.error_msg());const h={index:null,attributes:[]};for(const i in s){const l=self[o[i]];let c,u;if(r.useUniqueIDs)u=s[i],c=t.GetAttributeByUniqueId(a,u);else{if(u=t.GetAttributeId(a,e[s[i]]),-1===u)continue;c=t.GetAttribute(a,u)}const d=n(e,t,a,i,l,c);"color"===i&&(d.vertexColorSpace=r.vertexColorSpace),h.attributes.push(d)}return c===e.TRIANGULAR_MESH&&(h.index=function(e,t,n){const i=3*n.num_faces(),r=4*i,s=e._malloc(r);t.GetTrianglesUInt32Array(n,r,s);const o=new Uint32Array(e.HEAPF32.buffer,s,i).slice();return e._free(s),{array:o,itemSize:1}}(e,t,a)),e.destroy(a),h}(t,o,new Int8Array(i),s),a=e.attributes.map((e=>e.array.buffer));e.index&&a.push(e.index.array.buffer),self.postMessage({type:"decode",id:r.id,geometry:e},a)}catch(e){console.error(e),self.postMessage({type:"error",id:r.id,error:e.message})}finally{t.destroy(o)}}))}}}function FA(e,t,n=!0){if(!t||!t.isReady)throw new Error("BufferGeometryUtils: Initialized MikkTSpace library required.");if(!e.hasAttribute("position")||!e.hasAttribute("normal")||!e.hasAttribute("uv"))throw new Error('BufferGeometryUtils: Tangents require "position", "normal", and "uv" attributes.');function i(e){if(e.normalized||e.isInterleavedBufferAttribute){const t=new Float32Array(e.count*e.itemSize);for(let n=0,i=0;n<e.count;n++)t[i++]=e.getX(n),t[i++]=e.getY(n),e.itemSize>2&&(t[i++]=e.getZ(n));return t}return e.array instanceof Float32Array?e.array:new Float32Array(e.array)}const r=e.index?e.toNonIndexed():e,s=t.generateTangents(i(r.attributes.position),i(r.attributes.normal),i(r.attributes.uv));if(n)for(let e=3;e<s.length;e+=4)s[e]*=-1;return r.setAttribute("tangent",new Go(s,4)),e!==r&&e.copy(r),e}function QA(e,t=!1){const n=null!==e[0].index,i=new Set(Object.keys(e[0].attributes)),r=new Set(Object.keys(e[0].morphAttributes)),s={},o={},a=e[0].morphTargetsRelative,l=new sa;let c=0;for(let h=0;h<e.length;++h){const u=e[h];let d=0;if(n!==(null!==u.index))return console.error("THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index "+h+". All geometries must have compatible attributes; make sure index attribute exists among all geometries, or in none of them."),null;for(const e in u.attributes){if(!i.has(e))return console.error("THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index "+h+'. All geometries must have compatible attributes; make sure "'+e+'" attribute exists among all geometries, or in none of them.'),null;void 0===s[e]&&(s[e]=[]),s[e].push(u.attributes[e]),d++}if(d!==i.size)return console.error("THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index "+h+". Make sure all geometries have the same number of attributes."),null;if(a!==u.morphTargetsRelative)return console.error("THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index "+h+". .morphTargetsRelative must be consistent throughout all geometries."),null;for(const e in u.morphAttributes){if(!r.has(e))return console.error("THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index "+h+".  .morphAttributes must be consistent throughout all geometries."),null;void 0===o[e]&&(o[e]=[]),o[e].push(u.morphAttributes[e])}if(t){let e;if(n)e=u.index.count;else{if(void 0===u.attributes.position)return console.error("THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index "+h+". The geometry must have either an index or a position attribute"),null;e=u.attributes.position.count}l.addGroup(c,e,h),c+=e}}if(n){let t=0;const n=[];for(let i=0;i<e.length;++i){const r=e[i].index;for(let e=0;e<r.count;++e)n.push(r.getX(e)+t);t+=e[i].attributes.position.count}l.setIndex(n)}for(const e in s){const t=zA(s[e]);if(!t)return console.error("THREE.BufferGeometryUtils: .mergeGeometries() failed while trying to merge the "+e+" attribute."),null;l.setAttribute(e,t)}for(const e in o){const t=o[e][0].length;if(0===t)break;l.morphAttributes=l.morphAttributes||{},l.morphAttributes[e]=[];for(let n=0;n<t;++n){const t=[];for(let i=0;i<o[e].length;++i)t.push(o[e][i][n]);const i=zA(t);if(!i)return console.error("THREE.BufferGeometryUtils: .mergeGeometries() failed while trying to merge the "+e+" morphAttribute."),null;l.morphAttributes[e].push(i)}}return l}function zA(e){let t,n,i,r=-1,s=0;for(let o=0;o<e.length;++o){const a=e[o];if(void 0===t&&(t=a.array.constructor),t!==a.array.constructor)return console.error("THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.array must be of consistent array types across matching attributes."),null;if(void 0===n&&(n=a.itemSize),n!==a.itemSize)return console.error("THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.itemSize must be consistent across matching attributes."),null;if(void 0===i&&(i=a.normalized),i!==a.normalized)return console.error("THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.normalized must be consistent across matching attributes."),null;if(-1===r&&(r=a.gpuType),r!==a.gpuType)return console.error("THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.gpuType must be consistent across matching attributes."),null;s+=a.count*n}const o=new t(s),a=new Go(o,n,i);let l=0;for(let t=0;t<e.length;++t){const i=e[t];if(i.isInterleavedBufferAttribute){const e=l/n;for(let t=0,r=i.count;t<r;t++)for(let r=0;r<n;r++){const n=i.getComponent(t,r);a.setComponent(t+e,r,n)}}else o.set(i.array,l);l+=i.count*n}return void 0!==r&&(a.gpuType=r),a}function GA(e){return e.isInstancedInterleavedBufferAttribute||e.isInterleavedBufferAttribute?VA(e):e.isInstancedBufferAttribute?(new Cl).copy(e):(new Go).copy(e)}function HA(e){let t,n=0,i=0;for(let r=0,s=e.length;r<s;++r){const s=e[r];if(void 0===t&&(t=s.array.constructor),t!==s.array.constructor)return console.error("AttributeBuffers of different types cannot be interleaved"),null;n+=s.array.length,i+=s.itemSize}const r=new Qa(new t(n),i);let s=0;const o=[],a=["getX","getY","getZ","getW"],l=["setX","setY","setZ","setW"];for(let t=0,n=e.length;t<n;t++){const n=e[t],i=n.itemSize,c=n.count,h=new Ga(r,i,s,n.normalized);o.push(h),s+=i;for(let e=0;e<c;e++)for(let t=0;t<i;t++)h[l[t]](e,n[a[t]](e))}return o}function VA(e){const t=e.data.array.constructor,n=e.count,i=e.itemSize,r=e.normalized,s=new t(n*i);let o;o=e.isInstancedInterleavedBufferAttribute?new Cl(s,i,r,e.meshPerAttribute):new Go(s,i,r);for(let t=0;t<n;t++)o.setX(t,e.getX(t)),i>=2&&o.setY(t,e.getY(t)),i>=3&&o.setZ(t,e.getZ(t)),i>=4&&o.setW(t,e.getW(t));return o}function jA(e){const t=e.attributes,n=e.morphTargets,i=new Map;for(const e in t){const n=t[e];n.isInterleavedBufferAttribute&&(i.has(n)||i.set(n,VA(n)),t[e]=i.get(n))}for(const e in n){const t=n[e];t.isInterleavedBufferAttribute&&(i.has(t)||i.set(t,VA(t)),n[e]=i.get(t))}}function WA(e){let t=0;for(const n in e.attributes){const i=e.getAttribute(n);t+=i.count*i.itemSize*i.array.BYTES_PER_ELEMENT}const n=e.getIndex();return t+=n?n.count*n.itemSize*n.array.BYTES_PER_ELEMENT:0,t}function qA(e,t=1e-4){t=Math.max(t,Number.EPSILON);const n={},i=e.getIndex(),r=e.getAttribute("position"),s=i?i.count:r.count;let o=0;const a=Object.keys(e.attributes),l={},c={},h=[],u=["getX","getY","getZ","getW"],d=["setX","setY","setZ","setW"];for(let t=0,n=a.length;t<n;t++){const n=a[t],i=e.attributes[n];l[n]=new i.constructor(new i.array.constructor(i.count*i.itemSize),i.itemSize,i.normalized);const r=e.morphAttributes[n];r&&(c[n]||(c[n]=[]),r.forEach(((e,t)=>{const i=new e.array.constructor(e.count*e.itemSize);c[n][t]=new e.constructor(i,e.itemSize,e.normalized)})))}const p=.5*t,f=Math.log10(1/t),m=Math.pow(10,f),A=p*m;for(let t=0;t<s;t++){const r=i?i.getX(t):t;let s="";for(let t=0,n=a.length;t<n;t++){const n=a[t],i=e.getAttribute(n),o=i.itemSize;for(let e=0;e<o;e++)s+=~~(i[u[e]](r)*m+A)+","}if(s in n)h.push(n[s]);else{for(let t=0,n=a.length;t<n;t++){const n=a[t],i=e.getAttribute(n),s=e.morphAttributes[n],h=i.itemSize,p=l[n],f=c[n];for(let e=0;e<h;e++){const t=u[e],n=d[e];if(p[n](o,i[t](r)),s)for(let e=0,i=s.length;e<i;e++)f[e][n](o,s[e][t](r))}}n[s]=o,h.push(o),o++}}const g=e.clone();for(const t in e.attributes){const e=l[t];if(g.setAttribute(t,new e.constructor(e.array.slice(0,o*e.itemSize),e.itemSize,e.normalized)),t in c)for(let e=0;e<c[t].length;e++){const n=c[t][e];g.morphAttributes[t][e]=new n.constructor(n.array.slice(0,o*n.itemSize),n.itemSize,n.normalized)}}return g.setIndex(h),g}function XA(e,t){if(t===yi)return console.warn("THREE.BufferGeometryUtils.toTrianglesDrawMode(): Geometry already defined as triangles."),e;if(t===bi||t===Ei){let n=e.getIndex();if(null===n){const t=[],i=e.getAttribute("position");if(void 0===i)return console.error("THREE.BufferGeometryUtils.toTrianglesDrawMode(): Undefined position attribute. Processing not possible."),e;for(let e=0;e<i.count;e++)t.push(e);e.setIndex(t),n=e.getIndex()}const i=n.count-2,r=[];if(t===bi)for(let e=1;e<=i;e++)r.push(n.getX(0)),r.push(n.getX(e)),r.push(n.getX(e+1));else for(let e=0;e<i;e++)e%2==0?(r.push(n.getX(e)),r.push(n.getX(e+1)),r.push(n.getX(e+2))):(r.push(n.getX(e+2)),r.push(n.getX(e+1)),r.push(n.getX(e)));r.length/3!==i&&console.error("THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unable to generate correct amount of triangles.");const s=e.clone();return s.setIndex(r),s.clearGroups(),s}return console.error("THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unknown draw mode:",t),e}function YA(e){const t=new os,n=new os,i=new os,r=new os,s=new os,o=new os,a=new os,l=new os,c=new os;function h(e,h,u,d,p,f,m,A){t.fromBufferAttribute(h,p),n.fromBufferAttribute(h,f),i.fromBufferAttribute(h,m);const g=e.morphTargetInfluences;if(u&&g){a.set(0,0,0),l.set(0,0,0),c.set(0,0,0);for(let e=0,h=u.length;e<h;e++){const h=g[e],A=u[e];0!==h&&(r.fromBufferAttribute(A,p),s.fromBufferAttribute(A,f),o.fromBufferAttribute(A,m),d?(a.addScaledVector(r,h),l.addScaledVector(s,h),c.addScaledVector(o,h)):(a.addScaledVector(r.sub(t),h),l.addScaledVector(s.sub(n),h),c.addScaledVector(o.sub(i),h)))}t.add(a),n.add(l),i.add(c)}e.isSkinnedMesh&&(e.applyBoneTransform(p,t),e.applyBoneTransform(f,n),e.applyBoneTransform(m,i)),A[3*p+0]=t.x,A[3*p+1]=t.y,A[3*p+2]=t.z,A[3*f+0]=n.x,A[3*f+1]=n.y,A[3*f+2]=n.z,A[3*m+0]=i.x,A[3*m+1]=i.y,A[3*m+2]=i.z}const u=e.geometry,d=e.material;let p,f,m;const A=u.index,g=u.attributes.position,v=u.morphAttributes.position,y=u.morphTargetsRelative,E=u.attributes.normal,b=u.morphAttributes.position,x=u.groups,C=u.drawRange;let w,_,M,I,S,T,B;const R=new Float32Array(g.count*g.itemSize),L=new Float32Array(E.count*E.itemSize);if(null!==A)if(Array.isArray(d))for(w=0,M=x.length;w<M;w++)for(S=x[w],T=Math.max(S.start,C.start),B=Math.min(S.start+S.count,C.start+C.count),_=T,I=B;_<I;_+=3)p=A.getX(_),f=A.getX(_+1),m=A.getX(_+2),h(e,g,v,y,p,f,m,R),h(e,E,b,y,p,f,m,L);else for(T=Math.max(0,C.start),B=Math.min(A.count,C.start+C.count),w=T,M=B;w<M;w+=3)p=A.getX(w),f=A.getX(w+1),m=A.getX(w+2),h(e,g,v,y,p,f,m,R),h(e,E,b,y,p,f,m,L);else if(Array.isArray(d))for(w=0,M=x.length;w<M;w++)for(S=x[w],T=Math.max(S.start,C.start),B=Math.min(S.start+S.count,C.start+C.count),_=T,I=B;_<I;_+=3)p=_,f=_+1,m=_+2,h(e,g,v,y,p,f,m,R),h(e,E,b,y,p,f,m,L);else for(T=Math.max(0,C.start),B=Math.min(g.count,C.start+C.count),w=T,M=B;w<M;w+=3)p=w,f=w+1,m=w+2,h(e,g,v,y,p,f,m,R),h(e,E,b,y,p,f,m,L);return{positionAttribute:g,normalAttribute:E,morphedPositionAttribute:new Ko(R,3),morphedNormalAttribute:new Ko(L,3)}}function JA(e){if(0===e.groups.length)return console.warn("THREE.BufferGeometryUtils.mergeGroups(): No groups are defined. Nothing to merge."),e;let t=e.groups;if(t=t.sort(((e,t)=>e.materialIndex!==t.materialIndex?e.materialIndex-t.materialIndex:e.start-t.start)),null===e.getIndex()){const t=e.getAttribute("position"),n=[];for(let e=0;e<t.count;e+=3)n.push(e,e+1,e+2);e.setIndex(n)}const n=e.getIndex(),i=[];for(let e=0;e<t.length;e++){const r=t[e],s=r.start,o=s+r.count;for(let e=s;e<o;e++)i.push(n.getX(e))}e.dispose(),e.setIndex(i);let r=0;for(let e=0;e<t.length;e++){const n=t[e];n.start=r,r+=n.count}let s=t[0];e.groups=[s];for(let n=1;n<t.length;n++){const i=t[n];s.materialIndex===i.materialIndex?s.count+=i.count:(s=i,e.groups.push(s))}return e}function KA(e,t=Math.PI/3){const n=Math.cos(t),i=100*(1+1e-10),r=[new os,new os,new os],s=new os,o=new os,a=new os,l=new os;function c(e){return`${~~(e.x*i)},${~~(e.y*i)},${~~(e.z*i)}`}const h=e.index?e.toNonIndexed():e,u=h.attributes.position,d={};for(let e=0,t=u.count/3;e<t;e++){const t=3*e,n=r[0].fromBufferAttribute(u,t+0),i=r[1].fromBufferAttribute(u,t+1),a=r[2].fromBufferAttribute(u,t+2);s.subVectors(a,i),o.subVectors(n,i);const l=(new os).crossVectors(s,o).normalize();for(let e=0;e<3;e++){const t=c(r[e]);t in d||(d[t]=[]),d[t].push(l)}}const p=new Float32Array(3*u.count),f=new Go(p,3,!1);for(let e=0,t=u.count/3;e<t;e++){const t=3*e,i=r[0].fromBufferAttribute(u,t+0),h=r[1].fromBufferAttribute(u,t+1),p=r[2].fromBufferAttribute(u,t+2);s.subVectors(p,h),o.subVectors(i,h),a.crossVectors(s,o).normalize();for(let e=0;e<3;e++){const i=d[c(r[e])];l.set(0,0,0);for(let e=0,t=i.length;e<t;e++){const t=i[e];a.dot(t)>n&&l.add(t)}l.normalize(),f.setXYZ(t+e,l.x,l.y,l.z)}}return h.setAttribute("normal",f),h}function ZA(){let e={};return{get:function(t){return e[t]},add:function(t,n){e[t]=n},remove:function(t){delete e[t]},removeAll:function(){e={}}}}const $A="KHR_binary_glTF",eg="KHR_draco_mesh_compression",tg="KHR_lights_punctual",ng="KHR_materials_clearcoat",ig="KHR_materials_dispersion",rg="KHR_materials_ior",sg="KHR_materials_sheen",og="KHR_materials_specular",ag="KHR_materials_transmission",lg="KHR_materials_iridescence",cg="KHR_materials_anisotropy",hg="KHR_materials_unlit",ug="KHR_materials_volume",dg="KHR_texture_basisu",pg="KHR_texture_transform",fg="KHR_mesh_quantization",mg="KHR_materials_emissive_strength",Ag="EXT_materials_bump",gg="EXT_texture_webp",vg="EXT_texture_avif",yg="EXT_meshopt_compression",Eg="EXT_mesh_gpu_instancing";class bg{constructor(e){this.parser=e,this.name=tg,this.cache={refs:{},uses:{}}}_markDefs(){const e=this.parser,t=this.parser.json.nodes||[];for(let n=0,i=t.length;n<i;n++){const i=t[n];i.extensions&&i.extensions[this.name]&&void 0!==i.extensions[this.name].light&&e._addNodeRef(this.cache,i.extensions[this.name].light)}}_loadLight(e){const t=this.parser,n="light:"+e;let i=t.cache.get(n);if(i)return i;const r=t.json,s=((r.extensions&&r.extensions[this.name]||{}).lights||[])[e];let o;const a=new To(16777215);void 0!==s.color&&a.setRGB(s.color[0],s.color[1],s.color[2],Bi);const l=void 0!==s.range?s.range:0;switch(s.type){case"directional":o=new ad(a),o.target.position.set(0,0,-1),o.add(o.target);break;case"point":o=new rd(a),o.distance=l;break;case"spot":o=new $u(a),o.distance=l,s.spot=s.spot||{},s.spot.innerConeAngle=void 0!==s.spot.innerConeAngle?s.spot.innerConeAngle:0,s.spot.outerConeAngle=void 0!==s.spot.outerConeAngle?s.spot.outerConeAngle:Math.PI/4,o.angle=s.spot.outerConeAngle,o.penumbra=1-s.spot.innerConeAngle/s.spot.outerConeAngle,o.target.position.set(0,0,-1),o.add(o.target);break;default:throw new Error("THREE.GLTFLoader: Unexpected light type: "+s.type)}return o.position.set(0,0,0),iv(o,s),void 0!==s.intensity&&(o.intensity=s.intensity),o.name=t.createUniqueName(s.name||"light_"+e),i=Promise.resolve(o),t.cache.add(n,i),i}getDependency(e,t){if("light"===e)return this._loadLight(t)}createNodeAttachment(e){const t=this,n=this.parser,i=n.json.nodes[e],r=(i.extensions&&i.extensions[this.name]||{}).light;return void 0===r?null:this._loadLight(r).then((function(e){return n._getNodeRef(t.cache,r,e)}))}}class xg{constructor(){this.name=hg}getMaterialType(){return Do}extendParams(e,t,n){const i=[];e.color=new To(1,1,1),e.opacity=1;const r=t.pbrMetallicRoughness;if(r){if(Array.isArray(r.baseColorFactor)){const t=r.baseColorFactor;e.color.setRGB(t[0],t[1],t[2],Bi),e.opacity=t[3]}void 0!==r.baseColorTexture&&i.push(n.assignTexture(e,"map",r.baseColorTexture,Ti))}return Promise.all(i)}}class Cg{constructor(e){this.parser=e,this.name=mg}extendMaterialParams(e,t){const n=this.parser.json.materials[e];if(!n.extensions||!n.extensions[this.name])return Promise.resolve();const i=n.extensions[this.name].emissiveStrength;return void 0!==i&&(t.emissiveIntensity=i),Promise.resolve()}}class wg{constructor(e){this.parser=e,this.name=ng}getMaterialType(e){const t=this.parser.json.materials[e];return t.extensions&&t.extensions[this.name]?ru:null}extendMaterialParams(e,t){const n=this.parser,i=n.json.materials[e];if(!i.extensions||!i.extensions[this.name])return Promise.resolve();const r=[],s=i.extensions[this.name];if(void 0!==s.clearcoatFactor&&(t.clearcoat=s.clearcoatFactor),void 0!==s.clearcoatTexture&&r.push(n.assignTexture(t,"clearcoatMap",s.clearcoatTexture)),void 0!==s.clearcoatRoughnessFactor&&(t.clearcoatRoughness=s.clearcoatRoughnessFactor),void 0!==s.clearcoatRoughnessTexture&&r.push(n.assignTexture(t,"clearcoatRoughnessMap",s.clearcoatRoughnessTexture)),void 0!==s.clearcoatNormalTexture&&(r.push(n.assignTexture(t,"clearcoatNormalMap",s.clearcoatNormalTexture)),void 0!==s.clearcoatNormalTexture.scale)){const e=s.clearcoatNormalTexture.scale;t.clearcoatNormalScale=new Tr(e,e)}return Promise.all(r)}}class _g{constructor(e){this.parser=e,this.name=ig}getMaterialType(e){const t=this.parser.json.materials[e];return t.extensions&&t.extensions[this.name]?ru:null}extendMaterialParams(e,t){const n=this.parser.json.materials[e];if(!n.extensions||!n.extensions[this.name])return Promise.resolve();const i=n.extensions[this.name];return t.dispersion=void 0!==i.dispersion?i.dispersion:0,Promise.resolve()}}class Mg{constructor(e){this.parser=e,this.name=lg}getMaterialType(e){const t=this.parser.json.materials[e];return t.extensions&&t.extensions[this.name]?ru:null}extendMaterialParams(e,t){const n=this.parser,i=n.json.materials[e];if(!i.extensions||!i.extensions[this.name])return Promise.resolve();const r=[],s=i.extensions[this.name];return void 0!==s.iridescenceFactor&&(t.iridescence=s.iridescenceFactor),void 0!==s.iridescenceTexture&&r.push(n.assignTexture(t,"iridescenceMap",s.iridescenceTexture)),void 0!==s.iridescenceIor&&(t.iridescenceIOR=s.iridescenceIor),void 0===t.iridescenceThicknessRange&&(t.iridescenceThicknessRange=[100,400]),void 0!==s.iridescenceThicknessMinimum&&(t.iridescenceThicknessRange[0]=s.iridescenceThicknessMinimum),void 0!==s.iridescenceThicknessMaximum&&(t.iridescenceThicknessRange[1]=s.iridescenceThicknessMaximum),void 0!==s.iridescenceThicknessTexture&&r.push(n.assignTexture(t,"iridescenceThicknessMap",s.iridescenceThicknessTexture)),Promise.all(r)}}class Ig{constructor(e){this.parser=e,this.name=sg}getMaterialType(e){const t=this.parser.json.materials[e];return t.extensions&&t.extensions[this.name]?ru:null}extendMaterialParams(e,t){const n=this.parser,i=n.json.materials[e];if(!i.extensions||!i.extensions[this.name])return Promise.resolve();const r=[];t.sheenColor=new To(0,0,0),t.sheenRoughness=0,t.sheen=1;const s=i.extensions[this.name];if(void 0!==s.sheenColorFactor){const e=s.sheenColorFactor;t.sheenColor.setRGB(e[0],e[1],e[2],Bi)}return void 0!==s.sheenRoughnessFactor&&(t.sheenRoughness=s.sheenRoughnessFactor),void 0!==s.sheenColorTexture&&r.push(n.assignTexture(t,"sheenColorMap",s.sheenColorTexture,Ti)),void 0!==s.sheenRoughnessTexture&&r.push(n.assignTexture(t,"sheenRoughnessMap",s.sheenRoughnessTexture)),Promise.all(r)}}class Sg{constructor(e){this.parser=e,this.name=ag}getMaterialType(e){const t=this.parser.json.materials[e];return t.extensions&&t.extensions[this.name]?ru:null}extendMaterialParams(e,t){const n=this.parser,i=n.json.materials[e];if(!i.extensions||!i.extensions[this.name])return Promise.resolve();const r=[],s=i.extensions[this.name];return void 0!==s.transmissionFactor&&(t.transmission=s.transmissionFactor),void 0!==s.transmissionTexture&&r.push(n.assignTexture(t,"transmissionMap",s.transmissionTexture)),Promise.all(r)}}class Tg{constructor(e){this.parser=e,this.name=ug}getMaterialType(e){const t=this.parser.json.materials[e];return t.extensions&&t.extensions[this.name]?ru:null}extendMaterialParams(e,t){const n=this.parser,i=n.json.materials[e];if(!i.extensions||!i.extensions[this.name])return Promise.resolve();const r=[],s=i.extensions[this.name];t.thickness=void 0!==s.thicknessFactor?s.thicknessFactor:0,void 0!==s.thicknessTexture&&r.push(n.assignTexture(t,"thicknessMap",s.thicknessTexture)),t.attenuationDistance=s.attenuationDistance||1/0;const o=s.attenuationColor||[1,1,1];return t.attenuationColor=(new To).setRGB(o[0],o[1],o[2],Bi),Promise.all(r)}}class Bg{constructor(e){this.parser=e,this.name=rg}getMaterialType(e){const t=this.parser.json.materials[e];return t.extensions&&t.extensions[this.name]?ru:null}extendMaterialParams(e,t){const n=this.parser.json.materials[e];if(!n.extensions||!n.extensions[this.name])return Promise.resolve();const i=n.extensions[this.name];return t.ior=void 0!==i.ior?i.ior:1.5,Promise.resolve()}}class Rg{constructor(e){this.parser=e,this.name=og}getMaterialType(e){const t=this.parser.json.materials[e];return t.extensions&&t.extensions[this.name]?ru:null}extendMaterialParams(e,t){const n=this.parser,i=n.json.materials[e];if(!i.extensions||!i.extensions[this.name])return Promise.resolve();const r=[],s=i.extensions[this.name];t.specularIntensity=void 0!==s.specularFactor?s.specularFactor:1,void 0!==s.specularTexture&&r.push(n.assignTexture(t,"specularIntensityMap",s.specularTexture));const o=s.specularColorFactor||[1,1,1];return t.specularColor=(new To).setRGB(o[0],o[1],o[2],Bi),void 0!==s.specularColorTexture&&r.push(n.assignTexture(t,"specularColorMap",s.specularColorTexture,Ti)),Promise.all(r)}}class Lg{constructor(e){this.parser=e,this.name=Ag}getMaterialType(e){const t=this.parser.json.materials[e];return t.extensions&&t.extensions[this.name]?ru:null}extendMaterialParams(e,t){const n=this.parser,i=n.json.materials[e];if(!i.extensions||!i.extensions[this.name])return Promise.resolve();const r=[],s=i.extensions[this.name];return t.bumpScale=void 0!==s.bumpFactor?s.bumpFactor:1,void 0!==s.bumpTexture&&r.push(n.assignTexture(t,"bumpMap",s.bumpTexture)),Promise.all(r)}}class Dg{constructor(e){this.parser=e,this.name=cg}getMaterialType(e){const t=this.parser.json.materials[e];return t.extensions&&t.extensions[this.name]?ru:null}extendMaterialParams(e,t){const n=this.parser,i=n.json.materials[e];if(!i.extensions||!i.extensions[this.name])return Promise.resolve();const r=[],s=i.extensions[this.name];return void 0!==s.anisotropyStrength&&(t.anisotropy=s.anisotropyStrength),void 0!==s.anisotropyRotation&&(t.anisotropyRotation=s.anisotropyRotation),void 0!==s.anisotropyTexture&&r.push(n.assignTexture(t,"anisotropyMap",s.anisotropyTexture)),Promise.all(r)}}class Pg{constructor(e){this.parser=e,this.name=dg}loadTexture(e){const t=this.parser,n=t.json,i=n.textures[e];if(!i.extensions||!i.extensions[this.name])return null;const r=i.extensions[this.name],s=t.options.ktx2Loader;if(!s){if(n.extensionsRequired&&n.extensionsRequired.indexOf(this.name)>=0)throw new Error("THREE.GLTFLoader: setKTX2Loader must be called before loading KTX2 textures");return null}return t.loadTextureImage(e,r.source,s)}}class Ug{constructor(e){this.parser=e,this.name=gg,this.isSupported=null}loadTexture(e){const t=this.name,n=this.parser,i=n.json,r=i.textures[e];if(!r.extensions||!r.extensions[t])return null;const s=r.extensions[t],o=i.images[s.source];let a=n.textureLoader;if(o.uri){const e=n.options.manager.getHandler(o.uri);null!==e&&(a=e)}return this.detectSupport().then((function(r){if(r)return n.loadTextureImage(e,s.source,a);if(i.extensionsRequired&&i.extensionsRequired.indexOf(t)>=0)throw new Error("THREE.GLTFLoader: WebP required by asset but unsupported.");return n.loadTexture(e)}))}detectSupport(){return this.isSupported||(this.isSupported=new Promise((function(e){const t=new Image;t.src="data:image/webp;base64,UklGRiIAAABXRUJQVlA4IBYAAAAwAQCdASoBAAEADsD+JaQAA3AAAAAA",t.onload=t.onerror=function(){e(1===t.height)}}))),this.isSupported}}class kg{constructor(e){this.parser=e,this.name=vg,this.isSupported=null}loadTexture(e){const t=this.name,n=this.parser,i=n.json,r=i.textures[e];if(!r.extensions||!r.extensions[t])return null;const s=r.extensions[t],o=i.images[s.source];let a=n.textureLoader;if(o.uri){const e=n.options.manager.getHandler(o.uri);null!==e&&(a=e)}return this.detectSupport().then((function(r){if(r)return n.loadTextureImage(e,s.source,a);if(i.extensionsRequired&&i.extensionsRequired.indexOf(t)>=0)throw new Error("THREE.GLTFLoader: AVIF required by asset but unsupported.");return n.loadTexture(e)}))}detectSupport(){return this.isSupported||(this.isSupported=new Promise((function(e){const t=new Image;t.src="data:image/avif;base64,AAAAIGZ0eXBhdmlmAAAAAGF2aWZtaWYxbWlhZk1BMUIAAADybWV0YQAAAAAAAAAoaGRscgAAAAAAAAAAcGljdAAAAAAAAAAAAAAAAGxpYmF2aWYAAAAADnBpdG0AAAAAAAEAAAAeaWxvYwAAAABEAAABAAEAAAABAAABGgAAABcAAAAoaWluZgAAAAAAAQAAABppbmZlAgAAAAABAABhdjAxQ29sb3IAAAAAamlwcnAAAABLaXBjbwAAABRpc3BlAAAAAAAAAAEAAAABAAAAEHBpeGkAAAAAAwgICAAAAAxhdjFDgQAMAAAAABNjb2xybmNseAACAAIABoAAAAAXaXBtYQAAAAAAAAABAAEEAQKDBAAAAB9tZGF0EgAKCBgABogQEDQgMgkQAAAAB8dSLfI=",t.onload=t.onerror=function(){e(1===t.height)}}))),this.isSupported}}class Ng{constructor(e){this.name=yg,this.parser=e}loadBufferView(e){const t=this.parser.json,n=t.bufferViews[e];if(n.extensions&&n.extensions[this.name]){const e=n.extensions[this.name],i=this.parser.getDependency("buffer",e.buffer),r=this.parser.options.meshoptDecoder;if(!r||!r.supported){if(t.extensionsRequired&&t.extensionsRequired.indexOf(this.name)>=0)throw new Error("THREE.GLTFLoader: setMeshoptDecoder must be called before loading compressed files");return null}return i.then((function(t){const n=e.byteOffset||0,i=e.byteLength||0,s=e.count,o=e.byteStride,a=new Uint8Array(t,n,i);return r.decodeGltfBufferAsync?r.decodeGltfBufferAsync(s,o,a,e.mode,e.filter).then((function(e){return e.buffer})):r.ready.then((function(){const t=new ArrayBuffer(s*o);return r.decodeGltfBuffer(new Uint8Array(t),s,o,a,e.mode,e.filter),t}))}))}return null}}class Og{constructor(e){this.name=Eg,this.parser=e}createNodeMesh(e){const t=this.parser.json,n=t.nodes[e];if(!n.extensions||!n.extensions[this.name]||void 0===n.mesh)return null;const i=t.meshes[n.mesh];for(const e of i.primitives)if(e.mode!==qg.TRIANGLES&&e.mode!==qg.TRIANGLE_STRIP&&e.mode!==qg.TRIANGLE_FAN&&void 0!==e.mode)return null;const r=n.extensions[this.name].attributes,s=[],o={};for(const e in r)s.push(this.parser.getDependency("accessor",r[e]).then((t=>(o[e]=t,o[e]))));return s.length<1?null:(s.push(this.parser.createNodeMesh(e)),Promise.all(s).then((e=>{const t=e.pop(),n=t.isGroup?t.children:[t],i=e[0].count,r=[];for(const e of n){const t=new ks,n=new os,s=new ss,a=new os(1,1,1),l=new Rl(e.geometry,e.material,i);for(let e=0;e<i;e++)o.TRANSLATION&&n.fromBufferAttribute(o.TRANSLATION,e),o.ROTATION&&s.fromBufferAttribute(o.ROTATION,e),o.SCALE&&a.fromBufferAttribute(o.SCALE,e),l.setMatrixAt(e,t.compose(n,s,a));for(const t in o)if("_COLOR_0"===t){const e=o[t];l.instanceColor=new Cl(e.array,e.itemSize,e.normalized)}else"TRANSLATION"!==t&&"ROTATION"!==t&&"SCALE"!==t&&e.geometry.setAttribute(t,o[t]);co.prototype.copy.call(l,e),this.parser.assignFinalMaterial(l),r.push(l)}return t.isGroup?(t.clear(),t.add(...r),t):r[0]})))}}const Fg="glTF";class Qg{constructor(e){this.name=$A,this.content=null,this.body=null;const t=new DataView(e,0,12),n=new TextDecoder;if(this.header={magic:n.decode(new Uint8Array(e.slice(0,4))),version:t.getUint32(4,!0),length:t.getUint32(8,!0)},this.header.magic!==Fg)throw new Error("THREE.GLTFLoader: Unsupported glTF-Binary header.");if(this.header.version<2)throw new Error("THREE.GLTFLoader: Legacy binary file detected.");const i=this.header.length-12,r=new DataView(e,12);let s=0;for(;s<i;){const t=r.getUint32(s,!0);s+=4;const i=r.getUint32(s,!0);if(s+=4,1313821514===i){const i=new Uint8Array(e,12+s,t);this.content=n.decode(i)}else if(5130562===i){const n=12+s;this.body=e.slice(n,n+t)}s+=t}if(null===this.content)throw new Error("THREE.GLTFLoader: JSON content not found.")}}class zg{constructor(e,t){if(!t)throw new Error("THREE.GLTFLoader: No DRACOLoader instance provided.");this.name=eg,this.json=e,this.dracoLoader=t,this.dracoLoader.preload()}decodePrimitive(e,t){const n=this.json,i=this.dracoLoader,r=e.extensions[this.name].bufferView,s=e.extensions[this.name].attributes,o={},a={},l={};for(const e in s){const t=Zg[e]||e.toLowerCase();o[t]=s[e]}for(const t in e.attributes){const i=Zg[t]||t.toLowerCase();if(void 0!==s[t]){const r=n.accessors[e.attributes[t]],s=Xg[r.componentType];l[i]=s.name,a[i]=!0===r.normalized}}return t.getDependency("bufferView",r).then((function(e){return new Promise((function(t,n){i.decodeDracoFile(e,(function(e){for(const t in e.attributes){const n=e.attributes[t],i=a[t];void 0!==i&&(n.normalized=i)}t(e)}),o,l,Bi,n)}))}))}}class Gg{constructor(){this.name=pg}extendTexture(e,t){return void 0!==t.texCoord&&t.texCoord!==e.channel||void 0!==t.offset||void 0!==t.rotation||void 0!==t.scale?(e=e.clone(),void 0!==t.texCoord&&(e.channel=t.texCoord),void 0!==t.offset&&e.offset.fromArray(t.offset),void 0!==t.rotation&&(e.rotation=t.rotation),void 0!==t.scale&&e.repeat.fromArray(t.scale),e.needsUpdate=!0,e):e}}class Hg{constructor(){this.name=fg}}class Vg extends yu{constructor(e,t,n,i){super(e,t,n,i)}copySampleValue_(e){const t=this.resultBuffer,n=this.sampleValues,i=this.valueSize,r=e*i*3+i;for(let e=0;e!==i;e++)t[e]=n[r+e];return t}interpolate_(e,t,n,i){const r=this.resultBuffer,s=this.sampleValues,o=this.valueSize,a=2*o,l=3*o,c=i-t,h=(n-t)/c,u=h*h,d=u*h,p=e*l,f=p-l,m=-2*d+3*u,A=d-u,g=1-m,v=A-u+h;for(let e=0;e!==o;e++){const t=s[f+e+o],n=s[f+e+a]*c,i=s[p+e+o],l=s[p+e]*c;r[e]=g*t+v*n+m*i+A*l}return r}}const jg=new ss;class Wg extends Vg{interpolate_(e,t,n,i){const r=super.interpolate_(e,t,n,i);return jg.fromArray(r).normalize().toArray(r),r}}const qg={FLOAT:5126,FLOAT_MAT3:35675,FLOAT_MAT4:35676,FLOAT_VEC2:35664,FLOAT_VEC3:35665,FLOAT_VEC4:35666,LINEAR:9729,REPEAT:10497,SAMPLER_2D:35678,POINTS:0,LINES:1,LINE_LOOP:2,LINE_STRIP:3,TRIANGLES:4,TRIANGLE_STRIP:5,TRIANGLE_FAN:6,UNSIGNED_BYTE:5121,UNSIGNED_SHORT:5123},Xg={5120:Int8Array,5121:Uint8Array,5122:Int16Array,5123:Uint16Array,5125:Uint32Array,5126:Float32Array},Yg={9728:Xt,9729:$t,9984:Yt,9985:en,9986:Kt,9987:nn},Jg={33071:Wt,33648:qt,10497:jt},Kg={SCALAR:1,VEC2:2,VEC3:3,VEC4:4,MAT2:4,MAT3:9,MAT4:16},Zg={POSITION:"position",NORMAL:"normal",TANGENT:"tangent",TEXCOORD_0:"uv",TEXCOORD_1:"uv1",TEXCOORD_2:"uv2",TEXCOORD_3:"uv3",COLOR_0:"color",WEIGHTS_0:"skinWeight",JOINTS_0:"skinIndex"},$g={scale:"scale",translation:"position",rotation:"quaternion",weights:"morphTargetInfluences"},ev={CUBICSPLINE:void 0,LINEAR:di,STEP:ui};function tv(e){return void 0===e.DefaultMaterial&&(e.DefaultMaterial=new iu({color:16777215,emissive:0,metalness:1,roughness:1,transparent:!1,depthTest:!0,side:He})),e.DefaultMaterial}function nv(e,t,n){for(const i in n.extensions)void 0===e[i]&&(t.userData.gltfExtensions=t.userData.gltfExtensions||{},t.userData.gltfExtensions[i]=n.extensions[i])}function iv(e,t){void 0!==t.extras&&("object"==typeof t.extras?Object.assign(e.userData,t.extras):console.warn("THREE.GLTFLoader: Ignoring primitive type .extras, "+t.extras))}function rv(e,t){if(e.updateMorphTargets(),void 0!==t.weights)for(let n=0,i=t.weights.length;n<i;n++)e.morphTargetInfluences[n]=t.weights[n];if(t.extras&&Array.isArray(t.extras.targetNames)){const n=t.extras.targetNames;if(e.morphTargetInfluences.length===n.length){e.morphTargetDictionary={};for(let t=0,i=n.length;t<i;t++)e.morphTargetDictionary[n[t]]=t}else console.warn("THREE.GLTFLoader: Invalid extras.targetNames length. Ignoring names.")}}function sv(e){let t;const n=e.extensions&&e.extensions[eg];if(t=n?"draco:"+n.bufferView+":"+n.indices+":"+ov(n.attributes):e.indices+":"+ov(e.attributes)+":"+e.mode,void 0!==e.targets)for(let n=0,i=e.targets.length;n<i;n++)t+=":"+ov(e.targets[n]);return t}function ov(e){let t="";const n=Object.keys(e).sort();for(let i=0,r=n.length;i<r;i++)t+=n[i]+":"+e[n[i]]+";";return t}function av(e){switch(e){case Int8Array:return 1/127;case Uint8Array:return 1/255;case Int16Array:return 1/32767;case Uint16Array:return 1/65535;default:throw new Error("THREE.GLTFLoader: Unsupported normalized accessor component type.")}}const lv=new ks;class cv{constructor(e={},t={}){this.json=e,this.extensions={},this.plugins={},this.options=t,this.cache=new ZA,this.associations=new Map,this.primitiveCache={},this.nodeCache={},this.meshCache={refs:{},uses:{}},this.cameraCache={refs:{},uses:{}},this.lightCache={refs:{},uses:{}},this.sourceCache={},this.textureCache={},this.nodeNamesUsed={};let n=!1,i=-1,r=!1,s=-1;if("undefined"!=typeof navigator){const e=navigator.userAgent;n=!0===/^((?!chrome|android).)*safari/i.test(e);const t=e.match(/Version\/(\d+)/);i=n&&t?parseInt(t[1],10):-1,r=e.indexOf("Firefox")>-1,s=r?e.match(/Firefox\/([0-9]+)\./)[1]:-1}"undefined"==typeof createImageBitmap||n&&i<17||r&&s<98?this.textureLoader=new ju(this.options.manager):this.textureLoader=new Ed(this.options.manager),this.textureLoader.setCrossOrigin(this.options.crossOrigin),this.textureLoader.setRequestHeader(this.options.requestHeader),this.fileLoader=new Fu(this.options.manager),this.fileLoader.setResponseType("arraybuffer"),"use-credentials"===this.options.crossOrigin&&this.fileLoader.setWithCredentials(!0)}setExtensions(e){this.extensions=e}setPlugins(e){this.plugins=e}parse(e,t){const n=this,i=this.json,r=this.extensions;this.cache.removeAll(),this.nodeCache={},this._invokeAll((function(e){return e._markDefs&&e._markDefs()})),Promise.all(this._invokeAll((function(e){return e.beforeRoot&&e.beforeRoot()}))).then((function(){return Promise.all([n.getDependencies("scene"),n.getDependencies("animation"),n.getDependencies("camera")])})).then((function(t){const s={scene:t[0][i.scene||0],scenes:t[0],animations:t[1],cameras:t[2],asset:i.asset,parser:n,userData:{}};return nv(r,s,i),iv(s,i),Promise.all(n._invokeAll((function(e){return e.afterRoot&&e.afterRoot(s)}))).then((function(){for(const e of s.scenes)e.updateMatrixWorld();e(s)}))})).catch(t)}_markDefs(){const e=this.json.nodes||[],t=this.json.skins||[],n=this.json.meshes||[];for(let n=0,i=t.length;n<i;n++){const i=t[n].joints;for(let t=0,n=i.length;t<n;t++)e[i[t]].isBone=!0}for(let t=0,i=e.length;t<i;t++){const i=e[t];void 0!==i.mesh&&(this._addNodeRef(this.meshCache,i.mesh),void 0!==i.skin&&(n[i.mesh].isSkinnedMesh=!0)),void 0!==i.camera&&this._addNodeRef(this.cameraCache,i.camera)}}_addNodeRef(e,t){void 0!==t&&(void 0===e.refs[t]&&(e.refs[t]=e.uses[t]=0),e.refs[t]++)}_getNodeRef(e,t,n){if(e.refs[t]<=1)return n;const i=n.clone(),r=(e,t)=>{const n=this.associations.get(e);null!=n&&this.associations.set(t,n);for(const[n,i]of e.children.entries())r(i,t.children[n])};return r(n,i),i.name+="_instance_"+e.uses[t]++,i}_invokeOne(e){const t=Object.values(this.plugins);t.push(this);for(let n=0;n<t.length;n++){const i=e(t[n]);if(i)return i}return null}_invokeAll(e){const t=Object.values(this.plugins);t.unshift(this);const n=[];for(let i=0;i<t.length;i++){const r=e(t[i]);r&&n.push(r)}return n}getDependency(e,t){const n=e+":"+t;let i=this.cache.get(n);if(!i){switch(e){case"scene":i=this.loadScene(t);break;case"node":i=this._invokeOne((function(e){return e.loadNode&&e.loadNode(t)}));break;case"mesh":i=this._invokeOne((function(e){return e.loadMesh&&e.loadMesh(t)}));break;case"accessor":i=this.loadAccessor(t);break;case"bufferView":i=this._invokeOne((function(e){return e.loadBufferView&&e.loadBufferView(t)}));break;case"buffer":i=this.loadBuffer(t);break;case"material":i=this._invokeOne((function(e){return e.loadMaterial&&e.loadMaterial(t)}));break;case"texture":i=this._invokeOne((function(e){return e.loadTexture&&e.loadTexture(t)}));break;case"skin":i=this.loadSkin(t);break;case"animation":i=this._invokeOne((function(e){return e.loadAnimation&&e.loadAnimation(t)}));break;case"camera":i=this.loadCamera(t);break;default:if(i=this._invokeOne((function(n){return n!=this&&n.getDependency&&n.getDependency(e,t)})),!i)throw new Error("Unknown type: "+e)}this.cache.add(n,i)}return i}getDependencies(e){let t=this.cache.get(e);if(!t){const n=this,i=this.json[e+("mesh"===e?"es":"s")]||[];t=Promise.all(i.map((function(t,i){return n.getDependency(e,i)}))),this.cache.add(e,t)}return t}loadBuffer(e){const t=this.json.buffers[e],n=this.fileLoader;if(t.type&&"arraybuffer"!==t.type)throw new Error("THREE.GLTFLoader: "+t.type+" buffer type is not supported.");if(void 0===t.uri&&0===e)return Promise.resolve(this.extensions[$A].body);const i=this.options;return new Promise((function(e,r){n.load(pd.resolveURL(t.uri,i.path),e,void 0,(function(){r(new Error('THREE.GLTFLoader: Failed to load buffer "'+t.uri+'".'))}))}))}loadBufferView(e){const t=this.json.bufferViews[e];return this.getDependency("buffer",t.buffer).then((function(e){const n=t.byteLength||0,i=t.byteOffset||0;return e.slice(i,i+n)}))}loadAccessor(e){const t=this,n=this.json,i=this.json.accessors[e];if(void 0===i.bufferView&&void 0===i.sparse){const e=Kg[i.type],t=Xg[i.componentType],n=!0===i.normalized,r=new t(i.count*e);return Promise.resolve(new Go(r,e,n))}const r=[];return void 0!==i.bufferView?r.push(this.getDependency("bufferView",i.bufferView)):r.push(null),void 0!==i.sparse&&(r.push(this.getDependency("bufferView",i.sparse.indices.bufferView)),r.push(this.getDependency("bufferView",i.sparse.values.bufferView))),Promise.all(r).then((function(e){const r=e[0],s=Kg[i.type],o=Xg[i.componentType],a=o.BYTES_PER_ELEMENT,l=a*s,c=i.byteOffset||0,h=void 0!==i.bufferView?n.bufferViews[i.bufferView].byteStride:void 0,u=!0===i.normalized;let d,p;if(h&&h!==l){const e=Math.floor(c/h),n="InterleavedBuffer:"+i.bufferView+":"+i.componentType+":"+e+":"+i.count;let l=t.cache.get(n);l||(d=new o(r,e*h,i.count*h/a),l=new Qa(d,h/a),t.cache.add(n,l)),p=new Ga(l,s,c%h/a,u)}else d=null===r?new o(i.count*s):new o(r,c,i.count*s),p=new Go(d,s,u);if(void 0!==i.sparse){const t=Kg.SCALAR,n=Xg[i.sparse.indices.componentType],a=i.sparse.indices.byteOffset||0,l=i.sparse.values.byteOffset||0,c=new n(e[1],a,i.sparse.count*t),h=new o(e[2],l,i.sparse.count*s);null!==r&&(p=new Go(p.array.slice(),p.itemSize,p.normalized)),p.normalized=!1;for(let e=0,t=c.length;e<t;e++){const t=c[e];if(p.setX(t,h[e*s]),s>=2&&p.setY(t,h[e*s+1]),s>=3&&p.setZ(t,h[e*s+2]),s>=4&&p.setW(t,h[e*s+3]),s>=5)throw new Error("THREE.GLTFLoader: Unsupported itemSize in sparse BufferAttribute.")}p.normalized=u}return p}))}loadTexture(e){const t=this.json,n=this.options,i=t.textures[e].source,r=t.images[i];let s=this.textureLoader;if(r.uri){const e=n.manager.getHandler(r.uri);null!==e&&(s=e)}return this.loadTextureImage(e,i,s)}loadTextureImage(e,t,n){const i=this,r=this.json,s=r.textures[e],o=r.images[t],a=(o.uri||o.bufferView)+":"+s.sampler;if(this.textureCache[a])return this.textureCache[a];const l=this.loadImageSource(t,n).then((function(t){t.flipY=!1,t.name=s.name||o.name||"",""===t.name&&"string"==typeof o.uri&&!1===o.uri.startsWith("data:image/")&&(t.name=o.uri);const n=(r.samplers||{})[s.sampler]||{};return t.magFilter=Yg[n.magFilter]||$t,t.minFilter=Yg[n.minFilter]||nn,t.wrapS=Jg[n.wrapS]||jt,t.wrapT=Jg[n.wrapT]||jt,t.generateMipmaps=!t.isCompressedTexture&&t.minFilter!==Xt&&t.minFilter!==$t,i.associations.set(t,{textures:e}),t})).catch((function(){return null}));return this.textureCache[a]=l,l}loadImageSource(e,t){const n=this.json,i=this.options;if(void 0!==this.sourceCache[e])return this.sourceCache[e].then((e=>e.clone()));const r=n.images[e],s=self.URL||self.webkitURL;let o=r.uri||"",a=!1;if(void 0!==r.bufferView)o=this.getDependency("bufferView",r.bufferView).then((function(e){a=!0;const t=new Blob([e],{type:r.mimeType});return o=s.createObjectURL(t),o}));else if(void 0===r.uri)throw new Error("THREE.GLTFLoader: Image "+e+" is missing URI and bufferView");const l=Promise.resolve(o).then((function(e){return new Promise((function(n,r){let s=n;!0===t.isImageBitmapLoader&&(s=function(e){const t=new Kr(e);t.needsUpdate=!0,n(t)}),t.load(pd.resolveURL(e,i.path),s,void 0,r)}))})).then((function(e){var t;return!0===a&&s.revokeObjectURL(o),iv(e,r),e.userData.mimeType=r.mimeType||((t=r.uri).search(/\.jpe?g($|\?)/i)>0||0===t.search(/^data\:image\/jpeg/)?"image/jpeg":t.search(/\.webp($|\?)/i)>0||0===t.search(/^data\:image\/webp/)?"image/webp":t.search(/\.ktx2($|\?)/i)>0||0===t.search(/^data\:image\/ktx2/)?"image/ktx2":"image/png"),e})).catch((function(e){throw console.error("THREE.GLTFLoader: Couldn't load texture",o),e}));return this.sourceCache[e]=l,l}assignTexture(e,t,n,i){const r=this;return this.getDependency("texture",n.index).then((function(s){if(!s)return null;if(void 0!==n.texCoord&&n.texCoord>0&&((s=s.clone()).channel=n.texCoord),r.extensions[pg]){const e=void 0!==n.extensions?n.extensions[pg]:void 0;if(e){const t=r.associations.get(s);s=r.extensions[pg].extendTexture(s,e),r.associations.set(s,t)}}return void 0!==i&&(s.colorSpace=i),e[t]=s,s}))}assignFinalMaterial(e){const t=e.geometry;let n=e.material;const i=void 0===t.attributes.tangent,r=void 0!==t.attributes.color,s=void 0===t.attributes.normal;if(e.isPoints){const e="PointsMaterial:"+n.uuid;let t=this.cache.get(e);t||(t=new gc,Lo.prototype.copy.call(t,n),t.color.copy(n.color),t.map=n.map,t.sizeAttenuation=!1,this.cache.add(e,t)),n=t}else if(e.isLine){const e="LineBasicMaterial:"+n.uuid;let t=this.cache.get(e);t||(t=new ic,Lo.prototype.copy.call(t,n),t.color.copy(n.color),t.map=n.map,this.cache.add(e,t)),n=t}if(i||r||s){let e="ClonedMaterial:"+n.uuid+":";i&&(e+="derivative-tangents:"),r&&(e+="vertex-colors:"),s&&(e+="flat-shading:");let t=this.cache.get(e);t||(t=n.clone(),r&&(t.vertexColors=!0),s&&(t.flatShading=!0),i&&(t.normalScale&&(t.normalScale.y*=-1),t.clearcoatNormalScale&&(t.clearcoatNormalScale.y*=-1)),this.cache.add(e,t),this.associations.set(t,this.associations.get(n))),n=t}e.material=n}getMaterialType(){return iu}loadMaterial(e){const t=this,n=this.json,i=this.extensions,r=n.materials[e];let s;const o={},a=[];if((r.extensions||{})[hg]){const e=i[hg];s=e.getMaterialType(),a.push(e.extendParams(o,r,t))}else{const n=r.pbrMetallicRoughness||{};if(o.color=new To(1,1,1),o.opacity=1,Array.isArray(n.baseColorFactor)){const e=n.baseColorFactor;o.color.setRGB(e[0],e[1],e[2],Bi),o.opacity=e[3]}void 0!==n.baseColorTexture&&a.push(t.assignTexture(o,"map",n.baseColorTexture,Ti)),o.metalness=void 0!==n.metallicFactor?n.metallicFactor:1,o.roughness=void 0!==n.roughnessFactor?n.roughnessFactor:1,void 0!==n.metallicRoughnessTexture&&(a.push(t.assignTexture(o,"metalnessMap",n.metallicRoughnessTexture)),a.push(t.assignTexture(o,"roughnessMap",n.metallicRoughnessTexture))),s=this._invokeOne((function(t){return t.getMaterialType&&t.getMaterialType(e)})),a.push(Promise.all(this._invokeAll((function(t){return t.extendMaterialParams&&t.extendMaterialParams(e,o)}))))}!0===r.doubleSided&&(o.side=je);const l=r.alphaMode||"OPAQUE";if("BLEND"===l?(o.transparent=!0,o.depthWrite=!1):(o.transparent=!1,"MASK"===l&&(o.alphaTest=void 0!==r.alphaCutoff?r.alphaCutoff:.5)),void 0!==r.normalTexture&&s!==Do&&(a.push(t.assignTexture(o,"normalMap",r.normalTexture)),o.normalScale=new Tr(1,1),void 0!==r.normalTexture.scale)){const e=r.normalTexture.scale;o.normalScale.set(e,e)}if(void 0!==r.occlusionTexture&&s!==Do&&(a.push(t.assignTexture(o,"aoMap",r.occlusionTexture)),void 0!==r.occlusionTexture.strength&&(o.aoMapIntensity=r.occlusionTexture.strength)),void 0!==r.emissiveFactor&&s!==Do){const e=r.emissiveFactor;o.emissive=(new To).setRGB(e[0],e[1],e[2],Bi)}return void 0!==r.emissiveTexture&&s!==Do&&a.push(t.assignTexture(o,"emissiveMap",r.emissiveTexture,Ti)),Promise.all(a).then((function(){const n=new s(o);return r.name&&(n.name=r.name),iv(n,r),t.associations.set(n,{materials:e}),r.extensions&&nv(i,n,r),n}))}createUniqueName(e){const t=Jd.sanitizeNodeName(e||"");return t in this.nodeNamesUsed?t+"_"+ ++this.nodeNamesUsed[t]:(this.nodeNamesUsed[t]=0,t)}loadGeometries(e){const t=this,n=this.extensions,i=this.primitiveCache;function r(e){return n[eg].decodePrimitive(e,t).then((function(n){return hv(n,e,t)}))}const s=[];for(let n=0,o=e.length;n<o;n++){const o=e[n],a=sv(o),l=i[a];if(l)s.push(l.promise);else{let e;e=o.extensions&&o.extensions[eg]?r(o):hv(new sa,o,t),i[a]={primitive:o,promise:e},s.push(e)}}return Promise.all(s)}loadMesh(e){const t=this,n=this.json,i=this.extensions,r=n.meshes[e],s=r.primitives,o=[];for(let e=0,t=s.length;e<t;e++){const t=void 0===s[e].material?tv(this.cache):this.getDependency("material",s[e].material);o.push(t)}return o.push(t.loadGeometries(s)),Promise.all(o).then((function(n){const o=n.slice(0,n.length-1),a=n[n.length-1],l=[];for(let n=0,c=a.length;n<c;n++){const c=a[n],h=s[n];let u;const d=o[n];if(h.mode===qg.TRIANGLES||h.mode===qg.TRIANGLE_STRIP||h.mode===qg.TRIANGLE_FAN||void 0===h.mode)u=!0===r.isSkinnedMesh?new gl(c,d):new ga(c,d),!0===u.isSkinnedMesh&&u.normalizeSkinWeights(),h.mode===qg.TRIANGLE_STRIP?u.geometry=XA(u.geometry,Ei):h.mode===qg.TRIANGLE_FAN&&(u.geometry=XA(u.geometry,bi));else if(h.mode===qg.LINES)u=new mc(c,d);else if(h.mode===qg.LINE_STRIP)u=new uc(c,d);else if(h.mode===qg.LINE_LOOP)u=new Ac(c,d);else{if(h.mode!==qg.POINTS)throw new Error("THREE.GLTFLoader: Primitive mode unsupported: "+h.mode);u=new xc(c,d)}Object.keys(u.geometry.morphAttributes).length>0&&rv(u,r),u.name=t.createUniqueName(r.name||"mesh_"+e),iv(u,r),h.extensions&&nv(i,u,h),t.assignFinalMaterial(u),l.push(u)}for(let n=0,i=l.length;n<i;n++)t.associations.set(l[n],{meshes:e,primitives:n});if(1===l.length)return r.extensions&&nv(i,l[0],r),l[0];const c=new Pa;r.extensions&&nv(i,c,r),t.associations.set(c,{meshes:e});for(let e=0,t=l.length;e<t;e++)c.add(l[e]);return c}))}loadCamera(e){let t;const n=this.json.cameras[e],i=n[n.type];if(i)return"perspective"===n.type?t=new Ta(Sr.radToDeg(i.yfov),i.aspectRatio||1,i.znear||1,i.zfar||2e6):"orthographic"===n.type&&(t=new sd(-i.xmag,i.xmag,i.ymag,-i.ymag,i.znear,i.zfar)),n.name&&(t.name=this.createUniqueName(n.name)),iv(t,n),Promise.resolve(t);console.warn("THREE.GLTFLoader: Missing camera parameters.")}loadSkin(e){const t=this.json.skins[e],n=[];for(let e=0,i=t.joints.length;e<i;e++)n.push(this._loadNodeShallow(t.joints[e]));return void 0!==t.inverseBindMatrices?n.push(this.getDependency("accessor",t.inverseBindMatrices)):n.push(null),Promise.all(n).then((function(e){const n=e.pop(),i=e,r=[],s=[];for(let e=0,o=i.length;e<o;e++){const o=i[e];if(o){r.push(o);const t=new ks;null!==n&&t.fromArray(n.array,16*e),s.push(t)}else console.warn('THREE.GLTFLoader: Joint "%s" could not be found.',t.joints[e])}return new xl(r,s)}))}loadAnimation(e){const t=this.json,n=this,i=t.animations[e],r=i.name?i.name:"animation_"+e,s=[],o=[],a=[],l=[],c=[];for(let e=0,t=i.channels.length;e<t;e++){const t=i.channels[e],n=i.samplers[t.sampler],r=t.target,h=r.node,u=void 0!==i.parameters?i.parameters[n.input]:n.input,d=void 0!==i.parameters?i.parameters[n.output]:n.output;void 0!==r.node&&(s.push(this.getDependency("node",h)),o.push(this.getDependency("accessor",u)),a.push(this.getDependency("accessor",d)),l.push(n),c.push(r))}return Promise.all([Promise.all(s),Promise.all(o),Promise.all(a),Promise.all(l),Promise.all(c)]).then((function(e){const t=e[0],i=e[1],s=e[2],o=e[3],a=e[4],l=[];for(let e=0,r=t.length;e<r;e++){const r=t[e],c=i[e],h=s[e],u=o[e],d=a[e];if(void 0===r)continue;r.updateMatrix&&r.updateMatrix();const p=n._createAnimationTracks(r,c,h,u,d);if(p)for(let e=0;e<p.length;e++)l.push(p[e])}return new Ru(r,void 0,l)}))}createNodeMesh(e){const t=this.json,n=this,i=t.nodes[e];return void 0===i.mesh?null:n.getDependency("mesh",i.mesh).then((function(e){const t=n._getNodeRef(n.meshCache,i.mesh,e);return void 0!==i.weights&&t.traverse((function(e){if(e.isMesh)for(let t=0,n=i.weights.length;t<n;t++)e.morphTargetInfluences[t]=i.weights[t]})),t}))}loadNode(e){const t=this,n=this.json.nodes[e],i=t._loadNodeShallow(e),r=[],s=n.children||[];for(let e=0,n=s.length;e<n;e++)r.push(t.getDependency("node",s[e]));const o=void 0===n.skin?Promise.resolve(null):t.getDependency("skin",n.skin);return Promise.all([i,Promise.all(r),o]).then((function(e){const t=e[0],n=e[1],i=e[2];null!==i&&t.traverse((function(e){e.isSkinnedMesh&&e.bind(i,lv)}));for(let e=0,i=n.length;e<i;e++)t.add(n[e]);return t}))}_loadNodeShallow(e){const t=this.json,n=this.extensions,i=this;if(void 0!==this.nodeCache[e])return this.nodeCache[e];const r=t.nodes[e],s=r.name?i.createUniqueName(r.name):"",o=[],a=i._invokeOne((function(t){return t.createNodeMesh&&t.createNodeMesh(e)}));return a&&o.push(a),void 0!==r.camera&&o.push(i.getDependency("camera",r.camera).then((function(e){return i._getNodeRef(i.cameraCache,r.camera,e)}))),i._invokeAll((function(t){return t.createNodeAttachment&&t.createNodeAttachment(e)})).forEach((function(e){o.push(e)})),this.nodeCache[e]=Promise.all(o).then((function(t){let o;if(o=!0===r.isBone?new vl:t.length>1?new Pa:1===t.length?t[0]:new co,o!==t[0])for(let e=0,n=t.length;e<n;e++)o.add(t[e]);if(r.name&&(o.userData.name=r.name,o.name=s),iv(o,r),r.extensions&&nv(n,o,r),void 0!==r.matrix){const e=new ks;e.fromArray(r.matrix),o.applyMatrix4(e)}else void 0!==r.translation&&o.position.fromArray(r.translation),void 0!==r.rotation&&o.quaternion.fromArray(r.rotation),void 0!==r.scale&&o.scale.fromArray(r.scale);return i.associations.has(o)||i.associations.set(o,{}),i.associations.get(o).nodes=e,o})),this.nodeCache[e]}loadScene(e){const t=this.extensions,n=this.json.scenes[e],i=this,r=new Pa;n.name&&(r.name=i.createUniqueName(n.name)),iv(r,n),n.extensions&&nv(t,r,n);const s=n.nodes||[],o=[];for(let e=0,t=s.length;e<t;e++)o.push(i.getDependency("node",s[e]));return Promise.all(o).then((function(e){for(let t=0,n=e.length;t<n;t++)r.add(e[t]);return i.associations=(e=>{const t=new Map;for(const[e,n]of i.associations)(e instanceof Lo||e instanceof Kr)&&t.set(e,n);return e.traverse((e=>{const n=i.associations.get(e);null!=n&&t.set(e,n)})),t})(r),r}))}_createAnimationTracks(e,t,n,i,r){const s=[],o=e.name?e.name:e.uuid,a=[];let l;switch($g[r.path]===$g.weights?e.traverse((function(e){e.morphTargetInfluences&&a.push(e.name?e.name:e.uuid)})):a.push(o),$g[r.path]){case $g.weights:l=Mu;break;case $g.rotation:l=Su;break;case $g.position:case $g.scale:l=Bu;break;default:l=1===n.itemSize?Mu:Bu}const c=void 0!==i.interpolation?ev[i.interpolation]:di,h=this._getArrayFromAccessor(n);for(let e=0,n=a.length;e<n;e++){const n=new l(a[e]+"."+$g[r.path],t.array,h,c);"CUBICSPLINE"===i.interpolation&&this._createCubicSplineTrackInterpolant(n),s.push(n)}return s}_getArrayFromAccessor(e){let t=e.array;if(e.normalized){const e=av(t.constructor),n=new Float32Array(t.length);for(let i=0,r=t.length;i<r;i++)n[i]=t[i]*e;t=n}return t}_createCubicSplineTrackInterpolant(e){e.createInterpolant=function(e){return new(this instanceof Su?Wg:Vg)(this.times,this.values,this.getValueSize()/3,e)},e.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline=!0}}function hv(e,t,n){const i=t.attributes,r=[];function s(t,i){return n.getDependency("accessor",t).then((function(t){e.setAttribute(i,t)}))}for(const t in i){const n=Zg[t]||t.toLowerCase();n in e.attributes||r.push(s(i[t],n))}if(void 0!==t.indices&&!e.index){const i=n.getDependency("accessor",t.indices).then((function(t){e.setIndex(t)}));r.push(i)}return Gr.workingColorSpace!==Bi&&"COLOR_0"in i&&console.warn(`THREE.GLTFLoader: Converting vertex colors from "srgb-linear" to "${Gr.workingColorSpace}" not supported.`),iv(e,t),function(e,t,n){const i=t.attributes,r=new cs;if(void 0===i.POSITION)return;{const e=n.json.accessors[i.POSITION],t=e.min,s=e.max;if(void 0===t||void 0===s)return void console.warn("THREE.GLTFLoader: Missing min/max properties for accessor POSITION.");if(r.set(new os(t[0],t[1],t[2]),new os(s[0],s[1],s[2])),e.normalized){const t=av(Xg[e.componentType]);r.min.multiplyScalar(t),r.max.multiplyScalar(t)}}const s=t.targets;if(void 0!==s){const e=new os,t=new os;for(let i=0,r=s.length;i<r;i++){const r=s[i];if(void 0!==r.POSITION){const i=n.json.accessors[r.POSITION],s=i.min,o=i.max;if(void 0!==s&&void 0!==o){if(t.setX(Math.max(Math.abs(s[0]),Math.abs(o[0]))),t.setY(Math.max(Math.abs(s[1]),Math.abs(o[1]))),t.setZ(Math.max(Math.abs(s[2]),Math.abs(o[2]))),i.normalized){const e=av(Xg[i.componentType]);t.multiplyScalar(e)}e.max(t)}else console.warn("THREE.GLTFLoader: Missing min/max properties for accessor POSITION.")}}r.expandByVector(e)}e.boundingBox=r;const o=new Is;r.getCenter(o.center),o.radius=r.min.distanceTo(r.max)/2,e.boundingSphere=o}(e,t,n),Promise.all(r).then((function(){return void 0!==t.targets?function(e,t,n){let i=!1,r=!1,s=!1;for(let e=0,n=t.length;e<n;e++){const n=t[e];if(void 0!==n.POSITION&&(i=!0),void 0!==n.NORMAL&&(r=!0),void 0!==n.COLOR_0&&(s=!0),i&&r&&s)break}if(!i&&!r&&!s)return Promise.resolve(e);const o=[],a=[],l=[];for(let c=0,h=t.length;c<h;c++){const h=t[c];if(i){const t=void 0!==h.POSITION?n.getDependency("accessor",h.POSITION):e.attributes.position;o.push(t)}if(r){const t=void 0!==h.NORMAL?n.getDependency("accessor",h.NORMAL):e.attributes.normal;a.push(t)}if(s){const t=void 0!==h.COLOR_0?n.getDependency("accessor",h.COLOR_0):e.attributes.color;l.push(t)}}return Promise.all([Promise.all(o),Promise.all(a),Promise.all(l)]).then((function(t){const n=t[0],o=t[1],a=t[2];return i&&(e.morphAttributes.position=n),r&&(e.morphAttributes.normal=o),s&&(e.morphAttributes.color=a),e.morphTargetsRelative=!0,e}))}(e,t.targets,n):e}))}class uv{constructor(e=4){this.pool=e,this.queue=[],this.workers=[],this.workersResolve=[],this.workerStatus=0}_initWorker(e){if(!this.workers[e]){const t=this.workerCreator();t.addEventListener("message",this._onMessage.bind(this,e)),this.workers[e]=t}}_getIdleWorker(){for(let e=0;e<this.pool;e++)if(!(this.workerStatus&1<<e))return e;return-1}_onMessage(e,t){const n=this.workersResolve[e];if(n&&n(t),this.queue.length){const{resolve:t,msg:n,transfer:i}=this.queue.shift();this.workersResolve[e]=t,this.workers[e].postMessage(n,i)}else this.workerStatus^=1<<e}setWorkerCreator(e){this.workerCreator=e}setWorkerLimit(e){this.pool=e}postMessage(e,t){return new Promise((n=>{const i=this._getIdleWorker();-1!==i?(this._initWorker(i),this.workerStatus|=1<<i,this.workersResolve[i]=n,this.workers[i].postMessage(e,t)):this.queue.push({resolve:n,msg:e,transfer:t})}))}dispose(){this.workers.forEach((e=>e.terminate())),this.workersResolve.length=0,this.workers.length=0,this.queue.length=0,this.workerStatus=0}}const dv=9,pv=15,fv=16,mv=22,Av=37,gv=43,vv=76,yv=83,Ev=97,bv=100,xv=103,Cv=109,wv=165,_v=166,Mv=1000066e3;class Iv{constructor(){this.vkFormat=0,this.typeSize=1,this.pixelWidth=0,this.pixelHeight=0,this.pixelDepth=0,this.layerCount=0,this.faceCount=1,this.supercompressionScheme=0,this.levels=[],this.dataFormatDescriptor=[{vendorId:0,descriptorType:0,descriptorBlockSize:0,versionNumber:2,colorModel:0,colorPrimaries:1,transferFunction:2,flags:0,texelBlockDimension:[0,0,0,0],bytesPlane:[0,0,0,0,0,0,0,0],samples:[]}],this.keyValue={},this.globalData=null}}class Sv{constructor(e,t,n,i){this._dataView=void 0,this._littleEndian=void 0,this._offset=void 0,this._dataView=new DataView(e.buffer,e.byteOffset+t,n),this._littleEndian=i,this._offset=0}_nextUint8(){const e=this._dataView.getUint8(this._offset);return this._offset+=1,e}_nextUint16(){const e=this._dataView.getUint16(this._offset,this._littleEndian);return this._offset+=2,e}_nextUint32(){const e=this._dataView.getUint32(this._offset,this._littleEndian);return this._offset+=4,e}_nextUint64(){const e=this._dataView.getUint32(this._offset,this._littleEndian)+2**32*this._dataView.getUint32(this._offset+4,this._littleEndian);return this._offset+=8,e}_nextInt32(){const e=this._dataView.getInt32(this._offset,this._littleEndian);return this._offset+=4,e}_nextUint8Array(e){const t=new Uint8Array(this._dataView.buffer,this._dataView.byteOffset+this._offset,e);return this._offset+=e,t}_skip(e){return this._offset+=e,this}_scan(e,t){void 0===t&&(t=0);const n=this._offset;let i=0;for(;this._dataView.getUint8(this._offset)!==t&&i<e;)i++,this._offset++;return i<e&&this._offset++,new Uint8Array(this._dataView.buffer,this._dataView.byteOffset+n,i)}}new Uint8Array([0]);const Tv=[171,75,84,88,32,50,48,187,13,10,26,10];function Bv(e){return(new TextDecoder).decode(e)}var Rv=n(9922).hp;let Lv,Dv,Pv;const Uv={env:{emscripten_notify_memory_growth:function(e){Pv=new Uint8Array(Dv.exports.memory.buffer)}}};class kv{init(){return Lv||(Lv="undefined"!=typeof fetch?fetch("data:application/wasm;base64,"+Nv).then((e=>e.arrayBuffer())).then((e=>WebAssembly.instantiate(e,Uv))).then(this._init):WebAssembly.instantiate(Rv.from(Nv,"base64"),Uv).then(this._init),Lv)}_init(e){Dv=e.instance,Uv.env.emscripten_notify_memory_growth(0)}decode(e,t=0){if(!Dv)throw new Error("ZSTDDecoder: Await .init() before decoding.");const n=e.byteLength,i=Dv.exports.malloc(n);Pv.set(e,i),t=t||Number(Dv.exports.ZSTD_findDecompressedSize(i,n));const r=Dv.exports.malloc(t),s=Dv.exports.ZSTD_decompress(r,t,i,n),o=Pv.slice(r,r+s);return Dv.exports.free(i),Dv.exports.free(r),o}}const Nv="AGFzbQEAAAABpQEVYAF/AX9gAn9/AGADf39/AX9gBX9/f39/AX9gAX8AYAJ/fwF/YAR/f39/AX9gA39/fwBgBn9/f39/fwF/YAd/f39/f39/AX9gAn9/AX5gAn5+AX5gAABgBX9/f39/AGAGf39/f39/AGAIf39/f39/f38AYAl/f39/f39/f38AYAABf2AIf39/f39/f38Bf2ANf39/f39/f39/f39/fwF/YAF/AX4CJwEDZW52H2Vtc2NyaXB0ZW5fbm90aWZ5X21lbW9yeV9ncm93dGgABANpaAEFAAAFAgEFCwACAQABAgIFBQcAAwABDgsBAQcAEhMHAAUBDAQEAAANBwQCAgYCBAgDAwMDBgEACQkHBgICAAYGAgQUBwYGAwIGAAMCAQgBBwUGCgoEEQAEBAEIAwgDBQgDEA8IAAcABAUBcAECAgUEAQCAAgYJAX8BQaCgwAILB2AHBm1lbW9yeQIABm1hbGxvYwAoBGZyZWUAJgxaU1REX2lzRXJyb3IAaBlaU1REX2ZpbmREZWNvbXByZXNzZWRTaXplAFQPWlNURF9kZWNvbXByZXNzAEoGX3N0YXJ0ACQJBwEAQQELASQKussBaA8AIAAgACgCBCABajYCBAsZACAAKAIAIAAoAgRBH3F0QQAgAWtBH3F2CwgAIABBiH9LC34BBH9BAyEBIAAoAgQiA0EgTQRAIAAoAggiASAAKAIQTwRAIAAQDQ8LIAAoAgwiAiABRgRAQQFBAiADQSBJGw8LIAAgASABIAJrIANBA3YiBCABIARrIAJJIgEbIgJrIgQ2AgggACADIAJBA3RrNgIEIAAgBCgAADYCAAsgAQsUAQF/IAAgARACIQIgACABEAEgAgv3AQECfyACRQRAIABCADcCACAAQQA2AhAgAEIANwIIQbh/DwsgACABNgIMIAAgAUEEajYCECACQQRPBEAgACABIAJqIgFBfGoiAzYCCCAAIAMoAAA2AgAgAUF/ai0AACIBBEAgAEEIIAEQFGs2AgQgAg8LIABBADYCBEF/DwsgACABNgIIIAAgAS0AACIDNgIAIAJBfmoiBEEBTQRAIARBAWtFBEAgACABLQACQRB0IANyIgM2AgALIAAgAS0AAUEIdCADajYCAAsgASACakF/ai0AACIBRQRAIABBADYCBEFsDwsgAEEoIAEQFCACQQN0ams2AgQgAgsWACAAIAEpAAA3AAAgACABKQAINwAICy8BAX8gAUECdEGgHWooAgAgACgCAEEgIAEgACgCBGprQR9xdnEhAiAAIAEQASACCyEAIAFCz9bTvtLHq9lCfiAAfEIfiUKHla+vmLbem55/fgsdAQF/IAAoAgggACgCDEYEfyAAKAIEQSBGBUEACwuCBAEDfyACQYDAAE8EQCAAIAEgAhBnIAAPCyAAIAJqIQMCQCAAIAFzQQNxRQRAAkAgAkEBSARAIAAhAgwBCyAAQQNxRQRAIAAhAgwBCyAAIQIDQCACIAEtAAA6AAAgAUEBaiEBIAJBAWoiAiADTw0BIAJBA3ENAAsLAkAgA0F8cSIEQcAASQ0AIAIgBEFAaiIFSw0AA0AgAiABKAIANgIAIAIgASgCBDYCBCACIAEoAgg2AgggAiABKAIMNgIMIAIgASgCEDYCECACIAEoAhQ2AhQgAiABKAIYNgIYIAIgASgCHDYCHCACIAEoAiA2AiAgAiABKAIkNgIkIAIgASgCKDYCKCACIAEoAiw2AiwgAiABKAIwNgIwIAIgASgCNDYCNCACIAEoAjg2AjggAiABKAI8NgI8IAFBQGshASACQUBrIgIgBU0NAAsLIAIgBE8NAQNAIAIgASgCADYCACABQQRqIQEgAkEEaiICIARJDQALDAELIANBBEkEQCAAIQIMAQsgA0F8aiIEIABJBEAgACECDAELIAAhAgNAIAIgAS0AADoAACACIAEtAAE6AAEgAiABLQACOgACIAIgAS0AAzoAAyABQQRqIQEgAkEEaiICIARNDQALCyACIANJBEADQCACIAEtAAA6AAAgAUEBaiEBIAJBAWoiAiADRw0ACwsgAAsMACAAIAEpAAA3AAALQQECfyAAKAIIIgEgACgCEEkEQEEDDwsgACAAKAIEIgJBB3E2AgQgACABIAJBA3ZrIgE2AgggACABKAAANgIAQQALDAAgACABKAIANgAAC/cCAQJ/AkAgACABRg0AAkAgASACaiAASwRAIAAgAmoiBCABSw0BCyAAIAEgAhALDwsgACABc0EDcSEDAkACQCAAIAFJBEAgAwRAIAAhAwwDCyAAQQNxRQRAIAAhAwwCCyAAIQMDQCACRQ0EIAMgAS0AADoAACABQQFqIQEgAkF/aiECIANBAWoiA0EDcQ0ACwwBCwJAIAMNACAEQQNxBEADQCACRQ0FIAAgAkF/aiICaiIDIAEgAmotAAA6AAAgA0EDcQ0ACwsgAkEDTQ0AA0AgACACQXxqIgJqIAEgAmooAgA2AgAgAkEDSw0ACwsgAkUNAgNAIAAgAkF/aiICaiABIAJqLQAAOgAAIAINAAsMAgsgAkEDTQ0AIAIhBANAIAMgASgCADYCACABQQRqIQEgA0EEaiEDIARBfGoiBEEDSw0ACyACQQNxIQILIAJFDQADQCADIAEtAAA6AAAgA0EBaiEDIAFBAWohASACQX9qIgINAAsLIAAL8wICAn8BfgJAIAJFDQAgACACaiIDQX9qIAE6AAAgACABOgAAIAJBA0kNACADQX5qIAE6AAAgACABOgABIANBfWogAToAACAAIAE6AAIgAkEHSQ0AIANBfGogAToAACAAIAE6AAMgAkEJSQ0AIABBACAAa0EDcSIEaiIDIAFB/wFxQYGChAhsIgE2AgAgAyACIARrQXxxIgRqIgJBfGogATYCACAEQQlJDQAgAyABNgIIIAMgATYCBCACQXhqIAE2AgAgAkF0aiABNgIAIARBGUkNACADIAE2AhggAyABNgIUIAMgATYCECADIAE2AgwgAkFwaiABNgIAIAJBbGogATYCACACQWhqIAE2AgAgAkFkaiABNgIAIAQgA0EEcUEYciIEayICQSBJDQAgAa0iBUIghiAFhCEFIAMgBGohAQNAIAEgBTcDGCABIAU3AxAgASAFNwMIIAEgBTcDACABQSBqIQEgAkFgaiICQR9LDQALCyAACy8BAn8gACgCBCAAKAIAQQJ0aiICLQACIQMgACACLwEAIAEgAi0AAxAIajYCACADCy8BAn8gACgCBCAAKAIAQQJ0aiICLQACIQMgACACLwEAIAEgAi0AAxAFajYCACADCx8AIAAgASACKAIEEAg2AgAgARAEGiAAIAJBCGo2AgQLCAAgAGdBH3MLugUBDX8jAEEQayIKJAACfyAEQQNNBEAgCkEANgIMIApBDGogAyAEEAsaIAAgASACIApBDGpBBBAVIgBBbCAAEAMbIAAgACAESxsMAQsgAEEAIAEoAgBBAXRBAmoQECENQVQgAygAACIGQQ9xIgBBCksNABogAiAAQQVqNgIAIAMgBGoiAkF8aiEMIAJBeWohDiACQXtqIRAgAEEGaiELQQQhBSAGQQR2IQRBICAAdCIAQQFyIQkgASgCACEPQQAhAiADIQYCQANAIAlBAkggAiAPS3JFBEAgAiEHAkAgCARAA0AgBEH//wNxQf//A0YEQCAHQRhqIQcgBiAQSQR/IAZBAmoiBigAACAFdgUgBUEQaiEFIARBEHYLIQQMAQsLA0AgBEEDcSIIQQNGBEAgBUECaiEFIARBAnYhBCAHQQNqIQcMAQsLIAcgCGoiByAPSw0EIAVBAmohBQNAIAIgB0kEQCANIAJBAXRqQQA7AQAgAkEBaiECDAELCyAGIA5LQQAgBiAFQQN1aiIHIAxLG0UEQCAHKAAAIAVBB3EiBXYhBAwCCyAEQQJ2IQQLIAYhBwsCfyALQX9qIAQgAEF/anEiBiAAQQF0QX9qIgggCWsiEUkNABogBCAIcSIEQQAgESAEIABIG2shBiALCyEIIA0gAkEBdGogBkF/aiIEOwEAIAlBASAGayAEIAZBAUgbayEJA0AgCSAASARAIABBAXUhACALQX9qIQsMAQsLAn8gByAOS0EAIAcgBSAIaiIFQQN1aiIGIAxLG0UEQCAFQQdxDAELIAUgDCIGIAdrQQN0awshBSACQQFqIQIgBEUhCCAGKAAAIAVBH3F2IQQMAQsLQWwgCUEBRyAFQSBKcg0BGiABIAJBf2o2AgAgBiAFQQdqQQN1aiADawwBC0FQCyEAIApBEGokACAACwkAQQFBBSAAGwsMACAAIAEoAAA2AAALqgMBCn8jAEHwAGsiCiQAIAJBAWohDiAAQQhqIQtBgIAEIAVBf2p0QRB1IQxBACECQQEhBkEBIAV0IglBf2oiDyEIA0AgAiAORkUEQAJAIAEgAkEBdCINai8BACIHQf//A0YEQCALIAhBA3RqIAI2AgQgCEF/aiEIQQEhBwwBCyAGQQAgDCAHQRB0QRB1ShshBgsgCiANaiAHOwEAIAJBAWohAgwBCwsgACAFNgIEIAAgBjYCACAJQQN2IAlBAXZqQQNqIQxBACEAQQAhBkEAIQIDQCAGIA5GBEADQAJAIAAgCUYNACAKIAsgAEEDdGoiASgCBCIGQQF0aiICIAIvAQAiAkEBajsBACABIAUgAhAUayIIOgADIAEgAiAIQf8BcXQgCWs7AQAgASAEIAZBAnQiAmooAgA6AAIgASACIANqKAIANgIEIABBAWohAAwBCwsFIAEgBkEBdGouAQAhDUEAIQcDQCAHIA1ORQRAIAsgAkEDdGogBjYCBANAIAIgDGogD3EiAiAISw0ACyAHQQFqIQcMAQsLIAZBAWohBgwBCwsgCkHwAGokAAsjAEIAIAEQCSAAhUKHla+vmLbem55/fkLj3MqV/M7y9YV/fAsQACAAQn43AwggACABNgIACyQBAX8gAARAIAEoAgQiAgRAIAEoAgggACACEQEADwsgABAmCwsfACAAIAEgAi8BABAINgIAIAEQBBogACACQQRqNgIEC0oBAX9BoCAoAgAiASAAaiIAQX9MBEBBiCBBMDYCAEF/DwsCQCAAPwBBEHRNDQAgABBmDQBBiCBBMDYCAEF/DwtBoCAgADYCACABC9cBAQh/Qbp/IQoCQCACKAIEIgggAigCACIJaiIOIAEgAGtLDQBBbCEKIAkgBCADKAIAIgtrSw0AIAAgCWoiBCACKAIIIgxrIQ0gACABQWBqIg8gCyAJQQAQKSADIAkgC2o2AgACQAJAIAwgBCAFa00EQCANIQUMAQsgDCAEIAZrSw0CIAcgDSAFayIAaiIBIAhqIAdNBEAgBCABIAgQDxoMAgsgBCABQQAgAGsQDyEBIAIgACAIaiIINgIEIAEgAGshBAsgBCAPIAUgCEEBECkLIA4hCgsgCgubAgEBfyMAQYABayINJAAgDSADNgJ8AkAgAkEDSwRAQX8hCQwBCwJAAkACQAJAIAJBAWsOAwADAgELIAZFBEBBuH8hCQwEC0FsIQkgBS0AACICIANLDQMgACAHIAJBAnQiAmooAgAgAiAIaigCABA7IAEgADYCAEEBIQkMAwsgASAJNgIAQQAhCQwCCyAKRQRAQWwhCQwCC0EAIQkgC0UgDEEZSHINAUEIIAR0QQhqIQBBACECA0AgAiAATw0CIAJBQGshAgwAAAsAC0FsIQkgDSANQfwAaiANQfgAaiAFIAYQFSICEAMNACANKAJ4IgMgBEsNACAAIA0gDSgCfCAHIAggAxAYIAEgADYCACACIQkLIA1BgAFqJAAgCQsLACAAIAEgAhALGgsQACAALwAAIAAtAAJBEHRyCy8AAn9BuH8gAUEISQ0AGkFyIAAoAAQiAEF3Sw0AGkG4fyAAQQhqIgAgACABSxsLCwkAIAAgATsAAAsDAAELigYBBX8gACAAKAIAIgVBfnE2AgBBACAAIAVBAXZqQYQgKAIAIgQgAEYbIQECQAJAIAAoAgQiAkUNACACKAIAIgNBAXENACACQQhqIgUgA0EBdkF4aiIDQQggA0EISxtnQR9zQQJ0QYAfaiIDKAIARgRAIAMgAigCDDYCAAsgAigCCCIDBEAgAyACKAIMNgIECyACKAIMIgMEQCADIAIoAgg2AgALIAIgAigCACAAKAIAQX5xajYCAEGEICEAAkACQCABRQ0AIAEgAjYCBCABKAIAIgNBAXENASADQQF2QXhqIgNBCCADQQhLG2dBH3NBAnRBgB9qIgMoAgAgAUEIakYEQCADIAEoAgw2AgALIAEoAggiAwRAIAMgASgCDDYCBAsgASgCDCIDBEAgAyABKAIINgIAQYQgKAIAIQQLIAIgAigCACABKAIAQX5xajYCACABIARGDQAgASABKAIAQQF2akEEaiEACyAAIAI2AgALIAIoAgBBAXZBeGoiAEEIIABBCEsbZ0Efc0ECdEGAH2oiASgCACEAIAEgBTYCACACIAA2AgwgAkEANgIIIABFDQEgACAFNgIADwsCQCABRQ0AIAEoAgAiAkEBcQ0AIAJBAXZBeGoiAkEIIAJBCEsbZ0Efc0ECdEGAH2oiAigCACABQQhqRgRAIAIgASgCDDYCAAsgASgCCCICBEAgAiABKAIMNgIECyABKAIMIgIEQCACIAEoAgg2AgBBhCAoAgAhBAsgACAAKAIAIAEoAgBBfnFqIgI2AgACQCABIARHBEAgASABKAIAQQF2aiAANgIEIAAoAgAhAgwBC0GEICAANgIACyACQQF2QXhqIgFBCCABQQhLG2dBH3NBAnRBgB9qIgIoAgAhASACIABBCGoiAjYCACAAIAE2AgwgAEEANgIIIAFFDQEgASACNgIADwsgBUEBdkF4aiIBQQggAUEISxtnQR9zQQJ0QYAfaiICKAIAIQEgAiAAQQhqIgI2AgAgACABNgIMIABBADYCCCABRQ0AIAEgAjYCAAsLDgAgAARAIABBeGoQJQsLgAIBA38CQCAAQQ9qQXhxQYQgKAIAKAIAQQF2ayICEB1Bf0YNAAJAQYQgKAIAIgAoAgAiAUEBcQ0AIAFBAXZBeGoiAUEIIAFBCEsbZ0Efc0ECdEGAH2oiASgCACAAQQhqRgRAIAEgACgCDDYCAAsgACgCCCIBBEAgASAAKAIMNgIECyAAKAIMIgFFDQAgASAAKAIINgIAC0EBIQEgACAAKAIAIAJBAXRqIgI2AgAgAkEBcQ0AIAJBAXZBeGoiAkEIIAJBCEsbZ0Efc0ECdEGAH2oiAygCACECIAMgAEEIaiIDNgIAIAAgAjYCDCAAQQA2AgggAkUNACACIAM2AgALIAELtwIBA38CQAJAIABBASAAGyICEDgiAA0AAkACQEGEICgCACIARQ0AIAAoAgAiA0EBcQ0AIAAgA0EBcjYCACADQQF2QXhqIgFBCCABQQhLG2dBH3NBAnRBgB9qIgEoAgAgAEEIakYEQCABIAAoAgw2AgALIAAoAggiAQRAIAEgACgCDDYCBAsgACgCDCIBBEAgASAAKAIINgIACyACECchAkEAIQFBhCAoAgAhACACDQEgACAAKAIAQX5xNgIAQQAPCyACQQ9qQXhxIgMQHSICQX9GDQIgAkEHakF4cSIAIAJHBEAgACACaxAdQX9GDQMLAkBBhCAoAgAiAUUEQEGAICAANgIADAELIAAgATYCBAtBhCAgADYCACAAIANBAXRBAXI2AgAMAQsgAEUNAQsgAEEIaiEBCyABC7kDAQJ/IAAgA2ohBQJAIANBB0wEQANAIAAgBU8NAiAAIAItAAA6AAAgAEEBaiEAIAJBAWohAgwAAAsACyAEQQFGBEACQCAAIAJrIgZBB00EQCAAIAItAAA6AAAgACACLQABOgABIAAgAi0AAjoAAiAAIAItAAM6AAMgAEEEaiACIAZBAnQiBkHAHmooAgBqIgIQFyACIAZB4B5qKAIAayECDAELIAAgAhAMCyACQQhqIQIgAEEIaiEACwJAAkACQAJAIAUgAU0EQCAAIANqIQEgBEEBRyAAIAJrQQ9Kcg0BA0AgACACEAwgAkEIaiECIABBCGoiACABSQ0ACwwFCyAAIAFLBEAgACEBDAQLIARBAUcgACACa0EPSnINASAAIQMgAiEEA0AgAyAEEAwgBEEIaiEEIANBCGoiAyABSQ0ACwwCCwNAIAAgAhAHIAJBEGohAiAAQRBqIgAgAUkNAAsMAwsgACEDIAIhBANAIAMgBBAHIARBEGohBCADQRBqIgMgAUkNAAsLIAIgASAAa2ohAgsDQCABIAVPDQEgASACLQAAOgAAIAFBAWohASACQQFqIQIMAAALAAsLQQECfyAAIAAoArjgASIDNgLE4AEgACgCvOABIQQgACABNgK84AEgACABIAJqNgK44AEgACABIAQgA2tqNgLA4AELpgEBAX8gACAAKALs4QEQFjYCyOABIABCADcD+OABIABCADcDuOABIABBwOABakIANwMAIABBqNAAaiIBQYyAgOAANgIAIABBADYCmOIBIABCADcDiOEBIABCAzcDgOEBIABBrNABakHgEikCADcCACAAQbTQAWpB6BIoAgA2AgAgACABNgIMIAAgAEGYIGo2AgggACAAQaAwajYCBCAAIABBEGo2AgALYQEBf0G4fyEDAkAgAUEDSQ0AIAIgABAhIgFBA3YiADYCCCACIAFBAXE2AgQgAiABQQF2QQNxIgM2AgACQCADQX9qIgFBAksNAAJAIAFBAWsOAgEAAgtBbA8LIAAhAwsgAwsMACAAIAEgAkEAEC4LiAQCA38CfiADEBYhBCAAQQBBKBAQIQAgBCACSwRAIAQPCyABRQRAQX8PCwJAAkAgA0EBRg0AIAEoAAAiBkGo6r5pRg0AQXYhAyAGQXBxQdDUtMIBRw0BQQghAyACQQhJDQEgAEEAQSgQECEAIAEoAAQhASAAQQE2AhQgACABrTcDAEEADwsgASACIAMQLyIDIAJLDQAgACADNgIYQXIhAyABIARqIgVBf2otAAAiAkEIcQ0AIAJBIHEiBkUEQEFwIQMgBS0AACIFQacBSw0BIAVBB3GtQgEgBUEDdkEKaq2GIgdCA4h+IAd8IQggBEEBaiEECyACQQZ2IQMgAkECdiEFAkAgAkEDcUF/aiICQQJLBEBBACECDAELAkACQAJAIAJBAWsOAgECAAsgASAEai0AACECIARBAWohBAwCCyABIARqLwAAIQIgBEECaiEEDAELIAEgBGooAAAhAiAEQQRqIQQLIAVBAXEhBQJ+AkACQAJAIANBf2oiA0ECTQRAIANBAWsOAgIDAQtCfyAGRQ0DGiABIARqMQAADAMLIAEgBGovAACtQoACfAwCCyABIARqKAAArQwBCyABIARqKQAACyEHIAAgBTYCICAAIAI2AhwgACAHNwMAQQAhAyAAQQA2AhQgACAHIAggBhsiBzcDCCAAIAdCgIAIIAdCgIAIVBs+AhALIAMLWwEBf0G4fyEDIAIQFiICIAFNBH8gACACakF/ai0AACIAQQNxQQJ0QaAeaigCACACaiAAQQZ2IgFBAnRBsB5qKAIAaiAAQSBxIgBFaiABRSAAQQV2cWoFQbh/CwsdACAAKAKQ4gEQWiAAQQA2AqDiASAAQgA3A5DiAQu1AwEFfyMAQZACayIKJABBuH8hBgJAIAVFDQAgBCwAACIIQf8BcSEHAkAgCEF/TARAIAdBgn9qQQF2IgggBU8NAkFsIQYgB0GBf2oiBUGAAk8NAiAEQQFqIQdBACEGA0AgBiAFTwRAIAUhBiAIIQcMAwUgACAGaiAHIAZBAXZqIgQtAABBBHY6AAAgACAGQQFyaiAELQAAQQ9xOgAAIAZBAmohBgwBCwAACwALIAcgBU8NASAAIARBAWogByAKEFMiBhADDQELIAYhBEEAIQYgAUEAQTQQECEJQQAhBQNAIAQgBkcEQCAAIAZqIggtAAAiAUELSwRAQWwhBgwDBSAJIAFBAnRqIgEgASgCAEEBajYCACAGQQFqIQZBASAILQAAdEEBdSAFaiEFDAILAAsLQWwhBiAFRQ0AIAUQFEEBaiIBQQxLDQAgAyABNgIAQQFBASABdCAFayIDEBQiAXQgA0cNACAAIARqIAFBAWoiADoAACAJIABBAnRqIgAgACgCAEEBajYCACAJKAIEIgBBAkkgAEEBcXINACACIARBAWo2AgAgB0EBaiEGCyAKQZACaiQAIAYLxhEBDH8jAEHwAGsiBSQAQWwhCwJAIANBCkkNACACLwAAIQogAi8AAiEJIAIvAAQhByAFQQhqIAQQDgJAIAMgByAJIApqakEGaiIMSQ0AIAUtAAohCCAFQdgAaiACQQZqIgIgChAGIgsQAw0BIAVBQGsgAiAKaiICIAkQBiILEAMNASAFQShqIAIgCWoiAiAHEAYiCxADDQEgBUEQaiACIAdqIAMgDGsQBiILEAMNASAAIAFqIg9BfWohECAEQQRqIQZBASELIAAgAUEDakECdiIDaiIMIANqIgIgA2oiDiEDIAIhBCAMIQcDQCALIAMgEElxBEAgACAGIAVB2ABqIAgQAkECdGoiCS8BADsAACAFQdgAaiAJLQACEAEgCS0AAyELIAcgBiAFQUBrIAgQAkECdGoiCS8BADsAACAFQUBrIAktAAIQASAJLQADIQogBCAGIAVBKGogCBACQQJ0aiIJLwEAOwAAIAVBKGogCS0AAhABIAktAAMhCSADIAYgBUEQaiAIEAJBAnRqIg0vAQA7AAAgBUEQaiANLQACEAEgDS0AAyENIAAgC2oiCyAGIAVB2ABqIAgQAkECdGoiAC8BADsAACAFQdgAaiAALQACEAEgAC0AAyEAIAcgCmoiCiAGIAVBQGsgCBACQQJ0aiIHLwEAOwAAIAVBQGsgBy0AAhABIActAAMhByAEIAlqIgkgBiAFQShqIAgQAkECdGoiBC8BADsAACAFQShqIAQtAAIQASAELQADIQQgAyANaiIDIAYgBUEQaiAIEAJBAnRqIg0vAQA7AAAgBUEQaiANLQACEAEgACALaiEAIAcgCmohByAEIAlqIQQgAyANLQADaiEDIAVB2ABqEA0gBUFAaxANciAFQShqEA1yIAVBEGoQDXJFIQsMAQsLIAQgDksgByACS3INAEFsIQsgACAMSw0BIAxBfWohCQNAQQAgACAJSSAFQdgAahAEGwRAIAAgBiAFQdgAaiAIEAJBAnRqIgovAQA7AAAgBUHYAGogCi0AAhABIAAgCi0AA2oiACAGIAVB2ABqIAgQAkECdGoiCi8BADsAACAFQdgAaiAKLQACEAEgACAKLQADaiEADAEFIAxBfmohCgNAIAVB2ABqEAQgACAKS3JFBEAgACAGIAVB2ABqIAgQAkECdGoiCS8BADsAACAFQdgAaiAJLQACEAEgACAJLQADaiEADAELCwNAIAAgCk0EQCAAIAYgBUHYAGogCBACQQJ0aiIJLwEAOwAAIAVB2ABqIAktAAIQASAAIAktAANqIQAMAQsLAkAgACAMTw0AIAAgBiAFQdgAaiAIEAIiAEECdGoiDC0AADoAACAMLQADQQFGBEAgBUHYAGogDC0AAhABDAELIAUoAlxBH0sNACAFQdgAaiAGIABBAnRqLQACEAEgBSgCXEEhSQ0AIAVBIDYCXAsgAkF9aiEMA0BBACAHIAxJIAVBQGsQBBsEQCAHIAYgBUFAayAIEAJBAnRqIgAvAQA7AAAgBUFAayAALQACEAEgByAALQADaiIAIAYgBUFAayAIEAJBAnRqIgcvAQA7AAAgBUFAayAHLQACEAEgACAHLQADaiEHDAEFIAJBfmohDANAIAVBQGsQBCAHIAxLckUEQCAHIAYgBUFAayAIEAJBAnRqIgAvAQA7AAAgBUFAayAALQACEAEgByAALQADaiEHDAELCwNAIAcgDE0EQCAHIAYgBUFAayAIEAJBAnRqIgAvAQA7AAAgBUFAayAALQACEAEgByAALQADaiEHDAELCwJAIAcgAk8NACAHIAYgBUFAayAIEAIiAEECdGoiAi0AADoAACACLQADQQFGBEAgBUFAayACLQACEAEMAQsgBSgCREEfSw0AIAVBQGsgBiAAQQJ0ai0AAhABIAUoAkRBIUkNACAFQSA2AkQLIA5BfWohAgNAQQAgBCACSSAFQShqEAQbBEAgBCAGIAVBKGogCBACQQJ0aiIALwEAOwAAIAVBKGogAC0AAhABIAQgAC0AA2oiACAGIAVBKGogCBACQQJ0aiIELwEAOwAAIAVBKGogBC0AAhABIAAgBC0AA2ohBAwBBSAOQX5qIQIDQCAFQShqEAQgBCACS3JFBEAgBCAGIAVBKGogCBACQQJ0aiIALwEAOwAAIAVBKGogAC0AAhABIAQgAC0AA2ohBAwBCwsDQCAEIAJNBEAgBCAGIAVBKGogCBACQQJ0aiIALwEAOwAAIAVBKGogAC0AAhABIAQgAC0AA2ohBAwBCwsCQCAEIA5PDQAgBCAGIAVBKGogCBACIgBBAnRqIgItAAA6AAAgAi0AA0EBRgRAIAVBKGogAi0AAhABDAELIAUoAixBH0sNACAFQShqIAYgAEECdGotAAIQASAFKAIsQSFJDQAgBUEgNgIsCwNAQQAgAyAQSSAFQRBqEAQbBEAgAyAGIAVBEGogCBACQQJ0aiIALwEAOwAAIAVBEGogAC0AAhABIAMgAC0AA2oiACAGIAVBEGogCBACQQJ0aiICLwEAOwAAIAVBEGogAi0AAhABIAAgAi0AA2ohAwwBBSAPQX5qIQIDQCAFQRBqEAQgAyACS3JFBEAgAyAGIAVBEGogCBACQQJ0aiIALwEAOwAAIAVBEGogAC0AAhABIAMgAC0AA2ohAwwBCwsDQCADIAJNBEAgAyAGIAVBEGogCBACQQJ0aiIALwEAOwAAIAVBEGogAC0AAhABIAMgAC0AA2ohAwwBCwsCQCADIA9PDQAgAyAGIAVBEGogCBACIgBBAnRqIgItAAA6AAAgAi0AA0EBRgRAIAVBEGogAi0AAhABDAELIAUoAhRBH0sNACAFQRBqIAYgAEECdGotAAIQASAFKAIUQSFJDQAgBUEgNgIUCyABQWwgBUHYAGoQCiAFQUBrEApxIAVBKGoQCnEgBUEQahAKcRshCwwJCwAACwALAAALAAsAAAsACwAACwALQWwhCwsgBUHwAGokACALC7UEAQ5/IwBBEGsiBiQAIAZBBGogABAOQVQhBQJAIARB3AtJDQAgBi0ABCEHIANB8ARqQQBB7AAQECEIIAdBDEsNACADQdwJaiIJIAggBkEIaiAGQQxqIAEgAhAxIhAQA0UEQCAGKAIMIgQgB0sNASADQdwFaiEPIANBpAVqIREgAEEEaiESIANBqAVqIQEgBCEFA0AgBSICQX9qIQUgCCACQQJ0aigCAEUNAAsgAkEBaiEOQQEhBQNAIAUgDk9FBEAgCCAFQQJ0IgtqKAIAIQwgASALaiAKNgIAIAVBAWohBSAKIAxqIQoMAQsLIAEgCjYCAEEAIQUgBigCCCELA0AgBSALRkUEQCABIAUgCWotAAAiDEECdGoiDSANKAIAIg1BAWo2AgAgDyANQQF0aiINIAw6AAEgDSAFOgAAIAVBAWohBQwBCwtBACEBIANBADYCqAUgBEF/cyAHaiEJQQEhBQNAIAUgDk9FBEAgCCAFQQJ0IgtqKAIAIQwgAyALaiABNgIAIAwgBSAJanQgAWohASAFQQFqIQUMAQsLIAcgBEEBaiIBIAJrIgRrQQFqIQgDQEEBIQUgBCAIT0UEQANAIAUgDk9FBEAgBUECdCIJIAMgBEE0bGpqIAMgCWooAgAgBHY2AgAgBUEBaiEFDAELCyAEQQFqIQQMAQsLIBIgByAPIAogESADIAIgARBkIAZBAToABSAGIAc6AAYgACAGKAIENgIACyAQIQULIAZBEGokACAFC8ENAQt/IwBB8ABrIgUkAEFsIQkCQCADQQpJDQAgAi8AACEKIAIvAAIhDCACLwAEIQYgBUEIaiAEEA4CQCADIAYgCiAMampBBmoiDUkNACAFLQAKIQcgBUHYAGogAkEGaiICIAoQBiIJEAMNASAFQUBrIAIgCmoiAiAMEAYiCRADDQEgBUEoaiACIAxqIgIgBhAGIgkQAw0BIAVBEGogAiAGaiADIA1rEAYiCRADDQEgACABaiIOQX1qIQ8gBEEEaiEGQQEhCSAAIAFBA2pBAnYiAmoiCiACaiIMIAJqIg0hAyAMIQQgCiECA0AgCSADIA9JcQRAIAYgBUHYAGogBxACQQF0aiIILQAAIQsgBUHYAGogCC0AARABIAAgCzoAACAGIAVBQGsgBxACQQF0aiIILQAAIQsgBUFAayAILQABEAEgAiALOgAAIAYgBUEoaiAHEAJBAXRqIggtAAAhCyAFQShqIAgtAAEQASAEIAs6AAAgBiAFQRBqIAcQAkEBdGoiCC0AACELIAVBEGogCC0AARABIAMgCzoAACAGIAVB2ABqIAcQAkEBdGoiCC0AACELIAVB2ABqIAgtAAEQASAAIAs6AAEgBiAFQUBrIAcQAkEBdGoiCC0AACELIAVBQGsgCC0AARABIAIgCzoAASAGIAVBKGogBxACQQF0aiIILQAAIQsgBUEoaiAILQABEAEgBCALOgABIAYgBUEQaiAHEAJBAXRqIggtAAAhCyAFQRBqIAgtAAEQASADIAs6AAEgA0ECaiEDIARBAmohBCACQQJqIQIgAEECaiEAIAkgBUHYAGoQDUVxIAVBQGsQDUVxIAVBKGoQDUVxIAVBEGoQDUVxIQkMAQsLIAQgDUsgAiAMS3INAEFsIQkgACAKSw0BIApBfWohCQNAIAVB2ABqEAQgACAJT3JFBEAgBiAFQdgAaiAHEAJBAXRqIggtAAAhCyAFQdgAaiAILQABEAEgACALOgAAIAYgBUHYAGogBxACQQF0aiIILQAAIQsgBUHYAGogCC0AARABIAAgCzoAASAAQQJqIQAMAQsLA0AgBUHYAGoQBCAAIApPckUEQCAGIAVB2ABqIAcQAkEBdGoiCS0AACEIIAVB2ABqIAktAAEQASAAIAg6AAAgAEEBaiEADAELCwNAIAAgCkkEQCAGIAVB2ABqIAcQAkEBdGoiCS0AACEIIAVB2ABqIAktAAEQASAAIAg6AAAgAEEBaiEADAELCyAMQX1qIQADQCAFQUBrEAQgAiAAT3JFBEAgBiAFQUBrIAcQAkEBdGoiCi0AACEJIAVBQGsgCi0AARABIAIgCToAACAGIAVBQGsgBxACQQF0aiIKLQAAIQkgBUFAayAKLQABEAEgAiAJOgABIAJBAmohAgwBCwsDQCAFQUBrEAQgAiAMT3JFBEAgBiAFQUBrIAcQAkEBdGoiAC0AACEKIAVBQGsgAC0AARABIAIgCjoAACACQQFqIQIMAQsLA0AgAiAMSQRAIAYgBUFAayAHEAJBAXRqIgAtAAAhCiAFQUBrIAAtAAEQASACIAo6AAAgAkEBaiECDAELCyANQX1qIQADQCAFQShqEAQgBCAAT3JFBEAgBiAFQShqIAcQAkEBdGoiAi0AACEKIAVBKGogAi0AARABIAQgCjoAACAGIAVBKGogBxACQQF0aiICLQAAIQogBUEoaiACLQABEAEgBCAKOgABIARBAmohBAwBCwsDQCAFQShqEAQgBCANT3JFBEAgBiAFQShqIAcQAkEBdGoiAC0AACECIAVBKGogAC0AARABIAQgAjoAACAEQQFqIQQMAQsLA0AgBCANSQRAIAYgBUEoaiAHEAJBAXRqIgAtAAAhAiAFQShqIAAtAAEQASAEIAI6AAAgBEEBaiEEDAELCwNAIAVBEGoQBCADIA9PckUEQCAGIAVBEGogBxACQQF0aiIALQAAIQIgBUEQaiAALQABEAEgAyACOgAAIAYgBUEQaiAHEAJBAXRqIgAtAAAhAiAFQRBqIAAtAAEQASADIAI6AAEgA0ECaiEDDAELCwNAIAVBEGoQBCADIA5PckUEQCAGIAVBEGogBxACQQF0aiIALQAAIQIgBUEQaiAALQABEAEgAyACOgAAIANBAWohAwwBCwsDQCADIA5JBEAgBiAFQRBqIAcQAkEBdGoiAC0AACECIAVBEGogAC0AARABIAMgAjoAACADQQFqIQMMAQsLIAFBbCAFQdgAahAKIAVBQGsQCnEgBUEoahAKcSAFQRBqEApxGyEJDAELQWwhCQsgBUHwAGokACAJC8oCAQR/IwBBIGsiBSQAIAUgBBAOIAUtAAIhByAFQQhqIAIgAxAGIgIQA0UEQCAEQQRqIQIgACABaiIDQX1qIQQDQCAFQQhqEAQgACAET3JFBEAgAiAFQQhqIAcQAkEBdGoiBi0AACEIIAVBCGogBi0AARABIAAgCDoAACACIAVBCGogBxACQQF0aiIGLQAAIQggBUEIaiAGLQABEAEgACAIOgABIABBAmohAAwBCwsDQCAFQQhqEAQgACADT3JFBEAgAiAFQQhqIAcQAkEBdGoiBC0AACEGIAVBCGogBC0AARABIAAgBjoAACAAQQFqIQAMAQsLA0AgACADT0UEQCACIAVBCGogBxACQQF0aiIELQAAIQYgBUEIaiAELQABEAEgACAGOgAAIABBAWohAAwBCwsgAUFsIAVBCGoQChshAgsgBUEgaiQAIAILtgMBCX8jAEEQayIGJAAgBkEANgIMIAZBADYCCEFUIQQCQAJAIANBQGsiDCADIAZBCGogBkEMaiABIAIQMSICEAMNACAGQQRqIAAQDiAGKAIMIgcgBi0ABEEBaksNASAAQQRqIQogBkEAOgAFIAYgBzoABiAAIAYoAgQ2AgAgB0EBaiEJQQEhBANAIAQgCUkEQCADIARBAnRqIgEoAgAhACABIAU2AgAgACAEQX9qdCAFaiEFIARBAWohBAwBCwsgB0EBaiEHQQAhBSAGKAIIIQkDQCAFIAlGDQEgAyAFIAxqLQAAIgRBAnRqIgBBASAEdEEBdSILIAAoAgAiAWoiADYCACAHIARrIQhBACEEAkAgC0EDTQRAA0AgBCALRg0CIAogASAEakEBdGoiACAIOgABIAAgBToAACAEQQFqIQQMAAALAAsDQCABIABPDQEgCiABQQF0aiIEIAg6AAEgBCAFOgAAIAQgCDoAAyAEIAU6AAIgBCAIOgAFIAQgBToABCAEIAg6AAcgBCAFOgAGIAFBBGohAQwAAAsACyAFQQFqIQUMAAALAAsgAiEECyAGQRBqJAAgBAutAQECfwJAQYQgKAIAIABHIAAoAgBBAXYiAyABa0F4aiICQXhxQQhHcgR/IAIFIAMQJ0UNASACQQhqC0EQSQ0AIAAgACgCACICQQFxIAAgAWpBD2pBeHEiASAAa0EBdHI2AgAgASAANgIEIAEgASgCAEEBcSAAIAJBAXZqIAFrIgJBAXRyNgIAQYQgIAEgAkH/////B3FqQQRqQYQgKAIAIABGGyABNgIAIAEQJQsLygIBBX8CQAJAAkAgAEEIIABBCEsbZ0EfcyAAaUEBR2oiAUEESSAAIAF2cg0AIAFBAnRB/B5qKAIAIgJFDQADQCACQXhqIgMoAgBBAXZBeGoiBSAATwRAIAIgBUEIIAVBCEsbZ0Efc0ECdEGAH2oiASgCAEYEQCABIAIoAgQ2AgALDAMLIARBHksNASAEQQFqIQQgAigCBCICDQALC0EAIQMgAUEgTw0BA0AgAUECdEGAH2ooAgAiAkUEQCABQR5LIQIgAUEBaiEBIAJFDQEMAwsLIAIgAkF4aiIDKAIAQQF2QXhqIgFBCCABQQhLG2dBH3NBAnRBgB9qIgEoAgBGBEAgASACKAIENgIACwsgAigCACIBBEAgASACKAIENgIECyACKAIEIgEEQCABIAIoAgA2AgALIAMgAygCAEEBcjYCACADIAAQNwsgAwvhCwINfwV+IwBB8ABrIgckACAHIAAoAvDhASIINgJcIAEgAmohDSAIIAAoAoDiAWohDwJAAkAgBUUEQCABIQQMAQsgACgCxOABIRAgACgCwOABIREgACgCvOABIQ4gAEEBNgKM4QFBACEIA0AgCEEDRwRAIAcgCEECdCICaiAAIAJqQazQAWooAgA2AkQgCEEBaiEIDAELC0FsIQwgB0EYaiADIAQQBhADDQEgB0EsaiAHQRhqIAAoAgAQEyAHQTRqIAdBGGogACgCCBATIAdBPGogB0EYaiAAKAIEEBMgDUFgaiESIAEhBEEAIQwDQCAHKAIwIAcoAixBA3RqKQIAIhRCEIinQf8BcSEIIAcoAkAgBygCPEEDdGopAgAiFUIQiKdB/wFxIQsgBygCOCAHKAI0QQN0aikCACIWQiCIpyEJIBVCIIghFyAUQiCIpyECAkAgFkIQiKdB/wFxIgNBAk8EQAJAIAZFIANBGUlyRQRAIAkgB0EYaiADQSAgBygCHGsiCiAKIANLGyIKEAUgAyAKayIDdGohCSAHQRhqEAQaIANFDQEgB0EYaiADEAUgCWohCQwBCyAHQRhqIAMQBSAJaiEJIAdBGGoQBBoLIAcpAkQhGCAHIAk2AkQgByAYNwNIDAELAkAgA0UEQCACBEAgBygCRCEJDAMLIAcoAkghCQwBCwJAAkAgB0EYakEBEAUgCSACRWpqIgNBA0YEQCAHKAJEQX9qIgMgA0VqIQkMAQsgA0ECdCAHaigCRCIJIAlFaiEJIANBAUYNAQsgByAHKAJINgJMCwsgByAHKAJENgJIIAcgCTYCRAsgF6chAyALBEAgB0EYaiALEAUgA2ohAwsgCCALakEUTwRAIAdBGGoQBBoLIAgEQCAHQRhqIAgQBSACaiECCyAHQRhqEAQaIAcgB0EYaiAUQhiIp0H/AXEQCCAUp0H//wNxajYCLCAHIAdBGGogFUIYiKdB/wFxEAggFadB//8DcWo2AjwgB0EYahAEGiAHIAdBGGogFkIYiKdB/wFxEAggFqdB//8DcWo2AjQgByACNgJgIAcoAlwhCiAHIAk2AmggByADNgJkAkACQAJAIAQgAiADaiILaiASSw0AIAIgCmoiEyAPSw0AIA0gBGsgC0Egak8NAQsgByAHKQNoNwMQIAcgBykDYDcDCCAEIA0gB0EIaiAHQdwAaiAPIA4gESAQEB4hCwwBCyACIARqIQggBCAKEAcgAkERTwRAIARBEGohAgNAIAIgCkEQaiIKEAcgAkEQaiICIAhJDQALCyAIIAlrIQIgByATNgJcIAkgCCAOa0sEQCAJIAggEWtLBEBBbCELDAILIBAgAiAOayICaiIKIANqIBBNBEAgCCAKIAMQDxoMAgsgCCAKQQAgAmsQDyEIIAcgAiADaiIDNgJkIAggAmshCCAOIQILIAlBEE8EQCADIAhqIQMDQCAIIAIQByACQRBqIQIgCEEQaiIIIANJDQALDAELAkAgCUEHTQRAIAggAi0AADoAACAIIAItAAE6AAEgCCACLQACOgACIAggAi0AAzoAAyAIQQRqIAIgCUECdCIDQcAeaigCAGoiAhAXIAIgA0HgHmooAgBrIQIgBygCZCEDDAELIAggAhAMCyADQQlJDQAgAyAIaiEDIAhBCGoiCCACQQhqIgJrQQ9MBEADQCAIIAIQDCACQQhqIQIgCEEIaiIIIANJDQAMAgALAAsDQCAIIAIQByACQRBqIQIgCEEQaiIIIANJDQALCyAHQRhqEAQaIAsgDCALEAMiAhshDCAEIAQgC2ogAhshBCAFQX9qIgUNAAsgDBADDQFBbCEMIAdBGGoQBEECSQ0BQQAhCANAIAhBA0cEQCAAIAhBAnQiAmpBrNABaiACIAdqKAJENgIAIAhBAWohCAwBCwsgBygCXCEIC0G6fyEMIA8gCGsiACANIARrSw0AIAQEfyAEIAggABALIABqBUEACyABayEMCyAHQfAAaiQAIAwLkRcCFn8FfiMAQdABayIHJAAgByAAKALw4QEiCDYCvAEgASACaiESIAggACgCgOIBaiETAkACQCAFRQRAIAEhAwwBCyAAKALE4AEhESAAKALA4AEhFSAAKAK84AEhDyAAQQE2AozhAUEAIQgDQCAIQQNHBEAgByAIQQJ0IgJqIAAgAmpBrNABaigCADYCVCAIQQFqIQgMAQsLIAcgETYCZCAHIA82AmAgByABIA9rNgJoQWwhECAHQShqIAMgBBAGEAMNASAFQQQgBUEESBshFyAHQTxqIAdBKGogACgCABATIAdBxABqIAdBKGogACgCCBATIAdBzABqIAdBKGogACgCBBATQQAhBCAHQeAAaiEMIAdB5ABqIQoDQCAHQShqEARBAksgBCAXTnJFBEAgBygCQCAHKAI8QQN0aikCACIdQhCIp0H/AXEhCyAHKAJQIAcoAkxBA3RqKQIAIh5CEIinQf8BcSEJIAcoAkggBygCREEDdGopAgAiH0IgiKchCCAeQiCIISAgHUIgiKchAgJAIB9CEIinQf8BcSIDQQJPBEACQCAGRSADQRlJckUEQCAIIAdBKGogA0EgIAcoAixrIg0gDSADSxsiDRAFIAMgDWsiA3RqIQggB0EoahAEGiADRQ0BIAdBKGogAxAFIAhqIQgMAQsgB0EoaiADEAUgCGohCCAHQShqEAQaCyAHKQJUISEgByAINgJUIAcgITcDWAwBCwJAIANFBEAgAgRAIAcoAlQhCAwDCyAHKAJYIQgMAQsCQAJAIAdBKGpBARAFIAggAkVqaiIDQQNGBEAgBygCVEF/aiIDIANFaiEIDAELIANBAnQgB2ooAlQiCCAIRWohCCADQQFGDQELIAcgBygCWDYCXAsLIAcgBygCVDYCWCAHIAg2AlQLICCnIQMgCQRAIAdBKGogCRAFIANqIQMLIAkgC2pBFE8EQCAHQShqEAQaCyALBEAgB0EoaiALEAUgAmohAgsgB0EoahAEGiAHIAcoAmggAmoiCSADajYCaCAKIAwgCCAJSxsoAgAhDSAHIAdBKGogHUIYiKdB/wFxEAggHadB//8DcWo2AjwgByAHQShqIB5CGIinQf8BcRAIIB6nQf//A3FqNgJMIAdBKGoQBBogB0EoaiAfQhiIp0H/AXEQCCEOIAdB8ABqIARBBHRqIgsgCSANaiAIazYCDCALIAg2AgggCyADNgIEIAsgAjYCACAHIA4gH6dB//8DcWo2AkQgBEEBaiEEDAELCyAEIBdIDQEgEkFgaiEYIAdB4ABqIRogB0HkAGohGyABIQMDQCAHQShqEARBAksgBCAFTnJFBEAgBygCQCAHKAI8QQN0aikCACIdQhCIp0H/AXEhCyAHKAJQIAcoAkxBA3RqKQIAIh5CEIinQf8BcSEIIAcoAkggBygCREEDdGopAgAiH0IgiKchCSAeQiCIISAgHUIgiKchDAJAIB9CEIinQf8BcSICQQJPBEACQCAGRSACQRlJckUEQCAJIAdBKGogAkEgIAcoAixrIgogCiACSxsiChAFIAIgCmsiAnRqIQkgB0EoahAEGiACRQ0BIAdBKGogAhAFIAlqIQkMAQsgB0EoaiACEAUgCWohCSAHQShqEAQaCyAHKQJUISEgByAJNgJUIAcgITcDWAwBCwJAIAJFBEAgDARAIAcoAlQhCQwDCyAHKAJYIQkMAQsCQAJAIAdBKGpBARAFIAkgDEVqaiICQQNGBEAgBygCVEF/aiICIAJFaiEJDAELIAJBAnQgB2ooAlQiCSAJRWohCSACQQFGDQELIAcgBygCWDYCXAsLIAcgBygCVDYCWCAHIAk2AlQLICCnIRQgCARAIAdBKGogCBAFIBRqIRQLIAggC2pBFE8EQCAHQShqEAQaCyALBEAgB0EoaiALEAUgDGohDAsgB0EoahAEGiAHIAcoAmggDGoiGSAUajYCaCAbIBogCSAZSxsoAgAhHCAHIAdBKGogHUIYiKdB/wFxEAggHadB//8DcWo2AjwgByAHQShqIB5CGIinQf8BcRAIIB6nQf//A3FqNgJMIAdBKGoQBBogByAHQShqIB9CGIinQf8BcRAIIB+nQf//A3FqNgJEIAcgB0HwAGogBEEDcUEEdGoiDSkDCCIdNwPIASAHIA0pAwAiHjcDwAECQAJAAkAgBygCvAEiDiAepyICaiIWIBNLDQAgAyAHKALEASIKIAJqIgtqIBhLDQAgEiADayALQSBqTw0BCyAHIAcpA8gBNwMQIAcgBykDwAE3AwggAyASIAdBCGogB0G8AWogEyAPIBUgERAeIQsMAQsgAiADaiEIIAMgDhAHIAJBEU8EQCADQRBqIQIDQCACIA5BEGoiDhAHIAJBEGoiAiAISQ0ACwsgCCAdpyIOayECIAcgFjYCvAEgDiAIIA9rSwRAIA4gCCAVa0sEQEFsIQsMAgsgESACIA9rIgJqIhYgCmogEU0EQCAIIBYgChAPGgwCCyAIIBZBACACaxAPIQggByACIApqIgo2AsQBIAggAmshCCAPIQILIA5BEE8EQCAIIApqIQoDQCAIIAIQByACQRBqIQIgCEEQaiIIIApJDQALDAELAkAgDkEHTQRAIAggAi0AADoAACAIIAItAAE6AAEgCCACLQACOgACIAggAi0AAzoAAyAIQQRqIAIgDkECdCIKQcAeaigCAGoiAhAXIAIgCkHgHmooAgBrIQIgBygCxAEhCgwBCyAIIAIQDAsgCkEJSQ0AIAggCmohCiAIQQhqIgggAkEIaiICa0EPTARAA0AgCCACEAwgAkEIaiECIAhBCGoiCCAKSQ0ADAIACwALA0AgCCACEAcgAkEQaiECIAhBEGoiCCAKSQ0ACwsgCxADBEAgCyEQDAQFIA0gDDYCACANIBkgHGogCWs2AgwgDSAJNgIIIA0gFDYCBCAEQQFqIQQgAyALaiEDDAILAAsLIAQgBUgNASAEIBdrIQtBACEEA0AgCyAFSARAIAcgB0HwAGogC0EDcUEEdGoiAikDCCIdNwPIASAHIAIpAwAiHjcDwAECQAJAAkAgBygCvAEiDCAepyICaiIKIBNLDQAgAyAHKALEASIJIAJqIhBqIBhLDQAgEiADayAQQSBqTw0BCyAHIAcpA8gBNwMgIAcgBykDwAE3AxggAyASIAdBGGogB0G8AWogEyAPIBUgERAeIRAMAQsgAiADaiEIIAMgDBAHIAJBEU8EQCADQRBqIQIDQCACIAxBEGoiDBAHIAJBEGoiAiAISQ0ACwsgCCAdpyIGayECIAcgCjYCvAEgBiAIIA9rSwRAIAYgCCAVa0sEQEFsIRAMAgsgESACIA9rIgJqIgwgCWogEU0EQCAIIAwgCRAPGgwCCyAIIAxBACACaxAPIQggByACIAlqIgk2AsQBIAggAmshCCAPIQILIAZBEE8EQCAIIAlqIQYDQCAIIAIQByACQRBqIQIgCEEQaiIIIAZJDQALDAELAkAgBkEHTQRAIAggAi0AADoAACAIIAItAAE6AAEgCCACLQACOgACIAggAi0AAzoAAyAIQQRqIAIgBkECdCIGQcAeaigCAGoiAhAXIAIgBkHgHmooAgBrIQIgBygCxAEhCQwBCyAIIAIQDAsgCUEJSQ0AIAggCWohBiAIQQhqIgggAkEIaiICa0EPTARAA0AgCCACEAwgAkEIaiECIAhBCGoiCCAGSQ0ADAIACwALA0AgCCACEAcgAkEQaiECIAhBEGoiCCAGSQ0ACwsgEBADDQMgC0EBaiELIAMgEGohAwwBCwsDQCAEQQNHBEAgACAEQQJ0IgJqQazQAWogAiAHaigCVDYCACAEQQFqIQQMAQsLIAcoArwBIQgLQbp/IRAgEyAIayIAIBIgA2tLDQAgAwR/IAMgCCAAEAsgAGoFQQALIAFrIRALIAdB0AFqJAAgEAslACAAQgA3AgAgAEEAOwEIIABBADoACyAAIAE2AgwgACACOgAKC7QFAQN/IwBBMGsiBCQAIABB/wFqIgVBfWohBgJAIAMvAQIEQCAEQRhqIAEgAhAGIgIQAw0BIARBEGogBEEYaiADEBwgBEEIaiAEQRhqIAMQHCAAIQMDQAJAIARBGGoQBCADIAZPckUEQCADIARBEGogBEEYahASOgAAIAMgBEEIaiAEQRhqEBI6AAEgBEEYahAERQ0BIANBAmohAwsgBUF+aiEFAn8DQEG6fyECIAMiASAFSw0FIAEgBEEQaiAEQRhqEBI6AAAgAUEBaiEDIARBGGoQBEEDRgRAQQIhAiAEQQhqDAILIAMgBUsNBSABIARBCGogBEEYahASOgABIAFBAmohA0EDIQIgBEEYahAEQQNHDQALIARBEGoLIQUgAyAFIARBGGoQEjoAACABIAJqIABrIQIMAwsgAyAEQRBqIARBGGoQEjoAAiADIARBCGogBEEYahASOgADIANBBGohAwwAAAsACyAEQRhqIAEgAhAGIgIQAw0AIARBEGogBEEYaiADEBwgBEEIaiAEQRhqIAMQHCAAIQMDQAJAIARBGGoQBCADIAZPckUEQCADIARBEGogBEEYahAROgAAIAMgBEEIaiAEQRhqEBE6AAEgBEEYahAERQ0BIANBAmohAwsgBUF+aiEFAn8DQEG6fyECIAMiASAFSw0EIAEgBEEQaiAEQRhqEBE6AAAgAUEBaiEDIARBGGoQBEEDRgRAQQIhAiAEQQhqDAILIAMgBUsNBCABIARBCGogBEEYahAROgABIAFBAmohA0EDIQIgBEEYahAEQQNHDQALIARBEGoLIQUgAyAFIARBGGoQEToAACABIAJqIABrIQIMAgsgAyAEQRBqIARBGGoQEToAAiADIARBCGogBEEYahAROgADIANBBGohAwwAAAsACyAEQTBqJAAgAgtpAQF/An8CQAJAIAJBB00NACABKAAAQbfIwuF+Rw0AIAAgASgABDYCmOIBQWIgAEEQaiABIAIQPiIDEAMNAhogAEKBgICAEDcDiOEBIAAgASADaiACIANrECoMAQsgACABIAIQKgtBAAsLrQMBBn8jAEGAAWsiAyQAQWIhCAJAIAJBCUkNACAAQZjQAGogAUEIaiIEIAJBeGogAEGY0AAQMyIFEAMiBg0AIANBHzYCfCADIANB/ABqIANB+ABqIAQgBCAFaiAGGyIEIAEgAmoiAiAEaxAVIgUQAw0AIAMoAnwiBkEfSw0AIAMoAngiB0EJTw0AIABBiCBqIAMgBkGAC0GADCAHEBggA0E0NgJ8IAMgA0H8AGogA0H4AGogBCAFaiIEIAIgBGsQFSIFEAMNACADKAJ8IgZBNEsNACADKAJ4IgdBCk8NACAAQZAwaiADIAZBgA1B4A4gBxAYIANBIzYCfCADIANB/ABqIANB+ABqIAQgBWoiBCACIARrEBUiBRADDQAgAygCfCIGQSNLDQAgAygCeCIHQQpPDQAgACADIAZBwBBB0BEgBxAYIAQgBWoiBEEMaiIFIAJLDQAgAiAFayEFQQAhAgNAIAJBA0cEQCAEKAAAIgZBf2ogBU8NAiAAIAJBAnRqQZzQAWogBjYCACACQQFqIQIgBEEEaiEEDAELCyAEIAFrIQgLIANBgAFqJAAgCAtGAQN/IABBCGohAyAAKAIEIQJBACEAA0AgACACdkUEQCABIAMgAEEDdGotAAJBFktqIQEgAEEBaiEADAELCyABQQggAmt0C4YDAQV/Qbh/IQcCQCADRQ0AIAItAAAiBEUEQCABQQA2AgBBAUG4fyADQQFGGw8LAn8gAkEBaiIFIARBGHRBGHUiBkF/Sg0AGiAGQX9GBEAgA0EDSA0CIAUvAABBgP4BaiEEIAJBA2oMAQsgA0ECSA0BIAItAAEgBEEIdHJBgIB+aiEEIAJBAmoLIQUgASAENgIAIAVBAWoiASACIANqIgNLDQBBbCEHIABBEGogACAFLQAAIgVBBnZBI0EJIAEgAyABa0HAEEHQEUHwEiAAKAKM4QEgACgCnOIBIAQQHyIGEAMiCA0AIABBmCBqIABBCGogBUEEdkEDcUEfQQggASABIAZqIAgbIgEgAyABa0GAC0GADEGAFyAAKAKM4QEgACgCnOIBIAQQHyIGEAMiCA0AIABBoDBqIABBBGogBUECdkEDcUE0QQkgASABIAZqIAgbIgEgAyABa0GADUHgDkGQGSAAKAKM4QEgACgCnOIBIAQQHyIAEAMNACAAIAFqIAJrIQcLIAcLrQMBCn8jAEGABGsiCCQAAn9BUiACQf8BSw0AGkFUIANBDEsNABogAkEBaiELIABBBGohCUGAgAQgA0F/anRBEHUhCkEAIQJBASEEQQEgA3QiB0F/aiIMIQUDQCACIAtGRQRAAkAgASACQQF0Ig1qLwEAIgZB//8DRgRAIAkgBUECdGogAjoAAiAFQX9qIQVBASEGDAELIARBACAKIAZBEHRBEHVKGyEECyAIIA1qIAY7AQAgAkEBaiECDAELCyAAIAQ7AQIgACADOwEAIAdBA3YgB0EBdmpBA2ohBkEAIQRBACECA0AgBCALRkUEQCABIARBAXRqLgEAIQpBACEAA0AgACAKTkUEQCAJIAJBAnRqIAQ6AAIDQCACIAZqIAxxIgIgBUsNAAsgAEEBaiEADAELCyAEQQFqIQQMAQsLQX8gAg0AGkEAIQIDfyACIAdGBH9BAAUgCCAJIAJBAnRqIgAtAAJBAXRqIgEgAS8BACIBQQFqOwEAIAAgAyABEBRrIgU6AAMgACABIAVB/wFxdCAHazsBACACQQFqIQIMAQsLCyEFIAhBgARqJAAgBQvjBgEIf0FsIQcCQCACQQNJDQACQAJAAkACQCABLQAAIgNBA3EiCUEBaw4DAwEAAgsgACgCiOEBDQBBYg8LIAJBBUkNAkEDIQYgASgAACEFAn8CQAJAIANBAnZBA3EiCEF+aiIEQQFNBEAgBEEBaw0BDAILIAVBDnZB/wdxIQQgBUEEdkH/B3EhAyAIRQwCCyAFQRJ2IQRBBCEGIAVBBHZB//8AcSEDQQAMAQsgBUEEdkH//w9xIgNBgIAISw0DIAEtAARBCnQgBUEWdnIhBEEFIQZBAAshBSAEIAZqIgogAksNAgJAIANBgQZJDQAgACgCnOIBRQ0AQQAhAgNAIAJBg4ABSw0BIAJBQGshAgwAAAsACwJ/IAlBA0YEQCABIAZqIQEgAEHw4gFqIQIgACgCDCEGIAUEQCACIAMgASAEIAYQXwwCCyACIAMgASAEIAYQXQwBCyAAQbjQAWohAiABIAZqIQEgAEHw4gFqIQYgAEGo0ABqIQggBQRAIAggBiADIAEgBCACEF4MAQsgCCAGIAMgASAEIAIQXAsQAw0CIAAgAzYCgOIBIABBATYCiOEBIAAgAEHw4gFqNgLw4QEgCUECRgRAIAAgAEGo0ABqNgIMCyAAIANqIgBBiOMBakIANwAAIABBgOMBakIANwAAIABB+OIBakIANwAAIABB8OIBakIANwAAIAoPCwJ/AkACQAJAIANBAnZBA3FBf2oiBEECSw0AIARBAWsOAgACAQtBASEEIANBA3YMAgtBAiEEIAEvAABBBHYMAQtBAyEEIAEQIUEEdgsiAyAEaiIFQSBqIAJLBEAgBSACSw0CIABB8OIBaiABIARqIAMQCyEBIAAgAzYCgOIBIAAgATYC8OEBIAEgA2oiAEIANwAYIABCADcAECAAQgA3AAggAEIANwAAIAUPCyAAIAM2AoDiASAAIAEgBGo2AvDhASAFDwsCfwJAAkACQCADQQJ2QQNxQX9qIgRBAksNACAEQQFrDgIAAgELQQEhByADQQN2DAILQQIhByABLwAAQQR2DAELIAJBBEkgARAhIgJBj4CAAUtyDQFBAyEHIAJBBHYLIQIgAEHw4gFqIAEgB2otAAAgAkEgahAQIQEgACACNgKA4gEgACABNgLw4QEgB0EBaiEHCyAHC0sAIABC+erQ0OfJoeThADcDICAAQgA3AxggAELP1tO+0ser2UI3AxAgAELW64Lu6v2J9eAANwMIIABCADcDACAAQShqQQBBKBAQGgviAgICfwV+IABBKGoiASAAKAJIaiECAn4gACkDACIDQiBaBEAgACkDECIEQgeJIAApAwgiBUIBiXwgACkDGCIGQgyJfCAAKQMgIgdCEol8IAUQGSAEEBkgBhAZIAcQGQwBCyAAKQMYQsXP2bLx5brqJ3wLIAN8IQMDQCABQQhqIgAgAk0EQEIAIAEpAAAQCSADhUIbiUKHla+vmLbem55/fkLj3MqV/M7y9YV/fCEDIAAhAQwBCwsCQCABQQRqIgAgAksEQCABIQAMAQsgASgAAK1Ch5Wvr5i23puef34gA4VCF4lCz9bTvtLHq9lCfkL5893xmfaZqxZ8IQMLA0AgACACSQRAIAAxAABCxc/ZsvHluuonfiADhUILiUKHla+vmLbem55/fiEDIABBAWohAAwBCwsgA0IhiCADhULP1tO+0ser2UJ+IgNCHYggA4VC+fPd8Zn2masWfiIDQiCIIAOFC+8CAgJ/BH4gACAAKQMAIAKtfDcDAAJAAkAgACgCSCIDIAJqIgRBH00EQCABRQ0BIAAgA2pBKGogASACECAgACgCSCACaiEEDAELIAEgAmohAgJ/IAMEQCAAQShqIgQgA2ogAUEgIANrECAgACAAKQMIIAQpAAAQCTcDCCAAIAApAxAgACkAMBAJNwMQIAAgACkDGCAAKQA4EAk3AxggACAAKQMgIABBQGspAAAQCTcDICAAKAJIIQMgAEEANgJIIAEgA2tBIGohAQsgAUEgaiACTQsEQCACQWBqIQMgACkDICEFIAApAxghBiAAKQMQIQcgACkDCCEIA0AgCCABKQAAEAkhCCAHIAEpAAgQCSEHIAYgASkAEBAJIQYgBSABKQAYEAkhBSABQSBqIgEgA00NAAsgACAFNwMgIAAgBjcDGCAAIAc3AxAgACAINwMICyABIAJPDQEgAEEoaiABIAIgAWsiBBAgCyAAIAQ2AkgLCy8BAX8gAEUEQEG2f0EAIAMbDwtBun8hBCADIAFNBH8gACACIAMQEBogAwVBun8LCy8BAX8gAEUEQEG2f0EAIAMbDwtBun8hBCADIAFNBH8gACACIAMQCxogAwVBun8LC6gCAQZ/IwBBEGsiByQAIABB2OABaikDAEKAgIAQViEIQbh/IQUCQCAEQf//B0sNACAAIAMgBBBCIgUQAyIGDQAgACgCnOIBIQkgACAHQQxqIAMgAyAFaiAGGyIKIARBACAFIAYbayIGEEAiAxADBEAgAyEFDAELIAcoAgwhBCABRQRAQbp/IQUgBEEASg0BCyAGIANrIQUgAyAKaiEDAkAgCQRAIABBADYCnOIBDAELAkACQAJAIARBBUgNACAAQdjgAWopAwBCgICACFgNAAwBCyAAQQA2ApziAQwBCyAAKAIIED8hBiAAQQA2ApziASAGQRRPDQELIAAgASACIAMgBSAEIAgQOSEFDAELIAAgASACIAMgBSAEIAgQOiEFCyAHQRBqJAAgBQtnACAAQdDgAWogASACIAAoAuzhARAuIgEQAwRAIAEPC0G4fyECAkAgAQ0AIABB7OABaigCACIBBEBBYCECIAAoApjiASABRw0BC0EAIQIgAEHw4AFqKAIARQ0AIABBkOEBahBDCyACCycBAX8QVyIERQRAQUAPCyAEIAAgASACIAMgBBBLEE8hACAEEFYgAAs/AQF/AkACQAJAIAAoAqDiAUEBaiIBQQJLDQAgAUEBaw4CAAECCyAAEDBBAA8LIABBADYCoOIBCyAAKAKU4gELvAMCB38BfiMAQRBrIgkkAEG4fyEGAkAgBCgCACIIQQVBCSAAKALs4QEiBRtJDQAgAygCACIHQQFBBSAFGyAFEC8iBRADBEAgBSEGDAELIAggBUEDakkNACAAIAcgBRBJIgYQAw0AIAEgAmohCiAAQZDhAWohCyAIIAVrIQIgBSAHaiEHIAEhBQNAIAcgAiAJECwiBhADDQEgAkF9aiICIAZJBEBBuH8hBgwCCyAJKAIAIghBAksEQEFsIQYMAgsgB0EDaiEHAn8CQAJAAkAgCEEBaw4CAgABCyAAIAUgCiAFayAHIAYQSAwCCyAFIAogBWsgByAGEEcMAQsgBSAKIAVrIActAAAgCSgCCBBGCyIIEAMEQCAIIQYMAgsgACgC8OABBEAgCyAFIAgQRQsgAiAGayECIAYgB2ohByAFIAhqIQUgCSgCBEUNAAsgACkD0OABIgxCf1IEQEFsIQYgDCAFIAFrrFINAQsgACgC8OABBEBBaiEGIAJBBEkNASALEEQhDCAHKAAAIAynRw0BIAdBBGohByACQXxqIQILIAMgBzYCACAEIAI2AgAgBSABayEGCyAJQRBqJAAgBgsuACAAECsCf0EAQQAQAw0AGiABRSACRXJFBEBBYiAAIAEgAhA9EAMNARoLQQALCzcAIAEEQCAAIAAoAsTgASABKAIEIAEoAghqRzYCnOIBCyAAECtBABADIAFFckUEQCAAIAEQWwsL0QIBB38jAEEQayIGJAAgBiAENgIIIAYgAzYCDCAFBEAgBSgCBCEKIAUoAgghCQsgASEIAkACQANAIAAoAuzhARAWIQsCQANAIAQgC0kNASADKAAAQXBxQdDUtMIBRgRAIAMgBBAiIgcQAw0EIAQgB2shBCADIAdqIQMMAQsLIAYgAzYCDCAGIAQ2AggCQCAFBEAgACAFEE5BACEHQQAQA0UNAQwFCyAAIAogCRBNIgcQAw0ECyAAIAgQUCAMQQFHQQAgACAIIAIgBkEMaiAGQQhqEEwiByIDa0EAIAMQAxtBCkdyRQRAQbh/IQcMBAsgBxADDQMgAiAHayECIAcgCGohCEEBIQwgBigCDCEDIAYoAgghBAwBCwsgBiADNgIMIAYgBDYCCEG4fyEHIAQNASAIIAFrIQcMAQsgBiADNgIMIAYgBDYCCAsgBkEQaiQAIAcLRgECfyABIAAoArjgASICRwRAIAAgAjYCxOABIAAgATYCuOABIAAoArzgASEDIAAgATYCvOABIAAgASADIAJrajYCwOABCwutAgIEfwF+IwBBQGoiBCQAAkACQCACQQhJDQAgASgAAEFwcUHQ1LTCAUcNACABIAIQIiEBIABCADcDCCAAQQA2AgQgACABNgIADAELIARBGGogASACEC0iAxADBEAgACADEBoMAQsgAwRAIABBuH8QGgwBCyACIAQoAjAiA2shAiABIANqIQMDQAJAIAAgAyACIARBCGoQLCIFEAMEfyAFBSACIAVBA2oiBU8NAUG4fwsQGgwCCyAGQQFqIQYgAiAFayECIAMgBWohAyAEKAIMRQ0ACyAEKAI4BEAgAkEDTQRAIABBuH8QGgwCCyADQQRqIQMLIAQoAighAiAEKQMYIQcgAEEANgIEIAAgAyABazYCACAAIAIgBmytIAcgB0J/URs3AwgLIARBQGskAAslAQF/IwBBEGsiAiQAIAIgACABEFEgAigCACEAIAJBEGokACAAC30BBH8jAEGQBGsiBCQAIARB/wE2AggCQCAEQRBqIARBCGogBEEMaiABIAIQFSIGEAMEQCAGIQUMAQtBVCEFIAQoAgwiB0EGSw0AIAMgBEEQaiAEKAIIIAcQQSIFEAMNACAAIAEgBmogAiAGayADEDwhBQsgBEGQBGokACAFC4cBAgJ/An5BABAWIQMCQANAIAEgA08EQAJAIAAoAABBcHFB0NS0wgFGBEAgACABECIiAhADRQ0BQn4PCyAAIAEQVSIEQn1WDQMgBCAFfCIFIARUIQJCfiEEIAINAyAAIAEQUiICEAMNAwsgASACayEBIAAgAmohAAwBCwtCfiAFIAEbIQQLIAQLPwIBfwF+IwBBMGsiAiQAAn5CfiACQQhqIAAgARAtDQAaQgAgAigCHEEBRg0AGiACKQMICyEDIAJBMGokACADC40BAQJ/IwBBMGsiASQAAkAgAEUNACAAKAKI4gENACABIABB/OEBaigCADYCKCABIAApAvThATcDICAAEDAgACgCqOIBIQIgASABKAIoNgIYIAEgASkDIDcDECACIAFBEGoQGyAAQQA2AqjiASABIAEoAig2AgggASABKQMgNwMAIAAgARAbCyABQTBqJAALKgECfyMAQRBrIgAkACAAQQA2AgggAEIANwMAIAAQWCEBIABBEGokACABC4cBAQN/IwBBEGsiAiQAAkAgACgCAEUgACgCBEVzDQAgAiAAKAIINgIIIAIgACkCADcDAAJ/IAIoAgAiAQRAIAIoAghBqOMJIAERBQAMAQtBqOMJECgLIgFFDQAgASAAKQIANwL04QEgAUH84QFqIAAoAgg2AgAgARBZIAEhAwsgAkEQaiQAIAMLywEBAn8jAEEgayIBJAAgAEGBgIDAADYCtOIBIABBADYCiOIBIABBADYC7OEBIABCADcDkOIBIABBADYCpOMJIABBADYC3OIBIABCADcCzOIBIABBADYCvOIBIABBADYCxOABIABCADcCnOIBIABBpOIBakIANwIAIABBrOIBakEANgIAIAFCADcCECABQgA3AhggASABKQMYNwMIIAEgASkDEDcDACABKAIIQQh2QQFxIQIgAEEANgLg4gEgACACNgKM4gEgAUEgaiQAC3YBA38jAEEwayIBJAAgAARAIAEgAEHE0AFqIgIoAgA2AiggASAAKQK80AE3AyAgACgCACEDIAEgAigCADYCGCABIAApArzQATcDECADIAFBEGoQGyABIAEoAig2AgggASABKQMgNwMAIAAgARAbCyABQTBqJAALzAEBAX8gACABKAK00AE2ApjiASAAIAEoAgQiAjYCwOABIAAgAjYCvOABIAAgAiABKAIIaiICNgK44AEgACACNgLE4AEgASgCuNABBEAgAEKBgICAEDcDiOEBIAAgAUGk0ABqNgIMIAAgAUGUIGo2AgggACABQZwwajYCBCAAIAFBDGo2AgAgAEGs0AFqIAFBqNABaigCADYCACAAQbDQAWogAUGs0AFqKAIANgIAIABBtNABaiABQbDQAWooAgA2AgAPCyAAQgA3A4jhAQs7ACACRQRAQbp/DwsgBEUEQEFsDwsgAiAEEGAEQCAAIAEgAiADIAQgBRBhDwsgACABIAIgAyAEIAUQZQtGAQF/IwBBEGsiBSQAIAVBCGogBBAOAn8gBS0ACQRAIAAgASACIAMgBBAyDAELIAAgASACIAMgBBA0CyEAIAVBEGokACAACzQAIAAgAyAEIAUQNiIFEAMEQCAFDwsgBSAESQR/IAEgAiADIAVqIAQgBWsgABA1BUG4fwsLRgEBfyMAQRBrIgUkACAFQQhqIAQQDgJ/IAUtAAkEQCAAIAEgAiADIAQQYgwBCyAAIAEgAiADIAQQNQshACAFQRBqJAAgAAtZAQF/QQ8hAiABIABJBEAgAUEEdCAAbiECCyAAQQh2IgEgAkEYbCIAQYwIaigCAGwgAEGICGooAgBqIgJBA3YgAmogAEGACGooAgAgAEGECGooAgAgAWxqSQs3ACAAIAMgBCAFQYAQEDMiBRADBEAgBQ8LIAUgBEkEfyABIAIgAyAFaiAEIAVrIAAQMgVBuH8LC78DAQN/IwBBIGsiBSQAIAVBCGogAiADEAYiAhADRQRAIAAgAWoiB0F9aiEGIAUgBBAOIARBBGohAiAFLQACIQMDQEEAIAAgBkkgBUEIahAEGwRAIAAgAiAFQQhqIAMQAkECdGoiBC8BADsAACAFQQhqIAQtAAIQASAAIAQtAANqIgQgAiAFQQhqIAMQAkECdGoiAC8BADsAACAFQQhqIAAtAAIQASAEIAAtAANqIQAMAQUgB0F+aiEEA0AgBUEIahAEIAAgBEtyRQRAIAAgAiAFQQhqIAMQAkECdGoiBi8BADsAACAFQQhqIAYtAAIQASAAIAYtAANqIQAMAQsLA0AgACAES0UEQCAAIAIgBUEIaiADEAJBAnRqIgYvAQA7AAAgBUEIaiAGLQACEAEgACAGLQADaiEADAELCwJAIAAgB08NACAAIAIgBUEIaiADEAIiA0ECdGoiAC0AADoAACAALQADQQFGBEAgBUEIaiAALQACEAEMAQsgBSgCDEEfSw0AIAVBCGogAiADQQJ0ai0AAhABIAUoAgxBIUkNACAFQSA2AgwLIAFBbCAFQQhqEAobIQILCwsgBUEgaiQAIAILkgIBBH8jAEFAaiIJJAAgCSADQTQQCyEDAkAgBEECSA0AIAMgBEECdGooAgAhCSADQTxqIAgQIyADQQE6AD8gAyACOgA+QQAhBCADKAI8IQoDQCAEIAlGDQEgACAEQQJ0aiAKNgEAIARBAWohBAwAAAsAC0EAIQkDQCAGIAlGRQRAIAMgBSAJQQF0aiIKLQABIgtBAnRqIgwoAgAhBCADQTxqIAotAABBCHQgCGpB//8DcRAjIANBAjoAPyADIAcgC2siCiACajoAPiAEQQEgASAKa3RqIQogAygCPCELA0AgACAEQQJ0aiALNgEAIARBAWoiBCAKSQ0ACyAMIAo2AgAgCUEBaiEJDAELCyADQUBrJAALowIBCX8jAEHQAGsiCSQAIAlBEGogBUE0EAsaIAcgBmshDyAHIAFrIRADQAJAIAMgCkcEQEEBIAEgByACIApBAXRqIgYtAAEiDGsiCGsiC3QhDSAGLQAAIQ4gCUEQaiAMQQJ0aiIMKAIAIQYgCyAPTwRAIAAgBkECdGogCyAIIAUgCEE0bGogCCAQaiIIQQEgCEEBShsiCCACIAQgCEECdGooAgAiCEEBdGogAyAIayAHIA4QYyAGIA1qIQgMAgsgCUEMaiAOECMgCUEBOgAPIAkgCDoADiAGIA1qIQggCSgCDCELA0AgBiAITw0CIAAgBkECdGogCzYBACAGQQFqIQYMAAALAAsgCUHQAGokAA8LIAwgCDYCACAKQQFqIQoMAAALAAs0ACAAIAMgBCAFEDYiBRADBEAgBQ8LIAUgBEkEfyABIAIgAyAFaiAEIAVrIAAQNAVBuH8LCyMAIAA/AEEQdGtB//8DakEQdkAAQX9GBEBBAA8LQQAQAEEBCzsBAX8gAgRAA0AgACABIAJBgCAgAkGAIEkbIgMQCyEAIAFBgCBqIQEgAEGAIGohACACIANrIgINAAsLCwYAIAAQAwsLqBUJAEGICAsNAQAAAAEAAAACAAAAAgBBoAgLswYBAAAAAQAAAAIAAAACAAAAJgAAAIIAAAAhBQAASgAAAGcIAAAmAAAAwAEAAIAAAABJBQAASgAAAL4IAAApAAAALAIAAIAAAABJBQAASgAAAL4IAAAvAAAAygIAAIAAAACKBQAASgAAAIQJAAA1AAAAcwMAAIAAAACdBQAASgAAAKAJAAA9AAAAgQMAAIAAAADrBQAASwAAAD4KAABEAAAAngMAAIAAAABNBgAASwAAAKoKAABLAAAAswMAAIAAAADBBgAATQAAAB8NAABNAAAAUwQAAIAAAAAjCAAAUQAAAKYPAABUAAAAmQQAAIAAAABLCQAAVwAAALESAABYAAAA2gQAAIAAAABvCQAAXQAAACMUAABUAAAARQUAAIAAAABUCgAAagAAAIwUAABqAAAArwUAAIAAAAB2CQAAfAAAAE4QAAB8AAAA0gIAAIAAAABjBwAAkQAAAJAHAACSAAAAAAAAAAEAAAABAAAABQAAAA0AAAAdAAAAPQAAAH0AAAD9AAAA/QEAAP0DAAD9BwAA/Q8AAP0fAAD9PwAA/X8AAP3/AAD9/wEA/f8DAP3/BwD9/w8A/f8fAP3/PwD9/38A/f//AP3//wH9//8D/f//B/3//w/9//8f/f//P/3//38AAAAAAQAAAAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAgAAAAJAAAACgAAAAsAAAAMAAAADQAAAA4AAAAPAAAAEAAAABEAAAASAAAAEwAAABQAAAAVAAAAFgAAABcAAAAYAAAAGQAAABoAAAAbAAAAHAAAAB0AAAAeAAAAHwAAAAMAAAAEAAAABQAAAAYAAAAHAAAACAAAAAkAAAAKAAAACwAAAAwAAAANAAAADgAAAA8AAAAQAAAAEQAAABIAAAATAAAAFAAAABUAAAAWAAAAFwAAABgAAAAZAAAAGgAAABsAAAAcAAAAHQAAAB4AAAAfAAAAIAAAACEAAAAiAAAAIwAAACUAAAAnAAAAKQAAACsAAAAvAAAAMwAAADsAAABDAAAAUwAAAGMAAACDAAAAAwEAAAMCAAADBAAAAwgAAAMQAAADIAAAA0AAAAOAAAADAAEAQeAPC1EBAAAAAQAAAAEAAAABAAAAAgAAAAIAAAADAAAAAwAAAAQAAAAEAAAABQAAAAcAAAAIAAAACQAAAAoAAAALAAAADAAAAA0AAAAOAAAADwAAABAAQcQQC4sBAQAAAAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAgAAAAJAAAACgAAAAsAAAAMAAAADQAAAA4AAAAPAAAAEAAAABIAAAAUAAAAFgAAABgAAAAcAAAAIAAAACgAAAAwAAAAQAAAAIAAAAAAAQAAAAIAAAAEAAAACAAAABAAAAAgAAAAQAAAAIAAAAAAAQBBkBIL5gQBAAAAAQAAAAEAAAABAAAAAgAAAAIAAAADAAAAAwAAAAQAAAAGAAAABwAAAAgAAAAJAAAACgAAAAsAAAAMAAAADQAAAA4AAAAPAAAAEAAAAAEAAAAEAAAACAAAAAAAAAABAAEBBgAAAAAAAAQAAAAAEAAABAAAAAAgAAAFAQAAAAAAAAUDAAAAAAAABQQAAAAAAAAFBgAAAAAAAAUHAAAAAAAABQkAAAAAAAAFCgAAAAAAAAUMAAAAAAAABg4AAAAAAAEFEAAAAAAAAQUUAAAAAAABBRYAAAAAAAIFHAAAAAAAAwUgAAAAAAAEBTAAAAAgAAYFQAAAAAAABwWAAAAAAAAIBgABAAAAAAoGAAQAAAAADAYAEAAAIAAABAAAAAAAAAAEAQAAAAAAAAUCAAAAIAAABQQAAAAAAAAFBQAAACAAAAUHAAAAAAAABQgAAAAgAAAFCgAAAAAAAAULAAAAAAAABg0AAAAgAAEFEAAAAAAAAQUSAAAAIAABBRYAAAAAAAIFGAAAACAAAwUgAAAAAAADBSgAAAAAAAYEQAAAABAABgRAAAAAIAAHBYAAAAAAAAkGAAIAAAAACwYACAAAMAAABAAAAAAQAAAEAQAAACAAAAUCAAAAIAAABQMAAAAgAAAFBQAAACAAAAUGAAAAIAAABQgAAAAgAAAFCQAAACAAAAULAAAAIAAABQwAAAAAAAAGDwAAACAAAQUSAAAAIAABBRQAAAAgAAIFGAAAACAAAgUcAAAAIAADBSgAAAAgAAQFMAAAAAAAEAYAAAEAAAAPBgCAAAAAAA4GAEAAAAAADQYAIABBgBcLhwIBAAEBBQAAAAAAAAUAAAAAAAAGBD0AAAAAAAkF/QEAAAAADwX9fwAAAAAVBf3/HwAAAAMFBQAAAAAABwR9AAAAAAAMBf0PAAAAABIF/f8DAAAAFwX9/38AAAAFBR0AAAAAAAgE/QAAAAAADgX9PwAAAAAUBf3/DwAAAAIFAQAAABAABwR9AAAAAAALBf0HAAAAABEF/f8BAAAAFgX9/z8AAAAEBQ0AAAAQAAgE/QAAAAAADQX9HwAAAAATBf3/BwAAAAEFAQAAABAABgQ9AAAAAAAKBf0DAAAAABAF/f8AAAAAHAX9//8PAAAbBf3//wcAABoF/f//AwAAGQX9//8BAAAYBf3//wBBkBkLhgQBAAEBBgAAAAAAAAYDAAAAAAAABAQAAAAgAAAFBQAAAAAAAAUGAAAAAAAABQgAAAAAAAAFCQAAAAAAAAULAAAAAAAABg0AAAAAAAAGEAAAAAAAAAYTAAAAAAAABhYAAAAAAAAGGQAAAAAAAAYcAAAAAAAABh8AAAAAAAAGIgAAAAAAAQYlAAAAAAABBikAAAAAAAIGLwAAAAAAAwY7AAAAAAAEBlMAAAAAAAcGgwAAAAAACQYDAgAAEAAABAQAAAAAAAAEBQAAACAAAAUGAAAAAAAABQcAAAAgAAAFCQAAAAAAAAUKAAAAAAAABgwAAAAAAAAGDwAAAAAAAAYSAAAAAAAABhUAAAAAAAAGGAAAAAAAAAYbAAAAAAAABh4AAAAAAAAGIQAAAAAAAQYjAAAAAAABBicAAAAAAAIGKwAAAAAAAwYzAAAAAAAEBkMAAAAAAAUGYwAAAAAACAYDAQAAIAAABAQAAAAwAAAEBAAAABAAAAQFAAAAIAAABQcAAAAgAAAFCAAAACAAAAUKAAAAIAAABQsAAAAAAAAGDgAAAAAAAAYRAAAAAAAABhQAAAAAAAAGFwAAAAAAAAYaAAAAAAAABh0AAAAAAAAGIAAAAAAAEAYDAAEAAAAPBgOAAAAAAA4GA0AAAAAADQYDIAAAAAAMBgMQAAAAAAsGAwgAAAAACgYDBABBpB0L2QEBAAAAAwAAAAcAAAAPAAAAHwAAAD8AAAB/AAAA/wAAAP8BAAD/AwAA/wcAAP8PAAD/HwAA/z8AAP9/AAD//wAA//8BAP//AwD//wcA//8PAP//HwD//z8A//9/AP///wD///8B////A////wf///8P////H////z////9/AAAAAAEAAAACAAAABAAAAAAAAAACAAAABAAAAAgAAAAAAAAAAQAAAAIAAAABAAAABAAAAAQAAAAEAAAABAAAAAgAAAAIAAAACAAAAAcAAAAIAAAACQAAAAoAAAALAEGgIAsDwBBQ",Ov=new WeakMap;let Fv,Qv=0;class zv extends ku{constructor(e){super(e),this.transcoderPath="",this.transcoderBinary=null,this.transcoderPending=null,this.workerPool=new uv,this.workerSourceURL="",this.workerConfig=null,"undefined"!=typeof MSC_TRANSCODER&&console.warn('THREE.KTX2Loader: Please update to latest "basis_transcoder". "msc_basis_transcoder" is no longer supported in three.js r125+.')}setTranscoderPath(e){return this.transcoderPath=e,this}setWorkerLimit(e){return this.workerPool.setWorkerLimit(e),this}async detectSupportAsync(e){return this.workerConfig={astcSupported:await e.hasFeatureAsync("texture-compression-astc"),astcHDRSupported:!1,etc1Supported:await e.hasFeatureAsync("texture-compression-etc1"),etc2Supported:await e.hasFeatureAsync("texture-compression-etc2"),dxtSupported:await e.hasFeatureAsync("texture-compression-bc"),bptcSupported:await e.hasFeatureAsync("texture-compression-bptc"),pvrtcSupported:await e.hasFeatureAsync("texture-compression-pvrtc")},this}detectSupport(e){return!0===e.isWebGPURenderer?this.workerConfig={astcSupported:e.hasFeature("texture-compression-astc"),astcHDRSupported:!1,etc1Supported:e.hasFeature("texture-compression-etc1"),etc2Supported:e.hasFeature("texture-compression-etc2"),dxtSupported:e.hasFeature("texture-compression-bc"),bptcSupported:e.hasFeature("texture-compression-bptc"),pvrtcSupported:e.hasFeature("texture-compression-pvrtc")}:this.workerConfig={astcSupported:e.extensions.has("WEBGL_compressed_texture_astc"),astcHDRSupported:e.extensions.has("WEBGL_compressed_texture_astc")&&e.extensions.get("WEBGL_compressed_texture_astc").getSupportedProfiles().includes("hdr"),etc1Supported:e.extensions.has("WEBGL_compressed_texture_etc1"),etc2Supported:e.extensions.has("WEBGL_compressed_texture_etc"),dxtSupported:e.extensions.has("WEBGL_compressed_texture_s3tc"),bptcSupported:e.extensions.has("EXT_texture_compression_bptc"),pvrtcSupported:e.extensions.has("WEBGL_compressed_texture_pvrtc")||e.extensions.has("WEBKIT_WEBGL_compressed_texture_pvrtc")},this}init(){if(!this.transcoderPending){const e=new Fu(this.manager);e.setPath(this.transcoderPath),e.setWithCredentials(this.withCredentials);const t=e.loadAsync("basis_transcoder.js"),n=new Fu(this.manager);n.setPath(this.transcoderPath),n.setResponseType("arraybuffer"),n.setWithCredentials(this.withCredentials);const i=n.loadAsync("basis_transcoder.wasm");this.transcoderPending=Promise.all([t,i]).then((([e,t])=>{const n=zv.BasisWorker.toString(),i=["/* constants */","let _EngineFormat = "+JSON.stringify(zv.EngineFormat),"let _EngineType = "+JSON.stringify(zv.EngineType),"let _TranscoderFormat = "+JSON.stringify(zv.TranscoderFormat),"let _BasisFormat = "+JSON.stringify(zv.BasisFormat),"/* basis_transcoder.js */",e,"/* worker */",n.substring(n.indexOf("{")+1,n.lastIndexOf("}"))].join("\n");this.workerSourceURL=URL.createObjectURL(new Blob([i])),this.transcoderBinary=t,this.workerPool.setWorkerCreator((()=>{const e=new Worker(this.workerSourceURL),t=this.transcoderBinary.slice(0);return e.postMessage({type:"init",config:this.workerConfig,transcoderBinary:t},[t]),e}))})),Qv>0&&console.warn("THREE.KTX2Loader: Multiple active KTX2 loaders may cause performance issues. Use a single KTX2Loader instance, or call .dispose() on old instances."),Qv++}return this.transcoderPending}load(e,t,n,i){if(null===this.workerConfig)throw new Error("THREE.KTX2Loader: Missing initialization with `.detectSupport( renderer )`.");const r=new Fu(this.manager);r.setResponseType("arraybuffer"),r.setWithCredentials(this.withCredentials),r.load(e,(e=>{this.parse(e,t,i)}),n,i)}parse(e,t,n){if(null===this.workerConfig)throw new Error("THREE.KTX2Loader: Missing initialization with `.detectSupport( renderer )`.");if(Ov.has(e))return Ov.get(e).promise.then(t).catch(n);this._createTexture(e).then((e=>t?t(e):null)).catch(n)}_createTextureFrom(e,t){const{type:n,error:i,data:{faces:r,width:s,height:o,format:a,type:l,dfdFlags:c}}=e;if("error"===n)return Promise.reject(i);let h;if(6===t.faceCount)h=new Tc(r,a,l);else{const e=r[0].mipmaps;h=t.layerCount>1?new Sc(e,s,o,t.layerCount,a,l):new Ic(e,s,o,a,l)}return h.minFilter=1===r[0].mipmaps.length?$t:nn,h.magFilter=$t,h.generateMipmaps=!1,h.needsUpdate=!0,h.colorSpace=jv(t),h.premultiplyAlpha=!!(1&c),h}async _createTexture(e,t={}){const n=function(e){const t=new Uint8Array(e.buffer,e.byteOffset,Tv.length);if(t[0]!==Tv[0]||t[1]!==Tv[1]||t[2]!==Tv[2]||t[3]!==Tv[3]||t[4]!==Tv[4]||t[5]!==Tv[5]||t[6]!==Tv[6]||t[7]!==Tv[7]||t[8]!==Tv[8]||t[9]!==Tv[9]||t[10]!==Tv[10]||t[11]!==Tv[11])throw new Error("Missing KTX 2.0 identifier.");const n=new Iv,i=17*Uint32Array.BYTES_PER_ELEMENT,r=new Sv(e,Tv.length,i,!0);n.vkFormat=r._nextUint32(),n.typeSize=r._nextUint32(),n.pixelWidth=r._nextUint32(),n.pixelHeight=r._nextUint32(),n.pixelDepth=r._nextUint32(),n.layerCount=r._nextUint32(),n.faceCount=r._nextUint32();const s=r._nextUint32();n.supercompressionScheme=r._nextUint32();const o=r._nextUint32(),a=r._nextUint32(),l=r._nextUint32(),c=r._nextUint32(),h=r._nextUint64(),u=r._nextUint64(),d=new Sv(e,Tv.length+i,3*s*8,!0);for(let t=0;t<s;t++)n.levels.push({levelData:new Uint8Array(e.buffer,e.byteOffset+d._nextUint64(),d._nextUint64()),uncompressedByteLength:d._nextUint64()});const p=new Sv(e,o,a,!0),f={vendorId:p._skip(4)._nextUint16(),descriptorType:p._nextUint16(),versionNumber:p._nextUint16(),descriptorBlockSize:p._nextUint16(),colorModel:p._nextUint8(),colorPrimaries:p._nextUint8(),transferFunction:p._nextUint8(),flags:p._nextUint8(),texelBlockDimension:[p._nextUint8(),p._nextUint8(),p._nextUint8(),p._nextUint8()],bytesPlane:[p._nextUint8(),p._nextUint8(),p._nextUint8(),p._nextUint8(),p._nextUint8(),p._nextUint8(),p._nextUint8(),p._nextUint8()],samples:[]},m=(f.descriptorBlockSize/4-6)/4;for(let e=0;e<m;e++){const t={bitOffset:p._nextUint16(),bitLength:p._nextUint8(),channelType:p._nextUint8(),samplePosition:[p._nextUint8(),p._nextUint8(),p._nextUint8(),p._nextUint8()],sampleLower:-1/0,sampleUpper:1/0};64&t.channelType?(t.sampleLower=p._nextInt32(),t.sampleUpper=p._nextInt32()):(t.sampleLower=p._nextUint32(),t.sampleUpper=p._nextUint32()),f.samples[e]=t}n.dataFormatDescriptor.length=0,n.dataFormatDescriptor.push(f);const A=new Sv(e,l,c,!0);for(;A._offset<c;){const e=A._nextUint32(),t=A._scan(e),i=Bv(t);if(n.keyValue[i]=A._nextUint8Array(e-t.byteLength-1),i.match(/^ktx/i)){const e=Bv(n.keyValue[i]);n.keyValue[i]=e.substring(0,e.lastIndexOf("\0"))}A._skip(e%4?4-e%4:0)}if(u<=0)return n;const g=new Sv(e,h,u,!0),v=g._nextUint16(),y=g._nextUint16(),E=g._nextUint32(),b=g._nextUint32(),x=g._nextUint32(),C=g._nextUint32(),w=[];for(let e=0;e<s;e++)w.push({imageFlags:g._nextUint32(),rgbSliceByteOffset:g._nextUint32(),rgbSliceByteLength:g._nextUint32(),alphaSliceByteOffset:g._nextUint32(),alphaSliceByteLength:g._nextUint32()});const _=h+g._offset,M=_+E,I=M+b,S=I+x,T=new Uint8Array(e.buffer,e.byteOffset+_,E),B=new Uint8Array(e.buffer,e.byteOffset+M,b),R=new Uint8Array(e.buffer,e.byteOffset+I,x),L=new Uint8Array(e.buffer,e.byteOffset+S,C);return n.globalData={endpointCount:v,selectorCount:y,imageDescs:w,endpointsData:T,selectorsData:B,tablesData:R,extendedData:L},n}(new Uint8Array(e)),i=n.vkFormat===Mv&&167===n.dataFormatDescriptor[0].colorModel;if(0!==n.vkFormat&&(!i||this.workerConfig.astcHDRSupported))return async function(e){const{vkFormat:t}=e;if(void 0===Hv[t])throw new Error("THREE.KTX2Loader: Unsupported vkFormat.");let n;2===e.supercompressionScheme&&(Fv||(Fv=new Promise((async e=>{const t=new kv;await t.init(),e(t)}))),n=await Fv);const i=[];for(let r=0;r<e.levels.length;r++){const s=Math.max(1,e.pixelWidth>>r),o=Math.max(1,e.pixelHeight>>r),a=e.pixelDepth?Math.max(1,e.pixelDepth>>r):0,l=e.levels[r];let c,h;if(0===e.supercompressionScheme)c=l.levelData;else{if(2!==e.supercompressionScheme)throw new Error("THREE.KTX2Loader: Unsupported supercompressionScheme.");c=n.decode(l.levelData,l.uncompressedByteLength)}h=Vv[t]===un?new Float32Array(c.buffer,c.byteOffset,c.byteLength/Float32Array.BYTES_PER_ELEMENT):Vv[t]===dn?new Uint16Array(c.buffer,c.byteOffset,c.byteLength/Uint16Array.BYTES_PER_ELEMENT):c,i.push({data:h,width:s,height:o,depth:a})}let r;if(Gv.has(Hv[t]))r=0===e.pixelDepth?new yl(i[0].data,e.pixelWidth,e.pixelHeight):new is(i[0].data,e.pixelWidth,e.pixelHeight,e.pixelDepth);else{if(e.pixelDepth>0)throw new Error("THREE.KTX2Loader: Unsupported pixelDepth.");r=new Ic(i,e.pixelWidth,e.pixelHeight),r.minFilter=1===i.length?$t:nn,r.magFilter=$t}return r.mipmaps=i,r.type=Vv[t],r.format=Hv[t],r.colorSpace=jv(e),r.needsUpdate=!0,Promise.resolve(r)}(n);const r=t,s=this.init().then((()=>this.workerPool.postMessage({type:"transcode",buffer:e,taskConfig:r},[e]))).then((e=>this._createTextureFrom(e.data,n)));return Ov.set(e,{promise:s}),s}dispose(){return this.workerPool.dispose(),this.workerSourceURL&&URL.revokeObjectURL(this.workerSourceURL),Qv--,this}}zv.BasisFormat={ETC1S:0,UASTC:1,UASTC_HDR:2},zv.TranscoderFormat={ETC1:0,ETC2:1,BC1:2,BC3:3,BC4:4,BC5:5,BC7_M6_OPAQUE_ONLY:6,BC7_M5:7,PVRTC1_4_RGB:8,PVRTC1_4_RGBA:9,ASTC_4x4:10,ATC_RGB:11,ATC_RGBA_INTERPOLATED_ALPHA:12,RGBA32:13,RGB565:14,BGR565:15,RGBA4444:16,BC6H:22,RGB_HALF:24,RGBA_HALF:25},zv.EngineFormat={RGBAFormat:yn,RGBA_ASTC_4x4_Format:zn,RGB_BPTC_UNSIGNED_Format:ii,RGBA_BPTC_Format:ti,RGBA_ETC2_EAC_Format:Qn,RGBA_PVRTC_4BPPV1_Format:kn,RGBA_S3TC_DXT5_Format:Dn,RGB_ETC1_Format:On,RGB_ETC2_Format:Fn,RGB_PVRTC_4BPPV1_Format:Pn,RGBA_S3TC_DXT1_Format:Rn},zv.EngineType={UnsignedByteType:sn,HalfFloatType:dn,FloatType:un},zv.BasisWorker=function(){let e,t,n;const i=_EngineFormat,r=_EngineType,s=_TranscoderFormat,o=_BasisFormat;self.addEventListener("message",(function(i){const s=i.data;switch(s.type){case"init":e=s.config,a=s.transcoderBinary,t=new Promise((e=>{n={wasmBinary:a,onRuntimeInitialized:e},BASIS(n)})).then((()=>{n.initializeBasis(),void 0===n.KTX2File&&console.warn("THREE.KTX2Loader: Please update Basis Universal transcoder.")}));break;case"transcode":t.then((()=>{try{const{faces:t,buffers:i,width:a,height:u,hasAlpha:d,format:p,type:f,dfdFlags:m}=function(t){const i=new n.KTX2File(new Uint8Array(t));function s(){i.close(),i.delete()}if(!i.isValid())throw s(),new Error("THREE.KTX2Loader:\tInvalid or unsupported .ktx2 file");let a;if(i.isUASTC())a=o.UASTC;else if(i.isETC1S())a=o.ETC1S;else{if(!i.isHDR())throw new Error("THREE.KTX2Loader: Unknown Basis encoding");a=o.UASTC_HDR}const u=i.getWidth(),d=i.getHeight(),p=i.getLayers()||1,f=i.getLevels(),m=i.getFaces(),A=i.getHasAlpha(),g=i.getDFDFlags(),{transcoderFormat:v,engineFormat:y,engineType:E}=function(t,n,i,r){const s=l[t];for(let o=0;o<s.length;o++){const a=s[o];if((!a.if||e[a.if])&&(a.basisFormat.includes(t)&&!(r&&a.transcoderFormat.length<2)&&(!a.needsPowerOfTwo||c(n)&&c(i))))return{transcoderFormat:a.transcoderFormat[r?1:0],engineFormat:a.engineFormat[r?1:0],engineType:a.engineType[0]}}throw new Error("THREE.KTX2Loader: Failed to identify transcoding target.")}(a,u,d,A);if(!u||!d||!f)throw s(),new Error("THREE.KTX2Loader:\tInvalid texture");if(!i.startTranscoding())throw s(),new Error("THREE.KTX2Loader: .startTranscoding failed");const b=[],x=[];for(let e=0;e<m;e++){const t=[];for(let n=0;n<f;n++){const o=[];let a,l;for(let t=0;t<p;t++){const c=i.getImageLevelInfo(n,t,e);0!==e||0!==n||0!==t||c.origWidth%4==0&&c.origHeight%4==0||console.warn("THREE.KTX2Loader: ETC1S and UASTC textures should use multiple-of-four dimensions."),f>1?(a=c.origWidth,l=c.origHeight):(a=c.width,l=c.height);let h=new Uint8Array(i.getImageTranscodedSizeInBytes(n,t,0,v));const u=i.transcodeImage(h,n,t,e,v,0,-1,-1);if(E===r.HalfFloatType&&(h=new Uint16Array(h.buffer,h.byteOffset,h.byteLength/Uint16Array.BYTES_PER_ELEMENT)),!u)throw s(),new Error("THREE.KTX2Loader: .transcodeImage failed.");o.push(h)}const c=h(o);t.push({data:c,width:a,height:l}),x.push(c.buffer)}b.push({mipmaps:t,width:u,height:d,format:y,type:E})}return s(),{faces:b,buffers:x,width:u,height:d,hasAlpha:A,dfdFlags:g,format:y,type:E}}(s.buffer);self.postMessage({type:"transcode",id:s.id,data:{faces:t,width:a,height:u,hasAlpha:d,format:p,type:f,dfdFlags:m}},i)}catch(e){console.error(e),self.postMessage({type:"error",id:s.id,error:e.message})}}))}var a}));const a=[{if:"astcSupported",basisFormat:[o.UASTC],transcoderFormat:[s.ASTC_4x4,s.ASTC_4x4],engineFormat:[i.RGBA_ASTC_4x4_Format,i.RGBA_ASTC_4x4_Format],engineType:[r.UnsignedByteType],priorityETC1S:1/0,priorityUASTC:1,needsPowerOfTwo:!1},{if:"bptcSupported",basisFormat:[o.ETC1S,o.UASTC],transcoderFormat:[s.BC7_M5,s.BC7_M5],engineFormat:[i.RGBA_BPTC_Format,i.RGBA_BPTC_Format],engineType:[r.UnsignedByteType],priorityETC1S:3,priorityUASTC:2,needsPowerOfTwo:!1},{if:"dxtSupported",basisFormat:[o.ETC1S,o.UASTC],transcoderFormat:[s.BC1,s.BC3],engineFormat:[i.RGBA_S3TC_DXT1_Format,i.RGBA_S3TC_DXT5_Format],engineType:[r.UnsignedByteType],priorityETC1S:4,priorityUASTC:5,needsPowerOfTwo:!1},{if:"etc2Supported",basisFormat:[o.ETC1S,o.UASTC],transcoderFormat:[s.ETC1,s.ETC2],engineFormat:[i.RGB_ETC2_Format,i.RGBA_ETC2_EAC_Format],engineType:[r.UnsignedByteType],priorityETC1S:1,priorityUASTC:3,needsPowerOfTwo:!1},{if:"etc1Supported",basisFormat:[o.ETC1S,o.UASTC],transcoderFormat:[s.ETC1],engineFormat:[i.RGB_ETC1_Format],engineType:[r.UnsignedByteType],priorityETC1S:2,priorityUASTC:4,needsPowerOfTwo:!1},{if:"pvrtcSupported",basisFormat:[o.ETC1S,o.UASTC],transcoderFormat:[s.PVRTC1_4_RGB,s.PVRTC1_4_RGBA],engineFormat:[i.RGB_PVRTC_4BPPV1_Format,i.RGBA_PVRTC_4BPPV1_Format],engineType:[r.UnsignedByteType],priorityETC1S:5,priorityUASTC:6,needsPowerOfTwo:!0},{if:"bptcSupported",basisFormat:[o.UASTC_HDR],transcoderFormat:[s.BC6H],engineFormat:[i.RGB_BPTC_UNSIGNED_Format],engineType:[r.HalfFloatType],priorityHDR:1,needsPowerOfTwo:!1},{basisFormat:[o.ETC1S,o.UASTC],transcoderFormat:[s.RGBA32,s.RGBA32],engineFormat:[i.RGBAFormat,i.RGBAFormat],engineType:[r.UnsignedByteType,r.UnsignedByteType],priorityETC1S:100,priorityUASTC:100,needsPowerOfTwo:!1},{basisFormat:[o.UASTC_HDR],transcoderFormat:[s.RGBA_HALF],engineFormat:[i.RGBAFormat],engineType:[r.HalfFloatType],priorityHDR:100,needsPowerOfTwo:!1}],l={[o.ETC1S]:a.filter((e=>e.basisFormat.includes(o.ETC1S))).sort(((e,t)=>e.priorityUASTC-t.priorityUASTC)),[o.UASTC]:a.filter((e=>e.basisFormat.includes(o.UASTC))).sort(((e,t)=>e.priorityUASTC-t.priorityUASTC)),[o.UASTC_HDR]:a.filter((e=>e.basisFormat.includes(o.UASTC_HDR))).sort(((e,t)=>e.priorityHDR-t.priorityHDR))};function c(e){return e<=2||!(e&e-1)&&0!==e}function h(e){if(1===e.length)return e[0];let t=0;for(let n=0;n<e.length;n++)t+=e[n].byteLength;const n=new Uint8Array(t);let i=0;for(let t=0;t<e.length;t++){const r=e[t];n.set(r,i),i+=r.byteLength}return n}};const Gv=new Set([yn,Mn,wn]),Hv={[Cv]:yn,[Ev]:yn,[Av]:yn,[gv]:yn,[xv]:Mn,[yv]:Mn,[fv]:Mn,[mv]:Mn,[bv]:wn,[vv]:wn,[pv]:wn,[dv]:wn,[Mv]:zn,[_v]:jn,[wv]:jn},Vv={[Cv]:un,[Ev]:dn,[Av]:sn,[gv]:sn,[xv]:un,[yv]:dn,[fv]:sn,[mv]:sn,[bv]:un,[vv]:dn,[pv]:sn,[dv]:sn,[Mv]:dn,[_v]:sn,[wv]:sn};function jv(e){const t=e.dataFormatDescriptor[0];return 1===t.colorPrimaries?2===t.transferFunction?Ti:Bi:10===t.colorPrimaries?2===t.transferFunction?"display-p3":"display-p3-linear":(0===t.colorPrimaries||console.warn(`THREE.KTX2Loader: Unsupported color primaries, "${t.colorPrimaries}"`),Si)}const Wv={c:null,u:[new os,new os,new os],e:[]},qv={c:null,u:[new os,new os,new os],e:[]},Xv=[[],[],[]],Yv=[[],[],[]],Jv=[],Kv=new os,Zv=new os,$v=new os,ey=new os,ty=new os,ny=new os,iy=new Br,ry=new cs,sy=new ks,oy=new ks,ay=new Us;class ly{constructor(e=new os,t=new os,n=new Br){this.center=e,this.halfSize=t,this.rotation=n}set(e,t,n){return this.center=e,this.halfSize=t,this.rotation=n,this}copy(e){return this.center.copy(e.center),this.halfSize.copy(e.halfSize),this.rotation.copy(e.rotation),this}clone(){return(new this.constructor).copy(this)}getSize(e){return e.copy(this.halfSize).multiplyScalar(2)}clampPoint(e,t){const n=this.halfSize;ey.subVectors(e,this.center),this.rotation.extractBasis(Kv,Zv,$v),t.copy(this.center);const i=Sr.clamp(ey.dot(Kv),-n.x,n.x);t.add(Kv.multiplyScalar(i));const r=Sr.clamp(ey.dot(Zv),-n.y,n.y);t.add(Zv.multiplyScalar(r));const s=Sr.clamp(ey.dot($v),-n.z,n.z);return t.add($v.multiplyScalar(s)),t}containsPoint(e){return ey.subVectors(e,this.center),this.rotation.extractBasis(Kv,Zv,$v),Math.abs(ey.dot(Kv))<=this.halfSize.x&&Math.abs(ey.dot(Zv))<=this.halfSize.y&&Math.abs(ey.dot($v))<=this.halfSize.z}intersectsBox3(e){return this.intersectsOBB(cy.fromBox3(e))}intersectsSphere(e){return this.clampPoint(e.center,ny),ny.distanceToSquared(e.center)<=e.radius*e.radius}intersectsOBB(e,t=Number.EPSILON){Wv.c=this.center,Wv.e[0]=this.halfSize.x,Wv.e[1]=this.halfSize.y,Wv.e[2]=this.halfSize.z,this.rotation.extractBasis(Wv.u[0],Wv.u[1],Wv.u[2]),qv.c=e.center,qv.e[0]=e.halfSize.x,qv.e[1]=e.halfSize.y,qv.e[2]=e.halfSize.z,e.rotation.extractBasis(qv.u[0],qv.u[1],qv.u[2]);for(let e=0;e<3;e++)for(let t=0;t<3;t++)Xv[e][t]=Wv.u[e].dot(qv.u[t]);ey.subVectors(qv.c,Wv.c),Jv[0]=ey.dot(Wv.u[0]),Jv[1]=ey.dot(Wv.u[1]),Jv[2]=ey.dot(Wv.u[2]);for(let e=0;e<3;e++)for(let n=0;n<3;n++)Yv[e][n]=Math.abs(Xv[e][n])+t;let n,i;for(let e=0;e<3;e++)if(n=Wv.e[e],i=qv.e[0]*Yv[e][0]+qv.e[1]*Yv[e][1]+qv.e[2]*Yv[e][2],Math.abs(Jv[e])>n+i)return!1;for(let e=0;e<3;e++)if(n=Wv.e[0]*Yv[0][e]+Wv.e[1]*Yv[1][e]+Wv.e[2]*Yv[2][e],i=qv.e[e],Math.abs(Jv[0]*Xv[0][e]+Jv[1]*Xv[1][e]+Jv[2]*Xv[2][e])>n+i)return!1;return n=Wv.e[1]*Yv[2][0]+Wv.e[2]*Yv[1][0],i=qv.e[1]*Yv[0][2]+qv.e[2]*Yv[0][1],!(Math.abs(Jv[2]*Xv[1][0]-Jv[1]*Xv[2][0])>n+i||(n=Wv.e[1]*Yv[2][1]+Wv.e[2]*Yv[1][1],i=qv.e[0]*Yv[0][2]+qv.e[2]*Yv[0][0],Math.abs(Jv[2]*Xv[1][1]-Jv[1]*Xv[2][1])>n+i||(n=Wv.e[1]*Yv[2][2]+Wv.e[2]*Yv[1][2],i=qv.e[0]*Yv[0][1]+qv.e[1]*Yv[0][0],Math.abs(Jv[2]*Xv[1][2]-Jv[1]*Xv[2][2])>n+i||(n=Wv.e[0]*Yv[2][0]+Wv.e[2]*Yv[0][0],i=qv.e[1]*Yv[1][2]+qv.e[2]*Yv[1][1],Math.abs(Jv[0]*Xv[2][0]-Jv[2]*Xv[0][0])>n+i||(n=Wv.e[0]*Yv[2][1]+Wv.e[2]*Yv[0][1],i=qv.e[0]*Yv[1][2]+qv.e[2]*Yv[1][0],Math.abs(Jv[0]*Xv[2][1]-Jv[2]*Xv[0][1])>n+i||(n=Wv.e[0]*Yv[2][2]+Wv.e[2]*Yv[0][2],i=qv.e[0]*Yv[1][1]+qv.e[1]*Yv[1][0],Math.abs(Jv[0]*Xv[2][2]-Jv[2]*Xv[0][2])>n+i||(n=Wv.e[0]*Yv[1][0]+Wv.e[1]*Yv[0][0],i=qv.e[1]*Yv[2][2]+qv.e[2]*Yv[2][1],Math.abs(Jv[1]*Xv[0][0]-Jv[0]*Xv[1][0])>n+i||(n=Wv.e[0]*Yv[1][1]+Wv.e[1]*Yv[0][1],i=qv.e[0]*Yv[2][2]+qv.e[2]*Yv[2][0],Math.abs(Jv[1]*Xv[0][1]-Jv[0]*Xv[1][1])>n+i||(n=Wv.e[0]*Yv[1][2]+Wv.e[1]*Yv[0][2],i=qv.e[0]*Yv[2][1]+qv.e[1]*Yv[2][0],Math.abs(Jv[1]*Xv[0][2]-Jv[0]*Xv[1][2])>n+i)))))))))}intersectsPlane(e){this.rotation.extractBasis(Kv,Zv,$v);const t=this.halfSize.x*Math.abs(e.normal.dot(Kv))+this.halfSize.y*Math.abs(e.normal.dot(Zv))+this.halfSize.z*Math.abs(e.normal.dot($v)),n=e.normal.dot(this.center)-e.constant;return Math.abs(n)<=t}intersectRay(e,t){return this.getSize(ty),ry.setFromCenterAndSize(ey.set(0,0,0),ty),sy.setFromMatrix3(this.rotation),sy.setPosition(this.center),oy.copy(sy).invert(),ay.copy(e).applyMatrix4(oy),ay.intersectBox(ry,t)?t.applyMatrix4(sy):null}intersectsRay(e){return null!==this.intersectRay(e,ey)}fromBox3(e){return e.getCenter(this.center),e.getSize(this.halfSize).multiplyScalar(.5),this.rotation.identity(),this}equals(e){return e.center.equals(this.center)&&e.halfSize.equals(this.halfSize)&&e.rotation.equals(this.rotation)}applyMatrix4(e){const t=e.elements;let n=ey.set(t[0],t[1],t[2]).length();const i=ey.set(t[4],t[5],t[6]).length(),r=ey.set(t[8],t[9],t[10]).length();e.determinant()<0&&(n=-n),iy.setFromMatrix4(e);const s=1/n,o=1/i,a=1/r;return iy.elements[0]*=s,iy.elements[1]*=s,iy.elements[2]*=s,iy.elements[3]*=o,iy.elements[4]*=o,iy.elements[5]*=o,iy.elements[6]*=a,iy.elements[7]*=a,iy.elements[8]*=a,this.rotation.multiply(iy),this.halfSize.x*=n,this.halfSize.y*=i,this.halfSize.z*=r,ey.setFromMatrixPosition(e),this.center.add(ey),this}}const cy=new ly,hy=/^[og]\s*(.+)?/,uy=/^mtllib /,dy=/^usemtl /,py=/^usemap /,fy=/\s+/,my=new os,Ay=new os,gy=new os,vy=new os,yy=new os,Ey=new To;function by(){const e={objects:[],object:{},vertices:[],normals:[],colors:[],uvs:[],materials:{},materialLibraries:[],startObject:function(e,t){if(this.object&&!1===this.object.fromDeclaration)return this.object.name=e,void(this.object.fromDeclaration=!1!==t);const n=this.object&&"function"==typeof this.object.currentMaterial?this.object.currentMaterial():void 0;if(this.object&&"function"==typeof this.object._finalize&&this.object._finalize(!0),this.object={name:e||"",fromDeclaration:!1!==t,geometry:{vertices:[],normals:[],colors:[],uvs:[],hasUVIndices:!1},materials:[],smooth:!0,startMaterial:function(e,t){const n=this._finalize(!1);n&&(n.inherited||n.groupCount<=0)&&this.materials.splice(n.index,1);const i={index:this.materials.length,name:e||"",mtllib:Array.isArray(t)&&t.length>0?t[t.length-1]:"",smooth:void 0!==n?n.smooth:this.smooth,groupStart:void 0!==n?n.groupEnd:0,groupEnd:-1,groupCount:-1,inherited:!1,clone:function(e){const t={index:"number"==typeof e?e:this.index,name:this.name,mtllib:this.mtllib,smooth:this.smooth,groupStart:0,groupEnd:-1,groupCount:-1,inherited:!1};return t.clone=this.clone.bind(t),t}};return this.materials.push(i),i},currentMaterial:function(){if(this.materials.length>0)return this.materials[this.materials.length-1]},_finalize:function(e){const t=this.currentMaterial();if(t&&-1===t.groupEnd&&(t.groupEnd=this.geometry.vertices.length/3,t.groupCount=t.groupEnd-t.groupStart,t.inherited=!1),e&&this.materials.length>1)for(let e=this.materials.length-1;e>=0;e--)this.materials[e].groupCount<=0&&this.materials.splice(e,1);return e&&0===this.materials.length&&this.materials.push({name:"",smooth:this.smooth}),t}},n&&n.name&&"function"==typeof n.clone){const e=n.clone(0);e.inherited=!0,this.object.materials.push(e)}this.objects.push(this.object)},finalize:function(){this.object&&"function"==typeof this.object._finalize&&this.object._finalize(!0)},parseVertexIndex:function(e,t){const n=parseInt(e,10);return 3*(n>=0?n-1:n+t/3)},parseNormalIndex:function(e,t){const n=parseInt(e,10);return 3*(n>=0?n-1:n+t/3)},parseUVIndex:function(e,t){const n=parseInt(e,10);return 2*(n>=0?n-1:n+t/2)},addVertex:function(e,t,n){const i=this.vertices,r=this.object.geometry.vertices;r.push(i[e+0],i[e+1],i[e+2]),r.push(i[t+0],i[t+1],i[t+2]),r.push(i[n+0],i[n+1],i[n+2])},addVertexPoint:function(e){const t=this.vertices;this.object.geometry.vertices.push(t[e+0],t[e+1],t[e+2])},addVertexLine:function(e){const t=this.vertices;this.object.geometry.vertices.push(t[e+0],t[e+1],t[e+2])},addNormal:function(e,t,n){const i=this.normals,r=this.object.geometry.normals;r.push(i[e+0],i[e+1],i[e+2]),r.push(i[t+0],i[t+1],i[t+2]),r.push(i[n+0],i[n+1],i[n+2])},addFaceNormal:function(e,t,n){const i=this.vertices,r=this.object.geometry.normals;my.fromArray(i,e),Ay.fromArray(i,t),gy.fromArray(i,n),yy.subVectors(gy,Ay),vy.subVectors(my,Ay),yy.cross(vy),yy.normalize(),r.push(yy.x,yy.y,yy.z),r.push(yy.x,yy.y,yy.z),r.push(yy.x,yy.y,yy.z)},addColor:function(e,t,n){const i=this.colors,r=this.object.geometry.colors;void 0!==i[e]&&r.push(i[e+0],i[e+1],i[e+2]),void 0!==i[t]&&r.push(i[t+0],i[t+1],i[t+2]),void 0!==i[n]&&r.push(i[n+0],i[n+1],i[n+2])},addUV:function(e,t,n){const i=this.uvs,r=this.object.geometry.uvs;r.push(i[e+0],i[e+1]),r.push(i[t+0],i[t+1]),r.push(i[n+0],i[n+1])},addDefaultUV:function(){const e=this.object.geometry.uvs;e.push(0,0),e.push(0,0),e.push(0,0)},addUVLine:function(e){const t=this.uvs;this.object.geometry.uvs.push(t[e+0],t[e+1])},addFace:function(e,t,n,i,r,s,o,a,l){const c=this.vertices.length;let h=this.parseVertexIndex(e,c),u=this.parseVertexIndex(t,c),d=this.parseVertexIndex(n,c);if(this.addVertex(h,u,d),this.addColor(h,u,d),void 0!==o&&""!==o){const e=this.normals.length;h=this.parseNormalIndex(o,e),u=this.parseNormalIndex(a,e),d=this.parseNormalIndex(l,e),this.addNormal(h,u,d)}else this.addFaceNormal(h,u,d);if(void 0!==i&&""!==i){const e=this.uvs.length;h=this.parseUVIndex(i,e),u=this.parseUVIndex(r,e),d=this.parseUVIndex(s,e),this.addUV(h,u,d),this.object.geometry.hasUVIndices=!0}else this.addDefaultUV()},addPointGeometry:function(e){this.object.geometry.type="Points";const t=this.vertices.length;for(let n=0,i=e.length;n<i;n++){const i=this.parseVertexIndex(e[n],t);this.addVertexPoint(i),this.addColor(i)}},addLineGeometry:function(e,t){this.object.geometry.type="Line";const n=this.vertices.length,i=this.uvs.length;for(let t=0,i=e.length;t<i;t++)this.addVertexLine(this.parseVertexIndex(e[t],n));for(let e=0,n=t.length;e<n;e++)this.addUVLine(this.parseUVIndex(t[e],i))}};return e.startObject("",!1),e}class xy extends ku{constructor(e){super(e),this.materials=null}load(e,t,n,i){const r=this,s=new Fu(this.manager);s.setPath(this.path),s.setRequestHeader(this.requestHeader),s.setWithCredentials(this.withCredentials),s.load(e,(function(n){try{t(r.parse(n))}catch(t){i?i(t):console.error(t),r.manager.itemError(e)}}),n,i)}setMaterials(e){return this.materials=e,this}parse(e){const t=new by;-1!==e.indexOf("\r\n")&&(e=e.replace(/\r\n/g,"\n")),-1!==e.indexOf("\\\n")&&(e=e.replace(/\\\n/g,""));const n=e.split("\n");let i=[];for(let e=0,r=n.length;e<r;e++){const r=n[e].trimStart();if(0===r.length)continue;const s=r.charAt(0);if("#"!==s)if("v"===s){const e=r.split(fy);switch(e[0]){case"v":t.vertices.push(parseFloat(e[1]),parseFloat(e[2]),parseFloat(e[3])),e.length>=7?(Ey.setRGB(parseFloat(e[4]),parseFloat(e[5]),parseFloat(e[6]),Ti),t.colors.push(Ey.r,Ey.g,Ey.b)):t.colors.push(void 0,void 0,void 0);break;case"vn":t.normals.push(parseFloat(e[1]),parseFloat(e[2]),parseFloat(e[3]));break;case"vt":t.uvs.push(parseFloat(e[1]),parseFloat(e[2]))}}else if("f"===s){const e=r.slice(1).trim().split(fy),n=[];for(let t=0,i=e.length;t<i;t++){const i=e[t];if(i.length>0){const e=i.split("/");n.push(e)}}const i=n[0];for(let e=1,r=n.length-1;e<r;e++){const r=n[e],s=n[e+1];t.addFace(i[0],r[0],s[0],i[1],r[1],s[1],i[2],r[2],s[2])}}else if("l"===s){const e=r.substring(1).trim().split(" ");let n=[];const i=[];if(-1===r.indexOf("/"))n=e;else for(let t=0,r=e.length;t<r;t++){const r=e[t].split("/");""!==r[0]&&n.push(r[0]),""!==r[1]&&i.push(r[1])}t.addLineGeometry(n,i)}else if("p"===s){const e=r.slice(1).trim().split(" ");t.addPointGeometry(e)}else if(null!==(i=hy.exec(r))){const e=(" "+i[0].slice(1).trim()).slice(1);t.startObject(e)}else if(dy.test(r))t.object.startMaterial(r.substring(7).trim(),t.materialLibraries);else if(uy.test(r))t.materialLibraries.push(r.substring(7).trim());else if(py.test(r))console.warn('THREE.OBJLoader: Rendering identifier "usemap" not supported. Textures must be defined in MTL files.');else if("s"===s){if(i=r.split(" "),i.length>1){const e=i[1].trim().toLowerCase();t.object.smooth="0"!==e&&"off"!==e}else t.object.smooth=!0;const e=t.object.currentMaterial();e&&(e.smooth=t.object.smooth)}else{if("\0"===r)continue;console.warn('THREE.OBJLoader: Unexpected line: "'+r+'"')}}t.finalize();const r=new Pa;if(r.materialLibraries=[].concat(t.materialLibraries),!0==!(1===t.objects.length&&0===t.objects[0].geometry.vertices.length))for(let e=0,n=t.objects.length;e<n;e++){const n=t.objects[e],i=n.geometry,s=n.materials,o="Line"===i.type,a="Points"===i.type;let l=!1;if(0===i.vertices.length)continue;const c=new sa;c.setAttribute("position",new Ko(i.vertices,3)),i.normals.length>0&&c.setAttribute("normal",new Ko(i.normals,3)),i.colors.length>0&&(l=!0,c.setAttribute("color",new Ko(i.colors,3))),!0===i.hasUVIndices&&c.setAttribute("uv",new Ko(i.uvs,2));const h=[];for(let e=0,n=s.length;e<n;e++){const n=s[e],i=n.name+"_"+n.smooth+"_"+l;let r=t.materials[i];if(null!==this.materials)if(r=this.materials.create(n.name),!o||!r||r instanceof ic){if(a&&r&&!(r instanceof gc)){const e=new gc({size:10,sizeAttenuation:!1});Lo.prototype.copy.call(e,r),e.color.copy(r.color),e.map=r.map,r=e}}else{const e=new ic;Lo.prototype.copy.call(e,r),e.color.copy(r.color),r=e}void 0===r&&(r=o?new ic:a?new gc({size:1,sizeAttenuation:!1}):new su,r.name=n.name,r.flatShading=!n.smooth,r.vertexColors=l,t.materials[i]=r),h.push(r)}let u;if(h.length>1){for(let e=0,t=s.length;e<t;e++){const t=s[e];c.addGroup(t.groupStart,t.groupCount,e)}u=o?new mc(c,h):a?new xc(c,h):new ga(c,h)}else u=o?new mc(c,h[0]):a?new xc(c,h[0]):new ga(c,h[0]);u.name=n.name,r.add(u)}else if(t.vertices.length>0){const e=new gc({size:1,sizeAttenuation:!1}),n=new sa;n.setAttribute("position",new Ko(t.vertices,3)),t.colors.length>0&&void 0!==t.colors[0]&&(n.setAttribute("color",new Ko(t.colors,3)),e.vertexColors=!0);const i=new xc(n,e);r.add(i)}return r}}var Cy=Uint8Array,wy=Uint16Array,_y=Int32Array,My=new Cy([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]),Iy=new Cy([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]),Sy=new Cy([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),Ty=function(e,t){for(var n=new wy(31),i=0;i<31;++i)n[i]=t+=1<<e[i-1];var r=new _y(n[30]);for(i=1;i<30;++i)for(var s=n[i];s<n[i+1];++s)r[s]=s-n[i]<<5|i;return{b:n,r}},By=Ty(My,2),Ry=By.b,Ly=By.r;Ry[28]=258,Ly[258]=28;for(var Dy=Ty(Iy,0),Py=Dy.b,Uy=(Dy.r,new wy(32768)),ky=0;ky<32768;++ky){var Ny=(43690&ky)>>1|(21845&ky)<<1;Ny=(61680&(Ny=(52428&Ny)>>2|(13107&Ny)<<2))>>4|(3855&Ny)<<4,Uy[ky]=((65280&Ny)>>8|(255&Ny)<<8)>>1}var Oy=function(e,t,n){for(var i=e.length,r=0,s=new wy(t);r<i;++r)e[r]&&++s[e[r]-1];var o,a=new wy(t);for(r=1;r<t;++r)a[r]=a[r-1]+s[r-1]<<1;if(n){o=new wy(1<<t);var l=15-t;for(r=0;r<i;++r)if(e[r])for(var c=r<<4|e[r],h=t-e[r],u=a[e[r]-1]++<<h,d=u|(1<<h)-1;u<=d;++u)o[Uy[u]>>l]=c}else for(o=new wy(i),r=0;r<i;++r)e[r]&&(o[r]=Uy[a[e[r]-1]++]>>15-e[r]);return o},Fy=new Cy(288);for(ky=0;ky<144;++ky)Fy[ky]=8;for(ky=144;ky<256;++ky)Fy[ky]=9;for(ky=256;ky<280;++ky)Fy[ky]=7;for(ky=280;ky<288;++ky)Fy[ky]=8;var Qy=new Cy(32);for(ky=0;ky<32;++ky)Qy[ky]=5;var zy=Oy(Fy,9,1),Gy=Oy(Qy,5,1),Hy=function(e){for(var t=e[0],n=1;n<e.length;++n)e[n]>t&&(t=e[n]);return t},Vy=function(e,t,n){var i=t/8|0;return(e[i]|e[i+1]<<8)>>(7&t)&n},jy=function(e,t){var n=t/8|0;return(e[n]|e[n+1]<<8|e[n+2]<<16)>>(7&t)},Wy=function(e,t,n){return(null==t||t<0)&&(t=0),(null==n||n>e.length)&&(n=e.length),new Cy(e.subarray(t,n))},qy=["unexpected EOF","invalid block type","invalid length/literal","invalid distance","stream finished","no stream handler",,"no callback","invalid UTF-8 data","extra field too long","date not in range 1980-2099","filename too long","stream finishing","invalid zip data"],Xy=function(e,t,n){var i=new Error(t||qy[e]);if(i.code=e,Error.captureStackTrace&&Error.captureStackTrace(i,Xy),!n)throw i;return i},Yy=function(e,t,n,i){var r=e.length,s=i?i.length:0;if(!r||t.f&&!t.l)return n||new Cy(0);var o=!n,a=o||2!=t.i,l=t.i;o&&(n=new Cy(3*r));var c,h=function(e){var t=n.length;if(e>t){var i=new Cy(Math.max(2*t,e));i.set(n),n=i}},u=t.f||0,d=t.p||0,p=t.b||0,f=t.l,m=t.d,A=t.m,g=t.n,v=8*r;do{if(!f){u=Vy(e,d,1);var y=Vy(e,d+1,3);if(d+=3,!y){var E=e[(c=d,(R=4+((c+7)/8|0))-4)]|e[R-3]<<8,b=R+E;if(b>r){l&&Xy(0);break}a&&h(p+E),n.set(e.subarray(R,b),p),t.b=p+=E,t.p=d=8*b,t.f=u;continue}if(1==y)f=zy,m=Gy,A=9,g=5;else if(2==y){var x=Vy(e,d,31)+257,C=Vy(e,d+10,15)+4,w=x+Vy(e,d+5,31)+1;d+=14;for(var _=new Cy(w),M=new Cy(19),I=0;I<C;++I)M[Sy[I]]=Vy(e,d+3*I,7);d+=3*C;var S=Hy(M),T=(1<<S)-1,B=Oy(M,S,1);for(I=0;I<w;){var R,L=B[Vy(e,d,T)];if(d+=15&L,(R=L>>4)<16)_[I++]=R;else{var D=0,P=0;for(16==R?(P=3+Vy(e,d,3),d+=2,D=_[I-1]):17==R?(P=3+Vy(e,d,7),d+=3):18==R&&(P=11+Vy(e,d,127),d+=7);P--;)_[I++]=D}}var U=_.subarray(0,x),k=_.subarray(x);A=Hy(U),g=Hy(k),f=Oy(U,A,1),m=Oy(k,g,1)}else Xy(1);if(d>v){l&&Xy(0);break}}a&&h(p+131072);for(var N=(1<<A)-1,O=(1<<g)-1,F=d;;F=d){var Q=(D=f[jy(e,d)&N])>>4;if((d+=15&D)>v){l&&Xy(0);break}if(D||Xy(2),Q<256)n[p++]=Q;else{if(256==Q){F=d,f=null;break}var z=Q-254;if(Q>264){var G=My[I=Q-257];z=Vy(e,d,(1<<G)-1)+Ry[I],d+=G}var H=m[jy(e,d)&O],V=H>>4;if(H||Xy(3),d+=15&H,k=Py[V],V>3&&(G=Iy[V],k+=jy(e,d)&(1<<G)-1,d+=G),d>v){l&&Xy(0);break}a&&h(p+131072);var j=p+z;if(p<k){var W=s-k,q=Math.min(k,j);for(W+p<0&&Xy(3);p<q;++p)n[p]=i[W+p]}for(;p<j;++p)n[p]=n[p-k]}}t.l=f,t.p=F,t.b=p,t.f=u,f&&(u=1,t.m=A,t.d=m,t.n=g)}while(!u);return p!=n.length&&o?Wy(n,0,p):n.subarray(0,p)},Jy=new Cy(0),Ky=function(e,t){return e[t]|e[t+1]<<8},Zy=function(e,t){return(e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24)>>>0},$y=function(e,t){return Zy(e,t)+4294967296*Zy(e,t+4)};function eE(e,t){return Yy(e,{i:2},t&&t.out,t&&t.dictionary)}function tE(e,t){return Yy(e.subarray((n=e,i=t&&t.dictionary,(8!=(15&n[0])||n[0]>>4>7||(n[0]<<8|n[1])%31)&&Xy(6,"invalid zlib data"),(n[1]>>5&1)==+!i&&Xy(6,"invalid zlib data: "+(32&n[1]?"need":"unexpected")+" dictionary"),2+(n[1]>>3&4)),-4),{i:2},t&&t.out,t&&t.dictionary);var n,i}var nE="undefined"!=typeof TextDecoder&&new TextDecoder;try{nE.decode(Jy,{stream:!0})}catch(e){}function iE(e,t){if(t){for(var n="",i=0;i<e.length;i+=16384)n+=String.fromCharCode.apply(null,e.subarray(i,i+16384));return n}if(nE)return nE.decode(e);var r=function(e){for(var t="",n=0;;){var i=e[n++],r=(i>127)+(i>223)+(i>239);if(n+r>e.length)return{s:t,r:Wy(e,n-1)};r?3==r?(i=((15&i)<<18|(63&e[n++])<<12|(63&e[n++])<<6|63&e[n++])-65536,t+=String.fromCharCode(55296|i>>10,56320|1023&i)):t+=1&r?String.fromCharCode((31&i)<<6|63&e[n++]):String.fromCharCode((15&i)<<12|(63&e[n++])<<6|63&e[n++]):t+=String.fromCharCode(i)}}(e),s=r.s;return(n=r.r).length&&Xy(8),s}var rE=function(e,t){return t+30+Ky(e,t+26)+Ky(e,t+28)},sE=function(e,t,n){var i=Ky(e,t+28),r=iE(e.subarray(t+46,t+46+i),!(2048&Ky(e,t+8))),s=t+46+i,o=Zy(e,t+20),a=n&&4294967295==o?oE(e,s):[o,Zy(e,t+24),Zy(e,t+42)],l=a[0],c=a[1],h=a[2];return[Ky(e,t+10),l,c,r,s+Ky(e,t+30)+Ky(e,t+32),h]},oE=function(e,t){for(;1!=Ky(e,t);t+=4+Ky(e,t+2));return[$y(e,t+12),$y(e,t+4),$y(e,t+20)]};function aE(e,t,n){const i=n.length-e-1;if(t>=n[i])return i-1;if(t<=n[e])return e;let r=e,s=i,o=Math.floor((r+s)/2);for(;t<n[o]||t>=n[o+1];)t<n[o]?s=o:r=o,o=Math.floor((r+s)/2);return o}function lE(e,t){let n=1;for(let t=2;t<=e;++t)n*=t;let i=1;for(let e=2;e<=t;++e)i*=e;for(let n=2;n<=e-t;++n)i*=n;return n/i}"function"==typeof queueMicrotask?queueMicrotask:"function"==typeof setTimeout&&setTimeout;class cE extends Lc{constructor(e,t,n,i,r){super();const s=t?t.length-1:0,o=n?n.length:0;this.degree=e,this.knots=t,this.controlPoints=[],this.startKnot=i||0,this.endKnot=r||s;for(let e=0;e<o;++e){const t=n[e];this.controlPoints[e]=new Zr(t.x,t.y,t.z,t.w)}}getPoint(e,t=new os){const n=t,i=this.knots[this.startKnot]+e*(this.knots[this.endKnot]-this.knots[this.startKnot]),r=function(e,t,n,i){const r=aE(e,i,t),s=function(e,t,n,i){const r=[],s=[],o=[];r[0]=1;for(let a=1;a<=n;++a){s[a]=t-i[e+1-a],o[a]=i[e+a]-t;let n=0;for(let e=0;e<a;++e){const t=o[e+1],i=s[a-e],l=r[e]/(t+i);r[e]=n+t*l,n=i*l}r[a]=n}return r}(r,i,e,t),o=new Zr(0,0,0,0);for(let t=0;t<=e;++t){const i=n[r-e+t],a=s[t],l=i.w*a;o.x+=i.x*l,o.y+=i.y*l,o.z+=i.z*l,o.w+=i.w*a}return o}(this.degree,this.knots,this.controlPoints,i);return 1!==r.w&&r.divideScalar(r.w),n.set(r.x,r.y,r.z)}getTangent(e,t=new os){const n=t,i=this.knots[0]+e*(this.knots[this.knots.length-1]-this.knots[0]),r=function(e,t,n,i,r){const s=function(e,t,n,i,r){const s=r<e?r:e,o=[],a=aE(e,i,t),l=function(e,t,n,i,r){const s=[];for(let e=0;e<=n;++e)s[e]=0;const o=[];for(let e=0;e<=i;++e)o[e]=s.slice(0);const a=[];for(let e=0;e<=n;++e)a[e]=s.slice(0);a[0][0]=1;const l=s.slice(0),c=s.slice(0);for(let i=1;i<=n;++i){l[i]=t-r[e+1-i],c[i]=r[e+i]-t;let n=0;for(let e=0;e<i;++e){const t=c[e+1],r=l[i-e];a[i][e]=t+r;const s=a[e][i-1]/a[i][e];a[e][i]=n+t*s,n=r*s}a[i][i]=n}for(let e=0;e<=n;++e)o[0][e]=a[e][n];for(let e=0;e<=n;++e){let t=0,r=1;const l=[];for(let e=0;e<=n;++e)l[e]=s.slice(0);l[0][0]=1;for(let s=1;s<=i;++s){let i=0;const c=e-s,h=n-s;e>=s&&(l[r][0]=l[t][0]/a[h+1][c],i=l[r][0]*a[c][h]);const u=e-1<=h?s-1:n-e;for(let e=c>=-1?1:-c;e<=u;++e)l[r][e]=(l[t][e]-l[t][e-1])/a[h+1][c+e],i+=l[r][e]*a[c+e][h];e<=h&&(l[r][s]=-l[t][s-1]/a[h+1][e],i+=l[r][s]*a[e][h]),o[s][e]=i;const d=t;t=r,r=d}}let h=n;for(let e=1;e<=i;++e){for(let t=0;t<=n;++t)o[e][t]*=h;h*=n-e}return o}(a,i,e,s,t),c=[];for(let e=0;e<n.length;++e){const t=n[e].clone(),i=t.w;t.x*=i,t.y*=i,t.z*=i,c[e]=t}for(let t=0;t<=s;++t){const n=c[a-e].clone().multiplyScalar(l[t][0]);for(let i=1;i<=e;++i)n.add(c[a-e+i].clone().multiplyScalar(l[t][i]));o[t]=n}for(let e=s+1;e<=r+1;++e)o[e]=new Zr(0,0,0);return o}(e,t,n,i,r);return function(e){const t=e.length,n=[],i=[];for(let r=0;r<t;++r){const t=e[r];n[r]=new os(t.x,t.y,t.z),i[r]=t.w}const r=[];for(let e=0;e<t;++e){const t=n[e].clone();for(let n=1;n<=e;++n)t.sub(r[e-n].clone().multiplyScalar(lE(e,n)*i[n]));r[e]=t.divideScalar(i[0])}return r}(s)}(this.degree,this.knots,this.controlPoints,i,1);return n.copy(r[1]).normalize(),n}toJSON(){const e=super.toJSON();return e.degree=this.degree,e.knots=[...this.knots],e.controlPoints=this.controlPoints.map((e=>e.toArray())),e.startKnot=this.startKnot,e.endKnot=this.endKnot,e}fromJSON(e){return super.fromJSON(e),this.degree=e.degree,this.knots=[...e.knots],this.controlPoints=e.controlPoints.map((e=>new Zr(e[0],e[1],e[2],e[3]))),this.startKnot=e.startKnot,this.endKnot=e.endKnot,this}}let hE,uE,dE;class pE{constructor(e,t){this.textureLoader=e,this.manager=t}parse(){uE=this.parseConnections();const e=this.parseImages(),t=this.parseTextures(e),n=this.parseMaterials(t),i=this.parseDeformers(),r=(new fE).parse(i);return this.parseScene(i,r,n),dE}parseConnections(){const e=new Map;return"Connections"in hE&&hE.Connections.connections.forEach((function(t){const n=t[0],i=t[1],r=t[2];e.has(n)||e.set(n,{parents:[],children:[]});const s={ID:i,relationship:r};e.get(n).parents.push(s),e.has(i)||e.set(i,{parents:[],children:[]});const o={ID:n,relationship:r};e.get(i).children.push(o)})),e}parseImages(){const e={},t={};if("Video"in hE.Objects){const n=hE.Objects.Video;for(const i in n){const r=n[i];if(e[parseInt(i)]=r.RelativeFilename||r.Filename,"Content"in r){const e=r.Content instanceof ArrayBuffer&&r.Content.byteLength>0,s="string"==typeof r.Content&&""!==r.Content;if(e||s){const e=this.parseImage(n[i]);t[r.RelativeFilename||r.Filename]=e}}}}for(const n in e){const i=e[n];void 0!==t[i]?e[n]=t[i]:e[n]=e[n].split("\\").pop()}return e}parseImage(e){const t=e.Content,n=e.RelativeFilename||e.Filename,i=n.slice(n.lastIndexOf(".")+1).toLowerCase();let r;switch(i){case"bmp":r="image/bmp";break;case"jpg":case"jpeg":r="image/jpeg";break;case"png":r="image/png";break;case"tif":r="image/tiff";break;case"tga":null===this.manager.getHandler(".tga")&&console.warn("FBXLoader: TGA loader not found, skipping ",n),r="image/tga";break;default:return void console.warn('FBXLoader: Image type "'+i+'" is not supported.')}if("string"==typeof t)return"data:"+r+";base64,"+t;{const e=new Uint8Array(t);return window.URL.createObjectURL(new Blob([e],{type:r}))}}parseTextures(e){const t=new Map;if("Texture"in hE.Objects){const n=hE.Objects.Texture;for(const i in n){const r=this.parseTexture(n[i],e);t.set(parseInt(i),r)}}return t}parseTexture(e,t){const n=this.loadTexture(e,t);n.ID=e.id,n.name=e.attrName;const i=e.WrapModeU,r=e.WrapModeV,s=void 0!==i?i.value:0,o=void 0!==r?r.value:0;if(n.wrapS=0===s?jt:Wt,n.wrapT=0===o?jt:Wt,"Scaling"in e){const t=e.Scaling.value;n.repeat.x=t[0],n.repeat.y=t[1]}if("Translation"in e){const t=e.Translation.value;n.offset.x=t[0],n.offset.y=t[1]}return n}loadTexture(e,t){const n=new Set(["tga","tif","tiff","exr","dds","hdr","ktx2"]),i=e.FileName.split(".").pop().toLowerCase(),r=n.has(i)?this.manager.getHandler(`.${i}`):this.textureLoader;if(!r)return console.warn(`FBXLoader: ${i.toUpperCase()} loader not found, creating placeholder texture for`,e.RelativeFilename),new Kr;const s=r.path;s||r.setPath(this.textureLoader.path);const o=uE.get(e.id).children;let a;void 0!==o&&o.length>0&&void 0!==t[o[0].ID]&&(a=t[o[0].ID],0!==a.indexOf("blob:")&&0!==a.indexOf("data:")||r.setPath(void 0));const l=r.load(a);return r.setPath(s),l}parseMaterials(e){const t=new Map;if("Material"in hE.Objects){const n=hE.Objects.Material;for(const i in n){const r=this.parseMaterial(n[i],e);null!==r&&t.set(parseInt(i),r)}}return t}parseMaterial(e,t){const n=e.id,i=e.attrName;let r=e.ShadingModel;if("object"==typeof r&&(r=r.value),!uE.has(n))return null;const s=this.parseParameters(e,t,n);let o;switch(r.toLowerCase()){case"phong":o=new su;break;case"lambert":o=new lu;break;default:console.warn('THREE.FBXLoader: unknown material type "%s". Defaulting to MeshPhongMaterial.',r),o=new su}return o.setValues(s),o.name=i,o}parseParameters(e,t,n){const i={};e.BumpFactor&&(i.bumpScale=e.BumpFactor.value),e.Diffuse?i.color=Gr.toWorkingColorSpace((new To).fromArray(e.Diffuse.value),Ti):!e.DiffuseColor||"Color"!==e.DiffuseColor.type&&"ColorRGB"!==e.DiffuseColor.type||(i.color=Gr.toWorkingColorSpace((new To).fromArray(e.DiffuseColor.value),Ti)),e.DisplacementFactor&&(i.displacementScale=e.DisplacementFactor.value),e.Emissive?i.emissive=Gr.toWorkingColorSpace((new To).fromArray(e.Emissive.value),Ti):!e.EmissiveColor||"Color"!==e.EmissiveColor.type&&"ColorRGB"!==e.EmissiveColor.type||(i.emissive=Gr.toWorkingColorSpace((new To).fromArray(e.EmissiveColor.value),Ti)),e.EmissiveFactor&&(i.emissiveIntensity=parseFloat(e.EmissiveFactor.value)),i.opacity=1-(e.TransparencyFactor?parseFloat(e.TransparencyFactor.value):0),1!==i.opacity&&0!==i.opacity||(i.opacity=e.Opacity?parseFloat(e.Opacity.value):null,null===i.opacity&&(i.opacity=1-(e.TransparentColor?parseFloat(e.TransparentColor.value[0]):0))),i.opacity<1&&(i.transparent=!0),e.ReflectionFactor&&(i.reflectivity=e.ReflectionFactor.value),e.Shininess&&(i.shininess=e.Shininess.value),e.Specular?i.specular=Gr.toWorkingColorSpace((new To).fromArray(e.Specular.value),Ti):e.SpecularColor&&"Color"===e.SpecularColor.type&&(i.specular=Gr.toWorkingColorSpace((new To).fromArray(e.SpecularColor.value),Ti));const r=this;return uE.get(n).children.forEach((function(e){const n=e.relationship;switch(n){case"Bump":i.bumpMap=r.getTexture(t,e.ID);break;case"Maya|TEX_ao_map":i.aoMap=r.getTexture(t,e.ID);break;case"DiffuseColor":case"Maya|TEX_color_map":i.map=r.getTexture(t,e.ID),void 0!==i.map&&(i.map.colorSpace=Ti);break;case"DisplacementColor":i.displacementMap=r.getTexture(t,e.ID);break;case"EmissiveColor":i.emissiveMap=r.getTexture(t,e.ID),void 0!==i.emissiveMap&&(i.emissiveMap.colorSpace=Ti);break;case"NormalMap":case"Maya|TEX_normal_map":i.normalMap=r.getTexture(t,e.ID);break;case"ReflectionColor":i.envMap=r.getTexture(t,e.ID),void 0!==i.envMap&&(i.envMap.mapping=Gt,i.envMap.colorSpace=Ti);break;case"SpecularColor":i.specularMap=r.getTexture(t,e.ID),void 0!==i.specularMap&&(i.specularMap.colorSpace=Ti);break;case"TransparentColor":case"TransparencyFactor":i.alphaMap=r.getTexture(t,e.ID),i.transparent=!0;break;default:console.warn("THREE.FBXLoader: %s map is not supported in three.js, skipping texture.",n)}})),i}getTexture(e,t){return"LayeredTexture"in hE.Objects&&t in hE.Objects.LayeredTexture&&(console.warn("THREE.FBXLoader: layered textures are not supported in three.js. Discarding all but first layer."),t=uE.get(t).children[0].ID),e.get(t)}parseDeformers(){const e={},t={};if("Deformer"in hE.Objects){const n=hE.Objects.Deformer;for(const i in n){const r=n[i],s=uE.get(parseInt(i));if("Skin"===r.attrType){const t=this.parseSkeleton(s,n);t.ID=i,s.parents.length>1&&console.warn("THREE.FBXLoader: skeleton attached to more than one geometry is not supported."),t.geometryID=s.parents[0].ID,e[i]=t}else if("BlendShape"===r.attrType){const e={id:i};e.rawTargets=this.parseMorphTargets(s,n),e.id=i,s.parents.length>1&&console.warn("THREE.FBXLoader: morph target attached to more than one geometry is not supported."),t[i]=e}}}return{skeletons:e,morphTargets:t}}parseSkeleton(e,t){const n=[];return e.children.forEach((function(e){const i=t[e.ID];if("Cluster"!==i.attrType)return;const r={ID:e.ID,indices:[],weights:[],transformLink:(new ks).fromArray(i.TransformLink.a)};"Indexes"in i&&(r.indices=i.Indexes.a,r.weights=i.Weights.a),n.push(r)})),{rawBones:n,bones:[]}}parseMorphTargets(e,t){const n=[];for(let i=0;i<e.children.length;i++){const r=e.children[i],s=t[r.ID],o={name:s.attrName,initialWeight:s.DeformPercent,id:s.id,fullWeights:s.FullWeights.a};if("BlendShapeChannel"!==s.attrType)return;o.geoID=uE.get(parseInt(r.ID)).children.filter((function(e){return void 0===e.relationship}))[0].ID,n.push(o)}return n}parseScene(e,t,n){dE=new Pa;const i=this.parseModels(e.skeletons,t,n),r=hE.Objects.Model,s=this;i.forEach((function(e){const t=r[e.ID];s.setLookAtProperties(e,t),uE.get(e.ID).parents.forEach((function(t){const n=i.get(t.ID);void 0!==n&&n.add(e)})),null===e.parent&&dE.add(e)})),this.bindSkeleton(e.skeletons,t,i),this.addGlobalSceneSettings(),dE.traverse((function(e){if(e.userData.transformData){e.parent&&(e.userData.transformData.parentMatrix=e.parent.matrix,e.userData.transformData.parentMatrixWorld=e.parent.matrixWorld);const t=ME(e.userData.transformData);e.applyMatrix4(t),e.updateWorldMatrix()}}));const o=(new mE).parse();1===dE.children.length&&dE.children[0].isGroup&&(dE.children[0].animations=o,dE=dE.children[0]),dE.animations=o}parseModels(e,t,n){const i=new Map,r=hE.Objects.Model;for(const s in r){const o=parseInt(s),a=r[s],l=uE.get(o);let c=this.buildSkeleton(l,e,o,a.attrName);if(!c){switch(a.attrType){case"Camera":c=this.createCamera(l);break;case"Light":c=this.createLight(l);break;case"Mesh":c=this.createMesh(l,t,n);break;case"NurbsCurve":c=this.createCurve(l,t);break;case"LimbNode":case"Root":c=new vl;break;default:c=new Pa}c.name=a.attrName?Jd.sanitizeNodeName(a.attrName):"",c.userData.originalName=a.attrName,c.ID=o}this.getTransformData(c,a),i.set(o,c)}return i}buildSkeleton(e,t,n,i){let r=null;return e.parents.forEach((function(e){for(const s in t){const o=t[s];o.rawBones.forEach((function(t,s){if(t.ID===e.ID){const e=r;r=new vl,r.matrixWorld.copy(t.transformLink),r.name=i?Jd.sanitizeNodeName(i):"",r.userData.originalName=i,r.ID=n,o.bones[s]=r,null!==e&&r.add(e)}}))}})),r}createCamera(e){let t,n;if(e.children.forEach((function(e){const t=hE.Objects.NodeAttribute[e.ID];void 0!==t&&(n=t)})),void 0===n)t=new co;else{let e=0;void 0!==n.CameraProjectionType&&1===n.CameraProjectionType.value&&(e=1);let i=1;void 0!==n.NearPlane&&(i=n.NearPlane.value/1e3);let r=1e3;void 0!==n.FarPlane&&(r=n.FarPlane.value/1e3);let s=window.innerWidth,o=window.innerHeight;void 0!==n.AspectWidth&&void 0!==n.AspectHeight&&(s=n.AspectWidth.value,o=n.AspectHeight.value);const a=s/o;let l=45;void 0!==n.FieldOfView&&(l=n.FieldOfView.value);const c=n.FocalLength?n.FocalLength.value:null;switch(e){case 0:t=new Ta(l,a,i,r),null!==c&&t.setFocalLength(c);break;case 1:console.warn("THREE.FBXLoader: Orthographic cameras not supported yet."),t=new co;break;default:console.warn("THREE.FBXLoader: Unknown camera type "+e+"."),t=new co}}return t}createLight(e){let t,n;if(e.children.forEach((function(e){const t=hE.Objects.NodeAttribute[e.ID];void 0!==t&&(n=t)})),void 0===n)t=new co;else{let e;e=void 0===n.LightType?0:n.LightType.value;let i=16777215;void 0!==n.Color&&(i=Gr.toWorkingColorSpace((new To).fromArray(n.Color.value),Ti));let r=void 0===n.Intensity?1:n.Intensity.value/100;void 0!==n.CastLightOnObject&&0===n.CastLightOnObject.value&&(r=0);let s=0;void 0!==n.FarAttenuationEnd&&(s=void 0!==n.EnableFarAttenuation&&0===n.EnableFarAttenuation.value?0:n.FarAttenuationEnd.value);const o=1;switch(e){case 0:t=new rd(i,r,s,o);break;case 1:t=new ad(i,r);break;case 2:let e=Math.PI/3;void 0!==n.InnerAngle&&(e=Sr.degToRad(n.InnerAngle.value));let a=0;void 0!==n.OuterAngle&&(a=Sr.degToRad(n.OuterAngle.value),a=Math.max(a,1)),t=new $u(i,r,s,e,a,o);break;default:console.warn("THREE.FBXLoader: Unknown light type "+n.LightType.value+", defaulting to a PointLight."),t=new rd(i,r)}void 0!==n.CastShadows&&1===n.CastShadows.value&&(t.castShadow=!0)}return t}createMesh(e,t,n){let i,r=null,s=null;const o=[];return e.children.forEach((function(e){t.has(e.ID)&&(r=t.get(e.ID)),n.has(e.ID)&&o.push(n.get(e.ID))})),o.length>1?s=o:o.length>0?s=o[0]:(s=new su({name:ku.DEFAULT_MATERIAL_NAME,color:13421772}),o.push(s)),"color"in r.attributes&&o.forEach((function(e){e.vertexColors=!0})),r.FBX_Deformer?(i=new gl(r,s),i.normalizeSkinWeights()):i=new ga(r,s),i}createCurve(e,t){const n=e.children.reduce((function(e,n){return t.has(n.ID)&&(e=t.get(n.ID)),e}),null),i=new ic({name:ku.DEFAULT_MATERIAL_NAME,color:3342591,linewidth:1});return new uc(n,i)}getTransformData(e,t){const n={};"InheritType"in t&&(n.inheritType=parseInt(t.InheritType.value)),n.eulerOrder=IE("RotationOrder"in t?t.RotationOrder.value:0),"Lcl_Translation"in t&&(n.translation=t.Lcl_Translation.value),"PreRotation"in t&&(n.preRotation=t.PreRotation.value),"Lcl_Rotation"in t&&(n.rotation=t.Lcl_Rotation.value),"PostRotation"in t&&(n.postRotation=t.PostRotation.value),"Lcl_Scaling"in t&&(n.scale=t.Lcl_Scaling.value),"ScalingOffset"in t&&(n.scalingOffset=t.ScalingOffset.value),"ScalingPivot"in t&&(n.scalingPivot=t.ScalingPivot.value),"RotationOffset"in t&&(n.rotationOffset=t.RotationOffset.value),"RotationPivot"in t&&(n.rotationPivot=t.RotationPivot.value),e.userData.transformData=n}setLookAtProperties(e,t){"LookAtProperty"in t&&uE.get(e.ID).children.forEach((function(t){if("LookAtProperty"===t.relationship){const n=hE.Objects.Model[t.ID];if("Lcl_Translation"in n){const t=n.Lcl_Translation.value;void 0!==e.target?(e.target.position.fromArray(t),dE.add(e.target)):e.lookAt((new os).fromArray(t))}}}))}bindSkeleton(e,t,n){const i=this.parsePoseNodes();for(const r in e){const s=e[r];uE.get(parseInt(s.ID)).parents.forEach((function(e){if(t.has(e.ID)){const t=e.ID;uE.get(t).parents.forEach((function(e){n.has(e.ID)&&n.get(e.ID).bind(new xl(s.bones),i[e.ID])}))}}))}}parsePoseNodes(){const e={};if("Pose"in hE.Objects){const t=hE.Objects.Pose;for(const n in t)if("BindPose"===t[n].attrType&&t[n].NbPoseNodes>0){const i=t[n].PoseNode;Array.isArray(i)?i.forEach((function(t){e[t.Node]=(new ks).fromArray(t.Matrix.a)})):e[i.Node]=(new ks).fromArray(i.Matrix.a)}}return e}addGlobalSceneSettings(){if("GlobalSettings"in hE){if("AmbientColor"in hE.GlobalSettings){const e=hE.GlobalSettings.AmbientColor.value,t=e[0],n=e[1],i=e[2];if(0!==t||0!==n||0!==i){const e=(new To).setRGB(t,n,i,Ti);dE.add(new ld(e,1))}}"UnitScaleFactor"in hE.GlobalSettings&&(dE.userData.unitScaleFactor=hE.GlobalSettings.UnitScaleFactor.value)}}}class fE{constructor(){this.negativeMaterialIndices=!1}parse(e){const t=new Map;if("Geometry"in hE.Objects){const n=hE.Objects.Geometry;for(const i in n){const r=uE.get(parseInt(i)),s=this.parseGeometry(r,n[i],e);t.set(parseInt(i),s)}}return!0===this.negativeMaterialIndices&&console.warn("THREE.FBXLoader: The FBX file contains invalid (negative) material indices. The asset might not render as expected."),t}parseGeometry(e,t,n){switch(t.attrType){case"Mesh":return this.parseMeshGeometry(e,t,n);case"NurbsCurve":return this.parseNurbsGeometry(t)}}parseMeshGeometry(e,t,n){const i=n.skeletons,r=[],s=e.parents.map((function(e){return hE.Objects.Model[e.ID]}));if(0===s.length)return;const o=e.children.reduce((function(e,t){return void 0!==i[t.ID]&&(e=i[t.ID]),e}),null);e.children.forEach((function(e){void 0!==n.morphTargets[e.ID]&&r.push(n.morphTargets[e.ID])}));const a=s[0],l={};"RotationOrder"in a&&(l.eulerOrder=IE(a.RotationOrder.value)),"InheritType"in a&&(l.inheritType=parseInt(a.InheritType.value)),"GeometricTranslation"in a&&(l.translation=a.GeometricTranslation.value),"GeometricRotation"in a&&(l.rotation=a.GeometricRotation.value),"GeometricScaling"in a&&(l.scale=a.GeometricScaling.value);const c=ME(l);return this.genGeometry(t,o,r,c)}genGeometry(e,t,n,i){const r=new sa;e.attrName&&(r.name=e.attrName);const s=this.parseGeoNode(e,t),o=this.genBuffers(s),a=new Ko(o.vertex,3);if(a.applyMatrix4(i),r.setAttribute("position",a),o.colors.length>0&&r.setAttribute("color",new Ko(o.colors,3)),t&&(r.setAttribute("skinIndex",new qo(o.weightsIndices,4)),r.setAttribute("skinWeight",new Ko(o.vertexWeights,4)),r.FBX_Deformer=t),o.normal.length>0){const e=(new Br).getNormalMatrix(i),t=new Ko(o.normal,3);t.applyNormalMatrix(e),r.setAttribute("normal",t)}if(o.uvs.forEach((function(e,t){const n=0===t?"uv":`uv${t}`;r.setAttribute(n,new Ko(o.uvs[t],2))})),s.material&&"AllSame"!==s.material.mappingType){let e=o.materialIndex[0],t=0;if(o.materialIndex.forEach((function(n,i){n!==e&&(r.addGroup(t,i-t,e),e=n,t=i)})),r.groups.length>0){const t=r.groups[r.groups.length-1],n=t.start+t.count;n!==o.materialIndex.length&&r.addGroup(n,o.materialIndex.length-n,e)}0===r.groups.length&&r.addGroup(0,o.materialIndex.length,o.materialIndex[0])}return this.addMorphTargets(r,e,n,i),r}parseGeoNode(e,t){const n={};if(n.vertexPositions=void 0!==e.Vertices?e.Vertices.a:[],n.vertexIndices=void 0!==e.PolygonVertexIndex?e.PolygonVertexIndex.a:[],e.LayerElementColor&&(n.color=this.parseVertexColors(e.LayerElementColor[0])),e.LayerElementMaterial&&(n.material=this.parseMaterialIndices(e.LayerElementMaterial[0])),e.LayerElementNormal&&(n.normal=this.parseNormals(e.LayerElementNormal[0])),e.LayerElementUV){n.uv=[];let t=0;for(;e.LayerElementUV[t];)e.LayerElementUV[t].UV&&n.uv.push(this.parseUVs(e.LayerElementUV[t])),t++}return n.weightTable={},null!==t&&(n.skeleton=t,t.rawBones.forEach((function(e,t){e.indices.forEach((function(i,r){void 0===n.weightTable[i]&&(n.weightTable[i]=[]),n.weightTable[i].push({id:t,weight:e.weights[r]})}))}))),n}genBuffers(e){const t={vertex:[],normal:[],colors:[],uvs:[],materialIndex:[],vertexWeights:[],weightsIndices:[]};let n=0,i=0,r=!1,s=[],o=[],a=[],l=[],c=[],h=[];const u=this;return e.vertexIndices.forEach((function(d,p){let f,m=!1;d<0&&(d=~d,m=!0);let A=[],g=[];if(s.push(3*d,3*d+1,3*d+2),e.color){const t=CE(p,n,d,e.color);a.push(t[0],t[1],t[2])}if(e.skeleton){if(void 0!==e.weightTable[d]&&e.weightTable[d].forEach((function(e){g.push(e.weight),A.push(e.id)})),g.length>4){r||(console.warn("THREE.FBXLoader: Vertex has more than 4 skinning weights assigned to vertex. Deleting additional weights."),r=!0);const e=[0,0,0,0],t=[0,0,0,0];g.forEach((function(n,i){let r=n,s=A[i];t.forEach((function(t,n,i){if(r>t){i[n]=r,r=t;const o=e[n];e[n]=s,s=o}}))})),A=e,g=t}for(;g.length<4;)g.push(0),A.push(0);for(let e=0;e<4;++e)c.push(g[e]),h.push(A[e])}if(e.normal){const t=CE(p,n,d,e.normal);o.push(t[0],t[1],t[2])}e.material&&"AllSame"!==e.material.mappingType&&(f=CE(p,n,d,e.material)[0],f<0&&(u.negativeMaterialIndices=!0,f=0)),e.uv&&e.uv.forEach((function(e,t){const i=CE(p,n,d,e);void 0===l[t]&&(l[t]=[]),l[t].push(i[0]),l[t].push(i[1])})),i++,m&&(u.genFace(t,e,s,f,o,a,l,c,h,i),n++,i=0,s=[],o=[],a=[],l=[],c=[],h=[])})),t}getNormalNewell(e){const t=new os(0,0,0);for(let n=0;n<e.length;n++){const i=e[n],r=e[(n+1)%e.length];t.x+=(i.y-r.y)*(i.z+r.z),t.y+=(i.z-r.z)*(i.x+r.x),t.z+=(i.x-r.x)*(i.y+r.y)}return t.normalize(),t}getNormalTangentAndBitangent(e){const t=this.getNormalNewell(e),n=(Math.abs(t.z)>.5?new os(0,1,0):new os(0,0,1)).cross(t).normalize(),i=t.clone().cross(n).normalize();return{normal:t,tangent:n,bitangent:i}}flattenVertex(e,t,n){return new Tr(e.dot(t),e.dot(n))}genFace(e,t,n,i,r,s,o,a,l,c){let h;if(c>3){const e=[],i=t.baseVertexPositions||t.vertexPositions;for(let t=0;t<n.length;t+=3)e.push(new os(i[n[t]],i[n[t+1]],i[n[t+2]]));const{tangent:r,bitangent:s}=this.getNormalTangentAndBitangent(e),o=[];for(const t of e)o.push(this.flattenVertex(t,r,s));h=Nh.triangulateShape(o,[])}else h=[[0,1,2]];for(const[c,u,d]of h)e.vertex.push(t.vertexPositions[n[3*c]]),e.vertex.push(t.vertexPositions[n[3*c+1]]),e.vertex.push(t.vertexPositions[n[3*c+2]]),e.vertex.push(t.vertexPositions[n[3*u]]),e.vertex.push(t.vertexPositions[n[3*u+1]]),e.vertex.push(t.vertexPositions[n[3*u+2]]),e.vertex.push(t.vertexPositions[n[3*d]]),e.vertex.push(t.vertexPositions[n[3*d+1]]),e.vertex.push(t.vertexPositions[n[3*d+2]]),t.skeleton&&(e.vertexWeights.push(a[4*c]),e.vertexWeights.push(a[4*c+1]),e.vertexWeights.push(a[4*c+2]),e.vertexWeights.push(a[4*c+3]),e.vertexWeights.push(a[4*u]),e.vertexWeights.push(a[4*u+1]),e.vertexWeights.push(a[4*u+2]),e.vertexWeights.push(a[4*u+3]),e.vertexWeights.push(a[4*d]),e.vertexWeights.push(a[4*d+1]),e.vertexWeights.push(a[4*d+2]),e.vertexWeights.push(a[4*d+3]),e.weightsIndices.push(l[4*c]),e.weightsIndices.push(l[4*c+1]),e.weightsIndices.push(l[4*c+2]),e.weightsIndices.push(l[4*c+3]),e.weightsIndices.push(l[4*u]),e.weightsIndices.push(l[4*u+1]),e.weightsIndices.push(l[4*u+2]),e.weightsIndices.push(l[4*u+3]),e.weightsIndices.push(l[4*d]),e.weightsIndices.push(l[4*d+1]),e.weightsIndices.push(l[4*d+2]),e.weightsIndices.push(l[4*d+3])),t.color&&(e.colors.push(s[3*c]),e.colors.push(s[3*c+1]),e.colors.push(s[3*c+2]),e.colors.push(s[3*u]),e.colors.push(s[3*u+1]),e.colors.push(s[3*u+2]),e.colors.push(s[3*d]),e.colors.push(s[3*d+1]),e.colors.push(s[3*d+2])),t.material&&"AllSame"!==t.material.mappingType&&(e.materialIndex.push(i),e.materialIndex.push(i),e.materialIndex.push(i)),t.normal&&(e.normal.push(r[3*c]),e.normal.push(r[3*c+1]),e.normal.push(r[3*c+2]),e.normal.push(r[3*u]),e.normal.push(r[3*u+1]),e.normal.push(r[3*u+2]),e.normal.push(r[3*d]),e.normal.push(r[3*d+1]),e.normal.push(r[3*d+2])),t.uv&&t.uv.forEach((function(t,n){void 0===e.uvs[n]&&(e.uvs[n]=[]),e.uvs[n].push(o[n][2*c]),e.uvs[n].push(o[n][2*c+1]),e.uvs[n].push(o[n][2*u]),e.uvs[n].push(o[n][2*u+1]),e.uvs[n].push(o[n][2*d]),e.uvs[n].push(o[n][2*d+1])}))}addMorphTargets(e,t,n,i){if(0===n.length)return;e.morphTargetsRelative=!0,e.morphAttributes.position=[];const r=this;n.forEach((function(n){n.rawTargets.forEach((function(n){const s=hE.Objects.Geometry[n.geoID];void 0!==s&&r.genMorphGeometry(e,t,s,i,n.name)}))}))}genMorphGeometry(e,t,n,i,r){const s=void 0!==t.Vertices?t.Vertices.a:[],o=void 0!==t.PolygonVertexIndex?t.PolygonVertexIndex.a:[],a=void 0!==n.Vertices?n.Vertices.a:[],l=void 0!==n.Indexes?n.Indexes.a:[],c=3*e.attributes.position.count,h=new Float32Array(c);for(let e=0;e<l.length;e++){const t=3*l[e];h[t]=a[3*e],h[t+1]=a[3*e+1],h[t+2]=a[3*e+2]}const u={vertexIndices:o,vertexPositions:h,baseVertexPositions:s},d=this.genBuffers(u),p=new Ko(d.vertex,3);p.name=r||n.attrName,p.applyMatrix4(i),e.morphAttributes.position.push(p)}parseNormals(e){const t=e.MappingInformationType,n=e.ReferenceInformationType,i=e.Normals.a;let r=[];return"IndexToDirect"===n&&("NormalIndex"in e?r=e.NormalIndex.a:"NormalsIndex"in e&&(r=e.NormalsIndex.a)),{dataSize:3,buffer:i,indices:r,mappingType:t,referenceType:n}}parseUVs(e){const t=e.MappingInformationType,n=e.ReferenceInformationType,i=e.UV.a;let r=[];return"IndexToDirect"===n&&(r=e.UVIndex.a),{dataSize:2,buffer:i,indices:r,mappingType:t,referenceType:n}}parseVertexColors(e){const t=e.MappingInformationType,n=e.ReferenceInformationType,i=e.Colors.a;let r=[];"IndexToDirect"===n&&(r=e.ColorIndex.a);for(let e=0,t=new To;e<i.length;e+=4)t.fromArray(i,e),Gr.toWorkingColorSpace(t,Ti),t.toArray(i,e);return{dataSize:4,buffer:i,indices:r,mappingType:t,referenceType:n}}parseMaterialIndices(e){const t=e.MappingInformationType,n=e.ReferenceInformationType;if("NoMappingInformation"===t)return{dataSize:1,buffer:[0],indices:[0],mappingType:"AllSame",referenceType:n};const i=e.Materials.a,r=[];for(let e=0;e<i.length;++e)r.push(e);return{dataSize:1,buffer:i,indices:r,mappingType:t,referenceType:n}}parseNurbsGeometry(e){const t=parseInt(e.Order);if(isNaN(t))return console.error("THREE.FBXLoader: Invalid Order %s given for geometry ID: %s",e.Order,e.id),new sa;const n=t-1,i=e.KnotVector.a,r=[],s=e.Points.a;for(let e=0,t=s.length;e<t;e+=4)r.push((new Zr).fromArray(s,e));let o,a;if("Closed"===e.Form)r.push(r[0]);else if("Periodic"===e.Form){o=n,a=i.length-1-o;for(let e=0;e<n;++e)r.push(r[e])}const l=new cE(n,i,r,o,a).getPoints(12*r.length);return(new sa).setFromPoints(l)}}class mE{parse(){const e=[],t=this.parseClips();if(void 0!==t)for(const n in t){const i=t[n],r=this.addClip(i);e.push(r)}return e}parseClips(){if(void 0===hE.Objects.AnimationCurve)return;const e=this.parseAnimationCurveNodes();this.parseAnimationCurves(e);const t=this.parseAnimationLayers(e);return this.parseAnimStacks(t)}parseAnimationCurveNodes(){const e=hE.Objects.AnimationCurveNode,t=new Map;for(const n in e){const i=e[n];if(null!==i.attrName.match(/S|R|T|DeformPercent/)){const e={id:i.id,attr:i.attrName,curves:{}};t.set(e.id,e)}}return t}parseAnimationCurves(e){const t=hE.Objects.AnimationCurve;for(const n in t){const i={id:t[n].id,times:t[n].KeyTime.a.map(bE),values:t[n].KeyValueFloat.a},r=uE.get(i.id);if(void 0!==r){const t=r.parents[0].ID,n=r.parents[0].relationship;n.match(/X/)?e.get(t).curves.x=i:n.match(/Y/)?e.get(t).curves.y=i:n.match(/Z/)?e.get(t).curves.z=i:n.match(/DeformPercent/)&&e.has(t)&&(e.get(t).curves.morph=i)}}}parseAnimationLayers(e){const t=hE.Objects.AnimationLayer,n=new Map;for(const i in t){const t=[],r=uE.get(parseInt(i));void 0!==r&&(r.children.forEach((function(n,i){if(e.has(n.ID)){const r=e.get(n.ID);if(void 0!==r.curves.x||void 0!==r.curves.y||void 0!==r.curves.z){if(void 0===t[i]){const e=uE.get(n.ID).parents.filter((function(e){return void 0!==e.relationship}))[0].ID;if(void 0!==e){const r=hE.Objects.Model[e.toString()];if(void 0===r)return void console.warn("THREE.FBXLoader: Encountered a unused curve.",n);const s={modelName:r.attrName?Jd.sanitizeNodeName(r.attrName):"",ID:r.id,initialPosition:[0,0,0],initialRotation:[0,0,0],initialScale:[1,1,1]};dE.traverse((function(e){e.ID===r.id&&(s.transform=e.matrix,e.userData.transformData&&(s.eulerOrder=e.userData.transformData.eulerOrder))})),s.transform||(s.transform=new ks),"PreRotation"in r&&(s.preRotation=r.PreRotation.value),"PostRotation"in r&&(s.postRotation=r.PostRotation.value),t[i]=s}}t[i]&&(t[i][r.attr]=r)}else if(void 0!==r.curves.morph){if(void 0===t[i]){const e=uE.get(n.ID).parents.filter((function(e){return void 0!==e.relationship}))[0].ID,r=uE.get(e).parents[0].ID,s=uE.get(r).parents[0].ID,o=uE.get(s).parents[0].ID,a=hE.Objects.Model[o],l={modelName:a.attrName?Jd.sanitizeNodeName(a.attrName):"",morphName:hE.Objects.Deformer[e].attrName};t[i]=l}t[i][r.attr]=r}}})),n.set(parseInt(i),t))}return n}parseAnimStacks(e){const t=hE.Objects.AnimationStack,n={};for(const i in t){const r=uE.get(parseInt(i)).children;r.length>1&&console.warn("THREE.FBXLoader: Encountered an animation stack with multiple layers, this is currently not supported. Ignoring subsequent layers.");const s=e.get(r[0].ID);n[i]={name:t[i].attrName,layer:s}}return n}addClip(e){let t=[];const n=this;return e.layer.forEach((function(e){t=t.concat(n.generateTracks(e))})),new Ru(e.name,-1,t)}generateTracks(e){const t=[];let n=new os,i=new os;if(e.transform&&e.transform.decompose(n,new ss,i),n=n.toArray(),i=i.toArray(),void 0!==e.T&&Object.keys(e.T.curves).length>0){const i=this.generateVectorTrack(e.modelName,e.T.curves,n,"position");void 0!==i&&t.push(i)}if(void 0!==e.R&&Object.keys(e.R.curves).length>0){const n=this.generateRotationTrack(e.modelName,e.R.curves,e.preRotation,e.postRotation,e.eulerOrder);void 0!==n&&t.push(n)}if(void 0!==e.S&&Object.keys(e.S.curves).length>0){const n=this.generateVectorTrack(e.modelName,e.S.curves,i,"scale");void 0!==n&&t.push(n)}if(void 0!==e.DeformPercent){const n=this.generateMorphTrack(e);void 0!==n&&t.push(n)}return t}generateVectorTrack(e,t,n,i){const r=this.getTimesForAllAxes(t),s=this.getKeyframeTrackValues(r,t,n);return new Bu(e+"."+i,r,s)}generateRotationTrack(e,t,n,i,r){let s,o;if(void 0!==t.x&&void 0!==t.y&&void 0!==t.z){const e=this.interpolateRotations(t.x,t.y,t.z,r);s=e[0],o=e[1]}const a=IE(0);void 0!==n&&((n=n.map(Sr.degToRad)).push(a),n=(new Ws).fromArray(n),n=(new ss).setFromEuler(n)),void 0!==i&&((i=i.map(Sr.degToRad)).push(a),i=(new Ws).fromArray(i),i=(new ss).setFromEuler(i).invert());const l=new ss,c=new Ws,h=[];if(!o||!s)return new Su(e+".quaternion",[0],[0]);for(let e=0;e<o.length;e+=3)c.set(o[e],o[e+1],o[e+2],r),l.setFromEuler(c),void 0!==n&&l.premultiply(n),void 0!==i&&l.multiply(i),e>2&&(new ss).fromArray(h,(e-3)/3*4).dot(l)<0&&l.set(-l.x,-l.y,-l.z,-l.w),l.toArray(h,e/3*4);return new Su(e+".quaternion",s,h)}generateMorphTrack(e){const t=e.DeformPercent.curves.morph,n=t.values.map((function(e){return e/100})),i=dE.getObjectByName(e.modelName).morphTargetDictionary[e.morphName];return new Mu(e.modelName+".morphTargetInfluences["+i+"]",t.times,n)}getTimesForAllAxes(e){let t=[];if(void 0!==e.x&&(t=t.concat(e.x.times)),void 0!==e.y&&(t=t.concat(e.y.times)),void 0!==e.z&&(t=t.concat(e.z.times)),t=t.sort((function(e,t){return e-t})),t.length>1){let e=1,n=t[0];for(let i=1;i<t.length;i++){const r=t[i];r!==n&&(t[e]=r,n=r,e++)}t=t.slice(0,e)}return t}getKeyframeTrackValues(e,t,n){const i=n,r=[];let s=-1,o=-1,a=-1;return e.forEach((function(e){if(t.x&&(s=t.x.times.indexOf(e)),t.y&&(o=t.y.times.indexOf(e)),t.z&&(a=t.z.times.indexOf(e)),-1!==s){const e=t.x.values[s];r.push(e),i[0]=e}else r.push(i[0]);if(-1!==o){const e=t.y.values[o];r.push(e),i[1]=e}else r.push(i[1]);if(-1!==a){const e=t.z.values[a];r.push(e),i[2]=e}else r.push(i[2])})),r}interpolateRotations(e,t,n,i){const r=[],s=[];r.push(e.times[0]),s.push(Sr.degToRad(e.values[0])),s.push(Sr.degToRad(t.values[0])),s.push(Sr.degToRad(n.values[0]));for(let o=1;o<e.values.length;o++){const a=[e.values[o-1],t.values[o-1],n.values[o-1]];if(isNaN(a[0])||isNaN(a[1])||isNaN(a[2]))continue;const l=a.map(Sr.degToRad),c=[e.values[o],t.values[o],n.values[o]];if(isNaN(c[0])||isNaN(c[1])||isNaN(c[2]))continue;const h=c.map(Sr.degToRad),u=[c[0]-a[0],c[1]-a[1],c[2]-a[2]],d=[Math.abs(u[0]),Math.abs(u[1]),Math.abs(u[2])];if(d[0]>=180||d[1]>=180||d[2]>=180){const t=Math.max(...d)/180,n=new Ws(...l,i),a=new Ws(...h,i),c=(new ss).setFromEuler(n),u=(new ss).setFromEuler(a);c.dot(u)&&u.set(-u.x,-u.y,-u.z,-u.w);const p=e.times[o-1],f=e.times[o]-p,m=new ss,A=new Ws;for(let e=0;e<1;e+=1/t)m.copy(c.clone().slerp(u.clone(),e)),r.push(p+e*f),A.setFromQuaternion(m,i),s.push(A.x),s.push(A.y),s.push(A.z)}else r.push(e.times[o]),s.push(Sr.degToRad(e.values[o])),s.push(Sr.degToRad(t.values[o])),s.push(Sr.degToRad(n.values[o]))}return[r,s]}}class AE{getPrevNode(){return this.nodeStack[this.currentIndent-2]}getCurrentNode(){return this.nodeStack[this.currentIndent-1]}getCurrentProp(){return this.currentProp}pushStack(e){this.nodeStack.push(e),this.currentIndent+=1}popStack(){this.nodeStack.pop(),this.currentIndent-=1}setCurrentProp(e,t){this.currentProp=e,this.currentPropName=t}parse(e){this.currentIndent=0,this.allNodes=new yE,this.nodeStack=[],this.currentProp=[],this.currentPropName="";const t=this,n=e.split(/[\r\n]+/);return n.forEach((function(e,i){const r=e.match(/^[\s\t]*;/),s=e.match(/^[\s\t]*$/);if(r||s)return;const o=e.match("^\\t{"+t.currentIndent+"}(\\w+):(.*){",""),a=e.match("^\\t{"+t.currentIndent+"}(\\w+):[\\s\\t\\r\\n](.*)"),l=e.match("^\\t{"+(t.currentIndent-1)+"}}");o?t.parseNodeBegin(e,o):a?t.parseNodeProperty(e,a,n[++i]):l?t.popStack():e.match(/^[^\s\t}]/)&&t.parseNodePropertyContinued(e)})),this.allNodes}parseNodeBegin(e,t){const n=t[1].trim().replace(/^"/,"").replace(/"$/,""),i=t[2].split(",").map((function(e){return e.trim().replace(/^"/,"").replace(/"$/,"")})),r={name:n},s=this.parseNodeAttr(i),o=this.getCurrentNode();0===this.currentIndent?this.allNodes.add(n,r):n in o?("PoseNode"===n?o.PoseNode.push(r):void 0!==o[n].id&&(o[n]={},o[n][o[n].id]=o[n]),""!==s.id&&(o[n][s.id]=r)):"number"==typeof s.id?(o[n]={},o[n][s.id]=r):"Properties70"!==n&&(o[n]="PoseNode"===n?[r]:r),"number"==typeof s.id&&(r.id=s.id),""!==s.name&&(r.attrName=s.name),""!==s.type&&(r.attrType=s.type),this.pushStack(r)}parseNodeAttr(e){let t=e[0];""!==e[0]&&(t=parseInt(e[0]),isNaN(t)&&(t=e[0]));let n="",i="";return e.length>1&&(n=e[1].replace(/^(\w+)::/,""),i=e[2]),{id:t,name:n,type:i}}parseNodeProperty(e,t,n){let i=t[1].replace(/^"/,"").replace(/"$/,"").trim(),r=t[2].replace(/^"/,"").replace(/"$/,"").trim();"Content"===i&&","===r&&(r=n.replace(/"/g,"").replace(/,$/,"").trim());const s=this.getCurrentNode();if("Properties70"!==s.name){if("C"===i){const e=r.split(",").slice(1),t=parseInt(e[0]),n=parseInt(e[1]);let o=r.split(",").slice(3);o=o.map((function(e){return e.trim().replace(/^"/,"")})),i="connections",r=[t,n],function(e,t){for(let n=0,i=e.length,r=t.length;n<r;n++,i++)e[i]=t[n]}(r,o),void 0===s[i]&&(s[i]=[])}"Node"===i&&(s.id=r),i in s&&Array.isArray(s[i])?s[i].push(r):"a"!==i?s[i]=r:s.a=r,this.setCurrentProp(s,i),"a"===i&&","!==r.slice(-1)&&(s.a=SE(r))}else this.parseNodeSpecialProperty(e,i,r)}parseNodePropertyContinued(e){const t=this.getCurrentNode();t.a+=e,","!==e.slice(-1)&&(t.a=SE(t.a))}parseNodeSpecialProperty(e,t,n){const i=n.split('",').map((function(e){return e.trim().replace(/^\"/,"").replace(/\s/,"_")})),r=i[0],s=i[1],o=i[2],a=i[3];let l=i[4];switch(s){case"int":case"enum":case"bool":case"ULongLong":case"double":case"Number":case"FieldOfView":l=parseFloat(l);break;case"Color":case"ColorRGB":case"Vector3D":case"Lcl_Translation":case"Lcl_Rotation":case"Lcl_Scaling":l=SE(l)}this.getPrevNode()[r]={type:s,type2:o,flag:a,value:l},this.setCurrentProp(this.getPrevNode(),r)}}class gE{parse(e){const t=new vE(e);t.skip(23);const n=t.getUint32();if(n<6400)throw new Error("THREE.FBXLoader: FBX version not supported, FileVersion: "+n);const i=new yE;for(;!this.endOfContent(t);){const e=this.parseNode(t,n);null!==e&&i.add(e.name,e)}return i}endOfContent(e){return e.size()%16==0?(e.getOffset()+160+16&-16)>=e.size():e.getOffset()+160+16>=e.size()}parseNode(e,t){const n={},i=t>=7500?e.getUint64():e.getUint32(),r=t>=7500?e.getUint64():e.getUint32();t>=7500?e.getUint64():e.getUint32();const s=e.getUint8(),o=e.getString(s);if(0===i)return null;const a=[];for(let t=0;t<r;t++)a.push(this.parseProperty(e));const l=a.length>0?a[0]:"",c=a.length>1?a[1]:"",h=a.length>2?a[2]:"";for(n.singleProperty=1===r&&e.getOffset()===i;i>e.getOffset();){const i=this.parseNode(e,t);null!==i&&this.parseSubNode(o,n,i)}return n.propertyList=a,"number"==typeof l&&(n.id=l),""!==c&&(n.attrName=c),""!==h&&(n.attrType=h),""!==o&&(n.name=o),n}parseSubNode(e,t,n){if(!0===n.singleProperty){const e=n.propertyList[0];Array.isArray(e)?(t[n.name]=n,n.a=e):t[n.name]=e}else if("Connections"===e&&"C"===n.name){const e=[];n.propertyList.forEach((function(t,n){0!==n&&e.push(t)})),void 0===t.connections&&(t.connections=[]),t.connections.push(e)}else if("Properties70"===n.name)Object.keys(n).forEach((function(e){t[e]=n[e]}));else if("Properties70"===e&&"P"===n.name){let e=n.propertyList[0],i=n.propertyList[1];const r=n.propertyList[2],s=n.propertyList[3];let o;0===e.indexOf("Lcl ")&&(e=e.replace("Lcl ","Lcl_")),0===i.indexOf("Lcl ")&&(i=i.replace("Lcl ","Lcl_")),o="Color"===i||"ColorRGB"===i||"Vector"===i||"Vector3D"===i||0===i.indexOf("Lcl_")?[n.propertyList[4],n.propertyList[5],n.propertyList[6]]:n.propertyList[4],t[e]={type:i,type2:r,flag:s,value:o}}else void 0===t[n.name]?"number"==typeof n.id?(t[n.name]={},t[n.name][n.id]=n):t[n.name]=n:"PoseNode"===n.name?(Array.isArray(t[n.name])||(t[n.name]=[t[n.name]]),t[n.name].push(n)):void 0===t[n.name][n.id]&&(t[n.name][n.id]=n)}parseProperty(e){const t=e.getString(1);let n;switch(t){case"C":return e.getBoolean();case"D":return e.getFloat64();case"F":return e.getFloat32();case"I":return e.getInt32();case"L":return e.getInt64();case"R":return n=e.getUint32(),e.getArrayBuffer(n);case"S":return n=e.getUint32(),e.getString(n);case"Y":return e.getInt16();case"b":case"c":case"d":case"f":case"i":case"l":const i=e.getUint32(),r=e.getUint32(),s=e.getUint32();if(0===r)switch(t){case"b":case"c":return e.getBooleanArray(i);case"d":return e.getFloat64Array(i);case"f":return e.getFloat32Array(i);case"i":return e.getInt32Array(i);case"l":return e.getInt64Array(i)}const o=tE(new Uint8Array(e.getArrayBuffer(s))),a=new vE(o.buffer);switch(t){case"b":case"c":return a.getBooleanArray(i);case"d":return a.getFloat64Array(i);case"f":return a.getFloat32Array(i);case"i":return a.getInt32Array(i);case"l":return a.getInt64Array(i)}break;default:throw new Error("THREE.FBXLoader: Unknown property type "+t)}}}class vE{constructor(e,t){this.dv=new DataView(e),this.offset=0,this.littleEndian=void 0===t||t,this._textDecoder=new TextDecoder}getOffset(){return this.offset}size(){return this.dv.buffer.byteLength}skip(e){this.offset+=e}getBoolean(){return!(1&~this.getUint8())}getBooleanArray(e){const t=[];for(let n=0;n<e;n++)t.push(this.getBoolean());return t}getUint8(){const e=this.dv.getUint8(this.offset);return this.offset+=1,e}getInt16(){const e=this.dv.getInt16(this.offset,this.littleEndian);return this.offset+=2,e}getInt32(){const e=this.dv.getInt32(this.offset,this.littleEndian);return this.offset+=4,e}getInt32Array(e){const t=[];for(let n=0;n<e;n++)t.push(this.getInt32());return t}getUint32(){const e=this.dv.getUint32(this.offset,this.littleEndian);return this.offset+=4,e}getInt64(){let e,t;return this.littleEndian?(e=this.getUint32(),t=this.getUint32()):(t=this.getUint32(),e=this.getUint32()),2147483648&t?(t=4294967295&~t,e=4294967295&~e,4294967295===e&&(t=t+1&4294967295),e=e+1&4294967295,-(4294967296*t+e)):4294967296*t+e}getInt64Array(e){const t=[];for(let n=0;n<e;n++)t.push(this.getInt64());return t}getUint64(){let e,t;return this.littleEndian?(e=this.getUint32(),t=this.getUint32()):(t=this.getUint32(),e=this.getUint32()),4294967296*t+e}getFloat32(){const e=this.dv.getFloat32(this.offset,this.littleEndian);return this.offset+=4,e}getFloat32Array(e){const t=[];for(let n=0;n<e;n++)t.push(this.getFloat32());return t}getFloat64(){const e=this.dv.getFloat64(this.offset,this.littleEndian);return this.offset+=8,e}getFloat64Array(e){const t=[];for(let n=0;n<e;n++)t.push(this.getFloat64());return t}getArrayBuffer(e){const t=this.dv.buffer.slice(this.offset,this.offset+e);return this.offset+=e,t}getString(e){const t=this.offset;let n=new Uint8Array(this.dv.buffer,t,e);this.skip(e);const i=n.indexOf(0);return i>=0&&(n=new Uint8Array(this.dv.buffer,t,i)),this._textDecoder.decode(n)}}class yE{add(e,t){this[e]=t}}function EE(e){const t=e.match(/FBXVersion: (\d+)/);if(t)return parseInt(t[1]);throw new Error("THREE.FBXLoader: Cannot find the version number for the file given.")}function bE(e){return e/46186158e3}const xE=[];function CE(e,t,n,i){let r;switch(i.mappingType){case"ByPolygonVertex":r=e;break;case"ByPolygon":r=t;break;case"ByVertice":r=n;break;case"AllSame":r=i.indices[0];break;default:console.warn("THREE.FBXLoader: unknown attribute mapping type "+i.mappingType)}"IndexToDirect"===i.referenceType&&(r=i.indices[r]);const s=r*i.dataSize,o=s+i.dataSize;return function(e,t,n,i){for(let r=n,s=0;r<i;r++,s++)e[s]=t[r];return e}(xE,i.buffer,s,o)}const wE=new Ws,_E=new os;function ME(e){const t=new ks,n=new ks,i=new ks,r=new ks,s=new ks,o=new ks,a=new ks,l=new ks,c=new ks,h=new ks,u=new ks,d=new ks,p=e.inheritType?e.inheritType:0;e.translation&&t.setPosition(_E.fromArray(e.translation));const f=IE(0);if(e.preRotation){const t=e.preRotation.map(Sr.degToRad);t.push(f),n.makeRotationFromEuler(wE.fromArray(t))}if(e.rotation){const t=e.rotation.map(Sr.degToRad);t.push(e.eulerOrder||f),i.makeRotationFromEuler(wE.fromArray(t))}if(e.postRotation){const t=e.postRotation.map(Sr.degToRad);t.push(f),r.makeRotationFromEuler(wE.fromArray(t)),r.invert()}e.scale&&s.scale(_E.fromArray(e.scale)),e.scalingOffset&&a.setPosition(_E.fromArray(e.scalingOffset)),e.scalingPivot&&o.setPosition(_E.fromArray(e.scalingPivot)),e.rotationOffset&&l.setPosition(_E.fromArray(e.rotationOffset)),e.rotationPivot&&c.setPosition(_E.fromArray(e.rotationPivot)),e.parentMatrixWorld&&(u.copy(e.parentMatrix),h.copy(e.parentMatrixWorld));const m=n.clone().multiply(i).multiply(r),A=new ks;A.extractRotation(h);const g=new ks;g.copyPosition(h);const v=g.clone().invert().multiply(h),y=A.clone().invert().multiply(v),E=s,b=new ks;if(0===p)b.copy(A).multiply(m).multiply(y).multiply(E);else if(1===p)b.copy(A).multiply(y).multiply(m).multiply(E);else{const e=(new ks).scale((new os).setFromMatrixScale(u)).clone().invert(),t=y.clone().multiply(e);b.copy(A).multiply(m).multiply(t).multiply(E)}const x=c.clone().invert(),C=o.clone().invert();let w=t.clone().multiply(l).multiply(c).multiply(n).multiply(i).multiply(r).multiply(x).multiply(a).multiply(o).multiply(s).multiply(C);const _=(new ks).copyPosition(w),M=h.clone().multiply(_);return d.copyPosition(M),w=d.clone().multiply(b),w.premultiply(h.invert()),w}function IE(e){const t=["ZYX","YZX","XZY","ZXY","YXZ","XYZ"];return 6===(e=e||0)?(console.warn("THREE.FBXLoader: unsupported Euler Order: Spherical XYZ. Animations and rotations may be incorrect."),t[0]):t[e]}function SE(e){return e.split(",").map((function(e){return parseFloat(e)}))}function TE(e,t,n){return void 0===t&&(t=0),void 0===n&&(n=e.byteLength),(new TextDecoder).decode(new Uint8Array(e,t,n))}class BE{parse(e){const t={},n=e.split("\n");let i=null,r=t;const s=[t];for(const e of n)if(e.includes("=")){const t=e.split("="),n=t[0].trim(),i=t[1].trim();if(i.endsWith("{")){const e={};s.push(e),r[n]=e,r=e}else if(i.endsWith("(")){const e=i.slice(0,-1);r[n]=e;const t={};s.push(t),r=t}else r[n]=i}else if(e.endsWith("{")){const e=r[i]||{};s.push(e),r[i]=e,r=e}else if(e.endsWith("}")){if(s.pop(),0===s.length)continue;r=s[s.length-1]}else if(e.endsWith("(")){const t={};s.push(t),i=e.split("(")[0].trim()||i,r[i]=t,r=t}else e.endsWith(")")?(s.pop(),r=s[s.length-1]):i=e.trim();return t}}class RE extends Vu{constructor(e){super(e)}parse(e){if(e.length<19)throw new Error("THREE.TGALoader: Not enough data to contain header.");let t=0;const n=new Uint8Array(e),i={id_length:n[t++],colormap_type:n[t++],image_type:n[t++],colormap_index:n[t++]|n[t++]<<8,colormap_length:n[t++]|n[t++]<<8,colormap_size:n[t++],origin:[n[t++]|n[t++]<<8,n[t++]|n[t++]<<8],width:n[t++]|n[t++]<<8,height:n[t++]|n[t++]<<8,pixel_size:n[t++],flags:n[t++]};if(function(e){switch(e.image_type){case 1:case 9:if(e.colormap_length>256||24!==e.colormap_size||1!==e.colormap_type)throw new Error("THREE.TGALoader: Invalid type colormap data for indexed type.");break;case 2:case 3:case 10:case 11:if(e.colormap_type)throw new Error("THREE.TGALoader: Invalid type colormap data for colormap type.");break;case 0:throw new Error("THREE.TGALoader: No data.");default:throw new Error("THREE.TGALoader: Invalid type "+e.image_type)}if(e.width<=0||e.height<=0)throw new Error("THREE.TGALoader: Invalid image size.");if(8!==e.pixel_size&&16!==e.pixel_size&&24!==e.pixel_size&&32!==e.pixel_size)throw new Error("THREE.TGALoader: Invalid pixel size "+e.pixel_size)}(i),i.id_length+t>e.length)throw new Error("THREE.TGALoader: No data.");t+=i.id_length;let r=!1,s=!1,o=!1;switch(i.image_type){case 9:r=!0,s=!0;break;case 1:s=!0;break;case 10:r=!0;break;case 2:break;case 11:r=!0,o=!0;break;case 3:o=!0}const a=new Uint8Array(i.width*i.height*4),l=function(e,t,n,i,r){let s,o;const a=n.pixel_size>>3,l=n.width*n.height*a;if(t&&(o=r.subarray(i,i+=n.colormap_length*(n.colormap_size>>3))),e){let e,t,n;s=new Uint8Array(l);let o=0;const c=new Uint8Array(a);for(;o<l;)if(e=r[i++],t=1+(127&e),128&e){for(n=0;n<a;++n)c[n]=r[i++];for(n=0;n<t;++n)s.set(c,o+n*a);o+=a*t}else{for(t*=a,n=0;n<t;++n)s[o+n]=r[i++];o+=t}}else s=r.subarray(i,i+=t?n.width*n.height:l);return{pixel_data:s,palettes:o}}(r,s,i,t,n);return function(e,t,n,r,s){let a,l,c,h,u,d;switch((48&i.flags)>>4){default:case 2:a=0,c=1,u=t,l=0,h=1,d=n;break;case 0:a=0,c=1,u=t,l=n-1,h=-1,d=-1;break;case 3:a=t-1,c=-1,u=-1,l=0,h=1,d=n;break;case 1:a=t-1,c=-1,u=-1,l=n-1,h=-1,d=-1}if(o)switch(i.pixel_size){case 8:!function(e,t,n,r,s,o,a,l){let c,h,u,d=0;const p=i.width;for(u=t;u!==r;u+=n)for(h=s;h!==a;h+=o,d++)c=l[d],e[4*(h+p*u)+0]=c,e[4*(h+p*u)+1]=c,e[4*(h+p*u)+2]=c,e[4*(h+p*u)+3]=255}(e,l,h,d,a,c,u,r);break;case 16:!function(e,t,n,r,s,o,a,l){let c,h,u=0;const d=i.width;for(h=t;h!==r;h+=n)for(c=s;c!==a;c+=o,u+=2)e[4*(c+d*h)+0]=l[u+0],e[4*(c+d*h)+1]=l[u+0],e[4*(c+d*h)+2]=l[u+0],e[4*(c+d*h)+3]=l[u+1]}(e,l,h,d,a,c,u,r);break;default:throw new Error("THREE.TGALoader: Format not supported.")}else switch(i.pixel_size){case 8:!function(e,t,n,r,s,o,a,l,c){const h=c;let u,d,p,f=0;const m=i.width;for(p=t;p!==r;p+=n)for(d=s;d!==a;d+=o,f++)u=l[f],e[4*(d+m*p)+3]=255,e[4*(d+m*p)+2]=h[3*u+0],e[4*(d+m*p)+1]=h[3*u+1],e[4*(d+m*p)+0]=h[3*u+2]}(e,l,h,d,a,c,u,r,s);break;case 16:!function(e,t,n,r,s,o,a,l){let c,h,u,d=0;const p=i.width;for(u=t;u!==r;u+=n)for(h=s;h!==a;h+=o,d+=2)c=l[d+0]+(l[d+1]<<8),e[4*(h+p*u)+0]=(31744&c)>>7,e[4*(h+p*u)+1]=(992&c)>>2,e[4*(h+p*u)+2]=(31&c)<<3,e[4*(h+p*u)+3]=32768&c?0:255}(e,l,h,d,a,c,u,r);break;case 24:!function(e,t,n,r,s,o,a,l){let c,h,u=0;const d=i.width;for(h=t;h!==r;h+=n)for(c=s;c!==a;c+=o,u+=3)e[4*(c+d*h)+3]=255,e[4*(c+d*h)+2]=l[u+0],e[4*(c+d*h)+1]=l[u+1],e[4*(c+d*h)+0]=l[u+2]}(e,l,h,d,a,c,u,r);break;case 32:!function(e,t,n,r,s,o,a,l){let c,h,u=0;const d=i.width;for(h=t;h!==r;h+=n)for(c=s;c!==a;c+=o,u+=4)e[4*(c+d*h)+2]=l[u+0],e[4*(c+d*h)+1]=l[u+1],e[4*(c+d*h)+0]=l[u+2],e[4*(c+d*h)+3]=l[u+3]}(e,l,h,d,a,c,u,r);break;default:throw new Error("THREE.TGALoader: Format not supported.")}}(a,i.width,i.height,l.pixel_data,l.palettes),{data:a,width:i.width,height:i.height,flipY:!0,generateMipmaps:!0,minFilter:nn}}}class LE{constructor(e="",t={}){this.baseUrl=e,this.options=t,this.materialsInfo={},this.materials={},this.materialsArray=[],this.nameLookup={},this.crossOrigin="anonymous",this.side=void 0!==this.options.side?this.options.side:He,this.wrap=void 0!==this.options.wrap?this.options.wrap:jt}setCrossOrigin(e){return this.crossOrigin=e,this}setManager(e){this.manager=e}setMaterials(e){this.materialsInfo=this.convert(e),this.materials={},this.materialsArray=[],this.nameLookup={}}convert(e){if(!this.options)return e;const t={};for(const n in e){const i=e[n],r={};t[n]=r;for(const e in i){let t=!0,n=i[e];const s=e.toLowerCase();switch(s){case"kd":case"ka":case"ks":this.options&&this.options.normalizeRGB&&(n=[n[0]/255,n[1]/255,n[2]/255]),this.options&&this.options.ignoreZeroRGBs&&0===n[0]&&0===n[1]&&0===n[2]&&(t=!1)}t&&(r[s]=n)}}return t}preload(){for(const e in this.materialsInfo)this.create(e)}getIndex(e){return this.nameLookup[e]}getAsArray(){let e=0;for(const t in this.materialsInfo)this.materialsArray[e]=this.create(t),this.nameLookup[t]=e,e++;return this.materialsArray}create(e){return void 0===this.materials[e]&&this.createMaterial_(e),this.materials[e]}createMaterial_(e){const t=this,n=this.materialsInfo[e],i={name:e,side:this.side};function r(e,n){if(i[e])return;const r=t.getTextureParams(n,i),s=t.loadTexture((o=t.baseUrl,"string"!=typeof(a=r.url)||""===a?"":/^https?:\/\//i.test(a)?a:o+a));var o,a;s.repeat.copy(r.scale),s.offset.copy(r.offset),s.wrapS=t.wrap,s.wrapT=t.wrap,"map"!==e&&"emissiveMap"!==e||(s.colorSpace=Ti),i[e]=s}for(const e in n){const t=n[e];let s;if(""!==t)switch(e.toLowerCase()){case"kd":i.color=Gr.toWorkingColorSpace((new To).fromArray(t),Ti);break;case"ks":i.specular=Gr.toWorkingColorSpace((new To).fromArray(t),Ti);break;case"ke":i.emissive=Gr.toWorkingColorSpace((new To).fromArray(t),Ti);break;case"map_kd":r("map",t);break;case"map_ks":r("specularMap",t);break;case"map_ke":r("emissiveMap",t);break;case"norm":r("normalMap",t);break;case"map_bump":case"bump":r("bumpMap",t);break;case"map_d":r("alphaMap",t),i.transparent=!0;break;case"ns":i.shininess=parseFloat(t);break;case"d":s=parseFloat(t),s<1&&(i.opacity=s,i.transparent=!0);break;case"tr":s=parseFloat(t),this.options&&this.options.invertTrProperty&&(s=1-s),s>0&&(i.opacity=1-s,i.transparent=!0)}}return this.materials[e]=new su(i),this.materials[e]}getTextureParams(e,t){const n={scale:new Tr(1,1),offset:new Tr(0,0)},i=e.split(/\s+/);let r;return r=i.indexOf("-bm"),r>=0&&(t.bumpScale=parseFloat(i[r+1]),i.splice(r,2)),r=i.indexOf("-s"),r>=0&&(n.scale.set(parseFloat(i[r+1]),parseFloat(i[r+2])),i.splice(r,4)),r=i.indexOf("-o"),r>=0&&(n.offset.set(parseFloat(i[r+1]),parseFloat(i[r+2])),i.splice(r,4)),n.url=i.join(" ").trim(),n}loadTexture(e,t,n,i,r){const s=void 0!==this.manager?this.manager:Uu;let o=s.getHandler(e);null===o&&(o=new ju(s)),o.setCrossOrigin&&o.setCrossOrigin(this.crossOrigin);const a=o.load(e,n,i,r);return void 0!==t&&(a.mapping=t),a}}class DE{static fromCubeTexture(e){let t=0;const n=new os,i=new os,r=new To,s=[0,0,0,0,0,0,0,0,0],o=new hd,a=o.coefficients;for(let o=0;o<6;o++){const l=e.image[o],c=l.width,h=l.height,u=document.createElement("canvas");u.width=c,u.height=h;const d=u.getContext("2d");d.drawImage(l,0,0,c,h);const p=d.getImageData(0,0,c,h),f=p.data,m=p.width,A=2/m;for(let l=0,c=f.length;l<c;l+=4){r.setRGB(f[l]/255,f[l+1]/255,f[l+2]/255),PE(r,e.colorSpace);const c=l/4,h=(c%m+.5)*A-1,u=1-(Math.floor(c/m)+.5)*A;switch(o){case 0:n.set(-1,u,-h);break;case 1:n.set(1,u,h);break;case 2:n.set(-h,1,-u);break;case 3:n.set(-h,-1,u);break;case 4:n.set(-h,u,1);break;case 5:n.set(h,u,-1)}const d=n.lengthSq(),p=4/(Math.sqrt(d)*d);t+=p,i.copy(n).normalize(),hd.getBasisAt(i,s);for(let e=0;e<9;e++)a[e].x+=s[e]*r.r*p,a[e].y+=s[e]*r.g*p,a[e].z+=s[e]*r.b*p}}const l=4*Math.PI/t;for(let e=0;e<9;e++)a[e].x*=l,a[e].y*=l,a[e].z*=l;return new ud(o)}static async fromCubeRenderTarget(e,t){const n=e.coordinateSystem===fr?-1:1;let i=0;const r=new os,s=new os,o=new To,a=[0,0,0,0,0,0,0,0,0],l=new hd,c=l.coefficients,h=t.texture.type,u=t.width;let d;e.isWebGLRenderer&&(d=h===dn?new Uint16Array(u*u*4):new Uint8Array(u*u*4));for(let l=0;l<6;l++){e.isWebGLRenderer?await e.readRenderTargetPixelsAsync(t,0,0,u,u,d,l):d=await e.readRenderTargetPixelsAsync(t,0,0,u,u,0,l);const p=2/u;for(let e=0,f=d.length;e<f;e+=4){let f,m,A;h===dn?(f=Oo.fromHalfFloat(d[e]),m=Oo.fromHalfFloat(d[e+1]),A=Oo.fromHalfFloat(d[e+2])):(f=d[e]/255,m=d[e+1]/255,A=d[e+2]/255),o.setRGB(f,m,A),PE(o,t.texture.colorSpace);const g=e/4,v=(1-(g%u+.5)*p)*n,y=1-(Math.floor(g/u)+.5)*p;switch(l){case 0:r.set(-1*n,y,v*n);break;case 1:r.set(1*n,y,-v*n);break;case 2:r.set(v,1,-y);break;case 3:r.set(v,-1,y);break;case 4:r.set(v,y,1);break;case 5:r.set(-v,y,-1)}const E=r.lengthSq(),b=4/(Math.sqrt(E)*E);i+=b,s.copy(r).normalize(),hd.getBasisAt(s,a);for(let e=0;e<9;e++)c[e].x+=a[e]*o.r*b,c[e].y+=a[e]*o.g*b,c[e].z+=a[e]*o.b*b}}const p=4*Math.PI/i;for(let e=0;e<9;e++)c[e].x*=p,c[e].y*=p,c[e].z*=p;return new ud(l)}}function PE(e,t){switch(t){case Ti:e.convertSRGBToLinear();break;case Bi:case Si:break;default:console.warn("WARNING: LightProbeGenerator convertColorToLinear() encountered an unsupported color space.")}return e}const UE=new cp,kE=new os,NE=new os,OE=new ss,FE={X:new os(1,0,0),Y:new os(0,1,0),Z:new os(0,0,1)},QE={type:"change"},zE={type:"mouseDown",mode:null},GE={type:"mouseUp",mode:null},HE={type:"objectChange"};function VE(e){if(this.domElement.ownerDocument.pointerLockElement)return{x:0,y:0,button:e.button};{const t=this.domElement.getBoundingClientRect();return{x:(e.clientX-t.left)/t.width*2-1,y:-(e.clientY-t.top)/t.height*2+1,button:e.button}}}function jE(e){if(this.enabled)switch(e.pointerType){case"mouse":case"pen":this.pointerHover(this._getPointer(e))}}function WE(e){this.enabled&&(document.pointerLockElement||this.domElement.setPointerCapture(e.pointerId),this.domElement.addEventListener("pointermove",this._onPointerMove),this.pointerHover(this._getPointer(e)),this.pointerDown(this._getPointer(e)))}function qE(e){this.enabled&&this.pointerMove(this._getPointer(e))}function XE(e){this.enabled&&(this.domElement.releasePointerCapture(e.pointerId),this.domElement.removeEventListener("pointermove",this._onPointerMove),this.pointerUp(this._getPointer(e)))}function YE(e,t,n){const i=t.intersectObject(e,!0);for(let e=0;e<i.length;e++)if(i[e].object.visible||n)return i[e];return!1}const JE=new Ws,KE=new os(0,1,0),ZE=new os(0,0,0),$E=new ks,eb=new ss,tb=new ss,nb=new os,ib=new ks,rb=new os(1,0,0),sb=new os(0,1,0),ob=new os(0,0,1),ab=new os,lb=new os,cb=new os;class hb extends co{constructor(e){super(),this.isTransformControlsRoot=!0,this.controls=e,this.visible=!1}updateMatrixWorld(e){const t=this.controls;void 0!==t.object&&(t.object.updateMatrixWorld(),null===t.object.parent?console.error("TransformControls: The attached 3D object must be a part of the scene graph."):t.object.parent.matrixWorld.decompose(t._parentPosition,t._parentQuaternion,t._parentScale),t.object.matrixWorld.decompose(t.worldPosition,t.worldQuaternion,t._worldScale),t._parentQuaternionInv.copy(t._parentQuaternion).invert(),t._worldQuaternionInv.copy(t.worldQuaternion).invert()),t.camera.updateMatrixWorld(),t.camera.matrixWorld.decompose(t.cameraPosition,t.cameraQuaternion,t._cameraScale),t.camera.isOrthographicCamera?t.camera.getWorldDirection(t.eye).negate():t.eye.copy(t.cameraPosition).sub(t.worldPosition).normalize(),super.updateMatrixWorld(e)}dispose(){this.traverse((function(e){e.geometry&&e.geometry.dispose(),e.material&&e.material.dispose()}))}}class ub extends co{constructor(){super(),this.isTransformControlsGizmo=!0,this.type="TransformControlsGizmo";const e=new Do({depthTest:!1,depthWrite:!1,fog:!1,toneMapped:!1,transparent:!0}),t=new ic({depthTest:!1,depthWrite:!1,fog:!1,toneMapped:!1,transparent:!0}),n=e.clone();n.opacity=.15;const i=t.clone();i.opacity=.5;const r=e.clone();r.color.setHex(16711680);const s=e.clone();s.color.setHex(65280);const o=e.clone();o.color.setHex(255);const a=e.clone();a.color.setHex(16711680),a.opacity=.5;const l=e.clone();l.color.setHex(65280),l.opacity=.5;const c=e.clone();c.color.setHex(255),c.opacity=.5;const h=e.clone();h.opacity=.25;const u=e.clone();u.color.setHex(16776960),u.opacity=.25,e.clone().color.setHex(16776960);const d=e.clone();d.color.setHex(7895160);const p=new ih(0,.04,.1,12);p.translate(0,.05,0);const f=new ya(.08,.08,.08);f.translate(0,.04,0);const m=new sa;m.setAttribute("position",new Ko([0,0,0,1,0,0],3));const A=new ih(.0075,.0075,.5,3);function g(e,t){const n=new Yh(e,.0075,3,64,t*Math.PI*2);return n.rotateY(Math.PI/2),n.rotateX(Math.PI/2),n}A.translate(0,.25,0);const v={X:[[new ga(p,r),[.5,0,0],[0,0,-Math.PI/2]],[new ga(p,r),[-.5,0,0],[0,0,Math.PI/2]],[new ga(A,r),[0,0,0],[0,0,-Math.PI/2]]],Y:[[new ga(p,s),[0,.5,0]],[new ga(p,s),[0,-.5,0],[Math.PI,0,0]],[new ga(A,s)]],Z:[[new ga(p,o),[0,0,.5],[Math.PI/2,0,0]],[new ga(p,o),[0,0,-.5],[-Math.PI/2,0,0]],[new ga(A,o),null,[Math.PI/2,0,0]]],XYZ:[[new ga(new Hh(.1,0),h.clone()),[0,0,0]]],XY:[[new ga(new ya(.15,.15,.01),c.clone()),[.15,.15,0]]],YZ:[[new ga(new ya(.15,.15,.01),a.clone()),[0,.15,.15],[0,Math.PI/2,0]]],XZ:[[new ga(new ya(.15,.15,.01),l.clone()),[.15,0,.15],[-Math.PI/2,0,0]]]},y={X:[[new ga(new ih(.2,0,.6,4),n),[.3,0,0],[0,0,-Math.PI/2]],[new ga(new ih(.2,0,.6,4),n),[-.3,0,0],[0,0,Math.PI/2]]],Y:[[new ga(new ih(.2,0,.6,4),n),[0,.3,0]],[new ga(new ih(.2,0,.6,4),n),[0,-.3,0],[0,0,Math.PI]]],Z:[[new ga(new ih(.2,0,.6,4),n),[0,0,.3],[Math.PI/2,0,0]],[new ga(new ih(.2,0,.6,4),n),[0,0,-.3],[-Math.PI/2,0,0]]],XYZ:[[new ga(new Hh(.2,0),n)]],XY:[[new ga(new ya(.2,.2,.01),n),[.15,.15,0]]],YZ:[[new ga(new ya(.2,.2,.01),n),[0,.15,.15],[0,Math.PI/2,0]]],XZ:[[new ga(new ya(.2,.2,.01),n),[.15,0,.15],[-Math.PI/2,0,0]]]},E={START:[[new ga(new Hh(.01,2),i),null,null,null,"helper"]],END:[[new ga(new Hh(.01,2),i),null,null,null,"helper"]],DELTA:[[new uc(function(){const e=new sa;return e.setAttribute("position",new Ko([0,0,0,1,1,1],3)),e}(),i),null,null,null,"helper"]],X:[[new uc(m,i.clone()),[-1e3,0,0],null,[1e6,1,1],"helper"]],Y:[[new uc(m,i.clone()),[0,-1e3,0],[0,0,Math.PI/2],[1e6,1,1],"helper"]],Z:[[new uc(m,i.clone()),[0,0,-1e3],[0,-Math.PI/2,0],[1e6,1,1],"helper"]]},b={XYZE:[[new ga(g(.5,1),d),null,[0,Math.PI/2,0]]],X:[[new ga(g(.5,.5),r)]],Y:[[new ga(g(.5,.5),s),null,[0,0,-Math.PI/2]]],Z:[[new ga(g(.5,.5),o),null,[0,Math.PI/2,0]]],E:[[new ga(g(.75,1),u),null,[0,Math.PI/2,0]]]},x={AXIS:[[new uc(m,i.clone()),[-1e3,0,0],null,[1e6,1,1],"helper"]]},C={XYZE:[[new ga(new qh(.25,10,8),n)]],X:[[new ga(new Yh(.5,.1,4,24),n),[0,0,0],[0,-Math.PI/2,-Math.PI/2]]],Y:[[new ga(new Yh(.5,.1,4,24),n),[0,0,0],[Math.PI/2,0,0]]],Z:[[new ga(new Yh(.5,.1,4,24),n),[0,0,0],[0,0,-Math.PI/2]]],E:[[new ga(new Yh(.75,.1,2,24),n)]]},w={X:[[new ga(f,r),[.5,0,0],[0,0,-Math.PI/2]],[new ga(A,r),[0,0,0],[0,0,-Math.PI/2]],[new ga(f,r),[-.5,0,0],[0,0,Math.PI/2]]],Y:[[new ga(f,s),[0,.5,0]],[new ga(A,s)],[new ga(f,s),[0,-.5,0],[0,0,Math.PI]]],Z:[[new ga(f,o),[0,0,.5],[Math.PI/2,0,0]],[new ga(A,o),[0,0,0],[Math.PI/2,0,0]],[new ga(f,o),[0,0,-.5],[-Math.PI/2,0,0]]],XY:[[new ga(new ya(.15,.15,.01),c),[.15,.15,0]]],YZ:[[new ga(new ya(.15,.15,.01),a),[0,.15,.15],[0,Math.PI/2,0]]],XZ:[[new ga(new ya(.15,.15,.01),l),[.15,0,.15],[-Math.PI/2,0,0]]],XYZ:[[new ga(new ya(.1,.1,.1),h.clone())]]},_={X:[[new ga(new ih(.2,0,.6,4),n),[.3,0,0],[0,0,-Math.PI/2]],[new ga(new ih(.2,0,.6,4),n),[-.3,0,0],[0,0,Math.PI/2]]],Y:[[new ga(new ih(.2,0,.6,4),n),[0,.3,0]],[new ga(new ih(.2,0,.6,4),n),[0,-.3,0],[0,0,Math.PI]]],Z:[[new ga(new ih(.2,0,.6,4),n),[0,0,.3],[Math.PI/2,0,0]],[new ga(new ih(.2,0,.6,4),n),[0,0,-.3],[-Math.PI/2,0,0]]],XY:[[new ga(new ya(.2,.2,.01),n),[.15,.15,0]]],YZ:[[new ga(new ya(.2,.2,.01),n),[0,.15,.15],[0,Math.PI/2,0]]],XZ:[[new ga(new ya(.2,.2,.01),n),[.15,0,.15],[-Math.PI/2,0,0]]],XYZ:[[new ga(new ya(.2,.2,.2),n),[0,0,0]]]},M={X:[[new uc(m,i.clone()),[-1e3,0,0],null,[1e6,1,1],"helper"]],Y:[[new uc(m,i.clone()),[0,-1e3,0],[0,0,Math.PI/2],[1e6,1,1],"helper"]],Z:[[new uc(m,i.clone()),[0,0,-1e3],[0,-Math.PI/2,0],[1e6,1,1],"helper"]]};function I(e){const t=new co;for(const n in e)for(let i=e[n].length;i--;){const r=e[n][i][0].clone(),s=e[n][i][1],o=e[n][i][2],a=e[n][i][3],l=e[n][i][4];r.name=n,r.tag=l,s&&r.position.set(s[0],s[1],s[2]),o&&r.rotation.set(o[0],o[1],o[2]),a&&r.scale.set(a[0],a[1],a[2]),r.updateMatrix();const c=r.geometry.clone();c.applyMatrix4(r.matrix),r.geometry=c,r.renderOrder=1/0,r.position.set(0,0,0),r.rotation.set(0,0,0),r.scale.set(1,1,1),t.add(r)}return t}this.gizmo={},this.picker={},this.helper={},this.add(this.gizmo.translate=I(v)),this.add(this.gizmo.rotate=I(b)),this.add(this.gizmo.scale=I(w)),this.add(this.picker.translate=I(y)),this.add(this.picker.rotate=I(C)),this.add(this.picker.scale=I(_)),this.add(this.helper.translate=I(E)),this.add(this.helper.rotate=I(x)),this.add(this.helper.scale=I(M)),this.picker.translate.visible=!1,this.picker.rotate.visible=!1,this.picker.scale.visible=!1}updateMatrixWorld(e){const t="local"===("scale"===this.mode?"local":this.space)?this.worldQuaternion:tb;this.gizmo.translate.visible="translate"===this.mode,this.gizmo.rotate.visible="rotate"===this.mode,this.gizmo.scale.visible="scale"===this.mode,this.helper.translate.visible="translate"===this.mode,this.helper.rotate.visible="rotate"===this.mode,this.helper.scale.visible="scale"===this.mode;let n=[];n=n.concat(this.picker[this.mode].children),n=n.concat(this.gizmo[this.mode].children),n=n.concat(this.helper[this.mode].children);for(let e=0;e<n.length;e++){const i=n[e];let r;if(i.visible=!0,i.rotation.set(0,0,0),i.position.copy(this.worldPosition),r=this.camera.isOrthographicCamera?(this.camera.top-this.camera.bottom)/this.camera.zoom:this.worldPosition.distanceTo(this.cameraPosition)*Math.min(1.9*Math.tan(Math.PI*this.camera.fov/360)/this.camera.zoom,7),i.scale.set(1,1,1).multiplyScalar(r*this.size/4),"helper"!==i.tag){if(i.quaternion.copy(t),"translate"===this.mode||"scale"===this.mode){const e=.99,n=.2;"X"===i.name&&Math.abs(KE.copy(rb).applyQuaternion(t).dot(this.eye))>e&&(i.scale.set(1e-10,1e-10,1e-10),i.visible=!1),"Y"===i.name&&Math.abs(KE.copy(sb).applyQuaternion(t).dot(this.eye))>e&&(i.scale.set(1e-10,1e-10,1e-10),i.visible=!1),"Z"===i.name&&Math.abs(KE.copy(ob).applyQuaternion(t).dot(this.eye))>e&&(i.scale.set(1e-10,1e-10,1e-10),i.visible=!1),"XY"===i.name&&Math.abs(KE.copy(ob).applyQuaternion(t).dot(this.eye))<n&&(i.scale.set(1e-10,1e-10,1e-10),i.visible=!1),"YZ"===i.name&&Math.abs(KE.copy(rb).applyQuaternion(t).dot(this.eye))<n&&(i.scale.set(1e-10,1e-10,1e-10),i.visible=!1),"XZ"===i.name&&Math.abs(KE.copy(sb).applyQuaternion(t).dot(this.eye))<n&&(i.scale.set(1e-10,1e-10,1e-10),i.visible=!1)}else"rotate"===this.mode&&(eb.copy(t),KE.copy(this.eye).applyQuaternion(OE.copy(t).invert()),-1!==i.name.search("E")&&i.quaternion.setFromRotationMatrix($E.lookAt(this.eye,ZE,sb)),"X"===i.name&&(OE.setFromAxisAngle(rb,Math.atan2(-KE.y,KE.z)),OE.multiplyQuaternions(eb,OE),i.quaternion.copy(OE)),"Y"===i.name&&(OE.setFromAxisAngle(sb,Math.atan2(KE.x,KE.z)),OE.multiplyQuaternions(eb,OE),i.quaternion.copy(OE)),"Z"===i.name&&(OE.setFromAxisAngle(ob,Math.atan2(KE.y,KE.x)),OE.multiplyQuaternions(eb,OE),i.quaternion.copy(OE)));i.visible=i.visible&&(-1===i.name.indexOf("X")||this.showX),i.visible=i.visible&&(-1===i.name.indexOf("Y")||this.showY),i.visible=i.visible&&(-1===i.name.indexOf("Z")||this.showZ),i.visible=i.visible&&(-1===i.name.indexOf("E")||this.showX&&this.showY&&this.showZ),i.material._color=i.material._color||i.material.color.clone(),i.material._opacity=i.material._opacity||i.material.opacity,i.material.color.copy(i.material._color),i.material.opacity=i.material._opacity,this.enabled&&this.axis&&(i.name===this.axis||this.axis.split("").some((function(e){return i.name===e})))&&(i.material.color.setHex(16776960),i.material.opacity=1)}else i.visible=!1,"AXIS"===i.name?(i.visible=!!this.axis,"X"===this.axis&&(OE.setFromEuler(JE.set(0,0,0)),i.quaternion.copy(t).multiply(OE),Math.abs(KE.copy(rb).applyQuaternion(t).dot(this.eye))>.9&&(i.visible=!1)),"Y"===this.axis&&(OE.setFromEuler(JE.set(0,0,Math.PI/2)),i.quaternion.copy(t).multiply(OE),Math.abs(KE.copy(sb).applyQuaternion(t).dot(this.eye))>.9&&(i.visible=!1)),"Z"===this.axis&&(OE.setFromEuler(JE.set(0,Math.PI/2,0)),i.quaternion.copy(t).multiply(OE),Math.abs(KE.copy(ob).applyQuaternion(t).dot(this.eye))>.9&&(i.visible=!1)),"XYZE"===this.axis&&(OE.setFromEuler(JE.set(0,Math.PI/2,0)),KE.copy(this.rotationAxis),i.quaternion.setFromRotationMatrix($E.lookAt(ZE,KE,sb)),i.quaternion.multiply(OE),i.visible=this.dragging),"E"===this.axis&&(i.visible=!1)):"START"===i.name?(i.position.copy(this.worldPositionStart),i.visible=this.dragging):"END"===i.name?(i.position.copy(this.worldPosition),i.visible=this.dragging):"DELTA"===i.name?(i.position.copy(this.worldPositionStart),i.quaternion.copy(this.worldQuaternionStart),kE.set(1e-10,1e-10,1e-10).add(this.worldPositionStart).sub(this.worldPosition).multiplyScalar(-1),kE.applyQuaternion(this.worldQuaternionStart.clone().invert()),i.scale.copy(kE),i.visible=this.dragging):(i.quaternion.copy(t),this.dragging?i.position.copy(this.worldPositionStart):i.position.copy(this.worldPosition),this.axis&&(i.visible=-1!==this.axis.search(i.name)))}super.updateMatrixWorld(e)}}class db extends ga{constructor(){super(new Vh(1e5,1e5,2,2),new Do({visible:!1,wireframe:!0,side:je,transparent:!0,opacity:.1,toneMapped:!1})),this.isTransformControlsPlane=!0,this.type="TransformControlsPlane"}updateMatrixWorld(e){let t=this.space;switch(this.position.copy(this.worldPosition),"scale"===this.mode&&(t="local"),ab.copy(rb).applyQuaternion("local"===t?this.worldQuaternion:tb),lb.copy(sb).applyQuaternion("local"===t?this.worldQuaternion:tb),cb.copy(ob).applyQuaternion("local"===t?this.worldQuaternion:tb),KE.copy(lb),this.mode){case"translate":case"scale":switch(this.axis){case"X":KE.copy(this.eye).cross(ab),nb.copy(ab).cross(KE);break;case"Y":KE.copy(this.eye).cross(lb),nb.copy(lb).cross(KE);break;case"Z":KE.copy(this.eye).cross(cb),nb.copy(cb).cross(KE);break;case"XY":nb.copy(cb);break;case"YZ":nb.copy(ab);break;case"XZ":KE.copy(cb),nb.copy(lb);break;case"XYZ":case"E":nb.set(0,0,0)}break;default:nb.set(0,0,0)}0===nb.length()?this.quaternion.copy(this.cameraQuaternion):(ib.lookAt(kE.set(0,0,0),nb,KE),this.quaternion.setFromRotationMatrix(ib)),super.updateMatrixWorld(e)}}const pb={POSITION:["byte","byte normalized","unsigned byte","unsigned byte normalized","short","short normalized","unsigned short","unsigned short normalized"],NORMAL:["byte normalized","short normalized"],TANGENT:["byte normalized","short normalized"],TEXCOORD:["byte","byte normalized","unsigned byte","short","short normalized","unsigned short"]};class fb{constructor(){this.textureUtils=null,this.pluginCallbacks=[],this.register((function(e){return new Bb(e)})),this.register((function(e){return new Rb(e)})),this.register((function(e){return new Ub(e)})),this.register((function(e){return new kb(e)})),this.register((function(e){return new Nb(e)})),this.register((function(e){return new Ob(e)})),this.register((function(e){return new Lb(e)})),this.register((function(e){return new Db(e)})),this.register((function(e){return new Pb(e)})),this.register((function(e){return new Fb(e)})),this.register((function(e){return new Qb(e)})),this.register((function(e){return new zb(e)})),this.register((function(e){return new Gb(e)})),this.register((function(e){return new Hb(e)}))}register(e){return-1===this.pluginCallbacks.indexOf(e)&&this.pluginCallbacks.push(e),this}unregister(e){return-1!==this.pluginCallbacks.indexOf(e)&&this.pluginCallbacks.splice(this.pluginCallbacks.indexOf(e),1),this}setTextureUtils(e){return this.textureUtils=e,this}parse(e,t,n,i){const r=new Tb,s=[];for(let e=0,t=this.pluginCallbacks.length;e<t;e++)s.push(this.pluginCallbacks[e](r));r.setPlugins(s),r.setTextureUtils(this.textureUtils),r.writeAsync(e,t,i).catch(n)}parseAsync(e,t){const n=this;return new Promise((function(i,r){n.parse(e,i,r,t)}))}}const mb=5120,Ab=5121,gb=5122,vb=5123,yb=34962,Eb="KHR_mesh_quantization",bb={};bb[Xt]=9728,bb[Yt]=9984,bb[Kt]=9986,bb[$t]=9729,bb[en]=9985,bb[nn]=9987,bb[Wt]=33071,bb[jt]=10497,bb[qt]=33648;const xb={scale:"scale",position:"translation",quaternion:"rotation",morphTargetInfluences:"weights"},Cb=new To;function wb(e,t){return e.length===t.length&&e.every((function(e,n){return e===t[n]}))}function _b(e){return 4*Math.ceil(e/4)}function Mb(e,t=0){const n=_b(e.byteLength);if(n!==e.byteLength){const i=new Uint8Array(n);if(i.set(new Uint8Array(e)),0!==t)for(let r=e.byteLength;r<n;r++)i[r]=t;return i.buffer}return e}function Ib(){return"undefined"==typeof document&&"undefined"!=typeof OffscreenCanvas?new OffscreenCanvas(1,1):document.createElement("canvas")}function Sb(e,t){if(void 0!==e.toBlob)return new Promise((n=>e.toBlob(n,t)));let n;return"image/jpeg"===t?n=.92:"image/webp"===t&&(n=.8),e.convertToBlob({type:t,quality:n})}class Tb{constructor(){this.plugins=[],this.options={},this.pending=[],this.buffers=[],this.byteOffset=0,this.buffers=[],this.nodeMap=new Map,this.skins=[],this.extensionsUsed={},this.extensionsRequired={},this.uids=new Map,this.uid=0,this.json={asset:{version:"2.0",generator:"THREE.GLTFExporter r"+Le}},this.cache={meshes:new Map,attributes:new Map,attributesNormalized:new Map,materials:new Map,textures:new Map,images:new Map},this.textureUtils=null}setPlugins(e){this.plugins=e}setTextureUtils(e){this.textureUtils=e}async writeAsync(e,t,n={}){this.options=Object.assign({binary:!1,trs:!1,onlyVisible:!0,maxTextureSize:1/0,animations:[],includeCustomExtensions:!1},n),this.options.animations.length>0&&(this.options.trs=!0),await this.processInputAsync(e),await Promise.all(this.pending);const i=this,r=i.buffers,s=i.json;n=i.options;const o=i.extensionsUsed,a=i.extensionsRequired,l=new Blob(r,{type:"application/octet-stream"}),c=Object.keys(o),h=Object.keys(a);if(c.length>0&&(s.extensionsUsed=c),h.length>0&&(s.extensionsRequired=h),s.buffers&&s.buffers.length>0&&(s.buffers[0].byteLength=l.size),!0===n.binary){const e=new FileReader;e.readAsArrayBuffer(l),e.onloadend=function(){const n=Mb(e.result),i=new DataView(new ArrayBuffer(8));i.setUint32(0,n.byteLength,!0),i.setUint32(4,5130562,!0);const r=Mb((o=JSON.stringify(s),(new TextEncoder).encode(o).buffer),32);var o;const a=new DataView(new ArrayBuffer(8));a.setUint32(0,r.byteLength,!0),a.setUint32(4,1313821514,!0);const l=new ArrayBuffer(12),c=new DataView(l);c.setUint32(0,1179937895,!0),c.setUint32(4,2,!0);const h=12+a.byteLength+r.byteLength+i.byteLength+n.byteLength;c.setUint32(8,h,!0);const u=new Blob([l,a,r,i,n],{type:"application/octet-stream"}),d=new FileReader;d.readAsArrayBuffer(u),d.onloadend=function(){t(d.result)}}}else if(s.buffers&&s.buffers.length>0){const e=new FileReader;e.readAsDataURL(l),e.onloadend=function(){const n=e.result;s.buffers[0].uri=n,t(s)}}else t(s)}serializeUserData(e,t){if(0===Object.keys(e.userData).length)return;const n=this.options,i=this.extensionsUsed;try{const r=JSON.parse(JSON.stringify(e.userData));if(n.includeCustomExtensions&&r.gltfExtensions){void 0===t.extensions&&(t.extensions={});for(const e in r.gltfExtensions)t.extensions[e]=r.gltfExtensions[e],i[e]=!0;delete r.gltfExtensions}Object.keys(r).length>0&&(t.extras=r)}catch(t){console.warn("THREE.GLTFExporter: userData of '"+e.name+"' won't be serialized because of JSON.stringify error - "+t.message)}}getUID(e,t=!1){if(!1===this.uids.has(e)){const t=new Map;t.set(!0,this.uid++),t.set(!1,this.uid++),this.uids.set(e,t)}return this.uids.get(e).get(t)}isNormalizedNormalAttribute(e){if(this.cache.attributesNormalized.has(e))return!1;const t=new os;for(let n=0,i=e.count;n<i;n++)if(Math.abs(t.fromBufferAttribute(e,n).length()-1)>5e-4)return!1;return!0}createNormalizedNormalAttribute(e){const t=this.cache;if(t.attributesNormalized.has(e))return t.attributesNormalized.get(e);const n=e.clone(),i=new os;for(let e=0,t=n.count;e<t;e++)i.fromBufferAttribute(n,e),0===i.x&&0===i.y&&0===i.z?i.setX(1):i.normalize(),n.setXYZ(e,i.x,i.y,i.z);return t.attributesNormalized.set(e,n),n}applyTextureTransform(e,t){let n=!1;const i={};0===t.offset.x&&0===t.offset.y||(i.offset=t.offset.toArray(),n=!0),0!==t.rotation&&(i.rotation=t.rotation,n=!0),1===t.repeat.x&&1===t.repeat.y||(i.scale=t.repeat.toArray(),n=!0),n&&(e.extensions=e.extensions||{},e.extensions.KHR_texture_transform=i,this.extensionsUsed.KHR_texture_transform=!0)}async buildMetalRoughTextureAsync(e,t){if(e===t)return e;function n(e){return e.colorSpace===Ti?function(e){return e<.04045?.0773993808*e:Math.pow(.9478672986*e+.0521327014,2.4)}:function(e){return e}}e instanceof Ic&&(e=await this.decompressTextureAsync(e)),t instanceof Ic&&(t=await this.decompressTextureAsync(t));const i=e?e.image:null,r=t?t.image:null,s=Math.max(i?i.width:0,r?r.width:0),o=Math.max(i?i.height:0,r?r.height:0),a=Ib();a.width=s,a.height=o;const l=a.getContext("2d",{willReadFrequently:!0});l.fillStyle="#00ffff",l.fillRect(0,0,s,o);const c=l.getImageData(0,0,s,o);if(i){l.drawImage(i,0,0,s,o);const t=n(e),r=l.getImageData(0,0,s,o).data;for(let e=2;e<r.length;e+=4)c.data[e]=256*t(r[e]/256)}if(r){l.drawImage(r,0,0,s,o);const e=n(t),i=l.getImageData(0,0,s,o).data;for(let t=1;t<i.length;t+=4)c.data[t]=256*e(i[t]/256)}l.putImageData(c,0,0);const h=(e||t).clone();return h.source=new Xr(a),h.colorSpace=Si,h.channel=(e||t).channel,e&&t&&e.channel!==t.channel&&console.warn("THREE.GLTFExporter: UV channels for metalnessMap and roughnessMap textures must match."),console.warn("THREE.GLTFExporter: Merged metalnessMap and roughnessMap textures."),h}async decompressTextureAsync(e,t=1/0){if(null===this.textureUtils)throw new Error("THREE.GLTFExporter: setTextureUtils() must be called to process compressed textures.");return await this.textureUtils.decompress(e,t)}processBuffer(e){const t=this.json,n=this.buffers;return t.buffers||(t.buffers=[{byteLength:0}]),n.push(e),0}processBufferView(e,t,n,i,r){const s=this.json;let o;switch(s.bufferViews||(s.bufferViews=[]),t){case mb:case Ab:o=1;break;case gb:case vb:o=2;break;default:o=4}let a=e.itemSize*o;r===yb&&(a=4*Math.ceil(a/4));const l=_b(i*a),c=new DataView(new ArrayBuffer(l));let h=0;for(let r=n;r<n+i;r++){for(let n=0;n<e.itemSize;n++){let i;e.itemSize>4?i=e.array[r*e.itemSize+n]:(0===n?i=e.getX(r):1===n?i=e.getY(r):2===n?i=e.getZ(r):3===n&&(i=e.getW(r)),!0===e.normalized&&(i=Sr.normalize(i,e.array))),5126===t?c.setFloat32(h,i,!0):5124===t?c.setInt32(h,i,!0):5125===t?c.setUint32(h,i,!0):t===gb?c.setInt16(h,i,!0):t===vb?c.setUint16(h,i,!0):t===mb?c.setInt8(h,i):t===Ab&&c.setUint8(h,i),h+=o}h%a!=0&&(h+=a-h%a)}const u={buffer:this.processBuffer(c.buffer),byteOffset:this.byteOffset,byteLength:l};return void 0!==r&&(u.target=r),r===yb&&(u.byteStride=a),this.byteOffset+=l,s.bufferViews.push(u),{id:s.bufferViews.length-1,byteLength:0}}processBufferViewImage(e){const t=this,n=t.json;return n.bufferViews||(n.bufferViews=[]),new Promise((function(i){const r=new FileReader;r.readAsArrayBuffer(e),r.onloadend=function(){const e=Mb(r.result),s={buffer:t.processBuffer(e),byteOffset:t.byteOffset,byteLength:e.byteLength};t.byteOffset+=e.byteLength,i(n.bufferViews.push(s)-1)}}))}processAccessor(e,t,n,i){const r=this.json;let s;if(e.array.constructor===Float32Array)s=5126;else if(e.array.constructor===Int32Array)s=5124;else if(e.array.constructor===Uint32Array)s=5125;else if(e.array.constructor===Int16Array)s=gb;else if(e.array.constructor===Uint16Array)s=vb;else if(e.array.constructor===Int8Array)s=mb;else{if(e.array.constructor!==Uint8Array)throw new Error("THREE.GLTFExporter: Unsupported bufferAttribute component type: "+e.array.constructor.name);s=Ab}if(void 0===n&&(n=0),void 0!==i&&i!==1/0||(i=e.count),0===i)return null;const o=function(e,t,n){const i={min:new Array(e.itemSize).fill(Number.POSITIVE_INFINITY),max:new Array(e.itemSize).fill(Number.NEGATIVE_INFINITY)};for(let r=t;r<t+n;r++)for(let t=0;t<e.itemSize;t++){let n;e.itemSize>4?n=e.array[r*e.itemSize+t]:(0===t?n=e.getX(r):1===t?n=e.getY(r):2===t?n=e.getZ(r):3===t&&(n=e.getW(r)),!0===e.normalized&&(n=Sr.normalize(n,e.array))),i.min[t]=Math.min(i.min[t],n),i.max[t]=Math.max(i.max[t],n)}return i}(e,n,i);let a;void 0!==t&&(a=e===t.index?34963:yb);const l=this.processBufferView(e,s,n,i,a),c={bufferView:l.id,byteOffset:l.byteOffset,componentType:s,count:i,max:o.max,min:o.min,type:{1:"SCALAR",2:"VEC2",3:"VEC3",4:"VEC4",9:"MAT3",16:"MAT4"}[e.itemSize]};return!0===e.normalized&&(c.normalized=!0),r.accessors||(r.accessors=[]),r.accessors.push(c)-1}processImage(e,t,n,i="image/png"){if(null!==e){const r=this,s=r.cache,o=r.json,a=r.options,l=r.pending;s.images.has(e)||s.images.set(e,{});const c=s.images.get(e),h=i+":flipY/"+n.toString();if(void 0!==c[h])return c[h];o.images||(o.images=[]);const u={mimeType:i},d=Ib();d.width=Math.min(e.width,a.maxTextureSize),d.height=Math.min(e.height,a.maxTextureSize);const p=d.getContext("2d",{willReadFrequently:!0});if(!0===n&&(p.translate(0,d.height),p.scale(1,-1)),void 0!==e.data){t!==yn&&console.error("GLTFExporter: Only RGBAFormat is supported.",t),(e.width>a.maxTextureSize||e.height>a.maxTextureSize)&&console.warn("GLTFExporter: Image size is bigger than maxTextureSize",e);const n=new Uint8ClampedArray(e.height*e.width*4);for(let t=0;t<n.length;t+=4)n[t+0]=e.data[t+0],n[t+1]=e.data[t+1],n[t+2]=e.data[t+2],n[t+3]=e.data[t+3];p.putImageData(new ImageData(n,e.width,e.height),0,0)}else{if(!("undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&e instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&e instanceof ImageBitmap||"undefined"!=typeof OffscreenCanvas&&e instanceof OffscreenCanvas))throw new Error("THREE.GLTFExporter: Invalid image type. Use HTMLImageElement, HTMLCanvasElement, ImageBitmap or OffscreenCanvas.");p.drawImage(e,0,0,d.width,d.height)}!0===a.binary?l.push(Sb(d,i).then((e=>r.processBufferViewImage(e))).then((e=>{u.bufferView=e}))):void 0!==d.toDataURL?u.uri=d.toDataURL(i):l.push(Sb(d,i).then((e=>(new FileReader).readAsDataURL(e))).then((e=>{u.uri=e})));const f=o.images.push(u)-1;return c[h]=f,f}throw new Error("THREE.GLTFExporter: No valid image data found. Unable to process texture.")}processSampler(e){const t=this.json;t.samplers||(t.samplers=[]);const n={magFilter:bb[e.magFilter],minFilter:bb[e.minFilter],wrapS:bb[e.wrapS],wrapT:bb[e.wrapT]};return t.samplers.push(n)-1}async processTextureAsync(e){const t=this.options,n=this.cache,i=this.json;if(n.textures.has(e))return n.textures.get(e);i.textures||(i.textures=[]),e instanceof Ic&&(e=await this.decompressTextureAsync(e,t.maxTextureSize));let r=e.userData.mimeType;"image/webp"===r&&(r="image/png");const s={sampler:this.processSampler(e),source:this.processImage(e.image,e.format,e.flipY,r)};e.name&&(s.name=e.name),await this._invokeAllAsync((async function(t){t.writeTexture&&await t.writeTexture(e,s)}));const o=i.textures.push(s)-1;return n.textures.set(e,o),o}async processMaterialAsync(e){const t=this.cache,n=this.json;if(t.materials.has(e))return t.materials.get(e);if(e.isShaderMaterial)return console.warn("GLTFExporter: THREE.ShaderMaterial not supported."),null;n.materials||(n.materials=[]);const i={pbrMetallicRoughness:{}};!0!==e.isMeshStandardMaterial&&!0!==e.isMeshBasicMaterial&&console.warn("GLTFExporter: Use MeshStandardMaterial or MeshBasicMaterial for best results.");const r=e.color.toArray().concat([e.opacity]);if(wb(r,[1,1,1,1])||(i.pbrMetallicRoughness.baseColorFactor=r),e.isMeshStandardMaterial?(i.pbrMetallicRoughness.metallicFactor=e.metalness,i.pbrMetallicRoughness.roughnessFactor=e.roughness):(i.pbrMetallicRoughness.metallicFactor=0,i.pbrMetallicRoughness.roughnessFactor=1),e.metalnessMap||e.roughnessMap){const t=await this.buildMetalRoughTextureAsync(e.metalnessMap,e.roughnessMap),n={index:await this.processTextureAsync(t),texCoord:t.channel};this.applyTextureTransform(n,t),i.pbrMetallicRoughness.metallicRoughnessTexture=n}if(e.map){const t={index:await this.processTextureAsync(e.map),texCoord:e.map.channel};this.applyTextureTransform(t,e.map),i.pbrMetallicRoughness.baseColorTexture=t}if(e.emissive){const t=e.emissive;if(Math.max(t.r,t.g,t.b)>0&&(i.emissiveFactor=e.emissive.toArray()),e.emissiveMap){const t={index:await this.processTextureAsync(e.emissiveMap),texCoord:e.emissiveMap.channel};this.applyTextureTransform(t,e.emissiveMap),i.emissiveTexture=t}}if(e.normalMap){const t={index:await this.processTextureAsync(e.normalMap),texCoord:e.normalMap.channel};e.normalScale&&1!==e.normalScale.x&&(t.scale=e.normalScale.x),this.applyTextureTransform(t,e.normalMap),i.normalTexture=t}if(e.aoMap){const t={index:await this.processTextureAsync(e.aoMap),texCoord:e.aoMap.channel};1!==e.aoMapIntensity&&(t.strength=e.aoMapIntensity),this.applyTextureTransform(t,e.aoMap),i.occlusionTexture=t}e.transparent?i.alphaMode="BLEND":e.alphaTest>0&&(i.alphaMode="MASK",i.alphaCutoff=e.alphaTest),e.side===je&&(i.doubleSided=!0),""!==e.name&&(i.name=e.name),this.serializeUserData(e,i),await this._invokeAllAsync((async function(t){t.writeMaterialAsync&&await t.writeMaterialAsync(e,i)}));const s=n.materials.push(i)-1;return t.materials.set(e,s),s}async processMeshAsync(e){const t=this.cache,n=this.json,i=[e.geometry.uuid];if(Array.isArray(e.material))for(let t=0,n=e.material.length;t<n;t++)i.push(e.material[t].uuid);else i.push(e.material.uuid);const r=i.join(":");if(t.meshes.has(r))return t.meshes.get(r);const s=e.geometry;let o;o=e.isLineSegments?1:e.isLineLoop?2:e.isLine?3:e.isPoints?0:e.material.wireframe?1:4;const a={},l={},c=[],h=[],u={uv:"TEXCOORD_0",uv1:"TEXCOORD_1",uv2:"TEXCOORD_2",uv3:"TEXCOORD_3",color:"COLOR_0",skinWeight:"WEIGHTS_0",skinIndex:"JOINTS_0"},d=s.getAttribute("normal");void 0===d||this.isNormalizedNormalAttribute(d)||(console.warn("THREE.GLTFExporter: Creating normalized normal attribute from the non-normalized one."),s.setAttribute("normal",this.createNormalizedNormalAttribute(d)));let p=null;for(let e in s.attributes){if("morph"===e.slice(0,5))continue;const n=s.attributes[e];if(e=u[e]||e.toUpperCase(),/^(POSITION|NORMAL|TANGENT|TEXCOORD_\d+|COLOR_\d+|JOINTS_\d+|WEIGHTS_\d+)$/.test(e)||(e="_"+e),t.attributes.has(this.getUID(n))){l[e]=t.attributes.get(this.getUID(n));continue}p=null;const i=n.array;"JOINTS_0"!==e||i instanceof Uint16Array||i instanceof Uint8Array?(i instanceof Uint32Array||i instanceof Int32Array)&&!e.startsWith("_")&&(console.warn(`GLTFExporter: Attribute "${e}" converted to type FLOAT.`),p=fb.Utils.toFloat32BufferAttribute(n)):(console.warn('GLTFExporter: Attribute "skinIndex" converted to type UNSIGNED_SHORT.'),p=new Go(new Uint16Array(i),n.itemSize,n.normalized));const r=this.processAccessor(p||n,s);null!==r&&(e.startsWith("_")||this.detectMeshQuantization(e,n),l[e]=r,t.attributes.set(this.getUID(n),r))}if(void 0!==d&&s.setAttribute("normal",d),0===Object.keys(l).length)return null;if(void 0!==e.morphTargetInfluences&&e.morphTargetInfluences.length>0){const n=[],i=[],r={};if(void 0!==e.morphTargetDictionary)for(const t in e.morphTargetDictionary)r[e.morphTargetDictionary[t]]=t;for(let o=0;o<e.morphTargetInfluences.length;++o){const a={};let l=!1;for(const e in s.morphAttributes){if("position"!==e&&"normal"!==e){l||(console.warn("GLTFExporter: Only POSITION and NORMAL morph are supported."),l=!0);continue}const n=s.morphAttributes[e][o],i=e.toUpperCase(),r=s.attributes[e];if(t.attributes.has(this.getUID(n,!0))){a[i]=t.attributes.get(this.getUID(n,!0));continue}const c=n.clone();if(!s.morphTargetsRelative)for(let e=0,t=n.count;e<t;e++)for(let t=0;t<n.itemSize;t++)0===t&&c.setX(e,n.getX(e)-r.getX(e)),1===t&&c.setY(e,n.getY(e)-r.getY(e)),2===t&&c.setZ(e,n.getZ(e)-r.getZ(e)),3===t&&c.setW(e,n.getW(e)-r.getW(e));a[i]=this.processAccessor(c,s),t.attributes.set(this.getUID(r,!0),a[i])}h.push(a),n.push(e.morphTargetInfluences[o]),void 0!==e.morphTargetDictionary&&i.push(r[o])}a.weights=n,i.length>0&&(a.extras={},a.extras.targetNames=i)}const f=Array.isArray(e.material);if(f&&0===s.groups.length)return null;let m=!1;if(f&&null===s.index){const e=[];for(let t=0,n=s.attributes.position.count;t<n;t++)e[t]=t;s.setIndex(e),m=!0}const A=f?e.material:[e.material],g=f?s.groups:[{materialIndex:0,start:void 0,count:void 0}];for(let e=0,n=g.length;e<n;e++){const n={mode:o,attributes:l};if(this.serializeUserData(s,n),h.length>0&&(n.targets=h),null!==s.index){let i=this.getUID(s.index);void 0===g[e].start&&void 0===g[e].count||(i+=":"+g[e].start+":"+g[e].count),t.attributes.has(i)?n.indices=t.attributes.get(i):(n.indices=this.processAccessor(s.index,s,g[e].start,g[e].count),t.attributes.set(i,n.indices)),null===n.indices&&delete n.indices}const i=await this.processMaterialAsync(A[g[e].materialIndex]);null!==i&&(n.material=i),c.push(n)}!0===m&&s.setIndex(null),a.primitives=c,n.meshes||(n.meshes=[]),await this._invokeAllAsync((function(t){t.writeMesh&&t.writeMesh(e,a)}));const v=n.meshes.push(a)-1;return t.meshes.set(r,v),v}detectMeshQuantization(e,t){if(this.extensionsUsed[Eb])return;let n;switch(t.array.constructor){case Int8Array:n="byte";break;case Uint8Array:n="unsigned byte";break;case Int16Array:n="short";break;case Uint16Array:n="unsigned short";break;default:return}t.normalized&&(n+=" normalized");const i=e.split("_",1)[0];pb[i]&&pb[i].includes(n)&&(this.extensionsUsed[Eb]=!0,this.extensionsRequired[Eb]=!0)}processCamera(e){const t=this.json;t.cameras||(t.cameras=[]);const n=e.isOrthographicCamera,i={type:n?"orthographic":"perspective"};return n?i.orthographic={xmag:2*e.right,ymag:2*e.top,zfar:e.far<=0?.001:e.far,znear:e.near<0?0:e.near}:i.perspective={aspectRatio:e.aspect,yfov:Sr.degToRad(e.fov),zfar:e.far<=0?.001:e.far,znear:e.near<0?0:e.near},""!==e.name&&(i.name=e.type),t.cameras.push(i)-1}processAnimation(e,t){const n=this.json,i=this.nodeMap;n.animations||(n.animations=[]);const r=(e=fb.Utils.mergeMorphTargetTracks(e.clone(),t)).tracks,s=[],o=[];for(let e=0;e<r.length;++e){const n=r[e],a=Jd.parseTrackName(n.name);let l=Jd.findNode(t,a.nodeName);const c=xb[a.propertyName];if("bones"===a.objectName&&(l=!0===l.isSkinnedMesh?l.skeleton.getBoneByName(a.objectIndex):void 0),!l||!c){console.warn('THREE.GLTFExporter: Could not export animation track "%s".',n.name);continue}const h=1;let u,d=n.values.length/n.times.length;c===xb.morphTargetInfluences&&(d/=l.morphTargetInfluences.length),!0===n.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline?(u="CUBICSPLINE",d/=3):u=n.getInterpolation()===ui?"STEP":"LINEAR",o.push({input:this.processAccessor(new Go(n.times,h)),output:this.processAccessor(new Go(n.values,d)),interpolation:u}),s.push({sampler:o.length-1,target:{node:i.get(l),path:c}})}return n.animations.push({name:e.name||"clip_"+n.animations.length,samplers:o,channels:s}),n.animations.length-1}processSkin(e){const t=this.json,n=this.nodeMap,i=t.nodes[n.get(e)],r=e.skeleton;if(void 0===r)return null;const s=e.skeleton.bones[0];if(void 0===s)return null;const o=[],a=new Float32Array(16*r.bones.length),l=new ks;for(let t=0;t<r.bones.length;++t)o.push(n.get(r.bones[t])),l.copy(r.boneInverses[t]),l.multiply(e.bindMatrix).toArray(a,16*t);return void 0===t.skins&&(t.skins=[]),t.skins.push({inverseBindMatrices:this.processAccessor(new Go(a,16)),joints:o,skeleton:n.get(s)}),i.skin=t.skins.length-1}async processNodeAsync(e){const t=this.json,n=this.options,i=this.nodeMap;t.nodes||(t.nodes=[]);const r={};if(n.trs){const t=e.quaternion.toArray(),n=e.position.toArray(),i=e.scale.toArray();wb(t,[0,0,0,1])||(r.rotation=t),wb(n,[0,0,0])||(r.translation=n),wb(i,[1,1,1])||(r.scale=i)}else e.matrixAutoUpdate&&e.updateMatrix(),!1===function(e){return wb(e.elements,[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1])}(e.matrix)&&(r.matrix=e.matrix.elements);if(""!==e.name&&(r.name=String(e.name)),this.serializeUserData(e,r),e.isMesh||e.isLine||e.isPoints){const t=await this.processMeshAsync(e);null!==t&&(r.mesh=t)}else e.isCamera&&(r.camera=this.processCamera(e));if(e.isSkinnedMesh&&this.skins.push(e),e.children.length>0){const t=[];for(let i=0,r=e.children.length;i<r;i++){const r=e.children[i];if(r.visible||!1===n.onlyVisible){const e=await this.processNodeAsync(r);null!==e&&t.push(e)}}t.length>0&&(r.children=t)}await this._invokeAllAsync((function(t){t.writeNode&&t.writeNode(e,r)}));const s=t.nodes.push(r)-1;return i.set(e,s),s}async processSceneAsync(e){const t=this.json,n=this.options;t.scenes||(t.scenes=[],t.scene=0);const i={};""!==e.name&&(i.name=e.name),t.scenes.push(i);const r=[];for(let t=0,i=e.children.length;t<i;t++){const i=e.children[t];if(i.visible||!1===n.onlyVisible){const e=await this.processNodeAsync(i);null!==e&&r.push(e)}}r.length>0&&(i.nodes=r),this.serializeUserData(e,i)}async processObjectsAsync(e){const t=new Fa;t.name="AuxScene";for(let n=0;n<e.length;n++)t.children.push(e[n]);await this.processSceneAsync(t)}async processInputAsync(e){const t=this.options;e=e instanceof Array?e:[e],await this._invokeAllAsync((function(t){t.beforeParse&&t.beforeParse(e)}));const n=[];for(let t=0;t<e.length;t++)e[t]instanceof Fa?await this.processSceneAsync(e[t]):n.push(e[t]);n.length>0&&await this.processObjectsAsync(n);for(let e=0;e<this.skins.length;++e)this.processSkin(this.skins[e]);for(let n=0;n<t.animations.length;++n)this.processAnimation(t.animations[n],e[0]);await this._invokeAllAsync((function(t){t.afterParse&&t.afterParse(e)}))}async _invokeAllAsync(e){for(let t=0,n=this.plugins.length;t<n;t++)await e(this.plugins[t])}}class Bb{constructor(e){this.writer=e,this.name="KHR_lights_punctual"}writeNode(e,t){if(!e.isLight)return;if(!e.isDirectionalLight&&!e.isPointLight&&!e.isSpotLight)return void console.warn("THREE.GLTFExporter: Only directional, point, and spot lights are supported.",e);const n=this.writer,i=n.json,r=n.extensionsUsed,s={};e.name&&(s.name=e.name),s.color=e.color.toArray(),s.intensity=e.intensity,e.isDirectionalLight?s.type="directional":e.isPointLight?(s.type="point",e.distance>0&&(s.range=e.distance)):e.isSpotLight&&(s.type="spot",e.distance>0&&(s.range=e.distance),s.spot={},s.spot.innerConeAngle=(1-e.penumbra)*e.angle,s.spot.outerConeAngle=e.angle),void 0!==e.decay&&2!==e.decay&&console.warn("THREE.GLTFExporter: Light decay may be lost. glTF is physically-based, and expects light.decay=2."),!e.target||e.target.parent===e&&0===e.target.position.x&&0===e.target.position.y&&-1===e.target.position.z||console.warn("THREE.GLTFExporter: Light direction may be lost. For best results, make light.target a child of the light with position 0,0,-1."),r[this.name]||(i.extensions=i.extensions||{},i.extensions[this.name]={lights:[]},r[this.name]=!0);const o=i.extensions[this.name].lights;o.push(s),t.extensions=t.extensions||{},t.extensions[this.name]={light:o.length-1}}}class Rb{constructor(e){this.writer=e,this.name="KHR_materials_unlit"}async writeMaterialAsync(e,t){if(!e.isMeshBasicMaterial)return;const n=this.writer.extensionsUsed;t.extensions=t.extensions||{},t.extensions[this.name]={},n[this.name]=!0,t.pbrMetallicRoughness.metallicFactor=0,t.pbrMetallicRoughness.roughnessFactor=.9}}class Lb{constructor(e){this.writer=e,this.name="KHR_materials_clearcoat"}async writeMaterialAsync(e,t){if(!e.isMeshPhysicalMaterial||0===e.clearcoat)return;const n=this.writer,i=n.extensionsUsed,r={};if(r.clearcoatFactor=e.clearcoat,e.clearcoatMap){const t={index:await n.processTextureAsync(e.clearcoatMap),texCoord:e.clearcoatMap.channel};n.applyTextureTransform(t,e.clearcoatMap),r.clearcoatTexture=t}if(r.clearcoatRoughnessFactor=e.clearcoatRoughness,e.clearcoatRoughnessMap){const t={index:await n.processTextureAsync(e.clearcoatRoughnessMap),texCoord:e.clearcoatRoughnessMap.channel};n.applyTextureTransform(t,e.clearcoatRoughnessMap),r.clearcoatRoughnessTexture=t}if(e.clearcoatNormalMap){const t={index:await n.processTextureAsync(e.clearcoatNormalMap),texCoord:e.clearcoatNormalMap.channel};1!==e.clearcoatNormalScale.x&&(t.scale=e.clearcoatNormalScale.x),n.applyTextureTransform(t,e.clearcoatNormalMap),r.clearcoatNormalTexture=t}t.extensions=t.extensions||{},t.extensions[this.name]=r,i[this.name]=!0}}class Db{constructor(e){this.writer=e,this.name="KHR_materials_dispersion"}async writeMaterialAsync(e,t){if(!e.isMeshPhysicalMaterial||0===e.dispersion)return;const n=this.writer.extensionsUsed,i={};i.dispersion=e.dispersion,t.extensions=t.extensions||{},t.extensions[this.name]=i,n[this.name]=!0}}class Pb{constructor(e){this.writer=e,this.name="KHR_materials_iridescence"}async writeMaterialAsync(e,t){if(!e.isMeshPhysicalMaterial||0===e.iridescence)return;const n=this.writer,i=n.extensionsUsed,r={};if(r.iridescenceFactor=e.iridescence,e.iridescenceMap){const t={index:await n.processTextureAsync(e.iridescenceMap),texCoord:e.iridescenceMap.channel};n.applyTextureTransform(t,e.iridescenceMap),r.iridescenceTexture=t}if(r.iridescenceIor=e.iridescenceIOR,r.iridescenceThicknessMinimum=e.iridescenceThicknessRange[0],r.iridescenceThicknessMaximum=e.iridescenceThicknessRange[1],e.iridescenceThicknessMap){const t={index:await n.processTextureAsync(e.iridescenceThicknessMap),texCoord:e.iridescenceThicknessMap.channel};n.applyTextureTransform(t,e.iridescenceThicknessMap),r.iridescenceThicknessTexture=t}t.extensions=t.extensions||{},t.extensions[this.name]=r,i[this.name]=!0}}class Ub{constructor(e){this.writer=e,this.name="KHR_materials_transmission"}async writeMaterialAsync(e,t){if(!e.isMeshPhysicalMaterial||0===e.transmission)return;const n=this.writer,i=n.extensionsUsed,r={};if(r.transmissionFactor=e.transmission,e.transmissionMap){const t={index:await n.processTextureAsync(e.transmissionMap),texCoord:e.transmissionMap.channel};n.applyTextureTransform(t,e.transmissionMap),r.transmissionTexture=t}t.extensions=t.extensions||{},t.extensions[this.name]=r,i[this.name]=!0}}class kb{constructor(e){this.writer=e,this.name="KHR_materials_volume"}async writeMaterialAsync(e,t){if(!e.isMeshPhysicalMaterial||0===e.transmission)return;const n=this.writer,i=n.extensionsUsed,r={};if(r.thicknessFactor=e.thickness,e.thicknessMap){const t={index:await n.processTextureAsync(e.thicknessMap),texCoord:e.thicknessMap.channel};n.applyTextureTransform(t,e.thicknessMap),r.thicknessTexture=t}e.attenuationDistance!==1/0&&(r.attenuationDistance=e.attenuationDistance),r.attenuationColor=e.attenuationColor.toArray(),t.extensions=t.extensions||{},t.extensions[this.name]=r,i[this.name]=!0}}class Nb{constructor(e){this.writer=e,this.name="KHR_materials_ior"}async writeMaterialAsync(e,t){if(!e.isMeshPhysicalMaterial||1.5===e.ior)return;const n=this.writer.extensionsUsed,i={};i.ior=e.ior,t.extensions=t.extensions||{},t.extensions[this.name]=i,n[this.name]=!0}}class Ob{constructor(e){this.writer=e,this.name="KHR_materials_specular"}async writeMaterialAsync(e,t){if(!e.isMeshPhysicalMaterial||1===e.specularIntensity&&e.specularColor.equals(Cb)&&!e.specularIntensityMap&&!e.specularColorMap)return;const n=this.writer,i=n.extensionsUsed,r={};if(e.specularIntensityMap){const t={index:await n.processTextureAsync(e.specularIntensityMap),texCoord:e.specularIntensityMap.channel};n.applyTextureTransform(t,e.specularIntensityMap),r.specularTexture=t}if(e.specularColorMap){const t={index:await n.processTextureAsync(e.specularColorMap),texCoord:e.specularColorMap.channel};n.applyTextureTransform(t,e.specularColorMap),r.specularColorTexture=t}r.specularFactor=e.specularIntensity,r.specularColorFactor=e.specularColor.toArray(),t.extensions=t.extensions||{},t.extensions[this.name]=r,i[this.name]=!0}}class Fb{constructor(e){this.writer=e,this.name="KHR_materials_sheen"}async writeMaterialAsync(e,t){if(!e.isMeshPhysicalMaterial||0==e.sheen)return;const n=this.writer,i=n.extensionsUsed,r={};if(e.sheenRoughnessMap){const t={index:await n.processTextureAsync(e.sheenRoughnessMap),texCoord:e.sheenRoughnessMap.channel};n.applyTextureTransform(t,e.sheenRoughnessMap),r.sheenRoughnessTexture=t}if(e.sheenColorMap){const t={index:await n.processTextureAsync(e.sheenColorMap),texCoord:e.sheenColorMap.channel};n.applyTextureTransform(t,e.sheenColorMap),r.sheenColorTexture=t}r.sheenRoughnessFactor=e.sheenRoughness,r.sheenColorFactor=e.sheenColor.toArray(),t.extensions=t.extensions||{},t.extensions[this.name]=r,i[this.name]=!0}}class Qb{constructor(e){this.writer=e,this.name="KHR_materials_anisotropy"}async writeMaterialAsync(e,t){if(!e.isMeshPhysicalMaterial||0==e.anisotropy)return;const n=this.writer,i=n.extensionsUsed,r={};if(e.anisotropyMap){const t={index:await n.processTextureAsync(e.anisotropyMap)};n.applyTextureTransform(t,e.anisotropyMap),r.anisotropyTexture=t}r.anisotropyStrength=e.anisotropy,r.anisotropyRotation=e.anisotropyRotation,t.extensions=t.extensions||{},t.extensions[this.name]=r,i[this.name]=!0}}class zb{constructor(e){this.writer=e,this.name="KHR_materials_emissive_strength"}async writeMaterialAsync(e,t){if(!e.isMeshStandardMaterial||1===e.emissiveIntensity)return;const n=this.writer.extensionsUsed,i={};i.emissiveStrength=e.emissiveIntensity,t.extensions=t.extensions||{},t.extensions[this.name]=i,n[this.name]=!0}}class Gb{constructor(e){this.writer=e,this.name="EXT_materials_bump"}async writeMaterialAsync(e,t){if(!e.isMeshStandardMaterial||1===e.bumpScale&&!e.bumpMap)return;const n=this.writer,i=n.extensionsUsed,r={};if(e.bumpMap){const t={index:await n.processTextureAsync(e.bumpMap),texCoord:e.bumpMap.channel};n.applyTextureTransform(t,e.bumpMap),r.bumpTexture=t}r.bumpFactor=e.bumpScale,t.extensions=t.extensions||{},t.extensions[this.name]=r,i[this.name]=!0}}class Hb{constructor(e){this.writer=e,this.name="EXT_mesh_gpu_instancing"}writeNode(e,t){if(!e.isInstancedMesh)return;const n=this.writer,i=e,r=new Float32Array(3*i.count),s=new Float32Array(4*i.count),o=new Float32Array(3*i.count),a=new ks,l=new os,c=new ss,h=new os;for(let e=0;e<i.count;e++)i.getMatrixAt(e,a),a.decompose(l,c,h),l.toArray(r,3*e),c.toArray(s,4*e),h.toArray(o,3*e);const u={TRANSLATION:n.processAccessor(new Go(r,3)),ROTATION:n.processAccessor(new Go(s,4)),SCALE:n.processAccessor(new Go(o,3))};i.instanceColor&&(u._COLOR_0=n.processAccessor(i.instanceColor)),t.extensions=t.extensions||{},t.extensions[this.name]={attributes:u},n.extensionsUsed[this.name]=!0,n.extensionsRequired[this.name]=!0}}fb.Utils={insertKeyframe:function(e,t){const n=.001,i=e.getValueSize(),r=new e.TimeBufferType(e.times.length+1),s=new e.ValueBufferType(e.values.length+i),o=e.createInterpolant(new e.ValueBufferType(i));let a;if(0===e.times.length){r[0]=t;for(let e=0;e<i;e++)s[e]=0;a=0}else if(t<e.times[0]){if(Math.abs(e.times[0]-t)<n)return 0;r[0]=t,r.set(e.times,1),s.set(o.evaluate(t),0),s.set(e.values,i),a=0}else if(t>e.times[e.times.length-1]){if(Math.abs(e.times[e.times.length-1]-t)<n)return e.times.length-1;r[r.length-1]=t,r.set(e.times,0),s.set(e.values,0),s.set(o.evaluate(t),e.values.length),a=r.length-1}else for(let l=0;l<e.times.length;l++){if(Math.abs(e.times[l]-t)<n)return l;if(e.times[l]<t&&e.times[l+1]>t){r.set(e.times.slice(0,l+1),0),r[l+1]=t,r.set(e.times.slice(l+1),l+2),s.set(e.values.slice(0,(l+1)*i),0),s.set(o.evaluate(t),(l+1)*i),s.set(e.values.slice((l+1)*i),(l+2)*i),a=l+1;break}}return e.times=r,e.values=s,a},mergeMorphTargetTracks:function(e,t){const n=[],i={},r=e.tracks;for(let e=0;e<r.length;++e){let s=r[e];const o=Jd.parseTrackName(s.name),a=Jd.findNode(t,o.nodeName);if("morphTargetInfluences"!==o.propertyName||void 0===o.propertyIndex){n.push(s);continue}if(s.createInterpolant!==s.InterpolantFactoryMethodDiscrete&&s.createInterpolant!==s.InterpolantFactoryMethodLinear){if(s.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline)throw new Error("THREE.GLTFExporter: Cannot merge tracks with glTF CUBICSPLINE interpolation.");console.warn("THREE.GLTFExporter: Morph target interpolation mode not yet supported. Using LINEAR instead."),s=s.clone(),s.setInterpolation(di)}const l=a.morphTargetInfluences.length,c=a.morphTargetDictionary[o.propertyIndex];if(void 0===c)throw new Error("THREE.GLTFExporter: Morph target name not found: "+o.propertyIndex);let h;if(void 0===i[a.uuid]){h=s.clone();const e=new h.ValueBufferType(l*h.times.length);for(let t=0;t<h.times.length;t++)e[t*l+c]=h.values[t];h.name=(o.nodeName||"")+".morphTargetInfluences",h.values=e,i[a.uuid]=h,n.push(h);continue}const u=s.createInterpolant(new s.ValueBufferType(1));h=i[a.uuid];for(let e=0;e<h.times.length;e++)h.values[e*l+c]=u.evaluate(h.times[e]);for(let e=0;e<s.times.length;e++){const t=this.insertKeyframe(h,s.times[e]);h.values[t*l+c]=s.values[e]}}return e.tracks=n,e},toFloat32BufferAttribute:function(e){const t=new Go(new Float32Array(e.count*e.itemSize),e.itemSize,!1);if(!e.normalized&&!e.isInterleavedBufferAttribute)return t.array.set(e.array),t;for(let n=0,i=e.count;n<i;n++)for(let i=0;i<e.itemSize;i++)t.setComponent(n,i,e.getComponent(n,i));return t}};var Vb=function(e){var t=this;this.object=e,this.object.rotation.reorder("YXZ"),this.enabled=!0,this.deviceOrientation={},this.screenOrientation=0,this.alphaOffset=0;var n,i,r,s,o=function(e){t.deviceOrientation=e},a=function(){t.screenOrientation=window.orientation||0},l=(n=new THREE.Vector3(0,0,1),i=new THREE.Euler,r=new THREE.Quaternion,s=new THREE.Quaternion(-Math.sqrt(.5),0,0,Math.sqrt(.5)),function(e,t,o,a,l){i.set(o,t,-a,"YXZ"),e.setFromEuler(i),e.multiply(s),e.multiply(r.setFromAxisAngle(n,-l))});this.connect=function(){a(),window.addEventListener("orientationchange",a,!1),window.addEventListener("deviceorientation",o,!1),t.enabled=!0},this.disconnect=function(){window.removeEventListener("orientationchange",a,!1),window.removeEventListener("deviceorientation",o,!1),t.enabled=!1},this.update=function(){if(!1!==t.enabled){var e=t.deviceOrientation;if(e){var n=e.alpha?THREE.MathUtils.degToRad(e.alpha)+t.alphaOffset:0,i=e.beta?THREE.MathUtils.degToRad(e.beta):0,r=e.gamma?THREE.MathUtils.degToRad(e.gamma):0,s=t.screenOrientation?THREE.MathUtils.degToRad(t.screenOrientation):0;l(t.object.quaternion,n,i,r,s)}}},this.dispose=function(){t.disconnect()},this.connect()},jb=globalThis.THREE={...e};jb.DeviceOrientationControls=Vb,jb.DRACOLoader=class extends ku{constructor(e){super(e),this.decoderPath="",this.decoderConfig={},this.decoderBinary=null,this.decoderPending=null,this.workerLimit=4,this.workerPool=[],this.workerNextTaskID=1,this.workerSourceURL="",this.defaultAttributeIDs={position:"POSITION",normal:"NORMAL",color:"COLOR",uv:"TEX_COORD"},this.defaultAttributeTypes={position:"Float32Array",normal:"Float32Array",color:"Float32Array",uv:"Float32Array"}}setDecoderPath(e){return this.decoderPath=e,this}setDecoderConfig(e){return this.decoderConfig=e,this}setWorkerLimit(e){return this.workerLimit=e,this}load(e,t,n,i){const r=new Fu(this.manager);r.setPath(this.path),r.setResponseType("arraybuffer"),r.setRequestHeader(this.requestHeader),r.setWithCredentials(this.withCredentials),r.load(e,(e=>{this.parse(e,t,i)}),n,i)}parse(e,t,n=()=>{}){this.decodeDracoFile(e,t,null,null,Ti,n).catch(n)}decodeDracoFile(e,t,n,i,r=Bi,s=()=>{}){const o={attributeIDs:n||this.defaultAttributeIDs,attributeTypes:i||this.defaultAttributeTypes,useUniqueIDs:!!n,vertexColorSpace:r};return this.decodeGeometry(e,o).then(t).catch(s)}decodeGeometry(e,t){const n=JSON.stringify(t);if(NA.has(e)){const t=NA.get(e);if(t.key===n)return t.promise;if(0===e.byteLength)throw new Error("THREE.DRACOLoader: Unable to re-decode a buffer with different settings. Buffer has already been transferred.")}let i;const r=this.workerNextTaskID++,s=e.byteLength,o=this._getWorker(r,s).then((n=>(i=n,new Promise(((n,s)=>{i._callbacks[r]={resolve:n,reject:s},i.postMessage({type:"decode",id:r,taskConfig:t,buffer:e},[e])}))))).then((e=>this._createGeometry(e.geometry)));return o.catch((()=>!0)).then((()=>{i&&r&&this._releaseTask(i,r)})),NA.set(e,{key:n,promise:o}),o}_createGeometry(e){const t=new sa;e.index&&t.setIndex(new Go(e.index.array,1));for(let n=0;n<e.attributes.length;n++){const i=e.attributes[n],r=i.name,s=i.array,o=i.itemSize,a=new Go(s,o);"color"===r&&(this._assignVertexColorSpace(a,i.vertexColorSpace),a.normalized=s instanceof Float32Array==0),t.setAttribute(r,a)}return t}_assignVertexColorSpace(e,t){if(t!==Ti)return;const n=new To;for(let t=0,i=e.count;t<i;t++)n.fromBufferAttribute(e,t),Gr.toWorkingColorSpace(n,Ti),e.setXYZ(t,n.r,n.g,n.b)}_loadLibrary(e,t){const n=new Fu(this.manager);return n.setPath(this.decoderPath),n.setResponseType(t),n.setWithCredentials(this.withCredentials),new Promise(((t,i)=>{n.load(e,t,void 0,i)}))}preload(){return this._initDecoder(),this}_initDecoder(){if(this.decoderPending)return this.decoderPending;const e="object"!=typeof WebAssembly||"js"===this.decoderConfig.type,t=[];return e?t.push(this._loadLibrary("draco_decoder.js","text")):(t.push(this._loadLibrary("draco_wasm_wrapper.js","text")),t.push(this._loadLibrary("draco_decoder.wasm","arraybuffer"))),this.decoderPending=Promise.all(t).then((t=>{const n=t[0];e||(this.decoderConfig.wasmBinary=t[1]);const i=OA.toString(),r=["/* draco decoder */",n,"","/* worker */",i.substring(i.indexOf("{")+1,i.lastIndexOf("}"))].join("\n");this.workerSourceURL=URL.createObjectURL(new Blob([r]))})),this.decoderPending}_getWorker(e,t){return this._initDecoder().then((()=>{if(this.workerPool.length<this.workerLimit){const e=new Worker(this.workerSourceURL);e._callbacks={},e._taskCosts={},e._taskLoad=0,e.postMessage({type:"init",decoderConfig:this.decoderConfig}),e.onmessage=function(t){const n=t.data;switch(n.type){case"decode":e._callbacks[n.id].resolve(n);break;case"error":e._callbacks[n.id].reject(n);break;default:console.error('THREE.DRACOLoader: Unexpected message, "'+n.type+'"')}},this.workerPool.push(e)}else this.workerPool.sort((function(e,t){return e._taskLoad>t._taskLoad?-1:1}));const n=this.workerPool[this.workerPool.length-1];return n._taskCosts[e]=t,n._taskLoad+=t,n}))}_releaseTask(e,t){e._taskLoad-=e._taskCosts[t],delete e._callbacks[t],delete e._taskCosts[t]}debug(){console.log("Task load: ",this.workerPool.map((e=>e._taskLoad)))}dispose(){for(let e=0;e<this.workerPool.length;++e)this.workerPool[e].terminate();return this.workerPool.length=0,""!==this.workerSourceURL&&URL.revokeObjectURL(this.workerSourceURL),this}},jb.GLTFLoader=class extends ku{constructor(e){super(e),this.dracoLoader=null,this.ktx2Loader=null,this.meshoptDecoder=null,this.pluginCallbacks=[],this.register((function(e){return new wg(e)})),this.register((function(e){return new _g(e)})),this.register((function(e){return new Pg(e)})),this.register((function(e){return new Ug(e)})),this.register((function(e){return new kg(e)})),this.register((function(e){return new Ig(e)})),this.register((function(e){return new Sg(e)})),this.register((function(e){return new Tg(e)})),this.register((function(e){return new Bg(e)})),this.register((function(e){return new Cg(e)})),this.register((function(e){return new Rg(e)})),this.register((function(e){return new Mg(e)})),this.register((function(e){return new Dg(e)})),this.register((function(e){return new Lg(e)})),this.register((function(e){return new bg(e)})),this.register((function(e){return new Ng(e)})),this.register((function(e){return new Og(e)}))}load(e,t,n,i){const r=this;let s;if(""!==this.resourcePath)s=this.resourcePath;else if(""!==this.path){const t=pd.extractUrlBase(e);s=pd.resolveURL(t,this.path)}else s=pd.extractUrlBase(e);this.manager.itemStart(e);const o=function(t){i?i(t):console.error(t),r.manager.itemError(e),r.manager.itemEnd(e)},a=new Fu(this.manager);a.setPath(this.path),a.setResponseType("arraybuffer"),a.setRequestHeader(this.requestHeader),a.setWithCredentials(this.withCredentials),a.load(e,(function(n){try{r.parse(n,s,(function(n){t(n),r.manager.itemEnd(e)}),o)}catch(e){o(e)}}),n,o)}setDRACOLoader(e){return this.dracoLoader=e,this}setKTX2Loader(e){return this.ktx2Loader=e,this}setMeshoptDecoder(e){return this.meshoptDecoder=e,this}register(e){return-1===this.pluginCallbacks.indexOf(e)&&this.pluginCallbacks.push(e),this}unregister(e){return-1!==this.pluginCallbacks.indexOf(e)&&this.pluginCallbacks.splice(this.pluginCallbacks.indexOf(e),1),this}parse(e,t,n,i){let r;const s={},o={},a=new TextDecoder;if("string"==typeof e)r=JSON.parse(e);else if(e instanceof ArrayBuffer)if(a.decode(new Uint8Array(e,0,4))===Fg){try{s[$A]=new Qg(e)}catch(e){return void(i&&i(e))}r=JSON.parse(s[$A].content)}else r=JSON.parse(a.decode(e));else r=e;if(void 0===r.asset||r.asset.version[0]<2)return void(i&&i(new Error("THREE.GLTFLoader: Unsupported asset. glTF versions >=2.0 are supported.")));const l=new cv(r,{path:t||this.resourcePath||"",crossOrigin:this.crossOrigin,requestHeader:this.requestHeader,manager:this.manager,ktx2Loader:this.ktx2Loader,meshoptDecoder:this.meshoptDecoder});l.fileLoader.setRequestHeader(this.requestHeader);for(let e=0;e<this.pluginCallbacks.length;e++){const t=this.pluginCallbacks[e](l);t.name||console.error("THREE.GLTFLoader: Invalid plugin found: missing name"),o[t.name]=t,s[t.name]=!0}if(r.extensionsUsed)for(let e=0;e<r.extensionsUsed.length;++e){const t=r.extensionsUsed[e],n=r.extensionsRequired||[];switch(t){case hg:s[t]=new xg;break;case eg:s[t]=new zg(r,this.dracoLoader);break;case pg:s[t]=new Gg;break;case fg:s[t]=new Hg;break;default:n.indexOf(t)>=0&&void 0===o[t]&&console.warn('THREE.GLTFLoader: Unknown extension "'+t+'".')}}l.setExtensions(s),l.setPlugins(o),l.parse(n,i)}parseAsync(e,t){const n=this;return new Promise((function(i,r){n.parse(e,t,i,r)}))}},jb.KTX2Loader=zv,jb.OBJLoader=xy,jb.MTLLoader=class extends ku{constructor(e){super(e)}load(e,t,n,i){const r=this,s=""===this.path?pd.extractUrlBase(e):this.path,o=new Fu(this.manager);o.setPath(this.path),o.setRequestHeader(this.requestHeader),o.setWithCredentials(this.withCredentials),o.load(e,(function(n){try{t(r.parse(n,s))}catch(t){i?i(t):console.error(t),r.manager.itemError(e)}}),n,i)}setMaterialOptions(e){return this.materialOptions=e,this}parse(e,t){const n=e.split("\n");let i={};const r=/\s+/,s={};for(let e=0;e<n.length;e++){let t=n[e];if(t=t.trim(),0===t.length||"#"===t.charAt(0))continue;const o=t.indexOf(" ");let a=o>=0?t.substring(0,o):t;a=a.toLowerCase();let l=o>=0?t.substring(o+1):"";if(l=l.trim(),"newmtl"===a)i={name:l},s[l]=i;else if("ka"===a||"kd"===a||"ks"===a||"ke"===a){const e=l.split(r,3);i[a]=[parseFloat(e[0]),parseFloat(e[1]),parseFloat(e[2])]}else i[a]=l}const o=new LE(this.resourcePath||t,this.materialOptions);return o.setCrossOrigin(this.crossOrigin),o.setManager(this.manager),o.setMaterials(s),o}},jb.OBB=ly,jb.OBJLoader=xy,jb.FBXLoader=class extends ku{constructor(e){super(e)}load(e,t,n,i){const r=this,s=""===r.path?pd.extractUrlBase(e):r.path,o=new Fu(this.manager);o.setPath(r.path),o.setResponseType("arraybuffer"),o.setRequestHeader(r.requestHeader),o.setWithCredentials(r.withCredentials),o.load(e,(function(n){try{t(r.parse(n,s))}catch(t){i?i(t):console.error(t),r.manager.itemError(e)}}),n,i)}parse(e,t){if(function(e){const t="Kaydara FBX Binary  \0";return e.byteLength>=21&&t===TE(e,0,21)}(e))hE=(new gE).parse(e);else{const t=TE(e);if(!function(e){const t=["K","a","y","d","a","r","a","\\","F","B","X","\\","B","i","n","a","r","y","\\","\\"];let n=0;function i(t){const i=e[t-1];return e=e.slice(n+t),n++,i}for(let e=0;e<t.length;++e)if(i(1)===t[e])return!1;return!0}(t))throw new Error("THREE.FBXLoader: Unknown format.");if(EE(t)<7e3)throw new Error("THREE.FBXLoader: FBX version not supported, FileVersion: "+EE(t));hE=(new AE).parse(t)}const n=new ju(this.manager).setPath(this.resourcePath||t).setCrossOrigin(this.crossOrigin);return new pE(n,this.manager).parse(hE)}},jb.USDZLoader=class extends ku{constructor(e){super(e)}load(e,t,n,i){const r=this,s=new Fu(r.manager);s.setPath(r.path),s.setResponseType("arraybuffer"),s.setRequestHeader(r.requestHeader),s.setWithCredentials(r.withCredentials),s.load(e,(function(n){try{t(r.parse(n))}catch(t){i?i(t):console.error(t),r.manager.itemError(e)}}),n,i)}parse(e){const t=new BE;function n(e){const t=e.slice(0,7),n=new Uint8Array([80,88,82,45,85,83,68,67]);return t.every(((e,t)=>e===n[t]))}const i=function(e,t){for(var n={},i=e.length-22;101010256!=Zy(e,i);--i)(!i||e.length-i>65558)&&Xy(13);var r=Ky(e,i+8);if(!r)return{};var s=Zy(e,i+16),o=4294967295==s||65535==r;if(o){var a=Zy(e,i-12);(o=101075792==Zy(e,a))&&(r=Zy(e,a+32),s=Zy(e,a+48))}for(var l=t,c=0;c<r;++c){var h=sE(e,s,o),u=h[0],d=h[1],p=h[2],f=h[3],m=h[4],A=h[5],g=rE(e,A);s=m,l&&!l({name:f,size:d,originalSize:p,compression:u})||(u?8==u?n[f]=eE(e.subarray(g,g+d),{out:new Cy(p)}):Xy(14,"unknown compression type "+u):n[f]=Wy(e,g,g+d))}return n}(new Uint8Array(e)),r=function(e){const i={};(new Fu).setResponseType("arraybuffer");for(const r in e){if(r.endsWith("png")){const t=new Blob([e[r]],{type:{type:"image/png"}});i[r]=URL.createObjectURL(t)}if(r.endsWith("usd")||r.endsWith("usda")){if(n(e[r]))throw Error("THREE.USDZLoader: Crate files (.usdc or binary .usd) are not supported.");const s=iE(e[r]);i[r]=t.parse(s)}}return i}(i),s=function(e){if(e.length<1)return;const t=Object.keys(e)[0];let i=!1;if(t.endsWith("usda"))return e[t];if(t.endsWith("usdc"))i=!0;else if(t.endsWith("usd")){if(!n(e[t]))return e[t];i=!0}if(i)throw Error("THREE.USDZLoader: Crate files (.usdc or binary .usd) are not supported.")}(i),o=iE(s),a=t.parse(o);function l(e,t){if(e){if(void 0!==t){const n=`def Mesh "${t}"`;if(n in e)return e[n]}for(const t in e){const n=e[t];if(t.startsWith("def Mesh"))return n;if("object"==typeof n){const e=l(n);if(e)return e}}}}function c(e,t){const n=[];for(let i=0;i<t.length;i++){const r=t[i],s=i*r;if(3===r){const t=e[s+0],i=e[s+1],r=e[s+2];n.push(t,i,r)}else if(4===r){const t=e[s+0],i=e[s+1],r=e[s+2],o=e[s+3];n.push(t,i,r),n.push(t,r,o)}else console.warn("THREE.USDZLoader: Face vertex count of %s unsupported.",r)}return n}function h(e,t){const n=e.array,i=e.itemSize,r=new n.constructor(t.length*i);let s=0,o=0;for(let e=0,a=t.length;e<a;e++){s=t[e]*i;for(let e=0;e<i;e++)r[o++]=n[s++]}return new Go(r,i)}function u(e,t=""){for(const n in e){const i=e[n];if(n.startsWith("def Material"+t))return i;if("object"==typeof i){const e=u(i,t);if(e)return e}}}function d(e,t){t["float inputs:rotation"]&&(e.rotation=parseFloat(t["float inputs:rotation"])),t["float2 inputs:scale"]&&(e.repeat=(new Tr).fromArray(JSON.parse("["+t["float2 inputs:scale"].replace(/[()]*/g,"")+"]"))),t["float2 inputs:translation"]&&(e.offset=(new Tr).fromArray(JSON.parse("["+t["float2 inputs:translation"].replace(/[()]*/g,"")+"]")))}function p(e,t){for(const n in e){const i=e[n];if(n.startsWith(`def Shader "${t}"`))return i;if("object"==typeof i){const e=p(i,t);if(e)return e}}}function f(e){if("asset inputs:file"in e){const t=e["asset inputs:file"].replace(/@*/g,"").trim(),n=(new ju).load(r[t]),i={'"clamp"':Wt,'"mirror"':qt,'"repeat"':jt};return"token inputs:wrapS"in e&&(n.wrapS=i[e["token inputs:wrapS"]]),"token inputs:wrapT"in e&&(n.wrapT=i[e["token inputs:wrapT"]]),n}return null}function m(e){const t=function(e){if(!e)return;const t=new sa;let n=null,i=null,r=null,s=-1;if("int[] faceVertexIndices"in e&&(n=JSON.parse(e["int[] faceVertexIndices"])),"int[] faceVertexCounts"in e&&(i=JSON.parse(e["int[] faceVertexCounts"]),n=c(n,i)),"point3f[] points"in e){const i=JSON.parse(e["point3f[] points"].replace(/[()]*/g,""));s=i.length;let r=new Go(new Float32Array(i),3);null!==n&&(r=h(r,n)),t.setAttribute("position",r)}if("float2[] primvars:st"in e&&(e["texCoord2f[] primvars:st"]=e["float2[] primvars:st"]),"texCoord2f[] primvars:st"in e){r=JSON.parse(e["texCoord2f[] primvars:st"].replace(/[()]*/g,""));let i=new Go(new Float32Array(r),2);null!==n&&(i=h(i,n)),t.setAttribute("uv",i)}if("int[] primvars:st:indices"in e&&null!==r){const n=new Go(new Float32Array(r),2);let s=JSON.parse(e["int[] primvars:st:indices"]);s=c(s,i),t.setAttribute("uv",h(n,s))}if("normal3f[] normals"in e){const r=JSON.parse(e["normal3f[] normals"].replace(/[()]*/g,""));let o=new Go(new Float32Array(r),3);if(r.length===s)null!==n&&(o=h(o,n));else{let e=Array.from(Array(r.length/3).keys());e=c(e,i),o=h(o,e)}t.setAttribute("normal",o)}else t.computeVertexNormals();return t}(function(e){if(e){if("prepend references"in e){const t=e["prepend references"].split("@"),n=t[1].replace(/^.\//,""),i=t[2].replace(/^<\//,"").replace(/>$/,"");return l(r[n],i)}return l(e)}}(e)),n=function(e){const t=new ru;if(void 0!==e){const n=e["token outputs:surface.connect"],i=e[`def Shader "${/(\w+).output/.exec(n)[1]}"`];if(void 0!==i){if("color3f inputs:diffuseColor.connect"in i){const n=i["color3f inputs:diffuseColor.connect"],r=p(a,/(\w+).output/.exec(n)[1]);t.map=f(r),t.map.colorSpace=Ti,'def Shader "Transform2d_diffuse"'in e&&d(t.map,e['def Shader "Transform2d_diffuse"'])}else if("color3f inputs:diffuseColor"in i){const e=i["color3f inputs:diffuseColor"].replace(/[()]*/g,"");t.color.fromArray(JSON.parse("["+e+"]"))}if("color3f inputs:emissiveColor.connect"in i){const n=i["color3f inputs:emissiveColor.connect"],r=p(a,/(\w+).output/.exec(n)[1]);t.emissiveMap=f(r),t.emissiveMap.colorSpace=Ti,t.emissive.set(16777215),'def Shader "Transform2d_emissive"'in e&&d(t.emissiveMap,e['def Shader "Transform2d_emissive"'])}else if("color3f inputs:emissiveColor"in i){const e=i["color3f inputs:emissiveColor"].replace(/[()]*/g,"");t.emissive.fromArray(JSON.parse("["+e+"]"))}if("normal3f inputs:normal.connect"in i){const n=i["normal3f inputs:normal.connect"],r=p(a,/(\w+).output/.exec(n)[1]);t.normalMap=f(r),t.normalMap.colorSpace=Si,'def Shader "Transform2d_normal"'in e&&d(t.normalMap,e['def Shader "Transform2d_normal"'])}if("float inputs:roughness.connect"in i){const n=i["float inputs:roughness.connect"],r=p(a,/(\w+).output/.exec(n)[1]);t.roughness=1,t.roughnessMap=f(r),t.roughnessMap.colorSpace=Si,'def Shader "Transform2d_roughness"'in e&&d(t.roughnessMap,e['def Shader "Transform2d_roughness"'])}else"float inputs:roughness"in i&&(t.roughness=parseFloat(i["float inputs:roughness"]));if("float inputs:metallic.connect"in i){const n=i["float inputs:metallic.connect"],r=p(a,/(\w+).output/.exec(n)[1]);t.metalness=1,t.metalnessMap=f(r),t.metalnessMap.colorSpace=Si,'def Shader "Transform2d_metallic"'in e&&d(t.metalnessMap,e['def Shader "Transform2d_metallic"'])}else"float inputs:metallic"in i&&(t.metalness=parseFloat(i["float inputs:metallic"]));if("float inputs:clearcoat.connect"in i){const n=i["float inputs:clearcoat.connect"],r=p(a,/(\w+).output/.exec(n)[1]);t.clearcoat=1,t.clearcoatMap=f(r),t.clearcoatMap.colorSpace=Si,'def Shader "Transform2d_clearcoat"'in e&&d(t.clearcoatMap,e['def Shader "Transform2d_clearcoat"'])}else"float inputs:clearcoat"in i&&(t.clearcoat=parseFloat(i["float inputs:clearcoat"]));if("float inputs:clearcoatRoughness.connect"in i){const n=i["float inputs:clearcoatRoughness.connect"],r=p(a,/(\w+).output/.exec(n)[1]);t.clearcoatRoughness=1,t.clearcoatRoughnessMap=f(r),t.clearcoatRoughnessMap.colorSpace=Si,'def Shader "Transform2d_clearcoatRoughness"'in e&&d(t.clearcoatRoughnessMap,e['def Shader "Transform2d_clearcoatRoughness"'])}else"float inputs:clearcoatRoughness"in i&&(t.clearcoatRoughness=parseFloat(i["float inputs:clearcoatRoughness"]));if("float inputs:ior"in i&&(t.ior=parseFloat(i["float inputs:ior"])),"float inputs:occlusion.connect"in i){const n=i["float inputs:occlusion.connect"],r=p(a,/(\w+).output/.exec(n)[1]);t.aoMap=f(r),t.aoMap.colorSpace=Si,'def Shader "Transform2d_occlusion"'in e&&d(t.aoMap,e['def Shader "Transform2d_occlusion"'])}}}return t}(function(e){if(e){if("rel material:binding"in e){const t=e["rel material:binding"].replace(/^<\//,"").replace(/>$/,"").split("/");return u(a,` "${t[1]}"`)}return u(e)}}(e)),i=t?new ga(t,n):new co;if("matrix4d xformOp:transform"in e){const t=JSON.parse("["+e["matrix4d xformOp:transform"].replace(/[()]*/g,"")+"]");i.matrix.fromArray(t),i.matrix.decompose(i.position,i.quaternion,i.scale)}return i}const A=new Pa;return function e(t,n){for(const i in t)if(i.startsWith("def Scope"))e(t[i],n);else if(i.startsWith("def Xform")){const r=m(t[i]);/def Xform "(\w+)"/.test(i)&&(r.name=/def Xform "(\w+)"/.exec(i)[1]),n.add(r),e(t[i],r)}}(a,A),A}},jb.ColladaLoader=class extends ku{load(e,t,n,i){const r=this,s=""===r.path?pd.extractUrlBase(e):r.path,o=new Fu(r.manager);o.setPath(r.path),o.setRequestHeader(r.requestHeader),o.setWithCredentials(r.withCredentials),o.load(e,(function(n){try{t(r.parse(n,s))}catch(t){i?i(t):console.error(t),r.manager.itemError(e)}}),n,i)}parse(e,t){function n(e,t){const n=[],i=e.childNodes;for(let e=0,r=i.length;e<r;e++){const r=i[e];r.nodeName===t&&n.push(r)}return n}function i(e){if(0===e.length)return[];const t=e.trim().split(/\s+/),n=new Array(t.length);for(let e=0,i=t.length;e<i;e++)n[e]=t[e];return n}function r(e){if(0===e.length)return[];const t=e.trim().split(/\s+/),n=new Array(t.length);for(let e=0,i=t.length;e<i;e++)n[e]=parseFloat(t[e]);return n}function s(e){if(0===e.length)return[];const t=e.trim().split(/\s+/),n=new Array(t.length);for(let e=0,i=t.length;e<i;e++)n[e]=parseInt(t[e]);return n}function o(e){return e.substring(1)}function a(e){return 0===Object.keys(e).length}function l(e){return void 0!==e&&!0===e.hasAttribute("meter")?parseFloat(e.getAttribute("meter")):1}function c(e){return void 0!==e?e.textContent:"Y_UP"}function h(e,t,i,r){const s=n(e,t)[0];if(void 0!==s){const e=n(s,i);for(let t=0;t<e.length;t++)r(e[t])}}function u(e,t){for(const n in e)e[n].build=t(e[n])}function d(e,t){return void 0!==e.build||(e.build=t(e)),e.build}function p(e){const t={inputs:{}};for(let n=0,i=e.childNodes.length;n<i;n++){const i=e.childNodes[n];if(1===i.nodeType&&"input"===i.nodeName){const e=o(i.getAttribute("source")),n=i.getAttribute("semantic");t.inputs[n]=e}}return t}function f(e){const t={};let n=e.getAttribute("target").split("/");const i=n.shift();let r=n.shift();const s=-1!==r.indexOf("("),a=-1!==r.indexOf(".");if(a)n=r.split("."),r=n.shift(),t.member=n.shift();else if(s){const e=r.split("(");r=e.shift();for(let t=0;t<e.length;t++)e[t]=parseInt(e[t].replace(/\)/,""));t.indices=e}return t.id=i,t.sid=r,t.arraySyntax=s,t.memberSyntax=a,t.sampler=o(e.getAttribute("source")),t}function m(e){const t=[],n=e.channels,i=e.samplers,r=e.sources;for(const e in n)if(n.hasOwnProperty(e)){const s=n[e],o=i[s.sampler],a=o.inputs.INPUT,l=o.inputs.OUTPUT;b(g(s,r[a],r[l]),t)}return t}function A(e){return d(Ze.animations[e],m)}function g(e,t,n){const i=Ze.nodes[e.id],r=ke(i.id),s=i.transforms[e.sid],o=i.matrix.clone().transpose();let a,l,c,h,u,d;const p={};switch(s){case"matrix":for(c=0,h=t.array.length;c<h;c++)if(a=t.array[c],l=c*n.stride,void 0===p[a]&&(p[a]={}),!0===e.arraySyntax){const t=n.array[l],i=e.indices[0]+4*e.indices[1];p[a][i]=t}else for(u=0,d=n.stride;u<d;u++)p[a][u]=n.array[l+u];break;case"translate":case"rotate":case"scale":console.warn('THREE.ColladaLoader: Animation transform type "%s" not yet implemented.',s)}const f=function(e,t){const n=[];for(const t in e)n.push({time:parseFloat(t),value:e[t]});n.sort((function(e,t){return e.time-t.time}));for(let e=0;e<16;e++)x(n,e,t.elements[e]);return n}(p,o);return{name:r.uuid,keyframes:f}}const v=new os,y=new os,E=new ss;function b(e,t){const n=e.keyframes,i=e.name,r=[],s=[],o=[],a=[];for(let e=0,t=n.length;e<t;e++){const t=n[e],i=t.time,l=t.value;_e.fromArray(l).transpose(),_e.decompose(v,E,y),r.push(i),s.push(v.x,v.y,v.z),o.push(E.x,E.y,E.z,E.w),a.push(y.x,y.y,y.z)}return s.length>0&&t.push(new Bu(i+".position",r,s)),o.length>0&&t.push(new Su(i+".quaternion",r,o)),a.length>0&&t.push(new Bu(i+".scale",r,a)),t}function x(e,t,n){let i,r,s,o=!0;for(r=0,s=e.length;r<s;r++)i=e[r],void 0===i.value[t]?i.value[t]=null:o=!1;if(!0===o)for(r=0,s=e.length;r<s;r++)i=e[r],i.value[t]=n;else!function(e,t){let n,i;for(let r=0,s=e.length;r<s;r++){const s=e[r];if(null===s.value[t]){if(n=C(e,r,t),i=w(e,r,t),null===n){s.value[t]=i.value[t];continue}if(null===i){s.value[t]=n.value[t];continue}_(s,n,i,t)}}}(e,t)}function C(e,t,n){for(;t>=0;){const i=e[t];if(null!==i.value[n])return i;t--}return null}function w(e,t,n){for(;t<e.length;){const i=e[t];if(null!==i.value[n])return i;t++}return null}function _(e,t,n,i){n.time-t.time!=0?e.value[i]=(e.time-t.time)*(n.value[i]-t.value[i])/(n.time-t.time)+t.value[i]:e.value[i]=t.value[i]}function M(e){const t=[],n=e.name,i=e.end-e.start||-1,r=e.animations;for(let e=0,n=r.length;e<n;e++){const n=A(r[e]);for(let e=0,i=n.length;e<i;e++)t.push(n[e])}return new Ru(n,i,t)}function I(e){return d(Ze.clips[e],M)}function S(e){const t={sources:{}};for(let n=0,i=e.childNodes.length;n<i;n++){const i=e.childNodes[n];if(1===i.nodeType)switch(i.nodeName){case"bind_shape_matrix":t.bindShapeMatrix=r(i.textContent);break;case"source":const e=i.getAttribute("id");t.sources[e]=se(i);break;case"joints":t.joints=T(i);break;case"vertex_weights":t.vertexWeights=B(i)}}return t}function T(e){const t={inputs:{}};for(let n=0,i=e.childNodes.length;n<i;n++){const i=e.childNodes[n];if(1===i.nodeType&&"input"===i.nodeName){const e=i.getAttribute("semantic"),n=o(i.getAttribute("source"));t.inputs[e]=n}}return t}function B(e){const t={inputs:{}};for(let n=0,i=e.childNodes.length;n<i;n++){const i=e.childNodes[n];if(1===i.nodeType)switch(i.nodeName){case"input":const e=i.getAttribute("semantic"),n=o(i.getAttribute("source")),r=parseInt(i.getAttribute("offset"));t.inputs[e]={id:n,offset:r};break;case"vcount":t.vcount=s(i.textContent);break;case"v":t.v=s(i.textContent)}}return t}function R(e){const t={id:e.id},n=Ze.geometries[t.id];return void 0!==e.skin&&(t.skin=function(e){const t={joints:[],indices:{array:[],stride:4},weights:{array:[],stride:4}},n=e.sources,i=e.vertexWeights,r=i.vcount,s=i.v,o=i.inputs.JOINT.offset,a=i.inputs.WEIGHT.offset,l=e.sources[e.joints.inputs.JOINT],c=e.sources[e.joints.inputs.INV_BIND_MATRIX],h=n[i.inputs.WEIGHT.id].array;let u,d,p,f=0;for(u=0,p=r.length;u<p;u++){const e=r[u],n=[];for(d=0;d<e;d++){const e=s[f+o],t=h[s[f+a]];n.push({index:e,weight:t}),f+=2}for(n.sort(m),d=0;d<4;d++){const e=n[d];void 0!==e?(t.indices.array.push(e.index),t.weights.array.push(e.weight)):(t.indices.array.push(0),t.weights.array.push(0))}}for(e.bindShapeMatrix?t.bindMatrix=(new ks).fromArray(e.bindShapeMatrix).transpose():t.bindMatrix=(new ks).identity(),u=0,p=l.array.length;u<p;u++){const e=l.array[u],n=(new ks).fromArray(c.array,u*c.stride).transpose();t.joints.push({name:e,boneInverse:n})}return t;function m(e,t){return t.weight-e.weight}}(e.skin),n.sources.skinIndices=t.skin.indices,n.sources.skinWeights=t.skin.weights),t}function L(e){return void 0!==e.build?e.build:e.init_from}function D(e){const t=Ze.images[e];return void 0!==t?d(t,L):(console.warn("THREE.ColladaLoader: Couldn't find image with ID:",e),null)}function P(e){const t={surfaces:{},samplers:{}};for(let n=0,i=e.childNodes.length;n<i;n++){const i=e.childNodes[n];if(1===i.nodeType)switch(i.nodeName){case"newparam":U(i,t);break;case"technique":t.technique=O(i);break;case"extra":t.extra=V(i)}}return t}function U(e,t){const n=e.getAttribute("sid");for(let i=0,r=e.childNodes.length;i<r;i++){const r=e.childNodes[i];if(1===r.nodeType)switch(r.nodeName){case"surface":t.surfaces[n]=k(r);break;case"sampler2D":t.samplers[n]=N(r)}}}function k(e){const t={};for(let n=0,i=e.childNodes.length;n<i;n++){const i=e.childNodes[n];1===i.nodeType&&"init_from"===i.nodeName&&(t.init_from=i.textContent)}return t}function N(e){const t={};for(let n=0,i=e.childNodes.length;n<i;n++){const i=e.childNodes[n];1===i.nodeType&&"source"===i.nodeName&&(t.source=i.textContent)}return t}function O(e){const t={};for(let n=0,i=e.childNodes.length;n<i;n++){const i=e.childNodes[n];if(1===i.nodeType)switch(i.nodeName){case"constant":case"lambert":case"blinn":case"phong":t.type=i.nodeName,t.parameters=F(i);break;case"extra":t.extra=V(i)}}return t}function F(e){const t={};for(let n=0,i=e.childNodes.length;n<i;n++){const i=e.childNodes[n];if(1===i.nodeType)switch(i.nodeName){case"emission":case"diffuse":case"specular":case"bump":case"ambient":case"shininess":case"transparency":t[i.nodeName]=Q(i);break;case"transparent":t[i.nodeName]={opaque:i.hasAttribute("opaque")?i.getAttribute("opaque"):"A_ONE",data:Q(i)}}}return t}function Q(e){const t={};for(let n=0,i=e.childNodes.length;n<i;n++){const i=e.childNodes[n];if(1===i.nodeType)switch(i.nodeName){case"color":t[i.nodeName]=r(i.textContent);break;case"float":t[i.nodeName]=parseFloat(i.textContent);break;case"texture":t[i.nodeName]={id:i.getAttribute("texture"),extra:z(i)}}}return t}function z(e){const t={technique:{}};for(let n=0,i=e.childNodes.length;n<i;n++){const i=e.childNodes[n];1===i.nodeType&&"extra"===i.nodeName&&G(i,t)}return t}function G(e,t){for(let n=0,i=e.childNodes.length;n<i;n++){const i=e.childNodes[n];1===i.nodeType&&"technique"===i.nodeName&&H(i,t)}}function H(e,t){for(let n=0,i=e.childNodes.length;n<i;n++){const i=e.childNodes[n];if(1===i.nodeType)switch(i.nodeName){case"repeatU":case"repeatV":case"offsetU":case"offsetV":t.technique[i.nodeName]=parseFloat(i.textContent);break;case"wrapU":case"wrapV":"TRUE"===i.textContent.toUpperCase()?t.technique[i.nodeName]=1:"FALSE"===i.textContent.toUpperCase()?t.technique[i.nodeName]=0:t.technique[i.nodeName]=parseInt(i.textContent);break;case"bump":t[i.nodeName]=W(i)}}}function V(e){const t={};for(let n=0,i=e.childNodes.length;n<i;n++){const i=e.childNodes[n];1===i.nodeType&&"technique"===i.nodeName&&(t.technique=j(i))}return t}function j(e){const t={};for(let n=0,i=e.childNodes.length;n<i;n++){const i=e.childNodes[n];if(1===i.nodeType)switch(i.nodeName){case"double_sided":t[i.nodeName]=parseInt(i.textContent);break;case"bump":t[i.nodeName]=W(i)}}return t}function W(e){const t={};for(let n=0,i=e.childNodes.length;n<i;n++){const i=e.childNodes[n];1===i.nodeType&&"texture"===i.nodeName&&(t[i.nodeName]={id:i.getAttribute("texture"),texcoord:i.getAttribute("texcoord"),extra:z(i)})}return t}function q(e){return e}function X(e){const t=(n=e.url,d(Ze.effects[n],q));var n;const i=t.profile.technique;let r;switch(i.type){case"phong":case"blinn":r=new su;break;case"lambert":r=new lu;break;default:r=new Do}function s(e,n=null){const i=t.profile.samplers[e.id];let r=null;if(void 0!==i?r=D(t.profile.surfaces[i.source].init_from):(console.warn("THREE.ColladaLoader: Undefined sampler. Access image directly (see #12530)."),r=D(e.id)),null!==r){const t=function(e){let t,n=e.slice(2+(e.lastIndexOf(".")-1>>>0));return n=n.toLowerCase(),t="tga"===n?qe:We,t}(r);if(void 0!==t){const i=t.load(r),s=e.extra;if(void 0!==s&&void 0!==s.technique&&!1===a(s.technique)){const e=s.technique;i.wrapS=e.wrapU?jt:Wt,i.wrapT=e.wrapV?jt:Wt,i.offset.set(e.offsetU||0,e.offsetV||0),i.repeat.set(e.repeatU||1,e.repeatV||1)}else i.wrapS=jt,i.wrapT=jt;return null!==n&&(i.colorSpace=n),i}return console.warn("THREE.ColladaLoader: Loader for texture %s not found.",r),null}return console.warn("THREE.ColladaLoader: Couldn't create texture with ID:",e.id),null}r.name=e.name||"";const o=i.parameters;for(const e in o){const t=o[e];switch(e){case"diffuse":t.color&&r.color.fromArray(t.color),t.texture&&(r.map=s(t.texture,Ti));break;case"specular":t.color&&r.specular&&r.specular.fromArray(t.color),t.texture&&(r.specularMap=s(t.texture));break;case"bump":t.texture&&(r.normalMap=s(t.texture));break;case"ambient":t.texture&&(r.lightMap=s(t.texture,Ti));break;case"shininess":t.float&&r.shininess&&(r.shininess=t.float);break;case"emission":t.color&&r.emissive&&r.emissive.fromArray(t.color),t.texture&&(r.emissiveMap=s(t.texture,Ti))}}Gr.toWorkingColorSpace(r.color,Ti),r.specular&&Gr.toWorkingColorSpace(r.specular,Ti),r.emissive&&Gr.toWorkingColorSpace(r.emissive,Ti);let l=o.transparent,c=o.transparency;if(void 0===c&&l&&(c={float:1}),void 0===l&&c&&(l={opaque:"A_ONE",data:{color:[1,1,1,1]}}),l&&c)if(l.data.texture)r.transparent=!0;else{const e=l.data.color;switch(l.opaque){case"A_ONE":r.opacity=e[3]*c.float;break;case"RGB_ZERO":r.opacity=1-e[0]*c.float;break;case"A_ZERO":r.opacity=1-e[3]*c.float;break;case"RGB_ONE":r.opacity=e[0]*c.float;break;default:console.warn('THREE.ColladaLoader: Invalid opaque type "%s" of transparent tag.',l.opaque)}r.opacity<1&&(r.transparent=!0)}if(void 0!==i.extra&&void 0!==i.extra.technique){const e=i.extra.technique;for(const t in e){const n=e[t];switch(t){case"double_sided":r.side=1===n?je:He;break;case"bump":r.normalMap=s(n.texture),r.normalScale=new Tr(1,1)}}}return r}function Y(e){return d(Ze.materials[e],X)}function J(e){for(let t=0;t<e.childNodes.length;t++){const n=e.childNodes[t];if("technique_common"===n.nodeName)return K(n)}return{}}function K(e){const t={};for(let n=0;n<e.childNodes.length;n++){const i=e.childNodes[n];switch(i.nodeName){case"perspective":case"orthographic":t.technique=i.nodeName,t.parameters=Z(i)}}return t}function Z(e){const t={};for(let n=0;n<e.childNodes.length;n++){const i=e.childNodes[n];switch(i.nodeName){case"xfov":case"yfov":case"xmag":case"ymag":case"znear":case"zfar":case"aspect_ratio":t[i.nodeName]=parseFloat(i.textContent)}}return t}function $(e){let t;switch(e.optics.technique){case"perspective":t=new Ta(e.optics.parameters.yfov,e.optics.parameters.aspect_ratio,e.optics.parameters.znear,e.optics.parameters.zfar);break;case"orthographic":let n=e.optics.parameters.ymag,i=e.optics.parameters.xmag;const r=e.optics.parameters.aspect_ratio;i=void 0===i?n*r:i,n=void 0===n?i/r:n,i*=.5,n*=.5,t=new sd(-i,i,n,-n,e.optics.parameters.znear,e.optics.parameters.zfar);break;default:t=new Ta}return t.name=e.name||"",t}function ee(e){const t=Ze.cameras[e];return void 0!==t?d(t,$):(console.warn("THREE.ColladaLoader: Couldn't find camera with ID:",e),null)}function te(e){const t={};for(let n=0,i=e.childNodes.length;n<i;n++){const i=e.childNodes[n];if(1===i.nodeType)switch(i.nodeName){case"directional":case"point":case"spot":case"ambient":t.technique=i.nodeName,t.parameters=ne(i)}}return t}function ne(e){const t={};for(let n=0,i=e.childNodes.length;n<i;n++){const i=e.childNodes[n];if(1===i.nodeType)switch(i.nodeName){case"color":const e=r(i.textContent);t.color=(new To).fromArray(e),Gr.toWorkingColorSpace(t.color,Ti);break;case"falloff_angle":t.falloffAngle=parseFloat(i.textContent);break;case"quadratic_attenuation":const n=parseFloat(i.textContent);t.distance=n?Math.sqrt(1/n):0}}return t}function ie(e){let t;switch(e.technique){case"directional":t=new ad;break;case"point":t=new rd;break;case"spot":t=new $u;break;case"ambient":t=new ld}return e.parameters.color&&t.color.copy(e.parameters.color),e.parameters.distance&&(t.distance=e.parameters.distance),t}function re(e){const t=Ze.lights[e];return void 0!==t?d(t,ie):(console.warn("THREE.ColladaLoader: Couldn't find light with ID:",e),null)}function se(e){const t={array:[],stride:3};for(let s=0;s<e.childNodes.length;s++){const o=e.childNodes[s];if(1===o.nodeType)switch(o.nodeName){case"float_array":t.array=r(o.textContent);break;case"Name_array":t.array=i(o.textContent);break;case"technique_common":const e=n(o,"accessor")[0];void 0!==e&&(t.stride=parseInt(e.getAttribute("stride")))}}return t}function oe(e){const t={};for(let n=0;n<e.childNodes.length;n++){const i=e.childNodes[n];1===i.nodeType&&(t[i.getAttribute("semantic")]=o(i.getAttribute("source")))}return t}function ae(e){const t={type:e.nodeName,material:e.getAttribute("material"),count:parseInt(e.getAttribute("count")),inputs:{},stride:0,hasUV:!1};for(let n=0,i=e.childNodes.length;n<i;n++){const i=e.childNodes[n];if(1===i.nodeType)switch(i.nodeName){case"input":const e=o(i.getAttribute("source")),n=i.getAttribute("semantic"),r=parseInt(i.getAttribute("offset")),a=parseInt(i.getAttribute("set")),l=a>0?n+a:n;t.inputs[l]={id:e,offset:r},t.stride=Math.max(t.stride,r+1),"TEXCOORD"===n&&(t.hasUV=!0);break;case"vcount":t.vcount=s(i.textContent);break;case"p":t.p=s(i.textContent)}}return t}function le(e){let t=0;for(let n=0,i=e.length;n<i;n++)!0===e[n].hasUV&&t++;t>0&&t<e.length&&(e.uvsNeedsFix=!0)}function ce(e){const t={},n=e.sources,i=e.vertices,r=e.primitives;if(0===r.length)return{};const s=function(e){const t={};for(let n=0;n<e.length;n++){const i=e[n];void 0===t[i.type]&&(t[i.type]=[]),t[i.type].push(i)}return t}(r);for(const e in s){const r=s[e];le(r),t[e]=he(r,n,i)}return t}function he(e,t,n){const i={},r={array:[],stride:0},s={array:[],stride:0},o={array:[],stride:0},a={array:[],stride:0},l={array:[],stride:0},c=[],h=[],u=new sa,d=[];let p=0;for(let i=0;i<e.length;i++){const f=e[i],m=f.inputs;let A=0;switch(f.type){case"lines":case"linestrips":A=2*f.count;break;case"triangles":A=3*f.count;break;case"polylist":for(let e=0;e<f.count;e++){const t=f.vcount[e];switch(t){case 3:A+=3;break;case 4:A+=6;break;default:A+=3*(t-2)}}break;default:console.warn("THREE.ColladaLoader: Unknown primitive type:",f.type)}u.addGroup(p,A,i),p+=A,f.material&&d.push(f.material);for(const i in m){const u=m[i];switch(i){case"VERTEX":for(const i in n){const d=n[i];switch(i){case"POSITION":const n=r.array.length;if(ue(f,t[d],u.offset,r.array),r.stride=t[d].stride,t.skinWeights&&t.skinIndices&&(ue(f,t.skinIndices,u.offset,c),ue(f,t.skinWeights,u.offset,h)),!1===f.hasUV&&!0===e.uvsNeedsFix){const e=(r.array.length-n)/r.stride;for(let t=0;t<e;t++)o.array.push(0,0)}break;case"NORMAL":ue(f,t[d],u.offset,s.array),s.stride=t[d].stride;break;case"COLOR":ue(f,t[d],u.offset,l.array),l.stride=t[d].stride;break;case"TEXCOORD":ue(f,t[d],u.offset,o.array),o.stride=t[d].stride;break;case"TEXCOORD1":ue(f,t[d],u.offset,a.array),o.stride=t[d].stride;break;default:console.warn('THREE.ColladaLoader: Semantic "%s" not handled in geometry build process.',i)}}break;case"NORMAL":ue(f,t[u.id],u.offset,s.array),s.stride=t[u.id].stride;break;case"COLOR":ue(f,t[u.id],u.offset,l.array,!0),l.stride=t[u.id].stride;break;case"TEXCOORD":ue(f,t[u.id],u.offset,o.array),o.stride=t[u.id].stride;break;case"TEXCOORD1":ue(f,t[u.id],u.offset,a.array),a.stride=t[u.id].stride}}}return r.array.length>0&&u.setAttribute("position",new Ko(r.array,r.stride)),s.array.length>0&&u.setAttribute("normal",new Ko(s.array,s.stride)),l.array.length>0&&u.setAttribute("color",new Ko(l.array,l.stride)),o.array.length>0&&u.setAttribute("uv",new Ko(o.array,o.stride)),a.array.length>0&&u.setAttribute("uv1",new Ko(a.array,a.stride)),c.length>0&&u.setAttribute("skinIndex",new Ko(c,4)),h.length>0&&u.setAttribute("skinWeight",new Ko(h,4)),i.data=u,i.type=e[0].type,i.materialKeys=d,i}function ue(e,t,n,i,r=!1){const s=e.p,o=e.stride,a=e.vcount;function l(e){let t=s[e+n]*h;const o=t+h;for(;t<o;t++)i.push(c[t]);if(r){const e=i.length-h-1;Xe.setRGB(i[e+0],i[e+1],i[e+2],Ti),i[e+0]=Xe.r,i[e+1]=Xe.g,i[e+2]=Xe.b}}const c=t.array,h=t.stride;if(void 0!==e.vcount){let e=0;for(let t=0,n=a.length;t<n;t++){const n=a[t];if(4===n){const t=e+1*o,n=e+2*o,i=e+3*o;l(e+0*o),l(t),l(i),l(t),l(n),l(i)}else if(3===n){const t=e+1*o,n=e+2*o;l(e+0*o),l(t),l(n)}else if(n>4)for(let t=1,i=n-2;t<=i;t++){const n=e+o*t,i=e+o*(t+1);l(e+0*o),l(n),l(i)}e+=o*n}}else for(let e=0,t=s.length;e<t;e+=o)l(e)}function de(e){return d(Ze.geometries[e],ce)}function pe(e){return void 0!==e.build?e.build:e}function fe(e,t){for(let n=0;n<e.childNodes.length;n++){const i=e.childNodes[n];if(1===i.nodeType)switch(i.nodeName){case"joint":t.joints[i.getAttribute("sid")]=me(i);break;case"link":t.links.push(ge(i))}}}function me(e){let t;for(let n=0;n<e.childNodes.length;n++){const i=e.childNodes[n];if(1===i.nodeType)switch(i.nodeName){case"prismatic":case"revolute":t=Ae(i)}}return t}function Ae(e){const t={sid:e.getAttribute("sid"),name:e.getAttribute("name")||"",axis:new os,limits:{min:0,max:0},type:e.nodeName,static:!1,zeroPosition:0,middlePosition:0};for(let n=0;n<e.childNodes.length;n++){const i=e.childNodes[n];if(1===i.nodeType)switch(i.nodeName){case"axis":const e=r(i.textContent);t.axis.fromArray(e);break;case"limits":const n=i.getElementsByTagName("max")[0],s=i.getElementsByTagName("min")[0];t.limits.max=parseFloat(n.textContent),t.limits.min=parseFloat(s.textContent)}}return t.limits.min>=t.limits.max&&(t.static=!0),t.middlePosition=(t.limits.min+t.limits.max)/2,t}function ge(e){const t={sid:e.getAttribute("sid"),name:e.getAttribute("name")||"",attachments:[],transforms:[]};for(let n=0;n<e.childNodes.length;n++){const i=e.childNodes[n];if(1===i.nodeType)switch(i.nodeName){case"attachment_full":t.attachments.push(ve(i));break;case"matrix":case"translate":case"rotate":t.transforms.push(ye(i))}}return t}function ve(e){const t={joint:e.getAttribute("joint").split("/").pop(),transforms:[],links:[]};for(let n=0;n<e.childNodes.length;n++){const i=e.childNodes[n];if(1===i.nodeType)switch(i.nodeName){case"link":t.links.push(ge(i));break;case"matrix":case"translate":case"rotate":t.transforms.push(ye(i))}}return t}function ye(e){const t={type:e.nodeName},n=r(e.textContent);switch(t.type){case"matrix":t.obj=new ks,t.obj.fromArray(n).transpose();break;case"translate":t.obj=new os,t.obj.fromArray(n);break;case"rotate":t.obj=new os,t.obj.fromArray(n),t.angle=Sr.degToRad(n[3])}return t}function Ee(e,t){for(let n=0;n<e.childNodes.length;n++){const i=e.childNodes[n];1===i.nodeType&&"technique_common"===i.nodeName&&be(i,t)}}function be(e,t){for(let n=0;n<e.childNodes.length;n++){const i=e.childNodes[n];if(1===i.nodeType)switch(i.nodeName){case"inertia":t.inertia=r(i.textContent);break;case"mass":t.mass=r(i.textContent)[0]}}}function xe(e){const t={target:e.getAttribute("target").split("/").pop()};for(let n=0;n<e.childNodes.length;n++){const i=e.childNodes[n];if(1===i.nodeType&&"axis"===i.nodeName){const e=i.getElementsByTagName("param")[0];t.axis=e.textContent;const n=t.axis.split("inst_").pop().split("axis")[0];t.jointIndex=n.substring(0,n.length-1)}}return t}function Ce(e){return void 0!==e.build?e.build:e}function we(e){const t=[],n=Qe.querySelector('[id="'+e.id+'"]');for(let e=0;e<n.childNodes.length;e++){const i=n.childNodes[e];if(1!==i.nodeType)continue;let s,o;switch(i.nodeName){case"matrix":s=r(i.textContent);const e=(new ks).fromArray(s).transpose();t.push({sid:i.getAttribute("sid"),type:i.nodeName,obj:e});break;case"translate":case"scale":s=r(i.textContent),o=(new os).fromArray(s),t.push({sid:i.getAttribute("sid"),type:i.nodeName,obj:o});break;case"rotate":s=r(i.textContent),o=(new os).fromArray(s);const n=Sr.degToRad(s[3]);t.push({sid:i.getAttribute("sid"),type:i.nodeName,obj:o,angle:n})}}return t}const _e=new ks,Me=new os;function Ie(e){const t={name:e.getAttribute("name")||"",type:e.getAttribute("type"),id:e.getAttribute("id"),sid:e.getAttribute("sid"),matrix:new ks,nodes:[],instanceCameras:[],instanceControllers:[],instanceLights:[],instanceGeometries:[],instanceNodes:[],transforms:{}};for(let n=0;n<e.childNodes.length;n++){const i=e.childNodes[n];if(1!==i.nodeType)continue;let s;switch(i.nodeName){case"node":t.nodes.push(i.getAttribute("id")),Ie(i);break;case"instance_camera":t.instanceCameras.push(o(i.getAttribute("url")));break;case"instance_controller":t.instanceControllers.push(Se(i));break;case"instance_light":t.instanceLights.push(o(i.getAttribute("url")));break;case"instance_geometry":t.instanceGeometries.push(Se(i));break;case"instance_node":t.instanceNodes.push(o(i.getAttribute("url")));break;case"matrix":s=r(i.textContent),t.matrix.multiply(_e.fromArray(s).transpose()),t.transforms[i.getAttribute("sid")]=i.nodeName;break;case"translate":s=r(i.textContent),Me.fromArray(s),t.matrix.multiply(_e.makeTranslation(Me.x,Me.y,Me.z)),t.transforms[i.getAttribute("sid")]=i.nodeName;break;case"rotate":s=r(i.textContent);const e=Sr.degToRad(s[3]);t.matrix.multiply(_e.makeRotationAxis(Me.fromArray(s),e)),t.transforms[i.getAttribute("sid")]=i.nodeName;break;case"scale":s=r(i.textContent),t.matrix.scale(Me.fromArray(s)),t.transforms[i.getAttribute("sid")]=i.nodeName;break;case"extra":break;default:console.log(i)}}return Ue(t.id)?console.warn("THREE.ColladaLoader: There is already a node with ID %s. Exclude current node from further processing.",t.id):Ze.nodes[t.id]=t,t}function Se(e){const t={id:o(e.getAttribute("url")),materials:{},skeletons:[]};for(let n=0;n<e.childNodes.length;n++){const i=e.childNodes[n];switch(i.nodeName){case"bind_material":const e=i.getElementsByTagName("instance_material");for(let n=0;n<e.length;n++){const i=e[n],r=i.getAttribute("symbol"),s=i.getAttribute("target");t.materials[r]=o(s)}break;case"skeleton":t.skeletons.push(o(i.textContent))}}return t}function Te(e,t){const n=[],i=[];let r,s,o;for(r=0;r<e.length;r++){const i=e[r];let s;if(Ue(i))s=ke(i),Be(s,t,n);else if(a=i,void 0!==Ze.visualScenes[a]){const e=Ze.visualScenes[i].children;for(let i=0;i<e.length;i++){const r=e[i];"JOINT"===r.type&&Be(ke(r.id),t,n)}}else console.error("THREE.ColladaLoader: Unable to find root bone of skeleton with ID:",i)}var a;for(r=0;r<t.length;r++)for(s=0;s<n.length;s++)if(o=n[s],o.bone.name===t[r].name){i[r]=o,o.processed=!0;break}for(r=0;r<n.length;r++)o=n[r],!1===o.processed&&(i.push(o),o.processed=!0);const l=[],c=[];for(r=0;r<i.length;r++)o=i[r],l.push(o.bone),c.push(o.boneInverse);return new xl(l,c)}function Be(e,t,n){e.traverse((function(e){if(!0===e.isBone){let i;for(let n=0;n<t.length;n++){const r=t[n];if(r.name===e.name){i=r.boneInverse;break}}void 0===i&&(i=new ks),n.push({bone:e,boneInverse:i,processed:!1})}}))}function Re(e){const t=[],n=e.matrix,i=e.nodes,r=e.type,s=e.instanceCameras,o=e.instanceControllers,a=e.instanceLights,l=e.instanceGeometries,c=e.instanceNodes;for(let e=0,n=i.length;e<n;e++)t.push(ke(i[e]));for(let e=0,n=s.length;e<n;e++){const n=ee(s[e]);null!==n&&t.push(n.clone())}for(let e=0,n=o.length;e<n;e++){const n=o[e],i=(h=n.id,d(Ze.controllers[h],R)),r=Pe(de(i.id),n.materials),s=Te(n.skeletons,i.skin.joints);for(let e=0,n=r.length;e<n;e++){const n=r[e];n.isSkinnedMesh&&(n.bind(s,i.skin.bindMatrix),n.normalizeSkinWeights()),t.push(n)}}var h;for(let e=0,n=a.length;e<n;e++){const n=re(a[e]);null!==n&&t.push(n.clone())}for(let e=0,n=l.length;e<n;e++){const n=l[e],i=Pe(de(n.id),n.materials);for(let e=0,n=i.length;e<n;e++)t.push(i[e])}for(let e=0,n=c.length;e<n;e++)t.push(ke(c[e]).clone());let u;if(0===i.length&&1===t.length)u=t[0];else{u="JOINT"===r?new vl:new Pa;for(let e=0;e<t.length;e++)u.add(t[e])}return u.name="JOINT"===r?e.sid:e.name,u.matrix.copy(n),u.matrix.decompose(u.position,u.quaternion,u.scale),u}const Le=new Do({name:ku.DEFAULT_MATERIAL_NAME,color:16711935});function De(e,t){const n=[];for(let i=0,r=e.length;i<r;i++){const r=t[e[i]];void 0===r?(console.warn("THREE.ColladaLoader: Material with key %s not found. Apply fallback material.",e[i]),n.push(Le)):n.push(Y(r))}return n}function Pe(e,t){const n=[];for(const i in e){const r=e[i],s=De(r.materialKeys,t);if(0===s.length&&("lines"===i||"linestrips"===i?s.push(new ic):s.push(new su)),"lines"===i||"linestrips"===i)for(let e=0,t=s.length;e<t;e++){const t=s[e];if(!0===t.isMeshPhongMaterial||!0===t.isMeshLambertMaterial){const n=new ic;n.color.copy(t.color),n.opacity=t.opacity,n.transparent=t.transparent,s[e]=n}}const o=void 0!==r.data.attributes.skinIndex,a=1===s.length?s[0]:s;let l;switch(i){case"lines":l=new mc(r.data,a);break;case"linestrips":l=new uc(r.data,a);break;case"triangles":case"polylist":l=o?new gl(r.data,a):new ga(r.data,a)}n.push(l)}return n}function Ue(e){return void 0!==Ze.nodes[e]}function ke(e){return d(Ze.nodes[e],Re)}function Ne(e){const t=new Pa;t.name=e.name;const n=e.children;for(let e=0;e<n.length;e++){const i=n[e];t.add(ke(i.id))}return t}function Oe(e){return d(Ze.visualScenes[e],Ne)}if(0===e.length)return{scene:new Fa};const Fe=(new DOMParser).parseFromString(e,"application/xml"),Qe=n(Fe,"COLLADA")[0],ze=Fe.getElementsByTagName("parsererror")[0];if(void 0!==ze){const e=n(ze,"div")[0];let t;return t=e?e.textContent:function(e){let t="";const n=[e];for(;n.length;){const e=n.shift();e.nodeType===Node.TEXT_NODE?t+=e.textContent:(t+="\n",n.push.apply(n,e.childNodes))}return t.trim()}(ze),console.error("THREE.ColladaLoader: Failed to parse collada file.\n",t),null}const Ge=Qe.getAttribute("version");console.debug("THREE.ColladaLoader: File version",Ge);const Ve=function(e){return{unit:l(n(e,"unit")[0]),upAxis:c(n(e,"up_axis")[0])}}(n(Qe,"asset")[0]),We=new ju(this.manager);let qe;We.setPath(this.resourcePath||t).setCrossOrigin(this.crossOrigin),RE&&(qe=new RE(this.manager),qe.setPath(this.resourcePath||t));const Xe=new To,Ye=[];let Je={},Ke=0;const Ze={animations:{},clips:{},controllers:{},images:{},effects:{},materials:{},cameras:{},lights:{},geometries:{},nodes:{},visualScenes:{},kinematicsModels:{},physicsModels:{},kinematicsScenes:{}};h(Qe,"library_animations","animation",(function e(t){const n={sources:{},samplers:{},channels:{}};let i=!1;for(let r=0,s=t.childNodes.length;r<s;r++){const s=t.childNodes[r];if(1!==s.nodeType)continue;let o;switch(s.nodeName){case"source":o=s.getAttribute("id"),n.sources[o]=se(s);break;case"sampler":o=s.getAttribute("id"),n.samplers[o]=p(s);break;case"channel":o=s.getAttribute("target"),n.channels[o]=f(s);break;case"animation":e(s),i=!0;break;default:console.log(s)}}!1===i&&(Ze.animations[t.getAttribute("id")||Sr.generateUUID()]=n)})),h(Qe,"library_animation_clips","animation_clip",(function(e){const t={name:e.getAttribute("id")||"default",start:parseFloat(e.getAttribute("start")||0),end:parseFloat(e.getAttribute("end")||0),animations:[]};for(let n=0,i=e.childNodes.length;n<i;n++){const i=e.childNodes[n];1===i.nodeType&&"instance_animation"===i.nodeName&&t.animations.push(o(i.getAttribute("url")))}Ze.clips[e.getAttribute("id")]=t})),h(Qe,"library_controllers","controller",(function(e){const t={};for(let n=0,i=e.childNodes.length;n<i;n++){const i=e.childNodes[n];if(1===i.nodeType)switch(i.nodeName){case"skin":t.id=o(i.getAttribute("source")),t.skin=S(i);break;case"morph":t.id=o(i.getAttribute("source")),console.warn("THREE.ColladaLoader: Morph target animation not supported yet.")}}Ze.controllers[e.getAttribute("id")]=t})),h(Qe,"library_images","image",(function(e){const t={init_from:n(e,"init_from")[0].textContent};Ze.images[e.getAttribute("id")]=t})),h(Qe,"library_effects","effect",(function(e){const t={};for(let n=0,i=e.childNodes.length;n<i;n++){const i=e.childNodes[n];1===i.nodeType&&"profile_COMMON"===i.nodeName&&(t.profile=P(i))}Ze.effects[e.getAttribute("id")]=t})),h(Qe,"library_materials","material",(function(e){const t={name:e.getAttribute("name")};for(let n=0,i=e.childNodes.length;n<i;n++){const i=e.childNodes[n];1===i.nodeType&&"instance_effect"===i.nodeName&&(t.url=o(i.getAttribute("url")))}Ze.materials[e.getAttribute("id")]=t})),h(Qe,"library_cameras","camera",(function(e){const t={name:e.getAttribute("name")};for(let n=0,i=e.childNodes.length;n<i;n++){const i=e.childNodes[n];1===i.nodeType&&"optics"===i.nodeName&&(t.optics=J(i))}Ze.cameras[e.getAttribute("id")]=t})),h(Qe,"library_lights","light",(function(e){let t={};for(let n=0,i=e.childNodes.length;n<i;n++){const i=e.childNodes[n];1===i.nodeType&&"technique_common"===i.nodeName&&(t=te(i))}Ze.lights[e.getAttribute("id")]=t})),h(Qe,"library_geometries","geometry",(function(e){const t={name:e.getAttribute("name"),sources:{},vertices:{},primitives:[]},i=n(e,"mesh")[0];if(void 0!==i){for(let e=0;e<i.childNodes.length;e++){const n=i.childNodes[e];if(1!==n.nodeType)continue;const r=n.getAttribute("id");switch(n.nodeName){case"source":t.sources[r]=se(n);break;case"vertices":t.vertices=oe(n);break;case"polygons":console.warn("THREE.ColladaLoader: Unsupported primitive type: ",n.nodeName);break;case"lines":case"linestrips":case"polylist":case"triangles":t.primitives.push(ae(n));break;default:console.log(n)}}Ze.geometries[e.getAttribute("id")]=t}})),h(Qe,"library_nodes","node",Ie),h(Qe,"library_visual_scenes","visual_scene",(function(e){const t={name:e.getAttribute("name"),children:[]};!function(e){const t=e.getElementsByTagName("node");for(let e=0;e<t.length;e++){const n=t[e];!1===n.hasAttribute("id")&&n.setAttribute("id","three_default_"+Ke++)}}(e);const i=n(e,"node");for(let e=0;e<i.length;e++)t.children.push(Ie(i[e]));Ze.visualScenes[e.getAttribute("id")]=t})),h(Qe,"library_kinematics_models","kinematics_model",(function(e){const t={name:e.getAttribute("name")||"",joints:{},links:[]};for(let n=0;n<e.childNodes.length;n++){const i=e.childNodes[n];1===i.nodeType&&"technique_common"===i.nodeName&&fe(i,t)}Ze.kinematicsModels[e.getAttribute("id")]=t})),h(Qe,"library_physics_models","physics_model",(function(e){const t={name:e.getAttribute("name")||"",rigidBodies:{}};for(let n=0;n<e.childNodes.length;n++){const i=e.childNodes[n];1===i.nodeType&&"rigid_body"===i.nodeName&&(t.rigidBodies[i.getAttribute("name")]={},Ee(i,t.rigidBodies[i.getAttribute("name")]))}Ze.physicsModels[e.getAttribute("id")]=t})),h(Qe,"scene","instance_kinematics_scene",(function(e){const t={bindJointAxis:[]};for(let n=0;n<e.childNodes.length;n++){const i=e.childNodes[n];1===i.nodeType&&"bind_joint_axis"===i.nodeName&&t.bindJointAxis.push(xe(i))}Ze.kinematicsScenes[o(e.getAttribute("url"))]=t})),u(Ze.animations,m),u(Ze.clips,M),u(Ze.controllers,R),u(Ze.images,L),u(Ze.effects,q),u(Ze.materials,X),u(Ze.cameras,$),u(Ze.lights,ie),u(Ze.geometries,ce),u(Ze.visualScenes,Ne),function(){const e=Ze.clips;if(!0===a(e)){if(!1===a(Ze.animations)){const e=[];for(const t in Ze.animations){const n=A(t);for(let t=0,i=n.length;t<i;t++)e.push(n[t])}Ye.push(new Ru("default",-1,e))}}else for(const t in e)Ye.push(I(t))}(),function(){const e=Object.keys(Ze.kinematicsModels)[0],t=Object.keys(Ze.kinematicsScenes)[0],n=Object.keys(Ze.visualScenes)[0];if(void 0===e||void 0===t)return;const i=(r=e,d(Ze.kinematicsModels[r],pe));var r;const s=function(e){return d(Ze.kinematicsScenes[e],Ce)}(t),o=Oe(n),a=s.bindJointAxis,l={};for(let e=0,t=a.length;e<t;e++){const t=a[e],n=Qe.querySelector('[sid="'+t.target+'"]');if(n){const e=n.parentElement;c(t.jointIndex,e)}}function c(e,t){const n=t.getAttribute("name"),r=i.joints[e];o.traverse((function(i){i.name===n&&(l[e]={object:i,transforms:we(t),joint:r,position:r.zeroPosition})}))}const h=new ks;Je={joints:i&&i.joints,getJointValue:function(e){const t=l[e];if(t)return t.position;console.warn("THREE.ColladaLoader: Joint "+e+" doesn't exist.")},setJointValue:function(e,t){const n=l[e];if(n){const i=n.joint;if(t>i.limits.max||t<i.limits.min)console.warn("THREE.ColladaLoader: Joint "+e+" value "+t+" outside of limits (min: "+i.limits.min+", max: "+i.limits.max+").");else if(i.static)console.warn("THREE.ColladaLoader: Joint "+e+" is static.");else{const r=n.object,s=i.axis,o=n.transforms;_e.identity();for(let n=0;n<o.length;n++){const r=o[n];if(r.sid&&-1!==r.sid.indexOf(e))switch(i.type){case"revolute":_e.multiply(h.makeRotationAxis(s,Sr.degToRad(t)));break;case"prismatic":_e.multiply(h.makeTranslation(s.x*t,s.y*t,s.z*t));break;default:console.warn("THREE.ColladaLoader: Unknown joint type: "+i.type)}else switch(r.type){case"matrix":_e.multiply(r.obj);break;case"translate":_e.multiply(h.makeTranslation(r.obj.x,r.obj.y,r.obj.z));break;case"scale":_e.scale(r.obj);break;case"rotate":_e.multiply(h.makeRotationAxis(r.obj,r.angle))}}r.matrix.copy(_e),r.matrix.decompose(r.position,r.quaternion,r.scale),l[e].position=t}}else console.log("THREE.ColladaLoader: "+e+" does not exist.")}}}();const $e=function(e){return Oe(o(n(e,"instance_visual_scene")[0].getAttribute("url")))}(n(Qe,"scene")[0]);return $e.animations=Ye,"Z_UP"===Ve.upAxis&&(console.warn("THREE.ColladaLoader: You are loading an asset with a Z-UP coordinate system. The loader just rotates the asset to transform it into Y-UP. The vertex data are not converted, see #24289."),$e.rotation.set(-Math.PI/2,0,0)),$e.scale.multiplyScalar(Ve.unit),{get animations(){return console.warn("THREE.ColladaLoader: Please access animations over scene.animations now."),Ye},kinematics:Je,library:Ze,scene:$e}}},jb.BufferGeometryUtils=t,jb.LightProbeGenerator=DE,jb.TransformControls=class extends Zp{constructor(e,t=null){super(void 0,t);const n=new hb(this);this._root=n;const i=new ub;this._gizmo=i,n.add(i);const r=new db;this._plane=r,n.add(r);const s=this;function o(e,t){let n=t;Object.defineProperty(s,e,{get:function(){return void 0!==n?n:t},set:function(t){n!==t&&(n=t,r[e]=t,i[e]=t,s.dispatchEvent({type:e+"-changed",value:t}),s.dispatchEvent(QE))}}),s[e]=t,r[e]=t,i[e]=t}o("camera",e),o("object",void 0),o("enabled",!0),o("axis",null),o("mode","translate"),o("translationSnap",null),o("rotationSnap",null),o("scaleSnap",null),o("space","world"),o("size",1),o("dragging",!1),o("showX",!0),o("showY",!0),o("showZ",!0),o("minX",-1/0),o("maxX",1/0),o("minY",-1/0),o("maxY",1/0),o("minZ",-1/0),o("maxZ",1/0);const a=new os,l=new os,c=new ss,h=new ss,u=new os,d=new ss,p=new os,f=new os,m=new os,A=new os;o("worldPosition",a),o("worldPositionStart",l),o("worldQuaternion",c),o("worldQuaternionStart",h),o("cameraPosition",u),o("cameraQuaternion",d),o("pointStart",p),o("pointEnd",f),o("rotationAxis",m),o("rotationAngle",0),o("eye",A),this._offset=new os,this._startNorm=new os,this._endNorm=new os,this._cameraScale=new os,this._parentPosition=new os,this._parentQuaternion=new ss,this._parentQuaternionInv=new ss,this._parentScale=new os,this._worldScaleStart=new os,this._worldQuaternionInv=new ss,this._worldScale=new os,this._positionStart=new os,this._quaternionStart=new ss,this._scaleStart=new os,this._getPointer=VE.bind(this),this._onPointerDown=WE.bind(this),this._onPointerHover=jE.bind(this),this._onPointerMove=qE.bind(this),this._onPointerUp=XE.bind(this),null!==t&&this.connect()}connect(){this.domElement.addEventListener("pointerdown",this._onPointerDown),this.domElement.addEventListener("pointermove",this._onPointerHover),this.domElement.addEventListener("pointerup",this._onPointerUp),this.domElement.style.touchAction="none"}disconnect(){this.domElement.removeEventListener("pointerdown",this._onPointerDown),this.domElement.removeEventListener("pointermove",this._onPointerHover),this.domElement.removeEventListener("pointermove",this._onPointerMove),this.domElement.removeEventListener("pointerup",this._onPointerUp),this.domElement.style.touchAction="auto"}getHelper(){return this._root}pointerHover(e){if(void 0===this.object||!0===this.dragging)return;null!==e&&UE.setFromCamera(e,this.camera);const t=YE(this._gizmo.picker[this.mode],UE);this.axis=t?t.object.name:null}pointerDown(e){if(void 0!==this.object&&!0!==this.dragging&&(null==e||0===e.button)&&null!==this.axis){null!==e&&UE.setFromCamera(e,this.camera);const t=YE(this._plane,UE,!0);t&&(this.object.updateMatrixWorld(),this.object.parent.updateMatrixWorld(),this._positionStart.copy(this.object.position),this._quaternionStart.copy(this.object.quaternion),this._scaleStart.copy(this.object.scale),this.object.matrixWorld.decompose(this.worldPositionStart,this.worldQuaternionStart,this._worldScaleStart),this.pointStart.copy(t.point).sub(this.worldPositionStart)),this.dragging=!0,zE.mode=this.mode,this.dispatchEvent(zE)}}pointerMove(e){const t=this.axis,n=this.mode,i=this.object;let r=this.space;if("scale"===n?r="local":"E"!==t&&"XYZE"!==t&&"XYZ"!==t||(r="world"),void 0===i||null===t||!1===this.dragging||null!==e&&-1!==e.button)return;null!==e&&UE.setFromCamera(e,this.camera);const s=YE(this._plane,UE,!0);if(s){if(this.pointEnd.copy(s.point).sub(this.worldPositionStart),"translate"===n)this._offset.copy(this.pointEnd).sub(this.pointStart),"local"===r&&"XYZ"!==t&&this._offset.applyQuaternion(this._worldQuaternionInv),-1===t.indexOf("X")&&(this._offset.x=0),-1===t.indexOf("Y")&&(this._offset.y=0),-1===t.indexOf("Z")&&(this._offset.z=0),"local"===r&&"XYZ"!==t?this._offset.applyQuaternion(this._quaternionStart).divide(this._parentScale):this._offset.applyQuaternion(this._parentQuaternionInv).divide(this._parentScale),i.position.copy(this._offset).add(this._positionStart),this.translationSnap&&("local"===r&&(i.position.applyQuaternion(OE.copy(this._quaternionStart).invert()),-1!==t.search("X")&&(i.position.x=Math.round(i.position.x/this.translationSnap)*this.translationSnap),-1!==t.search("Y")&&(i.position.y=Math.round(i.position.y/this.translationSnap)*this.translationSnap),-1!==t.search("Z")&&(i.position.z=Math.round(i.position.z/this.translationSnap)*this.translationSnap),i.position.applyQuaternion(this._quaternionStart)),"world"===r&&(i.parent&&i.position.add(kE.setFromMatrixPosition(i.parent.matrixWorld)),-1!==t.search("X")&&(i.position.x=Math.round(i.position.x/this.translationSnap)*this.translationSnap),-1!==t.search("Y")&&(i.position.y=Math.round(i.position.y/this.translationSnap)*this.translationSnap),-1!==t.search("Z")&&(i.position.z=Math.round(i.position.z/this.translationSnap)*this.translationSnap),i.parent&&i.position.sub(kE.setFromMatrixPosition(i.parent.matrixWorld)))),i.position.x=Math.max(this.minX,Math.min(this.maxX,i.position.x)),i.position.y=Math.max(this.minY,Math.min(this.maxY,i.position.y)),i.position.z=Math.max(this.minZ,Math.min(this.maxZ,i.position.z));else if("scale"===n){if(-1!==t.search("XYZ")){let e=this.pointEnd.length()/this.pointStart.length();this.pointEnd.dot(this.pointStart)<0&&(e*=-1),NE.set(e,e,e)}else kE.copy(this.pointStart),NE.copy(this.pointEnd),kE.applyQuaternion(this._worldQuaternionInv),NE.applyQuaternion(this._worldQuaternionInv),NE.divide(kE),-1===t.search("X")&&(NE.x=1),-1===t.search("Y")&&(NE.y=1),-1===t.search("Z")&&(NE.z=1);i.scale.copy(this._scaleStart).multiply(NE),this.scaleSnap&&(-1!==t.search("X")&&(i.scale.x=Math.round(i.scale.x/this.scaleSnap)*this.scaleSnap||this.scaleSnap),-1!==t.search("Y")&&(i.scale.y=Math.round(i.scale.y/this.scaleSnap)*this.scaleSnap||this.scaleSnap),-1!==t.search("Z")&&(i.scale.z=Math.round(i.scale.z/this.scaleSnap)*this.scaleSnap||this.scaleSnap))}else if("rotate"===n){this._offset.copy(this.pointEnd).sub(this.pointStart);const e=20/this.worldPosition.distanceTo(kE.setFromMatrixPosition(this.camera.matrixWorld));let n=!1;"XYZE"===t?(this.rotationAxis.copy(this._offset).cross(this.eye).normalize(),this.rotationAngle=this._offset.dot(kE.copy(this.rotationAxis).cross(this.eye))*e):"X"!==t&&"Y"!==t&&"Z"!==t||(this.rotationAxis.copy(FE[t]),kE.copy(FE[t]),"local"===r&&kE.applyQuaternion(this.worldQuaternion),kE.cross(this.eye),0===kE.length()?n=!0:this.rotationAngle=this._offset.dot(kE.normalize())*e),("E"===t||n)&&(this.rotationAxis.copy(this.eye),this.rotationAngle=this.pointEnd.angleTo(this.pointStart),this._startNorm.copy(this.pointStart).normalize(),this._endNorm.copy(this.pointEnd).normalize(),this.rotationAngle*=this._endNorm.cross(this._startNorm).dot(this.eye)<0?1:-1),this.rotationSnap&&(this.rotationAngle=Math.round(this.rotationAngle/this.rotationSnap)*this.rotationSnap),"local"===r&&"E"!==t&&"XYZE"!==t?(i.quaternion.copy(this._quaternionStart),i.quaternion.multiply(OE.setFromAxisAngle(this.rotationAxis,this.rotationAngle)).normalize()):(this.rotationAxis.applyQuaternion(this._parentQuaternionInv),i.quaternion.copy(OE.setFromAxisAngle(this.rotationAxis,this.rotationAngle)),i.quaternion.multiply(this._quaternionStart).normalize())}this.dispatchEvent(QE),this.dispatchEvent(HE)}}pointerUp(e){null!==e&&0!==e.button||(this.dragging&&null!==this.axis&&(GE.mode=this.mode,this.dispatchEvent(GE)),this.dragging=!1,this.axis=null)}dispose(){this.disconnect(),this._root.dispose()}attach(e){return this.object=e,this._root.visible=!0,this}detach(){return this.object=void 0,this.axis=null,this._root.visible=!1,this}reset(){this.enabled&&this.dragging&&(this.object.position.copy(this._positionStart),this.object.quaternion.copy(this._quaternionStart),this.object.scale.copy(this._scaleStart),this.dispatchEvent(QE),this.dispatchEvent(HE),this.pointStart.copy(this.pointEnd))}getRaycaster(){return UE}getMode(){return this.mode}setMode(e){this.mode=e}setTranslationSnap(e){this.translationSnap=e}setRotationSnap(e){this.rotationSnap=e}setScaleSnap(e){this.scaleSnap=e}setSize(e){this.size=e}setSpace(e){this.space=e}},jb.GLTFExporter=fb||console.error("GLTFExporter not found"),jb.BufferGeometryUtils=t,jb.LightProbeGenerator=DE,jb.DeviceOrientationControls=Vb,jb.Cache.enabled=!0;const Wb=jb;var qb=window.AFRAME_CDN_ROOT||"https://cdn.aframe.io/",Xb="aframe-injected",Yb=n(8878),Jb=n.n(Yb),Kb={colors:{debug:"gray",error:"red",info:"gray",warn:"orange"}};Jb().formatArgs=function(e){if(e[0]=(this.useColors?"%c":"")+this.namespace+(this.useColors?" %c":" ")+e[0]+(this.useColors?"%c ":" "),this.useColors){var t;this.color=(t=function(e){var t=e.split(":");return t[t.length-1]}(this.namespace),Kb.colors&&Kb.colors[t]||null);var n="color: "+this.color;e.splice(1,0,n,"color: inherit");var i=0,r=0;e[0].replace(/%[a-zA-Z%]/g,(function(e){"%%"!==e&&(i++,"%c"===e&&(r=i))})),e.splice(r,0,n)}};var Zb=function(){try{return window.localStorage}catch(e){}}();Zb&&(parseInt(Zb.logs,10)||"true"===Zb.logs)?Jb().enable("*"):Jb().enable("*:error,*:info,*:warn");const $b=Jb();var ex=n(1124),tx=n.n(ex),nx=$b("device:error"),ix=!1,rx=!1,sx=void 0!==navigator.xr;if(sx){var ox=function(){var e=document.querySelector("a-scene");e?e.hasLoaded?e.components["xr-mode-ui"].updateEnterInterfaces():e.addEventListener("loaded",ox):window.addEventListener("DOMContentLoaded",ox)},ax=function(e){nx("WebXR session support error: "+e.message)};navigator.xr.isSessionSupported?(navigator.xr.isSessionSupported("immersive-vr").then((function(e){ix=e,ox()})).catch(ax),navigator.xr.isSessionSupported("immersive-ar").then((function(e){rx=e,ox()})).catch((function(){}))):navigator.xr.supportsSession?(navigator.xr.supportsSession("immersive-vr").then((function(){ix=!0,ox()})).catch(ax),navigator.xr.supportsSession("immersive-ar").then((function(){rx=!0,ox()})).catch((function(){}))):nx("WebXR has neither isSessionSupported or supportsSession?!")}function lx(){return ix||rx}function cx(){return rx}function hx(){return ix}var ux,dx,px=(ux=!1,dx=window.navigator.userAgent||window.navigator.vendor||window.opera,(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(dx)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(dx.substr(0,4)))&&(ux=!0),(gx()||fx()||xx())&&(ux=!0),bx()&&(ux=!1),function(){return ux});function fx(e){var t=e||window.navigator.userAgent;return/Nexus (7|9)|xoom|sch-i800|playbook|tablet|kindle/i.test(t)||mx()}function mx(e,t,n){var i=e||window.navigator.userAgent,r=t||window.navigator.platform,s=n||window.navigator.maxTouchPoints||0;return("iPad"===r||"MacIntel"===r)&&s>0&&/Macintosh|Intel|iPad|ipad/i.test(i)&&!window.MSStream}function Ax(){var e=navigator.userAgent.includes("Macintosh"),t=5===navigator.maxTouchPoints;return e&&t&&sx}function gx(){return/iPad|iPhone|iPod/.test(window.navigator.platform)}function vx(){return!px()&&!bx()&&void 0!==window.orientation}function yx(){return/(OculusBrowser)/i.test(window.navigator.userAgent)}function Ex(){return/(Mobile VR)/i.test(window.navigator.userAgent)}function bx(){return yx()||Ex()||Ax()}function xx(){return/R7 Build/.test(window.navigator.userAgent)}function Cx(){var e=window.orientation;return xx()&&(e+=90),90===e||-90===e}var wx="undefined"==typeof process,_x=!wx,Mx=Object.freeze(Object.create(null));function Ix(){return{}}function Sx(e){var t=[],n=null;function i(i){var r,s;if((i=void 0===i?t.length:i)>0&&null==n&&(n=0),i>0)for(r=t.length,t.length+=Number(i),s=r;s<t.length;s++)t[s]=e();return t.length}return e=e||Ix,{grow:i,pool:t,recycle:function(e){e instanceof Object&&(null!==n&&-1!==n?t[--n]=e:t[t.length]=e)},size:function(){return t.length},use:function(){var e;return null!==n&&n!==t.length||i(t.length||5),e=t[n],t[n++]=Mx,Tx(e),e}}}function Tx(e){var t;if(e&&e.constructor===Object)for(t in e)e[t]=void 0}function Bx(e,t){var n;if(e&&e.constructor===Object)for(n in e)n in t||delete e[n]}var Rx=$b("utils:coordinates:warn"),Lx=["x","y","z","w"],Dx=/^\s*((-?\d*\.{0,1}\d+(e-?\d+)?)\s+){2,3}(-?\d*\.{0,1}\d+(e-?\d+)?)\s*$/,Px=/\s+/g;function Ux(e,t,n){var i,r,s,o,a,l,c,h,u=n&&"object"==typeof n?n:{};if(e&&e instanceof Object)return a=void 0===e.x?t&&t.x:e.x,l=void 0===e.y?t&&t.y:e.y,c=void 0===e.z?t&&t.z:e.z,h=void 0===e.w?t&&t.w:e.w,null!=a&&(u.x=Qx(a)),null!=l&&(u.y=Qx(l)),null!=c&&(u.z=Qx(c)),null!=h&&(u.w=Qx(h)),u;if(null==e)return"object"==typeof t?Object.assign(u,t):t;for(i=e.trim().split(Px),o=0;o<Lx.length;o++)if(s=Lx[o],i[o])u[s]=parseFloat(i[o],10);else{if(void 0===(r=t&&t[s]))continue;u[s]=Qx(r)}return u}function kx(e){var t;return"object"!=typeof e?e:(t=e.x+" "+e.y,null!=e.z&&(t+=" "+e.z),null!=e.w&&(t+=" "+e.w),t)}function Nx(e,t){return"object"!=typeof e||"object"!=typeof t?e===t:e.x===t.x&&e.y===t.y&&e.z===t.z&&e.w===t.w}function Ox(e){return Dx.test(e)}function Fx(e){return Rx("`AFRAME.utils.isCoordinate` has been renamed to `AFRAME.utils.isCoordinates`"),Ox(e)}function Qx(e){return null!=e&&e.constructor===String?parseFloat(e,10):e}function zx(e){return new THREE.Vector3(e.x,e.y,e.z)}var Gx=function(){var e={};return function(t,n){return n in e||(e[n]={}),t in e[n]||(e[n][t]=t.split(n)),e[n][t]}}();function Hx(e,t){var n=Gx(e,t=t||".");return 1===n.length?n[0]:n}function Vx(e,t,n){var i;return n=n||".",-1!==t.indexOf(n)?(i=Hx(t,n)).constructor===String?e.getAttribute(i):e.getAttribute(i[0])[i[1]]:e.getAttribute(t)}function jx(e,t,n,i){var r;i=i||".",-1===t.indexOf(i)?e.setAttribute(t,n):(r=Hx(t,i)).constructor===String?e.setAttribute(r,n):e.setAttribute(r[0],r[1],n)}function Wx(e){var t=e.style.width,n=e.style.height;e.style.width=parseInt(t,10)+1+"px",e.style.height=parseInt(n,10)+1+"px",setTimeout((function(){e.style.width=t,e.style.height=n}),200)}var qx=$b("utils:src-loader:warn");function Xx(e,t,n){!function(e,t){var n;e.tagName?t("IMG"===e.tagName):((n=new XMLHttpRequest).open("HEAD",e),n.addEventListener("load",(function(i){var r;n.status>=200&&n.status<300?null==(r=n.getResponseHeader("Content-Type"))?Zx(e,t):r.startsWith("image")?t(!0):t(!1):Zx(e,t),n.abort()})),n.send())}(e,(function(i){i?t(e):n(e)}))}function Yx(e,t,n){var i,r,s,o="",a=[];if("string"==typeof e){for(r=0;r<5;r++)o+="(url\\((?:[^\\)]+)\\),\\s*)";function l(e){a.push(e),6===a.length&&t(a)}if(o+="(url\\((?:[^\\)]+)\\)\\s*)",s=e.match(new RegExp(o))){for(r=1;r<7;r++)Xx(Kx(s[r]),l);return}if(!e.startsWith("#"))return void Xx(Kx(e)||e,n)}if(i=e.tagName?e:function(e){try{var t=document.querySelector(e);return t||qx('No element was found matching the selector: "%s"',e),t}catch(t){return void qx('"%s" is not a valid selector',e)}}(e))return"A-CUBEMAP"===i.tagName&&i.srcs?t(i.srcs):"IMG"===i.tagName?n(i):void qx('Selector "%s" does not point to <a-cubemap> or <img>',e)}function Jx(e,t){return Yx(e,t,(function(){qx("Expected cubemap but got image")}))}function Kx(e){var t=e.match(/url\((.+)\)/);if(t)return t[1]}function Zx(e,t){var n=new Image;n.addEventListener("load",(function(){t(!0)})),n.addEventListener("error",(function(){t(!1)})),n.src=e}var $x=$b("utils:material:warn"),eC=new Set(["emissiveMap","envMap","map","specularMap"]);function tC(e,t){var n=t.offset||{x:0,y:0},i=t.repeat||{x:1,y:1},r=t.npot||!1,s=t.anisotropy||Wb.Texture.DEFAULT_ANISOTROPY,o=e.wrapS,a=e.wrapT,l=e.magFilter,c=e.minFilter;r&&(o=Wb.ClampToEdgeWrapping,a=Wb.ClampToEdgeWrapping,l=Wb.LinearFilter,c=Wb.LinearFilter),1===i.x&&1===i.y||(o=Wb.RepeatWrapping,a=Wb.RepeatWrapping),e.offset.set(n.x,n.y),e.repeat.set(i.x,i.y),e.wrapS===o&&e.wrapT===a&&e.magFilter===l&&e.minFilter===c&&e.anisotropy===s||(e.wrapS=o,e.wrapT=a,e.magFilter=l,e.minFilter=c,e.anisotropy=s,e.needsUpdate=!0)}function nC(e,t,n,i){var r=n.el,s=n.material,o=r.sceneEl.systems.renderer,a=i[t];if(n.materialSrcs||(n.materialSrcs={}),!a)return delete n.materialSrcs[e],void l(null);function l(t){s[e]!==t&&(s[e]&&s[e].dispose(),s[e]=t,s.needsUpdate=!0,aC(r,t))}a===n.materialSrcs[e]&&s[e]?tC(s[e],i):(n.materialSrcs[e]=a,a instanceof Wb.Texture?l(a):r.sceneEl.systems.material.loadTextureSource(a,(function(t){if(n.materialSrcs[e]===a){var r=s[e];!r||null!==t&&lC(r,t)||(r=null),!r&&t&&(r=cC(t)),r&&(r.source!==t&&(r.source=t,r.needsUpdate=!0),eC.has(e)&&o.applyColorCorrection(r),tC(r,i)),l(r)}})))}function iC(e,t){return nC("map","src",e,t)}function rC(e,t,n){var i=e;"ambientOcclusion"===e&&(i="ao");var r={};return r.src=n[e+"Map"],r.offset=n[e+"TextureOffset"],r.repeat=n[e+"TextureRepeat"],r.wrap=n[e+"TextureWrap"],nC(i+"Map","src",t,r)}var sC={};function oC(e,t){var n=e.material,i=e.el,r="envMap",s=t.envMap,o=t.sphericalEnvMap,a=t.refract;if(o&&(s=o,$x("`sphericalEnvMap` property is deprecated, using spherical map as equirectangular map instead. Use `envMap` property with a CubeMap or Equirectangular image instead.")),e.materialSrcs||(e.materialSrcs={}),!s)return delete e.materialSrcs[r],n.envMap=null,void(n.needsUpdate=!0);function l(t){e.materialSrcs[r]===s&&(n.envMap=t,n.needsUpdate=!0,aC(i,t))}e.materialSrcs[r]=s,sC[s]?sC[s].then(l):sC[s]=new Promise((function(e){Yx(s,(function(t){i.sceneEl.systems.material.loadCubeMapTexture(t,(function(t){t.mapping=a?Wb.CubeRefractionMapping:Wb.CubeReflectionMapping,l(t),e(t)}))}),(function(t){i.sceneEl.systems.material.loadTexture(t,{src:t},(function(t){t.mapping=a?Wb.EquirectangularRefractionMapping:Wb.EquirectangularReflectionMapping,l(t),e(t)}))}))}))}function aC(e,t){function n(){e.emit("materialvideoloadeddata",{src:t.image,texture:t})}function i(){e.emit("materialvideoended",{src:t.image,texture:t})}t&&(e.emit("materialtextureloaded",{src:t.image,texture:t}),t.image&&"VIDEO"===t.image.tagName&&(t.image.addEventListener("loadeddata",n),t.image.addEventListener("ended",i),t.addEventListener("dispose",(function(){t.image.removeEventListener("loadeddata",n),t.image.removeEventListener("ended",i)}))))}function lC(e,t){return e.source===t&&(t.data instanceof HTMLCanvasElement?e.isCanvasTexture:t.data instanceof HTMLVideoElement?e.isVideoTexture:e.isTexture&&!e.isCanvasTexture&&!e.isVideoTexture)}function cC(e){var t;return(t=e.data instanceof HTMLCanvasElement?new Wb.CanvasTexture:e.data instanceof HTMLVideoElement?new Wb.VideoTexture(e.data):new Wb.Texture).source=e,t.needsUpdate=!0,t}var hC=/-([a-z])/g;function uC(e,t){var n;return"string"!=typeof e?e:(n=function(e,t){var n,i,r,s,o,a;for(t=t||{},n=AC(e),i=0;i<n.length;i++)(r=n[i])&&(s=r.indexOf(":"),o=r.substr(0,s).trim(),a=r.substr(s+1).trim(),t[pC(o)]=a);return t}(e,t),n[""]?e:n)}function dC(e){return"string"==typeof e?e:function(e){var t,n=0,i=0,r="";for(t in e)n++;for(t in e)r+=t+": "+e[t],i<n-1&&(r+="; "),i++;return r}(e)}function pC(e){return e.replace(hC,gC)}var fC,mC,AC=(fC=[],mC=/url\([^)]+$/,function(e){var t,n="",i=0;for(fC.length=0;i<e.length;)-1===(t=e.indexOf(";",i))&&(t=e.length),n+=e.substring(i,t),mC.test(n)?(n+=";",i=t+1):(fC.push(n.trim()),n="",i=t+1);return fC});function gC(e){return e[1].toUpperCase()}var vC=["x","y","z","w"];function yC(e,t,n){var i,r,s=e.el;if((r=!!(i=EC(e,t,n)))===e.controllerPresent)return r;e.controllerPresent=r,r?(e.addEventListeners(),e.injectTrackedControls(i),s.emit("controllerconnected",{name:e.name,component:e})):(e.removeEventListeners(),s.emit("controllerdisconnected",{name:e.name,component:e}))}function EC(e,t,n){var i,r=e.el.sceneEl,s=r&&r.systems["tracked-controls"];return!!s&&!(!(i=s.controllers)||!i.length)&&bC(i,t,n.hand,n.index,n.iterateControllerProfiles,n.handTracking)}function bC(e,t,n,i,r,s){var o,a,l,c,h=!1;for(o=0;o<e.length;o++){if(c=(l=e[o]).profiles,s)h=l.hand;else if(r)for(a=0;a<c.length&&!(h=c[a].startsWith(t));a++);else h=c.length>0&&c[0].startsWith(t);if(h)if("right"===l.handedness||"left"===l.handedness){if(l.handedness===n)return e[o]}else if(o===i)return e[o]}}function xC(e,t,n){var i,r,s,o,a;for(r in t){for(i=t[r],s=!1,a=0;a<i.length;a++)n.detail.changed[i[a]]&&(s=!0);if(s){for(o={},a=0;a<i.length;a++)o[vC[a]]=n.detail.axis[i[a]];e.el.emit(r+"moved",o)}}}function CC(e,t,n,i){var r=(i?n.mapping[i]:n.mapping).buttons[e];n.el.emit(r+t),n.updateModel&&n.updateModel(r,t)}var wC=$b("utils:warn");function _C(e){return e.bind.apply(e,Array.prototype.slice.call(arguments,1))}function MC(){return wC("`utils.checkHeadsetConnected` has moved to `utils.device.checkHeadsetConnected`"),lx()}function IC(){return wC("`utils.isIOS` has moved to `utils.device.isIOS`"),gx()}function SC(){return wC("`utils.isMobile has moved to `utils.device.isMobile`"),px(arguments)}function TC(e,t,n){var i;return n&&(e=e.bind(n)),function(){var n=Date.now();(void 0===i||(void 0===i?t:n-i)>=t)&&(i=n,e.apply(null,arguments))}}function BC(e,t,n){var i,r,s;n&&(e=e.bind(n));var o=function(){i=Date.now(),e.apply(this,s),r=void 0};return function(){var n=Date.now(),a=void 0===i?t:n-i;a>=t?(clearTimeout(r),r=void 0,i=n,e.apply(null,arguments)):(r=r||setTimeout(o,t-a),s=arguments)}}function RC(e,t,n){var i;return n&&(e=e.bind(n)),function(n,r){var s=void 0===i?r:n-i;(void 0===i||s>=t)&&(i=n,e(n,s))}}function LC(e,t,n){var i;return function(){var r=this,s=arguments,o=n&&!i;clearTimeout(i),i=setTimeout((function(){i=null,n||e.apply(r,s)}),t),o&&e.apply(r,s)}}var DC=Object.assign,PC=tx();function UC(e){return JSON.parse(JSON.stringify(e))}var kC,NC,OC=(kC=Sx((function(){return[]})),function(e,t){var n,i,r,s,o,a;if(void 0===e||void 0===t||null===e||null===t||!(e&&t&&e.constructor===Object&&t.constructor===Object||e.constructor===Array&&t.constructor===Array))return e===t;for(n in i=kC.use(),r=kC.use(),i.length=0,r.length=0,e)i.push(n);for(n in t)r.push(n);if(i.length!==r.length)return kC.recycle(i),kC.recycle(r),!1;for(s=0;s<i.length;++s)if(o=e[i[s]],a=t[i[s]],"object"==typeof o||"object"==typeof a||Array.isArray(o)&&Array.isArray(a)){if(o===a)continue;if(!OC(o,a))return kC.recycle(i),kC.recycle(r),!1}else if(o!==a)return kC.recycle(i),kC.recycle(r),!1;return kC.recycle(i),kC.recycle(r),!0}),FC=(NC=[],function(e,t,n){var i,r,s,o,a,l,c;for(a in o=n||{},NC.length=0,e)NC.push(a);if(!t)return o;for(s in t)-1===NC.indexOf(s)&&NC.push(s);for(l=0;l<NC.length;l++)i=e[a=NC[l]],r=t[a],((c=i&&r&&i.constructor===Object&&r.constructor===Object)&&!OC(i,r)||!c&&i!==r)&&(o[a]=r);return o});function QC(e){return!e.metaKey&&document.activeElement===document.body}function zC(e,t){void 0===t&&(t=" ");var n=new RegExp(t,"g");return(e=(e||"").replace(n,t)).split(t)}function GC(e,t){t=t||{};var n={};return Object.keys(t).forEach((function(t){e.hasAttribute(t)&&(n[t]=e.getAttribute(t))})),n}function HC(e){e=e.replace(/[\[]/,"\\[").replace(/[\]]/,"\\]");var t=new RegExp("[\\?&]"+e+"=([^&#]*)").exec(location.search);return null===t?"":decodeURIComponent(t[1].replace(/\+/g," "))}function VC(){return window.top!==window.self}function jC(e){for(var t=[],n=e.getElementsByTagName("*"),i=0,r=n.length;i<r;i++)n[i].isScene&&t.push(n[i]);return t}var WC,qC=[YC({name:"viewport",content:"width=device-width,initial-scale=1,maximum-scale=1,shrink-to-fit=no,user-scalable=no,minimal-ui,viewport-fit=cover"}),YC({name:"mobile-web-app-capable",content:"yes"}),YC({name:"theme-color",content:"black"})],XC=[YC({name:"apple-mobile-web-app-capable",content:"yes"}),YC({name:"apple-mobile-web-app-status-bar-style",content:"black"}),(WC={rel:"apple-touch-icon",href:"https://aframe.io/images/aframe-logo-152.png"},{tagName:"link",attributes:WC,exists:function(){return document.querySelector('link[rel="'+WC.rel+'"]')}})];function YC(e){return{tagName:"meta",attributes:e,exists:function(){return document.querySelector('meta[name="'+e.name+'"]')}}}var JC,KC,ZC,$C=n(5928),ew=n.n($C),tw=h,nw="loading-screen";function iw(e){var t=JC.hasAttribute("embedded"),n=ZC(JC.canvas,t,JC.maxCanvasSize,JC.is("vr-mode"));e.aspect=n.width/n.height,e.updateProjectionMatrix(),JC.renderer.setSize(n.width,n.height,!1)}const rw=[];var sw=Jb()("core:propertyTypes:warn"),ow={},aw=/[,> .[\]:]/,lw=/url\((.+)\)/;function cw(e,t,n,i,r,s){if(e in ow)throw new Error("Property type "+e+" is already registered.");ow[e]={default:t,parse:n||pw,stringify:i||fw,equals:r||mw,isCacheable:!1!==s}}function hw(e,t){if(!Array.isArray(e)||!Array.isArray(t))return e===t;if(e.length!==t.length)return!1;for(var n=0;n<e.length;n++)if(e[n]!==t[n])return!1;return!0}function uw(e){var t,n;return"string"!=typeof e?e:(n=e.match(lw))?n[1]:"#"===e.charAt(0)?(t=document.getElementById(e.substring(1)))?"CANVAS"===t.tagName||"VIDEO"===t.tagName||"IMG"===t.tagName?t:t.getAttribute("src"):void sw('"'+e+'" asset not found.'):e}function dw(e){return e.getAttribute?e.getAttribute("id")?"#"+e.getAttribute("id"):e.getAttribute("src"):fw(e)}function pw(e){return e}function fw(e){return null===e?"null":e.toString()}function mw(e,t){return e===t}function Aw(e){return parseInt(e,10)}function gw(e,t,n){return Ux(e,t,n)}function vw(e,t){if(null===e)return!0;if("object"!=typeof e)return!1;if(Object.keys(e).length!==t)return!1;var n=e.x,i=e.y,r=e.z,s=e.w;return!("number"!=typeof n||"number"!=typeof i||t>2&&"number"!=typeof r||t>3&&"number"!=typeof s)}cw("audio","",uw,dw),cw("array",[],(function(e){return Array.isArray(e)?e:e&&"string"==typeof e?e.split(",").map((function(e){return e.trim()})):[]}),(function(e){return e.join(", ")}),hw),cw("asset","",uw,dw),cw("boolean",!1,(function(e){return"false"!==e&&!1!==e})),cw("color","#FFF"),cw("int",0,Aw),cw("number",0,(function(e){return parseFloat(e,10)})),cw("map","",uw,dw),cw("model","",uw,dw),cw("selector",null,(function(e){return e?"string"!=typeof e?e:"#"!==e[0]||aw.test(e)?document.querySelector(e):document.getElementById(e.substring(1)):null}),(function(e){return e.getAttribute?"#"+e.getAttribute("id"):fw(e)}),mw,!1),cw("selectorAll",null,(function(e){return e?"string"!=typeof e?e:Array.prototype.slice.call(document.querySelectorAll(e),0):null}),(function(e){return e instanceof Array?e.map((function(e){return"#"+e.getAttribute("id")})).join(", "):fw(e)}),hw,!1),cw("src","",(function(e){return sw("`src` property type is deprecated. Use `asset` instead."),uw(e)}),dw),cw("string",""),cw("time",0,Aw),cw("vec2",{x:0,y:0},gw,kx,Nx),cw("vec3",{x:0,y:0,z:0},gw,kx,Nx),cw("vec4",{x:0,y:0,z:0,w:1},gw,kx,Nx);var yw=function(e,t){return("audio"!==e||"string"==typeof t)&&!("array"===e&&!Array.isArray(t))&&("asset"!==e||"string"==typeof t)&&("boolean"!==e||"boolean"==typeof t)&&("color"!==e||"string"==typeof t)&&("int"!==e||"number"==typeof t)&&("number"!==e||"number"==typeof t)&&("map"!==e||"string"==typeof t)&&("model"!==e||"string"==typeof t)&&("selector"!==e||"string"==typeof t||null===t)&&("selectorAll"!==e||"string"==typeof t||null===t)&&("src"!==e||"string"==typeof t)&&("string"!==e||"string"==typeof t)&&("time"!==e||"number"==typeof t)&&("vec2"===e?vw(t,2):"vec3"===e?vw(t,3):"vec4"!==e||vw(t,4))},Ew=ow,bw=$b("core:schema:warn");function xw(e){return"type"in e?"string"==typeof e.type:"default"in e}function Cw(e,t){var n;if(xw(e))return ww(e,t);for(n in e)e[n]=ww(e[n],t);return e}function ww(e,t){var n,i,r=e.default,s=e.type;return e.type?"bool"===e.type?s="boolean":"float"===e.type&&(s="number"):s=void 0===r||"boolean"!=typeof r&&"number"!=typeof r?Array.isArray(r)?"array":"string":typeof r,(i=Ew[s])||bw("Unknown property type for component `"+t+"`: "+s),n=!!e.parse,e.parse=e.parse||i.parse,e.stringify=e.stringify||i.stringify,e.equals=e.equals||i.equals,e.isCacheable=!0===e.isCacheable||i.isCacheable,e.type=s,"default"in e?n||yw(s,r)||bw("Default value `"+r+"` does not match type `"+s+"` in component `"+t+"`"):e.default=i.default,e}var _w,Mw=(_w=[],function(e,t,n,i,r){var s,o,a,l;for(o in _w.length=0,n?e:t)n&&void 0===e[o]||_w.push(o);if(null===e||"object"!=typeof e)return e;for(o in e)void 0===e[o]||t[o]||r||bw("Unknown property `"+o+"` for component/system `"+i+"`.");for(s=0;s<_w.length;s++){if(a=t[o=_w[s]],l=e[o],!t[o])return;e[o]=Iw(l,a)}return e});function Iw(e,t,n){return null!=e&&""!==e||(e=t.default,Array.isArray(e)&&(e=e.slice())),t.parse(e,t.default,n)}function Sw(e,t){var n,i,r,s,o={};for(n in e)i=t[n],"object"==typeof(s=r=e[n])&&(s=Tw(r,i),i||bw("Unknown component property: "+n)),void 0!==s&&(o[n]=s);return o}function Tw(e,t){return"object"!=typeof e?e:t&&null!==e?t.stringify(e):JSON.stringify(e)}var Bw={},Rw=Iw,Lw=Cw,Dw=xw,Pw=Sw,Uw=Tw,kw=h,Nw=$b("core:component:warn"),Ow=document.currentScript,Fw=new RegExp("[A-Z]+"),Qw={},zw=Object.freeze({}),Gw=[],Hw={get:function(e,t){return e.getComputedPropertyValue(t)},set:function(e,t,n){return t in e.schema?e.recomputeProperty(t,n):void 0!==n&&e.handleUnknownProperty(t,n),!0}},Vw=function(e,t,n){var i=this;if(this.sceneOnly&&!e.isScene)throw new Error("Component `"+this.name+"` can only be applied to <a-scene>");if(n&&!this.multiple)throw new Error("Trying to initialize multiple components of type `"+this.name+"`. There can only be one component of this type per entity.");this.el=e,this.id=n,this.attrName=this.name+(n?"__"+n:""),this.evtDetail={id:this.id,name:this.name},this.initialized=!1,this.el.components[this.attrName]=this,this.objectPool=Qw[this.name];var r=this.events;this.events={},function(e,t){var n;for(n in t)e.events[n]=t[n].bind(e)}(this,r),this.attrValue=void 0,this.isObjectBased?(this.data=this.objectPool.use(),Bx(this.data,this.schema),this.oldData=this.objectPool.use(),Bx(this.oldData,this.schema),this.attrValueProxy=new Proxy(this,Hw)):(this.data=void 0,this.oldData=void 0,this.attrValueProxy=void 0),this.deferUnknownPropertyWarnings=!!this.updateSchema,this.throttledEmitComponentChanged=BC((function(){e.emit("componentchanged",i.evtDetail,!1)}),200),this.updateProperties(t,!0)};Vw.prototype={schema:{},init:function(){},events:{},update:function(e){},updateSchema:void 0,tick:void 0,tock:void 0,play:function(){},pause:function(){},remove:function(){},stringify:function(e){var t=this.schema;return"string"==typeof e?e:this.isSingleProperty?Uw(e,t):(e=Pw(e,t),kw.stringify(e))},flushToDOM:function(e){var t=e?this.data:this.attrValue;null!=t&&window.HTMLElement.prototype.setAttribute.call(this.el,this.attrName,this.stringify(t))},updateProperties:function(e,t){var n=this.el;this.updateData(e,t),(n.hasLoaded||n.isLoading)&&(this.initialized?this.callUpdateHandler():this.initComponent())},initComponent:function(){var e,t=this.el;t.initializingComponents[this.name]||(t.initializingComponents[this.name]=!0,this.init(),this.initialized=!0,delete t.initializingComponents[this.name],e=this.isObjectBased?zw:void 0,this.dataChanged=!1,this.storeOldData(),this.update(e),t.isPlaying&&this.play(),t.emit("componentinitialized",this.evtDetail,!1))},updateData:function(e,t){this.isSingleProperty?this.recomputeProperty(void 0,e):(t?(Tx(this.attrValue),this.recomputeData(e),this.schemaChangeRequired=!!this.updateSchema):"string"==typeof e?kw.parse(e,this.attrValueProxy):DC(this.attrValueProxy,e),this.updateSchemaIfNeeded(e))},updateSchemaIfNeeded:function(e){if(this.schemaChangeRequired&&this.updateSchema)for(var t in Gw.length=0,this.updateSchema(this.data),Bx(this.data,this.schema),this.recomputeData(e),this.schemaChangeRequired=!1,this.attrValue)void 0!==this.attrValue[t]&&-1===Gw.indexOf(t)&&(t in this.schema||Nw("Unknown property `"+t+"` for component `"+this.name+"`."));for(var n=0;n<Gw.length;n++)Nw("Unknown property `"+Gw[n]+"` for component `"+this.name+"`.");Gw.length=0},callUpdateHandler:function(){if(this.isPositionRotationScale||this.dataChanged){this.dataChanged=!1;var e=this.oldData;this.oldDataInUse=!0,this.update(e),e!==this.oldData&&this.objectPool.recycle(e),this.oldDataInUse=!1,this.storeOldData(),this.throttledEmitComponentChanged()}},handleMixinUpdate:function(){this.recomputeData(),this.updateSchemaIfNeeded(),this.callUpdateHandler()},resetProperty:function(e){(this.isSingleProperty||e in this.schema)&&(e?this.attrValue[e]=void 0:(this.isObjectBased&&this.objectPool.recycle(this.attrValue),this.attrValue=void 0),this.recomputeProperty(e,void 0),this.updateSchemaIfNeeded(),this.callUpdateHandler())},extendSchema:function(e){var t;t=DC({},Bw[this.name].schema),DC(t,e),this.schema=Lw(t),this.el.emit("schemachanged",this.evtDetail)},getComputedPropertyValue:function(e){var t=this.el.mixinEls,n=this.attrValue&&e?this.attrValue[e]:this.attrValue;if(void 0!==n)return n;for(var i=t.length-1;i>=0;i--){var r=t[i].getAttribute(this.attrName);if(null!==r&&(!e||e in r))return e?r[e]:r}return e?this.schema[e].default:this.schema.default},recomputeProperty:function(e,t){var n=e?this.schema[e]:this.schema;if(null!=t){void 0===this.attrValue&&this.isObjectBased&&(this.attrValue=this.objectPool.use());var i=e?this.attrValue[e]:this.attrValue;"string"==typeof(i=n.isCacheable?Rw(t,n,i):t)&&(i=""===t?void 0:t),e?this.attrValue[e]=i:this.attrValue=i}this.oldDataInUse&&(this.oldData=this.objectPool.use(),Bx(this.oldData,this.schema),this.storeOldData(),this.oldDataInUse=!1);var r=e?this.oldData[e]:this.oldData,s=e?this.data[e]:this.data,o=Rw(this.getComputedPropertyValue(e),n,s);return"array"!==n.type||e||(o=UC(o)),n.equals(o,r)||(this.dataChanged=!0,n.schemaChange&&(this.schemaChangeRequired=!0)),e?this.data[e]=o:this.data=o,o},handleUnknownProperty:function(e,t){void 0===this.attrValue&&(this.attrValue=this.objectPool.use()),this.attrValue[e]=t,this.deferUnknownPropertyWarnings?Gw.push(e):this.silenceUnknownPropertyWarnings||Nw("Unknown property `"+e+"` for component `"+this.name+"`.")},storeOldData:function(){var e;if(this.isObjectBased)if(this.isSingleProperty)this.oldData=Rw(this.data,this.schema,this.oldData);else for(e in this.schema)void 0!==this.data[e]&&(this.data[e]&&"object"==typeof this.data[e]?this.oldData[e]=Rw(this.data[e],this.schema[e],this.oldData[e]):this.oldData[e]=this.data[e]);else this.oldData=this.data},recomputeData:function(e){var t;if(this.isSingleProperty)this.recomputeProperty(void 0,e);else{for(t in this.schema)this.attrValueProxy[t]=void 0;e&&"object"==typeof e?DC(this.attrValueProxy,e):"string"==typeof e&&kw.parse(e,this.attrValueProxy)}},eventsAttach:function(){var e;for(e in this.eventsDetach(),this.events)this.el.addEventListener(e,this.events[e])},eventsDetach:function(){var e;for(e in this.events)this.el.removeEventListener(e,this.events[e])},destroy:function(){this.objectPool.recycle(this.attrValue),this.objectPool.recycle(this.data),this.objectPool.recycle(this.oldData),this.attrValue=this.data=this.oldData=this.attrValueProxy=void 0}};var jw={};function Ww(e,t){var n,i,r,s,o,a={};if(document.currentScript&&document.currentScript!==Ow&&rw.forEach((function(t){t.hasLoaded||document.currentScript.compareDocumentPosition(t)!==Node.DOCUMENT_POSITION_FOLLOWING&&(Nw("The component `"+e+"` was registered in a <script> tag after the scene. Component <script> tags in an HTML file should be declared *before* the scene such that the component is available to entities during scene initialization."),window.debug&&(jw[e]=!0))})),!0===Fw.test(e)&&Nw("The component name `"+e+"` contains uppercase characters, but HTML will ignore the capitalization of attribute names. Change the name to be lowercase: `"+e.toLowerCase()+"`"),-1!==e.indexOf("__"))throw new Error("The component name `"+e+"` is not allowed. The sequence __ (double underscore) is reserved to specify an id for multiple components of the same type");if(Object.keys(t).forEach((function(e){a[e]={value:t[e],writable:!0}})),Bw[e])throw new Error("The component `"+e+"` has been already registered. Check that you are not loading two versions of the same component or two different components of the same name.");((n=function(e,t,n){Vw.call(this,e,t,n)}).prototype=Object.create(Vw.prototype,a)).name=e,n.prototype.isPositionRotationScale="position"===e||"rotation"===e||"scale"===e,n.prototype.constructor=n,n.prototype.system=m&&Zw[e],n.prototype.play=(s=n.prototype.play,function(){var e=this.el.sceneEl,t=this.el.isPlaying&&!this.isPlaying;this.initialized&&t&&(s.call(this),this.isPlaying=!0,this.eventsAttach(),qw(this)&&e.addBehavior(this))}),n.prototype.pause=(o=n.prototype.pause,function(){var e=this.el.sceneEl;this.isPlaying&&(o.call(this),this.isPlaying=!1,this.eventsDetach(),qw(this)&&e.removeBehavior(this))}),i=DC(Lw(n.prototype.schema,n.prototype.name)),n.prototype.isSingleProperty=r=Dw(n.prototype.schema),n.prototype.isObjectBased=!r||r&&(Xw(i.default)||Xw(Rw(void 0,i))),Qw[e]=Sx(),Bw[e]={Component:n,dependencies:n.prototype.dependencies,before:n.prototype.before,after:n.prototype.after,isSingleProperty:n.prototype.isSingleProperty,isObjectBased:n.prototype.isObjectBased,multiple:n.prototype.multiple,sceneOnly:n.prototype.sceneOnly,name:e,schema:i,stringify:n.prototype.stringify};for(var l=0;l<rw.length;l++)rw[l].emit("componentregistered",{name:e},!1);return n}function qw(e){return e.tick||e.tock}function Xw(e){return e&&e.constructor===Object&&!(e instanceof window.HTMLElement)}var Yw=!1;function Jw(){Yw||(Yw=!0,setTimeout((function(){document.dispatchEvent(new CustomEvent("aframeready"))})))}var Kw=h,Zw={},$w=function(e){var t=f&&Bw[this.name];this.el=e,this.sceneEl=e,t&&(t.Component.prototype.system=this),this.buildData(),this.init(),this.update({})};function e_(e,t){var n,i,r={},s=jC(document);if(Object.keys(t).forEach((function(e){r[e]={value:t[e],writable:!0}})),Zw[e])throw new Error("The system `"+e+"` has been already registered. Check that you are not loading two versions of the same system or two different systems of the same name.");if(i=function(e){$w.call(this,e)},(i.prototype=Object.create($w.prototype,r)).name=e,i.prototype.constructor=i,i.prototype.schema=DC(Cw(i.prototype.schema)),Zw[e]=i,Yw)for(n=0;n<s.length;n++)s[n].initSystem(e)}$w.prototype={schema:{},init:function(){},update:function(e){},updateProperties:function(e){var t=this.data;0!==Object.keys(this.schema).length&&(this.buildData(e),this.update(t))},buildData:function(e){var t=this.schema;0!==Object.keys(t).length&&(e=e||window.HTMLElement.prototype.getAttribute.call(this.sceneEl,this.name),xw(t)?this.data=Iw(e,t):this.data=Mw(Kw.parse(e)||{},t,!1,this.name))},tick:void 0,tock:void 0,play:function(){},pause:function(){}};var t_=$b("core:a-node:warn"),n_={"a-scene":!0,"a-assets":!0,"a-assets-items":!0,"a-cubemap":!0,"a-mixin":!0,"a-node":!0,"a-entity":!0};function i_(e){return e.tagName.toLowerCase()in n_||e.isNode}class r_ extends HTMLElement{constructor(){super(),this.computedMixinStr="",this.hasLoaded=!1,this.isNode=!0,this.mixinEls=[]}connectedCallback(){Yw?this.doConnectedCallback():document.addEventListener("aframeready",this.connectedCallback.bind(this))}doConnectedCallback(){var e;this.sceneEl=this.closestScene(),this.sceneEl||t_("You are attempting to attach <"+this.tagName+"> outside of an A-Frame scene. Append this element to `<a-scene>` instead."),this.hasLoaded=!1,this.emit("nodeready",void 0,!1),this.isMixin||(e=this.getAttribute("mixin"))&&this.updateMixins(e)}attributeChangedCallback(e,t,n){n!==this.computedMixinStr&&("mixin"!==e||this.isMixin||this.updateMixins(n,t))}closestScene(){for(var e=this;e&&!e.isScene;)e=e.parentElement;return e}closest(e){for(var t=this.matches||this.mozMatchesSelector||this.msMatchesSelector||this.oMatchesSelector||this.webkitMatchesSelector,n=this;n&&!t.call(n,e);)n=n.parentElement;return n}disconnectedCallback(){this.hasLoaded=!1}load(e,t){var n,i=this;this.hasLoaded||(t=t||i_,n=this.getChildren().filter(t).map((function(e){return new Promise((function(t,n){if(e.hasLoaded)return t();e.addEventListener("loaded",t),e.addEventListener("error",n)}))})),Promise.allSettled(n).then((function(t){t.forEach((function(e){"rejected"===e.status&&t_("Rendering scene with errors on node: ",e.reason.target)})),i.isLoading=!0,i.setupMutationObserver(),e&&e(),i.isLoading=!1,i.hasLoaded=!0,i.emit("loaded-private",void 0,!1),i.emit("loaded",void 0,!1)})))}setupMutationObserver(){var e=this;new MutationObserver((function(t){var n;for(n=0;n<t.length;n++)if("attributes"===t[n].type){var i=t[n].attributeName,r=window.HTMLElement.prototype.getAttribute.call(e,i),s=t[n].oldValue;e.attributeChangedCallback(i,s,r)}})).observe(this,{attributes:!0,attributeOldValue:!0})}getChildren(){return Array.prototype.slice.call(this.children,0)}updateMixins(e,t){var n,i,r,s=r_.newMixinIdArray,o=r_.oldMixinIdArray,a=r_.mixinIds;for(s.length=0,o.length=0,i=e?Gx(e.trim(),/\s+/):s,r=t?Gx(t.trim(),/\s+/):o,a.newMixinIds=i,a.oldMixinIds=r,n=0;n<r.length;n++)-1===i.indexOf(r[n])&&this.unregisterMixin(r[n]);for(this.computedMixinStr="",this.mixinEls.length=0,n=0;n<i.length;n++)this.registerMixin(i[n]);return this.computedMixinStr&&(this.computedMixinStr=this.computedMixinStr.trim(),window.HTMLElement.prototype.setAttribute.call(this,"mixin",this.computedMixinStr)),0===i.length&&window.HTMLElement.prototype.removeAttribute.call(this,"mixin"),a}registerMixin(e){var t,n,i,r=document.getElementById(e);if(r){if(i=r.getAttribute("mixin"))for(t=Gx(i.trim(),/\s+/),n=0;n<t.length;n++)this.registerMixin(t[n]);this.computedMixinStr=this.computedMixinStr+" "+r.id,this.mixinEls.push(r)}else t_("No mixin was found with id `%s`",e)}setAttribute(e,t){"mixin"===e&&this.updateMixins(t),window.HTMLElement.prototype.setAttribute.call(this,e,t)}unregisterMixin(e){var t,n=this.mixinEls;for(t=0;t<n.length;++t)if(e===n[t].id){n.splice(t,1);break}}emit(e,t,n,i){var r=r_.evtData;void 0===n&&(n=!0),r.bubbles=!!n,r.detail=t,i&&(r=DC({},i,r)),this.dispatchEvent(new CustomEvent(e,r))}}r_.evtData={},r_.newMixinIdArray=[],r_.oldMixinIdArray=[],r_.mixinIds={},customElements.define("a-node",r_);var s_=$b("core:a-entity:debug"),o_=$b("core:a-entity:warn"),a_="__",l_=["position","rotation","scale","visible"],c_={once:!0};class h_ extends r_{constructor(){super(),this.components={},this.initializingComponents={},this.componentsToUpdate={},this.isEntity=!0,this.isPlaying=!1,this.object3D=new Wb.Group,this.object3D.rotation.order="YXZ",this.object3D.el=this,this.object3DMap={},this.parentEl=null,this.rotationObj={},this.states=[]}attributeChangedCallback(e,t,n){var i=this.components[e];super.attributeChangedCallback(),i&&i.justInitialized&&""===n?delete i.justInitialized:(i||null!==n)&&this.setEntityAttribute(e,t,n)}doConnectedCallback(){var e,t,n=this;super.doConnectedCallback(),t=this.sceneEl,this.addToParent(),this.isScene||(t?!(e=t.querySelector("a-assets"))||e.hasLoaded?this.load():e.addEventListener("loaded",(function(){n.load()})):this.load())}disconnectedCallback(){var e;if(this.parentEl){for(e in this.components)this.removeComponent(e,!1);this.isScene||(this.removeFromParent(),super.disconnectedCallback(),this.object3D.el=null)}}getObject3D(e){return this.object3DMap[e]}setObject3D(e,t){var n,i=this;if(!(t instanceof Wb.Object3D))throw new Error("`Entity.setObject3D` was called with an object that was not an instance of THREE.Object3D.");(n=this.getObject3D(e))&&this.object3D.remove(n),t.el=this,t.children.length&&t.traverse((function(e){e.el=i})),this.object3D.add(t),this.object3DMap[e]=t,this.emit("object3dset",{object:t,type:e})}removeObject3D(e){var t=this.getObject3D(e);t?(this.object3D.remove(t),delete this.object3DMap[e],this.emit("object3dremove",{type:e})):o_("Tried to remove `Object3D` of type:",e,"which was not defined.")}getOrCreateObject3D(e,t){var n=this.getObject3D(e);return!n&&t&&(n=new t,this.setObject3D(e,n)),o_("`getOrCreateObject3D` has been deprecated. Use `setObject3D()` and `object3dset` event instead."),n}add(e){if(!e.object3D)throw new Error("Trying to add an element that doesn't have an `object3D`");this.object3D.add(e.object3D),this.emit("child-attached",{el:e})}addToParent(){var e=this.parentEl=this.parentNode;e&&e.add&&!this.attachedToParent&&(e.add(this),this.attachedToParent=!0)}removeFromParent(){var e=this.parentEl;this.parentEl.remove(this),this.attachedToParent=!1,this.parentEl=null,e.emit("child-detached",{el:this})}load(){var e=this;!this.hasLoaded&&this.parentEl&&super.load.call(this,(function(){e.parentEl&&(e.updateComponents(),(e.isScene||e.parentEl.isPlaying)&&e.play())}))}remove(e){e?this.object3D.remove(e.object3D):this.parentNode.removeChild(this)}getChildEntities(){for(var e=this.children,t=[],n=0;n<e.length;n++){var i=e[n];i instanceof h_&&t.push(i)}return t}initComponent(e,t,n){var i,r,s,o;o=(s=Gx(e,a_))[0],r=s.length>2?s.slice(1).join("__"):s[1],Bw[o]&&(u_(this,e)||void 0!==t||n)&&(e in this.components||(this.initComponentDependencies(o),i=new Bw[o].Component(this,t,r),this.isPlaying&&i.play(),this.hasAttribute(e)||(i.justInitialized=!0,window.HTMLElement.prototype.setAttribute.call(this,e,"")),s_("Component initialized: %s",e)))}initComponentDependencies(e){var t,n;if(Bw[e]&&(t=Bw[e].dependencies))for(n=0;n<t.length;n++)this.initComponent(t[n],window.HTMLElement.prototype.getAttribute.call(this,t[n])||void 0,!0)}removeComponent(e,t){var n;(n=this.components[e])&&(n.initialized?(n.pause(),n.remove(),t&&(n.destroy(),delete this.components[e],this.hasAttribute(e)&&window.HTMLElement.prototype.removeAttribute.call(this,e)),this.emit("componentremoved",n.evtDetail,!1)):this.addEventListener("componentinitialized",(function n(i){i.detail.name===e&&(this.removeComponent(e,t),this.removeEventListener("componentinitialized",n))})))}updateComponents(){var e,t,n,i,r,s,o=this.componentsToUpdate;if(this.hasLoaded||this.isLoading){for(n=0;n<this.mixinEls.length;n++)for(i in this.mixinEls[n].componentCache)d_(i)&&(o[i]=!0);if(this.getExtraComponents)for(i in t=this.getExtraComponents())d_(i)&&(o[i]=!0);for(n=0;n<this.attributes.length;++n)i=this.attributes[n].name,-1===l_.indexOf(i)&&d_(i)&&(o[i]=!0);for(n=0;n<l_.length;n++)i=l_[n],this.hasAttribute(i)&&this.updateComponent(i,this.getDOMAttribute(i));for(i in o)r=this.getDOMAttribute(i),e=(s=t&&t[i])?s.constructor===Object?DC(s,uC(r||{})):r||s:r,this.updateComponent(i,e),delete o[i]}}updateComponent(e,t,n){var i=this.components[e];if(i)return null!==t||u_(this,e)?void i.updateProperties(t,n):void this.removeComponent(e,!0);this.initComponent(e,t,!1)}removeAttribute(e,t){var n=this.components[e];n&&void 0===t&&this.removeComponent(e,!0),n&&void 0!==t?n.resetProperty(t):("mixin"===e&&this.mixinUpdate(""),window.HTMLElement.prototype.removeAttribute.call(this,e))}play(){var e,t,n;if(!this.isPlaying&&(this.hasLoaded||this.isLoading)){for(n in this.isPlaying=!0,this.components)this.components[n].play();for(e=this.getChildEntities(),t=0;t<e.length;t++)e[t].play();this.emit("play")}}pause(){var e,t,n;if(this.isPlaying){for(n in this.isPlaying=!1,this.components)this.components[n].pause();for(e=this.getChildEntities(),t=0;t<e.length;t++)e[t].pause();this.emit("pause")}}setEntityAttribute(e,t,n){if(Bw[e]||this.components[e])this.updateComponent(e,n);else if("mixin"===e){if(n===this.computedMixinStr)return;this.mixinUpdate(n,t)}}mixinUpdate(e,t,n){var i,r,s,o,a=h_.componentsUpdated,l=this;if(n||(t=t||this.getAttribute("mixin")),this.hasLoaded){for(s=this.updateMixins(e,t),a.length=0,o=0;o<this.mixinEls.length;o++)for(i in this.mixinEls[o].componentCache)-1===a.indexOf(i)&&(this.components[i]?this.components[i].handleMixinUpdate():this.initComponent(i,null),a.push(i));for(o=0;o<s.oldMixinIds.length;o++)if(r=document.getElementById(s.oldMixinIds[o]))for(i in r.componentCache)-1===a.indexOf(i)&&this.components[i]&&(this.getDOMAttribute(i)?this.components[i].handleMixinUpdate():this.removeComponent(i,!0))}else this.addEventListener("loaded-private",(function(){l.mixinUpdate(e,t,!0)}),c_)}setAttribute(e,t,n){var i,r,s,o,a,l=h_.singlePropUpdate;if(s=(o=e.indexOf(a_))>0?e.substring(0,o):e,!Bw[s])return"mixin"===e&&this.mixinUpdate(t),void super.setAttribute.call(this,e,t);if(!this.components[e]&&this.hasAttribute(e)&&this.updateComponent(e,window.HTMLElement.prototype.getAttribute.call(this,e)),void 0!==n&&"string"==typeof t&&t.length>0&&"string"==typeof uC(t)){for(a in l)delete l[a];(i=l)[t]=n,r=!1}else i=t,r=!0===n;this.updateComponent(e,i,r),this.sceneEl&&this.sceneEl.getAttribute("debug")&&this.components[e].flushToDOM()}flushToDOM(e){var t,n,i,r=this.components,s=this.children;for(i in r)r[i].flushToDOM();if(e)for(n=0;n<s.length;++n)(t=s[n]).flushToDOM&&t.flushToDOM(e)}getAttribute(e){var t,n,i,r,s;return"position"===e?this.object3D.position:"rotation"===e?(n=this,i=Wb.MathUtils.radToDeg,r=n.object3D.rotation,(s=n.rotationObj).x=i(r.x),s.y=i(r.y),s.z=i(r.z),s):"scale"===e?this.object3D.scale:"visible"===e?this.object3D.visible:(t=this.components[e])?t.data:window.HTMLElement.prototype.getAttribute.call(this,e)}getDOMAttribute(e){var t=this.components[e];return t?t.attrValue:window.HTMLElement.prototype.getAttribute.call(this,e)}addState(e){this.is(e)||(this.states.push(e),this.emit("stateadded",e))}removeState(e){var t=this.states.indexOf(e);-1!==t&&(this.states.splice(t,1),this.emit("stateremoved",e))}is(e){return-1!==this.states.indexOf(e)}inspect(){this.sceneEl.components.inspector.openInspector(this)}destroy(){var e;if(this.parentNode)o_("Entity can only be destroyed if detached from scenegraph.");else for(e in this.components)this.components[e].destroy()}}function u_(e,t){return!(!e.components[t]||!e.components[t].attrValue)||function(e,t){var n,i=!1;for(n=0;n<t.length&&!(i=t[n].hasAttribute(e));++n);return i}(t,e.mixinEls)}function d_(e){return-1!==e.indexOf(a_)&&(e=Gx(e,a_)[0]),!!Bw[e]}function p_(e){if(e.data&&"vr"===e.data.type)switch(e.data.data){case"enter":this.enterVR();break;case"exit":this.exitVR()}}h_.componentsUpdated=[],h_.singlePropUpdate={},customElements.define("a-entity",h_),gx()&&window.addEventListener("orientationchange",(function(){document.documentElement.style.height="initial",setTimeout((function(){document.documentElement.style.height="100%",setTimeout((function(){window.scrollTo(0,1)}),500)}),500)}));var f_=$b("core:a-scene:warn"),m_=gx(),A_=px(),g_=sx;class v_ extends h_{constructor(){var e;super(),(e=this).clock=new Wb.Clock,e.isIOS=m_,e.isMobile=A_,e.hasWebXR=g_,e.isAR=!1,e.isScene=!0,e.object3D=new Wb.Scene,e.object3D.onAfterRender=function(t,n,i){e.isPlaying&&e.tock(e.time,e.delta,i)},e.resize=e.resize.bind(e),e.render=e.render.bind(e),e.systems={},e.systemNames=[],e.time=e.delta=0,e.usedOfferSession=!1,e.componentOrder=[],e.behaviors={},e.hasLoaded=!1,e.isPlaying=!1,e.originalHTML=e.innerHTML}addFullScreenStyles(){document.documentElement.classList.add("a-fullscreen")}removeFullScreenStyles(){document.documentElement.classList.remove("a-fullscreen")}doConnectedCallback(){var e=this,t=this.hasAttribute("embedded");this.setAttribute("inspector",""),this.setAttribute("keyboard-shortcuts",""),this.setAttribute("screenshot",""),this.setAttribute("xr-mode-ui",""),this.setAttribute("device-orientation-permission-ui",""),super.doConnectedCallback(),function(e){var t;function n(){document.fullscreenElement||document.mozFullScreenElement||document.webkitFullscreenElement||e.exitVR(),document.activeElement.blur(),document.body.focus()}(t=document.createElement("canvas")).classList.add("a-canvas"),t.dataset.aframeCanvas=!0,e.appendChild(t),document.addEventListener("fullscreenchange",n),document.addEventListener("mozfullscreenchange",n),document.addEventListener("webkitfullscreenchange",n),document.addEventListener("MSFullscreenChange",n),t.addEventListener("touchmove",(function(e){e.preventDefault()}),{passive:!1}),e.canvas=t,e.emit("render-target-loaded",{target:t}),setTimeout(e.resize.bind(e),0)}(this),this.setupRenderer(),function(e,t){ZC=t;var n,i,r,s,o,a,l,c,h,u,d=(JC=e).hasAttribute(nw)?tw.parse(JC.getAttribute(nw)):void 0,p=d&&d.dotsColor||"white",f=d&&d.backgroundColor||"#24CAFF";(void 0===d||"true"===d.enabled||void 0===d.enabled)&&(n=new THREE.Scene,i=new THREE.SphereGeometry(.2,36,18,0,2*Math.PI,0,Math.PI),r=new THREE.MeshBasicMaterial({color:p}),s=new THREE.Mesh(i,r),o=s.clone(),a=s.clone(),l=new THREE.PerspectiveCamera(80,window.innerWidth/window.innerHeight,5e-4,1e4),c=new THREE.Clock,h=0,u=function(){JC.renderer.render(n,l),h=c.getElapsedTime()%4,s.visible=h>=1,o.visible=h>=2,a.visible=h>=3},n.background=new THREE.Color(f),n.add(l),s.position.set(-1,0,-15),o.position.set(0,0,-15),a.position.set(1,0,-15),l.add(s),l.add(o),l.add(a),(KC=document.createElement("div")).className="a-loader-title",KC.innerHTML=document.title,KC.style.display="none",KC.setAttribute(Xb,""),JC.appendChild(KC),setTimeout((function(){JC.hasLoaded||(iw(l),KC.style.display="block",window.addEventListener("resize",(function(){iw(l)})),JC.renderer.setAnimationLoop(u))}),200))}(this,b_),this.resize(),t||this.addFullScreenStyles(),VC()&&window.addEventListener("message",p_.bind(this)),function(e){var t,n=document.head,i=n.querySelector("script"),r=[];return qC.forEach(s),e.isIOS&&XC.forEach(s),r;function s(e){e&&!e.exists()&&(t=function(e){if(e&&e.tagName){var t=document.createElement(e.tagName);return t.setAttribute(Xb,""),DC(t,e.attributes)}}(e),t&&(i?i.parentNode.insertBefore(t,i):n.appendChild(t),r.push(t)))}}(this),function(e){if(e.isMobile){var t=e.wakelock=new(ew());e.addEventListener("enter-vr",(function(){t.request()})),e.addEventListener("exit-vr",(function(){t.release()}))}}(this),this.enterVRBound=function(){e.enterVR()},this.exitVRBound=function(){e.exitVR()},window.addEventListener("sessionend",this.resize),this.addEventListener("cameraready",(function(){e.attachedCallbackPostCamera()})),this.initSystems(),this.componentOrder=y_(Bw,this.componentOrder),this.addEventListener("componentregistered",(function(){e.componentOrder=y_(Bw,e.componentOrder)})),this.hasWebXR&&navigator.xr&&navigator.xr.addEventListener&&navigator.xr.addEventListener("sessiongranted",(function(){e.enterVR()}))}attachedCallbackPostCamera(){var e=this;window.addEventListener("load",void 0),window.addEventListener("resize",(function(){e.isIOS?setTimeout(e.resize,100):e.resize()})),this.play(),rw.push(this)}initSystems(){var e;for(e in this.initSystem("camera"),Zw)"camera"!==e&&this.initSystem(e)}initSystem(e){this.systems[e]||(this.systems[e]=new Zw[e](this),this.systemNames.push(e))}disconnectedCallback(){var e=rw.indexOf(this);super.disconnectedCallback(),rw.splice(e,1),window.removeEventListener("sessionend",this.resize),this.removeFullScreenStyles(),this.renderer.dispose()}addBehavior(e){var t,n,i=this.behaviors[e.name];for(n in i||(i=this.behaviors[e.name]={tick:{inUse:!1,array:[],markedForRemoval:[]},tock:{inUse:!1,array:[],markedForRemoval:[]}}),i)if(e[n]){if((t=i[n]).inUse){var r=t.markedForRemoval.indexOf(e);-1!==r&&t.markedForRemoval.splice(r,1)}-1===t.array.indexOf(e)&&t.array.push(e)}}getPointerLockElement(){return document.pointerLockElement}checkHeadsetConnected(){return lx()}enterAR(){var e;if(!this.hasWebXR)throw e="Failed to enter AR mode, WebXR not supported.",new Error(e);if(!cx())throw e="Failed to enter AR, WebXR immersive-ar mode not supported in your browser or device.",new Error(e);return this.enterVR(!0)}enterVR(e,t){var n,i=this,r=i.renderer.xr;if(t&&(!navigator.xr||!navigator.xr.offerSession))return Promise.resolve("OfferSession is not supported.");if(i.usedOfferSession&&t)return Promise.resolve("OfferSession was already called.");if(this.is("vr-mode"))return Promise.resolve("Already in VR.");if(this.checkHeadsetConnected()||this.isMobile){var s=i.getAttribute("renderer");if(r.enabled=!0,this.hasWebXR){this.xrSession&&this.xrSession.removeEventListener("end",this.exitVRBound);var o=this.sceneEl.systems.webxr.sessionReferenceSpaceType;r.setReferenceSpaceType(o);var a=e?"immersive-ar":"immersive-vr";return n=this.sceneEl.systems.webxr.sessionConfiguration,new Promise((function(e,o){var c=t?navigator.xr.offerSession.bind(navigator.xr):navigator.xr.requestSession.bind(navigator.xr);i.usedOfferSession|=t,c(a,n).then((function(o){t&&(i.usedOfferSession=!1),r.layersEnabled=-1!==n.requiredFeatures.indexOf("layers"),r.setSession(o).then((function(){r.setFoveation(s.foveationLevel),i.xrSession=o,i.systems.renderer.setWebXRFrameRate(o),o.addEventListener("end",i.exitVRBound),l(e)}))}),(function(e){o(new Error("Failed to enter "+("immersive-ar"===a?"AR":"VR")+" mode (`requestSession`)",{cause:e}))}))}))}throw new Error("Failed to enter "+(e?"AR":"VR")+" no WebXR")}return l(),Promise.resolve();function l(t){var n;e?i.addState("ar-mode"):i.addState("vr-mode"),i.emit("enter-vr",{target:i}),!i.hasWebXR&&i.isMobile&&screen.orientation&&screen.orientation.lock&&screen.orientation.lock("landscape"),i.addFullScreenStyles(),i.isMobile||i.checkHeadsetConnected()||((n=i.canvas).requestFullscreen||n.webkitRequestFullscreen||n.mozRequestFullScreen||n.msRequestFullscreen).apply(n,[{navigationUI:"hide"}]),i.resize(),t&&t()}}exitVR(){var e=this,t=this.renderer.xr;if(!this.is("vr-mode")&&!this.is("ar-mode"))return Promise.resolve("Not in immersive mode.");if(this.checkHeadsetConnected()||this.isMobile){if(t.enabled=!1,!this.hasWebXR)throw Error("Failed to exit VR - no WebXR");this.xrSession.removeEventListener("end",this.exitVRBound),this.xrSession.end().then((function(){}),(function(){})),this.xrSession=void 0}else(document.fullscreenElement||document.webkitFullscreenElement||document.mozFullScreenElement)&&(document.exitFullscreen?document.exitFullscreen():document.mozCancelFullScreen?document.mozCancelFullScreen():document.webkitExitFullscreen&&document.webkitExitFullscreen());return e.removeState("vr-mode"),e.removeState("ar-mode"),e.isMobile&&screen.orientation&&screen.orientation.unlock&&screen.orientation.unlock(),e.hasAttribute("embedded")&&e.removeFullScreenStyles(),e.resize(),e.isIOS&&Wx(e.canvas),e.renderer.setPixelRatio(window.devicePixelRatio),e.emit("exit-vr",{target:e}),Promise.resolve()}getAttribute(e){var t=this.systems[e];return t?t.data:h_.prototype.getAttribute.call(this,e)}getDOMAttribute(e){var t=this.systems[e];return t?t.data:h_.prototype.getDOMAttribute.call(this,e)}setAttribute(e,t,n){if(Zw[e]){r_.prototype.setAttribute.call(this,e,t);var i=this.systems[e];i&&i.updateProperties(t)}else h_.prototype.setAttribute.call(this,e,t,n)}removeBehavior(e){var t,n,i,r=this.behaviors[e.name];for(n in r)e[n]&&-1!==(i=(t=r[n]).array.indexOf(e))&&(t.inUse?-1===t.markedForRemoval.indexOf(e)&&t.markedForRemoval.push(e):(t.array[i]=t.array[t.array.length-1],t.array.pop()))}resize(){var e,t,n=this.camera,i=this.canvas,r=this.renderer.xr.isPresenting;e=this.renderer.xr.enabled&&r,!n||!i||this.is("vr-mode")&&(this.isMobile||e)||(t=b_(i,this.getAttribute("embedded")&&!this.is("vr-mode"),this.maxCanvasSize,this.is("vr-mode")),n.aspect=t.width/t.height,n.updateProjectionMatrix(),this.renderer.setSize(t.width,t.height,!1),this.emit("rendererresize",null,!1))}setupRenderer(){var e,t,n,i=this;n={alpha:!0,antialias:!A_,canvas:this.canvas,logarithmicDepthBuffer:!1,powerPreference:"high-performance"},this.maxCanvasSize={height:-1,width:-1},this.hasAttribute("renderer")&&((t=uC(this.getAttribute("renderer"))).precision&&(n.precision=t.precision+"p"),t.antialias&&"auto"!==t.antialias&&(n.antialias="true"===t.antialias),t.logarithmicDepthBuffer&&"auto"!==t.logarithmicDepthBuffer&&(n.logarithmicDepthBuffer="true"===t.logarithmicDepthBuffer),t.alpha&&(n.alpha="true"===t.alpha),t.stencil&&(n.stencil="true"===t.stencil),t.multiviewStereo&&(n.multiviewStereo="true"===t.multiviewStereo),this.maxCanvasSize={width:t.maxCanvasWidth?parseInt(t.maxCanvasWidth):this.maxCanvasSize.width,height:t.maxCanvasHeight?parseInt(t.maxCanvasHeight):this.maxCanvasSize.height}),(e=this.renderer=new Wb.WebGLRenderer(n)).setPixelRatio(window.devicePixelRatio),this.camera&&e.xr.setPoseTarget(this.camera.el.object3D),this.addEventListener("camera-set-active",(function(){e.xr.setPoseTarget(i.camera.el.object3D)}))}play(){var e=this,t=this;this.renderStarted?h_.prototype.play.call(this):(this.addEventListener("loaded",(function(){var e=this.renderer;h_.prototype.play.call(this),t.renderStarted||(t.resize(),t.renderer&&(window.performance&&window.performance.mark("render-started"),window.removeEventListener("resize",iw),KC&&(KC.style.display="none"),e.setAnimationLoop(this.render),t.renderStarted=!0,t.emit("renderstart")))})),setTimeout((function(){h_.prototype.load.call(e)})))}updateComponent(e){e in Zw||h_.prototype.updateComponent.apply(this,arguments)}tick(e,t){var n,i=this.systems;for(this.callComponentBehaviors("tick",e,t),n=0;n<this.systemNames.length;n++)i[this.systemNames[n]].tick&&i[this.systemNames[n]].tick(e,t)}tock(e,t,n){var i,r=this.systems;for(this.callComponentBehaviors("tock",e,t),i=0;i<this.systemNames.length;i++)r[this.systemNames[i]].tock&&r[this.systemNames[i]].tock(e,t,n)}render(e,t){var n=this.renderer;this.frame=t,this.delta=1e3*this.clock.getDelta(),this.time=1e3*this.clock.elapsedTime,this.isPlaying&&this.tick(this.time,this.delta);var i=null;this.is("ar-mode")&&(i=this.object3D.background,this.object3D.background=null),n.render(this.object3D,this.camera),i&&(this.object3D.background=i)}callComponentBehaviors(e,t,n){for(var i,r=0;r<this.componentOrder.length;r++){var s=this.behaviors[this.componentOrder[r]];if(s){var o=s[e];for(o.inUse=!0,i=0;i<o.array.length;i++)o.array[i].isPlaying&&o.array[i][e](t,n);for(o.inUse=!1,i=0;i<o.markedForRemoval.length;i++)this.removeBehavior(o.markedForRemoval[i]);o.markedForRemoval.length=0}}}}function y_(e,t){var n,i,r={},s=t||[];for(i in s.length=0,e){var o=e[i];if(void 0!==o){var a=o.before?o.before.slice(0):[],l=o.after?o.after.slice(0):[];r[i]={before:a,after:l,visited:!1,done:!1}}}for(i in r)for(n=0;n<r[i].before.length;n++){var c=r[i].before[n];c in r?r[c].after.push(i):f_("Invalid ordering constraint, no component named `"+c+"` referenced by `"+i+"`")}function h(e){if(e in r&&!r[e].done)if(r[e].visited)f_("Cycle detected, ignoring one or more before/after constraints. The resulting order might be incorrect");else{r[e].visited=!0;for(var t=0;t<r[e].after.length;t++){var n=r[e].after[t];n in r||f_("Invalid before/after constraint, no component named `"+n+"` referenced in `"+e+"`"),h(n)}r[e].done=!0,s.push(e)}}for(i in r)r[i].done||h(i);return s}function E_(e,t){var n,i=window.devicePixelRatio;return!t||-1===t.width&&-1===t.height||e.width*i<t.width&&e.height*i<t.height||(n=e.width/e.height,e.width*i>t.width&&-1!==t.width&&(e.width=Math.round(t.width/i),e.height=Math.round(t.width/n/i)),e.height*i>t.height&&-1!==t.height&&(e.height=Math.round(t.height/i),e.width=Math.round(t.height*n/i))),e}function b_(e,t,n,i){return e.parentElement?t?E_({height:e.parentElement.offsetHeight,width:e.parentElement.offsetWidth},n):function(e,t){var n;return n={height:document.body.offsetHeight,width:document.body.offsetWidth},t?n:E_(n,e)}(n,i):{height:0,width:0}}customElements.define("a-scene",v_);var x_=Cw,C_={},w_=[],__=function(){};function M_(e,t){var n,i={};if(Object.keys(t).forEach((function(e){i[e]={value:t[e],writable:!0}})),C_[e])throw new Error("The geometry `"+e+"` has been already registered");return((n=function(){__.call(this)}).prototype=Object.create(__.prototype,i)).name=e,n.prototype.constructor=n,C_[e]={Geometry:n,schema:x_(n.prototype.schema)},w_.push(e),n}__.prototype={schema:{},init:function(e){return this.geometry=new Wb.BufferGeometry,this.geometry},update:function(e){}};var I_=$b,S_=jx,T_=I_("extras:primitives:debug"),B_=I_("extras:primitives:warn"),R_=I_("extras:primitives:error"),L_={};function D_(e,t){if(e=e.toLowerCase(),!n_[e]){n_[e]=!0,T_("Registering <%s>",e),t.defaultAttributes&&B_("The 'defaultAttributes' object is deprecated. Use 'defaultComponents' instead.");var n=t.mappings||{},i=class extends h_{constructor(){super(),this.defaultComponentsFromPrimitive=t.defaultComponents||t.defaultAttributes||{},this.deprecated=t.deprecated||null,this.deprecatedMappings=t.deprecatedMappings||{},this.mappings=n,t.deprecated&&console.warn(t.deprecated),this.resolveMappingCollisions()}resolveMappingCollisions(){var e=this.mappings,t=this;Object.keys(e).forEach((function(n){var i;n!==n.toLowerCase()&&B_("Mapping keys should be specified in lower case. The mapping key "+n+" may not be recognized"),Bw[n]&&(i=e[n].replace(".","-"),e[i]=e[n],delete e[n],console.warn("The primitive "+t.tagName.toLowerCase()+" has a mapping collision. The attribute "+n+" has the same name as a registered component and has been renamed to "+i))}))}getExtraComponents(){var e,t,n,i,r,s=this;for(t=UC(this.defaultComponentsFromPrimitive),(r=this.getAttribute("mixin"))&&(r=Gx(r.trim(),/\s+/)).forEach((function(e){var n,r,c=document.getElementById(e);if(c){var h=c.rawAttributeCache,u=c.componentCache;for(var d in h){if(i=s.mappings[d])return void P_(i,h[d],t);d in u&&(t[d]=(n=t[d],r=u[d],o(n)?a(r):o(r)?a(n):l(n)&&l(r)?PC(n,r):a(r)))}}})),n=0;n<this.attributes.length;n++)e=this.attributes[n],(i=this.mappings[e.name])&&P_(i,e.value,t);return t;function o(e){return void 0===e}function a(e){return l(e)?PC({},e):e}function l(e){return null!==e&&e.constructor===Object}}attributeChangedCallback(e,t,n){var i=this.mappings[e];e in this.deprecatedMappings&&console.warn(this.deprecatedMappings[e]),e&&i?S_(this,i,n):super.attributeChangedCallback(e,t,n)}};return customElements.define(e,i),i.mappings=n,L_[e]=i,i}R_("Trying to register primitive "+e+" that has been already previously registered")}function P_(e,t,n){var i=Hx(e);i.constructor===Array?(n[i[0]]=n[i[0]]||{},n[i[0]][i[1]]=t.trim()):n[i]=t.trim()}var U_={},k_=[],N_={array:"v3",color:"v3",int:"i",number:"f",map:"t",time:"f",vec2:"v2",vec3:"v3",vec4:"v4"},O_=function(){};function F_(e,t){var n,i={};if(Object.keys(t).forEach((function(e){i[e]={value:t[e],writable:!0}})),U_[e])throw new Error("The shader "+e+" has already been registered");return((n=function(){O_.call(this)}).prototype=Object.create(O_.prototype,i)).name=e,n.prototype.constructor=n,U_[e]={Shader:n,schema:Cw(n.prototype.schema)},k_.push(e),n}O_.prototype={schema:{},vertexShader:"void main() {gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);}",fragmentShader:"void main() {gl_FragColor = vec4(1.0, 0.0, 1.0, 1.0);}",init:function(e){return this.uniforms=this.initUniforms(),this.material=new(this.raw?Wb.RawShaderMaterial:Wb.ShaderMaterial)({uniforms:this.uniforms,glslVersion:this.raw||this.glsl3?Wb.GLSL3:null,vertexShader:this.vertexShader,fragmentShader:this.fragmentShader}),this.material},initUniforms:function(){var e,t,n=this.schema,i={};for(e in n)"uniform"===n[e].is&&(t=N_[n[e].type],i[e]={type:t,value:void 0});return i},update:function(e){var t,n,i=this.schema,r=this.uniforms;for(t in e)if(i[t]&&"uniform"===i[t].is)if("map"!==i[t].type)r[t].value=this.parseValue(i[t].type,e[t]),r[t].needsUpdate=!0;else{if(!r[t]||r[t].value===e[t])continue;n="_texture_"+t,this.setMapOnTextureLoad(r,t,n),nC(n,t,this,e)}},parseValue:function(e,t){var n;switch(e){case"vec2":return new Wb.Vector2(t.x,t.y);case"vec3":return new Wb.Vector3(t.x,t.y,t.z);case"vec4":return new Wb.Vector4(t.x,t.y,t.z,t.w);case"color":return n=new Wb.Color(t),new Wb.Vector3(n.r,n.g,n.b);default:return t}},setMapOnTextureLoad:function(e,t,n){var i=this;this.el.addEventListener("materialtextureloaded",(function(){e[t].value=i.material[n],e[t].needsUpdate=!0}))}};var Q_=new Wb.FileLoader,z_=$b("core:a-assets:warn");function G_(e){if(e.hasAttribute("autoplay")||"auto"===e.getAttribute("preload"))return new Promise((function(t,n){if(4===e.readyState)return t();if(e.error)return n();function i(){for(var n=0,i=0;i<e.buffered.length;i++)n+=e.buffered.end(i)-e.buffered.start(i);n>=e.duration&&("VIDEO"===e.tagName&&Wb.Cache.add(e.getAttribute("src"),e),t())}e.addEventListener("loadeddata",i,!1),e.addEventListener("progress",i,!1),e.addEventListener("error",n,!1)}))}function H_(e){var t=function(e){var t,n,i;if(e.hasAttribute("crossorigin"))return e;if(null!==(t=e.getAttribute("src"))){if(-1===t.indexOf("://"))return e;if((i=(n=t).indexOf("://")>-1?n.split("/")[2]:n.split("/")[0]).substring(0,i.indexOf(":"))===window.location.host)return e}return z_('Cross-origin element (e.g., <img>) was requested without `crossorigin` set. A-Frame will re-request the asset with `crossorigin` attribute set. Please set `crossorigin` on the element (e.g., <img crossorigin="anonymous">)',t),e.crossOrigin="anonymous",e.cloneNode(!0)}(e);return t.tagName&&"video"===t.tagName.toLowerCase()&&(t.setAttribute("playsinline",""),t.setAttribute("webkit-playsinline","")),t!==e&&(e.parentNode.appendChild(t),e.parentNode.removeChild(e)),t}customElements.define("a-assets",class extends r_{constructor(){super(),this.isAssets=!0,this.fileLoader=Q_,this.timeout=null}doConnectedCallback(){var e,t,n,i,r,s,o=this,a=[];if(super.doConnectedCallback(),!this.parentNode.isScene)throw new Error("<a-assets> must be a child of a <a-scene>.");for(r=this.querySelectorAll("img"),e=0;e<r.length;e++)i=H_(r[e]),a.push(new Promise((function(t,n){Wb.Cache.add(r[e].getAttribute("src"),i),i.complete?t():(i.onload=t,i.onerror=n)})));for(n=this.querySelectorAll("audio, video"),e=0;e<n.length;e++)(t=H_(n[e])).src||t.srcObject||z_("Audio/video asset has neither `src` nor `srcObject` attributes."),a.push(G_(t));this.getChildren().forEach((function(e){e.isAssetItem&&e.hasAttribute("src")&&a.push(new Promise((function(t,n){if(e.hasLoaded)return t();e.addEventListener("loaded",t),e.addEventListener("error",n)})))})),Promise.allSettled(a).then((function(){null!==o.timeout&&o.load()})),s=parseInt(this.getAttribute("timeout"),10)||3e3,this.timeout=setTimeout((function(){o.hasLoaded||(z_("Asset loading timed out in",s,"ms"),o.timeout=null,o.emit("timeout"),o.load())}),s)}disconnectedCallback(){super.disconnectedCallback(),this.timeout&&clearTimeout(this.timeout)}load(){super.load.call(this,null,(function(){return!1}))}}),customElements.define("a-asset-item",class extends r_{constructor(){super(),this.data=null,this.isAssetItem=!0}connectedCallback(){var e=this,t=this.getAttribute("src");Q_.setResponseType(this.getAttribute("response-type")||function(e){var t=function(e){var t=document.createElement("a");t.href=e;var n=t.search.replace(/^\?/,""),i=e.replace(n,"").replace("?","");return i.substring(i.lastIndexOf("/")+1)}(e),n=t.lastIndexOf(".");return n>=0&&".glb"===t.slice(n,e.search(/\?|#|$/))?"arraybuffer":"text"}(t)),Q_.load(t,(function(t){e.data=t,r_.prototype.load.call(e)}),(function(t){e.emit("progress",{loadedBytes:t.loaded,totalBytes:t.total,xhr:t})}),(function(t){e.emit("error",{xhr:t},!1)}))}});var V_=$b("core:cubemap:warn");class j_ extends HTMLElement{constructor(e){return super(e)}onReadyStateChange(){"complete"===document.readyState&&this.doConnectedCallback()}connectedCallback(){"complete"===document.readyState?j_.prototype.doConnectedCallback.call(this):document.addEventListener("readystatechange",this.onReadyStateChange.bind(this))}doConnectedCallback(){this.srcs=this.validate()}validate(){var e,t=this.querySelectorAll("[src]"),n=[];if(6===t.length){for(e=0;e<t.length;e++)"IMG"===t[e].tagName?n.push(t[e]):n.push(t[e].getAttribute("src"));return n}V_("<a-cubemap> did not contain exactly six elements each with a `src` attribute.")}}customElements.define("a-cubemap",j_),customElements.define("a-mixin",class extends r_{constructor(){super(),this.componentCache={},this.rawAttributeCache={},this.isMixin=!0}doConnectedCallback(){super.doConnectedCallback(),this.sceneEl=this.closestScene(),this.id=this.getAttribute("id"),this.cacheAttributes(),this.updateEntities(),this.load()}attributeChangedCallback(e,t,n){super.attributeChangedCallback(),this.cacheAttribute(e,n),this.updateEntities()}setAttribute(e,t){window.HTMLElement.prototype.setAttribute.call(this,e,t),this.cacheAttribute(e,t)}cacheAttribute(e,t){var n,i;i=Gx(e,"__")[0],n=Bw[i],void 0===t&&(t=window.HTMLElement.prototype.getAttribute.call(this,e)),this.rawAttributeCache[e]=t,n&&(this.componentCache[e]=this.parseComponentAttrValue(n,t))}parseComponentAttrValue(e,t){var n;return"string"!=typeof t?t:(e.isSingleProperty?"string"==typeof(n=e.schema.parse(t))&&(n=t):n=uC(t),n)}getAttribute(e){return this.componentCache[e]||window.HTMLElement.prototype.getAttribute.call(this,e)}cacheAttributes(){var e,t,n=this.attributes;for(t=0;t<n.length;t++)e=n[t].name,this.cacheAttribute(e)}updateEntities(){var e,t,n;if(this.sceneEl)for(t=this.sceneEl.querySelectorAll("[mixin~="+this.id+"]"),n=0;n<t.length;n++)(e=t[n]).hasLoaded&&!e.isMixin&&e.mixinUpdate(this.id)}});const W_="1.6.0";var q_=new Wb.Color,X_=new Wb.Color,Y_=Vx,J_=jx,K_={},Z_="color",$_="rotation",eM="components";function tM(e){e.x=Wb.MathUtils.degToRad(e.x),e.y=Wb.MathUtils.degToRad(e.y),e.z=Wb.MathUtils.degToRad(e.z)}function nM(e,t,n){var i;for(i=0;i<t.length;i++)e.addEventListener(t[i],n)}function iM(e,t,n){var i;for(i=0;i<t.length;i++)e.removeEventListener(t[i],n)}function rM(e,t){var n,i,r;for(i=oM(t),r=e,n=0;n<i.length;n++)r=r[i[n]];if(void 0===r)throw console.log(e),new Error("[animation] property ("+t+") could not be found");return r}function sM(e,t,n,i){var r,s,o,a;for(t.startsWith("object3D.rotation")&&(n=Wb.MathUtils.degToRad(n)),s=oM(t),a=e,r=0;r<s.length-1;r++)a=a[s[r]];o=s[s.length-1],i!==Z_?a[o]=n:"r"in a[o]?(a[o].r=n.r,a[o].g=n.g,a[o].b=n.b):(a[o].x=n.r,a[o].y=n.g,a[o].z=n.b)}function oM(e){return e in K_||(K_[e]=e.split(".")),K_[e]}function aM(e){return e.isRawProperty||e.property.startsWith(eM)||e.property.startsWith("object3D")}Ww("animation",{schema:{autoplay:{default:!0},delay:{default:0},dir:{default:""},dur:{default:1e3},easing:{default:"easeInQuad"},elasticity:{default:400},enabled:{default:!0},from:{default:""},loop:{default:0,parse:function(e){return!0===e||"true"===e||!1!==e&&"false"!==e&&parseInt(e,10)}},property:{default:""},startEvents:{type:"array"},pauseEvents:{type:"array"},resumeEvents:{type:"array"},round:{default:!1},to:{default:""},type:{default:""},isRawProperty:{default:!1}},multiple:!0,init:function(){var e=this;this.eventDetail={name:this.attrName},this.time=0,this.animation=null,this.animationIsPlaying=!1,this.onStartEvent=this.onStartEvent.bind(this),this.beginAnimation=this.beginAnimation.bind(this),this.pauseAnimation=this.pauseAnimation.bind(this),this.resumeAnimation=this.resumeAnimation.bind(this),this.fromColor={},this.toColor={},this.targets={},this.targetsArray=[],this.updateConfigForDefault=this.updateConfigForDefault.bind(this),this.updateConfigForRawColor=this.updateConfigForRawColor.bind(this),this.config={complete:function(){e.animationIsPlaying=!1,e.el.emit("animationcomplete",e.eventDetail,!1),e.id&&e.el.emit("animationcomplete__"+e.id,e.eventDetail,!1)}}},update:function(e){var t=this.config,n=this.data;this.animationIsPlaying=!1,this.data.enabled&&n.property&&(t.autoplay=!1,t.direction=n.dir,t.duration=n.dur,t.easing=n.easing,t.elasticity=n.elasticity,t.loop=n.loop,t.round=n.round,this.createAndStartAnimation())},tick:function(e,t){this.animationIsPlaying&&(this.time+=t,this.animation.tick(this.time))},remove:function(){this.pauseAnimation(),this.removeEventListeners()},pause:function(){this.paused=!0,this.pausedWasPlaying=this.animationIsPlaying,this.pauseAnimation(),this.removeEventListeners()},play:function(){this.paused&&(this.paused=!1,this.addEventListeners(),this.pausedWasPlaying&&(this.resumeAnimation(),this.pausedWasPlaying=!1))},createAndStartAnimation:function(){var e=this.data;this.updateConfig(),this.animationIsPlaying=!1,this.animation=Re(this.config),this.animation.began=!0,this.removeEventListeners(),this.addEventListeners(),!e.autoplay||e.startEvents&&e.startEvents.length||(e.delay?setTimeout(this.beginAnimation,e.delay):this.beginAnimation())},beginAnimation:function(){this.updateConfig(),this.animation.began=!0,this.time=0,this.animationIsPlaying=!0,this.stopRelatedAnimations(),this.el.emit("animationbegin",this.eventDetail,!1)},pauseAnimation:function(){this.animationIsPlaying=!1},resumeAnimation:function(){this.animationIsPlaying=!0},onStartEvent:function(){this.data.enabled&&(this.updateConfig(),this.animation&&this.animation.pause(),this.animation=Re(this.config),this.data.delay?setTimeout(this.beginAnimation,this.data.delay):this.beginAnimation())},updateConfigForRawColor:function(){var e,t,n,i=this.config,r=this.data,s=this.el;if(!this.waitComponentInitRawProperty(this.updateConfigForRawColor)){for(t in e=""===r.from?rM(s,r.property):r.from,n=r.to,this.setColorConfig(e,n),e=this.fromColor,n=this.toColor,this.targetsArray.length=0,this.targetsArray.push(e),i.targets=this.targetsArray,n)i[t]=n[t];var o;i.update=(o={},function(e){var t;(t=e.animatables[0].target).r===o.r&&t.g===o.g&&t.b===o.b||sM(s,r.property,t,r.type)})}},updateConfigForDefault:function(){var e,t,n,i,r=this.config,s=this.data,o=this.el;this.waitComponentInitRawProperty(this.updateConfigForDefault)||(e=""===s.from?aM(s)?rM(o,s.property):Y_(o,s.property):s.from,n=s.to,isNaN(e||n)?(e=e?e.toString():e,n=n?n.toString():n):(e=parseFloat(e),n=parseFloat(n)),(t="true"===s.to||"false"===s.to||!0===s.to||!1===s.to)&&(e="true"===s.from||!0===s.from?1:0,n="true"===s.to||!0===s.to?1:0),this.targets.aframeProperty=e,r.targets=this.targets,r.aframeProperty=n,r.update=function(e){var n;(n=e.animatables[0].target.aframeProperty)!==i&&(i=n,t&&(n=n>=1),aM(s)?sM(o,s.property,n,s.type):J_(o,s.property,n))})},updateConfigForVector:function(){var e,t,n,i,r=this.config,s=this.data,o=this.el,a=oM(s.property),l="object3D"===a[0]?a[1]:a[0];for(e in t=""!==s.from?Ux(s.from):Y_(o,l),n=Ux(s.to),l===$_&&(tM(t),tM(n)),this.targetsArray.length=0,this.targetsArray.push(t),r.targets=this.targetsArray,n)r[e]=n[e];r.update="position"!==l&&l!==$_&&"scale"!==l?function(){var e={};return function(t){var n=t.animatables[0].target;n.x===e.x&&n.y===e.y&&n.z===e.z||(e.x=n.x,e.y=n.y,e.z=n.z,J_(o,s.property,n))}}():(i={},function(e){var t=e.animatables[0].target;t.x===i.x&&t.y===i.y&&t.z===i.z||(i.x=t.x,i.y=t.y,i.z=t.z,o.object3D[l].set(t.x,t.y,t.z))})},updateConfig:function(){var e;e=function(e,t){var n,i,r,s;return"object3D"!==(r=t.split("."))[0]||r[2]||"position"!==r[1]&&"rotation"!==r[1]&&"scale"!==r[1]?(i=r[0],s=r[1],(n=e.components[i]||Bw[i])?s&&!n.schema[s]?null:s?n.schema[s].type:n.schema.type:null):"vec3"}(this.el,this.data.property),aM(this.data)&&this.data.type===Z_?this.updateConfigForRawColor():"vec2"===e||"vec3"===e||"vec4"===e?this.updateConfigForVector():this.updateConfigForDefault()},waitComponentInitRawProperty:function(e){var t,n=this.data,i=this.el,r=this;return""===n.from&&!!n.property.startsWith(eM)&&(t=oM(n.property)[1],!i.components[t]&&(i.addEventListener("componentinitialized",(function n(s){s.detail.name===t&&(e(),r.animation=Re(r.config),i.removeEventListener("componentinitialized",n))})),!0))},stopRelatedAnimations:function(){var e,t;for(t in this.el.components)e=this.el.components[t],t!==this.attrName&&"animation"===e.name&&e.animationIsPlaying&&e.data.property===this.data.property&&(e.animationIsPlaying=!1)},addEventListeners:function(){var e=this.data,t=this.el;nM(t,e.startEvents,this.onStartEvent),nM(t,e.pauseEvents,this.pauseAnimation),nM(t,e.resumeEvents,this.resumeAnimation)},removeEventListeners:function(){var e=this.data,t=this.el;iM(t,e.startEvents,this.onStartEvent),iM(t,e.pauseEvents,this.pauseAnimation),iM(t,e.resumeEvents,this.resumeAnimation)},setColorConfig:function(e,t){q_.set(e),X_.set(t),e=this.fromColor,t=this.toColor,e.r=q_.r,e.g=q_.g,e.b=q_.b,t.r=X_.r,t.g=X_.g,t.b=X_.b}});var lM=$b("components:anchored:warn");Ww("anchored",{schema:{persistent:{default:!1}},init:function(){var e=this.el.sceneEl.getAttribute("webxr"),t=e.optionalFeatures;-1===t.indexOf("anchors")&&(t.push("anchors"),this.el.sceneEl.setAttribute("webxr",e)),this.auxQuaternion=new THREE.Quaternion,this.onEnterVR=this.onEnterVR.bind(this),this.el.sceneEl.addEventListener("enter-vr",this.onEnterVR)},onEnterVR:function(){this.anchor=void 0,this.requestPersistentAnchorPending=this.data.persistent,this.requestAnchorPending=!this.data.persistent},tick:function(){var e,t,n,i=this.el.sceneEl,r=i.renderer.xr,s=this.el.object3D;(i.is("ar-mode")||i.is("vr-mode"))&&(!this.anchor&&this.requestPersistentAnchorPending&&this.restorePersistentAnchor(),!this.anchor&&this.requestAnchorPending&&this.createAnchor(),this.anchor&&(e=i.frame,t=r.getReferenceSpace(),n=e.getPose(this.anchor.anchorSpace,t),s.position.copy(n.transform.position),s.quaternion.copy(n.transform.orientation)))},createAnchor:async function(e,t){var n,i,r,s,o=this.el.sceneEl,a=o.renderer.xr,l=this.el.object3D;e=e||l.position,t=t||this.auxQuaternion.setFromEuler(l.rotation),function(e){var t=e.renderer.xr.getSession();return t&&t.restorePersistentAnchor}(o)?(this.anchor&&this.deleteAnchor(),n=o.frame,i=a.getReferenceSpace(),r=new XRRigidTransform({x:e.x,y:e.y,z:e.z},{x:t.x,y:t.y,z:t.z,w:t.w}),this.requestAnchorPending=!1,s=await n.createAnchor(r,i),this.data.persistent&&(this.el.id?(this.persistentHandle=await s.requestPersistentHandle(),localStorage.setItem(this.el.id,this.persistentHandle)):lM("The anchor won't be persisted because the entity has no assigned id.")),o.object3D.attach(this.el.object3D),this.anchor=s):lM("This browser doesn't support the WebXR anchors module")},restorePersistentAnchor:async function(){var e,t=this.el.sceneEl.renderer.xr.getSession(),n=t.persistentAnchors;if(this.requestPersistentAnchorPending=!1,!this.el.id)return lM("The entity associated to the persistent anchor cannot be retrieved because it doesn't have an assigned id."),void(this.requestAnchorPending=!0);if(n){e=localStorage.getItem(this.el.id);for(var i=0;i<n.length;++i)if(e===n[i]){this.anchor=await t.restorePersistentAnchor(n[i]),this.anchor&&(this.persistentHandle=n[i]);break}this.anchor||(this.requestAnchorPending=!0)}else this.requestPersistentAnchorPending=!0},deleteAnchor:function(){var e,t=this.anchor;t&&(e=this.el.sceneEl.renderer.xr.getSession(),t.delete(),this.el.sceneEl.object3D.add(this.el.object3D),this.persistentHandle&&e.deletePersistentAnchor(this.persistentHandle),this.anchor=void 0)}}),Ww("camera",{schema:{active:{default:!0},far:{default:1e4},fov:{default:80,min:0},near:{default:.005,min:0},spectator:{default:!1},zoom:{default:1,min:0}},init:function(){var e,t=this.el;e=this.camera=new Wb.PerspectiveCamera,t.setObject3D("camera",e)},update:function(e){var t=this.data,n=this.camera;n.aspect=t.aspect||window.innerWidth/window.innerHeight,n.far=t.far,n.fov=t.fov,n.near=t.near,n.zoom=t.zoom,n.updateProjectionMatrix(),this.updateActiveCamera(e),this.updateSpectatorCamera(e)},updateActiveCamera:function(e){var t=this.data,n=this.el,i=this.system;e&&e.active===t.active||t.spectator||(t.active&&i.activeCameraEl!==n?i.setActiveCamera(n):t.active||i.activeCameraEl!==n||i.disableActiveCamera())},updateSpectatorCamera:function(e){var t=this.data,n=this.el,i=this.system;e&&e.spectator===t.spectator||(t.spectator&&i.spectatorCameraEl!==n?i.setSpectatorCamera(n):t.spectator||i.spectatorCameraEl!==n||i.disableSpectatorCamera())},remove:function(){this.el.removeObject3D("camera")}});var cM,hM,uM,dM,pM="click",fM="mouseup",mM="cursor-fusing",AM="cursor-hovering",gM="cursor-hovered",vM={DOWN:["mousedown","touchstart"],UP:["mouseup","touchend"]},yM={DOWN:["selectstart"],UP:["selectend"]},EM="a-mouse-cursor-hover",bM=(Ww("cursor",{dependencies:["raycaster"],schema:{downEvents:{default:[]},fuse:{default:px()},fuseTimeout:{default:1500,min:0},mouseCursorStylesEnabled:{default:!0},upEvents:{default:[]},rayOrigin:{default:"entity",oneOf:["mouse","entity","xrselect"]}},after:["tracked-controls"],multiple:!0,init:function(){var e=this;this.fuseTimeout=void 0,this.cursorDownEl=null,this.intersectedEl=null,this.canvasBounds=document.body.getBoundingClientRect(),this.isCursorDown=!1,this.activeXRInput=null,this.updateCanvasBounds=LC((function(){e.canvasBounds=e.el.sceneEl.canvas.getBoundingClientRect()}),500),this.eventDetail={},this.intersectedEventDetail={cursorEl:this.el},this.onCursorDown=this.onCursorDown.bind(this),this.onCursorUp=this.onCursorUp.bind(this),this.onIntersection=this.onIntersection.bind(this),this.onIntersectionCleared=this.onIntersectionCleared.bind(this),this.onMouseMove=this.onMouseMove.bind(this),this.onEnterVR=this.onEnterVR.bind(this)},update:function(e){var t=this.data.rayOrigin;t!==e.rayOrigin&&("entity"===t&&this.resetRaycaster(),this.updateMouseEventListeners(),"xrselect"!==t&&"entity"!==t||this.addWebXREventListeners(),"xrselect"!==e.rayOrigin&&"entity"!==e.rayOrigin||this.removeWebXREventListeners())},tick:function(){var e=this.el.sceneEl.frame,t=this.activeXRInput;"xrselect"===this.data.rayOrigin&&e&&t&&this.onMouseMove({frame:e,inputSource:t,type:"fakeselectevent"})},play:function(){this.addEventListeners()},pause:function(){this.removeEventListeners()},remove:function(){var e=this.el;e.removeState(AM),e.removeState(mM),clearTimeout(this.fuseTimeout),this.intersectedEl&&this.intersectedEl.removeState(gM),this.removeEventListeners()},addEventListeners:function(){var e,t=this.data,n=this.el,i=this;function r(){e=n.sceneEl.canvas,t.downEvents.length||t.upEvents.length||(vM.DOWN.forEach((function(t){e.addEventListener(t,i.onCursorDown,{passive:!1})})),vM.UP.forEach((function(t){e.addEventListener(t,i.onCursorUp,{passive:!1})})))}(e=n.sceneEl.canvas)?r():n.sceneEl.addEventListener("render-target-loaded",r),t.downEvents.forEach((function(e){n.addEventListener(e,i.onCursorDown)})),t.upEvents.forEach((function(e){n.addEventListener(e,i.onCursorUp)})),n.addEventListener("raycaster-intersection",this.onIntersection),n.addEventListener("raycaster-closest-entity-changed",this.onIntersection),n.addEventListener("raycaster-intersection-cleared",this.onIntersectionCleared),n.sceneEl.addEventListener("rendererresize",this.updateCanvasBounds),n.sceneEl.addEventListener("enter-vr",this.onEnterVR),window.addEventListener("resize",this.updateCanvasBounds),window.addEventListener("scroll",this.updateCanvasBounds),this.updateMouseEventListeners()},removeEventListeners:function(){var e,t=this.data,n=this.el,i=this;!(e=n.sceneEl.canvas)||t.downEvents.length||t.upEvents.length||(vM.DOWN.forEach((function(t){e.removeEventListener(t,i.onCursorDown)})),vM.UP.forEach((function(t){e.removeEventListener(t,i.onCursorUp)}))),t.downEvents.forEach((function(e){n.removeEventListener(e,i.onCursorDown)})),t.upEvents.forEach((function(e){n.removeEventListener(e,i.onCursorUp)})),n.removeEventListener("raycaster-intersection",this.onIntersection),n.removeEventListener("raycaster-closest-entity-changed",this.onIntersection),n.removeEventListener("raycaster-intersection-cleared",this.onIntersectionCleared),e.removeEventListener("mousemove",this.onMouseMove),e.removeEventListener("touchstart",this.onMouseMove),e.removeEventListener("touchmove",this.onMouseMove),n.sceneEl.removeEventListener("rendererresize",this.updateCanvasBounds),n.sceneEl.removeEventListener("enter-vr",this.onEnterVR),window.removeEventListener("resize",this.updateCanvasBounds),window.removeEventListener("scroll",this.updateCanvasBounds),this.removeWebXREventListeners()},updateMouseEventListeners:function(){var e,t=this.el;(e=t.sceneEl.canvas).removeEventListener("mousemove",this.onMouseMove),e.removeEventListener("touchmove",this.onMouseMove),t.setAttribute("raycaster","useWorldCoordinates",!1),"mouse"===this.data.rayOrigin&&(e.addEventListener("mousemove",this.onMouseMove),e.addEventListener("touchmove",this.onMouseMove,{passive:!1}),t.setAttribute("raycaster","useWorldCoordinates",!0),this.updateCanvasBounds())},resetRaycaster:function(){this.el.setAttribute("raycaster",{direction:(new THREE.Vector3).set(0,0,-1),origin:new THREE.Vector3})},addWebXREventListeners:function(){var e=this,t=this.el.sceneEl.xrSession;t&&(yM.DOWN.forEach((function(n){t.addEventListener(n,e.onCursorDown)})),yM.UP.forEach((function(n){t.addEventListener(n,e.onCursorUp)})))},removeWebXREventListeners:function(){var e=this,t=this.el.sceneEl.xrSession;t&&(yM.DOWN.forEach((function(n){t.removeEventListener(n,e.onCursorDown)})),yM.UP.forEach((function(n){t.removeEventListener(n,e.onCursorUp)})))},onMouseMove:(cM=new THREE.Vector3,hM=new THREE.Vector2,uM=new THREE.Vector3,dM={origin:uM,direction:cM},function(e){var t,n,i,r,s,o,a,l,c,h=this.canvasBounds,u=this.el.sceneEl.camera;u.parent.updateMatrixWorld(),n=(i="touchmove"===e.type||"touchstart"===e.type?e.touches.item(0):e).clientX-h.left,r=i.clientY-h.top,hM.x=n/h.width*2-1,hM.y=-r/h.height*2+1,"xrselect"!==this.data.rayOrigin||"selectstart"!==e.type&&"fakeselectevent"!==e.type?"fakeselectout"===e.type?(cM.set(0,1,0),uM.set(0,9999,0)):u&&u.isPerspectiveCamera?(uM.setFromMatrixPosition(u.matrixWorld),cM.set(hM.x,hM.y,.5).unproject(u).sub(uM).normalize()):u&&u.isOrthographicCamera?(uM.set(hM.x,hM.y,(u.near+u.far)/(u.near-u.far)).unproject(u),cM.set(0,0,-1).transformDirection(u.matrixWorld)):console.error("AFRAME.Raycaster: Unsupported camera type: "+u.type):(s=e.frame,o=e.inputSource,a=this.el.sceneEl.renderer.xr.getReferenceSpace(),(l=s.getPose(o.targetRaySpace,a))&&(c=l.transform,cM.set(0,0,-1),cM.applyQuaternion(c.orientation),uM.copy(c.position),(t=u.el.object3D.parent).localToWorld(uM),cM.transformDirection(t.matrixWorld))),this.el.setAttribute("raycaster",dM),"touchmove"===e.type&&e.preventDefault()}),onCursorDown:function(e){this.isCursorDown=!0,"mouse"===this.data.rayOrigin&&"touchstart"===e.type&&(this.onMouseMove(e),this.el.components.raycaster.checkIntersections(),e.preventDefault()),"xrselect"===this.data.rayOrigin&&"selectstart"===e.type&&(this.activeXRInput=e.inputSource,this.onMouseMove(e),this.el.components.raycaster.checkIntersections(),this.el.components.raycaster.intersectedEls.length&&void 0!==this.el.sceneEl.components["ar-hit-test"]&&this.el.sceneEl.getAttribute("ar-hit-test").enabled&&(this.el.sceneEl.setAttribute("ar-hit-test","enabled",!1),this.reenableARHitTest=!0)),this.twoWayEmit("mousedown",e),this.cursorDownEl=this.intersectedEl},onCursorUp:function(e){if(this.isCursorDown&&("xrselect"!==this.data.rayOrigin||this.activeXRInput===e.inputSource)){this.isCursorDown=!1;var t=this.data;this.twoWayEmit(fM,e),!0===this.reenableARHitTest&&(this.el.sceneEl.setAttribute("ar-hit-test","enabled",!0),this.reenableARHitTest=void 0),this.cursorDownEl&&this.cursorDownEl!==this.intersectedEl&&(this.intersectedEventDetail.intersection=null,this.cursorDownEl.emit(fM,this.intersectedEventDetail)),t.fuse&&"mouse"!==t.rayOrigin&&"xrselect"!==t.rayOrigin||!this.intersectedEl||this.cursorDownEl!==this.intersectedEl||this.twoWayEmit(pM,e),"xrselect"===t.rayOrigin&&this.onMouseMove({type:"fakeselectout"}),this.activeXRInput=null,this.cursorDownEl=null,"touchend"===e.type&&e.preventDefault()}},onIntersection:function(e){var t,n,i,r,s=this.el;n=e.detail.els[0]===s?1:0,r=e.detail.intersections[n],(i=e.detail.els[n])&&this.intersectedEl!==i&&(this.intersectedEl&&(t=this.el.components.raycaster.getIntersection(this.intersectedEl))&&t.distance<=r.distance||(this.clearCurrentIntersection(!0),this.setIntersection(i,r)))},onIntersectionCleared:function(e){-1!==e.detail.clearedEls.indexOf(this.intersectedEl)&&this.clearCurrentIntersection()},onEnterVR:function(){var e=this.data.rayOrigin;this.clearCurrentIntersection(!0),"xrselect"!==e&&"entity"!==e||this.addWebXREventListeners()},setIntersection:function(e,t){var n=this.el,i=this.data,r=this;this.intersectedEl!==e&&(this.intersectedEl=e,n.addState(AM),e.addState(gM),this.twoWayEmit("mouseenter"),this.data.mouseCursorStylesEnabled&&"mouse"===this.data.rayOrigin&&this.el.sceneEl.canvas.classList.add(EM),0!==i.fuseTimeout&&i.fuse&&"xrselect"!==i.rayOrigin&&"mouse"!==i.rayOrigin&&(n.addState(mM),this.twoWayEmit("fusing"),this.fuseTimeout=setTimeout((function(){n.removeState(mM),r.twoWayEmit(pM)}),i.fuseTimeout)))},clearCurrentIntersection:function(e){var t,n,i=this.el;this.intersectedEl&&(this.intersectedEl.removeState(gM),i.removeState(AM),i.removeState(mM),this.twoWayEmit("mouseleave"),this.data.mouseCursorStylesEnabled&&"mouse"===this.data.rayOrigin&&this.el.sceneEl.canvas.classList.remove(EM),this.intersectedEl=null,clearTimeout(this.fuseTimeout),!0!==e&&0!==(n=this.el.components.raycaster.intersections).length&&(t=n[n[0].object.el===i?1:0])&&this.setIntersection(t.object.el,t))},twoWayEmit:function(e,t){var n,i=this.el,r=this.intersectedEl;function s(e,n){t instanceof MouseEvent?e.mouseEvent=t:"undefined"!=typeof TouchEvent&&t instanceof TouchEvent&&(e.touchEvent=t)}n=this.el.components.raycaster.getIntersection(r),this.eventDetail.intersectedEl=r,this.eventDetail.intersection=n,s(this.eventDetail),i.emit(e,this.eventDetail),r&&(this.intersectedEventDetail.intersection=n,s(this.intersectedEventDetail),r.emit(e,this.intersectedEventDetail))}}),new Wb.BufferGeometry),xM=(Ww("geometry",{schema:{buffer:{default:!0},primitive:{default:"box",oneOf:w_,schemaChange:!0},skipCache:{default:!1}},init:function(){this.geometry=null},update:function(e){var t,n=this.data,i=this.el,r=this.system;this.geometry&&(r.unuseGeometry(e),this.geometry=null),this.geometry=r.getOrCreateGeometry(n),(t=i.getObject3D("mesh"))?t.geometry=this.geometry:((t=new Wb.Mesh).geometry=this.geometry,this.el.getAttribute("material")||(t.material=new Wb.MeshStandardMaterial({color:16777215*Math.random(),metalness:0,roughness:.5})),i.setObject3D("mesh",t))},remove:function(){this.system.unuseGeometry(this.data),this.el.getObject3D("mesh").geometry=bM,this.geometry=null},updateSchema:function(e){var t=this.oldData&&this.oldData.primitive,n=e.primitive,i=C_[n]&&C_[n].schema;if(!i)throw new Error("Unknown geometry schema `"+n+"`");t&&t===n||this.extendSchema(i)}}),"generic"),CM=(Ww("generic-tracked-controller-controls",{schema:{hand:{default:""},defaultModel:{default:!0},defaultModelColor:{default:"gray"},disabled:{default:!1}},after:["tracked-controls"],mapping:{axes:{touchpad:[0,1],thumbstick:[2,3]},buttons:["trigger","squeeze","touchpad","thumbstick"]},bindMethods:function(){this.onControllersUpdate=this.onControllersUpdate.bind(this),this.checkIfControllerPresent=this.checkIfControllerPresent.bind(this),this.removeControllersUpdateListener=this.removeControllersUpdateListener.bind(this),this.onAxisMoved=this.onAxisMoved.bind(this)},init:function(){var e=this;this.onButtonChanged=this.onButtonChanged.bind(this),this.onButtonDown=function(t){CC(t.detail.id,"down",e)},this.onButtonUp=function(t){CC(t.detail.id,"up",e)},this.onButtonTouchStart=function(t){CC(t.detail.id,"touchstart",e)},this.onButtonTouchEnd=function(t){CC(t.detail.id,"touchend",e)},this.controllerPresent=!1,this.wasControllerConnected=!1,this.bindMethods(),this.el.addEventListener("controllerconnected",(function(t){t.detail.name!==e.name&&(e.wasControllerConnected=!0,e.removeEventListeners(),e.removeControllersUpdateListener())}))},addEventListeners:function(){var e=this.el;e.addEventListener("buttonchanged",this.onButtonChanged),e.addEventListener("buttondown",this.onButtonDown),e.addEventListener("buttonup",this.onButtonUp),e.addEventListener("touchstart",this.onButtonTouchStart),e.addEventListener("touchend",this.onButtonTouchEnd),e.addEventListener("axismove",this.onAxisMoved),this.controllerEventsActive=!0},removeEventListeners:function(){var e=this.el;e.removeEventListener("buttonchanged",this.onButtonChanged),e.removeEventListener("buttondown",this.onButtonDown),e.removeEventListener("buttonup",this.onButtonUp),e.removeEventListener("touchstart",this.onButtonTouchStart),e.removeEventListener("touchend",this.onButtonTouchEnd),e.removeEventListener("axismove",this.onAxisMoved),this.controllerEventsActive=!1},checkIfControllerPresent:function(){var e=this.data,t=e.hand?e.hand:void 0;yC(this,xM,{hand:t,iterateControllerProfiles:!0})},play:function(){this.wasControllerConnected||(this.checkIfControllerPresent(),this.addControllersUpdateListener())},pause:function(){this.removeEventListeners(),this.removeControllersUpdateListener()},injectTrackedControls:function(){var e=this.el,t=this.data;this.el.components["tracked-controls"]?this.removeEventListeners():(e.setAttribute("tracked-controls",{hand:t.hand,idPrefix:xM,iterateControllerProfiles:!0}),this.data.defaultModel&&this.initDefaultModel())},addControllersUpdateListener:function(){this.el.sceneEl.addEventListener("controllersupdated",this.onControllersUpdate,!1)},removeControllersUpdateListener:function(){this.el.sceneEl.removeEventListener("controllersupdated",this.onControllersUpdate,!1)},onControllersUpdate:function(){this.wasControllerConnected&&this.checkIfControllerPresent()},onButtonChanged:function(e){var t=this.mapping.buttons[e.detail.id];t&&this.el.emit(t+"changed",e.detail.state)},onAxisMoved:function(e){xC(this,this.mapping.axes,e)},initDefaultModel:function(){var e=this.modelEl=document.createElement("a-entity");e.setAttribute("geometry",{primitive:"sphere",radius:.03}),e.setAttribute("material",{color:this.data.color}),this.el.appendChild(e),this.el.emit("controllermodelready",{name:"generic-tracked-controller-controls",model:this.modelEl,rayOrigin:{origin:{x:0,y:0,z:-.01},direction:{x:0,y:0,z:-1}}})}}),$b("components:gltf-model:warn"));Ww("gltf-model",{schema:{type:"model"},init:function(){var e=this,t=this.system.getDRACOLoader(),n=this.system.getMeshoptDecoder(),i=this.system.getKTX2Loader();this.model=null,this.loader=new Wb.GLTFLoader,t&&this.loader.setDRACOLoader(t),this.ready=n?n.then((function(t){e.loader.setMeshoptDecoder(t)})):Promise.resolve(),i&&this.loader.setKTX2Loader(i)},update:function(){var e=this,t=this.el,n=this.data;n&&(this.remove(),this.ready.then((function(){e.loader.load(n,(function(n){e.model=n.scene||n.scenes[0],e.model.animations=n.animations,t.setObject3D("mesh",e.model),t.emit("model-loaded",{format:"gltf",model:e.model})}),void 0,(function(e){var i=e&&e.message?e.message:"Failed to load glTF model";CM(i),t.emit("model-error",{format:"gltf",src:n})}))})))},remove:function(){this.model&&this.el.removeObject3D("mesh")}}),Ww("grabbable",{init:function(){this.el.setAttribute("obb-collider","centerModel: true")}});var wM,_M=qb+"controllers/oculus-hands/v4/left.glb",MM=qb+"controllers/oculus-hands/v4/right.glb",IM=["wrist","thumb-metacarpal","thumb-phalanx-proximal","thumb-phalanx-distal","thumb-tip","index-finger-metacarpal","index-finger-phalanx-proximal","index-finger-phalanx-intermediate","index-finger-phalanx-distal","index-finger-tip","middle-finger-metacarpal","middle-finger-phalanx-proximal","middle-finger-phalanx-intermediate","middle-finger-phalanx-distal","middle-finger-tip","ring-finger-metacarpal","ring-finger-phalanx-proximal","ring-finger-phalanx-intermediate","ring-finger-phalanx-distal","ring-finger-tip","pinky-finger-metacarpal","pinky-finger-phalanx-proximal","pinky-finger-phalanx-intermediate","pinky-finger-phalanx-distal","pinky-finger-tip"];Ww("hand-tracking-controls",{schema:{hand:{default:"right",oneOf:["left","right"]},modelStyle:{default:"mesh",oneOf:["dots","mesh"]},modelColor:{default:"white"},modelOpacity:{default:1}},after:["tracked-controls"],bindMethods:function(){this.onControllersUpdate=this.onControllersUpdate.bind(this),this.checkIfControllerPresent=this.checkIfControllerPresent.bind(this),this.removeControllersUpdateListener=this.removeControllersUpdateListener.bind(this)},addEventListeners:function(){this.el.addEventListener("model-loaded",this.onModelLoaded);for(var e=0;e<this.jointEls.length;++e)this.jointEls[e].object3D.visible=!0},removeEventListeners:function(){this.el.removeEventListener("model-loaded",this.onModelLoaded);for(var e=0;e<this.jointEls.length;++e)this.jointEls[e].object3D.visible=!1},init:function(){var e=this.el.sceneEl,t=e.getAttribute("webxr"),n=t.optionalFeatures;-1===n.indexOf("hand-tracking")&&(n.push("hand-tracking"),e.setAttribute("webxr",t)),this.wristObject3D=new THREE.Object3D,this.el.sceneEl.object3D.add(this.wristObject3D),this.onModelLoaded=this.onModelLoaded.bind(this),this.onChildAttached=this.onChildAttached.bind(this),this.jointEls=[],this.controllerPresent=!1,this.isPinched=!1,this.pinchEventDetail={position:new THREE.Vector3,wristRotation:new THREE.Quaternion},this.indexTipPosition=new THREE.Vector3,this.hasPoses=!1,this.jointPoses=new Float32Array(16*IM.length),this.jointRadii=new Float32Array(IM.length),this.bindMethods(),this.updateReferenceSpace=this.updateReferenceSpace.bind(this),this.el.sceneEl.addEventListener("enter-vr",this.updateReferenceSpace),this.el.sceneEl.addEventListener("exit-vr",this.updateReferenceSpace),this.el.addEventListener("child-attached",this.onChildAttached),this.wristObject3D.visible=!1},onChildAttached:function(e){this.addChildEntity(e.detail.el)},update:function(){this.updateModelMaterial()},updateModelMaterial:function(){var e=this.jointEls,t=this.skinnedMesh,n=!(1===this.data.modelOpacity);t&&(this.skinnedMesh.material.color.set(this.data.modelColor),this.skinnedMesh.material.transparent=n,this.skinnedMesh.material.opacity=this.data.modelOpacity);for(var i=0;i<e.length;i++)e[i].setAttribute("material",{color:this.data.modelColor,transparent:n,opacity:this.data.modelOpacity})},updateReferenceSpace:function(){var e=this,t=this.el.sceneEl.xrSession;if(this.referenceSpace=void 0,t){var n=e.el.sceneEl.systems.webxr.sessionReferenceSpaceType;t.requestReferenceSpace(n).then((function(t){e.referenceSpace=t})).catch((function(t){throw e.el.sceneEl.systems.webxr.warnIfFeatureNotRequested(n,"tracked-controls-webxr uses reference space "+n),t}))}},checkIfControllerPresent:function(){var e=this.data;yC(this,"",{hand:e.hand?e.hand:void 0,iterateControllerProfiles:!0,handTracking:!0})},play:function(){this.checkIfControllerPresent(),this.addControllersUpdateListener()},tick:function(){var e=this.el.sceneEl,t=this.el.components["tracked-controls"]&&this.el.components["tracked-controls"].controller,n=e.frame,i=this.el.components["tracked-controls"],r=this.referenceSpace;t&&n&&r&&i&&(this.hasPoses=!1,t.hand&&(this.el.object3D.position.set(0,0,0),this.el.object3D.rotation.set(0,0,0),this.hasPoses=n.fillPoses(t.hand.values(),r,this.jointPoses)&&n.fillJointRadii(t.hand.values(),this.jointRadii),this.updateHandModel(),this.detectGesture(),this.updateWristObject()))},updateWristObject:(wM=new THREE.Matrix4,function(){var e=this.wristObject3D;e&&this.hasPoses&&(wM.fromArray(this.jointPoses,0),e.position.setFromMatrixPosition(wM),e.quaternion.setFromRotationMatrix(wM))}),updateHandModel:function(){this.wristObject3D.visible=!0,this.el.object3D.visible=!0,"dots"===this.data.modelStyle&&this.updateHandDotsModel(),"mesh"===this.data.modelStyle&&this.updateHandMeshModel()},getBone:function(e){for(var t=this.bones,n=0;n<t.length;n++)if(t[n].name===e)return t[n];return null},updateHandMeshModel:function(){var e=new THREE.Matrix4;return function(){var t=0,n=this.jointPoses,i=this.el.components["tracked-controls"]&&this.el.components["tracked-controls"].controller;if(i&&this.mesh&&(this.mesh.visible=!1,this.hasPoses))for(var r of i.hand.values()){var s=this.getBone(r.jointName);null!=s&&(this.mesh.visible=!0,e.fromArray(n,16*t),s.position.setFromMatrixPosition(e),s.quaternion.setFromRotationMatrix(e)),t++}}}(),updateHandDotsModel:function(){for(var e,t,n=this.jointPoses,i=this.jointRadii,r=this.el.components["tracked-controls"]&&this.el.components["tracked-controls"].controller,s=0;s<r.hand.size;s++)t=(e=this.jointEls[s]).object3D,e.object3D.visible=this.hasPoses,this.hasPoses&&(t.matrix.fromArray(n,16*s),t.matrix.decompose(t.position,t.rotation,t.scale),e.setAttribute("scale",{x:i[s],y:i[s],z:i[s]}))},detectGesture:function(){this.detectPinch()},detectPinch:function(){var e=new THREE.Vector3,t=new THREE.Matrix4;return function(){var n=this.indexTipPosition,i=this.pinchEventDetail;if(this.hasPoses){e.setFromMatrixPosition(t.fromArray(this.jointPoses,64)),n.setFromMatrixPosition(t.fromArray(this.jointPoses,144)),i.wristRotation.setFromRotationMatrix(t.fromArray(this.jointPoses,0));var r=n.distanceTo(e);r<.015&&!1===this.isPinched&&(this.isPinched=!0,i.position.copy(n).add(e).multiplyScalar(.5),this.el.emit("pinchstarted",i)),r>.02&&!0===this.isPinched&&(this.isPinched=!1,i.position.copy(n).add(e).multiplyScalar(.5),this.el.emit("pinchended",i)),this.isPinched&&(i.position.copy(n).add(e).multiplyScalar(.5),this.el.emit("pinchmoved",i))}}}(),pause:function(){this.removeEventListeners(),this.removeControllersUpdateListener()},injectTrackedControls:function(){var e=this.el,t=this.data;e.setAttribute("tracked-controls",{id:"",hand:t.hand,iterateControllerProfiles:!0,handTrackingEnabled:!0}),this.mesh?this.mesh!==e.getObject3D("mesh")&&e.setObject3D("mesh",this.mesh):this.initDefaultModel()},addControllersUpdateListener:function(){this.el.sceneEl.addEventListener("controllersupdated",this.onControllersUpdate,!1)},removeControllersUpdateListener:function(){this.el.sceneEl.removeEventListener("controllersupdated",this.onControllersUpdate,!1)},onControllersUpdate:function(){var e,t=this.el;this.checkIfControllerPresent(),e=t.components["tracked-controls"]&&t.components["tracked-controls"].controller,this.mesh&&e&&e.hand&&e.hand instanceof XRHand&&t.setObject3D("mesh",this.mesh)},initDefaultModel:function(){var e=this.data;"dots"===e.modelStyle&&this.initDotsModel(),"mesh"===e.modelStyle&&this.initMeshHandModel(),this.el.object3D.visible=!0,this.wristObject3D.visible=!0},initDotsModel:function(){if(0===this.jointEls.length){for(var e=0;e<IM.length;++e){var t=this.jointEl=document.createElement("a-entity");t.setAttribute("geometry",{primitive:"sphere",radius:1}),t.object3D.visible=!1,this.el.appendChild(t),this.jointEls.push(t)}this.updateModelMaterial()}},initMeshHandModel:function(){var e="left"===this.data.hand?_M:MM;this.el.setAttribute("gltf-model",e)},onModelLoaded:function(){var e=this.mesh=this.el.getObject3D("mesh").children[0],t=this.skinnedMesh=e.getObjectByProperty("type","SkinnedMesh");this.skinnedMesh&&(this.bones=t.skeleton.bones,this.el.removeObject3D("mesh"),e.position.set(0,0,0),e.rotation.set(0,0,0),t.frustumCulled=!1,t.material=new THREE.MeshStandardMaterial,this.updateModelMaterial(),this.setupChildrenEntities(),this.el.setObject3D("mesh",e))},setupChildrenEntities:function(){for(var e=this.el.children,t=0;t<e.length;++t)e[t]instanceof h_&&this.addChildEntity(e[t])},addChildEntity:function(e){e instanceof h_&&this.wristObject3D.add(e.object3D)}}),Ww("hand-tracking-grab-controls",{schema:{hand:{default:"right",oneOf:["left","right"]},color:{type:"color",default:"white"},hoverColor:{type:"color",default:"#538df1"},hoverEnabled:{default:!1}},init:function(){var e,t=this.el,n=this.data;e="right"===n.hand?"components.hand-tracking-controls.bones.3":"components.hand-tracking-controls.bones.21",t.setAttribute("hand-tracking-controls",{hand:n.hand}),t.setAttribute("obb-collider",{trackedObject3D:e,size:.04}),this.auxMatrix=new Wb.Matrix4,this.onCollisionStarted=this.onCollisionStarted.bind(this),this.el.addEventListener("obbcollisionstarted",this.onCollisionStarted),this.onCollisionEnded=this.onCollisionEnded.bind(this),this.el.addEventListener("obbcollisionended",this.onCollisionEnded),this.onPinchStarted=this.onPinchStarted.bind(this),this.el.addEventListener("pinchstarted",this.onPinchStarted),this.onPinchEnded=this.onPinchEnded.bind(this),this.el.addEventListener("pinchended",this.onPinchEnded)},transferEntityOwnership:function(){for(var e,t=this.el.sceneEl.querySelectorAll("[hand-tracking-grab-controls]"),n=0;n<t.length;++n)(e=t[n].components["hand-tracking-grab-controls"])!==this&&this.grabbedEl&&this.grabbedEl===e.grabbedEl&&e.releaseGrabbedEntity();return!1},onCollisionStarted:function(e){var t=e.detail.withEl;this.collidedEl||t.getAttribute("grabbable")&&(this.collidedEl=t,this.grabbingObject3D=e.detail.trackedObject3D,this.data.hoverEnabled&&this.el.setAttribute("hand-tracking-controls","modelColor",this.data.hoverColor))},onCollisionEnded:function(){this.collidedEl=void 0,this.grabbedEl||(this.grabbingObject3D=void 0,this.data.hoverEnabled&&this.el.setAttribute("hand-tracking-controls","modelColor",this.data.color))},onPinchStarted:function(e){this.collidedEl&&(this.grabbedEl=this.collidedEl,this.transferEntityOwnership(),this.grab())},onPinchEnded:function(){this.releaseGrabbedEntity()},releaseGrabbedEntity:function(){var e=this.grabbedEl;if(e){var t=e.object3D,n=t.parent,i=this.originalParent;t.applyMatrix4(n.matrixWorld),t.applyMatrix4(this.auxMatrix.copy(i.matrixWorld).invert()),n.remove(t),i.add(t),this.el.emit("grabended",{grabbedEl:e}),this.grabbedEl=void 0,this.originalParent=void 0}},grab:function(){var e=this.grabbedEl,t=e.object3D,n=t.parent;this.originalParent=n;var i=this.el.components["hand-tracking-controls"].wristObject3D;t.applyMatrix4(n.matrixWorld),t.applyMatrix4(this.auxMatrix.copy(i.matrixWorld).invert()),n.remove(t),i.add(t),this.el.emit("grabstarted",{grabbedEl:e})}});var SM={toonLeft:qb+"controllers/hands/leftHand.glb",toonRight:qb+"controllers/hands/rightHand.glb",lowPolyLeft:qb+"controllers/hands/leftHandLow.glb",lowPolyRight:qb+"controllers/hands/rightHandLow.glb",highPolyLeft:qb+"controllers/hands/leftHandHigh.glb",highPolyRight:qb+"controllers/hands/rightHandHigh.glb"},TM="Point",BM="Fist",RM="Thumb Up",LM={};function DM(e,t){var n;if(e)return"grip"===(n=LM[e])?n+(t?"close":"open"):"point"===n?n+(t?"up":"down"):"pointing"===n||"pistol"===n?n+(t?"start":"end"):void 0}LM[BM]="grip",LM[RM]="pistol",LM[TM]="pointing",Ww("hand-controls",{schema:{color:{default:"white",type:"color"},hand:{default:"left"},handModelStyle:{default:"lowPoly",oneOf:["lowPoly","highPoly","toon"]}},after:["tracked-controls"],init:function(){var e=this,t=this.el;this.pressedButtons={},this.touchedButtons={},this.loader=new THREE.GLTFLoader,this.loader.setCrossOrigin("anonymous"),this.onGripDown=function(){e.handleButton("grip","down")},this.onGripUp=function(){e.handleButton("grip","up")},this.onTrackpadDown=function(){e.handleButton("trackpad","down")},this.onTrackpadUp=function(){e.handleButton("trackpad","up")},this.onTrackpadTouchStart=function(){e.handleButton("trackpad","touchstart")},this.onTrackpadTouchEnd=function(){e.handleButton("trackpad","touchend")},this.onTriggerDown=function(){e.handleButton("trigger","down")},this.onTriggerUp=function(){e.handleButton("trigger","up")},this.onTriggerTouchStart=function(){e.handleButton("trigger","touchstart")},this.onTriggerTouchEnd=function(){e.handleButton("trigger","touchend")},this.onGripTouchStart=function(){e.handleButton("grip","touchstart")},this.onGripTouchEnd=function(){e.handleButton("grip","touchend")},this.onThumbstickDown=function(){e.handleButton("thumbstick","down")},this.onThumbstickUp=function(){e.handleButton("thumbstick","up")},this.onAorXTouchStart=function(){e.handleButton("AorX","touchstart")},this.onAorXTouchEnd=function(){e.handleButton("AorX","touchend")},this.onBorYTouchStart=function(){e.handleButton("BorY","touchstart")},this.onBorYTouchEnd=function(){e.handleButton("BorY","touchend")},this.onSurfaceTouchStart=function(){e.handleButton("surface","touchstart")},this.onSurfaceTouchEnd=function(){e.handleButton("surface","touchend")},this.onControllerConnected=this.onControllerConnected.bind(this),this.onControllerDisconnected=this.onControllerDisconnected.bind(this),t.addEventListener("controllerconnected",this.onControllerConnected),t.addEventListener("controllerdisconnected",this.onControllerDisconnected),t.object3D.visible=!1},play:function(){this.addEventListeners()},pause:function(){this.removeEventListeners()},tick:function(e,t){var n=this.el.getObject3D("mesh");n&&n.mixer&&n.mixer.update(t/1e3)},onControllerConnected:function(e){var t=this.el,n=this.data.hand,i=this.el.getObject3D("mesh");t.object3D.visible=!0;var r="left"===n?Math.PI/2:-Math.PI/2,s=t.sceneEl.hasWebXR?-Math.PI/2:0;"pico-controls"===e.detail.name&&(s+=Math.PI/4),i.position.set(0,0,0),i.rotation.set(s,0,r)},onControllerDisconnected:function(){this.el.object3D.visible=!1},addEventListeners:function(){var e=this.el;e.addEventListener("gripdown",this.onGripDown),e.addEventListener("gripup",this.onGripUp),e.addEventListener("trackpaddown",this.onTrackpadDown),e.addEventListener("trackpadup",this.onTrackpadUp),e.addEventListener("trackpadtouchstart",this.onTrackpadTouchStart),e.addEventListener("trackpadtouchend",this.onTrackpadTouchEnd),e.addEventListener("triggerdown",this.onTriggerDown),e.addEventListener("triggerup",this.onTriggerUp),e.addEventListener("triggertouchstart",this.onTriggerTouchStart),e.addEventListener("triggertouchend",this.onTriggerTouchEnd),e.addEventListener("griptouchstart",this.onGripTouchStart),e.addEventListener("griptouchend",this.onGripTouchEnd),e.addEventListener("thumbstickdown",this.onThumbstickDown),e.addEventListener("thumbstickup",this.onThumbstickUp),e.addEventListener("abuttontouchstart",this.onAorXTouchStart),e.addEventListener("abuttontouchend",this.onAorXTouchEnd),e.addEventListener("bbuttontouchstart",this.onBorYTouchStart),e.addEventListener("bbuttontouchend",this.onBorYTouchEnd),e.addEventListener("xbuttontouchstart",this.onAorXTouchStart),e.addEventListener("xbuttontouchend",this.onAorXTouchEnd),e.addEventListener("ybuttontouchstart",this.onBorYTouchStart),e.addEventListener("ybuttontouchend",this.onBorYTouchEnd),e.addEventListener("surfacetouchstart",this.onSurfaceTouchStart),e.addEventListener("surfacetouchend",this.onSurfaceTouchEnd)},removeEventListeners:function(){var e=this.el;e.removeEventListener("gripdown",this.onGripDown),e.removeEventListener("gripup",this.onGripUp),e.removeEventListener("trackpaddown",this.onTrackpadDown),e.removeEventListener("trackpadup",this.onTrackpadUp),e.removeEventListener("trackpadtouchstart",this.onTrackpadTouchStart),e.removeEventListener("trackpadtouchend",this.onTrackpadTouchEnd),e.removeEventListener("triggerdown",this.onTriggerDown),e.removeEventListener("triggerup",this.onTriggerUp),e.removeEventListener("triggertouchstart",this.onTriggerTouchStart),e.removeEventListener("triggertouchend",this.onTriggerTouchEnd),e.removeEventListener("griptouchstart",this.onGripTouchStart),e.removeEventListener("griptouchend",this.onGripTouchEnd),e.removeEventListener("thumbstickdown",this.onThumbstickDown),e.removeEventListener("thumbstickup",this.onThumbstickUp),e.removeEventListener("abuttontouchstart",this.onAorXTouchStart),e.removeEventListener("abuttontouchend",this.onAorXTouchEnd),e.removeEventListener("bbuttontouchstart",this.onBorYTouchStart),e.removeEventListener("bbuttontouchend",this.onBorYTouchEnd),e.removeEventListener("xbuttontouchstart",this.onAorXTouchStart),e.removeEventListener("xbuttontouchend",this.onAorXTouchEnd),e.removeEventListener("ybuttontouchstart",this.onBorYTouchStart),e.removeEventListener("ybuttontouchend",this.onBorYTouchEnd),e.removeEventListener("surfacetouchstart",this.onSurfaceTouchStart),e.removeEventListener("surfacetouchend",this.onSurfaceTouchEnd)},update:function(e){var t,n=this.el,i=this.data.hand,r=this.data.handModelStyle,s=this.data.color,o=this;if(t={hand:i,model:!1},i!==e){var a=SM[r+i.charAt(0).toUpperCase()+i.slice(1)];this.loader.load(a,(function(e){var i=e.scene.children[0];i.mixer=new THREE.AnimationMixer(i),o.clips=e.animations,n.setObject3D("mesh",i),i.traverse((function(e){e.isMesh&&(e.material.color=new THREE.Color(s))})),n.setAttribute("magicleap-controls",t),n.setAttribute("vive-controls",t),n.setAttribute("meta-touch-controls",t),n.setAttribute("pico-controls",t),n.setAttribute("windows-motion-controls",t),n.setAttribute("hp-mixed-reality-controls",t)}))}},remove:function(){this.el.removeObject3D("mesh")},handleButton:function(e,t){var n,i="down"===t,r="touchstart"===t;if(0===t.indexOf("touch")){if(r===this.touchedButtons[e])return;this.touchedButtons[e]=r}else{if(i===this.pressedButtons[e])return;this.pressedButtons[e]=i}n=this.gesture,this.gesture=this.determineGesture(),this.gesture!==n&&(this.animateGesture(this.gesture,n),this.emitGestureEvents(this.gesture,n))},determineGesture:function(){var e,t,n,i=this.pressedButtons.grip,r=this.pressedButtons.surface||this.touchedButtons.surface,s=this.pressedButtons.trackpad||this.touchedButtons.trackpad,o=this.pressedButtons.trigger||this.touchedButtons.trigger,a=this.touchedButtons.AorX||this.touchedButtons.BorY;return t=this.el.components["tracked-controls"],(n=t&&t.controller)&&(n.id&&0===n.id.indexOf("OpenVR ")||n.profiles&&n.profiles[0]&&"htc-vive"===n.profiles[0])?i||o?e=BM:s&&(e=TM):i?e=r||a||s?o?BM:TM:o?RM:"Point + Thumb":o&&(e="Hold"),e},getClip:function(e){var t,n;for(n=0;n<this.clips.length;n++)if((t=this.clips[n]).name===e)return t},animateGesture:function(e,t){e?this.playAnimation(e||"Open",t,!1):this.playAnimation(t,t,!0)},emitGestureEvents:function(e,t){var n,i=this.el;t!==e&&((n=DM(t,!1))&&i.emit(n),(n=DM(e,!0))&&i.emit(n))},playAnimation:function(e,t,n){var i,r,s=this.el.getObject3D("mesh");if(s){if(i=this.getClip(e),r=s.mixer.clipAction(i),n)return r.paused=!1,void(r.timeScale=-1);if(r.clampWhenFinished=!0,r.loop=THREE.LoopOnce,r.repetitions=0,r.timeScale=1,r.time=0,r.weight=1,!t)return s.mixer.stopAllAction(),void r.play();i=this.getClip(t),r.reset(),r.play(),s.mixer.clipAction(i).crossFadeTo(r,.15,!0)}}}),Ww("hide-on-enter-ar",{init:function(){var e=this;this.el.sceneEl.addEventListener("enter-vr",(function(){e.el.sceneEl.is("ar-mode")&&(e.el.object3D.visible=!1)})),this.el.sceneEl.addEventListener("exit-vr",(function(){e.el.object3D.visible=!0}))}}),Ww("hide-on-enter-vr",{init:function(){var e=this;this.el.sceneEl.addEventListener("enter-vr",(function(){e.el.sceneEl.is("vr-mode")&&(e.el.object3D.visible=!1)})),this.el.sceneEl.addEventListener("exit-vr",(function(){e.el.object3D.visible=!0}))}});var PM="hp-mixed-reality",UM=qb+"controllers/hp/mixed-reality/",kM={x:0,y:0,z:.06},NM={_x:Math.PI/4,_y:0,_z:0,_order:"XYZ"},OM=(Ww("hp-mixed-reality-controls",{schema:{hand:{default:"none"},model:{default:!0}},mapping:{left:{axes:{touchpad:[2,3]},buttons:["trigger","grip","none","thumbstick","xbutton","ybutton"]},right:{axes:{touchpad:[2,3]},buttons:["trigger","grip","none","thumbstick","abutton","bbutton"]}},init:function(){var e=this;this.controllerPresent=!1,this.onButtonChanged=this.onButtonChanged.bind(this),this.onButtonDown=function(t){CC(t.detail.id,"down",e,e.data.hand)},this.onButtonUp=function(t){CC(t.detail.id,"up",e,e.data.hand)},this.onButtonTouchEnd=function(t){CC(t.detail.id,"touchend",e,e.data.hand)},this.onButtonTouchStart=function(t){CC(t.detail.id,"touchstart",e,e.data.hand)},this.previousButtonValues={},this.bindMethods()},update:function(){var e=this.data;this.controllerIndex="right"===e.hand?0:"left"===e.hand?1:2},play:function(){this.checkIfControllerPresent(),this.addControllersUpdateListener()},pause:function(){this.removeEventListeners(),this.removeControllersUpdateListener()},bindMethods:function(){this.onModelLoaded=this.onModelLoaded.bind(this),this.onControllersUpdate=this.onControllersUpdate.bind(this),this.checkIfControllerPresent=this.checkIfControllerPresent.bind(this),this.removeControllersUpdateListener=this.removeControllersUpdateListener.bind(this),this.onAxisMoved=this.onAxisMoved.bind(this)},addEventListeners:function(){var e=this.el;e.addEventListener("buttonchanged",this.onButtonChanged),e.addEventListener("buttondown",this.onButtonDown),e.addEventListener("buttonup",this.onButtonUp),e.addEventListener("touchstart",this.onButtonTouchStart),e.addEventListener("touchend",this.onButtonTouchEnd),e.addEventListener("axismove",this.onAxisMoved),e.addEventListener("model-loaded",this.onModelLoaded),this.controllerEventsActive=!0},removeEventListeners:function(){var e=this.el;e.removeEventListener("buttonchanged",this.onButtonChanged),e.removeEventListener("buttondown",this.onButtonDown),e.removeEventListener("buttonup",this.onButtonUp),e.removeEventListener("touchstart",this.onButtonTouchStart),e.removeEventListener("touchend",this.onButtonTouchEnd),e.removeEventListener("axismove",this.onAxisMoved),e.removeEventListener("model-loaded",this.onModelLoaded),this.controllerEventsActive=!1},checkIfControllerPresent:function(){var e=this.data;yC(this,PM,{index:this.controllerIndex,hand:e.hand})},injectTrackedControls:function(){var e=this.el,t=this.data;e.setAttribute("tracked-controls",{idPrefix:PM,hand:t.hand,controller:this.controllerIndex}),this.data.model&&this.el.setAttribute("gltf-model",UM+this.data.hand+".glb")},addControllersUpdateListener:function(){this.el.sceneEl.addEventListener("controllersupdated",this.onControllersUpdate,!1)},removeControllersUpdateListener:function(){this.el.sceneEl.removeEventListener("controllersupdated",this.onControllersUpdate,!1)},onControllersUpdate:function(){this.checkIfControllerPresent()},onButtonChanged:function(e){var t,n=this.mapping[this.data.hand].buttons[e.detail.id];n&&("trigger"===n&&(t=e.detail.state.value,console.log("analog value of trigger press: "+t)),this.el.emit(n+"changed",e.detail.state))},onModelLoaded:function(e){var t=e.detail.model;this.data.model&&(t.position.copy(kM),t.rotation.copy(NM),this.el.emit("controllermodelready",{name:"hp-mixed-reality-controls",model:this.data.model,rayOrigin:new Wb.Vector3(0,0,0)}))},onAxisMoved:function(e){xC(this,this.mapping.axes,e)}}),$b("components:layer:warn"));function FM(e,t,n){return(t.dot(e)-t.dot(n))/t.length()}Ww("layer",{schema:{type:{default:"quad",oneOf:["quad","monocubemap","stereocubemap"]},src:{type:"map"},rotateCubemap:{default:!1},width:{default:0},height:{default:0}},init:function(){var e=this.el.sceneEl.renderer.getContext();this.quaternion=new THREE.Quaternion,this.position=new THREE.Vector3,this.bindMethods(),this.needsRedraw=!1,this.frameBuffer=e.createFramebuffer();var t=this.el.sceneEl.getAttribute("webxr"),n=t.requiredFeatures;-1===n.indexOf("layers")&&(n.push("layers"),this.el.sceneEl.setAttribute("webxr",t)),this.el.sceneEl.addEventListener("enter-vr",this.onEnterVR),this.el.sceneEl.addEventListener("exit-vr",this.onExitVR)},bindMethods:function(){this.onRequestedReferenceSpace=this.onRequestedReferenceSpace.bind(this),this.onEnterVR=this.onEnterVR.bind(this),this.onExitVR=this.onExitVR.bind(this)},update:function(e){this.data.src!==e.src&&this.updateSrc()},updateSrc:function(){var e=this.data.type;this.texture=void 0,"quad"!==e?"monocubemap"!==e&&"stereocubemap"!==e||this.loadCubeMapImages():this.loadQuadImage()},loadCubeMapImages:function(){var e,t=this.xrGLFactory,n=this.el.sceneEl.frame,i=this.data.src,r=this.data.type;this.visibilityChanged=!1,this.layer&&("monocubemap"!==r&&"stereocubemap"!==r||(i.complete?this.pendingCubeMapUpdate=!1:this.pendingCubeMapUpdate=!0,this.loadingScreen?this.loadingScreen=!1:this.loadingScreen=!0,"monocubemap"===r?(e=t.getSubImage(this.layer,n),this.loadCubeMapImage(e.colorTexture,i,0)):(e=t.getSubImage(this.layer,n,"left"),this.loadCubeMapImage(e.colorTexture,i,0),e=t.getSubImage(this.layer,n,"right"),this.loadCubeMapImage(e.colorTexture,i,6))))},loadQuadImage:function(){var e=this.data.src,t=this;this.el.sceneEl.systems.material.loadTexture(e,{src:e},(function(n){t.el.sceneEl.renderer.initTexture(n),t.texture=n,"VIDEO"===e.tagName&&setTimeout((function(){t.textureIsVideo=!0}),1e3),t.layer&&(t.layer.height=t.data.height/2||t.texture.image.height/1e3,t.layer.width=t.data.width/2||t.texture.image.width/1e3,t.needsRedraw=!0),t.updateQuadPanel()}))},preGenerateCubeMapTextures:function(e,t){"monocubemap"===this.data.type?this.generateCubeMapTextures(e,0,t):(this.generateCubeMapTextures(e,0,t),this.generateCubeMapTextures(e,6,t))},generateCubeMapTextures:function(e,t,n){for(var i,r,s=this.data,o=this.cubeFaceSize,a=Math.min(e.width,e.height),l=[],c=0;c<6;c++){var h=document.createElement("CANVAS");h.width=h.height=o;var u=h.getContext("2d");s.rotateCubemap&&(2!==c&&3!==c||(u.save(),u.translate(o,o),u.rotate(Math.PI))),u.drawImage(e,(c+t)*a,0,a,a,0,0,o,o),u.restore(),n&&n(),l.push(h)}return s.rotateCubemap&&(i=l[0],r=l[1],l[0]=r,l[1]=i,i=l[4],r=l[5],l[4]=r,l[5]=i),n&&n(),l},loadCubeMapImage:function(e,t,n){var i,r=this.el.sceneEl.renderer.getContext();r.pixelStorei(r.UNPACK_FLIP_Y_WEBGL,!1),r.bindTexture(r.TEXTURE_CUBE_MAP,e),i=!t.complete||this.loadingScreen?this.loadingScreenImages:this.generateCubeMapTextures(t,n);var s=0;i.forEach((function(e,t){r.texSubImage2D(r.TEXTURE_CUBE_MAP_POSITIVE_X+t,0,0,0,r.RGBA,r.UNSIGNED_BYTE,e),s=r.getError()})),0!==s&&console.log("renderingError, WebGL Error Code: "+s),r.bindTexture(r.TEXTURE_CUBE_MAP,null)},tick:function(){this.el.sceneEl.xrSession&&this.referenceSpace&&(this.layer||!this.el.sceneEl.is("vr-mode")&&!this.el.sceneEl.is("ar-mode")||this.initLayer(),this.updateTransform(),this.data.src.complete&&(this.pendingCubeMapUpdate||this.loadingScreen||this.visibilityChanged)&&this.loadCubeMapImages(),(this.needsRedraw||this.layer.needsRedraw||this.textureIsVideo)&&("quad"===this.data.type&&this.draw(),this.needsRedraw=!1))},initLayer:function(){var e=this,t=this.data.type;this.el.sceneEl.xrSession.onvisibilitychange=function(t){e.visibilityChanged="hidden"!==t.session.visibilityState},"quad"!==t?"monocubemap"!==t&&"stereocubemap"!==t||this.initCubeMapLayer():this.initQuadLayer()},initQuadLayer:function(){var e=this.el.sceneEl,t=e.renderer.getContext(),n=this.xrGLFactory=new XRWebGLBinding(e.xrSession,t);this.texture&&(this.layer=n.createQuadLayer({space:this.referenceSpace,viewPixelHeight:2048,viewPixelWidth:2048,height:this.data.height/2||this.texture.image.height/1e3,width:this.data.width/2||this.texture.image.width/1e3}),this.initLoadingScreenImages(),e.renderer.xr.addLayer(this.layer))},initCubeMapLayer:function(){var e=this.data.src,t=this.el.sceneEl,n=t.renderer.getContext(),i=n.getParameter(n.MAX_CUBE_MAP_TEXTURE_SIZE),r=this.cubeFaceSize=Math.min(i,Math.min(e.width,e.height)),s=this.xrGLFactory=new XRWebGLBinding(t.xrSession,n);this.layer=s.createCubeLayer({space:this.referenceSpace,viewPixelWidth:r,viewPixelHeight:r,layout:"monocubemap"===this.data.type?"mono":"stereo",isStatic:!1}),this.initLoadingScreenImages(),this.loadCubeMapImages(),t.renderer.xr.addLayer(this.layer)},initLoadingScreenImages:function(){for(var e=this.cubeFaceSize,t=this.loadingScreenImages=[],n=0;n<6;n++){var i=document.createElement("CANVAS");i.width=i.height=e;var r=i.getContext("2d");i.width=i.height=e,r.fillStyle="black",r.fillRect(0,0,e,e),2!==n&&3!==n&&(r.translate(e,0),r.scale(-1,1),r.fillStyle="white",r.font="30px Arial",r.fillText("Loading",e/2,e/2)),t.push(i)}},destroyLayer:function(){this.layer&&(this.el.sceneEl.renderer.xr.removeLayer(this.layer),this.layer.destroy(),this.layer=void 0)},toggleCompositorLayer:function(){this.enableCompositorLayer(!this.layerEnabled)},enableCompositorLayer:function(e){this.layerEnabled=e,this.quadPanelEl.object3D.visible=!this.layerEnabled},updateQuadPanel:function(){var e=this.quadPanelEl;this.quadPanelEl||(e=this.quadPanelEl=document.createElement("a-entity"),this.el.appendChild(e)),e.setAttribute("material",{shader:"flat",src:this.data.src,transparent:!0}),e.setAttribute("geometry",{primitive:"plane",height:this.data.height||this.texture.image.height/1e3,width:this.data.width||this.texture.image.height/1e3})},draw:function(){var e=this.el.sceneEl,t=this.el.sceneEl.renderer.getContext(),n=this.xrGLFactory.getSubImage(this.layer,e.frame),i=e.renderer.properties.get(this.texture).__webglTexture,r=t.getParameter(t.FRAMEBUFFER_BINDING);t.viewport(n.viewport.x,n.viewport.y,n.viewport.width,n.viewport.height),t.bindFramebuffer(t.FRAMEBUFFER,this.frameBuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,n.colorTexture,0),function(e,t,n,i){var r=e.createFramebuffer(),s=n.viewport.x,o=n.viewport.y,a=n.viewport.x+n.viewport.width,l=n.viewport.y+n.viewport.height;"VIDEO"===i.tagName&&(e.bindTexture(e.TEXTURE_2D,t),e.texSubImage2D(e.TEXTURE_2D,0,0,0,i.width,i.height,e.RGB,e.UNSIGNED_BYTE,i)),e.bindFramebuffer(e.READ_FRAMEBUFFER,r),e.framebufferTexture2D(e.READ_FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,t,0),e.readBuffer(e.COLOR_ATTACHMENT0),e.blitFramebuffer(0,0,i.width,i.height,s,o,a,l,e.COLOR_BUFFER_BIT,e.NEAREST),e.bindFramebuffer(e.READ_FRAMEBUFFER,null),e.deleteFramebuffer(r)}(t,i,n,this.data.src),t.bindFramebuffer(t.FRAMEBUFFER,r)},updateTransform:function(){var e=this.el,t=this.position,n=this.quaternion;e.object3D.updateMatrixWorld(),t.setFromMatrixPosition(e.object3D.matrixWorld),n.setFromRotationMatrix(e.object3D.matrixWorld),this.layerEnabled||t.set(0,0,1e8),this.layer.transform=new XRRigidTransform(t,n)},onEnterVR:function(){var e=this.el.sceneEl,t=e.xrSession;e.hasWebXR&&XRWebGLBinding&&t?(t.requestReferenceSpace("local-floor").then(this.onRequestedReferenceSpace),this.layerEnabled=!0,this.quadPanelEl&&(this.quadPanelEl.object3D.visible=!1),this.data.src.play&&this.data.src.play()):OM("The layer component requires WebXR and the layers API enabled")},onExitVR:function(){this.quadPanelEl&&(this.quadPanelEl.object3D.visible=!0),this.destroyLayer()},onRequestedReferenceSpace:function(e){this.referenceSpace=e}}),Ww("laser-controls",{schema:{hand:{default:"right"},model:{default:!0},defaultModelColor:{type:"color",default:"grey"}},init:function(){var e=this.config,t=this.data,n=this.el,i=this,r={hand:t.hand,model:t.model};function s(t){var r=e[t.detail.name];if(r){var s=DC({showLine:!0},r.raycaster||{});t.detail.rayOrigin&&(s.origin=t.detail.rayOrigin.origin,s.direction=t.detail.rayOrigin.direction,s.showLine=!0),t.detail.rayOrigin||!i.modelReady?n.setAttribute("raycaster",s):n.setAttribute("raycaster","showLine",!0),n.setAttribute("cursor",DC({fuse:!1},r.cursor))}}n.setAttribute("hp-mixed-reality-controls",r),n.setAttribute("magicleap-controls",r),n.setAttribute("oculus-go-controls",r),n.setAttribute("meta-touch-controls",r),n.setAttribute("pico-controls",r),n.setAttribute("valve-index-controls",r),n.setAttribute("vive-controls",r),n.setAttribute("vive-focus-controls",r),n.setAttribute("windows-motion-controls",r),n.setAttribute("generic-tracked-controller-controls",{hand:r.hand}),n.addEventListener("controllerconnected",s),n.addEventListener("controllerdisconnected",(function(t){e[t.detail.name]&&n.setAttribute("raycaster","showLine",!1)})),n.addEventListener("controllermodelready",(function(e){s(e),i.modelReady=!0}))},config:{"generic-tracked-controller-controls":{cursor:{downEvents:["triggerdown"],upEvents:["triggerup"]}},"hp-mixed-reality-controls":{cursor:{downEvents:["triggerdown"],upEvents:["triggerup"]},raycaster:{origin:{x:0,y:0,z:0}}},"magicleap-controls":{cursor:{downEvents:["trackpaddown","triggerdown"],upEvents:["trackpadup","triggerup"]}},"oculus-go-controls":{cursor:{downEvents:["triggerdown"],upEvents:["triggerup"]},raycaster:{origin:{x:0,y:5e-4,z:0}}},"meta-touch-controls":{cursor:{downEvents:["triggerdown"],upEvents:["triggerup"]},raycaster:{origin:{x:0,y:0,z:0}}},"pico-controls":{cursor:{downEvents:["triggerdown"],upEvents:["triggerup"]}},"valve-index-controls":{cursor:{downEvents:["triggerdown"],upEvents:["triggerup"]}},"vive-controls":{cursor:{downEvents:["triggerdown"],upEvents:["triggerup"]}},"vive-focus-controls":{cursor:{downEvents:["trackpaddown","triggerdown"],upEvents:["trackpadup","triggerup"]}},"windows-motion-controls":{cursor:{downEvents:["triggerdown"],upEvents:["triggerup"]},raycaster:{showLine:!1}}}});var QM,zM,GM,HM,VM,jM,WM,qM,XM,YM,JM=Wb.MathUtils.degToRad,KM=$b("components:light:warn"),ZM=new Wb.CubeTextureLoader,$M={};function eI(e,t){return!(!e||!t)&&e.x===t.x&&e.y===t.y&&e.z===t.z}Ww("light",{schema:{angle:{default:60,if:{type:["spot"]}},color:{type:"color",if:{type:["ambient","directional","hemisphere","point","spot"]}},envMap:{default:"",if:{type:["probe"]}},groundColor:{type:"color",if:{type:["hemisphere"]}},decay:{default:1,if:{type:["point","spot"]}},distance:{default:0,min:0,if:{type:["point","spot"]}},intensity:{default:3.14,min:0,if:{type:["ambient","directional","hemisphere","point","spot","probe"]}},penumbra:{default:0,min:0,max:1,if:{type:["spot"]}},type:{default:"directional",oneOf:["ambient","directional","hemisphere","point","spot","probe"],schemaChange:!0},target:{type:"selector",if:{type:["spot","directional"]}},castShadow:{default:!1,if:{type:["point","spot","directional"]}},shadowBias:{default:0,if:{castShadow:!0}},shadowCameraFar:{default:500,if:{castShadow:!0}},shadowCameraFov:{default:90,if:{castShadow:!0}},shadowCameraNear:{default:.5,if:{castShadow:!0}},shadowCameraTop:{default:5,if:{castShadow:!0}},shadowCameraRight:{default:5,if:{castShadow:!0}},shadowCameraBottom:{default:-5,if:{castShadow:!0}},shadowCameraLeft:{default:-5,if:{castShadow:!0}},shadowCameraVisible:{default:!1,if:{castShadow:!0}},shadowCameraAutomatic:{default:"",if:{type:["directional"]}},shadowMapHeight:{default:512,if:{castShadow:!0}},shadowMapWidth:{default:512,if:{castShadow:!0}},shadowRadius:{default:1,if:{castShadow:!0}}},init:function(){var e=this.el;this.light=null,this.defaultTarget=null,this.system.registerLight(e)},update:function(e){var t=this.data,n=FC(t,e),i=this.light,r=this;if(!i||"type"in n)this.setLight(this.data),this.updateShadow();else{var s=!1;Object.keys(n).forEach((function(e){var n=t[e];switch(e){case"color":i.color.set(n);break;case"groundColor":i.groundColor.set(n);break;case"angle":i.angle=JM(n);break;case"target":null===n?"spot"!==t.type&&"directional"!==t.type||(i.target=r.defaultTarget):n.hasLoaded?r.onSetTarget(n,i):n.addEventListener("loaded",r.onSetTarget.bind(r,n,i));break;case"envMap":r.updateProbeMap(t,i);break;case"castShadow":case"shadowBias":case"shadowCameraFar":case"shadowCameraFov":case"shadowCameraNear":case"shadowCameraTop":case"shadowCameraRight":case"shadowCameraBottom":case"shadowCameraLeft":case"shadowCameraVisible":case"shadowMapHeight":case"shadowMapWidth":case"shadowRadius":s||(r.updateShadow(),s=!0);break;case"shadowCameraAutomatic":t.shadowCameraAutomatic?r.shadowCameraAutomaticEls=Array.from(document.querySelectorAll(t.shadowCameraAutomatic)):r.shadowCameraAutomaticEls=[];break;default:i[e]=n}}))}},tick:(QM=new Wb.Box3,zM=new Wb.Vector3,GM=new Wb.Vector3,HM=new Wb.Matrix4,VM=new Wb.Sphere,jM=new Wb.Vector3,function(){if("directional"===this.data.type&&this.light.shadow&&this.light.shadow.camera instanceof Wb.OrthographicCamera&&this.shadowCameraAutomaticEls.length){var e=this.light.shadow.camera;e.getWorldDirection(zM),e.getWorldPosition(GM),HM.copy(e.matrixWorld),HM.invert(),e.near=1,e.left=1e5,e.right=-1e5,e.top=-1e5,e.bottom=1e5,this.shadowCameraAutomaticEls.forEach((function(t){QM.setFromObject(t.object3D),QM.getBoundingSphere(VM);var n,i,r,s,o,a=FM(GM,zM,VM.center),l=(n=GM,i=zM,r=VM.center,s=jM,o=FM(n,i,r),s.copy(i),s.multiplyScalar(o),s.add(r),s).applyMatrix4(HM);e.near=Math.min(-a-VM.radius-1,e.near),e.left=Math.min(-VM.radius+l.x,e.left),e.right=Math.max(VM.radius+l.x,e.right),e.top=Math.max(VM.radius+l.y,e.top),e.bottom=Math.min(-VM.radius+l.y,e.bottom)})),e.updateProjectionMatrix()}}),setLight:function(e){var t=this.el,n=this.getLight(e);n&&(this.light&&t.removeObject3D("light"),this.light=n,this.light.el=t,t.setObject3D("light",this.light),"spot"!==e.type&&"directional"!==e.type&&"hemisphere"!==e.type||t.getObject3D("light").translateY(-1),"spot"===e.type&&(t.setObject3D("light-target",this.defaultTarget),t.getObject3D("light-target").position.set(0,0,-1)),e.shadowCameraAutomatic?this.shadowCameraAutomaticEls=Array.from(document.querySelectorAll(e.shadowCameraAutomatic)):this.shadowCameraAutomaticEls=[])},updateShadow:function(){var e=this.el,t=this.data,n=this.light;n.castShadow=t.castShadow;var i=e.getObject3D("cameraHelper");if(t.shadowCameraVisible&&!i?(i=new Wb.CameraHelper(n.shadow.camera),e.setObject3D("cameraHelper",i)):!t.shadowCameraVisible&&i&&e.removeObject3D("cameraHelper"),!t.castShadow)return n;n.shadow.bias=t.shadowBias,n.shadow.radius=t.shadowRadius,n.shadow.mapSize.height=t.shadowMapHeight,n.shadow.mapSize.width=t.shadowMapWidth,n.shadow.camera.near=t.shadowCameraNear,n.shadow.camera.far=t.shadowCameraFar,n.shadow.camera instanceof Wb.OrthographicCamera?(n.shadow.camera.top=t.shadowCameraTop,n.shadow.camera.right=t.shadowCameraRight,n.shadow.camera.bottom=t.shadowCameraBottom,n.shadow.camera.left=t.shadowCameraLeft):n.shadow.camera.fov=t.shadowCameraFov,n.shadow.camera.updateProjectionMatrix(),i&&i.update()},getLight:function(e){var t=e.angle,n=new Wb.Color(e.color);n=n.getHex();var i=e.decay,r=e.distance,s=new Wb.Color(e.groundColor);s=s.getHex();var o=e.intensity,a=e.type,l=e.target,c=null;switch(a.toLowerCase()){case"ambient":return new Wb.AmbientLight(n,o);case"directional":return c=new Wb.DirectionalLight(n,o),this.defaultTarget=c.target,l&&(l.hasLoaded?this.onSetTarget(l,c):l.addEventListener("loaded",this.onSetTarget.bind(this,l,c))),c;case"hemisphere":return new Wb.HemisphereLight(n,s,o);case"point":return new Wb.PointLight(n,o,r,i);case"spot":return c=new Wb.SpotLight(n,o,r,JM(t),e.penumbra,i),this.defaultTarget=c.target,l&&(l.hasLoaded?this.onSetTarget(l,c):l.addEventListener("loaded",this.onSetTarget.bind(this,l,c))),c;case"probe":return c=new Wb.LightProbe,this.updateProbeMap(e,c),c;default:KM("%s is not a valid light type. Choose from ambient, directional, hemisphere, point, spot.",a)}},updateProbeMap:function(e,t){e.envMap?(void 0===$M[e.envMap]&&($M[e.envMap]=new window.Promise((function(t){Jx(e.envMap,(function(n){ZM.load(n,(function(n){var i=Wb.LightProbeGenerator.fromCubeTexture(n);$M[e.envMap]=i,t(i)}))}))}))),$M[e.envMap]instanceof window.Promise?$M[e.envMap].then((function(e){t.copy(e)})):$M[e.envMap]instanceof Wb.LightProbe&&t.copy($M[e.envMap])):t.copy(new Wb.LightProbe)},onSetTarget:function(e,t){t.target=e.object3D},remove:function(){var e=this.el;e.removeObject3D("light"),e.getObject3D("cameraHelper")&&e.removeObject3D("cameraHelper")}}),Ww("line",{schema:{start:{type:"vec3",default:{x:0,y:0,z:0}},end:{type:"vec3",default:{x:0,y:0,z:0}},color:{type:"color",default:"#74BEC1"},opacity:{type:"number",default:1},visible:{default:!0}},multiple:!0,init:function(){var e,t,n=this.data;t=this.material=new THREE.LineBasicMaterial({color:n.color,opacity:n.opacity,transparent:n.opacity<1,visible:n.visible}),(e=this.geometry=new THREE.BufferGeometry).setAttribute("position",new THREE.BufferAttribute(new Float32Array(6),3)),this.line=new THREE.Line(e,t),this.el.setObject3D(this.attrName,this.line)},update:function(e){var t=this.data,n=this.geometry,i=!1,r=this.material,s=n.attributes.position.array;eI(t.start,e.start)||(s[0]=t.start.x,s[1]=t.start.y,s[2]=t.start.z,i=!0),eI(t.end,e.end)||(s[3]=t.end.x,s[4]=t.end.y,s[5]=t.end.z,i=!0),i&&(n.attributes.position.needsUpdate=!0,n.computeBoundingSphere()),r.color.setStyle(t.color),r.opacity=t.opacity,r.transparent=t.opacity<1,r.visible=t.visible},remove:function(){this.el.removeObject3D(this.attrName,this.line)}}),Ww("link",{schema:{backgroundColor:{default:"red",type:"color"},borderColor:{default:"white",type:"color"},highlighted:{default:!1},highlightedColor:{default:"#24CAFF",type:"color"},href:{default:""},image:{type:"asset"},on:{default:"click"},peekMode:{default:!1},title:{default:""},titleColor:{default:"white",type:"color"},visualAspectEnabled:{default:!1}},init:function(){this.navigate=this.navigate.bind(this),this.previousQuaternion=void 0,this.quaternionClone=new Wb.Quaternion,this.hiddenEls=[]},update:function(e){var t,n,i=this.data,r=this.el;if(i.visualAspectEnabled){var s=this.el.getAttribute("scale");this.previewDistance=15*(s.x+s.y)/2,this.initVisualAspect(),t=i.highlighted?i.highlightedColor:i.backgroundColor,n=i.highlighted?i.highlightedColor:i.borderColor,r.setAttribute("material","backgroundColor",t),r.setAttribute("material","strokeColor",n),i.on!==e.on&&this.updateEventListener(),void 0!==e.peekMode&&i.peekMode!==e.peekMode&&this.updatePeekMode(),i.image&&e.image!==i.image&&r.setAttribute("material","pano","string"==typeof i.image?i.image:i.image.src)}},updatePeekMode:function(){var e=this.el,t=this.sphereEl;this.data.peekMode?(this.hideAll(),e.getObject3D("mesh").visible=!1,t.setAttribute("visible",!0)):(this.showAll(),e.getObject3D("mesh").visible=!0,t.setAttribute("visible",!1))},play:function(){this.updateEventListener()},pause:function(){this.removeEventListener()},updateEventListener:function(){var e=this.el;e.isPlaying&&(this.removeEventListener(),e.addEventListener(this.data.on,this.navigate))},removeEventListener:function(){var e=this.data.on;e&&this.el.removeEventListener(e,this.navigate)},initVisualAspect:function(){var e,t,n,i=this.el;this.data.visualAspectEnabled&&!this.visualAspectInitialized&&(n=this.textEl=this.textEl||document.createElement("a-entity"),t=this.sphereEl=this.sphereEl||document.createElement("a-entity"),e=this.semiSphereEl=this.semiSphereEl||document.createElement("a-entity"),i.setAttribute("geometry",{primitive:"circle",radius:1,segments:64}),i.setAttribute("material",{shader:"portal",pano:this.data.image,side:"double",previewDistance:this.previewDistance}),n.setAttribute("text",{color:this.data.titleColor,align:"center",font:"kelsonsans",value:this.data.title||this.data.href,width:4}),n.setAttribute("position","0 1.5 0"),i.appendChild(n),e.setAttribute("geometry",{primitive:"sphere",radius:1,phiStart:0,segmentsWidth:64,segmentsHeight:64,phiLength:180,thetaStart:0,thetaLength:360}),e.setAttribute("material",{shader:"portal",borderEnabled:0,pano:this.data.image,side:"back",previewDistance:this.previewDistance}),e.setAttribute("rotation","0 180 0"),e.setAttribute("position","0 0 0"),e.setAttribute("visible",!1),i.appendChild(e),t.setAttribute("geometry",{primitive:"sphere",radius:10,segmentsWidth:64,segmentsHeight:64}),t.setAttribute("material",{shader:"portal",borderEnabled:0,pano:this.data.image,side:"back",previewDistance:this.previewDistance}),t.setAttribute("visible",!1),i.appendChild(t),this.visualAspectInitialized=!0)},navigate:function(){window.location=this.data.href},tick:function(){var e=new Wb.Vector3,t=new Wb.Vector3,n=new Wb.Quaternion,i=new Wb.Vector3;return function(){var r,s,o=this.el,a=o.object3D,l=o.sceneEl.camera,c=this.textEl;if(this.data.visualAspectEnabled)if(a.updateMatrixWorld(),l.parent.updateMatrixWorld(),l.updateMatrixWorld(),a.matrix.decompose(t,n,i),t.setFromMatrixPosition(a.matrixWorld),e.setFromMatrixPosition(l.matrixWorld),(s=t.distanceTo(e))>1.33333*this.previewDistance)this.previousQuaternion||(this.quaternionClone.copy(n),this.previousQuaternion=this.quaternionClone),a.lookAt(e);else{if(r=this.calculateCameraPortalOrientation(),s<.5){if(!0===this.semiSphereEl.getAttribute("visible"))return;c.setAttribute("text","width",1.5),r<=0?(c.setAttribute("position","0 0 0.75"),c.setAttribute("rotation","0 180 0"),this.semiSphereEl.setAttribute("rotation","0 0 0")):(c.setAttribute("position","0 0 -0.75"),c.setAttribute("rotation","0 0 0"),this.semiSphereEl.setAttribute("rotation","0 180 0")),o.getObject3D("mesh").visible=!1,this.semiSphereEl.setAttribute("visible",!0),this.peekCameraPortalOrientation=r}else r<=0?c.setAttribute("rotation","0 180 0"):c.setAttribute("rotation","0 0 0"),c.setAttribute("text","width",5),c.setAttribute("position","0 1.5 0"),o.getObject3D("mesh").visible=!0,this.semiSphereEl.setAttribute("visible",!1),this.peekCameraPortalOrientation=void 0;this.previousQuaternion&&(a.quaternion.copy(this.previousQuaternion),this.previousQuaternion=void 0)}}}(),hideAll:function(){var e=this.el,t=this.hiddenEls,n=this;t.length>0||e.sceneEl.object3D.traverse((function(i){i&&i.el&&i.el.hasAttribute("link-controls")||i.el&&i!==e.sceneEl.object3D&&i.el!==e&&i.el!==n.sphereEl&&i.el!==e.sceneEl.cameraEl&&!1!==i.el.getAttribute("visible")&&i.el!==n.textEl&&i.el!==n.semiSphereEl&&(i.el.setAttribute("visible",!1),t.push(i.el))}))},showAll:function(){this.hiddenEls.forEach((function(e){e.setAttribute("visible",!0)})),this.hiddenEls=[]},calculateCameraPortalOrientation:(WM=new Wb.Matrix4,qM=new Wb.Vector3,XM=new Wb.Vector3(0,0,1),YM=new Wb.Vector3(0,0,0),function(){var e=this.el,t=e.sceneEl.camera;return qM.set(0,0,0),XM.set(0,0,1),YM.set(0,0,0),e.object3D.matrixWorld.extractRotation(WM),XM.applyMatrix4(WM),e.object3D.updateMatrixWorld(),e.object3D.localToWorld(YM),t.parent.parent.updateMatrixWorld(),t.parent.updateMatrixWorld(),t.updateMatrixWorld(),t.localToWorld(qM),qM.sub(YM).normalize(),XM.normalize(),Math.sign(XM.dot(qM))}),remove:function(){this.removeEventListener()}}),F_("portal",{schema:{borderEnabled:{default:1,type:"int",is:"uniform"},backgroundColor:{default:"red",type:"color",is:"uniform"},pano:{type:"map",is:"uniform"},strokeColor:{default:"white",type:"color",is:"uniform"},previewDistance:{default:15,type:"float",is:"uniform"}},vertexShader:["vec3 portalPosition;","varying vec3 vWorldPosition;","varying float vDistanceToCenter;","varying float vDistance;","void main() {","vDistanceToCenter = clamp(length(position - vec3(0.0, 0.0, 0.0)), 0.0, 1.0);","portalPosition = (modelMatrix * vec4(0.0, 0.0, 0.0, 1.0)).xyz;","vDistance = length(portalPosition - cameraPosition);","vWorldPosition = (modelMatrix * vec4(position, 1.0)).xyz;","gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);","}"].join("\n"),fragmentShader:["#define RECIPROCAL_PI2 0.15915494","uniform sampler2D pano;","uniform vec3 strokeColor;","uniform vec3 backgroundColor;","uniform float borderEnabled;","uniform float previewDistance;","varying float vDistanceToCenter;","varying float vDistance;","varying vec3 vWorldPosition;","void main() {","vec3 direction = normalize(vWorldPosition - cameraPosition);","vec2 sampleUV;","float borderThickness = clamp(exp(-vDistance / 50.0), 0.6, 0.95);","sampleUV.y = clamp(direction.y * 0.5  + 0.5, 0.0, 1.0);","sampleUV.x = atan(direction.z, -direction.x) * -RECIPROCAL_PI2 + 0.5;","if (vDistanceToCenter > borderThickness && borderEnabled == 1.0) {","gl_FragColor = vec4(strokeColor, 1.0);","} else {","gl_FragColor = mix(texture2D(pano, sampleUV), vec4(backgroundColor, 1.0), clamp(pow((vDistance / previewDistance), 2.0), 0.0, 1.0));","}","}"].join("\n")});var tI="logitech-mx-ink",nI=qb+"controllers/logitech/",iI=(Ww("logitech-mx-ink-controls",{schema:{hand:{default:"left"},model:{default:!0},orientationOffset:{type:"vec3"}},mapping:{left:{buttons:["front","back","none","none","none","tip"]},right:{buttons:["front","back","none","none","none","tip"]}},init:function(){var e=this;this.onButtonChanged=this.onButtonChanged.bind(this),this.onButtonDown=function(t){CC(t.detail.id,"down",e,e.data.hand)},this.onButtonUp=function(t){CC(t.detail.id,"up",e,e.data.hand)},this.onButtonTouchEnd=function(t){CC(t.detail.id,"touchend",e,e.data.hand)},this.onButtonTouchStart=function(t){CC(t.detail.id,"touchstart",e,e.data.hand)},this.bindMethods()},play:function(){this.checkIfControllerPresent(),this.addControllersUpdateListener()},pause:function(){this.removeEventListeners(),this.removeControllersUpdateListener()},bindMethods:function(){this.onModelLoaded=this.onModelLoaded.bind(this),this.onControllersUpdate=this.onControllersUpdate.bind(this),this.checkIfControllerPresent=this.checkIfControllerPresent.bind(this),this.removeControllersUpdateListener=this.removeControllersUpdateListener.bind(this),this.onAxisMoved=this.onAxisMoved.bind(this)},addEventListeners:function(){var e=this.el;e.addEventListener("buttonchanged",this.onButtonChanged),e.addEventListener("buttondown",this.onButtonDown),e.addEventListener("buttonup",this.onButtonUp),e.addEventListener("touchstart",this.onButtonTouchStart),e.addEventListener("touchend",this.onButtonTouchEnd),e.addEventListener("axismove",this.onAxisMoved),e.addEventListener("model-loaded",this.onModelLoaded),this.controllerEventsActive=!0},removeEventListeners:function(){var e=this.el;e.removeEventListener("buttonchanged",this.onButtonChanged),e.removeEventListener("buttondown",this.onButtonDown),e.removeEventListener("buttonup",this.onButtonUp),e.removeEventListener("touchstart",this.onButtonTouchStart),e.removeEventListener("touchend",this.onButtonTouchEnd),e.removeEventListener("axismove",this.onAxisMoved),e.removeEventListener("model-loaded",this.onModelLoaded),e.sceneEl.removeEventListener("enter-vr",this.onEnterVR),e.sceneEl.removeEventListener("exit-vr",this.onExitVR),this.controllerEventsActive=!1},checkIfControllerPresent:function(){var e=this.controllerObject3D;e&&(e.visible=!1),yC(this,tI,{hand:this.data.hand,iterateControllerProfiles:!0})},injectTrackedControls:function(){var e=this.el,t=this.data,n=tI;e.setAttribute("tracked-controls",{id:n,hand:t.hand,handTrackingEnabled:!1,iterateControllerProfiles:!0,orientationOffset:t.orientationOffset}),this.loadModel()},loadModel:function(){var e=this.controllerObject3D;if(this.data.model)return e?(e.visible=this.el.sceneEl.is("vr-mode"),void this.el.setObject3D("mesh",e)):void this.el.setAttribute("gltf-model",nI+"logitech-mx-ink.glb")},addControllersUpdateListener:function(){this.el.sceneEl.addEventListener("controllersupdated",this.onControllersUpdate,!1)},removeControllersUpdateListener:function(){this.el.sceneEl.removeEventListener("controllersupdated",this.onControllersUpdate,!1)},onControllersUpdate:function(){this.checkIfControllerPresent()},onButtonChanged:function(e){var t,n=this.mapping[this.data.hand].buttons[e.detail.id];n&&("trigger"===n&&(t=e.detail.state.value,console.log("analog value of trigger press: "+t)),this.el.emit(n+"changed",e.detail.state))},onModelLoaded:function(e){e.target===this.el&&this.data.model&&(this.el.emit("controllermodelready",{name:"logitech-mx-ink-controls",model:this.data.model,rayOrigin:new Wb.Vector3(0,0,0)}),this.controllerObject3D=this.el.getObject3D("mesh"),this.controllerObject3D.visible=this.el.sceneEl.is("vr-mode"))},onAxisMoved:function(e){xC(this,this.mapping.axes,e)}}),Math.PI/2),rI=(Ww("look-controls",{dependencies:["position","rotation"],schema:{enabled:{default:!0},magicWindowTrackingEnabled:{default:!0},pointerLockEnabled:{default:!1},reverseMouseDrag:{default:!1},reverseTouchDrag:{default:!1},touchEnabled:{default:!0},mouseEnabled:{default:!0}},init:function(){this.deltaYaw=0,this.previousHMDPosition=new Wb.Vector3,this.hmdQuaternion=new Wb.Quaternion,this.magicWindowAbsoluteEuler=new Wb.Euler,this.magicWindowDeltaEuler=new Wb.Euler,this.position=new Wb.Vector3,this.magicWindowObject=new Wb.Object3D,this.rotation={},this.deltaRotation={},this.savedPose=null,this.pointerLocked=!1,this.setupMouseControls(),this.bindMethods(),this.previousMouseEvent={},this.setupMagicWindowControls(),this.savedPose={position:new Wb.Vector3,rotation:new Wb.Euler},(this.el.sceneEl.is("vr-mode")||this.el.sceneEl.is("ar-mode"))&&this.onEnterVR()},setupMagicWindowControls:function(){var e,t=this.data;(px()||vx())&&(e=this.magicWindowControls=new Wb.DeviceOrientationControls(this.magicWindowObject),"undefined"!=typeof DeviceOrientationEvent&&DeviceOrientationEvent.requestPermission&&(e.enabled=!1,this.el.sceneEl.components["device-orientation-permission-ui"].permissionGranted?e.enabled=t.magicWindowTrackingEnabled:this.el.sceneEl.addEventListener("deviceorientationpermissiongranted",(function(){e.enabled=t.magicWindowTrackingEnabled}))))},update:function(e){var t=this.data;t.enabled!==e.enabled&&this.updateGrabCursor(t.enabled),e&&!t.magicWindowTrackingEnabled&&e.magicWindowTrackingEnabled&&(this.magicWindowAbsoluteEuler.set(0,0,0),this.magicWindowDeltaEuler.set(0,0,0)),this.magicWindowControls&&(this.magicWindowControls.enabled=t.magicWindowTrackingEnabled),e&&!t.pointerLockEnabled!==e.pointerLockEnabled&&(this.removeEventListeners(),this.addEventListeners(),this.pointerLocked&&this.exitPointerLock())},tick:function(e){this.data.enabled&&this.updateOrientation()},play:function(){this.addEventListeners()},pause:function(){this.removeEventListeners(),this.pointerLocked&&this.exitPointerLock()},remove:function(){this.removeEventListeners(),this.pointerLocked&&this.exitPointerLock()},bindMethods:function(){this.onMouseDown=this.onMouseDown.bind(this),this.onMouseMove=this.onMouseMove.bind(this),this.onMouseUp=this.onMouseUp.bind(this),this.onTouchStart=this.onTouchStart.bind(this),this.onTouchMove=this.onTouchMove.bind(this),this.onTouchEnd=this.onTouchEnd.bind(this),this.onEnterVR=this.onEnterVR.bind(this),this.onExitVR=this.onExitVR.bind(this),this.onPointerLockChange=this.onPointerLockChange.bind(this),this.onPointerLockError=this.onPointerLockError.bind(this)},setupMouseControls:function(){this.mouseDown=!1,this.pitchObject=new Wb.Object3D,this.yawObject=new Wb.Object3D,this.yawObject.position.y=10,this.yawObject.add(this.pitchObject)},addEventListeners:function(){var e=this.el.sceneEl,t=e.canvas;t?(t.addEventListener("mousedown",this.onMouseDown,!1),window.addEventListener("mousemove",this.onMouseMove,!1),window.addEventListener("mouseup",this.onMouseUp,!1),t.addEventListener("touchstart",this.onTouchStart,{passive:!0}),window.addEventListener("touchmove",this.onTouchMove,{passive:!0}),window.addEventListener("touchend",this.onTouchEnd,{passive:!0}),e.addEventListener("enter-vr",this.onEnterVR),e.addEventListener("exit-vr",this.onExitVR),this.data.pointerLockEnabled&&(document.addEventListener("pointerlockchange",this.onPointerLockChange,!1),document.addEventListener("mozpointerlockchange",this.onPointerLockChange,!1),document.addEventListener("pointerlockerror",this.onPointerLockError,!1))):e.addEventListener("render-target-loaded",this.addEventListeners.bind(this))},removeEventListeners:function(){var e=this.el.sceneEl,t=e&&e.canvas;t&&(t.removeEventListener("mousedown",this.onMouseDown),window.removeEventListener("mousemove",this.onMouseMove),window.removeEventListener("mouseup",this.onMouseUp),t.removeEventListener("touchstart",this.onTouchStart),window.removeEventListener("touchmove",this.onTouchMove),window.removeEventListener("touchend",this.onTouchEnd),e.removeEventListener("enter-vr",this.onEnterVR),e.removeEventListener("exit-vr",this.onExitVR),document.removeEventListener("pointerlockchange",this.onPointerLockChange,!1),document.removeEventListener("mozpointerlockchange",this.onPointerLockChange,!1),document.removeEventListener("pointerlockerror",this.onPointerLockError,!1))},updateOrientation:function(){var e=this.el.object3D,t=this.pitchObject,n=this.yawObject,i=this.el.sceneEl;(i.is("vr-mode")||i.is("ar-mode"))&&i.checkHeadsetConnected()||(this.updateMagicWindowOrientation(),e.rotation.x=this.magicWindowDeltaEuler.x+t.rotation.x,e.rotation.y=this.magicWindowDeltaEuler.y+n.rotation.y,e.rotation.z=this.magicWindowDeltaEuler.z)},updateMagicWindowOrientation:function(){var e=this.magicWindowAbsoluteEuler,t=this.magicWindowDeltaEuler;this.magicWindowControls&&this.magicWindowControls.enabled&&(this.magicWindowControls.update(),e.setFromQuaternion(this.magicWindowObject.quaternion,"YXZ"),this.previousMagicWindowYaw||0===e.y||(this.previousMagicWindowYaw=e.y),this.previousMagicWindowYaw&&(t.x=e.x,t.y+=e.y-this.previousMagicWindowYaw,t.z=e.z,this.previousMagicWindowYaw=e.y))},onMouseMove:function(e){var t,n,i,r=this.pitchObject,s=this.previousMouseEvent,o=this.yawObject;this.data.enabled&&(this.mouseDown||this.pointerLocked)&&(this.pointerLocked?(n=e.movementX||e.mozMovementX||0,i=e.movementY||e.mozMovementY||0):(n=e.screenX-s.screenX,i=e.screenY-s.screenY),this.previousMouseEvent.screenX=e.screenX,this.previousMouseEvent.screenY=e.screenY,t=this.data.reverseMouseDrag?1:-1,o.rotation.y+=.002*n*t,r.rotation.x+=.002*i*t,r.rotation.x=Math.max(-iI,Math.min(iI,r.rotation.x)))},onMouseDown:function(e){var t=this.el.sceneEl;if(this.data.enabled&&this.data.mouseEnabled&&(!t.is("vr-mode")&&!t.is("ar-mode")||!t.checkHeadsetConnected())&&0===e.button){var n=t&&t.canvas;this.mouseDown=!0,this.previousMouseEvent.screenX=e.screenX,this.previousMouseEvent.screenY=e.screenY,this.showGrabbingCursor(),this.data.pointerLockEnabled&&!this.pointerLocked&&(n.requestPointerLock?n.requestPointerLock():n.mozRequestPointerLock&&n.mozRequestPointerLock())}},showGrabbingCursor:function(){this.el.sceneEl.canvas.style.cursor="grabbing"},hideGrabbingCursor:function(){this.el.sceneEl.canvas.style.cursor=""},onMouseUp:function(){this.mouseDown=!1,this.hideGrabbingCursor()},onTouchStart:function(e){1!==e.touches.length||!this.data.touchEnabled||this.el.sceneEl.is("vr-mode")||this.el.sceneEl.is("ar-mode")||(this.touchStart={x:e.touches[0].pageX,y:e.touches[0].pageY},this.touchStarted=!0)},onTouchMove:function(e){var t,n,i=this.el.sceneEl.canvas,r=this.yawObject;this.touchStarted&&this.data.touchEnabled&&(n=2*Math.PI*(e.touches[0].pageX-this.touchStart.x)/i.clientWidth,t=this.data.reverseTouchDrag?1:-1,r.rotation.y-=.5*n*t,this.touchStart={x:e.touches[0].pageX,y:e.touches[0].pageY})},onTouchEnd:function(){this.touchStarted=!1},onEnterVR:function(){var e=this.el.sceneEl;e.checkHeadsetConnected()&&(this.saveCameraPose(),this.el.object3D.position.set(0,0,0),this.el.object3D.rotation.set(0,0,0),e.hasWebXR&&(this.el.object3D.matrixAutoUpdate=!1,this.el.object3D.updateMatrix()))},onExitVR:function(){this.el.sceneEl.checkHeadsetConnected()&&(this.restoreCameraPose(),this.previousHMDPosition.set(0,0,0),this.el.object3D.matrixAutoUpdate=!0)},onPointerLockChange:function(){this.pointerLocked=!(!document.pointerLockElement&&!document.mozPointerLockElement)},onPointerLockError:function(){this.pointerLocked=!1},exitPointerLock:function(){document.exitPointerLock(),this.pointerLocked=!1},updateGrabCursor:function(e){var t=this.el.sceneEl;function n(){t.canvas.classList.add("a-grab-cursor")}function i(){t.canvas.classList.remove("a-grab-cursor")}t.canvas?e?n():i():e?t.addEventListener("render-target-loaded",n):t.addEventListener("render-target-loaded",i)},saveCameraPose:function(){var e=this.el;this.savedPose.position.copy(e.object3D.position),this.savedPose.rotation.copy(e.object3D.rotation),this.hasSavedPose=!0},restoreCameraPose:function(){var e=this.el,t=this.savedPose;this.hasSavedPose&&(e.object3D.position.copy(t.position),e.object3D.rotation.copy(t.rotation),this.hasSavedPose=!1)}}),"magicleap-one"),sI=qb+"controllers/magicleap/magicleap-one-controller.glb",oI=(Ww("magicleap-controls",{schema:{hand:{default:"none"},model:{default:!0}},mapping:{axes:{touchpad:[0,1]},buttons:["trigger","grip","touchpad","menu"]},init:function(){var e=this;this.controllerPresent=!1,this.onButtonChanged=this.onButtonChanged.bind(this),this.onButtonDown=function(t){CC(t.detail.id,"down",e)},this.onButtonUp=function(t){CC(t.detail.id,"up",e)},this.onButtonTouchEnd=function(t){CC(t.detail.id,"touchend",e)},this.onButtonTouchStart=function(t){CC(t.detail.id,"touchstart",e)},this.previousButtonValues={},this.bindMethods()},update:function(){var e=this.data;this.controllerIndex="right"===e.hand?0:"left"===e.hand?1:2},play:function(){this.checkIfControllerPresent(),this.addControllersUpdateListener()},pause:function(){this.removeEventListeners(),this.removeControllersUpdateListener()},bindMethods:function(){this.onModelLoaded=this.onModelLoaded.bind(this),this.onControllersUpdate=this.onControllersUpdate.bind(this),this.checkIfControllerPresent=this.checkIfControllerPresent.bind(this),this.removeControllersUpdateListener=this.removeControllersUpdateListener.bind(this),this.onAxisMoved=this.onAxisMoved.bind(this)},addEventListeners:function(){var e=this.el;e.addEventListener("buttonchanged",this.onButtonChanged),e.addEventListener("buttondown",this.onButtonDown),e.addEventListener("buttonup",this.onButtonUp),e.addEventListener("touchstart",this.onButtonTouchStart),e.addEventListener("touchend",this.onButtonTouchEnd),e.addEventListener("axismove",this.onAxisMoved),e.addEventListener("model-loaded",this.onModelLoaded),this.controllerEventsActive=!0},removeEventListeners:function(){var e=this.el;e.removeEventListener("buttonchanged",this.onButtonChanged),e.removeEventListener("buttondown",this.onButtonDown),e.removeEventListener("buttonup",this.onButtonUp),e.removeEventListener("touchstart",this.onButtonTouchStart),e.removeEventListener("touchend",this.onButtonTouchEnd),e.removeEventListener("axismove",this.onAxisMoved),e.removeEventListener("model-loaded",this.onModelLoaded),this.controllerEventsActive=!1},checkIfControllerPresent:function(){var e=this.data;yC(this,rI,{index:this.controllerIndex,hand:e.hand})},injectTrackedControls:function(){var e=this.el,t=this.data;e.setAttribute("tracked-controls",{idPrefix:rI,hand:t.hand,controller:this.controllerIndex}),this.data.model&&this.el.setAttribute("gltf-model",sI)},addControllersUpdateListener:function(){this.el.sceneEl.addEventListener("controllersupdated",this.onControllersUpdate,!1)},removeControllersUpdateListener:function(){this.el.sceneEl.removeEventListener("controllersupdated",this.onControllersUpdate,!1)},onControllersUpdate:function(){this.checkIfControllerPresent()},onButtonChanged:function(e){var t,n=this.mapping.buttons[e.detail.id];n&&("trigger"===n&&(t=e.detail.state.value,console.log("analog value of trigger press: "+t)),this.el.emit(n+"changed",e.detail.state))},onModelLoaded:function(e){e.detail.model.scale.set(.01,.01,.01)},onAxisMoved:function(e){xC(this,this.mapping.axes,e)},updateModel:function(e,t){},setButtonColor:function(e,t){}}),$b("components:material:error"));function aI(e,t){e.dispose(),t.unregisterMaterial(e),Object.keys(e).filter((function(t){return e[t]&&e[t].isTexture})).forEach((function(t){e[t].dispose()}))}Ww("material",{schema:{alphaTest:{default:0,min:0,max:1},depthTest:{default:!0},depthWrite:{default:!0},flatShading:{default:!1},npot:{default:!1},offset:{type:"vec2",default:{x:0,y:0}},opacity:{default:1,min:0,max:1},repeat:{type:"vec2",default:{x:1,y:1}},shader:{default:"standard",oneOf:k_,schemaChange:!0},side:{default:"front",oneOf:["front","back","double"]},transparent:{default:!1},vertexColorsEnabled:{default:!1},visible:{default:!0},blending:{default:"normal",oneOf:["none","normal","additive","subtractive","multiply"]},dithering:{default:!0},anisotropy:{default:0,min:0}},init:function(){this.material=null},update:function(e){var t=this.data;this.shader&&t.shader===e.shader||this.updateShader(t.shader),this.shader.update(this.data),this.updateMaterial(e)},updateSchema:function(e){var t,n,i,r;n=e&&e.shader,t=this.oldData&&this.oldData.shader,(i=U_[r=n||t]&&U_[r].schema)||oI("Unknown shader schema "+r),t&&n===t||(this.extendSchema(i),this.updateBehavior())},updateBehavior:function(){var e,t,n=this.el.sceneEl,i=this.schema,r=this;function s(e,n){var i;for(i in t)t[i]=e;r.shader.update(t)}for(e in this.tick=void 0,t={},i)"time"===i[e].type&&(this.tick=s,t[e]=!0);n&&(this.tick?n.addBehavior(this):n.removeBehavior(this))},updateShader:function(e){var t,n=this.data,i=U_[e]&&U_[e].Shader;if(!i)throw new Error("Unknown shader "+e);(t=this.shader=new i).el=this.el,t.init(n),this.setMaterial(t.material),this.updateSchema(n)},updateMaterial:function(e){var t,n=this.data,i=this.material;for(t in i.alphaTest=n.alphaTest,i.depthTest=!1!==n.depthTest,i.depthWrite=!1!==n.depthWrite,i.opacity=n.opacity,i.flatShading=n.flatShading,i.side=function(e){switch(e){case"back":return Wb.BackSide;case"double":return Wb.DoubleSide;default:return Wb.FrontSide}}(n.side),i.transparent=!1!==n.transparent||n.opacity<1,i.vertexColors=n.vertexColorsEnabled,i.visible=n.visible,i.blending=function(e){switch(e){case"none":return Wb.NoBlending;case"additive":return Wb.AdditiveBlending;case"subtractive":return Wb.SubtractiveBlending;case"multiply":return Wb.MultiplyBlending;default:return Wb.NormalBlending}}(n.blending),i.dithering=n.dithering,e)break;!t||e.alphaTest===n.alphaTest&&e.side===n.side&&e.vertexColorsEnabled===n.vertexColorsEnabled||(i.needsUpdate=!0)},remove:function(){var e=new Wb.MeshBasicMaterial,t=this.material,n=this.el.getObject3D("mesh");n&&(n.material=e),aI(t,this.system)},setMaterial:function(e){var t,n=this.el,i=this.system;this.material&&aI(this.material,i),this.material=e,i.registerMaterial(e),(t=n.getObject3D("mesh"))?t.material=e:n.addEventListener("object3dset",(function t(i){"mesh"===i.detail.type&&i.target===n&&(n.getObject3D("mesh").material=e,n.removeEventListener("object3dset",t))}))}});var lI,cI,hI,uI,dI,pI="oculus-touch",fI=qb+"controllers/oculus/oculus-touch-controller-",mI=qb+"controllers/meta/",AI={left:{modelUrl:fI+"left.gltf",rayOrigin:{origin:{x:.002,y:-.005,z:-.03},direction:{x:0,y:-.8,z:-1}},modelPivotOffset:new Wb.Vector3(-.005,.036,-.037),modelPivotRotation:new Wb.Euler(Math.PI/4.5,0,0)},right:{modelUrl:fI+"right.gltf",rayOrigin:{origin:{x:-.002,y:-.005,z:-.03},direction:{x:0,y:-.8,z:-1}},modelPivotOffset:new Wb.Vector3(.005,.036,-.037),modelPivotRotation:new Wb.Euler(Math.PI/4.5,0,0)}},gI="oculus-touch",vI={"oculus-touch":AI,"oculus-touch-v2":{left:{modelUrl:fI+"gen2-left.gltf",rayOrigin:{origin:{x:-.006,y:-.03,z:-.04},direction:{x:0,y:-.9,z:-1}},modelPivotOffset:new Wb.Vector3(0,-.007,-.021),modelPivotRotation:new Wb.Euler(-Math.PI/4,0,0)},right:{modelUrl:fI+"gen2-right.gltf",rayOrigin:{origin:{x:.006,y:-.03,z:-.04},direction:{x:0,y:-.9,z:-1}},modelPivotOffset:new Wb.Vector3(0,-.007,-.021),modelPivotRotation:new Wb.Euler(-Math.PI/4,0,0)}},"oculus-touch-v3":{left:{modelUrl:fI+"v3-left.glb",rayOrigin:{origin:{x:.0065,y:-.0186,z:-.05},direction:{x:.12394785839500175,y:-.5944043672340157,z:-.7945567170519814}},modelPivotOffset:new Wb.Vector3(0,0,0),modelPivotRotation:new Wb.Euler(0,0,0)},right:{modelUrl:fI+"v3-right.glb",rayOrigin:{origin:{x:-.0065,y:-.0186,z:-.05},direction:{x:-.12394785839500175,y:-.5944043672340157,z:-.7945567170519814}},modelPivotOffset:new Wb.Vector3(0,0,0),modelPivotRotation:new Wb.Euler(0,0,0)}},"meta-quest-touch-pro":{left:{modelUrl:mI+"quest-touch-pro-left.glb",rayOrigin:{origin:{x:.0065,y:-.0186,z:-.05},direction:{x:.12394785839500175,y:-.5944043672340157,z:-.7945567170519814}},modelPivotOffset:new Wb.Vector3(0,0,0),modelPivotRotation:new Wb.Euler(0,0,0)},right:{modelUrl:mI+"quest-touch-pro-right.glb",rayOrigin:{origin:{x:-.0065,y:-.0186,z:-.05},direction:{x:-.12394785839500175,y:-.5944043672340157,z:-.7945567170519814}},modelPivotOffset:new Wb.Vector3(0,0,0),modelPivotRotation:new Wb.Euler(0,0,0)}},"meta-quest-touch-plus":{left:{modelUrl:mI+"quest-touch-plus-left.glb",rayOrigin:{origin:{x:.0065,y:-.0186,z:-.05},direction:{x:.12394785839500175,y:-.5944043672340157,z:-.7945567170519814}},modelPivotOffset:new Wb.Vector3(0,0,0),modelPivotRotation:new Wb.Euler(0,0,0)},right:{modelUrl:mI+"quest-touch-plus-right.glb",rayOrigin:{origin:{x:-.0065,y:-.0186,z:-.05},direction:{x:-.12394785839500175,y:-.5944043672340157,z:-.7945567170519814}},modelPivotOffset:new Wb.Vector3(0,0,0),modelPivotRotation:new Wb.Euler(0,0,0)}}},yI={schema:{hand:{default:"left"},buttonColor:{type:"color",default:"#999"},buttonTouchColor:{type:"color",default:"#8AB"},buttonHighlightColor:{type:"color",default:"#2DF"},model:{default:!0},controllerType:{default:"auto",oneOf:["auto","oculus-touch","oculus-touch-v2","oculus-touch-v3"]}},after:["tracked-controls"],mapping:{left:{axes:{thumbstick:[2,3]},buttons:["trigger","grip","none","thumbstick","xbutton","ybutton","surface"]},right:{axes:{thumbstick:[2,3]},buttons:["trigger","grip","none","thumbstick","abutton","bbutton","surface"]}},bindMethods:function(){this.onButtonChanged=this.onButtonChanged.bind(this),this.onThumbstickMoved=this.onThumbstickMoved.bind(this),this.onModelLoaded=this.onModelLoaded.bind(this),this.onControllersUpdate=this.onControllersUpdate.bind(this),this.checkIfControllerPresent=this.checkIfControllerPresent.bind(this),this.onAxisMoved=this.onAxisMoved.bind(this)},init:function(){var e=this;this.onButtonDown=function(t){CC(t.detail.id,"down",e,e.data.hand)},this.onButtonUp=function(t){CC(t.detail.id,"up",e,e.data.hand)},this.onButtonTouchStart=function(t){CC(t.detail.id,"touchstart",e,e.data.hand)},this.onButtonTouchEnd=function(t){CC(t.detail.id,"touchend",e,e.data.hand)},this.controllerPresent=!1,this.previousButtonValues={},this.bindMethods(),this.triggerEuler=new Wb.Euler},addEventListeners:function(){var e=this.el;e.addEventListener("buttonchanged",this.onButtonChanged),e.addEventListener("buttondown",this.onButtonDown),e.addEventListener("buttonup",this.onButtonUp),e.addEventListener("touchstart",this.onButtonTouchStart),e.addEventListener("touchend",this.onButtonTouchEnd),e.addEventListener("axismove",this.onAxisMoved),e.addEventListener("model-loaded",this.onModelLoaded),e.addEventListener("thumbstickmoved",this.onThumbstickMoved),this.controllerEventsActive=!0},removeEventListeners:function(){var e=this.el;e.removeEventListener("buttonchanged",this.onButtonChanged),e.removeEventListener("buttondown",this.onButtonDown),e.removeEventListener("buttonup",this.onButtonUp),e.removeEventListener("touchstart",this.onButtonTouchStart),e.removeEventListener("touchend",this.onButtonTouchEnd),e.removeEventListener("axismove",this.onAxisMoved),e.removeEventListener("model-loaded",this.onModelLoaded),e.removeEventListener("thumbstickmoved",this.onThumbstickMoved),this.controllerEventsActive=!1},checkIfControllerPresent:function(){var e=this.controllerObject3D;e&&(e.visible=!1),yC(this,pI,{hand:this.data.hand,iterateControllerProfiles:!0})},play:function(){this.checkIfControllerPresent(),this.addControllersUpdateListener()},pause:function(){this.removeEventListeners(),this.removeControllersUpdateListener()},loadModel:function(e){var t,n=this.data;if(n.model){if(this.controllerObject3D)return this.controllerObject3D.visible=!0,void this.el.setObject3D("mesh",this.controllerObject3D);if(this.displayModel=vI[n.controllerType]||vI[gI],"auto"===n.controllerType){t=gI;for(var i=Object.keys(vI),r=0;r<e.profiles.length;r++)if(-1!==i.indexOf(e.profiles[r])){t=e.profiles[r];break}this.displayModel=vI[t]}var s=this.displayModel[n.hand].modelUrl;this.isTouchV3orPROorPlus=this.displayModel===vI["oculus-touch-v3"]||this.displayModel===vI["meta-quest-touch-pro"]||this.displayModel===vI["meta-quest-touch-plus"],this.el.setAttribute("gltf-model",s)}},injectTrackedControls:function(e){var t=this.data,n=pI;this.el.setAttribute("tracked-controls",{id:n,hand:t.hand,handTrackingEnabled:!1,iterateControllerProfiles:!0}),this.loadModel(e)},addControllersUpdateListener:function(){this.el.sceneEl.addEventListener("controllersupdated",this.onControllersUpdate,!1)},removeControllersUpdateListener:function(){this.el.sceneEl.removeEventListener("controllersupdated",this.onControllersUpdate,!1)},onControllersUpdate:function(){this.checkIfControllerPresent()},onButtonChanged:function(e){var t=this.mapping[this.data.hand].buttons[e.detail.id];if(t){if(this.isTouchV3orPROorPlus)this.onButtonChangedV3orPROorPlus(e);else{var n,i=this.buttonMeshes;"trigger"!==t&&"grip"!==t||(n=e.detail.state.value),i&&("trigger"===t&&i.trigger&&(i.trigger.rotation.x=this.originalXRotationTrigger-n*(Math.PI/26)),"grip"===t&&i.grip&&(n*="left"===this.data.hand?-1:1,i.grip.position.x=this.originalXPositionGrip+.004*n))}this.el.emit(t+"changed",e.detail.state)}},onButtonChangedV3orPROorPlus:function(e){var t,n=this.mapping[this.data.hand].buttons[e.detail.id],i=this.buttonObjects;i&&i[n]&&(t=e.detail.state.value,i[n].quaternion.slerpQuaternions(this.buttonRanges[n].min.quaternion,this.buttonRanges[n].max.quaternion,t),i[n].position.lerpVectors(this.buttonRanges[n].min.position,this.buttonRanges[n].max.position,t))},onModelLoaded:function(e){if(e.target===this.el&&this.data.model){if(this.isTouchV3orPROorPlus)this.onTouchV3orPROorPlusModelLoaded(e);else{var t,n=this.controllerObject3D=e.detail.model;(t=this.buttonMeshes={}).grip=n.getObjectByName("buttonHand"),this.originalXPositionGrip=t.grip&&t.grip.position.x,t.trigger=n.getObjectByName("buttonTrigger"),this.originalXRotationTrigger=t.trigger&&t.trigger.rotation.x,t.thumbstick=n.getObjectByName("stick"),t.xbutton=n.getObjectByName("buttonX"),t.abutton=n.getObjectByName("buttonA"),t.ybutton=n.getObjectByName("buttonY"),t.bbutton=n.getObjectByName("buttonB")}for(var i in this.buttonMeshes)this.buttonMeshes[i]&&EI(this.buttonMeshes[i]);this.applyOffset(e.detail.model),this.el.emit("controllermodelready",{name:"meta-touch-controls",model:this.data.model,rayOrigin:this.displayModel[this.data.hand].rayOrigin})}},applyOffset:function(e){e.position.copy(this.displayModel[this.data.hand].modelPivotOffset),e.rotation.copy(this.displayModel[this.data.hand].modelPivotRotation)},onTouchV3orPROorPlusModelLoaded:function(e){var t=this.controllerObject3D=e.detail.model,n=this.buttonObjects={},i=this.buttonMeshes={},r=this.buttonRanges={};i.grip=t.getObjectByName("squeeze"),n.grip=t.getObjectByName("xr_standard_squeeze_pressed_value"),r.grip={min:t.getObjectByName("xr_standard_squeeze_pressed_min"),max:t.getObjectByName("xr_standard_squeeze_pressed_max")},n.grip.minX=n.grip.position.x,i.thumbstick=t.getObjectByName("thumbstick"),n.thumbstick=t.getObjectByName("xr_standard_thumbstick_pressed_value"),r.thumbstick={min:t.getObjectByName("xr_standard_thumbstick_pressed_min"),max:t.getObjectByName("xr_standard_thumbstick_pressed_max")},n.thumbstickXAxis=t.getObjectByName("xr_standard_thumbstick_xaxis_pressed_value"),r.thumbstickXAxis={min:t.getObjectByName("xr_standard_thumbstick_xaxis_pressed_min"),max:t.getObjectByName("xr_standard_thumbstick_xaxis_pressed_max")},n.thumbstickYAxis=t.getObjectByName("xr_standard_thumbstick_yaxis_pressed_value"),r.thumbstickYAxis={min:t.getObjectByName("xr_standard_thumbstick_yaxis_pressed_min"),max:t.getObjectByName("xr_standard_thumbstick_yaxis_pressed_max")},i.trigger=t.getObjectByName("trigger"),n.trigger=t.getObjectByName("xr_standard_trigger_pressed_value"),r.trigger={min:t.getObjectByName("xr_standard_trigger_pressed_min"),max:t.getObjectByName("xr_standard_trigger_pressed_max")},r.trigger.diff={x:Math.abs(r.trigger.max.rotation.x)-Math.abs(r.trigger.min.rotation.x),y:Math.abs(r.trigger.max.rotation.y)-Math.abs(r.trigger.min.rotation.y),z:Math.abs(r.trigger.max.rotation.z)-Math.abs(r.trigger.min.rotation.z)};var s="left"===this.data.hand?"x":"a",o="left"===this.data.hand?"y":"b",a=s+"button",l=o+"button";i[a]=t.getObjectByName(s+"_button"),n[a]=t.getObjectByName(s+"_button_pressed_value"),r[a]={min:t.getObjectByName(s+"_button_pressed_min"),max:t.getObjectByName(s+"_button_pressed_max")},i[l]=t.getObjectByName(o+"_button"),n[l]=t.getObjectByName(o+"_button_pressed_value"),r[l]={min:t.getObjectByName(o+"_button_pressed_min"),max:t.getObjectByName(o+"_button_pressed_max")}},onAxisMoved:function(e){xC(this,this.mapping[this.data.hand].axes,e)},onThumbstickMoved:function(e){if(this.buttonMeshes&&this.buttonMeshes.thumbstick)if(this.isTouchV3orPROorPlus)this.updateThumbstickTouchV3orPROorPlus(e);else for(var t in e.detail)this.buttonObjects.thumbstick.rotation[this.axisMap[t]]=this.buttonRanges.thumbstick.originalRotation[this.axisMap[t]]-Math.PI/8*e.detail[t]*("y"===t||"right"===this.data.hand?-1:1)},axisMap:{y:"x",x:"z"},updateThumbstickTouchV3orPROorPlus:function(e){var t=(e.detail.x+1)/2;this.buttonObjects.thumbstickXAxis.quaternion.slerpQuaternions(this.buttonRanges.thumbstickXAxis.min.quaternion,this.buttonRanges.thumbstickXAxis.max.quaternion,t);var n=(e.detail.y+1)/2;this.buttonObjects.thumbstickYAxis.quaternion.slerpQuaternions(this.buttonRanges.thumbstickYAxis.min.quaternion,this.buttonRanges.thumbstickYAxis.max.quaternion,n)},updateModel:function(e,t){this.data.model&&this.updateButtonModel(e,t)},updateButtonModel:function(e,t){var n,i=this.buttonMeshes;i&&i[e]&&(n="up"===t||"touchend"===t?i[e].originalColor||this.data.buttonColor:"touchstart"===t?this.data.buttonTouchColor:this.data.buttonHighlightColor,i[e].material.color.set(n))}};function EI(e){e.traverse((function(t){var n;"Mesh"===t.type&&(n=t.material.clone(),e.originalColor=t.material.color,t.material.dispose(),t.material=n)}))}Ww("oculus-touch-controls",yI),Ww("meta-touch-controls",yI),Ww("obb-collider",{schema:{size:{default:0},trackedObject3D:{default:""},minimumColliderDimension:{default:.02},centerModel:{default:!1}},init:function(){this.previousScale=(new Wb.Vector3).copy(this.el.object3D.scale),this.auxEuler=new Wb.Euler,this.boundingBox=new Wb.Box3,this.boundingBoxSize=new Wb.Vector3,this.updateCollider=this.updateCollider.bind(this),this.onModelLoaded=this.onModelLoaded.bind(this),this.updateBoundingBox=this.updateBoundingBox.bind(this),this.el.addEventListener("model-loaded",this.onModelLoaded),this.updateCollider(),this.system.addCollider(this.el)},remove:function(){this.system.removeCollider(this.el)},update:function(){this.data.trackedObject3D&&(this.trackedObject3DPath=this.data.trackedObject3D.split("."))},onModelLoaded:function(){this.data.centerModel&&this.centerModel(),this.updateCollider()},centerModel:function(){var e,t=this.el,n=t.components["gltf-model"]&&t.components["gltf-model"].model;n&&(this.el.removeObject3D("mesh"),e=(new Wb.Box3).setFromObject(n).getCenter(new Wb.Vector3),n.position.x+=n.position.x-e.x,n.position.y+=n.position.y-e.y,n.position.z+=n.position.z-e.z,this.el.setObject3D("mesh",n))},updateCollider:function(){var e=this.el,t=this.boundingBoxSize,n=this.aabb=this.aabb||new Wb.OBB;this.obb=this.obb||new Wb.OBB,e.hasLoaded?(this.updateBoundingBox(),n.halfSize.copy(t).multiplyScalar(.5),this.el.sceneEl.systems["obb-collider"].data.showColliders&&this.showCollider()):e.addEventListener("loaded",this.updateCollider)},showCollider:function(){this.updateColliderMesh(),this.renderColliderMesh.visible=!0},updateColliderMesh:function(){var e=this.renderColliderMesh,t=this.boundingBoxSize;e?(e.geometry.dispose(),e.geometry=new Wb.BoxGeometry(t.x,t.y,t.z)):this.initColliderMesh()},hideCollider:function(){this.renderColliderMesh&&(this.renderColliderMesh.visible=!1)},initColliderMesh:function(){var e,t,n;e=this.boundingBoxSize,t=this.renderColliderGeometry=new Wb.BoxGeometry(e.x,e.y,e.z),(n=this.renderColliderMesh=new Wb.Mesh(t,new Wb.MeshLambertMaterial({color:65280,side:Wb.DoubleSide}))).matrixAutoUpdate=!1,n.matrixWorldAutoUpdate=!1,n.updateMatrixWorld=function(){},this.el.sceneEl.object3D.add(n)},updateBoundingBox:(lI=new Wb.Vector3,cI=new Wb.Vector3,hI=new Wb.Quaternion,uI=new Wb.Quaternion,dI=new Wb.Matrix4,function(){var e=this.auxEuler,t=this.boundingBox,n=this.data.size,i=this.trackedObject3D||this.el.object3D,r=this.boundingBoxSize,s=this.data.minimumColliderDimension;if(n)return this.boundingBoxSize.x=n,this.boundingBoxSize.y=n,void(this.boundingBoxSize.z=n);e.copy(i.rotation),i.rotation.set(0,0,0),i.parent.matrixWorld.decompose(lI,hI,cI),dI.compose(lI,uI,cI),i.parent.matrixWorld.copy(dI),t.setFromObject(i,!0),t.getSize(r),r.x=r.x<s?s:r.x,r.y=r.y<s?s:r.y,r.z=r.z<s?s:r.z,i.parent.matrixWorld.compose(lI,hI,cI),this.el.object3D.rotation.copy(e)}),checkTrackedObject:function(){var e,t=this.trackedObject3DPath;if(t&&t.length&&!this.trackedObject3D){e=this.el;for(var n=0;n<t.length&&(e=e[t[n]]);n++);e&&(this.trackedObject3D=e,this.updateCollider())}return this.trackedObject3D},tick:function(){var e=new Wb.Vector3,t=new Wb.Vector3,n=new Wb.Quaternion,i=new Wb.Matrix4;return function(){var r=this.obb,s=this.renderColliderMesh,o=this.checkTrackedObject()||this.el.object3D;o&&(o.updateMatrix(),o.updateMatrixWorld(!0),o.matrixWorld.decompose(e,n,t),(Math.abs(t.x-this.previousScale.x)>1e-4||Math.abs(t.y-this.previousScale.y)>1e-4||Math.abs(t.z-this.previousScale.z)>1e-4)&&this.updateCollider(),this.previousScale.copy(t),t.set(1,1,1),i.compose(e,n,t),s&&s.matrixWorld.copy(i),r.copy(this.aabb),r.applyMatrix4(i))}}()});var bI=$b("components:obj-model:warn"),xI=(Ww("obj-model",{schema:{mtl:{type:"model"},obj:{type:"model"}},init:function(){var e=this;this.model=null,this.objLoader=new Wb.OBJLoader,this.mtlLoader=new Wb.MTLLoader(this.objLoader.manager),this.mtlLoader.crossOrigin="",this.el.addEventListener("componentinitialized",(function(t){e.model&&"material"===t.detail.name&&e.applyMaterial()}))},update:function(){var e=this.data;e.obj&&(this.resetMesh(),this.loadObj(e.obj,e.mtl))},remove:function(){this.resetMesh()},resetMesh:function(){this.model&&this.el.removeObject3D("mesh")},loadObj:function(e,t){var n=this,i=this.el,r=this.mtlLoader,s=this.objLoader,o=this.el.sceneEl.systems.renderer,a=t.substr(0,t.lastIndexOf("/")+1);if(t)return i.hasAttribute("material")&&bI("Material component properties are ignored when a .MTL is provided"),r.setResourcePath(a),void r.load(t,(function(t){t.preload(),s.setMaterials(t),s.load(e,(function(e){n.model=e,n.model.traverse((function(e){if(e.isMesh){var t=e.material;t.map&&o.applyColorCorrection(t.map),t.emissiveMap&&o.applyColorCorrection(t.emissiveMap)}})),i.setObject3D("mesh",e),i.emit("model-loaded",{format:"obj",model:e})}))}));s.load(e,(function(e){n.model=e,n.applyMaterial(),i.setObject3D("mesh",e),i.emit("model-loaded",{format:"obj",model:e})}))},applyMaterial:function(){var e=this.el.components.material;e&&this.model.traverse((function(t){t instanceof Wb.Mesh&&(t.material=e.material)}))}}),qb+"controllers/oculus/go/oculus-go-controller.gltf"),CI="oculus-go",wI=(Ww("oculus-go-controls",{schema:{hand:{default:""},buttonColor:{type:"color",default:"#FFFFFF"},buttonTouchedColor:{type:"color",default:"#BBBBBB"},buttonHighlightColor:{type:"color",default:"#7A7A7A"},model:{default:!0}},mapping:{axes:{touchpad:[0,1]},buttons:["trigger","none","touchpad"]},bindMethods:function(){this.onModelLoaded=this.onModelLoaded.bind(this),this.onControllersUpdate=this.onControllersUpdate.bind(this),this.checkIfControllerPresent=this.checkIfControllerPresent.bind(this),this.removeControllersUpdateListener=this.removeControllersUpdateListener.bind(this),this.onAxisMoved=this.onAxisMoved.bind(this)},init:function(){var e=this;this.onButtonChanged=this.onButtonChanged.bind(this),this.onButtonDown=function(t){CC(t.detail.id,"down",e)},this.onButtonUp=function(t){CC(t.detail.id,"up",e)},this.onButtonTouchStart=function(t){CC(t.detail.id,"touchstart",e)},this.onButtonTouchEnd=function(t){CC(t.detail.id,"touchend",e)},this.controllerPresent=!1,this.bindMethods()},addEventListeners:function(){var e=this.el;e.addEventListener("buttonchanged",this.onButtonChanged),e.addEventListener("buttondown",this.onButtonDown),e.addEventListener("buttonup",this.onButtonUp),e.addEventListener("touchstart",this.onButtonTouchStart),e.addEventListener("touchend",this.onButtonTouchEnd),e.addEventListener("model-loaded",this.onModelLoaded),e.addEventListener("axismove",this.onAxisMoved),this.controllerEventsActive=!0},removeEventListeners:function(){var e=this.el;e.removeEventListener("buttonchanged",this.onButtonChanged),e.removeEventListener("buttondown",this.onButtonDown),e.removeEventListener("buttonup",this.onButtonUp),e.removeEventListener("touchstart",this.onButtonTouchStart),e.removeEventListener("touchend",this.onButtonTouchEnd),e.removeEventListener("model-loaded",this.onModelLoaded),e.removeEventListener("axismove",this.onAxisMoved),this.controllerEventsActive=!1},checkIfControllerPresent:function(){yC(this,CI,this.data.hand?{hand:this.data.hand}:{})},play:function(){this.checkIfControllerPresent(),this.addControllersUpdateListener()},pause:function(){this.removeEventListeners(),this.removeControllersUpdateListener()},injectTrackedControls:function(){var e=this.el,t=this.data;e.setAttribute("tracked-controls",{hand:t.hand,idPrefix:CI}),this.data.model&&this.el.setAttribute("gltf-model",xI)},addControllersUpdateListener:function(){this.el.sceneEl.addEventListener("controllersupdated",this.onControllersUpdate,!1)},removeControllersUpdateListener:function(){this.el.sceneEl.removeEventListener("controllersupdated",this.onControllersUpdate,!1)},onControllersUpdate:function(){this.checkIfControllerPresent()},onModelLoaded:function(e){var t,n=e.detail.model;e.target===this.el&&this.data.model&&((t=this.buttonMeshes={}).trigger=n.getObjectByName("oculus_go_button_trigger"),t.trackpad=n.getObjectByName("oculus_go_touchpad"),t.touchpad=n.getObjectByName("oculus_go_touchpad"))},onButtonChanged:function(e){var t=this.mapping.buttons[e.detail.id];t&&this.el.emit(t+"changed",e.detail.state)},onAxisMoved:function(e){xC(this,this.mapping.axes,e)},updateModel:function(e,t){this.data.model&&this.updateButtonModel(e,t)},updateButtonModel:function(e,t){var n=this.buttonMeshes;if(n&&n[e]){var i;switch(t){case"down":i=this.data.buttonHighlightColor;break;case"touchstart":i=this.data.buttonTouchedColor;break;default:i=this.data.buttonColor}n[e].material.color.set(i)}}}),"pico-4"),_I=qb+"controllers/pico/pico4/",MI=(Ww("pico-controls",{schema:{hand:{default:"none"},model:{default:!0}},mapping:{left:{axes:{thumbstick:[2,3]},buttons:["trigger","grip","none","thumbstick","xbutton","ybutton"]},right:{axes:{thumbstick:[2,3]},buttons:["trigger","grip","none","thumbstick","abutton","bbutton"]}},init:function(){var e=this;this.onButtonChanged=this.onButtonChanged.bind(this),this.onButtonDown=function(t){CC(t.detail.id,"down",e,e.data.hand)},this.onButtonUp=function(t){CC(t.detail.id,"up",e,e.data.hand)},this.onButtonTouchEnd=function(t){CC(t.detail.id,"touchend",e,e.data.hand)},this.onButtonTouchStart=function(t){CC(t.detail.id,"touchstart",e,e.data.hand)},this.bindMethods()},update:function(){var e=this.data;this.controllerIndex="right"===e.hand?0:"left"===e.hand?1:2},play:function(){this.checkIfControllerPresent(),this.addControllersUpdateListener()},pause:function(){this.removeEventListeners(),this.removeControllersUpdateListener()},bindMethods:function(){this.onModelLoaded=this.onModelLoaded.bind(this),this.onControllersUpdate=this.onControllersUpdate.bind(this),this.checkIfControllerPresent=this.checkIfControllerPresent.bind(this),this.removeControllersUpdateListener=this.removeControllersUpdateListener.bind(this),this.onAxisMoved=this.onAxisMoved.bind(this)},addEventListeners:function(){var e=this.el;e.addEventListener("buttonchanged",this.onButtonChanged),e.addEventListener("buttondown",this.onButtonDown),e.addEventListener("buttonup",this.onButtonUp),e.addEventListener("touchstart",this.onButtonTouchStart),e.addEventListener("touchend",this.onButtonTouchEnd),e.addEventListener("axismove",this.onAxisMoved),e.addEventListener("model-loaded",this.onModelLoaded),this.controllerEventsActive=!0},removeEventListeners:function(){var e=this.el;e.removeEventListener("buttonchanged",this.onButtonChanged),e.removeEventListener("buttondown",this.onButtonDown),e.removeEventListener("buttonup",this.onButtonUp),e.removeEventListener("touchstart",this.onButtonTouchStart),e.removeEventListener("touchend",this.onButtonTouchEnd),e.removeEventListener("axismove",this.onAxisMoved),e.removeEventListener("model-loaded",this.onModelLoaded),this.controllerEventsActive=!1},checkIfControllerPresent:function(){var e=this.data;yC(this,wI,{index:this.controllerIndex,hand:e.hand})},injectTrackedControls:function(){var e=this.el,t=this.data;e.setAttribute("tracked-controls",{idPrefix:wI,hand:t.hand,controller:this.controllerIndex}),this.data.model&&this.el.setAttribute("gltf-model",_I+this.data.hand+".glb")},addControllersUpdateListener:function(){this.el.sceneEl.addEventListener("controllersupdated",this.onControllersUpdate,!1)},removeControllersUpdateListener:function(){this.el.sceneEl.removeEventListener("controllersupdated",this.onControllersUpdate,!1)},onControllersUpdate:function(){this.checkIfControllerPresent()},onButtonChanged:function(e){var t,n=this.mapping[this.data.hand].buttons[e.detail.id];n&&("trigger"===n&&(t=e.detail.state.value,console.log("analog value of trigger press: "+t)),this.el.emit(n+"changed",e.detail.state))},onModelLoaded:function(e){e.target===this.el&&this.data.model&&this.el.emit("controllermodelready",{name:"pico-controls",model:this.data.model,rayOrigin:new Wb.Vector3(0,0,0)})},onAxisMoved:function(e){xC(this,this.mapping[this.data.hand].axes,e)}}),Ww("position",{schema:{type:"vec3"},update:function(){var e=this.el.object3D,t=this.data;e.position.set(t.x,t.y,t.z)},remove:function(){this.el.object3D.position.set(0,0,0)}}),$b("components:raycaster:warn")),II=/^[\w\s-.,[\]#]*$/,SI={childList:!0,attributes:!0,subtree:!0},TI="raycaster-intersected-cleared",BI="raycaster-intersection-cleared";function RI(e,t){var n;for(e.length=t.length,n=0;n<t.length;n++)e[n]=t[n]}Ww("raycaster",{schema:{autoRefresh:{default:!0},direction:{type:"vec3",default:{x:0,y:0,z:-1}},enabled:{default:!0},far:{default:1e3},interval:{default:0},near:{default:0},objects:{default:""},origin:{type:"vec3"},showLine:{default:!1},lineColor:{default:"white"},lineOpacity:{default:1},useWorldCoordinates:{default:!1}},multiple:!0,init:function(){this.clearedIntersectedEls=[],this.unitLineEndVec3=new Wb.Vector3,this.intersectedEls=[],this.intersections=[],this.newIntersectedEls=[],this.newIntersections=[],this.objects=[],this.prevCheckTime=void 0,this.prevIntersectedEls=[],this.rawIntersections=[],this.raycaster=new Wb.Raycaster,this.updateOriginDirection(),this.setDirty=this.setDirty.bind(this),this.updateLine=this.updateLine.bind(this),this.observer=new MutationObserver(this.setDirty),this.dirty=!0,this.lineEndVec3=new Wb.Vector3,this.otherLineEndVec3=new Wb.Vector3,this.lineData={end:this.lineEndVec3},this.getIntersection=this.getIntersection.bind(this),this.intersectedDetail={el:this.el,getIntersection:this.getIntersection},this.intersectedClearedDetail={el:this.el},this.intersectionClearedDetail={clearedEls:this.clearedIntersectedEls},this.intersectionDetail={}},update:function(e){var t=this.data,n=this.el,i=this.raycaster;i.far=t.far,i.near=t.near,!t.showLine||t.far===e.far&&t.origin===e.origin&&t.direction===e.direction&&e.showLine||(this.unitLineEndVec3.copy(t.direction).normalize(),this.drawLine()),!t.showLine&&e.showLine&&n.removeAttribute("line"),t.objects===e.objects||II.test(t.objects)||MI('[raycaster] Selector "'+t.objects+'" may not update automatically with DOM changes.'),t.objects||MI('[raycaster] For performance, please define raycaster.objects when using raycaster or cursor components to whitelist which entities to intersect with. e.g., raycaster="objects: [data-raycastable]".'),t.autoRefresh!==e.autoRefresh&&n.isPlaying&&(t.autoRefresh?this.addEventListeners():this.removeEventListeners()),e.enabled&&!t.enabled&&this.clearAllIntersections(),t.objects!==e.objects&&this.setDirty()},play:function(){this.addEventListeners()},pause:function(){this.removeEventListeners()},remove:function(){this.data.showLine&&this.el.removeAttribute("line"),this.clearAllIntersections()},addEventListeners:function(){this.data.autoRefresh&&(this.observer.observe(this.el.sceneEl,SI),this.el.sceneEl.addEventListener("object3dset",this.setDirty),this.el.sceneEl.addEventListener("object3dremove",this.setDirty))},removeEventListeners:function(){this.observer.disconnect(),this.el.sceneEl.removeEventListener("object3dset",this.setDirty),this.el.sceneEl.removeEventListener("object3dremove",this.setDirty)},setDirty:function(){this.dirty=!0},refreshObjects:function(){var e,t=this.data;e=t.objects?this.el.sceneEl.querySelectorAll(t.objects):this.el.sceneEl.querySelectorAll("*"),this.objects=this.flattenObject3DMaps(e),this.dirty=!1},tock:function(e){var t=this.data,n=this.prevCheckTime;t.enabled&&(n&&e-n<t.interval||(this.prevCheckTime=e,this.checkIntersections()))},checkIntersections:function(){var e,t,n=this.clearedIntersectedEls,i=this.el,r=this.data,s=this.intersectedEls,o=this.intersections,a=this.newIntersectedEls,l=this.newIntersections,c=this.prevIntersectedEls,h=this.rawIntersections;for(this.dirty&&this.refreshObjects(),RI(this.prevIntersectedEls,this.intersectedEls),this.updateOriginDirection(),h.length=0,this.raycaster.intersectObjects(this.objects,!0,h),o.length=0,s.length=0,e=0;e<h.length;e++)t=h[e],r.showLine&&t.object===i.getObject3D("line")||t.object.el&&(o.push(t),s.push(t.object.el));for(l.length=0,a.length=0,e=0;e<o.length;e++)-1===c.indexOf(o[e].object.el)&&(l.push(o[e]),a.push(o[e].object.el));for(n.length=0,e=0;e<c.length;e++)-1===s.indexOf(c[e])&&(c[e].emit(TI,this.intersectedClearedDetail),n.push(c[e]));for(n.length&&i.emit(BI,this.intersectionClearedDetail),e=0;e<a.length;e++)a[e].emit("raycaster-intersected",this.intersectedDetail);l.length&&(this.intersectionDetail.els=a,this.intersectionDetail.intersections=l,i.emit("raycaster-intersection",this.intersectionDetail)),(0===c.length&&o.length>0||c.length>0&&0===o.length||c.length&&o.length&&c[0]!==o[0].object.el)&&(this.intersectionDetail.els=this.intersectedEls,this.intersectionDetail.intersections=o,i.emit("raycaster-closest-entity-changed",this.intersectionDetail)),r.showLine&&setTimeout(this.updateLine)},updateLine:function(){var e,t=this.el,n=this.intersections;n.length&&(e=n[0].object.el===t&&n[1]?n[1].distance:n[0].distance),this.drawLine(e)},getIntersection:function(e){var t,n;for(t=0;t<this.intersections.length;t++)if((n=this.intersections[t]).object.el===e)return n;return null},updateOriginDirection:function(){var e=new Wb.Vector3,t=new Wb.Vector3;return function(){var n=this.el,i=this.data;i.useWorldCoordinates?this.raycaster.set(i.origin,i.direction):(n.object3D.updateMatrixWorld(),t.setFromMatrixPosition(n.object3D.matrixWorld),0===i.origin.x&&0===i.origin.y&&0===i.origin.z||(t=n.object3D.localToWorld(t.copy(i.origin))),e.copy(i.direction).transformDirection(n.object3D.matrixWorld).normalize(),this.raycaster.set(t,e))}}(),drawLine:function(e){var t,n=this.data,i=this.el;t=this.lineData.end===this.lineEndVec3?this.otherLineEndVec3:this.lineEndVec3,void 0===e&&(e=n.far===1/0?1e3:n.far),this.lineData.start=n.origin,this.lineData.end=t.copy(this.unitLineEndVec3).multiplyScalar(e).add(n.origin),this.lineData.color=n.lineColor,this.lineData.opacity=n.lineOpacity,i.setAttribute("line",this.lineData)},flattenObject3DMaps:function(e){var t,n,i=this.objects,r=this.el.sceneEl.object3D;function s(e){return e.parent?s(e.parent):e===r}for(i.length=0,n=0;n<e.length;n++){var o=e[n];if(o.isEntity&&o.object3D&&s(o.object3D))for(t in o.object3DMap)i.push(o.getObject3D(t))}return i},clearAllIntersections:function(){var e;for(e=0;e<this.intersectedEls.length;e++)this.intersectedEls[e].emit(TI,this.intersectedClearedDetail);RI(this.clearedIntersectedEls,this.intersectedEls),this.intersectedEls.length=0,this.intersections.length=0,this.el.emit(BI,this.intersectionClearedDetail)}});var LI,DI,PI,UI,kI=Wb.MathUtils.degToRad,NI=(Ww("rotation",{schema:{type:"vec3"},update:function(){var e=this.data;this.el.object3D.rotation.set(kI(e.x),kI(e.y),kI(e.z),"YXZ")},remove:function(){this.el.object3D.rotation.set(0,0,0)}}),Ww("scale",{schema:{type:"vec3",default:{x:1,y:1,z:1}},update:function(){var e=this.data;this.el.object3D.scale.set(e.x,e.y,e.z)},remove:function(){this.el.object3D.scale.set(1,1,1)}}),Ww("shadow",{schema:{cast:{default:!0},receive:{default:!0}},init:function(){this.onMeshChanged=this.update.bind(this),this.el.addEventListener("object3dset",this.onMeshChanged),this.system.setShadowMapEnabled(!0)},update:function(){var e=this.data;this.updateDescendants(e.cast,e.receive)},remove:function(){this.el.removeEventListener("object3dset",this.onMeshChanged),this.updateDescendants(!1,!1)},updateDescendants:function(e,t){var n=this.el.sceneEl;this.el.object3D.traverse((function(i){if(i instanceof Wb.Mesh&&(i.castShadow=e,i.receiveShadow=t,n.hasLoaded&&i.material))for(var r=Array.isArray(i.material)?i.material:[i.material],s=0;s<r.length;s++)r[s].needsUpdate=!0}))}}),$b("components:sound:warn")),OI=(Ww("sound",{schema:{autoplay:{default:!1},distanceModel:{default:"inverse",oneOf:["linear","inverse","exponential"]},loop:{default:!1},loopStart:{default:0},loopEnd:{default:0},maxDistance:{default:1e4},on:{default:""},poolSize:{default:1},positional:{default:!0},refDistance:{default:1},rolloffFactor:{default:1},src:{type:"audio"},volume:{default:1}},multiple:!0,init:function(){var e=this;this.listener=null,this.audioLoader=new Wb.AudioLoader,this.pool=new Wb.Group,this.loaded=!1,this.mustPlay=!1,this.playSoundBound=function(){e.playSound()}},update:function(e){var t,n,i=this.data,r=i.src!==e.src;if(r){if(!i.src)return;this.setupSound()}for(t=0;t<this.pool.children.length;t++)n=this.pool.children[t],i.positional&&(n.setDistanceModel(i.distanceModel),n.setMaxDistance(i.maxDistance),n.setRefDistance(i.refDistance),n.setRolloffFactor(i.rolloffFactor)),n.setLoop(i.loop),n.setLoopStart(i.loopStart),0!==i.loopStart&&0===i.loopEnd?n.setLoopEnd(n.buffer.duration):n.setLoopEnd(i.loopEnd),n.setVolume(i.volume),n.isPaused=!1;if(i.on!==e.on&&this.updateEventListener(e.on),r){var s=this;this.loaded=!1,this.audioLoader.load(i.src,(function(e){for(t=0;t<s.pool.children.length;t++)(n=s.pool.children[t]).setBuffer(e);s.loaded=!0,Wb.Cache.remove(i.src),(s.data.autoplay||s.mustPlay)&&s.playSound(s.processSound),s.el.emit("sound-loaded",s.evtDetail,!1)}))}},pause:function(){this.stopSound(),this.removeEventListener()},play:function(){this.data.autoplay&&this.playSound(),this.updateEventListener()},remove:function(){var e;this.removeEventListener(),this.el.getObject3D(this.attrName)&&this.el.removeObject3D(this.attrName);try{for(e=0;e<this.pool.children.length;e++)this.pool.children[e].disconnect()}catch(e){NI("Audio source not properly disconnected")}},updateEventListener:function(e){var t=this.el;e&&t.removeEventListener(e,this.playSoundBound),t.addEventListener(this.data.on,this.playSoundBound)},removeEventListener:function(){this.el.removeEventListener(this.data.on,this.playSoundBound)},setupSound:function(){var e,t,n=this.el,i=n.sceneEl,r=this;this.pool.children.length>0&&(this.stopSound(),n.removeObject3D("sound"));var s=this.listener=i.audioListener||new Wb.AudioListener;for(i.audioListener=s,i.camera&&i.camera.add(s),i.addEventListener("camera-set-active",(function(e){e.detail.cameraEl.getObject3D("camera").add(s)})),this.pool=new Wb.Group,e=0;e<this.data.poolSize;e++)t=this.data.positional?new Wb.PositionalAudio(s):new Wb.Audio(s),this.pool.add(t);for(n.setObject3D(this.attrName,this.pool),e=0;e<this.pool.children.length;e++)(t=this.pool.children[e]).onEnded=function(){this.isPlaying=!1,r.el.emit("sound-ended",r.evtDetail,!1)}},pauseSound:function(){var e,t;for(this.isPlaying=!1,e=0;e<this.pool.children.length;e++)(t=this.pool.children[e]).source&&t.source.buffer&&t.isPlaying&&!t.isPaused&&(t.isPaused=!0,t.pause())},playSound:function(e){var t,n,i;if(!this.loaded)return NI("Sound not loaded yet. It will be played once it finished loading"),this.mustPlay=!0,void(this.processSound=e);for(t=!1,this.isPlaying=!0,n=0;n<this.pool.children.length;n++)(i=this.pool.children[n]).isPlaying||!i.buffer||t||(e&&e(i),i.play(),i.isPaused=!1,t=!0);t?(this.mustPlay=!1,this.processSound=void 0):NI("All the sounds are playing. If you need to play more sounds simultaneously consider increasing the size of pool with the `poolSize` attribute.",this.el)},stopSound:function(){var e,t;for(this.isPlaying=!1,e=0;e<this.pool.children.length;e++){if(!(t=this.pool.children[e]).source||!t.source.buffer)return;t.stop()}}}),n(4433)),FI=n.n(OI),QI=n(5751),zI=n.n(QI),GI=$b("components:text:error"),HI=$b("components:text:warn"),VI=qb+"fonts/",jI={aileronsemibold:VI+"Aileron-Semibold.fnt",dejavu:VI+"DejaVu-sdf.fnt",exo2bold:VI+"Exo2Bold.fnt",exo2semibold:VI+"Exo2SemiBold.fnt",kelsonsans:VI+"KelsonSans.fnt",monoid:VI+"Monoid.fnt",mozillavr:VI+"mozillavr.fnt",roboto:VI+"Roboto-msdf.json",sourcecodepro:VI+"SourceCodePro.fnt"},WI=["roboto"],qI="roboto",XI=new function(){var e=this.cache={};this.get=function(t,n){return t in e||(e[t]=n()),e[t]}},YI={},JI={},KI=/^\w+:/;function ZI(e,t,n){return e||(.5+t)*n}Ww("text",{multiple:!0,schema:{align:{type:"string",default:"left",oneOf:["left","right","center"]},alphaTest:{default:.5},anchor:{default:"center",oneOf:["left","right","center","align"]},baseline:{default:"center",oneOf:["top","center","bottom"]},color:{type:"color",default:"#FFF"},font:{type:"string",default:qI},fontImage:{type:"string"},height:{type:"number"},letterSpacing:{type:"number",default:0},lineHeight:{type:"number"},negate:{type:"boolean",default:!0},opacity:{type:"number",default:1},shader:{default:"sdf",oneOf:U_},side:{default:"front",oneOf:["front","back","double"]},tabSize:{default:4},transparent:{default:!0},value:{type:"string"},whiteSpace:{default:"normal",oneOf:["normal","pre","nowrap"]},width:{type:"number"},wrapCount:{type:"number",default:40},wrapPixels:{type:"number"},xOffset:{type:"number",default:0},yOffset:{type:"number",default:0},zOffset:{type:"number",default:.001}},init:function(){this.shaderData={},this.geometry=FI()(),this.createOrUpdateMaterial(),this.explicitGeoDimensionsChecked=!1},update:function(e){var t=this.data,n=this.currentFont;JI[t.font]?this.texture=JI[t.font]:(this.texture=JI[t.font]=new Wb.Texture,this.texture.anisotropy=16),this.createOrUpdateMaterial(),e.font===t.font?n&&(this.updateGeometry(this.geometry,n),this.updateLayout()):this.updateFont()},remove:function(){this.geometry.dispose(),this.geometry=null,this.el.removeObject3D(this.attrName),this.material.dispose(),this.material=null,this.texture.dispose(),this.texture=null,this.shaderObject&&delete this.shaderObject},createOrUpdateMaterial:function(){var e,t,n,i=this.data,r=this.material,s=this.shaderData;if(n=i.shader,-1!==WI.indexOf(i.font)||i.font.indexOf("-msdf.")>=0?n="msdf":i.font in jI&&-1===WI.indexOf(i.font)&&(n="sdf"),e=(this.shaderObject&&this.shaderObject.name)!==n,s.alphaTest=i.alphaTest,s.color=i.color,s.map=this.texture,s.opacity=i.opacity,s.side=function(e){switch(e){case"back":return Wb.FrontSide;case"double":return Wb.DoubleSide;default:return Wb.BackSide}}(i.side),s.transparent=i.transparent,s.negate=i.negate,!e)return this.shaderObject.update(s),r.transparent=s.transparent,void(r.side=s.side);t=function(e,t,n){var i,r;return(r=new U_[t].Shader).el=e,r.init(n),r.update(n),(i=r.material).transparent=n.transparent,{material:i,shader:r}}(this.el,n,s),this.material=t.material,this.shaderObject=t.shader,this.material.side=s.side,this.mesh&&(this.mesh.material=this.material)},updateFont:function(){var e,t=this.data,n=this.el,i=this.geometry,r=this;t.font||HI("No font specified. Using the default font."),this.mesh&&(this.mesh.visible=!1),e=this.lookupFont(t.font||qI)||t.font,XI.get(e,(function(){return function(e,t){return new Promise((function(n,i){zI()(e,(function(r,s){if(r)return GI("Error loading font",e),void i(r);e.indexOf("/Roboto-msdf.json")>=0&&(t=30),t&&s.chars.forEach((function(e){e.yoffset+=t})),n(s)}))}))}(e,t.yOffset)})).then((function(s){var o;if(1!==s.pages.length)throw new Error("Currently only single-page bitmap fonts are supported.");YI[e]||(s.widthFactor=YI[s]=function(e){var t=0,n=0,i=0;return e.chars.forEach((function(e){t+=e.xadvance,e.id>=48&&e.id<=57&&(i++,n+=e.xadvance)})),i?n/i:t/e.chars.length}(s)),r.currentFont=s,o=r.getFontImageSrc(),XI.get(o,(function(){return function(e){return new Promise((function(t,n){(new Wb.ImageLoader).load(e,(function(e){t(e)}),void 0,(function(){GI("Error loading font image",e),n(null)}))}))}(o)})).then((function(e){var o=r.texture;o&&(o.image=e,o.needsUpdate=!0,JI[t.font]=o,r.texture=o,r.initMesh(),r.currentFont=s,r.updateGeometry(i,s),r.updateLayout(),r.mesh.visible=!0,n.emit("textfontset",{font:t.font,fontObj:s}))})).catch((function(e){GI(e.message),GI(e.stack)}))})).catch((function(e){GI(e.message),GI(e.stack)}))},initMesh:function(){this.mesh||(this.mesh=new Wb.Mesh(this.geometry,this.material),this.el.setObject3D(this.attrName,this.mesh))},getFontImageSrc:function(){if(this.data.fontImage)return this.data.fontImage;var e=this.lookupFont(this.data.font||qI)||this.data.font,t=this.currentFont.pages[0];return t.match(KI)&&0!==t.indexOf("http")?e.replace(/(\.fnt)|(\.json)/,".png"):Wb.LoaderUtils.extractUrlBase(e)+t},updateLayout:function(){var e,t,n,i,r,s,o,a,l,c=this.el,h=this.data,u=this.geometry,d=this.mesh;if(d&&u.layout){if(n=c.getAttribute("geometry"),i=(s=(o=h.width||n&&n.width||1)/ZI(h.wrapPixels,h.wrapCount,this.currentFont.widthFactor))*((r=u.layout).height+r.descender),n&&"plane"===n.primitive&&(this.explicitGeoDimensionsChecked||(this.explicitGeoDimensionsChecked=!0,this.hasExplicitGeoWidth=!!n.width,this.hasExplicitGeoHeight=!!n.height),this.hasExplicitGeoWidth||c.setAttribute("geometry","width",o),this.hasExplicitGeoHeight||c.setAttribute("geometry","height",i)),"left"===(e="align"===h.anchor?h.align:h.anchor))a=0;else if("right"===e)a=-1*r.width;else{if("center"!==e)throw new TypeError("Invalid text.anchor property value",e);a=-1*r.width/2}if("bottom"===(t=h.baseline))l=0;else if("top"===t)l=-1*r.height+r.ascender;else{if("center"!==t)throw new TypeError("Invalid text.baseline property value",t);l=-1*r.height/2}d.position.x=a*s+h.xOffset,d.position.y=l*s,d.position.z=h.zOffset,d.scale.set(s,-1*s,s)}},lookupFont:function(e){return jI[e]},updateGeometry:(LI={},DI={},PI=/\\n/g,UI=/\\t/g,function(e,t){var n=this.data;DI.font=t,DI.lineHeight=n.lineHeight&&isFinite(n.lineHeight)?n.lineHeight:t.common.lineHeight,DI.text=n.value.toString().replace(PI,"\n").replace(UI,"\t"),DI.width=ZI(n.wrapPixels,n.wrapCount,t.widthFactor),e.update(DC(LI,n,DI))})});var $I,eS,tS=(Ww("tracked-controls",{schema:{id:{type:"string",default:""},controller:{default:-1},autoHide:{default:!0},hand:{type:"string",default:""},handTrackingEnabled:{default:!1},iterateControllerProfiles:{default:!1}},init:function(){this.buttonEventDetails={},this.buttonStates=this.el.components["tracked-controls"].buttonStates={},this.axis=this.el.components["tracked-controls"].axis=[0,0,0],this.changedAxes=[],this.axisMoveEventDetail={axis:this.axis,changed:this.changedAxes},this.updateController=this.updateController.bind(this)},update:function(){this.updateController()},play:function(){var e=this.el.sceneEl;this.updateController(),e.addEventListener("controllersupdated",this.updateController)},pause:function(){this.el.sceneEl.removeEventListener("controllersupdated",this.updateController)},isControllerPresent:function(e){return!(!this.controller||this.controller.gamepad||"none"!==e.inputSource.handedness&&e.inputSource.handedness!==this.data.hand)},updateController:function(){this.controller=bC(this.system.controllers,this.data.id,this.data.hand,this.data.controller,this.data.iterateControllerProfiles,this.data.handTrackingEnabled),this.el.components["tracked-controls"].controller=this.controller},tick:function(){var e=this.el.sceneEl,t=this.controller,n=e.frame;this.data.autoHide&&(this.el.object3D.visible=!!t),t&&e.frame&&this.system.referenceSpace&&(t.hand||(this.pose=n.getPose(t.gripSpace,this.system.referenceSpace),this.updatePose(),this.updateButtons()))},updatePose:function(){var e=this.el.object3D,t=this.pose;t&&(e.matrix.elements=t.transform.matrix,e.matrix.decompose(e.position,e.rotation,e.scale))},updateButtons:function(){var e,t,n,i=this.controller;if(i&&i.gamepad){for(n=i.gamepad,t=0;t<n.buttons.length;++t)this.buttonStates[t]||(this.buttonStates[t]={pressed:!1,touched:!1,value:0}),this.buttonEventDetails[t]||(this.buttonEventDetails[t]={id:t,state:this.buttonStates[t]}),e=n.buttons[t],this.handleButton(t,e);this.handleAxes()}},handleButton:function(e,t){return!!(this.handlePress(e,t)|this.handleTouch(e,t)|this.handleValue(e,t))&&(this.el.emit("buttonchanged",this.buttonEventDetails[e],!1),!0)},handleAxes:function(){var e,t=!1,n=this.controller.gamepad.axes,i=this.axis,r=this.changedAxes;for(this.changedAxes.splice(0,this.changedAxes.length),e=0;e<n.length;++e)r.push(i[e]!==n[e]),r[e]&&(t=!0);if(!t)return!1;for(this.axis.splice(0,this.axis.length),e=0;e<n.length;e++)this.axis.push(n[e]);return this.el.emit("axismove",this.axisMoveEventDetail,!1),!0},handlePress:function(e,t){var n,i=this.buttonStates[e];return t.pressed!==i.pressed&&(n=t.pressed?"buttondown":"buttonup",this.el.emit(n,this.buttonEventDetails[e],!1),i.pressed=t.pressed,!0)},handleTouch:function(e,t){var n,i=this.buttonStates[e];return t.touched!==i.touched&&(n=t.touched?"touchstart":"touchend",this.el.emit(n,this.buttonEventDetails[e],!1),i.touched=t.touched,!0)},handleValue:function(e,t){var n=this.buttonStates[e];return t.value!==n.value&&(n.value=t.value,!0)}}),Ww("visible",{schema:{default:!0},update:function(){this.el.object3D.visible=this.data}}),qb+"controllers/valve/index/valve-index-"),nS={left:tS+"left.glb",right:tS+"right.glb"},iS="valve",rS={left:{x:0,y:-.05,z:.06},right:{x:0,y:-.05,z:.06}},sS={left:{_x:Math.PI/3,_y:0,_z:0,_order:"XYZ"},right:{_x:Math.PI/3,_y:0,_z:0,_order:"XYZ"}},oS=(Ww("valve-index-controls",{schema:{hand:{default:"left"},buttonColor:{type:"color",default:"#FAFAFA"},buttonHighlightColor:{type:"color",default:"#22D1EE"},model:{default:!0}},after:["tracked-controls"],mapping:{axes:{trackpad:[0,1],thumbstick:[2,3]},buttons:["trigger","grip","trackpad","thumbstick","abutton"]},init:function(){var e=this;this.controllerPresent=!1,this.onButtonChanged=this.onButtonChanged.bind(this),this.onButtonDown=function(t){CC(t.detail.id,"down",e)},this.onButtonUp=function(t){CC(t.detail.id,"up",e)},this.onButtonTouchEnd=function(t){CC(t.detail.id,"touchend",e)},this.onButtonTouchStart=function(t){CC(t.detail.id,"touchstart",e)},this.previousButtonValues={},this.bindMethods()},play:function(){this.checkIfControllerPresent(),this.addControllersUpdateListener()},pause:function(){this.removeEventListeners(),this.removeControllersUpdateListener()},bindMethods:function(){this.onModelLoaded=this.onModelLoaded.bind(this),this.onControllersUpdate=this.onControllersUpdate.bind(this),this.checkIfControllerPresent=this.checkIfControllerPresent.bind(this),this.removeControllersUpdateListener=this.removeControllersUpdateListener.bind(this),this.onAxisMoved=this.onAxisMoved.bind(this)},addEventListeners:function(){var e=this.el;e.addEventListener("buttonchanged",this.onButtonChanged),e.addEventListener("buttondown",this.onButtonDown),e.addEventListener("buttonup",this.onButtonUp),e.addEventListener("touchend",this.onButtonTouchEnd),e.addEventListener("touchstart",this.onButtonTouchStart),e.addEventListener("model-loaded",this.onModelLoaded),e.addEventListener("axismove",this.onAxisMoved),this.controllerEventsActive=!0},removeEventListeners:function(){var e=this.el;e.removeEventListener("buttonchanged",this.onButtonChanged),e.removeEventListener("buttondown",this.onButtonDown),e.removeEventListener("buttonup",this.onButtonUp),e.removeEventListener("touchend",this.onButtonTouchEnd),e.removeEventListener("touchstart",this.onButtonTouchStart),e.removeEventListener("model-loaded",this.onModelLoaded),e.removeEventListener("axismove",this.onAxisMoved),this.controllerEventsActive=!1},checkIfControllerPresent:function(){var e=this.data,t="right"===e.hand?0:"left"===e.hand?1:2;yC(this,iS,{index:t,iterateControllerProfiles:!0,hand:e.hand})},injectTrackedControls:function(){var e=this.el,t=this.data;e.setAttribute("tracked-controls",{idPrefix:iS,controller:"right"===t.hand?1:"left"===t.hand?0:2,hand:t.hand}),this.loadModel()},loadModel:function(){var e=this.data;e.model&&this.el.setAttribute("gltf-model",""+nS[e.hand])},addControllersUpdateListener:function(){this.el.sceneEl.addEventListener("controllersupdated",this.onControllersUpdate,!1)},removeControllersUpdateListener:function(){this.el.sceneEl.removeEventListener("controllersupdated",this.onControllersUpdate,!1)},onControllersUpdate:function(){this.checkIfControllerPresent()},onButtonChanged:function(e){var t,n=this.mapping.buttons[e.detail.id],i=this.buttonMeshes;n&&("trigger"===n&&(t=e.detail.state.value,i&&i.trigger&&(i.trigger.rotation.x=this.triggerOriginalRotationX-t*(Math.PI/40))),this.el.emit(n+"changed",e.detail.state))},onModelLoaded:function(e){var t,n=e.detail.model,i=this;e.target===this.el&&this.data.model&&((t=this.buttonMeshes={}).grip={left:n.getObjectByName("leftgrip"),right:n.getObjectByName("rightgrip")},t.menu=n.getObjectByName("menubutton"),t.system=n.getObjectByName("systembutton"),t.trackpad=n.getObjectByName("touchpad"),t.trigger=n.getObjectByName("trigger"),this.triggerOriginalRotationX=t.trigger.rotation.x,Object.keys(t).forEach((function(e){i.setButtonColor(e,i.data.buttonColor)})),n.position.copy(sS[this.data.hand]),n.rotation.copy(rS[this.data.hand]),this.el.emit("controllermodelready",{name:"valve-index-controls",model:this.data.model,rayOrigin:new Wb.Vector3(0,0,0)}))},onAxisMoved:function(e){xC(this,this.mapping.axes,e)},updateModel:function(e,t){var n;this.data.model&&(-1!==t.indexOf("touch")||(n="up"===t?this.data.buttonColor:this.data.buttonHighlightColor,this.setButtonColor(e,n)))},setButtonColor:function(e,t){}}),qb+"controllers/vive/vr_controller_vive.obj"),aS=qb+"controllers/vive/vr_controller_vive.mtl",lS="htc-vive",cS=(Ww("vive-controls",{schema:{hand:{default:"left"},buttonColor:{type:"color",default:"#FAFAFA"},buttonHighlightColor:{type:"color",default:"#22D1EE"},model:{default:!0}},after:["tracked-controls"],mapping:{axes:{touchpad:[0,1]},buttons:["trigger","grip","touchpad","none"]},init:function(){var e=this;this.controllerPresent=!1,this.onButtonChanged=this.onButtonChanged.bind(this),this.onButtonDown=function(t){CC(t.detail.id,"down",e)},this.onButtonUp=function(t){CC(t.detail.id,"up",e)},this.onButtonTouchEnd=function(t){CC(t.detail.id,"touchend",e)},this.onButtonTouchStart=function(t){CC(t.detail.id,"touchstart",e)},this.previousButtonValues={},this.bindMethods()},update:function(){var e=this.data;this.controllerIndex="right"===e.hand?0:"left"===e.hand?1:2},play:function(){this.checkIfControllerPresent(),this.addControllersUpdateListener()},pause:function(){this.removeEventListeners(),this.removeControllersUpdateListener()},bindMethods:function(){this.onModelLoaded=this.onModelLoaded.bind(this),this.onControllersUpdate=this.onControllersUpdate.bind(this),this.checkIfControllerPresent=this.checkIfControllerPresent.bind(this),this.removeControllersUpdateListener=this.removeControllersUpdateListener.bind(this),this.onAxisMoved=this.onAxisMoved.bind(this)},addEventListeners:function(){var e=this.el;e.addEventListener("buttonchanged",this.onButtonChanged),e.addEventListener("buttondown",this.onButtonDown),e.addEventListener("buttonup",this.onButtonUp),e.addEventListener("touchend",this.onButtonTouchEnd),e.addEventListener("touchstart",this.onButtonTouchStart),e.addEventListener("model-loaded",this.onModelLoaded),e.addEventListener("axismove",this.onAxisMoved),this.controllerEventsActive=!0},removeEventListeners:function(){var e=this.el;e.removeEventListener("buttonchanged",this.onButtonChanged),e.removeEventListener("buttondown",this.onButtonDown),e.removeEventListener("buttonup",this.onButtonUp),e.removeEventListener("touchend",this.onButtonTouchEnd),e.removeEventListener("touchstart",this.onButtonTouchStart),e.removeEventListener("model-loaded",this.onModelLoaded),e.removeEventListener("axismove",this.onAxisMoved),this.controllerEventsActive=!1},checkIfControllerPresent:function(){var e=this.data;yC(this,lS,{index:this.controllerIndex,hand:e.hand})},injectTrackedControls:function(){var e=this.el,t=this.data;e.setAttribute("tracked-controls",{idPrefix:lS,hand:t.hand,controller:this.controllerIndex}),this.data.model&&this.el.setAttribute("obj-model",{obj:oS,mtl:aS})},addControllersUpdateListener:function(){this.el.sceneEl.addEventListener("controllersupdated",this.onControllersUpdate,!1)},removeControllersUpdateListener:function(){this.el.sceneEl.removeEventListener("controllersupdated",this.onControllersUpdate,!1)},onControllersUpdate:function(){this.checkIfControllerPresent()},onButtonChanged:function(e){var t,n=this.mapping.buttons[e.detail.id],i=this.buttonMeshes;n&&("trigger"===n&&(t=e.detail.state.value,i&&i.trigger&&(i.trigger.rotation.x=-t*(Math.PI/12))),this.el.emit(n+"changed",e.detail.state))},onModelLoaded:function(e){var t,n=e.detail.model,i=this;e.target===this.el&&this.data.model&&((t=this.buttonMeshes={}).grip={left:n.getObjectByName("leftgrip"),right:n.getObjectByName("rightgrip")},t.menu=n.getObjectByName("menubutton"),t.system=n.getObjectByName("systembutton"),t.trackpad=n.getObjectByName("touchpad"),t.touchpad=n.getObjectByName("touchpad"),t.trigger=n.getObjectByName("trigger"),Object.keys(t).forEach((function(e){i.setButtonColor(e,i.data.buttonColor)})),n.position.set(0,-.015,.04))},onAxisMoved:function(e){xC(this,this.mapping.axes,e)},updateModel:function(e,t){var n;this.data.model&&(-1!==t.indexOf("touch")||(n="up"===t?this.data.buttonColor:this.data.buttonHighlightColor,this.setButtonColor(e,n)))},setButtonColor:function(e,t){var n=this.buttonMeshes;if(n)return"grip"===e?(n.grip.left.material.color.set(t),void n.grip.right.material.color.set(t)):void n[e].material.color.set(t)}}),qb+"controllers/vive/focus-controller/focus-controller.gltf"),hS="htc-vive-focus",uS=(Ww("vive-focus-controls",{schema:{hand:{default:""},buttonTouchedColor:{type:"color",default:"#BBBBBB"},buttonHighlightColor:{type:"color",default:"#7A7A7A"},model:{default:!0}},after:["tracked-controls"],mapping:{axes:{touchpad:[0,1]},buttons:["trigger","none","touchpad","none","menu"]},bindMethods:function(){this.onModelLoaded=this.onModelLoaded.bind(this),this.onControllersUpdate=this.onControllersUpdate.bind(this),this.checkIfControllerPresent=this.checkIfControllerPresent.bind(this),this.removeControllersUpdateListener=this.removeControllersUpdateListener.bind(this),this.onAxisMoved=this.onAxisMoved.bind(this)},init:function(){var e=this;this.onButtonChanged=this.onButtonChanged.bind(this),this.onButtonDown=function(t){CC(t.detail.id,"down",e)},this.onButtonUp=function(t){CC(t.detail.id,"up",e)},this.onButtonTouchStart=function(t){CC(t.detail.id,"touchstart",e)},this.onButtonTouchEnd=function(t){CC(t.detail.id,"touchend",e)},this.controllerPresent=!1,this.bindMethods()},addEventListeners:function(){var e=this.el;e.addEventListener("buttonchanged",this.onButtonChanged),e.addEventListener("buttondown",this.onButtonDown),e.addEventListener("buttonup",this.onButtonUp),e.addEventListener("touchstart",this.onButtonTouchStart),e.addEventListener("touchend",this.onButtonTouchEnd),e.addEventListener("model-loaded",this.onModelLoaded),e.addEventListener("axismove",this.onAxisMoved),this.controllerEventsActive=!0,this.addControllersUpdateListener()},removeEventListeners:function(){var e=this.el;e.removeEventListener("buttonchanged",this.onButtonChanged),e.removeEventListener("buttondown",this.onButtonDown),e.removeEventListener("buttonup",this.onButtonUp),e.removeEventListener("touchstart",this.onButtonTouchStart),e.removeEventListener("touchend",this.onButtonTouchEnd),e.removeEventListener("model-loaded",this.onModelLoaded),e.removeEventListener("axismove",this.onAxisMoved),this.controllerEventsActive=!1,this.removeControllersUpdateListener()},checkIfControllerPresent:function(){yC(this,hS,this.data.hand?{hand:this.data.hand}:{})},play:function(){this.checkIfControllerPresent(),this.addControllersUpdateListener()},pause:function(){this.removeEventListeners(),this.removeControllersUpdateListener()},injectTrackedControls:function(){this.el.setAttribute("tracked-controls",{idPrefix:hS}),this.data.model&&this.el.setAttribute("gltf-model",cS)},addControllersUpdateListener:function(){this.el.sceneEl.addEventListener("controllersupdated",this.onControllersUpdate,!1)},removeControllersUpdateListener:function(){this.el.sceneEl.removeEventListener("controllersupdated",this.onControllersUpdate,!1)},onControllersUpdate:function(){this.checkIfControllerPresent()},onModelLoaded:function(e){var t,n=e.detail.model;e.target===this.el&&this.data.model&&((t=this.buttonMeshes={}).trigger=n.getObjectByName("BumperKey"),t.triggerPressed=n.getObjectByName("BumperKey_Press"),t.triggerPressed&&(t.triggerPressed.visible=!1),t.touchpad=n.getObjectByName("TouchPad"),t.touchpadPressed=n.getObjectByName("TouchPad_Press"),t.trackpad=n.getObjectByName("TouchPad"),t.trackpadPressed=n.getObjectByName("TouchPad_Press"),t.trackpadPressed&&(t.trackpadPressed.visible=!1))},onButtonChanged:function(e){var t=this.mapping.buttons[e.detail.id];t&&this.el.emit(t+"changed",e.detail.state)},onAxisMoved:function(e){xC(this,this.mapping.axes,e)},updateModel:function(e,t){this.data.model&&this.updateButtonModel(e,t)},updateButtonModel:function(e,t){var n=this.buttonMeshes,i=e+"Pressed";if(n&&n[e]&&n[i]){var r;switch(t){case"down":r=this.data.buttonHighlightColor;break;case"touchstart":r=this.data.buttonTouchedColor}r&&n[i].material.color.set(r),n[i].visible=!!r,n[e].visible=!r}}}),{38:"ArrowUp",37:"ArrowLeft",40:"ArrowDown",39:"ArrowRight",87:"KeyW",65:"KeyA",83:"KeyS",68:"KeyD"}),dS=QC,pS=1e-5,fS=["KeyW","KeyA","KeyS","KeyD","ArrowUp","ArrowLeft","ArrowRight","ArrowDown"];Ww("wasd-controls",{schema:{acceleration:{default:65},adAxis:{default:"x",oneOf:["x","y","z"]},adEnabled:{default:!0},adInverted:{default:!1},enabled:{default:!0},fly:{default:!1},wsAxis:{default:"z",oneOf:["x","y","z"]},wsEnabled:{default:!0},wsInverted:{default:!1}},after:["look-controls"],init:function(){this.keys={},this.easing=1.1,this.velocity=new Wb.Vector3,this.onBlur=this.onBlur.bind(this),this.onContextMenu=this.onContextMenu.bind(this),this.onFocus=this.onFocus.bind(this),this.onKeyDown=this.onKeyDown.bind(this),this.onKeyUp=this.onKeyUp.bind(this),this.onVisibilityChange=this.onVisibilityChange.bind(this),this.attachVisibilityEventListeners()},tick:function(e,t){var n=this.data,i=this.el,r=this.velocity;(r[n.adAxis]||r[n.wsAxis]||!function(e){var t;for(t in e)return!1;return!0}(this.keys))&&(t/=1e3,this.updateVelocity(t),(r[n.adAxis]||r[n.wsAxis])&&i.object3D.position.add(this.getMovementVector(t)))},update:function(e){e.adAxis!==this.data.adAxis&&(this.velocity[e.adAxis]=0),e.wsAxis!==this.data.wsAxis&&(this.velocity[e.wsAxis]=0)},remove:function(){this.removeKeyEventListeners(),this.removeVisibilityEventListeners()},play:function(){this.attachKeyEventListeners()},pause:function(){this.keys={},this.removeKeyEventListeners()},updateVelocity:function(e){var t,n,i,r,s,o=this.data,a=this.keys,l=this.velocity;if(n=o.adAxis,r=o.wsAxis,e>.2)return l[n]=0,void(l[r]=0);var c=Math.pow(1/this.easing,60*e);0!==l[n]&&(l[n]=l[n]*c),0!==l[r]&&(l[r]=l[r]*c),Math.abs(l[n])<pS&&(l[n]=0),Math.abs(l[r])<pS&&(l[r]=0),o.enabled&&(t=o.acceleration,o.adEnabled&&(i=o.adInverted?-1:1,(a.KeyA||a.ArrowLeft)&&(l[n]-=i*t*e),(a.KeyD||a.ArrowRight)&&(l[n]+=i*t*e)),o.wsEnabled&&(s=o.wsInverted?-1:1,(a.KeyW||a.ArrowUp)&&(l[r]-=s*t*e),(a.KeyS||a.ArrowDown)&&(l[r]+=s*t*e)))},getMovementVector:($I=new Wb.Vector3(0,0,0),eS=new Wb.Euler(0,0,0,"YXZ"),function(e){var t,n=this.el.getAttribute("rotation"),i=this.velocity;return $I.copy(i),$I.multiplyScalar(e),n?(t=this.data.fly?n.x:0,eS.set(Wb.MathUtils.degToRad(t),Wb.MathUtils.degToRad(n.y),0),$I.applyEuler(eS),$I):$I}),attachVisibilityEventListeners:function(){window.oncontextmenu=this.onContextMenu,window.addEventListener("blur",this.onBlur),window.addEventListener("focus",this.onFocus),document.addEventListener("visibilitychange",this.onVisibilityChange)},removeVisibilityEventListeners:function(){window.removeEventListener("blur",this.onBlur),window.removeEventListener("focus",this.onFocus),document.removeEventListener("visibilitychange",this.onVisibilityChange)},attachKeyEventListeners:function(){window.addEventListener("keydown",this.onKeyDown),window.addEventListener("keyup",this.onKeyUp)},removeKeyEventListeners:function(){window.removeEventListener("keydown",this.onKeyDown),window.removeEventListener("keyup",this.onKeyUp)},onContextMenu:function(){for(var e=Object.keys(this.keys),t=0;t<e.length;t++)delete this.keys[e[t]]},onBlur:function(){this.pause()},onFocus:function(){this.play()},onVisibilityChange:function(){document.hidden?this.onBlur():this.onFocus()},onKeyDown:function(e){var t;dS(e)&&(t=e.code||uS[e.keyCode],-1!==fS.indexOf(t)&&(this.keys[t]=!0))},onKeyUp:function(e){var t;t=e.code||uS[e.keyCode],delete this.keys[t]}});var mS,AS,gS,vS=$b("components:windows-motion-controls:debug"),yS=$b("components:windows-motion-controls:warn"),ES=qb+"controllers/microsoft/",bS={left:"left.glb",right:"right.glb",default:"universal.glb"},xS="windows-mixed-reality",CS=(Ww("windows-motion-controls",{schema:{hand:{default:"right"},pair:{default:0},model:{default:!0}},after:["tracked-controls"],mapping:{axes:{touchpad:[0,1],thumbstick:[2,3]},buttons:["trigger","squeeze","touchpad","thumbstick","menu"],axisMeshNames:["TOUCHPAD_TOUCH_X","TOUCHPAD_TOUCH_X","THUMBSTICK_X","THUMBSTICK_Y"],buttonMeshNames:{trigger:"SELECT",menu:"MENU",squeeze:"GRASP",thumbstick:"THUMBSTICK_PRESS",touchpad:"TOUCHPAD_PRESS"},pointingPoseMeshName:"POINTING_POSE"},bindMethods:function(){this.onModelError=this.onModelError.bind(this),this.onModelLoaded=this.onModelLoaded.bind(this),this.onControllersUpdate=this.onControllersUpdate.bind(this),this.checkIfControllerPresent=this.checkIfControllerPresent.bind(this),this.onAxisMoved=this.onAxisMoved.bind(this)},init:function(){var e=this,t=this.el;this.onButtonChanged=this.onButtonChanged.bind(this),this.onButtonDown=function(t){CC(t.detail.id,"down",e)},this.onButtonUp=function(t){CC(t.detail.id,"up",e)},this.onButtonTouchStart=function(t){CC(t.detail.id,"touchstart",e)},this.onButtonTouchEnd=function(t){CC(t.detail.id,"touchend",e)},this.onControllerConnected=function(){e.setModelVisibility(!0)},this.onControllerDisconnected=function(){e.setModelVisibility(!1)},this.controllerPresent=!1,this.previousButtonValues={},this.bindMethods(),this.loadedMeshInfo={buttonMeshes:null,axisMeshes:null},this.rayOrigin={origin:new THREE.Vector3,direction:new THREE.Vector3(0,0,-1),createdFromMesh:!1},t.addEventListener("controllerconnected",this.onControllerConnected),t.addEventListener("controllerdisconnected",this.onControllerDisconnected)},addEventListeners:function(){var e=this.el;e.addEventListener("buttonchanged",this.onButtonChanged),e.addEventListener("buttondown",this.onButtonDown),e.addEventListener("buttonup",this.onButtonUp),e.addEventListener("touchstart",this.onButtonTouchStart),e.addEventListener("touchend",this.onButtonTouchEnd),e.addEventListener("axismove",this.onAxisMoved),e.addEventListener("model-error",this.onModelError),e.addEventListener("model-loaded",this.onModelLoaded),this.controllerEventsActive=!0},removeEventListeners:function(){var e=this.el;e.removeEventListener("buttonchanged",this.onButtonChanged),e.removeEventListener("buttondown",this.onButtonDown),e.removeEventListener("buttonup",this.onButtonUp),e.removeEventListener("touchstart",this.onButtonTouchStart),e.removeEventListener("touchend",this.onButtonTouchEnd),e.removeEventListener("axismove",this.onAxisMoved),e.removeEventListener("model-error",this.onModelError),e.removeEventListener("model-loaded",this.onModelLoaded),this.controllerEventsActive=!1},checkIfControllerPresent:function(){yC(this,xS,{hand:this.data.hand,index:this.data.pair,iterateControllerProfiles:!0})},play:function(){this.checkIfControllerPresent(),this.addControllersUpdateListener()},pause:function(){this.removeEventListeners(),this.removeControllersUpdateListener()},updateControllerModel:function(){if(this.data.model&&!this.rayOrigin.createdFromMesh){var e=this.createControllerModelUrl();this.loadModel(e)}else this.modelReady()},createControllerModelUrl:function(e){var t=this.data.hand;return ES+"default/"+(bS[t]||bS.default)},injectTrackedControls:function(){var e=this.data;this.el.setAttribute("tracked-controls",{idPrefix:xS,controller:e.pair,hand:e.hand}),this.updateControllerModel()},addControllersUpdateListener:function(){this.el.sceneEl.addEventListener("controllersupdated",this.onControllersUpdate,!1)},removeControllersUpdateListener:function(){this.el.sceneEl.removeEventListener("controllersupdated",this.onControllersUpdate,!1)},onControllersUpdate:function(){this.checkIfControllerPresent()},onModelError:function(e){var t=this.createControllerModelUrl(!0);e.detail.src!==t?(yS("Failed to load controller model for device, attempting to load default."),this.loadModel(t)):yS("Failed to load default controller model.")},loadModel:function(e){this.el.setAttribute("gltf-model","url("+e+")")},onModelLoaded:function(e){var t,n,i,r,s=this.controllerModel=e.detail.model,o=this.loadedMeshInfo;if(e.target===this.el){if(vS("Processing model"),o.buttonMeshes={},o.axisMeshes={},s){for(t=0;t<this.mapping.buttons.length;t++)(n=this.mapping.buttonMeshNames[this.mapping.buttons[t]])?(i=s.getObjectByName(n))?(r={index:t,value:a(i,"VALUE"),pressed:a(i,"PRESSED"),unpressed:a(i,"UNPRESSED")}).value&&r.pressed&&r.unpressed?o.buttonMeshes[this.mapping.buttons[t]]=r:yS("Missing button submesh under mesh with name: "+n+"(VALUE: "+!!r.value+", PRESSED: "+!!r.pressed+", UNPRESSED:"+!!r.unpressed+")"):yS("Missing button mesh with name: "+n):vS("Skipping unknown button at index: "+t+" with mapped name: "+this.mapping.buttons[t]);for(t=0;t<this.mapping.axisMeshNames.length;t++)(n=this.mapping.axisMeshNames[t])?(i=s.getObjectByName(n))?(r={index:t,value:a(i,"VALUE"),min:a(i,"MIN"),max:a(i,"MAX")}).value&&r.min&&r.max?o.axisMeshes[t]=r:yS("Missing axis submesh under mesh with name: "+n+"(VALUE: "+!!r.value+", MIN: "+!!r.min+", MAX:"+!!r.max+")"):yS("Missing axis mesh with name: "+n):vS("Skipping unknown axis at index: "+t);this.calculateRayOriginFromMesh(s),this.setModelVisibility()}vS("Model load complete.")}function a(e,t){for(var n=0,i=e.children.length;n<i;n++){var r=e.children[n];if(r&&r.name===t)return r}}},calculateRayOriginFromMesh:function(){var e=new THREE.Quaternion;return function(t){var n;if(this.rayOrigin.origin.set(0,0,0),this.rayOrigin.direction.set(0,0,-1),this.rayOrigin.createdFromMesh=!0,n=t.getObjectByName(this.mapping.pointingPoseMeshName)){var i=t.parent;i&&(t.parent=null,t.updateMatrixWorld(!0),t.parent=i),n.getWorldPosition(this.rayOrigin.origin),n.getWorldQuaternion(e),this.rayOrigin.direction.applyQuaternion(e),i&&t.updateMatrixWorld(!0)}else vS("Mesh does not contain pointing origin data, defaulting to none.");this.modelReady()}}(),lerpAxisTransform:function(){var e=new THREE.Quaternion;return function(t,n){var i=this.loadedMeshInfo.axisMeshes[t];if(i){var r=i.min,s=i.max,o=i.value,a=.5*n+.5;o.setRotationFromQuaternion(e.copy(r.quaternion).slerp(s.quaternion,a)),o.position.lerpVectors(r.position,s.position,a)}}}(),lerpButtonTransform:function(){var e=new THREE.Quaternion;return function(t,n){var i=this.loadedMeshInfo.buttonMeshes[t];if(i){var r=i.unpressed,s=i.pressed,o=i.value;o.setRotationFromQuaternion(e.copy(r.quaternion).slerp(s.quaternion,n)),o.position.lerpVectors(r.position,s.position,n)}}}(),modelReady:function(){this.el.emit("controllermodelready",{name:"windows-motion-controls",model:this.data.model,rayOrigin:this.rayOrigin})},onButtonChanged:function(e){var t=this.mapping.buttons[e.detail.id];t&&(this.loadedMeshInfo&&this.loadedMeshInfo.buttonMeshes&&this.lerpButtonTransform(t,e.detail.state.value),this.el.emit(t+"changed",e.detail.state))},onAxisMoved:function(e){var t=this.mapping.axisMeshNames.length;if(this.loadedMeshInfo&&this.loadedMeshInfo.axisMeshes)for(var n=0;n<t;n++)this.lerpAxisTransform(n,e.detail.axis[n]||0);xC(this,this.mapping.axes,e)},setModelVisibility:function(e){var t=this.el.getObject3D("mesh");this.controllerPresent&&(e=void 0!==e?e:this.modelVisible,this.modelVisible=e,t&&(t.visible=e))}}),mS=new Wb.Quaternion,AS=new Wb.Vector3,function(e,t,n){t.position.copy(e.transform.position),t.quaternion.copy(e.transform.orientation),AS.copy(n),mS.copy(e.transform.orientation),AS.applyQuaternion(mS),t.position.sub(AS)});function wS(e,t){this.renderer=e,this.xrHitTestSource=null,e.xr.addEventListener("sessionend",function(){this.xrHitTestSource=null}.bind(this)),e.xr.addEventListener("sessionstart",function(){this.sessionStart(t)}.bind(this)),this.renderer.xr.isPresenting&&this.sessionStart(t)}function _S(e){console.warn(e.message),console.warn('Cannot requestHitTestSource Are you missing: webxr="optionalFeatures: hit-test;" from <a-scene>?')}CS.tempFakePose={transform:{orientation:new Wb.Quaternion,position:new Wb.Vector3}},wS.prototype.previousFrameAnchors=new Set,wS.prototype.anchorToObject3D=new Map,wS.prototype.sessionStart=function(e){this.session=this.renderer.xr.getSession(),"requestHitTestSource"in this.session?e.space?this.session.requestHitTestSource(e).then(function(e){this.xrHitTestSource=e}.bind(this)).catch(_S):e.profile&&this.session.requestHitTestSourceForTransientInput(e).then(function(e){this.xrHitTestSource=e,this.transient=!0}.bind(this)).catch(_S):_S({message:"No requestHitTestSource on the session."})},wS.prototype.anchorFromLastHitTestResult=function(e,t){var n=this.lastHitTest;if(n){var i={object3D:e,offset:t};Array.from(this.anchorToObject3D.entries()).forEach(function(t){var n=t[1].object3D,i=t[0];n===e&&(this.anchorToObject3D.delete(i),i.delete())}.bind(this)),n.createAnchor&&n.createAnchor().then(function(e){this.anchorToObject3D.set(e,i)}.bind(this)).catch((function(e){console.warn(e.message),console.warn('Cannot create anchor, are you missing: webxr="optionalFeatures: anchors;" from <a-scene>?')}))}},wS.prototype.doHit=function(e){if(this.renderer.xr.isPresenting){var t,n,i=this.renderer.xr.getReferenceSpace(),r=e.getViewerPose(i);return this.xrHitTestSource&&r?this.transient?(t=e.getHitTestResultsForTransientInput(this.xrHitTestSource)).length>0&&(n=t[0].results).length>0&&(this.lastHitTest=n[0],n[0].getPose(i)):(t=e.getHitTestResults(this.xrHitTestSource)).length>0&&(this.lastHitTest=t[0],t[0].getPose(i)):void 0}},wS.updateAnchorPoses=function(e,t){var n=e.trackedAnchors||wS.prototype.previousFrameAnchors;wS.prototype.previousFrameAnchors.forEach((function(e){n.has(e)||wS.prototype.anchorToObject3D.delete(e)})),n.forEach((function(n){var i,r,s,o;try{if(i=e.getPose(n.anchorSpace,t)){if(!(r=wS.prototype.anchorToObject3D.get(n)))return;s=r.offset,o=r.object3D,CS(i,o,s)}}catch(e){console.error("while updating anchor poses:",e)}})),wS.prototype.previousFrameAnchors=n},Ww("ar-hit-test",{schema:{target:{type:"selector"},enabled:{default:!0},src:{default:"data:image/webp;base64,UklGRkQHAABXRUJQVlA4WAoAAAAQAAAA/wEA/wEAQUxQSL0DAAARDzD/ERGCjrY9sYYFfgo6aa1kJ7K0w9Lo3AadLSVeFxevQwj5kuM8RfR/Atw/C0+ozB/oUBrloFZs6ElSW88j1KA4yExNWQaqRZquIDF0JYmlq0hAuUDTFu66tng3teW7pa3cQf1V1edvur54M/Slm6Wv3Gx9zw0MXlQLntcsBN6wkHjTQuYtC4W3LTw8mGRVG57TbAROtxHfZNhInGkjc5aNwtk2Hg6Mvki14k+NkZzCwQgCxalcAv3kddRTPI1DcUrXId1FLf1uHpzaQz4tquhZVLlKesbVpqKeTj0n0F5PpXDlFN9UqmhalL/ImuZFo6KmToWLoKlddMprqlS8cKovBvHo2kTiFV2LN4msaxKZl3QNiair8xYRdDWivIvXVXmbcMqJ51UebZuFXxZt6xd4laxtciqRtA3Cv0nU1t+kEUFbI8JvCa+tvkm3FDlO/W+OR99+kWEp/YYo+tYfTVnf/K8cE/F///3vv//993eeL+a+uvjawLcX3xjYvJotBFY3kVjTRGFtE+BU2AiMbiQyhpHMWEYeBozAH5qNBYRDB5KBCaTDBKKBAZTDBoKBDjwHAN5ABeCJBsAZcAAC0YHHxAYSMYBiYgGZWEA2MYFCbCCZGAAIANFEB+AnYgMQTDQAYSJ2AN5EBZAm4gDgTDgAeSIu4DGygTIRN1CMLOCZiACykQlg4jsAycgA8AO+BxCNdJyDkcbwRirDGXGnx8w+FDPrkM3MQ9JQZMYhiiwV/RDMtIM3U1/DmXHUo+IR2kSR2ToWkQ1NIn2qf2J8LCqJKiDUiSADHY3whirhdHgZ94HKaR97PhE+twEUJUFoAcgyTct8hfSxSkShASDKdMJ/ritKHwgyQ0sD4D/miCxU5SbhOOUDTnZpccCjYP/i0bZ/8bAgtVGEoGapWIQXyzKVKLwgNJFk2rtMIgoNRJlOZF7SNSSyUEeQmbxBFKEmtYjEe8S8zOZ1AkJVCmS88FJOtF40Ksg4oUaFiygk3C8qlTVNyl8UTevCUdAE2t14PfVqU1FPp57TopKeQZWromddTQp6QOfTOEQt/ZDuipZ11w/wOiqO8dRORcc6BQEkDQMClaHcn5wV9yLbxsNZNgpn2sicYSNxuo34Js1G4FQbnuNsOPa28PCWhcKbFjJvWEi8ZiHwqgXPcxbc5db33Cx95WboSzddX7yp+vyN0+eul7ZyN7Xlu64t3jVt4c5pc4JLV5EYupJE0xUknC4nOjVlmaYpyLit53HCQ0+ScnqceNcS5dzUkd0/CwMAVlA4IGADAAAQXwCdASoAAgACP8ne6Wy/tjCpqJ/IA/A5CWlu4XYBG/Pz8AfwD8APz//f3v8E1fuHZnxKYACtfuHZnxKYACrYTb5mOslhxu843ecbvON3nG7zjd3a0VCn7G1MABVxwH/Xd25gAK1+4dmfEpe2+PHhQaj75++riG6FuYACtfuHZnxKYACRrK3q9xO8Ss3uWKnMhs/rDF1hi6wxdYYusMXWGI5QRcCFDZog5OgqNlse1NDuz/UoFa/cOzPiUwAEsAOK4/nu5eZHK2tlXxJfNYlMABWv3Dsz4bvNJ5YA/LtxJ38SmAArX7h2Z8Sk5vdZUYv7mZPiUwAFa/cOzPh21s5OgZxf1mfEpemRyFr/rM+JS9noA/LtxJ38SmAAlUJIotzAASn6TjdhK+D3Dsz4dyvB7h2Z8O2tnJ0DOL+sz4lL2nKLT4lL/+iSLOocxq639w7M34MNZdm55uJ8v8ra2cpVZnxKTq2F3PN/cNksAfl24k7+JTAASqrD37h2Z7b1W+VtbOUqsz4lJ1bC7nm/uGyWAPy7cSd/EpgAJVVh79w7M9t6rfK2tnKVWZ8Sk6thdzzf3DZLAH5duJO/iUwAEqqw9+4dme29VvlbWzlKrM+JSdWwu55v7hslgD8u3EnfxKYACVVYe/cOzPbeq3ytrZylVme0kYJ8557FLerqFrzIbPrrf3DZLAH5duJO/iUvaVMS9BoaF4p7pSDFTP1XMyfElelrM0DOL+sz4eBJ13nV1OppBGPuKb4YzXQgq9uH19uS/0+JS9t9fr6ZUlQBelDG6GMgq97otb5QMPJwtKyBTbFp8Sl7b6/X0ykkawEOsgdiE6Fi0vb/Eve6xkwsmug0Z4nGNHQO8839bpTsjpz7SWIJxKagvd1QWMa6FYT1KEw3j4XDT6vJ9Xk+nyfT5Pq8n1eEmk5dinMM/9Fcfz4Z3Dsz3KD2dw7LxBRxKrqUUGQPH/7zxr1KIfNpLEJ0MZB2ITM/0Z2EFoh12NlXnEcpYcbvON3nG7zjd5xu84vfcNIAAP7+y8ceyzbVxkakPYY4lcr72fqOnDwipv+yxC71wAADBrjKnAAAAAAAAAAAAAAw7oNGHttqWONcoFN/2WIDc2pa6WVFtFYROlsaMaTXdcOjXHz93+YxAglKa4AAAAA=",type:"map"},type:{default:"footprint",oneOf:["footprint","map"]},footprintDepth:{default:.1},mapSize:{type:"vec2",default:{x:.5,y:.5}}},sceneOnly:!0,init:function(){this.hitTest=null,this.imageDataArray=new Uint8ClampedArray(1048576),this.imageData=new ImageData(this.imageDataArray,512,512),this.textureCache=new Map,this.orthoCam=new Wb.OrthographicCamera,this.orthoCam.layers.set(21),this.textureTarget=new Wb.WebGLRenderTarget(512,512,{}),this.basicMaterial=new Wb.MeshBasicMaterial({color:0,side:Wb.DoubleSide}),this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),this.context.imageSmoothingEnabled=!1,this.canvas.width=512,this.canvas.height=512,this.canvasTexture=new Wb.CanvasTexture(this.canvas,{alpha:!0}),this.canvasTexture.flipY=!1;var e=this.el.getAttribute("webxr"),t=e.optionalFeatures;t.includes("hit-test")&&t.includes("anchors")||(t.push("hit-test"),t.push("anchors"),this.el.setAttribute("webxr",e)),this.el.sceneEl.renderer.xr.addEventListener("sessionend",function(){this.hitTest=null}.bind(this)),this.el.sceneEl.renderer.xr.addEventListener("sessionstart",function(){if(this.el.is("ar-mode")){var e=this.el.sceneEl.renderer,t=this.session=e.xr.getSession();this.hasPosedOnce=!1,this.bboxMesh.visible=!1,gS||(gS=new Map),t.requestReferenceSpace("viewer").then(function(t){this.viewerHitTest=this.hitTest=new wS(e,{space:t}),this.el.emit("ar-hit-test-start")}.bind(this));var n=this;this.el.sceneEl.addEventListener("controllersupdated",(function(){var t=this.xrSession&&this.xrSession.inputSources;if(t)for(var i=0;i<t.length;++i)if("tracked-pointer"===t[i].targetRayMode){n.hitTest=new wS(e,{space:t[i].targetRaySpace}),gS.set(t[i],n.hitTest),n.viewerHitTest&&"function"==typeof n.viewerHitTest.cancel&&(n.viewerHitTest.cancel(),n.viewerHitTest=null);break}}));var i="generic-touchscreen",r=new wS(e,{profile:i});t.addEventListener("selectstart",function(t){if(!0===this.data.enabled){var n=t.inputSource;this.bboxMesh.visible=!0,!0===this.hasPosedOnce&&(this.el.emit("ar-hit-test-select-start",{inputSource:n,position:this.bboxMesh.position,orientation:this.bboxMesh.quaternion}),n.profiles[0]===i?this.hitTest=r:(this.hitTest=gS.get(n)||new wS(e,{space:n.targetRaySpace}),gS.set(n,this.hitTest)))}}.bind(this)),t.addEventListener("selectend",function(e){if(this.hitTest&&!0===this.data.enabled){var t,n=e.inputSource;!0===this.hasPosedOnce&&(this.bboxMesh.visible=!1,this.data.target&&(t=this.data.target.object3D)&&(CS.tempFakePose.transform.position.copy(this.bboxMesh.position),CS.tempFakePose.transform.orientation.copy(this.bboxMesh.quaternion),CS(CS.tempFakePose,t,this.bboxOffset),t.visible=!0,this.hitTest.anchorFromLastHitTestResult(t,this.bboxOffset)),this.el.emit("ar-hit-test-select",{inputSource:n,position:this.bboxMesh.position,orientation:this.bboxMesh.quaternion}),this.hitTest=null)}else this.hitTest=null}.bind(this))}}.bind(this)),this.bboxOffset=new Wb.Vector3,this.update=this.update.bind(this),this.makeBBox()},update:function(){!1===this.data.enabled&&(this.hitTest=null,this.bboxMesh.visible=!1),this.data.target&&(this.data.target.object3D?(this.data.target.addEventListener("model-loaded",this.update),this.data.target.object3D.layers.enable(21),this.data.target.object3D.traverse((function(e){e.layers.enable(21)}))):this.data.target.addEventListener("loaded",this.update,{once:!0})),this.bboxNeedsUpdate=!0},makeBBox:function(){var e=new Wb.PlaneGeometry(1,1),t=new Wb.MeshBasicMaterial({transparent:!0,color:16777215});e.rotateX(-Math.PI/2),e.rotateY(-Math.PI/2),this.bbox=new Wb.Box3,this.bboxMesh=new Wb.Mesh(e,t),this.el.setObject3D("ar-hit-test",this.bboxMesh),this.bboxMesh.visible=!1},updateFootprint:function(){var e,t,n,i=this.el.sceneEl.renderer,r=i.xr.enabled;this.bboxMesh.material.map=this.canvasTexture,this.bboxMesh.material.needsUpdate=!0,this.orthoCam.rotation.set(-Math.PI/2,0,-Math.PI/2),this.orthoCam.position.copy(this.bboxMesh.position),this.orthoCam.position.y-=this.bboxMesh.scale.y/2,this.orthoCam.near=.1,this.orthoCam.far=this.orthoCam.near+this.data.footprintDepth*this.bboxMesh.scale.y,this.orthoCam.position.y+=this.orthoCam.far,this.orthoCam.right=this.bboxMesh.scale.z/2,this.orthoCam.left=-this.bboxMesh.scale.z/2,this.orthoCam.top=this.bboxMesh.scale.x/2,this.orthoCam.bottom=-this.bboxMesh.scale.x/2,this.orthoCam.updateProjectionMatrix(),t=i.getRenderTarget(),i.setRenderTarget(this.textureTarget),i.xr.enabled=!1,n=this.el.object3D.background,this.el.object3D.overrideMaterial=this.basicMaterial,this.el.object3D.background=null,i.render(this.el.object3D,this.orthoCam),this.el.object3D.background=n,this.el.object3D.overrideMaterial=null,i.xr.enabled=r,i.setRenderTarget(t),i.readRenderTargetPixels(this.textureTarget,0,0,512,512,this.imageDataArray),this.context.putImageData(this.imageData,0,0),this.context.shadowColor="white",this.context.shadowBlur=10,this.context.drawImage(this.canvas,0,0),e=this.context.getImageData(0,0,512,512);for(var s=0;s<262144;s++)0!==e.data[4*s+3]&&255!==e.data[4*s+3]&&(e.data[4*s+3]=128);this.context.putImageData(e,0,0),this.canvasTexture.needsUpdate=!0},tick:function(){var e,t,n=this.el.sceneEl.frame,i=this.el.sceneEl.renderer;(n&&wS.updateAnchorPoses(n,i.xr.getReferenceSpace()),this.bboxNeedsUpdate)&&(this.bboxNeedsUpdate=!1,this.data.target&&"map"!==this.data.type||(this.textureCache.has(this.data.src)?t=this.textureCache.get(this.data.src):(t=(new Wb.TextureLoader).load(this.data.src),this.textureCache.set(this.data.src,t)),this.bboxMesh.material.map=t,this.bboxMesh.material.needsUpdate=!0),this.data.target&&this.data.target.object3D?(this.bbox.setFromObject(this.data.target.object3D),this.bbox.getCenter(this.bboxMesh.position),this.bbox.getSize(this.bboxMesh.scale),"footprint"===this.data.type&&(this.bboxMesh.scale.x*=1.04,this.bboxMesh.scale.z*=1.04,this.updateFootprint()),this.bboxMesh.position.y-=this.bboxMesh.scale.y/2,this.bboxOffset.copy(this.bboxMesh.position),this.bboxOffset.sub(this.data.target.object3D.position)):this.bboxMesh.scale.set(this.data.mapSize.x,1,this.data.mapSize.y));this.hitTest&&(e=this.hitTest.doHit(n))&&(!0!==this.hasPosedOnce&&(this.hasPosedOnce=!0,this.el.emit("ar-hit-test-achieved")),this.bboxMesh.visible=!0,this.bboxMesh.position.copy(e.transform.position),this.bboxMesh.quaternion.copy(e.transform.orientation))}}),Ww("background",{schema:{color:{type:"color",default:"black"},transparent:{default:!1}},sceneOnly:!0,update:function(){var e=this.data,t=this.el.object3D;e.transparent?t.background=null:t.background=new THREE.Color(e.color)},remove:function(){this.el.object3D.background=null}}),Ww("debug",{schema:{default:!0},sceneOnly:!0});var MS="a-dialog-buttons-container",IS="a-dialog-button";function SS(e,t){var n,i,r,s;return(n=document.createElement("div")).classList.add("a-modal"),n.setAttribute(Xb,""),(i=document.createElement("div")).className="a-dialog",i.setAttribute(Xb,""),n.appendChild(i),(r=document.createElement("div")).classList.add("a-dialog-text-container"),i.appendChild(r),(s=document.createElement("div")).classList.add("a-dialog-text"),s.innerHTML=e,r.appendChild(s),i.appendChild(t),n}Ww("device-orientation-permission-ui",{schema:{enabled:{default:!0},deviceMotionMessage:{default:"This immersive website requires access to your device motion sensors."},httpsMessage:{default:"Access this site over HTTPS to enter VR mode and grant access to the device sensors."},denyButtonText:{default:"Deny"},allowButtonText:{default:"Allow"},cancelButtonText:{default:"Cancel"}},sceneOnly:!0,init:function(){var e=this;this.data.enabled&&(window.isSecureContext||this.showHTTPAlert(),"undefined"!=typeof DeviceOrientationEvent&&DeviceOrientationEvent.requestPermission?(this.onDeviceMotionDialogAllowClicked=this.onDeviceMotionDialogAllowClicked.bind(this),this.onDeviceMotionDialogDenyClicked=this.onDeviceMotionDialogDenyClicked.bind(this),DeviceOrientationEvent.requestPermission().then((function(){e.el.emit("deviceorientationpermissiongranted"),e.permissionGranted=!0})).catch((function(){var t,n,i,r,s,o,a,l;e.devicePermissionDialogEl=(t=e.data.denyButtonText,n=e.data.allowButtonText,i=e.data.deviceMotionMessage,r=e.onDeviceMotionDialogAllowClicked,s=e.onDeviceMotionDialogDenyClicked,(o=document.createElement("div")).classList.add(MS),(a=document.createElement("button")).classList.add(IS,"a-dialog-deny-button"),a.setAttribute(Xb,""),a.innerHTML=t,o.appendChild(a),(l=document.createElement("button")).classList.add(IS,"a-dialog-allow-button"),l.setAttribute(Xb,""),l.innerHTML=n,o.appendChild(l),l.addEventListener("click",(function(e){e.stopPropagation(),r()})),a.addEventListener("click",(function(e){e.stopPropagation(),s()})),SS(i,o)),e.el.appendChild(e.devicePermissionDialogEl)}))):this.permissionGranted=!0)},remove:function(){this.devicePermissionDialogEl&&this.el.removeChild(this.devicePermissionDialogEl)},onDeviceMotionDialogDenyClicked:function(){this.remove()},showHTTPAlert:function(){var e,t,n,i,r,s=this,o=(e=s.data.cancelButtonText,t=s.data.httpsMessage,n=function(){s.el.removeChild(o)},(i=document.createElement("div")).classList.add(MS),(r=document.createElement("button")).classList.add(IS,"a-dialog-ok-button"),r.setAttribute(Xb,""),r.innerHTML=e,i.appendChild(r),r.addEventListener("click",(function(e){e.stopPropagation(),n()})),SS(t,i));this.el.appendChild(o)},onDeviceMotionDialogAllowClicked:function(){var e=this;this.el.emit("deviceorientationpermissionrequested"),DeviceOrientationEvent.requestPermission().then((function(t){"granted"===t?(e.el.emit("deviceorientationpermissiongranted"),e.permissionGranted=!0):e.el.emit("deviceorientationpermissionrejected"),e.remove()})).catch(console.error)}}),Ww("embedded",{dependencies:["xr-mode-ui"],schema:{default:!0},sceneOnly:!0,update:function(){var e=this.el,t=e.querySelector(".a-enter-vr");!0===this.data?(t&&t.classList.add("embedded"),e.removeFullScreenStyles()):(t&&t.classList.remove("embedded"),e.addFullScreenStyles())}});var TS="https://unpkg.com/aframe-inspector@"+function(e){var t=e.split(".");return t[2]="x",t.join(".")}(W_)+"/dist/aframe-inspector.min.js";Ww("inspector",{schema:{url:{default:TS}},sceneOnly:!0,init:function(){this.firstPlay=!0,this.onKeydown=this.onKeydown.bind(this),this.onMessage=this.onMessage.bind(this),this.initOverlay(),window.addEventListener("keydown",this.onKeydown),window.addEventListener("message",this.onMessage)},play:function(){var e;this.firstPlay&&"false"!==(e=HC("inspector"))&&e&&(this.openInspector(),this.firstPlay=!1)},initOverlay:function(){this.loadingMessageEl=document.createElement("div"),this.loadingMessageEl.classList.add("a-inspector-loader"),this.loadingMessageEl.innerHTML='Loading Inspector<span class="dots"><span>.</span><span>.</span><span>.</span></span>'},remove:function(){this.removeEventListeners()},onKeydown:function(e){73===e.keyCode&&(e.ctrlKey&&e.altKey||e.getModifierState("AltGraph"))&&this.openInspector()},showLoader:function(){document.body.appendChild(this.loadingMessageEl)},hideLoader:function(){document.body.removeChild(this.loadingMessageEl)},onMessage:function(e){"INJECT_AFRAME_INSPECTOR"===e.data&&this.openInspector()},openInspector:function(e){var t,n=this;AFRAME.INSPECTOR||AFRAME.inspectorInjected?AFRAME.INSPECTOR.open(e):(this.showLoader(),(t=document.createElement("script")).src=this.data.url,t.setAttribute("data-name","aframe-inspector"),t.setAttribute(Xb,""),t.onload=function(){AFRAME.INSPECTOR.open(e),n.hideLoader(),n.removeEventListeners()},t.onerror=function(){n.loadingMessageEl.innerHTML="Error loading Inspector"},document.head.appendChild(t),AFRAME.inspectorInjected=!0)},removeEventListeners:function(){window.removeEventListener("keydown",this.onKeydown),window.removeEventListener("message",this.onMessage)}}),Ww("fog",{schema:{color:{type:"color",default:"#000"},density:{default:25e-5},far:{default:1e3,min:0},near:{default:1,min:0},type:{default:"linear",oneOf:["linear","exponential"]}},sceneOnly:!0,update:function(){var e=this.data,t=this.el,n=this.el.object3D.fog;n&&e.type===n.name?Object.keys(this.schema).forEach((function(t){var i=e[t];"color"===t&&(i=new Wb.Color(i)),n[t]=i})):t.object3D.fog=function(e){var t;return(t="exponential"===e.type?new Wb.FogExp2(e.color,e.density):new Wb.Fog(e.color,e.near,e.far)).name=e.type,t}(e)},remove:function(){var e=this.el;this.el.object3D.fog&&(e.object3D.fog=null)}}),Ww("keyboard-shortcuts",{schema:{enterVR:{default:!0},exitVR:{default:!0}},sceneOnly:!0,init:function(){this.onKeyup=this.onKeyup.bind(this)},play:function(){window.addEventListener("keyup",this.onKeyup,!1)},pause:function(){window.removeEventListener("keyup",this.onKeyup)},onKeyup:function(e){var t=this.el;QC(e)&&(this.data.enterVR&&70===e.keyCode&&t.enterVR(),this.data.exitVR&&27===e.keyCode&&t.exitVR())}});var BS=$b("components:pool:warn");Ww("pool",{schema:{container:{default:""},mixin:{default:""},size:{default:0},dynamic:{default:!1}},sceneOnly:!0,multiple:!0,initPool:function(){var e;for(this.availableEls=[],this.usedEls=[],this.data.mixin||BS("No mixin provided for pool component."),this.data.container&&(this.container=document.querySelector(this.data.container),this.container||BS("Container "+this.data.container+" not found.")),this.container=this.container||this.el,e=0;e<this.data.size;++e)this.createEntity()},update:function(e){var t=this.data;e.mixin===t.mixin&&e.size===t.size||this.initPool()},createEntity:function(){var e;(e=document.createElement("a-entity")).play=this.wrapPlay(e.play),e.setAttribute("mixin",this.data.mixin),e.object3D.visible=!1,e.pause(),this.container.appendChild(e),this.availableEls.push(e);var t=this.usedEls;e.addEventListener("loaded",(function(){-1===t.indexOf(e)&&(e.object3DParent=e.object3D.parent,e.object3D.parent.remove(e.object3D))}))},wrapPlay:function(e){var t=this.usedEls;return function(){-1!==t.indexOf(this)&&e.call(this)}},requestEntity:function(){var e;if(0===this.availableEls.length){if(!1===this.data.dynamic)return void BS("Requested entity from empty pool: "+this.attrName);BS("Requested entity from empty pool. This pool is dynamic and will resize automatically. You might want to increase its initial size: "+this.attrName),this.createEntity()}return e=this.availableEls.shift(),this.usedEls.push(e),e.object3DParent&&(e.object3DParent.add(e.object3D),this.updateRaycasters()),e.object3D.visible=!0,e},returnEntity:function(e){var t=this.usedEls.indexOf(e);if(-1!==t)return this.usedEls.splice(t,1),this.availableEls.push(e),e.object3DParent=e.object3D.parent,e.object3D.parent.remove(e.object3D),this.updateRaycasters(),e.object3D.visible=!1,e.pause(),e;BS("The returned entity was not previously pooled from "+this.attrName)},updateRaycasters:function(){document.querySelectorAll("[raycaster]").forEach((function(e){e.components.raycaster.setDirty()}))}}),Ww("real-world-meshing",{schema:{filterLabels:{type:"array"},meshesEnabled:{default:!0},meshMixin:{default:!0},planesEnabled:{default:!0},planeMixin:{default:""}},sceneOnly:!0,init:function(){var e=this.el.getAttribute("webxr"),t=e.requiredFeatures;-1===t.indexOf("mesh-detection")&&(t.push("mesh-detection"),this.el.setAttribute("webxr",e)),-1===t.indexOf("plane-detection")&&(t.push("plane-detection"),this.el.setAttribute("webxr",e)),this.meshEntities=[],this.initWorldMeshEntity=this.initWorldMeshEntity.bind(this)},tick:function(){this.el.is("ar-mode")&&(this.detectMeshes(),this.updateMeshes())},detectMeshes:function(){var e,t,n,i=this.data,r=this.el,s=this.meshEntities,o=!1,a=[],l=this.data.filterLabels;e=(n=r.frame).detectedMeshes,t=n.detectedPlanes;for(var c=0;c<s.length;c++)s[c].present=!1;if(i.meshesEnabled)for(var h of e.values())if(!l.length||-1!==l.indexOf(h.semanticLabel)){for(c=0;c<s.length;c++)if(h===s[c].mesh){o=!0,s[c].present=!0,s[c].lastChangedTime<h.lastChangedTime&&this.updateMeshGeometry(s[c].el,h),s[c].lastChangedTime=h.lastChangedTime;break}o||a.push(h),o=!1}if(i.planesEnabled)for(h of t.values())if(!l.length||-1!==l.indexOf(h.semanticLabel)){for(c=0;c<s.length;c++)if(h===s[c].mesh){o=!0,s[c].present=!0,s[c].lastChangedTime<h.lastChangedTime&&this.updateMeshGeometry(s[c].el,h),s[c].lastChangedTime=h.lastChangedTime;break}o||a.push(h),o=!1}this.deleteMeshes(),this.createNewMeshes(a)},updateMeshes:function(){var e=new Wb.Matrix4;return function(){for(var t,n,i,r=this.el,s=r.frame,o=this.meshEntities,a=r.renderer.xr.getReferenceSpace(),l=0;l<o.length;l++)i=o[l].mesh.meshSpace||o[l].mesh.planeSpace,t=s.getPose(i,a),(n=o[l].el).hasLoaded&&(e.fromArray(t.transform.matrix),e.decompose(n.object3D.position,n.object3D.quaternion,n.object3D.scale))}}(),deleteMeshes:function(){for(var e=this.meshEntities,t=[],n=0;n<e.length;n++)e[n].present?t.push(e[n]):this.el.removeChild(e[n]);this.meshEntities=t},createNewMeshes:function(e){for(var t,n=0;n<e.length;n++)t=document.createElement("a-entity"),this.meshEntities.push({mesh:e[n],el:t}),t.addEventListener("loaded",this.initWorldMeshEntity),this.el.appendChild(t)},initMeshGeometry:function(e){var t,n,i;if(e instanceof XRPlane){n=new Wb.Shape,i=e.polygon;for(var r=0;r<i.length;++r)0===r?n.moveTo(i[r].x,i[r].z):n.lineTo(i[r].x,i[r].z);return(t=new Wb.ShapeGeometry(n)).rotateX(Math.PI/2),t}return(t=new Wb.BufferGeometry).setAttribute("position",new Wb.BufferAttribute(e.vertices,3)),t.setIndex(new Wb.BufferAttribute(e.indices,1)),t},initWorldMeshEntity:function(e){for(var t,n,i,r=e.target,s=this.meshEntities,o=0;o<s.length;o++)if(s[o].el===r){i=s[o];break}t=this.initMeshGeometry(i.mesh),n=new Wb.Mesh(t,new Wb.MeshBasicMaterial({color:16777215*Math.random(),side:Wb.DoubleSide})),r.setObject3D("mesh",n),i.mesh instanceof XRPlane&&this.data.planeMixin?r.setAttribute("mixin",this.data.planeMixin):this.data.meshMixin&&r.setAttribute("mixin",this.data.meshMixin),r.setAttribute("data-world-mesh",i.mesh.semanticLabel)},updateMeshGeometry:function(e,t){var n=e.getObject3D("mesh");n.geometry.dispose(),n.geometry=this.initMeshGeometry(t)}}),Ww("reflection",{schema:{directionalLight:{type:"selector"}},sceneOnly:!0,init:function(){var e=this;this.cubeRenderTarget=new THREE.WebGLCubeRenderTarget(16),this.cubeCamera=new THREE.CubeCamera(.1,1e3,this.cubeRenderTarget),this.lightingEstimationTexture=new THREE.WebGLCubeRenderTarget(16).texture,this.needsVREnvironmentUpdate=!0;var t=this.el.getAttribute("webxr"),n=t.optionalFeatures;n.includes("light-estimation")||(n.push("light-estimation"),this.el.setAttribute("webxr",t)),this.el.addEventListener("enter-vr",(function(){e.el.is("ar-mode")&&e.el.renderer.xr.getSession().requestLightProbe&&e.startLightProbe()})),this.el.addEventListener("exit-vr",(function(){e.xrLightProbe&&e.stopLightProbe()})),this.el.object3D.environment=this.cubeRenderTarget.texture},stopLightProbe:function(){this.xrLightProbe=null,this.probeLight&&(this.probeLight.components.light.light.intensity=0),this.needsVREnvironmentUpdate=!0,this.el.object3D.environment=this.cubeRenderTarget.texture},startLightProbe:function(){this.needsLightProbeUpdate=!0},setupLightProbe:function(){var e=this.el.renderer,t=e.xr.getSession(),n=this,i=e.getContext();if(!this.probeLight){var r=document.createElement("a-light");r.setAttribute("type","probe"),r.setAttribute("intensity",0),this.el.appendChild(r),this.probeLight=r}switch(t.preferredReflectionFormat){case"srgba8":i.getExtension("EXT_sRGB");break;case"rgba16f":i.getExtension("OES_texture_half_float")}this.glBinding=new XRWebGLBinding(t,i),i.getExtension("EXT_sRGB"),i.getExtension("OES_texture_half_float"),t.requestLightProbe().then((function(e){n.xrLightProbe=e,e.addEventListener("reflectionchange",n.updateXRCubeMap.bind(n))})).catch((function(e){console.warn("Lighting estimation not supported: "+e.message),console.warn('Are you missing: webxr="optionalFeatures: light-estimation;" from <a-scene>?')}))},updateXRCubeMap:function(){var e=this.el.renderer,t=this.glBinding.getReflectionCubeMap(this.xrLightProbe);t&&(e.properties.get(this.lightingEstimationTexture).__webglTexture=t,this.lightingEstimationTexture.needsPMREMUpdate=!0,this.el.object3D.environment=this.lightingEstimationTexture)},tick:function(){var e=this.el.object3D,t=this.el.renderer,n=this.el.frame;if(n&&this.xrLightProbe){var i=n.getLightEstimate(this.xrLightProbe);i&&function(e,t,n,i){var r=Math.max(e.primaryLightIntensity.x,Math.max(e.primaryLightIntensity.y,e.primaryLightIntensity.z));t.sh.fromArray(e.sphericalHarmonicsCoefficients),t.intensity=3.14,n&&(n.color.setRGB(e.primaryLightIntensity.x/r,e.primaryLightIntensity.y/r,e.primaryLightIntensity.z/r),n.intensity=r,i.copy(e.primaryLightDirection))}(i,this.probeLight.components.light.light,this.data.directionalLight&&this.data.directionalLight.components.light.light,this.data.directionalLight&&this.data.directionalLight.object3D.position)}this.needsVREnvironmentUpdate&&(e.environment=null,this.needsVREnvironmentUpdate=!1,this.cubeCamera.position.set(0,1.6,0),this.cubeCamera.update(t,e),e.environment=this.cubeRenderTarget.texture),this.needsLightProbeUpdate&&n&&(this.setupLightProbe(),this.needsLightProbeUpdate=!1)},remove:function(){this.el.object3D.environment=null,this.probeLight&&this.el.removeChild(this.probeLight)}});var RS=["attribute vec3 position;","attribute vec2 uv;","uniform mat4 projectionMatrix;","uniform mat4 modelViewMatrix;","varying vec2 vUv;","void main()  {","  vUv = vec2( 1.- uv.x, uv.y );","  gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );","}"].join("\n"),LS=["precision mediump float;","uniform samplerCube map;","varying vec2 vUv;","#define M_PI 3.141592653589793238462643383279","void main() {","  vec2 uv = vUv;","  float longitude = uv.x * 2. * M_PI - M_PI + M_PI / 2.;","  float latitude = uv.y * M_PI;","  vec3 dir = vec3(","    - sin( longitude ) * sin( latitude ),","    cos( latitude ),","    - cos( longitude ) * sin( latitude )","  );","  normalize( dir );","  gl_FragColor = vec4( textureCube( map, dir ).rgb, 1.0 );","}"].join("\n"),DS=(Ww("screenshot",{schema:{width:{default:4096},height:{default:2048},camera:{type:"selector"}},sceneOnly:!0,setup:function(){var e=this.el;if(!this.canvas){var t=e.renderer.getContext();t&&(this.cubeMapSize=t.getParameter(t.MAX_CUBE_MAP_TEXTURE_SIZE),this.material=new Wb.RawShaderMaterial({uniforms:{map:{type:"t",value:null}},vertexShader:RS,fragmentShader:LS,side:Wb.DoubleSide}),this.quad=new Wb.Mesh(new Wb.PlaneGeometry(1,1),this.material),this.quad.visible=!1,this.camera=new Wb.OrthographicCamera(-.5,.5,.5,-.5,-1e4,1e4),this.canvas=document.createElement("canvas"),this.ctx=this.canvas.getContext("2d"),e.object3D.add(this.quad),this.onKeyDown=this.onKeyDown.bind(this))}},getRenderTarget:function(e,t){return new Wb.WebGLRenderTarget(e,t,{colorSpace:this.el.sceneEl.renderer.outputColorSpace,minFilter:Wb.LinearFilter,magFilter:Wb.LinearFilter,wrapS:Wb.ClampToEdgeWrapping,wrapT:Wb.ClampToEdgeWrapping,format:Wb.RGBAFormat,type:Wb.UnsignedByteType})},resize:function(e,t){this.quad.scale.set(e,t,1),this.camera.left=-1*e/2,this.camera.right=e/2,this.camera.top=t/2,this.camera.bottom=-1*t/2,this.camera.updateProjectionMatrix(),this.canvas.width=e,this.canvas.height=t},play:function(){window.addEventListener("keydown",this.onKeyDown)},onKeyDown:function(e){var t=83===e.keyCode&&e.ctrlKey&&e.altKey;if(this.data&&t){var n=e.shiftKey?"equirectangular":"perspective";this.capture(n)}},setCapture:function(e){var t,n,i,r,s=this.el;return"perspective"===e?(this.quad.visible=!1,n=this.data.camera&&this.data.camera.components.camera.camera||s.camera,t={width:this.data.width,height:this.data.height}):(n=this.camera,r=new Wb.WebGLCubeRenderTarget(Math.min(this.cubeMapSize,2048),{format:Wb.RGBFormat,generateMipmaps:!0,minFilter:Wb.LinearMipmapLinearFilter,colorSpace:Wb.SRGBColorSpace}),i=new Wb.CubeCamera(s.camera.near,s.camera.far,r),s.camera.getWorldPosition(i.position),s.camera.getWorldQuaternion(i.quaternion),i.update(s.renderer,s.object3D),this.quad.material.uniforms.map.value=i.renderTarget.texture,t={width:this.data.width,height:this.data.height},this.quad.visible=!0),{camera:n,size:t,projection:e}},capture:function(e){var t,n=this.el.renderer.xr.enabled,i=this.el.renderer;this.setup(),i.xr.enabled=!1,t=this.setCapture(e),this.renderCapture(t.camera,t.size,t.projection),this.saveCapture(),i.xr.enabled=n},getCanvas:function(e){var t=this.el.renderer.xr.enabled,n=this.el.renderer;this.setup();var i=this.setCapture(e);return n.xr.enabled=!1,this.renderCapture(i.camera,i.size,i.projection),n.xr.enabled=t,this.canvas},renderCapture:function(e,t,n){var i,r,s,o=this.el.renderer.autoClear,a=this.el,l=a.renderer;r=this.getRenderTarget(t.width,t.height),s=new Uint8Array(4*t.width*t.height),this.resize(t.width,t.height),l.autoClear=!0,l.clear(),l.setRenderTarget(r),l.render(a.object3D,e),l.autoClear=o,l.readRenderTargetPixels(r,0,0,t.width,t.height,s),l.setRenderTarget(null),"perspective"===n&&(s=this.flipPixelsVertically(s,t.width,t.height)),i=new ImageData(new Uint8ClampedArray(s),t.width,t.height),this.quad.visible=!1,this.ctx.putImageData(i,0,0)},flipPixelsVertically:function(e,t,n){for(var i=e.slice(0),r=0;r<t;++r)for(var s=0;s<n;++s)i[4*r+s*t*4]=e[4*r+(n-s)*t*4],i[4*r+1+s*t*4]=e[4*r+1+(n-s)*t*4],i[4*r+2+s*t*4]=e[4*r+2+(n-s)*t*4],i[4*r+3+s*t*4]=e[4*r+3+(n-s)*t*4];return i},saveCapture:function(){this.canvas.toBlob((function(e){var t="screenshot-"+document.title.toLowerCase()+"-"+Date.now()+".png",n=document.createElement("a"),i=URL.createObjectURL(e);n.href=i,n.setAttribute("download",t),n.innerHTML="downloading...",n.style.display="none",document.body.appendChild(n),setTimeout((function(){n.click(),document.body.removeChild(n)}),1)}),"image/png")}}),n(282)),PS=n.n(DS),US=(n(3729),n(8132),window.aframeStats),kS="a-hidden",NS=window.threeStats;Ww("stats",{schema:{default:!0},sceneOnly:!0,init:function(){var e=this.el;"false"!==HC("stats")&&(this.stats=function(e){var t=new NS(e.renderer),n=new US(e),i=e.isMobile?[]:[t,n];return new(PS())({css:[],values:{fps:{caption:"fps",below:30}},groups:[{caption:"Framerate",values:["fps","raf"]}],plugins:i})}(e),this.statsEl=document.querySelector(".rs-base"),this.hideBound=this.hide.bind(this),this.showBound=this.show.bind(this),e.addEventListener("enter-vr",this.hideBound),e.addEventListener("exit-vr",this.showBound))},update:function(){if(this.stats)return this.data?this.show():this.hide()},remove:function(){this.el.removeEventListener("enter-vr",this.hideBound),this.el.removeEventListener("exit-vr",this.showBound),this.statsEl&&this.statsEl.parentNode.removeChild(this.statsEl)},tick:function(){var e=this.stats;e&&(e("rAF").tick(),e("FPS").frame(),e().update())},hide:function(){this.statsEl.classList.add(kS)},show:function(){this.statsEl.classList.remove(kS)}});var OS="a-hidden";function FS(e){e.addEventListener("touchstart",(function(){e.classList.remove("resethover")}),{passive:!0}),e.addEventListener("touchend",(function(){e.classList.add("resethover")}),{passive:!0})}Ww("xr-mode-ui",{dependencies:["canvas"],schema:{enabled:{default:!0},enterVRButton:{default:""},enterVREnabled:{default:!0},enterARButton:{default:""},enterAREnabled:{default:!0},XRMode:{default:"vr",oneOf:["vr","ar","xr"]}},sceneOnly:!0,init:function(){var e=this,t=this.el;"false"!==HC("ui")&&(this.insideLoader=!1,this.enterVREl=null,this.enterAREl=null,this.orientationModalEl=null,this.bindMethods(),t.addEventListener("enter-vr",this.updateEnterInterfaces),t.addEventListener("exit-vr",this.updateEnterInterfaces),t.addEventListener("update-vr-devices",this.updateEnterInterfaces),window.addEventListener("message",(function(t){"loaderReady"===t.data.type&&(e.insideLoader=!0,e.remove())})),window.addEventListener("orientationchange",this.toggleOrientationModalIfNeeded))},bindMethods:function(){this.onEnterVRButtonClick=this.onEnterVRButtonClick.bind(this),this.onEnterARButtonClick=this.onEnterARButtonClick.bind(this),this.onModalClick=this.onModalClick.bind(this),this.toggleOrientationModalIfNeeded=this.toggleOrientationModalIfNeeded.bind(this),this.updateEnterInterfaces=this.updateEnterInterfaces.bind(this)},onModalClick:function(){this.el.exitVR()},onEnterVRButtonClick:function(){this.el.enterVR()},onEnterARButtonClick:function(){this.el.enterAR()},update:function(){var e,t,n,i=this.data,r=this.el;if(!i.enabled||this.insideLoader||"false"===HC("ui"))return this.remove();this.enterVREl||this.enterAREl||this.orientationModalEl||(this.enterVREl||!i.enterVREnabled||"xr"!==i.XRMode&&"vr"!==i.XRMode||(i.enterVRButton?(this.enterVREl=document.querySelector(i.enterVRButton),this.enterVREl.addEventListener("click",this.onEnterVRButtonClick)):(this.enterVREl=(e=this.onEnterVRButtonClick,(n=document.createElement("div")).classList.add("a-enter-vr"),n.setAttribute(Xb,""),(t=document.createElement("button")).className="a-enter-vr-button",t.setAttribute("title","Enter VR mode with a headset or fullscreen without"),t.setAttribute(Xb,""),px()&&FS(t),n.appendChild(t),t.addEventListener("click",(function(t){e(),t.stopPropagation()})),n),r.appendChild(this.enterVREl))),this.enterAREl||!i.enterAREnabled||"xr"!==i.XRMode&&"ar"!==i.XRMode||(i.enterARButton?(this.enterAREl=document.querySelector(i.enterARButton),this.enterAREl.addEventListener("click",this.onEnterARButtonClick)):(this.enterAREl=function(e,t){var n,i;return(i=document.createElement("div")).classList.add("a-enter-ar"),t&&i.classList.add("xr"),i.setAttribute(Xb,""),(n=document.createElement("button")).className="a-enter-ar-button",n.setAttribute("title","Enter AR mode with a headset or handheld device."),n.setAttribute(Xb,""),px()&&FS(n),i.appendChild(n),n.addEventListener("click",(function(t){e(),t.stopPropagation()})),i}(this.onEnterARButtonClick,"xr"===i.XRMode),r.appendChild(this.enterAREl))),this.orientationModalEl=function(e){var t=document.createElement("div");t.className="a-orientation-modal",t.classList.add(OS),t.setAttribute(Xb,"");var n=document.createElement("button");return n.setAttribute(Xb,""),n.innerHTML="Exit VR",n.addEventListener("click",e),t.appendChild(n),t}(this.onModalClick),r.appendChild(this.orientationModalEl),this.updateEnterInterfaces())},remove:function(){[this.enterVREl,this.enterAREl,this.orientationModalEl].forEach((function(e){e&&e.parentNode&&e.parentNode.removeChild(e)})),this.enterVREl=void 0,this.enterAREl=void 0,this.orientationModalEl=void 0},updateEnterInterfaces:function(){this.toggleEnterVRButtonIfNeeded(),this.toggleEnterARButtonIfNeeded(),this.toggleOrientationModalIfNeeded()},toggleEnterVRButtonIfNeeded:function(){var e=this.el;this.enterVREl&&(e.is("vr-mode")||(e.isMobile||vx())&&!hx()?this.enterVREl.classList.add(OS):(hx()||this.enterVREl.classList.add("fullscreen"),this.enterVREl.classList.remove(OS),e.enterVR(!1,!0)))},toggleEnterARButtonIfNeeded:function(){var e=this.el;this.enterAREl&&(e.is("vr-mode")||!cx()?this.enterAREl.classList.add(OS):(this.enterAREl.classList.remove(OS),e.enterVR(!0,!0)))},toggleOrientationModalIfNeeded:function(){var e=this.el,t=this.orientationModalEl;t&&e.isMobile&&(!Cx()&&e.is("vr-mode")?t.classList.remove(OS):t.classList.add(OS))}}),M_("box",{schema:{depth:{default:1,min:0},height:{default:1,min:0},width:{default:1,min:0},segmentsHeight:{default:1,min:1,max:20,type:"int"},segmentsWidth:{default:1,min:1,max:20,type:"int"},segmentsDepth:{default:1,min:1,max:20,type:"int"}},init:function(e){this.geometry=new Wb.BoxGeometry(e.width,e.height,e.depth,e.segmentsWidth,e.segmentsHeight,e.segmentsDepth)}});var QS=Wb.MathUtils.degToRad;M_("circle",{schema:{radius:{default:1,min:0},segments:{default:32,min:3,type:"int"},thetaLength:{default:360,min:0},thetaStart:{default:0}},init:function(e){this.geometry=new Wb.CircleGeometry(e.radius,e.segments,QS(e.thetaStart),QS(e.thetaLength))}});var zS=Wb.MathUtils.degToRad;M_("cone",{schema:{height:{default:1,min:0},openEnded:{default:!1},radiusBottom:{default:1,min:0},radiusTop:{default:.01,min:0},segmentsHeight:{default:18,min:1,type:"int"},segmentsRadial:{default:36,min:3,type:"int"},thetaLength:{default:360,min:0},thetaStart:{default:0}},init:function(e){this.geometry=new Wb.CylinderGeometry(e.radiusTop,e.radiusBottom,e.height,e.segmentsRadial,e.segmentsHeight,e.openEnded,zS(e.thetaStart),zS(e.thetaLength))}});var GS=Wb.MathUtils.degToRad;M_("cylinder",{schema:{height:{default:1,min:0},openEnded:{default:!1},radius:{default:1,min:0},segmentsHeight:{default:18,min:1,type:"int"},segmentsRadial:{default:36,min:3,type:"int"},thetaLength:{default:360,min:0},thetaStart:{default:0}},init:function(e){this.geometry=new Wb.CylinderGeometry(e.radius,e.radius,e.height,e.segmentsRadial,e.segmentsHeight,e.openEnded,GS(e.thetaStart),GS(e.thetaLength))}}),M_("dodecahedron",{schema:{detail:{default:0,min:0,max:5,type:"int"},radius:{default:1,min:0}},init:function(e){this.geometry=new Wb.DodecahedronGeometry(e.radius,e.detail)}}),M_("icosahedron",{schema:{detail:{default:0,min:0,max:5,type:"int"},radius:{default:1,min:0}},init:function(e){this.geometry=new Wb.IcosahedronGeometry(e.radius,e.detail)}}),M_("octahedron",{schema:{detail:{default:0,min:0,max:5,type:"int"},radius:{default:1,min:0}},init:function(e){this.geometry=new Wb.OctahedronGeometry(e.radius,e.detail)}}),M_("plane",{schema:{height:{default:1,min:0},width:{default:1,min:0},segmentsHeight:{default:1,min:1,max:20,type:"int"},segmentsWidth:{default:1,min:1,max:20,type:"int"}},init:function(e){this.geometry=new Wb.PlaneGeometry(e.width,e.height,e.segmentsWidth,e.segmentsHeight)}});var HS=Wb.MathUtils.degToRad;M_("ring",{schema:{radiusInner:{default:.8,min:0},radiusOuter:{default:1.2,min:0},segmentsPhi:{default:10,min:1,type:"int"},segmentsTheta:{default:32,min:3,type:"int"},thetaLength:{default:360,min:0},thetaStart:{default:0}},init:function(e){this.geometry=new Wb.RingGeometry(e.radiusInner,e.radiusOuter,e.segmentsTheta,e.segmentsPhi,HS(e.thetaStart),HS(e.thetaLength))}});var VS=Wb.MathUtils.degToRad;M_("sphere",{schema:{radius:{default:1,min:0},phiLength:{default:360},phiStart:{default:0,min:0},thetaLength:{default:180,min:0},thetaStart:{default:0},segmentsHeight:{default:18,min:2,type:"int"},segmentsWidth:{default:36,min:3,type:"int"}},init:function(e){this.geometry=new Wb.SphereGeometry(e.radius,e.segmentsWidth,e.segmentsHeight,VS(e.phiStart),VS(e.phiLength),VS(e.thetaStart),VS(e.thetaLength))}}),M_("tetrahedron",{schema:{detail:{default:0,min:0,max:5,type:"int"},radius:{default:1,min:0}},init:function(e){this.geometry=new Wb.TetrahedronGeometry(e.radius,e.detail)}});var jS=Wb.MathUtils.degToRad;M_("torus",{schema:{arc:{default:360},radius:{default:1,min:0},radiusTubular:{default:.2,min:0},segmentsRadial:{default:36,min:2,type:"int"},segmentsTubular:{default:32,min:3,type:"int"}},init:function(e){this.geometry=new Wb.TorusGeometry(e.radius,2*e.radiusTubular,e.segmentsRadial,e.segmentsTubular,jS(e.arc))}}),M_("torusKnot",{schema:{p:{default:2,min:1},q:{default:3,min:1},radius:{default:1,min:0},radiusTubular:{default:.2,min:0},segmentsRadial:{default:8,min:3,type:"int"},segmentsTubular:{default:100,min:3,type:"int"}},init:function(e){this.geometry=new Wb.TorusKnotGeometry(e.radius,2*e.radiusTubular,e.segmentsTubular,e.segmentsRadial,e.p,e.q)}});var WS=new Wb.Quaternion,qS=new Wb.Vector3(0,0,1),XS=new Wb.Vector2,YS=new Wb.Vector2,JS=new Wb.Vector2;function KS(e,t){return t.color.set(e.color),t.fog=e.fog,t.wireframe=e.wireframe,t.toneMapped=e.toneMapped,t.wireframeLinewidth=e.wireframeLinewidth,t}function ZS(e,t){return t.color.set(e.color),t.emissive.set(e.emissive),t.emissiveIntensity=e.emissiveIntensity,t.fog=e.fog,t.metalness=e.metalness,t.roughness=e.roughness,t.wireframe=e.wireframe,t.wireframeLinewidth=e.wireframeLinewidth,e.normalMap&&(t.normalScale=e.normalScale),e.ambientOcclusionMap&&(t.aoMapIntensity=e.ambientOcclusionMapIntensity),e.displacementMap&&(t.displacementScale=e.displacementScale,t.displacementBias=e.displacementBias),t}function $S(e,t){switch(t.color.set(e.color),t.specular.set(e.specular),t.emissive.set(e.emissive),t.emissiveIntensity=e.emissiveIntensity,t.fog=e.fog,t.transparent=e.transparent,t.wireframe=e.wireframe,t.wireframeLinewidth=e.wireframeLinewidth,t.shininess=e.shininess,t.flatShading=e.flatShading,t.wireframe=e.wireframe,t.wireframeLinewidth=e.wireframeLinewidth,t.reflectivity=e.reflectivity,t.refractionRatio=e.refractionRatio,e.combine){case"mix":t.combine=Wb.MixOperation;break;case"multiply":t.combine=Wb.MultiplyOperation;break;case"add":t.combine=Wb.AddOperation}return e.normalMap&&(t.normalScale=e.normalScale),e.ambientOcclusionMap&&(t.aoMapIntensity=e.ambientOcclusionMapIntensity),e.bumpMap&&(t.bumpScale=e.bumpMapScale),e.displacementMap&&(t.displacementScale=e.displacementScale,t.displacementBias=e.displacementBias),t}M_("triangle",{schema:{vertexA:{type:"vec3",default:{x:0,y:.5,z:0}},vertexB:{type:"vec3",default:{x:-.5,y:-.5,z:0}},vertexC:{type:"vec3",default:{x:.5,y:-.5,z:0}}},init:function(e){var t,n,i,r,s,o,a,l,c;(i=new Wb.Triangle).a.set(e.vertexA.x,e.vertexA.y,e.vertexA.z),i.b.set(e.vertexB.x,e.vertexB.y,e.vertexB.z),i.c.set(e.vertexC.x,e.vertexC.y,e.vertexC.z),n=i.getNormal(new Wb.Vector3),WS.setFromUnitVectors(n,qS),r=i.a.clone().applyQuaternion(WS),s=i.b.clone().applyQuaternion(WS),o=i.c.clone().applyQuaternion(WS),XS.set(Math.min(r.x,s.x,o.x),Math.min(r.y,s.y,o.y)),YS.set(Math.max(r.x,s.x,o.x),Math.max(r.y,s.y,o.y)),JS.set(0,0).subVectors(YS,XS),r=(new Wb.Vector2).subVectors(r,XS).divide(JS),s=(new Wb.Vector2).subVectors(s,XS).divide(JS),o=(new Wb.Vector2).subVectors(o,XS).divide(JS),t=this.geometry=new Wb.BufferGeometry,a=[i.a.x,i.a.y,i.a.z,i.b.x,i.b.y,i.b.z,i.c.x,i.c.y,i.c.z],l=[n.x,n.y,n.z,n.x,n.y,n.z,n.x,n.y,n.z],c=[r.x,r.y,s.x,s.y,o.x,o.y],t.setAttribute("position",new Wb.Float32BufferAttribute(a,3)),t.setAttribute("normal",new Wb.Float32BufferAttribute(l,3)),t.setAttribute("uv",new Wb.Float32BufferAttribute(c,2))}}),F_("flat",{schema:{color:{type:"color"},fog:{default:!0},offset:{type:"vec2",default:{x:0,y:0}},repeat:{type:"vec2",default:{x:1,y:1}},src:{type:"map"},wireframe:{default:!1},wireframeLinewidth:{default:2},toneMapped:{default:!0}},init:function(e){this.materialData={color:new Wb.Color},KS(e,this.materialData),this.material=new Wb.MeshBasicMaterial(this.materialData)},update:function(e){this.updateMaterial(e),iC(this,e)},updateMaterial:function(e){var t;for(t in KS(e,this.materialData),this.materialData)this.material[t]=this.materialData[t]}}),F_("standard",{schema:{ambientOcclusionMap:{type:"map"},ambientOcclusionMapIntensity:{default:1},ambientOcclusionTextureOffset:{type:"vec2"},ambientOcclusionTextureRepeat:{type:"vec2",default:{x:1,y:1}},color:{type:"color"},displacementMap:{type:"map"},displacementScale:{default:1},displacementBias:{default:.5},displacementTextureOffset:{type:"vec2"},displacementTextureRepeat:{type:"vec2",default:{x:1,y:1}},emissive:{type:"color",default:"#000"},emissiveIntensity:{default:1},envMap:{default:""},fog:{default:!0},metalness:{default:0,min:0,max:1},metalnessMap:{type:"map"},metalnessTextureOffset:{type:"vec2"},metalnessTextureRepeat:{type:"vec2",default:{x:1,y:1}},normalMap:{type:"map"},normalScale:{type:"vec2",default:{x:1,y:1}},normalTextureOffset:{type:"vec2"},normalTextureRepeat:{type:"vec2",default:{x:1,y:1}},offset:{type:"vec2",default:{x:0,y:0}},repeat:{type:"vec2",default:{x:1,y:1}},roughness:{default:.5,min:0,max:1},roughnessMap:{type:"map"},roughnessTextureOffset:{type:"vec2"},roughnessTextureRepeat:{type:"vec2",default:{x:1,y:1}},sphericalEnvMap:{type:"map"},src:{type:"map"},wireframe:{default:!1},wireframeLinewidth:{default:2}},init:function(e){this.materialData={color:new Wb.Color,emissive:new Wb.Color},ZS(e,this.materialData),this.material=new Wb.MeshStandardMaterial(this.materialData)},update:function(e){this.updateMaterial(e),iC(this,e),rC("normal",this,e),rC("displacement",this,e),rC("ambientOcclusion",this,e),rC("metalness",this,e),rC("roughness",this,e),oC(this,e)},updateMaterial:function(e){var t,n=this.material;for(t in ZS(e,this.materialData),this.materialData)n[t]=this.materialData[t]}}),F_("phong",{schema:{color:{type:"color"},emissive:{type:"color",default:"black"},emissiveIntensity:{default:1},specular:{type:"color",default:"#111111"},transparent:{default:!1},fog:{default:!0},offset:{type:"vec2",default:{x:0,y:0}},repeat:{type:"vec2",default:{x:1,y:1}},src:{type:"map"},envMap:{default:""},sphericalEnvMap:{type:"map"},shininess:{default:30},flatShading:{default:!1},wireframe:{default:!1},wireframeLinewidth:{default:2},combine:{oneOF:["multiply","mix","add"],default:"mix"},reflectivity:{default:.9},refractionRatio:{default:.98},refract:{default:!1},normalMap:{type:"map"},normalScale:{type:"vec2",default:{x:1,y:1}},normalTextureOffset:{type:"vec2"},normalTextureRepeat:{type:"vec2",default:{x:1,y:1}},ambientOcclusionMap:{type:"map"},ambientOcclusionMapIntensity:{default:1},displacementMap:{type:"map"},displacementScale:{default:1},displacementBias:{default:.5},displacementTextureOffset:{type:"vec2"},displacementTextureRepeat:{type:"vec2",default:{x:1,y:1}},bumpMap:{type:"map"},bumpMapScale:{default:1},bumpTextureOffset:{type:"vec2"},bumpTextureRepeat:{type:"vec2",default:{x:1,y:1}}},init:function(e){this.materialData={color:new Wb.Color,specular:new Wb.Color,emissive:new Wb.Color},$S(e,this.materialData),this.material=new Wb.MeshPhongMaterial(this.materialData);var t=this.el.sceneEl;Object.defineProperty(this.material,"envMap",{get:function(){return this._envMap||t.object3D.environment},set:function(e){this._envMap=e}})},update:function(e){this.updateMaterial(e),iC(this,e),rC("normal",this,e),rC("displacement",this,e),rC("ambientOcclusion",this,e),rC("bump",this,e),oC(this,e)},updateMaterial:function(e){var t;for(t in $S(e,this.materialData),this.materialData)this.material[t]=this.materialData[t]}}),F_("sdf",{schema:{alphaTest:{type:"number",is:"uniform",default:.5},color:{type:"color",is:"uniform",default:"white"},map:{type:"map",is:"uniform"},opacity:{type:"number",is:"uniform",default:1}},vertexShader:["#include <common>","#include <fog_pars_vertex>","#include <logdepthbuf_pars_vertex>","out vec2 vUV;","void main(void) {","  vUV = uv;","  #include <begin_vertex>","  #include <project_vertex>","  #include <logdepthbuf_vertex>","  #include <fog_vertex>","}"].join("\n"),fragmentShader:["#include <common>","#include <fog_pars_fragment>","#include <logdepthbuf_pars_fragment>","uniform float alphaTest;","uniform float opacity;","uniform sampler2D map;","uniform vec3 color;","in vec2 vUV;","float contour(float width, float value) {","  return smoothstep(0.5 - value, 0.5 + value, width);","}","#define BIG_ENOUGH 0.001","#define MODIFIED_ALPHATEST (0.02 * isBigEnough / BIG_ENOUGH)","void main() {","  vec2 uv = vUV;","  vec4 texColor = texture(map, uv);","  float dist = texColor.a;","  float width = fwidth(dist);","  float alpha = contour(dist, width);","  float dscale = 0.353505;","  vec2 duv = dscale * (dFdx(uv) + dFdy(uv));","  float isBigEnough = max(abs(duv.x), abs(duv.y));","  if (isBigEnough > BIG_ENOUGH) {","    float ratio = BIG_ENOUGH / isBigEnough;","    alpha = ratio * alpha + (1.0 - ratio) * dist;","  }","  if (isBigEnough <= BIG_ENOUGH) {","    vec4 box = vec4 (uv - duv, uv + duv);","    alpha = (alpha + 0.5 * (","      contour(texture(map, box.xy).a, width)","      + contour(texture(map, box.zw).a, width)","      + contour(texture(map, box.xw).a, width)","      + contour(texture(map, box.zy).a, width)","    )) / 3.0;","  }","  if (alpha < alphaTest * MODIFIED_ALPHATEST) { discard; return; }","  gl_FragColor = vec4(color, opacity * alpha);","  #include <logdepthbuf_fragment>","  #include <tonemapping_fragment>","  #include <colorspace_fragment>","  #include <fog_fragment>","}"].join("\n"),init:function(){return this.uniforms=Wb.UniformsUtils.merge([Wb.UniformsLib.fog,this.initUniforms()]),this.material=new Wb.ShaderMaterial({uniforms:this.uniforms,vertexShader:this.vertexShader,fragmentShader:this.fragmentShader,fog:!0}),this.material}}),F_("msdf",{schema:{alphaTest:{type:"number",is:"uniform",default:.5},color:{type:"color",is:"uniform",default:"white"},map:{type:"map",is:"uniform"},negate:{type:"boolean",is:"uniform",default:!0},opacity:{type:"number",is:"uniform",default:1}},vertexShader:["#include <common>","#include <fog_pars_vertex>","#include <logdepthbuf_pars_vertex>","out vec2 vUV;","void main(void) {","  vUV = uv;","  #include <begin_vertex>","  #include <project_vertex>","  #include <logdepthbuf_vertex>","  #include <fog_vertex>","}"].join("\n"),fragmentShader:["#include <common>","#include <fog_pars_fragment>","#include <logdepthbuf_pars_fragment>","uniform bool negate;","uniform float alphaTest;","uniform float opacity;","uniform sampler2D map;","uniform vec3 color;","in vec2 vUV;","float median(float r, float g, float b) {","  return max(min(r, g), min(max(r, g), b));","}","#define BIG_ENOUGH 0.001","#define MODIFIED_ALPHATEST (0.02 * isBigEnough / BIG_ENOUGH)","void main() {","  vec3 sampleColor = texture(map, vUV).rgb;","  if (negate) { sampleColor = 1.0 - sampleColor; }","  float sigDist = median(sampleColor.r, sampleColor.g, sampleColor.b) - 0.5;","  float alpha = clamp(sigDist / fwidth(sigDist) + 0.5, 0.0, 1.0);","  float dscale = 0.353505;","  vec2 duv = dscale * (dFdx(vUV) + dFdy(vUV));","  float isBigEnough = max(abs(duv.x), abs(duv.y));","  // Do modified alpha test.","  if (isBigEnough > BIG_ENOUGH) {","    float ratio = BIG_ENOUGH / isBigEnough;","    alpha = ratio * alpha + (1.0 - ratio) * (sigDist + 0.5);","  }","  // Do modified alpha test.","  if (alpha < alphaTest * MODIFIED_ALPHATEST) { discard; return; }","  gl_FragColor = vec4(color.xyz, alpha * opacity);","  #include <logdepthbuf_fragment>","  #include <tonemapping_fragment>","  #include <colorspace_fragment>","  #include <fog_fragment>","}"].join("\n"),init:function(){return this.uniforms=Wb.UniformsUtils.merge([Wb.UniformsLib.fog,this.initUniforms()]),this.material=new Wb.ShaderMaterial({uniforms:this.uniforms,vertexShader:this.vertexShader,fragmentShader:this.fragmentShader,fog:!0}),this.material}}),F_("shadow",{schema:{opacity:{default:.5},transparent:{default:!0},alphaToCoverage:{default:!0}},init:function(e){this.material=new Wb.ShadowMaterial},update:function(e){this.material.opacity=e.opacity,this.material.alphaToCoverage=e.alphaToCoverage,this.material.transparent=e.transparent}});var eT="data-aframe-default-camera";function tT(e){var t=e.primitive,n=C_[t]&&C_[t].Geometry,i=new n;if(!n)throw new Error("Unknown geometry `"+t+"`");return i.init(e),i.geometry}e_("camera",{init:function(){this.activeCameraEl=null,this.render=this.render.bind(this),this.unwrapRender=this.unwrapRender.bind(this),this.wrapRender=this.wrapRender.bind(this),this.initialCameraFound=!1,this.numUserCameras=0,this.numUserCamerasChecked=0,this.setupInitialCamera()},setupInitialCamera:function(){var e,t,n=this.sceneEl,i=this;if(!n.camera||n.camera.el.getAttribute("camera").spectator)if((e=n.querySelectorAll("a-camera, :not(a-mixin)[camera]")).length)for(this.numUserCameras=e.length,t=0;t<e.length;t++)e[t].addEventListener("object3dset",(function(e){"camera"===e.detail.type&&i.checkUserCamera(this)})),e[t].isNode?e[t].load():e[t].addEventListener("nodeready",(function(){this.load()}));else this.createDefaultCamera();else n.emit("cameraready",{cameraEl:n.camera.el})},checkUserCamera:function(e){var t,n=this.el.sceneEl;this.numUserCamerasChecked++,this.initialCameraFound||((t=e.getAttribute("camera")).active&&!t.spectator?(this.initialCameraFound=!0,n.camera=e.getObject3D("camera"),n.emit("cameraready",{cameraEl:e})):this.numUserCamerasChecked===this.numUserCameras&&this.createDefaultCamera())},createDefaultCamera:function(){var e,t=this.sceneEl;(e=document.createElement("a-entity")).setAttribute("camera",{active:!0}),e.setAttribute("position",{x:0,y:1.6,z:0}),e.setAttribute("wasd-controls",""),e.setAttribute("look-controls",""),e.setAttribute(Xb,""),e.addEventListener("object3dset",(function(n){"camera"===n.detail.type&&(t.camera=n.detail.object,t.emit("cameraready",{cameraEl:e}))})),t.appendChild(e)},disableActiveCamera:function(){var e;(e=this.sceneEl.querySelectorAll(":not(a-mixin)[camera]"))[e.length-1].setAttribute("camera","active",!0)},setActiveCamera:function(e){var t,n,i,r,s=this.activeCameraEl,o=this.sceneEl;if((r=e.getObject3D("camera"))&&e!==this.activeCameraEl){var a=o.querySelector("["+eT+"]");for(e!==(a&&a.querySelector(":not(a-mixin)[camera]"))&&function(e){var t;e.camera&&(t=e.querySelector("["+eT+"]"))&&e.removeChild(t)}(o),this.activeCameraEl=e,this.activeCameraEl.play(),o.camera=r,s&&s.setAttribute("camera","active",!1),n=o.querySelectorAll(":not(a-mixin)[camera]"),i=0;i<n.length;i++)(t=n[i]).isEntity&&e!==t&&(t.setAttribute("camera","active",!1),t.pause());o.emit("camera-set-active",{cameraEl:e})}},setSpectatorCamera:function(e){var t,n=this.spectatorCameraEl,i=this.sceneEl;e.getObject3D("camera")&&e!==this.spectatorCameraEl&&(n&&n.setAttribute("camera","spectator",!1),t=this.spectatorCameraEl=e,i.addEventListener("enter-vr",this.wrapRender),i.addEventListener("exit-vr",this.unwrapRender),t.setAttribute("camera","active",!1),t.play(),i.emit("camera-set-spectator",{cameraEl:e}))},disableSpectatorCamera:function(){this.spectatorCameraEl=void 0},wrapRender:function(){this.spectatorCameraEl&&!this.originalRender&&(this.originalRender=this.sceneEl.renderer.render,this.sceneEl.renderer.render=this.render)},unwrapRender:function(){this.originalRender&&(this.sceneEl.renderer.render=this.originalRender,this.originalRender=void 0)},render:function(e,t){var n,i,r=this.sceneEl;n=r.renderer.xr.enabled,this.originalRender.call(r.renderer,e,t),this.spectatorCameraEl&&!r.isMobile&&n&&(i=this.spectatorCameraEl.components.camera.camera,r.renderer.xr.enabled=!1,this.originalRender.call(r.renderer,e,i),r.renderer.xr.enabled=n)}}),e_("geometry",{init:function(){this.cache={},this.cacheCount={}},clearCache:function(){this.cache={},this.cacheCount={}},getOrCreateGeometry:function(e){var t,n,i=this.cache;return e.skipCache?tT(e):(t=i[n=this.hash(e)],function(e,t){e[t]=void 0===e[t]?1:e[t]+1}(this.cacheCount,n),t||(t=tT(e),i[n]=t,t))},unuseGeometry:function(e){var t,n=this.cache,i=this.cacheCount;e.skipCache||n[t=this.hash(e)]&&(function(e,t){e[t]--}(i,t),i[t]>0||(n[t].dispose(),delete n[t],delete i[t]))},hash:function(e){return JSON.stringify(e)}}),e_("gltf-model",{schema:{dracoDecoderPath:{default:"https://www.gstatic.com/draco/versioned/decoders/1.5.7/"},basisTranscoderPath:{default:""},meshoptDecoderPath:{default:""}},init:function(){this.update()},update:function(){var e=this.data.dracoDecoderPath,t=this.data.basisTranscoderPath,n=this.data.meshoptDecoderPath;!this.dracoLoader&&e&&(this.dracoLoader=new Wb.DRACOLoader,this.dracoLoader.setDecoderPath(e)),!this.ktx2Loader&&t&&(this.ktx2Loader=new Wb.KTX2Loader,this.ktx2Loader.setTranscoderPath(t).detectSupport(this.el.renderer)),!this.meshoptDecoder&&n&&(this.meshoptDecoder=function(e){return new Promise((function(t,n){var i=document.createElement("script");document.body.appendChild(i),i.onload=t,i.onerror=n,i.async=!0,i.src=e}))}(n).then((function(){return window.MeshoptDecoder.ready})).then((function(){return window.MeshoptDecoder})))},getDRACOLoader:function(){return this.dracoLoader},getKTX2Loader:function(){return this.ktx2Loader},getMeshoptDecoder:function(){return this.meshoptDecoder}});var nT="data-aframe-default-light",iT=(e_("light",{schema:{defaultLightsEnabled:{default:!0}},init:function(){this.defaultLights=!1,this.userDefinedLights=!1,this.sceneEl.addEventListener("loaded",this.setupDefaultLights.bind(this))},registerLight:function(e){e.hasAttribute(nT)||(this.removeDefaultLights(),this.userDefinedLights=!0)},removeDefaultLights:function(){var e,t=this.sceneEl;if(this.defaultLights){e=document.querySelectorAll("["+nT+"]");for(var n=0;n<e.length;n++)t.removeChild(e[n]);this.defaultLights=!1}},setupDefaultLights:function(){var e,t,n=this.sceneEl;this.userDefinedLights||this.defaultLights||!this.data.defaultLightsEnabled||((e=document.createElement("a-entity")).setAttribute("light",{color:"#BBB",type:"ambient"}),e.setAttribute(nT,""),e.setAttribute(Xb,""),n.appendChild(e),(t=document.createElement("a-entity")).setAttribute("light",{color:"#FFF",intensity:1.884,castShadow:!0}),t.setAttribute("position",{x:-.5,y:1,z:1}),t.setAttribute(nT,""),t.setAttribute(Xb,""),n.appendChild(t),this.defaultLights=!0)}}),$b),rT=iT("components:texture:error"),sT=iT("components:texture:warn"),oT=new Wb.ImageLoader;e_("material",{init:function(){this.materials={},this.sourceCache={}},clearTextureSourceCache:function(){this.sourceCache={}},loadTexture:function(e,t,n){this.loadTextureSource(e,(function(e){var i=cC(e);tC(i,t),n(i)}))},loadTextureSource:function(e,t){var n=this,i=this.sourceCache,r=this.hash(e);function s(e){i[r]=Promise.resolve(e),i[r].then(t)}i[r]?i[r].then(t):"CANVAS"!==e.tagName?s(new Promise((function(t,i){Xx(e,(function(e){n.loadImage(e,t)}),(function(e){n.loadVideo(e,t)}))}))):s(new Wb.Source(e))},loadCubeMapTexture:function(e,t){var n=this,i=0,r=new Wb.CubeTexture;function s(s){n.loadTextureSource(e[s],(function(e){r.images[s]=e.data,6==++i&&(r.needsUpdate=!0,t(r))}))}if(r.colorSpace=Wb.SRGBColorSpace,6===e.length)for(var o=0;o<e.length;o++)s(o);else sT("Cube map texture requires exactly 6 sources, got only %s sources",e.length)},loadImage:function(e,t){t("string"==typeof e?function(e){return new Promise((function(t,n){oT.load(e,(function(e){t(new Wb.Source(e))}),(function(){}),(function(e){rT("`$s` could not be fetched (Error code: %s; Response: %s)",e.status,e.statusText)}))}))}(e):new Wb.Source(e))},loadVideo:function(e,t){var n;"string"!=typeof e&&function(e){e.autoplay=e.hasAttribute("autoplay")&&"false"!==e.getAttribute("autoplay"),e.controls=e.hasAttribute("controls")&&"false"!==e.getAttribute("controls"),"false"===e.getAttribute("loop")&&e.removeAttribute("loop"),"false"===e.getAttribute("preload")&&(e.preload="none"),e.crossOrigin=e.crossOrigin||"anonymous",e.setAttribute("playsinline",""),e.setAttribute("webkit-playsinline","")}(n=e),n=n||function(e){var t=document.createElement("video");return t.setAttribute("playsinline",""),t.setAttribute("webkit-playsinline",""),t.autoplay=!0,t.loop=!0,t.crossOrigin="anonymous",t.addEventListener("error",(function(){sT("`%s` is not a valid video",e)}),!0),t.src=e,t}(e),t(new Wb.Source(n))},hash:function(e){return e.tagName&&(e.id||e.src)||e},registerMaterial:function(e){this.materials[e.uuid]=e},unregisterMaterial:function(e){delete this.materials[e.uuid]}}),e_("obb-collider",{schema:{showColliders:{default:!1}},init:function(){this.collisions=[],this.colliderEls=[]},addCollider:function(e){this.colliderEls.push(e),this.data.showColliders?e.components["obb-collider"].showCollider():e.components["obb-collider"].hideCollider(),this.tick=this.detectCollisions},removeCollider:function(e){var t=this.colliderEls,n=t.indexOf(e);e.components["obb-collider"].hideCollider(),n>-1&&t.splice(n,1),0===t.length&&(this.tick=void 0)},registerCollision:function(e,t){var n=this.collisions,i=!1,r=e.obb,s=t.obb,o=e.renderColliderMesh,a=t.renderColliderMesh;o&&o.material.color.set(16711680),a&&a.material.color.set(16711680);for(var l=0;l<n.length;l++)if(n[l].componentA.obb===r&&n[l].componentB.obb===s||n[l].componentA.obb===s&&n[l].componentB.obb===r){i=!0,n[l].detected=!0;break}i||(n.push({componentA:e,componentB:t,detected:!0}),e.el.emit("obbcollisionstarted",{trackedObject3D:e.trackedObject3D,withEl:t.el}),t.el.emit("obbcollisionstarted",{trackedObject3D:t.trackedObject3D,withEl:e.el}))},resetCollisions:function(){for(var e=this.collisions,t=0;t<e.length;t++)e[t].detected=!1},clearCollisions:function(){for(var e,t,n,i,r=this.collisions,s=[],o=0;o<r.length;o++)r[o].detected?s.push(r[o]):(e=r[o].componentA,t=r[o].componentB,n=e.renderColliderMesh,i=t.renderColliderMesh,n&&n.material.color.set(65280),e.el.emit("obbcollisionended",{trackedObject3D:this.trackedObject3D,withEl:t.el}),i&&i.material.color.set(65280),t.el.emit("obbcollisionended",{trackedObject3D:this.trackedObject3D,withEl:e.el}));this.collisions=s},detectCollisions:function(){var e,t,n,i,r=this.colliderEls;if(!(r.length<2)){this.resetCollisions();for(var s=0;s<r.length;s++)if(n=r[s].components["obb-collider"],0!==(e=r[s].components["obb-collider"].obb).halfSize.x&&0!==e.halfSize.y&&0!==e.halfSize.z)for(var o=s+1;o<r.length;o++)0!==(t=(i=r[o].components["obb-collider"]).obb).halfSize.x&&0!==t.halfSize.y&&0!==t.halfSize.z&&e.intersectsOBB(t)&&this.registerCollision(n,i);this.clearCollisions()}}});var aT=$b("components:renderer:warn");function lT(e,t){return e.groupOrder!==t.groupOrder?e.groupOrder-t.groupOrder:e.renderOrder!==t.renderOrder?e.renderOrder-t.renderOrder:e.z-t.z}function cT(e,t){return e.groupOrder!==t.groupOrder?e.groupOrder-t.groupOrder:e.renderOrder-t.renderOrder}function hT(e,t){return e.groupOrder!==t.groupOrder?e.groupOrder-t.groupOrder:e.renderOrder!==t.renderOrder?e.renderOrder-t.renderOrder:t.z-e.z}e_("renderer",{schema:{antialias:{default:"auto",oneOf:["true","false","auto"]},highRefreshRate:{default:yx()},logarithmicDepthBuffer:{default:"auto",oneOf:["true","false","auto"]},maxCanvasWidth:{default:-1},maxCanvasHeight:{default:-1},multiviewStereo:{default:!1},exposure:{default:1,if:{toneMapping:["ACESFilmic","linear","reinhard","cineon","AgX","neutral"]}},toneMapping:{default:"no",oneOf:["no","ACESFilmic","linear","reinhard","cineon","AgX","neutral"]},precision:{default:"high",oneOf:["high","medium","low"]},anisotropy:{default:1},sortTransparentObjects:{default:!1},colorManagement:{default:!0},alpha:{default:!0},stencil:{default:!1},foveationLevel:{default:1}},init:function(){var e=this.data,t=this.el,n=this.data.toneMapping.charAt(0).toUpperCase()+this.data.toneMapping.slice(1),i=t.renderer;i.toneMapping=Wb[n+"ToneMapping"],Wb.Texture.DEFAULT_ANISOTROPY=e.anisotropy,Wb.ColorManagement.enabled=e.colorManagement,i.outputColorSpace=e.colorManagement?Wb.SRGBColorSpace:Wb.LinearSRGBColorSpace,t.hasAttribute("antialias")&&aT('Component `antialias` is deprecated. Use `renderer="antialias: true"` instead.'),t.hasAttribute("logarithmicDepthBuffer")&&aT('Component `logarithmicDepthBuffer` is deprecated. Use `renderer="logarithmicDepthBuffer: true"` instead.'),i.sortObjects=!0,i.setOpaqueSort(lT)},update:function(){var e=this.data,t=this.el.renderer,n=this.data.toneMapping.charAt(0).toUpperCase()+this.data.toneMapping.slice(1);t.toneMapping=Wb[n+"ToneMapping"],t.toneMappingExposure=e.exposure,t.xr.setFoveation(e.foveationLevel),e.sortObjects&&aT('`sortObjects` property is deprecated. Use `renderer="sortTransparentObjects: true"` instead.'),e.sortTransparentObjects?t.setTransparentSort(hT):t.setTransparentSort(cT)},applyColorCorrection:function(e){this.data.colorManagement&&e&&e.isTexture&&e.colorSpace!==Wb.SRGBColorSpace&&(e.colorSpace=Wb.SRGBColorSpace,e.needsUpdate=!0)},setWebXRFrameRate:function(e){var t,n=this.data,i=e.supportedFrameRates;i&&e.updateTargetFrameRate&&(t=i.includes(90)?n.highRefreshRate?90:72:n.highRefreshRate?72:60,e.updateTargetFrameRate(t).catch((function(e){console.warn("failed to set target frame rate of "+t+". Error info: "+e)})))}});var uT={basic:Wb.BasicShadowMap,pcf:Wb.PCFShadowMap,pcfsoft:Wb.PCFSoftShadowMap};e_("shadow",{schema:{enabled:{default:!0},autoUpdate:{default:!0},type:{default:"pcf",oneOf:["basic","pcf","pcfsoft"]}},init:function(){var e=this.sceneEl,t=this.data;this.shadowMapEnabled=!1,e.renderer.shadowMap.type=uT[t.type],e.renderer.shadowMap.autoUpdate=t.autoUpdate},update:function(e){e.enabled!==this.data.enabled&&this.setShadowMapEnabled(this.shadowMapEnabled)},setShadowMapEnabled:function(e){var t=this.sceneEl,n=this.sceneEl.renderer;this.shadowMapEnabled=e;var i=this.data.enabled&&this.shadowMapEnabled;n&&i!==n.shadowMap.enabled&&(n.shadowMap.enabled=i,function(e){e.hasLoaded&&e.object3D.traverse((function(e){if(e.material)for(var t=Array.isArray(e.material)?e.material:[e.material],n=0;n<t.length;n++)t[n].needsUpdate=!0}))}(t))}}),e_("tracked-controls",{init:function(){this.controllers=[],this.onInputSourcesChange=this.onInputSourcesChange.bind(this),this.onEnterVR=this.onEnterVR.bind(this),this.el.addEventListener("enter-vr",this.onEnterVR),this.onExitVR=this.onExitVR.bind(this),this.el.addEventListener("exit-vr",this.onExitVR)},onEnterVR:function(){this.el.xrSession&&this.el.xrSession.addEventListener("inputsourceschange",this.onInputSourcesChange)},onExitVR:function(){this.referenceSpace=void 0,this.controllers=[],this.el.emit("controllersupdated",void 0,!1)},onInputSourcesChange:function(){var e=this,t=this.el.xrSession,n=this.el.sceneEl.systems.webxr.sessionReferenceSpaceType;t.requestReferenceSpace(n).then((function(t){e.referenceSpace=t})).catch((function(t){throw e.el.sceneEl.systems.webxr.warnIfFeatureNotRequested(n,'tracked-controls uses reference space "'+n+'".'),t})),this.controllers=t.inputSources,this.el.emit("controllersupdated",void 0,!1)}});var dT=$b("systems:webxr:warn"),pT=(e_("webxr",{schema:{referenceSpaceType:{type:"string",default:"local-floor"},requiredFeatures:{type:"array",default:["local-floor"]},optionalFeatures:{type:"array",default:["bounded-floor"]},overlayElement:{type:"selector"}},update:function(){var e=this.data;this.sessionConfiguration={requiredFeatures:e.requiredFeatures,optionalFeatures:e.optionalFeatures},this.sessionReferenceSpaceType=e.referenceSpaceType,e.overlayElement&&(e.overlayElement.classList.remove("a-dom-overlay"),e.optionalFeatures.includes("dom-overlay")||(e.optionalFeatures.push("dom-overlay"),this.el.setAttribute("webxr",e)),this.warnIfFeatureNotRequested("dom-overlay"),this.sessionConfiguration.domOverlay={root:e.overlayElement},e.overlayElement.classList.add("a-dom-overlay"))},wasFeatureRequested:function(e){return"viewer"===e||"local"===e||!(!this.sessionConfiguration.requiredFeatures.includes(e)&&!this.sessionConfiguration.optionalFeatures.includes(e))},warnIfFeatureNotRequested:function(e,t){this.wasFeatureRequested(e)||dT((t?t+" ":"")+'Please add the feature "'+e+"\" to a-scene's webxr system options in requiredFeatures/optionalFeatures.")}}),{});function fT(e){var t=e.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase();"fog"===e&&(t="material-fog"),"visible"===e&&(t="material-visible"),pT[t]="material."+e}function mT(){return{defaultComponents:{material:{}},mappings:DC({},pT)}}Object.keys(Bw.material.schema).forEach(fT),Object.keys(U_.standard.schema).forEach(fT);var AT=new Wb.Vector3,gT=new Wb.Vector3;Ww("pivot",{dependencies:["position"],schema:{type:"vec3"},init:function(){var e=this.data,t=this.el,n=t.object3D.parent,i=t.object3D,r=new Wb.Group;AT.copy(i.position),gT.copy(i.rotation),n.remove(i),r.add(i),n.add(r),t.object3D=r,i.position.set(-1*e.x,-1*e.y,-1*e.z),r.position.set(e.x+AT.x,e.y+AT.y,e.z+AT.z),r.rotation.copy(i.rotation),i.rotation.set(0,0,0)}}),D_("a-camera",{defaultComponents:{camera:{},"look-controls":{},"wasd-controls":{},position:{x:0,y:1.6,z:0}},mappings:{active:"camera.active",far:"camera.far",fov:"camera.fov","look-controls-enabled":"look-controls.enabled",near:"camera.near","pointer-lock-enabled":"look-controls.pointerLockEnabled","wasd-controls-enabled":"wasd-controls.enabled","reverse-mouse-drag":"look-controls.reverseMouseDrag",zoom:"camera.zoom"}}),D_("a-cursor",PC({},mT(),{defaultComponents:{cursor:{},geometry:{primitive:"ring",radiusOuter:.016,radiusInner:.01,segmentsTheta:32},material:{color:"#000",shader:"flat",opacity:.8},position:{x:0,y:0,z:-1}},mappings:{far:"raycaster.far",fuse:"cursor.fuse","fuse-timeout":"cursor.fuseTimeout",interval:"raycaster.interval",objects:"raycaster.objects"}})),D_("a-curvedimage",PC({},mT(),{defaultComponents:{geometry:{height:1,primitive:"cylinder",radius:2,segmentsRadial:48,thetaLength:270,openEnded:!0,thetaStart:0},material:{color:"#FFF",shader:"flat",side:"double",transparent:!0,repeat:"-1 1"}},mappings:{height:"geometry.height","open-ended":"geometry.openEnded",radius:"geometry.radius",segments:"geometry.segmentsRadial",start:"geometry.thetaStart","theta-length":"geometry.thetaLength","theta-start":"geometry.thetaStart",width:"geometry.thetaLength"}})),D_("a-gltf-model",{mappings:{src:"gltf-model"}}),D_("a-image",PC({},mT(),{defaultComponents:{geometry:{primitive:"plane"},material:{color:"#FFF",shader:"flat",side:"double",transparent:!0}},mappings:{height:"geometry.height",width:"geometry.width"}})),D_("a-light",{defaultComponents:{light:{}},mappings:{angle:"light.angle",color:"light.color","ground-color":"light.groundColor",decay:"light.decay",distance:"light.distance",intensity:"light.intensity",penumbra:"light.penumbra",type:"light.type",target:"light.target",envmap:"light.envMap","shadow-camera-automatic":"light.shadowCameraAutomatic"}}),D_("a-link",{defaultComponents:{link:{visualAspectEnabled:!0}},mappings:{href:"link.href",image:"link.image",title:"link.title"}}),D_("a-obj-model",PC({},mT(),{defaultComponents:{"obj-model":{}},mappings:{src:"obj-model.obj",mtl:"obj-model.mtl"}}));const vT={},yT=vT;function ET(e){return e.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}var bT,xT;w_.forEach((function(e){var t=C_[e],n=ET(e),i={};Object.keys(t.schema).forEach((function(e){i[ET(e)]="geometry."+e}));var r="a-"+n,s=D_(r,PC({},mT(),{defaultComponents:{geometry:{primitive:e}},mappings:i}));vT[r]=s})),D_("a-sky",PC({},mT(),{defaultComponents:{geometry:{primitive:"sphere",radius:500,segmentsWidth:64,segmentsHeight:32},material:{color:"#FFF",side:"back",shader:"flat",npot:!0},scale:"-1 1 1"},mappings:PC({},yT["a-sphere"].mappings)})),D_("a-sound",{defaultComponents:{sound:{}},mappings:{src:"sound.src",on:"sound.on",autoplay:"sound.autoplay",loop:"sound.loop",volume:"sound.volume"}}),bT={text:{anchor:"align",width:5}},xT=xT||{},Object.keys(bT).forEach((function(e){!function(e,t){var n=Bw[e].schema;Object.keys(n).forEach((function(n){var i=n.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase();void 0!==t[i]&&(i=e+"-"+n),t[i]=e+"."+n}))}(e,xT)})),D_("a-text",PC({},null,{defaultComponents:bT,mappings:xT})),D_("a-video",PC({},mT(),{defaultComponents:{geometry:{primitive:"plane"},material:{color:"#FFF",shader:"flat",side:"double",transparent:!0}},mappings:{height:"geometry.height",width:"geometry.width"}})),D_("a-videosphere",PC({},mT(),{defaultComponents:{geometry:{primitive:"sphere",radius:500,segmentsWidth:64,segmentsHeight:32},material:{color:"#FFF",shader:"flat",side:"back",npot:!0},scale:"-1 1 1"},mappings:{radius:"geometry.radius","segments-height":"geometry.segmentsHeight","segments-width":"geometry.segmentsWidth"}}));var CT=$b,wT=CT("A-Frame:error"),_T=CT("A-Frame:warn");window.document.currentScript&&window.document.currentScript.parentNode!==window.document.head&&!window.debug&&_T("Put the A-Frame <script> tag in the <head> of the HTML *before* the scene to ensure everything for A-Frame is properly registered before they are used from HTML."),window.cordova||"file:"!==window.location.protocol||wT("This HTML file is currently being served via the file:// protocol. Assets, textures, and models WILL NOT WORK due to cross-origin policy! Please use a local or hosted server: https://aframe.io/docs/1.4.0/introduction/installation.html#use-a-local-server."),wx&&(window.logs=CT,n(7180),n(9379)),console.log("A-Frame Version: 1.6.0 (Date 2025-05-14, Commit #b9e4838d)"),console.log("THREE Version (https://github.com/supermedium/three.js):",Wb.REVISION),window.AFRAME_ASYNC||("complete"!==document.readyState?document.addEventListener("readystatechange",(function e(){"complete"===document.readyState&&(document.removeEventListener("readystatechange",e),Jw())})):Jw());const MT=globalThis.AFRAME={AComponent:Vw,AEntity:h_,ANode:r_,ANIME:Re,AScene:v_,components:Bw,coreComponents:Object.keys(Bw),geometries:C_,registerComponent:Ww,registerGeometry:M_,registerPrimitive:D_,registerShader:F_,registerSystem:e_,primitives:{getMeshMixin:mT,primitives:L_},scenes:rw,schema:p,shaders:U_,systems:Zw,emitReady:Jw,THREE:Wb,utils:d,version:W_}})(),i.default})()));
 | 
						|
//# sourceMappingURL=aframe-master.min.js.map(()=>{if(AFRAME.registerGeometry("prism",{schema:{depth:{default:1,min:0},height:{default:1,min:0},width:{default:1,min:0}},init:function(t){const i=new THREE.Shape;i.moveTo(t.width/2,0),i.lineTo(0,t.height),i.lineTo(-t.width/2,0),i.lineTo(t.width/2,0);const e={steps:2,depth:t.depth,bevelEnabled:!1};this.geometry=new THREE.ExtrudeGeometry(i,e)}}),"undefined"==typeof AFRAME)throw new Error("Component attempted to register before AFRAME was available.");AFRAME.registerComponent("blink-controls",{schema:{button:{default:"",oneOf:["trackpad","trigger","grip","menu","thumbstick"]},startEvents:{type:"array",default:[]},endEvents:{type:"array",default:[]},cancelEvents:{type:"array",default:[]},collisionEntities:{default:""},hitEntity:{type:"selector"},cameraRig:{type:"selector",default:"#player"},teleportOrigin:{type:"selector",default:"#camera"},hitCylinderColor:{type:"color",default:"#4d93fd"},hitCylinderRadius:{default:.25,min:0},hitCylinderHeight:{default:.3,min:0},interval:{default:0},curveNumberPoints:{default:60,min:2},curveLineWidth:{default:.025},curveHitColor:{type:"color",default:"#4d93fd"},curveMissColor:{type:"color",default:"#ff0000"},curveShootingSpeed:{default:10,min:0},defaultPlaneSize:{default:100},landingNormal:{type:"vec3",default:{x:0,y:1,z:0}},landingMaxAngle:{default:"45",min:0,max:360},drawIncrementally:{default:!0},incrementalDrawMs:{default:300},missOpacity:{default:.8},hitOpacity:{default:.8},snapTurn:{default:!0},rotateOnTeleport:{default:!0}},init:function(){const t=this.data,i=this.el;let e;this.active=!1,this.obj=i.object3D,this.controllerPosition=new THREE.Vector3,this.hitEntityQuaternion=new THREE.Quaternion,this.teleportOriginQuaternion=new THREE.Quaternion,this.hitPoint=new THREE.Vector3,this.collisionObjectNormalMatrix=new THREE.Matrix3,this.collisionWorldNormal=new THREE.Vector3,this.rigWorldPosition=new THREE.Vector3,this.newRigWorldPosition=new THREE.Vector3,this.teleportEventDetail={oldPosition:this.rigWorldPosition,newPosition:this.newRigWorldPosition,hitPoint:this.hitPoint,rotationQuaternion:this.hitEntityQuaternion},this.hit=!1,this.prevCheckTime=void 0,this.referenceNormal=new THREE.Vector3,this.curveMissColor=new THREE.Color,this.curveHitColor=new THREE.Color,this.raycaster=new THREE.Raycaster,this.defaultPlane=this.createDefaultPlane(this.data.defaultPlaneSize),this.defaultCollisionMeshes=[this.defaultPlane];const n=this.teleportEntity=document.createElement("a-entity");if(n.classList.add("teleportRay"),n.setAttribute("visible",!1),i.sceneEl.appendChild(this.teleportEntity),this.onButtonDown=this.onButtonDown.bind(this),this.onButtonUp=this.onButtonUp.bind(this),this.cancel=this.cancel.bind(this),this.handleThumbstickAxis=this.handleThumbstickAxis.bind(this),this.teleportOrigin=this.data.teleportOrigin,this.cameraRig=this.data.cameraRig,this.snapturnRotation=THREE.MathUtils.degToRad(45),this.canSnapturn=!0,this.addedEvents=[],this.data.startEvents.length&&this.data.endEvents.length){for(e=0;e<this.data.startEvents.length;e++)this.addedEvents.push([this.data.startEvents[e],this.onButtonDown]),i.addEventListener(this.data.startEvents[e],this.onButtonDown);for(e=0;e<this.data.endEvents.length;e++)this.addedEvents.push([this.data.endEvents[e],this.onButtonUp]),i.addEventListener(this.data.endEvents[e],this.onButtonUp)}else t.button?(this.addedEvents.push([t.button+"down",this.onButtonDown]),this.addedEvents.push([t.button+"up",this.onButtonUp]),i.addEventListener(t.button+"down",this.onButtonDown),i.addEventListener(t.button+"up",this.onButtonUp)):this.thumbstickAxisActivation=!0;for(e=0;e<this.data.cancelEvents.length;e++)this.addedEvents.push([this.data.cancelEvents[e],this.cancel]),i.addEventListener(this.data.cancelEvents[e],this.cancel);this.addedEvents.push(["thumbstickmoved",this.handleThumbstickAxis]),i.addEventListener("thumbstickmoved",this.handleThumbstickAxis),this.queryCollisionEntities()},handleSnapturn:function(t,i){i<.5&&(this.canSnapturn=!0),this.canSnapturn&&i>.95&&(Math.abs(t-Math.PI/2)<.6?(this.cameraRig.object3D.rotateY(+this.snapturnRotation),this.canSnapturn=!1):Math.abs(t-1.5*Math.PI)<.6&&(this.cameraRig.object3D.rotateY(-this.snapturnRotation),this.canSnapturn=!1))},handleThumbstickAxis:function(t){if(void 0!==t.detail.x&&void 0!==t.detail.y){const i=Math.atan2(t.detail.x,t.detail.y)+Math.PI,e=Math.sqrt(t.detail.x**2+t.detail.y**2);this.active?(e>.95&&(this.obj.getWorldPosition(this.controllerPosition),this.controllerPosition.setComponent(1,this.hitEntity.object3D.position.y),this.hitEntity.object3D.visible=!1,this.hitEntity.object3D.lookAt(this.controllerPosition),this.hitEntity.object3D.rotateY(i),this.hitEntity.object3D.visible=!0,this.hitEntity.object3D.getWorldQuaternion(this.hitEntityQuaternion)),0===Math.abs(t.detail.x)&&0===Math.abs(t.detail.y)&&this.onButtonUp()):this.thumbstickAxisActivation&&e>.95&&(i<.5||i>5.78)?this.onButtonDown():this.data.snapTurn&&this.handleSnapturn(i,e)}},update:function(t){const i=this.data,e=AFRAME.utils.diff(i,t);this.referenceNormal.copy(i.landingNormal),this.curveMissColor.set(i.curveMissColor),this.curveHitColor.set(i.curveHitColor),(!this.line||"curveLineWidth"in e||"curveNumberPoints"in e||"type"in e)&&(this.line=this.createLine(i),this.line.material.opacity=this.data.hitOpacity,this.line.material.transparent=this.data.hitOpacity<1,this.numActivePoints=i.curveNumberPoints,this.teleportEntity.setObject3D("mesh",this.line.mesh)),i.hitEntity?this.hitEntity=i.hitEntity:(!this.hitEntity||"hitCylinderColor"in e||"hitCylinderHeight"in e||"hitCylinderRadius"in e)&&(this.hitEntity&&this.hitEntity.parentNode.removeChild(this.hitEntity),this.hitEntity=this.createHitEntity(i),this.el.sceneEl.appendChild(this.hitEntity)),this.hitEntity.setAttribute("visible",!1),i.hitEntity||this.hitEntity.lastElementChild.setAttribute("visible",i.rotateOnTeleport),"collisionEntities"in e&&this.queryCollisionEntities()},remove:function(){const t=this.el,i=this.hitEntity,e=this.teleportEntity;i&&i.parentNode.removeChild(i),e&&e.parentNode.removeChild(e),t.sceneEl.removeEventListener("child-attached",this.childAttachHandler),t.sceneEl.removeEventListener("child-detached",this.childDetachHandler);for(const[i,e]of this.addedEvents)t.removeEventListener(i,e)},tick:function(){const t=new THREE.Vector3,i=new THREE.Vector3,e=new THREE.Vector3(0,-9.8,0),n=new THREE.Vector3,s=new THREE.Vector3,o=new THREE.Quaternion,r=new THREE.Vector3,a=new THREE.Vector3,h=new THREE.Vector3,l=new THREE.Vector3,c=new THREE.Vector3;let d=0;return function(u,E){if(!this.active)return;if(this.data.drawIncrementally&&this.redrawLine&&(this.redrawLine=!1,d=0),d+=E,this.numActivePoints=this.data.curveNumberPoints*d/this.data.incrementalDrawMs,this.numActivePoints>this.data.curveNumberPoints&&(this.numActivePoints=this.data.curveNumberPoints),this.prevCheckTime&&u-this.prevCheckTime<this.data.interval)return;this.prevCheckTime=u;this.obj.matrixWorld.decompose(r,o,a);const p=h.set(0,0,-1).applyQuaternion(o).normalize();this.line.setDirection(c.copy(p)),this.obj.getWorldPosition(t),s.copy(t),this.teleportEntity.setAttribute("visible",!0),d<this.data.incrementalDrawMs?this.line.material.color.set(this.curveHitColor):this.line.material.color.set(this.curveMissColor),this.line.material.opacity=this.data.missOpacity,this.line.material.transparent=this.data.missOpacity<1,this.hitEntity.setAttribute("visible",!1),this.hit=!1,i.copy(p).multiplyScalar(this.data.curveShootingSpeed),this.lastDrawnIndex=0;const A=this.data.drawIncrementally?this.numActivePoints:this.line.numPoints;for(let o=0;o<A+1;o++){let r;r=o===Math.floor(A+1)?A/(this.line.numPoints-1):o/(this.line.numPoints-1);const a=this.parabolicCurveMaxRoot(t,i,e);r*=Math.max(1,1.5*a),this.parabolicCurve(t,i,e,r,n);const h=l.copy(n).sub(s).normalize();if(this.raycaster.far=h.length(),this.raycaster.set(s,h),this.lastDrawnPoint=n,this.lastDrawnIndex=o,this.checkMeshCollisions(o,s,n))break;s.copy(n)}for(let t=this.lastDrawnIndex+1;t<this.line.numPoints;t++)this.line.setPoint(t,this.lastDrawnPoint,this.lastDrawnPoint)}}(),queryCollisionEntities:function(){const t=this.data,i=this.el;if(!t.collisionEntities)return void(this.collisionEntities=[]);const e=[].slice.call(i.sceneEl.querySelectorAll(t.collisionEntities));this.collisionEntities=e,this.childAttachHandler=function(i){i.detail.el.matches(t.collisionEntities)&&e.push(i.detail.el)},i.sceneEl.addEventListener("child-attached",this.childAttachHandler),this.childDetachHandler=function(i){if(!i.detail.el.matches(t.collisionEntities))return;const n=e.indexOf(i.detail.el);-1!==n&&e.splice(n,1)},i.sceneEl.addEventListener("child-detached",this.childDetachHandler)},onButtonDown:function(){this.active=!0,this.redrawLine=!0},onButtonUp:function(){const t=new THREE.Vector3,i=[new THREE.Vector3,new THREE.Vector3],e=new THREE.Vector3;return function(n){if(!this.active)return;if(this.active=!1,this.hitEntity.setAttribute("visible",!1),this.teleportEntity.setAttribute("visible",!1),!this.hit)return;const s=this.data.cameraRig||this.el.sceneEl.camera.el;if(s.object3D.getWorldPosition(this.rigWorldPosition),this.newRigWorldPosition.copy(this.hitPoint),t.copy(this.newRigWorldPosition),s.object3D.parent&&s.object3D.parent.worldToLocal(t),s.setAttribute("position",t),this.data.rotateOnTeleport&&(this.teleportOriginQuaternion.setFromEuler(new THREE.Euler(0,this.teleportOrigin.object3D.rotation.y,0)),this.teleportOriginQuaternion.invert(),this.teleportOriginQuaternion.multiply(this.hitEntityQuaternion),this.cameraRig.object3D.setRotationFromQuaternion(this.teleportOriginQuaternion)),!this.data.cameraRig){const t=document.querySelectorAll("a-entity[tracked-controls]");for(let n=0;n<t.length;n++)t[n].object3D.getWorldPosition(e),i[n].copy(this.newRigWorldPosition).sub(this.rigWorldPosition).add(e),t[n].setAttribute("position",i[n])}this.el.emit("teleported",this.teleportEventDetail)}}(),cancel:function(){this.active=!1,this.hitEntity.setAttribute("visible",!1),this.teleportEntity.setAttribute("visible",!1)},checkMeshCollisions:function(t,i,e){let n;this.data.collisionEntities?(n=this.collisionEntities.map((function(t){return t.getObject3D("mesh")})).filter((function(t){return t})),n=n.length?n:this.defaultCollisionMeshes):n=this.defaultCollisionMeshes;const s=this.raycaster.intersectObjects(n,!0);if(s.length>0&&!this.hit&&this.isValidNormalsAngle(s[0].face.normal,s[0].object)){const e=s[0].point;this.line.material.color.set(this.curveHitColor),this.line.material.opacity=this.data.hitOpacity,this.line.material.transparent=this.data.hitOpacity<1,this.hitEntity.setAttribute("position",e),this.hitEntity.setAttribute("visible",!0),this.hit=!0,this.hitPoint.copy(s[0].point);for(let e=t;e<this.line.numPoints;e++)this.line.setPoint(e,i,this.hitPoint);return!0}return this.line.setPoint(t,i,e),!1},isValidNormalsAngle:function(t,i){this.collisionObjectNormalMatrix.getNormalMatrix(i.matrixWorld),this.collisionWorldNormal.copy(t).applyMatrix3(this.collisionObjectNormalMatrix).normalize();const e=this.referenceNormal.angleTo(this.collisionWorldNormal);return THREE.MathUtils.RAD2DEG*e<=this.data.landingMaxAngle},parabolicCurveScalar:function(t,i,e,n){return t+i*n+.5*e*n*n},parabolicCurve:function(t,i,e,n,s){return s.x=this.parabolicCurveScalar(t.x,i.x,e.x,n),s.y=this.parabolicCurveScalar(t.y,i.y,e.y,n),s.z=this.parabolicCurveScalar(t.z,i.z,e.z,n),s},parabolicCurveMaxRoot:function(t,i,e){return(-i.y-Math.sqrt(i.y**2-.5*e.y*4*t.y))/(1*e.y)},createLine:function(t){const i="line"===t.type?2:t.curveNumberPoints;return new AFRAME.utils.RayCurve(i,t.curveLineWidth)},createHitEntity:function(t){const i=document.createElement("a-entity");i.className="hitEntity";const e=document.createElement("a-entity");e.setAttribute("geometry",{primitive:"torus",radius:t.hitCylinderRadius,radiusTubular:.01}),e.setAttribute("rotation",{x:90,y:0,z:0}),e.setAttribute("material",{shader:"flat",color:t.hitCylinderColor,side:"double",depthTest:!1}),i.appendChild(e);const n=document.createElement("a-entity");n.setAttribute("position",{x:0,y:t.hitCylinderHeight/2,z:0}),n.setAttribute("geometry",{primitive:"cylinder",segmentsHeight:1,radius:t.hitCylinderRadius,height:t.hitCylinderHeight,openEnded:!0}),n.setAttribute("material",{shader:"flat",color:t.hitCylinderColor,opacity:.5,side:"double",src:this.cylinderTexture,transparent:!0,depthTest:!1}),i.appendChild(n);const s=document.createElement("a-entity");return s.setAttribute("position",{x:0,y:.05,z:-1.5*t.hitCylinderRadius}),s.setAttribute("rotation",{x:90,y:180,z:0}),s.setAttribute("geometry",{primitive:"prism",height:.2,width:.2,depth:.05}),s.setAttribute("material",{shader:"flat",color:t.hitCylinderColor,side:"double",transparent:!0,opacity:.6,depthTest:!1}),i.appendChild(s),i},createDefaultPlane:function(t){const i=new THREE.PlaneGeometry(100,100);i.rotateX(-Math.PI/2);const e=new THREE.MeshBasicMaterial({color:16776960});return new THREE.Mesh(i,e)},cylinderTexture:"url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAQCAYAAADXnxW3AAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAAADJJREFUeNpEx7ENgDAAAzArK0JA6f8X9oewlcWStU1wBGdwB08wgjeYm79jc2nbYH0DAC/+CORJxO5fAAAAAElFTkSuQmCC)"}),AFRAME.utils.RayCurve=function(t,i){this.geometry=new THREE.BufferGeometry,this.vertices=new Float32Array(3*t*6),this.uvs=new Float32Array(2*t*6),this.width=i,this.geometry.setAttribute("position",new THREE.BufferAttribute(this.vertices,3).setUsage(THREE.DynamicDrawUsage)),this.material=new THREE.MeshBasicMaterial({side:THREE.DoubleSide,color:16711680}),this.mesh=new THREE.Mesh(this.geometry,this.material),this.mesh.frustumCulled=!1,this.mesh.vertices=this.vertices,this.direction=new THREE.Vector3,this.numPoints=t},AFRAME.utils.RayCurve.prototype={setDirection:function(t){const i=new THREE.Vector3(0,1,0);this.direction.copy(t).cross(i).normalize().multiplyScalar(this.width/2)},setWidth:function(t){this.width=t},setPoint:function(){const t=new THREE.Vector3,i=new THREE.Vector3,e=new THREE.Vector3,n=new THREE.Vector3;return function(s,o,r){t.copy(o).add(this.direction),i.copy(o).sub(this.direction),e.copy(r).add(this.direction),n.copy(r).sub(this.direction);let a=18*s;this.vertices[a++]=t.x,this.vertices[a++]=t.y,this.vertices[a++]=t.z,this.vertices[a++]=i.x,this.vertices[a++]=i.y,this.vertices[a++]=i.z,this.vertices[a++]=e.x,this.vertices[a++]=e.y,this.vertices[a++]=e.z,this.vertices[a++]=e.x,this.vertices[a++]=e.y,this.vertices[a++]=e.z,this.vertices[a++]=i.x,this.vertices[a++]=i.y,this.vertices[a++]=i.z,this.vertices[a++]=n.x,this.vertices[a++]=n.y,this.vertices[a++]=n.z,this.geometry.attributes.position.needsUpdate=!0}}()}})();
 | 
						|
//# sourceMappingURL=aframe-blink-controls.min.js.map/*
 | 
						|
 * v0.5.1 generated at Thu May 15 04:48:16 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 04:44:27 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 04:42:42 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 04:41:33 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 04:39:55 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 04:36:55 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 04:33:42 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 04:32:40 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 04:31:40 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 04:30:31 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 04:28:57 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 04:27:48 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 04:26:30 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 04:25:45 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 04:24:54 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 04:23:44 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 04:22:20 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 04:08:38 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 04:05:15 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 03:41:03 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 03:38:12 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 03:38:06 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 03:36:06 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 03:31:30 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 03:30:20 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 03:28:19 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 03:27:57 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 03:27:48 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 03:24:05 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 03:22:16 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 03:11:42 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 03:09:18 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 03:03:50 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 02:57:15 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 02:55:48 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 02:55:46 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 02:51:27 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 02:49:52 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 02:48:51 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 02:48:19 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 02:47:32 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 02:46:44 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 02:46:25 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 02:43:03 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 02:42:36 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 01:45:50 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 01:45:13 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 01:43:59 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 01:42:08 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 01:38:57 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 01:37:40 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 01:35:24 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 01:34:12 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 01:32:54 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 01:32:31 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 01:31:34 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 01:29:22 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 01:28:25 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 01:26:10 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 01:15:44 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 01:14:45 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 01:14:20 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 01:12:10 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 01:11:42 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 01:08:51 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 01:06:18 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 01:05:38 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 01:05:25 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 01:04:05 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 01:03:28 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 01:00:44 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 01:00:16 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 12:58:18 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 12:57:43 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 12:57:03 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 12:55:32 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 12:54:40 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 12:53:12 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 12:52:28 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 12:44:51 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 12:44:13 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 12:43:19 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 12:41:59 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 12:41:14 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 12:40:06 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 12:39:46 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 12:39:35 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 12:37:08 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 12:37:02 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 12:36:16 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 12:35:53 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 12:34:44 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 12:32:59 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 12:31:35 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 12:29:17 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 12:26:56 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 12:25:35 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 12:21:54 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 12:20:45 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 12:17:32 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 12:15:21 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 11:58:48 AM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 11:57:32 AM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu May 15 11:55:38 AM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Wed May 14 07:29:31 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Wed May 14 07:29:00 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Wed May 14 07:14:39 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Wed May 14 07:13:14 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Wed May 14 07:11:15 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Wed May 14 07:09:35 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Wed May 14 07:07:07 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Wed May 14 07:07:02 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Wed May 14 07:05:38 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Wed May 14 07:05:22 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Wed May 14 07:04:12 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Wed May 14 06:58:25 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Wed May 14 06:57:27 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Wed May 14 06:54:09 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Wed May 14 06:46:42 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Wed May 14 06:43:07 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Wed May 14 06:41:07 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Wed May 14 06:24:11 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Wed May 14 05:54:21 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue May 13 09:01:22 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue May 13 08:58:39 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue May 13 08:54:26 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue May 13 08:53:52 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue May 13 08:49:19 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue May 13 08:49:08 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue May 13 08:47:36 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue May 13 08:46:47 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue May 13 08:45:16 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue May 13 08:44:14 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue May 13 08:41:56 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue May 13 08:40:48 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue May 13 08:40:16 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue May 13 08:38:17 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue May 13 08:38:16 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue May 13 08:37:51 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue May 13 08:37:18 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue May 13 07:01:38 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue May 13 11:02:24 AM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue May 13 11:01:36 AM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue May 13 10:59:57 AM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue May 13 10:58:57 AM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue May 13 10:55:24 AM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue May 13 10:54:54 AM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue May 13 10:53:36 AM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue May 13 10:50:46 AM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue May 13 10:50:18 AM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue May 13 10:49:55 AM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue May 13 10:49:10 AM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue May 13 10:46:35 AM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue May 13 10:45:38 AM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue May 13 10:40:35 AM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue May 13 10:29:57 AM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue May 13 10:19:23 AM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue May 13 10:18:25 AM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue May 13 10:18:06 AM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue May 13 10:16:43 AM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue May 13 10:15:40 AM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue May 13 10:14:49 AM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue May 13 10:13:07 AM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue May 13 10:12:25 AM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue May 13 10:10:21 AM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Mon May 12 09:25:46 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Mon May 12 09:25:08 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Mon May 12 09:23:07 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Mon May 12 09:21:49 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Mon May 12 09:20:54 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Mon May 12 09:20:25 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Mon May 12 09:17:05 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Mon May 12 09:15:26 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Mon May 12 05:24:16 PM CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Wed Apr 23 17:57:18 CEST 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Thu Feb 20 17:49:24 CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Feb 18 02:26:59 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Feb 18 02:26:52 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Feb 18 02:24:48 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Feb 18 02:13:55 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Feb 18 02:13:00 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Feb 18 02:11:29 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Feb 18 02:11:17 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Feb 18 02:10:12 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Feb 18 02:09:18 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Feb 18 02:09:14 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Feb 18 02:08:49 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Feb 18 01:45:48 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Feb 18 01:44:49 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Feb 18 01:44:02 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Feb 18 01:41:32 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Feb 18 01:41:12 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Feb 18 01:38:44 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Feb 18 01:38:04 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Feb 18 01:37:29 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Feb 18 01:37:03 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Feb 18 01:35:18 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Feb 18 01:34:36 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Feb 18 01:32:43 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Feb 18 01:31:16 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Feb 18 01:28:06 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Feb 18 01:27:30 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Feb 18 01:26:38 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Feb 18 01:26:22 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Feb 18 12:42:58 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Feb 18 12:42:36 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Feb 18 12:42:01 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Feb 18 12:40:17 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Feb 18 12:40:00 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Feb 18 12:39:15 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Feb 18 12:36:40 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Feb 18 12:36:01 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Feb 18 12:35:39 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Feb 18 12:35:27 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Feb 18 12:34:11 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Feb 18 12:33:54 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Feb 18 12:33:01 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Feb 18 12:32:26 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Feb 18 12:31:49 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Feb 18 12:30:32 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Feb 18 12:28:46 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Feb 18 12:27:27 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Feb 18 12:26:11 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Feb 18 12:25:52 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Feb 18 12:24:18 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Feb 18 12:20:49 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Feb 18 12:07:35 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Feb 11 11:52:02 AM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Feb 11 11:50:30 AM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Feb 11 11:48:23 AM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Feb 11 11:47:08 AM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Feb 11 11:46:37 AM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Feb 11 11:44:59 AM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Feb 11 11:44:48 AM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Feb 11 11:44:30 AM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Feb 11 11:44:14 AM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Feb 11 11:43:32 AM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Feb 11 11:42:47 AM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Feb 11 11:27:52 AM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Mon Feb 10 08:18:55 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Mon Feb 10 08:05:14 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Sun Feb  9 12:52:39 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Wed Jan 15 10:52:05 AM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Wed Jan 15 10:51:41 AM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Wed Jan 15 10:51:31 AM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Wed Jan 15 10:51:15 AM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Wed Jan 15 10:50:01 AM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Wed Jan 15 10:49:22 AM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Wed Jan 15 10:48:58 AM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Wed Jan 15 10:47:50 AM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Wed Jan 15 10:43:55 AM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Wed Jan 15 10:39:36 AM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Wed Jan 15 10:38:56 AM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Wed Jan 15 10:38:18 AM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Wed Jan 15 10:37:32 AM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Wed Jan 15 10:37:04 AM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Wed Jan 15 10:35:19 AM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Wed Jan 15 10:30:49 AM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Wed Jan 15 10:30:17 AM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Wed Jan 15 10:27:52 AM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Wed Jan 15 10:27:22 AM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Wed Jan 15 10:25:57 AM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Wed Jan 15 10:22:36 AM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Wed Jan 15 10:19:46 AM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Wed Jan 15 10:19:21 AM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Wed Jan 15 10:15:58 AM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Wed Jan 15 10:15:30 AM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Wed Jan 15 10:15:28 AM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Jan 14 08:15:04 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Jan 14 08:14:22 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Jan 14 08:13:57 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Jan 14 08:13:42 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Jan 14 08:13:18 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Jan 14 08:12:32 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Jan 14 08:11:05 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Jan 14 08:10:11 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Jan 14 08:07:36 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Jan 14 08:07:12 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Jan 14 08:06:48 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Jan 14 08:06:27 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Jan 14 08:06:11 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Jan 14 08:05:47 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Jan 14 03:35:01 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Jan 14 03:33:48 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Jan 14 03:33:30 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Jan 14 03:33:24 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Jan 14 03:32:59 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Jan 14 03:26:30 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Jan 14 03:26:19 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Jan 14 03:26:05 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Jan 14 03:24:14 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Jan 14 03:23:45 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Jan 14 03:23:27 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Jan 14 03:23:12 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Jan 14 03:22:13 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Jan 14 03:21:51 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Jan 14 03:21:36 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Jan 14 03:20:54 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Jan 14 03:20:39 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Jan 14 03:20:13 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Jan 14 03:19:55 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Jan 14 03:18:34 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Jan 14 03:01:28 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Jan 14 03:00:58 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Jan 14 02:55:26 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Jan 14 02:55:01 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Jan 14 02:54:21 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Jan 14 02:54:04 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Jan 14 02:53:31 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Jan 14 02:52:11 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Jan 14 02:51:59 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Jan 14 02:51:44 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Jan 14 02:51:01 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Jan 14 02:50:51 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Jan 14 02:50:39 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Jan 14 02:49:27 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Jan 14 02:48:13 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Jan 14 02:42:07 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Jan 14 02:41:43 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Jan 14 02:41:25 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Jan 14 02:40:51 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Jan 14 02:39:41 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Jan 14 02:38:52 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Jan 14 02:38:19 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Jan 14 02:37:01 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Jan 14 02:36:19 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Jan 14 02:35:59 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Jan 14 02:35:44 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Jan 14 02:35:28 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Jan 14 02:34:46 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Jan 14 02:32:50 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Jan 14 02:31:07 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Jan 14 02:30:27 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Tue Jan 14 02:24:55 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * v0.5.1 generated at Fri Jan 10 07:51:18 PM CET 2025
 | 
						|
 * https://xrfragment.org
 | 
						|
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 */
 | 
						|
// Generated by Haxe 4.3.6
 | 
						|
var $hx_exports = typeof exports != "undefined" ? exports : typeof window != "undefined" ? window : typeof self != "undefined" ? self : this;
 | 
						|
(function ($global) { "use strict";
 | 
						|
$hx_exports["xrfragment"] = $hx_exports["xrfragment"] || {};
 | 
						|
var $estr = function() { return js_Boot.__string_rec(this,''); },$hxEnums = $hxEnums || {},$_;
 | 
						|
function $extend(from, fields) {
 | 
						|
	var proto = Object.create(from);
 | 
						|
	for (var name in fields) proto[name] = fields[name];
 | 
						|
	if( fields.toString !== Object.prototype.toString ) proto.toString = fields.toString;
 | 
						|
	return proto;
 | 
						|
}
 | 
						|
var EReg = function(r,opt) {
 | 
						|
	this.r = new RegExp(r,opt.split("u").join(""));
 | 
						|
};
 | 
						|
EReg.__name__ = true;
 | 
						|
EReg.prototype = {
 | 
						|
	match: function(s) {
 | 
						|
		if(this.r.global) {
 | 
						|
			this.r.lastIndex = 0;
 | 
						|
		}
 | 
						|
		this.r.m = this.r.exec(s);
 | 
						|
		this.r.s = s;
 | 
						|
		return this.r.m != null;
 | 
						|
	}
 | 
						|
	,matched: function(n) {
 | 
						|
		if(this.r.m != null && n >= 0 && n < this.r.m.length) {
 | 
						|
			return this.r.m[n];
 | 
						|
		} else {
 | 
						|
			throw haxe_Exception.thrown("EReg::matched");
 | 
						|
		}
 | 
						|
	}
 | 
						|
	,matchedRight: function() {
 | 
						|
		if(this.r.m == null) {
 | 
						|
			throw haxe_Exception.thrown("No string matched");
 | 
						|
		}
 | 
						|
		var sz = this.r.m.index + this.r.m[0].length;
 | 
						|
		return HxOverrides.substr(this.r.s,sz,this.r.s.length - sz);
 | 
						|
	}
 | 
						|
	,matchedPos: function() {
 | 
						|
		if(this.r.m == null) {
 | 
						|
			throw haxe_Exception.thrown("No string matched");
 | 
						|
		}
 | 
						|
		return { pos : this.r.m.index, len : this.r.m[0].length};
 | 
						|
	}
 | 
						|
	,split: function(s) {
 | 
						|
		var d = "#__delim__#";
 | 
						|
		return s.replace(this.r,d).split(d);
 | 
						|
	}
 | 
						|
};
 | 
						|
var HxOverrides = function() { };
 | 
						|
HxOverrides.__name__ = true;
 | 
						|
HxOverrides.cca = function(s,index) {
 | 
						|
	var x = s.charCodeAt(index);
 | 
						|
	if(x != x) {
 | 
						|
		return undefined;
 | 
						|
	}
 | 
						|
	return x;
 | 
						|
};
 | 
						|
HxOverrides.substr = function(s,pos,len) {
 | 
						|
	if(len == null) {
 | 
						|
		len = s.length;
 | 
						|
	} else if(len < 0) {
 | 
						|
		if(pos == 0) {
 | 
						|
			len = s.length + len;
 | 
						|
		} else {
 | 
						|
			return "";
 | 
						|
		}
 | 
						|
	}
 | 
						|
	return s.substr(pos,len);
 | 
						|
};
 | 
						|
HxOverrides.now = function() {
 | 
						|
	return Date.now();
 | 
						|
};
 | 
						|
Math.__name__ = true;
 | 
						|
var Reflect = function() { };
 | 
						|
Reflect.__name__ = true;
 | 
						|
Reflect.field = function(o,field) {
 | 
						|
	try {
 | 
						|
		return o[field];
 | 
						|
	} catch( _g ) {
 | 
						|
		return null;
 | 
						|
	}
 | 
						|
};
 | 
						|
Reflect.getProperty = function(o,field) {
 | 
						|
	var tmp;
 | 
						|
	if(o == null) {
 | 
						|
		return null;
 | 
						|
	} else {
 | 
						|
		var tmp1;
 | 
						|
		if(o.__properties__) {
 | 
						|
			tmp = o.__properties__["get_" + field];
 | 
						|
			tmp1 = tmp;
 | 
						|
		} else {
 | 
						|
			tmp1 = false;
 | 
						|
		}
 | 
						|
		if(tmp1) {
 | 
						|
			return o[tmp]();
 | 
						|
		} else {
 | 
						|
			return o[field];
 | 
						|
		}
 | 
						|
	}
 | 
						|
};
 | 
						|
Reflect.fields = function(o) {
 | 
						|
	var a = [];
 | 
						|
	if(o != null) {
 | 
						|
		var hasOwnProperty = Object.prototype.hasOwnProperty;
 | 
						|
		for( var f in o ) {
 | 
						|
		if(f != "__id__" && f != "hx__closures__" && hasOwnProperty.call(o,f)) {
 | 
						|
			a.push(f);
 | 
						|
		}
 | 
						|
		}
 | 
						|
	}
 | 
						|
	return a;
 | 
						|
};
 | 
						|
Reflect.isObject = function(v) {
 | 
						|
	if(v == null) {
 | 
						|
		return false;
 | 
						|
	}
 | 
						|
	var t = typeof(v);
 | 
						|
	if(!(t == "string" || t == "object" && v.__enum__ == null)) {
 | 
						|
		if(t == "function") {
 | 
						|
			return (v.__name__ || v.__ename__) != null;
 | 
						|
		} else {
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
	} else {
 | 
						|
		return true;
 | 
						|
	}
 | 
						|
};
 | 
						|
Reflect.deleteField = function(o,field) {
 | 
						|
	if(!Object.prototype.hasOwnProperty.call(o,field)) {
 | 
						|
		return false;
 | 
						|
	}
 | 
						|
	delete(o[field]);
 | 
						|
	return true;
 | 
						|
};
 | 
						|
Reflect.copy = function(o) {
 | 
						|
	if(o == null) {
 | 
						|
		return null;
 | 
						|
	}
 | 
						|
	var o2 = { };
 | 
						|
	var _g = 0;
 | 
						|
	var _g1 = Reflect.fields(o);
 | 
						|
	while(_g < _g1.length) {
 | 
						|
		var f = _g1[_g];
 | 
						|
		++_g;
 | 
						|
		o2[f] = Reflect.field(o,f);
 | 
						|
	}
 | 
						|
	return o2;
 | 
						|
};
 | 
						|
var Std = function() { };
 | 
						|
Std.__name__ = true;
 | 
						|
Std.string = function(s) {
 | 
						|
	return js_Boot.__string_rec(s,"");
 | 
						|
};
 | 
						|
Std.parseInt = function(x) {
 | 
						|
	var v = parseInt(x);
 | 
						|
	if(isNaN(v)) {
 | 
						|
		return null;
 | 
						|
	}
 | 
						|
	return v;
 | 
						|
};
 | 
						|
var StringBuf = function() {
 | 
						|
	this.b = "";
 | 
						|
};
 | 
						|
StringBuf.__name__ = true;
 | 
						|
var StringTools = function() { };
 | 
						|
StringTools.__name__ = true;
 | 
						|
StringTools.isSpace = function(s,pos) {
 | 
						|
	var c = HxOverrides.cca(s,pos);
 | 
						|
	if(!(c > 8 && c < 14)) {
 | 
						|
		return c == 32;
 | 
						|
	} else {
 | 
						|
		return true;
 | 
						|
	}
 | 
						|
};
 | 
						|
StringTools.ltrim = function(s) {
 | 
						|
	var l = s.length;
 | 
						|
	var r = 0;
 | 
						|
	while(r < l && StringTools.isSpace(s,r)) ++r;
 | 
						|
	if(r > 0) {
 | 
						|
		return HxOverrides.substr(s,r,l - r);
 | 
						|
	} else {
 | 
						|
		return s;
 | 
						|
	}
 | 
						|
};
 | 
						|
StringTools.rtrim = function(s) {
 | 
						|
	var l = s.length;
 | 
						|
	var r = 0;
 | 
						|
	while(r < l && StringTools.isSpace(s,l - r - 1)) ++r;
 | 
						|
	if(r > 0) {
 | 
						|
		return HxOverrides.substr(s,0,l - r);
 | 
						|
	} else {
 | 
						|
		return s;
 | 
						|
	}
 | 
						|
};
 | 
						|
StringTools.trim = function(s) {
 | 
						|
	return StringTools.ltrim(StringTools.rtrim(s));
 | 
						|
};
 | 
						|
StringTools.replace = function(s,sub,by) {
 | 
						|
	return s.split(sub).join(by);
 | 
						|
};
 | 
						|
var haxe_Exception = function(message,previous,native) {
 | 
						|
	Error.call(this,message);
 | 
						|
	this.message = message;
 | 
						|
	this.__previousException = previous;
 | 
						|
	this.__nativeException = native != null ? native : this;
 | 
						|
};
 | 
						|
haxe_Exception.__name__ = true;
 | 
						|
haxe_Exception.caught = function(value) {
 | 
						|
	if(((value) instanceof haxe_Exception)) {
 | 
						|
		return value;
 | 
						|
	} else if(((value) instanceof Error)) {
 | 
						|
		return new haxe_Exception(value.message,null,value);
 | 
						|
	} else {
 | 
						|
		return new haxe_ValueException(value,null,value);
 | 
						|
	}
 | 
						|
};
 | 
						|
haxe_Exception.thrown = function(value) {
 | 
						|
	if(((value) instanceof haxe_Exception)) {
 | 
						|
		return value.get_native();
 | 
						|
	} else if(((value) instanceof Error)) {
 | 
						|
		return value;
 | 
						|
	} else {
 | 
						|
		var e = new haxe_ValueException(value);
 | 
						|
		return e;
 | 
						|
	}
 | 
						|
};
 | 
						|
haxe_Exception.__super__ = Error;
 | 
						|
haxe_Exception.prototype = $extend(Error.prototype,{
 | 
						|
	unwrap: function() {
 | 
						|
		return this.__nativeException;
 | 
						|
	}
 | 
						|
	,get_native: function() {
 | 
						|
		return this.__nativeException;
 | 
						|
	}
 | 
						|
	,__properties__: {get_native:"get_native"}
 | 
						|
});
 | 
						|
var haxe__$Template_TemplateExpr = $hxEnums["haxe._Template.TemplateExpr"] = { __ename__:true,__constructs__:null
 | 
						|
	,OpVar: ($_=function(v) { return {_hx_index:0,v:v,__enum__:"haxe._Template.TemplateExpr",toString:$estr}; },$_._hx_name="OpVar",$_.__params__ = ["v"],$_)
 | 
						|
	,OpExpr: ($_=function(expr) { return {_hx_index:1,expr:expr,__enum__:"haxe._Template.TemplateExpr",toString:$estr}; },$_._hx_name="OpExpr",$_.__params__ = ["expr"],$_)
 | 
						|
	,OpIf: ($_=function(expr,eif,eelse) { return {_hx_index:2,expr:expr,eif:eif,eelse:eelse,__enum__:"haxe._Template.TemplateExpr",toString:$estr}; },$_._hx_name="OpIf",$_.__params__ = ["expr","eif","eelse"],$_)
 | 
						|
	,OpStr: ($_=function(str) { return {_hx_index:3,str:str,__enum__:"haxe._Template.TemplateExpr",toString:$estr}; },$_._hx_name="OpStr",$_.__params__ = ["str"],$_)
 | 
						|
	,OpBlock: ($_=function(l) { return {_hx_index:4,l:l,__enum__:"haxe._Template.TemplateExpr",toString:$estr}; },$_._hx_name="OpBlock",$_.__params__ = ["l"],$_)
 | 
						|
	,OpForeach: ($_=function(expr,loop) { return {_hx_index:5,expr:expr,loop:loop,__enum__:"haxe._Template.TemplateExpr",toString:$estr}; },$_._hx_name="OpForeach",$_.__params__ = ["expr","loop"],$_)
 | 
						|
	,OpMacro: ($_=function(name,params) { return {_hx_index:6,name:name,params:params,__enum__:"haxe._Template.TemplateExpr",toString:$estr}; },$_._hx_name="OpMacro",$_.__params__ = ["name","params"],$_)
 | 
						|
};
 | 
						|
haxe__$Template_TemplateExpr.__constructs__ = [haxe__$Template_TemplateExpr.OpVar,haxe__$Template_TemplateExpr.OpExpr,haxe__$Template_TemplateExpr.OpIf,haxe__$Template_TemplateExpr.OpStr,haxe__$Template_TemplateExpr.OpBlock,haxe__$Template_TemplateExpr.OpForeach,haxe__$Template_TemplateExpr.OpMacro];
 | 
						|
var haxe_iterators_ArrayIterator = function(array) {
 | 
						|
	this.current = 0;
 | 
						|
	this.array = array;
 | 
						|
};
 | 
						|
haxe_iterators_ArrayIterator.__name__ = true;
 | 
						|
haxe_iterators_ArrayIterator.prototype = {
 | 
						|
	hasNext: function() {
 | 
						|
		return this.current < this.array.length;
 | 
						|
	}
 | 
						|
	,next: function() {
 | 
						|
		return this.array[this.current++];
 | 
						|
	}
 | 
						|
};
 | 
						|
var haxe_Template = function(str) {
 | 
						|
	var tokens = this.parseTokens(str);
 | 
						|
	this.expr = this.parseBlock(tokens);
 | 
						|
	if(!tokens.isEmpty()) {
 | 
						|
		throw haxe_Exception.thrown("Unexpected '" + Std.string(tokens.first().s) + "'");
 | 
						|
	}
 | 
						|
};
 | 
						|
haxe_Template.__name__ = true;
 | 
						|
haxe_Template.prototype = {
 | 
						|
	execute: function(context,macros) {
 | 
						|
		this.macros = macros == null ? { } : macros;
 | 
						|
		this.context = context;
 | 
						|
		this.stack = new haxe_ds_List();
 | 
						|
		this.buf = new StringBuf();
 | 
						|
		this.run(this.expr);
 | 
						|
		return this.buf.b;
 | 
						|
	}
 | 
						|
	,resolve: function(v) {
 | 
						|
		if(v == "__current__") {
 | 
						|
			return this.context;
 | 
						|
		}
 | 
						|
		if(Reflect.isObject(this.context)) {
 | 
						|
			var value = Reflect.getProperty(this.context,v);
 | 
						|
			if(value != null || Object.prototype.hasOwnProperty.call(this.context,v)) {
 | 
						|
				return value;
 | 
						|
			}
 | 
						|
		}
 | 
						|
		var _g_head = this.stack.h;
 | 
						|
		while(_g_head != null) {
 | 
						|
			var val = _g_head.item;
 | 
						|
			_g_head = _g_head.next;
 | 
						|
			var ctx = val;
 | 
						|
			var value = Reflect.getProperty(ctx,v);
 | 
						|
			if(value != null || Object.prototype.hasOwnProperty.call(ctx,v)) {
 | 
						|
				return value;
 | 
						|
			}
 | 
						|
		}
 | 
						|
		return Reflect.field(haxe_Template.globals,v);
 | 
						|
	}
 | 
						|
	,parseTokens: function(data) {
 | 
						|
		var tokens = new haxe_ds_List();
 | 
						|
		while(haxe_Template.splitter.match(data)) {
 | 
						|
			var p = haxe_Template.splitter.matchedPos();
 | 
						|
			if(p.pos > 0) {
 | 
						|
				tokens.add({ p : HxOverrides.substr(data,0,p.pos), s : true, l : null});
 | 
						|
			}
 | 
						|
			if(HxOverrides.cca(data,p.pos) == 58) {
 | 
						|
				tokens.add({ p : HxOverrides.substr(data,p.pos + 2,p.len - 4), s : false, l : null});
 | 
						|
				data = haxe_Template.splitter.matchedRight();
 | 
						|
				continue;
 | 
						|
			}
 | 
						|
			var parp = p.pos + p.len;
 | 
						|
			var npar = 1;
 | 
						|
			var params = [];
 | 
						|
			var part = "";
 | 
						|
			while(true) {
 | 
						|
				var c = HxOverrides.cca(data,parp);
 | 
						|
				++parp;
 | 
						|
				if(c == 40) {
 | 
						|
					++npar;
 | 
						|
				} else if(c == 41) {
 | 
						|
					--npar;
 | 
						|
					if(npar <= 0) {
 | 
						|
						break;
 | 
						|
					}
 | 
						|
				} else if(c == null) {
 | 
						|
					throw haxe_Exception.thrown("Unclosed macro parenthesis");
 | 
						|
				}
 | 
						|
				if(c == 44 && npar == 1) {
 | 
						|
					params.push(part);
 | 
						|
					part = "";
 | 
						|
				} else {
 | 
						|
					part += String.fromCodePoint(c);
 | 
						|
				}
 | 
						|
			}
 | 
						|
			params.push(part);
 | 
						|
			tokens.add({ p : haxe_Template.splitter.matched(2), s : false, l : params});
 | 
						|
			data = HxOverrides.substr(data,parp,data.length - parp);
 | 
						|
		}
 | 
						|
		if(data.length > 0) {
 | 
						|
			tokens.add({ p : data, s : true, l : null});
 | 
						|
		}
 | 
						|
		return tokens;
 | 
						|
	}
 | 
						|
	,parseBlock: function(tokens) {
 | 
						|
		var l = new haxe_ds_List();
 | 
						|
		while(true) {
 | 
						|
			var t = tokens.first();
 | 
						|
			if(t == null) {
 | 
						|
				break;
 | 
						|
			}
 | 
						|
			if(!t.s && (t.p == "end" || t.p == "else" || HxOverrides.substr(t.p,0,7) == "elseif ")) {
 | 
						|
				break;
 | 
						|
			}
 | 
						|
			l.add(this.parse(tokens));
 | 
						|
		}
 | 
						|
		if(l.length == 1) {
 | 
						|
			return l.first();
 | 
						|
		}
 | 
						|
		return haxe__$Template_TemplateExpr.OpBlock(l);
 | 
						|
	}
 | 
						|
	,parse: function(tokens) {
 | 
						|
		var t = tokens.pop();
 | 
						|
		var p = t.p;
 | 
						|
		if(t.s) {
 | 
						|
			return haxe__$Template_TemplateExpr.OpStr(p);
 | 
						|
		}
 | 
						|
		if(t.l != null) {
 | 
						|
			var pe = new haxe_ds_List();
 | 
						|
			var _g = 0;
 | 
						|
			var _g1 = t.l;
 | 
						|
			while(_g < _g1.length) {
 | 
						|
				var p1 = _g1[_g];
 | 
						|
				++_g;
 | 
						|
				pe.add(this.parseBlock(this.parseTokens(p1)));
 | 
						|
			}
 | 
						|
			return haxe__$Template_TemplateExpr.OpMacro(p,pe);
 | 
						|
		}
 | 
						|
		var kwdEnd = function(kwd) {
 | 
						|
			var pos = -1;
 | 
						|
			var length = kwd.length;
 | 
						|
			if(HxOverrides.substr(p,0,length) == kwd) {
 | 
						|
				pos = length;
 | 
						|
				var _g_offset = 0;
 | 
						|
				var _g_s = HxOverrides.substr(p,length,null);
 | 
						|
				while(_g_offset < _g_s.length) {
 | 
						|
					var c = _g_s.charCodeAt(_g_offset++);
 | 
						|
					if(c == 32) {
 | 
						|
						++pos;
 | 
						|
					} else {
 | 
						|
						break;
 | 
						|
					}
 | 
						|
				}
 | 
						|
			}
 | 
						|
			return pos;
 | 
						|
		};
 | 
						|
		var pos = kwdEnd("if");
 | 
						|
		if(pos > 0) {
 | 
						|
			p = HxOverrides.substr(p,pos,p.length - pos);
 | 
						|
			var e = this.parseExpr(p);
 | 
						|
			var eif = this.parseBlock(tokens);
 | 
						|
			var t = tokens.first();
 | 
						|
			var eelse;
 | 
						|
			if(t == null) {
 | 
						|
				throw haxe_Exception.thrown("Unclosed 'if'");
 | 
						|
			}
 | 
						|
			if(t.p == "end") {
 | 
						|
				tokens.pop();
 | 
						|
				eelse = null;
 | 
						|
			} else if(t.p == "else") {
 | 
						|
				tokens.pop();
 | 
						|
				eelse = this.parseBlock(tokens);
 | 
						|
				t = tokens.pop();
 | 
						|
				if(t == null || t.p != "end") {
 | 
						|
					throw haxe_Exception.thrown("Unclosed 'else'");
 | 
						|
				}
 | 
						|
			} else {
 | 
						|
				t.p = HxOverrides.substr(t.p,4,t.p.length - 4);
 | 
						|
				eelse = this.parse(tokens);
 | 
						|
			}
 | 
						|
			return haxe__$Template_TemplateExpr.OpIf(e,eif,eelse);
 | 
						|
		}
 | 
						|
		var pos = kwdEnd("foreach");
 | 
						|
		if(pos >= 0) {
 | 
						|
			p = HxOverrides.substr(p,pos,p.length - pos);
 | 
						|
			var e = this.parseExpr(p);
 | 
						|
			var efor = this.parseBlock(tokens);
 | 
						|
			var t = tokens.pop();
 | 
						|
			if(t == null || t.p != "end") {
 | 
						|
				throw haxe_Exception.thrown("Unclosed 'foreach'");
 | 
						|
			}
 | 
						|
			return haxe__$Template_TemplateExpr.OpForeach(e,efor);
 | 
						|
		}
 | 
						|
		if(haxe_Template.expr_splitter.match(p)) {
 | 
						|
			return haxe__$Template_TemplateExpr.OpExpr(this.parseExpr(p));
 | 
						|
		}
 | 
						|
		return haxe__$Template_TemplateExpr.OpVar(p);
 | 
						|
	}
 | 
						|
	,parseExpr: function(data) {
 | 
						|
		var l = new haxe_ds_List();
 | 
						|
		var expr = data;
 | 
						|
		while(haxe_Template.expr_splitter.match(data)) {
 | 
						|
			var p = haxe_Template.expr_splitter.matchedPos();
 | 
						|
			var k = p.pos + p.len;
 | 
						|
			if(p.pos != 0) {
 | 
						|
				l.add({ p : HxOverrides.substr(data,0,p.pos), s : true});
 | 
						|
			}
 | 
						|
			var p1 = haxe_Template.expr_splitter.matched(0);
 | 
						|
			l.add({ p : p1, s : p1.indexOf("\"") >= 0});
 | 
						|
			data = haxe_Template.expr_splitter.matchedRight();
 | 
						|
		}
 | 
						|
		if(data.length != 0) {
 | 
						|
			var _g_offset = 0;
 | 
						|
			var _g_s = data;
 | 
						|
			while(_g_offset < _g_s.length) {
 | 
						|
				var _g_key = _g_offset;
 | 
						|
				var _g_value = _g_s.charCodeAt(_g_offset++);
 | 
						|
				var i = _g_key;
 | 
						|
				var c = _g_value;
 | 
						|
				if(c != 32) {
 | 
						|
					l.add({ p : HxOverrides.substr(data,i,null), s : true});
 | 
						|
					break;
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
		var e;
 | 
						|
		try {
 | 
						|
			e = this.makeExpr(l);
 | 
						|
			if(!l.isEmpty()) {
 | 
						|
				throw haxe_Exception.thrown(l.first().p);
 | 
						|
			}
 | 
						|
		} catch( _g ) {
 | 
						|
			var _g1 = haxe_Exception.caught(_g).unwrap();
 | 
						|
			if(typeof(_g1) == "string") {
 | 
						|
				var s = _g1;
 | 
						|
				throw haxe_Exception.thrown("Unexpected '" + s + "' in " + expr);
 | 
						|
			} else {
 | 
						|
				throw _g;
 | 
						|
			}
 | 
						|
		}
 | 
						|
		return function() {
 | 
						|
			try {
 | 
						|
				return e();
 | 
						|
			} catch( _g ) {
 | 
						|
				var exc = haxe_Exception.caught(_g).unwrap();
 | 
						|
				throw haxe_Exception.thrown("Error : " + Std.string(exc) + " in " + expr);
 | 
						|
			}
 | 
						|
		};
 | 
						|
	}
 | 
						|
	,makeConst: function(v) {
 | 
						|
		haxe_Template.expr_trim.match(v);
 | 
						|
		v = haxe_Template.expr_trim.matched(1);
 | 
						|
		if(HxOverrides.cca(v,0) == 34) {
 | 
						|
			var str = HxOverrides.substr(v,1,v.length - 2);
 | 
						|
			return function() {
 | 
						|
				return str;
 | 
						|
			};
 | 
						|
		}
 | 
						|
		if(haxe_Template.expr_int.match(v)) {
 | 
						|
			var i = Std.parseInt(v);
 | 
						|
			return function() {
 | 
						|
				return i;
 | 
						|
			};
 | 
						|
		}
 | 
						|
		if(haxe_Template.expr_float.match(v)) {
 | 
						|
			var f = parseFloat(v);
 | 
						|
			return function() {
 | 
						|
				return f;
 | 
						|
			};
 | 
						|
		}
 | 
						|
		var me = this;
 | 
						|
		return function() {
 | 
						|
			return me.resolve(v);
 | 
						|
		};
 | 
						|
	}
 | 
						|
	,makePath: function(e,l) {
 | 
						|
		var p = l.first();
 | 
						|
		if(p == null || p.p != ".") {
 | 
						|
			return e;
 | 
						|
		}
 | 
						|
		l.pop();
 | 
						|
		var field = l.pop();
 | 
						|
		if(field == null || !field.s) {
 | 
						|
			throw haxe_Exception.thrown(field.p);
 | 
						|
		}
 | 
						|
		var f = field.p;
 | 
						|
		haxe_Template.expr_trim.match(f);
 | 
						|
		f = haxe_Template.expr_trim.matched(1);
 | 
						|
		return this.makePath(function() {
 | 
						|
			return Reflect.field(e(),f);
 | 
						|
		},l);
 | 
						|
	}
 | 
						|
	,makeExpr: function(l) {
 | 
						|
		return this.makePath(this.makeExpr2(l),l);
 | 
						|
	}
 | 
						|
	,skipSpaces: function(l) {
 | 
						|
		var p = l.first();
 | 
						|
		while(p != null) {
 | 
						|
			var _g_offset = 0;
 | 
						|
			var _g_s = p.p;
 | 
						|
			while(_g_offset < _g_s.length) {
 | 
						|
				var c = _g_s.charCodeAt(_g_offset++);
 | 
						|
				if(c != 32) {
 | 
						|
					return;
 | 
						|
				}
 | 
						|
			}
 | 
						|
			l.pop();
 | 
						|
			p = l.first();
 | 
						|
		}
 | 
						|
	}
 | 
						|
	,makeExpr2: function(l) {
 | 
						|
		this.skipSpaces(l);
 | 
						|
		var p = l.pop();
 | 
						|
		this.skipSpaces(l);
 | 
						|
		if(p == null) {
 | 
						|
			throw haxe_Exception.thrown("<eof>");
 | 
						|
		}
 | 
						|
		if(p.s) {
 | 
						|
			return this.makeConst(p.p);
 | 
						|
		}
 | 
						|
		switch(p.p) {
 | 
						|
		case "!":
 | 
						|
			var e = this.makeExpr(l);
 | 
						|
			return function() {
 | 
						|
				var v = e();
 | 
						|
				if(v != null) {
 | 
						|
					return v == false;
 | 
						|
				} else {
 | 
						|
					return true;
 | 
						|
				}
 | 
						|
			};
 | 
						|
		case "(":
 | 
						|
			this.skipSpaces(l);
 | 
						|
			var e1 = this.makeExpr(l);
 | 
						|
			this.skipSpaces(l);
 | 
						|
			var p1 = l.pop();
 | 
						|
			if(p1 == null || p1.s) {
 | 
						|
				throw haxe_Exception.thrown(p1);
 | 
						|
			}
 | 
						|
			if(p1.p == ")") {
 | 
						|
				return e1;
 | 
						|
			}
 | 
						|
			this.skipSpaces(l);
 | 
						|
			var e2 = this.makeExpr(l);
 | 
						|
			this.skipSpaces(l);
 | 
						|
			var p2 = l.pop();
 | 
						|
			this.skipSpaces(l);
 | 
						|
			if(p2 == null || p2.p != ")") {
 | 
						|
				throw haxe_Exception.thrown(p2);
 | 
						|
			}
 | 
						|
			switch(p1.p) {
 | 
						|
			case "!=":
 | 
						|
				return function() {
 | 
						|
					return e1() != e2();
 | 
						|
				};
 | 
						|
			case "&&":
 | 
						|
				return function() {
 | 
						|
					return e1() && e2();
 | 
						|
				};
 | 
						|
			case "*":
 | 
						|
				return function() {
 | 
						|
					return e1() * e2();
 | 
						|
				};
 | 
						|
			case "+":
 | 
						|
				return function() {
 | 
						|
					return e1() + e2();
 | 
						|
				};
 | 
						|
			case "-":
 | 
						|
				return function() {
 | 
						|
					return e1() - e2();
 | 
						|
				};
 | 
						|
			case "/":
 | 
						|
				return function() {
 | 
						|
					return e1() / e2();
 | 
						|
				};
 | 
						|
			case "<":
 | 
						|
				return function() {
 | 
						|
					return e1() < e2();
 | 
						|
				};
 | 
						|
			case "<=":
 | 
						|
				return function() {
 | 
						|
					return e1() <= e2();
 | 
						|
				};
 | 
						|
			case "==":
 | 
						|
				return function() {
 | 
						|
					return e1() == e2();
 | 
						|
				};
 | 
						|
			case ">":
 | 
						|
				return function() {
 | 
						|
					return e1() > e2();
 | 
						|
				};
 | 
						|
			case ">=":
 | 
						|
				return function() {
 | 
						|
					return e1() >= e2();
 | 
						|
				};
 | 
						|
			case "||":
 | 
						|
				return function() {
 | 
						|
					return e1() || e2();
 | 
						|
				};
 | 
						|
			default:
 | 
						|
				throw haxe_Exception.thrown("Unknown operation " + p1.p);
 | 
						|
			}
 | 
						|
			break;
 | 
						|
		case "-":
 | 
						|
			var e3 = this.makeExpr(l);
 | 
						|
			return function() {
 | 
						|
				return -e3();
 | 
						|
			};
 | 
						|
		}
 | 
						|
		throw haxe_Exception.thrown(p.p);
 | 
						|
	}
 | 
						|
	,run: function(e) {
 | 
						|
		switch(e._hx_index) {
 | 
						|
		case 0:
 | 
						|
			var v = e.v;
 | 
						|
			var _this = this.buf;
 | 
						|
			var x = Std.string(this.resolve(v));
 | 
						|
			_this.b += Std.string(x);
 | 
						|
			break;
 | 
						|
		case 1:
 | 
						|
			var e1 = e.expr;
 | 
						|
			var _this = this.buf;
 | 
						|
			var x = Std.string(e1());
 | 
						|
			_this.b += Std.string(x);
 | 
						|
			break;
 | 
						|
		case 2:
 | 
						|
			var e1 = e.expr;
 | 
						|
			var eif = e.eif;
 | 
						|
			var eelse = e.eelse;
 | 
						|
			var v = e1();
 | 
						|
			if(v == null || v == false) {
 | 
						|
				if(eelse != null) {
 | 
						|
					this.run(eelse);
 | 
						|
				}
 | 
						|
			} else {
 | 
						|
				this.run(eif);
 | 
						|
			}
 | 
						|
			break;
 | 
						|
		case 3:
 | 
						|
			var str = e.str;
 | 
						|
			this.buf.b += str == null ? "null" : "" + str;
 | 
						|
			break;
 | 
						|
		case 4:
 | 
						|
			var l = e.l;
 | 
						|
			var _g_head = l.h;
 | 
						|
			while(_g_head != null) {
 | 
						|
				var val = _g_head.item;
 | 
						|
				_g_head = _g_head.next;
 | 
						|
				var e1 = val;
 | 
						|
				this.run(e1);
 | 
						|
			}
 | 
						|
			break;
 | 
						|
		case 5:
 | 
						|
			var e1 = e.expr;
 | 
						|
			var loop = e.loop;
 | 
						|
			var v = e1();
 | 
						|
			try {
 | 
						|
				var x = $getIterator(v);
 | 
						|
				if(x.hasNext == null) {
 | 
						|
					throw haxe_Exception.thrown(null);
 | 
						|
				}
 | 
						|
				v = x;
 | 
						|
			} catch( _g ) {
 | 
						|
				try {
 | 
						|
					if(v.hasNext == null) {
 | 
						|
						throw haxe_Exception.thrown(null);
 | 
						|
					}
 | 
						|
				} catch( _g1 ) {
 | 
						|
					throw haxe_Exception.thrown("Cannot iter on " + Std.string(v));
 | 
						|
				}
 | 
						|
			}
 | 
						|
			this.stack.push(this.context);
 | 
						|
			var v1 = v;
 | 
						|
			var ctx = v1;
 | 
						|
			while(ctx.hasNext()) {
 | 
						|
				var ctx1 = ctx.next();
 | 
						|
				this.context = ctx1;
 | 
						|
				this.run(loop);
 | 
						|
			}
 | 
						|
			this.context = this.stack.pop();
 | 
						|
			break;
 | 
						|
		case 6:
 | 
						|
			var m = e.name;
 | 
						|
			var params = e.params;
 | 
						|
			var v = Reflect.field(this.macros,m);
 | 
						|
			var pl = [];
 | 
						|
			var old = this.buf;
 | 
						|
			pl.push($bind(this,this.resolve));
 | 
						|
			var _g_head = params.h;
 | 
						|
			while(_g_head != null) {
 | 
						|
				var val = _g_head.item;
 | 
						|
				_g_head = _g_head.next;
 | 
						|
				var p = val;
 | 
						|
				if(p._hx_index == 0) {
 | 
						|
					var v1 = p.v;
 | 
						|
					pl.push(this.resolve(v1));
 | 
						|
				} else {
 | 
						|
					this.buf = new StringBuf();
 | 
						|
					this.run(p);
 | 
						|
					pl.push(this.buf.b);
 | 
						|
				}
 | 
						|
			}
 | 
						|
			this.buf = old;
 | 
						|
			try {
 | 
						|
				var _this = this.buf;
 | 
						|
				var x = Std.string(v.apply(this.macros,pl));
 | 
						|
				_this.b += Std.string(x);
 | 
						|
			} catch( _g ) {
 | 
						|
				var e = haxe_Exception.caught(_g).unwrap();
 | 
						|
				var plstr;
 | 
						|
				try {
 | 
						|
					plstr = pl.join(",");
 | 
						|
				} catch( _g1 ) {
 | 
						|
					plstr = "???";
 | 
						|
				}
 | 
						|
				var msg = "Macro call " + m + "(" + plstr + ") failed (" + Std.string(e) + ")";
 | 
						|
				throw haxe_Exception.thrown(msg);
 | 
						|
			}
 | 
						|
			break;
 | 
						|
		}
 | 
						|
	}
 | 
						|
};
 | 
						|
var haxe_ValueException = function(value,previous,native) {
 | 
						|
	haxe_Exception.call(this,String(value),previous,native);
 | 
						|
	this.value = value;
 | 
						|
};
 | 
						|
haxe_ValueException.__name__ = true;
 | 
						|
haxe_ValueException.__super__ = haxe_Exception;
 | 
						|
haxe_ValueException.prototype = $extend(haxe_Exception.prototype,{
 | 
						|
	unwrap: function() {
 | 
						|
		return this.value;
 | 
						|
	}
 | 
						|
});
 | 
						|
var haxe_ds_List = function() {
 | 
						|
	this.length = 0;
 | 
						|
};
 | 
						|
haxe_ds_List.__name__ = true;
 | 
						|
haxe_ds_List.prototype = {
 | 
						|
	add: function(item) {
 | 
						|
		var x = new haxe_ds__$List_ListNode(item,null);
 | 
						|
		if(this.h == null) {
 | 
						|
			this.h = x;
 | 
						|
		} else {
 | 
						|
			this.q.next = x;
 | 
						|
		}
 | 
						|
		this.q = x;
 | 
						|
		this.length++;
 | 
						|
	}
 | 
						|
	,push: function(item) {
 | 
						|
		var x = new haxe_ds__$List_ListNode(item,this.h);
 | 
						|
		this.h = x;
 | 
						|
		if(this.q == null) {
 | 
						|
			this.q = x;
 | 
						|
		}
 | 
						|
		this.length++;
 | 
						|
	}
 | 
						|
	,first: function() {
 | 
						|
		if(this.h == null) {
 | 
						|
			return null;
 | 
						|
		} else {
 | 
						|
			return this.h.item;
 | 
						|
		}
 | 
						|
	}
 | 
						|
	,pop: function() {
 | 
						|
		if(this.h == null) {
 | 
						|
			return null;
 | 
						|
		}
 | 
						|
		var x = this.h.item;
 | 
						|
		this.h = this.h.next;
 | 
						|
		if(this.h == null) {
 | 
						|
			this.q = null;
 | 
						|
		}
 | 
						|
		this.length--;
 | 
						|
		return x;
 | 
						|
	}
 | 
						|
	,isEmpty: function() {
 | 
						|
		return this.h == null;
 | 
						|
	}
 | 
						|
	,toString: function() {
 | 
						|
		var s_b = "";
 | 
						|
		var first = true;
 | 
						|
		var l = this.h;
 | 
						|
		s_b += "{";
 | 
						|
		while(l != null) {
 | 
						|
			if(first) {
 | 
						|
				first = false;
 | 
						|
			} else {
 | 
						|
				s_b += ", ";
 | 
						|
			}
 | 
						|
			s_b += Std.string(Std.string(l.item));
 | 
						|
			l = l.next;
 | 
						|
		}
 | 
						|
		s_b += "}";
 | 
						|
		return s_b;
 | 
						|
	}
 | 
						|
};
 | 
						|
var haxe_ds__$List_ListNode = function(item,next) {
 | 
						|
	this.item = item;
 | 
						|
	this.next = next;
 | 
						|
};
 | 
						|
haxe_ds__$List_ListNode.__name__ = true;
 | 
						|
var js_Boot = function() { };
 | 
						|
js_Boot.__name__ = true;
 | 
						|
js_Boot.__string_rec = function(o,s) {
 | 
						|
	if(o == null) {
 | 
						|
		return "null";
 | 
						|
	}
 | 
						|
	if(s.length >= 5) {
 | 
						|
		return "<...>";
 | 
						|
	}
 | 
						|
	var t = typeof(o);
 | 
						|
	if(t == "function" && (o.__name__ || o.__ename__)) {
 | 
						|
		t = "object";
 | 
						|
	}
 | 
						|
	switch(t) {
 | 
						|
	case "function":
 | 
						|
		return "<function>";
 | 
						|
	case "object":
 | 
						|
		if(o.__enum__) {
 | 
						|
			var e = $hxEnums[o.__enum__];
 | 
						|
			var con = e.__constructs__[o._hx_index];
 | 
						|
			var n = con._hx_name;
 | 
						|
			if(con.__params__) {
 | 
						|
				s = s + "\t";
 | 
						|
				return n + "(" + ((function($this) {
 | 
						|
					var $r;
 | 
						|
					var _g = [];
 | 
						|
					{
 | 
						|
						var _g1 = 0;
 | 
						|
						var _g2 = con.__params__;
 | 
						|
						while(true) {
 | 
						|
							if(!(_g1 < _g2.length)) {
 | 
						|
								break;
 | 
						|
							}
 | 
						|
							var p = _g2[_g1];
 | 
						|
							_g1 = _g1 + 1;
 | 
						|
							_g.push(js_Boot.__string_rec(o[p],s));
 | 
						|
						}
 | 
						|
					}
 | 
						|
					$r = _g;
 | 
						|
					return $r;
 | 
						|
				}(this))).join(",") + ")";
 | 
						|
			} else {
 | 
						|
				return n;
 | 
						|
			}
 | 
						|
		}
 | 
						|
		if(((o) instanceof Array)) {
 | 
						|
			var str = "[";
 | 
						|
			s += "\t";
 | 
						|
			var _g = 0;
 | 
						|
			var _g1 = o.length;
 | 
						|
			while(_g < _g1) {
 | 
						|
				var i = _g++;
 | 
						|
				str += (i > 0 ? "," : "") + js_Boot.__string_rec(o[i],s);
 | 
						|
			}
 | 
						|
			str += "]";
 | 
						|
			return str;
 | 
						|
		}
 | 
						|
		var tostr;
 | 
						|
		try {
 | 
						|
			tostr = o.toString;
 | 
						|
		} catch( _g ) {
 | 
						|
			return "???";
 | 
						|
		}
 | 
						|
		if(tostr != null && tostr != Object.toString && typeof(tostr) == "function") {
 | 
						|
			var s2 = o.toString();
 | 
						|
			if(s2 != "[object Object]") {
 | 
						|
				return s2;
 | 
						|
			}
 | 
						|
		}
 | 
						|
		var str = "{\n";
 | 
						|
		s += "\t";
 | 
						|
		var hasp = o.hasOwnProperty != null;
 | 
						|
		var k = null;
 | 
						|
		for( k in o ) {
 | 
						|
		if(hasp && !o.hasOwnProperty(k)) {
 | 
						|
			continue;
 | 
						|
		}
 | 
						|
		if(k == "prototype" || k == "__class__" || k == "__super__" || k == "__interfaces__" || k == "__properties__") {
 | 
						|
			continue;
 | 
						|
		}
 | 
						|
		if(str.length != 2) {
 | 
						|
			str += ", \n";
 | 
						|
		}
 | 
						|
		str += s + k + " : " + js_Boot.__string_rec(o[k],s);
 | 
						|
		}
 | 
						|
		s = s.substring(1);
 | 
						|
		str += "\n" + s + "}";
 | 
						|
		return str;
 | 
						|
	case "string":
 | 
						|
		return o;
 | 
						|
	default:
 | 
						|
		return String(o);
 | 
						|
	}
 | 
						|
};
 | 
						|
var xrfragment_Filter = $hx_exports["xrfragment"]["Filter"] = function(str) {
 | 
						|
	this.q = { };
 | 
						|
	this.str = "";
 | 
						|
	if(str != null) {
 | 
						|
		this.parse(str);
 | 
						|
	}
 | 
						|
};
 | 
						|
xrfragment_Filter.__name__ = true;
 | 
						|
xrfragment_Filter.prototype = {
 | 
						|
	toObject: function() {
 | 
						|
		return Reflect.copy(this.q);
 | 
						|
	}
 | 
						|
	,get: function() {
 | 
						|
		return Reflect.copy(this.q);
 | 
						|
	}
 | 
						|
	,parse: function(str) {
 | 
						|
		var token = str.split(" ");
 | 
						|
		var q = { };
 | 
						|
		var process = function(str,prefix) {
 | 
						|
			if(prefix == null) {
 | 
						|
				prefix = "";
 | 
						|
			}
 | 
						|
			str = StringTools.trim(str);
 | 
						|
			var k = str.split("=")[0];
 | 
						|
			var v = str.split("=")[1];
 | 
						|
			var filter = { };
 | 
						|
			if(q[prefix + k]) {
 | 
						|
				filter = q[prefix + k];
 | 
						|
			}
 | 
						|
			if(xrfragment_XRF.isProp.match(str)) {
 | 
						|
				var oper = "";
 | 
						|
				if(str.indexOf(">") != -1) {
 | 
						|
					oper = ">";
 | 
						|
				}
 | 
						|
				if(str.indexOf("<") != -1) {
 | 
						|
					oper = "<";
 | 
						|
				}
 | 
						|
				if(xrfragment_XRF.isExclude.match(k)) {
 | 
						|
					k = HxOverrides.substr(k,1,null);
 | 
						|
				}
 | 
						|
				v = HxOverrides.substr(v,oper.length,null);
 | 
						|
				if(oper.length == 0) {
 | 
						|
					oper = "=";
 | 
						|
				}
 | 
						|
				var rule = { };
 | 
						|
				if(xrfragment_XRF.isNumber.match(v)) {
 | 
						|
					rule[oper] = parseFloat(v);
 | 
						|
				} else {
 | 
						|
					rule[oper] = v;
 | 
						|
				}
 | 
						|
				q["expr"] = rule;
 | 
						|
			}
 | 
						|
			var value = xrfragment_XRF.isDeep.match(str) ? k.split("*").length - 1 : 0;
 | 
						|
			q["deep"] = value;
 | 
						|
			var value = xrfragment_XRF.isExclude.match(str) ? false : true;
 | 
						|
			q["show"] = value;
 | 
						|
			var value = k.replace(xrfragment_XRF.operators.r,"");
 | 
						|
			q["key"] = value;
 | 
						|
			q["value"] = v;
 | 
						|
		};
 | 
						|
		var _g = 0;
 | 
						|
		var _g1 = token.length;
 | 
						|
		while(_g < _g1) {
 | 
						|
			var i = _g++;
 | 
						|
			process(token[i]);
 | 
						|
		}
 | 
						|
		return this.q = q;
 | 
						|
	}
 | 
						|
	,test: function(obj) {
 | 
						|
		var qualify = false;
 | 
						|
		var _g = 0;
 | 
						|
		var _g1 = Reflect.fields(obj);
 | 
						|
		while(_g < _g1.length) {
 | 
						|
			var k = _g1[_g];
 | 
						|
			++_g;
 | 
						|
			var v = Std.string(Reflect.field(obj,k));
 | 
						|
			if(this.testProperty(k,v)) {
 | 
						|
				qualify = true;
 | 
						|
			}
 | 
						|
		}
 | 
						|
		var _g = 0;
 | 
						|
		var _g1 = Reflect.fields(obj);
 | 
						|
		while(_g < _g1.length) {
 | 
						|
			var k = _g1[_g];
 | 
						|
			++_g;
 | 
						|
			var v = Std.string(Reflect.field(obj,k));
 | 
						|
			if(this.testProperty(k,v,true)) {
 | 
						|
				qualify = false;
 | 
						|
			}
 | 
						|
		}
 | 
						|
		return qualify;
 | 
						|
	}
 | 
						|
	,testProperty: function(property,value,exclude) {
 | 
						|
		var conds = 0;
 | 
						|
		var fails = 0;
 | 
						|
		var qualify = 0;
 | 
						|
		var testprop = function(expr) {
 | 
						|
			conds += 1;
 | 
						|
			fails += expr ? 0 : 1;
 | 
						|
			return expr;
 | 
						|
		};
 | 
						|
		if(this.q[value] != null) {
 | 
						|
			var v = this.q[value];
 | 
						|
			if(v[property] != null) {
 | 
						|
				return v[property];
 | 
						|
			}
 | 
						|
		}
 | 
						|
		if(Reflect.field(this.q,"expr")) {
 | 
						|
			var f = Reflect.field(this.q,"expr");
 | 
						|
			if(!Reflect.field(this.q,"show")) {
 | 
						|
				if(Reflect.field(f,"!=") != null && testprop((value == null ? "null" : "" + value) == Std.string(Reflect.field(f,"!="))) && exclude) {
 | 
						|
					++qualify;
 | 
						|
				}
 | 
						|
			} else {
 | 
						|
				if(Reflect.field(f,"*") != null && testprop(parseFloat(value) != null)) {
 | 
						|
					++qualify;
 | 
						|
				}
 | 
						|
				if(Reflect.field(f,">") != null && testprop(parseFloat(value) >= parseFloat(Reflect.field(f,">")))) {
 | 
						|
					++qualify;
 | 
						|
				}
 | 
						|
				if(Reflect.field(f,"<") != null && testprop(parseFloat(value) <= parseFloat(Reflect.field(f,"<")))) {
 | 
						|
					++qualify;
 | 
						|
				}
 | 
						|
				if(Reflect.field(f,"=") != null && (testprop(value == Reflect.field(f,"=")) || testprop(parseFloat(value) == parseFloat(Reflect.field(f,"="))))) {
 | 
						|
					++qualify;
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
		return qualify > 0;
 | 
						|
	}
 | 
						|
};
 | 
						|
var xrfragment_Parser = $hx_exports["xrfragment"]["Parser"] = function() { };
 | 
						|
xrfragment_Parser.__name__ = true;
 | 
						|
xrfragment_Parser.parse = function(key,value,store,index) {
 | 
						|
	var Frag_h = Object.create(null);
 | 
						|
	Frag_h["#"] = xrfragment_XRF.IMMUTABLE | xrfragment_XRF.T_PREDEFINED_VIEW | xrfragment_XRF.PV_EXECUTE;
 | 
						|
	Frag_h["src"] = xrfragment_XRF.T_URL;
 | 
						|
	Frag_h["href"] = xrfragment_XRF.T_URL | xrfragment_XRF.T_PREDEFINED_VIEW;
 | 
						|
	Frag_h["tag"] = xrfragment_XRF.IMMUTABLE | xrfragment_XRF.T_STRING;
 | 
						|
	Frag_h["pos"] = xrfragment_XRF.PV_OVERRIDE | xrfragment_XRF.T_VECTOR3 | xrfragment_XRF.T_STRING | xrfragment_XRF.METADATA | xrfragment_XRF.NAVIGATOR;
 | 
						|
	Frag_h["rot"] = xrfragment_XRF.QUERY_OPERATOR | xrfragment_XRF.PV_OVERRIDE | xrfragment_XRF.T_VECTOR3 | xrfragment_XRF.METADATA | xrfragment_XRF.NAVIGATOR;
 | 
						|
	Frag_h["t"] = xrfragment_XRF.PV_OVERRIDE | xrfragment_XRF.T_FLOAT | xrfragment_XRF.T_VECTOR2 | xrfragment_XRF.NAVIGATOR | xrfragment_XRF.METADATA;
 | 
						|
	Frag_h["s"] = xrfragment_XRF.PV_OVERRIDE | xrfragment_XRF.T_MEDIAFRAG;
 | 
						|
	Frag_h["loop"] = xrfragment_XRF.PV_OVERRIDE | xrfragment_XRF.T_PREDEFINED_VIEW;
 | 
						|
	Frag_h["uv"] = xrfragment_XRF.T_VECTOR2 | xrfragment_XRF.T_MEDIAFRAG;
 | 
						|
	Frag_h["namespace"] = xrfragment_XRF.IMMUTABLE | xrfragment_XRF.T_STRING;
 | 
						|
	Frag_h["SPDX"] = xrfragment_XRF.IMMUTABLE | xrfragment_XRF.T_STRING;
 | 
						|
	Frag_h["unit"] = xrfragment_XRF.IMMUTABLE | xrfragment_XRF.T_STRING;
 | 
						|
	Frag_h["description"] = xrfragment_XRF.IMMUTABLE | xrfragment_XRF.T_STRING;
 | 
						|
	var keyStripped = key.replace(xrfragment_XRF.operators.r,"");
 | 
						|
	var isPVDynamic = key.length > 0 && !Object.prototype.hasOwnProperty.call(Frag_h,key);
 | 
						|
	if(isPVDynamic) {
 | 
						|
		var v = new xrfragment_XRF(key,xrfragment_XRF.PV_EXECUTE | xrfragment_XRF.NAVIGATOR,index);
 | 
						|
		v.validate(value);
 | 
						|
		v.flags = xrfragment_XRF.set(xrfragment_XRF.T_DYNAMICKEY,v.flags);
 | 
						|
		if(!Object.prototype.hasOwnProperty.call(Frag_h,key)) {
 | 
						|
			v.flags = xrfragment_XRF.set(xrfragment_XRF.CUSTOMFRAG,v.flags);
 | 
						|
		}
 | 
						|
		if(value.length == 0) {
 | 
						|
			v.flags = xrfragment_XRF.set(xrfragment_XRF.T_DYNAMICKEYVALUE,v.flags);
 | 
						|
		}
 | 
						|
		store[keyStripped] = v;
 | 
						|
		return true;
 | 
						|
	}
 | 
						|
	var v = new xrfragment_XRF(key,Frag_h[key],index);
 | 
						|
	if(Object.prototype.hasOwnProperty.call(Frag_h,key)) {
 | 
						|
		if(!v.validate(value)) {
 | 
						|
			console.log("src/xrfragment/Parser.hx:67:","⚠ fragment '" + key + "' has incompatible value (" + value + ")");
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
		store[keyStripped] = v;
 | 
						|
		if(xrfragment_Parser.debug) {
 | 
						|
			console.log("src/xrfragment/Parser.hx:71:","✔ " + key + ": " + v.string);
 | 
						|
		}
 | 
						|
	} else {
 | 
						|
		if(typeof(value) == "string") {
 | 
						|
			v.guessType(v,value);
 | 
						|
		}
 | 
						|
		v.flags = xrfragment_XRF.set(xrfragment_XRF.CUSTOMFRAG,v.flags);
 | 
						|
		store[keyStripped] = v;
 | 
						|
	}
 | 
						|
	return true;
 | 
						|
};
 | 
						|
xrfragment_Parser.getMetaData = function() {
 | 
						|
	var meta = { title : ["title","og:title","dc.title"], description : ["aria-description","og:description","dc.description"], author : ["author","dc.creator"], publisher : ["publisher","dc.publisher"], website : ["og:site_name","og:url","dc.publisher"], license : ["SPDX","dc.rights"]};
 | 
						|
	return meta;
 | 
						|
};
 | 
						|
var xrfragment_URI = $hx_exports["xrfragment"]["URI"] = function() {
 | 
						|
	this.XRF = { };
 | 
						|
	this.hash = { };
 | 
						|
	this.fragment = "";
 | 
						|
};
 | 
						|
xrfragment_URI.__name__ = true;
 | 
						|
xrfragment_URI.parseFragment = function(url,filter) {
 | 
						|
	var store = { };
 | 
						|
	if(url == null || url.indexOf("#") == -1) {
 | 
						|
		return store;
 | 
						|
	}
 | 
						|
	var fragment = url.split("#");
 | 
						|
	var splitArray = fragment[1].split("&");
 | 
						|
	var _g = 0;
 | 
						|
	var _g1 = splitArray.length;
 | 
						|
	while(_g < _g1) {
 | 
						|
		var i = _g++;
 | 
						|
		var splitByEqual = splitArray[i].split("=");
 | 
						|
		var regexPlus = new EReg("\\+","g");
 | 
						|
		var key = splitByEqual[0];
 | 
						|
		var value = "";
 | 
						|
		if(splitByEqual.length > 1) {
 | 
						|
			if(xrfragment_XRF.isVector.match(splitByEqual[1])) {
 | 
						|
				value = splitByEqual[1];
 | 
						|
			} else {
 | 
						|
				var s = regexPlus.split(splitByEqual[1]).join(" ");
 | 
						|
				value = decodeURIComponent(s.split("+").join(" "));
 | 
						|
			}
 | 
						|
		}
 | 
						|
		var ok = xrfragment_Parser.parse(key,value,store,i);
 | 
						|
	}
 | 
						|
	if(filter != null && filter != 0) {
 | 
						|
		var _g = 0;
 | 
						|
		var _g1 = Reflect.fields(store);
 | 
						|
		while(_g < _g1.length) {
 | 
						|
			var key = _g1[_g];
 | 
						|
			++_g;
 | 
						|
			var xrf = store[key];
 | 
						|
			if(!xrf.is(filter)) {
 | 
						|
				Reflect.deleteField(store,key);
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
	return store;
 | 
						|
};
 | 
						|
xrfragment_URI.template = function(uri,vars) {
 | 
						|
	var parts = uri.split("#");
 | 
						|
	if(parts.length == 1) {
 | 
						|
		return uri;
 | 
						|
	}
 | 
						|
	var frag = parts[1];
 | 
						|
	frag = StringTools.replace(frag,"{","::");
 | 
						|
	frag = StringTools.replace(frag,"}","::");
 | 
						|
	frag = new haxe_Template(frag).execute(vars);
 | 
						|
	frag = StringTools.replace(frag,"null","");
 | 
						|
	parts[1] = frag;
 | 
						|
	return parts.join("#");
 | 
						|
};
 | 
						|
xrfragment_URI.parse = function(stringUrl,flags) {
 | 
						|
	var r = new EReg("^(?:(?![^:@]+:[^:@/]*@)([^:/?#.]+):)?(?://)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:/?#]*)(?::(\\d*))?)(((/(?:[^?#](?![^?#/]*\\.[^?#/.]+(?:[?#]|$)))*/?)?([^?#/]*))(?:\\?([^#]*))?(?:#(.*))?)","");
 | 
						|
	if(stringUrl.indexOf("://") == -1 && stringUrl.charAt(0) != "/" && stringUrl.charAt(0) != "#") {
 | 
						|
		stringUrl = "/" + stringUrl;
 | 
						|
	}
 | 
						|
	r.match(stringUrl);
 | 
						|
	var url = new xrfragment_URI();
 | 
						|
	var _g = 0;
 | 
						|
	var _g1 = xrfragment_URI._parts.length;
 | 
						|
	while(_g < _g1) {
 | 
						|
		var i = _g++;
 | 
						|
		url[xrfragment_URI._parts[i]] = r.matched(i);
 | 
						|
	}
 | 
						|
	if(xrfragment_URI.isRelative(url) == true) {
 | 
						|
		if(url.directory == null && url.host != null) {
 | 
						|
			url.file = url.host;
 | 
						|
		}
 | 
						|
		url.host = "";
 | 
						|
	}
 | 
						|
	url.hash = { };
 | 
						|
	if(url.fragment != null && url.fragment.length > 0) {
 | 
						|
		url.XRF = xrfragment_URI.parseFragment("#" + url.fragment,flags);
 | 
						|
		var key;
 | 
						|
		var _g = 0;
 | 
						|
		var _g1 = Reflect.fields(url.XRF);
 | 
						|
		while(_g < _g1.length) {
 | 
						|
			var key = _g1[_g];
 | 
						|
			++_g;
 | 
						|
			var v = url.XRF[key];
 | 
						|
			url.hash[key] = v["string"];
 | 
						|
		}
 | 
						|
	}
 | 
						|
	xrfragment_URI.computeVars(url);
 | 
						|
	return url;
 | 
						|
};
 | 
						|
xrfragment_URI.computeVars = function(url) {
 | 
						|
	var r_r = new RegExp("//","g".split("u").join(""));
 | 
						|
	if(url.directory != null && url.directory.indexOf("//") != -1) {
 | 
						|
		url.directory = url.directory.replace(r_r,"/");
 | 
						|
	}
 | 
						|
	if(url.path != null && url.path.indexOf("//") != -1) {
 | 
						|
		url.path = url.path.replace(r_r,"/");
 | 
						|
	}
 | 
						|
	if(url.file != null && url.file.indexOf("//") != -1) {
 | 
						|
		url.file = url.file.replace(r_r,"/");
 | 
						|
	}
 | 
						|
	url.URN = url.scheme + "://" + url.host;
 | 
						|
	if(url.port != null) {
 | 
						|
		url.URN += ":" + url.port;
 | 
						|
	}
 | 
						|
	url.URN += url.directory;
 | 
						|
	if(url.file != null) {
 | 
						|
		var parts = url.file.split(".");
 | 
						|
		if(parts.length > 1) {
 | 
						|
			url.fileExt = parts.pop();
 | 
						|
		}
 | 
						|
	}
 | 
						|
};
 | 
						|
xrfragment_URI.toString = function(url) {
 | 
						|
	var result = "";
 | 
						|
	if(url.scheme != null) {
 | 
						|
		result += url.scheme + "://";
 | 
						|
	}
 | 
						|
	if(url.user != null) {
 | 
						|
		result += url.user + ":";
 | 
						|
	}
 | 
						|
	if(url.password != null) {
 | 
						|
		result += url.password + "@";
 | 
						|
	}
 | 
						|
	if(url.host != null) {
 | 
						|
		result += url.host;
 | 
						|
	}
 | 
						|
	if(url.port != null) {
 | 
						|
		result += ":" + url.port;
 | 
						|
	}
 | 
						|
	if(url.directory != null) {
 | 
						|
		result += url.directory;
 | 
						|
	}
 | 
						|
	if(url.file != null) {
 | 
						|
		result += url.file;
 | 
						|
	}
 | 
						|
	if(url.query != null) {
 | 
						|
		result += "?" + url.query;
 | 
						|
	}
 | 
						|
	if(url.fragment != null) {
 | 
						|
		result += "#" + url.fragment;
 | 
						|
	}
 | 
						|
	return result;
 | 
						|
};
 | 
						|
xrfragment_URI.appendURI = function(url,appendedURI) {
 | 
						|
	if(xrfragment_URI.isRelative(url) == true) {
 | 
						|
		return xrfragment_URI.appendToRelativeURI(url,appendedURI);
 | 
						|
	} else {
 | 
						|
		return xrfragment_URI.appendToAbsoluteURI(url,appendedURI);
 | 
						|
	}
 | 
						|
};
 | 
						|
xrfragment_URI.isRelative = function(url) {
 | 
						|
	return url.scheme == null;
 | 
						|
};
 | 
						|
xrfragment_URI.appendToRelativeURI = function(url,appendedURI) {
 | 
						|
	if(url.directory == null || url.host == null) {
 | 
						|
		return xrfragment_URI.cloneURI(appendedURI);
 | 
						|
	}
 | 
						|
	var resultURI = new xrfragment_URI();
 | 
						|
	resultURI.host = url.host;
 | 
						|
	resultURI.directory = url.directory;
 | 
						|
	if(appendedURI.host != null) {
 | 
						|
		resultURI.directory += appendedURI.host;
 | 
						|
	}
 | 
						|
	if(appendedURI.directory != null) {
 | 
						|
		var directory = appendedURI.directory;
 | 
						|
		if(appendedURI.host == null) {
 | 
						|
			resultURI.directory += HxOverrides.substr(directory,1,null);
 | 
						|
		} else {
 | 
						|
			resultURI.directory += directory;
 | 
						|
		}
 | 
						|
	}
 | 
						|
	if(appendedURI.file != null) {
 | 
						|
		resultURI.file = appendedURI.file;
 | 
						|
	}
 | 
						|
	resultURI.path = resultURI.directory + resultURI.file;
 | 
						|
	if(appendedURI.query != null) {
 | 
						|
		resultURI.query = appendedURI.query;
 | 
						|
	}
 | 
						|
	if(appendedURI.fragment != null) {
 | 
						|
		resultURI.fragment = appendedURI.fragment;
 | 
						|
	}
 | 
						|
	return resultURI;
 | 
						|
};
 | 
						|
xrfragment_URI.appendToAbsoluteURI = function(url,appendedURI) {
 | 
						|
	var resultURI = new xrfragment_URI();
 | 
						|
	if(url.scheme != null) {
 | 
						|
		resultURI.scheme = url.scheme;
 | 
						|
	}
 | 
						|
	if(url.host != null) {
 | 
						|
		resultURI.host = url.host;
 | 
						|
	}
 | 
						|
	var directory = "";
 | 
						|
	if(url.directory != null) {
 | 
						|
		directory = url.directory;
 | 
						|
	}
 | 
						|
	if(appendedURI.host != null) {
 | 
						|
		appendedURI.directory += appendedURI.host;
 | 
						|
	}
 | 
						|
	if(appendedURI.directory != null) {
 | 
						|
		directory += appendedURI.directory;
 | 
						|
	}
 | 
						|
	resultURI.directory = directory;
 | 
						|
	if(appendedURI.file != null) {
 | 
						|
		resultURI.file = appendedURI.file;
 | 
						|
	}
 | 
						|
	resultURI.path = resultURI.directory + resultURI.file;
 | 
						|
	if(appendedURI.query != null) {
 | 
						|
		resultURI.query = appendedURI.query;
 | 
						|
	}
 | 
						|
	if(appendedURI.fragment != null) {
 | 
						|
		resultURI.fragment = appendedURI.fragment;
 | 
						|
	}
 | 
						|
	return resultURI;
 | 
						|
};
 | 
						|
xrfragment_URI.toAbsolute = function(url,newUrl) {
 | 
						|
	var newURI = xrfragment_URI.parse(newUrl,0);
 | 
						|
	var resultURI = new xrfragment_URI();
 | 
						|
	resultURI.port = url.port;
 | 
						|
	resultURI.source = newUrl;
 | 
						|
	if(newURI.scheme != null) {
 | 
						|
		resultURI.scheme = newURI.scheme;
 | 
						|
	} else {
 | 
						|
		resultURI.scheme = url.scheme;
 | 
						|
	}
 | 
						|
	if(newURI.host != null && newURI.host.length > 0) {
 | 
						|
		resultURI.host = newURI.host;
 | 
						|
		resultURI.port = null;
 | 
						|
		resultURI.fragment = null;
 | 
						|
		resultURI.hash = { };
 | 
						|
		resultURI.XRF = { };
 | 
						|
		if(newURI.port != null) {
 | 
						|
			resultURI.port = newURI.port;
 | 
						|
		}
 | 
						|
	} else {
 | 
						|
		resultURI.host = url.host;
 | 
						|
	}
 | 
						|
	var directory = "";
 | 
						|
	if(url.directory != null) {
 | 
						|
		directory = url.directory;
 | 
						|
	}
 | 
						|
	if(newURI.directory != null && newURI.source.charAt(0) != "#" && newURI.directory.length > 0) {
 | 
						|
		if(newUrl.charAt(0) != "/" && newUrl.indexOf("://") == -1) {
 | 
						|
			var stripRelative_r = new RegExp("\\./.*","".split("u").join(""));
 | 
						|
			directory = directory.replace(stripRelative_r,"");
 | 
						|
			directory += newURI.directory;
 | 
						|
		} else {
 | 
						|
			directory = newURI.directory;
 | 
						|
		}
 | 
						|
	}
 | 
						|
	resultURI.directory = directory;
 | 
						|
	if(newURI.file != null && newURI.file.length > 0) {
 | 
						|
		resultURI.file = newURI.file;
 | 
						|
	} else {
 | 
						|
		resultURI.file = url.file;
 | 
						|
	}
 | 
						|
	resultURI.path = resultURI.directory + resultURI.file;
 | 
						|
	if(newURI.query != null) {
 | 
						|
		resultURI.query = newURI.query;
 | 
						|
	}
 | 
						|
	if(newURI.fragment != null) {
 | 
						|
		resultURI.fragment = newURI.fragment;
 | 
						|
	}
 | 
						|
	resultURI.hash = newURI.hash;
 | 
						|
	resultURI.XRF = newURI.XRF;
 | 
						|
	xrfragment_URI.computeVars(resultURI);
 | 
						|
	return resultURI;
 | 
						|
};
 | 
						|
xrfragment_URI.cloneURI = function(url) {
 | 
						|
	var clonedURI = new xrfragment_URI();
 | 
						|
	clonedURI.url = url.url;
 | 
						|
	clonedURI.source = url.source;
 | 
						|
	clonedURI.scheme = url.scheme;
 | 
						|
	clonedURI.authority = url.authority;
 | 
						|
	clonedURI.userInfo = url.userInfo;
 | 
						|
	clonedURI.password = url.password;
 | 
						|
	clonedURI.host = url.host;
 | 
						|
	clonedURI.port = url.port;
 | 
						|
	clonedURI.relative = url.relative;
 | 
						|
	clonedURI.path = url.path;
 | 
						|
	clonedURI.directory = url.directory;
 | 
						|
	clonedURI.file = url.file;
 | 
						|
	clonedURI.query = url.query;
 | 
						|
	clonedURI.fragment = url.fragment;
 | 
						|
	return clonedURI;
 | 
						|
};
 | 
						|
var xrfragment_XRF = $hx_exports["xrfragment"]["XRF"] = function(_fragment,_flags,_index) {
 | 
						|
	this.floats = [];
 | 
						|
	this.shift = [];
 | 
						|
	this.fragment = _fragment;
 | 
						|
	this.flags = _flags;
 | 
						|
	this.index = _index;
 | 
						|
};
 | 
						|
xrfragment_XRF.__name__ = true;
 | 
						|
xrfragment_XRF.set = function(flag,flags) {
 | 
						|
	return flags | flag;
 | 
						|
};
 | 
						|
xrfragment_XRF.unset = function(flag,flags) {
 | 
						|
	return flags & ~flag;
 | 
						|
};
 | 
						|
xrfragment_XRF.prototype = {
 | 
						|
	is: function(flag) {
 | 
						|
		var v = this.flags;
 | 
						|
		if(!(typeof(v) == "number" && ((v | 0) === v))) {
 | 
						|
			this.flags = 0;
 | 
						|
		}
 | 
						|
		return (this.flags & flag) != 0;
 | 
						|
	}
 | 
						|
	,validate: function(value) {
 | 
						|
		this.guessType(this,value);
 | 
						|
		var ok = true;
 | 
						|
		if(value.length == 0 && !this.is(xrfragment_XRF.T_PREDEFINED_VIEW)) {
 | 
						|
			ok = false;
 | 
						|
		}
 | 
						|
		if(!this.is(xrfragment_XRF.T_FLOAT) && this.is(xrfragment_XRF.T_VECTOR2) && !(typeof(this.x) == "number" && typeof(this.y) == "number")) {
 | 
						|
			ok = false;
 | 
						|
		}
 | 
						|
		if(!(this.is(xrfragment_XRF.T_VECTOR2) || this.is(xrfragment_XRF.T_STRING)) && this.is(xrfragment_XRF.T_VECTOR3) && !(typeof(this.x) == "number" && typeof(this.y) == "number" && typeof(this.z) == "number")) {
 | 
						|
			ok = false;
 | 
						|
		}
 | 
						|
		return ok;
 | 
						|
	}
 | 
						|
	,guessType: function(v,str) {
 | 
						|
		v.string = str;
 | 
						|
		if(xrfragment_XRF.isReset.match(v.fragment)) {
 | 
						|
			v.reset = true;
 | 
						|
		}
 | 
						|
		if(v.fragment == "loop") {
 | 
						|
			v.loop = true;
 | 
						|
		}
 | 
						|
		if(typeof(str) != "string") {
 | 
						|
			return;
 | 
						|
		}
 | 
						|
		if(str.length > 0) {
 | 
						|
			if(xrfragment_XRF.isXRFScheme.match(str)) {
 | 
						|
				v.xrfScheme = true;
 | 
						|
				str = str.replace(xrfragment_XRF.isXRFScheme.r,"");
 | 
						|
				v.string = str;
 | 
						|
			}
 | 
						|
			if(str.split(",").length > 1) {
 | 
						|
				var xyzn = str.split(",");
 | 
						|
				if(xyzn.length > 0) {
 | 
						|
					v.x = parseFloat(xyzn[0]);
 | 
						|
				}
 | 
						|
				if(xyzn.length > 1) {
 | 
						|
					v.y = parseFloat(xyzn[1]);
 | 
						|
				}
 | 
						|
				if(xyzn.length > 2) {
 | 
						|
					v.z = parseFloat(xyzn[2]);
 | 
						|
				}
 | 
						|
				var _g = 0;
 | 
						|
				var _g1 = xyzn.length;
 | 
						|
				while(_g < _g1) {
 | 
						|
					var i = _g++;
 | 
						|
					v.shift.push(xrfragment_XRF.isShift.match(xyzn[i]));
 | 
						|
					v.floats.push(parseFloat(xyzn[i].replace(xrfragment_XRF.isShift.r,"")));
 | 
						|
				}
 | 
						|
			}
 | 
						|
			if(xrfragment_XRF.isColor.match(str)) {
 | 
						|
				v.color = str;
 | 
						|
			}
 | 
						|
			if(xrfragment_XRF.isFloat.match(str)) {
 | 
						|
				v.x = parseFloat(str);
 | 
						|
				v.float = v.x;
 | 
						|
			}
 | 
						|
			if(xrfragment_XRF.isInt.match(str)) {
 | 
						|
				v.int = Std.parseInt(str);
 | 
						|
				v.x = v.int;
 | 
						|
				v.floats.push(v.x);
 | 
						|
			}
 | 
						|
			v.filter = new xrfragment_Filter(v.fragment + "=" + v.string);
 | 
						|
		} else {
 | 
						|
			v.filter = new xrfragment_Filter(v.fragment);
 | 
						|
		}
 | 
						|
	}
 | 
						|
};
 | 
						|
function $getIterator(o) { if( o instanceof Array ) return new haxe_iterators_ArrayIterator(o); else return o.iterator(); }
 | 
						|
function $bind(o,m) { if( m == null ) return null; if( m.__id__ == null ) m.__id__ = $global.$haxeUID++; var f; if( o.hx__closures__ == null ) o.hx__closures__ = {}; else f = o.hx__closures__[m.__id__]; if( f == null ) { f = m.bind(o); o.hx__closures__[m.__id__] = f; } return f; }
 | 
						|
$global.$haxeUID |= 0;
 | 
						|
if(typeof(performance) != "undefined" ? typeof(performance.now) == "function" : false) {
 | 
						|
	HxOverrides.now = performance.now.bind(performance);
 | 
						|
}
 | 
						|
if( String.fromCodePoint == null ) String.fromCodePoint = function(c) { return c < 0x10000 ? String.fromCharCode(c) : String.fromCharCode((c>>10)+0xD7C0)+String.fromCharCode((c&0x3FF)+0xDC00); }
 | 
						|
String.__name__ = true;
 | 
						|
Array.__name__ = true;
 | 
						|
js_Boot.__toStr = ({ }).toString;
 | 
						|
haxe_Template.splitter = new EReg("(::[A-Za-z0-9_ ()&|!+=/><*.\"-]+::|\\$\\$([A-Za-z0-9_-]+)\\()","");
 | 
						|
haxe_Template.expr_splitter = new EReg("(\\(|\\)|[ \r\n\t]*\"[^\"]*\"[ \r\n\t]*|[!+=/><*.&|-]+)","");
 | 
						|
haxe_Template.expr_trim = new EReg("^[ ]*([^ ]+)[ ]*$","");
 | 
						|
haxe_Template.expr_int = new EReg("^[0-9]+$","");
 | 
						|
haxe_Template.expr_float = new EReg("^([+-]?)(?=\\d|,\\d)\\d*(,\\d*)?([Ee]([+-]?\\d+))?$","");
 | 
						|
haxe_Template.globals = { };
 | 
						|
haxe_Template.hxKeepArrayIterator = new haxe_iterators_ArrayIterator([]);
 | 
						|
xrfragment_Parser.error = "";
 | 
						|
xrfragment_Parser.debug = false;
 | 
						|
xrfragment_URI.__meta__ = { statics : { template : { keep : null}}};
 | 
						|
xrfragment_URI._parts = ["source","scheme","authority","userInfo","user","password","host","port","relative","path","directory","file","query","fragment"];
 | 
						|
xrfragment_XRF.IMMUTABLE = 1;
 | 
						|
xrfragment_XRF.PROP_BIND = 2;
 | 
						|
xrfragment_XRF.QUERY_OPERATOR = 4;
 | 
						|
xrfragment_XRF.PROMPT = 8;
 | 
						|
xrfragment_XRF.CUSTOMFRAG = 16;
 | 
						|
xrfragment_XRF.NAVIGATOR = 32;
 | 
						|
xrfragment_XRF.METADATA = 64;
 | 
						|
xrfragment_XRF.PV_OVERRIDE = 128;
 | 
						|
xrfragment_XRF.PV_EXECUTE = 256;
 | 
						|
xrfragment_XRF.T_COLOR = 8192;
 | 
						|
xrfragment_XRF.T_INT = 16384;
 | 
						|
xrfragment_XRF.T_FLOAT = 32768;
 | 
						|
xrfragment_XRF.T_VECTOR2 = 65536;
 | 
						|
xrfragment_XRF.T_VECTOR3 = 131072;
 | 
						|
xrfragment_XRF.T_URL = 262144;
 | 
						|
xrfragment_XRF.T_PREDEFINED_VIEW = 524288;
 | 
						|
xrfragment_XRF.T_STRING = 1048576;
 | 
						|
xrfragment_XRF.T_MEDIAFRAG = 2097152;
 | 
						|
xrfragment_XRF.T_DYNAMICKEY = 4194304;
 | 
						|
xrfragment_XRF.T_DYNAMICKEYVALUE = 8388608;
 | 
						|
xrfragment_XRF.isColor = new EReg("^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$","");
 | 
						|
xrfragment_XRF.isInt = new EReg("^[-0-9]+$","");
 | 
						|
xrfragment_XRF.isFloat = new EReg("^[-0-9]+\\.[0-9]+$","");
 | 
						|
xrfragment_XRF.isVector = new EReg("([,]+|\\w)","");
 | 
						|
xrfragment_XRF.isUrl = new EReg("(://)?\\..*","");
 | 
						|
xrfragment_XRF.isUrlOrPretypedView = new EReg("(^#|://)?\\..*","");
 | 
						|
xrfragment_XRF.isString = new EReg(".*","");
 | 
						|
xrfragment_XRF.operators = new EReg("(^[-]|^[!]|[\\*]$)","g");
 | 
						|
xrfragment_XRF.isProp = new EReg("^.*=[><=]?","");
 | 
						|
xrfragment_XRF.isExclude = new EReg("^-","");
 | 
						|
xrfragment_XRF.isDeep = new EReg("\\*","");
 | 
						|
xrfragment_XRF.isNumber = new EReg("^[0-9\\.]+$","");
 | 
						|
xrfragment_XRF.isMediaFrag = new EReg("^([0-9\\.,\\*+-]+)$","");
 | 
						|
xrfragment_XRF.isReset = new EReg("^!","");
 | 
						|
xrfragment_XRF.isShift = new EReg("^(\\+|--)","");
 | 
						|
xrfragment_XRF.isXRFScheme = new EReg("^xrf://","");
 | 
						|
})(typeof window != "undefined" ? window : typeof global != "undefined" ? global : typeof self != "undefined" ? self : this);
 | 
						|
var xrfragment = $hx_exports["xrfragment"];
 | 
						|
// the core project uses #vanillajs #proxies #clean #noframework
 | 
						|
var $      = typeof $   != 'undefined' ? $  : (s) => document.querySelector(s)            // respect jquery
 | 
						|
var $$     = typeof $$  != 'undefined' ? $$ : (s) => [...document.querySelectorAll(s)]    // zepto etc.
 | 
						|
 | 
						|
var $el = (html,tag) => {
 | 
						|
  let el = document.createElement('div')
 | 
						|
  el.innerHTML = html
 | 
						|
  return el.children[0]
 | 
						|
}
 | 
						|
// SPDX-License-Identifier: MPL-2.0        
 | 
						|
// Copyright (c) 2023 Leon van Kammen/NLNET 
 | 
						|
 | 
						|
var xrf = {}
 | 
						|
 | 
						|
xrf.init = function(opts){
 | 
						|
  opts      = opts || {}
 | 
						|
 | 
						|
  xrf.debug = document.location.hostname.match(/^(localhost|[0-9]\.[0-9])/) || document.location.port == '8080' ? 0 : false
 | 
						|
  if( document.location.hash.match(/debug=([0-9])/) ){
 | 
						|
    xrf.debug = parseInt( ( document.location.hash.match(/debug=([0-9])/) || [0,'0'] )[1] )
 | 
						|
  }
 | 
						|
  if( xrf.debug === false ) console.log("add #debug=[0-9] to URL to see XR Fragment debuglog")
 | 
						|
 | 
						|
  xrf.Parser.debug = xrf.debug 
 | 
						|
  xrf.detectCameraRig(opts)
 | 
						|
  for ( let i in opts ) xrf[i] = opts[i]
 | 
						|
  xrf.emit('init',opts)
 | 
						|
  return xrf
 | 
						|
}
 | 
						|
 | 
						|
xrf.query = function(){
 | 
						|
  // framework implementations can override this function, see src/3rd/js/three/index.sj 
 | 
						|
  alert("queries are not implemented (yet) for this particular framework")
 | 
						|
}
 | 
						|
 | 
						|
xrf.detectCameraRig = function(opts){
 | 
						|
  if( opts.camera ){ // detect rig (if any)
 | 
						|
    const getCam  = ((cam) => () => cam)(opts.camera)
 | 
						|
    let offsetY = 0 
 | 
						|
    while( opts.camera.parent.type != "Scene" ){
 | 
						|
      offsetY += opts.camera.position.y
 | 
						|
      opts.camera = opts.camera.parent
 | 
						|
      opts.camera.getCam = getCam
 | 
						|
      opts.camera.updateProjectionMatrix = () => opts.camera.getCam().updateProjectionMatrix()
 | 
						|
    }
 | 
						|
    if( !opts.camera.getCam ) opts.camera.getCam = getCam // always attach function
 | 
						|
    opts.camera.offsetY = offsetY
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
xrf.hasTag = (tag,tags) => String(tags).match( new RegExp(`(^| )${tag}( |$)`,`g`) )
 | 
						|
 | 
						|
// map library functions to xrf
 | 
						|
for ( let i in xrfragment ) xrf[i] = xrfragment[i] 
 | 
						|
/* 
 | 
						|
 * (promise-able) EVENTS (optionally continue after listeners are finished using .then)
 | 
						|
 *
 | 
						|
 * example:
 | 
						|
 *
 | 
						|
 *  xrf.addEventListener('foo',(e) => {
 | 
						|
 *    // let promise = e.promise()   
 | 
						|
 *    console.log("navigating to: "+e.detail.destination.url)
 | 
						|
 *    // promise.resolve()
 | 
						|
 *    // promise.reject("not going to happen")
 | 
						|
 *  })
 | 
						|
 *
 | 
						|
 *  xrf.emit('foo',123)
 | 
						|
 *  xrf.emit('foo',123).then(...).catch(...).finally(...)
 | 
						|
 */
 | 
						|
 | 
						|
xrf.addEventListener = function(eventName, callback, opts) {
 | 
						|
  if( !this._listeners ) this._listeners = []
 | 
						|
  callback.opts = opts || {weight: this._listeners.length}
 | 
						|
  if (!this._listeners[eventName]) {
 | 
						|
      // create a new array for this event name if it doesn't exist yet
 | 
						|
      this._listeners[eventName] = [];
 | 
						|
  }
 | 
						|
  // add the callback to the listeners array for this event name
 | 
						|
  this._listeners[eventName].push(callback);
 | 
						|
  // sort
 | 
						|
  this._listeners[eventName] = this._listeners[eventName].sort( (a,b) => a.opts.weight > b.opts.weight )
 | 
						|
  callback.unlisten = () => {
 | 
						|
    this._listeners[eventName] = this._listeners[eventName].filter( (c) => c != callback )
 | 
						|
  }
 | 
						|
  return callback.unlisten
 | 
						|
};
 | 
						|
 | 
						|
xrf.emit = function(eventName, data){
 | 
						|
  if( typeof data != 'object' ) throw 'emit() requires passing objects'
 | 
						|
  if( xrf.debug && xrf.debug > 1 && ( !eventName.match(/^render/) || xrf.debug == eventName ) ){
 | 
						|
    let label = String(`xrf.emit('${eventName}')`).padEnd(35," ");
 | 
						|
    label +=  data.mesh && data.mesh.name ? '#'+data.mesh.name : ''
 | 
						|
    console.groupCollapsed(label)
 | 
						|
    console.info(data)
 | 
						|
    console.groupEnd(label)
 | 
						|
    if( eventName == 'reset' ) debugger
 | 
						|
    if( xrf.debug > 2 ) debugger
 | 
						|
  }
 | 
						|
  return xrf.emit.promise(eventName,data)
 | 
						|
}
 | 
						|
 | 
						|
xrf.emit.normal = function(eventName, opts) {
 | 
						|
    if( !xrf._listeners ) xrf._listeners = []
 | 
						|
    var callbacks = xrf._listeners[eventName]
 | 
						|
    if (callbacks) {
 | 
						|
        for (var i = 0; i < callbacks.length && !opts.halt; i++) {
 | 
						|
          try{
 | 
						|
            callbacks[i](opts);
 | 
						|
          }catch(e){ console.error(e) }
 | 
						|
        }
 | 
						|
    }
 | 
						|
};
 | 
						|
 | 
						|
xrf.emit.promise = function(e, opts){ 
 | 
						|
  return new Promise( (resolve, reject) => {
 | 
						|
    opts.promise = () => {
 | 
						|
      opts.promises = opts.promises || []
 | 
						|
      opts.promises.push(0)
 | 
						|
      return { 
 | 
						|
        resolve: ((index) => () => {
 | 
						|
          opts.promises[index] = 1 
 | 
						|
          let succesful = opts.promises.reduce( (a,b) => a+b )
 | 
						|
          if( succesful == opts.promises.length ) resolve(opts)
 | 
						|
        })(opts.promises.length-1),
 | 
						|
        reject: (reason) => {
 | 
						|
          opts.halt = true
 | 
						|
          console.warn(`'${e}' event rejected: ${reason}`)
 | 
						|
        }
 | 
						|
      }
 | 
						|
    }
 | 
						|
    xrf.emit.normal(e, opts)     
 | 
						|
    if( !opts.promises ) resolve(opts)
 | 
						|
    delete opts.promise
 | 
						|
  })
 | 
						|
}
 | 
						|
 | 
						|
xrf.addEventListener('reset', () => {
 | 
						|
  let events = ['renderPost']
 | 
						|
  events.map( (e) => {
 | 
						|
    if( xrf._listeners[e] ) xrf._listeners[e].map( (r) => r.unlisten && r.unlisten() )
 | 
						|
  })
 | 
						|
})
 | 
						|
/*! rasterizeHTML.js - v1.3.1 - 2023-07-06
 | 
						|
* http://www.github.com/cburgmer/rasterizeHTML.js
 | 
						|
* Copyright (c) 2023 Christoph Burgmer; Licensed MIT */
 | 
						|
 | 
						|
!function(o,i){void 0===o&&void 0!==window&&(o=window),"function"==typeof define&&define.amd?define(["url","xmlserializer","sane-domparser-error","inlineresources"],function(e,t,n,r){return o.rasterizeHTML=i(e,t,n,r)}):"object"==typeof module&&module.exports?module.exports=i(require("url"),require("xmlserializer"),require("sane-domparser-error"),require("inlineresources")):o.rasterizeHTML=i(o.url,o.xmlserializer,o.sanedomparsererror,o.inlineresources)}(this,function(e,t,n,r){var o=function(n){"use strict";var o={},t=[];o.joinUrl=function(e,t){return e?n.resolve(e,t):t},o.getConstantUniqueIdFor=function(e){return t.indexOf(e)<0&&t.push(e),t.indexOf(e)},o.clone=function(e){var t,n={};for(t in e)e.hasOwnProperty(t)&&(n[t]=e[t]);return n};return o.parseOptionalParameters=function(e){var t,n,r={canvas:null,options:{}};return null==e[0]||(t=e[0],"object"==typeof(n=t)&&null!==n&&Object.prototype.toString.apply(t).match(/\[object (Canvas|HTMLCanvasElement)\]/i))?(r.canvas=e[0]||null,r.options=o.clone(e[1])):r.options=o.clone(e[0]),r},o}(e),i=function(i){"use strict";function u(e,t,n){var r=e[t];return e[t]=function(){var e=Array.prototype.slice.call(arguments);return n.apply(this,[e,r])},r}var e={};return e.baseUrlRespectingXhr=function(t,o){return function(){var e=new t;return u(e,"open",function(e,t){var n=e.shift(),r=e.shift(),r=i.joinUrl(o,r);return t.apply(this,[n,r].concat(e))}),e}},e.finishNotifyingXhr=function(t){function e(){var e=new t;return u(e,"send",function(e,t){return r+=1,t.apply(this,arguments)}),e.addEventListener("load",function(){o+=1,n()}),e}var n,r=0,o=0,i=!1,c=new Promise(function(e){n=function(){r-o<=0&&i&&e({totalCount:r})}});return e.waitForRequestsToFinish=function(){return i=!0,n(),c},e},e}(o),e=function(i){"use strict";function r(e){return Array.prototype.slice.call(e)}var e={},c={active:!0,hover:!0,focus:!1,target:!1};return e.fakeUserAction=function(e,t,n){var r=e.querySelector(t),o=":"+n,t="rasterizehtml"+n;r&&(c[n]?i.addClassNameRecursively(r,t):i.addClassName(r,t),i.rewriteCssSelectorWith(e,o,"."+t))},e.persistInputValues=function(e){function t(e){return"checkbox"===e.type||"radio"===e.type}var n=e.querySelectorAll("input"),e=e.querySelectorAll("textarea");r(n).filter(t).forEach(function(e){e.checked?e.setAttribute("checked",""):e.removeAttribute("checked")}),r(n).filter(function(e){return!t(e)}).forEach(function(e){e.setAttribute("value",e.value)}),r(e).forEach(function(e){e.textContent=e.value})},e.rewriteTagNameSelectorsToLowerCase=function(e){i.lowercaseCssTypeSelectors(e,i.findHtmlOnlyNodeNames(e))},e}(function(){"use strict";function c(e){return Array.prototype.slice.call(e)}var n={};n.addClassName=function(e,t){e.className+=" "+t},n.addClassNameRecursively=function(e,t){n.addClassName(e,t),e.parentNode!==e.ownerDocument&&n.addClassNameRecursively(e.parentNode,t)};function r(e,t,o){var i="((?:^|[^.#:\\w])|(?=\\W))("+t.join("|")+")(?=\\W|$)";c(e.querySelectorAll("style")).forEach(function(e){var t,n;void 0===e.sheet&&(t=e,n=document.implementation.createHTMLDocument(""),(r=document.createElement("style")).textContent=t.textContent,n.body.appendChild(r),t.sheet=r.sheet);var r=c(e.sheet.cssRules).filter(function(e){return e.selectorText&&new RegExp(i,"i").test(e.selectorText)});r.length&&(r.forEach(function(e){var t,n=e.selectorText.replace(new RegExp(i,"gi"),function(e,t,n){return t+o(n)});n!==e.selectorText&&(t=n,e=(n=e).cssText.replace(/^[^\{]+/,""),u(n,t+" "+e))}),e.textContent=a(e.sheet.cssRules))})}var u=function(e,t){var n=e.parentStyleSheet,e=c(n.cssRules).indexOf(e);n.insertRule(t,e+1),n.deleteRule(e)},a=function(e){return c(e).reduce(function(e,t){return e+t.cssText},"")};return n.rewriteCssSelectorWith=function(e,t,n){r(e,[t],function(){return n})},n.lowercaseCssTypeSelectors=function(e,t){r(e,t,function(e){return e.toLowerCase()})},n.findHtmlOnlyNodeNames=function(e){for(var t,n=e.ownerDocument.createTreeWalker(e,NodeFilter.SHOW_ELEMENT),r={},o={};t=n.currentNode.tagName.toLowerCase(),"http://www.w3.org/1999/xhtml"===n.currentNode.namespaceURI?r[t]=!0:o[t]=!0,n.nextNode(););return Object.keys(r).filter(function(e){return!o[e]})},n}()),i=function(a,f,t,m){"use strict";var e={};e.executeJavascript=function(s,l){return new Promise(function(t){function n(){m.document.getElementsByTagName("body")[0].removeChild(r)}function e(){var e=r.contentDocument;t({document:e,errors:i,cleanUp:n})}var r=function(e,t,n,r){t=e.createElement(t);return t.style.visibility="hidden",t.style.width=n+"px",t.style.height=r+"px",t.style.position="absolute",t.style.top=-1e4-r+"px",t.style.left=-1e4-n+"px",e.getElementsByTagName("body")[0].appendChild(t),t}(m.document,"iframe",l.width,l.height),o=s.outerHTML,i=[],c=l.executeJsTimeout||0,u=r.contentWindow.XMLHttpRequest,a=f.finishNotifyingXhr(u),u=f.baseUrlRespectingXhr(a,l.baseUrl);r.onload=function(){var t;(0<(t=c)?new Promise(function(e){setTimeout(e,t)}):Promise.resolve()).then(a.waitForRequestsToFinish).then(e)},r.contentDocument.open(),r.contentWindow.XMLHttpRequest=u,r.contentWindow.onerror=function(e){i.push({resourceType:"scriptExecution",msg:e})},r.contentDocument.write("<!DOCTYPE html>"),r.contentDocument.write(o),r.contentDocument.close()})};function s(e,t,n,r,o){var i,c,u,a=Math.max(e.scrollWidth,e.clientWidth),s=Math.max(e.scrollHeight,e.clientHeight),l=t?(i=(l=function(e,t){var n=e.querySelector(t);if(n)return n;if(e.ownerDocument.querySelector(t)===e)return e;throw{message:"Clipping selector not found"}}(e,t).getBoundingClientRect()).top,c=l.left,u=l.width,l.height):(c=i=0,u=a,s);return l={width:u,height:l},r=r,o=o,r={width:Math.max(l.width*o,n),height:Math.max(l.height*o,r)},e=m.getComputedStyle(e.ownerDocument.documentElement).fontSize,{left:c,top:i,width:r.width,height:r.height,viewportWidth:a,viewportHeight:s,rootFontSize:e}}e.calculateDocumentContentSize=function(c,u){return new Promise(function(n,r){var e,t,o=u.zoom||1,i=function(e,t,n){e=Math.floor(e/n),n=Math.floor(t/n);return function(e,t,n){e=e.createElement("iframe");return e.style.width=t+"px",e.style.height=n+"px",e.style.visibility="hidden",e.style.position="absolute",e.style.top=-1e4-n+"px",e.style.left=-1e4-t+"px",e.style.borderWidth=0,e.sandbox="allow-same-origin",e.scrolling="no",e}(m.document,e,n)}(u.width,u.height,o);m.document.getElementsByTagName("body")[0].appendChild(i),i.onload=function(){var e,t=i.contentDocument;try{e=s(function(e,t){e=e.tagName;return t.querySelector(e)}(c,t),u.clip,u.width,u.height,o),n(e)}catch(e){r(e)}finally{m.document.getElementsByTagName("body")[0].removeChild(i)}},i.contentDocument.open(),i.contentDocument.write("<!DOCTYPE html>"),i.contentDocument.write("html"===(t=(e=c).tagName.toLowerCase())||"body"===t?e.outerHTML:'<body style="margin: 0;">'+e.outerHTML+"</body>"),i.contentDocument.close()})},e.parseHtmlFragment=function(e){var t=m.document.implementation.createHTMLDocument("");t.documentElement.innerHTML=e;t=t.querySelector("body").firstChild;if(!t)throw"Invalid source";return t};e.parseHTML=function(e){var t=m.document.implementation.createHTMLDocument("");return t.documentElement.innerHTML=e,function(e,t){var n,r,o,i=/<html((?:\s+[^>]*)?)>/im.exec(t),t=m.document.implementation.createHTMLDocument("");if(i)for(i="<div"+i[1]+"></div>",t.documentElement.innerHTML=i,r=t.querySelector("div"),n=0;n<r.attributes.length;n++)o=r.attributes[n],e.documentElement.setAttribute(o.name,o.value)}(t,e),t};function n(e){try{return t.failOnParseError(e)}catch(e){throw{message:"Invalid source",originalError:e}}}e.validateXHTML=function(e){e=(new DOMParser).parseFromString(e,"application/xml");n(e)};function r(c,u){return new Promise(function(e,t){function n(e){t({message:"Unable to load page",originalError:e})}var r=new window.XMLHttpRequest,o=a.joinUrl(u.baseUrl,c),i=(i=o,"none"===(o=u.cache)||"repeated"===o?i+"?_="+(l=null===l||"repeated"!==o?Date.now():l):i);r.addEventListener("load",function(){200===r.status||0===r.status?e(r.responseXML):n(r.statusText)},!1),r.addEventListener("error",function(e){n(e)},!1);try{r.open("GET",i,!0),r.responseType="document",r.send(null)}catch(e){n(e)}})}var l=null;return e.loadDocument=function(e,t){return r(e,t).then(n)},e}(o,i,n,window),n=function(r){"use strict";function o(e,t){return t?URL.createObjectURL(new Blob([e],{type:"image/svg+xml"})):"data:image/svg+xml;charset=utf-8,"+encodeURIComponent(e)}function c(e){e instanceof Blob&&URL.revokeObjectURL(e)}function i(o){return new Promise(function(t,e){var n=document.createElement("canvas"),r=new Image;r.onload=function(){var e=n.getContext("2d");try{e.drawImage(r,0,0),n.toDataURL("image/png"),t(!0)}catch(e){t(!1)}},r.onerror=e,r.src=o})}function u(t){return(e=void 0===e?n():e).then(function(e){return o(t,e)})}var e,t={},a='<svg xmlns="http://www.w3.org/2000/svg" width="1" height="1"><foreignObject></foreignObject></svg>',n=function(){return new Promise(function(t,e){var n;(function(){if(r.Blob)try{return new Blob(["<b></b>"],{type:"text/xml"}),!0}catch(e){}return!1})()&&r.URL?(n=o(a,!0),i(n).then(function(e){return c(n),!e&&i(o(a,!1)).then(function(e){return e})},function(){return!1}).then(function(e){t(!e)},function(){e()})):t(!1)})};return t.renderSvg=function(i){return new Promise(function(e,t){function n(){r&&c(r)}var r,o=new Image;o.onload=function(){o.onload=null,o.onerror=null,n(),e(o)},o.onerror=function(){n(),t()},u(i).then(function(e){r=e,o.src=r},t)})},t}(window);return function(o,i,c){"use strict";var u={};u.drawDocument=function(){var e=arguments[0],t=Array.prototype.slice.call(arguments,1),n=o.parseOptionalParameters(t),r=e.documentElement||e;return c.rasterize(r,n.canvas,(e=(t=n).canvas,r=t.options,n=e?e.width:300,e=e?e.height:200,e={width:void 0!==r.width?r.width:n,height:void 0!==r.height?r.height:e},(t=o.clone(t.options)).width=e.width,t.height=e.height,t))};u.drawHTML=function(){var e=arguments[0],t=Array.prototype.slice.call(arguments,1),t=o.parseOptionalParameters(t);return function(e,t,n){e=i.parseHTML(e);return u.drawDocument(e,t,n)}(e,t.canvas,t.options)};function n(t,n,r){return i.loadDocument(t,r).then(function(e){e=function(e,t,n){var r=document.implementation.createHTMLDocument("");r.replaceChild(e.documentElement,r.documentElement);e=n?o.clone(n):{};return n.baseUrl||(e.baseUrl=t),{document:r,options:e}}(e,t,r);return u.drawDocument(e.document,n,e.options)})}return u.drawURL=function(){var e=arguments[0],t=Array.prototype.slice.call(arguments,1),t=o.parseOptionalParameters(t);return n(e,t.canvas,t.options)},u}(o,i,function(o,i,c,r,e,u){"use strict";function a(t){return e.renderSvg(t).then(function(e){return{image:e,svg:t}},function(e){throw l(e)})}function s(e,t,n){return r.drawDocumentAsSvg(e,n).then(a).then(function(e){return t&&function(e,t){try{t.getContext("2d").drawImage(e,0,0)}catch(e){throw l(e)}}(e.image,t),e})}var t={},l=function(e){return{message:"Error rendering page",originalError:e}};return t.rasterize=function(e,n,r){var t=o.clone(r);return t.inlineScripts=!0===r.executeJs,u.inlineReferences(e,t).then(function(t){return r.executeJs?i.executeJavascript(e,r).then(function(e){var t=e.document;return c.persistInputValues(t),{document:t,errors:e.errors,cleanUp:e.cleanUp}}).then(function(e){return{element:e.document.documentElement,errors:t.concat(e.errors),cleanUp:e.cleanUp}}):{element:e,errors:t,cleanUp:function(){}}}).then(function(t){return s(t.element,n,r).then(function(e){return t.cleanUp(),{image:e.image,svg:e.svg,errors:t.errors}})})},t}(o,i,e,function(c,r,u){"use strict";function a(t){var e=Object.keys(t);return e.length?" "+e.map(function(e){return e+'="'+t[e]+'"'}).join(" "):""}function o(e,t,n){var r,o,i=u.serializeToString(e);return c.validateXHTML(i),(e=(r=t,o=Math.round(r.viewportWidth),e=Math.round(r.viewportHeight),{x:-r.left,y:-r.top,width:o,height:e})).style=(e.style||"")+"float: left;",e.externalResourcesRequired=!0,'<svg xmlns="http://www.w3.org/2000/svg"'+a(function(e,t){t=t||1,e={width:e.width,height:e.height,"font-size":e.rootFontSize};return 1!==t&&(e.style="transform:scale("+t+"); transform-origin: 0 0;"),e}(t,n))+'><style scoped="">html::-webkit-scrollbar { display: none; }</style><foreignObject'+a(e)+">"+i+"</foreignObject></svg>"}var i={};return i.getSvgForDocument=function(e,t,n){return r.rewriteTagNameSelectorsToLowerCase(e),o(e,t,n)},i.drawDocumentAsSvg=function(t,n){return["hover","active","focus","target"].forEach(function(e){n[e]&&r.fakeUserAction(t,n[e],e)}),c.calculateDocumentContentSize(t,n).then(function(e){return i.getSvgForDocument(t,e,n.zoom)})},i}(i,e,t),n,r))});
 | 
						|
// the XRWG (XR WordGraph)is mentioned in the spec 
 | 
						|
//
 | 
						|
// it collects metadata-keys ('foo' e.g.), names and tags across 3D scene-nodes (.userData.foo e.g.) 
 | 
						|
 | 
						|
let XRWG = xrf.XRWG = []
 | 
						|
 | 
						|
XRWG.word = (key) => XRWG.find( (w) => w.word == word )
 | 
						|
 | 
						|
XRWG.cleankey = (word) => String(word).replace(/[^0-9\.a-zA-Z_]/g,'')
 | 
						|
                                      .toLowerCase()
 | 
						|
                                      .replace(/.*:\/\//,'')
 | 
						|
XRWG.get = (v,k) => XRWG.find( (x) => x[ k || 'word'] == v )
 | 
						|
 | 
						|
XRWG.match = (str,types,level) => {
 | 
						|
  if( XRWG.length == 0 ) XRWG.generate(xrf)
 | 
						|
  level = level == undefined ? 1000 : level
 | 
						|
  types = types || []
 | 
						|
  let res = XRWG.filter( (n) => {
 | 
						|
    types.map( (type) => n[type] ? n = false : false )
 | 
						|
    return n
 | 
						|
  })
 | 
						|
  str = str.toLowerCase()
 | 
						|
           .replace(/[!-\*]/g,'') // remove excludes and wildcards
 | 
						|
  if( level  <10   ) res = res.filter( (n) => n.key    == str )
 | 
						|
  if( level >=10   ) res = res.filter( (n) => n.word   == str   || n.key == str )
 | 
						|
  if( level  >30   ) res = res.filter( (n) => n.word.match(str) || n.key == str )
 | 
						|
  if( level  >40   ) res = res.filter( (n) => n.word.match(str) || n.key == str || String(n.value||'').match(str) )
 | 
						|
  if( level  >999  ) res = res.filter( (n) => n.word.match(str) != null || n.key.match(str) != null || String(n.value||'').match(str) != null)
 | 
						|
  return res
 | 
						|
}
 | 
						|
 | 
						|
XRWG.generate = (opts) => {
 | 
						|
  let {scene,model} = opts
 | 
						|
  if( !scene ) return console.warn('xrfragment: XRWG cannot be generated from empty (nonloaded?) scene')
 | 
						|
  XRWG.slice(0,0) // empty  
 | 
						|
    
 | 
						|
  // collect words from 3d nodes
 | 
						|
 | 
						|
  let add = (key, spatialNode, type) => {
 | 
						|
    if( !key || key.match(/(^#$|name)/) ) return
 | 
						|
    let node = XRWG.get( XRWG.cleankey(key) )
 | 
						|
    if( node ){
 | 
						|
      node.types.push(type)
 | 
						|
      node.nodes.push(spatialNode)
 | 
						|
    }else{
 | 
						|
      node = { word: XRWG.cleankey(key), key, nodes:[spatialNode], types:[] }
 | 
						|
      if( spatialNode.userData[key] ) node.value = spatialNode.userData[key]
 | 
						|
      node.types.push(type)
 | 
						|
      xrf.emit('XRWGnode',node)
 | 
						|
      XRWG.push( node )
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  scene.traverse( (o) => {
 | 
						|
    add( `#${o.name}`, o, 'name')
 | 
						|
    for( let k in o.userData ){
 | 
						|
      if( k == 'tag' ){
 | 
						|
        let tagArr = o.userData.tag.split(" ")
 | 
						|
                      .map(    (t) => t.trim() )
 | 
						|
                      .filter( (t) => t )
 | 
						|
                      .map(    (w) => add( w, o, 'tag') )
 | 
						|
      }else if( k.match(/^(href|src)$/) ) add( o.userData[k], o, k)
 | 
						|
      else if( k[0] == '#' ) add( k, o , 'pv')
 | 
						|
      else add( k, o , 'query')
 | 
						|
    }
 | 
						|
  }) 
 | 
						|
 | 
						|
  // sort by n
 | 
						|
  XRWG.sort( (a,b) => a.nodes.length - b.nodes.length )
 | 
						|
  XRWG = XRWG.reverse() // the cleankey/get functions e.g. will persist
 | 
						|
  xrf.emit('XRWG',XRWG)
 | 
						|
}
 | 
						|
 | 
						|
XRWG.deepApplyMatch = function(match,v,cb){
 | 
						|
  match.map( (m) => {
 | 
						|
    for( let i in m.types ){
 | 
						|
      let type = m.types[i]
 | 
						|
      let node = m.nodes[i]
 | 
						|
      if (type == 'name' || type == 'tag'){
 | 
						|
        cb(match,v,node,type)
 | 
						|
        if( v.filter.q.deep ) node.traverse( (c) => cb(match,v,c,t) )
 | 
						|
      }
 | 
						|
    }
 | 
						|
  })
 | 
						|
}
 | 
						|
 | 
						|
// the hashbus (QueryString eventBus) is mentioned in the spec 
 | 
						|
//
 | 
						|
// it allows metadata-keys ('foo' e.g.) of 3D scene-nodes (.userData.foo e.g.) to 
 | 
						|
// react by executing code 
 | 
						|
 | 
						|
let pub = function( url, node_or_model, flags ){  // evaluate fragments in url
 | 
						|
  if( !url ) return 
 | 
						|
  if( !url.match(/#/) ) url = `#${url}`
 | 
						|
  let { THREE, camera } = xrf
 | 
						|
  let frag     = xrf.URI.parse( url, flags ).XRF
 | 
						|
  let fromNode = node_or_model != xrf.model
 | 
						|
  let isNode   = node_or_model && node_or_model.children
 | 
						|
 | 
						|
  let opts = {
 | 
						|
    frag, 
 | 
						|
    mesh:  fromNode ? node_or_model : xrf.camera, 
 | 
						|
    model: xrf.model,
 | 
						|
    camera: xrf.camera, 
 | 
						|
    scene: isNode ? node_or_model : xrf.scene, 
 | 
						|
    renderer: xrf.renderer,
 | 
						|
    THREE: xrf.THREE, 
 | 
						|
    hashbus: xrf.hashbus 
 | 
						|
  }
 | 
						|
  xrf.emit('hashbus',opts)
 | 
						|
  .then( () => {
 | 
						|
    for ( let k in frag ){
 | 
						|
      let nodeAlias       = fromNode && opts.mesh && opts.mesh.userData && opts.mesh.userData[k] && opts.mesh.userData[k][0] == '#'
 | 
						|
      if( nodeAlias ) pub(opts.mesh.userData[k], opts.mesh) // evaluate node alias
 | 
						|
      else pub.fragment(k,opts)
 | 
						|
    }
 | 
						|
  })
 | 
						|
  return frag
 | 
						|
}
 | 
						|
 | 
						|
pub.fragment = (k, opts ) => { // evaluate one fragment
 | 
						|
  let frag = opts.frag[k];
 | 
						|
 | 
						|
  let isPVorMediaFrag = frag.is( xrf.XRF.PV_EXECUTE ) || frag.is( xrf.XRF.T_MEDIAFRAG)
 | 
						|
  if( !opts.skipXRWG && isPVorMediaFrag ) pub.XRWG(k,opts)
 | 
						|
 | 
						|
  // call native function (xrf/env.js e.g.), or pass it to user decorator
 | 
						|
  if( xrf.frag[k] ){
 | 
						|
    xrf.emit(k,opts)
 | 
						|
    .then( () => {
 | 
						|
      let func = xrf.frag[k] || function(){} 
 | 
						|
      func( frag, opts)
 | 
						|
    })
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
pub.XRWG = (word,opts) => {
 | 
						|
  let {frag,scene,model,renderer} = opts 
 | 
						|
 | 
						|
  // if this query was triggered by an src-value, lets filter it
 | 
						|
  const isSRC = opts.embedded && opts.embedded.fragment == 'src'
 | 
						|
  if( !isSRC ){                             // spec : https://xrfragment.org/#src
 | 
						|
 | 
						|
    let triggeredByMesh = opts.model != opts.mesh
 | 
						|
 | 
						|
    let v      = frag[word]
 | 
						|
    let id     = v.is( xrf.XRF.T_DYNAMICKEY ) ? word : v.string || word 
 | 
						|
 | 
						|
    if( id == '#' || !id ) return
 | 
						|
    let match = xrf.XRWG.match(id)
 | 
						|
 | 
						|
    if( !triggeredByMesh && (v.is( xrf.XRF.PV_EXECUTE ) || v.is( xrf.XRF.T_DYNAMIC)) && !v.is( xrf.XRF.T_DYNAMICKEYVALUE ) ){
 | 
						|
      // evaluate global aliases or tag/objectnames
 | 
						|
      match.map( (w) => {
 | 
						|
        if( w.key == `#${id}` ){
 | 
						|
          if(  w.value && w.value[0] == '#' ){
 | 
						|
            // if value is alias, execute fragment value 
 | 
						|
            xrf.hashbus.pub( w.value, xrf.model, xrf.XRF.METADATA | xrf.XRF.PV_OVERRIDE | xrf.XRF.NAVIGATOR )
 | 
						|
          }
 | 
						|
        }
 | 
						|
      })
 | 
						|
      xrf.emit('dynamicKey',{ ...opts,v,frag,id,match,scene })
 | 
						|
    }else if( v.string ){
 | 
						|
      // evaluate global aliases 
 | 
						|
      xrf.emit('dynamicKeyValue',{ ...opts,v,frag,id,match,scene })
 | 
						|
    }else{
 | 
						|
      xrf.emit('dynamicKey',{ ...opts,v,frag,id,match,scene })
 | 
						|
    }
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
xrf.hashbus = { pub }
 | 
						|
xrf.frag   = {dynamic:{}}
 | 
						|
xrf.model  = {}
 | 
						|
xrf.mixers = []
 | 
						|
 | 
						|
xrf.init = ((init) => function(opts){
 | 
						|
  // operate in own subscene
 | 
						|
  let scene = new opts.THREE.Group()
 | 
						|
  xrf.clock  = new opts.THREE.Clock()
 | 
						|
 | 
						|
  // don't mess with original scene object 
 | 
						|
  // but with our own sub-scene
 | 
						|
  opts.scene.add(scene)
 | 
						|
  opts.sceneRoot = opts.scene
 | 
						|
  opts.scene = scene 
 | 
						|
  init(opts)
 | 
						|
  //if( opts.loaders ) Object.values(opts.loaders).map( xrf.patchLoader )
 | 
						|
 | 
						|
  xrf.patchRenderer(opts)
 | 
						|
  xrf.navigator.init()
 | 
						|
  xrf.interactive = xrf.interactiveGroup( xrf.THREE, xrf.renderer, xrf.camera)
 | 
						|
  // return xrfragment lib as 'xrf' query functor (like jquery)
 | 
						|
  for ( let i in xrf ) xrf.query[i] = xrf[i] 
 | 
						|
 | 
						|
  return xrf.query
 | 
						|
})(xrf.init)
 | 
						|
 | 
						|
xrf.patchRenderer = function(opts){
 | 
						|
  let {renderer,camera} = opts
 | 
						|
  renderer.xr.addEventListener( 'sessionstart', () => xrf.baseReferenceSpace = renderer.xr.getReferenceSpace() );
 | 
						|
  renderer.xr.enabled = true;
 | 
						|
  renderer.render = ((render) => function(scene,camera){
 | 
						|
    // update clock
 | 
						|
    let time = xrf.clock.delta = xrf.clock.getDelta()
 | 
						|
    xrf.emit('render',{scene,camera,time,render}) // allow fragments to do something at renderframe
 | 
						|
    render(scene,camera)
 | 
						|
    xrf.emit('renderPost',{scene,camera,time,render,renderer}) // allow fragments to do something after renderframe
 | 
						|
  })(renderer.render.bind(renderer))
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
xrf.getFile = (url) => url.split("/").pop().replace(/#.*/,'')
 | 
						|
 | 
						|
// parseModel event is essential for src.js to hook into embedded loaded models
 | 
						|
xrf.parseModel = function(model,url){
 | 
						|
  let file               = xrf.getFile(url)
 | 
						|
  model.file             = file
 | 
						|
  model.isXRF            = true
 | 
						|
  model.scene.isXRFRoot  = true
 | 
						|
  model.scene.traverse( (n) => {
 | 
						|
    n.isXRF = true 
 | 
						|
  }) // mark for deletion during reset()
 | 
						|
 | 
						|
  xrf.emit('parseModel',{model,url,file})
 | 
						|
}
 | 
						|
 | 
						|
xrf.loadModel = function(model,url,noadd){
 | 
						|
  let URI = xrfragment.URI.toAbsolute( xrf.navigator.URI, url )
 | 
						|
  let {directory,file,fragment,fileExt} = URI;
 | 
						|
  model.file = URI.file
 | 
						|
  xrf.model = model 
 | 
						|
 | 
						|
  if( !model.isXRF ) xrf.parseModel(model,url.replace(directory,"")) // this marks the model as an XRF model
 | 
						|
 | 
						|
  if(xrf.debug ) model.animations.map( (a) => console.log("anim: "+a.name) )
 | 
						|
 | 
						|
  // spec: 1. generate the XRWG
 | 
						|
  xrf.XRWG.generate({model,scene:model.scene})
 | 
						|
 | 
						|
  // spec: 2. init metadata inside model for non-SRC data
 | 
						|
  if( !model.isSRC ){
 | 
						|
    model.scene.traverse( (mesh) => xrf.parseModel.metadataInMesh(mesh,model) )
 | 
						|
  }
 | 
						|
  // spec: 1. execute the default predefined view '#' (if exist) (https://xrfragment.org/#predefined_view)
 | 
						|
  const defaultFragment = xrf.frag.defaultPredefinedViews({model,scene:model.scene})
 | 
						|
  // spec: predefined view(s) & objects-of-interest-in-XRWG from URI (https://xrfragment.org/#predefined_view)
 | 
						|
  let frag = xrf.hashbus.pub( url, model) // and eval URI XR fragments 
 | 
						|
 
 | 
						|
  if( !noadd ) xrf.add( model.scene )
 | 
						|
 | 
						|
  // only change url when loading *another* file
 | 
						|
  fragment = fragment || defaultFragment || ''
 | 
						|
  xrf.navigator.pushState( URI.external ? URI.URN + URI.file : URI.file, fragment.replace(/^#/,'') )
 | 
						|
  //if( fragment )  xrf.navigator.updateHash(fragment)
 | 
						|
 | 
						|
  xrf.emit('navigateLoaded',{url,model})
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
xrf.parseModel.metadataInMesh =  (mesh,model) => { 
 | 
						|
  if( mesh.userData ){
 | 
						|
    let frag = {}
 | 
						|
    for( let k in mesh.userData ) xrf.Parser.parse( k, mesh.userData[k], frag )
 | 
						|
    for( let k in frag ){
 | 
						|
      let opts = {frag, mesh, model, camera: xrf.camera, scene: model.scene, renderer: xrf.renderer, THREE: xrf.THREE, hashbus: xrf.hashbus }
 | 
						|
      mesh.userData.XRF = frag // allow fragment impl to access XRF obj already
 | 
						|
      xrf.emit('frag2mesh',opts)
 | 
						|
      .then( () => {
 | 
						|
        xrf.hashbus.pub.fragment(k, {...opts, skipXRWG:true}) 
 | 
						|
      })
 | 
						|
    }
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
xrf.getLastModel = ()           => xrf.model.last 
 | 
						|
 | 
						|
xrf.reset = () => {
 | 
						|
 | 
						|
  // allow others to reset certain events 
 | 
						|
  xrf.emit('reset',{})
 | 
						|
  
 | 
						|
  // reattach camera to root scene
 | 
						|
  xrf.scene.attach(xrf.camera) 
 | 
						|
  xrf.camera.position.set(0,0,0)
 | 
						|
  xrf.camera.updateMatrixWorld()
 | 
						|
  xrf.camera.getCam().updateMatrixWorld()
 | 
						|
 | 
						|
  const disposeObject = (obj) => {
 | 
						|
    if (obj.children.length > 0){ 
 | 
						|
      obj.children.forEach((child) => disposeObject(child));
 | 
						|
    }
 | 
						|
    if (obj.geometry) obj.geometry.dispose();
 | 
						|
    if (obj.material) {
 | 
						|
      if (obj.material.map) obj.material.map.dispose();
 | 
						|
      obj.material.dispose();
 | 
						|
    }
 | 
						|
    obj.clear()
 | 
						|
    obj.removeFromParent() 
 | 
						|
    return true
 | 
						|
  };
 | 
						|
  // also remove XRF objects from global scene
 | 
						|
  let nodes = []
 | 
						|
  xrf.scene.traverse( (child) => child.isXRF && (nodes.push(child)) )
 | 
						|
  nodes.map( disposeObject )
 | 
						|
  xrf.interactive.clear()
 | 
						|
  xrf.layers = 0
 | 
						|
}
 | 
						|
 | 
						|
xrf.add = (object) => {
 | 
						|
  object.isXRF = true // mark for easy deletion when replacing scene
 | 
						|
  xrf.scene.add(object)
 | 
						|
}
 | 
						|
 | 
						|
xrf.hasNoMaterial = (mesh) => {
 | 
						|
  const hasTexture        = mesh.material && mesh.material.map 
 | 
						|
  const hasMaterialName   = mesh.material && mesh.material.name.length > 0 
 | 
						|
  return mesh.geometry && !hasMaterialName && !hasTexture
 | 
						|
}
 | 
						|
 | 
						|
xrf.navigator = {
 | 
						|
  opts: {
 | 
						|
    openInNewTab: true
 | 
						|
  },
 | 
						|
  URI: xrf.URI.parse(document.location.href)
 | 
						|
 //   scheme:    document.location.protocol.replace(/:$/,''),
 | 
						|
 //   directory: document.location.pathname,
 | 
						|
 //   host:      document.location.hostname,
 | 
						|
 //   port:      document.location.port,
 | 
						|
 //   file:      'index.glb'
 | 
						|
 // }
 | 
						|
}
 | 
						|
 | 
						|
xrf.navigator.to = (url,flags,loader,data) => {
 | 
						|
  if( !url ) throw 'xrf.navigator.to(..) no url given'
 | 
						|
  let hashbus       = xrf.hashbus
 | 
						|
  let URI
 | 
						|
 | 
						|
  if( typeof url == 'string' ){
 | 
						|
    URI = xrfragment.URI.toAbsolute( xrf.navigator.URI, url )
 | 
						|
    URI.hash          = xrf.navigator.reactifyHash(URI.hash) // automatically reflect hash-changes to navigator.to(...)
 | 
						|
    // decorate with extra state
 | 
						|
    URI.fileChange    = URI.file && URI.URN + URI.file != xrf.navigator.URI.URN + xrf.navigator.URI.file 
 | 
						|
    console.log( URI.URN + URI.file )
 | 
						|
    console.log( xrf.navigator.URI.URN + xrf.navigator.URI.file  )
 | 
						|
    URI.external      = URI.file && URI.URN != document.location.origin + document.location.pathname 
 | 
						|
    URI.hasPos        = URI.hash.pos ? true : false
 | 
						|
    URI.duplicatePos  = URI.source == xrf.navigator.URI.source && URI.hasPos
 | 
						|
    URI.hashChange    = String(xrf.navigator.URI.fragment||"") != String(URI.fragment||"")
 | 
						|
  }else{ 
 | 
						|
    URI = url
 | 
						|
    url = URI.source
 | 
						|
  }
 | 
						|
 | 
						|
  URI.last = xrf.navigator.URI
 | 
						|
  xrf.navigator.URI = URI
 | 
						|
  let {directory,file,fragment,fileExt} = URI;
 | 
						|
 | 
						|
  const evalFragment  = () => {
 | 
						|
    if( URI.fragment ){
 | 
						|
      hashbus.pub( URI.fragment, xrf.model, flags )     // eval local URI XR fragments 
 | 
						|
      xrf.navigator.updateHash(fragment)                // which don't require 
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  return new Promise( (resolve,reject) => {
 | 
						|
    xrf
 | 
						|
    .emit('navigate', {url,loader,data})
 | 
						|
    .then( () => {
 | 
						|
 | 
						|
      const Loader = xrf.loaders[fileExt]
 | 
						|
 | 
						|
      if( fileExt && !loader ){  
 | 
						|
        if( !Loader ) return resolve()
 | 
						|
        loader = loader || new Loader().setPath( URI.URN )
 | 
						|
      }
 | 
						|
 | 
						|
      if( URI.duplicatePos || (!Object.values(URI.XRF).length && !URI.file && !URI.fileExt) ){ 
 | 
						|
        return resolve(xrf.model) // nothing we can do here
 | 
						|
      }
 | 
						|
      if( xrf.model && !URI.fileChange && URI.hashChange && !URI.hasPos  ){
 | 
						|
        evalFragment()
 | 
						|
        return resolve(xrf.model)                         // eval non-positional fragments (no loader needed)
 | 
						|
      }
 | 
						|
      xrf
 | 
						|
      .emit('navigateLoading', {url,loader,data})
 | 
						|
      .then( () => {
 | 
						|
        if( (!URI.fileChange || !file) && URI.hashChange && URI.hasPos ){                 // we're already loaded
 | 
						|
          evalFragment()
 | 
						|
          xrf.emit('navigateLoaded',{url})
 | 
						|
          return resolve(xrf.model) 
 | 
						|
        }
 | 
						|
 | 
						|
        // clear xrf objects from scene
 | 
						|
        if( xrf.model && xrf.model.scene ) xrf.model.scene.visible = false
 | 
						|
        xrf.reset() 
 | 
						|
 | 
						|
        // force relative path for files which dont include protocol or relative path
 | 
						|
        if( directory ) directory = directory[0] == '.' || directory.match("://") ? directory : `.${directory}`
 | 
						|
 | 
						|
        if( loader || Loader ){
 | 
						|
          const onLoad = (model) => {
 | 
						|
            xrf.loadModel(model,url)
 | 
						|
            resolve(model)
 | 
						|
          }
 | 
						|
    
 | 
						|
          loader = loader || new Loader().setPath( URI.URN )
 | 
						|
          if( data ){  // file upload
 | 
						|
            loader.parse(data, "", onLoad )
 | 
						|
          }else{
 | 
						|
            try{
 | 
						|
              loader.load(file, onLoad )
 | 
						|
            }catch(e){ 
 | 
						|
              console.error(e)
 | 
						|
              xrf.emit('navigateError',{url})
 | 
						|
            }
 | 
						|
          }
 | 
						|
        }else xrf.emit('navigateError',{url,URI})
 | 
						|
      })
 | 
						|
    })
 | 
						|
  })
 | 
						|
}
 | 
						|
 | 
						|
xrf.navigator.init = () => {
 | 
						|
  if( xrf.navigator.init.inited ) return
 | 
						|
 | 
						|
  xrf.navigator.URI = xrfragment.URI.parse(document.location.href)
 | 
						|
 | 
						|
  window.addEventListener('popstate', function (event){
 | 
						|
    if( xrf.navigator.updateHash.active && document.location.hash.length > 1 ){ // ignore programmatic hash updates (causes infinite recursion)
 | 
						|
      xrf.navigator.to( xrf.navigator.URI.last )
 | 
						|
    }
 | 
						|
  })
 | 
						|
  
 | 
						|
  window.addEventListener('hashchange', function (e){
 | 
						|
    xrf.emit('hash', {hash: document.location.hash })
 | 
						|
  })
 | 
						|
 | 
						|
  // allow other libraries to trigger popstate event without triggering the navigate-fallbacks  during pageload
 | 
						|
  setTimeout( () => {
 | 
						|
    xrf.navigator.setupNavigateFallbacks()
 | 
						|
  }, 2500 )
 | 
						|
 | 
						|
  // this allows selectionlines to be updated according to the camera (renderloop)
 | 
						|
  xrf.focusLine = new xrf.THREE.Group()
 | 
						|
  xrf.focusLine.material = new xrf.THREE.LineDashedMaterial({color:0xFF00FF,linewidth:3, scale: 1, dashSize: 0.2, gapSize: 0.1,opacity:0.3, transparent:true})
 | 
						|
  xrf.focusLine.isXRF = true
 | 
						|
  xrf.focusLine.position.set(0,0,-0.5);
 | 
						|
  xrf.focusLine.points = []
 | 
						|
  xrf.focusLine.lines  = []
 | 
						|
  xrf.camera.add(xrf.focusLine)
 | 
						|
 | 
						|
  xrf.navigator.init.inited = true
 | 
						|
}
 | 
						|
 | 
						|
xrf.navigator.setupNavigateFallbacks = () => {
 | 
						|
 | 
						|
  xrf.addEventListener('navigate', (opts) => {
 | 
						|
    let {url} = opts
 | 
						|
    let {fileExt} = xrfragment.URI.parse(url)
 | 
						|
 | 
						|
    // handle http links
 | 
						|
    if( url.match(/^http/) && url != xrf.navigator.URI.URN && !xrf.loaders[fileExt] ){
 | 
						|
      let inIframe
 | 
						|
      try { inIframe = window.self !== window.top; } catch (e) { inIframe = true; }
 | 
						|
      if( inIframe ){
 | 
						|
        window.parent.postMessage({ url }, '*')
 | 
						|
      }else{ 
 | 
						|
        if( xrf.navigator.opts.openInNewTab ) window.open( url, '_blank')
 | 
						|
        else{ setTimeout( () => document.location.href = url, 1000) }
 | 
						|
      }
 | 
						|
      // in case you're running in an iframe, then use this in the parent page:
 | 
						|
      //
 | 
						|
      // window.addEventListener("message", (e) => {
 | 
						|
      //   if (e.data && e.data.url){
 | 
						|
      //     window.open( e.data.url, '_blank')
 | 
						|
      //   }
 | 
						|
      // },
 | 
						|
      //   false,
 | 
						|
      // );
 | 
						|
    }
 | 
						|
  })
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
xrf.navigator.updateHash = (hash,opts) => {
 | 
						|
  if( hash.replace(/^#/,'') == document.location.hash.substr(1) || hash.match(/\|/) ) return  // skip unnecesary pushState triggers
 | 
						|
  console.log(`URI: ${document.location.search.substr(1)}#${hash}`)
 | 
						|
  xrf.navigator.updateHash.active = false  // important to prevent recursion
 | 
						|
  document.location.hash = hash
 | 
						|
  xrf.navigator.updateHash.active = true
 | 
						|
}
 | 
						|
xrf.navigator.updateHash.active = true
 | 
						|
 | 
						|
xrf.navigator.pushState = (file,hash) => {
 | 
						|
  if( file == document.location.search.substr(1) ) return // page is in its default state
 | 
						|
  window.history.pushState({}, '', document.location.pathname + `?${xrf.navigator.URI.source.replace(/#.*/,'')}#${hash}` )
 | 
						|
  xrf.emit('pushState', {file, hash} )
 | 
						|
}
 | 
						|
 | 
						|
xrf.navigator.reactifyHash = ( obj ) => {
 | 
						|
  return new Proxy(obj,{
 | 
						|
    get(me,k)  { return me[k] },
 | 
						|
    set(me,k,v){ 
 | 
						|
      me[k] = v 
 | 
						|
      if( xrf.navigator.updateHash.active ){
 | 
						|
        xrf.navigator.to( "#" + this.toString(me) )
 | 
						|
      }
 | 
						|
      xrf.navigator.URI.fragment = this.toString(me)
 | 
						|
    },
 | 
						|
    toString(me){
 | 
						|
      let parts = []
 | 
						|
      Object.keys(me).map( (k) => {
 | 
						|
        parts.push( me[k] ? `${k}=${me[k]}` : k ) 
 | 
						|
      })
 | 
						|
      return parts.join('&')
 | 
						|
    }
 | 
						|
  })
 | 
						|
}
 | 
						|
/**
 | 
						|
 * 
 | 
						|
 * navigation, portals & mutations
 | 
						|
 * 
 | 
						|
 * | fragment | type | scope | example value |
 | 
						|
 * |`href`| string (uri or predefined view) | 🔒 |`#pos=1,1,0`<br>`#pos=1,1,0&rot=90,0,0`<br>`#pos=pyramid`<br>`#pos=lastvisit|pyramid`<br>`://somefile.gltf#pos=1,1,0`<br> |
 | 
						|
 * 
 | 
						|
 * [[» example implementation|https://github.com/coderofsalvation/xrfragment/blob/main/src/3rd/three/xrf/href.js]]<br>
 | 
						|
 * [[» example 3D asset|https://github.com/coderofsalvation/xrfragment/blob/main/example/assets/href.gltf#L192]]<br>
 | 
						|
 * [[» discussion|https://github.com/coderofsalvation/xrfragment/issues/1]]<br>
 | 
						|
 *
 | 
						|
 * [img[xrfragment.jpg]]
 | 
						|
 * 
 | 
						|
 * 
 | 
						|
 * !!!spec 1.0
 | 
						|
 * 
 | 
						|
 * 1. an ''external''- or ''file URI'' fully replaces the current scene and assumes `pos=0,0,0&rot=0,0,0` by default (unless specified)
 | 
						|
 * 
 | 
						|
 * 2. navigation should not happen when queries (`q=`) are present in local url: queries will apply (`pos=`, `rot=` e.g.) to the targeted object(s) instead.
 | 
						|
 * 
 | 
						|
 * 3. navigation should not happen ''immediately'' when user is more than 2 meter away from the portal/object containing the href (to prevent accidental navigation e.g.)
 | 
						|
 * 
 | 
						|
 * 4. URL navigation should always be reflected in the client (in case of javascript: see [[here|https://github.com/coderofsalvation/xrfragment/blob/dev/src/3rd/three/navigator.js]] for an example navigator).
 | 
						|
 * 
 | 
						|
 * 5. In XR mode, the navigator back/forward-buttons should be always visible (using a wearable e.g., see [[here|https://github.com/coderofsalvation/xrfragment/blob/dev/example/aframe/sandbox/index.html#L26-L29]] for an example wearable)
 | 
						|
 * 
 | 
						|
 * [img[navigation.png]]
 | 
						|
 * 
 | 
						|
 */
 | 
						|
 | 
						|
xrf.frag.href = function(v, opts){
 | 
						|
  let { frag, mesh, model, camera, scene, renderer, THREE} = opts
 | 
						|
 | 
						|
  if( mesh.userData.XRF.href.exec ) return // mesh already initialized
 | 
						|
 | 
						|
  // correct for relative urls
 | 
						|
  if( v.string.charAt(0) != '#' && xrf.URI.isRelative( xrf.URI.parse( v.string ) ) ){
 | 
						|
    v.string = xrf.navigator.URI.URN + v.string 
 | 
						|
  }
 | 
						|
 | 
						|
  let click = mesh.userData.XRF.href.exec = (e) => {
 | 
						|
 | 
						|
    if( !mesh.material || !(mesh.material && mesh.material.visible) ) return // ignore invisible nodes
 | 
						|
 | 
						|
    // update our values to the latest value (might be edited)
 | 
						|
    let URI = xrf.URI.template( mesh.userData.href, xrf.URI.vars.__object )
 | 
						|
    xrf.Parser.parse( "href", URI, frag )
 | 
						|
    const v  = frag.href
 | 
						|
    
 | 
						|
    // bubble up!
 | 
						|
    mesh.traverseAncestors( (n) => n.userData && n.userData.href && n.dispatchEvent({type:e.type,data:{}}) )
 | 
						|
 | 
						|
    let fragValue = xrf.URI.parse( v.string, xrf.XRF.NAVIGATOR | xrf.XRF.PV_OVERRIDE | xrf.XRF.METADATA )
 | 
						|
 | 
						|
    let lastPos   = `pos=${camera.position.x.toFixed(2)},${camera.position.y.toFixed(2)},${camera.position.z.toFixed(2)}`
 | 
						|
    xrf
 | 
						|
    .emit('href',{click:true,mesh,xrf:v,value: fragValue}) // let all listeners agree
 | 
						|
    .then( () => {
 | 
						|
 | 
						|
      const isLocal = v.string[0] == '#'
 | 
						|
      const hasPos  = isLocal && v.string.match(/pos=/)
 | 
						|
      const flags   = isLocal ? xrf.XRF.PV_OVERRIDE : undefined
 | 
						|
 | 
						|
      if( v.xrfScheme ){
 | 
						|
        xrf.hashbus.pub(v.string)
 | 
						|
      } else xrf.navigator.to(v.string)    // let's surf
 | 
						|
    }) 
 | 
						|
    .catch( console.error )
 | 
						|
  }
 | 
						|
 | 
						|
 | 
						|
  let selected = mesh.userData.XRF.href.selected = (state) => () => {
 | 
						|
    if( !mesh.material || !mesh.material?.visible || mesh.isSRC ) return // ignore invisible nodes
 | 
						|
    if( mesh.selected == state ) return // nothing changed 
 | 
						|
 | 
						|
    console.dir({state, mselected:mesh.selected})
 | 
						|
 | 
						|
 | 
						|
    xrf.interactive.objects.map( (o) => {
 | 
						|
      let newState = o.name == mesh.name ? state : false
 | 
						|
      if( o.material ){
 | 
						|
        if( o.material.uniforms && o.material.uniforms.selected ) o.material.uniforms.selected.value = newState 
 | 
						|
        //if( o.material.emissive ) o.material.emissive.r = o.material.emissive.g = o.material.emissive.b = newState ? 2.0 : 1.0
 | 
						|
        if( o.material.emissive ){ 
 | 
						|
          if( !o.material.emissive.original ) o.material.emissive.original = o.material.emissive.clone()
 | 
						|
          o.material.emissive.r = o.material.emissive.g = o.material.emissive.b = 
 | 
						|
            newState ? o.material.emissive.original.r + 0.2 : o.material.emissive.original.r
 | 
						|
        }
 | 
						|
      }
 | 
						|
    })
 | 
						|
    // update mouse cursor
 | 
						|
    if( !renderer.domElement.lastCursor )
 | 
						|
      renderer.domElement.lastCursor = renderer.domElement.style.cursor
 | 
						|
    renderer.domElement.style.cursor = state ? 'pointer' : renderer.domElement.lastCursor 
 | 
						|
 | 
						|
    xrf
 | 
						|
    .emit('href',{selected:state,mesh,xrf:v}) // let all listeners agree
 | 
						|
    .then( () => mesh.selected = state )
 | 
						|
  }
 | 
						|
 | 
						|
  mesh.addEventListener('click', click )
 | 
						|
  mesh.addEventListener('mousemove', selected(true) )
 | 
						|
  mesh.addEventListener('mouseenter', selected(true) )
 | 
						|
  mesh.addEventListener('mouseleave', selected(false) )
 | 
						|
 | 
						|
  if( mesh.material ) mesh.material = mesh.material.clone() // clone, so we can individually highlight meshes
 | 
						|
 | 
						|
  // lazy add mesh (because we're inside a recursive traverse)
 | 
						|
  setTimeout( (mesh) => {
 | 
						|
    xrf.interactive.add(mesh)
 | 
						|
    xrf.emit('interactionReady', {mesh,xrf:v,clickHandler: mesh.userData.XRF.href.exec })
 | 
						|
  }, 0, mesh )
 | 
						|
}
 | 
						|
 | 
						|
xrf.addEventListener('audioInited', function(opts){
 | 
						|
  let {THREE,listener} = opts
 | 
						|
  opts.audio = opts.audio || {}
 | 
						|
  opts.audio.click    = opts.audio.click    || '/dist/audio/click.wav'
 | 
						|
  opts.audio.hover    = opts.audio.hover    || '/dist/audio/hover.wav'
 | 
						|
  opts.audio.teleport = opts.audio.teleport || '/dist/audio/teleport.wav'
 | 
						|
 | 
						|
  let audio = xrf.frag.href.audio = {}
 | 
						|
 | 
						|
  const actions = ['click','hover','teleport']
 | 
						|
  actions.map( (action) => {
 | 
						|
    const audioLoader = new THREE.AudioLoader();
 | 
						|
    audio[action] = new THREE.Audio( xrf.camera.listener )
 | 
						|
    audioLoader.load( opts.audio[action], function( buffer ) {
 | 
						|
      audio[action].setBuffer( buffer );
 | 
						|
    })
 | 
						|
  });
 | 
						|
 | 
						|
  xrf.addEventListener('href', (opts) => {
 | 
						|
    let v = opts.xrf
 | 
						|
    if( opts.selected ){
 | 
						|
      xrf.frag.href.audio.hover.stop() 
 | 
						|
      xrf.frag.href.audio.hover.play() 
 | 
						|
      return
 | 
						|
    }
 | 
						|
    if( opts.click ){
 | 
						|
      xrf.frag.href.audio.click.stop() 
 | 
						|
      xrf.frag.href.audio.click.play() 
 | 
						|
      return
 | 
						|
    }
 | 
						|
  })
 | 
						|
 | 
						|
  xrf.addEventListener('navigateLoading', (e) => {
 | 
						|
      if( !e.url || !e.url.match(/.*#.*pos=/) ) return
 | 
						|
      xrf.frag.href.audio.click.stop() 
 | 
						|
      xrf.frag.href.audio.teleport.stop() 
 | 
						|
      xrf.frag.href.audio.teleport.play() 
 | 
						|
  })
 | 
						|
 | 
						|
 | 
						|
})
 | 
						|
 | 
						|
/**
 | 
						|
 * > above solutions were abducted from [[this|https://i.imgur.com/E3En0gJ.png]] and [[this|https://i.imgur.com/lpnTz3A.png]] survey result
 | 
						|
 *
 | 
						|
 * !!!Demo
 | 
						|
 * 
 | 
						|
 * <$videojs controls="controls" aspectratio="16:9" preload="auto" poster="" fluid="fluid" class="vjs-big-play-centered">
 | 
						|
 *   <source src="https://coderofsalvation.github.io/xrfragment.media/href.mp4" type="video/mp4"/>
 | 
						|
 * </$videojs>
 | 
						|
 * 
 | 
						|
 * > capture of <a href="./example/aframe/sandbox" target="_blank">aframe/sandbox</a>
 | 
						|
 */
 | 
						|
// this is called by navigator.js rather than by a URL e.g.
 | 
						|
 | 
						|
xrf.frag['#'] = xrf.frag.defaultPredefinedViews = (opts) => {
 | 
						|
  let {scene,model} = opts;
 | 
						|
  if( !scene ) return
 | 
						|
  let defaultFragment;
 | 
						|
  scene.traverse( (n) => {
 | 
						|
    if( n.userData && n.userData['#'] ){
 | 
						|
      if( n.isXRFRoot ){ 
 | 
						|
        defaultFragment = n.userData['#']
 | 
						|
      }
 | 
						|
      xrf.hashbus.pub( n.userData['#'], n )   // evaluate default XR fragments without affecting URL
 | 
						|
    }
 | 
						|
  })
 | 
						|
  return defaultFragment
 | 
						|
}
 | 
						|
xrf.frag.loop = function(v, opts){
 | 
						|
  let { frag, mesh, model, camera, scene, renderer, THREE} = opts
 | 
						|
 | 
						|
  // handle object media players
 | 
						|
  if( mesh && mesh.media ){
 | 
						|
    for( let i in mesh.media ) mesh.media[i].set("loop",v)
 | 
						|
    return
 | 
						|
  }
 | 
						|
 | 
						|
  // otherwise handle global 3D animations
 | 
						|
  xrf.mixers.map ( (mixer) => {
 | 
						|
    // update loop
 | 
						|
    mixer.loop.enabled  = v.loop 
 | 
						|
 | 
						|
  })
 | 
						|
 | 
						|
}
 | 
						|
xrf.frag.pos = function(v, opts){
 | 
						|
  let { frag, mesh, model, camera, scene, renderer, THREE} = opts
 | 
						|
 | 
						|
  if( !scene )return
 | 
						|
 | 
						|
  let pos = v
 | 
						|
  // spec: indirect coordinate using objectname: https://xrfragment.org/#navigating%203D
 | 
						|
  if( pos.x == undefined ){
 | 
						|
    let obj = scene.getObjectByName(v.string)
 | 
						|
    if( !obj ) return console.warn("#pos="+v.string+" not found")
 | 
						|
    obj.add(camera) // follow animation of targeted position
 | 
						|
    camera.position.set(0,0,0) // set playerheight 
 | 
						|
    //let c = camera.rotation
 | 
						|
    //c.set( c.x, obj.rotation.y, c.z )
 | 
						|
    
 | 
						|
  }else{ 
 | 
						|
    // spec: direct coordinate: https://xrfragment.org/#navigating%203D
 | 
						|
    camera.position.x = pos.x
 | 
						|
    camera.position.y = pos.y
 | 
						|
    camera.position.z = pos.z
 | 
						|
  }
 | 
						|
 | 
						|
  if( xrf.debug ) console.log(`#pos.js: setting camera to position ${pos.x},${pos.y},${pos.z}`)
 | 
						|
  xrf.frag.pos.last = v.string // remember
 | 
						|
  xrf.frag.pos.lastVector3 = camera.position.clone()
 | 
						|
 | 
						|
  camera.updateMatrixWorld()
 | 
						|
  camera.getCam().updateMatrixWorld()
 | 
						|
}
 | 
						|
 | 
						|
xrf.frag.pos.get = function(precision,randomize){
 | 
						|
    if( !precision ) precision = 2;
 | 
						|
    if( typeof THREE == 'undefined' ) THREE = xrf.THREE
 | 
						|
    let radToDeg  = THREE.MathUtils.radToDeg
 | 
						|
    let toDeg     = (x) => x / (Math.PI / 180)
 | 
						|
    let camera    = xrf.camera 
 | 
						|
    if( randomize ){
 | 
						|
      camera.position.x += Math.random()/10
 | 
						|
      camera.position.z += Math.random()/10
 | 
						|
    }
 | 
						|
 | 
						|
    // *TODO* add camera direction
 | 
						|
    let direction = new xrf.THREE.Vector3()
 | 
						|
    camera.getWorldDirection(direction)
 | 
						|
    const pitch   = Math.asin(direction.y);
 | 
						|
    const yaw     = Math.atan2(direction.x, direction.z);
 | 
						|
    const pitchInDegrees = pitch * 180 / Math.PI;
 | 
						|
    const yawInDegrees = yaw * 180 / Math.PI;
 | 
						|
 | 
						|
    return {
 | 
						|
      x: String(camera.position.x.toFixed(2)),
 | 
						|
      y: String(camera.position.y.toFixed(2)),
 | 
						|
      z: String(camera.position.z.toFixed(2)),
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
xrf.addEventListener('reset', (opts) => {
 | 
						|
  // set the player to position 0,0,0
 | 
						|
  xrf.camera.position.set(0,0,0)
 | 
						|
})
 | 
						|
xrf.frag.rot = function(v, opts){
 | 
						|
  let { frag, mesh, model, camera, scene, renderer, THREE} = opts
 | 
						|
  if( xrf.debug ) console.log("#rot.js: setting camera rotation to "+v.string)
 | 
						|
 | 
						|
  if( !camera || !scene ) return 
 | 
						|
 | 
						|
  if( !model.isSRC ){
 | 
						|
    camera.rotation.set( 
 | 
						|
      v.x * Math.PI / 180,
 | 
						|
      v.y * Math.PI / 180,
 | 
						|
      v.z * Math.PI / 180
 | 
						|
    )
 | 
						|
    camera.rotation.offset = camera.rotation.clone() // remember
 | 
						|
    //camera.updateProjectionMatrix()
 | 
						|
  }else{
 | 
						|
    obj = model.scene.isReparented ? model.scene.children[0] : model.scene
 | 
						|
    obj.rotation.set( 
 | 
						|
      v.x * Math.PI / 180,
 | 
						|
      v.y * Math.PI / 180,
 | 
						|
      v.z * Math.PI / 180
 | 
						|
    )
 | 
						|
  }
 | 
						|
}
 | 
						|
xrf.frag.s = function(v, opts){
 | 
						|
  let { frag, mesh, model, camera, scene, renderer, THREE} = opts
 | 
						|
 | 
						|
  // handle object media players
 | 
						|
  if( mesh && mesh.media ){
 | 
						|
    for( let i in mesh.media ) mesh.media[i].set("s",v)
 | 
						|
    return
 | 
						|
  }
 | 
						|
 | 
						|
  // otherwise handle global 3D animations
 | 
						|
  xrf.mixers.map ( (mixer) => {
 | 
						|
    mixer.s = v
 | 
						|
    
 | 
						|
    // update speed
 | 
						|
    mixer.timeScale     = v.x || 1.0 
 | 
						|
    mixer.loop.speed    = v.x || 1.0
 | 
						|
    mixer.loop.speedAbs = Math.abs( v.x )
 | 
						|
 | 
						|
  })
 | 
						|
 | 
						|
}
 | 
						|
// *TODO* use webgl instancing
 | 
						|
 | 
						|
xrf.frag.src = function(v, opts){
 | 
						|
  opts.embedded = v // indicate embedded XR fragment
 | 
						|
  let { mesh, model, camera, scene, renderer, THREE, hashbus, frag} = opts
 | 
						|
 | 
						|
  if( mesh.isSRC ) return // only embed src once 
 | 
						|
 | 
						|
  opts.isLocal  = v.string[0] == '#'
 | 
						|
  opts.isPortal = xrf.frag.src.renderAsPortal(mesh)
 | 
						|
  opts.isSRC    = mesh.isSRC = true 
 | 
						|
 | 
						|
  // correct for relative urls
 | 
						|
  let url = v.string
 | 
						|
  if( v.string.charAt(0) != '#' && xrf.URI.isRelative( xrf.URI.parse( v.string ) ) ){
 | 
						|
    url = xrf.navigator.URI.URN + v.string 
 | 
						|
  }
 | 
						|
  url       = xrf.frag.src.expandURI( mesh, url )
 | 
						|
 | 
						|
  let srcFrag   = opts.srcFrag = xrfragment.URI.parse(url).XRF
 | 
						|
 | 
						|
 | 
						|
  if(xrf.debug) console.log(`src.js: instancing ${opts.isLocal?'local':'remote'} object ${url}`)
 | 
						|
 | 
						|
  if( opts.isLocal ){
 | 
						|
    xrf.frag.src.localSRC(url,srcFrag,opts)         // local
 | 
						|
  }else xrf.frag.src.externalSRC(url,srcFrag,opts)  // external file
 | 
						|
 | 
						|
  xrf.hashbus.pub( url.replace(/.*#/,''), mesh)     // eval src-url fragments
 | 
						|
}
 | 
						|
 | 
						|
xrf.frag.src.expandURI = function(mesh,uri){
 | 
						|
  if( uri ) mesh.userData.srcTemplate = uri
 | 
						|
  mesh.userData.src = xrf.URI.template( mesh.userData.srcTemplate, xrf.URI.vars.__object )
 | 
						|
  return mesh.userData.src
 | 
						|
}
 | 
						|
 | 
						|
xrf.frag.src.addModel = (model,url,frag,opts) => {
 | 
						|
  let {mesh} = opts
 | 
						|
  let scene = model.scene
 | 
						|
  scene = xrf.frag.src.filterScene(scene,{...opts,frag})         // get filtered scene
 | 
						|
  if( mesh.material && mesh.userData.src ) mesh.material.visible = false  // hide placeholder object
 | 
						|
 | 
						|
  if( opts.isPortal ){
 | 
						|
    xrf.portalNonEuclidian({...opts,model,scene:model.scene})
 | 
						|
    // only add external objects, because 
 | 
						|
    // local scene-objects are already added to scene
 | 
						|
    if( !opts.isLocal ) xrf.add(scene) 
 | 
						|
  }else{
 | 
						|
    xrf.frag.src.scale( scene, opts, url )           // scale scene
 | 
						|
    mesh.add(scene)
 | 
						|
  }
 | 
						|
  xrf.frag.src.enableSourcePortation({...opts, scene,mesh,url,model})
 | 
						|
  // flag everything isSRC & isXRF
 | 
						|
  mesh.isXRF = scene.isXRF = true
 | 
						|
  mesh.traverse( (n) => { n.isSRC = n.isXRF = n[ opts.isLocal ? 'isSRCLocal' : 'isSRCExternal' ] = true })
 | 
						|
 
 | 
						|
  xrf.emit('parseModel', {...opts, isSRC:true, mesh, model}) // this will execute all embedded metadata/fragments e.g.
 | 
						|
}
 | 
						|
 | 
						|
xrf.frag.src.renderAsPortal = (mesh) => {
 | 
						|
  // *TODO* should support better isFlat(mesh) check
 | 
						|
  const isPlane           = mesh.geometry && mesh.geometry.attributes.uv && mesh.geometry.attributes.uv.count == 4 
 | 
						|
  return xrf.hasNoMaterial(mesh) && isPlane
 | 
						|
}
 | 
						|
 | 
						|
xrf.frag.src.enableSourcePortation = (opts) => {
 | 
						|
  let {scene,mesh,url,model,THREE} = opts
 | 
						|
  if( url[0] == '#' ) return
 | 
						|
 | 
						|
  url = url.replace(/(&)?[-][\w-+\.]+(&)?/g,'&') // remove negative selectors to refer to original scene
 | 
						|
 | 
						|
  if( !mesh.userData.href ){ 
 | 
						|
    // show sourceportation clickable sphere for non-portals
 | 
						|
    let scale = new THREE.Vector3()
 | 
						|
    let size  = new THREE.Vector3()
 | 
						|
    scene.getWorldScale(scale)
 | 
						|
    new THREE.Box3().setFromObject(scene).getSize(size)
 | 
						|
    const geo    = new THREE.SphereGeometry( Math.max(size.x, size.y, size.z) * scale.x * 0.33, 10, 10 )
 | 
						|
    const mat    = new THREE.MeshBasicMaterial()
 | 
						|
    mat.visible = false // we just use this for collisions
 | 
						|
    const sphere = new THREE.Mesh( geo, mat )
 | 
						|
    sphere.isXRF = true
 | 
						|
    // reparent scene to sphere
 | 
						|
    let children = mesh.children
 | 
						|
    mesh.children = []
 | 
						|
    mesh.add(sphere)
 | 
						|
    children.map( (c) => sphere.add(c) )
 | 
						|
    // make sphere clickable/hoverable
 | 
						|
    let frag = {}
 | 
						|
    xrf.Parser.parse("href", url, frag)
 | 
						|
    sphere.userData = scene.userData  // allow rich href notifications/hovers
 | 
						|
    sphere.userData.href = url.replace(/#.*/,'') // remove fragments to refer to original scene
 | 
						|
    sphere.userData.XRF  = frag
 | 
						|
    xrf.hashbus.pub.fragment("href", {...opts, mesh:sphere, frag, skipXRWG:true, renderer:xrf.renderer, camera:xrf.camera }) 
 | 
						|
  }
 | 
						|
  for ( let i in scene.userData ) {
 | 
						|
    if( !mesh.userData[i] ) mesh.userData[i] = scene.userData[i] // allow rich href notifications/hovers
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
xrf.frag.src.externalSRC = (url,frag,opts) => {
 | 
						|
  fetch(url, { method: 'HEAD' })
 | 
						|
  .then( (res) => {
 | 
						|
    let mimetype = res.headers.get('Content-type')
 | 
						|
    if(xrf.debug != undefined ) console.log("HEAD "+url+" => "+mimetype)
 | 
						|
    if( url.replace(/#.*/,'').match(/\.(gltf|glb)$/)     ) mimetype = 'gltf'
 | 
						|
    if( url.replace(/#.*/,'').match(/\.(frag|fs|glsl)$/) ) mimetype = 'x-shader/x-fragment'
 | 
						|
    if( url.replace(/#.*/,'').match(/\.(vert|vs)$/)      ) mimetype = 'x-shader/x-fragment'
 | 
						|
    //if( url.match(/\.(fbx|stl|obj)$/) ) mimetype = 
 | 
						|
    opts = { ...opts, frag, mimetype }
 | 
						|
    return xrf.frag.src.type[ mimetype ] ? xrf.frag.src.type[ mimetype ](url,opts) : xrf.frag.src.type.unknown(url,opts)
 | 
						|
  })
 | 
						|
  .then( (model) => {
 | 
						|
    if( model && model.scene ) xrf.frag.src.addModel(model, url, frag, opts )
 | 
						|
  })
 | 
						|
  .finally( () => { })
 | 
						|
  .catch( console.error )
 | 
						|
  return xrf.frag.src
 | 
						|
}
 | 
						|
 | 
						|
xrf.frag.src.localSRC = (url,frag,opts) => {
 | 
						|
  let {model,mesh,scene} = opts
 | 
						|
  //setTimeout( (mesh,scene) => {
 | 
						|
    if( mesh.material ) mesh.material = mesh.material.clone() // clone, so we can individually highlight meshes
 | 
						|
    let _model = {
 | 
						|
      animations: model.animations,
 | 
						|
      scene: scene.clone()
 | 
						|
    }
 | 
						|
    _model.scene.isClone = true
 | 
						|
    _model.scene.traverse( (n) => n.isXRF = true )  // make sure they respond to xrf.reset()
 | 
						|
    _model.scenes = [_model.scene]
 | 
						|
    xrf.frag.src.addModel(_model,url,frag, opts)    // current file 
 | 
						|
  //},1000,mesh,scene )
 | 
						|
}
 | 
						|
 | 
						|
// scale embedded XR fragments https://xrfragment.org/#scaling%20of%20instanced%20objects
 | 
						|
xrf.frag.src.scale = function(scene, opts, url){
 | 
						|
    let { mesh, model, camera, renderer, THREE} = opts
 | 
						|
    // remove invisible objects (hidden by selectors) which might corrupt boundingbox size-detection 
 | 
						|
    let cleanScene = scene.clone()
 | 
						|
    let remove = []
 | 
						|
    const notVisible = (n) => !n.visible || (n.material && !n.material.visible)
 | 
						|
    cleanScene.traverse( (n) => notVisible(n) && n.children.length == 0 && (remove.push(n)) )
 | 
						|
    remove.map( (n) => n.removeFromParent() )
 | 
						|
 | 
						|
    let restrictTo3DBoundingBox = mesh.geometry
 | 
						|
    if( restrictTo3DBoundingBox ){ 
 | 
						|
      // spec 3 of https://xrfragment.org/#src
 | 
						|
      // spec 1 of https://xrfragment.org/#scaling%20of%20instanced%20objects  
 | 
						|
      // normalize instanced objectsize to boundingbox
 | 
						|
      let sizeFrom  = new THREE.Vector3()
 | 
						|
      let sizeTo    = new THREE.Vector3()
 | 
						|
      let empty = new THREE.Object3D()
 | 
						|
      new THREE.Box3().setFromObject(mesh).getSize(sizeTo)
 | 
						|
      new THREE.Box3().setFromObject(cleanScene).getSize(sizeFrom)
 | 
						|
      let ratio = sizeFrom.divide(sizeTo)
 | 
						|
      scene.scale.multiplyScalar( 1.0 / Math.max(ratio.x, ratio.y, ratio.z));
 | 
						|
    }else{
 | 
						|
      // spec 4 of https://xrfragment.org/#src
 | 
						|
      // spec 2 of https://xrfragment.org/#scaling%20of%20instanced%20objects
 | 
						|
      scene.scale.multiply( mesh.scale ) 
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
xrf.frag.src.filterScene = (scene,opts) => {
 | 
						|
  let { mesh, model, camera, renderer, THREE, hashbus, frag} = opts
 | 
						|
 | 
						|
  scene = xrf.filter.scene({scene,frag,reparent:true}) //,copyScene: opts.isPortal})
 | 
						|
 | 
						|
  if( !opts.isLocal ){
 | 
						|
    scene.traverse( (m) => {
 | 
						|
      if( m.userData && (m.userData.src || m.userData.href) ) return ; // prevent infinite recursion 
 | 
						|
      xrf.parseModel.metadataInMesh(m,{scene,recursive:true})
 | 
						|
    })
 | 
						|
  }
 | 
						|
  return scene
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
 * replace the src-mesh with the contents of the src
 | 
						|
 */
 | 
						|
 | 
						|
xrf.frag.src.type = {}
 | 
						|
 | 
						|
/*
 | 
						|
 * mimetype: unknown 
 | 
						|
 */
 | 
						|
 | 
						|
xrf.frag.src.type['unknown'] = function( url, opts ){
 | 
						|
  return new Promise( (resolve,reject) => {
 | 
						|
    reject(`${url} mimetype '${opts.mimetype}' not found or supported (yet)`)
 | 
						|
  })
 | 
						|
}
 | 
						|
// this ns the global #t mediafragment handler (which affects the 3D animation)
 | 
						|
 | 
						|
xrf.frag.t = function(v, opts){
 | 
						|
  let { frag, mesh, model, camera, scene, renderer, THREE} = opts
 | 
						|
  // handle object media players
 | 
						|
  if( mesh && mesh.media ){
 | 
						|
    for( let i in mesh.media ) mesh.media[i].set("t",v)
 | 
						|
    return
 | 
						|
  }
 | 
						|
 
 | 
						|
  // otherwise handle global 3D animations
 | 
						|
  if( !model.mixer ) return 
 | 
						|
  if( !model.animations || model.animations[0] == undefined ){
 | 
						|
    console.warn('no animations found in model')
 | 
						|
    return xrf.emit( v.x == 0 ? 'stop' : 'play',{isPlaying: v.x != 0 })
 | 
						|
  }
 | 
						|
    
 | 
						|
  xrf.mixers.map ( (mixer) => {
 | 
						|
    
 | 
						|
    mixer.t = v
 | 
						|
    
 | 
						|
    // update speed
 | 
						|
    mixer.timeScale     = mixer.loop.speed
 | 
						|
    mixer.loop.speedAbs = Math.abs( mixer.timeScale )
 | 
						|
 | 
						|
    mixer.updateLoop( v )
 | 
						|
 | 
						|
    // play animations
 | 
						|
    mixer.play( v )
 | 
						|
  })
 | 
						|
}
 | 
						|
 | 
						|
xrf.frag.t.default = {
 | 
						|
  x:0,  // (play from) offset (in seconds)  
 | 
						|
  y:0   // optional: (stop at) offset (in seconds)
 | 
						|
}
 | 
						|
 | 
						|
// setup animation mixer for global scene & src scenes
 | 
						|
xrf.addEventListener('parseModel', (opts) => {
 | 
						|
  let {model} = opts
 | 
						|
  let mixer   = model.mixer = new xrf.THREE.AnimationMixer(model.scene)
 | 
						|
 | 
						|
  mixer.model = model
 | 
						|
  mixer.loop      = {timeStart:0,timeStop:0,speed:1.0,enabled:false}
 | 
						|
  mixer.i         = xrf.mixers.length
 | 
						|
  mixer.actions   = []
 | 
						|
  
 | 
						|
  // calculate total duration/frame based on longest animation
 | 
						|
  mixer.duration  = 0
 | 
						|
  if( model.animations.length ){
 | 
						|
    model.animations.map( (a) => mixer.duration = ( a.duration > mixer.duration ) ? a.duration : mixer.duration )
 | 
						|
  }
 | 
						|
 | 
						|
  model.animations.map( (anim) => {
 | 
						|
    console.log("animation action: "+anim.name)
 | 
						|
    mixer.actions.push( mixer.clipAction( anim, model.scene ) )
 | 
						|
  })
 | 
						|
  mixer.play  = (t) => {
 | 
						|
    let msg = `media fragment: ${t.x}-${t.y} seconds`
 | 
						|
    if( t.x > 49 ) msg += ", not frames (!)"
 | 
						|
    console.log(msg)
 | 
						|
    mixer.isPlaying = t.x !== undefined && t.x != t.y 
 | 
						|
    mixer.updateLoop(t)
 | 
						|
    xrf.emit( mixer.isPlaying === false ? 'stop' : 'play',{isPlaying: mixer.isPlaying})
 | 
						|
  }
 | 
						|
 | 
						|
  mixer.stop = () => {
 | 
						|
    mixer.play(false)
 | 
						|
  }
 | 
						|
 | 
						|
  mixer.updateLoop = (t) => {
 | 
						|
    if( t ){
 | 
						|
      mixer.loop.timeStart = t.x != undefined ? t.x : mixer.loop.timeStart
 | 
						|
      mixer.loop.timeStop  = t.y != undefined ? t.y : mixer.loop.timeStop
 | 
						|
    }
 | 
						|
    const singleShotEnded = mixer.loop.timeStop != 'undefined' &&mixer.time == mixer.loop.timeStop && !mixer.loop.enabled 
 | 
						|
    if( singleShotEnded ) return // do nothing
 | 
						|
    mixer.actions.map( (action) => { 
 | 
						|
      if( mixer.loop.timeStart != undefined ){
 | 
						|
        action.time = mixer.loop.timeStart
 | 
						|
        action.setLoop( xrf.THREE.LoopOnce, )
 | 
						|
        action.timeScale = mixer.timeScale
 | 
						|
        action.enabled = true
 | 
						|
        if( t && t.x != undefined ) action.play() 
 | 
						|
      }
 | 
						|
    })
 | 
						|
    mixer.setTime(mixer.loop.timeStart)
 | 
						|
    mixer.time = Math.abs( mixer.loop.timeStart )
 | 
						|
    mixer.update(0)
 | 
						|
  }
 | 
						|
 | 
						|
  // monkeypatch: update loop when needed 
 | 
						|
  if( !mixer.update.patched ){
 | 
						|
 | 
						|
    let update = mixer.update
 | 
						|
    mixer.update = function(time){
 | 
						|
      if( mixer.time == 0 || time == 0 ) return update.call(this,time)
 | 
						|
      mixer.time = Math.abs(mixer.time)
 | 
						|
      // loop jump
 | 
						|
      if( mixer.loop.timeStop > 0 && mixer.time != mixer.loop.timeStop && mixer.time >= mixer.loop.timeStop-0.02 ){ 
 | 
						|
        if( mixer.loop.enabled ){
 | 
						|
          setTimeout( () => mixer.updateLoop(), 0 ) // prevent recursion
 | 
						|
        }else{
 | 
						|
          mixer.setTime( mixer.time = mixer.loop.timeStop )
 | 
						|
          mixer.timeScale = 0 
 | 
						|
        }
 | 
						|
      }
 | 
						|
      return update.call( this, time )
 | 
						|
    }
 | 
						|
    mixer.update.patched = true
 | 
						|
  }
 | 
						|
 | 
						|
  xrf.mixers.push(mixer)
 | 
						|
})
 | 
						|
 | 
						|
if( document.location.hash.match(/t=/) ){
 | 
						|
  let url = document.location.href
 | 
						|
  let playAfterUserGesture = () => {
 | 
						|
    xrf.hashbus.pub(url) // re-post t fragment on the hashbus again
 | 
						|
    window.removeEventListener('click',playAfterUserGesture)
 | 
						|
    window.removeEventListener('touchstart',playAfterUserGesture)
 | 
						|
  }
 | 
						|
  window.addEventListener('click', playAfterUserGesture )
 | 
						|
  window.addEventListener('touchstart', playAfterUserGesture )
 | 
						|
}
 | 
						|
 | 
						|
xrf.addEventListener('render', (opts) => {
 | 
						|
  let model = xrf.model
 | 
						|
  let {time} = opts
 | 
						|
  if( !model ) return 
 | 
						|
  if( xrf.mixers.length ){
 | 
						|
    xrf.mixers.map( (m) => m.isPlaying && (m.update( time )) )
 | 
						|
 | 
						|
    // update active camera in case selected by dynamicKey in URI 
 | 
						|
    if( xrf.model.camera && xrf.model.camera.length && model.mixer.isPlaying ){
 | 
						|
 | 
						|
      let cam = xrf.camera.getCam() 
 | 
						|
      // cam.fov = model.cameras[0].fov (why is blender not exporting radians?)
 | 
						|
      cam.far = model.cameras[0].far
 | 
						|
      cam.near = model.cameras[0].near
 | 
						|
 | 
						|
      let rig = xrf.camera
 | 
						|
      rig.position.copy( model.cameras[0].position )
 | 
						|
      rig.position.y -= rig.offsetY // VR/AR compensate camera rig
 | 
						|
      //rig.rotation.copy( model.cameras[0].rotation )
 | 
						|
 | 
						|
      rig.updateProjectionMatrix()
 | 
						|
    }
 | 
						|
  }
 | 
						|
})
 | 
						|
 | 
						|
// remove mixers and stop mixers when loading another scene
 | 
						|
xrf.addEventListener('reset', (opts) => {
 | 
						|
  xrf.mixers.map( (m) => m.stop())
 | 
						|
  xrf.mixers = []
 | 
						|
})
 | 
						|
xrf.frag.uv = function(v, opts){
 | 
						|
  let { frag, mesh, model, camera, scene, renderer, THREE} = opts
 | 
						|
 | 
						|
  if( !mesh.geometry ) return // nothing to do here
 | 
						|
  if( v.floats.length != 4 ) return console.warn('xrfragment.js: got less than 4 uv values ')
 | 
						|
 | 
						|
  xrf.frag.uv.init(mesh)
 | 
						|
  mesh.uv.u      = v.floats[0]
 | 
						|
  mesh.uv.v      = v.floats[1]
 | 
						|
  mesh.uv.uspeed = v.floats[2] || 1.0
 | 
						|
  mesh.uv.vspeed = v.floats[3] || 1.0
 | 
						|
  mesh.uv.ushift = v.shift[0]  || v.floats[0] < 0  // negative u is always relative 
 | 
						|
  mesh.uv.vshift = v.shift[1]  || v.floats[1] < 0  // negative v is always relative
 | 
						|
  mesh.uv.uloop  = v.shift[2]  || false
 | 
						|
  mesh.uv.vloop  = v.shift[3]  || false
 | 
						|
 | 
						|
  mesh.onBeforeRender = xrf.frag.uv.scroll
 | 
						|
}
 | 
						|
 | 
						|
xrf.frag.uv.init = function(mesh){
 | 
						|
  if( !mesh.uv  ) mesh.uv   = {u:0, v:0, uspeed:1, vspeed:1, uloop:false, vloop:false, uv:false}
 | 
						|
 | 
						|
  let uv    = mesh.geometry.getAttribute("uv")
 | 
						|
  if( !uv.old ) uv.old = mesh.geometry.getAttribute("uv").clone()
 | 
						|
}
 | 
						|
 | 
						|
xrf.frag.uv.scroll = function(){
 | 
						|
 | 
						|
  let diffU  = 0.0 // distance to end-state (non-looping mode)
 | 
						|
  let diffV  = 0.0 // distance to end-state (non-looping mode)
 | 
						|
  let uv     = this.geometry.getAttribute("uv")
 | 
						|
 | 
						|
  // translate!
 | 
						|
  for( let i = 0; i < uv.count; i++ ){
 | 
						|
 | 
						|
    if( this.uv.uspeed == 1.0 ) uv.setX(i, this.uv.ushift ? uv.getX(i) + this.uv.u : uv.old.getX(i) + this.uv.u )
 | 
						|
    if( this.uv.vspeed == 1.0 ) uv.setY(i, this.uv.vshift ? uv.getY(i) + this.uv.v : uv.old.getY(i) + this.uv.v )
 | 
						|
 | 
						|
    if( this.uv.uspeed != 1.0 || this.uv.vspeed != 1.0 ){
 | 
						|
      let u         = uv.getX(i)     
 | 
						|
      let v         = uv.getY(i)     
 | 
						|
      let uTarget   = this.uv.ushift ? uv.getX(i) + this.uv.u : uv.old.getX(i) + this.uv.u
 | 
						|
      let vTarget   = this.uv.vshift ? uv.getY(i) + this.uv.v : uv.old.getY(i) + this.uv.v
 | 
						|
 | 
						|
      // scroll U
 | 
						|
      if( this.uv.uloop ){
 | 
						|
        u += this.uv.uspeed * xrf.clock.delta
 | 
						|
      }else{
 | 
						|
        // *TODO* tween to offset
 | 
						|
        //// recover from super-high uv-values due to looped scrolling
 | 
						|
        //if( Math.abs(u-uTarget) > 10.0 ) u = uv.old.getX(i)
 | 
						|
        //u = u > uTarget ?  u + (this.uv.uspeed * -xrf.clock.delta)
 | 
						|
        //                :  u + (this.uv.uspeed *  xrf.clock.delta) 
 | 
						|
        //diffU += Math.abs( u - uTarget )  // are we done yet? (non-looping mode)
 | 
						|
      } 
 | 
						|
 | 
						|
      // scroll V
 | 
						|
      if( this.uv.vloop ){
 | 
						|
        v += this.uv.vspeed * xrf.clock.delta
 | 
						|
      }else{
 | 
						|
        // *TODO* tween to offset
 | 
						|
        //// recover from super-high uv-values due to looped scrolling
 | 
						|
        //// recover from super-high uv-values due to looped scrolling
 | 
						|
        //if( Math.abs(v-vTarget) > 10.0 ) v = uv.old.getY(i)
 | 
						|
        //v = v > vTarget ?  v + (this.uv.vspeed * -xrf.clock.delta)
 | 
						|
        //                :  v + (this.uv.vspeed *  xrf.clock.delta) 
 | 
						|
        //diffV += Math.abs( v - vTarget )
 | 
						|
      }
 | 
						|
      uv.setXY(i,u,v)
 | 
						|
    }
 | 
						|
 | 
						|
  }
 | 
						|
  uv.needsUpdate = true
 | 
						|
 | 
						|
  if( (!this.uv.uloop && diffU < 0.05) &&
 | 
						|
      (!this.uv.vloop && diffV < 0.05)
 | 
						|
  ){ // stop animating if done
 | 
						|
    this.onBeforeRender = function(){}
 | 
						|
  }
 | 
						|
}
 | 
						|
xrf.getCollisionMeshes = () => {
 | 
						|
  let meshes = []
 | 
						|
  xrf.scene.traverse( (n) => {
 | 
						|
    if( n.type == 'Mesh' && !n.userData.href && !n.userData.src && xrf.hasNoMaterial(n) ){
 | 
						|
      meshes.push(n)
 | 
						|
    }
 | 
						|
  })
 | 
						|
  return meshes
 | 
						|
}
 | 
						|
// wrapper to collect interactive raycastable objects 
 | 
						|
 | 
						|
xrf.interactiveGroup = function(THREE,renderer,camera){
 | 
						|
 | 
						|
  let {
 | 
						|
    Group,
 | 
						|
    Matrix4,
 | 
						|
    Raycaster,
 | 
						|
    Vector2
 | 
						|
  } = THREE 
 | 
						|
 | 
						|
  const _pointer = new Vector2();
 | 
						|
  const _event = { type: '', data: _pointer };
 | 
						|
  let object   = {selected:false}
 | 
						|
 | 
						|
  class interactive extends Group {
 | 
						|
 | 
						|
    constructor( renderer, camera ) {
 | 
						|
 | 
						|
      super();
 | 
						|
 | 
						|
      if( !renderer || !camera ) return 
 | 
						|
 | 
						|
      // extract camera when camera-rig is passed
 | 
						|
      camera.traverse( (n) =>  String(n.type).match(/Camera/) ? camera = n : null )
 | 
						|
 | 
						|
      const scope = this;
 | 
						|
      scope.objects = []
 | 
						|
      scope.raycastAll = false
 | 
						|
 | 
						|
 | 
						|
      const raycaster = this.raycaster = new Raycaster();
 | 
						|
      const tempMatrix = new Matrix4();
 | 
						|
 | 
						|
      // Pointer Events
 | 
						|
      const element = renderer.domElement;
 | 
						|
 | 
						|
      const getAllMeshes = (scene) => {
 | 
						|
        let objects = []
 | 
						|
        xrf.scene.traverse( (n) => {
 | 
						|
          if( !n.material || n.type != 'Mesh' ) return
 | 
						|
          objects.push(n)
 | 
						|
        })
 | 
						|
        return objects
 | 
						|
      }
 | 
						|
 | 
						|
      function onPointerEvent( event ) {
 | 
						|
 | 
						|
        //event.stopPropagation();
 | 
						|
 | 
						|
        const rect = renderer.domElement.getBoundingClientRect();
 | 
						|
 | 
						|
        _pointer.x = ( event.clientX - rect.left ) / rect.width * 2 - 1;
 | 
						|
        _pointer.y = - ( event.clientY - rect.top ) / rect.height * 2 + 1;
 | 
						|
 | 
						|
        raycaster.setFromCamera( _pointer, camera );
 | 
						|
 | 
						|
        let objects = scope.raycastAll ? getAllMeshes(xrf.scene) : scope.objects 
 | 
						|
        const intersects = raycaster.intersectObjects( objects, false )
 | 
						|
 | 
						|
        if ( intersects.length > 0 ) {
 | 
						|
 | 
						|
          const intersection = intersects[ 0 ];
 | 
						|
 | 
						|
          object = intersection.object;
 | 
						|
          const uv = intersection.uv;
 | 
						|
 | 
						|
          _event.type = event.type;
 | 
						|
          if( uv ) _event.data.set( uv.x, 1 - uv.y );
 | 
						|
          object.dispatchEvent( _event );
 | 
						|
 | 
						|
        }else{
 | 
						|
          if( object.selected ) {
 | 
						|
            _event.type = 'mouseleave'
 | 
						|
            object.dispatchEvent( _event)
 | 
						|
          }
 | 
						|
        }
 | 
						|
 | 
						|
      }
 | 
						|
 | 
						|
      element.addEventListener( 'pointerdown', onPointerEvent );
 | 
						|
      element.addEventListener( 'pointerup', onPointerEvent );
 | 
						|
      element.addEventListener( 'pointermove', onPointerEvent );
 | 
						|
      element.addEventListener( 'mousedown', onPointerEvent );
 | 
						|
      element.addEventListener( 'mousemove', onPointerEvent );
 | 
						|
      element.addEventListener( 'click', onPointerEvent );
 | 
						|
      element.addEventListener( 'mouseup', onPointerEvent );
 | 
						|
      element.addEventListener( 'touchstart', onPointerEvent );
 | 
						|
 | 
						|
      // WebXR Controller Events
 | 
						|
      // TODO: Dispatch pointerevents too
 | 
						|
 | 
						|
      const eventsMapper = {
 | 
						|
        'move': 'mousemove',
 | 
						|
        'select': 'click',
 | 
						|
        'touchstart': 'click',
 | 
						|
        'selectstart': 'mousedown',
 | 
						|
        'selectend': 'mouseup'
 | 
						|
      };
 | 
						|
 | 
						|
      function onXRControllerEvent( event ) {
 | 
						|
 | 
						|
        const controller = event.target;
 | 
						|
 | 
						|
        tempMatrix.identity().extractRotation( controller.matrixWorld );
 | 
						|
 | 
						|
        raycaster.ray.origin.setFromMatrixPosition( controller.matrixWorld );
 | 
						|
        raycaster.ray.direction.set( 0, 0, - 1 ).applyMatrix4( tempMatrix );
 | 
						|
        raycaster.far = Infinity
 | 
						|
 | 
						|
        let objects = scope.raycastAll ? getAllMeshes(xrf.scene) : scope.objects 
 | 
						|
        const intersects = raycaster.intersectObjects( objects, false )
 | 
						|
 | 
						|
        if ( intersects.length > 0 ) {
 | 
						|
 | 
						|
 | 
						|
          const intersection = intersects[ 0 ];
 | 
						|
 | 
						|
          object = intersection.object;
 | 
						|
          const uv = intersection.uv;
 | 
						|
 | 
						|
          _event.type = eventsMapper[ event.type ];
 | 
						|
          console.log( (new Date()).getTime()+" "+event.type+":"+_event.type+" "+object.name)
 | 
						|
          if( uv ) _event.data.set( uv.x, 1 - uv.y );
 | 
						|
 | 
						|
          object.dispatchEvent( _event );
 | 
						|
 | 
						|
        }else{
 | 
						|
          if( object.selected ) {
 | 
						|
            _event.type = 'mouseleave'
 | 
						|
            object.dispatchEvent(_event)
 | 
						|
          }
 | 
						|
        }
 | 
						|
 | 
						|
      }
 | 
						|
 | 
						|
      const controller1 = renderer.xr.getController( 0 );
 | 
						|
      controller1.addEventListener( 'move', onXRControllerEvent );
 | 
						|
      controller1.addEventListener( 'select', onXRControllerEvent );
 | 
						|
      controller1.addEventListener( 'selectstart', onXRControllerEvent );
 | 
						|
      controller1.addEventListener( 'selectend', onXRControllerEvent );
 | 
						|
 | 
						|
      const controller2 = renderer.xr.getController( 1 );
 | 
						|
      controller2.addEventListener( 'move', onXRControllerEvent );
 | 
						|
      controller2.addEventListener( 'select', onXRControllerEvent );
 | 
						|
      controller2.addEventListener( 'selectstart', onXRControllerEvent );
 | 
						|
      controller2.addEventListener( 'selectend', onXRControllerEvent );
 | 
						|
 | 
						|
    }
 | 
						|
 | 
						|
    intersect( obj, far ){
 | 
						|
      //const mesh2Box = (mesh) => {
 | 
						|
      //  let b = new THREE.Box3()
 | 
						|
      //  b.expandByObject(mesh)
 | 
						|
      //  return b
 | 
						|
      //}
 | 
						|
 | 
						|
      //const objBox   = obj.box || (obj.box = mesh2Box(obj))
 | 
						|
      //let objects    = this.raycastAll ? getAllMeshes(xrf.scene) : this.objects 
 | 
						|
      //let intersects = [] 
 | 
						|
      //objects.map( (objB) => {
 | 
						|
      //  if( !objB.box ) objB.box = mesh2Box(objB)
 | 
						|
      //  if( objB.box.intersectsBox(objBox) ) intersects.push(obj.box)
 | 
						|
      //})
 | 
						|
      //return intersects
 | 
						|
      this.raycaster.ray.origin.setFromMatrixPosition( obj.matrixWorld );
 | 
						|
      this.raycaster.ray.direction.set( 0, 0, -1 )
 | 
						|
      this.raycaster.far = far || Infinity
 | 
						|
      return this.raycaster.intersectObjects( this.objects, true )
 | 
						|
    }
 | 
						|
 | 
						|
    // we create our own add to avoid unnecessary unparenting of buffergeometries from 
 | 
						|
    // their 3D model (which breaks animations)
 | 
						|
    add(obj, unparent){
 | 
						|
      if( unparent ) Group.prototype.add.call( this, obj )
 | 
						|
      this.objects.push(obj)
 | 
						|
    }
 | 
						|
 | 
						|
    clear(){
 | 
						|
      while( this.children[0] != undefined ) this.children[0].remove()
 | 
						|
      this.objects = [] 
 | 
						|
    }
 | 
						|
 | 
						|
  }
 | 
						|
 | 
						|
  return new interactive(renderer,camera)
 | 
						|
}
 | 
						|
xrf.optimize = (opts) => {
 | 
						|
  opts.animatedObjects = []
 | 
						|
 | 
						|
  xrf.optimize
 | 
						|
  .checkAnimations(opts)
 | 
						|
  .freezeUnAnimatedObjects(opts)
 | 
						|
  .disableShadows(opts)
 | 
						|
  .disableEmbeddedLights(opts)
 | 
						|
  .removeDuplicateLights()
 | 
						|
}
 | 
						|
 | 
						|
  // check unused animations
 | 
						|
xrf.optimize.checkAnimations = (opts) => {
 | 
						|
  if( xrf.debug ) console.log("TODO: fix freezeUnAnimatedObjects for SRC's")
 | 
						|
  return xrf.optimize
 | 
						|
 | 
						|
  let {model} = opts
 | 
						|
  model.animations.map( (anim) => {  
 | 
						|
    // collect zombie animations and warn user
 | 
						|
    let zombies = anim.tracks.map( (t) => {
 | 
						|
      let name = t.name.replace(/\..*/,'')
 | 
						|
      let obj  = model.scene.getObjectByName(name)
 | 
						|
      if( !model.scene.getObjectByName(name) ) return {anim:anim.name,obj:name}
 | 
						|
      else opts.animatedObjects.push(name)
 | 
						|
      return undefined
 | 
						|
    })
 | 
						|
    if( zombies.length > 0 ){ // only warn for zombies in main scene (because src-scenes might be filtered anyways)
 | 
						|
      zombies
 | 
						|
      .filter( (z) => z ) // filter out undefined
 | 
						|
      .map( (z) => console.warn(`gltf: object '${z.obj}' not found (anim: '${z.anim}'`) )
 | 
						|
      console.warn(`TIP: remove dots in objectnames in blender (which adds dots when duplicating)`)
 | 
						|
    } 
 | 
						|
  })
 | 
						|
  return xrf.optimize
 | 
						|
}
 | 
						|
 | 
						|
xrf.optimize.freezeUnAnimatedObjects = (opts) => {
 | 
						|
  if( xrf.todo ) console.log("TODO: fix freezeUnAnimatedObjects for SRC's")
 | 
						|
  return xrf.optimize
 | 
						|
 | 
						|
  let {model}  = opts
 | 
						|
  let scene = model.scene
 | 
						|
  // increase performance by freezing all objects
 | 
						|
  scene.traverse( (n) => n.matrixAutoUpdate = false )
 | 
						|
  // except animated objects and children
 | 
						|
  scene.traverse( (n) => {
 | 
						|
    if( ~opts.animatedObjects.indexOf(n.name) ){
 | 
						|
      n.matrixAutoUpdate = true 
 | 
						|
      n.traverse( (m) => m.matrixAutoUpdate = true )
 | 
						|
    }
 | 
						|
  })
 | 
						|
  return xrf.optimize
 | 
						|
}
 | 
						|
 | 
						|
xrf.optimize.disableShadows = (opts) => {
 | 
						|
  opts.model.scene.traverse( (n) => {
 | 
						|
    if( n.castShadow !== undefined ) n.castShadow = false
 | 
						|
  })
 | 
						|
  return xrf.optimize
 | 
						|
}
 | 
						|
 | 
						|
xrf.optimize.disableEmbeddedLights = (opts) => {
 | 
						|
  if( !opts.isSRC ) return xrf.optimize
 | 
						|
  // remove lights from SRC's
 | 
						|
  opts.model.scene.traverse( (n) => {
 | 
						|
    if( n.type.match(/light/i) ) n.remove()
 | 
						|
  })
 | 
						|
  return xrf.optimize
 | 
						|
}
 | 
						|
 | 
						|
xrf.optimize.removeDuplicateLights = () => {
 | 
						|
  // local/extern src's can cause duplicate lights which tax performance 
 | 
						|
  let lights = {}
 | 
						|
  xrf.scene.traverse( (n) => {
 | 
						|
    if( n.type.match(/light/i) ){
 | 
						|
      if( !lights[n.name] ) lights[n.name] = true 
 | 
						|
      else n.remove()
 | 
						|
    }
 | 
						|
  })
 | 
						|
  return xrf.optimize
 | 
						|
}
 | 
						|
 | 
						|
xrf.addEventListener('parseModel', (opts) => {
 | 
						|
  xrf.optimize(opts)
 | 
						|
})
 | 
						|
xrf.sceneToTranscript = (scene, node, currentPosition ) => {
 | 
						|
  let items = []
 | 
						|
  scene = currentPosition && xrf.frag.pos.last ? xrf.scene.getObjectByName(xrf.frag.pos.last) : (scene || xrf.scene)
 | 
						|
  scene.traverse( (n) => {
 | 
						|
    let isSRC = false
 | 
						|
    n.traverseAncestors( (m) => m.userData.src ? isSRC = true : false )
 | 
						|
    if( !isSRC && n.userData['aria-description'] && (!node || n.uuid != node.uuid) ){
 | 
						|
      items.push({name: n.name, description: n.userData['aria-description']})
 | 
						|
    }
 | 
						|
  })
 | 
						|
  return items
 | 
						|
}
 | 
						|
 | 
						|
xrf.listExits = (scene, currentPosition ) => {
 | 
						|
  let destinations = []
 | 
						|
  scene = currentPosition && xrf.frag.pos.last ? xrf.scene.getObjectByName(xrf.frag.pos.last) : scene || xrf.scene
 | 
						|
  scene.traverse( (n) => {
 | 
						|
    if( n.userData && n.userData.href && n.userData.href.match(/pos=/) ){
 | 
						|
      destinations.push({name: n.name, destination: n.userData['aria-label'] || n.userData.href})
 | 
						|
    }
 | 
						|
  })
 | 
						|
  return destinations
 | 
						|
}
 | 
						|
// switch camera when multiple cameras for url #mycameraname
 | 
						|
 | 
						|
xrf.addEventListener('navigateLoaded', (opts) => {
 | 
						|
  // select active camera if any
 | 
						|
  let {id,match,v,THREE} = opts
 | 
						|
  let envmap  = {}
 | 
						|
  let current = ''
 | 
						|
 | 
						|
  // Recursive function to traverse the graph
 | 
						|
  function traverseAndSetEnvMap(node, closestAncestorMaterialMap = null) {
 | 
						|
      // Check if the current node has a material
 | 
						|
      if (node.isMesh && node.material  ) {
 | 
						|
          if (node.material.map && closestAncestorMaterialMap) {
 | 
						|
              // If the node has a material map, set the closest ancestor material map
 | 
						|
              node.material        = node.material.clone() // dont affect objects which share same material 
 | 
						|
              node.material.envMap = closestAncestorMaterialMap;
 | 
						|
          }
 | 
						|
      }
 | 
						|
 | 
						|
      // Update the closest ancestor's material map
 | 
						|
      if (node.isMesh && node.material && node.material.map) {
 | 
						|
        closestAncestorMaterialMap = node.material.map.clone();
 | 
						|
        closestAncestorMaterialMap.mapping = xrf.THREE.EquirectangularReflectionMapping;
 | 
						|
        closestAncestorMaterialMap.needsUpdate = true
 | 
						|
      }
 | 
						|
 | 
						|
      // Recursively traverse all children
 | 
						|
      node.children.forEach(child => traverseAndSetEnvMap(child, closestAncestorMaterialMap));
 | 
						|
  }
 | 
						|
 | 
						|
  // Start traversal from the root node
 | 
						|
  traverseAndSetEnvMap(xrf.scene);
 | 
						|
})
 | 
						|
 | 
						|
const doFilter = (opts) => {
 | 
						|
  let {scene,id,match,v} = opts
 | 
						|
  if( v.filter ){
 | 
						|
    let frags = {}
 | 
						|
    frags[ v.filter.key ] = v
 | 
						|
    xrf.filter.scene({frag:frags,scene})
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
xrf.addEventListener('dynamicKey', doFilter )
 | 
						|
xrf.addEventListener('dynamicKeyValue', (opts) => {
 | 
						|
  if( xrf.debug ) console.log("*TODO* filter integers only")
 | 
						|
  // doFilter(opts)
 | 
						|
})
 | 
						|
 | 
						|
// spec: https://xrfragment.org/#filters
 | 
						|
xrf.filter = function(query, cb){
 | 
						|
  let result = []
 | 
						|
  if( !query     ) return result
 | 
						|
  if( query[0] != '#' ) query = '#'+query
 | 
						|
  // *TODO* jquery like utility func
 | 
						|
  return result
 | 
						|
}
 | 
						|
 | 
						|
xrf.filter.scene = function(opts){
 | 
						|
  let {scene,frag} = opts
 | 
						|
 | 
						|
  scene = xrf.filter 
 | 
						|
  .sort(frag)               // get (sorted) filters from XR Fragments
 | 
						|
  .process(frag,scene,opts) // show/hide things
 | 
						|
 | 
						|
  if( !scene ) return 
 | 
						|
 | 
						|
  scene.visible = true   // always enable scene
 | 
						|
 | 
						|
  return scene
 | 
						|
}
 | 
						|
 | 
						|
xrf.filter.sort = function(frag){
 | 
						|
  // get all filters from XR Fragments
 | 
						|
  frag.filters = Object.values(frag)
 | 
						|
                      .filter( (v) => v.filter ? v : null )
 | 
						|
                      .sort( (a,b) => a.index > b.index )
 | 
						|
  return xrf.filter
 | 
						|
}
 | 
						|
 | 
						|
// opts = {copyScene:true} in case you want a copy of the scene (not filter the current scene inplace)
 | 
						|
xrf.filter.process = function(frag,scene,opts){
 | 
						|
  if( !scene || scene.children.length == 0 ) return 
 | 
						|
  const cleanupKey   = (k) => k.replace(/[-\*\/]/g,'')
 | 
						|
  let firstFilter    = frag.filters.length ? frag.filters[0].filter.get() : false 
 | 
						|
  const hasName      = (m,name,filter)        => m.name == name 
 | 
						|
  const hasNameOrTag = (m,name_or_tag,filter) => hasName(m,name_or_tag) || 
 | 
						|
                                                 String(m.userData['tag']).match( new RegExp("(^| )"+name_or_tag) )
 | 
						|
 | 
						|
  // utility functions
 | 
						|
  const getOrCloneMaterial = (o) => {
 | 
						|
    if( o.material ){
 | 
						|
      if( o.material.isXRF ) return o.material
 | 
						|
      o.material = o.material.clone()
 | 
						|
      o.material.isXRF = true
 | 
						|
      return o.material
 | 
						|
    }
 | 
						|
    return {}
 | 
						|
  }
 | 
						|
  const setVisible = (n,visible,filter,processed) => {
 | 
						|
    if( processed && processed[n.uuid] ) return 
 | 
						|
    getOrCloneMaterial(n).visible = visible
 | 
						|
    if( filter.deep ) n.traverse( (m) => getOrCloneMaterial(m).visible = visible )
 | 
						|
    if( processed ) processed[n.uuid] == true 
 | 
						|
  }
 | 
						|
 | 
						|
  // spec 3 @ https://xrfragment.org/doc/RFC_XR_Macros.html#embedding-xr-content-using-src
 | 
						|
  // reparent scene based on objectname in case it matches a (non-negating) selector 
 | 
						|
  if( opts.reparent && firstFilter && !firstFilter.value && firstFilter.show === true ){
 | 
						|
    let obj 
 | 
						|
    frag.target = firstFilter
 | 
						|
    scene.traverse( (n) => hasName(n, firstFilter.key,firstFilter) && (obj = n) )
 | 
						|
    if( xrf.debug ) console.log("reparent "+firstFilter.key+" "+((opts.copyScene)?"copy":"inplace"))
 | 
						|
    if(obj ){
 | 
						|
      obj.position.set(0,0,0)
 | 
						|
      if( opts.copyScene ) {
 | 
						|
        opts.copyScene = new xrf.THREE.Scene()
 | 
						|
        opts.copyScene.children[0] = obj  // we dont use .add() as that reparents it from the original scene
 | 
						|
      }else{
 | 
						|
        // empty current scene and add obj
 | 
						|
        while( scene.children.length > 0 ) scene.children[0].removeFromParent()
 | 
						|
        scene.add( obj )
 | 
						|
      }
 | 
						|
    }else{
 | 
						|
      console.warn("could not reparent scene to object "+firstFilter.key+" (not found)")
 | 
						|
      opts.copyScene = new xrf.THREE.Scene() // return empty scene
 | 
						|
    } 
 | 
						|
    if( opts.copyScene ) scene = opts.copyScene
 | 
						|
    if( obj ) obj.isReparented = true
 | 
						|
  }
 | 
						|
 | 
						|
  // then show/hide things based on secondary selectors
 | 
						|
  // we don't use the XRWG (everything) because we process only the given (sub)scene
 | 
						|
  frag.filters.map( (v) => {
 | 
						|
    const filter  = v.filter.get()
 | 
						|
    const name_or_tag = cleanupKey(v.fragment)
 | 
						|
    let processed = {}
 | 
						|
    let extembeds = {}
 | 
						|
 | 
						|
    // hide external objects temporarely (prevent them getting filtered too)
 | 
						|
    scene.traverse( (m) => {
 | 
						|
      if( m.isSRCExternal ){
 | 
						|
        m.traverse( (n) => (extembeds[ n.uuid ] = m) && (m.visible = false) )
 | 
						|
      }
 | 
						|
    })
 | 
						|
 | 
						|
    scene.traverseVisible( (m) => {
 | 
						|
      // filter on value(expression) #foo=>3 e.g. *TODO* do this in XRWG
 | 
						|
      if( filter.value && m.userData[filter.key] ){
 | 
						|
        const visible = v.filter.testProperty(filter.key, m.userData[filter.key], filter.show === false )
 | 
						|
        setVisible(m,visible,filter,processed)
 | 
						|
        return
 | 
						|
      }
 | 
						|
      if( hasNameOrTag(m,name_or_tag,filter ) ){
 | 
						|
        setVisible(m,filter.show,filter)
 | 
						|
      }
 | 
						|
    })
 | 
						|
 | 
						|
    // show external objects again 
 | 
						|
    for ( let i in extembeds ) extembeds[i].visible = true
 | 
						|
  })
 | 
						|
 | 
						|
  return scene 
 | 
						|
}
 | 
						|
 | 
						|
xrf.frag.dynamic.material = function(v,opts){
 | 
						|
  let {match} = opts
 | 
						|
 | 
						|
  // update material in case of <tag_or_object>[*]=<materialname>
 | 
						|
  let material
 | 
						|
  xrf.scene.traverse( (n) => n.material && (n.material.name == v.string) && (material = n.material) )
 | 
						|
  if( !material && !v.reset ) return // nothing to do
 | 
						|
 | 
						|
  xrf.XRWG.deepApplyMatch(match, v, (match,v,node,type) => {
 | 
						|
    if( node.material ) xrf.frag.dynamic.material.set( node, material, v.reset )
 | 
						|
  })
 | 
						|
}
 | 
						|
 | 
						|
xrf.frag.dynamic.material.set = function(mesh,material,reset){
 | 
						|
  if( !mesh.materialOriginal ) mesh.materialOriginal = mesh.material
 | 
						|
  let visible = mesh.material.visible //remember
 | 
						|
  if( reset ){
 | 
						|
    mesh.material = mesh.materialOriginal
 | 
						|
  }else mesh.material = material
 | 
						|
  mesh.material.visible = visible
 | 
						|
}
 | 
						|
 | 
						|
// for reset calls like href: xrf://!myobject e.g.
 | 
						|
xrf.addEventListener('dynamicKey', (opts) => {
 | 
						|
 | 
						|
  let {v,match} = opts
 | 
						|
 | 
						|
  if( v.reset ){
 | 
						|
    xrf.XRWG.deepApplyMatch(match,v, (match,v,node,type) => {
 | 
						|
      if( node.material ) xrf.frag.dynamic.material.set( node, null, v.reset )
 | 
						|
    })
 | 
						|
  } 
 | 
						|
 | 
						|
})
 | 
						|
 | 
						|
// this holds all the URI Template variables (https://www.rfc-editor.org/rfc/rfc6570)
 | 
						|
 | 
						|
xrf.addEventListener('parseModel', (opts) => {
 | 
						|
  let {model,url,file} = opts
 | 
						|
  if( model.isSRC || opts.isSRC ) return // ignore SRC models
 | 
						|
 | 
						|
  xrf.URI.vars = new Proxy({},{
 | 
						|
    set(me,k,v){ 
 | 
						|
      if( k.match(/^(name)$/) ) return true
 | 
						|
      me[k] = v 
 | 
						|
      return true
 | 
						|
    },
 | 
						|
    get(me,k  ){ 
 | 
						|
      if( k == '__object' ){
 | 
						|
        let obj = {}
 | 
						|
        for( let i in xrf.URI.vars ) obj[i] = xrf.URI.vars[i]()
 | 
						|
        return obj
 | 
						|
      }
 | 
						|
      return me[k] 
 | 
						|
    },
 | 
						|
  })
 | 
						|
 | 
						|
  model.scene.traverse( (n) => {
 | 
						|
    const variables = /{([a-zA-Z0-9-]+)}/g
 | 
						|
 | 
						|
    if( n.userData ){
 | 
						|
      for( let i in n.userData ){
 | 
						|
        //if( i[0] == '#' || i.match(/^(href|tag)$/) ) continue // ignore XR Fragment aliases
 | 
						|
        if( i.match(/^(src|href|tag)/) ){
 | 
						|
          // lets declare empty variables found in src-values ('https://foo.com/video.mp4#{somevar}') e.g.
 | 
						|
          if( n.userData[i].match(variables) ){
 | 
						|
            let vars = [].concat( n.userData[i].match(variables) )
 | 
						|
            const strip = (v) => v.replace(/[{}]/g,'')
 | 
						|
            vars.map( (v) => xrf.URI.vars[ strip(v) ] = () => '' )
 | 
						|
          }
 | 
						|
        }else xrf.URI.vars[i] = () => n.userData[i] // declare variables with values
 | 
						|
      }
 | 
						|
    }
 | 
						|
  })
 | 
						|
 | 
						|
})
 | 
						|
 | 
						|
 | 
						|
xrf.addEventListener('dynamicKeyValue', (opts) => {
 | 
						|
  // select active camera if any
 | 
						|
  let {id,match,v} = opts
 | 
						|
 | 
						|
  if( !v.is( xrf.XRF.CUSTOMFRAG) ) return // only process custom frags from here
 | 
						|
  if( v.string.match(/(<|>)/) )    return // ignore filter values
 | 
						|
   
 | 
						|
  if( match.length > 0 ){
 | 
						|
    xrf.frag.dynamic.material(v,opts) // check if fragment is an objectname
 | 
						|
  }
 | 
						|
  
 | 
						|
  if( !xrf.URI.vars[ v.string ] )           return // ignore non-template URI fragments 
 | 
						|
  //if( xrf.URI.vars[ id ] && !match.length ) return console.error(`'${id}'       object/tag/metadata-key not found in scene`)
 | 
						|
 | 
						|
  if( xrf.debug ) console.log(`URI.vars[${id}] => '${v.string}'`)
 | 
						|
 | 
						|
  if( xrf.URI.vars[id] ){
 | 
						|
    xrf.URI.vars[ id ] = xrf.URI.vars[ v.string ]     // update var
 | 
						|
    if( xrf.debug ) console.log(`URI.vars[${id}] => '${xrf.URI.vars[ v.string ]()}'`)
 | 
						|
    xrf.scene.traverse( (n) => {                      
 | 
						|
      // re-expand src-values which use the updated URI Template var 
 | 
						|
      if( n.userData && n.userData.src && n.userData.srcTemplate && n.userData.srcTemplate.match(`{${id}}`) ){
 | 
						|
        let srcNewFragments = xrf.frag.src.expandURI( n ).replace(/.*#/,'')
 | 
						|
        console.log(`URI.vars[${id}] => updating ${n.name} => ${srcNewFragments}`)
 | 
						|
        let frag = xrf.hashbus.pub( srcNewFragments, n )
 | 
						|
      }
 | 
						|
    })
 | 
						|
  }else{
 | 
						|
    xrf.XRWG.deepApplyMatch(match, v, (match,v,node,type) => {
 | 
						|
      console.log(v.string)
 | 
						|
      if( node.geometry ) xrf.hashbus.pub( xrf.URI.vars[ v.string ](), node) // apply fragment mesh(es)
 | 
						|
    })
 | 
						|
  }
 | 
						|
 | 
						|
})
 | 
						|
xrf.addEventListener('dynamicKey', (opts) => {
 | 
						|
  let {scene,id,match,v} = opts
 | 
						|
  if( !scene ) return 
 | 
						|
  let remove = []
 | 
						|
 | 
						|
  // erase previous lines
 | 
						|
  xrf.focusLine.lines.map( (line) => line.parent && (line.parent.remove(line))  )
 | 
						|
  xrf.focusLine.points = []
 | 
						|
  xrf.focusLine.lines  = []
 | 
						|
 | 
						|
  // drawlines
 | 
						|
  match.map( (w) => {
 | 
						|
    w.nodes.map( (mesh) => xrf.drawLineToMesh({ ...opts, mesh}) )
 | 
						|
  })
 | 
						|
})
 | 
						|
 | 
						|
xrf.drawLineToMesh = (opts) => {
 | 
						|
  let {scene,mesh,frag,id} = opts
 | 
						|
  const THREE = xrf.THREE
 | 
						|
  let oldSelection
 | 
						|
  // Selection of Interest if predefined_view matches object name
 | 
						|
  if( mesh.visible && mesh.material){
 | 
						|
    xrf.emit('focus',{...opts,frag})
 | 
						|
    .then( () => {
 | 
						|
      const color    = new THREE.Color();
 | 
						|
      const colors   = []
 | 
						|
      let from       = new THREE.Vector3()
 | 
						|
 | 
						|
      let getCenterPoint = (mesh) => {
 | 
						|
        var geometry = mesh.geometry;
 | 
						|
        geometry.computeBoundingBox();
 | 
						|
        var center = new THREE.Vector3();
 | 
						|
        geometry.boundingBox.getCenter( center );
 | 
						|
        mesh.localToWorld( center );
 | 
						|
        return center;
 | 
						|
      }         
 | 
						|
 | 
						|
      let cam = xrf.camera.getCam ? xrf.camera.getCam() : xrf.camera // *FIXME* camerarig/rig are conflicting
 | 
						|
      cam.updateMatrixWorld(true); // always keeps me diving into the docs :]
 | 
						|
      cam.getWorldPosition(from)
 | 
						|
      from.y = 0.5 // originate from the heart chakra! :p
 | 
						|
      const points = [from, getCenterPoint(mesh) ]
 | 
						|
      const geometry = new THREE.BufferGeometry().setFromPoints( points );
 | 
						|
      let line = new THREE.Line( geometry, xrf.focusLine.material );
 | 
						|
      line.isXRF = true
 | 
						|
      line.computeLineDistances();
 | 
						|
      xrf.focusLine.lines.push(line)
 | 
						|
      xrf.focusLine.points.push(from)
 | 
						|
      xrf.focusLine.opacity = 1
 | 
						|
      xrf.add(line)
 | 
						|
    })
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
xrf.addEventListener('render', (opts) => {
 | 
						|
  // update focusline 
 | 
						|
  let {time,model} = opts
 | 
						|
  if( !xrf.clock || !xrf.focusLine ) return 
 | 
						|
  xrf.focusLine.material.color.r  = (1.0 + Math.sin( xrf.clock.getElapsedTime()*10  ))/2
 | 
						|
  xrf.focusLine.material.dashSize = 0.2 + 0.02*Math.sin( xrf.clock.getElapsedTime()  )
 | 
						|
  xrf.focusLine.material.gapSize  = 0.1 + 0.02*Math.sin( xrf.clock.getElapsedTime() *3  )
 | 
						|
  xrf.focusLine.material.opacity  = (0.25 + 0.15*Math.sin( xrf.clock.getElapsedTime() * 3 )) * xrf.focusLine.opacity;
 | 
						|
  if( xrf.focusLine.opacity > 0.0 ) xrf.focusLine.opacity -= time*0.2
 | 
						|
  if( xrf.focusLine.opacity < 0.0 ) xrf.focusLine.opacity = 0
 | 
						|
})
 | 
						|
/*
 | 
						|
 * mimetype: audio/aac 
 | 
						|
 * mimetype: audio/mpeg 
 | 
						|
 * mimetype: audio/ogg 
 | 
						|
 * mimetype: audio/weba 
 | 
						|
 * mimetype: audio/wav 
 | 
						|
 */
 | 
						|
 | 
						|
let loadAudio = (mimetype) => function(url,opts){
 | 
						|
  let {mesh,src,camera,THREE} = opts
 | 
						|
  let URL  = xrfragment.URI.toAbsolute( xrf.navigator.URI, url )
 | 
						|
  let frag = URL.XRF 
 | 
						|
 | 
						|
  xrf.init.audio()
 | 
						|
  let isPositionalAudio = !(mesh.position.x == 0 && mesh.position.y == 0 && mesh.position.z == 0)
 | 
						|
  const audioLoader = new THREE.AudioLoader();
 | 
						|
  let sound = isPositionalAudio ? new THREE.PositionalAudio( camera.listener) 
 | 
						|
                                : new THREE.Audio( camera.listener )
 | 
						|
 | 
						|
  sound.isXRF = true 
 | 
						|
  mesh.media = mesh.media || {}
 | 
						|
  mesh.media.audio = { set: (mediafragment,v) => mesh.media.audio[mediafragment] = v }
 | 
						|
 | 
						|
  let finalUrl = URL.URN + URL.file 
 | 
						|
  if( xrf.debug > 0 ) console.log("GET "+finalUrl)
 | 
						|
  audioLoader.load( finalUrl, function( buffer ) {
 | 
						|
 | 
						|
    sound.setBuffer( buffer );
 | 
						|
    sound.setLoop(false);
 | 
						|
    sound.setVolume( 1.0 )
 | 
						|
    if( isPositionalAudio ){
 | 
						|
      sound.setRefDistance( mesh.scale.x);
 | 
						|
      sound.setRolloffFactor(20.0)
 | 
						|
      //sound.setDirectionalCone( 360, 360, 0.01 );
 | 
						|
    }else sound.setVolume( mesh.scale.x )
 | 
						|
 | 
						|
    mesh.add(sound)
 | 
						|
 | 
						|
    sound.set = (mediafragment,v) => {
 | 
						|
      try{
 | 
						|
        sound[mediafragment] = v 
 | 
						|
 | 
						|
        if( mediafragment == 't'){
 | 
						|
 | 
						|
          if( sound.isPlaying && v.y != undefined && v.x == v.y ){
 | 
						|
            sound.offset = v.x * buffer.sampleRate ;
 | 
						|
            sound.pause()
 | 
						|
            return 
 | 
						|
          }else sound.stop()
 | 
						|
 | 
						|
          // apply embedded audio/video samplerate/fps or global mixer fps
 | 
						|
          sound.setLoopStart(v.x);
 | 
						|
          sound.setLoopEnd(v.y || buffer.duration);
 | 
						|
          sound.offset = v.x;
 | 
						|
          sound.play()
 | 
						|
        }
 | 
						|
 | 
						|
        if( mediafragment == 's'){
 | 
						|
          // *TODO* https://stackoverflow.com/questions/12484052/how-can-i-reverse-playback-in-web-audio-api-but-keep-a-forward-version-as-well 
 | 
						|
          sound.pause()
 | 
						|
          sound.setPlaybackRate( Math.abs(v.x) ) // WebAudio does not support negative playback
 | 
						|
          sound.play()
 | 
						|
        }
 | 
						|
 | 
						|
        if( mediafragment == 'loop'){
 | 
						|
          sound.pause()
 | 
						|
          sound.setLoop( v.loop )
 | 
						|
          sound.play()
 | 
						|
        }
 | 
						|
      }catch(e){ console.warn(e) }
 | 
						|
    }
 | 
						|
 | 
						|
    let lazySet = {}
 | 
						|
    let mediaFragments = ['loop','s','t']
 | 
						|
    mediaFragments.map( (f) => mesh.media.audio[f] && (lazySet[f] = mesh.media.audio[f]) )
 | 
						|
    mesh.media.audio = sound
 | 
						|
 | 
						|
    // autoplay if user already requested play (before the sound was loaded)
 | 
						|
    mediaFragments.map( (f) => {
 | 
						|
      if( lazySet[f] ) mesh.media.audio.set(f, lazySet[f] )
 | 
						|
    })
 | 
						|
 | 
						|
  });
 | 
						|
 | 
						|
  // apply Media fragments from URL 
 | 
						|
  (['t','loop','s']).map( (f) => { 
 | 
						|
    if( frag[f] ){
 | 
						|
      mesh.media.audio.set( f, frag[f] )
 | 
						|
    }
 | 
						|
  })
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
xrf.init.audio = (opts) => {
 | 
						|
  let camera = xrf.camera
 | 
						|
  /* WebAudio: setup context via THREEjs */
 | 
						|
  if( !camera.listener ){
 | 
						|
    camera.listener = new xrf.THREE.AudioListener();
 | 
						|
    // *FIXME* camera vs camerarig conflict
 | 
						|
    (camera.getCam ? camera.getCam() : camera).add( camera.listener );
 | 
						|
    xrf.emit('audioInited',{listener:camera.listener, ...opts})
 | 
						|
  }
 | 
						|
}
 | 
						|
xrf.addEventListener('init', xrf.init.audio )
 | 
						|
 | 
						|
// stop playing audio when loading another scene
 | 
						|
xrf.addEventListener('reset', () => {
 | 
						|
  xrf.scene.traverse( (n)  => {
 | 
						|
    if( n.media && n.media.audio ){
 | 
						|
      if( n.media.audio.stop ) n.media.audio.stop()
 | 
						|
      if( n.media.audio.remove ) n.media.audio.remove()
 | 
						|
      n.remove()
 | 
						|
    }
 | 
						|
  })
 | 
						|
})
 | 
						|
 | 
						|
 | 
						|
 | 
						|
let audioMimeTypes = [
 | 
						|
  'audio/x-wav',
 | 
						|
  'audio/wav',
 | 
						|
  'audio/mpeg',
 | 
						|
  'audio/mp3',
 | 
						|
  'audio/weba',
 | 
						|
  'audio/aac',
 | 
						|
  'application/ogg'
 | 
						|
]
 | 
						|
audioMimeTypes.map( (mimetype) =>  xrf.frag.src.type[ mimetype ] = loadAudio(mimetype) )
 | 
						|
/*
 | 
						|
 * mimetype: model/gltf+json
 | 
						|
 */
 | 
						|
 | 
						|
xrf.frag.src.type['fbx'] = function( url, opts ){
 | 
						|
  return new Promise( async (resolve,reject) => {
 | 
						|
    let {mesh,src} = opts
 | 
						|
    let URL  = xrfragment.URI.toAbsolute( xrf.navigator.URI, url )
 | 
						|
    let frag = URL.XRF 
 | 
						|
    let loader
 | 
						|
 | 
						|
    let {THREE}        = await import('https://unpkg.com/three@0.161.0/build/three.module.js')
 | 
						|
    let  { FBXLoader } = await import('three/addons/loaders/FBXLoader.js')
 | 
						|
    debugger
 | 
						|
 | 
						|
    //const Loader = xrf.loaders[ext]
 | 
						|
    //if( !Loader ) throw 'xrfragment: no loader passed to xrfragment for extension .'+ext 
 | 
						|
    //if( !dir.match("://") ){ // force relative path 
 | 
						|
    //  dir = dir[0] == './' ? dir : `./${dir}`
 | 
						|
    //  loader = new Loader().setPath( dir )
 | 
						|
    //}else loader = new Loader()
 | 
						|
 | 
						|
    //loader.load(url, (model) => {
 | 
						|
    //  model.isSRC = true
 | 
						|
    //  resolve(model)
 | 
						|
    //})
 | 
						|
  })
 | 
						|
}
 | 
						|
 | 
						|
/* 
 | 
						|
 * extensions: .frag/.fs/.vs/.vert
 | 
						|
 */
 | 
						|
 | 
						|
xrf.frag.src.type['x-shader/x-fragment'] = function(url,opts){
 | 
						|
  let {mesh,THREE} = opts
 | 
						|
 | 
						|
  let URL  = xrfragment.URI.toAbsolute( xrf.navigator.URI, url )
 | 
						|
  let frag = URL.XRF 
 | 
						|
 | 
						|
  let isFragmentShader = /\.(fs|frag|glsl)$/
 | 
						|
  let isVertexShader   = /\.(vs|vert)$/
 | 
						|
 | 
						|
  let shaderReqs = []
 | 
						|
  let shaderCode = {}
 | 
						|
  let shader   = {
 | 
						|
    fragment: { code: '', url: url.match( isFragmentShader ) ? URL.URN + URL.file : '' },
 | 
						|
    vertex:   { code: '', url: url.match( isVertexShader   ) ? URL.URN + URL.file : '' }
 | 
						|
  }
 | 
						|
  
 | 
						|
  var onShaderLoaded = ((args) => (type, status, code) => {
 | 
						|
    if( !code ) return console.error('could not load shader')
 | 
						|
    shader[type].status = status 
 | 
						|
    shader[type].code   = code 
 | 
						|
    if( shader.fragment.code && shader.vertex.code ){
 | 
						|
      
 | 
						|
      let oldMaterial = mesh.material
 | 
						|
      mesh.material = new THREE.RawShaderMaterial({
 | 
						|
        uniforms: {
 | 
						|
          time: { value: 1.0 },
 | 
						|
          resolution: { value: new THREE.Vector2(1.0,1.0) }
 | 
						|
        },
 | 
						|
        // basic shaders include following common vars/funcs: https://github.com/mrdoob/three.js/blob/master/src/renderers/shaders/ShaderChunk/common.glsl.js
 | 
						|
        fragmentShader: shader.fragment.status == 200 ? shader.fragment.code : THREE.ShaderChunk.meshbasic_frag,
 | 
						|
        vertexShader:   shader.vertex.status   == 200 ? shader.vertex.code   : THREE.ShaderChunk.meshbasic_vert,
 | 
						|
 | 
						|
      });
 | 
						|
 | 
						|
      mesh.material.needsUpdate = true 
 | 
						|
      mesh.needsUpdate          = true
 | 
						|
 | 
						|
      mesh.onBeforeRender = () => {
 | 
						|
        if( !mesh.material || !mesh.material.uniforms ) return mesh.onBeforeRender = function(){}
 | 
						|
        mesh.material.uniforms.time.value = xrf.clock.elapsedTime
 | 
						|
      }
 | 
						|
 | 
						|
    }
 | 
						|
 | 
						|
  })({})
 | 
						|
 | 
						|
  // sidecar-load vertex shader file
 | 
						|
  if( shader.fragment.url && !shader.vertex.url ){  
 | 
						|
    shader.vertex.url = shader.fragment.url.replace(/\.fs$/,   '.vs')
 | 
						|
                                           .replace(/\.frag$/, '.vert')
 | 
						|
  }
 | 
						|
   
 | 
						|
  if( shader.fragment.url ){
 | 
						|
    fetch(shader.fragment.url)
 | 
						|
    .then( (res) => res.text().then( (code) => onShaderLoaded('fragment',res.status,code) ) )
 | 
						|
  }
 | 
						|
 | 
						|
  if( shader.vertex.url ){
 | 
						|
    fetch(shader.vertex.url)
 | 
						|
    .then( (res) => res.text().then( (code) => onShaderLoaded('vertex',res.status,code) ) )
 | 
						|
  }
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
xrf.frag.src.type['x-shader/x-vertex']   = xrf.frag.src.type['x-shader/x-fragment']
 | 
						|
 | 
						|
/*
 | 
						|
 * mimetype: model/gltf+json
 | 
						|
 */
 | 
						|
 | 
						|
xrf.frag.src.type['gltf'] = function( url, opts ){
 | 
						|
  return new Promise( (resolve,reject) => {
 | 
						|
    let {mesh,src} = opts
 | 
						|
    let URL = xrfragment.URI.toAbsolute( xrf.navigator.URI, url )
 | 
						|
    let {directory,file,fileExt,URN} = URL;
 | 
						|
    let loader
 | 
						|
 | 
						|
    const Loader = xrf.loaders[fileExt]
 | 
						|
    if( !Loader ) throw 'xrfragment: no loader passed to xrfragment for extension .'+ext 
 | 
						|
    loader = new Loader().setPath( URN )
 | 
						|
 | 
						|
    loader.load(file, (model) => {
 | 
						|
      model.isSRC = true
 | 
						|
      resolve(model)
 | 
						|
    })
 | 
						|
  })
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
let loadHTML = (mimetype) => function(url,opts){
 | 
						|
  let {mesh,src,camera} = opts
 | 
						|
  let {urlObj,dir,file,hash,ext} = xrf.parseUrl(url)
 | 
						|
  let frag = xrf.URI.parse( url ).XRF
 | 
						|
  console.warn("todo: html viewer for src not implemented")
 | 
						|
}
 | 
						|
 | 
						|
let htmlMimeTypes = [
 | 
						|
  'text/html'
 | 
						|
]
 | 
						|
htmlMimeTypes.map( (mimetype) =>  xrf.frag.src.type[ mimetype ] = loadHTML(mimetype) )
 | 
						|
/*
 | 
						|
 * mimetype: image/png 
 | 
						|
 * mimetype: image/jpg 
 | 
						|
 * mimetype: image/gif 
 | 
						|
 */
 | 
						|
 | 
						|
xrf.frag.src.type['image/png'] = function(url,opts){
 | 
						|
  let {mesh,THREE} = opts
 | 
						|
  let restrictTo3DBoundingBox = mesh.geometry
 | 
						|
  let URL  = xrfragment.URI.toAbsolute( xrf.navigator.URI, url )
 | 
						|
  let frag = URL.XRF 
 | 
						|
 | 
						|
  mesh.material = new xrf.THREE.MeshBasicMaterial({ 
 | 
						|
    map: null, 
 | 
						|
    transparent: url.match(/\.(png|gif)/) ? true : false,
 | 
						|
    side: THREE.DoubleSide,
 | 
						|
    color: 0xFFFFFF,
 | 
						|
    opacity:1
 | 
						|
  });
 | 
						|
 | 
						|
  let renderImage = (texture) => {
 | 
						|
    let img = {w: texture.source.data.width, h: texture.source.data.height}
 | 
						|
 | 
						|
    // stretch image by pinning uv-coordinates to corners 
 | 
						|
    if( mesh.geometry ){
 | 
						|
      if( mesh.geometry.attributes.uv ){ // buffergeometries 
 | 
						|
        let uv = mesh.geometry.attributes.uv;
 | 
						|
      }else {
 | 
						|
        console.warn("xrfragment: uv's of ${url} might be off for non-buffer-geometries *TODO*")
 | 
						|
        //if( geometry.faceVertexUvs ){
 | 
						|
        // *TODO* force uv's of dynamically created geometries (in threejs)
 | 
						|
        //}
 | 
						|
      }
 | 
						|
    }
 | 
						|
    mesh.material.map = texture
 | 
						|
    mesh.material.needsUpdate = true 
 | 
						|
    mesh.needsUpdate = true
 | 
						|
 | 
						|
    //// *TODO* update clones in portals or dont clone scene of portals..
 | 
						|
    //xrf.scene.traverse( (n) => {
 | 
						|
    //  if( n.userData.src == mesh.userData.src && mesh.uuid != n.uuid ){
 | 
						|
    //    n.material = mesh.material
 | 
						|
    //    n.material.needsUpdate = true
 | 
						|
    //  }
 | 
						|
    //})
 | 
						|
  } 
 | 
						|
 | 
						|
  let onLoad = (texture) => {
 | 
						|
    texture.colorSpace = THREE.SRGBColorSpace;
 | 
						|
    texture.wrapS = THREE.RepeatWrapping;
 | 
						|
    texture.wrapT = THREE.RepeatWrapping;
 | 
						|
    renderImage(texture)
 | 
						|
  }
 | 
						|
 | 
						|
  new THREE.TextureLoader().load( URL.URN + URL.file, onLoad, null, console.error );
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
xrf.frag.src.type['image/gif'] = xrf.frag.src.type['image/png']
 | 
						|
xrf.frag.src.type['image/jpeg'] = xrf.frag.src.type['image/png']
 | 
						|
 | 
						|
// spec 8: https://xrfragment.org/doc/RFC_XR_Macros.html#embedding-xr-content-using-src
 | 
						|
 | 
						|
xrf.portalNonEuclidian = function(opts){
 | 
						|
  let { frag, mesh, model, camera, scene, renderer} = opts
 | 
						|
 | 
						|
  mesh.portal = {
 | 
						|
    pos: mesh.position.clone(),
 | 
						|
    posWorld: new xrf.THREE.Vector3(),
 | 
						|
    posWorldCamera: new xrf.THREE.Vector3(),
 | 
						|
    stencilRef: xrf.portalNonEuclidian.stencilRef,
 | 
						|
    needUpdate: false,
 | 
						|
    stencilObject: false,
 | 
						|
    cameraDirection: new xrf.THREE.Vector3(),
 | 
						|
    cameraPosition: new xrf.THREE.Vector3(),
 | 
						|
    raycaster: new xrf.THREE.Raycaster(),
 | 
						|
    isLocal: opts.isLocal,
 | 
						|
    isLens: false,
 | 
						|
    isInside: false,
 | 
						|
    setStencil:  (stencilRef) => mesh.portal.stencilObjects.traverse( (n) => showPortal(n, stencilRef == 0) && n.stencil && n.stencil(stencilRef) ),
 | 
						|
    positionObjectsIfNeeded: (pos,scale)  => !mesh.portal.isLens &&  mesh.portal.stencilObjects.traverse( (n) =>  n.positionAtStencil && (n.positionAtStencil(pos,scale)) )
 | 
						|
  }
 | 
						|
 | 
						|
  // allow objects to flip between original and stencil position (which puts them behind stencilplane)
 | 
						|
  const addStencilFeature = (n) => { 
 | 
						|
    if( n.stencil ) return n // run once
 | 
						|
 | 
						|
    n.stencil = (sRef ) => xrf.portalNonEuclidian.selectStencil(n, sRef )
 | 
						|
    n.positionAtStencil = (pos,scale) => (newPos,newScale) => {
 | 
						|
      n.position.copy( newPos || pos )
 | 
						|
      n.scale.copy( scale )
 | 
						|
      n.updateMatrixWorld(true)
 | 
						|
    }
 | 
						|
    // curry function 
 | 
						|
    n.positionAtStencil = n.positionAtStencil( n.position.clone(), n.scale.clone() )
 | 
						|
    return n
 | 
						|
  }
 | 
						|
 | 
						|
  this.setupStencilObjects = (scene,opts) => {
 | 
						|
    // collect related objects to render inside stencilplane
 | 
						|
    let stencilObject         = scene 
 | 
						|
    if( opts.srcFrag.target ){
 | 
						|
      stencilObject = scene.getObjectByName( opts.srcFrag.target.key ) 
 | 
						|
      // spec: if src-object is child of portal (then portal is lens, and should include all children )
 | 
						|
      mesh.traverse( (n) => n.name == opts.srcFrag.target.key && (stencilObject = n) && (mesh.portal.isLens = true) ) 
 | 
						|
    }
 | 
						|
 | 
						|
    if( !stencilObject ) return console.warn(`no objects were found (src:${mesh.userData.src}) for (portal)object name '${mesh.name}'`)
 | 
						|
    mesh.portal.stencilObject = stencilObject 
 | 
						|
 | 
						|
    // spec: if src points to child, act as lens
 | 
						|
    if( !mesh.portal.isLocal || mesh.portal.isLens )  stencilObject.visible = false 
 | 
						|
 | 
						|
    let stencilObjects = [stencilObject]
 | 
						|
    stencilObjects = stencilObjects
 | 
						|
                     .filter( (n) => !n.portal ) // filter out (self)references to portals (prevent recursion)
 | 
						|
                     .map(addStencilFeature)
 | 
						|
 | 
						|
    // put it into a scene (without .add() because it reparents objects) so we can render it separately
 | 
						|
    mesh.portal.stencilObjects = new xrf.THREE.Scene()
 | 
						|
    mesh.portal.stencilObjects.children = stencilObjects 
 | 
						|
    mesh.portal.stencilObjects.isXRF = true 
 | 
						|
 | 
						|
    xrf.portalNonEuclidian.stencilRef += 1 // each portal has unique stencil id
 | 
						|
    if( xrf.debug ) console.log(`enabling portal for object '${mesh.name}' (stencilRef:${mesh.portal.stencilRef})`)
 | 
						|
  
 | 
						|
    return this
 | 
						|
  }
 | 
						|
 | 
						|
  // enable the stencil-material of the stencil objects to prevent stackoverflow (portal in portal rendering)
 | 
						|
  const showPortal = (n,show) => {
 | 
						|
    if( n.portal ) n.visible = show
 | 
						|
    return true
 | 
						|
  }
 | 
						|
 | 
						|
  this.setupListeners = () => {
 | 
						|
 | 
						|
    // below is a somewhat weird tapdance to render the portals **after** the scene 
 | 
						|
    // is rendered (otherwise it messes up occlusion)
 | 
						|
 | 
						|
    mesh.onAfterRender = function(renderer, scene, camera, geometry, material, group ){
 | 
						|
      mesh.portal.needUpdate = true
 | 
						|
    }
 | 
						|
 | 
						|
    xrf.addEventListener('renderPost', (opts) => {
 | 
						|
      let {scene,camera,time,render,renderer} = opts
 | 
						|
 | 
						|
      if( mesh.portal.needUpdate && mesh.portal && mesh.portal.stencilObjects ){  
 | 
						|
        let cameraDirection            = mesh.portal.cameraDirection
 | 
						|
        let cameraPosition             = mesh.portal.cameraPosition
 | 
						|
        let stencilRef                 = mesh.portal.stencilRef
 | 
						|
        let newPos                     = mesh.portal.posWorld
 | 
						|
        let stencilObject              = mesh.portal.stencilObject
 | 
						|
        let newScale                   = mesh.scale 
 | 
						|
        let raycaster                  = mesh.portal.raycaster
 | 
						|
 | 
						|
        let cam = xrf.camera.getCam ? xrf.camera.getCam() : camera
 | 
						|
        cam.getWorldPosition(cameraPosition)
 | 
						|
        cam.getWorldDirection(cameraDirection)
 | 
						|
        if( cameraPosition.distanceTo(newPos) > 15.0 ) return // dont render far portals 
 | 
						|
 | 
						|
        // init
 | 
						|
        if( !mesh.portal.isLocal || mesh.portal.isLens ) stencilObject.visible = true 
 | 
						|
        mesh.portal.setStencil(stencilRef)
 | 
						|
        renderer.autoClear             = false 
 | 
						|
        renderer.autoClearDepth        = false 
 | 
						|
        renderer.autoClearColor        = false 
 | 
						|
        renderer.autoClearStencil      = false 
 | 
						|
        // render
 | 
						|
        render( mesh.portal.stencilObjects, camera )
 | 
						|
        // de-init 
 | 
						|
        renderer.autoClear             = true 
 | 
						|
        renderer.autoClearDepth        = true 
 | 
						|
        renderer.autoClearColor        = true 
 | 
						|
        renderer.autoClearStencil      = true 
 | 
						|
        mesh.portal.setStencil(0)
 | 
						|
        if( !mesh.portal.isLocal || mesh.portal.isLens ) stencilObject.visible = false 
 | 
						|
 | 
						|
 | 
						|
        // trigger href upon camera collide
 | 
						|
        if( mesh.userData.XRF.href ){
 | 
						|
          raycaster.far = 0.35
 | 
						|
          raycaster.set(cameraPosition, cameraDirection )
 | 
						|
          let intersects = raycaster.intersectObjects([mesh], false)
 | 
						|
          if (intersects.length > 0 && !mesh.portal.teleporting ){
 | 
						|
            mesh.portal.teleporting = true
 | 
						|
            mesh.userData.XRF.href.exec({nocommit:true})
 | 
						|
            setTimeout( () => mesh.portal.teleporting = false, 500) // dont flip back and forth
 | 
						|
          }
 | 
						|
        }
 | 
						|
      }
 | 
						|
      mesh.portal.needUpdate = false
 | 
						|
    })
 | 
						|
 | 
						|
 | 
						|
 | 
						|
    return this
 | 
						|
  }
 | 
						|
 | 
						|
  // turn mesh into stencilplane 
 | 
						|
  xrf
 | 
						|
  .portalNonEuclidian
 | 
						|
  .setMaterial(mesh)
 | 
						|
  .getWorldPosition(mesh.portal.posWorld)
 | 
						|
 | 
						|
  this
 | 
						|
  .setupListeners()
 | 
						|
  .setupStencilObjects(scene,opts)
 | 
						|
 | 
						|
  // move portal objects to portalposition
 | 
						|
  if( mesh.portal.stencilObjects ) mesh.portal.positionObjectsIfNeeded(mesh.portal.posWorld, mesh.scale)
 | 
						|
}
 | 
						|
 | 
						|
xrf.portalNonEuclidian.selectStencil = (n, stencilRef, nested) => {
 | 
						|
  if( n.material ){
 | 
						|
    n.material.stencilRef   = stencilRef 
 | 
						|
    n.material.stencilWrite = stencilRef > 0 
 | 
						|
    n.material.stencilFunc  = xrf.THREE.EqualStencilFunc;
 | 
						|
  }
 | 
						|
  if( n.children && !nested ) n.traverse( (m) => !m.portal && (xrf.portalNonEuclidian.selectStencil(m,stencilRef,true)) )
 | 
						|
}
 | 
						|
  
 | 
						|
xrf.portalNonEuclidian.setMaterial = function(mesh){
 | 
						|
  mesh.material = new xrf.THREE.MeshBasicMaterial({ color: 'orange' });
 | 
						|
  mesh.material.depthWrite   = false;
 | 
						|
  mesh.material.colorWrite   = false;
 | 
						|
  mesh.material.stencilWrite = true;
 | 
						|
  mesh.material.stencilRef   = xrf.portalNonEuclidian.stencilRef;
 | 
						|
  mesh.material.stencilFunc  = xrf.THREE.AlwaysStencilFunc;
 | 
						|
  mesh.material.stencilZPass = xrf.THREE.ReplaceStencilOp;
 | 
						|
  mesh.material.stencilZFail = xrf.THREE.ReplaceStencilOp;
 | 
						|
  return mesh
 | 
						|
}
 | 
						|
 | 
						|
xrf.addEventListener('parseModel',(opts) => {
 | 
						|
  const scene = opts.model.scene
 | 
						|
})
 | 
						|
 | 
						|
 | 
						|
// (re)set portalObjects when entering/leaving a portal 
 | 
						|
let updatePortals = (opts) => {
 | 
						|
  xrf.scene.traverse( (n) => {
 | 
						|
    if( !n.portal ) return 
 | 
						|
    // move objects back to the portal 
 | 
						|
    if( n.portal.isInside ) n.portal.positionObjectsIfNeeded( n.portal.posWorld, n.scale )
 | 
						|
    n.portal.isInside = false
 | 
						|
  })
 | 
						|
  if( opts.mesh && opts.mesh.portal && opts.click ){
 | 
						|
    opts.mesh.portal.isInside = true
 | 
						|
    opts.mesh.portal.positionObjectsIfNeeded() // move objects back to original pos (since we are teleporting there)
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
xrf.addEventListener('href', (opts) => opts.click && updatePortals(opts) )
 | 
						|
xrf.addEventListener('navigate', updatePortals )
 | 
						|
 | 
						|
xrf.portalNonEuclidian.stencilRef = 1
 | 
						|
let loadVideo = (mimetype) => function(url,opts){
 | 
						|
  let {mesh,src,camera} = opts
 | 
						|
  const THREE = xrf.THREE
 | 
						|
  let URL  = xrfragment.URI.toAbsolute( xrf.navigator.URI, url )
 | 
						|
  let frag = URL.XRF 
 | 
						|
 | 
						|
  // patch VideoTexture so it doesn't upload videoframes when paused
 | 
						|
  // https://github.com/mrdoob/three.js/pull/28575 
 | 
						|
  THREE.VideoTexture.prototype.update = function(){
 | 
						|
    const video = this.image;
 | 
						|
    const hasVideoFrameCallback = 'requestVideoFrameCallback' in video;
 | 
						|
 | 
						|
    if ( hasVideoFrameCallback === false && video.readyState >= video.HAVE_CURRENT_DATA && (!video.paused || !this.firstFrame) ){
 | 
						|
      console.log("updating..")
 | 
						|
      this.needsUpdate = true;
 | 
						|
      this.firstFrame  = true
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
 | 
						|
  mesh.media = mesh.media || {}
 | 
						|
 | 
						|
  let video = mesh.media.video = document.createElement('video')
 | 
						|
  video.style.display = 'none'
 | 
						|
  video.setAttribute("crossOrigin","anonymous")
 | 
						|
  video.setAttribute("playsinline",'')
 | 
						|
  video.addEventListener('loadedmetadata', function(){
 | 
						|
    let texture = new THREE.VideoTexture( video );
 | 
						|
    texture.colorSpace = THREE.SRGBColorSpace;
 | 
						|
    let mat     = new xrf.THREE.MeshBasicMaterial()
 | 
						|
    mat.map = texture
 | 
						|
    mesh.material = mat
 | 
						|
    // set range
 | 
						|
    video.addEventListener('timeupdate', function timeupdate() {
 | 
						|
      if (video.t && video.t.y !== undefined && video.t.y > video.t.x && Math.abs(video.currentTime) >= video.t.y ){
 | 
						|
        if( video.looping ) video.currentTime = video.t.x // speed means loop
 | 
						|
        else video.pause()
 | 
						|
      }
 | 
						|
    },false)
 | 
						|
  })
 | 
						|
 | 
						|
  video.src = URL.URN + URL.file 
 | 
						|
  video.speed = 1.0
 | 
						|
  video.looping = false
 | 
						|
  video.set = (mediafragment,v) => {
 | 
						|
    video[mediafragment] = v
 | 
						|
 | 
						|
    if( mediafragment == 't'){
 | 
						|
      video.pause()
 | 
						|
      if( v.x !== undefined && v.x == v.y ) return // stop paused
 | 
						|
      else{
 | 
						|
        video.currentTime = v.x
 | 
						|
        video.time = v.x
 | 
						|
        video.play()
 | 
						|
      }
 | 
						|
    }
 | 
						|
    if( mediafragment == 's' ){
 | 
						|
      video.playbackRate = Math.abs( v.x ) // html5 video does not support reverseplay :/
 | 
						|
    }
 | 
						|
    if( mediafragment == 'loop' ){
 | 
						|
      video.looping = true 
 | 
						|
    }
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
// stop playing audio when loading another scene
 | 
						|
xrf.addEventListener('reset', () => {
 | 
						|
  xrf.scene.traverse( (n)  => n.media && n.media.video && (n.media.video.pause()) && (n.media.video.remove()) )
 | 
						|
})
 | 
						|
 | 
						|
let videoMimeTypes = [
 | 
						|
  'video/ogg',
 | 
						|
  'video/mp4'
 | 
						|
]
 | 
						|
videoMimeTypes.map( (mimetype) =>  xrf.frag.src.type[ mimetype ] = loadVideo(mimetype) )
 | 
						|
window.AFRAME.registerComponent('href', {
 | 
						|
  schema: {
 | 
						|
  },
 | 
						|
 | 
						|
  init: function () {
 | 
						|
    if( !this.data ) return
 | 
						|
    this.el.object3D.traverse( (m) => {
 | 
						|
      if( m.geometry ){ 
 | 
						|
        m.userData.href = this.data
 | 
						|
      }
 | 
						|
    })
 | 
						|
  }
 | 
						|
 | 
						|
});
 | 
						|
 | 
						|
window.AFRAME.registerComponent('xrf', {
 | 
						|
  schema: {
 | 
						|
    http: { type:'string'},
 | 
						|
    https: { type:'string'},
 | 
						|
  },
 | 
						|
 | 
						|
  init: async function () {
 | 
						|
 | 
						|
    // fix needed since aframe 1.7.0 (non-key/value string values no longer accepted)
 | 
						|
    urlArr = []
 | 
						|
    for( var i in this.attrValue ){
 | 
						|
      if( this.attrValue[i] ){
 | 
						|
        if( i ) urlArr.push(i)
 | 
						|
        urlArr.push( this.attrValue[i] )
 | 
						|
      }
 | 
						|
    }
 | 
						|
    this.data = urlArr.join(":")
 | 
						|
 | 
						|
    // override this.data when URL has passed (`://....com/?https://foo.com/index.glb` e.g.)
 | 
						|
    if( typeof this.data == "string" ){
 | 
						|
      let searchIsUri = document.location.search && 
 | 
						|
                        !document.location.search.match(/=/) &&
 | 
						|
                        document.location.search.match("/")
 | 
						|
      if( searchIsUri  ){ // override url
 | 
						|
        this.data = `${document.location.search.substr(1)}`
 | 
						|
      }
 | 
						|
      if( document.location.hash.length > 1 ){
 | 
						|
        this.data = this.data.replace(/#.*/,'') + document.location.hash
 | 
						|
      }
 | 
						|
    }
 | 
						|
 | 
						|
    if( !AFRAME.XRF ){
 | 
						|
 | 
						|
      let camera = document.querySelector('[camera]')
 | 
						|
      // start with black
 | 
						|
      camera.setAttribute('xrf-fade','')
 | 
						|
      AFRAME.fade = camera.components['xrf-fade']
 | 
						|
 | 
						|
      let aScene = document.querySelector('a-scene')
 | 
						|
 | 
						|
      // enable XR fragments
 | 
						|
      let XRF = AFRAME.XRF = xrf.init({
 | 
						|
        THREE,
 | 
						|
        camera:    aScene.camera,
 | 
						|
        scene:     aScene.object3D,
 | 
						|
        renderer:  aScene.renderer,
 | 
						|
        loaders: { 
 | 
						|
          gltf: THREE.GLTFLoader, // which 3D assets (exts) to check for XR fragments?
 | 
						|
          glb:  THREE.GLTFLoader,
 | 
						|
          obj:  THREE.OBJLoader,
 | 
						|
          fbx:  THREE.FBXLoader,
 | 
						|
          usdz: THREE.USDZLoader,
 | 
						|
          col:  THREE.ColladaLoader
 | 
						|
        }
 | 
						|
      })
 | 
						|
      if( !XRF.camera ) throw 'xrfragment: no camera detected, please declare <a-entity camera..> ABOVE entities with xrf-attributes'
 | 
						|
        
 | 
						|
      if( AFRAME.utils.device.isMobile() ){
 | 
						|
 //        aScene.setAttribute('webxr',"requiredFeatures: dom-overlay; overlayElement: canvas; referenceSpaceType: local")
 | 
						|
      }
 | 
						|
 | 
						|
      aScene.addEventListener('loaded', () => {
 | 
						|
        // this is just for convenience (not part of spec): enforce AR + hide/show stuff based on VR tags in 3D model 
 | 
						|
        ARbutton = document.querySelector('.a-enter-ar-button')
 | 
						|
        VRbutton = document.querySelector('.a-enter-vr-button')
 | 
						|
        if( ARbutton ) ARbutton.addEventListener('click', () => AFRAME.XRF.hashbus.pub( '#-VR' ) )
 | 
						|
        if( VRbutton ) VRbutton.addEventListener('click', () => AFRAME.XRF.hashbus.pub( '#VR' ) )
 | 
						|
      })
 | 
						|
 | 
						|
 | 
						|
      // not part of the spec, but convenient to only show AR button when negative VR-tag was defined in default fragment ('#' in rootscene file)
 | 
						|
      xrf.addEventListener('#', function(e){
 | 
						|
        if( e.frag['#'].string.match(/-VR/) ){
 | 
						|
          aScene.removeAttribute('xr-mode-ui')
 | 
						|
          aScene.setAttribute('xr-mode-ui',"XRMode: ar")
 | 
						|
        }
 | 
						|
      })
 | 
						|
 | 
						|
      let repositionUser = (scale) => () => {
 | 
						|
          // sometimes AFRAME resets the user position to 0,0,0 when entering VR (not sure why)
 | 
						|
          setTimeout( () => {
 | 
						|
            let pos = xrf.frag.pos.lastVector3
 | 
						|
            if( pos ){ xrf.camera.position.set(pos.x, pos.y*scale, pos.z) }
 | 
						|
          },500)
 | 
						|
      }
 | 
						|
 | 
						|
      aScene.addEventListener('enter-vr', repositionUser(1) )
 | 
						|
      aScene.addEventListener('enter-ar', repositionUser(2) )
 | 
						|
 | 
						|
      xrf.addEventListener('navigateLoaded', (opts) => {
 | 
						|
 | 
						|
        setTimeout( () => AFRAME.fade.out(),500) 
 | 
						|
        let isLocal = opts.url.match(/^#/)
 | 
						|
        if( isLocal ) return 
 | 
						|
 | 
						|
        // *TODO* this does not really belong here perhaps
 | 
						|
        let blinkControls = document.querySelector('[blink-controls]')
 | 
						|
        if( blinkControls ){
 | 
						|
          let els       = xrf.getCollisionMeshes()
 | 
						|
          let invisible = false
 | 
						|
          els.map( (mesh) => {
 | 
						|
            if( !invisible ){
 | 
						|
              invisible = mesh.material.clone()
 | 
						|
              invisible.visible = false
 | 
						|
            }
 | 
						|
            mesh.material = invisible 
 | 
						|
            let el = document.createElement("a-entity")
 | 
						|
            el.setAttribute("xrf-get", mesh.name )
 | 
						|
            el.setAttribute("class","floor")
 | 
						|
            $('a-scene').appendChild(el)
 | 
						|
          })
 | 
						|
          let com = blinkControls.components['blink-controls']
 | 
						|
          if( com ) com.update({collisionEntities:true})
 | 
						|
          else console.warn("xrfragments: blink-controls is not mounted, please run manually: $('[blink-controls]).components['blink-controls'].update({collisionEntities:true})")
 | 
						|
 | 
						|
          blinkControls.addEventListener('teleported', (e) => {
 | 
						|
            if( e.detail.newPosition.z < 0){
 | 
						|
              console.warn('teleported to negative Z-value: https://github.com/jure/aframe-blink-controls/issues/30')
 | 
						|
            }
 | 
						|
          })
 | 
						|
        }
 | 
						|
 | 
						|
        // give headset users way to debug without a cumbersome usb-tapdance
 | 
						|
        if( document.location.hostname.match(/^(localhost|[1-9])/) && !aScene.getAttribute("vconsole") ){
 | 
						|
          aScene.setAttribute('vconsole','')
 | 
						|
        }
 | 
						|
 | 
						|
      })
 | 
						|
      xrf.addEventListener('navigateError', (opts) => {
 | 
						|
        AFRAME.fade.out()
 | 
						|
      })
 | 
						|
 | 
						|
      xrf.addEventListener('navigateLoading', (opts) => {
 | 
						|
        let p       = opts.promise()
 | 
						|
        let url     = opts.url 
 | 
						|
        let isLocal = url.match(/^#/)
 | 
						|
        let hasPos  = url.match(/pos=/)
 | 
						|
        let fastFadeMs = 200
 | 
						|
        if( !AFRAME.fade  ) return p.resolve()
 | 
						|
 | 
						|
        if( isLocal ){
 | 
						|
          if( hasPos ){
 | 
						|
            // local teleports only
 | 
						|
            AFRAME.fade.in(fastFadeMs)
 | 
						|
            setTimeout( () => {
 | 
						|
              p.resolve()
 | 
						|
            }, fastFadeMs)
 | 
						|
          }
 | 
						|
        }else{
 | 
						|
          AFRAME.fade.in(fastFadeMs)
 | 
						|
          setTimeout( () => {
 | 
						|
            p.resolve()
 | 
						|
          }, AFRAME.fade.data.fadetime )
 | 
						|
        }
 | 
						|
      },{weight:-1000})
 | 
						|
 | 
						|
      // convert href's to a-entity's so AFRAME
 | 
						|
      // raycaster can find & execute it
 | 
						|
      AFRAME.XRF.clickableMeshToEntity = (opts) => {
 | 
						|
        let {mesh,clickHandler} = opts;
 | 
						|
        let createEl            = function(c){
 | 
						|
          let el = document.createElement("a-entity")
 | 
						|
          // raycaster
 | 
						|
          el.setAttribute("xrf-get",{name:c.name})     // turn into AFRAME entity
 | 
						|
          el.setAttribute("class","ray")         // expose to raycaster 
 | 
						|
 | 
						|
          // respond to cursor via laser-controls (https://aframe.io/docs/1.4.0/components/laser-controls.html)
 | 
						|
          el.addEventListener("click",          (e) => (AFRAME.utils.isMobile() || xrf.renderer.xr.isPresenting) && clickHandler(e) )
 | 
						|
          el.addEventListener("mouseenter",     (e) => (AFRAME.utils.isMobile() || xrf.renderer.xr.isPresenting) && mesh.userData.XRF.href.selected(true) )
 | 
						|
          el.addEventListener("mouseleave",     (e) => (AFRAME.utils.isMobile() || xrf.renderer.xr.isPresenting) && mesh.userData.XRF.href.selected(false) )
 | 
						|
          $('a-scene').appendChild(el)
 | 
						|
        }
 | 
						|
        createEl(mesh)
 | 
						|
      }
 | 
						|
      xrf.addEventListener('interactionReady', AFRAME.XRF.clickableMeshToEntity )
 | 
						|
 | 
						|
      if( typeof this.data === 'string' || this.data.http || this.data.https ){
 | 
						|
        let url
 | 
						|
        if( typeof this.data === 'string' ) url = this.data
 | 
						|
        if( this.data.http                ) url = `http:${this.data.http}`
 | 
						|
        if( this.data.https               ) url = `https:${this.data.https}`
 | 
						|
        AFRAME.XRF.navigator.to( url )
 | 
						|
                            .then( (model) => {
 | 
						|
                              let gets = [ ...document.querySelectorAll('[xrf-get]') ]
 | 
						|
                              gets.map( (g) => g.emit('update') )
 | 
						|
                            })
 | 
						|
      }else{ 
 | 
						|
        // load current AFRAME scene as model
 | 
						|
        let sceneEl = aScene.querySelector('[xrf]')
 | 
						|
        if( !sceneEl.object3D ) return console.error("please model your XR Fragments scene within <a-entity xrf> .... </a-entity>")
 | 
						|
        const scene = sceneEl.object3D
 | 
						|
        // name THREE objects according to AFRAME element ids
 | 
						|
        scene.traverse( (m) => {
 | 
						|
          if( !m.name && m.el && m.el.id ) m.name = m.el.id
 | 
						|
        })
 | 
						|
        // load current scene as model
 | 
						|
        xrf.model = {scene,animations:[]}
 | 
						|
        xrf.scene = scene
 | 
						|
        //xrf.loadModel( xrf.model, "#", true )
 | 
						|
        ////if( sceneEl.components.xrf.data ){
 | 
						|
        ////  xrf.navigator.to(sceneEl.components.xrf.data ) // eval default fragment
 | 
						|
        ////  console.log("evaluating default fragments")
 | 
						|
        ////  sceneEl.object3D.userData['#'] = sceneEl.components.xrf.data
 | 
						|
        ////}
 | 
						|
        //if( document.location.hash ){
 | 
						|
        //  xrf.hashbus.pub( document.location.hash, xrf.model) // eval url 
 | 
						|
        AFRAME.fade.out()
 | 
						|
      }
 | 
						|
 | 
						|
      aScene.emit('XRF',{})
 | 
						|
      
 | 
						|
      // enable gaze-click on Mobile VR
 | 
						|
      aScene.setAttribute('xrf-gaze','')
 | 
						|
 | 
						|
      // detect href click via hand-detection
 | 
						|
      aScene.setAttribute("xrf-hands", '' )  
 | 
						|
 | 
						|
      if( xrf.debug !== undefined && parseInt(xrf.debug) > 1) aScene.setAttribute('stats','')
 | 
						|
 | 
						|
    }
 | 
						|
  },
 | 
						|
 | 
						|
})
 | 
						|
/**
 | 
						|
 * Movement Controls
 | 
						|
 *
 | 
						|
 * @author Don McCurdy <dm@donmccurdy.com>
 | 
						|
 */
 | 
						|
 | 
						|
const COMPONENT_SUFFIX = '-controls';
 | 
						|
const MAX_DELTA = 0.2; // ms
 | 
						|
const EPS = 10e-6;
 | 
						|
const MOVED = 'moved';
 | 
						|
 | 
						|
if( !AFRAME.components['movement-controls'] ){
 | 
						|
 | 
						|
  AFRAME.registerComponent('movement-controls', {
 | 
						|
 | 
						|
    /*******************************************************************
 | 
						|
     * Schema
 | 
						|
     */
 | 
						|
 | 
						|
    dependencies: ['rotation'],
 | 
						|
 | 
						|
    schema: {
 | 
						|
      enabled:            { default: true },
 | 
						|
      controls:           { default: ['gamepad', 'trackpad', 'keyboard', 'touch'] },
 | 
						|
      speed:              { default: 0.3, min: 0 },
 | 
						|
      fly:                { default: false },
 | 
						|
      constrainToNavMesh: { default: false },
 | 
						|
      camera:             { default: '[movement-controls] [camera]', type: 'selector' }
 | 
						|
    },
 | 
						|
 | 
						|
    /*******************************************************************
 | 
						|
     * Lifecycle
 | 
						|
     */
 | 
						|
 | 
						|
    init: function () {
 | 
						|
      const el = this.el;
 | 
						|
      if (!this.data.camera) {
 | 
						|
        this.data.camera = el.querySelector('[camera]');
 | 
						|
      }
 | 
						|
      this.velocityCtrl = null;
 | 
						|
 | 
						|
      this.velocity = new THREE.Vector3();
 | 
						|
      this.heading = new THREE.Quaternion();
 | 
						|
      this.eventDetail = {};
 | 
						|
 | 
						|
      // Navigation
 | 
						|
      this.navGroup = null;
 | 
						|
      this.navNode = null;
 | 
						|
 | 
						|
      if (el.sceneEl.hasLoaded) {
 | 
						|
        this.injectControls();
 | 
						|
      } else {
 | 
						|
        el.sceneEl.addEventListener('loaded', this.injectControls.bind(this));
 | 
						|
      }
 | 
						|
    },
 | 
						|
 | 
						|
    update: function (prevData) {
 | 
						|
      const el = this.el;
 | 
						|
      const data = this.data;
 | 
						|
      const nav = el.sceneEl.systems.nav;
 | 
						|
      if (el.sceneEl.hasLoaded) {
 | 
						|
        this.injectControls();
 | 
						|
      }
 | 
						|
      if (nav && data.constrainToNavMesh !== prevData.constrainToNavMesh) {
 | 
						|
        data.constrainToNavMesh
 | 
						|
          ? nav.addAgent(this)
 | 
						|
          : nav.removeAgent(this);
 | 
						|
      }
 | 
						|
      if (data.enabled !== prevData.enabled) {
 | 
						|
        // Propagate the enabled change to all controls
 | 
						|
        for (let i = 0; i < data.controls.length; i++) {
 | 
						|
          const name = data.controls[i] + COMPONENT_SUFFIX;
 | 
						|
          this.el.setAttribute(name, { enabled: this.data.enabled });
 | 
						|
        }
 | 
						|
      }
 | 
						|
    },
 | 
						|
 | 
						|
    injectControls: function () {
 | 
						|
      const data = this.data;
 | 
						|
 | 
						|
      for (let i = 0; i < data.controls.length; i++) {
 | 
						|
        const name = data.controls[i] + COMPONENT_SUFFIX;
 | 
						|
        this.el.setAttribute(name, { enabled: this.data.enabled });
 | 
						|
      }
 | 
						|
    },
 | 
						|
 | 
						|
    updateNavLocation: function () {
 | 
						|
      this.navGroup = null;
 | 
						|
      this.navNode = null;
 | 
						|
    },
 | 
						|
 | 
						|
    /*******************************************************************
 | 
						|
     * Tick
 | 
						|
     */
 | 
						|
 | 
						|
    tick: (function () {
 | 
						|
      const start = new THREE.Vector3();
 | 
						|
      const end = new THREE.Vector3();
 | 
						|
      const clampedEnd = new THREE.Vector3();
 | 
						|
 | 
						|
      return function (t, dt) {
 | 
						|
        if (!dt) return;
 | 
						|
 | 
						|
        const el = this.el;
 | 
						|
        const data = this.data;
 | 
						|
 | 
						|
        if (!data.enabled) return;
 | 
						|
 | 
						|
        this.updateVelocityCtrl();
 | 
						|
        const velocityCtrl = this.velocityCtrl;
 | 
						|
        const velocity = this.velocity;
 | 
						|
 | 
						|
        if (!velocityCtrl) return;
 | 
						|
 | 
						|
        // Update velocity. If FPS is too low, reset.
 | 
						|
        if (dt / 1000 > MAX_DELTA) {
 | 
						|
          velocity.set(0, 0, 0);
 | 
						|
        } else {
 | 
						|
          this.updateVelocity(dt);
 | 
						|
        }
 | 
						|
 | 
						|
        if (data.constrainToNavMesh
 | 
						|
            && velocityCtrl.isNavMeshConstrained !== false) {
 | 
						|
 | 
						|
          if (velocity.lengthSq() < EPS) return;
 | 
						|
 | 
						|
          start.copy(el.object3D.position);
 | 
						|
          end
 | 
						|
            .copy(velocity)
 | 
						|
            .multiplyScalar(dt / 1000)
 | 
						|
            .add(start);
 | 
						|
 | 
						|
          const nav = el.sceneEl.systems.nav;
 | 
						|
          this.navGroup = this.navGroup === null ? nav.getGroup(start) : this.navGroup;
 | 
						|
          this.navNode = this.navNode || nav.getNode(start, this.navGroup);
 | 
						|
          this.navNode = nav.clampStep(start, end, this.navGroup, this.navNode, clampedEnd);
 | 
						|
          el.object3D.position.copy(clampedEnd);
 | 
						|
        } else if (el.hasAttribute('velocity')) {
 | 
						|
          el.setAttribute('velocity', velocity);
 | 
						|
        } else {
 | 
						|
          el.object3D.position.x += velocity.x * dt / 1000;
 | 
						|
          el.object3D.position.y += velocity.y * dt / 1000;
 | 
						|
          el.object3D.position.z += velocity.z * dt / 1000;
 | 
						|
        }
 | 
						|
 | 
						|
      };
 | 
						|
    }()),
 | 
						|
 | 
						|
    /*******************************************************************
 | 
						|
     * Movement
 | 
						|
     */
 | 
						|
 | 
						|
    updateVelocityCtrl: function () {
 | 
						|
      const data = this.data;
 | 
						|
      if (data.enabled) {
 | 
						|
        for (let i = 0, l = data.controls.length; i < l; i++) {
 | 
						|
          const control = this.el.components[data.controls[i] + COMPONENT_SUFFIX];
 | 
						|
          if (control && control.isVelocityActive()) {
 | 
						|
            this.velocityCtrl = control;
 | 
						|
            return;
 | 
						|
          }
 | 
						|
        }
 | 
						|
        this.velocityCtrl = null;
 | 
						|
      }
 | 
						|
    },
 | 
						|
 | 
						|
    updateVelocity: (function () {
 | 
						|
      const vector2 = new THREE.Vector2();
 | 
						|
      const quaternion = new THREE.Quaternion();
 | 
						|
 | 
						|
      return function (dt) {
 | 
						|
        let dVelocity;
 | 
						|
        const el = this.el;
 | 
						|
        const control = this.velocityCtrl;
 | 
						|
        const velocity = this.velocity;
 | 
						|
        const data = this.data;
 | 
						|
 | 
						|
        if (control) {
 | 
						|
          if (control.getVelocityDelta) {
 | 
						|
            dVelocity = control.getVelocityDelta(dt);
 | 
						|
          } else if (control.getVelocity) {
 | 
						|
            velocity.copy(control.getVelocity());
 | 
						|
            return;
 | 
						|
          } else if (control.getPositionDelta) {
 | 
						|
            velocity.copy(control.getPositionDelta(dt).multiplyScalar(1000 / dt));
 | 
						|
            return;
 | 
						|
          } else {
 | 
						|
            throw new Error('Incompatible movement controls: ', control);
 | 
						|
          }
 | 
						|
        }
 | 
						|
 | 
						|
        if (el.hasAttribute('velocity') && !data.constrainToNavMesh) {
 | 
						|
          velocity.copy(this.el.getAttribute('velocity'));
 | 
						|
        }
 | 
						|
 | 
						|
        if (dVelocity && data.enabled) {
 | 
						|
          const cameraEl = data.camera;
 | 
						|
 | 
						|
          // Rotate to heading
 | 
						|
          quaternion.copy(cameraEl.object3D.quaternion);
 | 
						|
          quaternion.premultiply(el.object3D.quaternion);
 | 
						|
          dVelocity.applyQuaternion(quaternion);
 | 
						|
 | 
						|
          const factor = dVelocity.length();
 | 
						|
          if (data.fly) {
 | 
						|
            velocity.copy(dVelocity);
 | 
						|
            velocity.multiplyScalar(this.data.speed * 16.66667);
 | 
						|
          } else {
 | 
						|
            vector2.set(dVelocity.x, dVelocity.z);
 | 
						|
            vector2.setLength(factor * this.data.speed * 16.66667);
 | 
						|
            velocity.x = vector2.x;
 | 
						|
            velocity.y = 0;
 | 
						|
            velocity.z = vector2.y;
 | 
						|
          }
 | 
						|
          if (velocity.x !== 0 || velocity.y !== 0 || velocity.z !== 0) {
 | 
						|
            this.eventDetail.velocity = velocity;
 | 
						|
            this.el.emit(MOVED, this.eventDetail);
 | 
						|
          }
 | 
						|
        }
 | 
						|
      };
 | 
						|
 | 
						|
    }())
 | 
						|
  });
 | 
						|
}
 | 
						|
AFRAME.components['hand-tracking-controls'].Component.prototype.onModelLoaded = function(onModelLoaded){
 | 
						|
  return function(e){
 | 
						|
    onModelLoaded.apply(this);
 | 
						|
    // re-attach children 
 | 
						|
    ([...this.el.children]).map( (c) => {
 | 
						|
      if( c.object3D ){
 | 
						|
        this.el.object3D.getObjectByName("wrist").add(c.object3D)
 | 
						|
      }
 | 
						|
    })
 | 
						|
  }
 | 
						|
}(AFRAME.components['hand-tracking-controls'].Component.prototype.onModelLoaded)
 | 
						|
// look-controls turns off autoUpdateMatrix (of player) which 
 | 
						|
// will break teleporting and other stuff
 | 
						|
// overriding this is easier then adding updateMatrixWorld() everywhere else
 | 
						|
 | 
						|
//AFRAME.components['look-controls'].Component.prototype.onEnterVR = function () {}
 | 
						|
//AFRAME.components['look-controls'].Component.prototype.onExitVR = function () {}
 | 
						|
AFRAME.components['look-controls'].Component.prototype.onEnterVR = function () {
 | 
						|
  var sceneEl = this.el.sceneEl;
 | 
						|
  if (!sceneEl.checkHeadsetConnected()) { return; }
 | 
						|
  this.saveCameraPose();
 | 
						|
  this.el.object3D.position.set(0, 0, 0);
 | 
						|
  this.el.object3D.rotation.set(0, 0, 0);
 | 
						|
  if (sceneEl.hasWebXR) {
 | 
						|
   // this.el.object3D.matrixAutoUpdate = false;
 | 
						|
    this.el.object3D.updateMatrix();
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * Restore the pose.
 | 
						|
 */
 | 
						|
AFRAME.components['look-controls'].Component.prototype.onExitVR = function () {
 | 
						|
  if (!this.el.sceneEl.checkHeadsetConnected()) { return; }
 | 
						|
  this.restoreCameraPose();
 | 
						|
  this.previousHMDPosition.set(0, 0, 0);
 | 
						|
  this.el.object3D.matrixAutoUpdate = true;
 | 
						|
}
 | 
						|
 | 
						|
// it also needs to apply the offset (in case the #rot was used in URLS)
 | 
						|
 | 
						|
AFRAME.components['look-controls'].Component.prototype.updateOrientation = function () {
 | 
						|
  var object3D = this.el.object3D;
 | 
						|
  var pitchObject = this.pitchObject;
 | 
						|
  var yawObject = this.yawObject;
 | 
						|
  var sceneEl = this.el.sceneEl;
 | 
						|
 | 
						|
  // In VR or AR mode, THREE is in charge of updating the camera pose.
 | 
						|
  if ((sceneEl.is('vr-mode') || sceneEl.is('ar-mode')) && sceneEl.checkHeadsetConnected()) {
 | 
						|
    // With WebXR THREE applies headset pose to the object3D internally.
 | 
						|
    return;
 | 
						|
  }
 | 
						|
 | 
						|
  this.updateMagicWindowOrientation();
 | 
						|
 | 
						|
  let offsetX = object3D.rotation.offset ? object3D.rotation.offset.x : 0
 | 
						|
  let offsetY = object3D.rotation.offset ? object3D.rotation.offset.y : 0 
 | 
						|
 | 
						|
  // On mobile, do camera rotation with touch events and sensors.
 | 
						|
  object3D.rotation.x = this.magicWindowDeltaEuler.x + offsetX + pitchObject.rotation.x;
 | 
						|
  object3D.rotation.y = this.magicWindowDeltaEuler.y + offsetY + yawObject.rotation.y;
 | 
						|
  object3D.rotation.z = this.magicWindowDeltaEuler.z;
 | 
						|
  object3D.matrixAutoUpdate = true
 | 
						|
}
 | 
						|
/**
 | 
						|
 * Touch-to-move-forward controls for mobile.
 | 
						|
 */
 | 
						|
 | 
						|
if( !AFRAME.components['touch-controls'] ){
 | 
						|
 | 
						|
  AFRAME.registerComponent('touch-controls', {
 | 
						|
    schema: {
 | 
						|
      axis: { default: "z", "type":"string" },
 | 
						|
      enabled: { default: true },
 | 
						|
      reverseEnabled: { default: true }
 | 
						|
    },
 | 
						|
 | 
						|
    init: function () {
 | 
						|
      this.dVelocity = new THREE.Vector3();
 | 
						|
      this.bindMethods();
 | 
						|
      this.direction = 0;
 | 
						|
    },
 | 
						|
 | 
						|
    play: function () {
 | 
						|
      this.addEventListeners();
 | 
						|
    },
 | 
						|
 | 
						|
    pause: function () {
 | 
						|
      this.removeEventListeners();
 | 
						|
      this.dVelocity.set(0, 0, 0);
 | 
						|
    },
 | 
						|
 | 
						|
    remove: function () {
 | 
						|
      this.pause();
 | 
						|
    },
 | 
						|
 | 
						|
    addEventListeners: function () {
 | 
						|
      const sceneEl = this.el.sceneEl;
 | 
						|
      const canvasEl = sceneEl.canvas;
 | 
						|
 | 
						|
      if (!canvasEl) {
 | 
						|
        sceneEl.addEventListener('render-target-loaded', this.addEventListeners.bind(this));
 | 
						|
        return;
 | 
						|
      }
 | 
						|
 | 
						|
      canvasEl.addEventListener('touchstart', this.onTouchStart);
 | 
						|
      canvasEl.addEventListener('touchend', this.onTouchEnd);
 | 
						|
      const vrModeUI = sceneEl.getAttribute('vr-mode-ui');
 | 
						|
      if (vrModeUI && vrModeUI.cardboardModeEnabled) {
 | 
						|
        sceneEl.addEventListener('enter-vr', this.onEnterVR);
 | 
						|
      }
 | 
						|
    },
 | 
						|
 | 
						|
    removeEventListeners: function () {
 | 
						|
      const canvasEl = this.el.sceneEl && this.el.sceneEl.canvas;
 | 
						|
      if (!canvasEl) { return; }
 | 
						|
 | 
						|
      canvasEl.removeEventListener('touchstart', this.onTouchStart);
 | 
						|
      canvasEl.removeEventListener('touchend', this.onTouchEnd);
 | 
						|
      this.el.sceneEl.removeEventListener('enter-vr', this.onEnterVR)
 | 
						|
    },
 | 
						|
 | 
						|
    isVelocityActive: function () {
 | 
						|
      return this.data.enabled && !!this.direction;
 | 
						|
    },
 | 
						|
 | 
						|
    getVelocityDelta: function () {
 | 
						|
      this.dVelocity[ this.data.axis ] = this.direction;
 | 
						|
      return this.dVelocity.clone();
 | 
						|
    },
 | 
						|
 | 
						|
    bindMethods: function () {
 | 
						|
      this.onTouchStart = this.onTouchStart.bind(this);
 | 
						|
      this.onTouchEnd = this.onTouchEnd.bind(this);
 | 
						|
      this.onEnterVR = this.onEnterVR.bind(this);
 | 
						|
    },
 | 
						|
 | 
						|
    onTouchStart: function (e) {
 | 
						|
      this.direction = 0;
 | 
						|
      if (this.data.reverseEnabled && e.touches ){
 | 
						|
        if( e.touches.length === 3) this.direction = 1;
 | 
						|
        if( e.touches.length === 2) this.direction = -1;
 | 
						|
      }
 | 
						|
      //e.preventDefault();
 | 
						|
    },
 | 
						|
 | 
						|
    onTouchEnd: function (e) {
 | 
						|
      this.direction = 0;
 | 
						|
      //e.preventDefault();
 | 
						|
    },
 | 
						|
 | 
						|
    onEnterVR: function () {
 | 
						|
      // This is to make the Cardboard button on Chrome Android working
 | 
						|
      //const xrSession = this.el.sceneEl.xrSession;
 | 
						|
      //if (!xrSession) { return; }
 | 
						|
      //xrSession.addEventListener('selectstart', this.onTouchStart);
 | 
						|
      //xrSession.addEventListener('selectend', this.onTouchEnd);
 | 
						|
    }
 | 
						|
  })
 | 
						|
}
 | 
						|
window.AFRAME.registerComponent('xrf-button', {
 | 
						|
    schema: {
 | 
						|
        label: {
 | 
						|
            default: 'label'
 | 
						|
        },
 | 
						|
        width: {
 | 
						|
            default: 0.11
 | 
						|
        },
 | 
						|
        toggable: {
 | 
						|
            default: false
 | 
						|
        }, 
 | 
						|
        textSize: {
 | 
						|
            default: 0.66
 | 
						|
        }, 
 | 
						|
        color:{
 | 
						|
            default: '#111'
 | 
						|
        }, 
 | 
						|
        textColor:{
 | 
						|
            default: '#fff'
 | 
						|
        }, 
 | 
						|
        hicolor:{
 | 
						|
            default: '#555555'
 | 
						|
        },
 | 
						|
        action:{
 | 
						|
            default: ''
 | 
						|
        }
 | 
						|
    },
 | 
						|
    init: function() {
 | 
						|
        var el = this.el;
 | 
						|
        var labelEl = this.labelEl = document.createElement('a-entity');
 | 
						|
        this.color = this.data.color 
 | 
						|
        el.setAttribute('geometry', {
 | 
						|
            primitive: 'box',
 | 
						|
            width: this.data.width,
 | 
						|
            height: 0.05,
 | 
						|
            depth: 0.005
 | 
						|
        });
 | 
						|
        el.setAttribute('material', {
 | 
						|
            color: this.color, 
 | 
						|
            transparent:true,
 | 
						|
            opacity:0.3
 | 
						|
        });
 | 
						|
        el.setAttribute('xrf-pressable', '');
 | 
						|
        labelEl.setAttribute('position', '0 0 0.01');
 | 
						|
        labelEl.setAttribute('text', {
 | 
						|
            value: this.data.label,
 | 
						|
            color: this.data.textColor, 
 | 
						|
            align: 'center'
 | 
						|
        });
 | 
						|
        labelEl.setAttribute('scale', `${this.data.textSize} ${this.data.textSize} ${this.data.textSize}`);
 | 
						|
        this.el.appendChild(labelEl);
 | 
						|
        this.bindMethods();
 | 
						|
        this.el.addEventListener('stateadded', this.stateChanged);
 | 
						|
        this.el.addEventListener('stateremoved', this.stateChanged);
 | 
						|
        this.el.addEventListener('pressedstarted', this.onPressedStarted);
 | 
						|
        this.el.addEventListener('pressedended', this.onPressedEnded);
 | 
						|
        this.el.addEventListener('mouseenter', (e) => this.onMouseEnter(e) );
 | 
						|
        this.el.addEventListener('mouseleave', (e) => this.onMouseLeave(e) );
 | 
						|
 | 
						|
        let cb = new Function(this.data.action)
 | 
						|
 | 
						|
        if( this.data.action ){ 
 | 
						|
          this.el.addEventListener('click', AFRAME.utils.throttle(cb, 500 ) )
 | 
						|
        }
 | 
						|
    },
 | 
						|
    bindMethods: function() {
 | 
						|
        this.stateChanged = this.stateChanged.bind(this);
 | 
						|
        this.onPressedStarted = this.onPressedStarted.bind(this);
 | 
						|
        this.onPressedEnded = this.onPressedEnded.bind(this);
 | 
						|
    },
 | 
						|
    update: function(oldData) {
 | 
						|
        if (oldData.label !== this.data.label) {
 | 
						|
            this.labelEl.setAttribute('text', 'value', this.data.label);
 | 
						|
        }
 | 
						|
    },
 | 
						|
    stateChanged: function() {
 | 
						|
        var color = this.el.is('pressed') ? this.data.hicolor : this.color;
 | 
						|
        this.el.setAttribute('material', {
 | 
						|
            color: color
 | 
						|
        });
 | 
						|
    },
 | 
						|
    onMouseEnter: function(){
 | 
						|
        this.el.setAttribute('material', { color: this.data.hicolor });
 | 
						|
    }, 
 | 
						|
    onMouseLeave: function(){
 | 
						|
        this.el.setAttribute('material', { color: this.color });
 | 
						|
    }, 
 | 
						|
    onPressedStarted: function() {
 | 
						|
        var el = this.el;
 | 
						|
        el.setAttribute('material', {
 | 
						|
            color: this.data.hicolor
 | 
						|
        });
 | 
						|
        el.emit('click');
 | 
						|
        if (this.data.togabble) {
 | 
						|
            if (el.is('pressed')) {
 | 
						|
                el.removeState('pressed');
 | 
						|
            } else {
 | 
						|
                el.addState('pressed');
 | 
						|
            }
 | 
						|
        }
 | 
						|
    },
 | 
						|
    onPressedEnded: function() {
 | 
						|
        if (this.el.is('pressed')) {
 | 
						|
            return;
 | 
						|
        }
 | 
						|
        this.el.setAttribute('material', {
 | 
						|
            color: this.color
 | 
						|
        });
 | 
						|
    }
 | 
						|
});
 | 
						|
AFRAME.registerComponent('vconsole', {
 | 
						|
  init: function () {  
 | 
						|
      //AFRAME.XRF.navigator.to("https://coderofsalvation.github.io/xrsh-media/assets/background.glb")
 | 
						|
    let aScene = AFRAME.scenes[0] 
 | 
						|
    return
 | 
						|
 | 
						|
 //   return
 | 
						|
    document.head.innerHTML += `
 | 
						|
      <style type="text/css">
 | 
						|
        .vc-panel  {
 | 
						|
          right:unset !important;
 | 
						|
          width:100%;
 | 
						|
          max-width:900px;
 | 
						|
          z-index:100 !important;
 | 
						|
        }
 | 
						|
        .vc-mask{ display:none !important; }
 | 
						|
      </style>
 | 
						|
    `
 | 
						|
    let script = document.createElement("script")
 | 
						|
    script.src = "https://unpkg.com/vconsole@latest/dist/vconsole.min.js"
 | 
						|
    script.setAttribute('async','true')
 | 
						|
    script.onload = function(){
 | 
						|
      this.vConsole = new window.VConsole() 
 | 
						|
      document.querySelector('.vc-switch').style.right = 'unset'
 | 
						|
      document.querySelector('.vc-switch').style.left  = '20px'
 | 
						|
    }
 | 
						|
    document.body.appendChild(script)
 | 
						|
  }
 | 
						|
 | 
						|
});
 | 
						|
 | 
						|
AFRAME.registerComponent('xrf-fade', {
 | 
						|
  schema:{
 | 
						|
    fadetime:{type:"number", default: 1000}, 
 | 
						|
    color:{type:"color", default:"black"}, 
 | 
						|
    opacity:{type:"float",default:1.0}
 | 
						|
  },
 | 
						|
  init: function(){
 | 
						|
    let fb = this.fb = document.createElement("a-box")
 | 
						|
    fb.setAttribute("scale", "1 1 1")
 | 
						|
    fb.setAttribute("material", `color: ${this.data.color}; transparent: true; side: back; shader: flat; opacity:1`)
 | 
						|
    this.el.appendChild(fb)
 | 
						|
  }, 
 | 
						|
  out: function(fadetime){
 | 
						|
    if( fadetime != undefined ) this.data.fadetime = fadetime 
 | 
						|
    if( this.data.opacity == 0 ) return 
 | 
						|
    this.data.opacity = 0.0
 | 
						|
    this.fb.setAttribute("animation", `property: components.material.material.opacity; dur: ${this.data.fadetime}; from: 1; to: ${this.data.opacity}`)
 | 
						|
    setTimeout( () => this.fb.object3D.visible = false, this.data.fadetime )
 | 
						|
  }, 
 | 
						|
  "in": function(fadetime){
 | 
						|
    if( fadetime != undefined ) this.data.fadetime = fadetime 
 | 
						|
    if( this.data.opacity == 1 ) return 
 | 
						|
    this.data.opacity = 1.0
 | 
						|
    this.fb.object3D.visible = true 
 | 
						|
    this.fb.setAttribute("animation", `property: components.material.material.opacity; dur: ${this.data.fadetime}; from: 0; to: ${this.data.opacity}`)
 | 
						|
  }
 | 
						|
});
 | 
						|
// gaze click on mobile VR
 | 
						|
 | 
						|
AFRAME.registerComponent('xrf-gaze',{
 | 
						|
  schema:{
 | 
						|
    spawn:{type:'boolean',default:false}, 
 | 
						|
  },
 | 
						|
  events:{
 | 
						|
    "fusing": function(e){
 | 
						|
      if( e.detail.mouseEvent ) return // ignore click event
 | 
						|
      console.dir(e)
 | 
						|
 | 
						|
    }
 | 
						|
  },
 | 
						|
  setGazer: function(state, fuse){
 | 
						|
    if( this.el.sceneEl.getAttribute("xrf-gaze-always") == undefined && !AFRAME.utils.device.isMobile() ) return
 | 
						|
    let cam = document.querySelector("[camera]") 
 | 
						|
    if( state ){
 | 
						|
      if( cam.innerHTML.match(/cursor/) ) return; // avoid duplicate calls
 | 
						|
      cam.innerHTML = `<a-entity id="cursor" cursor="fuse: ${fuse ? 'true': 'false'}; fuseTimeout: 1500"
 | 
						|
        animation__click="property: scale; startEvents: click; easing: easeInCubic; dur: 150; from: 0.1 0.1 0.1; to: 1 1 1"
 | 
						|
        animation__fusing="property: scale; startEvents: fusing; easing: easeInCubic; dur: 1500; from: 1 1 1; to: 0.1 0.1 0.1"
 | 
						|
        animation__mouseleave="property: scale; startEvents: mouseleave; easing: easeInCubic; dur: 500; to: 1 1 1"
 | 
						|
        raycaster="objects: .ray"
 | 
						|
        visible="true"
 | 
						|
        position="0 0 -1"
 | 
						|
        material="color: #BBBBBB; shader: flat">
 | 
						|
      </a-entity>`
 | 
						|
      cam.querySelector('#cursor').setAttribute("geometry","primitive: ring; radiusInner: 0.02; radiusOuter: 0.03")
 | 
						|
    }else{
 | 
						|
      cam.querySelector('#cursor').removeAttribute("geometry")
 | 
						|
      if( document.querySelector('[cursor]') ) {
 | 
						|
        document.querySelector('[cursor]').setAttribute("visible",false)
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }, 
 | 
						|
  init:function(data){
 | 
						|
 | 
						|
    this.setGazer(true);
 | 
						|
 | 
						|
    document.querySelector("a-scene").addEventListener('exit-vr',  () => this.setGazer(false,false) )
 | 
						|
    document.querySelector("a-scene").addEventListener('enter-vr', () => this.setGazer(true,true) )
 | 
						|
    document.querySelector("a-scene").addEventListener('enter-ar', () => this.setGazer(true,false) )
 | 
						|
    document.querySelector("a-scene").addEventListener('exit-ar',  () => this.setGazer(false,false) )
 | 
						|
 | 
						|
    let highlightMesh = (state) => (e) => {
 | 
						|
      if( !e.target.object3D ) return 
 | 
						|
      let obj = e.target.object3D.children[0]
 | 
						|
      if( obj && obj.userData && obj.userData.XRF && obj.userData.XRF.href )
 | 
						|
        obj.userData.XRF.href.selected( state )()
 | 
						|
    }
 | 
						|
    this.el.addEventListener("mouseenter", highlightMesh(true) )
 | 
						|
    this.el.addEventListener("mouseleave", highlightMesh(false ) )
 | 
						|
  }
 | 
						|
});
 | 
						|
window.AFRAME.registerComponent('xrf-get', {
 | 
						|
  schema: {
 | 
						|
    name: {type: 'string'},
 | 
						|
    clone: {type: 'boolean', default:false},
 | 
						|
    reparent: {type: 'boolean', default:false}
 | 
						|
  },
 | 
						|
 | 
						|
  init: function () {
 | 
						|
 | 
						|
    var el = this.el;
 | 
						|
    var meshname = this.data.name || this.data;
 | 
						|
 | 
						|
    if( !meshname || typeof meshname != 'string' ) return
 | 
						|
 | 
						|
    this.el.addEventListener('update', (evt) => {
 | 
						|
 | 
						|
      setTimeout( () => {
 | 
						|
 | 
						|
        if( !this.mesh ){
 | 
						|
          let scene = xrf.scene 
 | 
						|
          let mesh = this.mesh = scene.getObjectByName(meshname);
 | 
						|
          if( !this.el.className.match(/ray/) ) this.el.className += " ray"
 | 
						|
          if (!mesh){
 | 
						|
            console.error("mesh with name '"+meshname+"' not found in model")
 | 
						|
            return;
 | 
						|
          }
 | 
						|
          // we don't want to re-parent gltf-meshes
 | 
						|
          mesh.isXRF = true    // mark for deletion by xrf
 | 
						|
          if( this.data.reparent ){ 
 | 
						|
            const world = { 
 | 
						|
              pos: new THREE.Vector3(), 
 | 
						|
              scale: new THREE.Vector3(),
 | 
						|
              quat: new THREE.Quaternion()
 | 
						|
            }
 | 
						|
            mesh.getWorldPosition(world.pos)
 | 
						|
            mesh.getWorldScale(world.scale)
 | 
						|
            mesh.getWorldQuaternion(world.quat);
 | 
						|
            mesh.position.copy(world.pos)
 | 
						|
            mesh.scale.copy(world.scale)
 | 
						|
            mesh.setRotationFromQuaternion(world.quat);
 | 
						|
          }else{
 | 
						|
            // lets create a dummy add function so that the mesh won't get reparented during setObject3D
 | 
						|
            // as this would break animations
 | 
						|
            // maybe we need THREE.js attach() for this?
 | 
						|
            this.el.object3D.add = (a) => a 
 | 
						|
          }
 | 
						|
          this.el.object3D.parent = mesh.parent
 | 
						|
 | 
						|
          this.el.setObject3D('mesh',mesh) // (doing this.el.object3D = mesh causes AFRAME to crash when resetting scene)
 | 
						|
          this.el.object3D.child = mesh    // keep reference (because .children will be empty)
 | 
						|
 | 
						|
          if( !this.el.id ) this.el.setAttribute("id",`xrf-${mesh.name}`)
 | 
						|
          this.el.emit('model-loaded',{})
 | 
						|
        }
 | 
						|
 | 
						|
      }, evt && evt.timeout ? evt.timeout: 500)
 | 
						|
 | 
						|
    })
 | 
						|
 | 
						|
    this.el.emit("update",{timeout:0})
 | 
						|
 | 
						|
  }
 | 
						|
 | 
						|
});
 | 
						|
 | 
						|
//// this makes WebXR hand controls able to click things (by touching it)
 | 
						|
 | 
						|
AFRAME.registerSystem('xrf-hands',{
 | 
						|
 | 
						|
  init: function(){
 | 
						|
    this.sceneEl.addEventListener('loaded', () => this.getFingers() )
 | 
						|
  },
 | 
						|
 | 
						|
  tick: function(){
 | 
						|
    if( !this.indexFinger || !xrf.interactive ) return 
 | 
						|
    if( !this.el.sceneEl.renderer.xr.isPresenting || !this.indexFinger.length ) return 
 | 
						|
    for( let i = 0; i < this.indexFinger.length; i++ ){
 | 
						|
      let indexFinger = this.indexFinger[i]
 | 
						|
      let intersects = xrf.interactive.intersect( indexFinger, 0.01 )
 | 
						|
      if( intersects.length ){
 | 
						|
        let obj = intersects[0].object
 | 
						|
        if( obj.clicked ) return
 | 
						|
        obj.clicked = true
 | 
						|
        obj.dispatchEvent({type:"click", message: indexFinger })
 | 
						|
        setTimeout( () => obj.clicked = false, 250 ) // prevent double clicks
 | 
						|
      } 
 | 
						|
    }
 | 
						|
  },
 | 
						|
 | 
						|
 | 
						|
  getFingers: function(){
 | 
						|
    let handEls      = [...document.querySelectorAll('[hand-tracking-controls]')]
 | 
						|
    if( !handEls.length ) return
 | 
						|
    this.indexFinger = []
 | 
						|
 | 
						|
    const me = this
 | 
						|
 | 
						|
    for( let i in handEls ){
 | 
						|
      let handEl = handEls[i]
 | 
						|
      handEl.addEventListener('model-loaded', function(e){
 | 
						|
        const handEl = this
 | 
						|
        // wait for bones get initialized
 | 
						|
        setTimeout( () => {
 | 
						|
          let bones = handEl.components['hand-tracking-controls'].bones
 | 
						|
          if( !bones ) return // dont bother
 | 
						|
          let indexFinger
 | 
						|
          for( let j = 0; j < bones.length; j++){
 | 
						|
            if( bones[j].name == "index-finger-tip" ){
 | 
						|
              indexFinger = j
 | 
						|
              me.indexFinger.push(bones[j])
 | 
						|
              const els = [...document.querySelectorAll('[xrf-pressable]')]
 | 
						|
              els.map( (el) => el.emit('indexFingerReady', {index: j} ) )
 | 
						|
              break
 | 
						|
            }
 | 
						|
          }
 | 
						|
        },500)
 | 
						|
      })
 | 
						|
    }
 | 
						|
 | 
						|
  }
 | 
						|
 | 
						|
 | 
						|
})
 | 
						|
 | 
						|
// poor man's way to move forward using hand gesture pinch
 | 
						|
 | 
						|
window.AFRAME.registerComponent('xrf-pinchmove', {
 | 
						|
  schema:{
 | 
						|
    rig: {type: "selector"}
 | 
						|
  }, 
 | 
						|
  init: function(){
 | 
						|
 | 
						|
    this.el.addEventListener("pinchended", () => {
 | 
						|
      // get the cameras world direction
 | 
						|
      let direction = new THREE.Vector3()
 | 
						|
      this.el.sceneEl.camera.getWorldDirection(direction);
 | 
						|
      // multiply the direction by a "speed" factor
 | 
						|
      direction.multiplyScalar(0.4)
 | 
						|
      // get the current position
 | 
						|
      var pos = xrf.camera.position  
 | 
						|
      //player.getAttribute("position")
 | 
						|
      // add the direction vector
 | 
						|
      pos.x += direction.x 
 | 
						|
      pos.z += direction.z
 | 
						|
      // set the new position
 | 
						|
      //this.data.rig.setAttribute("position", pos);
 | 
						|
      // !!! NOTE - it would be more efficient to do the
 | 
						|
      // position change on the players THREE.Object:
 | 
						|
      // `player.object3D.position.add(direction)`
 | 
						|
      // but it would break "getAttribute("position")
 | 
						|
    })
 | 
						|
  }, 
 | 
						|
})
 | 
						|
window.AFRAME.registerComponent('xrf-wear', {
 | 
						|
  schema:{
 | 
						|
    el: {type:"selector"}, 
 | 
						|
    position: {type:"vec3"}, 
 | 
						|
    rotation: {type:"vec3"} 
 | 
						|
  }, 
 | 
						|
  init: function(){
 | 
						|
    $('a-scene').addEventListener('enter-vr', (e) => this.wear(e) )
 | 
						|
    $('a-scene').addEventListener('exit-vr',  (e) => this.unwear(e) )
 | 
						|
  }, 
 | 
						|
  wear: function(){
 | 
						|
    if( !this.wearable ){
 | 
						|
      let d = this.data
 | 
						|
      this.wearable = new THREE.Group()
 | 
						|
      this.el.object3D.children.map( (c) => this.wearable.add(c) )
 | 
						|
      this.wearable.position.set( d.position.x,  d.position.y,  d.position.z)
 | 
						|
      this.wearable.rotation.set( d.rotation.x,  d.rotation.y,  d.rotation.z)
 | 
						|
    }
 | 
						|
    this.data.el.object3D.add(this.wearable)
 | 
						|
  }, 
 | 
						|
  unwear: function(){
 | 
						|
    this.data.el.remove(this.wearable)
 | 
						|
    this.wearable.children.map( (c) => this.el.object3D.add(c) )
 | 
						|
    delete this.wearable
 | 
						|
  }
 | 
						|
})
 | 
						|
// https://github.com/yyx990803/QR.js
 | 
						|
//
 | 
						|
window.QR = (function () {
 | 
						|
 | 
						|
    // alignment pattern
 | 
						|
    adelta = [
 | 
						|
      0, 11, 15, 19, 23, 27, 31, // force 1 pat
 | 
						|
      16, 18, 20, 22, 24, 26, 28, 20, 22, 24, 24, 26, 28, 28, 22, 24, 24,
 | 
						|
      26, 26, 28, 28, 24, 24, 26, 26, 26, 28, 28, 24, 26, 26, 26, 28, 28
 | 
						|
      ];
 | 
						|
 | 
						|
    // version block
 | 
						|
    vpat = [
 | 
						|
        0xc94, 0x5bc, 0xa99, 0x4d3, 0xbf6, 0x762, 0x847, 0x60d,
 | 
						|
        0x928, 0xb78, 0x45d, 0xa17, 0x532, 0x9a6, 0x683, 0x8c9,
 | 
						|
        0x7ec, 0xec4, 0x1e1, 0xfab, 0x08e, 0xc1a, 0x33f, 0xd75,
 | 
						|
        0x250, 0x9d5, 0x6f0, 0x8ba, 0x79f, 0xb0b, 0x42e, 0xa64,
 | 
						|
        0x541, 0xc69
 | 
						|
    ];
 | 
						|
 | 
						|
    // final format bits with mask: level << 3 | mask
 | 
						|
    fmtword = [
 | 
						|
        0x77c4, 0x72f3, 0x7daa, 0x789d, 0x662f, 0x6318, 0x6c41, 0x6976,    //L
 | 
						|
        0x5412, 0x5125, 0x5e7c, 0x5b4b, 0x45f9, 0x40ce, 0x4f97, 0x4aa0,    //M
 | 
						|
        0x355f, 0x3068, 0x3f31, 0x3a06, 0x24b4, 0x2183, 0x2eda, 0x2bed,    //Q
 | 
						|
        0x1689, 0x13be, 0x1ce7, 0x19d0, 0x0762, 0x0255, 0x0d0c, 0x083b    //H
 | 
						|
    ];
 | 
						|
 | 
						|
    // 4 per version: number of blocks 1,2; data width; ecc width
 | 
						|
    eccblocks = [
 | 
						|
        1, 0, 19, 7, 1, 0, 16, 10, 1, 0, 13, 13, 1, 0, 9, 17,
 | 
						|
        1, 0, 34, 10, 1, 0, 28, 16, 1, 0, 22, 22, 1, 0, 16, 28,
 | 
						|
        1, 0, 55, 15, 1, 0, 44, 26, 2, 0, 17, 18, 2, 0, 13, 22,
 | 
						|
        1, 0, 80, 20, 2, 0, 32, 18, 2, 0, 24, 26, 4, 0, 9, 16,
 | 
						|
        1, 0, 108, 26, 2, 0, 43, 24, 2, 2, 15, 18, 2, 2, 11, 22,
 | 
						|
        2, 0, 68, 18, 4, 0, 27, 16, 4, 0, 19, 24, 4, 0, 15, 28,
 | 
						|
        2, 0, 78, 20, 4, 0, 31, 18, 2, 4, 14, 18, 4, 1, 13, 26,
 | 
						|
        2, 0, 97, 24, 2, 2, 38, 22, 4, 2, 18, 22, 4, 2, 14, 26,
 | 
						|
        2, 0, 116, 30, 3, 2, 36, 22, 4, 4, 16, 20, 4, 4, 12, 24,
 | 
						|
        2, 2, 68, 18, 4, 1, 43, 26, 6, 2, 19, 24, 6, 2, 15, 28,
 | 
						|
        4, 0, 81, 20, 1, 4, 50, 30, 4, 4, 22, 28, 3, 8, 12, 24,
 | 
						|
        2, 2, 92, 24, 6, 2, 36, 22, 4, 6, 20, 26, 7, 4, 14, 28,
 | 
						|
        4, 0, 107, 26, 8, 1, 37, 22, 8, 4, 20, 24, 12, 4, 11, 22,
 | 
						|
        3, 1, 115, 30, 4, 5, 40, 24, 11, 5, 16, 20, 11, 5, 12, 24,
 | 
						|
        5, 1, 87, 22, 5, 5, 41, 24, 5, 7, 24, 30, 11, 7, 12, 24,
 | 
						|
        5, 1, 98, 24, 7, 3, 45, 28, 15, 2, 19, 24, 3, 13, 15, 30,
 | 
						|
        1, 5, 107, 28, 10, 1, 46, 28, 1, 15, 22, 28, 2, 17, 14, 28,
 | 
						|
        5, 1, 120, 30, 9, 4, 43, 26, 17, 1, 22, 28, 2, 19, 14, 28,
 | 
						|
        3, 4, 113, 28, 3, 11, 44, 26, 17, 4, 21, 26, 9, 16, 13, 26,
 | 
						|
        3, 5, 107, 28, 3, 13, 41, 26, 15, 5, 24, 30, 15, 10, 15, 28,
 | 
						|
        4, 4, 116, 28, 17, 0, 42, 26, 17, 6, 22, 28, 19, 6, 16, 30,
 | 
						|
        2, 7, 111, 28, 17, 0, 46, 28, 7, 16, 24, 30, 34, 0, 13, 24,
 | 
						|
        4, 5, 121, 30, 4, 14, 47, 28, 11, 14, 24, 30, 16, 14, 15, 30,
 | 
						|
        6, 4, 117, 30, 6, 14, 45, 28, 11, 16, 24, 30, 30, 2, 16, 30,
 | 
						|
        8, 4, 106, 26, 8, 13, 47, 28, 7, 22, 24, 30, 22, 13, 15, 30,
 | 
						|
        10, 2, 114, 28, 19, 4, 46, 28, 28, 6, 22, 28, 33, 4, 16, 30,
 | 
						|
        8, 4, 122, 30, 22, 3, 45, 28, 8, 26, 23, 30, 12, 28, 15, 30,
 | 
						|
        3, 10, 117, 30, 3, 23, 45, 28, 4, 31, 24, 30, 11, 31, 15, 30,
 | 
						|
        7, 7, 116, 30, 21, 7, 45, 28, 1, 37, 23, 30, 19, 26, 15, 30,
 | 
						|
        5, 10, 115, 30, 19, 10, 47, 28, 15, 25, 24, 30, 23, 25, 15, 30,
 | 
						|
        13, 3, 115, 30, 2, 29, 46, 28, 42, 1, 24, 30, 23, 28, 15, 30,
 | 
						|
        17, 0, 115, 30, 10, 23, 46, 28, 10, 35, 24, 30, 19, 35, 15, 30,
 | 
						|
        17, 1, 115, 30, 14, 21, 46, 28, 29, 19, 24, 30, 11, 46, 15, 30,
 | 
						|
        13, 6, 115, 30, 14, 23, 46, 28, 44, 7, 24, 30, 59, 1, 16, 30,
 | 
						|
        12, 7, 121, 30, 12, 26, 47, 28, 39, 14, 24, 30, 22, 41, 15, 30,
 | 
						|
        6, 14, 121, 30, 6, 34, 47, 28, 46, 10, 24, 30, 2, 64, 15, 30,
 | 
						|
        17, 4, 122, 30, 29, 14, 46, 28, 49, 10, 24, 30, 24, 46, 15, 30,
 | 
						|
        4, 18, 122, 30, 13, 32, 46, 28, 48, 14, 24, 30, 42, 32, 15, 30,
 | 
						|
        20, 4, 117, 30, 40, 7, 47, 28, 43, 22, 24, 30, 10, 67, 15, 30,
 | 
						|
        19, 6, 118, 30, 18, 31, 47, 28, 34, 34, 24, 30, 20, 61, 15, 30
 | 
						|
    ];
 | 
						|
 | 
						|
    // Galois field log table
 | 
						|
    glog = [
 | 
						|
        0xff, 0x00, 0x01, 0x19, 0x02, 0x32, 0x1a, 0xc6, 0x03, 0xdf, 0x33, 0xee, 0x1b, 0x68, 0xc7, 0x4b,
 | 
						|
        0x04, 0x64, 0xe0, 0x0e, 0x34, 0x8d, 0xef, 0x81, 0x1c, 0xc1, 0x69, 0xf8, 0xc8, 0x08, 0x4c, 0x71,
 | 
						|
        0x05, 0x8a, 0x65, 0x2f, 0xe1, 0x24, 0x0f, 0x21, 0x35, 0x93, 0x8e, 0xda, 0xf0, 0x12, 0x82, 0x45,
 | 
						|
        0x1d, 0xb5, 0xc2, 0x7d, 0x6a, 0x27, 0xf9, 0xb9, 0xc9, 0x9a, 0x09, 0x78, 0x4d, 0xe4, 0x72, 0xa6,
 | 
						|
        0x06, 0xbf, 0x8b, 0x62, 0x66, 0xdd, 0x30, 0xfd, 0xe2, 0x98, 0x25, 0xb3, 0x10, 0x91, 0x22, 0x88,
 | 
						|
        0x36, 0xd0, 0x94, 0xce, 0x8f, 0x96, 0xdb, 0xbd, 0xf1, 0xd2, 0x13, 0x5c, 0x83, 0x38, 0x46, 0x40,
 | 
						|
        0x1e, 0x42, 0xb6, 0xa3, 0xc3, 0x48, 0x7e, 0x6e, 0x6b, 0x3a, 0x28, 0x54, 0xfa, 0x85, 0xba, 0x3d,
 | 
						|
        0xca, 0x5e, 0x9b, 0x9f, 0x0a, 0x15, 0x79, 0x2b, 0x4e, 0xd4, 0xe5, 0xac, 0x73, 0xf3, 0xa7, 0x57,
 | 
						|
        0x07, 0x70, 0xc0, 0xf7, 0x8c, 0x80, 0x63, 0x0d, 0x67, 0x4a, 0xde, 0xed, 0x31, 0xc5, 0xfe, 0x18,
 | 
						|
        0xe3, 0xa5, 0x99, 0x77, 0x26, 0xb8, 0xb4, 0x7c, 0x11, 0x44, 0x92, 0xd9, 0x23, 0x20, 0x89, 0x2e,
 | 
						|
        0x37, 0x3f, 0xd1, 0x5b, 0x95, 0xbc, 0xcf, 0xcd, 0x90, 0x87, 0x97, 0xb2, 0xdc, 0xfc, 0xbe, 0x61,
 | 
						|
        0xf2, 0x56, 0xd3, 0xab, 0x14, 0x2a, 0x5d, 0x9e, 0x84, 0x3c, 0x39, 0x53, 0x47, 0x6d, 0x41, 0xa2,
 | 
						|
        0x1f, 0x2d, 0x43, 0xd8, 0xb7, 0x7b, 0xa4, 0x76, 0xc4, 0x17, 0x49, 0xec, 0x7f, 0x0c, 0x6f, 0xf6,
 | 
						|
        0x6c, 0xa1, 0x3b, 0x52, 0x29, 0x9d, 0x55, 0xaa, 0xfb, 0x60, 0x86, 0xb1, 0xbb, 0xcc, 0x3e, 0x5a,
 | 
						|
        0xcb, 0x59, 0x5f, 0xb0, 0x9c, 0xa9, 0xa0, 0x51, 0x0b, 0xf5, 0x16, 0xeb, 0x7a, 0x75, 0x2c, 0xd7,
 | 
						|
        0x4f, 0xae, 0xd5, 0xe9, 0xe6, 0xe7, 0xad, 0xe8, 0x74, 0xd6, 0xf4, 0xea, 0xa8, 0x50, 0x58, 0xaf
 | 
						|
    ];
 | 
						|
 | 
						|
    // Galios field exponent table
 | 
						|
    gexp = [
 | 
						|
        0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1d, 0x3a, 0x74, 0xe8, 0xcd, 0x87, 0x13, 0x26,
 | 
						|
        0x4c, 0x98, 0x2d, 0x5a, 0xb4, 0x75, 0xea, 0xc9, 0x8f, 0x03, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0,
 | 
						|
        0x9d, 0x27, 0x4e, 0x9c, 0x25, 0x4a, 0x94, 0x35, 0x6a, 0xd4, 0xb5, 0x77, 0xee, 0xc1, 0x9f, 0x23,
 | 
						|
        0x46, 0x8c, 0x05, 0x0a, 0x14, 0x28, 0x50, 0xa0, 0x5d, 0xba, 0x69, 0xd2, 0xb9, 0x6f, 0xde, 0xa1,
 | 
						|
        0x5f, 0xbe, 0x61, 0xc2, 0x99, 0x2f, 0x5e, 0xbc, 0x65, 0xca, 0x89, 0x0f, 0x1e, 0x3c, 0x78, 0xf0,
 | 
						|
        0xfd, 0xe7, 0xd3, 0xbb, 0x6b, 0xd6, 0xb1, 0x7f, 0xfe, 0xe1, 0xdf, 0xa3, 0x5b, 0xb6, 0x71, 0xe2,
 | 
						|
        0xd9, 0xaf, 0x43, 0x86, 0x11, 0x22, 0x44, 0x88, 0x0d, 0x1a, 0x34, 0x68, 0xd0, 0xbd, 0x67, 0xce,
 | 
						|
        0x81, 0x1f, 0x3e, 0x7c, 0xf8, 0xed, 0xc7, 0x93, 0x3b, 0x76, 0xec, 0xc5, 0x97, 0x33, 0x66, 0xcc,
 | 
						|
        0x85, 0x17, 0x2e, 0x5c, 0xb8, 0x6d, 0xda, 0xa9, 0x4f, 0x9e, 0x21, 0x42, 0x84, 0x15, 0x2a, 0x54,
 | 
						|
        0xa8, 0x4d, 0x9a, 0x29, 0x52, 0xa4, 0x55, 0xaa, 0x49, 0x92, 0x39, 0x72, 0xe4, 0xd5, 0xb7, 0x73,
 | 
						|
        0xe6, 0xd1, 0xbf, 0x63, 0xc6, 0x91, 0x3f, 0x7e, 0xfc, 0xe5, 0xd7, 0xb3, 0x7b, 0xf6, 0xf1, 0xff,
 | 
						|
        0xe3, 0xdb, 0xab, 0x4b, 0x96, 0x31, 0x62, 0xc4, 0x95, 0x37, 0x6e, 0xdc, 0xa5, 0x57, 0xae, 0x41,
 | 
						|
        0x82, 0x19, 0x32, 0x64, 0xc8, 0x8d, 0x07, 0x0e, 0x1c, 0x38, 0x70, 0xe0, 0xdd, 0xa7, 0x53, 0xa6,
 | 
						|
        0x51, 0xa2, 0x59, 0xb2, 0x79, 0xf2, 0xf9, 0xef, 0xc3, 0x9b, 0x2b, 0x56, 0xac, 0x45, 0x8a, 0x09,
 | 
						|
        0x12, 0x24, 0x48, 0x90, 0x3d, 0x7a, 0xf4, 0xf5, 0xf7, 0xf3, 0xfb, 0xeb, 0xcb, 0x8b, 0x0b, 0x16,
 | 
						|
        0x2c, 0x58, 0xb0, 0x7d, 0xfa, 0xe9, 0xcf, 0x83, 0x1b, 0x36, 0x6c, 0xd8, 0xad, 0x47, 0x8e, 0x00
 | 
						|
    ];
 | 
						|
 | 
						|
    // Working buffers:
 | 
						|
    // data input and ecc append, image working buffer, fixed part of image, run lengths for badness
 | 
						|
    var strinbuf=[], eccbuf=[], qrframe=[], framask=[], rlens=[]; 
 | 
						|
    // Control values - width is based on version, last 4 are from table.
 | 
						|
    var version, width, neccblk1, neccblk2, datablkw, eccblkwid;
 | 
						|
    var ecclevel = 2;
 | 
						|
    // set bit to indicate cell in qrframe is immutable.  symmetric around diagonal
 | 
						|
    function setmask(x, y)
 | 
						|
    {
 | 
						|
        var bt;
 | 
						|
        if (x > y) {
 | 
						|
            bt = x;
 | 
						|
            x = y;
 | 
						|
            y = bt;
 | 
						|
        }
 | 
						|
        // y*y = 1+3+5...
 | 
						|
        bt = y;
 | 
						|
        bt *= y;
 | 
						|
        bt += y;
 | 
						|
        bt >>= 1;
 | 
						|
        bt += x;
 | 
						|
        framask[bt] = 1;
 | 
						|
    }
 | 
						|
 | 
						|
    // enter alignment pattern - black to qrframe, white to mask (later black frame merged to mask)
 | 
						|
    function putalign(x, y)
 | 
						|
    {
 | 
						|
        var j;
 | 
						|
 | 
						|
        qrframe[x + width * y] = 1;
 | 
						|
        for (j = -2; j < 2; j++) {
 | 
						|
            qrframe[(x + j) + width * (y - 2)] = 1;
 | 
						|
            qrframe[(x - 2) + width * (y + j + 1)] = 1;
 | 
						|
            qrframe[(x + 2) + width * (y + j)] = 1;
 | 
						|
            qrframe[(x + j + 1) + width * (y + 2)] = 1;
 | 
						|
        }
 | 
						|
        for (j = 0; j < 2; j++) {
 | 
						|
            setmask(x - 1, y + j);
 | 
						|
            setmask(x + 1, y - j);
 | 
						|
            setmask(x - j, y - 1);
 | 
						|
            setmask(x + j, y + 1);
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    //========================================================================
 | 
						|
    // Reed Solomon error correction
 | 
						|
    // exponentiation mod N
 | 
						|
    function modnn(x)
 | 
						|
    {
 | 
						|
        while (x >= 255) {
 | 
						|
            x -= 255;
 | 
						|
            x = (x >> 8) + (x & 255);
 | 
						|
        }
 | 
						|
        return x;
 | 
						|
    }
 | 
						|
 | 
						|
    var genpoly = [];
 | 
						|
 | 
						|
    // Calculate and append ECC data to data block.  Block is in strinbuf, indexes to buffers given.
 | 
						|
    function appendrs(data, dlen, ecbuf, eclen)
 | 
						|
    {
 | 
						|
        var i, j, fb;
 | 
						|
 | 
						|
        for (i = 0; i < eclen; i++)
 | 
						|
            strinbuf[ecbuf + i] = 0;
 | 
						|
        for (i = 0; i < dlen; i++) {
 | 
						|
            fb = glog[strinbuf[data + i] ^ strinbuf[ecbuf]];
 | 
						|
            if (fb != 255)     /* fb term is non-zero */
 | 
						|
                for (j = 1; j < eclen; j++)
 | 
						|
                    strinbuf[ecbuf + j - 1] = strinbuf[ecbuf + j] ^ gexp[modnn(fb + genpoly[eclen - j])];
 | 
						|
            else
 | 
						|
                for( j = ecbuf ; j < ecbuf + eclen; j++ )
 | 
						|
                    strinbuf[j] = strinbuf[j + 1];
 | 
						|
            strinbuf[ ecbuf + eclen - 1] = fb == 255 ? 0 : gexp[modnn(fb + genpoly[0])];
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    //========================================================================
 | 
						|
    // Frame data insert following the path rules
 | 
						|
 | 
						|
    // check mask - since symmetrical use half.
 | 
						|
    function ismasked(x, y)
 | 
						|
    {
 | 
						|
        var bt;
 | 
						|
        if (x > y) {
 | 
						|
            bt = x;
 | 
						|
            x = y;
 | 
						|
            y = bt;
 | 
						|
        }
 | 
						|
        bt = y;
 | 
						|
        bt += y * y;
 | 
						|
        bt >>= 1;
 | 
						|
        bt += x;
 | 
						|
        return framask[bt];
 | 
						|
    }
 | 
						|
 | 
						|
    //========================================================================
 | 
						|
    //  Apply the selected mask out of the 8.
 | 
						|
    function  applymask(m)
 | 
						|
    {
 | 
						|
        var x, y, r3x, r3y;
 | 
						|
 | 
						|
        switch (m) {
 | 
						|
        case 0:
 | 
						|
            for (y = 0; y < width; y++)
 | 
						|
                for (x = 0; x < width; x++)
 | 
						|
                    if (!((x + y) & 1) && !ismasked(x, y))
 | 
						|
                        qrframe[x + y * width] ^= 1;
 | 
						|
            break;
 | 
						|
        case 1:
 | 
						|
            for (y = 0; y < width; y++)
 | 
						|
                for (x = 0; x < width; x++)
 | 
						|
                    if (!(y & 1) && !ismasked(x, y))
 | 
						|
                        qrframe[x + y * width] ^= 1;
 | 
						|
            break;
 | 
						|
        case 2:
 | 
						|
            for (y = 0; y < width; y++)
 | 
						|
                for (r3x = 0, x = 0; x < width; x++, r3x++) {
 | 
						|
                    if (r3x == 3)
 | 
						|
                        r3x = 0;
 | 
						|
                    if (!r3x && !ismasked(x, y))
 | 
						|
                        qrframe[x + y * width] ^= 1;
 | 
						|
                }
 | 
						|
            break;
 | 
						|
        case 3:
 | 
						|
            for (r3y = 0, y = 0; y < width; y++, r3y++) {
 | 
						|
                if (r3y == 3)
 | 
						|
                    r3y = 0;
 | 
						|
                for (r3x = r3y, x = 0; x < width; x++, r3x++) {
 | 
						|
                    if (r3x == 3)
 | 
						|
                        r3x = 0;
 | 
						|
                    if (!r3x && !ismasked(x, y))
 | 
						|
                        qrframe[x + y * width] ^= 1;
 | 
						|
                }
 | 
						|
            }
 | 
						|
            break;
 | 
						|
        case 4:
 | 
						|
            for (y = 0; y < width; y++)
 | 
						|
                for (r3x = 0, r3y = ((y >> 1) & 1), x = 0; x < width; x++, r3x++) {
 | 
						|
                    if (r3x == 3) {
 | 
						|
                        r3x = 0;
 | 
						|
                        r3y = !r3y;
 | 
						|
                    }
 | 
						|
                    if (!r3y && !ismasked(x, y))
 | 
						|
                        qrframe[x + y * width] ^= 1;
 | 
						|
                }
 | 
						|
            break;
 | 
						|
        case 5:
 | 
						|
            for (r3y = 0, y = 0; y < width; y++, r3y++) {
 | 
						|
                if (r3y == 3)
 | 
						|
                    r3y = 0;
 | 
						|
                for (r3x = 0, x = 0; x < width; x++, r3x++) {
 | 
						|
                    if (r3x == 3)
 | 
						|
                        r3x = 0;
 | 
						|
                    if (!((x & y & 1) + !(!r3x | !r3y)) && !ismasked(x, y))
 | 
						|
                        qrframe[x + y * width] ^= 1;
 | 
						|
                }
 | 
						|
            }
 | 
						|
            break;
 | 
						|
        case 6:
 | 
						|
            for (r3y = 0, y = 0; y < width; y++, r3y++) {
 | 
						|
                if (r3y == 3)
 | 
						|
                    r3y = 0;
 | 
						|
                for (r3x = 0, x = 0; x < width; x++, r3x++) {
 | 
						|
                    if (r3x == 3)
 | 
						|
                        r3x = 0;
 | 
						|
                    if (!(((x & y & 1) + (r3x && (r3x == r3y))) & 1) && !ismasked(x, y))
 | 
						|
                        qrframe[x + y * width] ^= 1;
 | 
						|
                }
 | 
						|
            }
 | 
						|
            break;
 | 
						|
        case 7:
 | 
						|
            for (r3y = 0, y = 0; y < width; y++, r3y++) {
 | 
						|
                if (r3y == 3)
 | 
						|
                    r3y = 0;
 | 
						|
                for (r3x = 0, x = 0; x < width; x++, r3x++) {
 | 
						|
                    if (r3x == 3)
 | 
						|
                        r3x = 0;
 | 
						|
                    if (!(((r3x && (r3x == r3y)) + ((x + y) & 1)) & 1) && !ismasked(x, y))
 | 
						|
                        qrframe[x + y * width] ^= 1;
 | 
						|
                }
 | 
						|
            }
 | 
						|
            break;
 | 
						|
        }
 | 
						|
        return;
 | 
						|
    }
 | 
						|
 | 
						|
    // Badness coefficients.
 | 
						|
    var N1 = 3, N2 = 3, N3 = 40, N4 = 10;
 | 
						|
 | 
						|
    // Using the table of the length of each run, calculate the amount of bad image 
 | 
						|
    // - long runs or those that look like finders; called twice, once each for X and Y
 | 
						|
    function badruns(length)
 | 
						|
    {
 | 
						|
        var i;
 | 
						|
        var runsbad = 0;
 | 
						|
        for (i = 0; i <= length; i++)
 | 
						|
            if (rlens[i] >= 5)
 | 
						|
                runsbad += N1 + rlens[i] - 5;
 | 
						|
        // BwBBBwB as in finder
 | 
						|
        for (i = 3; i < length - 1; i += 2)
 | 
						|
            if (rlens[i - 2] == rlens[i + 2]
 | 
						|
                && rlens[i + 2] == rlens[i - 1]
 | 
						|
                && rlens[i - 1] == rlens[i + 1]
 | 
						|
                && rlens[i - 1] * 3 == rlens[i]
 | 
						|
                // white around the black pattern? Not part of spec
 | 
						|
                && (rlens[i - 3] == 0 // beginning
 | 
						|
                    || i + 3 > length  // end
 | 
						|
                    || rlens[i - 3] * 3 >= rlens[i] * 4 || rlens[i + 3] * 3 >= rlens[i] * 4)
 | 
						|
               )
 | 
						|
                runsbad += N3;
 | 
						|
        return runsbad;
 | 
						|
    }
 | 
						|
 | 
						|
    // Calculate how bad the masked image is - blocks, imbalance, runs, or finders.
 | 
						|
    function badcheck()
 | 
						|
    {
 | 
						|
        var x, y, h, b, b1;
 | 
						|
        var thisbad = 0;
 | 
						|
        var bw = 0;
 | 
						|
 | 
						|
        // blocks of same color.
 | 
						|
        for (y = 0; y < width - 1; y++)
 | 
						|
            for (x = 0; x < width - 1; x++)
 | 
						|
                if ((qrframe[x + width * y] && qrframe[(x + 1) + width * y]
 | 
						|
                     && qrframe[x + width * (y + 1)] && qrframe[(x + 1) + width * (y + 1)]) // all black
 | 
						|
                    || !(qrframe[x + width * y] || qrframe[(x + 1) + width * y]
 | 
						|
                         || qrframe[x + width * (y + 1)] || qrframe[(x + 1) + width * (y + 1)])) // all white
 | 
						|
                    thisbad += N2;
 | 
						|
 | 
						|
        // X runs
 | 
						|
        for (y = 0; y < width; y++) {
 | 
						|
            rlens[0] = 0;
 | 
						|
            for (h = b = x = 0; x < width; x++) {
 | 
						|
                if ((b1 = qrframe[x + width * y]) == b)
 | 
						|
                    rlens[h]++;
 | 
						|
                else
 | 
						|
                    rlens[++h] = 1;
 | 
						|
                b = b1;
 | 
						|
                bw += b ? 1 : -1;
 | 
						|
            }
 | 
						|
            thisbad += badruns(h);
 | 
						|
        }
 | 
						|
 | 
						|
        // black/white imbalance
 | 
						|
        if (bw < 0)
 | 
						|
            bw = -bw;
 | 
						|
 | 
						|
        var big = bw;
 | 
						|
        count = 0;
 | 
						|
        big += big << 2;
 | 
						|
        big <<= 1;
 | 
						|
        while (big > width * width)
 | 
						|
            big -= width * width, count++;
 | 
						|
        thisbad += count * N4;
 | 
						|
 | 
						|
        // Y runs
 | 
						|
        for (x = 0; x < width; x++) {
 | 
						|
            rlens[0] = 0;
 | 
						|
            for (h = b = y = 0; y < width; y++) {
 | 
						|
                if ((b1 = qrframe[x + width * y]) == b)
 | 
						|
                    rlens[h]++;
 | 
						|
                else
 | 
						|
                    rlens[++h] = 1;
 | 
						|
                b = b1;
 | 
						|
            }
 | 
						|
            thisbad += badruns(h);
 | 
						|
        }
 | 
						|
        return thisbad;
 | 
						|
    }
 | 
						|
 | 
						|
    function genframe(instring)
 | 
						|
    {
 | 
						|
        var x, y, k, t, v, i, j, m;
 | 
						|
 | 
						|
        instring = instring || ''
 | 
						|
 | 
						|
    // find the smallest version that fits the string
 | 
						|
        t = instring.length;
 | 
						|
        version = 0;
 | 
						|
        do {
 | 
						|
            version++;
 | 
						|
            k = (ecclevel - 1) * 4 + (version - 1) * 16;
 | 
						|
            neccblk1 = eccblocks[k++];
 | 
						|
            neccblk2 = eccblocks[k++];
 | 
						|
            datablkw = eccblocks[k++];
 | 
						|
            eccblkwid = eccblocks[k];
 | 
						|
            k = datablkw * (neccblk1 + neccblk2) + neccblk2 - 3 + (version <= 9);
 | 
						|
            if (t <= k)
 | 
						|
                break;
 | 
						|
        } while (version < 40);
 | 
						|
 | 
						|
    // FIXME - insure that it fits insted of being truncated
 | 
						|
        width = 17 + 4 * version;
 | 
						|
 | 
						|
    // allocate, clear and setup data structures
 | 
						|
        v = datablkw + (datablkw + eccblkwid) * (neccblk1 + neccblk2) + neccblk2;
 | 
						|
        for( t = 0; t < v; t++ )
 | 
						|
            eccbuf[t] = 0;
 | 
						|
        strinbuf = instring.slice(0);
 | 
						|
 | 
						|
        for( t = 0; t < width * width; t++ )
 | 
						|
            qrframe[t] = 0;
 | 
						|
 | 
						|
        for( t = 0 ; t < (width * (width + 1) + 1) / 2; t++)
 | 
						|
            framask[t] = 0;
 | 
						|
 | 
						|
    // insert finders - black to frame, white to mask
 | 
						|
        for (t = 0; t < 3; t++) {
 | 
						|
            k = 0;
 | 
						|
            y = 0;
 | 
						|
            if (t == 1)
 | 
						|
                k = (width - 7);
 | 
						|
            if (t == 2)
 | 
						|
                y = (width - 7);
 | 
						|
            qrframe[(y + 3) + width * (k + 3)] = 1;
 | 
						|
            for (x = 0; x < 6; x++) {
 | 
						|
                qrframe[(y + x) + width * k] = 1;
 | 
						|
                qrframe[y + width * (k + x + 1)] = 1;
 | 
						|
                qrframe[(y + 6) + width * (k + x)] = 1;
 | 
						|
                qrframe[(y + x + 1) + width * (k + 6)] = 1;
 | 
						|
            }
 | 
						|
            for (x = 1; x < 5; x++) {
 | 
						|
                setmask(y + x, k + 1);
 | 
						|
                setmask(y + 1, k + x + 1);
 | 
						|
                setmask(y + 5, k + x);
 | 
						|
                setmask(y + x + 1, k + 5);
 | 
						|
            }
 | 
						|
            for (x = 2; x < 4; x++) {
 | 
						|
                qrframe[(y + x) + width * (k + 2)] = 1;
 | 
						|
                qrframe[(y + 2) + width * (k + x + 1)] = 1;
 | 
						|
                qrframe[(y + 4) + width * (k + x)] = 1;
 | 
						|
                qrframe[(y + x + 1) + width * (k + 4)] = 1;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
    // alignment blocks
 | 
						|
        if (version > 1) {
 | 
						|
            t = adelta[version];
 | 
						|
            y = width - 7;
 | 
						|
            for (;;) {
 | 
						|
                x = width - 7;
 | 
						|
                while (x > t - 3) {
 | 
						|
                    putalign(x, y);
 | 
						|
                    if (x < t)
 | 
						|
                        break;
 | 
						|
                    x -= t;
 | 
						|
                }
 | 
						|
                if (y <= t + 9)
 | 
						|
                    break;
 | 
						|
                y -= t;
 | 
						|
                putalign(6, y);
 | 
						|
                putalign(y, 6);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
    // single black
 | 
						|
        qrframe[8 + width * (width - 8)] = 1;
 | 
						|
 | 
						|
    // timing gap - mask only
 | 
						|
        for (y = 0; y < 7; y++) {
 | 
						|
            setmask(7, y);
 | 
						|
            setmask(width - 8, y);
 | 
						|
            setmask(7, y + width - 7);
 | 
						|
        }
 | 
						|
        for (x = 0; x < 8; x++) {
 | 
						|
            setmask(x, 7);
 | 
						|
            setmask(x + width - 8, 7);
 | 
						|
            setmask(x, width - 8);
 | 
						|
        }
 | 
						|
 | 
						|
    // reserve mask-format area
 | 
						|
        for (x = 0; x < 9; x++)
 | 
						|
            setmask(x, 8);
 | 
						|
        for (x = 0; x < 8; x++) {
 | 
						|
            setmask(x + width - 8, 8);
 | 
						|
            setmask(8, x);
 | 
						|
        }
 | 
						|
        for (y = 0; y < 7; y++)
 | 
						|
            setmask(8, y + width - 7);
 | 
						|
 | 
						|
    // timing row/col
 | 
						|
        for (x = 0; x < width - 14; x++)
 | 
						|
            if (x & 1) {
 | 
						|
                setmask(8 + x, 6);
 | 
						|
                setmask(6, 8 + x);
 | 
						|
            }
 | 
						|
            else {
 | 
						|
                qrframe[(8 + x) + width * 6] = 1;
 | 
						|
                qrframe[6 + width * (8 + x)] = 1;
 | 
						|
            }
 | 
						|
 | 
						|
    // version block
 | 
						|
        if (version > 6) {
 | 
						|
            t = vpat[version - 7];
 | 
						|
            k = 17;
 | 
						|
            for (x = 0; x < 6; x++)
 | 
						|
                for (y = 0; y < 3; y++, k--)
 | 
						|
                    if (1 & (k > 11 ? version >> (k - 12) : t >> k)) {
 | 
						|
                        qrframe[(5 - x) + width * (2 - y + width - 11)] = 1;
 | 
						|
                        qrframe[(2 - y + width - 11) + width * (5 - x)] = 1;
 | 
						|
                    }
 | 
						|
            else {
 | 
						|
                setmask(5 - x, 2 - y + width - 11);
 | 
						|
                setmask(2 - y + width - 11, 5 - x);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
    // sync mask bits - only set above for white spaces, so add in black bits
 | 
						|
        for (y = 0; y < width; y++)
 | 
						|
            for (x = 0; x <= y; x++)
 | 
						|
                if (qrframe[x + width * y])
 | 
						|
                    setmask(x, y);
 | 
						|
 | 
						|
    // convert string to bitstream
 | 
						|
    // 8 bit data to QR-coded 8 bit data (numeric or alphanum, or kanji not supported)
 | 
						|
        v = strinbuf.length;
 | 
						|
 | 
						|
    // string to array
 | 
						|
        for( i = 0 ; i < v; i++ )
 | 
						|
            eccbuf[i] = strinbuf.charCodeAt(i);
 | 
						|
        strinbuf = eccbuf.slice(0);
 | 
						|
 | 
						|
    // calculate max string length
 | 
						|
        x = datablkw * (neccblk1 + neccblk2) + neccblk2;
 | 
						|
        if (v >= x - 2) {
 | 
						|
            v = x - 2;
 | 
						|
            if (version > 9)
 | 
						|
                v--;
 | 
						|
        }
 | 
						|
 | 
						|
    // shift and repack to insert length prefix
 | 
						|
        i = v;
 | 
						|
        if (version > 9) {
 | 
						|
            strinbuf[i + 2] = 0;
 | 
						|
            strinbuf[i + 3] = 0;
 | 
						|
            while (i--) {
 | 
						|
                t = strinbuf[i];
 | 
						|
                strinbuf[i + 3] |= 255 & (t << 4);
 | 
						|
                strinbuf[i + 2] = t >> 4;
 | 
						|
            }
 | 
						|
            strinbuf[2] |= 255 & (v << 4);
 | 
						|
            strinbuf[1] = v >> 4;
 | 
						|
            strinbuf[0] = 0x40 | (v >> 12);
 | 
						|
        }
 | 
						|
        else {
 | 
						|
            strinbuf[i + 1] = 0;
 | 
						|
            strinbuf[i + 2] = 0;
 | 
						|
            while (i--) {
 | 
						|
                t = strinbuf[i];
 | 
						|
                strinbuf[i + 2] |= 255 & (t << 4);
 | 
						|
                strinbuf[i + 1] = t >> 4;
 | 
						|
            }
 | 
						|
            strinbuf[1] |= 255 & (v << 4);
 | 
						|
            strinbuf[0] = 0x40 | (v >> 4);
 | 
						|
        }
 | 
						|
    // fill to end with pad pattern
 | 
						|
        i = v + 3 - (version < 10);
 | 
						|
        while (i < x) {
 | 
						|
            strinbuf[i++] = 0xec;
 | 
						|
            // buffer has room    if (i == x)      break;
 | 
						|
            strinbuf[i++] = 0x11;
 | 
						|
        }
 | 
						|
 | 
						|
    // calculate and append ECC
 | 
						|
 | 
						|
    // calculate generator polynomial
 | 
						|
        genpoly[0] = 1;
 | 
						|
        for (i = 0; i < eccblkwid; i++) {
 | 
						|
            genpoly[i + 1] = 1;
 | 
						|
            for (j = i; j > 0; j--)
 | 
						|
                genpoly[j] = genpoly[j]
 | 
						|
                ? genpoly[j - 1] ^ gexp[modnn(glog[genpoly[j]] + i)] : genpoly[j - 1];
 | 
						|
            genpoly[0] = gexp[modnn(glog[genpoly[0]] + i)];
 | 
						|
        }
 | 
						|
        for (i = 0; i <= eccblkwid; i++)
 | 
						|
            genpoly[i] = glog[genpoly[i]]; // use logs for genpoly[] to save calc step
 | 
						|
 | 
						|
    // append ecc to data buffer
 | 
						|
        k = x;
 | 
						|
        y = 0;
 | 
						|
        for (i = 0; i < neccblk1; i++) {
 | 
						|
            appendrs(y, datablkw, k, eccblkwid);
 | 
						|
            y += datablkw;
 | 
						|
            k += eccblkwid;
 | 
						|
        }
 | 
						|
        for (i = 0; i < neccblk2; i++) {
 | 
						|
            appendrs(y, datablkw + 1, k, eccblkwid);
 | 
						|
            y += datablkw + 1;
 | 
						|
            k += eccblkwid;
 | 
						|
        }
 | 
						|
    // interleave blocks
 | 
						|
        y = 0;
 | 
						|
        for (i = 0; i < datablkw; i++) {
 | 
						|
            for (j = 0; j < neccblk1; j++)
 | 
						|
                eccbuf[y++] = strinbuf[i + j * datablkw];
 | 
						|
            for (j = 0; j < neccblk2; j++)
 | 
						|
                eccbuf[y++] = strinbuf[(neccblk1 * datablkw) + i + (j * (datablkw + 1))];
 | 
						|
        }
 | 
						|
        for (j = 0; j < neccblk2; j++)
 | 
						|
            eccbuf[y++] = strinbuf[(neccblk1 * datablkw) + i + (j * (datablkw + 1))];
 | 
						|
        for (i = 0; i < eccblkwid; i++)
 | 
						|
            for (j = 0; j < neccblk1 + neccblk2; j++)
 | 
						|
                eccbuf[y++] = strinbuf[x + i + j * eccblkwid];
 | 
						|
        strinbuf = eccbuf;
 | 
						|
 | 
						|
    // pack bits into frame avoiding masked area.
 | 
						|
        x = y = width - 1;
 | 
						|
        k = v = 1;         // up, minus
 | 
						|
        /* inteleaved data and ecc codes */
 | 
						|
        m = (datablkw + eccblkwid) * (neccblk1 + neccblk2) + neccblk2;
 | 
						|
        for (i = 0; i < m; i++) {
 | 
						|
            t = strinbuf[i];
 | 
						|
            for (j = 0; j < 8; j++, t <<= 1) {
 | 
						|
                if (0x80 & t)
 | 
						|
                    qrframe[x + width * y] = 1;
 | 
						|
                do {        // find next fill position
 | 
						|
                    if (v)
 | 
						|
                        x--;
 | 
						|
                    else {
 | 
						|
                        x++;
 | 
						|
                        if (k) {
 | 
						|
                            if (y != 0)
 | 
						|
                                y--;
 | 
						|
                            else {
 | 
						|
                                x -= 2;
 | 
						|
                                k = !k;
 | 
						|
                                if (x == 6) {
 | 
						|
                                    x--;
 | 
						|
                                    y = 9;
 | 
						|
                                }
 | 
						|
                            }
 | 
						|
                        }
 | 
						|
                        else {
 | 
						|
                            if (y != width - 1)
 | 
						|
                                y++;
 | 
						|
                            else {
 | 
						|
                                x -= 2;
 | 
						|
                                k = !k;
 | 
						|
                                if (x == 6) {
 | 
						|
                                    x--;
 | 
						|
                                    y -= 8;
 | 
						|
                                }
 | 
						|
                            }
 | 
						|
                        }
 | 
						|
                    }
 | 
						|
                    v = !v;
 | 
						|
                } while (ismasked(x, y));
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
    // save pre-mask copy of frame
 | 
						|
        strinbuf = qrframe.slice(0);
 | 
						|
        t = 0;           // best
 | 
						|
        y = 30000;         // demerit
 | 
						|
    // for instead of while since in original arduino code
 | 
						|
    // if an early mask was "good enough" it wouldn't try for a better one
 | 
						|
    // since they get more complex and take longer.
 | 
						|
        for (k = 0; k < 8; k++) {
 | 
						|
            applymask(k);      // returns black-white imbalance
 | 
						|
            x = badcheck();
 | 
						|
            if (x < y) { // current mask better than previous best?
 | 
						|
                y = x;
 | 
						|
                t = k;
 | 
						|
            }
 | 
						|
            if (t == 7)
 | 
						|
                break;       // don't increment i to a void redoing mask
 | 
						|
            qrframe = strinbuf.slice(0); // reset for next pass
 | 
						|
        }
 | 
						|
        if (t != k)         // redo best mask - none good enough, last wasn't t
 | 
						|
            applymask(t);
 | 
						|
 | 
						|
    // add in final mask/ecclevel bytes
 | 
						|
        y = fmtword[t + ((ecclevel - 1) << 3)];
 | 
						|
        // low byte
 | 
						|
        for (k = 0; k < 8; k++, y >>= 1)
 | 
						|
            if (y & 1) {
 | 
						|
                qrframe[(width - 1 - k) + width * 8] = 1;
 | 
						|
                if (k < 6)
 | 
						|
                    qrframe[8 + width * k] = 1;
 | 
						|
                else
 | 
						|
                    qrframe[8 + width * (k + 1)] = 1;
 | 
						|
            }
 | 
						|
        // high byte
 | 
						|
        for (k = 0; k < 7; k++, y >>= 1)
 | 
						|
            if (y & 1) {
 | 
						|
                qrframe[8 + width * (width - 7 + k)] = 1;
 | 
						|
                if (k)
 | 
						|
                    qrframe[(6 - k) + width * 8] = 1;
 | 
						|
                else
 | 
						|
                    qrframe[7 + width * 8] = 1;
 | 
						|
            }
 | 
						|
 | 
						|
    // return image
 | 
						|
        return qrframe;
 | 
						|
    }
 | 
						|
 | 
						|
    var _canvas = null,
 | 
						|
        _size = null;
 | 
						|
 | 
						|
    var api = {
 | 
						|
 | 
						|
        get ecclevel () {
 | 
						|
            return ecclevel;
 | 
						|
        },
 | 
						|
 | 
						|
        set ecclevel (val) {
 | 
						|
            ecclevel = val;
 | 
						|
        },
 | 
						|
 | 
						|
        get size () {
 | 
						|
            return _size;
 | 
						|
        },
 | 
						|
 | 
						|
        set size (val) {
 | 
						|
            _size = val
 | 
						|
        },
 | 
						|
 | 
						|
        get canvas () {
 | 
						|
            return _canvas;
 | 
						|
        },
 | 
						|
 | 
						|
        set canvas (el) {
 | 
						|
            _canvas = el;
 | 
						|
        },
 | 
						|
 | 
						|
        getFrame: function (string) {
 | 
						|
            return genframe(string);
 | 
						|
        },
 | 
						|
 | 
						|
        draw: function (string, canvas, size, ecc) {
 | 
						|
            
 | 
						|
            ecclevel = ecc || ecclevel;
 | 
						|
            canvas = canvas || _canvas;
 | 
						|
 | 
						|
            if (!canvas) {
 | 
						|
                console.warn('No canvas provided to draw QR code in!')
 | 
						|
                return;
 | 
						|
            }
 | 
						|
 | 
						|
            size = size || _size || Math.min(canvas.width, canvas.height);
 | 
						|
 | 
						|
            var frame = genframe(string),
 | 
						|
                ctx = canvas.getContext('2d'),
 | 
						|
                px = Math.round(size / (width + 8));
 | 
						|
 | 
						|
            var roundedSize = px * (width + 8),
 | 
						|
                offset = Math.floor((size - roundedSize) / 2);
 | 
						|
 | 
						|
            size = roundedSize;
 | 
						|
 | 
						|
            ctx.clearRect(0, 0, canvas.width, canvas.height);
 | 
						|
            ctx.fillStyle = '#fff';
 | 
						|
            ctx.fillRect(0, 0, size, size);
 | 
						|
            ctx.fillStyle = '#000';
 | 
						|
            for (var i = 0; i < width; i++) {
 | 
						|
                for (var j = 0; j < width; j++) {
 | 
						|
                    if (frame[j * width + i]) {
 | 
						|
                        ctx.fillRect(px * (4 + i) + offset, px * (4 + j) + offset, px, px);
 | 
						|
                    }
 | 
						|
                }
 | 
						|
            }
 | 
						|
 | 
						|
        },
 | 
						|
 | 
						|
        toDataURL: function (string, size, ecc) {
 | 
						|
            var canvas = document.createElement('canvas');
 | 
						|
            canvas.width = size || _size || 300;
 | 
						|
            canvas.height = canvas.width;
 | 
						|
            api.draw(string, canvas, canvas.width, ecc);
 | 
						|
            return canvas.toDataURL();
 | 
						|
        },
 | 
						|
 | 
						|
        makeImage: function (string, size, ecc) {
 | 
						|
            var img = new Image();
 | 
						|
            img.src = api.toDataURL(string, size, ecc);
 | 
						|
 | 
						|
            return img;
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    return api;
 | 
						|
 | 
						|
})()
 |