@thatopen/components 2.0.0-alpha.7 → 2.0.0-alpha.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/dist/core/Clipper/index.d.ts +3 -3
  2. package/dist/core/Materials/index.d.ts +3 -15
  3. package/dist/core/Worlds/src/simple-renderer.d.ts +3 -4
  4. package/dist/core/index.d.ts +2 -0
  5. package/dist/fragments/{FragmentBoundingBox → BoundingBoxes}/index.d.ts +2 -2
  6. package/dist/fragments/FragmentClassifier/index.d.ts +4 -3
  7. package/dist/fragments/FragmentIfcLoader/src/index.d.ts +1 -0
  8. package/dist/fragments/{FragmentIfcStreamer/src/fragment-ifc-stream-converter.d.ts → IfcGeometryTiler/index.d.ts} +4 -4
  9. package/dist/fragments/{FragmentIfcStreamer → IfcGeometryTiler}/src/fragment-props-stream-converter.d.ts +4 -4
  10. package/dist/fragments/{FragmentIfcStreamer → IfcGeometryTiler}/src/index.d.ts +0 -1
  11. package/dist/fragments/IfcPropertiesTiler/index.d.ts +26 -0
  12. package/dist/fragments/index.d.ts +3 -2
  13. package/dist/ifc/IfcRelationsIndexer/index.d.ts +43 -14
  14. package/dist/ifc/IfcRelationsIndexer/src/getRelationMap.d.ts +3 -0
  15. package/dist/ifc/IfcRelationsIndexer/src/relToAttributesMap.d.ts +4 -0
  16. package/dist/ifc/IfcRelationsIndexer/src/types.d.ts +24 -0
  17. package/dist/index.cjs +5 -5
  18. package/dist/index.d.ts +0 -1
  19. package/dist/index.mjs +2169 -1856
  20. package/dist/namespace.d.ts +1277 -1204
  21. package/package.json +6 -5
  22. package/dist/fragments/FragmentIfcStreamer/index.d.ts +0 -1
  23. package/dist/navigation/index.d.ts +0 -1
  24. /package/dist/{navigation → core}/MiniMap/index.d.ts +0 -0
  25. /package/dist/{navigation → core}/MiniMap/src/index.d.ts +0 -0
  26. /package/dist/{navigation → core}/OrthoPerspectiveCamera/index.d.ts +0 -0
  27. /package/dist/{navigation → core}/OrthoPerspectiveCamera/src/first-person-mode.d.ts +0 -0
  28. /package/dist/{navigation → core}/OrthoPerspectiveCamera/src/index.d.ts +0 -0
  29. /package/dist/{navigation → core}/OrthoPerspectiveCamera/src/orbit-mode.d.ts +0 -0
  30. /package/dist/{navigation → core}/OrthoPerspectiveCamera/src/plan-mode.d.ts +0 -0
  31. /package/dist/{navigation → core}/OrthoPerspectiveCamera/src/projections.d.ts +0 -0
  32. /package/dist/{navigation → core}/OrthoPerspectiveCamera/src/types.d.ts +0 -0
  33. /package/dist/fragments/{FragmentIfcStreamer → IfcGeometryTiler}/src/base-types.d.ts +0 -0
  34. /package/dist/fragments/{FragmentIfcStreamer → IfcGeometryTiler}/src/streaming-settings.d.ts +0 -0
package/dist/index.cjs CHANGED
@@ -1,13 +1,13 @@
1
- "use strict";var Vn=Object.defineProperty;var Yn=(c,s,t)=>s in c?Vn(c,s,{enumerable:!0,configurable:!0,writable:!0,value:t}):c[s]=t;var I=(c,s,t)=>(Yn(c,typeof s!="symbol"?s+"":s,t),t);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const C=require("three"),Gn=require("web-ifc"),rn=require("@thatopen/fragments");function fi(c){const s=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(c){for(const t in c)if(t!=="default"){const e=Object.getOwnPropertyDescriptor(c,t);Object.defineProperty(s,t,e.get?e:{enumerable:!0,get:()=>c[t]})}}return s.default=c,Object.freeze(s)}const S=fi(C),b=fi(Gn),Ht=fi(rn),an=0,zn=1,Hn=2,gi=2,Ps=1.25,Oi=1,rs=6*4+4+4,Fs=65535,kn=Math.pow(2,-24),Ms=Symbol("SKIP_GENERATION");function Wn(c){return c.index?c.index.count:c.attributes.position.count}function le(c){return Wn(c)/3}function Xn(c,s=ArrayBuffer){return c>65535?new Uint32Array(new s(4*c)):new Uint16Array(new s(2*c))}function Zn(c,s){if(!c.index){const t=c.attributes.position.count,e=s.useSharedArrayBuffer?SharedArrayBuffer:ArrayBuffer,i=Xn(t,e);c.setIndex(new C.BufferAttribute(i,1));for(let o=0;o<t;o++)i[o]=o}}function cn(c){const s=le(c),t=c.drawRange,e=t.start/3,i=(t.start+t.count)/3,o=Math.max(0,e),n=Math.min(s,i)-o;return[{offset:Math.floor(o),count:Math.floor(n)}]}function ln(c){if(!c.groups||!c.groups.length)return cn(c);const s=[],t=new Set,e=c.drawRange,i=e.start/3,o=(e.start+e.count)/3;for(const r of c.groups){const a=r.start/3,l=(r.start+r.count)/3;t.add(Math.max(i,a)),t.add(Math.min(o,l))}const n=Array.from(t.values()).sort((r,a)=>r-a);for(let r=0;r<n.length-1;r++){const a=n[r],l=n[r+1];s.push({offset:Math.floor(a),count:Math.floor(l-a)})}return s}function Qn(c){if(c.groups.length===0)return!1;const s=le(c),t=ln(c).sort((o,n)=>o.offset-n.offset),e=t[t.length-1];e.count=Math.min(s-e.offset,e.count);let i=0;return t.forEach(({count:o})=>i+=o),s!==i}function q(c,s,t){return t.min.x=s[c],t.min.y=s[c+1],t.min.z=s[c+2],t.max.x=s[c+3],t.max.y=s[c+4],t.max.z=s[c+5],t}function jn(c){c[0]=c[1]=c[2]=1/0,c[3]=c[4]=c[5]=-1/0}function Si(c){let s=-1,t=-1/0;for(let e=0;e<3;e++){const i=c[e+3]-c[e];i>t&&(t=i,s=e)}return s}function _i(c,s){s.set(c)}function yi(c,s,t){let e,i;for(let o=0;o<3;o++){const n=o+3;e=c[o],i=s[o],t[o]=e<i?e:i,e=c[n],i=s[n],t[n]=e>i?e:i}}function ve(c,s,t){for(let e=0;e<3;e++){const i=s[c+2*e],o=s[c+2*e+1],n=i-o,r=i+o;n<t[e]&&(t[e]=n),r>t[e+3]&&(t[e+3]=r)}}function de(c){const s=c[3]-c[0],t=c[4]-c[1],e=c[5]-c[2];return 2*(s*t+t*e+e*s)}function ws(c,s,t,e,i=null){let o=1/0,n=1/0,r=1/0,a=-1/0,l=-1/0,E=-1/0,d=1/0,h=1/0,u=1/0,p=-1/0,A=-1/0,F=-1/0;const T=i!==null;for(let m=s*6,g=(s+t)*6;m<g;m+=6){const f=c[m+0],R=c[m+1],O=f-R,_=f+R;O<o&&(o=O),_>a&&(a=_),T&&f<d&&(d=f),T&&f>p&&(p=f);const y=c[m+2],N=c[m+3],P=y-N,w=y+N;P<n&&(n=P),w>l&&(l=w),T&&y<h&&(h=y),T&&y>A&&(A=y);const M=c[m+4],U=c[m+5],x=M-U,v=M+U;x<r&&(r=x),v>E&&(E=v),T&&M<u&&(u=M),T&&M>F&&(F=M)}e[0]=o,e[1]=n,e[2]=r,e[3]=a,e[4]=l,e[5]=E,T&&(i[0]=d,i[1]=h,i[2]=u,i[3]=p,i[4]=A,i[5]=F)}function qn(c,s,t,e){let i=1/0,o=1/0,n=1/0,r=-1/0,a=-1/0,l=-1/0;for(let E=s*6,d=(s+t)*6;E<d;E+=6){const h=c[E+0];h<i&&(i=h),h>r&&(r=h);const u=c[E+2];u<o&&(o=u),u>a&&(a=u);const p=c[E+4];p<n&&(n=p),p>l&&(l=p)}e[0]=i,e[1]=o,e[2]=n,e[3]=r,e[4]=a,e[5]=l}function $n(c,s){jn(s);const t=c.attributes.position,e=c.index?c.index.array:null,i=le(c),o=new Float32Array(i*6),n=t.normalized,r=t.array,a=t.offset||0;let l=3;t.isInterleavedBufferAttribute&&(l=t.data.stride);const E=["getX","getY","getZ"];for(let d=0;d<i;d++){const h=d*3,u=d*6;let p=h+0,A=h+1,F=h+2;e&&(p=e[p],A=e[A],F=e[F]),n||(p=p*l+a,A=A*l+a,F=F*l+a);for(let T=0;T<3;T++){let m,g,f;n?(m=t[E[T]](p),g=t[E[T]](A),f=t[E[T]](F)):(m=r[p+T],g=r[A+T],f=r[F+T]);let R=m;g<R&&(R=g),f<R&&(R=f);let O=m;g>O&&(O=g),f>O&&(O=f);const _=(O-R)/2,y=T*2;o[u+y+0]=R+_,o[u+y+1]=_+(Math.abs(R)+_)*kn,R<s[T]&&(s[T]=R),O>s[T+3]&&(s[T+3]=O)}}return o}const St=32,Kn=(c,s)=>c.candidate-s.candidate,Nt=new Array(St).fill().map(()=>({count:0,bounds:new Float32Array(6),rightCacheBounds:new Float32Array(6),leftCacheBounds:new Float32Array(6),candidate:0})),Be=new Float32Array(6);function Jn(c,s,t,e,i,o){let n=-1,r=0;if(o===an)n=Si(s),n!==-1&&(r=(s[n]+s[n+3])/2);else if(o===zn)n=Si(c),n!==-1&&(r=to(t,e,i,n));else if(o===Hn){const a=de(c);let l=Ps*i;const E=e*6,d=(e+i)*6;for(let h=0;h<3;h++){const u=s[h],F=(s[h+3]-u)/St;if(i<St/4){const T=[...Nt];T.length=i;let m=0;for(let f=E;f<d;f+=6,m++){const R=T[m];R.candidate=t[f+2*h],R.count=0;const{bounds:O,leftCacheBounds:_,rightCacheBounds:y}=R;for(let N=0;N<3;N++)y[N]=1/0,y[N+3]=-1/0,_[N]=1/0,_[N+3]=-1/0,O[N]=1/0,O[N+3]=-1/0;ve(f,t,O)}T.sort(Kn);let g=i;for(let f=0;f<g;f++){const R=T[f];for(;f+1<g&&T[f+1].candidate===R.candidate;)T.splice(f+1,1),g--}for(let f=E;f<d;f+=6){const R=t[f+2*h];for(let O=0;O<g;O++){const _=T[O];R>=_.candidate?ve(f,t,_.rightCacheBounds):(ve(f,t,_.leftCacheBounds),_.count++)}}for(let f=0;f<g;f++){const R=T[f],O=R.count,_=i-R.count,y=R.leftCacheBounds,N=R.rightCacheBounds;let P=0;O!==0&&(P=de(y)/a);let w=0;_!==0&&(w=de(N)/a);const M=Oi+Ps*(P*O+w*_);M<l&&(n=h,l=M,r=R.candidate)}}else{for(let g=0;g<St;g++){const f=Nt[g];f.count=0,f.candidate=u+F+g*F;const R=f.bounds;for(let O=0;O<3;O++)R[O]=1/0,R[O+3]=-1/0}for(let g=E;g<d;g+=6){let O=~~((t[g+2*h]-u)/F);O>=St&&(O=St-1);const _=Nt[O];_.count++,ve(g,t,_.bounds)}const T=Nt[St-1];_i(T.bounds,T.rightCacheBounds);for(let g=St-2;g>=0;g--){const f=Nt[g],R=Nt[g+1];yi(f.bounds,R.rightCacheBounds,f.rightCacheBounds)}let m=0;for(let g=0;g<St-1;g++){const f=Nt[g],R=f.count,O=f.bounds,y=Nt[g+1].rightCacheBounds;R!==0&&(m===0?_i(O,Be):yi(O,Be,Be)),m+=R;let N=0,P=0;m!==0&&(N=de(Be)/a);const w=i-m;w!==0&&(P=de(y)/a);const M=Oi+Ps*(N*m+P*w);M<l&&(n=h,l=M,r=f.candidate)}}}}else console.warn(`MeshBVH: Invalid build strategy value ${o} used.`);return{axis:n,pos:r}}function to(c,s,t,e){let i=0;for(let o=s,n=s+t;o<n;o++)i+=c[o*6+e*2];return i/t}class Ve{constructor(){}}function eo(c,s,t,e,i,o){let n=e,r=e+i-1;const a=o.pos,l=o.axis*2;for(;;){for(;n<=r&&t[n*6+l]<a;)n++;for(;n<=r&&t[r*6+l]>=a;)r--;if(n<r){for(let E=0;E<3;E++){let d=s[n*3+E];s[n*3+E]=s[r*3+E],s[r*3+E]=d}for(let E=0;E<6;E++){let d=t[n*6+E];t[n*6+E]=t[r*6+E],t[r*6+E]=d}n++,r--}else return n}}function so(c,s,t,e,i,o){let n=e,r=e+i-1;const a=o.pos,l=o.axis*2;for(;;){for(;n<=r&&t[n*6+l]<a;)n++;for(;n<=r&&t[r*6+l]>=a;)r--;if(n<r){let E=c[n];c[n]=c[r],c[r]=E;for(let d=0;d<6;d++){let h=t[n*6+d];t[n*6+d]=t[r*6+d],t[r*6+d]=h}n++,r--}else return n}}function io(c,s){const t=(c.index?c.index.count:c.attributes.position.count)/3,e=t>2**16,i=e?4:2,o=s?new SharedArrayBuffer(t*i):new ArrayBuffer(t*i),n=e?new Uint32Array(o):new Uint16Array(o);for(let r=0,a=n.length;r<a;r++)n[r]=r;return n}function no(c,s){const t=c.geometry,e=t.index?t.index.array:null,i=s.maxDepth,o=s.verbose,n=s.maxLeafTris,r=s.strategy,a=s.onProgress,l=le(t),E=c._indirectBuffer;let d=!1;const h=new Float32Array(6),u=new Float32Array(6),p=$n(t,h),A=s.indirect?so:eo,F=[],T=s.indirect?cn(t):ln(t);if(T.length===1){const f=T[0],R=new Ve;R.boundingData=h,qn(p,f.offset,f.count,u),g(R,f.offset,f.count,u),F.push(R)}else for(let f of T){const R=new Ve;R.boundingData=new Float32Array(6),ws(p,f.offset,f.count,R.boundingData,u),g(R,f.offset,f.count,u),F.push(R)}return F;function m(f){a&&a(f/l)}function g(f,R,O,_=null,y=0){if(!d&&y>=i&&(d=!0,o&&(console.warn(`MeshBVH: Max depth of ${i} reached when generating BVH. Consider increasing maxDepth.`),console.warn(t))),O<=n||y>=i)return m(R+O),f.offset=R,f.count=O,f;const N=Jn(f.boundingData,_,p,R,O,r);if(N.axis===-1)return m(R+O),f.offset=R,f.count=O,f;const P=A(E,e,p,R,O,N);if(P===R||P===R+O)m(R+O),f.offset=R,f.count=O;else{f.splitAxis=N.axis;const w=new Ve,M=R,U=P-R;f.left=w,w.boundingData=new Float32Array(6),ws(p,M,U,w.boundingData,u),g(w,M,U,u,y+1);const x=new Ve,v=P,z=O-U;f.right=x,x.boundingData=new Float32Array(6),ws(p,v,z,x.boundingData,u),g(x,v,z,u,y+1)}return f}}function oo(c,s){const t=c.geometry;s.indirect&&(c._indirectBuffer=io(t,s.useSharedArrayBuffer),Qn(t)&&!s.verbose&&console.warn('MeshBVH: Provided geometry contains groups that do not fully span the vertex contents while using the "indirect" option. BVH may incorrectly report intersections on unrendered portions of the geometry.')),c._indirectBuffer||Zn(t,s);const e=no(c,s);let i,o,n;const r=[],a=s.useSharedArrayBuffer?SharedArrayBuffer:ArrayBuffer;for(let d=0;d<e.length;d++){const h=e[d];let u=l(h);const p=new a(rs*u);i=new Float32Array(p),o=new Uint32Array(p),n=new Uint16Array(p),E(0,h),r.push(p)}c._roots=r;return;function l(d){return d.count?1:1+l(d.left)+l(d.right)}function E(d,h){const u=d/4,p=d/2,A=!!h.count,F=h.boundingData;for(let T=0;T<6;T++)i[u+T]=F[T];if(A){const T=h.offset,m=h.count;return o[u+6]=T,n[p+14]=m,n[p+15]=Fs,d+rs}else{const T=h.left,m=h.right,g=h.splitAxis;let f;if(f=E(d+rs,T),f/4>Math.pow(2,32))throw new Error("MeshBVH: Cannot store child pointer greater than 32 bits.");return o[u+6]=f/4,f=E(f,m),o[u+7]=g,f}}}class _t{constructor(){this.min=1/0,this.max=-1/0}setFromPointsField(s,t){let e=1/0,i=-1/0;for(let o=0,n=s.length;o<n;o++){const a=s[o][t];e=a<e?a:e,i=a>i?a:i}this.min=e,this.max=i}setFromPoints(s,t){let e=1/0,i=-1/0;for(let o=0,n=t.length;o<n;o++){const r=t[o],a=s.dot(r);e=a<e?a:e,i=a>i?a:i}this.min=e,this.max=i}isSeparated(s){return this.min>s.max||s.min>this.max}}_t.prototype.setFromBox=function(){const c=new C.Vector3;return function(t,e){const i=e.min,o=e.max;let n=1/0,r=-1/0;for(let a=0;a<=1;a++)for(let l=0;l<=1;l++)for(let E=0;E<=1;E++){c.x=i.x*a+o.x*(1-a),c.y=i.y*l+o.y*(1-l),c.z=i.z*E+o.z*(1-E);const d=t.dot(c);n=Math.min(d,n),r=Math.max(d,r)}this.min=n,this.max=r}}();const ro=function(){const c=new C.Vector3,s=new C.Vector3,t=new C.Vector3;return function(i,o,n){const r=i.start,a=c,l=o.start,E=s;t.subVectors(r,l),c.subVectors(i.end,i.start),s.subVectors(o.end,o.start);const d=t.dot(E),h=E.dot(a),u=E.dot(E),p=t.dot(a),F=a.dot(a)*u-h*h;let T,m;F!==0?T=(d*h-p*u)/F:T=0,m=(d+T*h)/u,n.x=T,n.y=m}}(),pi=function(){const c=new C.Vector2,s=new C.Vector3,t=new C.Vector3;return function(i,o,n,r){ro(i,o,c);let a=c.x,l=c.y;if(a>=0&&a<=1&&l>=0&&l<=1){i.at(a,n),o.at(l,r);return}else if(a>=0&&a<=1){l<0?o.at(0,r):o.at(1,r),i.closestPointToPoint(r,!0,n);return}else if(l>=0&&l<=1){a<0?i.at(0,n):i.at(1,n),o.closestPointToPoint(n,!0,r);return}else{let E;a<0?E=i.start:E=i.end;let d;l<0?d=o.start:d=o.end;const h=s,u=t;if(i.closestPointToPoint(d,!0,s),o.closestPointToPoint(E,!0,t),h.distanceToSquared(d)<=u.distanceToSquared(E)){n.copy(h),r.copy(d);return}else{n.copy(E),r.copy(u);return}}}}(),ao=function(){const c=new C.Vector3,s=new C.Vector3,t=new C.Plane,e=new C.Line3;return function(o,n){const{radius:r,center:a}=o,{a:l,b:E,c:d}=n;if(e.start=l,e.end=E,e.closestPointToPoint(a,!0,c).distanceTo(a)<=r||(e.start=l,e.end=d,e.closestPointToPoint(a,!0,c).distanceTo(a)<=r)||(e.start=E,e.end=d,e.closestPointToPoint(a,!0,c).distanceTo(a)<=r))return!0;const A=n.getPlane(t);if(Math.abs(A.distanceToPoint(a))<=r){const T=A.projectPoint(a,s);if(n.containsPoint(T))return!0}return!1}}(),co=1e-15;function Ds(c){return Math.abs(c)<co}class Rt extends C.Triangle{constructor(...s){super(...s),this.isExtendedTriangle=!0,this.satAxes=new Array(4).fill().map(()=>new C.Vector3),this.satBounds=new Array(4).fill().map(()=>new _t),this.points=[this.a,this.b,this.c],this.sphere=new C.Sphere,this.plane=new C.Plane,this.needsUpdate=!0}intersectsSphere(s){return ao(s,this)}update(){const s=this.a,t=this.b,e=this.c,i=this.points,o=this.satAxes,n=this.satBounds,r=o[0],a=n[0];this.getNormal(r),a.setFromPoints(r,i);const l=o[1],E=n[1];l.subVectors(s,t),E.setFromPoints(l,i);const d=o[2],h=n[2];d.subVectors(t,e),h.setFromPoints(d,i);const u=o[3],p=n[3];u.subVectors(e,s),p.setFromPoints(u,i),this.sphere.setFromPoints(this.points),this.plane.setFromNormalAndCoplanarPoint(r,s),this.needsUpdate=!1}}Rt.prototype.closestPointToSegment=function(){const c=new C.Vector3,s=new C.Vector3,t=new C.Line3;return function(i,o=null,n=null){const{start:r,end:a}=i,l=this.points;let E,d=1/0;for(let h=0;h<3;h++){const u=(h+1)%3;t.start.copy(l[h]),t.end.copy(l[u]),pi(t,i,c,s),E=c.distanceToSquared(s),E<d&&(d=E,o&&o.copy(c),n&&n.copy(s))}return this.closestPointToPoint(r,c),E=r.distanceToSquared(c),E<d&&(d=E,o&&o.copy(c),n&&n.copy(r)),this.closestPointToPoint(a,c),E=a.distanceToSquared(c),E<d&&(d=E,o&&o.copy(c),n&&n.copy(a)),Math.sqrt(d)}}();Rt.prototype.intersectsTriangle=function(){const c=new Rt,s=new Array(3),t=new Array(3),e=new _t,i=new _t,o=new C.Vector3,n=new C.Vector3,r=new C.Vector3,a=new C.Vector3,l=new C.Vector3,E=new C.Line3,d=new C.Line3,h=new C.Line3,u=new C.Vector3;function p(A,F,T){const m=A.points;let g=0,f=-1;for(let R=0;R<3;R++){const{start:O,end:_}=E;O.copy(m[R]),_.copy(m[(R+1)%3]),E.delta(n);const y=Ds(F.distanceToPoint(O));if(Ds(F.normal.dot(n))&&y){T.copy(E),g=2;break}const N=F.intersectLine(E,u);if(!N&&y&&u.copy(O),(N||y)&&!Ds(u.distanceTo(_))){if(g<=1)(g===1?T.start:T.end).copy(u),y&&(f=g);else if(g>=2){(f===1?T.start:T.end).copy(u),g=2;break}if(g++,g===2&&f===-1)break}}return g}return function(F,T=null,m=!1){this.needsUpdate&&this.update(),F.isExtendedTriangle?F.needsUpdate&&F.update():(c.copy(F),c.update(),F=c);const g=this.plane,f=F.plane;if(Math.abs(g.normal.dot(f.normal))>1-1e-10){const R=this.satBounds,O=this.satAxes;t[0]=F.a,t[1]=F.b,t[2]=F.c;for(let N=0;N<4;N++){const P=R[N],w=O[N];if(e.setFromPoints(w,t),P.isSeparated(e))return!1}const _=F.satBounds,y=F.satAxes;s[0]=this.a,s[1]=this.b,s[2]=this.c;for(let N=0;N<4;N++){const P=_[N],w=y[N];if(e.setFromPoints(w,s),P.isSeparated(e))return!1}for(let N=0;N<4;N++){const P=O[N];for(let w=0;w<4;w++){const M=y[w];if(o.crossVectors(P,M),e.setFromPoints(o,s),i.setFromPoints(o,t),e.isSeparated(i))return!1}}return T&&(m||console.warn("ExtendedTriangle.intersectsTriangle: Triangles are coplanar which does not support an output edge. Setting edge to 0, 0, 0."),T.start.set(0,0,0),T.end.set(0,0,0)),!0}else{const R=p(this,f,d);if(R===1&&F.containsPoint(d.end))return T&&(T.start.copy(d.end),T.end.copy(d.end)),!0;if(R!==2)return!1;const O=p(F,g,h);if(O===1&&this.containsPoint(h.end))return T&&(T.start.copy(h.end),T.end.copy(h.end)),!0;if(O!==2)return!1;if(d.delta(r),h.delta(a),r.dot(a)<0){let U=h.start;h.start=h.end,h.end=U}const _=d.start.dot(r),y=d.end.dot(r),N=h.start.dot(r),P=h.end.dot(r),w=y<N,M=_<P;return _!==P&&N!==y&&w===M?!1:(T&&(l.subVectors(d.start,h.start),l.dot(r)>0?T.start.copy(d.start):T.start.copy(h.start),l.subVectors(d.end,h.end),l.dot(r)<0?T.end.copy(d.end):T.end.copy(h.end)),!0)}}}();Rt.prototype.distanceToPoint=function(){const c=new C.Vector3;return function(t){return this.closestPointToPoint(t,c),t.distanceTo(c)}}();Rt.prototype.distanceToTriangle=function(){const c=new C.Vector3,s=new C.Vector3,t=["a","b","c"],e=new C.Line3,i=new C.Line3;return function(n,r=null,a=null){const l=r||a?e:null;if(this.intersectsTriangle(n,l))return(r||a)&&(r&&l.getCenter(r),a&&l.getCenter(a)),0;let E=1/0;for(let d=0;d<3;d++){let h;const u=t[d],p=n[u];this.closestPointToPoint(p,c),h=p.distanceToSquared(c),h<E&&(E=h,r&&r.copy(c),a&&a.copy(p));const A=this[u];n.closestPointToPoint(A,c),h=A.distanceToSquared(c),h<E&&(E=h,r&&r.copy(A),a&&a.copy(c))}for(let d=0;d<3;d++){const h=t[d],u=t[(d+1)%3];e.set(this[h],this[u]);for(let p=0;p<3;p++){const A=t[p],F=t[(p+1)%3];i.set(n[A],n[F]),pi(e,i,c,s);const T=c.distanceToSquared(s);T<E&&(E=T,r&&r.copy(c),a&&a.copy(s))}}return Math.sqrt(E)}}();class ot{constructor(s,t,e){this.isOrientedBox=!0,this.min=new C.Vector3,this.max=new C.Vector3,this.matrix=new C.Matrix4,this.invMatrix=new C.Matrix4,this.points=new Array(8).fill().map(()=>new C.Vector3),this.satAxes=new Array(3).fill().map(()=>new C.Vector3),this.satBounds=new Array(3).fill().map(()=>new _t),this.alignedSatBounds=new Array(3).fill().map(()=>new _t),this.needsUpdate=!1,s&&this.min.copy(s),t&&this.max.copy(t),e&&this.matrix.copy(e)}set(s,t,e){this.min.copy(s),this.max.copy(t),this.matrix.copy(e),this.needsUpdate=!0}copy(s){this.min.copy(s.min),this.max.copy(s.max),this.matrix.copy(s.matrix),this.needsUpdate=!0}}ot.prototype.update=function(){return function(){const s=this.matrix,t=this.min,e=this.max,i=this.points;for(let l=0;l<=1;l++)for(let E=0;E<=1;E++)for(let d=0;d<=1;d++){const h=1*l|2*E|4*d,u=i[h];u.x=l?e.x:t.x,u.y=E?e.y:t.y,u.z=d?e.z:t.z,u.applyMatrix4(s)}const o=this.satBounds,n=this.satAxes,r=i[0];for(let l=0;l<3;l++){const E=n[l],d=o[l],h=1<<l,u=i[h];E.subVectors(r,u),d.setFromPoints(E,i)}const a=this.alignedSatBounds;a[0].setFromPointsField(i,"x"),a[1].setFromPointsField(i,"y"),a[2].setFromPointsField(i,"z"),this.invMatrix.copy(this.matrix).invert(),this.needsUpdate=!1}}();ot.prototype.intersectsBox=function(){const c=new _t;return function(t){this.needsUpdate&&this.update();const e=t.min,i=t.max,o=this.satBounds,n=this.satAxes,r=this.alignedSatBounds;if(c.min=e.x,c.max=i.x,r[0].isSeparated(c)||(c.min=e.y,c.max=i.y,r[1].isSeparated(c))||(c.min=e.z,c.max=i.z,r[2].isSeparated(c)))return!1;for(let a=0;a<3;a++){const l=n[a],E=o[a];if(c.setFromBox(l,t),E.isSeparated(c))return!1}return!0}}();ot.prototype.intersectsTriangle=function(){const c=new Rt,s=new Array(3),t=new _t,e=new _t,i=new C.Vector3;return function(n){this.needsUpdate&&this.update(),n.isExtendedTriangle?n.needsUpdate&&n.update():(c.copy(n),c.update(),n=c);const r=this.satBounds,a=this.satAxes;s[0]=n.a,s[1]=n.b,s[2]=n.c;for(let h=0;h<3;h++){const u=r[h],p=a[h];if(t.setFromPoints(p,s),u.isSeparated(t))return!1}const l=n.satBounds,E=n.satAxes,d=this.points;for(let h=0;h<3;h++){const u=l[h],p=E[h];if(t.setFromPoints(p,d),u.isSeparated(t))return!1}for(let h=0;h<3;h++){const u=a[h];for(let p=0;p<4;p++){const A=E[p];if(i.crossVectors(u,A),t.setFromPoints(i,s),e.setFromPoints(i,d),t.isSeparated(e))return!1}}return!0}}();ot.prototype.closestPointToPoint=function(){return function(s,t){return this.needsUpdate&&this.update(),t.copy(s).applyMatrix4(this.invMatrix).clamp(this.min,this.max).applyMatrix4(this.matrix),t}}();ot.prototype.distanceToPoint=function(){const c=new C.Vector3;return function(t){return this.closestPointToPoint(t,c),t.distanceTo(c)}}();ot.prototype.distanceToBox=function(){const c=["x","y","z"],s=new Array(12).fill().map(()=>new C.Line3),t=new Array(12).fill().map(()=>new C.Line3),e=new C.Vector3,i=new C.Vector3;return function(n,r=0,a=null,l=null){if(this.needsUpdate&&this.update(),this.intersectsBox(n))return(a||l)&&(n.getCenter(i),this.closestPointToPoint(i,e),n.closestPointToPoint(e,i),a&&a.copy(e),l&&l.copy(i)),0;const E=r*r,d=n.min,h=n.max,u=this.points;let p=1/0;for(let F=0;F<8;F++){const T=u[F];i.copy(T).clamp(d,h);const m=T.distanceToSquared(i);if(m<p&&(p=m,a&&a.copy(T),l&&l.copy(i),m<E))return Math.sqrt(m)}let A=0;for(let F=0;F<3;F++)for(let T=0;T<=1;T++)for(let m=0;m<=1;m++){const g=(F+1)%3,f=(F+2)%3,R=T<<g|m<<f,O=1<<F|T<<g|m<<f,_=u[R],y=u[O];s[A].set(_,y);const P=c[F],w=c[g],M=c[f],U=t[A],x=U.start,v=U.end;x[P]=d[P],x[w]=T?d[w]:h[w],x[M]=m?d[M]:h[w],v[P]=h[P],v[w]=T?d[w]:h[w],v[M]=m?d[M]:h[w],A++}for(let F=0;F<=1;F++)for(let T=0;T<=1;T++)for(let m=0;m<=1;m++){i.x=F?h.x:d.x,i.y=T?h.y:d.y,i.z=m?h.z:d.z,this.closestPointToPoint(i,e);const g=i.distanceToSquared(e);if(g<p&&(p=g,a&&a.copy(e),l&&l.copy(i),g<E))return Math.sqrt(g)}for(let F=0;F<12;F++){const T=s[F];for(let m=0;m<12;m++){const g=t[m];pi(T,g,e,i);const f=e.distanceToSquared(i);if(f<p&&(p=f,a&&a.copy(e),l&&l.copy(i),f<E))return Math.sqrt(f)}}return Math.sqrt(p)}}();class Ci{constructor(s){this._getNewPrimitive=s,this._primitives=[]}getPrimitive(){const s=this._primitives;return s.length===0?this._getNewPrimitive():s.pop()}releasePrimitive(s){this._primitives.push(s)}}class lo extends Ci{constructor(){super(()=>new Rt)}}const Et=new lo;function ct(c,s){return s[c+15]===65535}function lt(c,s){return s[c+6]}function dt(c,s){return s[c+14]}function ut(c){return c+8}function It(c,s){return s[c+6]}function hn(c,s){return s[c+7]}class ho{constructor(){this.float32Array=null,this.uint16Array=null,this.uint32Array=null;const s=[];let t=null;this.setBuffer=e=>{t&&s.push(t),t=e,this.float32Array=new Float32Array(e),this.uint16Array=new Uint16Array(e),this.uint32Array=new Uint32Array(e)},this.clearBuffer=()=>{t=null,this.float32Array=null,this.uint16Array=null,this.uint32Array=null,s.length!==0&&this.setBuffer(s.pop())}}}const X=new ho;let Dt,oe;const Wt=[],Ye=new Ci(()=>new C.Box3);function Eo(c,s,t,e,i,o){Dt=Ye.getPrimitive(),oe=Ye.getPrimitive(),Wt.push(Dt,oe),X.setBuffer(c._roots[s]);const n=$s(0,c.geometry,t,e,i,o);X.clearBuffer(),Ye.releasePrimitive(Dt),Ye.releasePrimitive(oe),Wt.pop(),Wt.pop();const r=Wt.length;return r>0&&(oe=Wt[r-1],Dt=Wt[r-2]),n}function $s(c,s,t,e,i=null,o=0,n=0){const{float32Array:r,uint16Array:a,uint32Array:l}=X;let E=c*2;if(ct(E,a)){const h=lt(c,l),u=dt(E,a);return q(c,r,Dt),e(h,u,!1,n,o+c,Dt)}else{let P=function(M){const{uint16Array:U,uint32Array:x}=X;let v=M*2;for(;!ct(v,U);)M=ut(M),v=M*2;return lt(M,x)},w=function(M){const{uint16Array:U,uint32Array:x}=X;let v=M*2;for(;!ct(v,U);)M=It(M,x),v=M*2;return lt(M,x)+dt(v,U)};const h=ut(c),u=It(c,l);let p=h,A=u,F,T,m,g;if(i&&(m=Dt,g=oe,q(p,r,m),q(A,r,g),F=i(m),T=i(g),T<F)){p=u,A=h;const M=F;F=T,T=M,m=g}m||(m=Dt,q(p,r,m));const f=ct(p*2,a),R=t(m,f,F,n+1,o+p);let O;if(R===gi){const M=P(p),x=w(p)-M;O=e(M,x,!0,n+1,o+p,m)}else O=R&&$s(p,s,t,e,i,o,n+1);if(O)return!0;g=oe,q(A,r,g);const _=ct(A*2,a),y=t(g,_,T,n+1,o+A);let N;if(y===gi){const M=P(A),x=w(A)-M;N=e(M,x,!0,n+1,o+A,g)}else N=y&&$s(A,s,t,e,i,o,n+1);return!!N}}const ue=new C.Vector3,Us=new C.Vector3;function uo(c,s,t={},e=0,i=1/0){const o=e*e,n=i*i;let r=1/0,a=null;if(c.shapecast({boundsTraverseOrder:E=>(ue.copy(s).clamp(E.min,E.max),ue.distanceToSquared(s)),intersectsBounds:(E,d,h)=>h<r&&h<n,intersectsTriangle:(E,d)=>{E.closestPointToPoint(s,ue);const h=s.distanceToSquared(ue);return h<r&&(Us.copy(ue),r=h,a=d),h<o}}),r===1/0)return null;const l=Math.sqrt(r);return t.point?t.point.copy(Us):t.point=Us.clone(),t.distance=l,t.faceIndex=a,t}const Xt=new C.Vector3,Zt=new C.Vector3,Qt=new C.Vector3,Ge=new C.Vector2,ze=new C.Vector2,He=new C.Vector2,Ni=new C.Vector3,Li=new C.Vector3,Pi=new C.Vector3,ke=new C.Vector3;function Io(c,s,t,e,i,o){let n;return o===C.BackSide?n=c.intersectTriangle(e,t,s,!0,i):n=c.intersectTriangle(s,t,e,o!==C.DoubleSide,i),n===null?null:{distance:c.origin.distanceTo(i),point:i.clone()}}function fo(c,s,t,e,i,o,n,r,a){Xt.fromBufferAttribute(s,o),Zt.fromBufferAttribute(s,n),Qt.fromBufferAttribute(s,r);const l=Io(c,Xt,Zt,Qt,ke,a);if(l){e&&(Ge.fromBufferAttribute(e,o),ze.fromBufferAttribute(e,n),He.fromBufferAttribute(e,r),l.uv=C.Triangle.getInterpolation(ke,Xt,Zt,Qt,Ge,ze,He,new C.Vector2)),i&&(Ge.fromBufferAttribute(i,o),ze.fromBufferAttribute(i,n),He.fromBufferAttribute(i,r),l.uv1=C.Triangle.getInterpolation(ke,Xt,Zt,Qt,Ge,ze,He,new C.Vector2)),t&&(Ni.fromBufferAttribute(t,o),Li.fromBufferAttribute(t,n),Pi.fromBufferAttribute(t,r),l.normal=C.Triangle.getInterpolation(ke,Xt,Zt,Qt,Ni,Li,Pi,new C.Vector3),l.normal.dot(c.direction)>0&&l.normal.multiplyScalar(-1));const E={a:o,b:n,c:r,normal:new C.Vector3,materialIndex:0};C.Triangle.getNormal(Xt,Zt,Qt,E.normal),l.face=E,l.faceIndex=o}return l}function gs(c,s,t,e,i){const o=e*3;let n=o+0,r=o+1,a=o+2;const l=c.index;c.index&&(n=l.getX(n),r=l.getX(r),a=l.getX(a));const{position:E,normal:d,uv:h,uv1:u}=c.attributes,p=fo(t,E,d,h,u,n,r,a,s);return p?(p.faceIndex=e,i&&i.push(p),p):null}function J(c,s,t,e){const i=c.a,o=c.b,n=c.c;let r=s,a=s+1,l=s+2;t&&(r=t.getX(r),a=t.getX(a),l=t.getX(l)),i.x=e.getX(r),i.y=e.getY(r),i.z=e.getZ(r),o.x=e.getX(a),o.y=e.getY(a),o.z=e.getZ(a),n.x=e.getX(l),n.y=e.getY(l),n.z=e.getZ(l)}function po(c,s,t,e,i,o){const{geometry:n,_indirectBuffer:r}=c;for(let a=e,l=e+i;a<l;a++)gs(n,s,t,a,o)}function Co(c,s,t,e,i){const{geometry:o,_indirectBuffer:n}=c;let r=1/0,a=null;for(let l=e,E=e+i;l<E;l++){let d;d=gs(o,s,t,l),d&&d.distance<r&&(a=d,r=d.distance)}return a}function To(c,s,t,e,i,o,n){const{geometry:r}=t,{index:a}=r,l=r.attributes.position;for(let E=c,d=s+c;E<d;E++){let h;if(h=E,J(n,h*3,a,l),n.needsUpdate=!0,e(n,h,i,o))return!0}return!1}function mo(c,s=null){s&&Array.isArray(s)&&(s=new Set(s));const t=c.geometry,e=t.index?t.index.array:null,i=t.attributes.position;let o,n,r,a,l=0;const E=c._roots;for(let h=0,u=E.length;h<u;h++)o=E[h],n=new Uint32Array(o),r=new Uint16Array(o),a=new Float32Array(o),d(0,l),l+=o.byteLength;function d(h,u,p=!1){const A=h*2;if(r[A+15]===Fs){const T=n[h+6],m=r[A+14];let g=1/0,f=1/0,R=1/0,O=-1/0,_=-1/0,y=-1/0;for(let N=3*T,P=3*(T+m);N<P;N++){let w=e[N];const M=i.getX(w),U=i.getY(w),x=i.getZ(w);M<g&&(g=M),M>O&&(O=M),U<f&&(f=U),U>_&&(_=U),x<R&&(R=x),x>y&&(y=x)}return a[h+0]!==g||a[h+1]!==f||a[h+2]!==R||a[h+3]!==O||a[h+4]!==_||a[h+5]!==y?(a[h+0]=g,a[h+1]=f,a[h+2]=R,a[h+3]=O,a[h+4]=_,a[h+5]=y,!0):!1}else{const T=h+8,m=n[h+6],g=T+u,f=m+u;let R=p,O=!1,_=!1;s?R||(O=s.has(g),_=s.has(f),R=!O&&!_):(O=!0,_=!0);const y=R||O,N=R||_;let P=!1;y&&(P=d(T,u,R));let w=!1;N&&(w=d(m,u,R));const M=P||w;if(M)for(let U=0;U<3;U++){const x=T+U,v=m+U,z=a[x],j=a[x+3],et=a[v],Z=a[v+3];a[h+U]=z<et?z:et,a[h+U+3]=j>Z?j:Z}return M}}}const Mi=new C.Box3;function Ut(c,s,t,e){return q(c,s,Mi),t.intersectBox(Mi,e)}function Ro(c,s,t,e,i,o){const{geometry:n,_indirectBuffer:r}=c;for(let a=e,l=e+i;a<l;a++){let E=r?r[a]:a;gs(n,s,t,E,o)}}function Ao(c,s,t,e,i){const{geometry:o,_indirectBuffer:n}=c;let r=1/0,a=null;for(let l=e,E=e+i;l<E;l++){let d;d=gs(o,s,t,n?n[l]:l),d&&d.distance<r&&(a=d,r=d.distance)}return a}function Fo(c,s,t,e,i,o,n){const{geometry:r}=t,{index:a}=r,l=r.attributes.position;for(let E=c,d=s+c;E<d;E++){let h;if(h=t.resolveTriangleIndex(E),J(n,h*3,a,l),n.needsUpdate=!0,e(n,h,i,o))return!0}return!1}const wi=new C.Vector3;function go(c,s,t,e,i){X.setBuffer(c._roots[s]),Ks(0,c,t,e,i),X.clearBuffer()}function Ks(c,s,t,e,i){const{float32Array:o,uint16Array:n,uint32Array:r}=X,a=c*2;if(ct(a,n)){const E=lt(c,r),d=dt(a,n);po(s,t,e,E,d,i)}else{const E=ut(c);Ut(E,o,e,wi)&&Ks(E,s,t,e,i);const d=It(c,r);Ut(d,o,e,wi)&&Ks(d,s,t,e,i)}}const Di=new C.Vector3,Oo=["x","y","z"];function So(c,s,t,e){X.setBuffer(c._roots[s]);const i=Js(0,c,t,e);return X.clearBuffer(),i}function Js(c,s,t,e){const{float32Array:i,uint16Array:o,uint32Array:n}=X;let r=c*2;if(ct(r,o)){const l=lt(c,n),E=dt(r,o);return Co(s,t,e,l,E)}else{const l=hn(c,n),E=Oo[l],h=e.direction[E]>=0;let u,p;h?(u=ut(c),p=It(c,n)):(u=It(c,n),p=ut(c));const F=Ut(u,i,e,Di)?Js(u,s,t,e):null;if(F){const g=F.point[E];if(h?g<=i[p+l]:g>=i[p+l+3])return F}const m=Ut(p,i,e,Di)?Js(p,s,t,e):null;return F&&m?F.distance<=m.distance?F:m:F||m||null}}const We=new C.Box3,jt=new Rt,qt=new Rt,Ie=new C.Matrix4,Ui=new ot,Xe=new ot;function _o(c,s,t,e){X.setBuffer(c._roots[s]);const i=ti(0,c,t,e);return X.clearBuffer(),i}function ti(c,s,t,e,i=null){const{float32Array:o,uint16Array:n,uint32Array:r}=X;let a=c*2;if(i===null&&(t.boundingBox||t.computeBoundingBox(),Ui.set(t.boundingBox.min,t.boundingBox.max,e),i=Ui),ct(a,n)){const E=s.geometry,d=E.index,h=E.attributes.position,u=t.index,p=t.attributes.position,A=lt(c,r),F=dt(a,n);if(Ie.copy(e).invert(),t.boundsTree)return q(c,o,Xe),Xe.matrix.copy(Ie),Xe.needsUpdate=!0,t.boundsTree.shapecast({intersectsBounds:m=>Xe.intersectsBox(m),intersectsTriangle:m=>{m.a.applyMatrix4(e),m.b.applyMatrix4(e),m.c.applyMatrix4(e),m.needsUpdate=!0;for(let g=A*3,f=(F+A)*3;g<f;g+=3)if(J(qt,g,d,h),qt.needsUpdate=!0,m.intersectsTriangle(qt))return!0;return!1}});for(let T=A*3,m=(F+A)*3;T<m;T+=3){J(jt,T,d,h),jt.a.applyMatrix4(Ie),jt.b.applyMatrix4(Ie),jt.c.applyMatrix4(Ie),jt.needsUpdate=!0;for(let g=0,f=u.count;g<f;g+=3)if(J(qt,g,u,p),qt.needsUpdate=!0,jt.intersectsTriangle(qt))return!0}}else{const E=c+8,d=r[c+6];return q(E,o,We),!!(i.intersectsBox(We)&&ti(E,s,t,e,i)||(q(d,o,We),i.intersectsBox(We)&&ti(d,s,t,e,i)))}}const Ze=new C.Matrix4,xs=new ot,fe=new ot,yo=new C.Vector3,No=new C.Vector3,Lo=new C.Vector3,Po=new C.Vector3;function Mo(c,s,t,e={},i={},o=0,n=1/0){s.boundingBox||s.computeBoundingBox(),xs.set(s.boundingBox.min,s.boundingBox.max,t),xs.needsUpdate=!0;const r=c.geometry,a=r.attributes.position,l=r.index,E=s.attributes.position,d=s.index,h=Et.getPrimitive(),u=Et.getPrimitive();let p=yo,A=No,F=null,T=null;i&&(F=Lo,T=Po);let m=1/0,g=null,f=null;return Ze.copy(t).invert(),fe.matrix.copy(Ze),c.shapecast({boundsTraverseOrder:R=>xs.distanceToBox(R),intersectsBounds:(R,O,_)=>_<m&&_<n?(O&&(fe.min.copy(R.min),fe.max.copy(R.max),fe.needsUpdate=!0),!0):!1,intersectsRange:(R,O)=>{if(s.boundsTree)return s.boundsTree.shapecast({boundsTraverseOrder:y=>fe.distanceToBox(y),intersectsBounds:(y,N,P)=>P<m&&P<n,intersectsRange:(y,N)=>{for(let P=y,w=y+N;P<w;P++){J(u,3*P,d,E),u.a.applyMatrix4(t),u.b.applyMatrix4(t),u.c.applyMatrix4(t),u.needsUpdate=!0;for(let M=R,U=R+O;M<U;M++){J(h,3*M,l,a),h.needsUpdate=!0;const x=h.distanceToTriangle(u,p,F);if(x<m&&(A.copy(p),T&&T.copy(F),m=x,g=M,f=P),x<o)return!0}}}});{const _=le(s);for(let y=0,N=_;y<N;y++){J(u,3*y,d,E),u.a.applyMatrix4(t),u.b.applyMatrix4(t),u.c.applyMatrix4(t),u.needsUpdate=!0;for(let P=R,w=R+O;P<w;P++){J(h,3*P,l,a),h.needsUpdate=!0;const M=h.distanceToTriangle(u,p,F);if(M<m&&(A.copy(p),T&&T.copy(F),m=M,g=P,f=y),M<o)return!0}}}}}),Et.releasePrimitive(h),Et.releasePrimitive(u),m===1/0?null:(e.point?e.point.copy(A):e.point=A.clone(),e.distance=m,e.faceIndex=g,i&&(i.point?i.point.copy(T):i.point=T.clone(),i.point.applyMatrix4(Ze),A.applyMatrix4(Ze),i.distance=A.sub(i.point).length(),i.faceIndex=f),e)}function wo(c,s=null){s&&Array.isArray(s)&&(s=new Set(s));const t=c.geometry,e=t.index?t.index.array:null,i=t.attributes.position;let o,n,r,a,l=0;const E=c._roots;for(let h=0,u=E.length;h<u;h++)o=E[h],n=new Uint32Array(o),r=new Uint16Array(o),a=new Float32Array(o),d(0,l),l+=o.byteLength;function d(h,u,p=!1){const A=h*2;if(r[A+15]===Fs){const T=n[h+6],m=r[A+14];let g=1/0,f=1/0,R=1/0,O=-1/0,_=-1/0,y=-1/0;for(let N=T,P=T+m;N<P;N++){const w=3*c.resolveTriangleIndex(N);for(let M=0;M<3;M++){let U=w+M;U=e?e[U]:U;const x=i.getX(U),v=i.getY(U),z=i.getZ(U);x<g&&(g=x),x>O&&(O=x),v<f&&(f=v),v>_&&(_=v),z<R&&(R=z),z>y&&(y=z)}}return a[h+0]!==g||a[h+1]!==f||a[h+2]!==R||a[h+3]!==O||a[h+4]!==_||a[h+5]!==y?(a[h+0]=g,a[h+1]=f,a[h+2]=R,a[h+3]=O,a[h+4]=_,a[h+5]=y,!0):!1}else{const T=h+8,m=n[h+6],g=T+u,f=m+u;let R=p,O=!1,_=!1;s?R||(O=s.has(g),_=s.has(f),R=!O&&!_):(O=!0,_=!0);const y=R||O,N=R||_;let P=!1;y&&(P=d(T,u,R));let w=!1;N&&(w=d(m,u,R));const M=P||w;if(M)for(let U=0;U<3;U++){const x=T+U,v=m+U,z=a[x],j=a[x+3],et=a[v],Z=a[v+3];a[h+U]=z<et?z:et,a[h+U+3]=j>Z?j:Z}return M}}}const xi=new C.Vector3;function Do(c,s,t,e,i){X.setBuffer(c._roots[s]),ei(0,c,t,e,i),X.clearBuffer()}function ei(c,s,t,e,i){const{float32Array:o,uint16Array:n,uint32Array:r}=X,a=c*2;if(ct(a,n)){const E=lt(c,r),d=dt(a,n);Ro(s,t,e,E,d,i)}else{const E=ut(c);Ut(E,o,e,xi)&&ei(E,s,t,e,i);const d=It(c,r);Ut(d,o,e,xi)&&ei(d,s,t,e,i)}}const bi=new C.Vector3,Uo=["x","y","z"];function xo(c,s,t,e){X.setBuffer(c._roots[s]);const i=si(0,c,t,e);return X.clearBuffer(),i}function si(c,s,t,e){const{float32Array:i,uint16Array:o,uint32Array:n}=X;let r=c*2;if(ct(r,o)){const l=lt(c,n),E=dt(r,o);return Ao(s,t,e,l,E)}else{const l=hn(c,n),E=Uo[l],h=e.direction[E]>=0;let u,p;h?(u=ut(c),p=It(c,n)):(u=It(c,n),p=ut(c));const F=Ut(u,i,e,bi)?si(u,s,t,e):null;if(F){const g=F.point[E];if(h?g<=i[p+l]:g>=i[p+l+3])return F}const m=Ut(p,i,e,bi)?si(p,s,t,e):null;return F&&m?F.distance<=m.distance?F:m:F||m||null}}const Qe=new C.Box3,$t=new Rt,Kt=new Rt,pe=new C.Matrix4,vi=new ot,je=new ot;function bo(c,s,t,e){X.setBuffer(c._roots[s]);const i=ii(0,c,t,e);return X.clearBuffer(),i}function ii(c,s,t,e,i=null){const{float32Array:o,uint16Array:n,uint32Array:r}=X;let a=c*2;if(i===null&&(t.boundingBox||t.computeBoundingBox(),vi.set(t.boundingBox.min,t.boundingBox.max,e),i=vi),ct(a,n)){const E=s.geometry,d=E.index,h=E.attributes.position,u=t.index,p=t.attributes.position,A=lt(c,r),F=dt(a,n);if(pe.copy(e).invert(),t.boundsTree)return q(c,o,je),je.matrix.copy(pe),je.needsUpdate=!0,t.boundsTree.shapecast({intersectsBounds:m=>je.intersectsBox(m),intersectsTriangle:m=>{m.a.applyMatrix4(e),m.b.applyMatrix4(e),m.c.applyMatrix4(e),m.needsUpdate=!0;for(let g=A,f=F+A;g<f;g++)if(J(Kt,3*s.resolveTriangleIndex(g),d,h),Kt.needsUpdate=!0,m.intersectsTriangle(Kt))return!0;return!1}});for(let T=A,m=F+A;T<m;T++){const g=s.resolveTriangleIndex(T);J($t,3*g,d,h),$t.a.applyMatrix4(pe),$t.b.applyMatrix4(pe),$t.c.applyMatrix4(pe),$t.needsUpdate=!0;for(let f=0,R=u.count;f<R;f+=3)if(J(Kt,f,u,p),Kt.needsUpdate=!0,$t.intersectsTriangle(Kt))return!0}}else{const E=c+8,d=r[c+6];return q(E,o,Qe),!!(i.intersectsBox(Qe)&&ii(E,s,t,e,i)||(q(d,o,Qe),i.intersectsBox(Qe)&&ii(d,s,t,e,i)))}}const qe=new C.Matrix4,bs=new ot,Ce=new ot,vo=new C.Vector3,Bo=new C.Vector3,Vo=new C.Vector3,Yo=new C.Vector3;function Go(c,s,t,e={},i={},o=0,n=1/0){s.boundingBox||s.computeBoundingBox(),bs.set(s.boundingBox.min,s.boundingBox.max,t),bs.needsUpdate=!0;const r=c.geometry,a=r.attributes.position,l=r.index,E=s.attributes.position,d=s.index,h=Et.getPrimitive(),u=Et.getPrimitive();let p=vo,A=Bo,F=null,T=null;i&&(F=Vo,T=Yo);let m=1/0,g=null,f=null;return qe.copy(t).invert(),Ce.matrix.copy(qe),c.shapecast({boundsTraverseOrder:R=>bs.distanceToBox(R),intersectsBounds:(R,O,_)=>_<m&&_<n?(O&&(Ce.min.copy(R.min),Ce.max.copy(R.max),Ce.needsUpdate=!0),!0):!1,intersectsRange:(R,O)=>{if(s.boundsTree){const _=s.boundsTree;return _.shapecast({boundsTraverseOrder:y=>Ce.distanceToBox(y),intersectsBounds:(y,N,P)=>P<m&&P<n,intersectsRange:(y,N)=>{for(let P=y,w=y+N;P<w;P++){const M=_.resolveTriangleIndex(P);J(u,3*M,d,E),u.a.applyMatrix4(t),u.b.applyMatrix4(t),u.c.applyMatrix4(t),u.needsUpdate=!0;for(let U=R,x=R+O;U<x;U++){const v=c.resolveTriangleIndex(U);J(h,3*v,l,a),h.needsUpdate=!0;const z=h.distanceToTriangle(u,p,F);if(z<m&&(A.copy(p),T&&T.copy(F),m=z,g=U,f=P),z<o)return!0}}}})}else{const _=le(s);for(let y=0,N=_;y<N;y++){J(u,3*y,d,E),u.a.applyMatrix4(t),u.b.applyMatrix4(t),u.c.applyMatrix4(t),u.needsUpdate=!0;for(let P=R,w=R+O;P<w;P++){const M=c.resolveTriangleIndex(P);J(h,3*M,l,a),h.needsUpdate=!0;const U=h.distanceToTriangle(u,p,F);if(U<m&&(A.copy(p),T&&T.copy(F),m=U,g=P,f=y),U<o)return!0}}}}}),Et.releasePrimitive(h),Et.releasePrimitive(u),m===1/0?null:(e.point?e.point.copy(A):e.point=A.clone(),e.distance=m,e.faceIndex=g,i&&(i.point?i.point.copy(T):i.point=T.clone(),i.point.applyMatrix4(qe),A.applyMatrix4(qe),i.distance=A.sub(i.point).length(),i.faceIndex=f),e)}function zo(){return typeof SharedArrayBuffer<"u"}const ye=new X.constructor,ls=new X.constructor,Mt=new Ci(()=>new C.Box3),Jt=new C.Box3,te=new C.Box3,vs=new C.Box3,Bs=new C.Box3;let Vs=!1;function Ho(c,s,t,e){if(Vs)throw new Error("MeshBVH: Recursive calls to bvhcast not supported.");Vs=!0;const i=c._roots,o=s._roots;let n,r=0,a=0;const l=new C.Matrix4().copy(t).invert();for(let E=0,d=i.length;E<d;E++){ye.setBuffer(i[E]),a=0;const h=Mt.getPrimitive();q(0,ye.float32Array,h),h.applyMatrix4(l);for(let u=0,p=o.length;u<p&&(ls.setBuffer(o[E]),n=pt(0,0,t,l,e,r,a,0,0,h),ls.clearBuffer(),a+=o[u].length,!n);u++);if(Mt.releasePrimitive(h),ye.clearBuffer(),r+=i[E].length,n)break}return Vs=!1,n}function pt(c,s,t,e,i,o=0,n=0,r=0,a=0,l=null,E=!1){let d,h;E?(d=ls,h=ye):(d=ye,h=ls);const u=d.float32Array,p=d.uint32Array,A=d.uint16Array,F=h.float32Array,T=h.uint32Array,m=h.uint16Array,g=c*2,f=s*2,R=ct(g,A),O=ct(f,m);let _=!1;if(O&&R)E?_=i(lt(s,T),dt(s*2,m),lt(c,p),dt(c*2,A),a,n+s,r,o+c):_=i(lt(c,p),dt(c*2,A),lt(s,T),dt(s*2,m),r,o+c,a,n+s);else if(O){const y=Mt.getPrimitive();q(s,F,y),y.applyMatrix4(t);const N=ut(c),P=It(c,p);q(N,u,Jt),q(P,u,te);const w=y.intersectsBox(Jt),M=y.intersectsBox(te);_=w&&pt(s,N,e,t,i,n,o,a,r+1,y,!E)||M&&pt(s,P,e,t,i,n,o,a,r+1,y,!E),Mt.releasePrimitive(y)}else{const y=ut(s),N=It(s,T);q(y,F,vs),q(N,F,Bs);const P=l.intersectsBox(vs),w=l.intersectsBox(Bs);if(P&&w)_=pt(c,y,t,e,i,o,n,r,a+1,l,E)||pt(c,N,t,e,i,o,n,r,a+1,l,E);else if(P)if(R)_=pt(c,y,t,e,i,o,n,r,a+1,l,E);else{const M=Mt.getPrimitive();M.copy(vs).applyMatrix4(t);const U=ut(c),x=It(c,p);q(U,u,Jt),q(x,u,te);const v=M.intersectsBox(Jt),z=M.intersectsBox(te);_=v&&pt(y,U,e,t,i,n,o,a,r+1,M,!E)||z&&pt(y,x,e,t,i,n,o,a,r+1,M,!E),Mt.releasePrimitive(M)}else if(w)if(R)_=pt(c,N,t,e,i,o,n,r,a+1,l,E);else{const M=Mt.getPrimitive();M.copy(Bs).applyMatrix4(t);const U=ut(c),x=It(c,p);q(U,u,Jt),q(x,u,te);const v=M.intersectsBox(Jt),z=M.intersectsBox(te);_=v&&pt(N,U,e,t,i,n,o,a,r+1,M,!E)||z&&pt(N,x,e,t,i,n,o,a,r+1,M,!E),Mt.releasePrimitive(M)}}return _}const $e=new ot,Bi=new C.Box3;class Ti{static serialize(s,t={}){t={cloneBuffers:!0,...t};const e=s.geometry,i=s._roots,o=s._indirectBuffer,n=e.getIndex();let r;return t.cloneBuffers?r={roots:i.map(a=>a.slice()),index:n.array.slice(),indirectBuffer:o?o.slice():null}:r={roots:i,index:n.array,indirectBuffer:o},r}static deserialize(s,t,e={}){e={setIndex:!0,indirect:!!s.indirectBuffer,...e};const{index:i,roots:o,indirectBuffer:n}=s,r=new Ti(t,{...e,[Ms]:!0});if(r._roots=o,r._indirectBuffer=n||null,e.setIndex){const a=t.getIndex();if(a===null){const l=new C.BufferAttribute(s.index,1,!1);t.setIndex(l)}else a.array!==i&&(a.array.set(i),a.needsUpdate=!0)}return r}get indirect(){return!!this._indirectBuffer}constructor(s,t={}){if(s.isBufferGeometry){if(s.index&&s.index.isInterleavedBufferAttribute)throw new Error("MeshBVH: InterleavedBufferAttribute is not supported for the index attribute.")}else throw new Error("MeshBVH: Only BufferGeometries are supported.");if(t=Object.assign({strategy:an,maxDepth:40,maxLeafTris:10,verbose:!0,useSharedArrayBuffer:!1,setBoundingBox:!0,onProgress:null,indirect:!1,[Ms]:!1},t),t.useSharedArrayBuffer&&!zo())throw new Error("MeshBVH: SharedArrayBuffer is not available.");this.geometry=s,this._roots=null,this._indirectBuffer=null,t[Ms]||(oo(this,t),!s.boundingBox&&t.setBoundingBox&&(s.boundingBox=this.getBoundingBox(new C.Box3)));const{_indirectBuffer:e}=this;this.resolveTriangleIndex=t.indirect?i=>e[i]:i=>i}refit(s=null){return(this.indirect?wo:mo)(this,s)}traverse(s,t=0){const e=this._roots[t],i=new Uint32Array(e),o=new Uint16Array(e);n(0);function n(r,a=0){const l=r*2,E=o[l+15]===Fs;if(E){const d=i[r+6],h=o[l+14];s(a,E,new Float32Array(e,r*4,6),d,h)}else{const d=r+rs/4,h=i[r+6],u=i[r+7];s(a,E,new Float32Array(e,r*4,6),u)||(n(d,a+1),n(h,a+1))}}}raycast(s,t=C.FrontSide){const e=this._roots,i=this.geometry,o=[],n=t.isMaterial,r=Array.isArray(t),a=i.groups,l=n?t.side:t,E=this.indirect?Do:go;for(let d=0,h=e.length;d<h;d++){const u=r?t[a[d].materialIndex].side:l,p=o.length;if(E(this,d,u,s,o),r){const A=a[d].materialIndex;for(let F=p,T=o.length;F<T;F++)o[F].face.materialIndex=A}}return o}raycastFirst(s,t=C.FrontSide){const e=this._roots,i=this.geometry,o=t.isMaterial,n=Array.isArray(t);let r=null;const a=i.groups,l=o?t.side:t,E=this.indirect?xo:So;for(let d=0,h=e.length;d<h;d++){const u=n?t[a[d].materialIndex].side:l,p=E(this,d,u,s);p!=null&&(r==null||p.distance<r.distance)&&(r=p,n&&(p.face.materialIndex=a[d].materialIndex))}return r}intersectsGeometry(s,t){let e=!1;const i=this._roots,o=this.indirect?bo:_o;for(let n=0,r=i.length;n<r&&(e=o(this,n,s,t),!e);n++);return e}shapecast(s){const t=Et.getPrimitive(),e=this.indirect?Fo:To;let{boundsTraverseOrder:i,intersectsBounds:o,intersectsRange:n,intersectsTriangle:r}=s;if(n&&r){const d=n;n=(h,u,p,A,F)=>d(h,u,p,A,F)?!0:e(h,u,this,r,p,A,t)}else n||(r?n=(d,h,u,p)=>e(d,h,this,r,u,p,t):n=(d,h,u)=>u);let a=!1,l=0;const E=this._roots;for(let d=0,h=E.length;d<h;d++){const u=E[d];if(a=Eo(this,d,o,n,i,l),a)break;l+=u.byteLength}return Et.releasePrimitive(t),a}bvhcast(s,t,e){let{intersectsRanges:i,intersectsTriangles:o}=e;const n=Et.getPrimitive(),r=this.geometry.index,a=this.geometry.attributes.position,l=this.indirect?p=>{const A=this.resolveTriangleIndex(p);J(n,A*3,r,a)}:p=>{J(n,p*3,r,a)},E=Et.getPrimitive(),d=s.geometry.index,h=s.geometry.attributes.position,u=s.indirect?p=>{const A=s.resolveTriangleIndex(p);J(E,A*3,d,h)}:p=>{J(E,p*3,d,h)};if(o){const p=(A,F,T,m,g,f,R,O)=>{for(let _=T,y=T+m;_<y;_++){u(_),E.a.applyMatrix4(t),E.b.applyMatrix4(t),E.c.applyMatrix4(t),E.needsUpdate=!0;for(let N=A,P=A+F;N<P;N++)if(l(N),n.needsUpdate=!0,o(n,E,N,_,g,f,R,O))return!0}return!1};if(i){const A=i;i=function(F,T,m,g,f,R,O,_){return A(F,T,m,g,f,R,O,_)?!0:p(F,T,m,g,f,R,O,_)}}else i=p}return Ho(this,s,t,i)}intersectsBox(s,t){return $e.set(s.min,s.max,t),$e.needsUpdate=!0,this.shapecast({intersectsBounds:e=>$e.intersectsBox(e),intersectsTriangle:e=>$e.intersectsTriangle(e)})}intersectsSphere(s){return this.shapecast({intersectsBounds:t=>s.intersectsBox(t),intersectsTriangle:t=>t.intersectsSphere(s)})}closestPointToGeometry(s,t,e={},i={},o=0,n=1/0){return(this.indirect?Go:Mo)(this,s,t,e,i,o,n)}closestPointToPoint(s,t={},e=0,i=1/0){return uo(this,s,t,e,i)}getBoundingBox(s){return s.makeEmpty(),this._roots.forEach(e=>{q(0,new Float32Array(e),Bi),s.union(Bi)}),s}}function Vi(c,s,t){return c===null||(c.point.applyMatrix4(s.matrixWorld),c.distance=c.point.distanceTo(t.ray.origin),c.object=s,c.distance<t.near||c.distance>t.far)?null:c}const Ys=new C.Ray,Yi=new C.Matrix4,ko=C.Mesh.prototype.raycast;function Wo(c,s){if(this.geometry.boundsTree){if(this.material===void 0)return;Yi.copy(this.matrixWorld).invert(),Ys.copy(c.ray).applyMatrix4(Yi);const t=this.geometry.boundsTree;if(c.firstHitOnly===!0){const e=Vi(t.raycastFirst(Ys,this.material),this,c);e&&s.push(e)}else{const e=t.raycast(Ys,this.material);for(let i=0,o=e.length;i<o;i++){const n=Vi(e[i],this,c);n&&s.push(n)}}}else ko.call(this,c,s)}function Xo(c){return this.boundsTree=new Ti(this,c),this.boundsTree}function Zo(){this.boundsTree=null}class D{constructor(){I(this,"trigger",s=>{const t=this.handlers.slice(0);for(const e of t)e(s)});I(this,"handlers",[])}add(s){this.handlers.push(s)}remove(s){this.handlers=this.handlers.filter(t=>t!==s)}reset(){this.handlers.length=0}}class En{constructor(){I(this,"trigger",async s=>{const t=this.handlers.slice(0);for(const e of t)await e(s)});I(this,"handlers",[])}add(s){this.handlers.push(s)}remove(s){this.handlers=this.handlers.filter(t=>t!==s)}reset(){this.handlers.length=0}}class Os{constructor(s){I(this,"isDisposeable",()=>"dispose"in this&&"onDisposed"in this);I(this,"isResizeable",()=>"resize"in this&&"getSize"in this);I(this,"isUpdateable",()=>"onAfterUpdate"in this&&"onBeforeUpdate"in this&&"update"in this);I(this,"isHideable",()=>"visible"in this);I(this,"isConfigurable",()=>"setup"in this&&"config"in this&&"onSetup"in this);this.components=s}}class tt extends Os{}class Ss extends Os{constructor(t){super(t);I(this,"worlds",new Map);I(this,"onWorldChanged",new D);I(this,"currentWorld",null);this.onWorldChanged.add(({world:e,action:i})=>{i==="removed"&&this.worlds.delete(e.uuid)})}}class dn extends Ss{constructor(){super(...arguments);I(this,"hasCameraControls",()=>"controls"in this)}}class un extends Ss{constructor(){super(...arguments);I(this,"onAfterUpdate",new D);I(this,"onBeforeUpdate",new D);I(this,"onDisposed",new D);I(this,"onResize",new D);I(this,"onClippingPlanesUpdated",new D);I(this,"clippingPlanes",[])}updateClippingPlanes(){this.onClippingPlanesUpdated.trigger()}setPlane(t,e,i){e.isLocal=i;const o=this.clippingPlanes.indexOf(e);t&&o===-1?this.clippingPlanes.push(e):!t&&o>-1&&this.clippingPlanes.splice(o,1),this.three.clippingPlanes=this.clippingPlanes.filter(n=>!n.isLocal)}}const Ne=class Ne extends tt{constructor(t){super(t);I(this,"_disposedComponents",new Set);I(this,"enabled",!0);t.add(Ne.uuid,this)}get(){return this._disposedComponents}destroy(t,e=!0,i=!0){t.removeFromParent();const o=t;o.dispose&&o.dispose(),this.disposeGeometryAndMaterials(t,e),i&&o.children&&o.children.length&&this.disposeChildren(o),t.children.length=0}disposeGeometry(t){const e=t;e.boundsTree&&e.disposeBoundsTree(),t.dispose()}disposeGeometryAndMaterials(t,e){const i=t;i.geometry&&this.disposeGeometry(i.geometry),e&&i.material&&Ne.disposeMaterial(i),i.material=[],i.geometry=null}disposeChildren(t){for(const e of t.children)this.destroy(e)}static disposeMaterial(t){if(t.material)if(Array.isArray(t.material))for(const e of t.material)e.dispose();else t.material.dispose()}};I(Ne,"uuid","76e9cd8e-ad8f-4753-9ef6-cbc60f7247fe");let yt=Ne;class In extends Ss{constructor(t){super(t);I(this,"onDisposed",new D)}dispose(){const t=this.components.get(yt);for(const e of this.three.children){const i=e;i.geometry&&t.destroy(i)}this.three.children=[],this.onDisposed.trigger(),this.onDisposed.reset()}}const as=0,Qo=1,jo=new C.Vector3,Gi=new C.Line3,Gs=new C.Plane,zi=new C.Vector3,Ke=new C.Triangle;class qo{constructor(){this.tolerance=-1,this.faces=[],this.newFaces=[],this.assigned=new Hi,this.unassigned=new Hi,this.vertices=[]}setFromPoints(s){if(s.length>=4){this.makeEmpty();for(let t=0,e=s.length;t<e;t++)this.vertices.push(new $o(s[t]));this.compute()}return this}setFromObject(s){const t=[];return s.updateMatrixWorld(!0),s.traverse(function(e){const i=e.geometry;if(i!==void 0){const o=i.attributes.position;if(o!==void 0)for(let n=0,r=o.count;n<r;n++){const a=new C.Vector3;a.fromBufferAttribute(o,n).applyMatrix4(e.matrixWorld),t.push(a)}}}),this.setFromPoints(t)}containsPoint(s){const t=this.faces;for(let e=0,i=t.length;e<i;e++)if(t[e].distanceToPoint(s)>this.tolerance)return!1;return!0}intersectRay(s,t){const e=this.faces;let i=-1/0,o=1/0;for(let n=0,r=e.length;n<r;n++){const a=e[n],l=a.distanceToPoint(s.origin),E=a.normal.dot(s.direction);if(l>0&&E>=0)return null;const d=E!==0?-l/E:0;if(!(d<=0)&&(E>0?o=Math.min(d,o):i=Math.max(d,i),i>o))return null}return i!==-1/0?s.at(i,t):s.at(o,t),t}intersectsRay(s){return this.intersectRay(s,jo)!==null}makeEmpty(){return this.faces=[],this.vertices=[],this}addVertexToFace(s,t){return s.face=t,t.outside===null?this.assigned.append(s):this.assigned.insertBefore(t.outside,s),t.outside=s,this}removeVertexFromFace(s,t){return s===t.outside&&(s.next!==null&&s.next.face===t?t.outside=s.next:t.outside=null),this.assigned.remove(s),this}removeAllVerticesFromFace(s){if(s.outside!==null){const t=s.outside;let e=s.outside;for(;e.next!==null&&e.next.face===s;)e=e.next;return this.assigned.removeSubList(t,e),t.prev=e.next=null,s.outside=null,t}}deleteFaceVertices(s,t){const e=this.removeAllVerticesFromFace(s);if(e!==void 0)if(t===void 0)this.unassigned.appendChain(e);else{let i=e;do{const o=i.next;t.distanceToPoint(i.point)>this.tolerance?this.addVertexToFace(i,t):this.unassigned.append(i),i=o}while(i!==null)}return this}resolveUnassignedPoints(s){if(this.unassigned.isEmpty()===!1){let t=this.unassigned.first();do{const e=t.next;let i=this.tolerance,o=null;for(let n=0;n<s.length;n++){const r=s[n];if(r.mark===as){const a=r.distanceToPoint(t.point);if(a>i&&(i=a,o=r),i>1e3*this.tolerance)break}}o!==null&&this.addVertexToFace(t,o),t=e}while(t!==null)}return this}computeExtremes(){const s=new C.Vector3,t=new C.Vector3,e=[],i=[];for(let o=0;o<3;o++)e[o]=i[o]=this.vertices[0];s.copy(this.vertices[0].point),t.copy(this.vertices[0].point);for(let o=0,n=this.vertices.length;o<n;o++){const r=this.vertices[o],a=r.point;for(let l=0;l<3;l++)a.getComponent(l)<s.getComponent(l)&&(s.setComponent(l,a.getComponent(l)),e[l]=r);for(let l=0;l<3;l++)a.getComponent(l)>t.getComponent(l)&&(t.setComponent(l,a.getComponent(l)),i[l]=r)}return this.tolerance=3*Number.EPSILON*(Math.max(Math.abs(s.x),Math.abs(t.x))+Math.max(Math.abs(s.y),Math.abs(t.y))+Math.max(Math.abs(s.z),Math.abs(t.z))),{min:e,max:i}}computeInitialHull(){const s=this.vertices,t=this.computeExtremes(),e=t.min,i=t.max;let o=0,n=0;for(let h=0;h<3;h++){const u=i[h].point.getComponent(h)-e[h].point.getComponent(h);u>o&&(o=u,n=h)}const r=e[n],a=i[n];let l,E;o=0,Gi.set(r.point,a.point);for(let h=0,u=this.vertices.length;h<u;h++){const p=s[h];if(p!==r&&p!==a){Gi.closestPointToPoint(p.point,!0,zi);const A=zi.distanceToSquared(p.point);A>o&&(o=A,l=p)}}o=-1,Gs.setFromCoplanarPoints(r.point,a.point,l.point);for(let h=0,u=this.vertices.length;h<u;h++){const p=s[h];if(p!==r&&p!==a&&p!==l){const A=Math.abs(Gs.distanceToPoint(p.point));A>o&&(o=A,E=p)}}const d=[];if(Gs.distanceToPoint(E.point)<0){d.push(Tt.create(r,a,l),Tt.create(E,a,r),Tt.create(E,l,a),Tt.create(E,r,l));for(let h=0;h<3;h++){const u=(h+1)%3;d[h+1].getEdge(2).setTwin(d[0].getEdge(u)),d[h+1].getEdge(1).setTwin(d[u+1].getEdge(0))}}else{d.push(Tt.create(r,l,a),Tt.create(E,r,a),Tt.create(E,a,l),Tt.create(E,l,r));for(let h=0;h<3;h++){const u=(h+1)%3;d[h+1].getEdge(2).setTwin(d[0].getEdge((3-h)%3)),d[h+1].getEdge(0).setTwin(d[u+1].getEdge(1))}}for(let h=0;h<4;h++)this.faces.push(d[h]);for(let h=0,u=s.length;h<u;h++){const p=s[h];if(p!==r&&p!==a&&p!==l&&p!==E){o=this.tolerance;let A=null;for(let F=0;F<4;F++){const T=this.faces[F].distanceToPoint(p.point);T>o&&(o=T,A=this.faces[F])}A!==null&&this.addVertexToFace(p,A)}}return this}reindexFaces(){const s=[];for(let t=0;t<this.faces.length;t++){const e=this.faces[t];e.mark===as&&s.push(e)}return this.faces=s,this}nextVertexToAdd(){if(this.assigned.isEmpty()===!1){let s,t=0;const e=this.assigned.first().face;let i=e.outside;do{const o=e.distanceToPoint(i.point);o>t&&(t=o,s=i),i=i.next}while(i!==null&&i.face===e);return s}}computeHorizon(s,t,e,i){this.deleteFaceVertices(e),e.mark=Qo;let o;t===null?o=t=e.getEdge(0):o=t.next;do{const n=o.twin,r=n.face;r.mark===as&&(r.distanceToPoint(s)>this.tolerance?this.computeHorizon(s,n,r,i):i.push(o)),o=o.next}while(o!==t);return this}addAdjoiningFace(s,t){const e=Tt.create(s,t.tail(),t.head());return this.faces.push(e),e.getEdge(-1).setTwin(t.twin),e.getEdge(0)}addNewFaces(s,t){this.newFaces=[];let e=null,i=null;for(let o=0;o<t.length;o++){const n=t[o],r=this.addAdjoiningFace(s,n);e===null?e=r:r.next.setTwin(i),this.newFaces.push(r.face),i=r}return e.next.setTwin(i),this}addVertexToHull(s){const t=[];return this.unassigned.clear(),this.removeVertexFromFace(s,s.face),this.computeHorizon(s.point,null,s.face,t),this.addNewFaces(s,t),this.resolveUnassignedPoints(this.newFaces),this}cleanup(){return this.assigned.clear(),this.unassigned.clear(),this.newFaces=[],this}compute(){let s;for(this.computeInitialHull();(s=this.nextVertexToAdd())!==void 0;)this.addVertexToHull(s);return this.reindexFaces(),this.cleanup(),this}}class Tt{constructor(){this.normal=new C.Vector3,this.midpoint=new C.Vector3,this.area=0,this.constant=0,this.outside=null,this.mark=as,this.edge=null}static create(s,t,e){const i=new Tt,o=new zs(s,i),n=new zs(t,i),r=new zs(e,i);return o.next=r.prev=n,n.next=o.prev=r,r.next=n.prev=o,i.edge=o,i.compute()}getEdge(s){let t=this.edge;for(;s>0;)t=t.next,s--;for(;s<0;)t=t.prev,s++;return t}compute(){const s=this.edge.tail(),t=this.edge.head(),e=this.edge.next.head();return Ke.set(s.point,t.point,e.point),Ke.getNormal(this.normal),Ke.getMidpoint(this.midpoint),this.area=Ke.getArea(),this.constant=this.normal.dot(this.midpoint),this}distanceToPoint(s){return this.normal.dot(s)-this.constant}}class zs{constructor(s,t){this.vertex=s,this.prev=null,this.next=null,this.twin=null,this.face=t}head(){return this.vertex}tail(){return this.prev?this.prev.vertex:null}length(){const s=this.head(),t=this.tail();return t!==null?t.point.distanceTo(s.point):-1}lengthSquared(){const s=this.head(),t=this.tail();return t!==null?t.point.distanceToSquared(s.point):-1}setTwin(s){return this.twin=s,s.twin=this,this}}class $o{constructor(s){this.point=s,this.prev=null,this.next=null,this.face=null}}class Hi{constructor(){this.head=null,this.tail=null}first(){return this.head}last(){return this.tail}clear(){return this.head=this.tail=null,this}insertBefore(s,t){return t.prev=s.prev,t.next=s,t.prev===null?this.head=t:t.prev.next=t,s.prev=t,this}insertAfter(s,t){return t.prev=s,t.next=s.next,t.next===null?this.tail=t:t.next.prev=t,s.next=t,this}append(s){return this.head===null?this.head=s:this.tail.next=s,s.prev=this.tail,s.next=null,this.tail=s,this}appendChain(s){for(this.head===null?this.head=s:this.tail.next=s,s.prev=this.tail;s.next!==null;)s=s.next;return this.tail=s,this}remove(s){return s.prev===null?this.head=s.next:s.prev.next=s.next,s.next===null?this.tail=s.prev:s.next.prev=s.prev,this}removeSubList(s,t){return s.prev===null?this.head=t.next:s.prev.next=t.next,t.next===null?this.tail=s.prev:t.next.prev=s.prev,this}isEmpty(){return this.head===null}}const ni=[2,2,1],oi=[1,0,0];function Ot(c,s){return c*3+s}function Ko(c){const s=c.elements;let t=0;for(let e=0;e<9;e++)t+=s[e]*s[e];return Math.sqrt(t)}function Jo(c){const s=c.elements;let t=0;for(let e=0;e<3;e++){const i=s[Ot(ni[e],oi[e])];t+=2*i*i}return Math.sqrt(t)}function tr(c,s){let t=0,e=1;const i=c.elements;for(let l=0;l<3;l++){const E=Math.abs(i[Ot(ni[l],oi[l])]);E>t&&(t=E,e=l)}let o=1,n=0;const r=oi[e],a=ni[e];if(Math.abs(i[Ot(a,r)])>Number.EPSILON){const l=i[Ot(a,a)],E=i[Ot(r,r)],d=i[Ot(a,r)],h=(l-E)/2/d;let u;h<0?u=-1/(-h+Math.sqrt(1+h*h)):u=1/(h+Math.sqrt(1+h*h)),o=1/Math.sqrt(1+u*u),n=u*o}return s.identity(),s.elements[Ot(r,r)]=o,s.elements[Ot(a,a)]=o,s.elements[Ot(a,r)]=n,s.elements[Ot(r,a)]=-n,s}function er(c,s){let t=0,e=0;const i=10;s.unitary.identity(),s.diagonal.copy(c);const o=s.unitary,n=s.diagonal,r=new S.Matrix3,a=new S.Matrix3,l=Number.EPSILON*Ko(n);for(;e<i&&Jo(n)>l;)tr(n,r),a.copy(r).transpose(),n.multiply(r),n.premultiply(a),o.multiply(r),++t>2&&(e++,t=0);return s}function fn(c){const s=[];for(let st=0;st<c.length-2;st+=3){const Bt=c[st],K=c[st+1],kt=c[st+2];s.push(new S.Vector3(Bt,K,kt))}const t=new qo;t.setFromPoints(s);const e={unitary:new S.Matrix3,diagonal:new S.Matrix3},i=t.faces,o=[],n=[];for(let st=0,Bt=i.length;st<Bt;st++){const K=i[st];let kt=K.edge;o.length=0;do o.push(kt),kt=kt.next;while(kt!==K.edge);const vn=o.length-2;for(let be=1,Bn=vn;be<=Bn;be++){const ys=o[0].vertex,Ns=o[be+0].vertex,Ls=o[be+1].vertex;n.push(ys.point.x,ys.point.y,ys.point.z),n.push(Ns.point.x,Ns.point.y,Ns.point.z),n.push(Ls.point.x,Ls.point.y,Ls.point.z)}}const r=new S.Vector3,a=new S.Vector3,l=new S.Vector3,E=new S.Vector3,d=new S.Vector3,h=new S.Vector3,u=new S.Vector3,p=new S.Vector3;let A=0,F=0,T=0,m=0,g=0,f=0,R=0;for(let st=0,Bt=n.length;st<Bt;st+=9){r.fromArray(n,st),a.fromArray(n,st+3),l.fromArray(n,st+6),u.set(0,0,0),u.add(r).add(a).add(l).divideScalar(3),E.subVectors(a,r),d.subVectors(l,r);const K=h.crossVectors(E,d).length()/2;p.add(h.copy(u).multiplyScalar(K)),A+=K,F+=(9*u.x*u.x+r.x*r.x+a.x*a.x+l.x*l.x)*(K/12),T+=(9*u.x*u.y+r.x*r.y+a.x*a.y+l.x*l.y)*(K/12),m+=(9*u.x*u.z+r.x*r.z+a.x*a.z+l.x*l.z)*(K/12),g+=(9*u.y*u.y+r.y*r.y+a.y*a.y+l.y*l.y)*(K/12),f+=(9*u.y*u.z+r.y*r.z+a.y*a.z+l.y*l.z)*(K/12),R+=(9*u.z*u.z+r.z*r.z+a.z*a.z+l.z*l.z)*(K/12)}p.divideScalar(A),F/=A,T/=A,m/=A,g/=A,f/=A,R/=A,F-=p.x*p.x,T-=p.x*p.y,m-=p.x*p.z,g-=p.y*p.y,f-=p.y*p.z,R-=p.z*p.z;const O=new S.Matrix3;O.elements[0]=F,O.elements[1]=T,O.elements[2]=m,O.elements[3]=T,O.elements[4]=g,O.elements[5]=f,O.elements[6]=m,O.elements[7]=f,O.elements[8]=R,er(O,e);const _=e.unitary,y=new S.Vector3,N=new S.Vector3,P=new S.Vector3;_.extractBasis(y,N,P);let w=-1/0,M=-1/0,U=-1/0,x=1/0,v=1/0,z=1/0;for(let st=0,Bt=s.length;st<Bt;st++){const K=s[st];w=Math.max(y.dot(K),w),M=Math.max(N.dot(K),M),U=Math.max(P.dot(K),U),x=Math.min(y.dot(K),x),v=Math.min(N.dot(K),v),z=Math.min(P.dot(K),z)}y.multiplyScalar(.5*(x+w)),N.multiplyScalar(.5*(v+M)),P.multiplyScalar(.5*(z+U));const j=new S.Vector3,et=new S.Vector3,Z=new S.Matrix3;j.add(y).add(N).add(P),et.x=w-x,et.y=M-v,et.z=U-z,et.multiplyScalar(.5),Z.copy(_);const{x:xt,y:bt,z:vt}=et,xe=new S.Matrix4;xe.makeScale(xt*2,bt*2,vt*2);const he=new S.Matrix4;he.makeTranslation(-xt,-bt,-vt);const Ai=new S.Matrix4;Ai.makeTranslation(j.x,j.y,j.z);const Fi=new S.Matrix4;Fi.setFromMatrix3(Z);const Ee=new S.Matrix4;return Ee.multiply(Ai),Ee.multiply(Fi),Ee.multiply(he),Ee.multiply(xe),{center:j,halfSizes:et,rotation:Z,transformation:Ee}}function pn(c,s,t){const e=[c[0]-s[0],c[1]-s[1],c[2]-s[2]];return t[0]*e[0]+t[1]*e[1]+t[2]*e[2]>0}class ri{static isTransparent(s){return s.transparent&&s.opacity<1}}const $=class ${static create(){const s=Math.random()*4294967295|0,t=Math.random()*4294967295|0,e=Math.random()*4294967295|0,i=Math.random()*4294967295|0;return`${$._lut[s&255]+$._lut[s>>8&255]+$._lut[s>>16&255]+$._lut[s>>24&255]}-${$._lut[t&255]}${$._lut[t>>8&255]}-${$._lut[t>>16&15|64]}${$._lut[t>>24&255]}-${$._lut[e&63|128]}${$._lut[e>>8&255]}-${$._lut[e>>16&255]}${$._lut[e>>24&255]}${$._lut[i&255]}${$._lut[i>>8&255]}${$._lut[i>>16&255]}${$._lut[i>>24&255]}`.toLowerCase()}static validate(s){if(!$._pattern.test(s))throw new Error(`${s} is not a valid UUID v4.
1
+ "use strict";var zn=Object.defineProperty;var Hn=(c,s,t)=>s in c?zn(c,s,{enumerable:!0,configurable:!0,writable:!0,value:t}):c[s]=t;var I=(c,s,t)=>(Hn(c,typeof s!="symbol"?s+"":s,t),t);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const C=require("three"),En=require("@thatopen/fragments"),kn=require("web-ifc");function Ti(c){const s=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(c){for(const t in c)if(t!=="default"){const e=Object.getOwnPropertyDescriptor(c,t);Object.defineProperty(s,t,e.get?e:{enumerable:!0,get:()=>c[t]})}}return s.default=c,Object.freeze(s)}const S=Ti(C),Ut=Ti(En),x=Ti(kn),dn=0,Wn=1,Xn=2,Ni=2,Ds=1.25,Pi=1,as=6*4+4+4,Ss=65535,Zn=Math.pow(2,-24),Us=Symbol("SKIP_GENERATION");function Qn(c){return c.index?c.index.count:c.attributes.position.count}function he(c){return Qn(c)/3}function jn(c,s=ArrayBuffer){return c>65535?new Uint32Array(new s(4*c)):new Uint16Array(new s(2*c))}function qn(c,s){if(!c.index){const t=c.attributes.position.count,e=s.useSharedArrayBuffer?SharedArrayBuffer:ArrayBuffer,i=jn(t,e);c.setIndex(new C.BufferAttribute(i,1));for(let o=0;o<t;o++)i[o]=o}}function un(c){const s=he(c),t=c.drawRange,e=t.start/3,i=(t.start+t.count)/3,o=Math.max(0,e),n=Math.min(s,i)-o;return[{offset:Math.floor(o),count:Math.floor(n)}]}function In(c){if(!c.groups||!c.groups.length)return un(c);const s=[],t=new Set,e=c.drawRange,i=e.start/3,o=(e.start+e.count)/3;for(const r of c.groups){const a=r.start/3,l=(r.start+r.count)/3;t.add(Math.max(i,a)),t.add(Math.min(o,l))}const n=Array.from(t.values()).sort((r,a)=>r-a);for(let r=0;r<n.length-1;r++){const a=n[r],l=n[r+1];s.push({offset:Math.floor(a),count:Math.floor(l-a)})}return s}function $n(c){if(c.groups.length===0)return!1;const s=he(c),t=In(c).sort((o,n)=>o.offset-n.offset),e=t[t.length-1];e.count=Math.min(s-e.offset,e.count);let i=0;return t.forEach(({count:o})=>i+=o),s!==i}function q(c,s,t){return t.min.x=s[c],t.min.y=s[c+1],t.min.z=s[c+2],t.max.x=s[c+3],t.max.y=s[c+4],t.max.z=s[c+5],t}function Kn(c){c[0]=c[1]=c[2]=1/0,c[3]=c[4]=c[5]=-1/0}function Li(c){let s=-1,t=-1/0;for(let e=0;e<3;e++){const i=c[e+3]-c[e];i>t&&(t=i,s=e)}return s}function Mi(c,s){s.set(c)}function wi(c,s,t){let e,i;for(let o=0;o<3;o++){const n=o+3;e=c[o],i=s[o],t[o]=e<i?e:i,e=c[n],i=s[n],t[n]=e>i?e:i}}function Be(c,s,t){for(let e=0;e<3;e++){const i=s[c+2*e],o=s[c+2*e+1],n=i-o,r=i+o;n<t[e]&&(t[e]=n),r>t[e+3]&&(t[e+3]=r)}}function ue(c){const s=c[3]-c[0],t=c[4]-c[1],e=c[5]-c[2];return 2*(s*t+t*e+e*s)}function xs(c,s,t,e,i=null){let o=1/0,n=1/0,r=1/0,a=-1/0,l=-1/0,E=-1/0,d=1/0,h=1/0,u=1/0,p=-1/0,m=-1/0,F=-1/0;const T=i!==null;for(let R=s*6,g=(s+t)*6;R<g;R+=6){const f=c[R+0],A=c[R+1],O=f-A,_=f+A;O<o&&(o=O),_>a&&(a=_),T&&f<d&&(d=f),T&&f>p&&(p=f);const y=c[R+2],N=c[R+3],L=y-N,w=y+N;L<n&&(n=L),w>l&&(l=w),T&&y<h&&(h=y),T&&y>m&&(m=y);const M=c[R+4],U=c[R+5],b=M-U,v=M+U;b<r&&(r=b),v>E&&(E=v),T&&M<u&&(u=M),T&&M>F&&(F=M)}e[0]=o,e[1]=n,e[2]=r,e[3]=a,e[4]=l,e[5]=E,T&&(i[0]=d,i[1]=h,i[2]=u,i[3]=p,i[4]=m,i[5]=F)}function Jn(c,s,t,e){let i=1/0,o=1/0,n=1/0,r=-1/0,a=-1/0,l=-1/0;for(let E=s*6,d=(s+t)*6;E<d;E+=6){const h=c[E+0];h<i&&(i=h),h>r&&(r=h);const u=c[E+2];u<o&&(o=u),u>a&&(a=u);const p=c[E+4];p<n&&(n=p),p>l&&(l=p)}e[0]=i,e[1]=o,e[2]=n,e[3]=r,e[4]=a,e[5]=l}function to(c,s){Kn(s);const t=c.attributes.position,e=c.index?c.index.array:null,i=he(c),o=new Float32Array(i*6),n=t.normalized,r=t.array,a=t.offset||0;let l=3;t.isInterleavedBufferAttribute&&(l=t.data.stride);const E=["getX","getY","getZ"];for(let d=0;d<i;d++){const h=d*3,u=d*6;let p=h+0,m=h+1,F=h+2;e&&(p=e[p],m=e[m],F=e[F]),n||(p=p*l+a,m=m*l+a,F=F*l+a);for(let T=0;T<3;T++){let R,g,f;n?(R=t[E[T]](p),g=t[E[T]](m),f=t[E[T]](F)):(R=r[p+T],g=r[m+T],f=r[F+T]);let A=R;g<A&&(A=g),f<A&&(A=f);let O=R;g>O&&(O=g),f>O&&(O=f);const _=(O-A)/2,y=T*2;o[u+y+0]=A+_,o[u+y+1]=_+(Math.abs(A)+_)*Zn,A<s[T]&&(s[T]=A),O>s[T+3]&&(s[T+3]=O)}}return o}const St=32,eo=(c,s)=>c.candidate-s.candidate,Nt=new Array(St).fill().map(()=>({count:0,bounds:new Float32Array(6),rightCacheBounds:new Float32Array(6),leftCacheBounds:new Float32Array(6),candidate:0})),Ve=new Float32Array(6);function so(c,s,t,e,i,o){let n=-1,r=0;if(o===dn)n=Li(s),n!==-1&&(r=(s[n]+s[n+3])/2);else if(o===Wn)n=Li(c),n!==-1&&(r=io(t,e,i,n));else if(o===Xn){const a=ue(c);let l=Ds*i;const E=e*6,d=(e+i)*6;for(let h=0;h<3;h++){const u=s[h],F=(s[h+3]-u)/St;if(i<St/4){const T=[...Nt];T.length=i;let R=0;for(let f=E;f<d;f+=6,R++){const A=T[R];A.candidate=t[f+2*h],A.count=0;const{bounds:O,leftCacheBounds:_,rightCacheBounds:y}=A;for(let N=0;N<3;N++)y[N]=1/0,y[N+3]=-1/0,_[N]=1/0,_[N+3]=-1/0,O[N]=1/0,O[N+3]=-1/0;Be(f,t,O)}T.sort(eo);let g=i;for(let f=0;f<g;f++){const A=T[f];for(;f+1<g&&T[f+1].candidate===A.candidate;)T.splice(f+1,1),g--}for(let f=E;f<d;f+=6){const A=t[f+2*h];for(let O=0;O<g;O++){const _=T[O];A>=_.candidate?Be(f,t,_.rightCacheBounds):(Be(f,t,_.leftCacheBounds),_.count++)}}for(let f=0;f<g;f++){const A=T[f],O=A.count,_=i-A.count,y=A.leftCacheBounds,N=A.rightCacheBounds;let L=0;O!==0&&(L=ue(y)/a);let w=0;_!==0&&(w=ue(N)/a);const M=Pi+Ds*(L*O+w*_);M<l&&(n=h,l=M,r=A.candidate)}}else{for(let g=0;g<St;g++){const f=Nt[g];f.count=0,f.candidate=u+F+g*F;const A=f.bounds;for(let O=0;O<3;O++)A[O]=1/0,A[O+3]=-1/0}for(let g=E;g<d;g+=6){let O=~~((t[g+2*h]-u)/F);O>=St&&(O=St-1);const _=Nt[O];_.count++,Be(g,t,_.bounds)}const T=Nt[St-1];Mi(T.bounds,T.rightCacheBounds);for(let g=St-2;g>=0;g--){const f=Nt[g],A=Nt[g+1];wi(f.bounds,A.rightCacheBounds,f.rightCacheBounds)}let R=0;for(let g=0;g<St-1;g++){const f=Nt[g],A=f.count,O=f.bounds,y=Nt[g+1].rightCacheBounds;A!==0&&(R===0?Mi(O,Ve):wi(O,Ve,Ve)),R+=A;let N=0,L=0;R!==0&&(N=ue(Ve)/a);const w=i-R;w!==0&&(L=ue(y)/a);const M=Pi+Ds*(N*R+L*w);M<l&&(n=h,l=M,r=f.candidate)}}}}else console.warn(`MeshBVH: Invalid build strategy value ${o} used.`);return{axis:n,pos:r}}function io(c,s,t,e){let i=0;for(let o=s,n=s+t;o<n;o++)i+=c[o*6+e*2];return i/t}class Ye{constructor(){}}function no(c,s,t,e,i,o){let n=e,r=e+i-1;const a=o.pos,l=o.axis*2;for(;;){for(;n<=r&&t[n*6+l]<a;)n++;for(;n<=r&&t[r*6+l]>=a;)r--;if(n<r){for(let E=0;E<3;E++){let d=s[n*3+E];s[n*3+E]=s[r*3+E],s[r*3+E]=d}for(let E=0;E<6;E++){let d=t[n*6+E];t[n*6+E]=t[r*6+E],t[r*6+E]=d}n++,r--}else return n}}function oo(c,s,t,e,i,o){let n=e,r=e+i-1;const a=o.pos,l=o.axis*2;for(;;){for(;n<=r&&t[n*6+l]<a;)n++;for(;n<=r&&t[r*6+l]>=a;)r--;if(n<r){let E=c[n];c[n]=c[r],c[r]=E;for(let d=0;d<6;d++){let h=t[n*6+d];t[n*6+d]=t[r*6+d],t[r*6+d]=h}n++,r--}else return n}}function ro(c,s){const t=(c.index?c.index.count:c.attributes.position.count)/3,e=t>2**16,i=e?4:2,o=s?new SharedArrayBuffer(t*i):new ArrayBuffer(t*i),n=e?new Uint32Array(o):new Uint16Array(o);for(let r=0,a=n.length;r<a;r++)n[r]=r;return n}function ao(c,s){const t=c.geometry,e=t.index?t.index.array:null,i=s.maxDepth,o=s.verbose,n=s.maxLeafTris,r=s.strategy,a=s.onProgress,l=he(t),E=c._indirectBuffer;let d=!1;const h=new Float32Array(6),u=new Float32Array(6),p=to(t,h),m=s.indirect?oo:no,F=[],T=s.indirect?un(t):In(t);if(T.length===1){const f=T[0],A=new Ye;A.boundingData=h,Jn(p,f.offset,f.count,u),g(A,f.offset,f.count,u),F.push(A)}else for(let f of T){const A=new Ye;A.boundingData=new Float32Array(6),xs(p,f.offset,f.count,A.boundingData,u),g(A,f.offset,f.count,u),F.push(A)}return F;function R(f){a&&a(f/l)}function g(f,A,O,_=null,y=0){if(!d&&y>=i&&(d=!0,o&&(console.warn(`MeshBVH: Max depth of ${i} reached when generating BVH. Consider increasing maxDepth.`),console.warn(t))),O<=n||y>=i)return R(A+O),f.offset=A,f.count=O,f;const N=so(f.boundingData,_,p,A,O,r);if(N.axis===-1)return R(A+O),f.offset=A,f.count=O,f;const L=m(E,e,p,A,O,N);if(L===A||L===A+O)R(A+O),f.offset=A,f.count=O;else{f.splitAxis=N.axis;const w=new Ye,M=A,U=L-A;f.left=w,w.boundingData=new Float32Array(6),xs(p,M,U,w.boundingData,u),g(w,M,U,u,y+1);const b=new Ye,v=L,z=O-U;f.right=b,b.boundingData=new Float32Array(6),xs(p,v,z,b.boundingData,u),g(b,v,z,u,y+1)}return f}}function co(c,s){const t=c.geometry;s.indirect&&(c._indirectBuffer=ro(t,s.useSharedArrayBuffer),$n(t)&&!s.verbose&&console.warn('MeshBVH: Provided geometry contains groups that do not fully span the vertex contents while using the "indirect" option. BVH may incorrectly report intersections on unrendered portions of the geometry.')),c._indirectBuffer||qn(t,s);const e=ao(c,s);let i,o,n;const r=[],a=s.useSharedArrayBuffer?SharedArrayBuffer:ArrayBuffer;for(let d=0;d<e.length;d++){const h=e[d];let u=l(h);const p=new a(as*u);i=new Float32Array(p),o=new Uint32Array(p),n=new Uint16Array(p),E(0,h),r.push(p)}c._roots=r;return;function l(d){return d.count?1:1+l(d.left)+l(d.right)}function E(d,h){const u=d/4,p=d/2,m=!!h.count,F=h.boundingData;for(let T=0;T<6;T++)i[u+T]=F[T];if(m){const T=h.offset,R=h.count;return o[u+6]=T,n[p+14]=R,n[p+15]=Ss,d+as}else{const T=h.left,R=h.right,g=h.splitAxis;let f;if(f=E(d+as,T),f/4>Math.pow(2,32))throw new Error("MeshBVH: Cannot store child pointer greater than 32 bits.");return o[u+6]=f/4,f=E(f,R),o[u+7]=g,f}}}class _t{constructor(){this.min=1/0,this.max=-1/0}setFromPointsField(s,t){let e=1/0,i=-1/0;for(let o=0,n=s.length;o<n;o++){const a=s[o][t];e=a<e?a:e,i=a>i?a:i}this.min=e,this.max=i}setFromPoints(s,t){let e=1/0,i=-1/0;for(let o=0,n=t.length;o<n;o++){const r=t[o],a=s.dot(r);e=a<e?a:e,i=a>i?a:i}this.min=e,this.max=i}isSeparated(s){return this.min>s.max||s.min>this.max}}_t.prototype.setFromBox=function(){const c=new C.Vector3;return function(t,e){const i=e.min,o=e.max;let n=1/0,r=-1/0;for(let a=0;a<=1;a++)for(let l=0;l<=1;l++)for(let E=0;E<=1;E++){c.x=i.x*a+o.x*(1-a),c.y=i.y*l+o.y*(1-l),c.z=i.z*E+o.z*(1-E);const d=t.dot(c);n=Math.min(d,n),r=Math.max(d,r)}this.min=n,this.max=r}}();const lo=function(){const c=new C.Vector3,s=new C.Vector3,t=new C.Vector3;return function(i,o,n){const r=i.start,a=c,l=o.start,E=s;t.subVectors(r,l),c.subVectors(i.end,i.start),s.subVectors(o.end,o.start);const d=t.dot(E),h=E.dot(a),u=E.dot(E),p=t.dot(a),F=a.dot(a)*u-h*h;let T,R;F!==0?T=(d*h-p*u)/F:T=0,R=(d+T*h)/u,n.x=T,n.y=R}}(),mi=function(){const c=new C.Vector2,s=new C.Vector3,t=new C.Vector3;return function(i,o,n,r){lo(i,o,c);let a=c.x,l=c.y;if(a>=0&&a<=1&&l>=0&&l<=1){i.at(a,n),o.at(l,r);return}else if(a>=0&&a<=1){l<0?o.at(0,r):o.at(1,r),i.closestPointToPoint(r,!0,n);return}else if(l>=0&&l<=1){a<0?i.at(0,n):i.at(1,n),o.closestPointToPoint(n,!0,r);return}else{let E;a<0?E=i.start:E=i.end;let d;l<0?d=o.start:d=o.end;const h=s,u=t;if(i.closestPointToPoint(d,!0,s),o.closestPointToPoint(E,!0,t),h.distanceToSquared(d)<=u.distanceToSquared(E)){n.copy(h),r.copy(d);return}else{n.copy(E),r.copy(u);return}}}}(),ho=function(){const c=new C.Vector3,s=new C.Vector3,t=new C.Plane,e=new C.Line3;return function(o,n){const{radius:r,center:a}=o,{a:l,b:E,c:d}=n;if(e.start=l,e.end=E,e.closestPointToPoint(a,!0,c).distanceTo(a)<=r||(e.start=l,e.end=d,e.closestPointToPoint(a,!0,c).distanceTo(a)<=r)||(e.start=E,e.end=d,e.closestPointToPoint(a,!0,c).distanceTo(a)<=r))return!0;const m=n.getPlane(t);if(Math.abs(m.distanceToPoint(a))<=r){const T=m.projectPoint(a,s);if(n.containsPoint(T))return!0}return!1}}(),Eo=1e-15;function bs(c){return Math.abs(c)<Eo}class Rt extends C.Triangle{constructor(...s){super(...s),this.isExtendedTriangle=!0,this.satAxes=new Array(4).fill().map(()=>new C.Vector3),this.satBounds=new Array(4).fill().map(()=>new _t),this.points=[this.a,this.b,this.c],this.sphere=new C.Sphere,this.plane=new C.Plane,this.needsUpdate=!0}intersectsSphere(s){return ho(s,this)}update(){const s=this.a,t=this.b,e=this.c,i=this.points,o=this.satAxes,n=this.satBounds,r=o[0],a=n[0];this.getNormal(r),a.setFromPoints(r,i);const l=o[1],E=n[1];l.subVectors(s,t),E.setFromPoints(l,i);const d=o[2],h=n[2];d.subVectors(t,e),h.setFromPoints(d,i);const u=o[3],p=n[3];u.subVectors(e,s),p.setFromPoints(u,i),this.sphere.setFromPoints(this.points),this.plane.setFromNormalAndCoplanarPoint(r,s),this.needsUpdate=!1}}Rt.prototype.closestPointToSegment=function(){const c=new C.Vector3,s=new C.Vector3,t=new C.Line3;return function(i,o=null,n=null){const{start:r,end:a}=i,l=this.points;let E,d=1/0;for(let h=0;h<3;h++){const u=(h+1)%3;t.start.copy(l[h]),t.end.copy(l[u]),mi(t,i,c,s),E=c.distanceToSquared(s),E<d&&(d=E,o&&o.copy(c),n&&n.copy(s))}return this.closestPointToPoint(r,c),E=r.distanceToSquared(c),E<d&&(d=E,o&&o.copy(c),n&&n.copy(r)),this.closestPointToPoint(a,c),E=a.distanceToSquared(c),E<d&&(d=E,o&&o.copy(c),n&&n.copy(a)),Math.sqrt(d)}}();Rt.prototype.intersectsTriangle=function(){const c=new Rt,s=new Array(3),t=new Array(3),e=new _t,i=new _t,o=new C.Vector3,n=new C.Vector3,r=new C.Vector3,a=new C.Vector3,l=new C.Vector3,E=new C.Line3,d=new C.Line3,h=new C.Line3,u=new C.Vector3;function p(m,F,T){const R=m.points;let g=0,f=-1;for(let A=0;A<3;A++){const{start:O,end:_}=E;O.copy(R[A]),_.copy(R[(A+1)%3]),E.delta(n);const y=bs(F.distanceToPoint(O));if(bs(F.normal.dot(n))&&y){T.copy(E),g=2;break}const N=F.intersectLine(E,u);if(!N&&y&&u.copy(O),(N||y)&&!bs(u.distanceTo(_))){if(g<=1)(g===1?T.start:T.end).copy(u),y&&(f=g);else if(g>=2){(f===1?T.start:T.end).copy(u),g=2;break}if(g++,g===2&&f===-1)break}}return g}return function(F,T=null,R=!1){this.needsUpdate&&this.update(),F.isExtendedTriangle?F.needsUpdate&&F.update():(c.copy(F),c.update(),F=c);const g=this.plane,f=F.plane;if(Math.abs(g.normal.dot(f.normal))>1-1e-10){const A=this.satBounds,O=this.satAxes;t[0]=F.a,t[1]=F.b,t[2]=F.c;for(let N=0;N<4;N++){const L=A[N],w=O[N];if(e.setFromPoints(w,t),L.isSeparated(e))return!1}const _=F.satBounds,y=F.satAxes;s[0]=this.a,s[1]=this.b,s[2]=this.c;for(let N=0;N<4;N++){const L=_[N],w=y[N];if(e.setFromPoints(w,s),L.isSeparated(e))return!1}for(let N=0;N<4;N++){const L=O[N];for(let w=0;w<4;w++){const M=y[w];if(o.crossVectors(L,M),e.setFromPoints(o,s),i.setFromPoints(o,t),e.isSeparated(i))return!1}}return T&&(R||console.warn("ExtendedTriangle.intersectsTriangle: Triangles are coplanar which does not support an output edge. Setting edge to 0, 0, 0."),T.start.set(0,0,0),T.end.set(0,0,0)),!0}else{const A=p(this,f,d);if(A===1&&F.containsPoint(d.end))return T&&(T.start.copy(d.end),T.end.copy(d.end)),!0;if(A!==2)return!1;const O=p(F,g,h);if(O===1&&this.containsPoint(h.end))return T&&(T.start.copy(h.end),T.end.copy(h.end)),!0;if(O!==2)return!1;if(d.delta(r),h.delta(a),r.dot(a)<0){let U=h.start;h.start=h.end,h.end=U}const _=d.start.dot(r),y=d.end.dot(r),N=h.start.dot(r),L=h.end.dot(r),w=y<N,M=_<L;return _!==L&&N!==y&&w===M?!1:(T&&(l.subVectors(d.start,h.start),l.dot(r)>0?T.start.copy(d.start):T.start.copy(h.start),l.subVectors(d.end,h.end),l.dot(r)<0?T.end.copy(d.end):T.end.copy(h.end)),!0)}}}();Rt.prototype.distanceToPoint=function(){const c=new C.Vector3;return function(t){return this.closestPointToPoint(t,c),t.distanceTo(c)}}();Rt.prototype.distanceToTriangle=function(){const c=new C.Vector3,s=new C.Vector3,t=["a","b","c"],e=new C.Line3,i=new C.Line3;return function(n,r=null,a=null){const l=r||a?e:null;if(this.intersectsTriangle(n,l))return(r||a)&&(r&&l.getCenter(r),a&&l.getCenter(a)),0;let E=1/0;for(let d=0;d<3;d++){let h;const u=t[d],p=n[u];this.closestPointToPoint(p,c),h=p.distanceToSquared(c),h<E&&(E=h,r&&r.copy(c),a&&a.copy(p));const m=this[u];n.closestPointToPoint(m,c),h=m.distanceToSquared(c),h<E&&(E=h,r&&r.copy(m),a&&a.copy(c))}for(let d=0;d<3;d++){const h=t[d],u=t[(d+1)%3];e.set(this[h],this[u]);for(let p=0;p<3;p++){const m=t[p],F=t[(p+1)%3];i.set(n[m],n[F]),mi(e,i,c,s);const T=c.distanceToSquared(s);T<E&&(E=T,r&&r.copy(c),a&&a.copy(s))}}return Math.sqrt(E)}}();class rt{constructor(s,t,e){this.isOrientedBox=!0,this.min=new C.Vector3,this.max=new C.Vector3,this.matrix=new C.Matrix4,this.invMatrix=new C.Matrix4,this.points=new Array(8).fill().map(()=>new C.Vector3),this.satAxes=new Array(3).fill().map(()=>new C.Vector3),this.satBounds=new Array(3).fill().map(()=>new _t),this.alignedSatBounds=new Array(3).fill().map(()=>new _t),this.needsUpdate=!1,s&&this.min.copy(s),t&&this.max.copy(t),e&&this.matrix.copy(e)}set(s,t,e){this.min.copy(s),this.max.copy(t),this.matrix.copy(e),this.needsUpdate=!0}copy(s){this.min.copy(s.min),this.max.copy(s.max),this.matrix.copy(s.matrix),this.needsUpdate=!0}}rt.prototype.update=function(){return function(){const s=this.matrix,t=this.min,e=this.max,i=this.points;for(let l=0;l<=1;l++)for(let E=0;E<=1;E++)for(let d=0;d<=1;d++){const h=1*l|2*E|4*d,u=i[h];u.x=l?e.x:t.x,u.y=E?e.y:t.y,u.z=d?e.z:t.z,u.applyMatrix4(s)}const o=this.satBounds,n=this.satAxes,r=i[0];for(let l=0;l<3;l++){const E=n[l],d=o[l],h=1<<l,u=i[h];E.subVectors(r,u),d.setFromPoints(E,i)}const a=this.alignedSatBounds;a[0].setFromPointsField(i,"x"),a[1].setFromPointsField(i,"y"),a[2].setFromPointsField(i,"z"),this.invMatrix.copy(this.matrix).invert(),this.needsUpdate=!1}}();rt.prototype.intersectsBox=function(){const c=new _t;return function(t){this.needsUpdate&&this.update();const e=t.min,i=t.max,o=this.satBounds,n=this.satAxes,r=this.alignedSatBounds;if(c.min=e.x,c.max=i.x,r[0].isSeparated(c)||(c.min=e.y,c.max=i.y,r[1].isSeparated(c))||(c.min=e.z,c.max=i.z,r[2].isSeparated(c)))return!1;for(let a=0;a<3;a++){const l=n[a],E=o[a];if(c.setFromBox(l,t),E.isSeparated(c))return!1}return!0}}();rt.prototype.intersectsTriangle=function(){const c=new Rt,s=new Array(3),t=new _t,e=new _t,i=new C.Vector3;return function(n){this.needsUpdate&&this.update(),n.isExtendedTriangle?n.needsUpdate&&n.update():(c.copy(n),c.update(),n=c);const r=this.satBounds,a=this.satAxes;s[0]=n.a,s[1]=n.b,s[2]=n.c;for(let h=0;h<3;h++){const u=r[h],p=a[h];if(t.setFromPoints(p,s),u.isSeparated(t))return!1}const l=n.satBounds,E=n.satAxes,d=this.points;for(let h=0;h<3;h++){const u=l[h],p=E[h];if(t.setFromPoints(p,d),u.isSeparated(t))return!1}for(let h=0;h<3;h++){const u=a[h];for(let p=0;p<4;p++){const m=E[p];if(i.crossVectors(u,m),t.setFromPoints(i,s),e.setFromPoints(i,d),t.isSeparated(e))return!1}}return!0}}();rt.prototype.closestPointToPoint=function(){return function(s,t){return this.needsUpdate&&this.update(),t.copy(s).applyMatrix4(this.invMatrix).clamp(this.min,this.max).applyMatrix4(this.matrix),t}}();rt.prototype.distanceToPoint=function(){const c=new C.Vector3;return function(t){return this.closestPointToPoint(t,c),t.distanceTo(c)}}();rt.prototype.distanceToBox=function(){const c=["x","y","z"],s=new Array(12).fill().map(()=>new C.Line3),t=new Array(12).fill().map(()=>new C.Line3),e=new C.Vector3,i=new C.Vector3;return function(n,r=0,a=null,l=null){if(this.needsUpdate&&this.update(),this.intersectsBox(n))return(a||l)&&(n.getCenter(i),this.closestPointToPoint(i,e),n.closestPointToPoint(e,i),a&&a.copy(e),l&&l.copy(i)),0;const E=r*r,d=n.min,h=n.max,u=this.points;let p=1/0;for(let F=0;F<8;F++){const T=u[F];i.copy(T).clamp(d,h);const R=T.distanceToSquared(i);if(R<p&&(p=R,a&&a.copy(T),l&&l.copy(i),R<E))return Math.sqrt(R)}let m=0;for(let F=0;F<3;F++)for(let T=0;T<=1;T++)for(let R=0;R<=1;R++){const g=(F+1)%3,f=(F+2)%3,A=T<<g|R<<f,O=1<<F|T<<g|R<<f,_=u[A],y=u[O];s[m].set(_,y);const L=c[F],w=c[g],M=c[f],U=t[m],b=U.start,v=U.end;b[L]=d[L],b[w]=T?d[w]:h[w],b[M]=R?d[M]:h[w],v[L]=h[L],v[w]=T?d[w]:h[w],v[M]=R?d[M]:h[w],m++}for(let F=0;F<=1;F++)for(let T=0;T<=1;T++)for(let R=0;R<=1;R++){i.x=F?h.x:d.x,i.y=T?h.y:d.y,i.z=R?h.z:d.z,this.closestPointToPoint(i,e);const g=i.distanceToSquared(e);if(g<p&&(p=g,a&&a.copy(e),l&&l.copy(i),g<E))return Math.sqrt(g)}for(let F=0;F<12;F++){const T=s[F];for(let R=0;R<12;R++){const g=t[R];mi(T,g,e,i);const f=e.distanceToSquared(i);if(f<p&&(p=f,a&&a.copy(e),l&&l.copy(i),f<E))return Math.sqrt(f)}}return Math.sqrt(p)}}();class Ri{constructor(s){this._getNewPrimitive=s,this._primitives=[]}getPrimitive(){const s=this._primitives;return s.length===0?this._getNewPrimitive():s.pop()}releasePrimitive(s){this._primitives.push(s)}}class uo extends Ri{constructor(){super(()=>new Rt)}}const Et=new uo;function ct(c,s){return s[c+15]===65535}function lt(c,s){return s[c+6]}function dt(c,s){return s[c+14]}function ut(c){return c+8}function It(c,s){return s[c+6]}function fn(c,s){return s[c+7]}class Io{constructor(){this.float32Array=null,this.uint16Array=null,this.uint32Array=null;const s=[];let t=null;this.setBuffer=e=>{t&&s.push(t),t=e,this.float32Array=new Float32Array(e),this.uint16Array=new Uint16Array(e),this.uint32Array=new Uint32Array(e)},this.clearBuffer=()=>{t=null,this.float32Array=null,this.uint16Array=null,this.uint32Array=null,s.length!==0&&this.setBuffer(s.pop())}}}const X=new Io;let Dt,re;const Xt=[],Ge=new Ri(()=>new C.Box3);function fo(c,s,t,e,i,o){Dt=Ge.getPrimitive(),re=Ge.getPrimitive(),Xt.push(Dt,re),X.setBuffer(c._roots[s]);const n=ti(0,c.geometry,t,e,i,o);X.clearBuffer(),Ge.releasePrimitive(Dt),Ge.releasePrimitive(re),Xt.pop(),Xt.pop();const r=Xt.length;return r>0&&(re=Xt[r-1],Dt=Xt[r-2]),n}function ti(c,s,t,e,i=null,o=0,n=0){const{float32Array:r,uint16Array:a,uint32Array:l}=X;let E=c*2;if(ct(E,a)){const h=lt(c,l),u=dt(E,a);return q(c,r,Dt),e(h,u,!1,n,o+c,Dt)}else{let L=function(M){const{uint16Array:U,uint32Array:b}=X;let v=M*2;for(;!ct(v,U);)M=ut(M),v=M*2;return lt(M,b)},w=function(M){const{uint16Array:U,uint32Array:b}=X;let v=M*2;for(;!ct(v,U);)M=It(M,b),v=M*2;return lt(M,b)+dt(v,U)};const h=ut(c),u=It(c,l);let p=h,m=u,F,T,R,g;if(i&&(R=Dt,g=re,q(p,r,R),q(m,r,g),F=i(R),T=i(g),T<F)){p=u,m=h;const M=F;F=T,T=M,R=g}R||(R=Dt,q(p,r,R));const f=ct(p*2,a),A=t(R,f,F,n+1,o+p);let O;if(A===Ni){const M=L(p),b=w(p)-M;O=e(M,b,!0,n+1,o+p,R)}else O=A&&ti(p,s,t,e,i,o,n+1);if(O)return!0;g=re,q(m,r,g);const _=ct(m*2,a),y=t(g,_,T,n+1,o+m);let N;if(y===Ni){const M=L(m),b=w(m)-M;N=e(M,b,!0,n+1,o+m,g)}else N=y&&ti(m,s,t,e,i,o,n+1);return!!N}}const Ie=new C.Vector3,vs=new C.Vector3;function po(c,s,t={},e=0,i=1/0){const o=e*e,n=i*i;let r=1/0,a=null;if(c.shapecast({boundsTraverseOrder:E=>(Ie.copy(s).clamp(E.min,E.max),Ie.distanceToSquared(s)),intersectsBounds:(E,d,h)=>h<r&&h<n,intersectsTriangle:(E,d)=>{E.closestPointToPoint(s,Ie);const h=s.distanceToSquared(Ie);return h<r&&(vs.copy(Ie),r=h,a=d),h<o}}),r===1/0)return null;const l=Math.sqrt(r);return t.point?t.point.copy(vs):t.point=vs.clone(),t.distance=l,t.faceIndex=a,t}const Zt=new C.Vector3,Qt=new C.Vector3,jt=new C.Vector3,ze=new C.Vector2,He=new C.Vector2,ke=new C.Vector2,Di=new C.Vector3,Ui=new C.Vector3,xi=new C.Vector3,We=new C.Vector3;function Co(c,s,t,e,i,o){let n;return o===C.BackSide?n=c.intersectTriangle(e,t,s,!0,i):n=c.intersectTriangle(s,t,e,o!==C.DoubleSide,i),n===null?null:{distance:c.origin.distanceTo(i),point:i.clone()}}function To(c,s,t,e,i,o,n,r,a){Zt.fromBufferAttribute(s,o),Qt.fromBufferAttribute(s,n),jt.fromBufferAttribute(s,r);const l=Co(c,Zt,Qt,jt,We,a);if(l){e&&(ze.fromBufferAttribute(e,o),He.fromBufferAttribute(e,n),ke.fromBufferAttribute(e,r),l.uv=C.Triangle.getInterpolation(We,Zt,Qt,jt,ze,He,ke,new C.Vector2)),i&&(ze.fromBufferAttribute(i,o),He.fromBufferAttribute(i,n),ke.fromBufferAttribute(i,r),l.uv1=C.Triangle.getInterpolation(We,Zt,Qt,jt,ze,He,ke,new C.Vector2)),t&&(Di.fromBufferAttribute(t,o),Ui.fromBufferAttribute(t,n),xi.fromBufferAttribute(t,r),l.normal=C.Triangle.getInterpolation(We,Zt,Qt,jt,Di,Ui,xi,new C.Vector3),l.normal.dot(c.direction)>0&&l.normal.multiplyScalar(-1));const E={a:o,b:n,c:r,normal:new C.Vector3,materialIndex:0};C.Triangle.getNormal(Zt,Qt,jt,E.normal),l.face=E,l.faceIndex=o}return l}function _s(c,s,t,e,i){const o=e*3;let n=o+0,r=o+1,a=o+2;const l=c.index;c.index&&(n=l.getX(n),r=l.getX(r),a=l.getX(a));const{position:E,normal:d,uv:h,uv1:u}=c.attributes,p=To(t,E,d,h,u,n,r,a,s);return p?(p.faceIndex=e,i&&i.push(p),p):null}function tt(c,s,t,e){const i=c.a,o=c.b,n=c.c;let r=s,a=s+1,l=s+2;t&&(r=t.getX(r),a=t.getX(a),l=t.getX(l)),i.x=e.getX(r),i.y=e.getY(r),i.z=e.getZ(r),o.x=e.getX(a),o.y=e.getY(a),o.z=e.getZ(a),n.x=e.getX(l),n.y=e.getY(l),n.z=e.getZ(l)}function mo(c,s,t,e,i,o){const{geometry:n,_indirectBuffer:r}=c;for(let a=e,l=e+i;a<l;a++)_s(n,s,t,a,o)}function Ro(c,s,t,e,i){const{geometry:o,_indirectBuffer:n}=c;let r=1/0,a=null;for(let l=e,E=e+i;l<E;l++){let d;d=_s(o,s,t,l),d&&d.distance<r&&(a=d,r=d.distance)}return a}function Ao(c,s,t,e,i,o,n){const{geometry:r}=t,{index:a}=r,l=r.attributes.position;for(let E=c,d=s+c;E<d;E++){let h;if(h=E,tt(n,h*3,a,l),n.needsUpdate=!0,e(n,h,i,o))return!0}return!1}function Fo(c,s=null){s&&Array.isArray(s)&&(s=new Set(s));const t=c.geometry,e=t.index?t.index.array:null,i=t.attributes.position;let o,n,r,a,l=0;const E=c._roots;for(let h=0,u=E.length;h<u;h++)o=E[h],n=new Uint32Array(o),r=new Uint16Array(o),a=new Float32Array(o),d(0,l),l+=o.byteLength;function d(h,u,p=!1){const m=h*2;if(r[m+15]===Ss){const T=n[h+6],R=r[m+14];let g=1/0,f=1/0,A=1/0,O=-1/0,_=-1/0,y=-1/0;for(let N=3*T,L=3*(T+R);N<L;N++){let w=e[N];const M=i.getX(w),U=i.getY(w),b=i.getZ(w);M<g&&(g=M),M>O&&(O=M),U<f&&(f=U),U>_&&(_=U),b<A&&(A=b),b>y&&(y=b)}return a[h+0]!==g||a[h+1]!==f||a[h+2]!==A||a[h+3]!==O||a[h+4]!==_||a[h+5]!==y?(a[h+0]=g,a[h+1]=f,a[h+2]=A,a[h+3]=O,a[h+4]=_,a[h+5]=y,!0):!1}else{const T=h+8,R=n[h+6],g=T+u,f=R+u;let A=p,O=!1,_=!1;s?A||(O=s.has(g),_=s.has(f),A=!O&&!_):(O=!0,_=!0);const y=A||O,N=A||_;let L=!1;y&&(L=d(T,u,A));let w=!1;N&&(w=d(R,u,A));const M=L||w;if(M)for(let U=0;U<3;U++){const b=T+U,v=R+U,z=a[b],j=a[b+3],et=a[v],Z=a[v+3];a[h+U]=z<et?z:et,a[h+U+3]=j>Z?j:Z}return M}}}const bi=new C.Box3;function bt(c,s,t,e){return q(c,s,bi),t.intersectBox(bi,e)}function go(c,s,t,e,i,o){const{geometry:n,_indirectBuffer:r}=c;for(let a=e,l=e+i;a<l;a++){let E=r?r[a]:a;_s(n,s,t,E,o)}}function Oo(c,s,t,e,i){const{geometry:o,_indirectBuffer:n}=c;let r=1/0,a=null;for(let l=e,E=e+i;l<E;l++){let d;d=_s(o,s,t,n?n[l]:l),d&&d.distance<r&&(a=d,r=d.distance)}return a}function So(c,s,t,e,i,o,n){const{geometry:r}=t,{index:a}=r,l=r.attributes.position;for(let E=c,d=s+c;E<d;E++){let h;if(h=t.resolveTriangleIndex(E),tt(n,h*3,a,l),n.needsUpdate=!0,e(n,h,i,o))return!0}return!1}const vi=new C.Vector3;function _o(c,s,t,e,i){X.setBuffer(c._roots[s]),ei(0,c,t,e,i),X.clearBuffer()}function ei(c,s,t,e,i){const{float32Array:o,uint16Array:n,uint32Array:r}=X,a=c*2;if(ct(a,n)){const E=lt(c,r),d=dt(a,n);mo(s,t,e,E,d,i)}else{const E=ut(c);bt(E,o,e,vi)&&ei(E,s,t,e,i);const d=It(c,r);bt(d,o,e,vi)&&ei(d,s,t,e,i)}}const Bi=new C.Vector3,yo=["x","y","z"];function No(c,s,t,e){X.setBuffer(c._roots[s]);const i=si(0,c,t,e);return X.clearBuffer(),i}function si(c,s,t,e){const{float32Array:i,uint16Array:o,uint32Array:n}=X;let r=c*2;if(ct(r,o)){const l=lt(c,n),E=dt(r,o);return Ro(s,t,e,l,E)}else{const l=fn(c,n),E=yo[l],h=e.direction[E]>=0;let u,p;h?(u=ut(c),p=It(c,n)):(u=It(c,n),p=ut(c));const F=bt(u,i,e,Bi)?si(u,s,t,e):null;if(F){const g=F.point[E];if(h?g<=i[p+l]:g>=i[p+l+3])return F}const R=bt(p,i,e,Bi)?si(p,s,t,e):null;return F&&R?F.distance<=R.distance?F:R:F||R||null}}const Xe=new C.Box3,qt=new Rt,$t=new Rt,fe=new C.Matrix4,Vi=new rt,Ze=new rt;function Po(c,s,t,e){X.setBuffer(c._roots[s]);const i=ii(0,c,t,e);return X.clearBuffer(),i}function ii(c,s,t,e,i=null){const{float32Array:o,uint16Array:n,uint32Array:r}=X;let a=c*2;if(i===null&&(t.boundingBox||t.computeBoundingBox(),Vi.set(t.boundingBox.min,t.boundingBox.max,e),i=Vi),ct(a,n)){const E=s.geometry,d=E.index,h=E.attributes.position,u=t.index,p=t.attributes.position,m=lt(c,r),F=dt(a,n);if(fe.copy(e).invert(),t.boundsTree)return q(c,o,Ze),Ze.matrix.copy(fe),Ze.needsUpdate=!0,t.boundsTree.shapecast({intersectsBounds:R=>Ze.intersectsBox(R),intersectsTriangle:R=>{R.a.applyMatrix4(e),R.b.applyMatrix4(e),R.c.applyMatrix4(e),R.needsUpdate=!0;for(let g=m*3,f=(F+m)*3;g<f;g+=3)if(tt($t,g,d,h),$t.needsUpdate=!0,R.intersectsTriangle($t))return!0;return!1}});for(let T=m*3,R=(F+m)*3;T<R;T+=3){tt(qt,T,d,h),qt.a.applyMatrix4(fe),qt.b.applyMatrix4(fe),qt.c.applyMatrix4(fe),qt.needsUpdate=!0;for(let g=0,f=u.count;g<f;g+=3)if(tt($t,g,u,p),$t.needsUpdate=!0,qt.intersectsTriangle($t))return!0}}else{const E=c+8,d=r[c+6];return q(E,o,Xe),!!(i.intersectsBox(Xe)&&ii(E,s,t,e,i)||(q(d,o,Xe),i.intersectsBox(Xe)&&ii(d,s,t,e,i)))}}const Qe=new C.Matrix4,Bs=new rt,pe=new rt,Lo=new C.Vector3,Mo=new C.Vector3,wo=new C.Vector3,Do=new C.Vector3;function Uo(c,s,t,e={},i={},o=0,n=1/0){s.boundingBox||s.computeBoundingBox(),Bs.set(s.boundingBox.min,s.boundingBox.max,t),Bs.needsUpdate=!0;const r=c.geometry,a=r.attributes.position,l=r.index,E=s.attributes.position,d=s.index,h=Et.getPrimitive(),u=Et.getPrimitive();let p=Lo,m=Mo,F=null,T=null;i&&(F=wo,T=Do);let R=1/0,g=null,f=null;return Qe.copy(t).invert(),pe.matrix.copy(Qe),c.shapecast({boundsTraverseOrder:A=>Bs.distanceToBox(A),intersectsBounds:(A,O,_)=>_<R&&_<n?(O&&(pe.min.copy(A.min),pe.max.copy(A.max),pe.needsUpdate=!0),!0):!1,intersectsRange:(A,O)=>{if(s.boundsTree)return s.boundsTree.shapecast({boundsTraverseOrder:y=>pe.distanceToBox(y),intersectsBounds:(y,N,L)=>L<R&&L<n,intersectsRange:(y,N)=>{for(let L=y,w=y+N;L<w;L++){tt(u,3*L,d,E),u.a.applyMatrix4(t),u.b.applyMatrix4(t),u.c.applyMatrix4(t),u.needsUpdate=!0;for(let M=A,U=A+O;M<U;M++){tt(h,3*M,l,a),h.needsUpdate=!0;const b=h.distanceToTriangle(u,p,F);if(b<R&&(m.copy(p),T&&T.copy(F),R=b,g=M,f=L),b<o)return!0}}}});{const _=he(s);for(let y=0,N=_;y<N;y++){tt(u,3*y,d,E),u.a.applyMatrix4(t),u.b.applyMatrix4(t),u.c.applyMatrix4(t),u.needsUpdate=!0;for(let L=A,w=A+O;L<w;L++){tt(h,3*L,l,a),h.needsUpdate=!0;const M=h.distanceToTriangle(u,p,F);if(M<R&&(m.copy(p),T&&T.copy(F),R=M,g=L,f=y),M<o)return!0}}}}}),Et.releasePrimitive(h),Et.releasePrimitive(u),R===1/0?null:(e.point?e.point.copy(m):e.point=m.clone(),e.distance=R,e.faceIndex=g,i&&(i.point?i.point.copy(T):i.point=T.clone(),i.point.applyMatrix4(Qe),m.applyMatrix4(Qe),i.distance=m.sub(i.point).length(),i.faceIndex=f),e)}function xo(c,s=null){s&&Array.isArray(s)&&(s=new Set(s));const t=c.geometry,e=t.index?t.index.array:null,i=t.attributes.position;let o,n,r,a,l=0;const E=c._roots;for(let h=0,u=E.length;h<u;h++)o=E[h],n=new Uint32Array(o),r=new Uint16Array(o),a=new Float32Array(o),d(0,l),l+=o.byteLength;function d(h,u,p=!1){const m=h*2;if(r[m+15]===Ss){const T=n[h+6],R=r[m+14];let g=1/0,f=1/0,A=1/0,O=-1/0,_=-1/0,y=-1/0;for(let N=T,L=T+R;N<L;N++){const w=3*c.resolveTriangleIndex(N);for(let M=0;M<3;M++){let U=w+M;U=e?e[U]:U;const b=i.getX(U),v=i.getY(U),z=i.getZ(U);b<g&&(g=b),b>O&&(O=b),v<f&&(f=v),v>_&&(_=v),z<A&&(A=z),z>y&&(y=z)}}return a[h+0]!==g||a[h+1]!==f||a[h+2]!==A||a[h+3]!==O||a[h+4]!==_||a[h+5]!==y?(a[h+0]=g,a[h+1]=f,a[h+2]=A,a[h+3]=O,a[h+4]=_,a[h+5]=y,!0):!1}else{const T=h+8,R=n[h+6],g=T+u,f=R+u;let A=p,O=!1,_=!1;s?A||(O=s.has(g),_=s.has(f),A=!O&&!_):(O=!0,_=!0);const y=A||O,N=A||_;let L=!1;y&&(L=d(T,u,A));let w=!1;N&&(w=d(R,u,A));const M=L||w;if(M)for(let U=0;U<3;U++){const b=T+U,v=R+U,z=a[b],j=a[b+3],et=a[v],Z=a[v+3];a[h+U]=z<et?z:et,a[h+U+3]=j>Z?j:Z}return M}}}const Yi=new C.Vector3;function bo(c,s,t,e,i){X.setBuffer(c._roots[s]),ni(0,c,t,e,i),X.clearBuffer()}function ni(c,s,t,e,i){const{float32Array:o,uint16Array:n,uint32Array:r}=X,a=c*2;if(ct(a,n)){const E=lt(c,r),d=dt(a,n);go(s,t,e,E,d,i)}else{const E=ut(c);bt(E,o,e,Yi)&&ni(E,s,t,e,i);const d=It(c,r);bt(d,o,e,Yi)&&ni(d,s,t,e,i)}}const Gi=new C.Vector3,vo=["x","y","z"];function Bo(c,s,t,e){X.setBuffer(c._roots[s]);const i=oi(0,c,t,e);return X.clearBuffer(),i}function oi(c,s,t,e){const{float32Array:i,uint16Array:o,uint32Array:n}=X;let r=c*2;if(ct(r,o)){const l=lt(c,n),E=dt(r,o);return Oo(s,t,e,l,E)}else{const l=fn(c,n),E=vo[l],h=e.direction[E]>=0;let u,p;h?(u=ut(c),p=It(c,n)):(u=It(c,n),p=ut(c));const F=bt(u,i,e,Gi)?oi(u,s,t,e):null;if(F){const g=F.point[E];if(h?g<=i[p+l]:g>=i[p+l+3])return F}const R=bt(p,i,e,Gi)?oi(p,s,t,e):null;return F&&R?F.distance<=R.distance?F:R:F||R||null}}const je=new C.Box3,Kt=new Rt,Jt=new Rt,Ce=new C.Matrix4,zi=new rt,qe=new rt;function Vo(c,s,t,e){X.setBuffer(c._roots[s]);const i=ri(0,c,t,e);return X.clearBuffer(),i}function ri(c,s,t,e,i=null){const{float32Array:o,uint16Array:n,uint32Array:r}=X;let a=c*2;if(i===null&&(t.boundingBox||t.computeBoundingBox(),zi.set(t.boundingBox.min,t.boundingBox.max,e),i=zi),ct(a,n)){const E=s.geometry,d=E.index,h=E.attributes.position,u=t.index,p=t.attributes.position,m=lt(c,r),F=dt(a,n);if(Ce.copy(e).invert(),t.boundsTree)return q(c,o,qe),qe.matrix.copy(Ce),qe.needsUpdate=!0,t.boundsTree.shapecast({intersectsBounds:R=>qe.intersectsBox(R),intersectsTriangle:R=>{R.a.applyMatrix4(e),R.b.applyMatrix4(e),R.c.applyMatrix4(e),R.needsUpdate=!0;for(let g=m,f=F+m;g<f;g++)if(tt(Jt,3*s.resolveTriangleIndex(g),d,h),Jt.needsUpdate=!0,R.intersectsTriangle(Jt))return!0;return!1}});for(let T=m,R=F+m;T<R;T++){const g=s.resolveTriangleIndex(T);tt(Kt,3*g,d,h),Kt.a.applyMatrix4(Ce),Kt.b.applyMatrix4(Ce),Kt.c.applyMatrix4(Ce),Kt.needsUpdate=!0;for(let f=0,A=u.count;f<A;f+=3)if(tt(Jt,f,u,p),Jt.needsUpdate=!0,Kt.intersectsTriangle(Jt))return!0}}else{const E=c+8,d=r[c+6];return q(E,o,je),!!(i.intersectsBox(je)&&ri(E,s,t,e,i)||(q(d,o,je),i.intersectsBox(je)&&ri(d,s,t,e,i)))}}const $e=new C.Matrix4,Vs=new rt,Te=new rt,Yo=new C.Vector3,Go=new C.Vector3,zo=new C.Vector3,Ho=new C.Vector3;function ko(c,s,t,e={},i={},o=0,n=1/0){s.boundingBox||s.computeBoundingBox(),Vs.set(s.boundingBox.min,s.boundingBox.max,t),Vs.needsUpdate=!0;const r=c.geometry,a=r.attributes.position,l=r.index,E=s.attributes.position,d=s.index,h=Et.getPrimitive(),u=Et.getPrimitive();let p=Yo,m=Go,F=null,T=null;i&&(F=zo,T=Ho);let R=1/0,g=null,f=null;return $e.copy(t).invert(),Te.matrix.copy($e),c.shapecast({boundsTraverseOrder:A=>Vs.distanceToBox(A),intersectsBounds:(A,O,_)=>_<R&&_<n?(O&&(Te.min.copy(A.min),Te.max.copy(A.max),Te.needsUpdate=!0),!0):!1,intersectsRange:(A,O)=>{if(s.boundsTree){const _=s.boundsTree;return _.shapecast({boundsTraverseOrder:y=>Te.distanceToBox(y),intersectsBounds:(y,N,L)=>L<R&&L<n,intersectsRange:(y,N)=>{for(let L=y,w=y+N;L<w;L++){const M=_.resolveTriangleIndex(L);tt(u,3*M,d,E),u.a.applyMatrix4(t),u.b.applyMatrix4(t),u.c.applyMatrix4(t),u.needsUpdate=!0;for(let U=A,b=A+O;U<b;U++){const v=c.resolveTriangleIndex(U);tt(h,3*v,l,a),h.needsUpdate=!0;const z=h.distanceToTriangle(u,p,F);if(z<R&&(m.copy(p),T&&T.copy(F),R=z,g=U,f=L),z<o)return!0}}}})}else{const _=he(s);for(let y=0,N=_;y<N;y++){tt(u,3*y,d,E),u.a.applyMatrix4(t),u.b.applyMatrix4(t),u.c.applyMatrix4(t),u.needsUpdate=!0;for(let L=A,w=A+O;L<w;L++){const M=c.resolveTriangleIndex(L);tt(h,3*M,l,a),h.needsUpdate=!0;const U=h.distanceToTriangle(u,p,F);if(U<R&&(m.copy(p),T&&T.copy(F),R=U,g=L,f=y),U<o)return!0}}}}}),Et.releasePrimitive(h),Et.releasePrimitive(u),R===1/0?null:(e.point?e.point.copy(m):e.point=m.clone(),e.distance=R,e.faceIndex=g,i&&(i.point?i.point.copy(T):i.point=T.clone(),i.point.applyMatrix4($e),m.applyMatrix4($e),i.distance=m.sub(i.point).length(),i.faceIndex=f),e)}function Wo(){return typeof SharedArrayBuffer<"u"}const Ne=new X.constructor,hs=new X.constructor,Mt=new Ri(()=>new C.Box3),te=new C.Box3,ee=new C.Box3,Ys=new C.Box3,Gs=new C.Box3;let zs=!1;function Xo(c,s,t,e){if(zs)throw new Error("MeshBVH: Recursive calls to bvhcast not supported.");zs=!0;const i=c._roots,o=s._roots;let n,r=0,a=0;const l=new C.Matrix4().copy(t).invert();for(let E=0,d=i.length;E<d;E++){Ne.setBuffer(i[E]),a=0;const h=Mt.getPrimitive();q(0,Ne.float32Array,h),h.applyMatrix4(l);for(let u=0,p=o.length;u<p&&(hs.setBuffer(o[E]),n=pt(0,0,t,l,e,r,a,0,0,h),hs.clearBuffer(),a+=o[u].length,!n);u++);if(Mt.releasePrimitive(h),Ne.clearBuffer(),r+=i[E].length,n)break}return zs=!1,n}function pt(c,s,t,e,i,o=0,n=0,r=0,a=0,l=null,E=!1){let d,h;E?(d=hs,h=Ne):(d=Ne,h=hs);const u=d.float32Array,p=d.uint32Array,m=d.uint16Array,F=h.float32Array,T=h.uint32Array,R=h.uint16Array,g=c*2,f=s*2,A=ct(g,m),O=ct(f,R);let _=!1;if(O&&A)E?_=i(lt(s,T),dt(s*2,R),lt(c,p),dt(c*2,m),a,n+s,r,o+c):_=i(lt(c,p),dt(c*2,m),lt(s,T),dt(s*2,R),r,o+c,a,n+s);else if(O){const y=Mt.getPrimitive();q(s,F,y),y.applyMatrix4(t);const N=ut(c),L=It(c,p);q(N,u,te),q(L,u,ee);const w=y.intersectsBox(te),M=y.intersectsBox(ee);_=w&&pt(s,N,e,t,i,n,o,a,r+1,y,!E)||M&&pt(s,L,e,t,i,n,o,a,r+1,y,!E),Mt.releasePrimitive(y)}else{const y=ut(s),N=It(s,T);q(y,F,Ys),q(N,F,Gs);const L=l.intersectsBox(Ys),w=l.intersectsBox(Gs);if(L&&w)_=pt(c,y,t,e,i,o,n,r,a+1,l,E)||pt(c,N,t,e,i,o,n,r,a+1,l,E);else if(L)if(A)_=pt(c,y,t,e,i,o,n,r,a+1,l,E);else{const M=Mt.getPrimitive();M.copy(Ys).applyMatrix4(t);const U=ut(c),b=It(c,p);q(U,u,te),q(b,u,ee);const v=M.intersectsBox(te),z=M.intersectsBox(ee);_=v&&pt(y,U,e,t,i,n,o,a,r+1,M,!E)||z&&pt(y,b,e,t,i,n,o,a,r+1,M,!E),Mt.releasePrimitive(M)}else if(w)if(A)_=pt(c,N,t,e,i,o,n,r,a+1,l,E);else{const M=Mt.getPrimitive();M.copy(Gs).applyMatrix4(t);const U=ut(c),b=It(c,p);q(U,u,te),q(b,u,ee);const v=M.intersectsBox(te),z=M.intersectsBox(ee);_=v&&pt(N,U,e,t,i,n,o,a,r+1,M,!E)||z&&pt(N,b,e,t,i,n,o,a,r+1,M,!E),Mt.releasePrimitive(M)}}return _}const Ke=new rt,Hi=new C.Box3;class Ai{static serialize(s,t={}){t={cloneBuffers:!0,...t};const e=s.geometry,i=s._roots,o=s._indirectBuffer,n=e.getIndex();let r;return t.cloneBuffers?r={roots:i.map(a=>a.slice()),index:n.array.slice(),indirectBuffer:o?o.slice():null}:r={roots:i,index:n.array,indirectBuffer:o},r}static deserialize(s,t,e={}){e={setIndex:!0,indirect:!!s.indirectBuffer,...e};const{index:i,roots:o,indirectBuffer:n}=s,r=new Ai(t,{...e,[Us]:!0});if(r._roots=o,r._indirectBuffer=n||null,e.setIndex){const a=t.getIndex();if(a===null){const l=new C.BufferAttribute(s.index,1,!1);t.setIndex(l)}else a.array!==i&&(a.array.set(i),a.needsUpdate=!0)}return r}get indirect(){return!!this._indirectBuffer}constructor(s,t={}){if(s.isBufferGeometry){if(s.index&&s.index.isInterleavedBufferAttribute)throw new Error("MeshBVH: InterleavedBufferAttribute is not supported for the index attribute.")}else throw new Error("MeshBVH: Only BufferGeometries are supported.");if(t=Object.assign({strategy:dn,maxDepth:40,maxLeafTris:10,verbose:!0,useSharedArrayBuffer:!1,setBoundingBox:!0,onProgress:null,indirect:!1,[Us]:!1},t),t.useSharedArrayBuffer&&!Wo())throw new Error("MeshBVH: SharedArrayBuffer is not available.");this.geometry=s,this._roots=null,this._indirectBuffer=null,t[Us]||(co(this,t),!s.boundingBox&&t.setBoundingBox&&(s.boundingBox=this.getBoundingBox(new C.Box3)));const{_indirectBuffer:e}=this;this.resolveTriangleIndex=t.indirect?i=>e[i]:i=>i}refit(s=null){return(this.indirect?xo:Fo)(this,s)}traverse(s,t=0){const e=this._roots[t],i=new Uint32Array(e),o=new Uint16Array(e);n(0);function n(r,a=0){const l=r*2,E=o[l+15]===Ss;if(E){const d=i[r+6],h=o[l+14];s(a,E,new Float32Array(e,r*4,6),d,h)}else{const d=r+as/4,h=i[r+6],u=i[r+7];s(a,E,new Float32Array(e,r*4,6),u)||(n(d,a+1),n(h,a+1))}}}raycast(s,t=C.FrontSide){const e=this._roots,i=this.geometry,o=[],n=t.isMaterial,r=Array.isArray(t),a=i.groups,l=n?t.side:t,E=this.indirect?bo:_o;for(let d=0,h=e.length;d<h;d++){const u=r?t[a[d].materialIndex].side:l,p=o.length;if(E(this,d,u,s,o),r){const m=a[d].materialIndex;for(let F=p,T=o.length;F<T;F++)o[F].face.materialIndex=m}}return o}raycastFirst(s,t=C.FrontSide){const e=this._roots,i=this.geometry,o=t.isMaterial,n=Array.isArray(t);let r=null;const a=i.groups,l=o?t.side:t,E=this.indirect?Bo:No;for(let d=0,h=e.length;d<h;d++){const u=n?t[a[d].materialIndex].side:l,p=E(this,d,u,s);p!=null&&(r==null||p.distance<r.distance)&&(r=p,n&&(p.face.materialIndex=a[d].materialIndex))}return r}intersectsGeometry(s,t){let e=!1;const i=this._roots,o=this.indirect?Vo:Po;for(let n=0,r=i.length;n<r&&(e=o(this,n,s,t),!e);n++);return e}shapecast(s){const t=Et.getPrimitive(),e=this.indirect?So:Ao;let{boundsTraverseOrder:i,intersectsBounds:o,intersectsRange:n,intersectsTriangle:r}=s;if(n&&r){const d=n;n=(h,u,p,m,F)=>d(h,u,p,m,F)?!0:e(h,u,this,r,p,m,t)}else n||(r?n=(d,h,u,p)=>e(d,h,this,r,u,p,t):n=(d,h,u)=>u);let a=!1,l=0;const E=this._roots;for(let d=0,h=E.length;d<h;d++){const u=E[d];if(a=fo(this,d,o,n,i,l),a)break;l+=u.byteLength}return Et.releasePrimitive(t),a}bvhcast(s,t,e){let{intersectsRanges:i,intersectsTriangles:o}=e;const n=Et.getPrimitive(),r=this.geometry.index,a=this.geometry.attributes.position,l=this.indirect?p=>{const m=this.resolveTriangleIndex(p);tt(n,m*3,r,a)}:p=>{tt(n,p*3,r,a)},E=Et.getPrimitive(),d=s.geometry.index,h=s.geometry.attributes.position,u=s.indirect?p=>{const m=s.resolveTriangleIndex(p);tt(E,m*3,d,h)}:p=>{tt(E,p*3,d,h)};if(o){const p=(m,F,T,R,g,f,A,O)=>{for(let _=T,y=T+R;_<y;_++){u(_),E.a.applyMatrix4(t),E.b.applyMatrix4(t),E.c.applyMatrix4(t),E.needsUpdate=!0;for(let N=m,L=m+F;N<L;N++)if(l(N),n.needsUpdate=!0,o(n,E,N,_,g,f,A,O))return!0}return!1};if(i){const m=i;i=function(F,T,R,g,f,A,O,_){return m(F,T,R,g,f,A,O,_)?!0:p(F,T,R,g,f,A,O,_)}}else i=p}return Xo(this,s,t,i)}intersectsBox(s,t){return Ke.set(s.min,s.max,t),Ke.needsUpdate=!0,this.shapecast({intersectsBounds:e=>Ke.intersectsBox(e),intersectsTriangle:e=>Ke.intersectsTriangle(e)})}intersectsSphere(s){return this.shapecast({intersectsBounds:t=>s.intersectsBox(t),intersectsTriangle:t=>t.intersectsSphere(s)})}closestPointToGeometry(s,t,e={},i={},o=0,n=1/0){return(this.indirect?ko:Uo)(this,s,t,e,i,o,n)}closestPointToPoint(s,t={},e=0,i=1/0){return po(this,s,t,e,i)}getBoundingBox(s){return s.makeEmpty(),this._roots.forEach(e=>{q(0,new Float32Array(e),Hi),s.union(Hi)}),s}}function ki(c,s,t){return c===null||(c.point.applyMatrix4(s.matrixWorld),c.distance=c.point.distanceTo(t.ray.origin),c.object=s,c.distance<t.near||c.distance>t.far)?null:c}const Hs=new C.Ray,Wi=new C.Matrix4,Zo=C.Mesh.prototype.raycast;function Qo(c,s){if(this.geometry.boundsTree){if(this.material===void 0)return;Wi.copy(this.matrixWorld).invert(),Hs.copy(c.ray).applyMatrix4(Wi);const t=this.geometry.boundsTree;if(c.firstHitOnly===!0){const e=ki(t.raycastFirst(Hs,this.material),this,c);e&&s.push(e)}else{const e=t.raycast(Hs,this.material);for(let i=0,o=e.length;i<o;i++){const n=ki(e[i],this,c);n&&s.push(n)}}}else Zo.call(this,c,s)}function jo(c){return this.boundsTree=new Ai(this,c),this.boundsTree}function qo(){this.boundsTree=null}class D{constructor(){I(this,"trigger",s=>{const t=this.handlers.slice(0);for(const e of t)e(s)});I(this,"handlers",[])}add(s){this.handlers.push(s)}remove(s){this.handlers=this.handlers.filter(t=>t!==s)}reset(){this.handlers.length=0}}class xt{constructor(){I(this,"trigger",async s=>{const t=this.handlers.slice(0);for(const e of t)await e(s)});I(this,"handlers",[])}add(s){this.handlers.push(s)}remove(s){this.handlers=this.handlers.filter(t=>t!==s)}reset(){this.handlers.length=0}}class ys{constructor(s){I(this,"isDisposeable",()=>"dispose"in this&&"onDisposed"in this);I(this,"isResizeable",()=>"resize"in this&&"getSize"in this);I(this,"isUpdateable",()=>"onAfterUpdate"in this&&"onBeforeUpdate"in this&&"update"in this);I(this,"isHideable",()=>"visible"in this);I(this,"isConfigurable",()=>"setup"in this&&"config"in this&&"onSetup"in this);this.components=s}}class $ extends ys{}class Ns extends ys{constructor(t){super(t);I(this,"worlds",new Map);I(this,"onWorldChanged",new D);I(this,"currentWorld",null);this.onWorldChanged.add(({world:e,action:i})=>{i==="removed"&&this.worlds.delete(e.uuid)})}}class pn extends Ns{constructor(){super(...arguments);I(this,"hasCameraControls",()=>"controls"in this)}}class Cn extends Ns{constructor(){super(...arguments);I(this,"onAfterUpdate",new D);I(this,"onBeforeUpdate",new D);I(this,"onDisposed",new D);I(this,"onResize",new D);I(this,"onClippingPlanesUpdated",new D);I(this,"clippingPlanes",[])}updateClippingPlanes(){this.onClippingPlanesUpdated.trigger()}setPlane(t,e,i){e.isLocal=i;const o=this.clippingPlanes.indexOf(e);t&&o===-1?this.clippingPlanes.push(e):!t&&o>-1&&this.clippingPlanes.splice(o,1),this.three.clippingPlanes=this.clippingPlanes.filter(n=>!n.isLocal)}}const Pe=class Pe extends ${constructor(t){super(t);I(this,"_disposedComponents",new Set);I(this,"enabled",!0);t.add(Pe.uuid,this)}get(){return this._disposedComponents}destroy(t,e=!0,i=!0){t.removeFromParent();const o=t;o.dispose&&o.dispose(),this.disposeGeometryAndMaterials(t,e),i&&o.children&&o.children.length&&this.disposeChildren(o),t.children.length=0}disposeGeometry(t){const e=t;e.boundsTree&&e.disposeBoundsTree(),t.dispose()}disposeGeometryAndMaterials(t,e){const i=t;i.geometry&&this.disposeGeometry(i.geometry),e&&i.material&&Pe.disposeMaterial(i),i.material=[],i.geometry=null}disposeChildren(t){for(const e of t.children)this.destroy(e)}static disposeMaterial(t){if(t.material)if(Array.isArray(t.material))for(const e of t.material)e.dispose();else t.material.dispose()}};I(Pe,"uuid","76e9cd8e-ad8f-4753-9ef6-cbc60f7247fe");let yt=Pe;class Tn extends Ns{constructor(t){super(t);I(this,"onDisposed",new D)}dispose(){const t=this.components.get(yt);for(const e of this.three.children){const i=e;i.geometry&&t.destroy(i)}this.three.children=[],this.onDisposed.trigger(),this.onDisposed.reset()}}const cs=0,$o=1,Ko=new C.Vector3,Xi=new C.Line3,ks=new C.Plane,Zi=new C.Vector3,Je=new C.Triangle;class Jo{constructor(){this.tolerance=-1,this.faces=[],this.newFaces=[],this.assigned=new Qi,this.unassigned=new Qi,this.vertices=[]}setFromPoints(s){if(s.length>=4){this.makeEmpty();for(let t=0,e=s.length;t<e;t++)this.vertices.push(new tr(s[t]));this.compute()}return this}setFromObject(s){const t=[];return s.updateMatrixWorld(!0),s.traverse(function(e){const i=e.geometry;if(i!==void 0){const o=i.attributes.position;if(o!==void 0)for(let n=0,r=o.count;n<r;n++){const a=new C.Vector3;a.fromBufferAttribute(o,n).applyMatrix4(e.matrixWorld),t.push(a)}}}),this.setFromPoints(t)}containsPoint(s){const t=this.faces;for(let e=0,i=t.length;e<i;e++)if(t[e].distanceToPoint(s)>this.tolerance)return!1;return!0}intersectRay(s,t){const e=this.faces;let i=-1/0,o=1/0;for(let n=0,r=e.length;n<r;n++){const a=e[n],l=a.distanceToPoint(s.origin),E=a.normal.dot(s.direction);if(l>0&&E>=0)return null;const d=E!==0?-l/E:0;if(!(d<=0)&&(E>0?o=Math.min(d,o):i=Math.max(d,i),i>o))return null}return i!==-1/0?s.at(i,t):s.at(o,t),t}intersectsRay(s){return this.intersectRay(s,Ko)!==null}makeEmpty(){return this.faces=[],this.vertices=[],this}addVertexToFace(s,t){return s.face=t,t.outside===null?this.assigned.append(s):this.assigned.insertBefore(t.outside,s),t.outside=s,this}removeVertexFromFace(s,t){return s===t.outside&&(s.next!==null&&s.next.face===t?t.outside=s.next:t.outside=null),this.assigned.remove(s),this}removeAllVerticesFromFace(s){if(s.outside!==null){const t=s.outside;let e=s.outside;for(;e.next!==null&&e.next.face===s;)e=e.next;return this.assigned.removeSubList(t,e),t.prev=e.next=null,s.outside=null,t}}deleteFaceVertices(s,t){const e=this.removeAllVerticesFromFace(s);if(e!==void 0)if(t===void 0)this.unassigned.appendChain(e);else{let i=e;do{const o=i.next;t.distanceToPoint(i.point)>this.tolerance?this.addVertexToFace(i,t):this.unassigned.append(i),i=o}while(i!==null)}return this}resolveUnassignedPoints(s){if(this.unassigned.isEmpty()===!1){let t=this.unassigned.first();do{const e=t.next;let i=this.tolerance,o=null;for(let n=0;n<s.length;n++){const r=s[n];if(r.mark===cs){const a=r.distanceToPoint(t.point);if(a>i&&(i=a,o=r),i>1e3*this.tolerance)break}}o!==null&&this.addVertexToFace(t,o),t=e}while(t!==null)}return this}computeExtremes(){const s=new C.Vector3,t=new C.Vector3,e=[],i=[];for(let o=0;o<3;o++)e[o]=i[o]=this.vertices[0];s.copy(this.vertices[0].point),t.copy(this.vertices[0].point);for(let o=0,n=this.vertices.length;o<n;o++){const r=this.vertices[o],a=r.point;for(let l=0;l<3;l++)a.getComponent(l)<s.getComponent(l)&&(s.setComponent(l,a.getComponent(l)),e[l]=r);for(let l=0;l<3;l++)a.getComponent(l)>t.getComponent(l)&&(t.setComponent(l,a.getComponent(l)),i[l]=r)}return this.tolerance=3*Number.EPSILON*(Math.max(Math.abs(s.x),Math.abs(t.x))+Math.max(Math.abs(s.y),Math.abs(t.y))+Math.max(Math.abs(s.z),Math.abs(t.z))),{min:e,max:i}}computeInitialHull(){const s=this.vertices,t=this.computeExtremes(),e=t.min,i=t.max;let o=0,n=0;for(let h=0;h<3;h++){const u=i[h].point.getComponent(h)-e[h].point.getComponent(h);u>o&&(o=u,n=h)}const r=e[n],a=i[n];let l,E;o=0,Xi.set(r.point,a.point);for(let h=0,u=this.vertices.length;h<u;h++){const p=s[h];if(p!==r&&p!==a){Xi.closestPointToPoint(p.point,!0,Zi);const m=Zi.distanceToSquared(p.point);m>o&&(o=m,l=p)}}o=-1,ks.setFromCoplanarPoints(r.point,a.point,l.point);for(let h=0,u=this.vertices.length;h<u;h++){const p=s[h];if(p!==r&&p!==a&&p!==l){const m=Math.abs(ks.distanceToPoint(p.point));m>o&&(o=m,E=p)}}const d=[];if(ks.distanceToPoint(E.point)<0){d.push(Tt.create(r,a,l),Tt.create(E,a,r),Tt.create(E,l,a),Tt.create(E,r,l));for(let h=0;h<3;h++){const u=(h+1)%3;d[h+1].getEdge(2).setTwin(d[0].getEdge(u)),d[h+1].getEdge(1).setTwin(d[u+1].getEdge(0))}}else{d.push(Tt.create(r,l,a),Tt.create(E,r,a),Tt.create(E,a,l),Tt.create(E,l,r));for(let h=0;h<3;h++){const u=(h+1)%3;d[h+1].getEdge(2).setTwin(d[0].getEdge((3-h)%3)),d[h+1].getEdge(0).setTwin(d[u+1].getEdge(1))}}for(let h=0;h<4;h++)this.faces.push(d[h]);for(let h=0,u=s.length;h<u;h++){const p=s[h];if(p!==r&&p!==a&&p!==l&&p!==E){o=this.tolerance;let m=null;for(let F=0;F<4;F++){const T=this.faces[F].distanceToPoint(p.point);T>o&&(o=T,m=this.faces[F])}m!==null&&this.addVertexToFace(p,m)}}return this}reindexFaces(){const s=[];for(let t=0;t<this.faces.length;t++){const e=this.faces[t];e.mark===cs&&s.push(e)}return this.faces=s,this}nextVertexToAdd(){if(this.assigned.isEmpty()===!1){let s,t=0;const e=this.assigned.first().face;let i=e.outside;do{const o=e.distanceToPoint(i.point);o>t&&(t=o,s=i),i=i.next}while(i!==null&&i.face===e);return s}}computeHorizon(s,t,e,i){this.deleteFaceVertices(e),e.mark=$o;let o;t===null?o=t=e.getEdge(0):o=t.next;do{const n=o.twin,r=n.face;r.mark===cs&&(r.distanceToPoint(s)>this.tolerance?this.computeHorizon(s,n,r,i):i.push(o)),o=o.next}while(o!==t);return this}addAdjoiningFace(s,t){const e=Tt.create(s,t.tail(),t.head());return this.faces.push(e),e.getEdge(-1).setTwin(t.twin),e.getEdge(0)}addNewFaces(s,t){this.newFaces=[];let e=null,i=null;for(let o=0;o<t.length;o++){const n=t[o],r=this.addAdjoiningFace(s,n);e===null?e=r:r.next.setTwin(i),this.newFaces.push(r.face),i=r}return e.next.setTwin(i),this}addVertexToHull(s){const t=[];return this.unassigned.clear(),this.removeVertexFromFace(s,s.face),this.computeHorizon(s.point,null,s.face,t),this.addNewFaces(s,t),this.resolveUnassignedPoints(this.newFaces),this}cleanup(){return this.assigned.clear(),this.unassigned.clear(),this.newFaces=[],this}compute(){let s;for(this.computeInitialHull();(s=this.nextVertexToAdd())!==void 0;)this.addVertexToHull(s);return this.reindexFaces(),this.cleanup(),this}}class Tt{constructor(){this.normal=new C.Vector3,this.midpoint=new C.Vector3,this.area=0,this.constant=0,this.outside=null,this.mark=cs,this.edge=null}static create(s,t,e){const i=new Tt,o=new Ws(s,i),n=new Ws(t,i),r=new Ws(e,i);return o.next=r.prev=n,n.next=o.prev=r,r.next=n.prev=o,i.edge=o,i.compute()}getEdge(s){let t=this.edge;for(;s>0;)t=t.next,s--;for(;s<0;)t=t.prev,s++;return t}compute(){const s=this.edge.tail(),t=this.edge.head(),e=this.edge.next.head();return Je.set(s.point,t.point,e.point),Je.getNormal(this.normal),Je.getMidpoint(this.midpoint),this.area=Je.getArea(),this.constant=this.normal.dot(this.midpoint),this}distanceToPoint(s){return this.normal.dot(s)-this.constant}}class Ws{constructor(s,t){this.vertex=s,this.prev=null,this.next=null,this.twin=null,this.face=t}head(){return this.vertex}tail(){return this.prev?this.prev.vertex:null}length(){const s=this.head(),t=this.tail();return t!==null?t.point.distanceTo(s.point):-1}lengthSquared(){const s=this.head(),t=this.tail();return t!==null?t.point.distanceToSquared(s.point):-1}setTwin(s){return this.twin=s,s.twin=this,this}}class tr{constructor(s){this.point=s,this.prev=null,this.next=null,this.face=null}}class Qi{constructor(){this.head=null,this.tail=null}first(){return this.head}last(){return this.tail}clear(){return this.head=this.tail=null,this}insertBefore(s,t){return t.prev=s.prev,t.next=s,t.prev===null?this.head=t:t.prev.next=t,s.prev=t,this}insertAfter(s,t){return t.prev=s,t.next=s.next,t.next===null?this.tail=t:t.next.prev=t,s.next=t,this}append(s){return this.head===null?this.head=s:this.tail.next=s,s.prev=this.tail,s.next=null,this.tail=s,this}appendChain(s){for(this.head===null?this.head=s:this.tail.next=s,s.prev=this.tail;s.next!==null;)s=s.next;return this.tail=s,this}remove(s){return s.prev===null?this.head=s.next:s.prev.next=s.next,s.next===null?this.tail=s.prev:s.next.prev=s.prev,this}removeSubList(s,t){return s.prev===null?this.head=t.next:s.prev.next=t.next,t.next===null?this.tail=s.prev:t.next.prev=s.prev,this}isEmpty(){return this.head===null}}const ai=[2,2,1],ci=[1,0,0];function Ot(c,s){return c*3+s}function er(c){const s=c.elements;let t=0;for(let e=0;e<9;e++)t+=s[e]*s[e];return Math.sqrt(t)}function sr(c){const s=c.elements;let t=0;for(let e=0;e<3;e++){const i=s[Ot(ai[e],ci[e])];t+=2*i*i}return Math.sqrt(t)}function ir(c,s){let t=0,e=1;const i=c.elements;for(let l=0;l<3;l++){const E=Math.abs(i[Ot(ai[l],ci[l])]);E>t&&(t=E,e=l)}let o=1,n=0;const r=ci[e],a=ai[e];if(Math.abs(i[Ot(a,r)])>Number.EPSILON){const l=i[Ot(a,a)],E=i[Ot(r,r)],d=i[Ot(a,r)],h=(l-E)/2/d;let u;h<0?u=-1/(-h+Math.sqrt(1+h*h)):u=1/(h+Math.sqrt(1+h*h)),o=1/Math.sqrt(1+u*u),n=u*o}return s.identity(),s.elements[Ot(r,r)]=o,s.elements[Ot(a,a)]=o,s.elements[Ot(a,r)]=n,s.elements[Ot(r,a)]=-n,s}function nr(c,s){let t=0,e=0;const i=10;s.unitary.identity(),s.diagonal.copy(c);const o=s.unitary,n=s.diagonal,r=new S.Matrix3,a=new S.Matrix3,l=Number.EPSILON*er(n);for(;e<i&&sr(n)>l;)ir(n,r),a.copy(r).transpose(),n.multiply(r),n.premultiply(a),o.multiply(r),++t>2&&(e++,t=0);return s}function mn(c){const s=[];for(let st=0;st<c.length-2;st+=3){const Yt=c[st],J=c[st+1],Wt=c[st+2];s.push(new S.Vector3(Yt,J,Wt))}const t=new Jo;t.setFromPoints(s);const e={unitary:new S.Matrix3,diagonal:new S.Matrix3},i=t.faces,o=[],n=[];for(let st=0,Yt=i.length;st<Yt;st++){const J=i[st];let Wt=J.edge;o.length=0;do o.push(Wt),Wt=Wt.next;while(Wt!==J.edge);const Yn=o.length-2;for(let ve=1,Gn=Yn;ve<=Gn;ve++){const Ls=o[0].vertex,Ms=o[ve+0].vertex,ws=o[ve+1].vertex;n.push(Ls.point.x,Ls.point.y,Ls.point.z),n.push(Ms.point.x,Ms.point.y,Ms.point.z),n.push(ws.point.x,ws.point.y,ws.point.z)}}const r=new S.Vector3,a=new S.Vector3,l=new S.Vector3,E=new S.Vector3,d=new S.Vector3,h=new S.Vector3,u=new S.Vector3,p=new S.Vector3;let m=0,F=0,T=0,R=0,g=0,f=0,A=0;for(let st=0,Yt=n.length;st<Yt;st+=9){r.fromArray(n,st),a.fromArray(n,st+3),l.fromArray(n,st+6),u.set(0,0,0),u.add(r).add(a).add(l).divideScalar(3),E.subVectors(a,r),d.subVectors(l,r);const J=h.crossVectors(E,d).length()/2;p.add(h.copy(u).multiplyScalar(J)),m+=J,F+=(9*u.x*u.x+r.x*r.x+a.x*a.x+l.x*l.x)*(J/12),T+=(9*u.x*u.y+r.x*r.y+a.x*a.y+l.x*l.y)*(J/12),R+=(9*u.x*u.z+r.x*r.z+a.x*a.z+l.x*l.z)*(J/12),g+=(9*u.y*u.y+r.y*r.y+a.y*a.y+l.y*l.y)*(J/12),f+=(9*u.y*u.z+r.y*r.z+a.y*a.z+l.y*l.z)*(J/12),A+=(9*u.z*u.z+r.z*r.z+a.z*a.z+l.z*l.z)*(J/12)}p.divideScalar(m),F/=m,T/=m,R/=m,g/=m,f/=m,A/=m,F-=p.x*p.x,T-=p.x*p.y,R-=p.x*p.z,g-=p.y*p.y,f-=p.y*p.z,A-=p.z*p.z;const O=new S.Matrix3;O.elements[0]=F,O.elements[1]=T,O.elements[2]=R,O.elements[3]=T,O.elements[4]=g,O.elements[5]=f,O.elements[6]=R,O.elements[7]=f,O.elements[8]=A,nr(O,e);const _=e.unitary,y=new S.Vector3,N=new S.Vector3,L=new S.Vector3;_.extractBasis(y,N,L);let w=-1/0,M=-1/0,U=-1/0,b=1/0,v=1/0,z=1/0;for(let st=0,Yt=s.length;st<Yt;st++){const J=s[st];w=Math.max(y.dot(J),w),M=Math.max(N.dot(J),M),U=Math.max(L.dot(J),U),b=Math.min(y.dot(J),b),v=Math.min(N.dot(J),v),z=Math.min(L.dot(J),z)}y.multiplyScalar(.5*(b+w)),N.multiplyScalar(.5*(v+M)),L.multiplyScalar(.5*(z+U));const j=new S.Vector3,et=new S.Vector3,Z=new S.Matrix3;j.add(y).add(N).add(L),et.x=w-b,et.y=M-v,et.z=U-z,et.multiplyScalar(.5),Z.copy(_);const{x:vt,y:Bt,z:Vt}=et,be=new S.Matrix4;be.makeScale(vt*2,Bt*2,Vt*2);const Ee=new S.Matrix4;Ee.makeTranslation(-vt,-Bt,-Vt);const _i=new S.Matrix4;_i.makeTranslation(j.x,j.y,j.z);const yi=new S.Matrix4;yi.setFromMatrix3(Z);const de=new S.Matrix4;return de.multiply(_i),de.multiply(yi),de.multiply(Ee),de.multiply(be),{center:j,halfSizes:et,rotation:Z,transformation:de}}function Rn(c,s,t){const e=[c[0]-s[0],c[1]-s[1],c[2]-s[2]];return t[0]*e[0]+t[1]*e[1]+t[2]*e[2]>0}class li{static isTransparent(s){return s.transparent&&s.opacity<1}}const K=class K{static create(){const s=Math.random()*4294967295|0,t=Math.random()*4294967295|0,e=Math.random()*4294967295|0,i=Math.random()*4294967295|0;return`${K._lut[s&255]+K._lut[s>>8&255]+K._lut[s>>16&255]+K._lut[s>>24&255]}-${K._lut[t&255]}${K._lut[t>>8&255]}-${K._lut[t>>16&15|64]}${K._lut[t>>24&255]}-${K._lut[e&63|128]}${K._lut[e>>8&255]}-${K._lut[e>>16&255]}${K._lut[e>>24&255]}${K._lut[i&255]}${K._lut[i>>8&255]}${K._lut[i>>16&255]}${K._lut[i>>24&255]}`.toLowerCase()}static validate(s){if(!K._pattern.test(s))throw new Error(`${s} is not a valid UUID v4.
2
2
 
3
3
  - If you're the tool creator, you can take one from https://www.uuidgenerator.net/.
4
4
 
5
- - If you're using a platform tool, verify the uuid isn't misspelled or contact the tool creator.`)}};I($,"_pattern",/^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$/),I($,"_lut",["00","01","02","03","04","05","06","07","08","09","0a","0b","0c","0d","0e","0f","10","11","12","13","14","15","16","17","18","19","1a","1b","1c","1d","1e","1f","20","21","22","23","24","25","26","27","28","29","2a","2b","2c","2d","2e","2f","30","31","32","33","34","35","36","37","38","39","3a","3b","3c","3d","3e","3f","40","41","42","43","44","45","46","47","48","49","4a","4b","4c","4d","4e","4f","50","51","52","53","54","55","56","57","58","59","5a","5b","5c","5d","5e","5f","60","61","62","63","64","65","66","67","68","69","6a","6b","6c","6d","6e","6f","70","71","72","73","74","75","76","77","78","79","7a","7b","7c","7d","7e","7f","80","81","82","83","84","85","86","87","88","89","8a","8b","8c","8d","8e","8f","90","91","92","93","94","95","96","97","98","99","9a","9b","9c","9d","9e","9f","a0","a1","a2","a3","a4","a5","a6","a7","a8","a9","aa","ab","ac","ad","ae","af","b0","b1","b2","b3","b4","b5","b6","b7","b8","b9","ba","bb","bc","bd","be","bf","c0","c1","c2","c3","c4","c5","c6","c7","c8","c9","ca","cb","cc","cd","ce","cf","d0","d1","d2","d3","d4","d5","d6","d7","d8","d9","da","db","dc","dd","de","df","e0","e1","e2","e3","e4","e5","e6","e7","e8","e9","ea","eb","ec","ed","ee","ef","f0","f1","f2","f3","f4","f5","f6","f7","f8","f9","fa","fb","fc","fd","fe","ff"]);let re=$;class sr extends tt{constructor(t,e){super(t);I(this,"onVertexFound",new D);I(this,"onVertexLost",new D);I(this,"components");I(this,"_pickedPoint",null);I(this,"_config");I(this,"_enabled",!1);I(this,"_workingPlane",null);I(this,"onDisposed",new D);this.components=t,this.config={snapDistance:.25,showOnlyVertex:!1,...e},this.enabled=!1}set enabled(t){this._enabled=t,t||(this._pickedPoint=null)}get enabled(){return this._enabled}[Symbol.dispose](){throw new Error("Method not implemented.")}set workingPlane(t){this._workingPlane=t}get workingPlane(){return this._workingPlane}set config(t){this._config={...this._config,...t}}get config(){return this._config}dispose(){this.onVertexFound.reset(),this.onVertexLost.reset(),this.components=null,this.onDisposed.trigger(),this.onDisposed.reset()}get(t){if(!this.enabled)return this._pickedPoint;const o=this.components.get(ae).get(t).castRay();if(!o)return this._pickedPoint!==null&&(this.onVertexLost.trigger(),this._pickedPoint=null),this._pickedPoint;const n=this.getClosestVertex(o);return n?(this.workingPlane?Math.abs(this.workingPlane.distanceToPoint(n))<.001:!0)?((this._pickedPoint===null||!this._pickedPoint.equals(n))&&(this._pickedPoint=n.clone(),this.onVertexFound.trigger(this._pickedPoint)),this._pickedPoint):(this._pickedPoint=null,this._pickedPoint):(this._pickedPoint!==null&&(this.onVertexLost.trigger(),this._pickedPoint=null),this._pickedPoint)}getClosestVertex(t){let e=new S.Vector3,i=!1,o=Number.MAX_SAFE_INTEGER;const n=this.getVertices(t);return n==null||n.forEach(r=>{if(!r)return;const a=t.point.distanceTo(r);a>o||a>this._config.snapDistance||(i=!0,e=r,o=t.point.distanceTo(r))}),i?e:this.config.showOnlyVertex?null:t.point}getVertices(t){const e=t.object;if(!t.face||!e)return null;const i=e.geometry;return[this.getVertex(t.face.a,i),this.getVertex(t.face.b,i),this.getVertex(t.face.c,i)].map(o=>o==null?void 0:o.applyMatrix4(e.matrixWorld))}getVertex(t,e){if(t===void 0)return null;const i=e.attributes.position;return new S.Vector3(i.getX(t),i.getY(t),i.getZ(t))}}const fs=class fs{constructor(){I(this,"onDisposed",new D);I(this,"list",new Map);I(this,"enabled",!1);I(this,"_clock");I(this,"update",()=>{if(!this.enabled)return;const s=this._clock.getDelta();for(const[t,e]of this.list)e.enabled&&e.isUpdateable()&&e.update(s);requestAnimationFrame(this.update)});this._clock=new S.Clock,fs.setupBVH()}add(s,t){if(this.list.has(s))throw new Error("You're trying to add a component that already exists in the components intance. Use Components.get() instead.");re.validate(s),this.list.set(s,t)}get(s){const t=s.uuid;if(!this.list.has(t)){const e=new s(this);return this.list.has(t)||this.add(t,e),e}return this.list.get(t)}init(){this.enabled=!0,this._clock.start(),this.update()}dispose(){this.enabled=!1;for(const[s,t]of this.list)t.enabled=!1,t.isDisposeable()&&t.dispose();this._clock.stop(),this.onDisposed.trigger(),this.onDisposed.reset()}static setupBVH(){S.BufferGeometry.prototype.computeBoundsTree=Xo,S.BufferGeometry.prototype.disposeBoundsTree=Zo,S.Mesh.prototype.raycast=Wo}};I(fs,"release","1.4.21");let hs=fs;class ir{constructor(s){I(this,"_event");I(this,"_position",new S.Vector2);I(this,"onDisposed",new D);I(this,"updateMouseInfo",s=>{this._event=s});this.dom=s,this.setupEvents(!0)}get position(){if(this._event){const s=this.dom.getBoundingClientRect();this._position.x=this.getPositionX(s,this._event),this._position.y=this.getPositionY(s,this._event)}return this._position}dispose(){this.setupEvents(!1),this.onDisposed.trigger(),this.onDisposed.reset()}getPositionY(s,t){return-((t.clientY-s.top)/(s.bottom-s.top))*2+1}getPositionX(s,t){return(t.clientX-s.left)/(s.right-s.left)*2-1}setupEvents(s){s?this.dom.addEventListener("mousemove",this.updateMouseInfo):this.dom.removeEventListener("mousemove",this.updateMouseInfo)}}class nr{constructor(s,t){I(this,"enabled",!0);I(this,"components");I(this,"onDisposed",new D);I(this,"mouse");I(this,"three",new S.Raycaster);I(this,"world");const e=t.renderer;if(!e)throw new Error("A renderer is needed for the raycaster to work!");this.world=t,this.mouse=new ir(e.three.domElement),this.components=s}dispose(){this.mouse.dispose(),this.onDisposed.trigger(),this.onDisposed.reset()}castRay(s=Array.from(this.world.meshes)){if(!this.world)throw new Error("A world is needed to cast rays!");const t=this.world.camera.three;return this.three.setFromCamera(this.mouse.position,t),this.intersect(s)}castRayFromVector(s,t,e=Array.from(this.world.meshes)){return this.three.set(s,t),this.intersect(e)}intersect(s=Array.from(this.world.meshes)){const t=this.three.intersectObjects(s),e=this.filterClippingPlanes(t);return e.length>0?e[0]:null}filterClippingPlanes(s){if(!this.world.renderer)throw new Error("Renderer not found!");const t=this.world.renderer.three;if(!t.clippingPlanes)return s;const e=t.clippingPlanes;return s.length<=0||!e||(e==null?void 0:e.length)<=0?s:s.filter(i=>e.every(o=>o.distanceToPoint(i.point)>0))}}const ps=class ps extends tt{constructor(t){super(t);I(this,"enabled",!0);I(this,"list",new Map);I(this,"onDisposed",new D);t.add(ps.uuid,this)}get(t){if(this.list.has(t.uuid))return this.list.get(t.uuid);const e=new nr(this.components,t);return this.list.set(t.uuid,e),t.onDisposed.add(()=>{this.delete(t)}),e}delete(t){const e=this.list.get(t.uuid);e&&e.dispose(),this.list.delete(t.uuid)}dispose(){for(const[t,e]of this.list)e.dispose();this.list.clear(),this.onDisposed.trigger()}};I(ps,"uuid","d5d8bdf0-db25-4952-b951-b643af207ace");let ae=ps;class Cn extends Os{constructor(t){super(t);I(this,"meshes",new Set);I(this,"onAfterUpdate",new D);I(this,"onBeforeUpdate",new D);I(this,"enabled",!0);I(this,"uuid",re.create());I(this,"onDisposed",new D);I(this,"_scene");I(this,"_camera");I(this,"_renderer",null)}get scene(){if(!this._scene)throw new Error("No scene initialized!");return this._scene}set scene(t){this._scene=t,t.worlds.set(this.uuid,this),t.currentWorld=this,t.onWorldChanged.trigger({world:this,action:"added"})}get camera(){if(!this._camera)throw new Error("No camera initialized!");return this._camera}set camera(t){this._camera=t,t.worlds.set(this.uuid,this),t.currentWorld=this,t.onWorldChanged.trigger({world:this,action:"added"})}get renderer(){return this._renderer}set renderer(t){this._renderer=t,t&&(t.worlds.set(this.uuid,this),t.currentWorld=this,t.onWorldChanged.trigger({world:this,action:"added"}))}update(t){this.enabled&&(!this._scene||!this._camera||(this.scene.currentWorld=this,this.camera.currentWorld=this,this.renderer&&(this.renderer.currentWorld=this),this.onBeforeUpdate.trigger(),this.scene.isUpdateable()&&this.scene.update(t),this.camera.isUpdateable()&&this.camera.update(t),this.renderer&&this.renderer.update(t),this.onAfterUpdate.trigger()))}dispose(t=!0){if(this.enabled=!1,this.scene.onWorldChanged.trigger({world:this,action:"removed"}),this.camera.onWorldChanged.trigger({world:this,action:"removed"}),this.renderer&&this.renderer.onWorldChanged.trigger({world:this,action:"removed"}),t){const e=this.components.get(yt);this.scene.dispose(),this.camera.isDisposeable()&&this.camera.dispose(),this.renderer&&this.renderer.dispose();for(const i of this.meshes)e.destroy(i);this.meshes.clear()}this._scene=null,this._camera=null,this._renderer=null,this.onDisposed.trigger()}}class or extends In{constructor(t){super(t);I(this,"isSetup",!1);I(this,"three");I(this,"onSetup",new D);I(this,"config",{directionalLight:{color:new S.Color("white"),intensity:1.5,position:new S.Vector3(5,10,3)},ambientLight:{color:new S.Color("white"),intensity:1}});this.three=new S.Scene,this.three.background=new S.Color(2107698)}setup(t){this.config={...this.config,...t};const e=new S.DirectionalLight(this.config.directionalLight.color,this.config.directionalLight.intensity);e.position.copy(this.config.directionalLight.position);const i=new S.AmbientLight(this.config.ambientLight.color,this.config.ambientLight.intensity);this.three.add(e,i),this.isSetup=!0,this.onSetup.trigger(this)}}class rr extends un{constructor(t,e,i){super(t);I(this,"enabled",!0);I(this,"container");I(this,"three");I(this,"_canvas");I(this,"_parameters");I(this,"onContainerUpdated",new D);I(this,"resize",t=>{if(this.updateContainer(),!this.container)return;const e=t?t.x:this.container.clientWidth,i=t?t.y:this.container.clientHeight;this.three.setSize(e,i),this.onResize.trigger(new S.Vector2(e,i))});I(this,"resizeEvent",()=>{this.resize()});I(this,"onContextLost",t=>{t.preventDefault(),this.components.enabled=!1});I(this,"onContextBack",()=>{this.three.setRenderTarget(null),this.three.dispose(),this.three=new S.WebGLRenderer({canvas:this._canvas,antialias:!0,alpha:!0,...this._parameters}),this.components.enabled=!0});this.container=e||null,this._parameters=i,this.three=new S.WebGLRenderer({antialias:!0,alpha:!0,...i}),this.three.setPixelRatio(Math.min(window.devicePixelRatio,2)),this.setupRenderer(),this.setupEvents(!0),this.resize(),this._canvas=this.three.domElement;const o=this.three.getContext(),{canvas:n}=o;n.addEventListener("webglcontextlost",this.onContextLost,!1),n.addEventListener("webglcontextrestored",this.onContextBack,!1)}update(){if(!this.enabled||!this.currentWorld)return;this.onBeforeUpdate.trigger(this);const t=this.currentWorld.scene.three,e=this.currentWorld.camera.three;this.three.render(t,e),this.onAfterUpdate.trigger(this)}dispose(){this.enabled=!1,this.setupEvents(!1),this.three.domElement.remove(),this.three.dispose(),this.onResize.reset(),this.onAfterUpdate.reset(),this.onBeforeUpdate.reset(),this.onDisposed.trigger(),this.onDisposed.reset()}getSize(){return new S.Vector2(this.three.domElement.clientWidth,this.three.domElement.clientHeight)}setupEvents(t){const e=this.three.domElement;t?e.addEventListener("resize",this.resizeEvent):e.removeEventListener("resize",this.resizeEvent)}setupRenderer(){this.three.localClippingEnabled=!0,this.container&&this.container.appendChild(this.three.domElement),this.updateContainer()}updateContainer(){if(!this.container){const t=this.three.domElement.parentElement;t&&(this.container=t,this.onContainerUpdated.trigger(t))}}}/*!
5
+ - If you're using a platform tool, verify the uuid isn't misspelled or contact the tool creator.`)}};I(K,"_pattern",/^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$/),I(K,"_lut",["00","01","02","03","04","05","06","07","08","09","0a","0b","0c","0d","0e","0f","10","11","12","13","14","15","16","17","18","19","1a","1b","1c","1d","1e","1f","20","21","22","23","24","25","26","27","28","29","2a","2b","2c","2d","2e","2f","30","31","32","33","34","35","36","37","38","39","3a","3b","3c","3d","3e","3f","40","41","42","43","44","45","46","47","48","49","4a","4b","4c","4d","4e","4f","50","51","52","53","54","55","56","57","58","59","5a","5b","5c","5d","5e","5f","60","61","62","63","64","65","66","67","68","69","6a","6b","6c","6d","6e","6f","70","71","72","73","74","75","76","77","78","79","7a","7b","7c","7d","7e","7f","80","81","82","83","84","85","86","87","88","89","8a","8b","8c","8d","8e","8f","90","91","92","93","94","95","96","97","98","99","9a","9b","9c","9d","9e","9f","a0","a1","a2","a3","a4","a5","a6","a7","a8","a9","aa","ab","ac","ad","ae","af","b0","b1","b2","b3","b4","b5","b6","b7","b8","b9","ba","bb","bc","bd","be","bf","c0","c1","c2","c3","c4","c5","c6","c7","c8","c9","ca","cb","cc","cd","ce","cf","d0","d1","d2","d3","d4","d5","d6","d7","d8","d9","da","db","dc","dd","de","df","e0","e1","e2","e3","e4","e5","e6","e7","e8","e9","ea","eb","ec","ed","ee","ef","f0","f1","f2","f3","f4","f5","f6","f7","f8","f9","fa","fb","fc","fd","fe","ff"]);let ae=K;class or extends ${constructor(t,e){super(t);I(this,"onVertexFound",new D);I(this,"onVertexLost",new D);I(this,"components");I(this,"_pickedPoint",null);I(this,"_config");I(this,"_enabled",!1);I(this,"_workingPlane",null);I(this,"onDisposed",new D);this.components=t,this.config={snapDistance:.25,showOnlyVertex:!1,...e},this.enabled=!1}set enabled(t){this._enabled=t,t||(this._pickedPoint=null)}get enabled(){return this._enabled}[Symbol.dispose](){throw new Error("Method not implemented.")}set workingPlane(t){this._workingPlane=t}get workingPlane(){return this._workingPlane}set config(t){this._config={...this._config,...t}}get config(){return this._config}dispose(){this.onVertexFound.reset(),this.onVertexLost.reset(),this.components=null,this.onDisposed.trigger(),this.onDisposed.reset()}get(t){if(!this.enabled)return this._pickedPoint;const o=this.components.get(ce).get(t).castRay();if(!o)return this._pickedPoint!==null&&(this.onVertexLost.trigger(),this._pickedPoint=null),this._pickedPoint;const n=this.getClosestVertex(o);return n?(this.workingPlane?Math.abs(this.workingPlane.distanceToPoint(n))<.001:!0)?((this._pickedPoint===null||!this._pickedPoint.equals(n))&&(this._pickedPoint=n.clone(),this.onVertexFound.trigger(this._pickedPoint)),this._pickedPoint):(this._pickedPoint=null,this._pickedPoint):(this._pickedPoint!==null&&(this.onVertexLost.trigger(),this._pickedPoint=null),this._pickedPoint)}getClosestVertex(t){let e=new S.Vector3,i=!1,o=Number.MAX_SAFE_INTEGER;const n=this.getVertices(t);return n==null||n.forEach(r=>{if(!r)return;const a=t.point.distanceTo(r);a>o||a>this._config.snapDistance||(i=!0,e=r,o=t.point.distanceTo(r))}),i?e:this.config.showOnlyVertex?null:t.point}getVertices(t){const e=t.object;if(!t.face||!e)return null;const i=e.geometry;return[this.getVertex(t.face.a,i),this.getVertex(t.face.b,i),this.getVertex(t.face.c,i)].map(o=>o==null?void 0:o.applyMatrix4(e.matrixWorld))}getVertex(t,e){if(t===void 0)return null;const i=e.attributes.position;return new S.Vector3(i.getX(t),i.getY(t),i.getZ(t))}}const Cs=class Cs{constructor(){I(this,"onDisposed",new D);I(this,"list",new Map);I(this,"enabled",!1);I(this,"_clock");I(this,"update",()=>{if(!this.enabled)return;const s=this._clock.getDelta();for(const[t,e]of this.list)e.enabled&&e.isUpdateable()&&e.update(s);requestAnimationFrame(this.update)});this._clock=new S.Clock,Cs.setupBVH()}add(s,t){if(this.list.has(s))throw new Error("You're trying to add a component that already exists in the components intance. Use Components.get() instead.");ae.validate(s),this.list.set(s,t)}get(s){const t=s.uuid;if(!this.list.has(t)){const e=new s(this);return this.list.has(t)||this.add(t,e),e}return this.list.get(t)}init(){this.enabled=!0,this._clock.start(),this.update()}dispose(){this.enabled=!1;for(const[s,t]of this.list)t.enabled=!1,t.isDisposeable()&&t.dispose();this._clock.stop(),this.onDisposed.trigger(),this.onDisposed.reset()}static setupBVH(){S.BufferGeometry.prototype.computeBoundsTree=jo,S.BufferGeometry.prototype.disposeBoundsTree=qo,S.Mesh.prototype.raycast=Qo}};I(Cs,"release","1.4.21");let Es=Cs;class rr{constructor(s){I(this,"_event");I(this,"_position",new S.Vector2);I(this,"onDisposed",new D);I(this,"updateMouseInfo",s=>{this._event=s});this.dom=s,this.setupEvents(!0)}get position(){if(this._event){const s=this.dom.getBoundingClientRect();this._position.x=this.getPositionX(s,this._event),this._position.y=this.getPositionY(s,this._event)}return this._position}dispose(){this.setupEvents(!1),this.onDisposed.trigger(),this.onDisposed.reset()}getPositionY(s,t){return-((t.clientY-s.top)/(s.bottom-s.top))*2+1}getPositionX(s,t){return(t.clientX-s.left)/(s.right-s.left)*2-1}setupEvents(s){s?this.dom.addEventListener("mousemove",this.updateMouseInfo):this.dom.removeEventListener("mousemove",this.updateMouseInfo)}}class ar{constructor(s,t){I(this,"enabled",!0);I(this,"components");I(this,"onDisposed",new D);I(this,"mouse");I(this,"three",new S.Raycaster);I(this,"world");const e=t.renderer;if(!e)throw new Error("A renderer is needed for the raycaster to work!");this.world=t,this.mouse=new rr(e.three.domElement),this.components=s}dispose(){this.mouse.dispose(),this.onDisposed.trigger(),this.onDisposed.reset()}castRay(s=Array.from(this.world.meshes)){if(!this.world)throw new Error("A world is needed to cast rays!");const t=this.world.camera.three;return this.three.setFromCamera(this.mouse.position,t),this.intersect(s)}castRayFromVector(s,t,e=Array.from(this.world.meshes)){return this.three.set(s,t),this.intersect(e)}intersect(s=Array.from(this.world.meshes)){const t=this.three.intersectObjects(s),e=this.filterClippingPlanes(t);return e.length>0?e[0]:null}filterClippingPlanes(s){if(!this.world.renderer)throw new Error("Renderer not found!");const t=this.world.renderer.three;if(!t.clippingPlanes)return s;const e=t.clippingPlanes;return s.length<=0||!e||(e==null?void 0:e.length)<=0?s:s.filter(i=>e.every(o=>o.distanceToPoint(i.point)>0))}}const Ts=class Ts extends ${constructor(t){super(t);I(this,"enabled",!0);I(this,"list",new Map);I(this,"onDisposed",new D);t.add(Ts.uuid,this)}get(t){if(this.list.has(t.uuid))return this.list.get(t.uuid);const e=new ar(this.components,t);return this.list.set(t.uuid,e),t.onDisposed.add(()=>{this.delete(t)}),e}delete(t){const e=this.list.get(t.uuid);e&&e.dispose(),this.list.delete(t.uuid)}dispose(){for(const[t,e]of this.list)e.dispose();this.list.clear(),this.onDisposed.trigger()}};I(Ts,"uuid","d5d8bdf0-db25-4952-b951-b643af207ace");let ce=Ts;class An extends ys{constructor(t){super(t);I(this,"meshes",new Set);I(this,"onAfterUpdate",new D);I(this,"onBeforeUpdate",new D);I(this,"enabled",!0);I(this,"uuid",ae.create());I(this,"onDisposed",new D);I(this,"_scene");I(this,"_camera");I(this,"_renderer",null)}get scene(){if(!this._scene)throw new Error("No scene initialized!");return this._scene}set scene(t){this._scene=t,t.worlds.set(this.uuid,this),t.currentWorld=this,t.onWorldChanged.trigger({world:this,action:"added"})}get camera(){if(!this._camera)throw new Error("No camera initialized!");return this._camera}set camera(t){this._camera=t,t.worlds.set(this.uuid,this),t.currentWorld=this,t.onWorldChanged.trigger({world:this,action:"added"})}get renderer(){return this._renderer}set renderer(t){this._renderer=t,t&&(t.worlds.set(this.uuid,this),t.currentWorld=this,t.onWorldChanged.trigger({world:this,action:"added"}))}update(t){this.enabled&&(!this._scene||!this._camera||(this.scene.currentWorld=this,this.camera.currentWorld=this,this.renderer&&(this.renderer.currentWorld=this),this.onBeforeUpdate.trigger(),this.scene.isUpdateable()&&this.scene.update(t),this.camera.isUpdateable()&&this.camera.update(t),this.renderer&&this.renderer.update(t),this.onAfterUpdate.trigger()))}dispose(t=!0){if(this.enabled=!1,this.scene.onWorldChanged.trigger({world:this,action:"removed"}),this.camera.onWorldChanged.trigger({world:this,action:"removed"}),this.renderer&&this.renderer.onWorldChanged.trigger({world:this,action:"removed"}),t){const e=this.components.get(yt);this.scene.dispose(),this.camera.isDisposeable()&&this.camera.dispose(),this.renderer&&this.renderer.dispose();for(const i of this.meshes)e.destroy(i);this.meshes.clear()}this._scene=null,this._camera=null,this._renderer=null,this.onDisposed.trigger()}}class cr extends Tn{constructor(t){super(t);I(this,"isSetup",!1);I(this,"three");I(this,"onSetup",new D);I(this,"config",{directionalLight:{color:new S.Color("white"),intensity:1.5,position:new S.Vector3(5,10,3)},ambientLight:{color:new S.Color("white"),intensity:1}});this.three=new S.Scene,this.three.background=new S.Color(2107698)}setup(t){this.config={...this.config,...t};const e=new S.DirectionalLight(this.config.directionalLight.color,this.config.directionalLight.intensity);e.position.copy(this.config.directionalLight.position);const i=new S.AmbientLight(this.config.ambientLight.color,this.config.ambientLight.intensity);this.three.add(e,i),this.isSetup=!0,this.onSetup.trigger(this)}}class lr extends Cn{constructor(t,e,i){super(t);I(this,"enabled",!0);I(this,"container");I(this,"three");I(this,"_canvas");I(this,"_parameters");I(this,"_resizeObserver",null);I(this,"onContainerUpdated",new D);I(this,"resize",t=>{this.onContainerUpdated.trigger();const e=t?t.x:this.container.clientWidth,i=t?t.y:this.container.clientHeight;this.three.setSize(e,i),this.onResize.trigger(new S.Vector2(e,i))});I(this,"resizeEvent",()=>{this.resize()});I(this,"onContextLost",t=>{t.preventDefault(),this.enabled=!1});I(this,"onContextBack",()=>{this.three.setRenderTarget(null),this.three.dispose(),this.three=new S.WebGLRenderer({canvas:this._canvas,antialias:!0,alpha:!0,...this._parameters}),this.enabled=!0});this.container=e,this._parameters=i,this.three=new S.WebGLRenderer({antialias:!0,alpha:!0,...i}),this.three.setPixelRatio(Math.min(window.devicePixelRatio,2)),this.setupRenderer(),this.setupEvents(!0),this.resize(),this._canvas=this.three.domElement;const o=this.three.getContext(),{canvas:n}=o;n.addEventListener("webglcontextlost",this.onContextLost,!1),n.addEventListener("webglcontextrestored",this.onContextBack,!1)}update(){if(!this.enabled||!this.currentWorld)return;this.onBeforeUpdate.trigger(this);const t=this.currentWorld.scene.three,e=this.currentWorld.camera.three;this.three.render(t,e),this.onAfterUpdate.trigger(this)}dispose(){this.enabled=!1,this.setupEvents(!1),this.three.domElement.remove(),this.three.dispose(),this.onResize.reset(),this.onAfterUpdate.reset(),this.onBeforeUpdate.reset(),this.onDisposed.trigger(),this.onDisposed.reset()}getSize(){return new S.Vector2(this.three.domElement.clientWidth,this.three.domElement.clientHeight)}setupEvents(t){const e=this.three.domElement.parentElement;if(!e)throw new Error("This renderer needs to have an HTML container!");this._resizeObserver&&(this._resizeObserver.disconnect(),this._resizeObserver=null),window.removeEventListener("resize",this.resizeEvent),t&&(this._resizeObserver=new ResizeObserver(this.resizeEvent),this._resizeObserver.observe(e),this._resizeObserver.observe(document.body),window.addEventListener("resize",this.resizeEvent))}setupRenderer(){this.three.localClippingEnabled=!0,this.container&&this.container.appendChild(this.three.domElement),this.onContainerUpdated.trigger()}}/*!
6
6
  * camera-controls
7
7
  * https://github.com/yomotsu/camera-controls
8
8
  * (c) 2017 @yomotsu
9
9
  * Released under the MIT License.
10
- */const V={LEFT:1,RIGHT:2,MIDDLE:4},L=Object.freeze({NONE:0,ROTATE:1,TRUCK:2,OFFSET:4,DOLLY:8,ZOOM:16,TOUCH_ROTATE:32,TOUCH_TRUCK:64,TOUCH_OFFSET:128,TOUCH_DOLLY:256,TOUCH_ZOOM:512,TOUCH_DOLLY_TRUCK:1024,TOUCH_DOLLY_OFFSET:2048,TOUCH_DOLLY_ROTATE:4096,TOUCH_ZOOM_TRUCK:8192,TOUCH_ZOOM_OFFSET:16384,TOUCH_ZOOM_ROTATE:32768}),ee={NONE:0,IN:1,OUT:-1};function Vt(c){return c.isPerspectiveCamera}function Pt(c){return c.isOrthographicCamera}const se=Math.PI*2,ki=Math.PI/2,Tn=1e-5,Te=Math.PI/180;function Ct(c,s,t){return Math.max(s,Math.min(t,c))}function W(c,s=Tn){return Math.abs(c)<s}function H(c,s,t=Tn){return W(c-s,t)}function Wi(c,s){return Math.round(c/s)*s}function me(c){return isFinite(c)?c:c<0?-Number.MAX_VALUE:Number.MAX_VALUE}function Re(c){return Math.abs(c)<Number.MAX_VALUE?c:c*(1/0)}function Je(c,s,t,e,i=1/0,o){e=Math.max(1e-4,e);const n=2/e,r=n*o,a=1/(1+r+.48*r*r+.235*r*r*r);let l=c-s;const E=s,d=i*e;l=Ct(l,-d,d),s=c-l;const h=(t.value+n*l)*o;t.value=(t.value-n*h)*a;let u=s+(l+h)*a;return E-c>0==u>E&&(u=E,t.value=(u-E)/o),u}function Xi(c,s,t,e,i=1/0,o,n){e=Math.max(1e-4,e);const r=2/e,a=r*o,l=1/(1+a+.48*a*a+.235*a*a*a);let E=s.x,d=s.y,h=s.z,u=c.x-E,p=c.y-d,A=c.z-h;const F=E,T=d,m=h,g=i*e,f=g*g,R=u*u+p*p+A*A;if(R>f){const v=Math.sqrt(R);u=u/v*g,p=p/v*g,A=A/v*g}E=c.x-u,d=c.y-p,h=c.z-A;const O=(t.x+r*u)*o,_=(t.y+r*p)*o,y=(t.z+r*A)*o;t.x=(t.x-r*O)*l,t.y=(t.y-r*_)*l,t.z=(t.z-r*y)*l,n.x=E+(u+O)*l,n.y=d+(p+_)*l,n.z=h+(A+y)*l;const N=F-c.x,P=T-c.y,w=m-c.z,M=n.x-F,U=n.y-T,x=n.z-m;return N*M+P*U+w*x>0&&(n.x=F,n.y=T,n.z=m,t.x=(n.x-F)/o,t.y=(n.y-T)/o,t.z=(n.z-m)/o),n}function Hs(c,s){s.set(0,0),c.forEach(t=>{s.x+=t.clientX,s.y+=t.clientY}),s.x/=c.length,s.y/=c.length}function ks(c,s){return Pt(c)?(console.warn(`${s} is not supported in OrthographicCamera`),!0):!1}class ar{constructor(){this._listeners={}}addEventListener(s,t){const e=this._listeners;e[s]===void 0&&(e[s]=[]),e[s].indexOf(t)===-1&&e[s].push(t)}hasEventListener(s,t){const e=this._listeners;return e[s]!==void 0&&e[s].indexOf(t)!==-1}removeEventListener(s,t){const i=this._listeners[s];if(i!==void 0){const o=i.indexOf(t);o!==-1&&i.splice(o,1)}}removeAllEventListeners(s){if(!s){this._listeners={};return}Array.isArray(this._listeners[s])&&(this._listeners[s].length=0)}dispatchEvent(s){const e=this._listeners[s.type];if(e!==void 0){s.target=this;const i=e.slice(0);for(let o=0,n=i.length;o<n;o++)i[o].call(this,s)}}}const cr="2.7.3",ts=1/8,mn=typeof window<"u",lr=mn&&/Mac/.test(navigator.platform),hr=!(mn&&"PointerEvent"in window);let B,Zi,es,Ws,rt,Y,G,ie,Ae,At,Ft,Yt,Qi,ji,ht,Fe,ne,qi,Xs,$i,Zs,Qs,ss;class nt extends ar{static install(s){B=s.THREE,Zi=Object.freeze(new B.Vector3(0,0,0)),es=Object.freeze(new B.Vector3(0,1,0)),Ws=Object.freeze(new B.Vector3(0,0,1)),rt=new B.Vector2,Y=new B.Vector3,G=new B.Vector3,ie=new B.Vector3,Ae=new B.Vector3,At=new B.Vector3,Ft=new B.Vector3,Yt=new B.Vector3,Qi=new B.Vector3,ji=new B.Vector3,ht=new B.Spherical,Fe=new B.Spherical,ne=new B.Box3,qi=new B.Box3,Xs=new B.Sphere,$i=new B.Quaternion,Zs=new B.Quaternion,Qs=new B.Matrix4,ss=new B.Raycaster}static get ACTION(){return L}constructor(s,t){super(),this.minPolarAngle=0,this.maxPolarAngle=Math.PI,this.minAzimuthAngle=-1/0,this.maxAzimuthAngle=1/0,this.minDistance=Number.EPSILON,this.maxDistance=1/0,this.infinityDolly=!1,this.minZoom=.01,this.maxZoom=1/0,this.smoothTime=.25,this.draggingSmoothTime=.125,this.maxSpeed=1/0,this.azimuthRotateSpeed=1,this.polarRotateSpeed=1,this.dollySpeed=1,this.dollyDragInverted=!1,this.truckSpeed=2,this.dollyToCursor=!1,this.dragToOffset=!1,this.verticalDragToForward=!1,this.boundaryFriction=0,this.restThreshold=.01,this.colliderMeshes=[],this.cancel=()=>{},this._enabled=!0,this._state=L.NONE,this._viewport=null,this._changedDolly=0,this._changedZoom=0,this._hasRested=!0,this._boundaryEnclosesCamera=!1,this._needsUpdate=!0,this._updatedLastTime=!1,this._elementRect=new DOMRect,this._isDragging=!1,this._dragNeedsUpdate=!0,this._activePointers=[],this._lockedPointer=null,this._interactiveArea=new DOMRect(0,0,1,1),this._isUserControllingRotate=!1,this._isUserControllingDolly=!1,this._isUserControllingTruck=!1,this._isUserControllingOffset=!1,this._isUserControllingZoom=!1,this._lastDollyDirection=ee.NONE,this._thetaVelocity={value:0},this._phiVelocity={value:0},this._radiusVelocity={value:0},this._targetVelocity=new B.Vector3,this._focalOffsetVelocity=new B.Vector3,this._zoomVelocity={value:0},this._truckInternal=(f,R,O)=>{let _,y;if(Vt(this._camera)){const N=Y.copy(this._camera.position).sub(this._target),P=this._camera.getEffectiveFOV()*Te,w=N.length()*Math.tan(P*.5);_=this.truckSpeed*f*w/this._elementRect.height,y=this.truckSpeed*R*w/this._elementRect.height}else if(Pt(this._camera)){const N=this._camera;_=f*(N.right-N.left)/N.zoom/this._elementRect.width,y=R*(N.top-N.bottom)/N.zoom/this._elementRect.height}else return;this.verticalDragToForward?(O?this.setFocalOffset(this._focalOffsetEnd.x+_,this._focalOffsetEnd.y,this._focalOffsetEnd.z,!0):this.truck(_,0,!0),this.forward(-y,!0)):O?this.setFocalOffset(this._focalOffsetEnd.x+_,this._focalOffsetEnd.y+y,this._focalOffsetEnd.z,!0):this.truck(_,y,!0)},this._rotateInternal=(f,R)=>{const O=se*this.azimuthRotateSpeed*f/this._elementRect.height,_=se*this.polarRotateSpeed*R/this._elementRect.height;this.rotate(O,_,!0)},this._dollyInternal=(f,R,O)=>{const _=Math.pow(.95,-f*this.dollySpeed),y=this._sphericalEnd.radius,N=this._sphericalEnd.radius*_,P=Ct(N,this.minDistance,this.maxDistance),w=P-N;this.infinityDolly&&this.dollyToCursor?this._dollyToNoClamp(N,!0):this.infinityDolly&&!this.dollyToCursor?(this.dollyInFixed(w,!0),this._dollyToNoClamp(P,!0)):this._dollyToNoClamp(P,!0),this.dollyToCursor&&(this._changedDolly+=(this.infinityDolly?N:P)-y,this._dollyControlCoord.set(R,O)),this._lastDollyDirection=Math.sign(-f)},this._zoomInternal=(f,R,O)=>{const _=Math.pow(.95,f*this.dollySpeed),y=this._zoom,N=this._zoom*_;this.zoomTo(N,!0),this.dollyToCursor&&(this._changedZoom+=N-y,this._dollyControlCoord.set(R,O))},typeof B>"u"&&console.error("camera-controls: `THREE` is undefined. You must first run `CameraControls.install( { THREE: THREE } )`. Check the docs for further information."),this._camera=s,this._yAxisUpSpace=new B.Quaternion().setFromUnitVectors(this._camera.up,es),this._yAxisUpSpaceInverse=this._yAxisUpSpace.clone().invert(),this._state=L.NONE,this._target=new B.Vector3,this._targetEnd=this._target.clone(),this._focalOffset=new B.Vector3,this._focalOffsetEnd=this._focalOffset.clone(),this._spherical=new B.Spherical().setFromVector3(Y.copy(this._camera.position).applyQuaternion(this._yAxisUpSpace)),this._sphericalEnd=this._spherical.clone(),this._lastDistance=this._spherical.radius,this._zoom=this._camera.zoom,this._zoomEnd=this._zoom,this._lastZoom=this._zoom,this._nearPlaneCorners=[new B.Vector3,new B.Vector3,new B.Vector3,new B.Vector3],this._updateNearPlaneCorners(),this._boundary=new B.Box3(new B.Vector3(-1/0,-1/0,-1/0),new B.Vector3(1/0,1/0,1/0)),this._cameraUp0=this._camera.up.clone(),this._target0=this._target.clone(),this._position0=this._camera.position.clone(),this._zoom0=this._zoom,this._focalOffset0=this._focalOffset.clone(),this._dollyControlCoord=new B.Vector2,this.mouseButtons={left:L.ROTATE,middle:L.DOLLY,right:L.TRUCK,wheel:Vt(this._camera)?L.DOLLY:Pt(this._camera)?L.ZOOM:L.NONE},this.touches={one:L.TOUCH_ROTATE,two:Vt(this._camera)?L.TOUCH_DOLLY_TRUCK:Pt(this._camera)?L.TOUCH_ZOOM_TRUCK:L.NONE,three:L.TOUCH_TRUCK};const e=new B.Vector2,i=new B.Vector2,o=new B.Vector2,n=f=>{if(!this._enabled||!this._domElement)return;if(this._interactiveArea.left!==0||this._interactiveArea.top!==0||this._interactiveArea.width!==1||this._interactiveArea.height!==1){const _=this._domElement.getBoundingClientRect(),y=f.clientX/_.width,N=f.clientY/_.height;if(y<this._interactiveArea.left||y>this._interactiveArea.right||N<this._interactiveArea.top||N>this._interactiveArea.bottom)return}const R=f.pointerType!=="mouse"?null:(f.buttons&V.LEFT)===V.LEFT?V.LEFT:(f.buttons&V.MIDDLE)===V.MIDDLE?V.MIDDLE:(f.buttons&V.RIGHT)===V.RIGHT?V.RIGHT:null;if(R!==null){const _=this._findPointerByMouseButton(R);_&&this._disposePointer(_)}if((f.buttons&V.LEFT)===V.LEFT&&this._lockedPointer)return;const O={pointerId:f.pointerId,clientX:f.clientX,clientY:f.clientY,deltaX:0,deltaY:0,mouseButton:R};this._activePointers.push(O),this._domElement.ownerDocument.removeEventListener("pointermove",a,{passive:!1}),this._domElement.ownerDocument.removeEventListener("pointerup",E),this._domElement.ownerDocument.addEventListener("pointermove",a,{passive:!1}),this._domElement.ownerDocument.addEventListener("pointerup",E),this._isDragging=!0,A(f)},r=f=>{if(!this._enabled||!this._domElement||this._lockedPointer)return;if(this._interactiveArea.left!==0||this._interactiveArea.top!==0||this._interactiveArea.width!==1||this._interactiveArea.height!==1){const _=this._domElement.getBoundingClientRect(),y=f.clientX/_.width,N=f.clientY/_.height;if(y<this._interactiveArea.left||y>this._interactiveArea.right||N<this._interactiveArea.top||N>this._interactiveArea.bottom)return}const R=(f.buttons&V.LEFT)===V.LEFT?V.LEFT:(f.buttons&V.MIDDLE)===V.MIDDLE?V.MIDDLE:(f.buttons&V.RIGHT)===V.RIGHT?V.RIGHT:null;if(R!==null){const _=this._findPointerByMouseButton(R);_&&this._disposePointer(_)}const O={pointerId:1,clientX:f.clientX,clientY:f.clientY,deltaX:0,deltaY:0,mouseButton:(f.buttons&V.LEFT)===V.LEFT?V.LEFT:(f.buttons&V.MIDDLE)===V.LEFT?V.MIDDLE:(f.buttons&V.RIGHT)===V.LEFT?V.RIGHT:null};this._activePointers.push(O),this._domElement.ownerDocument.removeEventListener("mousemove",l),this._domElement.ownerDocument.removeEventListener("mouseup",d),this._domElement.ownerDocument.addEventListener("mousemove",l),this._domElement.ownerDocument.addEventListener("mouseup",d),this._isDragging=!0,A(f)},a=f=>{f.cancelable&&f.preventDefault();const R=f.pointerId,O=this._lockedPointer||this._findPointerById(R);if(O){if(O.clientX=f.clientX,O.clientY=f.clientY,O.deltaX=f.movementX,O.deltaY=f.movementY,this._state=0,f.pointerType==="touch")switch(this._activePointers.length){case 1:this._state=this.touches.one;break;case 2:this._state=this.touches.two;break;case 3:this._state=this.touches.three;break}else(!this._isDragging&&this._lockedPointer||this._isDragging&&(f.buttons&V.LEFT)===V.LEFT)&&(this._state=this._state|this.mouseButtons.left),this._isDragging&&(f.buttons&V.MIDDLE)===V.MIDDLE&&(this._state=this._state|this.mouseButtons.middle),this._isDragging&&(f.buttons&V.RIGHT)===V.RIGHT&&(this._state=this._state|this.mouseButtons.right);F()}},l=f=>{const R=this._lockedPointer||this._findPointerById(1);R&&(R.clientX=f.clientX,R.clientY=f.clientY,R.deltaX=f.movementX,R.deltaY=f.movementY,this._state=0,(this._lockedPointer||(f.buttons&V.LEFT)===V.LEFT)&&(this._state=this._state|this.mouseButtons.left),(f.buttons&V.MIDDLE)===V.MIDDLE&&(this._state=this._state|this.mouseButtons.middle),(f.buttons&V.RIGHT)===V.RIGHT&&(this._state=this._state|this.mouseButtons.right),F())},E=f=>{const R=this._findPointerById(f.pointerId);if(!(R&&R===this._lockedPointer)){if(R&&this._disposePointer(R),f.pointerType==="touch")switch(this._activePointers.length){case 0:this._state=L.NONE;break;case 1:this._state=this.touches.one;break;case 2:this._state=this.touches.two;break;case 3:this._state=this.touches.three;break}else this._state=L.NONE;T()}},d=()=>{const f=this._findPointerById(1);f&&f===this._lockedPointer||(f&&this._disposePointer(f),this._state=L.NONE,T())};let h=-1;const u=f=>{if(!this._domElement||!this._enabled||this.mouseButtons.wheel===L.NONE)return;if(this._interactiveArea.left!==0||this._interactiveArea.top!==0||this._interactiveArea.width!==1||this._interactiveArea.height!==1){const N=this._domElement.getBoundingClientRect(),P=f.clientX/N.width,w=f.clientY/N.height;if(P<this._interactiveArea.left||P>this._interactiveArea.right||w<this._interactiveArea.top||w>this._interactiveArea.bottom)return}if(f.preventDefault(),this.dollyToCursor||this.mouseButtons.wheel===L.ROTATE||this.mouseButtons.wheel===L.TRUCK){const N=performance.now();h-N<1e3&&this._getClientRect(this._elementRect),h=N}const R=lr?-1:-3,O=f.deltaMode===1?f.deltaY/R:f.deltaY/(R*10),_=this.dollyToCursor?(f.clientX-this._elementRect.x)/this._elementRect.width*2-1:0,y=this.dollyToCursor?(f.clientY-this._elementRect.y)/this._elementRect.height*-2+1:0;switch(this.mouseButtons.wheel){case L.ROTATE:{this._rotateInternal(f.deltaX,f.deltaY),this._isUserControllingRotate=!0;break}case L.TRUCK:{this._truckInternal(f.deltaX,f.deltaY,!1),this._isUserControllingTruck=!0;break}case L.OFFSET:{this._truckInternal(f.deltaX,f.deltaY,!0),this._isUserControllingOffset=!0;break}case L.DOLLY:{this._dollyInternal(-O,_,y),this._isUserControllingDolly=!0;break}case L.ZOOM:{this._zoomInternal(-O,_,y),this._isUserControllingZoom=!0;break}}this.dispatchEvent({type:"control"})},p=f=>{if(!(!this._domElement||!this._enabled)){if(this.mouseButtons.right===nt.ACTION.NONE){const R=f instanceof PointerEvent?f.pointerId:(f instanceof MouseEvent,0),O=this._findPointerById(R);O&&this._disposePointer(O),this._domElement.ownerDocument.removeEventListener("pointermove",a,{passive:!1}),this._domElement.ownerDocument.removeEventListener("pointerup",E),this._domElement.ownerDocument.removeEventListener("mousemove",l),this._domElement.ownerDocument.removeEventListener("mouseup",d);return}f.preventDefault()}},A=f=>{if(!this._enabled)return;if(Hs(this._activePointers,rt),this._getClientRect(this._elementRect),e.copy(rt),i.copy(rt),this._activePointers.length>=2){const O=rt.x-this._activePointers[1].clientX,_=rt.y-this._activePointers[1].clientY,y=Math.sqrt(O*O+_*_);o.set(0,y);const N=(this._activePointers[0].clientX+this._activePointers[1].clientX)*.5,P=(this._activePointers[0].clientY+this._activePointers[1].clientY)*.5;i.set(N,P)}if(this._state=0,!f)this._lockedPointer&&(this._state=this._state|this.mouseButtons.left);else if("pointerType"in f&&f.pointerType==="touch")switch(this._activePointers.length){case 1:this._state=this.touches.one;break;case 2:this._state=this.touches.two;break;case 3:this._state=this.touches.three;break}else!this._lockedPointer&&(f.buttons&V.LEFT)===V.LEFT&&(this._state=this._state|this.mouseButtons.left),(f.buttons&V.MIDDLE)===V.MIDDLE&&(this._state=this._state|this.mouseButtons.middle),(f.buttons&V.RIGHT)===V.RIGHT&&(this._state=this._state|this.mouseButtons.right);((this._state&L.ROTATE)===L.ROTATE||(this._state&L.TOUCH_ROTATE)===L.TOUCH_ROTATE||(this._state&L.TOUCH_DOLLY_ROTATE)===L.TOUCH_DOLLY_ROTATE||(this._state&L.TOUCH_ZOOM_ROTATE)===L.TOUCH_ZOOM_ROTATE)&&(this._sphericalEnd.theta=this._spherical.theta,this._sphericalEnd.phi=this._spherical.phi,this._thetaVelocity.value=0,this._phiVelocity.value=0),((this._state&L.TRUCK)===L.TRUCK||(this._state&L.TOUCH_TRUCK)===L.TOUCH_TRUCK||(this._state&L.TOUCH_DOLLY_TRUCK)===L.TOUCH_DOLLY_TRUCK||(this._state&L.TOUCH_ZOOM_TRUCK)===L.TOUCH_ZOOM_TRUCK)&&(this._targetEnd.copy(this._target),this._targetVelocity.set(0,0,0)),((this._state&L.DOLLY)===L.DOLLY||(this._state&L.TOUCH_DOLLY)===L.TOUCH_DOLLY||(this._state&L.TOUCH_DOLLY_TRUCK)===L.TOUCH_DOLLY_TRUCK||(this._state&L.TOUCH_DOLLY_OFFSET)===L.TOUCH_DOLLY_OFFSET||(this._state&L.TOUCH_DOLLY_ROTATE)===L.TOUCH_DOLLY_ROTATE)&&(this._sphericalEnd.radius=this._spherical.radius,this._radiusVelocity.value=0),((this._state&L.ZOOM)===L.ZOOM||(this._state&L.TOUCH_ZOOM)===L.TOUCH_ZOOM||(this._state&L.TOUCH_ZOOM_TRUCK)===L.TOUCH_ZOOM_TRUCK||(this._state&L.TOUCH_ZOOM_OFFSET)===L.TOUCH_ZOOM_OFFSET||(this._state&L.TOUCH_ZOOM_ROTATE)===L.TOUCH_ZOOM_ROTATE)&&(this._zoomEnd=this._zoom,this._zoomVelocity.value=0),((this._state&L.OFFSET)===L.OFFSET||(this._state&L.TOUCH_OFFSET)===L.TOUCH_OFFSET||(this._state&L.TOUCH_DOLLY_OFFSET)===L.TOUCH_DOLLY_OFFSET||(this._state&L.TOUCH_ZOOM_OFFSET)===L.TOUCH_ZOOM_OFFSET)&&(this._focalOffsetEnd.copy(this._focalOffset),this._focalOffsetVelocity.set(0,0,0)),this.dispatchEvent({type:"controlstart"})},F=()=>{if(!this._enabled||!this._dragNeedsUpdate)return;this._dragNeedsUpdate=!1,Hs(this._activePointers,rt);const R=this._domElement&&document.pointerLockElement===this._domElement?this._lockedPointer||this._activePointers[0]:null,O=R?-R.deltaX:i.x-rt.x,_=R?-R.deltaY:i.y-rt.y;if(i.copy(rt),((this._state&L.ROTATE)===L.ROTATE||(this._state&L.TOUCH_ROTATE)===L.TOUCH_ROTATE||(this._state&L.TOUCH_DOLLY_ROTATE)===L.TOUCH_DOLLY_ROTATE||(this._state&L.TOUCH_ZOOM_ROTATE)===L.TOUCH_ZOOM_ROTATE)&&(this._rotateInternal(O,_),this._isUserControllingRotate=!0),(this._state&L.DOLLY)===L.DOLLY||(this._state&L.ZOOM)===L.ZOOM){const y=this.dollyToCursor?(e.x-this._elementRect.x)/this._elementRect.width*2-1:0,N=this.dollyToCursor?(e.y-this._elementRect.y)/this._elementRect.height*-2+1:0,P=this.dollyDragInverted?-1:1;(this._state&L.DOLLY)===L.DOLLY?(this._dollyInternal(P*_*ts,y,N),this._isUserControllingDolly=!0):(this._zoomInternal(P*_*ts,y,N),this._isUserControllingZoom=!0)}if((this._state&L.TOUCH_DOLLY)===L.TOUCH_DOLLY||(this._state&L.TOUCH_ZOOM)===L.TOUCH_ZOOM||(this._state&L.TOUCH_DOLLY_TRUCK)===L.TOUCH_DOLLY_TRUCK||(this._state&L.TOUCH_ZOOM_TRUCK)===L.TOUCH_ZOOM_TRUCK||(this._state&L.TOUCH_DOLLY_OFFSET)===L.TOUCH_DOLLY_OFFSET||(this._state&L.TOUCH_ZOOM_OFFSET)===L.TOUCH_ZOOM_OFFSET||(this._state&L.TOUCH_DOLLY_ROTATE)===L.TOUCH_DOLLY_ROTATE||(this._state&L.TOUCH_ZOOM_ROTATE)===L.TOUCH_ZOOM_ROTATE){const y=rt.x-this._activePointers[1].clientX,N=rt.y-this._activePointers[1].clientY,P=Math.sqrt(y*y+N*N),w=o.y-P;o.set(0,P);const M=this.dollyToCursor?(i.x-this._elementRect.x)/this._elementRect.width*2-1:0,U=this.dollyToCursor?(i.y-this._elementRect.y)/this._elementRect.height*-2+1:0;(this._state&L.TOUCH_DOLLY)===L.TOUCH_DOLLY||(this._state&L.TOUCH_DOLLY_ROTATE)===L.TOUCH_DOLLY_ROTATE||(this._state&L.TOUCH_DOLLY_TRUCK)===L.TOUCH_DOLLY_TRUCK||(this._state&L.TOUCH_DOLLY_OFFSET)===L.TOUCH_DOLLY_OFFSET?(this._dollyInternal(w*ts,M,U),this._isUserControllingDolly=!0):(this._zoomInternal(w*ts,M,U),this._isUserControllingZoom=!0)}((this._state&L.TRUCK)===L.TRUCK||(this._state&L.TOUCH_TRUCK)===L.TOUCH_TRUCK||(this._state&L.TOUCH_DOLLY_TRUCK)===L.TOUCH_DOLLY_TRUCK||(this._state&L.TOUCH_ZOOM_TRUCK)===L.TOUCH_ZOOM_TRUCK)&&(this._truckInternal(O,_,!1),this._isUserControllingTruck=!0),((this._state&L.OFFSET)===L.OFFSET||(this._state&L.TOUCH_OFFSET)===L.TOUCH_OFFSET||(this._state&L.TOUCH_DOLLY_OFFSET)===L.TOUCH_DOLLY_OFFSET||(this._state&L.TOUCH_ZOOM_OFFSET)===L.TOUCH_ZOOM_OFFSET)&&(this._truckInternal(O,_,!0),this._isUserControllingOffset=!0),this.dispatchEvent({type:"control"})},T=()=>{Hs(this._activePointers,rt),i.copy(rt),this._dragNeedsUpdate=!1,(this._activePointers.length===0||this._activePointers.length===1&&this._activePointers[0]===this._lockedPointer)&&(this._isDragging=!1),this._activePointers.length===0&&this._domElement&&(this._domElement.ownerDocument.removeEventListener("pointermove",a,{passive:!1}),this._domElement.ownerDocument.removeEventListener("mousemove",l),this._domElement.ownerDocument.removeEventListener("pointerup",E),this._domElement.ownerDocument.removeEventListener("mouseup",d),this.dispatchEvent({type:"controlend"}))};this.lockPointer=()=>{!this._enabled||!this._domElement||(this.cancel(),this._lockedPointer={pointerId:-1,clientX:0,clientY:0,deltaX:0,deltaY:0,mouseButton:null},this._activePointers.push(this._lockedPointer),this._domElement.ownerDocument.removeEventListener("pointermove",a,{passive:!1}),this._domElement.ownerDocument.removeEventListener("pointerup",E),this._domElement.requestPointerLock(),this._domElement.ownerDocument.addEventListener("pointerlockchange",m),this._domElement.ownerDocument.addEventListener("pointerlockerror",g),this._domElement.ownerDocument.addEventListener("pointermove",a,{passive:!1}),this._domElement.ownerDocument.addEventListener("pointerup",E),A())},this.unlockPointer=()=>{this._lockedPointer!==null&&(this._disposePointer(this._lockedPointer),this._lockedPointer=null),document.exitPointerLock(),this.cancel(),this._domElement&&(this._domElement.ownerDocument.removeEventListener("pointerlockchange",m),this._domElement.ownerDocument.removeEventListener("pointerlockerror",g))};const m=()=>{this._domElement&&this._domElement.ownerDocument.pointerLockElement===this._domElement||this.unlockPointer()},g=()=>{this.unlockPointer()};this._addAllEventListeners=f=>{this._domElement=f,this._domElement.style.touchAction="none",this._domElement.style.userSelect="none",this._domElement.style.webkitUserSelect="none",this._domElement.addEventListener("pointerdown",n),hr&&this._domElement.addEventListener("mousedown",r),this._domElement.addEventListener("pointercancel",E),this._domElement.addEventListener("wheel",u,{passive:!1}),this._domElement.addEventListener("contextmenu",p)},this._removeAllEventListeners=()=>{this._domElement&&(this._domElement.style.touchAction="",this._domElement.style.userSelect="",this._domElement.style.webkitUserSelect="",this._domElement.removeEventListener("pointerdown",n),this._domElement.removeEventListener("mousedown",r),this._domElement.removeEventListener("pointercancel",E),this._domElement.removeEventListener("wheel",u,{passive:!1}),this._domElement.removeEventListener("contextmenu",p),this._domElement.ownerDocument.removeEventListener("pointermove",a,{passive:!1}),this._domElement.ownerDocument.removeEventListener("mousemove",l),this._domElement.ownerDocument.removeEventListener("pointerup",E),this._domElement.ownerDocument.removeEventListener("mouseup",d),this._domElement.ownerDocument.removeEventListener("pointerlockchange",m),this._domElement.ownerDocument.removeEventListener("pointerlockerror",g))},this.cancel=()=>{this._state!==L.NONE&&(this._state=L.NONE,this._activePointers.length=0,T())},t&&this.connect(t),this.update(0)}get camera(){return this._camera}set camera(s){this._camera=s,this.updateCameraUp(),this._camera.updateProjectionMatrix(),this._updateNearPlaneCorners(),this._needsUpdate=!0}get enabled(){return this._enabled}set enabled(s){this._enabled=s,this._domElement&&(s?(this._domElement.style.touchAction="none",this._domElement.style.userSelect="none",this._domElement.style.webkitUserSelect="none"):(this.cancel(),this._domElement.style.touchAction="",this._domElement.style.userSelect="",this._domElement.style.webkitUserSelect=""))}get active(){return!this._hasRested}get currentAction(){return this._state}get distance(){return this._spherical.radius}set distance(s){this._spherical.radius===s&&this._sphericalEnd.radius===s||(this._spherical.radius=s,this._sphericalEnd.radius=s,this._needsUpdate=!0)}get azimuthAngle(){return this._spherical.theta}set azimuthAngle(s){this._spherical.theta===s&&this._sphericalEnd.theta===s||(this._spherical.theta=s,this._sphericalEnd.theta=s,this._needsUpdate=!0)}get polarAngle(){return this._spherical.phi}set polarAngle(s){this._spherical.phi===s&&this._sphericalEnd.phi===s||(this._spherical.phi=s,this._sphericalEnd.phi=s,this._needsUpdate=!0)}get boundaryEnclosesCamera(){return this._boundaryEnclosesCamera}set boundaryEnclosesCamera(s){this._boundaryEnclosesCamera=s,this._needsUpdate=!0}set interactiveArea(s){this._interactiveArea.width=Ct(s.width,0,1),this._interactiveArea.height=Ct(s.height,0,1),this._interactiveArea.x=Ct(s.x,0,1-this._interactiveArea.width),this._interactiveArea.y=Ct(s.y,0,1-this._interactiveArea.height)}addEventListener(s,t){super.addEventListener(s,t)}removeEventListener(s,t){super.removeEventListener(s,t)}rotate(s,t,e=!1){return this.rotateTo(this._sphericalEnd.theta+s,this._sphericalEnd.phi+t,e)}rotateAzimuthTo(s,t=!1){return this.rotateTo(s,this._sphericalEnd.phi,t)}rotatePolarTo(s,t=!1){return this.rotateTo(this._sphericalEnd.theta,s,t)}rotateTo(s,t,e=!1){this._isUserControllingRotate=!1;const i=Ct(s,this.minAzimuthAngle,this.maxAzimuthAngle),o=Ct(t,this.minPolarAngle,this.maxPolarAngle);this._sphericalEnd.theta=i,this._sphericalEnd.phi=o,this._sphericalEnd.makeSafe(),this._needsUpdate=!0,e||(this._spherical.theta=this._sphericalEnd.theta,this._spherical.phi=this._sphericalEnd.phi);const n=!e||H(this._spherical.theta,this._sphericalEnd.theta,this.restThreshold)&&H(this._spherical.phi,this._sphericalEnd.phi,this.restThreshold);return this._createOnRestPromise(n)}dolly(s,t=!1){return this.dollyTo(this._sphericalEnd.radius-s,t)}dollyTo(s,t=!1){return this._isUserControllingDolly=!1,this._lastDollyDirection=ee.NONE,this._changedDolly=0,this._dollyToNoClamp(Ct(s,this.minDistance,this.maxDistance),t)}_dollyToNoClamp(s,t=!1){const e=this._sphericalEnd.radius;if(this.colliderMeshes.length>=1){const n=this._collisionTest(),r=H(n,this._spherical.radius);if(!(e>s)&&r)return Promise.resolve();this._sphericalEnd.radius=Math.min(s,n)}else this._sphericalEnd.radius=s;this._needsUpdate=!0,t||(this._spherical.radius=this._sphericalEnd.radius);const o=!t||H(this._spherical.radius,this._sphericalEnd.radius,this.restThreshold);return this._createOnRestPromise(o)}dollyInFixed(s,t=!1){this._targetEnd.add(this._getCameraDirection(Ae).multiplyScalar(s)),t||this._target.copy(this._targetEnd);const e=!t||H(this._target.x,this._targetEnd.x,this.restThreshold)&&H(this._target.y,this._targetEnd.y,this.restThreshold)&&H(this._target.z,this._targetEnd.z,this.restThreshold);return this._createOnRestPromise(e)}zoom(s,t=!1){return this.zoomTo(this._zoomEnd+s,t)}zoomTo(s,t=!1){this._isUserControllingZoom=!1,this._zoomEnd=Ct(s,this.minZoom,this.maxZoom),this._needsUpdate=!0,t||(this._zoom=this._zoomEnd);const e=!t||H(this._zoom,this._zoomEnd,this.restThreshold);return this._changedZoom=0,this._createOnRestPromise(e)}pan(s,t,e=!1){return console.warn("`pan` has been renamed to `truck`"),this.truck(s,t,e)}truck(s,t,e=!1){this._camera.updateMatrix(),At.setFromMatrixColumn(this._camera.matrix,0),Ft.setFromMatrixColumn(this._camera.matrix,1),At.multiplyScalar(s),Ft.multiplyScalar(-t);const i=Y.copy(At).add(Ft),o=G.copy(this._targetEnd).add(i);return this.moveTo(o.x,o.y,o.z,e)}forward(s,t=!1){Y.setFromMatrixColumn(this._camera.matrix,0),Y.crossVectors(this._camera.up,Y),Y.multiplyScalar(s);const e=G.copy(this._targetEnd).add(Y);return this.moveTo(e.x,e.y,e.z,t)}elevate(s,t=!1){return Y.copy(this._camera.up).multiplyScalar(s),this.moveTo(this._targetEnd.x+Y.x,this._targetEnd.y+Y.y,this._targetEnd.z+Y.z,t)}moveTo(s,t,e,i=!1){this._isUserControllingTruck=!1;const o=Y.set(s,t,e).sub(this._targetEnd);this._encloseToBoundary(this._targetEnd,o,this.boundaryFriction),this._needsUpdate=!0,i||this._target.copy(this._targetEnd);const n=!i||H(this._target.x,this._targetEnd.x,this.restThreshold)&&H(this._target.y,this._targetEnd.y,this.restThreshold)&&H(this._target.z,this._targetEnd.z,this.restThreshold);return this._createOnRestPromise(n)}lookInDirectionOf(s,t,e,i=!1){const r=Y.set(s,t,e).sub(this._targetEnd).normalize().multiplyScalar(-this._sphericalEnd.radius);return this.setPosition(r.x,r.y,r.z,i)}fitToBox(s,t,{cover:e=!1,paddingLeft:i=0,paddingRight:o=0,paddingBottom:n=0,paddingTop:r=0}={}){const a=[],l=s.isBox3?ne.copy(s):ne.setFromObject(s);l.isEmpty()&&(console.warn("camera-controls: fitTo() cannot be used with an empty box. Aborting"),Promise.resolve());const E=Wi(this._sphericalEnd.theta,ki),d=Wi(this._sphericalEnd.phi,ki);a.push(this.rotateTo(E,d,t));const h=Y.setFromSpherical(this._sphericalEnd).normalize(),u=$i.setFromUnitVectors(h,Ws),p=H(Math.abs(h.y),1);p&&u.multiply(Zs.setFromAxisAngle(es,E)),u.multiply(this._yAxisUpSpaceInverse);const A=qi.makeEmpty();G.copy(l.min).applyQuaternion(u),A.expandByPoint(G),G.copy(l.min).setX(l.max.x).applyQuaternion(u),A.expandByPoint(G),G.copy(l.min).setY(l.max.y).applyQuaternion(u),A.expandByPoint(G),G.copy(l.max).setZ(l.min.z).applyQuaternion(u),A.expandByPoint(G),G.copy(l.min).setZ(l.max.z).applyQuaternion(u),A.expandByPoint(G),G.copy(l.max).setY(l.min.y).applyQuaternion(u),A.expandByPoint(G),G.copy(l.max).setX(l.min.x).applyQuaternion(u),A.expandByPoint(G),G.copy(l.max).applyQuaternion(u),A.expandByPoint(G),A.min.x-=i,A.min.y-=n,A.max.x+=o,A.max.y+=r,u.setFromUnitVectors(Ws,h),p&&u.premultiply(Zs.invert()),u.premultiply(this._yAxisUpSpace);const F=A.getSize(Y),T=A.getCenter(G).applyQuaternion(u);if(Vt(this._camera)){const m=this.getDistanceToFitBox(F.x,F.y,F.z,e);a.push(this.moveTo(T.x,T.y,T.z,t)),a.push(this.dollyTo(m,t)),a.push(this.setFocalOffset(0,0,0,t))}else if(Pt(this._camera)){const m=this._camera,g=m.right-m.left,f=m.top-m.bottom,R=e?Math.max(g/F.x,f/F.y):Math.min(g/F.x,f/F.y);a.push(this.moveTo(T.x,T.y,T.z,t)),a.push(this.zoomTo(R,t)),a.push(this.setFocalOffset(0,0,0,t))}return Promise.all(a)}fitToSphere(s,t){const e=[],o=s instanceof B.Sphere?Xs.copy(s):nt.createBoundingSphere(s,Xs);if(e.push(this.moveTo(o.center.x,o.center.y,o.center.z,t)),Vt(this._camera)){const n=this.getDistanceToFitSphere(o.radius);e.push(this.dollyTo(n,t))}else if(Pt(this._camera)){const n=this._camera.right-this._camera.left,r=this._camera.top-this._camera.bottom,a=2*o.radius,l=Math.min(n/a,r/a);e.push(this.zoomTo(l,t))}return e.push(this.setFocalOffset(0,0,0,t)),Promise.all(e)}setLookAt(s,t,e,i,o,n,r=!1){this._isUserControllingRotate=!1,this._isUserControllingDolly=!1,this._isUserControllingTruck=!1,this._lastDollyDirection=ee.NONE,this._changedDolly=0;const a=G.set(i,o,n),l=Y.set(s,t,e);this._targetEnd.copy(a),this._sphericalEnd.setFromVector3(l.sub(a).applyQuaternion(this._yAxisUpSpace)),this.normalizeRotations(),this._needsUpdate=!0,r||(this._target.copy(this._targetEnd),this._spherical.copy(this._sphericalEnd));const E=!r||H(this._target.x,this._targetEnd.x,this.restThreshold)&&H(this._target.y,this._targetEnd.y,this.restThreshold)&&H(this._target.z,this._targetEnd.z,this.restThreshold)&&H(this._spherical.theta,this._sphericalEnd.theta,this.restThreshold)&&H(this._spherical.phi,this._sphericalEnd.phi,this.restThreshold)&&H(this._spherical.radius,this._sphericalEnd.radius,this.restThreshold);return this._createOnRestPromise(E)}lerpLookAt(s,t,e,i,o,n,r,a,l,E,d,h,u,p=!1){this._isUserControllingRotate=!1,this._isUserControllingDolly=!1,this._isUserControllingTruck=!1,this._lastDollyDirection=ee.NONE,this._changedDolly=0;const A=Y.set(i,o,n),F=G.set(s,t,e);ht.setFromVector3(F.sub(A).applyQuaternion(this._yAxisUpSpace));const T=ie.set(E,d,h),m=G.set(r,a,l);Fe.setFromVector3(m.sub(T).applyQuaternion(this._yAxisUpSpace)),this._targetEnd.copy(A.lerp(T,u));const g=Fe.theta-ht.theta,f=Fe.phi-ht.phi,R=Fe.radius-ht.radius;this._sphericalEnd.set(ht.radius+R*u,ht.phi+f*u,ht.theta+g*u),this.normalizeRotations(),this._needsUpdate=!0,p||(this._target.copy(this._targetEnd),this._spherical.copy(this._sphericalEnd));const O=!p||H(this._target.x,this._targetEnd.x,this.restThreshold)&&H(this._target.y,this._targetEnd.y,this.restThreshold)&&H(this._target.z,this._targetEnd.z,this.restThreshold)&&H(this._spherical.theta,this._sphericalEnd.theta,this.restThreshold)&&H(this._spherical.phi,this._sphericalEnd.phi,this.restThreshold)&&H(this._spherical.radius,this._sphericalEnd.radius,this.restThreshold);return this._createOnRestPromise(O)}setPosition(s,t,e,i=!1){return this.setLookAt(s,t,e,this._targetEnd.x,this._targetEnd.y,this._targetEnd.z,i)}setTarget(s,t,e,i=!1){const o=this.getPosition(Y),n=this.setLookAt(o.x,o.y,o.z,s,t,e,i);return this._sphericalEnd.phi=Ct(this._sphericalEnd.phi,this.minPolarAngle,this.maxPolarAngle),n}setFocalOffset(s,t,e,i=!1){this._isUserControllingOffset=!1,this._focalOffsetEnd.set(s,t,e),this._needsUpdate=!0,i||this._focalOffset.copy(this._focalOffsetEnd);const o=!i||H(this._focalOffset.x,this._focalOffsetEnd.x,this.restThreshold)&&H(this._focalOffset.y,this._focalOffsetEnd.y,this.restThreshold)&&H(this._focalOffset.z,this._focalOffsetEnd.z,this.restThreshold);return this._createOnRestPromise(o)}setOrbitPoint(s,t,e){this._camera.updateMatrixWorld(),At.setFromMatrixColumn(this._camera.matrixWorldInverse,0),Ft.setFromMatrixColumn(this._camera.matrixWorldInverse,1),Yt.setFromMatrixColumn(this._camera.matrixWorldInverse,2);const i=Y.set(s,t,e),o=i.distanceTo(this._camera.position),n=i.sub(this._camera.position);At.multiplyScalar(n.x),Ft.multiplyScalar(n.y),Yt.multiplyScalar(n.z),Y.copy(At).add(Ft).add(Yt),Y.z=Y.z+o,this.dollyTo(o,!1),this.setFocalOffset(-Y.x,Y.y,-Y.z,!1),this.moveTo(s,t,e,!1)}setBoundary(s){if(!s){this._boundary.min.set(-1/0,-1/0,-1/0),this._boundary.max.set(1/0,1/0,1/0),this._needsUpdate=!0;return}this._boundary.copy(s),this._boundary.clampPoint(this._targetEnd,this._targetEnd),this._needsUpdate=!0}setViewport(s,t,e,i){if(s===null){this._viewport=null;return}this._viewport=this._viewport||new B.Vector4,typeof s=="number"?this._viewport.set(s,t,e,i):this._viewport.copy(s)}getDistanceToFitBox(s,t,e,i=!1){if(ks(this._camera,"getDistanceToFitBox"))return this._spherical.radius;const o=s/t,n=this._camera.getEffectiveFOV()*Te,r=this._camera.aspect;return((i?o>r:o<r)?t:s/r)*.5/Math.tan(n*.5)+e*.5}getDistanceToFitSphere(s){if(ks(this._camera,"getDistanceToFitSphere"))return this._spherical.radius;const t=this._camera.getEffectiveFOV()*Te,e=Math.atan(Math.tan(t*.5)*this._camera.aspect)*2,i=1<this._camera.aspect?t:e;return s/Math.sin(i*.5)}getTarget(s,t=!0){return(s&&s.isVector3?s:new B.Vector3).copy(t?this._targetEnd:this._target)}getPosition(s,t=!0){return(s&&s.isVector3?s:new B.Vector3).setFromSpherical(t?this._sphericalEnd:this._spherical).applyQuaternion(this._yAxisUpSpaceInverse).add(t?this._targetEnd:this._target)}getSpherical(s,t=!0){return(s&&s instanceof B.Spherical?s:new B.Spherical).copy(t?this._sphericalEnd:this._spherical)}getFocalOffset(s,t=!0){return(s&&s.isVector3?s:new B.Vector3).copy(t?this._focalOffsetEnd:this._focalOffset)}normalizeRotations(){this._sphericalEnd.theta=this._sphericalEnd.theta%se,this._sphericalEnd.theta<0&&(this._sphericalEnd.theta+=se),this._spherical.theta+=se*Math.round((this._sphericalEnd.theta-this._spherical.theta)/se)}reset(s=!1){if(!H(this._camera.up.x,this._cameraUp0.x)||!H(this._camera.up.y,this._cameraUp0.y)||!H(this._camera.up.z,this._cameraUp0.z)){this._camera.up.copy(this._cameraUp0);const e=this.getPosition(Y);this.updateCameraUp(),this.setPosition(e.x,e.y,e.z)}const t=[this.setLookAt(this._position0.x,this._position0.y,this._position0.z,this._target0.x,this._target0.y,this._target0.z,s),this.setFocalOffset(this._focalOffset0.x,this._focalOffset0.y,this._focalOffset0.z,s),this.zoomTo(this._zoom0,s)];return Promise.all(t)}saveState(){this._cameraUp0.copy(this._camera.up),this.getTarget(this._target0),this.getPosition(this._position0),this._zoom0=this._zoom,this._focalOffset0.copy(this._focalOffset)}updateCameraUp(){this._yAxisUpSpace.setFromUnitVectors(this._camera.up,es),this._yAxisUpSpaceInverse.copy(this._yAxisUpSpace).invert()}applyCameraUp(){const s=Y.subVectors(this._target,this._camera.position).normalize(),t=G.crossVectors(s,this._camera.up);this._camera.up.crossVectors(t,s).normalize(),this._camera.updateMatrixWorld();const e=this.getPosition(Y);this.updateCameraUp(),this.setPosition(e.x,e.y,e.z)}update(s){const t=this._sphericalEnd.theta-this._spherical.theta,e=this._sphericalEnd.phi-this._spherical.phi,i=this._sphericalEnd.radius-this._spherical.radius,o=Qi.subVectors(this._targetEnd,this._target),n=ji.subVectors(this._focalOffsetEnd,this._focalOffset),r=this._zoomEnd-this._zoom;if(W(t))this._thetaVelocity.value=0,this._spherical.theta=this._sphericalEnd.theta;else{const d=this._isUserControllingRotate?this.draggingSmoothTime:this.smoothTime;this._spherical.theta=Je(this._spherical.theta,this._sphericalEnd.theta,this._thetaVelocity,d,1/0,s),this._needsUpdate=!0}if(W(e))this._phiVelocity.value=0,this._spherical.phi=this._sphericalEnd.phi;else{const d=this._isUserControllingRotate?this.draggingSmoothTime:this.smoothTime;this._spherical.phi=Je(this._spherical.phi,this._sphericalEnd.phi,this._phiVelocity,d,1/0,s),this._needsUpdate=!0}if(W(i))this._radiusVelocity.value=0,this._spherical.radius=this._sphericalEnd.radius;else{const d=this._isUserControllingDolly?this.draggingSmoothTime:this.smoothTime;this._spherical.radius=Je(this._spherical.radius,this._sphericalEnd.radius,this._radiusVelocity,d,this.maxSpeed,s),this._needsUpdate=!0}if(W(o.x)&&W(o.y)&&W(o.z))this._targetVelocity.set(0,0,0),this._target.copy(this._targetEnd);else{const d=this._isUserControllingTruck?this.draggingSmoothTime:this.smoothTime;Xi(this._target,this._targetEnd,this._targetVelocity,d,this.maxSpeed,s,this._target),this._needsUpdate=!0}if(W(n.x)&&W(n.y)&&W(n.z))this._focalOffsetVelocity.set(0,0,0),this._focalOffset.copy(this._focalOffsetEnd);else{const d=this._isUserControllingOffset?this.draggingSmoothTime:this.smoothTime;Xi(this._focalOffset,this._focalOffsetEnd,this._focalOffsetVelocity,d,this.maxSpeed,s,this._focalOffset),this._needsUpdate=!0}if(W(r))this._zoomVelocity.value=0,this._zoom=this._zoomEnd;else{const d=this._isUserControllingZoom?this.draggingSmoothTime:this.smoothTime;this._zoom=Je(this._zoom,this._zoomEnd,this._zoomVelocity,d,1/0,s)}if(this.dollyToCursor){if(Vt(this._camera)&&this._changedDolly!==0){const d=this._spherical.radius-this._lastDistance,h=this._camera,u=this._getCameraDirection(Ae),p=Y.copy(u).cross(h.up).normalize();p.lengthSq()===0&&(p.x=1);const A=G.crossVectors(p,u),F=this._sphericalEnd.radius*Math.tan(h.getEffectiveFOV()*Te*.5),m=(this._sphericalEnd.radius-d-this._sphericalEnd.radius)/this._sphericalEnd.radius,g=ie.copy(this._targetEnd).add(p.multiplyScalar(this._dollyControlCoord.x*F*h.aspect)).add(A.multiplyScalar(this._dollyControlCoord.y*F)),f=Y.copy(this._targetEnd).lerp(g,m),R=this._lastDollyDirection===ee.IN&&this._spherical.radius<=this.minDistance,O=this._lastDollyDirection===ee.OUT&&this.maxDistance<=this._spherical.radius;if(this.infinityDolly&&(R||O)){this._sphericalEnd.radius-=d,this._spherical.radius-=d;const y=G.copy(u).multiplyScalar(-d);f.add(y)}this._boundary.clampPoint(f,f);const _=G.subVectors(f,this._targetEnd);this._targetEnd.copy(f),this._target.add(_),this._changedDolly-=d,W(this._changedDolly)&&(this._changedDolly=0)}else if(Pt(this._camera)&&this._changedZoom!==0){const d=this._zoom-this._lastZoom,h=this._camera,u=Y.set(this._dollyControlCoord.x,this._dollyControlCoord.y,(h.near+h.far)/(h.near-h.far)).unproject(h),p=G.set(0,0,-1).applyQuaternion(h.quaternion),A=ie.copy(u).add(p.multiplyScalar(-u.dot(h.up))),T=-(this._zoom-d-this._zoom)/this._zoom,m=this._getCameraDirection(Ae),g=this._targetEnd.dot(m),f=Y.copy(this._targetEnd).lerp(A,T),R=f.dot(m),O=m.multiplyScalar(R-g);f.sub(O),this._boundary.clampPoint(f,f);const _=G.subVectors(f,this._targetEnd);this._targetEnd.copy(f),this._target.add(_),this._changedZoom-=d,W(this._changedZoom)&&(this._changedZoom=0)}}this._camera.zoom!==this._zoom&&(this._camera.zoom=this._zoom,this._camera.updateProjectionMatrix(),this._updateNearPlaneCorners(),this._needsUpdate=!0),this._dragNeedsUpdate=!0;const a=this._collisionTest();this._spherical.radius=Math.min(this._spherical.radius,a),this._spherical.makeSafe(),this._camera.position.setFromSpherical(this._spherical).applyQuaternion(this._yAxisUpSpaceInverse).add(this._target),this._camera.lookAt(this._target),(!W(this._focalOffset.x)||!W(this._focalOffset.y)||!W(this._focalOffset.z))&&(this._camera.updateMatrixWorld(),At.setFromMatrixColumn(this._camera.matrix,0),Ft.setFromMatrixColumn(this._camera.matrix,1),Yt.setFromMatrixColumn(this._camera.matrix,2),At.multiplyScalar(this._focalOffset.x),Ft.multiplyScalar(-this._focalOffset.y),Yt.multiplyScalar(this._focalOffset.z),Y.copy(At).add(Ft).add(Yt),this._camera.position.add(Y)),this._boundaryEnclosesCamera&&this._encloseToBoundary(this._camera.position.copy(this._target),Y.setFromSpherical(this._spherical).applyQuaternion(this._yAxisUpSpaceInverse),1);const E=this._needsUpdate;return E&&!this._updatedLastTime?(this._hasRested=!1,this.dispatchEvent({type:"wake"}),this.dispatchEvent({type:"update"})):E?(this.dispatchEvent({type:"update"}),W(t,this.restThreshold)&&W(e,this.restThreshold)&&W(i,this.restThreshold)&&W(o.x,this.restThreshold)&&W(o.y,this.restThreshold)&&W(o.z,this.restThreshold)&&W(n.x,this.restThreshold)&&W(n.y,this.restThreshold)&&W(n.z,this.restThreshold)&&W(r,this.restThreshold)&&!this._hasRested&&(this._hasRested=!0,this.dispatchEvent({type:"rest"}))):!E&&this._updatedLastTime&&this.dispatchEvent({type:"sleep"}),this._lastDistance=this._spherical.radius,this._lastZoom=this._zoom,this._updatedLastTime=E,this._needsUpdate=!1,E}toJSON(){return JSON.stringify({enabled:this._enabled,minDistance:this.minDistance,maxDistance:me(this.maxDistance),minZoom:this.minZoom,maxZoom:me(this.maxZoom),minPolarAngle:this.minPolarAngle,maxPolarAngle:me(this.maxPolarAngle),minAzimuthAngle:me(this.minAzimuthAngle),maxAzimuthAngle:me(this.maxAzimuthAngle),smoothTime:this.smoothTime,draggingSmoothTime:this.draggingSmoothTime,dollySpeed:this.dollySpeed,truckSpeed:this.truckSpeed,dollyToCursor:this.dollyToCursor,verticalDragToForward:this.verticalDragToForward,target:this._targetEnd.toArray(),position:Y.setFromSpherical(this._sphericalEnd).add(this._targetEnd).toArray(),zoom:this._zoomEnd,focalOffset:this._focalOffsetEnd.toArray(),target0:this._target0.toArray(),position0:this._position0.toArray(),zoom0:this._zoom0,focalOffset0:this._focalOffset0.toArray()})}fromJSON(s,t=!1){const e=JSON.parse(s);this.enabled=e.enabled,this.minDistance=e.minDistance,this.maxDistance=Re(e.maxDistance),this.minZoom=e.minZoom,this.maxZoom=Re(e.maxZoom),this.minPolarAngle=e.minPolarAngle,this.maxPolarAngle=Re(e.maxPolarAngle),this.minAzimuthAngle=Re(e.minAzimuthAngle),this.maxAzimuthAngle=Re(e.maxAzimuthAngle),this.smoothTime=e.smoothTime,this.draggingSmoothTime=e.draggingSmoothTime,this.dollySpeed=e.dollySpeed,this.truckSpeed=e.truckSpeed,this.dollyToCursor=e.dollyToCursor,this.verticalDragToForward=e.verticalDragToForward,this._target0.fromArray(e.target0),this._position0.fromArray(e.position0),this._zoom0=e.zoom0,this._focalOffset0.fromArray(e.focalOffset0),this.moveTo(e.target[0],e.target[1],e.target[2],t),ht.setFromVector3(Y.fromArray(e.position).sub(this._targetEnd).applyQuaternion(this._yAxisUpSpace)),this.rotateTo(ht.theta,ht.phi,t),this.dollyTo(ht.radius,t),this.zoomTo(e.zoom,t),this.setFocalOffset(e.focalOffset[0],e.focalOffset[1],e.focalOffset[2],t),this._needsUpdate=!0}connect(s){if(this._domElement){console.warn("camera-controls is already connected.");return}s.setAttribute("data-camera-controls-version",cr),this._addAllEventListeners(s),this._getClientRect(this._elementRect)}disconnect(){this.cancel(),this._removeAllEventListeners(),this._domElement&&(this._domElement.removeAttribute("data-camera-controls-version"),this._domElement=void 0)}dispose(){this.removeAllEventListeners(),this.disconnect()}_getTargetDirection(s){return s.setFromSpherical(this._spherical).divideScalar(this._spherical.radius).applyQuaternion(this._yAxisUpSpaceInverse)}_getCameraDirection(s){return this._getTargetDirection(s).negate()}_findPointerById(s){return this._activePointers.find(t=>t.pointerId===s)}_findPointerByMouseButton(s){return this._activePointers.find(t=>t.mouseButton===s)}_disposePointer(s){this._activePointers.splice(this._activePointers.indexOf(s),1)}_encloseToBoundary(s,t,e){const i=t.lengthSq();if(i===0)return s;const o=G.copy(t).add(s),r=this._boundary.clampPoint(o,ie).sub(o),a=r.lengthSq();if(a===0)return s.add(t);if(a===i)return s;if(e===0)return s.add(t).add(r);{const l=1+e*a/t.dot(r);return s.add(G.copy(t).multiplyScalar(l)).add(r.multiplyScalar(1-e))}}_updateNearPlaneCorners(){if(Vt(this._camera)){const s=this._camera,t=s.near,e=s.getEffectiveFOV()*Te,i=Math.tan(e*.5)*t,o=i*s.aspect;this._nearPlaneCorners[0].set(-o,-i,0),this._nearPlaneCorners[1].set(o,-i,0),this._nearPlaneCorners[2].set(o,i,0),this._nearPlaneCorners[3].set(-o,i,0)}else if(Pt(this._camera)){const s=this._camera,t=1/s.zoom,e=s.left*t,i=s.right*t,o=s.top*t,n=s.bottom*t;this._nearPlaneCorners[0].set(e,o,0),this._nearPlaneCorners[1].set(i,o,0),this._nearPlaneCorners[2].set(i,n,0),this._nearPlaneCorners[3].set(e,n,0)}}_collisionTest(){let s=1/0;if(!(this.colliderMeshes.length>=1)||ks(this._camera,"_collisionTest"))return s;const e=this._getTargetDirection(Ae);Qs.lookAt(Zi,e,this._camera.up);for(let i=0;i<4;i++){const o=G.copy(this._nearPlaneCorners[i]);o.applyMatrix4(Qs);const n=ie.addVectors(this._target,o);ss.set(n,e),ss.far=this._spherical.radius+1;const r=ss.intersectObjects(this.colliderMeshes);r.length!==0&&r[0].distance<s&&(s=r[0].distance)}return s}_getClientRect(s){if(!this._domElement)return;const t=this._domElement.getBoundingClientRect();return s.x=t.left,s.y=t.top,this._viewport?(s.x+=this._viewport.x,s.y+=t.height-this._viewport.w-this._viewport.y,s.width=this._viewport.z,s.height=this._viewport.w):(s.width=t.width,s.height=t.height),s}_createOnRestPromise(s){return s?Promise.resolve():(this._hasRested=!1,this.dispatchEvent({type:"transitionstart"}),new Promise(t=>{const e=()=>{this.removeEventListener("rest",e),t()};this.addEventListener("rest",e)}))}_addAllEventListeners(s){}_removeAllEventListeners(){}get dampingFactor(){return console.warn(".dampingFactor has been deprecated. use smoothTime (in seconds) instead."),0}set dampingFactor(s){console.warn(".dampingFactor has been deprecated. use smoothTime (in seconds) instead.")}get draggingDampingFactor(){return console.warn(".draggingDampingFactor has been deprecated. use draggingSmoothTime (in seconds) instead."),0}set draggingDampingFactor(s){console.warn(".draggingDampingFactor has been deprecated. use draggingSmoothTime (in seconds) instead.")}static createBoundingSphere(s,t=new B.Sphere){const e=t,i=e.center;ne.makeEmpty(),s.traverseVisible(n=>{n.isMesh&&ne.expandByObject(n)}),ne.getCenter(i);let o=0;return s.traverseVisible(n=>{if(!n.isMesh)return;const r=n,a=r.geometry.clone();a.applyMatrix4(r.matrixWorld);const E=a.attributes.position;for(let d=0,h=E.count;d<h;d++)Y.fromBufferAttribute(E,d),o=Math.max(o,i.distanceToSquared(Y))}),e.radius=Math.sqrt(o),e}}class ce extends dn{constructor(t){super(t);I(this,"onBeforeUpdate",new D);I(this,"onAfterUpdate",new D);I(this,"onAspectUpdated",new D);I(this,"onDisposed",new D);I(this,"three");I(this,"_allControls",new Map);I(this,"updateAspect",()=>{var t;if(!(!this.currentWorld||!this.currentWorld.renderer)&&!(this.three instanceof S.OrthographicCamera)&&(t=this.currentWorld.renderer)!=null&&t.isResizeable()){const e=this.currentWorld.renderer.getSize();this.three.aspect=e.width/e.height,this.three.updateProjectionMatrix(),this.onAspectUpdated.trigger()}});this.three=this.setupCamera(),this.setupEvents(!0),this.onWorldChanged.add(({action:e,world:i})=>{if(e==="added"){const o=this.newCameraControls();this._allControls.set(i.uuid,o)}if(e==="removed"){const o=this._allControls.get(i.uuid);o&&(o.dispose(),this._allControls.delete(i.uuid))}})}get controls(){if(!this.currentWorld)throw new Error("This camera needs a world to work!");const t=this._allControls.get(this.currentWorld.uuid);if(!t)throw new Error("Controls not found!");return t}get enabled(){return this.currentWorld===null?!1:this.controls.enabled}set enabled(t){this.controls.enabled=t}dispose(){this.setupEvents(!1),this.enabled=!1,this.onAspectUpdated.reset(),this.onBeforeUpdate.reset(),this.onAfterUpdate.reset(),this.three.removeFromParent(),this.onDisposed.trigger(),this.onDisposed.reset();for(const[t,e]of this._allControls)e.dispose()}update(t){this.enabled&&(this.onBeforeUpdate.trigger(this),this.controls.update(t),this.onAfterUpdate.trigger(this))}setupCamera(){const t=window.innerWidth/window.innerHeight,e=new S.PerspectiveCamera(60,t,1,1e3);return e.position.set(50,50,50),e.lookAt(new S.Vector3(0,0,0)),e}newCameraControls(){if(!this.currentWorld)throw new Error("This camera needs a world to work!");if(!this.currentWorld.renderer)throw new Error("This camera needs a renderer to work!");nt.install({THREE:ce.getSubsetOfThree()});const{domElement:t}=this.currentWorld.renderer.three,e=new nt(this.three,t);return e.smoothTime=.2,e.dollyToCursor=!0,e.infinityDolly=!0,e}setupEvents(t){t?window.addEventListener("resize",this.updateAspect):window.removeEventListener("resize",this.updateAspect)}static getSubsetOfThree(){return{MOUSE:S.MOUSE,Vector2:S.Vector2,Vector3:S.Vector3,Vector4:S.Vector4,Quaternion:S.Quaternion,Matrix4:S.Matrix4,Spherical:S.Spherical,Box3:S.Box3,Sphere:S.Sphere,Raycaster:S.Raycaster,MathUtils:S.MathUtils}}}const Cs=class Cs extends tt{constructor(t){super(t);I(this,"onAfterUpdate",new D);I(this,"onBeforeUpdate",new D);I(this,"onDisposed",new D);I(this,"list",new Map);I(this,"enabled",!0);t.add(Cs.uuid,this)}create(){const t=new Cn(this.components),e=t.uuid;if(this.list.has(e))throw new Error("There is already a world with this name!");return this.list.set(e,t),t}delete(t){this.list.delete(t.uuid),t.dispose()}dispose(){this.enabled=!1;for(const[t,e]of this.list)e.dispose();this.list.clear(),this.onDisposed.trigger()}update(t){if(this.enabled)for(const[e,i]of this.list)i.update(t)}};I(Cs,"uuid","fdb61dc4-2ec1-4966-b83d-54ea795fad4a");let Es=Cs;class Er{constructor(s,t,e){I(this,"onDisposed",new D);I(this,"world");I(this,"components");I(this,"_grid");I(this,"_fade",3);I(this,"updateZoom",()=>{this.world.camera instanceof ce&&(this.material.uniforms.uZoom.value=this.world.camera.three.zoom)});this.world=t;const{color:i,size1:o,size2:n,distance:r}=e;this.components=s;const a=new S.PlaneGeometry(2,2,1,1),l=new S.ShaderMaterial({side:S.DoubleSide,uniforms:{uSize1:{value:o},uSize2:{value:n},uColor:{value:i},uDistance:{value:r},uFade:{value:this._fade},uZoom:{value:1}},transparent:!0,vertexShader:`
10
+ */const V={LEFT:1,RIGHT:2,MIDDLE:4},P=Object.freeze({NONE:0,ROTATE:1,TRUCK:2,OFFSET:4,DOLLY:8,ZOOM:16,TOUCH_ROTATE:32,TOUCH_TRUCK:64,TOUCH_OFFSET:128,TOUCH_DOLLY:256,TOUCH_ZOOM:512,TOUCH_DOLLY_TRUCK:1024,TOUCH_DOLLY_OFFSET:2048,TOUCH_DOLLY_ROTATE:4096,TOUCH_ZOOM_TRUCK:8192,TOUCH_ZOOM_OFFSET:16384,TOUCH_ZOOM_ROTATE:32768}),se={NONE:0,IN:1,OUT:-1};function Gt(c){return c.isPerspectiveCamera}function Lt(c){return c.isOrthographicCamera}const ie=Math.PI*2,ji=Math.PI/2,Fn=1e-5,me=Math.PI/180;function Ct(c,s,t){return Math.max(s,Math.min(t,c))}function W(c,s=Fn){return Math.abs(c)<s}function H(c,s,t=Fn){return W(c-s,t)}function qi(c,s){return Math.round(c/s)*s}function Re(c){return isFinite(c)?c:c<0?-Number.MAX_VALUE:Number.MAX_VALUE}function Ae(c){return Math.abs(c)<Number.MAX_VALUE?c:c*(1/0)}function ts(c,s,t,e,i=1/0,o){e=Math.max(1e-4,e);const n=2/e,r=n*o,a=1/(1+r+.48*r*r+.235*r*r*r);let l=c-s;const E=s,d=i*e;l=Ct(l,-d,d),s=c-l;const h=(t.value+n*l)*o;t.value=(t.value-n*h)*a;let u=s+(l+h)*a;return E-c>0==u>E&&(u=E,t.value=(u-E)/o),u}function $i(c,s,t,e,i=1/0,o,n){e=Math.max(1e-4,e);const r=2/e,a=r*o,l=1/(1+a+.48*a*a+.235*a*a*a);let E=s.x,d=s.y,h=s.z,u=c.x-E,p=c.y-d,m=c.z-h;const F=E,T=d,R=h,g=i*e,f=g*g,A=u*u+p*p+m*m;if(A>f){const v=Math.sqrt(A);u=u/v*g,p=p/v*g,m=m/v*g}E=c.x-u,d=c.y-p,h=c.z-m;const O=(t.x+r*u)*o,_=(t.y+r*p)*o,y=(t.z+r*m)*o;t.x=(t.x-r*O)*l,t.y=(t.y-r*_)*l,t.z=(t.z-r*y)*l,n.x=E+(u+O)*l,n.y=d+(p+_)*l,n.z=h+(m+y)*l;const N=F-c.x,L=T-c.y,w=R-c.z,M=n.x-F,U=n.y-T,b=n.z-R;return N*M+L*U+w*b>0&&(n.x=F,n.y=T,n.z=R,t.x=(n.x-F)/o,t.y=(n.y-T)/o,t.z=(n.z-R)/o),n}function Xs(c,s){s.set(0,0),c.forEach(t=>{s.x+=t.clientX,s.y+=t.clientY}),s.x/=c.length,s.y/=c.length}function Zs(c,s){return Lt(c)?(console.warn(`${s} is not supported in OrthographicCamera`),!0):!1}class hr{constructor(){this._listeners={}}addEventListener(s,t){const e=this._listeners;e[s]===void 0&&(e[s]=[]),e[s].indexOf(t)===-1&&e[s].push(t)}hasEventListener(s,t){const e=this._listeners;return e[s]!==void 0&&e[s].indexOf(t)!==-1}removeEventListener(s,t){const i=this._listeners[s];if(i!==void 0){const o=i.indexOf(t);o!==-1&&i.splice(o,1)}}removeAllEventListeners(s){if(!s){this._listeners={};return}Array.isArray(this._listeners[s])&&(this._listeners[s].length=0)}dispatchEvent(s){const e=this._listeners[s.type];if(e!==void 0){s.target=this;const i=e.slice(0);for(let o=0,n=i.length;o<n;o++)i[o].call(this,s)}}}const Er="2.7.3",es=1/8,gn=typeof window<"u",dr=gn&&/Mac/.test(navigator.platform),ur=!(gn&&"PointerEvent"in window);let B,Ki,ss,Qs,at,Y,G,ne,Fe,At,Ft,zt,Ji,tn,ht,ge,oe,en,js,sn,qs,$s,is;class nt extends hr{static install(s){B=s.THREE,Ki=Object.freeze(new B.Vector3(0,0,0)),ss=Object.freeze(new B.Vector3(0,1,0)),Qs=Object.freeze(new B.Vector3(0,0,1)),at=new B.Vector2,Y=new B.Vector3,G=new B.Vector3,ne=new B.Vector3,Fe=new B.Vector3,At=new B.Vector3,Ft=new B.Vector3,zt=new B.Vector3,Ji=new B.Vector3,tn=new B.Vector3,ht=new B.Spherical,ge=new B.Spherical,oe=new B.Box3,en=new B.Box3,js=new B.Sphere,sn=new B.Quaternion,qs=new B.Quaternion,$s=new B.Matrix4,is=new B.Raycaster}static get ACTION(){return P}constructor(s,t){super(),this.minPolarAngle=0,this.maxPolarAngle=Math.PI,this.minAzimuthAngle=-1/0,this.maxAzimuthAngle=1/0,this.minDistance=Number.EPSILON,this.maxDistance=1/0,this.infinityDolly=!1,this.minZoom=.01,this.maxZoom=1/0,this.smoothTime=.25,this.draggingSmoothTime=.125,this.maxSpeed=1/0,this.azimuthRotateSpeed=1,this.polarRotateSpeed=1,this.dollySpeed=1,this.dollyDragInverted=!1,this.truckSpeed=2,this.dollyToCursor=!1,this.dragToOffset=!1,this.verticalDragToForward=!1,this.boundaryFriction=0,this.restThreshold=.01,this.colliderMeshes=[],this.cancel=()=>{},this._enabled=!0,this._state=P.NONE,this._viewport=null,this._changedDolly=0,this._changedZoom=0,this._hasRested=!0,this._boundaryEnclosesCamera=!1,this._needsUpdate=!0,this._updatedLastTime=!1,this._elementRect=new DOMRect,this._isDragging=!1,this._dragNeedsUpdate=!0,this._activePointers=[],this._lockedPointer=null,this._interactiveArea=new DOMRect(0,0,1,1),this._isUserControllingRotate=!1,this._isUserControllingDolly=!1,this._isUserControllingTruck=!1,this._isUserControllingOffset=!1,this._isUserControllingZoom=!1,this._lastDollyDirection=se.NONE,this._thetaVelocity={value:0},this._phiVelocity={value:0},this._radiusVelocity={value:0},this._targetVelocity=new B.Vector3,this._focalOffsetVelocity=new B.Vector3,this._zoomVelocity={value:0},this._truckInternal=(f,A,O)=>{let _,y;if(Gt(this._camera)){const N=Y.copy(this._camera.position).sub(this._target),L=this._camera.getEffectiveFOV()*me,w=N.length()*Math.tan(L*.5);_=this.truckSpeed*f*w/this._elementRect.height,y=this.truckSpeed*A*w/this._elementRect.height}else if(Lt(this._camera)){const N=this._camera;_=f*(N.right-N.left)/N.zoom/this._elementRect.width,y=A*(N.top-N.bottom)/N.zoom/this._elementRect.height}else return;this.verticalDragToForward?(O?this.setFocalOffset(this._focalOffsetEnd.x+_,this._focalOffsetEnd.y,this._focalOffsetEnd.z,!0):this.truck(_,0,!0),this.forward(-y,!0)):O?this.setFocalOffset(this._focalOffsetEnd.x+_,this._focalOffsetEnd.y+y,this._focalOffsetEnd.z,!0):this.truck(_,y,!0)},this._rotateInternal=(f,A)=>{const O=ie*this.azimuthRotateSpeed*f/this._elementRect.height,_=ie*this.polarRotateSpeed*A/this._elementRect.height;this.rotate(O,_,!0)},this._dollyInternal=(f,A,O)=>{const _=Math.pow(.95,-f*this.dollySpeed),y=this._sphericalEnd.radius,N=this._sphericalEnd.radius*_,L=Ct(N,this.minDistance,this.maxDistance),w=L-N;this.infinityDolly&&this.dollyToCursor?this._dollyToNoClamp(N,!0):this.infinityDolly&&!this.dollyToCursor?(this.dollyInFixed(w,!0),this._dollyToNoClamp(L,!0)):this._dollyToNoClamp(L,!0),this.dollyToCursor&&(this._changedDolly+=(this.infinityDolly?N:L)-y,this._dollyControlCoord.set(A,O)),this._lastDollyDirection=Math.sign(-f)},this._zoomInternal=(f,A,O)=>{const _=Math.pow(.95,f*this.dollySpeed),y=this._zoom,N=this._zoom*_;this.zoomTo(N,!0),this.dollyToCursor&&(this._changedZoom+=N-y,this._dollyControlCoord.set(A,O))},typeof B>"u"&&console.error("camera-controls: `THREE` is undefined. You must first run `CameraControls.install( { THREE: THREE } )`. Check the docs for further information."),this._camera=s,this._yAxisUpSpace=new B.Quaternion().setFromUnitVectors(this._camera.up,ss),this._yAxisUpSpaceInverse=this._yAxisUpSpace.clone().invert(),this._state=P.NONE,this._target=new B.Vector3,this._targetEnd=this._target.clone(),this._focalOffset=new B.Vector3,this._focalOffsetEnd=this._focalOffset.clone(),this._spherical=new B.Spherical().setFromVector3(Y.copy(this._camera.position).applyQuaternion(this._yAxisUpSpace)),this._sphericalEnd=this._spherical.clone(),this._lastDistance=this._spherical.radius,this._zoom=this._camera.zoom,this._zoomEnd=this._zoom,this._lastZoom=this._zoom,this._nearPlaneCorners=[new B.Vector3,new B.Vector3,new B.Vector3,new B.Vector3],this._updateNearPlaneCorners(),this._boundary=new B.Box3(new B.Vector3(-1/0,-1/0,-1/0),new B.Vector3(1/0,1/0,1/0)),this._cameraUp0=this._camera.up.clone(),this._target0=this._target.clone(),this._position0=this._camera.position.clone(),this._zoom0=this._zoom,this._focalOffset0=this._focalOffset.clone(),this._dollyControlCoord=new B.Vector2,this.mouseButtons={left:P.ROTATE,middle:P.DOLLY,right:P.TRUCK,wheel:Gt(this._camera)?P.DOLLY:Lt(this._camera)?P.ZOOM:P.NONE},this.touches={one:P.TOUCH_ROTATE,two:Gt(this._camera)?P.TOUCH_DOLLY_TRUCK:Lt(this._camera)?P.TOUCH_ZOOM_TRUCK:P.NONE,three:P.TOUCH_TRUCK};const e=new B.Vector2,i=new B.Vector2,o=new B.Vector2,n=f=>{if(!this._enabled||!this._domElement)return;if(this._interactiveArea.left!==0||this._interactiveArea.top!==0||this._interactiveArea.width!==1||this._interactiveArea.height!==1){const _=this._domElement.getBoundingClientRect(),y=f.clientX/_.width,N=f.clientY/_.height;if(y<this._interactiveArea.left||y>this._interactiveArea.right||N<this._interactiveArea.top||N>this._interactiveArea.bottom)return}const A=f.pointerType!=="mouse"?null:(f.buttons&V.LEFT)===V.LEFT?V.LEFT:(f.buttons&V.MIDDLE)===V.MIDDLE?V.MIDDLE:(f.buttons&V.RIGHT)===V.RIGHT?V.RIGHT:null;if(A!==null){const _=this._findPointerByMouseButton(A);_&&this._disposePointer(_)}if((f.buttons&V.LEFT)===V.LEFT&&this._lockedPointer)return;const O={pointerId:f.pointerId,clientX:f.clientX,clientY:f.clientY,deltaX:0,deltaY:0,mouseButton:A};this._activePointers.push(O),this._domElement.ownerDocument.removeEventListener("pointermove",a,{passive:!1}),this._domElement.ownerDocument.removeEventListener("pointerup",E),this._domElement.ownerDocument.addEventListener("pointermove",a,{passive:!1}),this._domElement.ownerDocument.addEventListener("pointerup",E),this._isDragging=!0,m(f)},r=f=>{if(!this._enabled||!this._domElement||this._lockedPointer)return;if(this._interactiveArea.left!==0||this._interactiveArea.top!==0||this._interactiveArea.width!==1||this._interactiveArea.height!==1){const _=this._domElement.getBoundingClientRect(),y=f.clientX/_.width,N=f.clientY/_.height;if(y<this._interactiveArea.left||y>this._interactiveArea.right||N<this._interactiveArea.top||N>this._interactiveArea.bottom)return}const A=(f.buttons&V.LEFT)===V.LEFT?V.LEFT:(f.buttons&V.MIDDLE)===V.MIDDLE?V.MIDDLE:(f.buttons&V.RIGHT)===V.RIGHT?V.RIGHT:null;if(A!==null){const _=this._findPointerByMouseButton(A);_&&this._disposePointer(_)}const O={pointerId:1,clientX:f.clientX,clientY:f.clientY,deltaX:0,deltaY:0,mouseButton:(f.buttons&V.LEFT)===V.LEFT?V.LEFT:(f.buttons&V.MIDDLE)===V.LEFT?V.MIDDLE:(f.buttons&V.RIGHT)===V.LEFT?V.RIGHT:null};this._activePointers.push(O),this._domElement.ownerDocument.removeEventListener("mousemove",l),this._domElement.ownerDocument.removeEventListener("mouseup",d),this._domElement.ownerDocument.addEventListener("mousemove",l),this._domElement.ownerDocument.addEventListener("mouseup",d),this._isDragging=!0,m(f)},a=f=>{f.cancelable&&f.preventDefault();const A=f.pointerId,O=this._lockedPointer||this._findPointerById(A);if(O){if(O.clientX=f.clientX,O.clientY=f.clientY,O.deltaX=f.movementX,O.deltaY=f.movementY,this._state=0,f.pointerType==="touch")switch(this._activePointers.length){case 1:this._state=this.touches.one;break;case 2:this._state=this.touches.two;break;case 3:this._state=this.touches.three;break}else(!this._isDragging&&this._lockedPointer||this._isDragging&&(f.buttons&V.LEFT)===V.LEFT)&&(this._state=this._state|this.mouseButtons.left),this._isDragging&&(f.buttons&V.MIDDLE)===V.MIDDLE&&(this._state=this._state|this.mouseButtons.middle),this._isDragging&&(f.buttons&V.RIGHT)===V.RIGHT&&(this._state=this._state|this.mouseButtons.right);F()}},l=f=>{const A=this._lockedPointer||this._findPointerById(1);A&&(A.clientX=f.clientX,A.clientY=f.clientY,A.deltaX=f.movementX,A.deltaY=f.movementY,this._state=0,(this._lockedPointer||(f.buttons&V.LEFT)===V.LEFT)&&(this._state=this._state|this.mouseButtons.left),(f.buttons&V.MIDDLE)===V.MIDDLE&&(this._state=this._state|this.mouseButtons.middle),(f.buttons&V.RIGHT)===V.RIGHT&&(this._state=this._state|this.mouseButtons.right),F())},E=f=>{const A=this._findPointerById(f.pointerId);if(!(A&&A===this._lockedPointer)){if(A&&this._disposePointer(A),f.pointerType==="touch")switch(this._activePointers.length){case 0:this._state=P.NONE;break;case 1:this._state=this.touches.one;break;case 2:this._state=this.touches.two;break;case 3:this._state=this.touches.three;break}else this._state=P.NONE;T()}},d=()=>{const f=this._findPointerById(1);f&&f===this._lockedPointer||(f&&this._disposePointer(f),this._state=P.NONE,T())};let h=-1;const u=f=>{if(!this._domElement||!this._enabled||this.mouseButtons.wheel===P.NONE)return;if(this._interactiveArea.left!==0||this._interactiveArea.top!==0||this._interactiveArea.width!==1||this._interactiveArea.height!==1){const N=this._domElement.getBoundingClientRect(),L=f.clientX/N.width,w=f.clientY/N.height;if(L<this._interactiveArea.left||L>this._interactiveArea.right||w<this._interactiveArea.top||w>this._interactiveArea.bottom)return}if(f.preventDefault(),this.dollyToCursor||this.mouseButtons.wheel===P.ROTATE||this.mouseButtons.wheel===P.TRUCK){const N=performance.now();h-N<1e3&&this._getClientRect(this._elementRect),h=N}const A=dr?-1:-3,O=f.deltaMode===1?f.deltaY/A:f.deltaY/(A*10),_=this.dollyToCursor?(f.clientX-this._elementRect.x)/this._elementRect.width*2-1:0,y=this.dollyToCursor?(f.clientY-this._elementRect.y)/this._elementRect.height*-2+1:0;switch(this.mouseButtons.wheel){case P.ROTATE:{this._rotateInternal(f.deltaX,f.deltaY),this._isUserControllingRotate=!0;break}case P.TRUCK:{this._truckInternal(f.deltaX,f.deltaY,!1),this._isUserControllingTruck=!0;break}case P.OFFSET:{this._truckInternal(f.deltaX,f.deltaY,!0),this._isUserControllingOffset=!0;break}case P.DOLLY:{this._dollyInternal(-O,_,y),this._isUserControllingDolly=!0;break}case P.ZOOM:{this._zoomInternal(-O,_,y),this._isUserControllingZoom=!0;break}}this.dispatchEvent({type:"control"})},p=f=>{if(!(!this._domElement||!this._enabled)){if(this.mouseButtons.right===nt.ACTION.NONE){const A=f instanceof PointerEvent?f.pointerId:(f instanceof MouseEvent,0),O=this._findPointerById(A);O&&this._disposePointer(O),this._domElement.ownerDocument.removeEventListener("pointermove",a,{passive:!1}),this._domElement.ownerDocument.removeEventListener("pointerup",E),this._domElement.ownerDocument.removeEventListener("mousemove",l),this._domElement.ownerDocument.removeEventListener("mouseup",d);return}f.preventDefault()}},m=f=>{if(!this._enabled)return;if(Xs(this._activePointers,at),this._getClientRect(this._elementRect),e.copy(at),i.copy(at),this._activePointers.length>=2){const O=at.x-this._activePointers[1].clientX,_=at.y-this._activePointers[1].clientY,y=Math.sqrt(O*O+_*_);o.set(0,y);const N=(this._activePointers[0].clientX+this._activePointers[1].clientX)*.5,L=(this._activePointers[0].clientY+this._activePointers[1].clientY)*.5;i.set(N,L)}if(this._state=0,!f)this._lockedPointer&&(this._state=this._state|this.mouseButtons.left);else if("pointerType"in f&&f.pointerType==="touch")switch(this._activePointers.length){case 1:this._state=this.touches.one;break;case 2:this._state=this.touches.two;break;case 3:this._state=this.touches.three;break}else!this._lockedPointer&&(f.buttons&V.LEFT)===V.LEFT&&(this._state=this._state|this.mouseButtons.left),(f.buttons&V.MIDDLE)===V.MIDDLE&&(this._state=this._state|this.mouseButtons.middle),(f.buttons&V.RIGHT)===V.RIGHT&&(this._state=this._state|this.mouseButtons.right);((this._state&P.ROTATE)===P.ROTATE||(this._state&P.TOUCH_ROTATE)===P.TOUCH_ROTATE||(this._state&P.TOUCH_DOLLY_ROTATE)===P.TOUCH_DOLLY_ROTATE||(this._state&P.TOUCH_ZOOM_ROTATE)===P.TOUCH_ZOOM_ROTATE)&&(this._sphericalEnd.theta=this._spherical.theta,this._sphericalEnd.phi=this._spherical.phi,this._thetaVelocity.value=0,this._phiVelocity.value=0),((this._state&P.TRUCK)===P.TRUCK||(this._state&P.TOUCH_TRUCK)===P.TOUCH_TRUCK||(this._state&P.TOUCH_DOLLY_TRUCK)===P.TOUCH_DOLLY_TRUCK||(this._state&P.TOUCH_ZOOM_TRUCK)===P.TOUCH_ZOOM_TRUCK)&&(this._targetEnd.copy(this._target),this._targetVelocity.set(0,0,0)),((this._state&P.DOLLY)===P.DOLLY||(this._state&P.TOUCH_DOLLY)===P.TOUCH_DOLLY||(this._state&P.TOUCH_DOLLY_TRUCK)===P.TOUCH_DOLLY_TRUCK||(this._state&P.TOUCH_DOLLY_OFFSET)===P.TOUCH_DOLLY_OFFSET||(this._state&P.TOUCH_DOLLY_ROTATE)===P.TOUCH_DOLLY_ROTATE)&&(this._sphericalEnd.radius=this._spherical.radius,this._radiusVelocity.value=0),((this._state&P.ZOOM)===P.ZOOM||(this._state&P.TOUCH_ZOOM)===P.TOUCH_ZOOM||(this._state&P.TOUCH_ZOOM_TRUCK)===P.TOUCH_ZOOM_TRUCK||(this._state&P.TOUCH_ZOOM_OFFSET)===P.TOUCH_ZOOM_OFFSET||(this._state&P.TOUCH_ZOOM_ROTATE)===P.TOUCH_ZOOM_ROTATE)&&(this._zoomEnd=this._zoom,this._zoomVelocity.value=0),((this._state&P.OFFSET)===P.OFFSET||(this._state&P.TOUCH_OFFSET)===P.TOUCH_OFFSET||(this._state&P.TOUCH_DOLLY_OFFSET)===P.TOUCH_DOLLY_OFFSET||(this._state&P.TOUCH_ZOOM_OFFSET)===P.TOUCH_ZOOM_OFFSET)&&(this._focalOffsetEnd.copy(this._focalOffset),this._focalOffsetVelocity.set(0,0,0)),this.dispatchEvent({type:"controlstart"})},F=()=>{if(!this._enabled||!this._dragNeedsUpdate)return;this._dragNeedsUpdate=!1,Xs(this._activePointers,at);const A=this._domElement&&document.pointerLockElement===this._domElement?this._lockedPointer||this._activePointers[0]:null,O=A?-A.deltaX:i.x-at.x,_=A?-A.deltaY:i.y-at.y;if(i.copy(at),((this._state&P.ROTATE)===P.ROTATE||(this._state&P.TOUCH_ROTATE)===P.TOUCH_ROTATE||(this._state&P.TOUCH_DOLLY_ROTATE)===P.TOUCH_DOLLY_ROTATE||(this._state&P.TOUCH_ZOOM_ROTATE)===P.TOUCH_ZOOM_ROTATE)&&(this._rotateInternal(O,_),this._isUserControllingRotate=!0),(this._state&P.DOLLY)===P.DOLLY||(this._state&P.ZOOM)===P.ZOOM){const y=this.dollyToCursor?(e.x-this._elementRect.x)/this._elementRect.width*2-1:0,N=this.dollyToCursor?(e.y-this._elementRect.y)/this._elementRect.height*-2+1:0,L=this.dollyDragInverted?-1:1;(this._state&P.DOLLY)===P.DOLLY?(this._dollyInternal(L*_*es,y,N),this._isUserControllingDolly=!0):(this._zoomInternal(L*_*es,y,N),this._isUserControllingZoom=!0)}if((this._state&P.TOUCH_DOLLY)===P.TOUCH_DOLLY||(this._state&P.TOUCH_ZOOM)===P.TOUCH_ZOOM||(this._state&P.TOUCH_DOLLY_TRUCK)===P.TOUCH_DOLLY_TRUCK||(this._state&P.TOUCH_ZOOM_TRUCK)===P.TOUCH_ZOOM_TRUCK||(this._state&P.TOUCH_DOLLY_OFFSET)===P.TOUCH_DOLLY_OFFSET||(this._state&P.TOUCH_ZOOM_OFFSET)===P.TOUCH_ZOOM_OFFSET||(this._state&P.TOUCH_DOLLY_ROTATE)===P.TOUCH_DOLLY_ROTATE||(this._state&P.TOUCH_ZOOM_ROTATE)===P.TOUCH_ZOOM_ROTATE){const y=at.x-this._activePointers[1].clientX,N=at.y-this._activePointers[1].clientY,L=Math.sqrt(y*y+N*N),w=o.y-L;o.set(0,L);const M=this.dollyToCursor?(i.x-this._elementRect.x)/this._elementRect.width*2-1:0,U=this.dollyToCursor?(i.y-this._elementRect.y)/this._elementRect.height*-2+1:0;(this._state&P.TOUCH_DOLLY)===P.TOUCH_DOLLY||(this._state&P.TOUCH_DOLLY_ROTATE)===P.TOUCH_DOLLY_ROTATE||(this._state&P.TOUCH_DOLLY_TRUCK)===P.TOUCH_DOLLY_TRUCK||(this._state&P.TOUCH_DOLLY_OFFSET)===P.TOUCH_DOLLY_OFFSET?(this._dollyInternal(w*es,M,U),this._isUserControllingDolly=!0):(this._zoomInternal(w*es,M,U),this._isUserControllingZoom=!0)}((this._state&P.TRUCK)===P.TRUCK||(this._state&P.TOUCH_TRUCK)===P.TOUCH_TRUCK||(this._state&P.TOUCH_DOLLY_TRUCK)===P.TOUCH_DOLLY_TRUCK||(this._state&P.TOUCH_ZOOM_TRUCK)===P.TOUCH_ZOOM_TRUCK)&&(this._truckInternal(O,_,!1),this._isUserControllingTruck=!0),((this._state&P.OFFSET)===P.OFFSET||(this._state&P.TOUCH_OFFSET)===P.TOUCH_OFFSET||(this._state&P.TOUCH_DOLLY_OFFSET)===P.TOUCH_DOLLY_OFFSET||(this._state&P.TOUCH_ZOOM_OFFSET)===P.TOUCH_ZOOM_OFFSET)&&(this._truckInternal(O,_,!0),this._isUserControllingOffset=!0),this.dispatchEvent({type:"control"})},T=()=>{Xs(this._activePointers,at),i.copy(at),this._dragNeedsUpdate=!1,(this._activePointers.length===0||this._activePointers.length===1&&this._activePointers[0]===this._lockedPointer)&&(this._isDragging=!1),this._activePointers.length===0&&this._domElement&&(this._domElement.ownerDocument.removeEventListener("pointermove",a,{passive:!1}),this._domElement.ownerDocument.removeEventListener("mousemove",l),this._domElement.ownerDocument.removeEventListener("pointerup",E),this._domElement.ownerDocument.removeEventListener("mouseup",d),this.dispatchEvent({type:"controlend"}))};this.lockPointer=()=>{!this._enabled||!this._domElement||(this.cancel(),this._lockedPointer={pointerId:-1,clientX:0,clientY:0,deltaX:0,deltaY:0,mouseButton:null},this._activePointers.push(this._lockedPointer),this._domElement.ownerDocument.removeEventListener("pointermove",a,{passive:!1}),this._domElement.ownerDocument.removeEventListener("pointerup",E),this._domElement.requestPointerLock(),this._domElement.ownerDocument.addEventListener("pointerlockchange",R),this._domElement.ownerDocument.addEventListener("pointerlockerror",g),this._domElement.ownerDocument.addEventListener("pointermove",a,{passive:!1}),this._domElement.ownerDocument.addEventListener("pointerup",E),m())},this.unlockPointer=()=>{this._lockedPointer!==null&&(this._disposePointer(this._lockedPointer),this._lockedPointer=null),document.exitPointerLock(),this.cancel(),this._domElement&&(this._domElement.ownerDocument.removeEventListener("pointerlockchange",R),this._domElement.ownerDocument.removeEventListener("pointerlockerror",g))};const R=()=>{this._domElement&&this._domElement.ownerDocument.pointerLockElement===this._domElement||this.unlockPointer()},g=()=>{this.unlockPointer()};this._addAllEventListeners=f=>{this._domElement=f,this._domElement.style.touchAction="none",this._domElement.style.userSelect="none",this._domElement.style.webkitUserSelect="none",this._domElement.addEventListener("pointerdown",n),ur&&this._domElement.addEventListener("mousedown",r),this._domElement.addEventListener("pointercancel",E),this._domElement.addEventListener("wheel",u,{passive:!1}),this._domElement.addEventListener("contextmenu",p)},this._removeAllEventListeners=()=>{this._domElement&&(this._domElement.style.touchAction="",this._domElement.style.userSelect="",this._domElement.style.webkitUserSelect="",this._domElement.removeEventListener("pointerdown",n),this._domElement.removeEventListener("mousedown",r),this._domElement.removeEventListener("pointercancel",E),this._domElement.removeEventListener("wheel",u,{passive:!1}),this._domElement.removeEventListener("contextmenu",p),this._domElement.ownerDocument.removeEventListener("pointermove",a,{passive:!1}),this._domElement.ownerDocument.removeEventListener("mousemove",l),this._domElement.ownerDocument.removeEventListener("pointerup",E),this._domElement.ownerDocument.removeEventListener("mouseup",d),this._domElement.ownerDocument.removeEventListener("pointerlockchange",R),this._domElement.ownerDocument.removeEventListener("pointerlockerror",g))},this.cancel=()=>{this._state!==P.NONE&&(this._state=P.NONE,this._activePointers.length=0,T())},t&&this.connect(t),this.update(0)}get camera(){return this._camera}set camera(s){this._camera=s,this.updateCameraUp(),this._camera.updateProjectionMatrix(),this._updateNearPlaneCorners(),this._needsUpdate=!0}get enabled(){return this._enabled}set enabled(s){this._enabled=s,this._domElement&&(s?(this._domElement.style.touchAction="none",this._domElement.style.userSelect="none",this._domElement.style.webkitUserSelect="none"):(this.cancel(),this._domElement.style.touchAction="",this._domElement.style.userSelect="",this._domElement.style.webkitUserSelect=""))}get active(){return!this._hasRested}get currentAction(){return this._state}get distance(){return this._spherical.radius}set distance(s){this._spherical.radius===s&&this._sphericalEnd.radius===s||(this._spherical.radius=s,this._sphericalEnd.radius=s,this._needsUpdate=!0)}get azimuthAngle(){return this._spherical.theta}set azimuthAngle(s){this._spherical.theta===s&&this._sphericalEnd.theta===s||(this._spherical.theta=s,this._sphericalEnd.theta=s,this._needsUpdate=!0)}get polarAngle(){return this._spherical.phi}set polarAngle(s){this._spherical.phi===s&&this._sphericalEnd.phi===s||(this._spherical.phi=s,this._sphericalEnd.phi=s,this._needsUpdate=!0)}get boundaryEnclosesCamera(){return this._boundaryEnclosesCamera}set boundaryEnclosesCamera(s){this._boundaryEnclosesCamera=s,this._needsUpdate=!0}set interactiveArea(s){this._interactiveArea.width=Ct(s.width,0,1),this._interactiveArea.height=Ct(s.height,0,1),this._interactiveArea.x=Ct(s.x,0,1-this._interactiveArea.width),this._interactiveArea.y=Ct(s.y,0,1-this._interactiveArea.height)}addEventListener(s,t){super.addEventListener(s,t)}removeEventListener(s,t){super.removeEventListener(s,t)}rotate(s,t,e=!1){return this.rotateTo(this._sphericalEnd.theta+s,this._sphericalEnd.phi+t,e)}rotateAzimuthTo(s,t=!1){return this.rotateTo(s,this._sphericalEnd.phi,t)}rotatePolarTo(s,t=!1){return this.rotateTo(this._sphericalEnd.theta,s,t)}rotateTo(s,t,e=!1){this._isUserControllingRotate=!1;const i=Ct(s,this.minAzimuthAngle,this.maxAzimuthAngle),o=Ct(t,this.minPolarAngle,this.maxPolarAngle);this._sphericalEnd.theta=i,this._sphericalEnd.phi=o,this._sphericalEnd.makeSafe(),this._needsUpdate=!0,e||(this._spherical.theta=this._sphericalEnd.theta,this._spherical.phi=this._sphericalEnd.phi);const n=!e||H(this._spherical.theta,this._sphericalEnd.theta,this.restThreshold)&&H(this._spherical.phi,this._sphericalEnd.phi,this.restThreshold);return this._createOnRestPromise(n)}dolly(s,t=!1){return this.dollyTo(this._sphericalEnd.radius-s,t)}dollyTo(s,t=!1){return this._isUserControllingDolly=!1,this._lastDollyDirection=se.NONE,this._changedDolly=0,this._dollyToNoClamp(Ct(s,this.minDistance,this.maxDistance),t)}_dollyToNoClamp(s,t=!1){const e=this._sphericalEnd.radius;if(this.colliderMeshes.length>=1){const n=this._collisionTest(),r=H(n,this._spherical.radius);if(!(e>s)&&r)return Promise.resolve();this._sphericalEnd.radius=Math.min(s,n)}else this._sphericalEnd.radius=s;this._needsUpdate=!0,t||(this._spherical.radius=this._sphericalEnd.radius);const o=!t||H(this._spherical.radius,this._sphericalEnd.radius,this.restThreshold);return this._createOnRestPromise(o)}dollyInFixed(s,t=!1){this._targetEnd.add(this._getCameraDirection(Fe).multiplyScalar(s)),t||this._target.copy(this._targetEnd);const e=!t||H(this._target.x,this._targetEnd.x,this.restThreshold)&&H(this._target.y,this._targetEnd.y,this.restThreshold)&&H(this._target.z,this._targetEnd.z,this.restThreshold);return this._createOnRestPromise(e)}zoom(s,t=!1){return this.zoomTo(this._zoomEnd+s,t)}zoomTo(s,t=!1){this._isUserControllingZoom=!1,this._zoomEnd=Ct(s,this.minZoom,this.maxZoom),this._needsUpdate=!0,t||(this._zoom=this._zoomEnd);const e=!t||H(this._zoom,this._zoomEnd,this.restThreshold);return this._changedZoom=0,this._createOnRestPromise(e)}pan(s,t,e=!1){return console.warn("`pan` has been renamed to `truck`"),this.truck(s,t,e)}truck(s,t,e=!1){this._camera.updateMatrix(),At.setFromMatrixColumn(this._camera.matrix,0),Ft.setFromMatrixColumn(this._camera.matrix,1),At.multiplyScalar(s),Ft.multiplyScalar(-t);const i=Y.copy(At).add(Ft),o=G.copy(this._targetEnd).add(i);return this.moveTo(o.x,o.y,o.z,e)}forward(s,t=!1){Y.setFromMatrixColumn(this._camera.matrix,0),Y.crossVectors(this._camera.up,Y),Y.multiplyScalar(s);const e=G.copy(this._targetEnd).add(Y);return this.moveTo(e.x,e.y,e.z,t)}elevate(s,t=!1){return Y.copy(this._camera.up).multiplyScalar(s),this.moveTo(this._targetEnd.x+Y.x,this._targetEnd.y+Y.y,this._targetEnd.z+Y.z,t)}moveTo(s,t,e,i=!1){this._isUserControllingTruck=!1;const o=Y.set(s,t,e).sub(this._targetEnd);this._encloseToBoundary(this._targetEnd,o,this.boundaryFriction),this._needsUpdate=!0,i||this._target.copy(this._targetEnd);const n=!i||H(this._target.x,this._targetEnd.x,this.restThreshold)&&H(this._target.y,this._targetEnd.y,this.restThreshold)&&H(this._target.z,this._targetEnd.z,this.restThreshold);return this._createOnRestPromise(n)}lookInDirectionOf(s,t,e,i=!1){const r=Y.set(s,t,e).sub(this._targetEnd).normalize().multiplyScalar(-this._sphericalEnd.radius);return this.setPosition(r.x,r.y,r.z,i)}fitToBox(s,t,{cover:e=!1,paddingLeft:i=0,paddingRight:o=0,paddingBottom:n=0,paddingTop:r=0}={}){const a=[],l=s.isBox3?oe.copy(s):oe.setFromObject(s);l.isEmpty()&&(console.warn("camera-controls: fitTo() cannot be used with an empty box. Aborting"),Promise.resolve());const E=qi(this._sphericalEnd.theta,ji),d=qi(this._sphericalEnd.phi,ji);a.push(this.rotateTo(E,d,t));const h=Y.setFromSpherical(this._sphericalEnd).normalize(),u=sn.setFromUnitVectors(h,Qs),p=H(Math.abs(h.y),1);p&&u.multiply(qs.setFromAxisAngle(ss,E)),u.multiply(this._yAxisUpSpaceInverse);const m=en.makeEmpty();G.copy(l.min).applyQuaternion(u),m.expandByPoint(G),G.copy(l.min).setX(l.max.x).applyQuaternion(u),m.expandByPoint(G),G.copy(l.min).setY(l.max.y).applyQuaternion(u),m.expandByPoint(G),G.copy(l.max).setZ(l.min.z).applyQuaternion(u),m.expandByPoint(G),G.copy(l.min).setZ(l.max.z).applyQuaternion(u),m.expandByPoint(G),G.copy(l.max).setY(l.min.y).applyQuaternion(u),m.expandByPoint(G),G.copy(l.max).setX(l.min.x).applyQuaternion(u),m.expandByPoint(G),G.copy(l.max).applyQuaternion(u),m.expandByPoint(G),m.min.x-=i,m.min.y-=n,m.max.x+=o,m.max.y+=r,u.setFromUnitVectors(Qs,h),p&&u.premultiply(qs.invert()),u.premultiply(this._yAxisUpSpace);const F=m.getSize(Y),T=m.getCenter(G).applyQuaternion(u);if(Gt(this._camera)){const R=this.getDistanceToFitBox(F.x,F.y,F.z,e);a.push(this.moveTo(T.x,T.y,T.z,t)),a.push(this.dollyTo(R,t)),a.push(this.setFocalOffset(0,0,0,t))}else if(Lt(this._camera)){const R=this._camera,g=R.right-R.left,f=R.top-R.bottom,A=e?Math.max(g/F.x,f/F.y):Math.min(g/F.x,f/F.y);a.push(this.moveTo(T.x,T.y,T.z,t)),a.push(this.zoomTo(A,t)),a.push(this.setFocalOffset(0,0,0,t))}return Promise.all(a)}fitToSphere(s,t){const e=[],o=s instanceof B.Sphere?js.copy(s):nt.createBoundingSphere(s,js);if(e.push(this.moveTo(o.center.x,o.center.y,o.center.z,t)),Gt(this._camera)){const n=this.getDistanceToFitSphere(o.radius);e.push(this.dollyTo(n,t))}else if(Lt(this._camera)){const n=this._camera.right-this._camera.left,r=this._camera.top-this._camera.bottom,a=2*o.radius,l=Math.min(n/a,r/a);e.push(this.zoomTo(l,t))}return e.push(this.setFocalOffset(0,0,0,t)),Promise.all(e)}setLookAt(s,t,e,i,o,n,r=!1){this._isUserControllingRotate=!1,this._isUserControllingDolly=!1,this._isUserControllingTruck=!1,this._lastDollyDirection=se.NONE,this._changedDolly=0;const a=G.set(i,o,n),l=Y.set(s,t,e);this._targetEnd.copy(a),this._sphericalEnd.setFromVector3(l.sub(a).applyQuaternion(this._yAxisUpSpace)),this.normalizeRotations(),this._needsUpdate=!0,r||(this._target.copy(this._targetEnd),this._spherical.copy(this._sphericalEnd));const E=!r||H(this._target.x,this._targetEnd.x,this.restThreshold)&&H(this._target.y,this._targetEnd.y,this.restThreshold)&&H(this._target.z,this._targetEnd.z,this.restThreshold)&&H(this._spherical.theta,this._sphericalEnd.theta,this.restThreshold)&&H(this._spherical.phi,this._sphericalEnd.phi,this.restThreshold)&&H(this._spherical.radius,this._sphericalEnd.radius,this.restThreshold);return this._createOnRestPromise(E)}lerpLookAt(s,t,e,i,o,n,r,a,l,E,d,h,u,p=!1){this._isUserControllingRotate=!1,this._isUserControllingDolly=!1,this._isUserControllingTruck=!1,this._lastDollyDirection=se.NONE,this._changedDolly=0;const m=Y.set(i,o,n),F=G.set(s,t,e);ht.setFromVector3(F.sub(m).applyQuaternion(this._yAxisUpSpace));const T=ne.set(E,d,h),R=G.set(r,a,l);ge.setFromVector3(R.sub(T).applyQuaternion(this._yAxisUpSpace)),this._targetEnd.copy(m.lerp(T,u));const g=ge.theta-ht.theta,f=ge.phi-ht.phi,A=ge.radius-ht.radius;this._sphericalEnd.set(ht.radius+A*u,ht.phi+f*u,ht.theta+g*u),this.normalizeRotations(),this._needsUpdate=!0,p||(this._target.copy(this._targetEnd),this._spherical.copy(this._sphericalEnd));const O=!p||H(this._target.x,this._targetEnd.x,this.restThreshold)&&H(this._target.y,this._targetEnd.y,this.restThreshold)&&H(this._target.z,this._targetEnd.z,this.restThreshold)&&H(this._spherical.theta,this._sphericalEnd.theta,this.restThreshold)&&H(this._spherical.phi,this._sphericalEnd.phi,this.restThreshold)&&H(this._spherical.radius,this._sphericalEnd.radius,this.restThreshold);return this._createOnRestPromise(O)}setPosition(s,t,e,i=!1){return this.setLookAt(s,t,e,this._targetEnd.x,this._targetEnd.y,this._targetEnd.z,i)}setTarget(s,t,e,i=!1){const o=this.getPosition(Y),n=this.setLookAt(o.x,o.y,o.z,s,t,e,i);return this._sphericalEnd.phi=Ct(this._sphericalEnd.phi,this.minPolarAngle,this.maxPolarAngle),n}setFocalOffset(s,t,e,i=!1){this._isUserControllingOffset=!1,this._focalOffsetEnd.set(s,t,e),this._needsUpdate=!0,i||this._focalOffset.copy(this._focalOffsetEnd);const o=!i||H(this._focalOffset.x,this._focalOffsetEnd.x,this.restThreshold)&&H(this._focalOffset.y,this._focalOffsetEnd.y,this.restThreshold)&&H(this._focalOffset.z,this._focalOffsetEnd.z,this.restThreshold);return this._createOnRestPromise(o)}setOrbitPoint(s,t,e){this._camera.updateMatrixWorld(),At.setFromMatrixColumn(this._camera.matrixWorldInverse,0),Ft.setFromMatrixColumn(this._camera.matrixWorldInverse,1),zt.setFromMatrixColumn(this._camera.matrixWorldInverse,2);const i=Y.set(s,t,e),o=i.distanceTo(this._camera.position),n=i.sub(this._camera.position);At.multiplyScalar(n.x),Ft.multiplyScalar(n.y),zt.multiplyScalar(n.z),Y.copy(At).add(Ft).add(zt),Y.z=Y.z+o,this.dollyTo(o,!1),this.setFocalOffset(-Y.x,Y.y,-Y.z,!1),this.moveTo(s,t,e,!1)}setBoundary(s){if(!s){this._boundary.min.set(-1/0,-1/0,-1/0),this._boundary.max.set(1/0,1/0,1/0),this._needsUpdate=!0;return}this._boundary.copy(s),this._boundary.clampPoint(this._targetEnd,this._targetEnd),this._needsUpdate=!0}setViewport(s,t,e,i){if(s===null){this._viewport=null;return}this._viewport=this._viewport||new B.Vector4,typeof s=="number"?this._viewport.set(s,t,e,i):this._viewport.copy(s)}getDistanceToFitBox(s,t,e,i=!1){if(Zs(this._camera,"getDistanceToFitBox"))return this._spherical.radius;const o=s/t,n=this._camera.getEffectiveFOV()*me,r=this._camera.aspect;return((i?o>r:o<r)?t:s/r)*.5/Math.tan(n*.5)+e*.5}getDistanceToFitSphere(s){if(Zs(this._camera,"getDistanceToFitSphere"))return this._spherical.radius;const t=this._camera.getEffectiveFOV()*me,e=Math.atan(Math.tan(t*.5)*this._camera.aspect)*2,i=1<this._camera.aspect?t:e;return s/Math.sin(i*.5)}getTarget(s,t=!0){return(s&&s.isVector3?s:new B.Vector3).copy(t?this._targetEnd:this._target)}getPosition(s,t=!0){return(s&&s.isVector3?s:new B.Vector3).setFromSpherical(t?this._sphericalEnd:this._spherical).applyQuaternion(this._yAxisUpSpaceInverse).add(t?this._targetEnd:this._target)}getSpherical(s,t=!0){return(s&&s instanceof B.Spherical?s:new B.Spherical).copy(t?this._sphericalEnd:this._spherical)}getFocalOffset(s,t=!0){return(s&&s.isVector3?s:new B.Vector3).copy(t?this._focalOffsetEnd:this._focalOffset)}normalizeRotations(){this._sphericalEnd.theta=this._sphericalEnd.theta%ie,this._sphericalEnd.theta<0&&(this._sphericalEnd.theta+=ie),this._spherical.theta+=ie*Math.round((this._sphericalEnd.theta-this._spherical.theta)/ie)}reset(s=!1){if(!H(this._camera.up.x,this._cameraUp0.x)||!H(this._camera.up.y,this._cameraUp0.y)||!H(this._camera.up.z,this._cameraUp0.z)){this._camera.up.copy(this._cameraUp0);const e=this.getPosition(Y);this.updateCameraUp(),this.setPosition(e.x,e.y,e.z)}const t=[this.setLookAt(this._position0.x,this._position0.y,this._position0.z,this._target0.x,this._target0.y,this._target0.z,s),this.setFocalOffset(this._focalOffset0.x,this._focalOffset0.y,this._focalOffset0.z,s),this.zoomTo(this._zoom0,s)];return Promise.all(t)}saveState(){this._cameraUp0.copy(this._camera.up),this.getTarget(this._target0),this.getPosition(this._position0),this._zoom0=this._zoom,this._focalOffset0.copy(this._focalOffset)}updateCameraUp(){this._yAxisUpSpace.setFromUnitVectors(this._camera.up,ss),this._yAxisUpSpaceInverse.copy(this._yAxisUpSpace).invert()}applyCameraUp(){const s=Y.subVectors(this._target,this._camera.position).normalize(),t=G.crossVectors(s,this._camera.up);this._camera.up.crossVectors(t,s).normalize(),this._camera.updateMatrixWorld();const e=this.getPosition(Y);this.updateCameraUp(),this.setPosition(e.x,e.y,e.z)}update(s){const t=this._sphericalEnd.theta-this._spherical.theta,e=this._sphericalEnd.phi-this._spherical.phi,i=this._sphericalEnd.radius-this._spherical.radius,o=Ji.subVectors(this._targetEnd,this._target),n=tn.subVectors(this._focalOffsetEnd,this._focalOffset),r=this._zoomEnd-this._zoom;if(W(t))this._thetaVelocity.value=0,this._spherical.theta=this._sphericalEnd.theta;else{const d=this._isUserControllingRotate?this.draggingSmoothTime:this.smoothTime;this._spherical.theta=ts(this._spherical.theta,this._sphericalEnd.theta,this._thetaVelocity,d,1/0,s),this._needsUpdate=!0}if(W(e))this._phiVelocity.value=0,this._spherical.phi=this._sphericalEnd.phi;else{const d=this._isUserControllingRotate?this.draggingSmoothTime:this.smoothTime;this._spherical.phi=ts(this._spherical.phi,this._sphericalEnd.phi,this._phiVelocity,d,1/0,s),this._needsUpdate=!0}if(W(i))this._radiusVelocity.value=0,this._spherical.radius=this._sphericalEnd.radius;else{const d=this._isUserControllingDolly?this.draggingSmoothTime:this.smoothTime;this._spherical.radius=ts(this._spherical.radius,this._sphericalEnd.radius,this._radiusVelocity,d,this.maxSpeed,s),this._needsUpdate=!0}if(W(o.x)&&W(o.y)&&W(o.z))this._targetVelocity.set(0,0,0),this._target.copy(this._targetEnd);else{const d=this._isUserControllingTruck?this.draggingSmoothTime:this.smoothTime;$i(this._target,this._targetEnd,this._targetVelocity,d,this.maxSpeed,s,this._target),this._needsUpdate=!0}if(W(n.x)&&W(n.y)&&W(n.z))this._focalOffsetVelocity.set(0,0,0),this._focalOffset.copy(this._focalOffsetEnd);else{const d=this._isUserControllingOffset?this.draggingSmoothTime:this.smoothTime;$i(this._focalOffset,this._focalOffsetEnd,this._focalOffsetVelocity,d,this.maxSpeed,s,this._focalOffset),this._needsUpdate=!0}if(W(r))this._zoomVelocity.value=0,this._zoom=this._zoomEnd;else{const d=this._isUserControllingZoom?this.draggingSmoothTime:this.smoothTime;this._zoom=ts(this._zoom,this._zoomEnd,this._zoomVelocity,d,1/0,s)}if(this.dollyToCursor){if(Gt(this._camera)&&this._changedDolly!==0){const d=this._spherical.radius-this._lastDistance,h=this._camera,u=this._getCameraDirection(Fe),p=Y.copy(u).cross(h.up).normalize();p.lengthSq()===0&&(p.x=1);const m=G.crossVectors(p,u),F=this._sphericalEnd.radius*Math.tan(h.getEffectiveFOV()*me*.5),R=(this._sphericalEnd.radius-d-this._sphericalEnd.radius)/this._sphericalEnd.radius,g=ne.copy(this._targetEnd).add(p.multiplyScalar(this._dollyControlCoord.x*F*h.aspect)).add(m.multiplyScalar(this._dollyControlCoord.y*F)),f=Y.copy(this._targetEnd).lerp(g,R),A=this._lastDollyDirection===se.IN&&this._spherical.radius<=this.minDistance,O=this._lastDollyDirection===se.OUT&&this.maxDistance<=this._spherical.radius;if(this.infinityDolly&&(A||O)){this._sphericalEnd.radius-=d,this._spherical.radius-=d;const y=G.copy(u).multiplyScalar(-d);f.add(y)}this._boundary.clampPoint(f,f);const _=G.subVectors(f,this._targetEnd);this._targetEnd.copy(f),this._target.add(_),this._changedDolly-=d,W(this._changedDolly)&&(this._changedDolly=0)}else if(Lt(this._camera)&&this._changedZoom!==0){const d=this._zoom-this._lastZoom,h=this._camera,u=Y.set(this._dollyControlCoord.x,this._dollyControlCoord.y,(h.near+h.far)/(h.near-h.far)).unproject(h),p=G.set(0,0,-1).applyQuaternion(h.quaternion),m=ne.copy(u).add(p.multiplyScalar(-u.dot(h.up))),T=-(this._zoom-d-this._zoom)/this._zoom,R=this._getCameraDirection(Fe),g=this._targetEnd.dot(R),f=Y.copy(this._targetEnd).lerp(m,T),A=f.dot(R),O=R.multiplyScalar(A-g);f.sub(O),this._boundary.clampPoint(f,f);const _=G.subVectors(f,this._targetEnd);this._targetEnd.copy(f),this._target.add(_),this._changedZoom-=d,W(this._changedZoom)&&(this._changedZoom=0)}}this._camera.zoom!==this._zoom&&(this._camera.zoom=this._zoom,this._camera.updateProjectionMatrix(),this._updateNearPlaneCorners(),this._needsUpdate=!0),this._dragNeedsUpdate=!0;const a=this._collisionTest();this._spherical.radius=Math.min(this._spherical.radius,a),this._spherical.makeSafe(),this._camera.position.setFromSpherical(this._spherical).applyQuaternion(this._yAxisUpSpaceInverse).add(this._target),this._camera.lookAt(this._target),(!W(this._focalOffset.x)||!W(this._focalOffset.y)||!W(this._focalOffset.z))&&(this._camera.updateMatrixWorld(),At.setFromMatrixColumn(this._camera.matrix,0),Ft.setFromMatrixColumn(this._camera.matrix,1),zt.setFromMatrixColumn(this._camera.matrix,2),At.multiplyScalar(this._focalOffset.x),Ft.multiplyScalar(-this._focalOffset.y),zt.multiplyScalar(this._focalOffset.z),Y.copy(At).add(Ft).add(zt),this._camera.position.add(Y)),this._boundaryEnclosesCamera&&this._encloseToBoundary(this._camera.position.copy(this._target),Y.setFromSpherical(this._spherical).applyQuaternion(this._yAxisUpSpaceInverse),1);const E=this._needsUpdate;return E&&!this._updatedLastTime?(this._hasRested=!1,this.dispatchEvent({type:"wake"}),this.dispatchEvent({type:"update"})):E?(this.dispatchEvent({type:"update"}),W(t,this.restThreshold)&&W(e,this.restThreshold)&&W(i,this.restThreshold)&&W(o.x,this.restThreshold)&&W(o.y,this.restThreshold)&&W(o.z,this.restThreshold)&&W(n.x,this.restThreshold)&&W(n.y,this.restThreshold)&&W(n.z,this.restThreshold)&&W(r,this.restThreshold)&&!this._hasRested&&(this._hasRested=!0,this.dispatchEvent({type:"rest"}))):!E&&this._updatedLastTime&&this.dispatchEvent({type:"sleep"}),this._lastDistance=this._spherical.radius,this._lastZoom=this._zoom,this._updatedLastTime=E,this._needsUpdate=!1,E}toJSON(){return JSON.stringify({enabled:this._enabled,minDistance:this.minDistance,maxDistance:Re(this.maxDistance),minZoom:this.minZoom,maxZoom:Re(this.maxZoom),minPolarAngle:this.minPolarAngle,maxPolarAngle:Re(this.maxPolarAngle),minAzimuthAngle:Re(this.minAzimuthAngle),maxAzimuthAngle:Re(this.maxAzimuthAngle),smoothTime:this.smoothTime,draggingSmoothTime:this.draggingSmoothTime,dollySpeed:this.dollySpeed,truckSpeed:this.truckSpeed,dollyToCursor:this.dollyToCursor,verticalDragToForward:this.verticalDragToForward,target:this._targetEnd.toArray(),position:Y.setFromSpherical(this._sphericalEnd).add(this._targetEnd).toArray(),zoom:this._zoomEnd,focalOffset:this._focalOffsetEnd.toArray(),target0:this._target0.toArray(),position0:this._position0.toArray(),zoom0:this._zoom0,focalOffset0:this._focalOffset0.toArray()})}fromJSON(s,t=!1){const e=JSON.parse(s);this.enabled=e.enabled,this.minDistance=e.minDistance,this.maxDistance=Ae(e.maxDistance),this.minZoom=e.minZoom,this.maxZoom=Ae(e.maxZoom),this.minPolarAngle=e.minPolarAngle,this.maxPolarAngle=Ae(e.maxPolarAngle),this.minAzimuthAngle=Ae(e.minAzimuthAngle),this.maxAzimuthAngle=Ae(e.maxAzimuthAngle),this.smoothTime=e.smoothTime,this.draggingSmoothTime=e.draggingSmoothTime,this.dollySpeed=e.dollySpeed,this.truckSpeed=e.truckSpeed,this.dollyToCursor=e.dollyToCursor,this.verticalDragToForward=e.verticalDragToForward,this._target0.fromArray(e.target0),this._position0.fromArray(e.position0),this._zoom0=e.zoom0,this._focalOffset0.fromArray(e.focalOffset0),this.moveTo(e.target[0],e.target[1],e.target[2],t),ht.setFromVector3(Y.fromArray(e.position).sub(this._targetEnd).applyQuaternion(this._yAxisUpSpace)),this.rotateTo(ht.theta,ht.phi,t),this.dollyTo(ht.radius,t),this.zoomTo(e.zoom,t),this.setFocalOffset(e.focalOffset[0],e.focalOffset[1],e.focalOffset[2],t),this._needsUpdate=!0}connect(s){if(this._domElement){console.warn("camera-controls is already connected.");return}s.setAttribute("data-camera-controls-version",Er),this._addAllEventListeners(s),this._getClientRect(this._elementRect)}disconnect(){this.cancel(),this._removeAllEventListeners(),this._domElement&&(this._domElement.removeAttribute("data-camera-controls-version"),this._domElement=void 0)}dispose(){this.removeAllEventListeners(),this.disconnect()}_getTargetDirection(s){return s.setFromSpherical(this._spherical).divideScalar(this._spherical.radius).applyQuaternion(this._yAxisUpSpaceInverse)}_getCameraDirection(s){return this._getTargetDirection(s).negate()}_findPointerById(s){return this._activePointers.find(t=>t.pointerId===s)}_findPointerByMouseButton(s){return this._activePointers.find(t=>t.mouseButton===s)}_disposePointer(s){this._activePointers.splice(this._activePointers.indexOf(s),1)}_encloseToBoundary(s,t,e){const i=t.lengthSq();if(i===0)return s;const o=G.copy(t).add(s),r=this._boundary.clampPoint(o,ne).sub(o),a=r.lengthSq();if(a===0)return s.add(t);if(a===i)return s;if(e===0)return s.add(t).add(r);{const l=1+e*a/t.dot(r);return s.add(G.copy(t).multiplyScalar(l)).add(r.multiplyScalar(1-e))}}_updateNearPlaneCorners(){if(Gt(this._camera)){const s=this._camera,t=s.near,e=s.getEffectiveFOV()*me,i=Math.tan(e*.5)*t,o=i*s.aspect;this._nearPlaneCorners[0].set(-o,-i,0),this._nearPlaneCorners[1].set(o,-i,0),this._nearPlaneCorners[2].set(o,i,0),this._nearPlaneCorners[3].set(-o,i,0)}else if(Lt(this._camera)){const s=this._camera,t=1/s.zoom,e=s.left*t,i=s.right*t,o=s.top*t,n=s.bottom*t;this._nearPlaneCorners[0].set(e,o,0),this._nearPlaneCorners[1].set(i,o,0),this._nearPlaneCorners[2].set(i,n,0),this._nearPlaneCorners[3].set(e,n,0)}}_collisionTest(){let s=1/0;if(!(this.colliderMeshes.length>=1)||Zs(this._camera,"_collisionTest"))return s;const e=this._getTargetDirection(Fe);$s.lookAt(Ki,e,this._camera.up);for(let i=0;i<4;i++){const o=G.copy(this._nearPlaneCorners[i]);o.applyMatrix4($s);const n=ne.addVectors(this._target,o);is.set(n,e),is.far=this._spherical.radius+1;const r=is.intersectObjects(this.colliderMeshes);r.length!==0&&r[0].distance<s&&(s=r[0].distance)}return s}_getClientRect(s){if(!this._domElement)return;const t=this._domElement.getBoundingClientRect();return s.x=t.left,s.y=t.top,this._viewport?(s.x+=this._viewport.x,s.y+=t.height-this._viewport.w-this._viewport.y,s.width=this._viewport.z,s.height=this._viewport.w):(s.width=t.width,s.height=t.height),s}_createOnRestPromise(s){return s?Promise.resolve():(this._hasRested=!1,this.dispatchEvent({type:"transitionstart"}),new Promise(t=>{const e=()=>{this.removeEventListener("rest",e),t()};this.addEventListener("rest",e)}))}_addAllEventListeners(s){}_removeAllEventListeners(){}get dampingFactor(){return console.warn(".dampingFactor has been deprecated. use smoothTime (in seconds) instead."),0}set dampingFactor(s){console.warn(".dampingFactor has been deprecated. use smoothTime (in seconds) instead.")}get draggingDampingFactor(){return console.warn(".draggingDampingFactor has been deprecated. use draggingSmoothTime (in seconds) instead."),0}set draggingDampingFactor(s){console.warn(".draggingDampingFactor has been deprecated. use draggingSmoothTime (in seconds) instead.")}static createBoundingSphere(s,t=new B.Sphere){const e=t,i=e.center;oe.makeEmpty(),s.traverseVisible(n=>{n.isMesh&&oe.expandByObject(n)}),oe.getCenter(i);let o=0;return s.traverseVisible(n=>{if(!n.isMesh)return;const r=n,a=r.geometry.clone();a.applyMatrix4(r.matrixWorld);const E=a.attributes.position;for(let d=0,h=E.count;d<h;d++)Y.fromBufferAttribute(E,d),o=Math.max(o,i.distanceToSquared(Y))}),e.radius=Math.sqrt(o),e}}class le extends pn{constructor(t){super(t);I(this,"onBeforeUpdate",new D);I(this,"onAfterUpdate",new D);I(this,"onAspectUpdated",new D);I(this,"onDisposed",new D);I(this,"three");I(this,"_allControls",new Map);I(this,"updateAspect",()=>{var t;if(!(!this.currentWorld||!this.currentWorld.renderer)&&!(this.three instanceof S.OrthographicCamera)&&(t=this.currentWorld.renderer)!=null&&t.isResizeable()){const e=this.currentWorld.renderer.getSize();this.three.aspect=e.width/e.height,this.three.updateProjectionMatrix(),this.onAspectUpdated.trigger()}});this.three=this.setupCamera(),this.setupEvents(!0),this.onWorldChanged.add(({action:e,world:i})=>{if(e==="added"){const o=this.newCameraControls();this._allControls.set(i.uuid,o)}if(e==="removed"){const o=this._allControls.get(i.uuid);o&&(o.dispose(),this._allControls.delete(i.uuid))}})}get controls(){if(!this.currentWorld)throw new Error("This camera needs a world to work!");const t=this._allControls.get(this.currentWorld.uuid);if(!t)throw new Error("Controls not found!");return t}get enabled(){return this.currentWorld===null?!1:this.controls.enabled}set enabled(t){this.controls.enabled=t}dispose(){this.setupEvents(!1),this.enabled=!1,this.onAspectUpdated.reset(),this.onBeforeUpdate.reset(),this.onAfterUpdate.reset(),this.three.removeFromParent(),this.onDisposed.trigger(),this.onDisposed.reset();for(const[t,e]of this._allControls)e.dispose()}update(t){this.enabled&&(this.onBeforeUpdate.trigger(this),this.controls.update(t),this.onAfterUpdate.trigger(this))}setupCamera(){const t=window.innerWidth/window.innerHeight,e=new S.PerspectiveCamera(60,t,1,1e3);return e.position.set(50,50,50),e.lookAt(new S.Vector3(0,0,0)),e}newCameraControls(){if(!this.currentWorld)throw new Error("This camera needs a world to work!");if(!this.currentWorld.renderer)throw new Error("This camera needs a renderer to work!");nt.install({THREE:le.getSubsetOfThree()});const{domElement:t}=this.currentWorld.renderer.three,e=new nt(this.three,t);return e.smoothTime=.2,e.dollyToCursor=!0,e.infinityDolly=!0,e}setupEvents(t){t?window.addEventListener("resize",this.updateAspect):window.removeEventListener("resize",this.updateAspect)}static getSubsetOfThree(){return{MOUSE:S.MOUSE,Vector2:S.Vector2,Vector3:S.Vector3,Vector4:S.Vector4,Quaternion:S.Quaternion,Matrix4:S.Matrix4,Spherical:S.Spherical,Box3:S.Box3,Sphere:S.Sphere,Raycaster:S.Raycaster,MathUtils:S.MathUtils}}}const ms=class ms extends ${constructor(t){super(t);I(this,"onAfterUpdate",new D);I(this,"onBeforeUpdate",new D);I(this,"onDisposed",new D);I(this,"list",new Map);I(this,"enabled",!0);t.add(ms.uuid,this)}create(){const t=new An(this.components),e=t.uuid;if(this.list.has(e))throw new Error("There is already a world with this name!");return this.list.set(e,t),t}delete(t){this.list.delete(t.uuid),t.dispose()}dispose(){this.enabled=!1;for(const[t,e]of this.list)e.dispose();this.list.clear(),this.onDisposed.trigger()}update(t){if(this.enabled)for(const[e,i]of this.list)i.update(t)}};I(ms,"uuid","fdb61dc4-2ec1-4966-b83d-54ea795fad4a");let ds=ms;class Ir{constructor(s,t,e){I(this,"onDisposed",new D);I(this,"world");I(this,"components");I(this,"_grid");I(this,"_fade",3);I(this,"updateZoom",()=>{this.world.camera instanceof le&&(this.material.uniforms.uZoom.value=this.world.camera.three.zoom)});this.world=t;const{color:i,size1:o,size2:n,distance:r}=e;this.components=s;const a=new S.PlaneGeometry(2,2,1,1),l=new S.ShaderMaterial({side:S.DoubleSide,uniforms:{uSize1:{value:o},uSize2:{value:n},uColor:{value:i},uDistance:{value:r},uFade:{value:this._fade},uZoom:{value:1}},transparent:!0,vertexShader:`
11
11
 
12
12
  varying vec3 worldPosition;
13
13
 
@@ -68,7 +68,7 @@
68
68
 
69
69
  }
70
70
 
71
- `,extensions:{derivatives:!0}});this._grid=new S.Mesh(a,l),this._grid.frustumCulled=!1,t.scene.three.add(this._grid),this.setupEvents(!0)}get visible(){return this._grid.visible}set visible(s){s?this.world.scene.three.add(this._grid):this._grid.removeFromParent()}get material(){return this._grid.material}get fade(){return this._fade===3}set fade(s){this._fade=s?3:0,this.material.uniforms.uFade.value=this._fade}[Symbol.dispose](){throw new Error("Method not implemented.")}get(){return this._grid}dispose(){this.setupEvents(!1),this.components.get(yt).destroy(this._grid),this.onDisposed.trigger(),this.onDisposed.reset(),this.world=null,this.components=null}setupEvents(s){if(!(this.world.camera instanceof ce))return;const t=this.world.camera.controls;s?t.addEventListener("update",this.updateZoom):t.removeEventListener("update",this.updateZoom)}}class Rn extends tt{constructor(){super(...arguments);I(this,"list",new Map);I(this,"onDisposed",new D);I(this,"config",{color:new S.Color(12303291),size1:1,size2:10,distance:500});I(this,"enabled",!0)}create(t){if(this.list.has(t.uuid))throw new Error("This world already has a grid!");const e=new Er(this.components,t,this.config);this.list.set(t.uuid,e),t.onDisposed.add(()=>{this.delete(t)})}delete(t){const e=this.list.get(t.uuid);e&&e.dispose(),this.list.delete(t.uuid)}dispose(){for(const[t,e]of this.list)e.dispose();this.list.clear(),this.onDisposed.trigger()}}I(Rn,"uuid","d1e814d5-b81c-4452-87a2-f039375e0489");const Gt=new C.Raycaster,it=new C.Vector3,Lt=new C.Vector3,Q=new C.Quaternion,Ki={X:new C.Vector3(1,0,0),Y:new C.Vector3(0,1,0),Z:new C.Vector3(0,0,1)},js={type:"change"},Ji={type:"mouseDown"},tn={type:"mouseUp",mode:null},en={type:"objectChange"};class dr extends C.Object3D{constructor(s,t){super(),t===void 0&&(console.warn('THREE.TransformControls: The second parameter "domElement" is now mandatory.'),t=document),this.isTransformControls=!0,this.visible=!1,this.domElement=t,this.domElement.style.touchAction="none";const e=new Tr;this._gizmo=e,this.add(e);const i=new mr;this._plane=i,this.add(i);const o=this;function n(m,g){let f=g;Object.defineProperty(o,m,{get:function(){return f!==void 0?f:g},set:function(R){f!==R&&(f=R,i[m]=R,e[m]=R,o.dispatchEvent({type:m+"-changed",value:R}),o.dispatchEvent(js))}}),o[m]=g,i[m]=g,e[m]=g}n("camera",s),n("object",void 0),n("enabled",!0),n("axis",null),n("mode","translate"),n("translationSnap",null),n("rotationSnap",null),n("scaleSnap",null),n("space","world"),n("size",1),n("dragging",!1),n("showX",!0),n("showY",!0),n("showZ",!0);const r=new C.Vector3,a=new C.Vector3,l=new C.Quaternion,E=new C.Quaternion,d=new C.Vector3,h=new C.Quaternion,u=new C.Vector3,p=new C.Vector3,A=new C.Vector3,F=0,T=new C.Vector3;n("worldPosition",r),n("worldPositionStart",a),n("worldQuaternion",l),n("worldQuaternionStart",E),n("cameraPosition",d),n("cameraQuaternion",h),n("pointStart",u),n("pointEnd",p),n("rotationAxis",A),n("rotationAngle",F),n("eye",T),this._offset=new C.Vector3,this._startNorm=new C.Vector3,this._endNorm=new C.Vector3,this._cameraScale=new C.Vector3,this._parentPosition=new C.Vector3,this._parentQuaternion=new C.Quaternion,this._parentQuaternionInv=new C.Quaternion,this._parentScale=new C.Vector3,this._worldScaleStart=new C.Vector3,this._worldQuaternionInv=new C.Quaternion,this._worldScale=new C.Vector3,this._positionStart=new C.Vector3,this._quaternionStart=new C.Quaternion,this._scaleStart=new C.Vector3,this._getPointer=ur.bind(this),this._onPointerDown=fr.bind(this),this._onPointerHover=Ir.bind(this),this._onPointerMove=pr.bind(this),this._onPointerUp=Cr.bind(this),this.domElement.addEventListener("pointerdown",this._onPointerDown),this.domElement.addEventListener("pointermove",this._onPointerHover),this.domElement.addEventListener("pointerup",this._onPointerUp)}updateMatrixWorld(){this.object!==void 0&&(this.object.updateMatrixWorld(),this.object.parent===null?console.error("TransformControls: The attached 3D object must be a part of the scene graph."):this.object.parent.matrixWorld.decompose(this._parentPosition,this._parentQuaternion,this._parentScale),this.object.matrixWorld.decompose(this.worldPosition,this.worldQuaternion,this._worldScale),this._parentQuaternionInv.copy(this._parentQuaternion).invert(),this._worldQuaternionInv.copy(this.worldQuaternion).invert()),this.camera.updateMatrixWorld(),this.camera.matrixWorld.decompose(this.cameraPosition,this.cameraQuaternion,this._cameraScale),this.camera.isOrthographicCamera?this.camera.getWorldDirection(this.eye).negate():this.eye.copy(this.cameraPosition).sub(this.worldPosition).normalize(),super.updateMatrixWorld(this)}pointerHover(s){if(this.object===void 0||this.dragging===!0)return;Gt.setFromCamera(s,this.camera);const t=qs(this._gizmo.picker[this.mode],Gt);t?this.axis=t.object.name:this.axis=null}pointerDown(s){if(!(this.object===void 0||this.dragging===!0||s.button!==0)&&this.axis!==null){Gt.setFromCamera(s,this.camera);const t=qs(this._plane,Gt,!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,Ji.mode=this.mode,this.dispatchEvent(Ji)}}pointerMove(s){const t=this.axis,e=this.mode,i=this.object;let o=this.space;if(e==="scale"?o="local":(t==="E"||t==="XYZE"||t==="XYZ")&&(o="world"),i===void 0||t===null||this.dragging===!1||s.button!==-1)return;Gt.setFromCamera(s,this.camera);const n=qs(this._plane,Gt,!0);if(n){if(this.pointEnd.copy(n.point).sub(this.worldPositionStart),e==="translate")this._offset.copy(this.pointEnd).sub(this.pointStart),o==="local"&&t!=="XYZ"&&this._offset.applyQuaternion(this._worldQuaternionInv),t.indexOf("X")===-1&&(this._offset.x=0),t.indexOf("Y")===-1&&(this._offset.y=0),t.indexOf("Z")===-1&&(this._offset.z=0),o==="local"&&t!=="XYZ"?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&&(o==="local"&&(i.position.applyQuaternion(Q.copy(this._quaternionStart).invert()),t.search("X")!==-1&&(i.position.x=Math.round(i.position.x/this.translationSnap)*this.translationSnap),t.search("Y")!==-1&&(i.position.y=Math.round(i.position.y/this.translationSnap)*this.translationSnap),t.search("Z")!==-1&&(i.position.z=Math.round(i.position.z/this.translationSnap)*this.translationSnap),i.position.applyQuaternion(this._quaternionStart)),o==="world"&&(i.parent&&i.position.add(it.setFromMatrixPosition(i.parent.matrixWorld)),t.search("X")!==-1&&(i.position.x=Math.round(i.position.x/this.translationSnap)*this.translationSnap),t.search("Y")!==-1&&(i.position.y=Math.round(i.position.y/this.translationSnap)*this.translationSnap),t.search("Z")!==-1&&(i.position.z=Math.round(i.position.z/this.translationSnap)*this.translationSnap),i.parent&&i.position.sub(it.setFromMatrixPosition(i.parent.matrixWorld))));else if(e==="scale"){if(t.search("XYZ")!==-1){let r=this.pointEnd.length()/this.pointStart.length();this.pointEnd.dot(this.pointStart)<0&&(r*=-1),Lt.set(r,r,r)}else it.copy(this.pointStart),Lt.copy(this.pointEnd),it.applyQuaternion(this._worldQuaternionInv),Lt.applyQuaternion(this._worldQuaternionInv),Lt.divide(it),t.search("X")===-1&&(Lt.x=1),t.search("Y")===-1&&(Lt.y=1),t.search("Z")===-1&&(Lt.z=1);i.scale.copy(this._scaleStart).multiply(Lt),this.scaleSnap&&(t.search("X")!==-1&&(i.scale.x=Math.round(i.scale.x/this.scaleSnap)*this.scaleSnap||this.scaleSnap),t.search("Y")!==-1&&(i.scale.y=Math.round(i.scale.y/this.scaleSnap)*this.scaleSnap||this.scaleSnap),t.search("Z")!==-1&&(i.scale.z=Math.round(i.scale.z/this.scaleSnap)*this.scaleSnap||this.scaleSnap))}else if(e==="rotate"){this._offset.copy(this.pointEnd).sub(this.pointStart);const r=20/this.worldPosition.distanceTo(it.setFromMatrixPosition(this.camera.matrixWorld));let a=!1;t==="XYZE"?(this.rotationAxis.copy(this._offset).cross(this.eye).normalize(),this.rotationAngle=this._offset.dot(it.copy(this.rotationAxis).cross(this.eye))*r):(t==="X"||t==="Y"||t==="Z")&&(this.rotationAxis.copy(Ki[t]),it.copy(Ki[t]),o==="local"&&it.applyQuaternion(this.worldQuaternion),it.cross(this.eye),it.length()===0?a=!0:this.rotationAngle=this._offset.dot(it.normalize())*r),(t==="E"||a)&&(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),o==="local"&&t!=="E"&&t!=="XYZE"?(i.quaternion.copy(this._quaternionStart),i.quaternion.multiply(Q.setFromAxisAngle(this.rotationAxis,this.rotationAngle)).normalize()):(this.rotationAxis.applyQuaternion(this._parentQuaternionInv),i.quaternion.copy(Q.setFromAxisAngle(this.rotationAxis,this.rotationAngle)),i.quaternion.multiply(this._quaternionStart).normalize())}this.dispatchEvent(js),this.dispatchEvent(en)}}pointerUp(s){s.button===0&&(this.dragging&&this.axis!==null&&(tn.mode=this.mode,this.dispatchEvent(tn)),this.dragging=!1,this.axis=null)}dispose(){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.traverse(function(s){s.geometry&&s.geometry.dispose(),s.material&&s.material.dispose()})}attach(s){return this.object=s,this.visible=!0,this}detach(){return this.object=void 0,this.visible=!1,this.axis=null,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(js),this.dispatchEvent(en),this.pointStart.copy(this.pointEnd))}getRaycaster(){return Gt}getMode(){return this.mode}setMode(s){this.mode=s}setTranslationSnap(s){this.translationSnap=s}setRotationSnap(s){this.rotationSnap=s}setScaleSnap(s){this.scaleSnap=s}setSize(s){this.size=s}setSpace(s){this.space=s}}function ur(c){if(this.domElement.ownerDocument.pointerLockElement)return{x:0,y:0,button:c.button};{const s=this.domElement.getBoundingClientRect();return{x:(c.clientX-s.left)/s.width*2-1,y:-(c.clientY-s.top)/s.height*2+1,button:c.button}}}function Ir(c){if(this.enabled)switch(c.pointerType){case"mouse":case"pen":this.pointerHover(this._getPointer(c));break}}function fr(c){this.enabled&&(document.pointerLockElement||this.domElement.setPointerCapture(c.pointerId),this.domElement.addEventListener("pointermove",this._onPointerMove),this.pointerHover(this._getPointer(c)),this.pointerDown(this._getPointer(c)))}function pr(c){this.enabled&&this.pointerMove(this._getPointer(c))}function Cr(c){this.enabled&&(this.domElement.releasePointerCapture(c.pointerId),this.domElement.removeEventListener("pointermove",this._onPointerMove),this.pointerUp(this._getPointer(c)))}function qs(c,s,t){const e=s.intersectObject(c,!0);for(let i=0;i<e.length;i++)if(e[i].object.visible||t)return e[i];return!1}const is=new C.Euler,k=new C.Vector3(0,1,0),sn=new C.Vector3(0,0,0),nn=new C.Matrix4,ns=new C.Quaternion,cs=new C.Quaternion,gt=new C.Vector3,on=new C.Matrix4,Se=new C.Vector3(1,0,0),zt=new C.Vector3(0,1,0),_e=new C.Vector3(0,0,1),os=new C.Vector3,ge=new C.Vector3,Oe=new C.Vector3;class Tr extends C.Object3D{constructor(){super(),this.isTransformControlsGizmo=!0,this.type="TransformControlsGizmo";const s=new C.MeshBasicMaterial({depthTest:!1,depthWrite:!1,fog:!1,toneMapped:!1,transparent:!0}),t=new C.LineBasicMaterial({depthTest:!1,depthWrite:!1,fog:!1,toneMapped:!1,transparent:!0}),e=s.clone();e.opacity=.15;const i=t.clone();i.opacity=.5;const o=s.clone();o.color.setHex(16711680);const n=s.clone();n.color.setHex(65280);const r=s.clone();r.color.setHex(255);const a=s.clone();a.color.setHex(16711680),a.opacity=.5;const l=s.clone();l.color.setHex(65280),l.opacity=.5;const E=s.clone();E.color.setHex(255),E.opacity=.5;const d=s.clone();d.opacity=.25;const h=s.clone();h.color.setHex(16776960),h.opacity=.25,s.clone().color.setHex(16776960);const p=s.clone();p.color.setHex(7895160);const A=new C.CylinderGeometry(0,.04,.1,12);A.translate(0,.05,0);const F=new C.BoxGeometry(.08,.08,.08);F.translate(0,.04,0);const T=new C.BufferGeometry;T.setAttribute("position",new C.Float32BufferAttribute([0,0,0,1,0,0],3));const m=new C.CylinderGeometry(.0075,.0075,.5,3);m.translate(0,.25,0);function g(v,z){const j=new C.TorusGeometry(v,.0075,3,64,z*Math.PI*2);return j.rotateY(Math.PI/2),j.rotateX(Math.PI/2),j}function f(){const v=new C.BufferGeometry;return v.setAttribute("position",new C.Float32BufferAttribute([0,0,0,1,1,1],3)),v}const R={X:[[new C.Mesh(A,o),[.5,0,0],[0,0,-Math.PI/2]],[new C.Mesh(A,o),[-.5,0,0],[0,0,Math.PI/2]],[new C.Mesh(m,o),[0,0,0],[0,0,-Math.PI/2]]],Y:[[new C.Mesh(A,n),[0,.5,0]],[new C.Mesh(A,n),[0,-.5,0],[Math.PI,0,0]],[new C.Mesh(m,n)]],Z:[[new C.Mesh(A,r),[0,0,.5],[Math.PI/2,0,0]],[new C.Mesh(A,r),[0,0,-.5],[-Math.PI/2,0,0]],[new C.Mesh(m,r),null,[Math.PI/2,0,0]]],XYZ:[[new C.Mesh(new C.OctahedronGeometry(.1,0),d.clone()),[0,0,0]]],XY:[[new C.Mesh(new C.BoxGeometry(.15,.15,.01),E.clone()),[.15,.15,0]]],YZ:[[new C.Mesh(new C.BoxGeometry(.15,.15,.01),a.clone()),[0,.15,.15],[0,Math.PI/2,0]]],XZ:[[new C.Mesh(new C.BoxGeometry(.15,.15,.01),l.clone()),[.15,0,.15],[-Math.PI/2,0,0]]]},O={X:[[new C.Mesh(new C.CylinderGeometry(.2,0,.6,4),e),[.3,0,0],[0,0,-Math.PI/2]],[new C.Mesh(new C.CylinderGeometry(.2,0,.6,4),e),[-.3,0,0],[0,0,Math.PI/2]]],Y:[[new C.Mesh(new C.CylinderGeometry(.2,0,.6,4),e),[0,.3,0]],[new C.Mesh(new C.CylinderGeometry(.2,0,.6,4),e),[0,-.3,0],[0,0,Math.PI]]],Z:[[new C.Mesh(new C.CylinderGeometry(.2,0,.6,4),e),[0,0,.3],[Math.PI/2,0,0]],[new C.Mesh(new C.CylinderGeometry(.2,0,.6,4),e),[0,0,-.3],[-Math.PI/2,0,0]]],XYZ:[[new C.Mesh(new C.OctahedronGeometry(.2,0),e)]],XY:[[new C.Mesh(new C.BoxGeometry(.2,.2,.01),e),[.15,.15,0]]],YZ:[[new C.Mesh(new C.BoxGeometry(.2,.2,.01),e),[0,.15,.15],[0,Math.PI/2,0]]],XZ:[[new C.Mesh(new C.BoxGeometry(.2,.2,.01),e),[.15,0,.15],[-Math.PI/2,0,0]]]},_={START:[[new C.Mesh(new C.OctahedronGeometry(.01,2),i),null,null,null,"helper"]],END:[[new C.Mesh(new C.OctahedronGeometry(.01,2),i),null,null,null,"helper"]],DELTA:[[new C.Line(f(),i),null,null,null,"helper"]],X:[[new C.Line(T,i.clone()),[-1e3,0,0],null,[1e6,1,1],"helper"]],Y:[[new C.Line(T,i.clone()),[0,-1e3,0],[0,0,Math.PI/2],[1e6,1,1],"helper"]],Z:[[new C.Line(T,i.clone()),[0,0,-1e3],[0,-Math.PI/2,0],[1e6,1,1],"helper"]]},y={XYZE:[[new C.Mesh(g(.5,1),p),null,[0,Math.PI/2,0]]],X:[[new C.Mesh(g(.5,.5),o)]],Y:[[new C.Mesh(g(.5,.5),n),null,[0,0,-Math.PI/2]]],Z:[[new C.Mesh(g(.5,.5),r),null,[0,Math.PI/2,0]]],E:[[new C.Mesh(g(.75,1),h),null,[0,Math.PI/2,0]]]},N={AXIS:[[new C.Line(T,i.clone()),[-1e3,0,0],null,[1e6,1,1],"helper"]]},P={XYZE:[[new C.Mesh(new C.SphereGeometry(.25,10,8),e)]],X:[[new C.Mesh(new C.TorusGeometry(.5,.1,4,24),e),[0,0,0],[0,-Math.PI/2,-Math.PI/2]]],Y:[[new C.Mesh(new C.TorusGeometry(.5,.1,4,24),e),[0,0,0],[Math.PI/2,0,0]]],Z:[[new C.Mesh(new C.TorusGeometry(.5,.1,4,24),e),[0,0,0],[0,0,-Math.PI/2]]],E:[[new C.Mesh(new C.TorusGeometry(.75,.1,2,24),e)]]},w={X:[[new C.Mesh(F,o),[.5,0,0],[0,0,-Math.PI/2]],[new C.Mesh(m,o),[0,0,0],[0,0,-Math.PI/2]],[new C.Mesh(F,o),[-.5,0,0],[0,0,Math.PI/2]]],Y:[[new C.Mesh(F,n),[0,.5,0]],[new C.Mesh(m,n)],[new C.Mesh(F,n),[0,-.5,0],[0,0,Math.PI]]],Z:[[new C.Mesh(F,r),[0,0,.5],[Math.PI/2,0,0]],[new C.Mesh(m,r),[0,0,0],[Math.PI/2,0,0]],[new C.Mesh(F,r),[0,0,-.5],[-Math.PI/2,0,0]]],XY:[[new C.Mesh(new C.BoxGeometry(.15,.15,.01),E),[.15,.15,0]]],YZ:[[new C.Mesh(new C.BoxGeometry(.15,.15,.01),a),[0,.15,.15],[0,Math.PI/2,0]]],XZ:[[new C.Mesh(new C.BoxGeometry(.15,.15,.01),l),[.15,0,.15],[-Math.PI/2,0,0]]],XYZ:[[new C.Mesh(new C.BoxGeometry(.1,.1,.1),d.clone())]]},M={X:[[new C.Mesh(new C.CylinderGeometry(.2,0,.6,4),e),[.3,0,0],[0,0,-Math.PI/2]],[new C.Mesh(new C.CylinderGeometry(.2,0,.6,4),e),[-.3,0,0],[0,0,Math.PI/2]]],Y:[[new C.Mesh(new C.CylinderGeometry(.2,0,.6,4),e),[0,.3,0]],[new C.Mesh(new C.CylinderGeometry(.2,0,.6,4),e),[0,-.3,0],[0,0,Math.PI]]],Z:[[new C.Mesh(new C.CylinderGeometry(.2,0,.6,4),e),[0,0,.3],[Math.PI/2,0,0]],[new C.Mesh(new C.CylinderGeometry(.2,0,.6,4),e),[0,0,-.3],[-Math.PI/2,0,0]]],XY:[[new C.Mesh(new C.BoxGeometry(.2,.2,.01),e),[.15,.15,0]]],YZ:[[new C.Mesh(new C.BoxGeometry(.2,.2,.01),e),[0,.15,.15],[0,Math.PI/2,0]]],XZ:[[new C.Mesh(new C.BoxGeometry(.2,.2,.01),e),[.15,0,.15],[-Math.PI/2,0,0]]],XYZ:[[new C.Mesh(new C.BoxGeometry(.2,.2,.2),e),[0,0,0]]]},U={X:[[new C.Line(T,i.clone()),[-1e3,0,0],null,[1e6,1,1],"helper"]],Y:[[new C.Line(T,i.clone()),[0,-1e3,0],[0,0,Math.PI/2],[1e6,1,1],"helper"]],Z:[[new C.Line(T,i.clone()),[0,0,-1e3],[0,-Math.PI/2,0],[1e6,1,1],"helper"]]};function x(v){const z=new C.Object3D;for(const j in v)for(let et=v[j].length;et--;){const Z=v[j][et][0].clone(),xt=v[j][et][1],bt=v[j][et][2],vt=v[j][et][3],xe=v[j][et][4];Z.name=j,Z.tag=xe,xt&&Z.position.set(xt[0],xt[1],xt[2]),bt&&Z.rotation.set(bt[0],bt[1],bt[2]),vt&&Z.scale.set(vt[0],vt[1],vt[2]),Z.updateMatrix();const he=Z.geometry.clone();he.applyMatrix4(Z.matrix),Z.geometry=he,Z.renderOrder=1/0,Z.position.set(0,0,0),Z.rotation.set(0,0,0),Z.scale.set(1,1,1),z.add(Z)}return z}this.gizmo={},this.picker={},this.helper={},this.add(this.gizmo.translate=x(R)),this.add(this.gizmo.rotate=x(y)),this.add(this.gizmo.scale=x(w)),this.add(this.picker.translate=x(O)),this.add(this.picker.rotate=x(P)),this.add(this.picker.scale=x(M)),this.add(this.helper.translate=x(_)),this.add(this.helper.rotate=x(N)),this.add(this.helper.scale=x(U)),this.picker.translate.visible=!1,this.picker.rotate.visible=!1,this.picker.scale.visible=!1}updateMatrixWorld(s){const e=(this.mode==="scale"?"local":this.space)==="local"?this.worldQuaternion:cs;this.gizmo.translate.visible=this.mode==="translate",this.gizmo.rotate.visible=this.mode==="rotate",this.gizmo.scale.visible=this.mode==="scale",this.helper.translate.visible=this.mode==="translate",this.helper.rotate.visible=this.mode==="rotate",this.helper.scale.visible=this.mode==="scale";let i=[];i=i.concat(this.picker[this.mode].children),i=i.concat(this.gizmo[this.mode].children),i=i.concat(this.helper[this.mode].children);for(let o=0;o<i.length;o++){const n=i[o];n.visible=!0,n.rotation.set(0,0,0),n.position.copy(this.worldPosition);let r;if(this.camera.isOrthographicCamera?r=(this.camera.top-this.camera.bottom)/this.camera.zoom:r=this.worldPosition.distanceTo(this.cameraPosition)*Math.min(1.9*Math.tan(Math.PI*this.camera.fov/360)/this.camera.zoom,7),n.scale.set(1,1,1).multiplyScalar(r*this.size/4),n.tag==="helper"){n.visible=!1,n.name==="AXIS"?(n.visible=!!this.axis,this.axis==="X"&&(Q.setFromEuler(is.set(0,0,0)),n.quaternion.copy(e).multiply(Q),Math.abs(k.copy(Se).applyQuaternion(e).dot(this.eye))>.9&&(n.visible=!1)),this.axis==="Y"&&(Q.setFromEuler(is.set(0,0,Math.PI/2)),n.quaternion.copy(e).multiply(Q),Math.abs(k.copy(zt).applyQuaternion(e).dot(this.eye))>.9&&(n.visible=!1)),this.axis==="Z"&&(Q.setFromEuler(is.set(0,Math.PI/2,0)),n.quaternion.copy(e).multiply(Q),Math.abs(k.copy(_e).applyQuaternion(e).dot(this.eye))>.9&&(n.visible=!1)),this.axis==="XYZE"&&(Q.setFromEuler(is.set(0,Math.PI/2,0)),k.copy(this.rotationAxis),n.quaternion.setFromRotationMatrix(nn.lookAt(sn,k,zt)),n.quaternion.multiply(Q),n.visible=this.dragging),this.axis==="E"&&(n.visible=!1)):n.name==="START"?(n.position.copy(this.worldPositionStart),n.visible=this.dragging):n.name==="END"?(n.position.copy(this.worldPosition),n.visible=this.dragging):n.name==="DELTA"?(n.position.copy(this.worldPositionStart),n.quaternion.copy(this.worldQuaternionStart),it.set(1e-10,1e-10,1e-10).add(this.worldPositionStart).sub(this.worldPosition).multiplyScalar(-1),it.applyQuaternion(this.worldQuaternionStart.clone().invert()),n.scale.copy(it),n.visible=this.dragging):(n.quaternion.copy(e),this.dragging?n.position.copy(this.worldPositionStart):n.position.copy(this.worldPosition),this.axis&&(n.visible=this.axis.search(n.name)!==-1));continue}n.quaternion.copy(e),this.mode==="translate"||this.mode==="scale"?(n.name==="X"&&Math.abs(k.copy(Se).applyQuaternion(e).dot(this.eye))>.99&&(n.scale.set(1e-10,1e-10,1e-10),n.visible=!1),n.name==="Y"&&Math.abs(k.copy(zt).applyQuaternion(e).dot(this.eye))>.99&&(n.scale.set(1e-10,1e-10,1e-10),n.visible=!1),n.name==="Z"&&Math.abs(k.copy(_e).applyQuaternion(e).dot(this.eye))>.99&&(n.scale.set(1e-10,1e-10,1e-10),n.visible=!1),n.name==="XY"&&Math.abs(k.copy(_e).applyQuaternion(e).dot(this.eye))<.2&&(n.scale.set(1e-10,1e-10,1e-10),n.visible=!1),n.name==="YZ"&&Math.abs(k.copy(Se).applyQuaternion(e).dot(this.eye))<.2&&(n.scale.set(1e-10,1e-10,1e-10),n.visible=!1),n.name==="XZ"&&Math.abs(k.copy(zt).applyQuaternion(e).dot(this.eye))<.2&&(n.scale.set(1e-10,1e-10,1e-10),n.visible=!1)):this.mode==="rotate"&&(ns.copy(e),k.copy(this.eye).applyQuaternion(Q.copy(e).invert()),n.name.search("E")!==-1&&n.quaternion.setFromRotationMatrix(nn.lookAt(this.eye,sn,zt)),n.name==="X"&&(Q.setFromAxisAngle(Se,Math.atan2(-k.y,k.z)),Q.multiplyQuaternions(ns,Q),n.quaternion.copy(Q)),n.name==="Y"&&(Q.setFromAxisAngle(zt,Math.atan2(k.x,k.z)),Q.multiplyQuaternions(ns,Q),n.quaternion.copy(Q)),n.name==="Z"&&(Q.setFromAxisAngle(_e,Math.atan2(k.y,k.x)),Q.multiplyQuaternions(ns,Q),n.quaternion.copy(Q))),n.visible=n.visible&&(n.name.indexOf("X")===-1||this.showX),n.visible=n.visible&&(n.name.indexOf("Y")===-1||this.showY),n.visible=n.visible&&(n.name.indexOf("Z")===-1||this.showZ),n.visible=n.visible&&(n.name.indexOf("E")===-1||this.showX&&this.showY&&this.showZ),n.material._color=n.material._color||n.material.color.clone(),n.material._opacity=n.material._opacity||n.material.opacity,n.material.color.copy(n.material._color),n.material.opacity=n.material._opacity,this.enabled&&this.axis&&(n.name===this.axis||this.axis.split("").some(function(a){return n.name===a}))&&(n.material.color.setHex(16776960),n.material.opacity=1)}super.updateMatrixWorld(s)}}class mr extends C.Mesh{constructor(){super(new C.PlaneGeometry(1e5,1e5,2,2),new C.MeshBasicMaterial({visible:!1,wireframe:!0,side:C.DoubleSide,transparent:!0,opacity:.1,toneMapped:!1})),this.isTransformControlsPlane=!0,this.type="TransformControlsPlane"}updateMatrixWorld(s){let t=this.space;switch(this.position.copy(this.worldPosition),this.mode==="scale"&&(t="local"),os.copy(Se).applyQuaternion(t==="local"?this.worldQuaternion:cs),ge.copy(zt).applyQuaternion(t==="local"?this.worldQuaternion:cs),Oe.copy(_e).applyQuaternion(t==="local"?this.worldQuaternion:cs),k.copy(ge),this.mode){case"translate":case"scale":switch(this.axis){case"X":k.copy(this.eye).cross(os),gt.copy(os).cross(k);break;case"Y":k.copy(this.eye).cross(ge),gt.copy(ge).cross(k);break;case"Z":k.copy(this.eye).cross(Oe),gt.copy(Oe).cross(k);break;case"XY":gt.copy(Oe);break;case"YZ":gt.copy(os);break;case"XZ":k.copy(Oe),gt.copy(ge);break;case"XYZ":case"E":gt.set(0,0,0);break}break;case"rotate":default:gt.set(0,0,0)}gt.length()===0?this.quaternion.copy(this.cameraQuaternion):(on.lookAt(it.set(0,0,0),gt,k),this.quaternion.setFromRotationMatrix(on)),super.updateMatrixWorld(s)}}class _s{constructor(s,t,e,i,o,n=5,r=!0){I(this,"onDraggingStarted",new D);I(this,"onDraggingEnded",new D);I(this,"onDisposed",new D);I(this,"normal");I(this,"origin");I(this,"three",new S.Plane);I(this,"_helper");I(this,"_visible",!0);I(this,"_enabled",!0);I(this,"components");I(this,"world");I(this,"_controlsActive",!1);I(this,"_arrowBoundBox",new S.Mesh);I(this,"_planeMesh");I(this,"_controls");I(this,"_hiddenMaterial",new S.MeshBasicMaterial({visible:!1}));I(this,"update",async()=>{this._enabled&&this.three.setFromNormalAndCoplanarPoint(this.normal,this._helper.position)});I(this,"changeDrag",s=>{this._visible=!s.value,this.preventCameraMovement(),this.notifyDraggingChanged(s)});if(this.components=s,this.world=t,!t.renderer)throw new Error("The given world must have a renderer!");this.normal=i,this.origin=e,t.renderer.setPlane(!0,this.three),this._planeMesh=_s.newPlaneMesh(n,o),this._helper=this.newHelper(),this._controls=this.newTransformControls(),this.three.setFromNormalAndCoplanarPoint(i,e),r&&this.toggleControls(!0)}get enabled(){return this._enabled}set enabled(s){if(!this.world.renderer)throw new Error("No renderer found for clipping plane!");this._enabled=s,this.world.renderer.setPlane(s,this.three)}get visible(){return this._visible}set visible(s){this._visible=s,this._controls.visible=s,this._helper.visible=s,this.toggleControls(s)}get meshes(){return[this._planeMesh,this._arrowBoundBox]}get planeMaterial(){return this._planeMesh.material}set planeMaterial(s){this._planeMesh.material=s}get size(){return this._planeMesh.scale.x}set size(s){this._planeMesh.scale.set(s,s,s)}get helper(){return this._helper}async setFromNormalAndCoplanarPoint(s,t){this.reset(),this.normal.equals(s)||(this.normal.copy(s),this._helper.lookAt(s)),this.origin.copy(t),this._helper.position.copy(t),this._helper.updateMatrix(),await this.update()}dispose(){this._enabled=!1,this.onDraggingStarted.reset(),this.onDraggingEnded.reset(),this._helper.removeFromParent(),this.world.renderer&&this.world.renderer.setPlane(!1,this.three),this._arrowBoundBox.removeFromParent(),this._arrowBoundBox.geometry.dispose(),this._planeMesh.geometry.dispose(),this._controls.removeFromParent(),this._controls.dispose(),this.onDisposed.trigger(),this.onDisposed.reset()}reset(){const s=new S.Vector3(1,0,0),t=new S.Vector3;this.normal.equals(s)||(this.normal.copy(s),this._helper.lookAt(s)),this.origin.copy(t),this._helper.position.copy(t),this._helper.updateMatrix()}toggleControls(s){if(s){if(this._controlsActive)return;this._controls.addEventListener("change",this.update),this._controls.addEventListener("dragging-changed",this.changeDrag)}else this._controls.removeEventListener("change",this.update),this._controls.removeEventListener("dragging-changed",this.changeDrag);this._controlsActive=s}newTransformControls(){if(!this.world.renderer)throw new Error("No renderer found for clipping plane!");const s=this.world.camera.three,t=this.world.renderer.three.domElement,e=new dr(s,t);return this.initializeControls(e),this.world.scene.three.add(e),e}initializeControls(s){s.attach(this._helper),s.showX=!1,s.showY=!1,s.setSpace("local"),this.createArrowBoundingBox(),s.children[0].children[0].add(this._arrowBoundBox)}createArrowBoundingBox(){this._arrowBoundBox.geometry=new S.CylinderGeometry(.18,.18,1.2),this._arrowBoundBox.material=this._hiddenMaterial,this._arrowBoundBox.rotateX(Math.PI/2),this._arrowBoundBox.updateMatrix(),this._arrowBoundBox.geometry.applyMatrix4(this._arrowBoundBox.matrix)}notifyDraggingChanged(s){s.value?this.onDraggingStarted.trigger():this.onDraggingEnded.trigger()}preventCameraMovement(){this.world.camera.enabled=this._visible}newHelper(){const s=new S.Object3D;return s.lookAt(this.normal),s.position.copy(this.origin),this._planeMesh.position.z+=.01,s.add(this._planeMesh),this.world.scene.three.add(s),s}static newPlaneMesh(s,t){const e=new S.PlaneGeometry(1),i=new S.Mesh(e,t);return i.scale.set(s,s,s),i}}const Le=class Le extends tt{constructor(t){super(t);I(this,"onAfterCreate",new D);I(this,"onAfterDelete",new D);I(this,"onBeforeDrag",new D);I(this,"onAfterDrag",new D);I(this,"onBeforeCreate",new D);I(this,"onBeforeCancel",new D);I(this,"onAfterCancel",new D);I(this,"onBeforeDelete",new D);I(this,"onDisposed",new D);I(this,"orthogonalY",!1);I(this,"toleranceOrthogonalY",.7);I(this,"list",[]);I(this,"PlaneType");I(this,"_material",new S.MeshBasicMaterial({color:16776960,side:S.DoubleSide,transparent:!0,opacity:.2}));I(this,"_size",5);I(this,"_enabled",!1);I(this,"_visible",!1);I(this,"_onStartDragging",()=>{this.onBeforeDrag.trigger()});I(this,"_onEndDragging",()=>{this.onAfterDrag.trigger()});this.components.add(Le.uuid,this),this.PlaneType=_s}get enabled(){return this._enabled}set enabled(t){this._enabled=t;for(const e of this.list)e.enabled=t;this.updateMaterialsAndPlanes()}get visible(){return this._visible}set visible(t){this._visible=t;for(const e of this.list)e.visible=t}get material(){return this._material}set material(t){this._material=t;for(const e of this.list)e.planeMaterial=t}get size(){return this._size}set size(t){this._size=t;for(const e of this.list)e.size=t}endCreation(){}cancelCreation(){}dispose(){this._enabled=!1;for(const t of this.list)t.dispose();this.list.length=0,this._material.dispose(),this.onBeforeCreate.reset(),this.onBeforeCancel.reset(),this.onBeforeDelete.reset(),this.onBeforeDrag.reset(),this.onAfterCreate.reset(),this.onAfterCancel.reset(),this.onAfterDelete.reset(),this.onAfterDrag.reset(),this.onDisposed.trigger(Le.uuid),this.onDisposed.reset()}create(t){if(!this.enabled)return;const o=this.components.get(ae).get(t).castRay();o&&this.createPlaneFromIntersection(t,o)}createFromNormalAndCoplanarPoint(t,e,i){const o=this.newPlane(t,i,e);return this.updateMaterialsAndPlanes(),o}delete(t,e){this.enabled&&(e||(e=this.pickPlane(t)),e&&this.deletePlane(e))}deleteAll(){for(;this.list.length>0;){const t=this.list[0];this.delete(t.world,t)}}deletePlane(t){const e=this.list.indexOf(t);if(e!==-1){if(this.list.splice(e,1),!t.world.renderer)throw new Error("Renderer not found for this plane's world!");t.world.renderer.setPlane(!1,t.three),t.dispose(),this.updateMaterialsAndPlanes(),this.onAfterDelete.trigger(t)}}pickPlane(t){const i=this.components.get(ae).get(t),o=this.getAllPlaneMeshes(),n=i.castRay(o);if(n){const r=n.object;return this.list.find(a=>a.meshes.includes(r))}}getAllPlaneMeshes(){const t=[];for(const e of this.list)t.push(...e.meshes);return t}createPlaneFromIntersection(t,e){var a;if(!t.renderer)throw new Error("The given world must have a renderer!");const i=e.point.distanceTo(new S.Vector3(0,0,0)),o=(a=e.face)==null?void 0:a.normal;if(!i||!o)return;const n=this.getWorldNormal(e,o),r=this.newPlane(t,e.point,n.negate());t.renderer.setPlane(!0,r.three),this.updateMaterialsAndPlanes()}getWorldNormal(t,e){const i=t.object;let o=t.object.matrixWorld.clone();if(i instanceof S.InstancedMesh&&t.instanceId!==void 0){const l=new S.Matrix4;i.getMatrixAt(t.instanceId,l),o=l.multiply(o)}const r=new S.Matrix3().getNormalMatrix(o),a=e.clone().applyMatrix3(r).normalize();return this.normalizePlaneDirectionY(a),a}normalizePlaneDirectionY(t){this.orthogonalY&&(t.y>this.toleranceOrthogonalY&&(t.x=0,t.y=1,t.z=0),t.y<-this.toleranceOrthogonalY&&(t.x=0,t.y=-1,t.z=0))}newPlane(t,e,i){const o=this.newPlaneInstance(t,e,i);return o.onDraggingStarted.add(this._onStartDragging),o.onDraggingEnded.add(this._onEndDragging),this.list.push(o),this.onAfterCreate.trigger(o),o}newPlaneInstance(t,e,i){return new this.PlaneType(this.components,t,e,i,this._material)}updateMaterialsAndPlanes(){const t=this.components.get(Es);for(const[e,i]of t.list){if(!i.renderer)continue;i.renderer.updateClippingPlanes();const{clippingPlanes:o}=i.renderer;for(const n of i.meshes)if(Array.isArray(n.material))for(const r of n.material)r.clippingPlanes=o;else n.material.clippingPlanes=o}}};I(Le,"uuid","66290bc5-18c4-4cd1-9379-2e17a0617611");let ai=Le;const Pe=class Pe extends tt{constructor(t){super(t);I(this,"enabled",!0);I(this,"_originalBackground",new Map);I(this,"onDisposed",new D);I(this,"list",{});I(this,"_originals",{});this.components.add(Pe.uuid,this)}set(t,e=Object.keys(this.list)){for(const i of e){const{material:o,meshes:n}=this.list[i];for(const r of n)if(t)this._originals[r.uuid]||(this._originals[r.uuid]={material:r.material}),r instanceof S.InstancedMesh&&r.instanceColor&&(this._originals[r.uuid].instances=r.instanceColor,r.instanceColor=null),r.material=o;else{if(!this._originals[r.uuid])continue;r.material=this._originals[r.uuid].material;const a=this._originals[r.uuid].instances;r instanceof S.InstancedMesh&&a&&(r.instanceColor=a)}}}dispose(){for(const t in this.list){const{material:e}=this.list[t];e.dispose()}this.list={},this._originals={},this.onDisposed.trigger(Pe.uuid),this.onDisposed.reset(),this._originalBackground.clear()}setBackgroundColor(t,e){const i=e.scene.three;i instanceof S.Scene&&(this._originalBackground.has(e.uuid)||this._originalBackground.set(e.uuid,i.background),this._originalBackground&&(i.background=t))}resetBackgroundColor(t){const e=t.scene.three;if(!(e instanceof S.Scene))return;const i=this._originalBackground.get(t.uuid);i&&(e.background=i)}addMaterial(t,e){if(this.list[t])throw new Error("This ID already exists!");this.list[t]={material:e,meshes:new Set}}addMeshes(t,e){if(!this.list[t])throw new Error("This ID doesn't exists!");for(const i of e)this.list[t].meshes.add(i)}removeMeshes(t,e){if(!this.list[t])throw new Error("This ID doesn't exists!");for(const i of e)this.list[t].meshes.delete(i)}};I(Pe,"uuid","24989d27-fa2f-4797-8b08-35918f74e502");let ci=Pe;function Rr(c,s,t,e){return new Promise((i,o)=>{function n(){const r=c.clientWaitSync(s,t,0);if(r===c.WAIT_FAILED){o();return}if(r===c.TIMEOUT_EXPIRED){setTimeout(n,e);return}i()}n()})}async function Ar(c,s,t,e,i,o,n){const r=c.fenceSync(c.SYNC_GPU_COMMANDS_COMPLETE,0);c.flush(),await Rr(c,r,0,10),c.deleteSync(r),c.bindBuffer(s,t),c.getBufferSubData(s,e,i,o,n),c.bindBuffer(s,null)}async function An(c,s,t,e,i,o,n,r){const a=c.createBuffer();return c.bindBuffer(c.PIXEL_PACK_BUFFER,a),c.bufferData(c.PIXEL_PACK_BUFFER,r.byteLength,c.STREAM_READ),c.readPixels(s,t,e,i,o,n,0),c.bindBuffer(c.PIXEL_PACK_BUFFER,null),await Ar(c,c.PIXEL_PACK_BUFFER,a,0,r),c.deleteBuffer(a),r}class Fn{constructor(s,t,e){I(this,"onDisposed",new D);I(this,"onViewUpdated",new En);I(this,"enabled",!0);I(this,"needsUpdate",!1);I(this,"renderDebugFrame",!1);I(this,"components");I(this,"world");I(this,"renderer");I(this,"autoUpdate",!0);I(this,"updateInterval",1e3);I(this,"worker");I(this,"scene",new S.Scene);I(this,"_width",512);I(this,"_height",512);I(this,"_availableColor",1);I(this,"renderTarget");I(this,"bufferSize");I(this,"_buffer");I(this,"_isWorkerBusy",!1);I(this,"updateVisibility",async s=>{if(!this.enabled||!this.needsUpdate&&!s||this._isWorkerBusy)return;this._isWorkerBusy=!0;const t=this.world.camera.three;t.updateMatrix(),this.renderer.setSize(this._width,this._height),this.renderer.setRenderTarget(this.renderTarget),this.renderer.render(this.scene,t);const e=this.renderer.getContext();await An(e,0,0,this._width,this._height,e.RGBA,e.UNSIGNED_BYTE,this._buffer),this.renderer.setRenderTarget(null),this.renderDebugFrame&&this.renderer.render(this.scene,t),this.worker.postMessage({buffer:this._buffer}),this.needsUpdate=!1});if(!t.renderer)throw new Error("The given world must have a renderer!");this.components=s,this.applySettings(e),this.world=t,this.renderer=new S.WebGLRenderer,this.renderTarget=new S.WebGLRenderTarget(this._width,this._height),this.bufferSize=this._width*this._height*4,this._buffer=new Uint8Array(this.bufferSize),this.renderer.clippingPlanes=t.renderer.clippingPlanes;const i=`
71
+ `,extensions:{derivatives:!0}});this._grid=new S.Mesh(a,l),this._grid.frustumCulled=!1,t.scene.three.add(this._grid),this.setupEvents(!0)}get visible(){return this._grid.visible}set visible(s){s?this.world.scene.three.add(this._grid):this._grid.removeFromParent()}get material(){return this._grid.material}get fade(){return this._fade===3}set fade(s){this._fade=s?3:0,this.material.uniforms.uFade.value=this._fade}[Symbol.dispose](){throw new Error("Method not implemented.")}get(){return this._grid}dispose(){this.setupEvents(!1),this.components.get(yt).destroy(this._grid),this.onDisposed.trigger(),this.onDisposed.reset(),this.world=null,this.components=null}setupEvents(s){if(!(this.world.camera instanceof le))return;const t=this.world.camera.controls;s?t.addEventListener("update",this.updateZoom):t.removeEventListener("update",this.updateZoom)}}class On extends ${constructor(){super(...arguments);I(this,"list",new Map);I(this,"onDisposed",new D);I(this,"config",{color:new S.Color(12303291),size1:1,size2:10,distance:500});I(this,"enabled",!0)}create(t){if(this.list.has(t.uuid))throw new Error("This world already has a grid!");const e=new Ir(this.components,t,this.config);this.list.set(t.uuid,e),t.onDisposed.add(()=>{this.delete(t)})}delete(t){const e=this.list.get(t.uuid);e&&e.dispose(),this.list.delete(t.uuid)}dispose(){for(const[t,e]of this.list)e.dispose();this.list.clear(),this.onDisposed.trigger()}}I(On,"uuid","d1e814d5-b81c-4452-87a2-f039375e0489");const Ht=new C.Raycaster,it=new C.Vector3,Pt=new C.Vector3,Q=new C.Quaternion,nn={X:new C.Vector3(1,0,0),Y:new C.Vector3(0,1,0),Z:new C.Vector3(0,0,1)},Ks={type:"change"},on={type:"mouseDown"},rn={type:"mouseUp",mode:null},an={type:"objectChange"};class fr extends C.Object3D{constructor(s,t){super(),t===void 0&&(console.warn('THREE.TransformControls: The second parameter "domElement" is now mandatory.'),t=document),this.isTransformControls=!0,this.visible=!1,this.domElement=t,this.domElement.style.touchAction="none";const e=new Ar;this._gizmo=e,this.add(e);const i=new Fr;this._plane=i,this.add(i);const o=this;function n(R,g){let f=g;Object.defineProperty(o,R,{get:function(){return f!==void 0?f:g},set:function(A){f!==A&&(f=A,i[R]=A,e[R]=A,o.dispatchEvent({type:R+"-changed",value:A}),o.dispatchEvent(Ks))}}),o[R]=g,i[R]=g,e[R]=g}n("camera",s),n("object",void 0),n("enabled",!0),n("axis",null),n("mode","translate"),n("translationSnap",null),n("rotationSnap",null),n("scaleSnap",null),n("space","world"),n("size",1),n("dragging",!1),n("showX",!0),n("showY",!0),n("showZ",!0);const r=new C.Vector3,a=new C.Vector3,l=new C.Quaternion,E=new C.Quaternion,d=new C.Vector3,h=new C.Quaternion,u=new C.Vector3,p=new C.Vector3,m=new C.Vector3,F=0,T=new C.Vector3;n("worldPosition",r),n("worldPositionStart",a),n("worldQuaternion",l),n("worldQuaternionStart",E),n("cameraPosition",d),n("cameraQuaternion",h),n("pointStart",u),n("pointEnd",p),n("rotationAxis",m),n("rotationAngle",F),n("eye",T),this._offset=new C.Vector3,this._startNorm=new C.Vector3,this._endNorm=new C.Vector3,this._cameraScale=new C.Vector3,this._parentPosition=new C.Vector3,this._parentQuaternion=new C.Quaternion,this._parentQuaternionInv=new C.Quaternion,this._parentScale=new C.Vector3,this._worldScaleStart=new C.Vector3,this._worldQuaternionInv=new C.Quaternion,this._worldScale=new C.Vector3,this._positionStart=new C.Vector3,this._quaternionStart=new C.Quaternion,this._scaleStart=new C.Vector3,this._getPointer=pr.bind(this),this._onPointerDown=Tr.bind(this),this._onPointerHover=Cr.bind(this),this._onPointerMove=mr.bind(this),this._onPointerUp=Rr.bind(this),this.domElement.addEventListener("pointerdown",this._onPointerDown),this.domElement.addEventListener("pointermove",this._onPointerHover),this.domElement.addEventListener("pointerup",this._onPointerUp)}updateMatrixWorld(){this.object!==void 0&&(this.object.updateMatrixWorld(),this.object.parent===null?console.error("TransformControls: The attached 3D object must be a part of the scene graph."):this.object.parent.matrixWorld.decompose(this._parentPosition,this._parentQuaternion,this._parentScale),this.object.matrixWorld.decompose(this.worldPosition,this.worldQuaternion,this._worldScale),this._parentQuaternionInv.copy(this._parentQuaternion).invert(),this._worldQuaternionInv.copy(this.worldQuaternion).invert()),this.camera.updateMatrixWorld(),this.camera.matrixWorld.decompose(this.cameraPosition,this.cameraQuaternion,this._cameraScale),this.camera.isOrthographicCamera?this.camera.getWorldDirection(this.eye).negate():this.eye.copy(this.cameraPosition).sub(this.worldPosition).normalize(),super.updateMatrixWorld(this)}pointerHover(s){if(this.object===void 0||this.dragging===!0)return;Ht.setFromCamera(s,this.camera);const t=Js(this._gizmo.picker[this.mode],Ht);t?this.axis=t.object.name:this.axis=null}pointerDown(s){if(!(this.object===void 0||this.dragging===!0||s.button!==0)&&this.axis!==null){Ht.setFromCamera(s,this.camera);const t=Js(this._plane,Ht,!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,on.mode=this.mode,this.dispatchEvent(on)}}pointerMove(s){const t=this.axis,e=this.mode,i=this.object;let o=this.space;if(e==="scale"?o="local":(t==="E"||t==="XYZE"||t==="XYZ")&&(o="world"),i===void 0||t===null||this.dragging===!1||s.button!==-1)return;Ht.setFromCamera(s,this.camera);const n=Js(this._plane,Ht,!0);if(n){if(this.pointEnd.copy(n.point).sub(this.worldPositionStart),e==="translate")this._offset.copy(this.pointEnd).sub(this.pointStart),o==="local"&&t!=="XYZ"&&this._offset.applyQuaternion(this._worldQuaternionInv),t.indexOf("X")===-1&&(this._offset.x=0),t.indexOf("Y")===-1&&(this._offset.y=0),t.indexOf("Z")===-1&&(this._offset.z=0),o==="local"&&t!=="XYZ"?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&&(o==="local"&&(i.position.applyQuaternion(Q.copy(this._quaternionStart).invert()),t.search("X")!==-1&&(i.position.x=Math.round(i.position.x/this.translationSnap)*this.translationSnap),t.search("Y")!==-1&&(i.position.y=Math.round(i.position.y/this.translationSnap)*this.translationSnap),t.search("Z")!==-1&&(i.position.z=Math.round(i.position.z/this.translationSnap)*this.translationSnap),i.position.applyQuaternion(this._quaternionStart)),o==="world"&&(i.parent&&i.position.add(it.setFromMatrixPosition(i.parent.matrixWorld)),t.search("X")!==-1&&(i.position.x=Math.round(i.position.x/this.translationSnap)*this.translationSnap),t.search("Y")!==-1&&(i.position.y=Math.round(i.position.y/this.translationSnap)*this.translationSnap),t.search("Z")!==-1&&(i.position.z=Math.round(i.position.z/this.translationSnap)*this.translationSnap),i.parent&&i.position.sub(it.setFromMatrixPosition(i.parent.matrixWorld))));else if(e==="scale"){if(t.search("XYZ")!==-1){let r=this.pointEnd.length()/this.pointStart.length();this.pointEnd.dot(this.pointStart)<0&&(r*=-1),Pt.set(r,r,r)}else it.copy(this.pointStart),Pt.copy(this.pointEnd),it.applyQuaternion(this._worldQuaternionInv),Pt.applyQuaternion(this._worldQuaternionInv),Pt.divide(it),t.search("X")===-1&&(Pt.x=1),t.search("Y")===-1&&(Pt.y=1),t.search("Z")===-1&&(Pt.z=1);i.scale.copy(this._scaleStart).multiply(Pt),this.scaleSnap&&(t.search("X")!==-1&&(i.scale.x=Math.round(i.scale.x/this.scaleSnap)*this.scaleSnap||this.scaleSnap),t.search("Y")!==-1&&(i.scale.y=Math.round(i.scale.y/this.scaleSnap)*this.scaleSnap||this.scaleSnap),t.search("Z")!==-1&&(i.scale.z=Math.round(i.scale.z/this.scaleSnap)*this.scaleSnap||this.scaleSnap))}else if(e==="rotate"){this._offset.copy(this.pointEnd).sub(this.pointStart);const r=20/this.worldPosition.distanceTo(it.setFromMatrixPosition(this.camera.matrixWorld));let a=!1;t==="XYZE"?(this.rotationAxis.copy(this._offset).cross(this.eye).normalize(),this.rotationAngle=this._offset.dot(it.copy(this.rotationAxis).cross(this.eye))*r):(t==="X"||t==="Y"||t==="Z")&&(this.rotationAxis.copy(nn[t]),it.copy(nn[t]),o==="local"&&it.applyQuaternion(this.worldQuaternion),it.cross(this.eye),it.length()===0?a=!0:this.rotationAngle=this._offset.dot(it.normalize())*r),(t==="E"||a)&&(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),o==="local"&&t!=="E"&&t!=="XYZE"?(i.quaternion.copy(this._quaternionStart),i.quaternion.multiply(Q.setFromAxisAngle(this.rotationAxis,this.rotationAngle)).normalize()):(this.rotationAxis.applyQuaternion(this._parentQuaternionInv),i.quaternion.copy(Q.setFromAxisAngle(this.rotationAxis,this.rotationAngle)),i.quaternion.multiply(this._quaternionStart).normalize())}this.dispatchEvent(Ks),this.dispatchEvent(an)}}pointerUp(s){s.button===0&&(this.dragging&&this.axis!==null&&(rn.mode=this.mode,this.dispatchEvent(rn)),this.dragging=!1,this.axis=null)}dispose(){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.traverse(function(s){s.geometry&&s.geometry.dispose(),s.material&&s.material.dispose()})}attach(s){return this.object=s,this.visible=!0,this}detach(){return this.object=void 0,this.visible=!1,this.axis=null,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(Ks),this.dispatchEvent(an),this.pointStart.copy(this.pointEnd))}getRaycaster(){return Ht}getMode(){return this.mode}setMode(s){this.mode=s}setTranslationSnap(s){this.translationSnap=s}setRotationSnap(s){this.rotationSnap=s}setScaleSnap(s){this.scaleSnap=s}setSize(s){this.size=s}setSpace(s){this.space=s}}function pr(c){if(this.domElement.ownerDocument.pointerLockElement)return{x:0,y:0,button:c.button};{const s=this.domElement.getBoundingClientRect();return{x:(c.clientX-s.left)/s.width*2-1,y:-(c.clientY-s.top)/s.height*2+1,button:c.button}}}function Cr(c){if(this.enabled)switch(c.pointerType){case"mouse":case"pen":this.pointerHover(this._getPointer(c));break}}function Tr(c){this.enabled&&(document.pointerLockElement||this.domElement.setPointerCapture(c.pointerId),this.domElement.addEventListener("pointermove",this._onPointerMove),this.pointerHover(this._getPointer(c)),this.pointerDown(this._getPointer(c)))}function mr(c){this.enabled&&this.pointerMove(this._getPointer(c))}function Rr(c){this.enabled&&(this.domElement.releasePointerCapture(c.pointerId),this.domElement.removeEventListener("pointermove",this._onPointerMove),this.pointerUp(this._getPointer(c)))}function Js(c,s,t){const e=s.intersectObject(c,!0);for(let i=0;i<e.length;i++)if(e[i].object.visible||t)return e[i];return!1}const ns=new C.Euler,k=new C.Vector3(0,1,0),cn=new C.Vector3(0,0,0),ln=new C.Matrix4,os=new C.Quaternion,ls=new C.Quaternion,gt=new C.Vector3,hn=new C.Matrix4,_e=new C.Vector3(1,0,0),kt=new C.Vector3(0,1,0),ye=new C.Vector3(0,0,1),rs=new C.Vector3,Oe=new C.Vector3,Se=new C.Vector3;class Ar extends C.Object3D{constructor(){super(),this.isTransformControlsGizmo=!0,this.type="TransformControlsGizmo";const s=new C.MeshBasicMaterial({depthTest:!1,depthWrite:!1,fog:!1,toneMapped:!1,transparent:!0}),t=new C.LineBasicMaterial({depthTest:!1,depthWrite:!1,fog:!1,toneMapped:!1,transparent:!0}),e=s.clone();e.opacity=.15;const i=t.clone();i.opacity=.5;const o=s.clone();o.color.setHex(16711680);const n=s.clone();n.color.setHex(65280);const r=s.clone();r.color.setHex(255);const a=s.clone();a.color.setHex(16711680),a.opacity=.5;const l=s.clone();l.color.setHex(65280),l.opacity=.5;const E=s.clone();E.color.setHex(255),E.opacity=.5;const d=s.clone();d.opacity=.25;const h=s.clone();h.color.setHex(16776960),h.opacity=.25,s.clone().color.setHex(16776960);const p=s.clone();p.color.setHex(7895160);const m=new C.CylinderGeometry(0,.04,.1,12);m.translate(0,.05,0);const F=new C.BoxGeometry(.08,.08,.08);F.translate(0,.04,0);const T=new C.BufferGeometry;T.setAttribute("position",new C.Float32BufferAttribute([0,0,0,1,0,0],3));const R=new C.CylinderGeometry(.0075,.0075,.5,3);R.translate(0,.25,0);function g(v,z){const j=new C.TorusGeometry(v,.0075,3,64,z*Math.PI*2);return j.rotateY(Math.PI/2),j.rotateX(Math.PI/2),j}function f(){const v=new C.BufferGeometry;return v.setAttribute("position",new C.Float32BufferAttribute([0,0,0,1,1,1],3)),v}const A={X:[[new C.Mesh(m,o),[.5,0,0],[0,0,-Math.PI/2]],[new C.Mesh(m,o),[-.5,0,0],[0,0,Math.PI/2]],[new C.Mesh(R,o),[0,0,0],[0,0,-Math.PI/2]]],Y:[[new C.Mesh(m,n),[0,.5,0]],[new C.Mesh(m,n),[0,-.5,0],[Math.PI,0,0]],[new C.Mesh(R,n)]],Z:[[new C.Mesh(m,r),[0,0,.5],[Math.PI/2,0,0]],[new C.Mesh(m,r),[0,0,-.5],[-Math.PI/2,0,0]],[new C.Mesh(R,r),null,[Math.PI/2,0,0]]],XYZ:[[new C.Mesh(new C.OctahedronGeometry(.1,0),d.clone()),[0,0,0]]],XY:[[new C.Mesh(new C.BoxGeometry(.15,.15,.01),E.clone()),[.15,.15,0]]],YZ:[[new C.Mesh(new C.BoxGeometry(.15,.15,.01),a.clone()),[0,.15,.15],[0,Math.PI/2,0]]],XZ:[[new C.Mesh(new C.BoxGeometry(.15,.15,.01),l.clone()),[.15,0,.15],[-Math.PI/2,0,0]]]},O={X:[[new C.Mesh(new C.CylinderGeometry(.2,0,.6,4),e),[.3,0,0],[0,0,-Math.PI/2]],[new C.Mesh(new C.CylinderGeometry(.2,0,.6,4),e),[-.3,0,0],[0,0,Math.PI/2]]],Y:[[new C.Mesh(new C.CylinderGeometry(.2,0,.6,4),e),[0,.3,0]],[new C.Mesh(new C.CylinderGeometry(.2,0,.6,4),e),[0,-.3,0],[0,0,Math.PI]]],Z:[[new C.Mesh(new C.CylinderGeometry(.2,0,.6,4),e),[0,0,.3],[Math.PI/2,0,0]],[new C.Mesh(new C.CylinderGeometry(.2,0,.6,4),e),[0,0,-.3],[-Math.PI/2,0,0]]],XYZ:[[new C.Mesh(new C.OctahedronGeometry(.2,0),e)]],XY:[[new C.Mesh(new C.BoxGeometry(.2,.2,.01),e),[.15,.15,0]]],YZ:[[new C.Mesh(new C.BoxGeometry(.2,.2,.01),e),[0,.15,.15],[0,Math.PI/2,0]]],XZ:[[new C.Mesh(new C.BoxGeometry(.2,.2,.01),e),[.15,0,.15],[-Math.PI/2,0,0]]]},_={START:[[new C.Mesh(new C.OctahedronGeometry(.01,2),i),null,null,null,"helper"]],END:[[new C.Mesh(new C.OctahedronGeometry(.01,2),i),null,null,null,"helper"]],DELTA:[[new C.Line(f(),i),null,null,null,"helper"]],X:[[new C.Line(T,i.clone()),[-1e3,0,0],null,[1e6,1,1],"helper"]],Y:[[new C.Line(T,i.clone()),[0,-1e3,0],[0,0,Math.PI/2],[1e6,1,1],"helper"]],Z:[[new C.Line(T,i.clone()),[0,0,-1e3],[0,-Math.PI/2,0],[1e6,1,1],"helper"]]},y={XYZE:[[new C.Mesh(g(.5,1),p),null,[0,Math.PI/2,0]]],X:[[new C.Mesh(g(.5,.5),o)]],Y:[[new C.Mesh(g(.5,.5),n),null,[0,0,-Math.PI/2]]],Z:[[new C.Mesh(g(.5,.5),r),null,[0,Math.PI/2,0]]],E:[[new C.Mesh(g(.75,1),h),null,[0,Math.PI/2,0]]]},N={AXIS:[[new C.Line(T,i.clone()),[-1e3,0,0],null,[1e6,1,1],"helper"]]},L={XYZE:[[new C.Mesh(new C.SphereGeometry(.25,10,8),e)]],X:[[new C.Mesh(new C.TorusGeometry(.5,.1,4,24),e),[0,0,0],[0,-Math.PI/2,-Math.PI/2]]],Y:[[new C.Mesh(new C.TorusGeometry(.5,.1,4,24),e),[0,0,0],[Math.PI/2,0,0]]],Z:[[new C.Mesh(new C.TorusGeometry(.5,.1,4,24),e),[0,0,0],[0,0,-Math.PI/2]]],E:[[new C.Mesh(new C.TorusGeometry(.75,.1,2,24),e)]]},w={X:[[new C.Mesh(F,o),[.5,0,0],[0,0,-Math.PI/2]],[new C.Mesh(R,o),[0,0,0],[0,0,-Math.PI/2]],[new C.Mesh(F,o),[-.5,0,0],[0,0,Math.PI/2]]],Y:[[new C.Mesh(F,n),[0,.5,0]],[new C.Mesh(R,n)],[new C.Mesh(F,n),[0,-.5,0],[0,0,Math.PI]]],Z:[[new C.Mesh(F,r),[0,0,.5],[Math.PI/2,0,0]],[new C.Mesh(R,r),[0,0,0],[Math.PI/2,0,0]],[new C.Mesh(F,r),[0,0,-.5],[-Math.PI/2,0,0]]],XY:[[new C.Mesh(new C.BoxGeometry(.15,.15,.01),E),[.15,.15,0]]],YZ:[[new C.Mesh(new C.BoxGeometry(.15,.15,.01),a),[0,.15,.15],[0,Math.PI/2,0]]],XZ:[[new C.Mesh(new C.BoxGeometry(.15,.15,.01),l),[.15,0,.15],[-Math.PI/2,0,0]]],XYZ:[[new C.Mesh(new C.BoxGeometry(.1,.1,.1),d.clone())]]},M={X:[[new C.Mesh(new C.CylinderGeometry(.2,0,.6,4),e),[.3,0,0],[0,0,-Math.PI/2]],[new C.Mesh(new C.CylinderGeometry(.2,0,.6,4),e),[-.3,0,0],[0,0,Math.PI/2]]],Y:[[new C.Mesh(new C.CylinderGeometry(.2,0,.6,4),e),[0,.3,0]],[new C.Mesh(new C.CylinderGeometry(.2,0,.6,4),e),[0,-.3,0],[0,0,Math.PI]]],Z:[[new C.Mesh(new C.CylinderGeometry(.2,0,.6,4),e),[0,0,.3],[Math.PI/2,0,0]],[new C.Mesh(new C.CylinderGeometry(.2,0,.6,4),e),[0,0,-.3],[-Math.PI/2,0,0]]],XY:[[new C.Mesh(new C.BoxGeometry(.2,.2,.01),e),[.15,.15,0]]],YZ:[[new C.Mesh(new C.BoxGeometry(.2,.2,.01),e),[0,.15,.15],[0,Math.PI/2,0]]],XZ:[[new C.Mesh(new C.BoxGeometry(.2,.2,.01),e),[.15,0,.15],[-Math.PI/2,0,0]]],XYZ:[[new C.Mesh(new C.BoxGeometry(.2,.2,.2),e),[0,0,0]]]},U={X:[[new C.Line(T,i.clone()),[-1e3,0,0],null,[1e6,1,1],"helper"]],Y:[[new C.Line(T,i.clone()),[0,-1e3,0],[0,0,Math.PI/2],[1e6,1,1],"helper"]],Z:[[new C.Line(T,i.clone()),[0,0,-1e3],[0,-Math.PI/2,0],[1e6,1,1],"helper"]]};function b(v){const z=new C.Object3D;for(const j in v)for(let et=v[j].length;et--;){const Z=v[j][et][0].clone(),vt=v[j][et][1],Bt=v[j][et][2],Vt=v[j][et][3],be=v[j][et][4];Z.name=j,Z.tag=be,vt&&Z.position.set(vt[0],vt[1],vt[2]),Bt&&Z.rotation.set(Bt[0],Bt[1],Bt[2]),Vt&&Z.scale.set(Vt[0],Vt[1],Vt[2]),Z.updateMatrix();const Ee=Z.geometry.clone();Ee.applyMatrix4(Z.matrix),Z.geometry=Ee,Z.renderOrder=1/0,Z.position.set(0,0,0),Z.rotation.set(0,0,0),Z.scale.set(1,1,1),z.add(Z)}return z}this.gizmo={},this.picker={},this.helper={},this.add(this.gizmo.translate=b(A)),this.add(this.gizmo.rotate=b(y)),this.add(this.gizmo.scale=b(w)),this.add(this.picker.translate=b(O)),this.add(this.picker.rotate=b(L)),this.add(this.picker.scale=b(M)),this.add(this.helper.translate=b(_)),this.add(this.helper.rotate=b(N)),this.add(this.helper.scale=b(U)),this.picker.translate.visible=!1,this.picker.rotate.visible=!1,this.picker.scale.visible=!1}updateMatrixWorld(s){const e=(this.mode==="scale"?"local":this.space)==="local"?this.worldQuaternion:ls;this.gizmo.translate.visible=this.mode==="translate",this.gizmo.rotate.visible=this.mode==="rotate",this.gizmo.scale.visible=this.mode==="scale",this.helper.translate.visible=this.mode==="translate",this.helper.rotate.visible=this.mode==="rotate",this.helper.scale.visible=this.mode==="scale";let i=[];i=i.concat(this.picker[this.mode].children),i=i.concat(this.gizmo[this.mode].children),i=i.concat(this.helper[this.mode].children);for(let o=0;o<i.length;o++){const n=i[o];n.visible=!0,n.rotation.set(0,0,0),n.position.copy(this.worldPosition);let r;if(this.camera.isOrthographicCamera?r=(this.camera.top-this.camera.bottom)/this.camera.zoom:r=this.worldPosition.distanceTo(this.cameraPosition)*Math.min(1.9*Math.tan(Math.PI*this.camera.fov/360)/this.camera.zoom,7),n.scale.set(1,1,1).multiplyScalar(r*this.size/4),n.tag==="helper"){n.visible=!1,n.name==="AXIS"?(n.visible=!!this.axis,this.axis==="X"&&(Q.setFromEuler(ns.set(0,0,0)),n.quaternion.copy(e).multiply(Q),Math.abs(k.copy(_e).applyQuaternion(e).dot(this.eye))>.9&&(n.visible=!1)),this.axis==="Y"&&(Q.setFromEuler(ns.set(0,0,Math.PI/2)),n.quaternion.copy(e).multiply(Q),Math.abs(k.copy(kt).applyQuaternion(e).dot(this.eye))>.9&&(n.visible=!1)),this.axis==="Z"&&(Q.setFromEuler(ns.set(0,Math.PI/2,0)),n.quaternion.copy(e).multiply(Q),Math.abs(k.copy(ye).applyQuaternion(e).dot(this.eye))>.9&&(n.visible=!1)),this.axis==="XYZE"&&(Q.setFromEuler(ns.set(0,Math.PI/2,0)),k.copy(this.rotationAxis),n.quaternion.setFromRotationMatrix(ln.lookAt(cn,k,kt)),n.quaternion.multiply(Q),n.visible=this.dragging),this.axis==="E"&&(n.visible=!1)):n.name==="START"?(n.position.copy(this.worldPositionStart),n.visible=this.dragging):n.name==="END"?(n.position.copy(this.worldPosition),n.visible=this.dragging):n.name==="DELTA"?(n.position.copy(this.worldPositionStart),n.quaternion.copy(this.worldQuaternionStart),it.set(1e-10,1e-10,1e-10).add(this.worldPositionStart).sub(this.worldPosition).multiplyScalar(-1),it.applyQuaternion(this.worldQuaternionStart.clone().invert()),n.scale.copy(it),n.visible=this.dragging):(n.quaternion.copy(e),this.dragging?n.position.copy(this.worldPositionStart):n.position.copy(this.worldPosition),this.axis&&(n.visible=this.axis.search(n.name)!==-1));continue}n.quaternion.copy(e),this.mode==="translate"||this.mode==="scale"?(n.name==="X"&&Math.abs(k.copy(_e).applyQuaternion(e).dot(this.eye))>.99&&(n.scale.set(1e-10,1e-10,1e-10),n.visible=!1),n.name==="Y"&&Math.abs(k.copy(kt).applyQuaternion(e).dot(this.eye))>.99&&(n.scale.set(1e-10,1e-10,1e-10),n.visible=!1),n.name==="Z"&&Math.abs(k.copy(ye).applyQuaternion(e).dot(this.eye))>.99&&(n.scale.set(1e-10,1e-10,1e-10),n.visible=!1),n.name==="XY"&&Math.abs(k.copy(ye).applyQuaternion(e).dot(this.eye))<.2&&(n.scale.set(1e-10,1e-10,1e-10),n.visible=!1),n.name==="YZ"&&Math.abs(k.copy(_e).applyQuaternion(e).dot(this.eye))<.2&&(n.scale.set(1e-10,1e-10,1e-10),n.visible=!1),n.name==="XZ"&&Math.abs(k.copy(kt).applyQuaternion(e).dot(this.eye))<.2&&(n.scale.set(1e-10,1e-10,1e-10),n.visible=!1)):this.mode==="rotate"&&(os.copy(e),k.copy(this.eye).applyQuaternion(Q.copy(e).invert()),n.name.search("E")!==-1&&n.quaternion.setFromRotationMatrix(ln.lookAt(this.eye,cn,kt)),n.name==="X"&&(Q.setFromAxisAngle(_e,Math.atan2(-k.y,k.z)),Q.multiplyQuaternions(os,Q),n.quaternion.copy(Q)),n.name==="Y"&&(Q.setFromAxisAngle(kt,Math.atan2(k.x,k.z)),Q.multiplyQuaternions(os,Q),n.quaternion.copy(Q)),n.name==="Z"&&(Q.setFromAxisAngle(ye,Math.atan2(k.y,k.x)),Q.multiplyQuaternions(os,Q),n.quaternion.copy(Q))),n.visible=n.visible&&(n.name.indexOf("X")===-1||this.showX),n.visible=n.visible&&(n.name.indexOf("Y")===-1||this.showY),n.visible=n.visible&&(n.name.indexOf("Z")===-1||this.showZ),n.visible=n.visible&&(n.name.indexOf("E")===-1||this.showX&&this.showY&&this.showZ),n.material._color=n.material._color||n.material.color.clone(),n.material._opacity=n.material._opacity||n.material.opacity,n.material.color.copy(n.material._color),n.material.opacity=n.material._opacity,this.enabled&&this.axis&&(n.name===this.axis||this.axis.split("").some(function(a){return n.name===a}))&&(n.material.color.setHex(16776960),n.material.opacity=1)}super.updateMatrixWorld(s)}}class Fr extends C.Mesh{constructor(){super(new C.PlaneGeometry(1e5,1e5,2,2),new C.MeshBasicMaterial({visible:!1,wireframe:!0,side:C.DoubleSide,transparent:!0,opacity:.1,toneMapped:!1})),this.isTransformControlsPlane=!0,this.type="TransformControlsPlane"}updateMatrixWorld(s){let t=this.space;switch(this.position.copy(this.worldPosition),this.mode==="scale"&&(t="local"),rs.copy(_e).applyQuaternion(t==="local"?this.worldQuaternion:ls),Oe.copy(kt).applyQuaternion(t==="local"?this.worldQuaternion:ls),Se.copy(ye).applyQuaternion(t==="local"?this.worldQuaternion:ls),k.copy(Oe),this.mode){case"translate":case"scale":switch(this.axis){case"X":k.copy(this.eye).cross(rs),gt.copy(rs).cross(k);break;case"Y":k.copy(this.eye).cross(Oe),gt.copy(Oe).cross(k);break;case"Z":k.copy(this.eye).cross(Se),gt.copy(Se).cross(k);break;case"XY":gt.copy(Se);break;case"YZ":gt.copy(rs);break;case"XZ":k.copy(Se),gt.copy(Oe);break;case"XYZ":case"E":gt.set(0,0,0);break}break;case"rotate":default:gt.set(0,0,0)}gt.length()===0?this.quaternion.copy(this.cameraQuaternion):(hn.lookAt(it.set(0,0,0),gt,k),this.quaternion.setFromRotationMatrix(hn)),super.updateMatrixWorld(s)}}class Ps{constructor(s,t,e,i,o,n=5,r=!0){I(this,"onDraggingStarted",new D);I(this,"onDraggingEnded",new D);I(this,"onDisposed",new D);I(this,"normal");I(this,"origin");I(this,"three",new S.Plane);I(this,"_helper");I(this,"_visible",!0);I(this,"_enabled",!0);I(this,"components");I(this,"world");I(this,"_controlsActive",!1);I(this,"_arrowBoundBox",new S.Mesh);I(this,"_planeMesh");I(this,"_controls");I(this,"_hiddenMaterial",new S.MeshBasicMaterial({visible:!1}));I(this,"update",async()=>{this._enabled&&this.three.setFromNormalAndCoplanarPoint(this.normal,this._helper.position)});I(this,"changeDrag",s=>{this._visible=!s.value,this.preventCameraMovement(),this.notifyDraggingChanged(s)});if(this.components=s,this.world=t,!t.renderer)throw new Error("The given world must have a renderer!");this.normal=i,this.origin=e,t.renderer.setPlane(!0,this.three),this._planeMesh=Ps.newPlaneMesh(n,o),this._helper=this.newHelper(),this._controls=this.newTransformControls(),this.three.setFromNormalAndCoplanarPoint(i,e),r&&this.toggleControls(!0)}get enabled(){return this._enabled}set enabled(s){if(!this.world.renderer)throw new Error("No renderer found for clipping plane!");this._enabled=s,this.world.renderer.setPlane(s,this.three)}get visible(){return this._visible}set visible(s){this._visible=s,this._controls.visible=s,this._helper.visible=s,this.toggleControls(s)}get meshes(){return[this._planeMesh,this._arrowBoundBox]}get planeMaterial(){return this._planeMesh.material}set planeMaterial(s){this._planeMesh.material=s}get size(){return this._planeMesh.scale.x}set size(s){this._planeMesh.scale.set(s,s,s)}get helper(){return this._helper}async setFromNormalAndCoplanarPoint(s,t){this.reset(),this.normal.equals(s)||(this.normal.copy(s),this._helper.lookAt(s)),this.origin.copy(t),this._helper.position.copy(t),this._helper.updateMatrix(),await this.update()}dispose(){this._enabled=!1,this.onDraggingStarted.reset(),this.onDraggingEnded.reset(),this._helper.removeFromParent(),this.world.renderer&&this.world.renderer.setPlane(!1,this.three),this._arrowBoundBox.removeFromParent(),this._arrowBoundBox.geometry.dispose(),this._planeMesh.geometry.dispose(),this._controls.removeFromParent(),this._controls.dispose(),this.onDisposed.trigger(),this.onDisposed.reset()}reset(){const s=new S.Vector3(1,0,0),t=new S.Vector3;this.normal.equals(s)||(this.normal.copy(s),this._helper.lookAt(s)),this.origin.copy(t),this._helper.position.copy(t),this._helper.updateMatrix()}toggleControls(s){if(s){if(this._controlsActive)return;this._controls.addEventListener("change",this.update),this._controls.addEventListener("dragging-changed",this.changeDrag)}else this._controls.removeEventListener("change",this.update),this._controls.removeEventListener("dragging-changed",this.changeDrag);this._controlsActive=s}newTransformControls(){if(!this.world.renderer)throw new Error("No renderer found for clipping plane!");const s=this.world.camera.three,t=this.world.renderer.three.domElement,e=new fr(s,t);return this.initializeControls(e),this.world.scene.three.add(e),e}initializeControls(s){s.attach(this._helper),s.showX=!1,s.showY=!1,s.setSpace("local"),this.createArrowBoundingBox(),s.children[0].children[0].add(this._arrowBoundBox)}createArrowBoundingBox(){this._arrowBoundBox.geometry=new S.CylinderGeometry(.18,.18,1.2),this._arrowBoundBox.material=this._hiddenMaterial,this._arrowBoundBox.rotateX(Math.PI/2),this._arrowBoundBox.updateMatrix(),this._arrowBoundBox.geometry.applyMatrix4(this._arrowBoundBox.matrix)}notifyDraggingChanged(s){s.value?this.onDraggingStarted.trigger():this.onDraggingEnded.trigger()}preventCameraMovement(){this.world.camera.enabled=this._visible}newHelper(){const s=new S.Object3D;return s.lookAt(this.normal),s.position.copy(this.origin),this._planeMesh.position.z+=.01,s.add(this._planeMesh),this.world.scene.three.add(s),s}static newPlaneMesh(s,t){const e=new S.PlaneGeometry(1),i=new S.Mesh(e,t);return i.scale.set(s,s,s),i}}const Le=class Le extends ${constructor(t){super(t);I(this,"onAfterCreate",new D);I(this,"onAfterDelete",new D);I(this,"onBeforeDrag",new D);I(this,"onAfterDrag",new D);I(this,"onBeforeCreate",new D);I(this,"onBeforeCancel",new D);I(this,"onAfterCancel",new D);I(this,"onBeforeDelete",new D);I(this,"onDisposed",new D);I(this,"orthogonalY",!1);I(this,"toleranceOrthogonalY",.7);I(this,"list",[]);I(this,"PlaneType");I(this,"_material",new S.MeshBasicMaterial({color:12255487,side:S.DoubleSide,transparent:!0,opacity:.2}));I(this,"_size",5);I(this,"_enabled",!1);I(this,"_visible",!1);I(this,"_onStartDragging",()=>{this.onBeforeDrag.trigger()});I(this,"_onEndDragging",()=>{this.onAfterDrag.trigger()});this.components.add(Le.uuid,this),this.PlaneType=Ps}get enabled(){return this._enabled}set enabled(t){this._enabled=t;for(const e of this.list)e.enabled=t;this.updateMaterialsAndPlanes()}get visible(){return this._visible}set visible(t){this._visible=t;for(const e of this.list)e.visible=t}get material(){return this._material}set material(t){this._material=t;for(const e of this.list)e.planeMaterial=t}get size(){return this._size}set size(t){this._size=t;for(const e of this.list)e.size=t}endCreation(){}cancelCreation(){}dispose(){this._enabled=!1;for(const t of this.list)t.dispose();this.list.length=0,this._material.dispose(),this.onBeforeCreate.reset(),this.onBeforeCancel.reset(),this.onBeforeDelete.reset(),this.onBeforeDrag.reset(),this.onAfterCreate.reset(),this.onAfterCancel.reset(),this.onAfterDelete.reset(),this.onAfterDrag.reset(),this.onDisposed.trigger(Le.uuid),this.onDisposed.reset()}create(t){if(!this.enabled)return;const o=this.components.get(ce).get(t).castRay();o&&this.createPlaneFromIntersection(t,o)}createFromNormalAndCoplanarPoint(t,e,i){const o=this.newPlane(t,i,e);return this.updateMaterialsAndPlanes(),o}delete(t,e){this.enabled&&(e||(e=this.pickPlane(t)),e&&this.deletePlane(e))}deleteAll(){for(;this.list.length>0;){const t=this.list[0];this.delete(t.world,t)}}deletePlane(t){const e=this.list.indexOf(t);if(e!==-1){if(this.list.splice(e,1),!t.world.renderer)throw new Error("Renderer not found for this plane's world!");t.world.renderer.setPlane(!1,t.three),t.dispose(),this.updateMaterialsAndPlanes(),this.onAfterDelete.trigger(t)}}pickPlane(t){const i=this.components.get(ce).get(t),o=this.getAllPlaneMeshes(),n=i.castRay(o);if(n){const r=n.object;return this.list.find(a=>a.meshes.includes(r))}}getAllPlaneMeshes(){const t=[];for(const e of this.list)t.push(...e.meshes);return t}createPlaneFromIntersection(t,e){var a;if(!t.renderer)throw new Error("The given world must have a renderer!");const i=e.point.distanceTo(new S.Vector3(0,0,0)),o=(a=e.face)==null?void 0:a.normal;if(!i||!o)return;const n=this.getWorldNormal(e,o),r=this.newPlane(t,e.point,n.negate());r.size=this._size,t.renderer.setPlane(!0,r.three),this.updateMaterialsAndPlanes()}getWorldNormal(t,e){const i=t.object;let o=t.object.matrixWorld.clone();if(i instanceof S.InstancedMesh&&t.instanceId!==void 0){const l=new S.Matrix4;i.getMatrixAt(t.instanceId,l),o=l.multiply(o)}const r=new S.Matrix3().getNormalMatrix(o),a=e.clone().applyMatrix3(r).normalize();return this.normalizePlaneDirectionY(a),a}normalizePlaneDirectionY(t){this.orthogonalY&&(t.y>this.toleranceOrthogonalY&&(t.x=0,t.y=1,t.z=0),t.y<-this.toleranceOrthogonalY&&(t.x=0,t.y=-1,t.z=0))}newPlane(t,e,i){const o=this.newPlaneInstance(t,e,i);return o.onDraggingStarted.add(this._onStartDragging),o.onDraggingEnded.add(this._onEndDragging),this.list.push(o),this.onAfterCreate.trigger(o),o}newPlaneInstance(t,e,i){return new this.PlaneType(this.components,t,e,i,this._material)}updateMaterialsAndPlanes(){const t=this.components.get(ds);for(const[e,i]of t.list){if(!i.renderer)continue;i.renderer.updateClippingPlanes();const{clippingPlanes:o}=i.renderer;for(const n of i.meshes)if(Array.isArray(n.material))for(const r of n.material)r.clippingPlanes=o;else n.material.clippingPlanes=o}}};I(Le,"uuid","66290bc5-18c4-4cd1-9379-2e17a0617611");let hi=Le;const Me=class Me extends ${constructor(t){super(t);I(this,"enabled",!0);I(this,"onDisposed",new D);I(this,"list",{});I(this,"_originals",{});this.components.add(Me.uuid,this)}dispose(){for(const t in this.list){const{material:e}=this.list[t];e.dispose()}this.list={},this._originals={},this.onDisposed.trigger(Me.uuid),this.onDisposed.reset()}set(t,e=Object.keys(this.list)){for(const i of e){const{material:o,meshes:n}=this.list[i];for(const r of n)if(t)this._originals[r.uuid]||(this._originals[r.uuid]={material:r.material}),r instanceof S.InstancedMesh&&r.instanceColor&&(this._originals[r.uuid].instances=r.instanceColor,r.instanceColor=null),r.material=o;else{if(!this._originals[r.uuid])continue;r.material=this._originals[r.uuid].material;const a=this._originals[r.uuid].instances;r instanceof S.InstancedMesh&&a&&(r.instanceColor=a)}}}addMaterial(t,e){if(this.list[t])throw new Error("This ID already exists!");this.list[t]={material:e,meshes:new Set}}addMeshes(t,e){if(!this.list[t])throw new Error("This ID doesn't exists!");for(const i of e)this.list[t].meshes.add(i)}removeMeshes(t,e){if(!this.list[t])throw new Error("This ID doesn't exists!");for(const i of e)this.list[t].meshes.delete(i)}};I(Me,"uuid","24989d27-fa2f-4797-8b08-35918f74e502");let Ei=Me;function gr(c,s,t,e){return new Promise((i,o)=>{function n(){const r=c.clientWaitSync(s,t,0);if(r===c.WAIT_FAILED){o();return}if(r===c.TIMEOUT_EXPIRED){setTimeout(n,e);return}i()}n()})}async function Or(c,s,t,e,i,o,n){const r=c.fenceSync(c.SYNC_GPU_COMMANDS_COMPLETE,0);c.flush(),await gr(c,r,0,10),c.deleteSync(r),c.bindBuffer(s,t),c.getBufferSubData(s,e,i,o,n),c.bindBuffer(s,null)}async function Sn(c,s,t,e,i,o,n,r){const a=c.createBuffer();return c.bindBuffer(c.PIXEL_PACK_BUFFER,a),c.bufferData(c.PIXEL_PACK_BUFFER,r.byteLength,c.STREAM_READ),c.readPixels(s,t,e,i,o,n,0),c.bindBuffer(c.PIXEL_PACK_BUFFER,null),await Or(c,c.PIXEL_PACK_BUFFER,a,0,r),c.deleteBuffer(a),r}class _n{constructor(s,t,e){I(this,"onDisposed",new D);I(this,"onViewUpdated",new xt);I(this,"enabled",!0);I(this,"needsUpdate",!1);I(this,"renderDebugFrame",!1);I(this,"components");I(this,"world");I(this,"renderer");I(this,"autoUpdate",!0);I(this,"updateInterval",1e3);I(this,"worker");I(this,"scene",new S.Scene);I(this,"_width",512);I(this,"_height",512);I(this,"_availableColor",1);I(this,"renderTarget");I(this,"bufferSize");I(this,"_buffer");I(this,"_isWorkerBusy",!1);I(this,"updateVisibility",async s=>{if(!this.enabled||!this.needsUpdate&&!s||this._isWorkerBusy)return;this._isWorkerBusy=!0;const t=this.world.camera.three;t.updateMatrix(),this.renderer.setSize(this._width,this._height),this.renderer.setRenderTarget(this.renderTarget),this.renderer.render(this.scene,t);const e=this.renderer.getContext();await Sn(e,0,0,this._width,this._height,e.RGBA,e.UNSIGNED_BYTE,this._buffer),this.renderer.setRenderTarget(null),this.renderDebugFrame&&this.renderer.render(this.scene,t),this.worker.postMessage({buffer:this._buffer}),this.needsUpdate=!1});if(!t.renderer)throw new Error("The given world must have a renderer!");this.components=s,this.applySettings(e),this.world=t,this.renderer=new S.WebGLRenderer,this.renderTarget=new S.WebGLRenderTarget(this._width,this._height),this.bufferSize=this._width*this._height*4,this._buffer=new Uint8Array(this.bufferSize),this.renderer.clippingPlanes=t.renderer.clippingPlanes;const i=`
72
72
  addEventListener("message", (event) => {
73
73
  const { buffer } = event.data;
74
74
  const colors = new Map();
@@ -85,4 +85,4 @@
85
85
  }
86
86
  postMessage({ colors });
87
87
  });
88
- `,o=new Blob([i],{type:"application/javascript"});this.worker=new Worker(URL.createObjectURL(o))}dispose(){this.enabled=!1;for(const s of this.scene.children)s.removeFromParent();this.onViewUpdated.reset(),this.worker.terminate(),this.renderer.dispose(),this.renderTarget.dispose(),this._buffer=null,this.onDisposed.reset()}getAvailableColor(){let s=BigInt(this._availableColor.toString());const t=[];do t.unshift(Number(s%256n)),s/=256n;while(s);for(;t.length!==3;)t.unshift(0);const[e,i,o]=t,n=`${e}-${i}-${o}`;return{r:e,g:i,b:o,code:n}}increaseColor(){if(this._availableColor===256*256*256){console.warn("Color can't be increased over 256 x 256 x 256!");return}this._availableColor++}decreaseColor(){if(this._availableColor===1){console.warn("Color can't be decreased under 0!");return}this._availableColor--}applySettings(s){s&&(s.updateInterval!==void 0&&(this.updateInterval=s.updateInterval),s.height!==void 0&&(this._height=s.height),s.width!==void 0&&(this._width=s.width),s.autoUpdate!==void 0&&(this.autoUpdate=s.autoUpdate))}}class gn extends Fn{constructor(t,e,i){super(t,e,i);I(this,"threshold",100);I(this,"onViewUpdated",new D);I(this,"colorMeshes",new Map);I(this,"isProcessing",!1);I(this,"_colorCodeMeshMap",new Map);I(this,"_meshIDColorCodeMap",new Map);I(this,"_currentVisibleMeshes",new Set);I(this,"_recentlyHiddenMeshes",new Set);I(this,"_intervalID",null);I(this,"_transparentMat",new S.MeshBasicMaterial({transparent:!0,opacity:0}));I(this,"handleWorkerMessage",async t=>{if(this.isProcessing)return;const e=t.data.colors;this._recentlyHiddenMeshes=new Set(this._currentVisibleMeshes),this._currentVisibleMeshes.clear();for(const[i,o]of e){if(o<this.threshold)continue;const n=this._colorCodeMeshMap.get(i);n&&(this._currentVisibleMeshes.add(n),this._recentlyHiddenMeshes.delete(n))}this.onViewUpdated.trigger({seen:this._currentVisibleMeshes,unseen:this._recentlyHiddenMeshes}),this._isWorkerBusy=!1});this.worker.addEventListener("message",this.handleWorkerMessage),this.autoUpdate&&window.setInterval(async()=>{this.isProcessing||await this.updateVisibility()},this.updateInterval),this.onViewUpdated.add(({seen:o,unseen:n})=>{for(const r of o)r.visible=!0;for(const r of n)r.visible=!1})}dispose(){super.dispose(),this._intervalID!==null&&(window.clearInterval(this._intervalID),this._intervalID=null),this._currentVisibleMeshes.clear(),this._recentlyHiddenMeshes.clear(),this._meshIDColorCodeMap.clear(),this._transparentMat.dispose(),this._colorCodeMeshMap.clear();const t=this.components.get(yt);for(const e in this.colorMeshes){const i=this.colorMeshes.get(e);i&&t.destroy(i,!0)}this.colorMeshes.clear()}add(t){if(!this.enabled)return;if(this.isProcessing){console.log("Culler processing not finished yet.");return}this.isProcessing=!0;const e=t instanceof S.InstancedMesh,{geometry:i,material:o}=t,{colorMaterial:n,code:r}=this.getAvailableMaterial();let a;if(Array.isArray(o)){let d=!0;const h=[];for(const u of o)ri.isTransparent(u)?h.push(this._transparentMat):(d=!1,h.push(n));if(d){n.dispose(),this.isProcessing=!1;return}a=h}else if(ri.isTransparent(o)){n.dispose(),this.isProcessing=!1;return}else a=n;this._colorCodeMeshMap.set(r,t),this._meshIDColorCodeMap.set(t.uuid,r);const l=e?t.count:1,E=new S.InstancedMesh(i,a,l);e?E.instanceMatrix=t.instanceMatrix:E.setMatrixAt(0,new S.Matrix4),t.visible=!1,E.applyMatrix4(t.matrix),E.updateMatrix(),this.scene.add(E),this.colorMeshes.set(t.uuid,E),this.increaseColor(),this.isProcessing=!1}remove(t){if(this.isProcessing){console.log("Culler processing not finished yet.");return}this.isProcessing=!0;const e=this.components.get(yt);this._currentVisibleMeshes.delete(t),this._recentlyHiddenMeshes.delete(t);const i=this.colorMeshes.get(t.uuid),o=this._meshIDColorCodeMap.get(t.uuid);if(!i||!o){this.isProcessing=!1,console.log(t.visible);return}this._colorCodeMeshMap.delete(o),this._meshIDColorCodeMap.delete(t.uuid),this.colorMeshes.delete(t.uuid),i.geometry=void 0,i.material=[],e.destroy(i,!0),this._recentlyHiddenMeshes.delete(t),this._currentVisibleMeshes.delete(t),this.isProcessing=!1}getAvailableMaterial(){const{r:t,g:e,b:i,code:o}=this.getAvailableColor(),n=S.ColorManagement.enabled;S.ColorManagement.enabled=!1;const r=new S.Color(`rgb(${t}, ${e}, ${i})`);if(!this.world.renderer)throw new Error("Renderer not found in the world!");const a=this.world.renderer.clippingPlanes,l=new S.MeshBasicMaterial({color:r,clippingPlanes:a,side:S.DoubleSide});return S.ColorManagement.enabled=n,{colorMaterial:l,code:o}}}const Me=class Me extends tt{constructor(t){super(t);I(this,"_enabled",!0);I(this,"list",new Map);I(this,"onDisposed",new D);t.add(Me.uuid,this)}get enabled(){return this._enabled}set enabled(t){this._enabled=t;for(const[e,i]of this.list)i.enabled=t}create(t,e){if(this.list.has(t.uuid))return this.list.get(t.uuid);const i=new gn(this.components,t,e);return this.list.set(t.uuid,i),i}delete(t){const e=this.list.get(t.uuid);e&&e.dispose(),this.list.delete(t.uuid)}dispose(){this.enabled=!1,this.onDisposed.trigger(Me.uuid),this.onDisposed.reset();for(const[t,e]of this.list)e.dispose();this.list.clear()}};I(Me,"uuid","69f2a50d-c266-44fc-b1bd-fa4d34be89e6");let ds=Me;const mt=class mt extends tt{constructor(t){super(t);I(this,"enabled",!0);I(this,"onDisposed",new D);I(this,"_absoluteMin");I(this,"_absoluteMax");I(this,"_meshes",[]);this.components.add(mt.uuid,this),this._absoluteMin=mt.newBound(!0),this._absoluteMax=mt.newBound(!1)}static getDimensions(t){const{min:e,max:i}=t,o=Math.abs(i.x-e.x),n=Math.abs(i.y-e.y),r=Math.abs(i.z-e.z),a=new S.Vector3;return a.subVectors(i,e).divideScalar(2).add(e),{width:o,height:n,depth:r,center:a}}static newBound(t){const e=t?1:-1;return new S.Vector3(e*Number.MAX_VALUE,e*Number.MAX_VALUE,e*Number.MAX_VALUE)}static getBounds(t,e,i){const o=i||this.newBound(!1),n=e||this.newBound(!0);for(const r of t)r.x<n.x&&(n.x=r.x),r.y<n.y&&(n.y=r.y),r.z<n.z&&(n.z=r.z),r.x>o.x&&(o.x=r.x),r.y>o.y&&(o.y=r.y),r.z>o.z&&(o.z=r.z);return new S.Box3(e,i)}dispose(){const t=this.components.get(yt);for(const e of this._meshes)t.destroy(e);this._meshes=[],this.onDisposed.trigger(mt.uuid),this.onDisposed.reset()}get(){const t=this._absoluteMin.clone(),e=this._absoluteMax.clone();return new S.Box3(t,e)}getSphere(){const t=this._absoluteMin.clone(),e=this._absoluteMax.clone(),i=Math.abs((e.x-t.x)/2),o=Math.abs((e.y-t.y)/2),n=Math.abs((e.z-t.z)/2),r=new S.Vector3(t.x+i,t.y+o,t.z+n),a=r.distanceTo(t);return new S.Sphere(r,a)}getMesh(){const t=new S.Box3(this._absoluteMin,this._absoluteMax),e=mt.getDimensions(t),{width:i,height:o,depth:n,center:r}=e,a=new S.BoxGeometry(i,o,n),l=new S.Mesh(a);return this._meshes.push(l),l.position.copy(r),l}reset(){this._absoluteMin=mt.newBound(!0),this._absoluteMax=mt.newBound(!1)}add(t){for(const e of t.items)this.addMesh(e.mesh)}addMesh(t){if(!t.geometry.index)return;const e=mt.getFragmentBounds(t);t.updateMatrixWorld();const i=t.matrixWorld,o=new S.Matrix4,n=t instanceof S.InstancedMesh,r=n?t.count:1;for(let a=0;a<r;a++){const l=e.min.clone(),E=e.max.clone();n&&(t.getMatrixAt(a,o),l.applyMatrix4(o),E.applyMatrix4(o)),l.applyMatrix4(i),E.applyMatrix4(i),l.x<this._absoluteMin.x&&(this._absoluteMin.x=l.x),l.y<this._absoluteMin.y&&(this._absoluteMin.y=l.y),l.z<this._absoluteMin.z&&(this._absoluteMin.z=l.z),l.x>this._absoluteMax.x&&(this._absoluteMax.x=l.x),l.y>this._absoluteMax.y&&(this._absoluteMax.y=l.y),l.z>this._absoluteMax.z&&(this._absoluteMax.z=l.z),E.x>this._absoluteMax.x&&(this._absoluteMax.x=E.x),E.y>this._absoluteMax.y&&(this._absoluteMax.y=E.y),E.z>this._absoluteMax.z&&(this._absoluteMax.z=E.z),E.x<this._absoluteMin.x&&(this._absoluteMin.x=E.x),E.y<this._absoluteMin.y&&(this._absoluteMin.y=E.y),E.z<this._absoluteMin.z&&(this._absoluteMin.z=E.z)}}static getFragmentBounds(t){const e=t.geometry.attributes.position,i=Number.MAX_VALUE,o=-i,n=new S.Vector3(i,i,i),r=new S.Vector3(o,o,o);if(!t.geometry.index)throw new Error("Geometry must be indexed!");const a=Array.from(t.geometry.index.array);for(let l=0;l<a.length;l++){if(l%3===0&&a[l]===0&&a[l+1]===0&&a[l+2]===0){l+=2;continue}const E=a[l],d=e.getX(E),h=e.getY(E),u=e.getZ(E);d<n.x&&(n.x=d),h<n.y&&(n.y=h),u<n.z&&(n.z=u),d>r.x&&(r.x=d),h>r.y&&(r.y=h),u>r.z&&(r.z=u)}return new S.Box3(n,r)}};I(mt,"uuid","d1444724-dba6-4cdd-a0c7-68ee1450d166");let li=mt;const On=new Set([1123145078,574549367,1675464909,2059837836,3798115385,32440307,3125803723,3207858831,2740243338,2624227202,4240577450,3615266464,3724593414,220341763,477187591,1878645084,1300840506,3303107099,1607154358,1878645084,846575682,1351298697,2417041796,3049322572,3331915920,1416205885,776857604,3285139300,3958052878,2827736869,2732653382,673634403,3448662350,4142052618,2924175390,803316827,2556980723,1809719519,2205249479,807026263,3737207727,1660063152,2347385850,3940055652,2705031697,3732776249,2485617015,2611217952,1704287377,2937912522,2770003689,1281925730,1484403080,3448662350,4142052618,3800577675,4006246654,3590301190,1383045692,2775532180,2047409740,370225590,3593883385,2665983363,4124623270,812098782,3649129432,987898635,1105321065,3510044353,1635779807,2603310189,3406155212,1310608509,4261334040,2736907675,3649129432,1136057603,1260505505,4182860854,2713105998,2898889636,59481748,3749851601,3486308946,3150382593,1062206242,3264961684,15328376,1485152156,370225590,1981873012,2859738748,45288368,2614616156,2732653382,775493141,2147822146,2601014836,2629017746,1186437898,2367409068,1213902940,3632507154,3900360178,476780140,1472233963,2804161546,3008276851,738692330,374418227,315944413,3905492369,3570813810,2571569899,178912537,2294589976,1437953363,2133299955,572779678,3092502836,388784114,2624227202,1425443689,3057273783,2347385850,1682466193,2519244187,2839578677,3958567839,2513912981,2830218821,427810014]);class Sn{async export(s,t,e=!1,i=!0){const o={},n=new Set(s.GetIfcEntityList(t)),r=new Set([b.IFCPROJECT,b.IFCSITE,b.IFCBUILDING,b.IFCBUILDINGSTOREY,b.IFCSPACE]);for(const a of r)n.add(a);for(const a of n){if(On.has(a))continue;const l=r.has(a)&&i,E=s.GetLineIDsWithType(t,a);for(const d of E){const h=s.GetLine(0,d,l,e);o[h.expressID]=h}}return o}}const _n={103090709:"IFCPROJECT",4097777520:"IFCSITE",4031249490:"IFCBUILDING",3124254112:"IFCBUILDINGSTOREY",3856911033:"IFCSPACE",1674181508:"IFCANNOTATION",25142252:"IFCCONTROLLER",32344328:"IFCBOILER",76236018:"IFCLAMP",90941305:"IFCPUMP",177149247:"IFCAIRTERMINALBOX",182646315:"IFCFLOWINSTRUMENT",263784265:"IFCFURNISHINGELEMENT",264262732:"IFCELECTRICGENERATOR",277319702:"IFCAUDIOVISUALAPPLIANCE",310824031:"IFCPIPEFITTING",331165859:"IFCSTAIR",342316401:"IFCDUCTFITTING",377706215:"IFCMECHANICALFASTENER",395920057:"IFCDOOR",402227799:"IFCELECTRICMOTOR",413509423:"IFCSYSTEMFURNITUREELEMENT",484807127:"IFCEVAPORATOR",486154966:"IFCWINDOWSTANDARDCASE",629592764:"IFCLIGHTFIXTURE",630975310:"IFCUNITARYCONTROLELEMENT",635142910:"IFCCABLECARRIERFITTING",639361253:"IFCCOIL",647756555:"IFCFASTENER",707683696:"IFCFLOWSTORAGEDEVICE",738039164:"IFCPROTECTIVEDEVICE",753842376:"IFCBEAM",812556717:"IFCTANK",819412036:"IFCFILTER",843113511:"IFCCOLUMN",862014818:"IFCELECTRICDISTRIBUTIONBOARD",900683007:"IFCFOOTING",905975707:"IFCCOLUMNSTANDARDCASE",926996030:"IFCVOIDINGFEATURE",979691226:"IFCREINFORCINGBAR",987401354:"IFCFLOWSEGMENT",1003880860:"IFCELECTRICTIMECONTROL",1051757585:"IFCCABLEFITTING",1052013943:"IFCDISTRIBUTIONCHAMBERELEMENT",1062813311:"IFCDISTRIBUTIONCONTROLELEMENT",1073191201:"IFCMEMBER",1095909175:"IFCBUILDINGELEMENTPROXY",1156407060:"IFCPLATESTANDARDCASE",1162798199:"IFCSWITCHINGDEVICE",1329646415:"IFCSHADINGDEVICE",1335981549:"IFCDISCRETEACCESSORY",1360408905:"IFCDUCTSILENCER",1404847402:"IFCSTACKTERMINAL",1426591983:"IFCFIRESUPPRESSIONTERMINAL",1437502449:"IFCMEDICALDEVICE",1509553395:"IFCFURNITURE",1529196076:"IFCSLAB",1620046519:"IFCTRANSPORTELEMENT",1634111441:"IFCAIRTERMINAL",1658829314:"IFCENERGYCONVERSIONDEVICE",1677625105:"IFCCIVILELEMENT",1687234759:"IFCPILE",1904799276:"IFCELECTRICAPPLIANCE",1911478936:"IFCMEMBERSTANDARDCASE",1945004755:"IFCDISTRIBUTIONELEMENT",1973544240:"IFCCOVERING",1999602285:"IFCSPACEHEATER",2016517767:"IFCROOF",2056796094:"IFCAIRTOAIRHEATRECOVERY",2058353004:"IFCFLOWCONTROLLER",2068733104:"IFCHUMIDIFIER",2176052936:"IFCJUNCTIONBOX",2188021234:"IFCFLOWMETER",2223149337:"IFCFLOWTERMINAL",2262370178:"IFCRAILING",2272882330:"IFCCONDENSER",2295281155:"IFCPROTECTIVEDEVICETRIPPINGUNIT",2320036040:"IFCREINFORCINGMESH",2347447852:"IFCTENDONANCHOR",2391383451:"IFCVIBRATIONISOLATOR",2391406946:"IFCWALL",2474470126:"IFCMOTORCONNECTION",2769231204:"IFCVIRTUALELEMENT",2814081492:"IFCENGINE",2906023776:"IFCBEAMSTANDARDCASE",2938176219:"IFCBURNER",2979338954:"IFCBUILDINGELEMENTPART",3024970846:"IFCRAMP",3026737570:"IFCTUBEBUNDLE",3027962421:"IFCSLABSTANDARDCASE",3040386961:"IFCDISTRIBUTIONFLOWELEMENT",3053780830:"IFCSANITARYTERMINAL",3079942009:"IFCOPENINGSTANDARDCASE",3087945054:"IFCALARM",3101698114:"IFCSURFACEFEATURE",3127900445:"IFCSLABELEMENTEDCASE",3132237377:"IFCFLOWMOVINGDEVICE",3171933400:"IFCPLATE",3221913625:"IFCCOMMUNICATIONSAPPLIANCE",3242481149:"IFCDOORSTANDARDCASE",3283111854:"IFCRAMPFLIGHT",3296154744:"IFCCHIMNEY",3304561284:"IFCWINDOW",3310460725:"IFCELECTRICFLOWSTORAGEDEVICE",3319311131:"IFCHEATEXCHANGER",3415622556:"IFCFAN",3420628829:"IFCSOLARDEVICE",3493046030:"IFCGEOGRAPHICELEMENT",3495092785:"IFCCURTAINWALL",3508470533:"IFCFLOWTREATMENTDEVICE",3512223829:"IFCWALLSTANDARDCASE",3518393246:"IFCDUCTSEGMENT",3571504051:"IFCCOMPRESSOR",3588315303:"IFCOPENINGELEMENT",3612865200:"IFCPIPESEGMENT",3640358203:"IFCCOOLINGTOWER",3651124850:"IFCPROJECTIONELEMENT",3694346114:"IFCOUTLET",3747195512:"IFCEVAPORATIVECOOLER",3758799889:"IFCCABLECARRIERSEGMENT",3824725483:"IFCTENDON",3825984169:"IFCTRANSFORMER",3902619387:"IFCCHILLER",4074379575:"IFCDAMPER",4086658281:"IFCSENSOR",4123344466:"IFCELEMENTASSEMBLY",4136498852:"IFCCOOLEDBEAM",4156078855:"IFCWALLELEMENTEDCASE",4175244083:"IFCINTERCEPTOR",4207607924:"IFCVALVE",4217484030:"IFCCABLESEGMENT",4237592921:"IFCWASTETERMINAL",4252922144:"IFCSTAIRFLIGHT",4278956645:"IFCFLOWFITTING",4288193352:"IFCACTUATOR",4292641817:"IFCUNITARYEQUIPMENT",3009204131:"IFCGRID"};class Fr{getAll(s,t){const e={},i=Object.keys(_n).map(o=>parseInt(o,10));for(let o=0;o<i.length;o++){const n=i[o],r=s.GetLineIDsWithType(t,n),a=r.size();for(let l=0;l<a;l++)e[r.get(l)]=n}return e}}const mi={950732822:"IFCURIREFERENCE",4075327185:"IFCTIME",1209108979:"IFCTEMPERATURERATEOFCHANGEMEASURE",3457685358:"IFCSOUNDPRESSURELEVELMEASURE",4157543285:"IFCSOUNDPOWERLEVELMEASURE",2798247006:"IFCPROPERTYSETDEFINITIONSET",1790229001:"IFCPOSITIVEINTEGER",525895558:"IFCNONNEGATIVELENGTHMEASURE",1774176899:"IFCLINEINDEX",1275358634:"IFCLANGUAGEID",2541165894:"IFCDURATION",3701338814:"IFCDAYINWEEKNUMBER",2195413836:"IFCDATETIME",937566702:"IFCDATE",1683019596:"IFCCARDINALPOINTREFERENCE",2314439260:"IFCBINARY",1500781891:"IFCAREADENSITYMEASURE",3683503648:"IFCARCINDEX",4065007721:"IFCYEARNUMBER",1718600412:"IFCWARPINGMOMENTMEASURE",51269191:"IFCWARPINGCONSTANTMEASURE",2593997549:"IFCVOLUMETRICFLOWRATEMEASURE",3458127941:"IFCVOLUMEMEASURE",3345633955:"IFCVAPORPERMEABILITYMEASURE",1278329552:"IFCTORQUEMEASURE",2591213694:"IFCTIMESTAMP",2726807636:"IFCTIMEMEASURE",743184107:"IFCTHERMODYNAMICTEMPERATUREMEASURE",2016195849:"IFCTHERMALTRANSMITTANCEMEASURE",857959152:"IFCTHERMALRESISTANCEMEASURE",2281867870:"IFCTHERMALEXPANSIONCOEFFICIENTMEASURE",2645777649:"IFCTHERMALCONDUCTIVITYMEASURE",232962298:"IFCTHERMALADMITTANCEMEASURE",296282323:"IFCTEXTTRANSFORMATION",603696268:"IFCTEXTFONTNAME",3490877962:"IFCTEXTDECORATION",1460886941:"IFCTEXTALIGNMENT",2801250643:"IFCTEXT",58845555:"IFCTEMPERATUREGRADIENTMEASURE",361837227:"IFCSPECULARROUGHNESS",2757832317:"IFCSPECULAREXPONENT",3477203348:"IFCSPECIFICHEATCAPACITYMEASURE",993287707:"IFCSOUNDPRESSUREMEASURE",846465480:"IFCSOUNDPOWERMEASURE",3471399674:"IFCSOLIDANGLEMEASURE",408310005:"IFCSHEARMODULUSMEASURE",2190458107:"IFCSECTIONALAREAINTEGRALMEASURE",3467162246:"IFCSECTIONMODULUSMEASURE",2766185779:"IFCSECONDINMINUTE",3211557302:"IFCROTATIONALSTIFFNESSMEASURE",1755127002:"IFCROTATIONALMASSMEASURE",2133746277:"IFCROTATIONALFREQUENCYMEASURE",200335297:"IFCREAL",96294661:"IFCRATIOMEASURE",3972513137:"IFCRADIOACTIVITYMEASURE",3665567075:"IFCPRESSUREMEASURE",2169031380:"IFCPRESENTABLETEXT",1364037233:"IFCPOWERMEASURE",1245737093:"IFCPOSITIVERATIOMEASURE",3054510233:"IFCPOSITIVEPLANEANGLEMEASURE",2815919920:"IFCPOSITIVELENGTHMEASURE",4042175685:"IFCPLANEANGLEMEASURE",2642773653:"IFCPLANARFORCEMEASURE",2260317790:"IFCPARAMETERVALUE",929793134:"IFCPHMEASURE",2395907400:"IFCNUMERICMEASURE",2095195183:"IFCNORMALISEDRATIOMEASURE",765770214:"IFCMONTHINYEARNUMBER",2615040989:"IFCMONETARYMEASURE",3114022597:"IFCMOMENTOFINERTIAMEASURE",1648970520:"IFCMOLECULARWEIGHTMEASURE",3177669450:"IFCMOISTUREDIFFUSIVITYMEASURE",1753493141:"IFCMODULUSOFSUBGRADEREACTIONMEASURE",1052454078:"IFCMODULUSOFROTATIONALSUBGRADEREACTIONMEASURE",2173214787:"IFCMODULUSOFLINEARSUBGRADEREACTIONMEASURE",3341486342:"IFCMODULUSOFELASTICITYMEASURE",102610177:"IFCMINUTEINHOUR",3531705166:"IFCMASSPERLENGTHMEASURE",3124614049:"IFCMASSMEASURE",4017473158:"IFCMASSFLOWRATEMEASURE",1477762836:"IFCMASSDENSITYMEASURE",2486716878:"IFCMAGNETICFLUXMEASURE",286949696:"IFCMAGNETICFLUXDENSITYMEASURE",151039812:"IFCLUMINOUSINTENSITYMEASURE",2755797622:"IFCLUMINOUSINTENSITYDISTRIBUTIONMEASURE",2095003142:"IFCLUMINOUSFLUXMEASURE",503418787:"IFCLOGICAL",3086160713:"IFCLINEARVELOCITYMEASURE",1307019551:"IFCLINEARSTIFFNESSMEASURE",2128979029:"IFCLINEARMOMENTMEASURE",191860431:"IFCLINEARFORCEMEASURE",1243674935:"IFCLENGTHMEASURE",3258342251:"IFCLABEL",2054016361:"IFCKINEMATICVISCOSITYMEASURE",3192672207:"IFCISOTHERMALMOISTURECAPACITYMEASURE",3686016028:"IFCIONCONCENTRATIONMEASURE",3809634241:"IFCINTEGERCOUNTRATEMEASURE",1939436016:"IFCINTEGER",2679005408:"IFCINDUCTANCEMEASURE",3358199106:"IFCILLUMINANCEMEASURE",983778844:"IFCIDENTIFIER",2589826445:"IFCHOURINDAY",1158859006:"IFCHEATINGVALUEMEASURE",3113092358:"IFCHEATFLUXDENSITYMEASURE",3064340077:"IFCGLOBALLYUNIQUEID",3044325142:"IFCFREQUENCYMEASURE",1361398929:"IFCFORCEMEASURE",2590844177:"IFCFONTWEIGHT",2715512545:"IFCFONTVARIANT",1102727119:"IFCFONTSTYLE",2078135608:"IFCENERGYMEASURE",2506197118:"IFCELECTRICVOLTAGEMEASURE",2951915441:"IFCELECTRICRESISTANCEMEASURE",3790457270:"IFCELECTRICCURRENTMEASURE",2093906313:"IFCELECTRICCONDUCTANCEMEASURE",3818826038:"IFCELECTRICCHARGEMEASURE",1827137117:"IFCELECTRICCAPACITANCEMEASURE",69416015:"IFCDYNAMICVISCOSITYMEASURE",524656162:"IFCDOSEEQUIVALENTMEASURE",4134073009:"IFCDIMENSIONCOUNT",1514641115:"IFCDESCRIPTIVEMEASURE",300323983:"IFCDAYLIGHTSAVINGHOUR",86635668:"IFCDAYINMONTHNUMBER",94842927:"IFCCURVATUREMEASURE",1778710042:"IFCCOUNTMEASURE",3238673880:"IFCCONTEXTDEPENDENTMEASURE",3812528620:"IFCCOMPOUNDPLANEANGLEMEASURE",2991860651:"IFCCOMPLEXNUMBER",1867003952:"IFCBOXALIGNMENT",2735952531:"IFCBOOLEAN",2650437152:"IFCAREAMEASURE",632304761:"IFCANGULARVELOCITYMEASURE",360377573:"IFCAMOUNTOFSUBSTANCEMEASURE",4182062534:"IFCACCELERATIONMEASURE",3699917729:"IFCABSORBEDDOSEMEASURE",1971632696:"IFCGEOSLICE",2680139844:"IFCGEOMODEL",24726584:"IFCELECTRICFLOWTREATMENTDEVICE",3693000487:"IFCDISTRIBUTIONBOARD",3460952963:"IFCCONVEYORSEGMENT",3999819293:"IFCCAISSONFOUNDATION",3314249567:"IFCBOREHOLE",4196446775:"IFCBEARING",325726236:"IFCALIGNMENT",3425753595:"IFCTRACKELEMENT",991950508:"IFCSIGNAL",3798194928:"IFCREINFORCEDSOIL",3290496277:"IFCRAIL",1383356374:"IFCPAVEMENT",2182337498:"IFCNAVIGATIONELEMENT",234836483:"IFCMOORINGDEVICE",2078563270:"IFCMOBILETELECOMMUNICATIONSAPPLIANCE",1638804497:"IFCLIQUIDTERMINAL",1154579445:"IFCLINEARPOSITIONINGELEMENT",2696325953:"IFCKERB",2713699986:"IFCGEOTECHNICALASSEMBLY",2142170206:"IFCELECTRICFLOWTREATMENTDEVICETYPE",3376911765:"IFCEARTHWORKSFILL",1077100507:"IFCEARTHWORKSELEMENT",3071239417:"IFCEARTHWORKSCUT",479945903:"IFCDISTRIBUTIONBOARDTYPE",3426335179:"IFCDEEPFOUNDATION",1502416096:"IFCCOURSE",2940368186:"IFCCONVEYORSEGMENTTYPE",3203706013:"IFCCAISSONFOUNDATIONTYPE",3862327254:"IFCBUILTSYSTEM",1876633798:"IFCBUILTELEMENT",963979645:"IFCBRIDGEPART",644574406:"IFCBRIDGE",3649138523:"IFCBEARINGTYPE",1662888072:"IFCALIGNMENTVERTICAL",317615605:"IFCALIGNMENTSEGMENT",1545765605:"IFCALIGNMENTHORIZONTAL",4266260250:"IFCALIGNMENTCANT",3956297820:"IFCVIBRATIONDAMPERTYPE",1530820697:"IFCVIBRATIONDAMPER",840318589:"IFCVEHICLE",1953115116:"IFCTRANSPORTATIONDEVICE",618700268:"IFCTRACKELEMENTTYPE",2281632017:"IFCTENDONCONDUITTYPE",3663046924:"IFCTENDONCONDUIT",42703149:"IFCSINESPIRAL",1894708472:"IFCSIGNALTYPE",3599934289:"IFCSIGNTYPE",33720170:"IFCSIGN",1027922057:"IFCSEVENTHORDERPOLYNOMIALSPIRAL",544395925:"IFCSEGMENTEDREFERENCECURVE",3649235739:"IFCSECONDORDERPOLYNOMIALSPIRAL",550521510:"IFCROADPART",146592293:"IFCROAD",3818125796:"IFCRELADHERESTOELEMENT",4021432810:"IFCREFERENT",1891881377:"IFCRAILWAYPART",3992365140:"IFCRAILWAY",1763565496:"IFCRAILTYPE",1946335990:"IFCPOSITIONINGELEMENT",514975943:"IFCPAVEMENTTYPE",506776471:"IFCNAVIGATIONELEMENTTYPE",710110818:"IFCMOORINGDEVICETYPE",1950438474:"IFCMOBILETELECOMMUNICATIONSAPPLIANCETYPE",976884017:"IFCMARINEPART",525669439:"IFCMARINEFACILITY",1770583370:"IFCLIQUIDTERMINALTYPE",2176059722:"IFCLINEARELEMENT",679976338:"IFCKERBTYPE",3948183225:"IFCIMPACTPROTECTIONDEVICETYPE",2568555532:"IFCIMPACTPROTECTIONDEVICE",2898700619:"IFCGRADIENTCURVE",1594536857:"IFCGEOTECHNICALSTRATUM",4230923436:"IFCGEOTECHNICALELEMENT",4228831410:"IFCFACILITYPARTCOMMON",1310830890:"IFCFACILITYPART",24185140:"IFCFACILITY",4234616927:"IFCDIRECTRIXDERIVEDREFERENCESWEPTAREASOLID",1306400036:"IFCDEEPFOUNDATIONTYPE",4189326743:"IFCCOURSETYPE",2000195564:"IFCCOSINESPIRAL",3497074424:"IFCCLOTHOID",1626504194:"IFCBUILTELEMENTTYPE",3651464721:"IFCVEHICLETYPE",1229763772:"IFCTRIANGULATEDIRREGULARNETWORK",3665877780:"IFCTRANSPORTATIONDEVICETYPE",782932809:"IFCTHIRDORDERPOLYNOMIALSPIRAL",2735484536:"IFCSPIRAL",1356537516:"IFCSECTIONEDSURFACE",1290935644:"IFCSECTIONEDSOLIDHORIZONTAL",1862484736:"IFCSECTIONEDSOLID",1441486842:"IFCRELPOSITIONS",1033248425:"IFCRELASSOCIATESPROFILEDEF",3381221214:"IFCPOLYNOMIALCURVE",2485787929:"IFCOFFSETCURVEBYDISTANCES",590820931:"IFCOFFSETCURVE",3465909080:"IFCINDEXEDPOLYGONALTEXTUREMAP",593015953:"IFCDIRECTRIXCURVESWEPTAREASOLID",4212018352:"IFCCURVESEGMENT",3425423356:"IFCAXIS2PLACEMENTLINEAR",823603102:"IFCSEGMENT",2165702409:"IFCPOINTBYDISTANCEEXPRESSION",182550632:"IFCOPENCROSSPROFILEDEF",388784114:"IFCLINEARPLACEMENT",536804194:"IFCALIGNMENTHORIZONTALSEGMENT",3752311538:"IFCALIGNMENTCANTSEGMENT",1010789467:"IFCTEXTURECOORDINATEINDICESWITHVOIDS",222769930:"IFCTEXTURECOORDINATEINDICES",2691318326:"IFCQUANTITYNUMBER",3633395639:"IFCALIGNMENTVERTICALSEGMENT",2879124712:"IFCALIGNMENTPARAMETERSEGMENT",25142252:"IFCCONTROLLER",3087945054:"IFCALARM",4288193352:"IFCACTUATOR",630975310:"IFCUNITARYCONTROLELEMENT",4086658281:"IFCSENSOR",2295281155:"IFCPROTECTIVEDEVICETRIPPINGUNIT",182646315:"IFCFLOWINSTRUMENT",1426591983:"IFCFIRESUPPRESSIONTERMINAL",819412036:"IFCFILTER",3415622556:"IFCFAN",1003880860:"IFCELECTRICTIMECONTROL",402227799:"IFCELECTRICMOTOR",264262732:"IFCELECTRICGENERATOR",3310460725:"IFCELECTRICFLOWSTORAGEDEVICE",862014818:"IFCELECTRICDISTRIBUTIONBOARD",1904799276:"IFCELECTRICAPPLIANCE",1360408905:"IFCDUCTSILENCER",3518393246:"IFCDUCTSEGMENT",342316401:"IFCDUCTFITTING",562808652:"IFCDISTRIBUTIONCIRCUIT",4074379575:"IFCDAMPER",3640358203:"IFCCOOLINGTOWER",4136498852:"IFCCOOLEDBEAM",2272882330:"IFCCONDENSER",3571504051:"IFCCOMPRESSOR",3221913625:"IFCCOMMUNICATIONSAPPLIANCE",639361253:"IFCCOIL",3902619387:"IFCCHILLER",4217484030:"IFCCABLESEGMENT",1051757585:"IFCCABLEFITTING",3758799889:"IFCCABLECARRIERSEGMENT",635142910:"IFCCABLECARRIERFITTING",2938176219:"IFCBURNER",32344328:"IFCBOILER",2906023776:"IFCBEAMSTANDARDCASE",277319702:"IFCAUDIOVISUALAPPLIANCE",2056796094:"IFCAIRTOAIRHEATRECOVERY",177149247:"IFCAIRTERMINALBOX",1634111441:"IFCAIRTERMINAL",486154966:"IFCWINDOWSTANDARDCASE",4237592921:"IFCWASTETERMINAL",4156078855:"IFCWALLELEMENTEDCASE",4207607924:"IFCVALVE",4292641817:"IFCUNITARYEQUIPMENT",3179687236:"IFCUNITARYCONTROLELEMENTTYPE",3026737570:"IFCTUBEBUNDLE",3825984169:"IFCTRANSFORMER",812556717:"IFCTANK",1162798199:"IFCSWITCHINGDEVICE",385403989:"IFCSTRUCTURALLOADCASE",1404847402:"IFCSTACKTERMINAL",1999602285:"IFCSPACEHEATER",3420628829:"IFCSOLARDEVICE",3027962421:"IFCSLABSTANDARDCASE",3127900445:"IFCSLABELEMENTEDCASE",1329646415:"IFCSHADINGDEVICE",3053780830:"IFCSANITARYTERMINAL",2572171363:"IFCREINFORCINGBARTYPE",1232101972:"IFCRATIONALBSPLINECURVEWITHKNOTS",90941305:"IFCPUMP",655969474:"IFCPROTECTIVEDEVICETRIPPINGUNITTYPE",738039164:"IFCPROTECTIVEDEVICE",1156407060:"IFCPLATESTANDARDCASE",3612865200:"IFCPIPESEGMENT",310824031:"IFCPIPEFITTING",3694346114:"IFCOUTLET",144952367:"IFCOUTERBOUNDARYCURVE",2474470126:"IFCMOTORCONNECTION",1911478936:"IFCMEMBERSTANDARDCASE",1437502449:"IFCMEDICALDEVICE",629592764:"IFCLIGHTFIXTURE",76236018:"IFCLAMP",2176052936:"IFCJUNCTIONBOX",4175244083:"IFCINTERCEPTOR",2068733104:"IFCHUMIDIFIER",3319311131:"IFCHEATEXCHANGER",2188021234:"IFCFLOWMETER",1209101575:"IFCEXTERNALSPATIALELEMENT",484807127:"IFCEVAPORATOR",3747195512:"IFCEVAPORATIVECOOLER",2814081492:"IFCENGINE",2417008758:"IFCELECTRICDISTRIBUTIONBOARDTYPE",3242481149:"IFCDOORSTANDARDCASE",3205830791:"IFCDISTRIBUTIONSYSTEM",400855858:"IFCCOMMUNICATIONSAPPLIANCETYPE",905975707:"IFCCOLUMNSTANDARDCASE",1677625105:"IFCCIVILELEMENT",3296154744:"IFCCHIMNEY",2674252688:"IFCCABLEFITTINGTYPE",2188180465:"IFCBURNERTYPE",1177604601:"IFCBUILDINGSYSTEM",39481116:"IFCBUILDINGELEMENTPARTTYPE",1136057603:"IFCBOUNDARYCURVE",2461110595:"IFCBSPLINECURVEWITHKNOTS",1532957894:"IFCAUDIOVISUALAPPLIANCETYPE",4088093105:"IFCWORKCALENDAR",4009809668:"IFCWINDOWTYPE",926996030:"IFCVOIDINGFEATURE",2391383451:"IFCVIBRATIONISOLATOR",2415094496:"IFCTENDONTYPE",3081323446:"IFCTENDONANCHORTYPE",413509423:"IFCSYSTEMFURNITUREELEMENT",3101698114:"IFCSURFACEFEATURE",3657597509:"IFCSTRUCTURALSURFACEACTION",2757150158:"IFCSTRUCTURALCURVEREACTION",1004757350:"IFCSTRUCTURALCURVEACTION",338393293:"IFCSTAIRTYPE",1072016465:"IFCSOLARDEVICETYPE",4074543187:"IFCSHADINGDEVICETYPE",2157484638:"IFCSEAMCURVE",2781568857:"IFCROOFTYPE",2310774935:"IFCREINFORCINGMESHTYPE",964333572:"IFCREINFORCINGELEMENTTYPE",683857671:"IFCRATIONALBSPLINESURFACEWITHKNOTS",1469900589:"IFCRAMPTYPE",2839578677:"IFCPOLYGONALFACESET",1158309216:"IFCPILETYPE",3079942009:"IFCOPENINGSTANDARDCASE",1114901282:"IFCMEDICALDEVICETYPE",3113134337:"IFCINTERSECTIONCURVE",3946677679:"IFCINTERCEPTORTYPE",2571569899:"IFCINDEXEDPOLYCURVE",3493046030:"IFCGEOGRAPHICELEMENT",1509553395:"IFCFURNITURE",1893162501:"IFCFOOTINGTYPE",2853485674:"IFCEXTERNALSPATIALSTRUCTUREELEMENT",4148101412:"IFCEVENT",132023988:"IFCENGINETYPE",2397081782:"IFCELEMENTASSEMBLYTYPE",2323601079:"IFCDOORTYPE",1213902940:"IFCCYLINDRICALSURFACE",1525564444:"IFCCONSTRUCTIONPRODUCTRESOURCETYPE",4105962743:"IFCCONSTRUCTIONMATERIALRESOURCETYPE",2185764099:"IFCCONSTRUCTIONEQUIPMENTRESOURCETYPE",15328376:"IFCCOMPOSITECURVEONSURFACE",3875453745:"IFCCOMPLEXPROPERTYTEMPLATE",3893394355:"IFCCIVILELEMENTTYPE",2197970202:"IFCCHIMNEYTYPE",167062518:"IFCBSPLINESURFACEWITHKNOTS",2887950389:"IFCBSPLINESURFACE",2603310189:"IFCADVANCEDBREPWITHVOIDS",1635779807:"IFCADVANCEDBREP",2916149573:"IFCTRIANGULATEDFACESET",1935646853:"IFCTOROIDALSURFACE",2387106220:"IFCTESSELLATEDFACESET",3206491090:"IFCTASKTYPE",699246055:"IFCSURFACECURVE",4095615324:"IFCSUBCONTRACTRESOURCETYPE",603775116:"IFCSTRUCTURALSURFACEREACTION",4015995234:"IFCSPHERICALSURFACE",2481509218:"IFCSPATIALZONETYPE",463610769:"IFCSPATIALZONE",710998568:"IFCSPATIALELEMENTTYPE",1412071761:"IFCSPATIALELEMENT",3663146110:"IFCSIMPLEPROPERTYTEMPLATE",3243963512:"IFCREVOLVEDAREASOLIDTAPERED",816062949:"IFCREPARAMETRISEDCOMPOSITECURVESEGMENT",1521410863:"IFCRELSPACEBOUNDARY2NDLEVEL",3523091289:"IFCRELSPACEBOUNDARY1STLEVEL",427948657:"IFCRELINTERFERESELEMENTS",307848117:"IFCRELDEFINESBYTEMPLATE",1462361463:"IFCRELDEFINESBYOBJECT",2565941209:"IFCRELDECLARES",1027710054:"IFCRELASSIGNSTOGROUPBYFACTOR",3521284610:"IFCPROPERTYTEMPLATE",492091185:"IFCPROPERTYSETTEMPLATE",653396225:"IFCPROJECTLIBRARY",569719735:"IFCPROCEDURETYPE",3967405729:"IFCPREDEFINEDPROPERTYSET",1682466193:"IFCPCURVE",428585644:"IFCLABORRESOURCETYPE",2294589976:"IFCINDEXEDPOLYGONALFACEWITHVOIDS",178912537:"IFCINDEXEDPOLYGONALFACE",4095422895:"IFCGEOGRAPHICELEMENTTYPE",2652556860:"IFCFIXEDREFERENCESWEPTAREASOLID",2804161546:"IFCEXTRUDEDAREASOLIDTAPERED",4024345920:"IFCEVENTTYPE",2629017746:"IFCCURVEBOUNDEDSURFACE",1815067380:"IFCCREWRESOURCETYPE",3419103109:"IFCCONTEXT",2574617495:"IFCCONSTRUCTIONRESOURCETYPE",2059837836:"IFCCARTESIANPOINTLIST3D",1675464909:"IFCCARTESIANPOINTLIST2D",574549367:"IFCCARTESIANPOINTLIST",3406155212:"IFCADVANCEDFACE",3698973494:"IFCTYPERESOURCE",3736923433:"IFCTYPEPROCESS",901063453:"IFCTESSELLATEDITEM",1096409881:"IFCSWEPTDISKSOLIDPOLYGONAL",1042787934:"IFCRESOURCETIME",1608871552:"IFCRESOURCECONSTRAINTRELATIONSHIP",2943643501:"IFCRESOURCEAPPROVALRELATIONSHIP",2090586900:"IFCQUANTITYSET",1482703590:"IFCPROPERTYTEMPLATEDEFINITION",3778827333:"IFCPREDEFINEDPROPERTIES",2998442950:"IFCMIRROREDPROFILEDEF",853536259:"IFCMATERIALRELATIONSHIP",3404854881:"IFCMATERIALPROFILESETUSAGETAPERING",3079605661:"IFCMATERIALPROFILESETUSAGE",2852063980:"IFCMATERIALCONSTITUENTSET",3708119e3:"IFCMATERIALCONSTITUENT",1585845231:"IFCLAGTIME",2133299955:"IFCINDEXEDTRIANGLETEXTUREMAP",1437953363:"IFCINDEXEDTEXTUREMAP",3570813810:"IFCINDEXEDCOLOURMAP",1437805879:"IFCEXTERNALREFERENCERELATIONSHIP",297599258:"IFCEXTENDEDPROPERTIES",211053100:"IFCEVENTTIME",2713554722:"IFCCONVERSIONBASEDUNITWITHOFFSET",3285139300:"IFCCOLOURRGBLIST",1236880293:"IFCWORKTIME",1199560280:"IFCTIMEPERIOD",3611470254:"IFCTEXTUREVERTEXLIST",2771591690:"IFCTASKTIMERECURRING",1549132990:"IFCTASKTIME",2043862942:"IFCTABLECOLUMN",2934153892:"IFCSURFACEREINFORCEMENTAREA",609421318:"IFCSTRUCTURALLOADORRESULT",3478079324:"IFCSTRUCTURALLOADCONFIGURATION",1054537805:"IFCSCHEDULINGTIME",2439245199:"IFCRESOURCELEVELRELATIONSHIP",2433181523:"IFCREFERENCE",3915482550:"IFCRECURRENCEPATTERN",986844984:"IFCPROPERTYABSTRACTION",3843373140:"IFCPROJECTEDCRS",677532197:"IFCPRESENTATIONITEM",1507914824:"IFCMATERIALUSAGEDEFINITION",552965576:"IFCMATERIALPROFILEWITHOFFSETS",164193824:"IFCMATERIALPROFILESET",2235152071:"IFCMATERIALPROFILE",1847252529:"IFCMATERIALLAYERWITHOFFSETS",760658860:"IFCMATERIALDEFINITION",3057273783:"IFCMAPCONVERSION",4294318154:"IFCEXTERNALINFORMATION",1466758467:"IFCCOORDINATEREFERENCESYSTEM",1785450214:"IFCCOORDINATEOPERATION",775493141:"IFCCONNECTIONVOLUMEGEOMETRY",979691226:"IFCREINFORCINGBAR",3700593921:"IFCELECTRICDISTRIBUTIONPOINT",1062813311:"IFCDISTRIBUTIONCONTROLELEMENT",1052013943:"IFCDISTRIBUTIONCHAMBERELEMENT",578613899:"IFCCONTROLLERTYPE",2454782716:"IFCCHAMFEREDGEFEATURE",753842376:"IFCBEAM",3001207471:"IFCALARMTYPE",2874132201:"IFCACTUATORTYPE",3304561284:"IFCWINDOW",3512223829:"IFCWALLSTANDARDCASE",2391406946:"IFCWALL",3313531582:"IFCVIBRATIONISOLATORTYPE",2347447852:"IFCTENDONANCHOR",3824725483:"IFCTENDON",2515109513:"IFCSTRUCTURALANALYSISMODEL",4252922144:"IFCSTAIRFLIGHT",331165859:"IFCSTAIR",1529196076:"IFCSLAB",1783015770:"IFCSENSORTYPE",1376911519:"IFCROUNDEDEDGEFEATURE",2016517767:"IFCROOF",2320036040:"IFCREINFORCINGMESH",3027567501:"IFCREINFORCINGELEMENT",3055160366:"IFCRATIONALBEZIERCURVE",3283111854:"IFCRAMPFLIGHT",3024970846:"IFCRAMP",2262370178:"IFCRAILING",3171933400:"IFCPLATE",1687234759:"IFCPILE",1073191201:"IFCMEMBER",900683007:"IFCFOOTING",3508470533:"IFCFLOWTREATMENTDEVICE",2223149337:"IFCFLOWTERMINAL",707683696:"IFCFLOWSTORAGEDEVICE",987401354:"IFCFLOWSEGMENT",3132237377:"IFCFLOWMOVINGDEVICE",4037862832:"IFCFLOWINSTRUMENTTYPE",4278956645:"IFCFLOWFITTING",2058353004:"IFCFLOWCONTROLLER",4222183408:"IFCFIRESUPPRESSIONTERMINALTYPE",1810631287:"IFCFILTERTYPE",346874300:"IFCFANTYPE",1658829314:"IFCENERGYCONVERSIONDEVICE",857184966:"IFCELECTRICALELEMENT",1634875225:"IFCELECTRICALCIRCUIT",712377611:"IFCELECTRICTIMECONTROLTYPE",1217240411:"IFCELECTRICMOTORTYPE",1365060375:"IFCELECTRICHEATERTYPE",1534661035:"IFCELECTRICGENERATORTYPE",3277789161:"IFCELECTRICFLOWSTORAGEDEVICETYPE",663422040:"IFCELECTRICAPPLIANCETYPE",855621170:"IFCEDGEFEATURE",2030761528:"IFCDUCTSILENCERTYPE",3760055223:"IFCDUCTSEGMENTTYPE",869906466:"IFCDUCTFITTINGTYPE",395920057:"IFCDOOR",3041715199:"IFCDISTRIBUTIONPORT",3040386961:"IFCDISTRIBUTIONFLOWELEMENT",1945004755:"IFCDISTRIBUTIONELEMENT",2063403501:"IFCDISTRIBUTIONCONTROLELEMENTTYPE",1599208980:"IFCDISTRIBUTIONCHAMBERELEMENTTYPE",2635815018:"IFCDISCRETEACCESSORYTYPE",1335981549:"IFCDISCRETEACCESSORY",4147604152:"IFCDIAMETERDIMENSION",3961806047:"IFCDAMPERTYPE",3495092785:"IFCCURTAINWALL",1973544240:"IFCCOVERING",2954562838:"IFCCOOLINGTOWERTYPE",335055490:"IFCCOOLEDBEAMTYPE",488727124:"IFCCONSTRUCTIONPRODUCTRESOURCE",1060000209:"IFCCONSTRUCTIONMATERIALRESOURCE",3898045240:"IFCCONSTRUCTIONEQUIPMENTRESOURCE",1163958913:"IFCCONDITIONCRITERION",2188551683:"IFCCONDITION",2816379211:"IFCCONDENSERTYPE",3850581409:"IFCCOMPRESSORTYPE",843113511:"IFCCOLUMN",2301859152:"IFCCOILTYPE",2611217952:"IFCCIRCLE",2951183804:"IFCCHILLERTYPE",1285652485:"IFCCABLESEGMENTTYPE",3293546465:"IFCCABLECARRIERSEGMENTTYPE",395041908:"IFCCABLECARRIERFITTINGTYPE",1909888760:"IFCBUILDINGELEMENTPROXYTYPE",1095909175:"IFCBUILDINGELEMENTPROXY",2979338954:"IFCBUILDINGELEMENTPART",52481810:"IFCBUILDINGELEMENTCOMPONENT",3299480353:"IFCBUILDINGELEMENT",231477066:"IFCBOILERTYPE",1916977116:"IFCBEZIERCURVE",819618141:"IFCBEAMTYPE",1967976161:"IFCBSPLINECURVE",3460190687:"IFCASSET",2470393545:"IFCANGULARDIMENSION",1871374353:"IFCAIRTOAIRHEATRECOVERYTYPE",3352864051:"IFCAIRTERMINALTYPE",1411407467:"IFCAIRTERMINALBOXTYPE",3821786052:"IFCACTIONREQUEST",1213861670:"IFC2DCOMPOSITECURVE",1033361043:"IFCZONE",3342526732:"IFCWORKSCHEDULE",4218914973:"IFCWORKPLAN",1028945134:"IFCWORKCONTROL",1133259667:"IFCWASTETERMINALTYPE",1898987631:"IFCWALLTYPE",2769231204:"IFCVIRTUALELEMENT",728799441:"IFCVALVETYPE",1911125066:"IFCUNITARYEQUIPMENTTYPE",1600972822:"IFCTUBEBUNDLETYPE",3593883385:"IFCTRIMMEDCURVE",1620046519:"IFCTRANSPORTELEMENT",1692211062:"IFCTRANSFORMERTYPE",1637806684:"IFCTIMESERIESSCHEDULE",5716631:"IFCTANKTYPE",2254336722:"IFCSYSTEM",2315554128:"IFCSWITCHINGDEVICETYPE",148013059:"IFCSUBCONTRACTRESOURCE",1975003073:"IFCSTRUCTURALSURFACECONNECTION",2986769608:"IFCSTRUCTURALRESULTGROUP",1235345126:"IFCSTRUCTURALPOINTREACTION",734778138:"IFCSTRUCTURALPOINTCONNECTION",2082059205:"IFCSTRUCTURALPOINTACTION",3987759626:"IFCSTRUCTURALPLANARACTIONVARYING",1621171031:"IFCSTRUCTURALPLANARACTION",1252848954:"IFCSTRUCTURALLOADGROUP",1721250024:"IFCSTRUCTURALLINEARACTIONVARYING",1807405624:"IFCSTRUCTURALLINEARACTION",2445595289:"IFCSTRUCTURALCURVEMEMBERVARYING",214636428:"IFCSTRUCTURALCURVEMEMBER",4243806635:"IFCSTRUCTURALCURVECONNECTION",1179482911:"IFCSTRUCTURALCONNECTION",682877961:"IFCSTRUCTURALACTION",1039846685:"IFCSTAIRFLIGHTTYPE",3112655638:"IFCSTACKTERMINALTYPE",3812236995:"IFCSPACETYPE",652456506:"IFCSPACEPROGRAM",1305183839:"IFCSPACEHEATERTYPE",3856911033:"IFCSPACE",2533589738:"IFCSLABTYPE",4097777520:"IFCSITE",4105383287:"IFCSERVICELIFE",3517283431:"IFCSCHEDULETIMECONTROL",1768891740:"IFCSANITARYTERMINALTYPE",2863920197:"IFCRELASSIGNSTASKS",160246688:"IFCRELAGGREGATES",2324767716:"IFCRAMPFLIGHTTYPE",2893384427:"IFCRAILINGTYPE",3248260540:"IFCRADIUSDIMENSION",2250791053:"IFCPUMPTYPE",1842657554:"IFCPROTECTIVEDEVICETYPE",3651124850:"IFCPROJECTIONELEMENT",3642467123:"IFCPROJECTORDERRECORD",2904328755:"IFCPROJECTORDER",2744685151:"IFCPROCEDURE",3740093272:"IFCPORT",3724593414:"IFCPOLYLINE",4017108033:"IFCPLATETYPE",4231323485:"IFCPIPESEGMENTTYPE",804291784:"IFCPIPEFITTINGTYPE",3327091369:"IFCPERMIT",2382730787:"IFCPERFORMANCEHISTORY",2837617999:"IFCOUTLETTYPE",3425660407:"IFCORDERACTION",3588315303:"IFCOPENINGELEMENT",4143007308:"IFCOCCUPANT",1916936684:"IFCMOVE",977012517:"IFCMOTORCONNECTIONTYPE",3181161470:"IFCMEMBERTYPE",2108223431:"IFCMECHANICALFASTENERTYPE",377706215:"IFCMECHANICALFASTENER",2506943328:"IFCLINEARDIMENSION",1161773419:"IFCLIGHTFIXTURETYPE",1051575348:"IFCLAMPTYPE",3827777499:"IFCLABORRESOURCE",4288270099:"IFCJUNCTIONBOXTYPE",2391368822:"IFCINVENTORY",1806887404:"IFCHUMIDIFIERTYPE",1251058090:"IFCHEATEXCHANGERTYPE",2706460486:"IFCGROUP",3009204131:"IFCGRID",200128114:"IFCGASTERMINALTYPE",814719939:"IFCFURNITURESTANDARD",263784265:"IFCFURNISHINGELEMENT",3009222698:"IFCFLOWTREATMENTDEVICETYPE",2297155007:"IFCFLOWTERMINALTYPE",1339347760:"IFCFLOWSTORAGEDEVICETYPE",1834744321:"IFCFLOWSEGMENTTYPE",1482959167:"IFCFLOWMOVINGDEVICETYPE",3815607619:"IFCFLOWMETERTYPE",3198132628:"IFCFLOWFITTINGTYPE",3907093117:"IFCFLOWCONTROLLERTYPE",1287392070:"IFCFEATUREELEMENTSUBTRACTION",2143335405:"IFCFEATUREELEMENTADDITION",2827207264:"IFCFEATUREELEMENT",2489546625:"IFCFASTENERTYPE",647756555:"IFCFASTENER",3737207727:"IFCFACETEDBREPWITHVOIDS",807026263:"IFCFACETEDBREP",3390157468:"IFCEVAPORATORTYPE",3174744832:"IFCEVAPORATIVECOOLERTYPE",3272907226:"IFCEQUIPMENTSTANDARD",1962604670:"IFCEQUIPMENTELEMENT",2107101300:"IFCENERGYCONVERSIONDEVICETYPE",1704287377:"IFCELLIPSE",2590856083:"IFCELEMENTCOMPONENTTYPE",1623761950:"IFCELEMENTCOMPONENT",4123344466:"IFCELEMENTASSEMBLY",1758889154:"IFCELEMENT",360485395:"IFCELECTRICALBASEPROPERTIES",3849074793:"IFCDISTRIBUTIONFLOWELEMENTTYPE",3256556792:"IFCDISTRIBUTIONELEMENTTYPE",681481545:"IFCDIMENSIONCURVEDIRECTEDCALLOUT",1457835157:"IFCCURTAINWALLTYPE",3295246426:"IFCCREWRESOURCE",1916426348:"IFCCOVERINGTYPE",1419761937:"IFCCOSTSCHEDULE",3895139033:"IFCCOSTITEM",3293443760:"IFCCONTROL",2559216714:"IFCCONSTRUCTIONRESOURCE",2510884976:"IFCCONIC",3732776249:"IFCCOMPOSITECURVE",300633059:"IFCCOLUMNTYPE",2937912522:"IFCCIRCLEHOLLOWPROFILEDEF",3124254112:"IFCBUILDINGSTOREY",1950629157:"IFCBUILDINGELEMENTTYPE",4031249490:"IFCBUILDING",1260505505:"IFCBOUNDEDCURVE",3649129432:"IFCBOOLEANCLIPPINGRESULT",1334484129:"IFCBLOCK",3207858831:"IFCASYMMETRICISHAPEPROFILEDEF",1674181508:"IFCANNOTATION",2296667514:"IFCACTOR",2097647324:"IFCTRANSPORTELEMENTTYPE",3473067441:"IFCTASK",1580310250:"IFCSYSTEMFURNITUREELEMENTTYPE",4124788165:"IFCSURFACEOFREVOLUTION",2809605785:"IFCSURFACEOFLINEAREXTRUSION",2028607225:"IFCSURFACECURVESWEPTAREASOLID",4070609034:"IFCSTRUCTUREDDIMENSIONCALLOUT",2218152070:"IFCSTRUCTURALSURFACEMEMBERVARYING",3979015343:"IFCSTRUCTURALSURFACEMEMBER",3689010777:"IFCSTRUCTURALREACTION",530289379:"IFCSTRUCTURALMEMBER",3136571912:"IFCSTRUCTURALITEM",3544373492:"IFCSTRUCTURALACTIVITY",451544542:"IFCSPHERE",3893378262:"IFCSPATIALSTRUCTUREELEMENTTYPE",2706606064:"IFCSPATIALSTRUCTUREELEMENT",3626867408:"IFCRIGHTCIRCULARCYLINDER",4158566097:"IFCRIGHTCIRCULARCONE",1856042241:"IFCREVOLVEDAREASOLID",2914609552:"IFCRESOURCE",1401173127:"IFCRELVOIDSELEMENT",3451746338:"IFCRELSPACEBOUNDARY",366585022:"IFCRELSERVICESBUILDINGS",4122056220:"IFCRELSEQUENCE",1058617721:"IFCRELSCHEDULESCOSTITEMS",1245217292:"IFCRELREFERENCEDINSPATIALSTRUCTURE",750771296:"IFCRELPROJECTSELEMENT",202636808:"IFCRELOVERRIDESPROPERTIES",2051452291:"IFCRELOCCUPIESSPACES",3268803585:"IFCRELNESTS",4189434867:"IFCRELINTERACTIONREQUIREMENTS",279856033:"IFCRELFLOWCONTROLELEMENTS",3940055652:"IFCRELFILLSELEMENT",781010003:"IFCRELDEFINESBYTYPE",4186316022:"IFCRELDEFINESBYPROPERTIES",693640335:"IFCRELDEFINES",2551354335:"IFCRELDECOMPOSES",2802773753:"IFCRELCOVERSSPACES",886880790:"IFCRELCOVERSBLDGELEMENTS",3242617779:"IFCRELCONTAINEDINSPATIALSTRUCTURE",3678494232:"IFCRELCONNECTSWITHREALIZINGELEMENTS",504942748:"IFCRELCONNECTSWITHECCENTRICITY",1638771189:"IFCRELCONNECTSSTRUCTURALMEMBER",3912681535:"IFCRELCONNECTSSTRUCTURALELEMENT",2127690289:"IFCRELCONNECTSSTRUCTURALACTIVITY",3190031847:"IFCRELCONNECTSPORTS",4201705270:"IFCRELCONNECTSPORTTOELEMENT",3945020480:"IFCRELCONNECTSPATHELEMENTS",1204542856:"IFCRELCONNECTSELEMENTS",826625072:"IFCRELCONNECTS",2851387026:"IFCRELASSOCIATESPROFILEPROPERTIES",2655215786:"IFCRELASSOCIATESMATERIAL",3840914261:"IFCRELASSOCIATESLIBRARY",982818633:"IFCRELASSOCIATESDOCUMENT",2728634034:"IFCRELASSOCIATESCONSTRAINT",919958153:"IFCRELASSOCIATESCLASSIFICATION",4095574036:"IFCRELASSOCIATESAPPROVAL",1327628568:"IFCRELASSOCIATESAPPLIEDVALUE",1865459582:"IFCRELASSOCIATES",205026976:"IFCRELASSIGNSTORESOURCE",3372526763:"IFCRELASSIGNSTOPROJECTORDER",2857406711:"IFCRELASSIGNSTOPRODUCT",4278684876:"IFCRELASSIGNSTOPROCESS",1307041759:"IFCRELASSIGNSTOGROUP",2495723537:"IFCRELASSIGNSTOCONTROL",1683148259:"IFCRELASSIGNSTOACTOR",3939117080:"IFCRELASSIGNS",3454111270:"IFCRECTANGULARTRIMMEDSURFACE",2798486643:"IFCRECTANGULARPYRAMID",2770003689:"IFCRECTANGLEHOLLOWPROFILEDEF",3219374653:"IFCPROXY",1451395588:"IFCPROPERTYSET",4194566429:"IFCPROJECTIONCURVE",103090709:"IFCPROJECT",4208778838:"IFCPRODUCT",2945172077:"IFCPROCESS",220341763:"IFCPLANE",603570806:"IFCPLANARBOX",3566463478:"IFCPERMEABLECOVERINGPROPERTIES",3505215534:"IFCOFFSETCURVE3D",3388369263:"IFCOFFSETCURVE2D",3888040117:"IFCOBJECT",1425443689:"IFCMANIFOLDSOLIDBREP",1281925730:"IFCLINE",572779678:"IFCLSHAPEPROFILEDEF",1484403080:"IFCISHAPEPROFILEDEF",987898635:"IFCGEOMETRICCURVESET",1268542332:"IFCFURNITURETYPE",4238390223:"IFCFURNISHINGELEMENTTYPE",3455213021:"IFCFLUIDFLOWPROPERTIES",315944413:"IFCFILLAREASTYLETILES",4203026998:"IFCFILLAREASTYLETILESYMBOLWITHSTYLE",374418227:"IFCFILLAREASTYLEHATCHING",2047409740:"IFCFACEBASEDSURFACEMODEL",477187591:"IFCEXTRUDEDAREASOLID",80994333:"IFCENERGYPROPERTIES",2835456948:"IFCELLIPSEPROFILEDEF",2777663545:"IFCELEMENTARYSURFACE",339256511:"IFCELEMENTTYPE",1883228015:"IFCELEMENTQUANTITY",1472233963:"IFCEDGELOOP",4006246654:"IFCDRAUGHTINGPREDEFINEDCURVEFONT",445594917:"IFCDRAUGHTINGPREDEFINEDCOLOUR",3073041342:"IFCDRAUGHTINGCALLOUT",526551008:"IFCDOORSTYLE",1714330368:"IFCDOORPANELPROPERTIES",2963535650:"IFCDOORLININGPROPERTIES",32440307:"IFCDIRECTION",4054601972:"IFCDIMENSIONCURVETERMINATOR",606661476:"IFCDIMENSIONCURVE",693772133:"IFCDEFINEDSYMBOL",2827736869:"IFCCURVEBOUNDEDPLANE",2601014836:"IFCCURVE",2147822146:"IFCCSGSOLID",2506170314:"IFCCSGPRIMITIVE3D",194851669:"IFCCRANERAILFSHAPEPROFILEDEF",4133800736:"IFCCRANERAILASHAPEPROFILEDEF",2485617015:"IFCCOMPOSITECURVESEGMENT",2205249479:"IFCCLOSEDSHELL",1383045692:"IFCCIRCLEPROFILEDEF",1416205885:"IFCCARTESIANTRANSFORMATIONOPERATOR3DNONUNIFORM",3331915920:"IFCCARTESIANTRANSFORMATIONOPERATOR3D",3486308946:"IFCCARTESIANTRANSFORMATIONOPERATOR2DNONUNIFORM",3749851601:"IFCCARTESIANTRANSFORMATIONOPERATOR2D",59481748:"IFCCARTESIANTRANSFORMATIONOPERATOR",1123145078:"IFCCARTESIANPOINT",2898889636:"IFCCSHAPEPROFILEDEF",2713105998:"IFCBOXEDHALFSPACE",2581212453:"IFCBOUNDINGBOX",4182860854:"IFCBOUNDEDSURFACE",2736907675:"IFCBOOLEANRESULT",2740243338:"IFCAXIS2PLACEMENT3D",3125803723:"IFCAXIS2PLACEMENT2D",4261334040:"IFCAXIS1PLACEMENT",1302238472:"IFCANNOTATIONSURFACE",2265737646:"IFCANNOTATIONFILLAREAOCCURRENCE",669184980:"IFCANNOTATIONFILLAREA",3288037868:"IFCANNOTATIONCURVEOCCURRENCE",2543172580:"IFCZSHAPEPROFILEDEF",1299126871:"IFCWINDOWSTYLE",512836454:"IFCWINDOWPANELPROPERTIES",336235671:"IFCWINDOWLININGPROPERTIES",2759199220:"IFCVERTEXLOOP",1417489154:"IFCVECTOR",427810014:"IFCUSHAPEPROFILEDEF",2347495698:"IFCTYPEPRODUCT",1628702193:"IFCTYPEOBJECT",1345879162:"IFCTWODIRECTIONREPEATFACTOR",2715220739:"IFCTRAPEZIUMPROFILEDEF",3124975700:"IFCTEXTLITERALWITHEXTENT",4282788508:"IFCTEXTLITERAL",3028897424:"IFCTERMINATORSYMBOL",3071757647:"IFCTSHAPEPROFILEDEF",230924584:"IFCSWEPTSURFACE",1260650574:"IFCSWEPTDISKSOLID",2247615214:"IFCSWEPTAREASOLID",1878645084:"IFCSURFACESTYLERENDERING",2513912981:"IFCSURFACE",2233826070:"IFCSUBEDGE",3653947884:"IFCSTRUCTURALSTEELPROFILEPROPERTIES",3843319758:"IFCSTRUCTURALPROFILEPROPERTIES",1190533807:"IFCSTRUCTURALLOADSINGLEFORCEWARPING",1597423693:"IFCSTRUCTURALLOADSINGLEFORCE",1973038258:"IFCSTRUCTURALLOADSINGLEDISPLACEMENTDISTORTION",2473145415:"IFCSTRUCTURALLOADSINGLEDISPLACEMENT",2668620305:"IFCSTRUCTURALLOADPLANARFORCE",1595516126:"IFCSTRUCTURALLOADLINEARFORCE",390701378:"IFCSPACETHERMALLOADPROPERTIES",1202362311:"IFCSOUNDVALUE",2485662743:"IFCSOUNDPROPERTIES",723233188:"IFCSOLIDMODEL",2609359061:"IFCSLIPPAGECONNECTIONCONDITION",4124623270:"IFCSHELLBASEDSURFACEMODEL",2411513650:"IFCSERVICELIFEFACTOR",1509187699:"IFCSECTIONEDSPINE",2778083089:"IFCROUNDEDRECTANGLEPROFILEDEF",478536968:"IFCRELATIONSHIP",3765753017:"IFCREINFORCEMENTDEFINITIONPROPERTIES",3413951693:"IFCREGULARTIMESERIES",3615266464:"IFCRECTANGLEPROFILEDEF",110355661:"IFCPROPERTYTABLEVALUE",3650150729:"IFCPROPERTYSINGLEVALUE",3357820518:"IFCPROPERTYSETDEFINITION",941946838:"IFCPROPERTYREFERENCEVALUE",2752243245:"IFCPROPERTYLISTVALUE",4166981789:"IFCPROPERTYENUMERATEDVALUE",1680319473:"IFCPROPERTYDEFINITION",871118103:"IFCPROPERTYBOUNDEDVALUE",673634403:"IFCPRODUCTDEFINITIONSHAPE",179317114:"IFCPREDEFINEDPOINTMARKERSYMBOL",433424934:"IFCPREDEFINEDDIMENSIONSYMBOL",2559016684:"IFCPREDEFINEDCURVEFONT",759155922:"IFCPREDEFINEDCOLOUR",2775532180:"IFCPOLYGONALBOUNDEDHALFSPACE",2924175390:"IFCPOLYLOOP",1423911732:"IFCPOINTONSURFACE",4022376103:"IFCPOINTONCURVE",2067069095:"IFCPOINT",1663979128:"IFCPLANAREXTENT",2004835150:"IFCPLACEMENT",597895409:"IFCPIXELTEXTURE",3021840470:"IFCPHYSICALCOMPLEXQUANTITY",2519244187:"IFCPATH",2529465313:"IFCPARAMETERIZEDPROFILEDEF",1029017970:"IFCORIENTEDEDGE",2665983363:"IFCOPENSHELL",2833995503:"IFCONEDIRECTIONREPEATFACTOR",219451334:"IFCOBJECTDEFINITION",1430189142:"IFCMECHANICALCONCRETEMATERIALPROPERTIES",2022407955:"IFCMATERIALDEFINITIONREPRESENTATION",2347385850:"IFCMAPPEDITEM",1008929658:"IFCLOOP",2624227202:"IFCLOCALPLACEMENT",3422422726:"IFCLIGHTSOURCESPOT",1520743889:"IFCLIGHTSOURCEPOSITIONAL",4266656042:"IFCLIGHTSOURCEGONIOMETRIC",2604431987:"IFCLIGHTSOURCEDIRECTIONAL",125510826:"IFCLIGHTSOURCEAMBIENT",1402838566:"IFCLIGHTSOURCE",3741457305:"IFCIRREGULARTIMESERIES",3905492369:"IFCIMAGETEXTURE",2445078500:"IFCHYGROSCOPICMATERIALPROPERTIES",812098782:"IFCHALFSPACESOLID",178086475:"IFCGRIDPLACEMENT",3590301190:"IFCGEOMETRICSET",4142052618:"IFCGEOMETRICREPRESENTATIONSUBCONTEXT",2453401579:"IFCGEOMETRICREPRESENTATIONITEM",3448662350:"IFCGEOMETRICREPRESENTATIONCONTEXT",1446786286:"IFCGENERALPROFILEPROPERTIES",803998398:"IFCGENERALMATERIALPROPERTIES",3857492461:"IFCFUELPROPERTIES",738692330:"IFCFILLAREASTYLE",4219587988:"IFCFAILURECONNECTIONCONDITION",3008276851:"IFCFACESURFACE",803316827:"IFCFACEOUTERBOUND",1809719519:"IFCFACEBOUND",2556980723:"IFCFACE",1860660968:"IFCEXTENDEDMATERIALPROPERTIES",476780140:"IFCEDGECURVE",3900360178:"IFCEDGE",4170525392:"IFCDRAUGHTINGPREDEFINEDTEXTFONT",3732053477:"IFCDOCUMENTREFERENCE",1694125774:"IFCDIMENSIONPAIR",2273265877:"IFCDIMENSIONCALLOUTRELATIONSHIP",3632507154:"IFCDERIVEDPROFILEDEF",3800577675:"IFCCURVESTYLE",2889183280:"IFCCONVERSIONBASEDUNIT",3050246964:"IFCCONTEXTDEPENDENTUNIT",45288368:"IFCCONNECTIONPOINTECCENTRICITY",1981873012:"IFCCONNECTIONCURVEGEOMETRY",370225590:"IFCCONNECTEDFACESET",1485152156:"IFCCOMPOSITEPROFILEDEF",2542286263:"IFCCOMPLEXPROPERTY",776857604:"IFCCOLOURRGB",647927063:"IFCCLASSIFICATIONREFERENCE",3150382593:"IFCCENTERLINEPROFILEDEF",616511568:"IFCBLOBTEXTURE",2705031697:"IFCARBITRARYPROFILEDEFWITHVOIDS",1310608509:"IFCARBITRARYOPENPROFILEDEF",3798115385:"IFCARBITRARYCLOSEDPROFILEDEF",2297822566:"IFCANNOTATIONTEXTOCCURRENCE",3612888222:"IFCANNOTATIONSYMBOLOCCURRENCE",962685235:"IFCANNOTATIONSURFACEOCCURRENCE",2442683028:"IFCANNOTATIONOCCURRENCE",1065908215:"IFCWATERPROPERTIES",891718957:"IFCVIRTUALGRIDINTERSECTION",1907098498:"IFCVERTEXPOINT",3304826586:"IFCVERTEXBASEDTEXTUREMAP",2799835756:"IFCVERTEX",180925521:"IFCUNITASSIGNMENT",1735638870:"IFCTOPOLOGYREPRESENTATION",1377556343:"IFCTOPOLOGICALREPRESENTATIONITEM",581633288:"IFCTIMESERIESVALUE",1718945513:"IFCTIMESERIESREFERENCERELATIONSHIP",3101149627:"IFCTIMESERIES",3317419933:"IFCTHERMALMATERIALPROPERTIES",1210645708:"IFCTEXTUREVERTEX",2552916305:"IFCTEXTUREMAP",1742049831:"IFCTEXTURECOORDINATEGENERATOR",280115917:"IFCTEXTURECOORDINATE",1484833681:"IFCTEXTSTYLEWITHBOXCHARACTERISTICS",1640371178:"IFCTEXTSTYLETEXTMODEL",2636378356:"IFCTEXTSTYLEFORDEFINEDFONT",1983826977:"IFCTEXTSTYLEFONTMODEL",1447204868:"IFCTEXTSTYLE",912023232:"IFCTELECOMADDRESS",531007025:"IFCTABLEROW",985171141:"IFCTABLE",1290481447:"IFCSYMBOLSTYLE",626085974:"IFCSURFACETEXTURE",1351298697:"IFCSURFACESTYLEWITHTEXTURES",846575682:"IFCSURFACESTYLESHADING",1607154358:"IFCSURFACESTYLEREFRACTION",3303107099:"IFCSURFACESTYLELIGHTING",1300840506:"IFCSURFACESTYLE",3049322572:"IFCSTYLEDREPRESENTATION",3958052878:"IFCSTYLEDITEM",2830218821:"IFCSTYLEMODEL",3408363356:"IFCSTRUCTURALLOADTEMPERATURE",2525727697:"IFCSTRUCTURALLOADSTATIC",2162789131:"IFCSTRUCTURALLOAD",2273995522:"IFCSTRUCTURALCONNECTIONCONDITION",3692461612:"IFCSIMPLEPROPERTY",4240577450:"IFCSHAPEREPRESENTATION",3982875396:"IFCSHAPEMODEL",867548509:"IFCSHAPEASPECT",4165799628:"IFCSECTIONREINFORCEMENTPROPERTIES",2042790032:"IFCSECTIONPROPERTIES",448429030:"IFCSIUNIT",2341007311:"IFCROOT",3679540991:"IFCRIBPLATEPROFILEPROPERTIES",1660063152:"IFCREPRESENTATIONMAP",3008791417:"IFCREPRESENTATIONITEM",3377609919:"IFCREPRESENTATIONCONTEXT",1076942058:"IFCREPRESENTATION",1222501353:"IFCRELAXATION",1580146022:"IFCREINFORCEMENTBARPROPERTIES",2692823254:"IFCREFERENCESVALUEDOCUMENT",825690147:"IFCQUANTITYWEIGHT",2405470396:"IFCQUANTITYVOLUME",3252649465:"IFCQUANTITYTIME",931644368:"IFCQUANTITYLENGTH",2093928680:"IFCQUANTITYCOUNT",2044713172:"IFCQUANTITYAREA",3710013099:"IFCPROPERTYENUMERATION",148025276:"IFCPROPERTYDEPENDENCYRELATIONSHIP",3896028662:"IFCPROPERTYCONSTRAINTRELATIONSHIP",2598011224:"IFCPROPERTY",2802850158:"IFCPROFILEPROPERTIES",3958567839:"IFCPROFILEDEF",2267347899:"IFCPRODUCTSOFCOMBUSTIONPROPERTIES",2095639259:"IFCPRODUCTREPRESENTATION",2417041796:"IFCPRESENTATIONSTYLEASSIGNMENT",3119450353:"IFCPRESENTATIONSTYLE",1304840413:"IFCPRESENTATIONLAYERWITHSTYLE",2022622350:"IFCPRESENTATIONLAYERASSIGNMENT",1775413392:"IFCPREDEFINEDTEXTFONT",3213052703:"IFCPREDEFINEDTERMINATORSYMBOL",990879717:"IFCPREDEFINEDSYMBOL",3727388367:"IFCPREDEFINEDITEM",3355820592:"IFCPOSTALADDRESS",2226359599:"IFCPHYSICALSIMPLEQUANTITY",2483315170:"IFCPHYSICALQUANTITY",101040310:"IFCPERSONANDORGANIZATION",2077209135:"IFCPERSON",1207048766:"IFCOWNERHISTORY",1411181986:"IFCORGANIZATIONRELATIONSHIP",4251960020:"IFCORGANIZATION",1227763645:"IFCOPTICALMATERIALPROPERTIES",2251480897:"IFCOBJECTIVE",3701648758:"IFCOBJECTPLACEMENT",1918398963:"IFCNAMEDUNIT",2706619895:"IFCMONETARYUNIT",3368373690:"IFCMETRIC",677618848:"IFCMECHANICALSTEELMATERIALPROPERTIES",4256014907:"IFCMECHANICALMATERIALPROPERTIES",2597039031:"IFCMEASUREWITHUNIT",3265635763:"IFCMATERIALPROPERTIES",2199411900:"IFCMATERIALLIST",1303795690:"IFCMATERIALLAYERSETUSAGE",3303938423:"IFCMATERIALLAYERSET",248100487:"IFCMATERIALLAYER",1847130766:"IFCMATERIALCLASSIFICATIONRELATIONSHIP",1838606355:"IFCMATERIAL",30780891:"IFCLOCALTIME",1566485204:"IFCLIGHTINTENSITYDISTRIBUTION",4162380809:"IFCLIGHTDISTRIBUTIONDATA",3452421091:"IFCLIBRARYREFERENCE",2655187982:"IFCLIBRARYINFORMATION",3020489413:"IFCIRREGULARTIMESERIESVALUE",852622518:"IFCGRIDAXIS",3548104201:"IFCEXTERNALLYDEFINEDTEXTFONT",3207319532:"IFCEXTERNALLYDEFINEDSYMBOL",1040185647:"IFCEXTERNALLYDEFINEDSURFACESTYLE",2242383968:"IFCEXTERNALLYDEFINEDHATCHSTYLE",3200245327:"IFCEXTERNALREFERENCE",1648886627:"IFCENVIRONMENTALIMPACTVALUE",3796139169:"IFCDRAUGHTINGCALLOUTRELATIONSHIP",770865208:"IFCDOCUMENTINFORMATIONRELATIONSHIP",1154170062:"IFCDOCUMENTINFORMATION",1376555844:"IFCDOCUMENTELECTRONICFORMAT",2949456006:"IFCDIMENSIONALEXPONENTS",1045800335:"IFCDERIVEDUNITELEMENT",1765591967:"IFCDERIVEDUNIT",1072939445:"IFCDATEANDTIME",3510044353:"IFCCURVESTYLEFONTPATTERN",2367409068:"IFCCURVESTYLEFONTANDSCALING",1105321065:"IFCCURVESTYLEFONT",539742890:"IFCCURRENCYRELATIONSHIP",602808272:"IFCCOSTVALUE",1065062679:"IFCCOORDINATEDUNIVERSALTIMEOFFSET",347226245:"IFCCONSTRAINTRELATIONSHIP",613356794:"IFCCONSTRAINTCLASSIFICATIONRELATIONSHIP",1658513725:"IFCCONSTRAINTAGGREGATIONRELATIONSHIP",1959218052:"IFCCONSTRAINT",2732653382:"IFCCONNECTIONSURFACEGEOMETRY",4257277454:"IFCCONNECTIONPORTGEOMETRY",2614616156:"IFCCONNECTIONPOINTGEOMETRY",2859738748:"IFCCONNECTIONGEOMETRY",3264961684:"IFCCOLOURSPECIFICATION",3639012971:"IFCCLASSIFICATIONNOTATIONFACET",938368621:"IFCCLASSIFICATIONNOTATION",1098599126:"IFCCLASSIFICATIONITEMRELATIONSHIP",1767535486:"IFCCLASSIFICATIONITEM",747523909:"IFCCLASSIFICATION",622194075:"IFCCALENDARDATE",2069777674:"IFCBOUNDARYNODECONDITIONWARPING",1387855156:"IFCBOUNDARYNODECONDITION",3367102660:"IFCBOUNDARYFACECONDITION",1560379544:"IFCBOUNDARYEDGECONDITION",4037036970:"IFCBOUNDARYCONDITION",3869604511:"IFCAPPROVALRELATIONSHIP",390851274:"IFCAPPROVALPROPERTYRELATIONSHIP",2080292479:"IFCAPPROVALACTORRELATIONSHIP",130549933:"IFCAPPROVAL",1110488051:"IFCAPPLIEDVALUERELATIONSHIP",411424972:"IFCAPPLIEDVALUE",639542469:"IFCAPPLICATION",618182010:"IFCADDRESS",3630933823:"IFCACTORROLE",599546466:"FILE_DESCRIPTION",1390159747:"FILE_NAME",1109904537:"FILE_SCHEMA"};class ft{static async getUnits(s){var n;const{IFCUNITASSIGNMENT:t}=b,e=await s.getAllPropertiesOfType(t);if(!e)return 1;const i=Object.keys(e),o=e[parseInt(i[0],10)];for(const r of o.Units){if(r.value===void 0||r.value===null)continue;const a=await s.getProperties(r.value);if(!a||!a.UnitType||!a.UnitType.value||a.UnitType.value!=="LENGTHUNIT")continue;let E=1,d=1;return a.Name.value==="METRE"&&(d=1),a.Name.value==="FOOT"&&(d=.3048),((n=a.Prefix)==null?void 0:n.value)==="MILLI"&&(E=.001),d*E}return 1}static async findItemByGuid(s,t){var i;const e=s.getAllPropertiesIDs();for(const o of e){const n=await s.getProperties(o);if(n&&((i=n.GlobalId)==null?void 0:i.value)===t)return n}return null}static async getRelationMap(s,t,e){var a;const o=e??(()=>{}),n={},r=s.getAllPropertiesIDs();for(const l of r){const E=await s.getProperties(l);if(!E)continue;const d=E.type===t,h=Object.keys(E).find(T=>T.startsWith("Relating")),u=Object.keys(E).find(T=>T.startsWith("Related"));if(!(d&&h&&u))continue;const p=await s.getProperties((a=E[h])==null?void 0:a.value),A=E[u];if(!p||!A||!(A&&Array.isArray(A)))continue;const F=A.map(T=>T.value);o(p.expressID,F),n[p.expressID]=F}return n}static async getQsetQuantities(s,t,e){const o=e??(()=>{}),n=await s.getProperties(t);return!n||n.type!==b.IFCELEMENTQUANTITY?null:(n.Quantities??[{}]).map(l=>(l.value&&o(l.value),l.value)).filter(l=>l!==null)}static async getPsetProps(s,t,e){const o=e??(()=>{}),n=await s.getProperties(t);return!n||n.type!==b.IFCPROPERTYSET?null:(n.HasProperties??[{}]).map(l=>(l.value&&o(l.value),l.value)).filter(l=>l!==null)}static async getPsetRel(s,t){var r;if(!await s.getProperties(t))return null;const i=await s.getAllPropertiesOfType(b.IFCRELDEFINESBYPROPERTIES);if(!i)return null;const o=Object.values(i);let n=null;for(const a of o)((r=a.RelatingPropertyDefinition)==null?void 0:r.value)===t&&(n=a.expressID);return n}static async getQsetRel(s,t){return ft.getPsetRel(s,t)}static async getEntityName(s,t){var n;const e=await s.getProperties(t);if(!e)return{key:null,name:null};const i=Object.keys(e).find(r=>r.endsWith("Name"))??null,o=i?(n=e[i])==null?void 0:n.value:null;return{key:i,name:o}}static async getQuantityValue(s,t){const e=await s.getProperties(t);if(!e)return{key:null,value:null};const i=Object.keys(e).find(n=>n.endsWith("Value"))??null;let o;return i===null||e[i]===void 0||e[i]===null?o=null:o=e[i].value,{key:i,value:o}}static isRel(s){return mi[s].startsWith("IFCREL")}static async attributeExists(s,t,e){const i=await s.getProperties(t);return i?Object.keys(i).includes(e):!1}static async groupEntitiesByType(s,t){var i;const e=new Map;for(const o of t){const n=await s.getProperties(o);if(!n)continue;const r=n.type;e.get(r)||e.set(r,new Set),(i=e.get(r))==null||i.add(o)}return e}}const Ts=class Ts extends tt{constructor(t){super(t);I(this,"onDisposed",new D);I(this,"onFragmentsLoaded",new D);I(this,"onFragmentsDisposed",new D);I(this,"list",new Map);I(this,"groups",new Map);I(this,"enabled",!0);I(this,"baseCoordinationModel","");I(this,"_loader",new rn.Serializer);this.components.add(Ts.uuid,this)}get meshes(){const t=[];for(const[e,i]of this.list)t.push(i.mesh);return t}dispose(){for(const[t,e]of this.groups)e.dispose(!0);this.baseCoordinationModel="",this.groups.clear(),this.list.clear(),this.onFragmentsLoaded.reset(),this.onFragmentsDisposed.reset(),this.onDisposed.trigger(),this.onDisposed.reset()}disposeGroup(t){const{uuid:e}=t,i=[];for(const o of t.items)i.push(o.id),this.list.delete(o.id);t.dispose(!0),this.groups.delete(t.uuid),this.onFragmentsDisposed.trigger({groupID:e,fragmentIDs:i})}load(t,e=!0){const i=this._loader.import(t);for(const o of i.items)o.group=i,this.list.set(o.id,o);return e&&this.coordinate([i]),this.groups.set(i.uuid,i),this.onFragmentsLoaded.trigger(i),i}export(t){return this._loader.export(t)}coordinate(t=Array.from(this.groups.values())){if(this.baseCoordinationModel.length===0){const o=t.pop();if(!o)return;this.baseCoordinationModel=o.uuid}if(!t.length)return;const i=this.groups.get(this.baseCoordinationModel);if(!i){console.log("No base model found for coordination!");return}for(const o of t)o!==i&&(o.position.set(0,0,0),o.rotation.set(0,0,0),o.scale.set(1,1,1),o.updateMatrix(),o.applyMatrix4(o.coordinationMatrix.clone().invert()),o.applyMatrix4(i.coordinationMatrix))}};I(Ts,"uuid","fef46874-46a3-461b-8c44-2922ab77c806");let at=Ts;class gr extends tt{constructor(t){super(t);I(this,"onFound",new D);I(this,"onDisposed",new D);I(this,"enabled",!0);I(this,"indexedModels",{});I(this,"_conditionFunctions");I(this,"_noHandleAttributes",["type"]);I(this,"onFragmentsDisposed",t=>{delete this.indexedModels[t.groupID]});this._conditionFunctions=this.getConditionFunctions(),t.get(at).onFragmentsDisposed.add(this.onFragmentsDisposed)}dispose(){this.indexedModels={},this.onFound.reset(),this.onDisposed.trigger(),this.onDisposed.reset()}async indexEntityRelations(t){const e={};await ft.getRelationMap(t,b.IFCRELDEFINESBYPROPERTIES,async(o,n)=>{e[o]||(e[o]=new Set);const r=[];await ft.getPsetProps(t,o,a=>{r.push(a),e[o].add(a),e[a]||(e[a]=new Set),e[a].add(o)});for(const a of n){e[o].add(a);for(const l of r)e[l].add(a);e[a]||(e[a]=new Set),e[a].add(a)}});const i=[b.IFCRELCONTAINEDINSPATIALSTRUCTURE,b.IFCRELDEFINESBYTYPE,b.IFCRELASSIGNSTOGROUP];for(const o of i)await ft.getRelationMap(t,o,async(n,r)=>{e[n]||(e[n]=new Set);for(const a of r)e[n].add(a),e[a]||(e[a]=new Set),e[a].add(a)});return this.indexedModels[t.uuid]=e,e}async find(t,e){const i=this.components.get(at),o=e||i.groups.values(),n={};for(const a of o){let l=this.indexedModels[a.uuid];l||(l=await this.indexEntityRelations(a));let E=[];for(const[u,p]of t.entries()){const A=new Set,F=this.simpleQuery(a,p,A),T=[];for(const m of F){const g=l[m];if(g){T.push(m);for(const f of g)A.has(f)||T.push(f)}}E=p.operator==="AND"&&u>0?this.getCommonElements(E,T):[...E,...T]}const d=new Set;for(const[u]of a.data)E.includes(u)&&d.add(u);const h=new Set;for(const u of E)d.has(u)||h.add(u);n[a.uuid]={modelEntities:d,otherEntities:h}}const r=this.toFragmentMap(n);return this.onFound.trigger(r),r}toFragmentMap(t){const e=this.components.get(at),i={};for(const o in t){const n=e.groups.get(o);if(!n)continue;const r=t[o].modelEntities;for(const a of r){const l=n.data.get(a);if(l)for(const E of l[0]){const d=n.keyFragments.get(E);if(!d)throw new Error("Fragment ID not found!");i[d]||(i[d]=new Set),i[d].add(a)}}}return i}simpleQuery(t,e,i){const o=t.getLocalProperties();if(!o)throw new Error("Model has no properties");let n={},r=0,a=[];for(const l of e.queries){let E=[];const d=l.operator==="AND"?n:o;if(l.condition){const u=this.getMatchingEntities(d,l,i);E=u.expressIDs,n={...n,...u.entities}}else E=[...this.simpleQuery(t,l,i)];a=r===0?E:this.combineArrays(a,E,l.operator??"AND"),r++}return new Set(a)}getMatchingEntities(t,e,i){const{attribute:o,condition:n}=e;let{value:r}=e;const a=!this._noHandleAttributes.includes(o),l=[],E=[];for(const d in t){const h=t[d];if(h===void 0)continue;const u=h[o];let p=a?u==null?void 0:u.value:u;if(p==null)continue;const A=typeof r,F=typeof p;A==="number"&&F==="string"?r=r.toString():A==="string"&&F==="number"&&(p=p.toString());let T=this._conditionFunctions[n](p,r);if(e.negateResult&&(T=!T),!T){e.negateResult&&i.add(h.expressID);continue}l.push(h.expressID),E.push(h)}return{expressIDs:l,entities:E,excludedItems:i}}combineArrays(t,e,i){return i?i==="AND"?this.arrayIntersection(t,e):this.arrayUnion(t,e):e}getCommonElements(...t){const e=[],i=new Map;for(const o of t){const n=new Set(o);for(const r of n)i.has(r)?i.set(r,i.get(r)+1):i.set(r,1)}for(const[o,n]of i)n===t.length&&e.push(o);return e}arrayIntersection(t,e){return t.filter(i=>e.includes(i))}arrayUnion(t,e){return[...t,...e]}getConditionFunctions(){return{is:(t,e)=>t===e,includes:(t,e)=>t.toString().includes(e.toString()),startsWith:(t,e)=>t.toString().startsWith(e.toString()),endsWith:(t,e)=>t.toString().endsWith(e.toString()),matches:(t,e)=>new RegExp(e.toString()).test(t.toString())}}}const we=class we extends tt{constructor(t){super(t);I(this,"onDisposed",new D);I(this,"enabled",!0);I(this,"inverseAttributes",["IsDecomposedBy","Decomposes","AssociatedTo","HasAssociations","ClassificationForObjects","IsGroupedBy","HasAssignments","IsDefinedBy","DefinesOcurrence","IsTypedBy","Types","Defines","ContainedInStructure","ContainsElements"]);I(this,"inverseAttributesToProcess",["HasAssignments","IsDecomposedBy","IsDefinedBy","IsTypedBy","HasAssociations","ContainedInStructure"]);I(this,"_relToAttributesMap",new Map);I(this,"relationMaps",{});I(this,"onFragmentsDisposed",t=>{delete this.relationMaps[t.groupID]});this.components.add(we.uuid,this),t.get(at).onFragmentsDisposed.add(this.onFragmentsDisposed),this.setRelMap()}getAttributeRels(t){const e=[];for(const[i,o]of this._relToAttributesMap.entries()){const{forRelating:n,forRelated:r}=o;(n===t||r===t)&&e.push(i)}return e}setRelMap(){this._relToAttributesMap.set(b.IFCRELAGGREGATES,{forRelating:"IsDecomposedBy",forRelated:"Decomposes"}),this._relToAttributesMap.set(b.IFCRELASSOCIATESMATERIAL,{forRelating:"AssociatedTo",forRelated:"HasAssociations"}),this._relToAttributesMap.set(b.IFCRELASSOCIATESCLASSIFICATION,{forRelating:"ClassificationForObjects",forRelated:"HasAssociations"}),this._relToAttributesMap.set(b.IFCRELASSIGNSTOGROUP,{forRelating:"IsGroupedBy",forRelated:"HasAssignments"}),this._relToAttributesMap.set(b.IFCRELDEFINESBYPROPERTIES,{forRelated:"IsDefinedBy",forRelating:"DefinesOcurrence"}),this._relToAttributesMap.set(b.IFCRELDEFINESBYTYPE,{forRelated:"IsTypedBy",forRelating:"Types"}),this._relToAttributesMap.set(b.IFCRELDEFINESBYTEMPLATE,{forRelated:"IsDefinedBy",forRelating:"Defines"}),this._relToAttributesMap.set(b.IFCRELCONTAINEDINSPATIALSTRUCTURE,{forRelated:"ContainedInStructure",forRelating:"ContainsElements"})}async process(t){if(!t.hasProperties)throw new Error("FragmentsGroup properties not found");this.relationMaps[t.uuid]=new Map;const e=this.relationMaps[t.uuid];for(const i of this.inverseAttributesToProcess){const o=this.getAttributeRels(i);for(const n of o)await ft.getRelationMap(t,n,async(r,a)=>{const l=this._relToAttributesMap.get(n);if(!l)return;const{forRelated:E,forRelating:d}=l;if(d&&this.inverseAttributesToProcess.includes(d)){const h=e.get(r)??new Map,u=this.inverseAttributes.indexOf(d);h.set(u,a),e.set(r,h)}if(E&&this.inverseAttributesToProcess.includes(E))for(const h of a){const u=e.get(h)??new Map,p=this.inverseAttributes.indexOf(E),A=u.get(p)??[];A.push(r),u.set(p,A),e.set(h,u)}})}return e}getEntityRelations(t,e,i){const o=this.relationMaps[t.uuid];if(!o)return null;const n=o.get(e),r=this.inverseAttributes.indexOf(i);if(!n||r===-1)return null;const a=n.get(r);return a||null}serializeModelRelations(t){const e=this.relationMaps[t.uuid];if(!e)return null;const i={};for(const[o,n]of e.entries()){i[o]||(i[o]={});for(const[r,a]of n.entries())i[o][r]=a}return JSON.stringify(i)}serializeRelations(){const t={};for(const e in this.relationMaps){const i=this.relationMaps[e],o={};for(const[n,r]of i.entries()){o[n]||(o[n]={});for(const[a,l]of r.entries())o[n][a]=l}t[e]=o}return JSON.stringify(t)}getRelationsMapFromJSON(t){const e=JSON.parse(t),i=new Map;for(const o in e){const n=e[o],r=new Map;for(const a in n)r.set(Number(a),n[a]);i.set(Number(o),r)}return i}dispose(){this.relationMaps={},this.components.get(at).onFragmentsDisposed.remove(this.onFragmentsDisposed),this.onDisposed.trigger(we.uuid),this.onDisposed.reset()}};I(we,"uuid","23a889ab-83b3-44a4-8bee-ead83438370b");let hi=we;class Or{constructor(){I(this,"factor",1);I(this,"complement",1)}apply(s){const e=this.getScaleMatrix().multiply(s);s.copy(e)}setUp(s){var o;this.factor=1;const t=this.getLengthUnits(s);if(!t)return;const e=t==null,i=t.Name===void 0||t.Name===null;e||i||(t.Name.value==="FOOT"?this.factor=.3048:((o=t.Prefix)==null?void 0:o.value)==="MILLI"&&(this.complement=.001))}getLengthUnits(s){try{const e=s.GetLineIDsWithType(0,b.IFCUNITASSIGNMENT).get(0),i=s.GetLine(0,e);for(const o of i.Units){if(!o||o.value===null||o.value===void 0)continue;const n=s.GetLine(0,o.value);if(n.UnitType&&n.UnitType.value==="LENGTHUNIT")return n}return null}catch{return console.log("Could not get units"),null}}getScaleMatrix(){const s=this.factor;return new S.Matrix4().fromArray([s,0,0,0,0,s,0,0,0,0,s,0,0,0,0,1])}}class yn{constructor(){I(this,"itemsByFloor",{});I(this,"_units",new Or)}setUp(s){this._units.setUp(s),this.cleanUp();try{const t=s.GetLineIDsWithType(0,b.IFCRELCONTAINEDINSPATIALSTRUCTURE),e=new Set,i=s.GetLineIDsWithType(0,b.IFCSPACE);for(let l=0;l<i.size();l++)e.add(i.get(l));const o=s.GetLineIDsWithType(0,b.IFCRELAGGREGATES),n=o.size();for(let l=0;l<n;l++){const E=o.get(l),d=s.GetLine(0,E);if(!d||!d.RelatingObject||!d.RelatedObjects)continue;const h=d.RelatingObject.value,u=d.RelatedObjects;for(const p of u){const A=p.value;e.has(A)&&(this.itemsByFloor[A]=h)}}const r={},a=t.size();for(let l=0;l<a;l++){const E=t.get(l),d=s.GetLine(0,E);if(!d||!d.RelatingStructure||!d.RelatedElements)continue;const h=d.RelatingStructure.value,u=d.RelatedElements;if(e.has(h))for(const p of u){r[h]||(r[h]=[]);const A=p.value;r[h].push(A)}else for(const p of u){const A=p.value;this.itemsByFloor[A]=h}}for(const l in r){const E=this.itemsByFloor[l];if(E!==void 0){const d=r[l];for(const h of d)this.itemsByFloor[h]=E}}for(let l=0;l<n;l++){const E=o.get(l),d=s.GetLine(0,E);if(!d||!d.RelatingObject||!d.RelatedObjects)continue;const h=d.RelatingObject.value,u=d.RelatedObjects;for(const p of u){const A=p.value,F=this.itemsByFloor[h];F!==void 0&&(this.itemsByFloor[A]=F)}}}catch{console.log("Could not get floors.")}}cleanUp(){this.itemsByFloor={}}}class Ri{constructor(){I(this,"includeProperties",!0);I(this,"optionalCategories",[b.IFCSPACE]);I(this,"coordinate",!0);I(this,"wasm",{path:"",absolute:!1,logLevel:b.LogLevel.LOG_LEVEL_OFF});I(this,"excludedCategories",new Set);I(this,"saveLocations",!1);I(this,"webIfc",{COORDINATE_TO_ORIGIN:!0,OPTIMIZE_PROFILES:!0});I(this,"autoSetWasm",!0);I(this,"customLocateFileHandler",null)}}class Nn{constructor(){I(this,"defLineMat",new S.LineBasicMaterial({color:16777215}))}read(s){const t=s.GetAllAlignments(0),e=s.GetAllCrossSections2D(0),i=s.GetAllCrossSections3D(0),o={IfcAlignment:t,IfcCrossSection2D:e,IfcCrossSection3D:i};return this.get(o)}get(s){if(s.IfcAlignment){const t=new Map;for(const e of s.IfcAlignment){const i=new Ht.Alignment;i.absolute=this.getCurves(e.curve3D,i),i.horizontal=this.getCurves(e.horizontal,i),i.vertical=this.getCurves(e.vertical,i),t.set(t.size,i)}return{alignments:t,coordinationMatrix:new S.Matrix4}}}getCurves(s,t){const e=[];let i=0;for(const o of s){const n={};if(o.data)for(const h of o.data){const[u,p]=h.split(": "),A=parseFloat(p);n[u]=A||p}const{points:r}=o,a=new Float32Array(r.length*3);for(let h=0;h<r.length;h++){const{x:u,y:p,z:A}=r[h];a[h*3]=u,a[h*3+1]=p,a[h*3+2]=A||0}const l=new S.BufferAttribute(a,3),E=new S.EdgesGeometry;E.setAttribute("position",l);const d=new Ht.CurveMesh(i,n,t,E,this.defLineMat);e.push(d.curve),i++}return e}}class Ln{get(s,t){let e="";const i=s.GetHeaderLine(0,t)||"";if(!i)return e;for(const o of i.arguments)if(o!=null)if(Array.isArray(o))for(const n of o)e+=`${n.value}|`;else e+=`${o.value}|`;return e}}const De=class De extends tt{constructor(t){super(t);I(this,"onIfcStartedLoading",new D);I(this,"onSetup",new D);I(this,"onDisposed",new D);I(this,"settings",new Ri);I(this,"enabled",!0);I(this,"webIfc",new b.IfcAPI);I(this,"_material",new S.MeshLambertMaterial);I(this,"_spatialTree",new yn);I(this,"_metaData",new Ln);I(this,"_fragmentInstances",new Map);I(this,"_civil",new Nn);I(this,"_propertyExporter",new Sn);I(this,"_visitedFragments",new Map);I(this,"_materialT",new S.MeshLambertMaterial({transparent:!0,opacity:.5}));this.components.add(De.uuid,this),this.settings.excludedCategories.add(b.IFCOPENINGELEMENT)}dispose(){this.webIfc=null,this.onDisposed.trigger(De.uuid),this.onDisposed.reset()}async setup(t){this.settings={...this.settings,...t},this.settings.autoSetWasm&&await this.autoSetWasm(),this.onSetup.trigger()}async load(t,e=!0){const i=performance.now();this.onIfcStartedLoading.trigger(),await this.readIfcFile(t);const o=await this.getAllGeometries(),n=await this._propertyExporter.export(this.webIfc,0);o.setLocalProperties(n),this.cleanUp();const r=this.components.get(at);r.groups.set(o.uuid,o);for(const a of o.items)r.list.set(a.id,a),a.mesh.uuid=a.id,a.group=o;return r.onFragmentsLoaded.trigger(o),e&&r.coordinate([o]),console.log(`Streaming the IFC took ${performance.now()-i} ms!`),o}async readIfcFile(t){const{path:e,absolute:i,logLevel:o}=this.settings.wasm;return this.webIfc.SetWasmPath(e,i),await this.webIfc.Init(),o&&this.webIfc.SetLogLevel(o),this.webIfc.OpenModel(t,this.settings.webIfc)}async getAllGeometries(){this._spatialTree.setUp(this.webIfc);const t=this.webIfc.GetIfcEntityList(0),e=new Ht.FragmentsGroup,{FILE_NAME:i,FILE_DESCRIPTION:o}=b;e.ifcMetadata={name:this._metaData.get(this.webIfc,i),description:this._metaData.get(this.webIfc,o),schema:this.webIfc.GetModelSchema(0)||"IFC2X3",maxExpressID:this.webIfc.GetMaxExpressID(0)};const n=[];for(const a of t){if(!this.webIfc.IsIfcElement(a)&&a!==b.IFCSPACE||this.settings.excludedCategories.has(a))continue;const l=this.webIfc.GetLineIDsWithType(0,a),E=l.size();for(let d=0;d<E;d++){const h=l.get(d);n.push(h);const u=this._spatialTree.itemsByFloor[h]||0;e.data.set(h,[[],[u,a]])}}this._spatialTree.cleanUp(),this.webIfc.StreamMeshes(0,n,a=>{this.getMesh(a,e)});for(const a of this._visitedFragments){const{index:l,fragment:E}=a[1];e.keyFragments.set(l,E.id)}for(const a of e.items){const l=this._fragmentInstances.get(a.id);if(!l)throw new Error("Fragment not found!");const E=[];for(const[d,h]of l)E.push(h);a.add(E)}const r=this.webIfc.GetCoordinationMatrix(0);return e.coordinationMatrix.fromArray(r),e.civilData=this._civil.read(this.webIfc),e}cleanUp(){this.webIfc=null,this.webIfc=new b.IfcAPI,this._visitedFragments.clear(),this._fragmentInstances.clear()}getMesh(t,e){const i=t.geometries.size(),o=t.expressID;for(let n=0;n<i;n++){const r=t.geometries.get(n),{x:a,y:l,z:E,w:d}=r.color,h=d!==1,{geometryExpressID:u}=r,p=`${u}-${h}`;if(!this._visitedFragments.has(p)){const R=this.getGeometry(this.webIfc,u),O=h?this._materialT:this._material,_=new Ht.Fragment(R,O,1);e.add(_.mesh),e.items.push(_);const y=this._visitedFragments.size;this._visitedFragments.set(p,{index:y,fragment:_})}const A=new S.Color().setRGB(a,l,E,"srgb"),F=new S.Matrix4;F.fromArray(r.flatTransformation);const T=this._visitedFragments.get(p);if(T===void 0)throw new Error("Error getting geometry data for streaming!");const m=e.data.get(o);if(!m)throw new Error("Data not found!");m[0].push(T.index);const{fragment:g}=T;this._fragmentInstances.has(g.id)||this._fragmentInstances.set(g.id,new Map);const f=this._fragmentInstances.get(g.id);if(!f)throw new Error("Instances not found!");if(f.has(o)){const R=f.get(o);if(!R)throw new Error("Instance not found!");R.transforms.push(F),R.colors&&R.colors.push(A)}else f.set(o,{id:o,transforms:[F],colors:[A]})}}getGeometry(t,e){const i=t.GetGeometry(0,e),o=t.GetIndexArray(i.GetIndexData(),i.GetIndexDataSize()),n=t.GetVertexArray(i.GetVertexData(),i.GetVertexDataSize()),r=new Float32Array(n.length/2),a=new Float32Array(n.length/2);for(let h=0;h<n.length;h+=6)r[h/2]=n[h],r[h/2+1]=n[h+1],r[h/2+2]=n[h+2],a[h/2]=n[h+3],a[h/2+1]=n[h+4],a[h/2+2]=n[h+5];const l=new S.BufferGeometry,E=new S.BufferAttribute(r,3),d=new S.BufferAttribute(a,3);return l.setAttribute("position",E),l.setAttribute("normal",d),l.setIndex(Array.from(o)),i.delete(),l}async autoSetWasm(){const t=await fetch(`https://unpkg.com/openbim-components@${hs.release}/package.json`);if(!t.ok){console.warn("Couldn't get openbim-components package.json. Set wasm settings manually.");return}const e=await t.json();if(!("web-ifc"in e.peerDependencies))console.warn("Couldn't get web-ifc from peer dependencies in openbim-components. Set wasm settings manually.");else{const i=e.peerDependencies["web-ifc"];this.settings.wasm.path=`https://unpkg.com/web-ifc@${i}/`,this.settings.wasm.absolute=!0}}};I(De,"uuid","a659add7-1418-4771-a0d6-7d4d438e4624");let us=De;const wt=class wt extends tt{constructor(t){super(t);I(this,"onDisposed",new D);I(this,"onRequestFile",new D);I(this,"ifcToExport",null);I(this,"onElementToPset",new D);I(this,"onPropToPset",new D);I(this,"onPsetRemoved",new D);I(this,"onDataChanged",new D);I(this,"wasm",{path:"/",absolute:!1});I(this,"enabled",!0);I(this,"attributeListeners",{});I(this,"selectedModel");I(this,"_changeMap",{});this.components.add(wt.uuid,this)}get(){return this._changeMap}dispose(){this.selectedModel=void 0,this.attributeListeners={},this._changeMap={},this.onElementToPset.reset(),this.onPropToPset.reset(),this.onPsetRemoved.reset(),this.onDataChanged.reset(),this.onDisposed.trigger(wt.uuid),this.onDisposed.reset()}increaseMaxID(t){return t.ifcMetadata.maxExpressID++,t.ifcMetadata.maxExpressID}static getIFCSchema(t){const e=t.ifcMetadata.schema;if(!e)throw new Error("IFC Schema not found");return e}newGUID(t){const e=wt.getIFCSchema(t);return new b[e].IfcGloballyUniqueId(re.create())}async getOwnerHistory(t){const e=await t.getAllPropertiesOfType(b.IFCOWNERHISTORY);if(!e)throw new Error("No OwnerHistory was found.");const i=Object.keys(e).map(r=>parseInt(r,10)),o=e[i[0]],n=new b.Handle(o.expressID);return{ownerHistory:o,ownerHistoryHandle:n}}registerChange(t,...e){this._changeMap[t.uuid]||(this._changeMap[t.uuid]=new Set);for(const i of e)this._changeMap[t.uuid].add(i),this.onDataChanged.trigger({model:t,expressID:i})}async setData(t,...e){for(const i of e){const o=i.expressID;o&&(await t.setProperties(o,i),this.registerChange(t,o))}}async newPset(t,e,i){const o=wt.getIFCSchema(t),{ownerHistoryHandle:n}=await this.getOwnerHistory(t),r=this.newGUID(t),a=new b[o].IfcLabel(e),l=i?new b[o].IfcText(i):null,E=new b[o].IfcPropertySet(r,n,a,l,[]);E.expressID=this.increaseMaxID(t);const d=this.newGUID(t),h=new b[o].IfcRelDefinesByProperties(d,n,null,null,[],new b.Handle(E.expressID));return h.expressID=this.increaseMaxID(t),await this.setData(t,E,h),{pset:E,rel:h}}async removePset(t,...e){for(const i of e){const o=await t.getProperties(i);if((o==null?void 0:o.type)!==b.IFCPROPERTYSET)continue;const n=await ft.getPsetRel(t,i);if(n&&(await t.setProperties(n,null),this.registerChange(t,n)),o){for(const r of o.HasProperties)await t.setProperties(r.value,null);await t.setProperties(i,null),this.onPsetRemoved.trigger({model:t,psetID:i}),this.registerChange(t,i)}}}async newSingleProperty(t,e,i,o){const n=wt.getIFCSchema(t),r=new b[n].IfcIdentifier(i),a=new b[n][e](o),l=new b[n].IfcPropertySingleValue(r,null,a,null);return l.expressID=this.increaseMaxID(t),await this.setData(t,l),l}newSingleStringProperty(t,e,i,o){return this.newSingleProperty(t,e,i,o)}newSingleNumericProperty(t,e,i,o){return this.newSingleProperty(t,e,i,o)}newSingleBooleanProperty(t,e,i,o){return this.newSingleProperty(t,e,i,o)}async removePsetProp(t,e,i){const o=await t.getProperties(e),n=await t.getProperties(i);!o||!n||o.type===b.IFCPROPERTYSET&&n&&(o.HasProperties=o.HasProperties.filter(r=>r.value!==i),await t.setProperties(i,null),this.registerChange(t,e,i))}async addElementToPset(t,e,...i){const o=await ft.getPsetRel(t,e);if(!o)return;const n=await t.getProperties(o);if(n){for(const r of i){const a=new b.Handle(r);n.RelatedObjects.push(a),this.onElementToPset.trigger({model:t,psetID:e,elementID:r})}this.registerChange(t,e)}}async addPropToPset(t,e,...i){const o=await t.getProperties(e);if(o){for(const n of i){if(o.HasProperties.includes(n))continue;const r=new b.Handle(n);o.HasProperties.push(r),this.onPropToPset.trigger({model:t,psetID:e,propID:n})}this.registerChange(t,e)}}async saveToIfc(t,e){const i=this.components.get(us),o=i.webIfc,n=await i.readIfcFile(e),r=this._changeMap[t.uuid]??[];for(const l of r){const E=await t.getProperties(l);if(E)try{o.WriteLine(n,E)}catch{}else try{o.DeleteLine(n,l)}catch{}}const a=o.SaveModel(n);return i.webIfc.CloseModel(n),i.cleanUp(),a}async setAttributeListener(t,e,i){this.attributeListeners[t.uuid]||(this.attributeListeners[t.uuid]={});const o=this.attributeListeners[t.uuid][e]?this.attributeListeners[t.uuid][e][i]:null;if(o)return o;const n=await t.getProperties(e);if(!n)throw new Error(`Entity with expressID ${e} doesn't exists.`);const r=n[i];if(Array.isArray(r)||!r)throw new Error(`Attribute ${i} is array or null, and it can't have a listener.`);const a=r.value;if(a===void 0||a==null)throw new Error(`Attribute ${i} has a badly defined handle.`);const l=new D;return Object.defineProperty(n[i],"value",{get(){return this._value},async set(E){this._value=E,l.trigger(E)}}),n[i].value=a,this.attributeListeners[t.uuid][e]||(this.attributeListeners[t.uuid][e]={}),this.attributeListeners[t.uuid][e][i]=l,l}};I(wt,"uuid","58c2d9f0-183c-48d6-a402-dfcf5b9a34df");let Ei=wt;const ms=class ms extends tt{constructor(t){super(t);I(this,"enabled",!0);I(this,"_groupSystems",{});I(this,"onDisposed",new D);I(this,"onFragmentsDisposed",t=>{const{groupID:e,fragmentIDs:i}=t;for(const o in this._groupSystems){const n=this._groupSystems[o],r=Object.keys(n);if(r.includes(e))delete n[e],Object.values(n).length===0&&delete this._groupSystems[o];else for(const a of r){const l=n[a];for(const E of i)delete l[E];Object.values(l).length===0&&delete n[a]}}});t.add(ms.uuid,this),t.get(at).onFragmentsDisposed.add(this.onFragmentsDisposed)}get(){return this._groupSystems}dispose(){this._groupSystems={},this.components.get(at).onFragmentsDisposed.remove(this.onFragmentsDisposed),this.onDisposed.trigger(),this.onDisposed.reset()}remove(t){for(const e in this._groupSystems){const i=this._groupSystems[e];for(const o in i){const n=i[o];delete n[t]}}}find(t){const e=this.components.get(at);if(!t){const r={};for(const[a,l]of e.list)r[a]=new Set(l.ids);return r}const i=Object.keys(t).length,o={};for(const r in t){const a=t[r];if(!this._groupSystems[r]){console.warn(`Classification ${r} does not exist.`);continue}for(const l of a){const E=this._groupSystems[r][l];if(E)for(const d in E){o[d]||(o[d]=new Map);for(const h of E[d]){const u=o[d].get(h);u===void 0?o[d].set(h,1):o[d].set(h,u+1)}}}}const n={};for(const r in o){const a=o[r];for(const[l,E]of a){if(E===void 0)throw new Error("Malformed fragments map!");E===i&&(n[r]||(n[r]=new Set),n[r].add(l))}}return n}byModel(t,e){this._groupSystems.model||(this._groupSystems.model={});const i=this._groupSystems.model;i[t]||(i[t]={});const o=i[t];for(const[n,r]of e.data){const a=r[0];for(const l of a){const E=e.keyFragments.get(l);E&&(o[E]||(o[E]=new Set),o[E].add(n))}}}async byPredefinedType(t){var o;this._groupSystems.predefinedTypes||(this._groupSystems.predefinedTypes={});const e=this._groupSystems.predefinedTypes,i=t.getAllPropertiesIDs();for(const n of i){const r=await t.getProperties(n);if(!r)continue;const a=String((o=r.PredefinedType)==null?void 0:o.value).toUpperCase();e[a]||(e[a]={});const l=e[a];for(const[E,d]of t.data){const h=d[0];for(const u of h){const p=t.keyFragments.get(u);if(!p)throw new Error("Fragment ID not found!");l[p]||(l[p]=new Set),l[p].add(r.expressID)}}}}byEntity(t){this._groupSystems.entities||(this._groupSystems.entities={});for(const[e,i]of t.data){const n=i[1][1],r=mi[n];this.saveItem(t,"entities",r,e)}}byStorey(t){for(const[e,i]of t.data){const r=i[1][0].toString();this.saveItem(t,"storeys",r,e)}}async byIfcRel(t,e,i){ft.isRel(e)&&await ft.getRelationMap(t,e,async(o,n)=>{const{name:r}=await ft.getEntityName(t,o);for(const a of n)this.saveItem(t,i,r??"NO REL NAME",a)})}saveItem(t,e,i,o){this._groupSystems[e]||(this._groupSystems[e]={});const n=t.data.get(o);if(n)for(const r of n[0]){const a=t.keyFragments.get(r);if(a){const l=this._groupSystems[e];l[i]||(l[i]={}),l[i][a]||(l[i][a]=new Set),l[i][a].add(o)}}}};I(ms,"uuid","e25a7f3c-46c4-4a14-9d3d-5115f24ebeb7");let Is=ms;const Ue=class Ue extends tt{constructor(t){super(t);I(this,"enabled",!1);I(this,"height",10);I(this,"groupName","storeys");I(this,"onDisposed",new D);I(this,"list",new Set);t.add(Ue.uuid,this)}dispose(){this.list.clear(),this.onDisposed.trigger(Ue.uuid),this.onDisposed.reset()}explode(){this.enabled=!0,this.update()}reset(){this.enabled=!1,this.update()}update(){const t=this.components.get(Is),e=this.components.get(at),i=this.enabled?1:-1;let o=0;const r=t.get()[this.groupName],a=new S.Matrix4;for(const l in r){a.elements[13]=o*i*this.height;for(const E in r[l]){const d=e.list.get(E),h=l+E,u=this.list.has(h);if(!d||this.enabled&&u||!this.enabled&&!u)continue;this.enabled?this.list.add(h):this.list.delete(h);const p=r[l][E];d.applyTransform(p,a)}o++}}};I(Ue,"uuid","d260618b-ce88-4c7d-826c-6debb91de3e2");let di=Ue;const Rs=class Rs extends tt{constructor(t){super(t);I(this,"enabled",!0);this.components.add(Rs.uuid,this)}set(t,e){const i=this.components.get(at);if(!e){for(const o in i.list){const n=i.list.get(o);n&&(n.setVisibility(t),this.updateCulledVisibility(n))}return}for(const o in e){const n=e[o],r=i.list.get(o);r&&(r.setVisibility(t,n),this.updateCulledVisibility(r))}}isolate(t){this.set(!1),this.set(!0,t)}updateCulledVisibility(t){const e=this.components.get(ds);for(const[i,o]of e.list){const n=o.colorMeshes.get(t.id);n&&(n.count=t.mesh.count)}}};I(Rs,"uuid","dd9ccf2d-8a21-4821-b7f6-2949add16a29");let ui=Rs;class Pn extends Ri{constructor(){super(...arguments);I(this,"minGeometrySize",10);I(this,"minAssetsSize",1e3)}}class Mn extends Ri{constructor(){super(...arguments);I(this,"propertiesSize",100)}}class wn extends tt{constructor(){super(...arguments);I(this,"onPropertiesStreamed",new D);I(this,"onProgress",new D);I(this,"onIndicesStreamed",new D);I(this,"onDisposed",new D);I(this,"enabled",!0);I(this,"settings",new Mn);I(this,"webIfc",new b.IfcAPI)}async dispose(){this.onIndicesStreamed.reset(),this.onPropertiesStreamed.reset(),this.webIfc=null,this.onDisposed.reset()}async streamFromBuffer(t){const e=performance.now();await this.readIfcFile(t),await this.streamAllProperties(),this.cleanUp(),console.log(`Streaming the IFC took ${performance.now()-e} ms!`)}async streamFromCallBack(t){const e=performance.now();await this.streamIfcFile(t),await this.streamAllProperties(),this.cleanUp(),console.log(`Streaming the IFC took ${performance.now()-e} ms!`)}async readIfcFile(t){const{path:e,absolute:i,logLevel:o}=this.settings.wasm;this.webIfc.SetWasmPath(e,i),await this.webIfc.Init(),o&&this.webIfc.SetLogLevel(o),this.webIfc.OpenModel(t,this.settings.webIfc)}async streamIfcFile(t){const{path:e,absolute:i,logLevel:o}=this.settings.wasm;this.webIfc.SetWasmPath(e,i),await this.webIfc.Init(),o&&this.webIfc.SetLogLevel(o),this.webIfc.OpenModelFromCallback(t,this.settings.webIfc)}async streamAllProperties(){const{propertiesSize:t}=this.settings,e=new Set(this.webIfc.GetIfcEntityList(0)),i=[b.IFCRELDEFINESBYPROPERTIES,b.IFCRELDEFINESBYTYPE,b.IFCRELASSOCIATESMATERIAL,b.IFCRELCONTAINEDINSPATIALSTRUCTURE,b.IFCRELASSOCIATESCLASSIFICATION,b.IFCRELASSIGNSTOGROUP],o=new Map,n=new Set([b.IFCPROJECT,b.IFCSITE,b.IFCBUILDING,b.IFCBUILDINGSTOREY,b.IFCSPACE]);for(const E of n)e.add(E);let r=.01,a=0;for(const E of e){if(a++,On.has(E))continue;const d=n.has(E),h=this.webIfc.GetLineIDsWithType(0,E),u=h.size();let p=0;for(let F=0;F<u-t;F+=t){const T={};for(let m=0;m<t;m++){p++;const g=h.get(F+m);try{const f=this.webIfc.GetLine(0,g,d);i.includes(E)&&this.getIndices(f,g,o),T[f.expressID]=f}catch{console.log(`Could not get property: ${g}`)}}await this.onPropertiesStreamed.trigger({type:E,data:T})}if(p!==u){const F={};for(let T=p;T<u;T++){const m=h.get(T);try{const g=this.webIfc.GetLine(0,m,d);i.includes(E)&&this.getIndices(g,m,o),F[g.expressID]=g}catch{console.log(`Could not get property: ${m}`)}}await this.onPropertiesStreamed.trigger({type:E,data:F})}const A=a/e.size;A>r&&(r+=.01,r=Math.max(r,A),await this.onProgress.trigger(Math.round(r*100)/100))}const l=[];for(const[E,d]of o)l.push([E,...d]);await this.onIndicesStreamed.trigger(l)}getIndices(t,e,i){const o=t.RelatedObjects||t.RelatedElements;if(!o){console.log(`Related objects not found: ${e}`);return}const n=t.RelatingType||t.RelatingMaterial||t.RelatingStructure||t.RelatingPropertyDefinition||t.RelatingGroup||t.RelatingClassification;if(!n){console.log(`Relating object not found: ${e}`);return}if(!Array.isArray(o)||n.value===void 0)return;const r=n.value;for(const a of o){if(a.value===void 0||a.value===null)continue;const l=a.value;i.has(l)||i.set(l,new Set),i.get(l).add(r)}}cleanUp(){this.webIfc=null,this.webIfc=new b.IfcAPI}}I(wn,"uuid","88d2c89c-ce32-47d7-8cb6-d51e4b311a0b");const As=class As extends tt{constructor(t){super(t);I(this,"onGeometryStreamed",new D);I(this,"onAssetStreamed",new D);I(this,"onProgress",new D);I(this,"onIfcLoaded",new D);I(this,"onDisposed",new D);I(this,"settings",new Pn);I(this,"enabled",!0);I(this,"webIfc",new b.IfcAPI);I(this,"_spatialTree",new yn);I(this,"_metaData",new Ln);I(this,"_visitedGeometries",new Map);I(this,"_streamSerializer",new Ht.StreamSerializer);I(this,"_geometries",new Map);I(this,"_geometryCount",0);I(this,"_civil",new Nn);I(this,"_groupSerializer",new Ht.Serializer);I(this,"_assets",[]);I(this,"_meshesWithHoles",new Set);this.components.add(As.uuid,this),this.settings.excludedCategories.add(b.IFCOPENINGELEMENT)}dispose(){this.onIfcLoaded.reset(),this.onGeometryStreamed.reset(),this.onAssetStreamed.reset(),this.webIfc=null,this.onDisposed.trigger(),this.onDisposed.reset()}async streamFromBuffer(t){const e=performance.now();await this.readIfcFile(t),await this.streamAllGeometries(),this.cleanUp(),console.log(`Streaming the IFC took ${performance.now()-e} ms!`)}async streamFromCallBack(t){const e=performance.now();await this.streamIfcFile(t),await this.streamAllGeometries(),this.cleanUp(),console.log(`Streaming the IFC took ${performance.now()-e} ms!`)}async readIfcFile(t){const{path:e,absolute:i,logLevel:o}=this.settings.wasm;this.webIfc.SetWasmPath(e,i),await this.webIfc.Init(),o&&this.webIfc.SetLogLevel(o),this.webIfc.OpenModel(t,this.settings.webIfc)}async streamIfcFile(t){const{path:e,absolute:i,logLevel:o}=this.settings.wasm;this.webIfc.SetWasmPath(e,i),await this.webIfc.Init(),o&&this.webIfc.SetLogLevel(o),this.webIfc.OpenModelFromCallback(t,this.settings.webIfc)}async streamAllGeometries(){const{minGeometrySize:t,minAssetsSize:e}=this.settings;this._spatialTree.setUp(this.webIfc);const i=this.webIfc.GetIfcEntityList(0),o=[[]],n=new Ht.FragmentsGroup,{FILE_NAME:r,FILE_DESCRIPTION:a}=b;n.ifcMetadata={name:this._metaData.get(this.webIfc,r),description:this._metaData.get(this.webIfc,a),schema:this.webIfc.GetModelSchema(0)||"IFC2X3",maxExpressID:this.webIfc.GetMaxExpressID(0)};let l=0,E=0;for(const m of i){if(!this.webIfc.IsIfcElement(m)&&m!==b.IFCSPACE||this.settings.excludedCategories.has(m))continue;const g=this.webIfc.GetLineIDsWithType(0,m),f=g.size();for(let R=0;R<f;R++){l>t&&(l=0,E++,o.push([]));const O=g.get(R);if(O!==9056429)continue;o[E].push(O);const _=this._spatialTree.itemsByFloor[O]||0;n.data.set(O,[[],[_,m]]),l++}}this._spatialTree.cleanUp();let d=.01,h=0;for(const m of o){h++,this.webIfc.StreamMeshes(0,m,f=>{this.getMesh(this.webIfc,f,n)}),this._geometryCount>t&&await this.streamGeometries(),this._assets.length>e&&await this.streamAssets();const g=h/o.length;g>d&&(d+=.01,d=Math.max(d,g),this.onProgress.trigger(Math.round(d*100)/100))}this._geometryCount&&await this.streamGeometries(),this._assets.length&&await this.streamAssets();const{opaque:u,transparent:p}=n.geometryIDs;for(const[m,{index:g,uuid:f}]of this._visitedGeometries)n.keyFragments.set(g,f),(m>1?u:p).set(m,g);const A=n.data.keys();for(const m of A){const[g]=n.data.get(m);g.length||n.data.delete(m)}const F=this.webIfc.GetCoordinationMatrix(0);n.coordinationMatrix.fromArray(F),n.civilData=this._civil.read(this.webIfc);const T=this._groupSerializer.export(n);this.onIfcLoaded.trigger(T),n.dispose(!0)}cleanUp(){this.webIfc=null,this.webIfc=new b.IfcAPI,this._visitedGeometries.clear(),this._geometries.clear(),this._assets=[],this._meshesWithHoles.clear()}getMesh(t,e,i){const o=e.geometries.size(),n=e.expressID,r={id:n,geometries:[]};for(let a=0;a<o;a++){const l=e.geometries.get(a),E=l.geometryExpressID,d=l.color.w===1?1:-1,h=E*d;if(!this._visitedGeometries.has(h)){this._visitedGeometries.has(E)||this.getGeometry(t,E);const R=this._visitedGeometries.size,O=S.MathUtils.generateUUID();this._visitedGeometries.set(h,{uuid:O,index:R})}const u=this._visitedGeometries.get(h);if(u===void 0)throw new Error("Error getting geometry data for streaming!");const p=i.data.get(n);if(!p)throw new Error("Data not found!");p[0].push(u.index);const{x:A,y:F,z:T,w:m}=l.color,g=[A,F,T,m],f=l.flatTransformation;r.geometries.push({color:g,geometryID:E,transformation:f})}this._assets.push(r)}getGeometry(t,e){const i=t.GetGeometry(0,e),o=t.GetIndexArray(i.GetIndexData(),i.GetIndexDataSize()),n=t.GetVertexArray(i.GetVertexData(),i.GetVertexDataSize()),r=new Float32Array(n.length/2),a=new Float32Array(n.length/2);for(let u=0;u<n.length;u+=6)r[u/2]=n[u],r[u/2+1]=n[u+1],r[u/2+2]=n[u+2],a[u/2]=n[u+3],a[u/2+1]=n[u+4],a[u/2+2]=n[u+5];const l=fn(r),E=new Float32Array(l.transformation.elements),d=[l.center.x,l.center.y,l.center.z];let h=!1;for(let u=0;u<r.length-2;u+=3){const p=r[u],A=r[u+1],F=r[u+2],T=a[u],m=a[u+1],g=a[u+2];if(pn(d,[p,A,F],[T,m,g])){h=!0;break}}this._geometries.set(e,{position:r,normal:a,index:o,boundingBox:E,hasHoles:h}),i.delete(),this._geometryCount++}async streamAssets(){await this.onAssetStreamed.trigger(this._assets),this._assets=null,this._assets=[]}async streamGeometries(){let t=this._streamSerializer.export(this._geometries),e={};for(const[i,{boundingBox:o,hasHoles:n}]of this._geometries)e[i]={boundingBox:o,hasHoles:n};this.onGeometryStreamed.trigger({data:e,buffer:t}),e=null,t=null,this._geometries.clear(),this._geometryCount=0}};I(As,"uuid","d9999a00-e1f5-4d3f-8cfe-c56e08609764");let Ii=As;class Dn{constructor(s){I(this,"enabled",!1);I(this,"id","FirstPerson");this.camera=s}set(s){if(this.enabled=s,s){if(this.camera.getProjection()!=="Perspective"){this.camera.setNavigationMode("Orbit");return}this.setupFirstPersonCamera()}}setupFirstPersonCamera(){const s=this.camera.controls,t=new S.Vector3;s.distance--,s.getPosition(t),s.minDistance=1,s.maxDistance=1,s.distance=1,s.moveTo(t.x,t.y,t.z),s.truckSpeed=50,s.mouseButtons.wheel=nt.ACTION.DOLLY,s.touches.two=nt.ACTION.TOUCH_ZOOM_TRUCK}}class Un{constructor(s){I(this,"enabled",!0);I(this,"id","Orbit");this.camera=s,this.activateOrbitControls()}set(s){this.enabled=s,s&&this.activateOrbitControls()}activateOrbitControls(){const s=this.camera.controls;s.minDistance=1,s.maxDistance=300;const t=new S.Vector3;s.getPosition(t);const e=t.length();s.distance=e,s.truckSpeed=2;const{rotation:i}=this.camera.get(),o=new S.Vector3(0,0,-1).applyEuler(i),n=t.addScaledVector(o,e);s.moveTo(n.x,n.y,n.z)}}class xn{constructor(s){I(this,"enabled",!1);I(this,"id","Plan");I(this,"mouseAction1");I(this,"mouseAction2");I(this,"mouseInitialized",!1);I(this,"defaultAzimuthSpeed");I(this,"defaultPolarSpeed");this.camera=s,this.defaultAzimuthSpeed=s.controls.azimuthRotateSpeed,this.defaultPolarSpeed=s.controls.polarRotateSpeed}set(s){this.enabled=s;const t=this.camera.controls;t.azimuthRotateSpeed=s?0:this.defaultAzimuthSpeed,t.polarRotateSpeed=s?0:this.defaultPolarSpeed,this.mouseInitialized||(this.mouseAction1=t.touches.one,this.mouseAction2=t.touches.two,this.mouseInitialized=!0),s?(t.mouseButtons.left=nt.ACTION.TRUCK,t.touches.one=nt.ACTION.TOUCH_TRUCK,t.touches.two=nt.ACTION.TOUCH_ZOOM):(t.mouseButtons.left=nt.ACTION.ROTATE,t.touches.one=this.mouseAction1,t.touches.two=this.mouseAction2)}}class bn{constructor(s){I(this,"onChanged",new D);I(this,"current","Perspective");I(this,"camera");I(this,"_component");I(this,"_previousDistance",-1);I(this,"matchOrthoDistanceEnabled",!1);this._component=s,this.camera=s.three}async set(s){this.current!==s&&(s==="Orthographic"?this.setOrthoCamera():await this.setPerspectiveCamera(),this.onChanged.trigger())}async toggle(){const t=this.current==="Perspective"?"Orthographic":"Perspective";await this.set(t)}setOrthoCamera(){if(this._component.mode.id==="FirstPerson")return;this._previousDistance=this._component.controls.distance,this._component.controls.distance=200;const s=this.getDims();if(!s)return;const{width:t,height:e}=s;this.setupOrthoCamera(e,t),this.camera=this._component.threeOrtho,this.current="Orthographic"}getDims(){const s=this._component.currentWorld;if(!s||!s.renderer)return null;const t=new S.Vector3;this._component.three.getWorldDirection(t);const e=new S.Vector3;this._component.controls.getTarget(e);const o=e.clone().sub(this._component.three.position).dot(t),n=s.renderer.getSize(),r=n.x/n.y,a=this._component.three,l=o*2*Math.atan(a.fov*(Math.PI/180)/2);return{width:l*r,height:l}}setupOrthoCamera(s,t){this._component.controls.mouseButtons.wheel=nt.ACTION.ZOOM,this._component.controls.mouseButtons.middle=nt.ACTION.ZOOM;const e=this._component.three,i=this._component.threeOrtho;i.zoom=1,i.left=t/-2,i.right=t/2,i.top=s/2,i.bottom=s/-2,i.updateProjectionMatrix(),i.position.copy(e.position),i.quaternion.copy(e.quaternion),this._component.controls.camera=i}getDistance(){const s=this._component.three,t=this._component.threeOrtho;return(t.top-t.bottom)/t.zoom/(2*Math.atan(s.fov*(Math.PI/180)/2))}async setPerspectiveCamera(){this._component.controls.mouseButtons.wheel=nt.ACTION.DOLLY,this._component.controls.mouseButtons.middle=nt.ACTION.DOLLY;const s=this._component.three,t=this._component.threeOrtho;s.position.copy(t.position),s.quaternion.copy(t.quaternion),this._component.controls.mouseButtons.wheel=nt.ACTION.DOLLY,this.matchOrthoDistanceEnabled?this._component.controls.distance=this.getDistance():this._component.controls.distance=this._previousDistance,await this._component.controls.zoomTo(1),s.updateProjectionMatrix(),this._component.controls.camera=s,this.camera=s,this.current="Perspective"}}class Sr extends ce{constructor(t){super(t);I(this,"mode");I(this,"projection");I(this,"threeOrtho");I(this,"_userInputButtons",{});I(this,"_frustumSize",50);I(this,"_navigationModes",new Map);this.threeOrtho=this.newOrthoCamera(),this._navigationModes.set("Orbit",new Un(this)),this._navigationModes.set("FirstPerson",new Dn(this)),this._navigationModes.set("Plan",new xn(this)),this.mode=this._navigationModes.get("Orbit"),this.mode.set(!0,{preventTargetAdjustment:!0}),this.projection=new bn(this),this.onAspectUpdated.add(()=>this.setOrthoCameraAspect())}get current(){return this.projection.camera}dispose(){super.dispose(),this.threeOrtho.removeFromParent()}set(t){if(this.mode.id!==t){if(this.mode.set(!1),!this._navigationModes.has(t))throw new Error("The specified mode does not exist!");this.mode=this._navigationModes.get(t),this.mode.set(!0)}}async fit(t,e=1.5){if(!this.enabled)return;const i=Number.MAX_VALUE,o=Number.MIN_VALUE,n=new S.Vector3(i,i,i),r=new S.Vector3(o,o,o);for(const u of t){const p=new S.Box3().setFromObject(u);p.min.x<n.x&&(n.x=p.min.x),p.min.y<n.y&&(n.y=p.min.y),p.min.z<n.z&&(n.z=p.min.z),p.max.x>r.x&&(r.x=p.max.x),p.max.y>r.y&&(r.y=p.max.y),p.max.z>r.z&&(r.z=p.max.z)}const a=new S.Box3(n,r),l=new S.Vector3;a.getSize(l);const E=new S.Vector3;a.getCenter(E);const d=Math.max(l.x,l.y,l.z)*e,h=new S.Sphere(E,d);await this.controls.fitToSphere(h,!0)}setUserInput(t){t?this.enableUserInput():this.disableUserInput()}disableUserInput(){this._userInputButtons.left=this.controls.mouseButtons.left,this._userInputButtons.right=this.controls.mouseButtons.right,this._userInputButtons.middle=this.controls.mouseButtons.middle,this._userInputButtons.wheel=this.controls.mouseButtons.wheel,this.controls.mouseButtons.left=0,this.controls.mouseButtons.right=0,this.controls.mouseButtons.middle=0,this.controls.mouseButtons.wheel=0}enableUserInput(){Object.keys(this._userInputButtons).length!==0&&(this.controls.mouseButtons.left=this._userInputButtons.left,this.controls.mouseButtons.right=this._userInputButtons.right,this.controls.mouseButtons.middle=this._userInputButtons.middle,this.controls.mouseButtons.wheel=this._userInputButtons.wheel)}newOrthoCamera(){const t=window.innerWidth/window.innerHeight;return new S.OrthographicCamera(this._frustumSize*t/-2,this._frustumSize*t/2,this._frustumSize/2,this._frustumSize/-2,.1,1e3)}setOrthoCameraAspect(){if(!this.currentWorld||!this.currentWorld.renderer)return;const t=this.currentWorld.renderer.getSize(),e=t.x/t.y;this.threeOrtho.left=-this._frustumSize*e/2,this.threeOrtho.right=this._frustumSize*e/2,this.threeOrtho.top=this._frustumSize/2,this.threeOrtho.bottom=-this._frustumSize/2,this.threeOrtho.updateProjectionMatrix()}}class _r{static getFace(s,t,e){if(!s.geometry.index)throw new Error("Geometry must be indexed!");const i=new Map,o=s.geometry.index.array,{plane:n}=this.getFaceData(t,e,s),r=[];for(let d=0;d<o.length/3;d++){const{plane:h,edges:u}=this.getFaceData(d,e,s);if(h.equals(n)){r.push({index:d,edges:u});for(const{id:p,points:A,distance:F}of u)i.set(p,{points:A,distance:F})}}let a=0;const l=new Map,E=new Map;for(const{index:d,edges:h}of r){const u=new Map;for(const{id:f}of h)if(l.has(f)){const R=l.get(f);u.set(f,R)}const p=h.map(f=>f.id);if(!u.size){const f=a++;for(const{id:R}of h)l.set(R,f);E.set(f,{edges:new Set(p),indices:new Set([d])});continue}let A=null;const F=new Set,T=new Set(p);for(const[f,R]of u){A===null?A=R:R!==A&&F.add(R),l.delete(f);const{edges:O}=E.get(R);O.delete(f),T.delete(f)}if(A===null)throw new Error("Error computing face!");const m=E.get(A),{indices:g}=m;g.add(d);for(const f of T){l.set(f,A);const{edges:R}=m;R.add(f)}for(const f of F){const R=E.get(f),{edges:O,indices:_}=R,y=E.get(A),{edges:N,indices:P}=y;for(const w of O)N.add(w),l.set(w,A);for(const w of _)P.add(w);E.delete(f)}}for(const[d,{indices:h,edges:u}]of E)if(h.has(t)){const p=[];for(const A of u){const F=i.get(A);p.push(F)}return{edges:p,indices:h}}return null}static distanceFromPointToLine(s,t,e,i=!1){const o=new S.Line3,n=new S.Vector3;return o.set(t,e),o.closestPointToPoint(s,i,n),n.distanceTo(s)}static getFaceData(s,t,e){const i=this.getVerticesAndNormal(e,s,t),{p1:o,p2:n,p3:r,faceNormal:a}=i;this.round(o),this.round(n),this.round(r),this.round(a);const l=[{id:`${o.x}|${o.y}|${o.z}`,value:o},{id:`${n.x}|${n.y}|${n.z}`,value:n},{id:`${r.x}|${r.y}|${r.z}`,value:r}];l.sort((m,g)=>m.id<g.id?-1:m.id>g.id?1:0);const[{id:E,value:d},{id:h,value:u},{id:p,value:A}]=l,F=[{id:`${E}|${h}`,distance:d.distanceTo(u),points:[d,u]},{id:`${h}|${p}`,distance:u.distanceTo(A),points:[u,A]},{id:`${E}|${p}`,distance:d.distanceTo(A),points:[d,A]}],T=new S.Plane;return T.setFromNormalAndCoplanarPoint(a,o),T.constant=Math.round(T.constant*10)/10,{plane:T,edges:F}}static getVerticesAndNormal(s,t,e){if(!s.geometry.index)throw new Error("Geometry must be indexed!");const i=s.geometry.index.array,o=s.geometry.attributes.position.array,n=s.geometry.attributes.normal.array,r=i[t*3]*3,a=i[t*3+1]*3,l=i[t*3+2]*3,E=new S.Vector3(o[r],o[r+1],o[r+2]),d=new S.Vector3(o[a],o[a+1],o[a+2]),h=new S.Vector3(o[l],o[l+1],o[l+2]),u=new S.Vector3(n[r],n[r+1],n[r+2]),p=new S.Vector3(n[a],n[a+1],n[a+2]),A=new S.Vector3(n[l],n[l+1],n[l+2]),F=(u.x+p.x+A.x)/3,T=(u.y+p.y+A.y)/3,m=(u.z+p.z+A.z)/3,g=new S.Vector3(F,T,m);if(!g.x&&!g.y&&!g.z&&console.log("hey"),e!==void 0&&s instanceof S.InstancedMesh){const f=new S.Matrix4;s.getMatrixAt(e,f);const R=new S.Matrix4;R.extractRotation(f),g.applyMatrix4(R),E.applyMatrix4(f),d.applyMatrix4(f),h.applyMatrix4(f)}return{p1:E,p2:d,p3:h,faceNormal:g}}static round(s){s.x=Math.trunc(s.x*1e3)/1e3,s.y=Math.trunc(s.y*1e3)/1e3,s.z=Math.trunc(s.z*1e3)/1e3}}exports.AsyncEvent=En;exports.Base=Os;exports.BaseCamera=dn;exports.BaseRenderer=un;exports.BaseScene=In;exports.BaseWorldItem=Ss;exports.Clipper=ai;exports.Component=tt;exports.Components=hs;exports.CullerRenderer=Fn;exports.Cullers=ds;exports.Disposer=yt;exports.Event=D;exports.FirstPersonMode=Dn;exports.FragmentBoundingBox=li;exports.FragmentClassifier=Is;exports.FragmentExploder=di;exports.FragmentHider=ui;exports.FragmentIfcLoader=us;exports.FragmentIfcStreamConverter=Ii;exports.FragmentManager=at;exports.FragmentPropsStreamConverter=wn;exports.Grids=Rn;exports.IfcCategories=Fr;exports.IfcCategoryMap=mi;exports.IfcElements=_n;exports.IfcJsonExporter=Sn;exports.IfcPropertiesFinder=gr;exports.IfcPropertiesManager=Ei;exports.IfcPropertiesUtils=ft;exports.IfcRelationsIndexer=hi;exports.IfcStreamingSettings=Pn;exports.Materials=ci;exports.MaterialsUtils=ri;exports.MeasurementUtils=_r;exports.MeshCullerRenderer=gn;exports.OrbitMode=Un;exports.OrthoPerspectiveCamera=Sr;exports.PlanMode=xn;exports.ProjectionManager=bn;exports.PropertiesStreamingSettings=Mn;exports.Raycasters=ae;exports.SimpleCamera=ce;exports.SimplePlane=_s;exports.SimpleRenderer=rr;exports.SimpleScene=or;exports.SimpleWorld=Cn;exports.UUID=re;exports.VertexPicker=sr;exports.Worlds=Es;exports.isPointInFrontOfPlane=pn;exports.obbFromPoints=fn;exports.readPixelsAsync=An;
88
+ `,o=new Blob([i],{type:"application/javascript"});this.worker=new Worker(URL.createObjectURL(o))}dispose(){this.enabled=!1;for(const s of this.scene.children)s.removeFromParent();this.onViewUpdated.reset(),this.worker.terminate(),this.renderer.dispose(),this.renderTarget.dispose(),this._buffer=null,this.onDisposed.reset()}getAvailableColor(){let s=BigInt(this._availableColor.toString());const t=[];do t.unshift(Number(s%256n)),s/=256n;while(s);for(;t.length!==3;)t.unshift(0);const[e,i,o]=t,n=`${e}-${i}-${o}`;return{r:e,g:i,b:o,code:n}}increaseColor(){if(this._availableColor===256*256*256){console.warn("Color can't be increased over 256 x 256 x 256!");return}this._availableColor++}decreaseColor(){if(this._availableColor===1){console.warn("Color can't be decreased under 0!");return}this._availableColor--}applySettings(s){s&&(s.updateInterval!==void 0&&(this.updateInterval=s.updateInterval),s.height!==void 0&&(this._height=s.height),s.width!==void 0&&(this._width=s.width),s.autoUpdate!==void 0&&(this.autoUpdate=s.autoUpdate))}}class yn extends _n{constructor(t,e,i){super(t,e,i);I(this,"threshold",100);I(this,"onViewUpdated",new D);I(this,"colorMeshes",new Map);I(this,"isProcessing",!1);I(this,"_colorCodeMeshMap",new Map);I(this,"_meshIDColorCodeMap",new Map);I(this,"_currentVisibleMeshes",new Set);I(this,"_recentlyHiddenMeshes",new Set);I(this,"_intervalID",null);I(this,"_transparentMat",new S.MeshBasicMaterial({transparent:!0,opacity:0}));I(this,"handleWorkerMessage",async t=>{if(this.isProcessing)return;const e=t.data.colors;this._recentlyHiddenMeshes=new Set(this._currentVisibleMeshes),this._currentVisibleMeshes.clear();for(const[i,o]of e){if(o<this.threshold)continue;const n=this._colorCodeMeshMap.get(i);n&&(this._currentVisibleMeshes.add(n),this._recentlyHiddenMeshes.delete(n))}this.onViewUpdated.trigger({seen:this._currentVisibleMeshes,unseen:this._recentlyHiddenMeshes}),this._isWorkerBusy=!1});this.worker.addEventListener("message",this.handleWorkerMessage),this.autoUpdate&&window.setInterval(async()=>{this.isProcessing||await this.updateVisibility()},this.updateInterval),this.onViewUpdated.add(({seen:o,unseen:n})=>{for(const r of o)r.visible=!0;for(const r of n)r.visible=!1})}dispose(){super.dispose(),this._intervalID!==null&&(window.clearInterval(this._intervalID),this._intervalID=null),this._currentVisibleMeshes.clear(),this._recentlyHiddenMeshes.clear(),this._meshIDColorCodeMap.clear(),this._transparentMat.dispose(),this._colorCodeMeshMap.clear();const t=this.components.get(yt);for(const e in this.colorMeshes){const i=this.colorMeshes.get(e);i&&t.destroy(i,!0)}this.colorMeshes.clear()}add(t){if(!this.enabled)return;if(this.isProcessing){console.log("Culler processing not finished yet.");return}this.isProcessing=!0;const e=t instanceof S.InstancedMesh,{geometry:i,material:o}=t,{colorMaterial:n,code:r}=this.getAvailableMaterial();let a;if(Array.isArray(o)){let d=!0;const h=[];for(const u of o)li.isTransparent(u)?h.push(this._transparentMat):(d=!1,h.push(n));if(d){n.dispose(),this.isProcessing=!1;return}a=h}else if(li.isTransparent(o)){n.dispose(),this.isProcessing=!1;return}else a=n;this._colorCodeMeshMap.set(r,t),this._meshIDColorCodeMap.set(t.uuid,r);const l=e?t.count:1,E=new S.InstancedMesh(i,a,l);e?E.instanceMatrix=t.instanceMatrix:E.setMatrixAt(0,new S.Matrix4),t.visible=!1,E.applyMatrix4(t.matrix),E.updateMatrix(),this.scene.add(E),this.colorMeshes.set(t.uuid,E),this.increaseColor(),this.isProcessing=!1}remove(t){if(this.isProcessing){console.log("Culler processing not finished yet.");return}this.isProcessing=!0;const e=this.components.get(yt);this._currentVisibleMeshes.delete(t),this._recentlyHiddenMeshes.delete(t);const i=this.colorMeshes.get(t.uuid),o=this._meshIDColorCodeMap.get(t.uuid);if(!i||!o){this.isProcessing=!1,console.log(t.visible);return}this._colorCodeMeshMap.delete(o),this._meshIDColorCodeMap.delete(t.uuid),this.colorMeshes.delete(t.uuid),i.geometry=void 0,i.material=[],e.destroy(i,!0),this._recentlyHiddenMeshes.delete(t),this._currentVisibleMeshes.delete(t),this.isProcessing=!1}getAvailableMaterial(){const{r:t,g:e,b:i,code:o}=this.getAvailableColor(),n=S.ColorManagement.enabled;S.ColorManagement.enabled=!1;const r=new S.Color(`rgb(${t}, ${e}, ${i})`);if(!this.world.renderer)throw new Error("Renderer not found in the world!");const a=this.world.renderer.clippingPlanes,l=new S.MeshBasicMaterial({color:r,clippingPlanes:a,side:S.DoubleSide});return S.ColorManagement.enabled=n,{colorMaterial:l,code:o}}}const we=class we extends ${constructor(t){super(t);I(this,"_enabled",!0);I(this,"list",new Map);I(this,"onDisposed",new D);t.add(we.uuid,this)}get enabled(){return this._enabled}set enabled(t){this._enabled=t;for(const[e,i]of this.list)i.enabled=t}create(t,e){if(this.list.has(t.uuid))return this.list.get(t.uuid);const i=new yn(this.components,t,e);return this.list.set(t.uuid,i),i}delete(t){const e=this.list.get(t.uuid);e&&e.dispose(),this.list.delete(t.uuid)}dispose(){this.enabled=!1,this.onDisposed.trigger(we.uuid),this.onDisposed.reset();for(const[t,e]of this.list)e.dispose();this.list.clear()}};I(we,"uuid","69f2a50d-c266-44fc-b1bd-fa4d34be89e6");let us=we;class Sr{constructor(s){I(this,"onDisposed",new D);I(this,"onAfterUpdate",new D);I(this,"onBeforeUpdate",new D);I(this,"onResize",new D);I(this,"frontOffset",0);I(this,"overrideMaterial",new S.MeshDepthMaterial);I(this,"backgroundColor",new S.Color(395274));I(this,"renderer");I(this,"enabled",!0);I(this,"world");I(this,"_lockRotation",!0);I(this,"_camera");I(this,"_plane");I(this,"_size",new S.Vector2(320,160));I(this,"_tempVector1",new S.Vector3);I(this,"_tempVector2",new S.Vector3);I(this,"_tempTarget",new S.Vector3);I(this,"down",new S.Vector3(0,-1,0));I(this,"updatePlanes",()=>{if(!this.world.renderer)throw new Error("The given world must have a renderer!");const s=[],t=this.world.renderer.three;for(const e of t.clippingPlanes)s.push(e);s.push(this._plane),this.renderer.clippingPlanes=s});if(this.world=s,!this.world.renderer)throw new Error("The given world must have a renderer!");this.renderer=new S.WebGLRenderer,this.renderer.setSize(this._size.x,this._size.y);const t=1,e=this._size.x/this._size.y;this._camera=new S.OrthographicCamera(t*e/-2,t*e/2,t/2,t/-2),this.world.renderer.onClippingPlanesUpdated.add(this.updatePlanes),this._camera.position.set(0,200,0),this._camera.zoom=.1,this._camera.rotation.x=-Math.PI/2,this._plane=new S.Plane(this.down,200),this.updatePlanes()}get lockRotation(){return this._lockRotation}set lockRotation(s){this._lockRotation=s,s&&(this._camera.rotation.z=0)}get zoom(){return this._camera.zoom}set zoom(s){this._camera.zoom=s,this._camera.updateProjectionMatrix()}dispose(){this.enabled=!1,this.onBeforeUpdate.reset(),this.onAfterUpdate.reset(),this.onResize.reset(),this.overrideMaterial.dispose(),this.renderer.dispose(),this.onDisposed.trigger(),this.onDisposed.reset()}get(){return this._camera}update(){if(!this.enabled)return;this.onBeforeUpdate.trigger();const s=this.world.scene.three,t=this.world.camera;if(!t.hasCameraControls())throw new Error("The given world must use camera controls!");if(!(s instanceof S.Scene))throw new Error("The given world must have a THREE.Scene as a root!");const e=t.controls;if(e.getPosition(this._tempVector1),this._camera.position.x=this._tempVector1.x,this._camera.position.z=this._tempVector1.z,this.frontOffset!==0&&(e.getTarget(this._tempVector2),this._tempVector2.sub(this._tempVector1),this._tempVector2.normalize().multiplyScalar(this.frontOffset),this._camera.position.x+=this._tempVector2.x,this._camera.position.z+=this._tempVector2.z),!this._lockRotation){e.getTarget(this._tempTarget);const o=Math.atan2(this._tempTarget.x-this._tempVector1.x,this._tempTarget.z-this._tempVector1.z);this._camera.rotation.z=o+Math.PI}this._plane.set(this.down,this._tempVector1.y);const i=s.background;s.background=this.backgroundColor,this.renderer.render(s,this._camera),s.background=i,this.onAfterUpdate.trigger()}getSize(){return this._size}resize(s){if(s){this._size.copy(s),this.renderer.setSize(s.x,s.y);const t=s.x/s.y,e=1;this._camera.left=e*t/-2,this._camera.right=e*t/2,this._camera.top=e/2,this._camera.bottom=-e/2,this._camera.updateProjectionMatrix(),this.onResize.trigger(s)}}}const Rs=class Rs extends ${constructor(t){super(t);I(this,"onAfterUpdate",new D);I(this,"onBeforeUpdate",new D);I(this,"onDisposed",new D);I(this,"enabled",!0);I(this,"list",new Map);this.components.add(Rs.uuid,this)}create(t){if(this.list.has(t.uuid))throw new Error("This world already has a minimap!");const e=new Sr(t);return this.list.set(t.uuid,e),e}delete(t){const e=this.list.get(t);e&&e.dispose(),this.list.delete(t)}dispose(){}update(){for(const[t,e]of this.list)e.update()}};I(Rs,"uuid","39ad6aad-84c8-4adf-a1e0-7f25313a9e7f");let di=Rs;class Nn{constructor(s){I(this,"enabled",!1);I(this,"id","FirstPerson");this.camera=s}set(s){if(this.enabled=s,s){if(this.camera.getProjection()!=="Perspective"){this.camera.setNavigationMode("Orbit");return}this.setupFirstPersonCamera()}}setupFirstPersonCamera(){const s=this.camera.controls,t=new S.Vector3;s.distance--,s.getPosition(t),s.minDistance=1,s.maxDistance=1,s.distance=1,s.moveTo(t.x,t.y,t.z),s.truckSpeed=50,s.mouseButtons.wheel=nt.ACTION.DOLLY,s.touches.two=nt.ACTION.TOUCH_ZOOM_TRUCK}}class Pn{constructor(s){I(this,"enabled",!0);I(this,"id","Orbit");this.camera=s,this.activateOrbitControls()}set(s){this.enabled=s,s&&this.activateOrbitControls()}activateOrbitControls(){const s=this.camera.controls;s.minDistance=1,s.maxDistance=300;const t=new S.Vector3;s.getPosition(t);const e=t.length();s.distance=e,s.truckSpeed=2;const{rotation:i}=this.camera.get(),o=new S.Vector3(0,0,-1).applyEuler(i),n=t.addScaledVector(o,e);s.moveTo(n.x,n.y,n.z)}}class Ln{constructor(s){I(this,"enabled",!1);I(this,"id","Plan");I(this,"mouseAction1");I(this,"mouseAction2");I(this,"mouseInitialized",!1);I(this,"defaultAzimuthSpeed");I(this,"defaultPolarSpeed");this.camera=s,this.defaultAzimuthSpeed=s.controls.azimuthRotateSpeed,this.defaultPolarSpeed=s.controls.polarRotateSpeed}set(s){this.enabled=s;const t=this.camera.controls;t.azimuthRotateSpeed=s?0:this.defaultAzimuthSpeed,t.polarRotateSpeed=s?0:this.defaultPolarSpeed,this.mouseInitialized||(this.mouseAction1=t.touches.one,this.mouseAction2=t.touches.two,this.mouseInitialized=!0),s?(t.mouseButtons.left=nt.ACTION.TRUCK,t.touches.one=nt.ACTION.TOUCH_TRUCK,t.touches.two=nt.ACTION.TOUCH_ZOOM):(t.mouseButtons.left=nt.ACTION.ROTATE,t.touches.one=this.mouseAction1,t.touches.two=this.mouseAction2)}}class Mn{constructor(s){I(this,"onChanged",new D);I(this,"current","Perspective");I(this,"camera");I(this,"_component");I(this,"_previousDistance",-1);I(this,"matchOrthoDistanceEnabled",!1);this._component=s,this.camera=s.three}async set(s){this.current!==s&&(s==="Orthographic"?this.setOrthoCamera():await this.setPerspectiveCamera(),this.onChanged.trigger())}async toggle(){const t=this.current==="Perspective"?"Orthographic":"Perspective";await this.set(t)}setOrthoCamera(){if(this._component.mode.id==="FirstPerson")return;this._previousDistance=this._component.controls.distance,this._component.controls.distance=200;const s=this.getDims();if(!s)return;const{width:t,height:e}=s;this.setupOrthoCamera(e,t),this.camera=this._component.threeOrtho,this.current="Orthographic"}getDims(){const s=this._component.currentWorld;if(!s||!s.renderer)return null;const t=new S.Vector3;this._component.three.getWorldDirection(t);const e=new S.Vector3;this._component.controls.getTarget(e);const o=e.clone().sub(this._component.three.position).dot(t),n=s.renderer.getSize(),r=n.x/n.y,a=this._component.three,l=o*2*Math.atan(a.fov*(Math.PI/180)/2);return{width:l*r,height:l}}setupOrthoCamera(s,t){this._component.controls.mouseButtons.wheel=nt.ACTION.ZOOM,this._component.controls.mouseButtons.middle=nt.ACTION.ZOOM;const e=this._component.three,i=this._component.threeOrtho;i.zoom=1,i.left=t/-2,i.right=t/2,i.top=s/2,i.bottom=s/-2,i.updateProjectionMatrix(),i.position.copy(e.position),i.quaternion.copy(e.quaternion),this._component.controls.camera=i}getDistance(){const s=this._component.three,t=this._component.threeOrtho;return(t.top-t.bottom)/t.zoom/(2*Math.atan(s.fov*(Math.PI/180)/2))}async setPerspectiveCamera(){this._component.controls.mouseButtons.wheel=nt.ACTION.DOLLY,this._component.controls.mouseButtons.middle=nt.ACTION.DOLLY;const s=this._component.three,t=this._component.threeOrtho;s.position.copy(t.position),s.quaternion.copy(t.quaternion),this._component.controls.mouseButtons.wheel=nt.ACTION.DOLLY,this.matchOrthoDistanceEnabled?this._component.controls.distance=this.getDistance():this._component.controls.distance=this._previousDistance,await this._component.controls.zoomTo(1),s.updateProjectionMatrix(),this._component.controls.camera=s,this.camera=s,this.current="Perspective"}}class _r extends le{constructor(t){super(t);I(this,"mode");I(this,"projection");I(this,"threeOrtho");I(this,"_userInputButtons",{});I(this,"_frustumSize",50);I(this,"_navigationModes",new Map);this.threeOrtho=this.newOrthoCamera(),this._navigationModes.set("Orbit",new Pn(this)),this._navigationModes.set("FirstPerson",new Nn(this)),this._navigationModes.set("Plan",new Ln(this)),this.mode=this._navigationModes.get("Orbit"),this.mode.set(!0,{preventTargetAdjustment:!0}),this.projection=new Mn(this),this.onAspectUpdated.add(()=>this.setOrthoCameraAspect())}get current(){return this.projection.camera}dispose(){super.dispose(),this.threeOrtho.removeFromParent()}set(t){if(this.mode.id!==t){if(this.mode.set(!1),!this._navigationModes.has(t))throw new Error("The specified mode does not exist!");this.mode=this._navigationModes.get(t),this.mode.set(!0)}}async fit(t,e=1.5){if(!this.enabled)return;const i=Number.MAX_VALUE,o=Number.MIN_VALUE,n=new S.Vector3(i,i,i),r=new S.Vector3(o,o,o);for(const u of t){const p=new S.Box3().setFromObject(u);p.min.x<n.x&&(n.x=p.min.x),p.min.y<n.y&&(n.y=p.min.y),p.min.z<n.z&&(n.z=p.min.z),p.max.x>r.x&&(r.x=p.max.x),p.max.y>r.y&&(r.y=p.max.y),p.max.z>r.z&&(r.z=p.max.z)}const a=new S.Box3(n,r),l=new S.Vector3;a.getSize(l);const E=new S.Vector3;a.getCenter(E);const d=Math.max(l.x,l.y,l.z)*e,h=new S.Sphere(E,d);await this.controls.fitToSphere(h,!0)}setUserInput(t){t?this.enableUserInput():this.disableUserInput()}disableUserInput(){this._userInputButtons.left=this.controls.mouseButtons.left,this._userInputButtons.right=this.controls.mouseButtons.right,this._userInputButtons.middle=this.controls.mouseButtons.middle,this._userInputButtons.wheel=this.controls.mouseButtons.wheel,this.controls.mouseButtons.left=0,this.controls.mouseButtons.right=0,this.controls.mouseButtons.middle=0,this.controls.mouseButtons.wheel=0}enableUserInput(){Object.keys(this._userInputButtons).length!==0&&(this.controls.mouseButtons.left=this._userInputButtons.left,this.controls.mouseButtons.right=this._userInputButtons.right,this.controls.mouseButtons.middle=this._userInputButtons.middle,this.controls.mouseButtons.wheel=this._userInputButtons.wheel)}newOrthoCamera(){const t=window.innerWidth/window.innerHeight;return new S.OrthographicCamera(this._frustumSize*t/-2,this._frustumSize*t/2,this._frustumSize/2,this._frustumSize/-2,.1,1e3)}setOrthoCameraAspect(){if(!this.currentWorld||!this.currentWorld.renderer)return;const t=this.currentWorld.renderer.getSize(),e=t.x/t.y;this.threeOrtho.left=-this._frustumSize*e/2,this.threeOrtho.right=this._frustumSize*e/2,this.threeOrtho.top=this._frustumSize/2,this.threeOrtho.bottom=-this._frustumSize/2,this.threeOrtho.updateProjectionMatrix()}}const mt=class mt extends ${constructor(t){super(t);I(this,"enabled",!0);I(this,"onDisposed",new D);I(this,"_absoluteMin");I(this,"_absoluteMax");I(this,"_meshes",[]);this.components.add(mt.uuid,this),this._absoluteMin=mt.newBound(!0),this._absoluteMax=mt.newBound(!1)}static getDimensions(t){const{min:e,max:i}=t,o=Math.abs(i.x-e.x),n=Math.abs(i.y-e.y),r=Math.abs(i.z-e.z),a=new S.Vector3;return a.subVectors(i,e).divideScalar(2).add(e),{width:o,height:n,depth:r,center:a}}static newBound(t){const e=t?1:-1;return new S.Vector3(e*Number.MAX_VALUE,e*Number.MAX_VALUE,e*Number.MAX_VALUE)}static getBounds(t,e,i){const o=i||this.newBound(!1),n=e||this.newBound(!0);for(const r of t)r.x<n.x&&(n.x=r.x),r.y<n.y&&(n.y=r.y),r.z<n.z&&(n.z=r.z),r.x>o.x&&(o.x=r.x),r.y>o.y&&(o.y=r.y),r.z>o.z&&(o.z=r.z);return new S.Box3(e,i)}dispose(){const t=this.components.get(yt);for(const e of this._meshes)t.destroy(e);this._meshes=[],this.onDisposed.trigger(mt.uuid),this.onDisposed.reset()}get(){const t=this._absoluteMin.clone(),e=this._absoluteMax.clone();return new S.Box3(t,e)}getSphere(){const t=this._absoluteMin.clone(),e=this._absoluteMax.clone(),i=Math.abs((e.x-t.x)/2),o=Math.abs((e.y-t.y)/2),n=Math.abs((e.z-t.z)/2),r=new S.Vector3(t.x+i,t.y+o,t.z+n),a=r.distanceTo(t);return new S.Sphere(r,a)}getMesh(){const t=new S.Box3(this._absoluteMin,this._absoluteMax),e=mt.getDimensions(t),{width:i,height:o,depth:n,center:r}=e,a=new S.BoxGeometry(i,o,n),l=new S.Mesh(a);return this._meshes.push(l),l.position.copy(r),l}reset(){this._absoluteMin=mt.newBound(!0),this._absoluteMax=mt.newBound(!1)}add(t){for(const e of t.items)this.addMesh(e.mesh)}addMesh(t,e){if(!t.geometry.index)return;const i=mt.getFragmentBounds(t);t.updateMatrixWorld();const o=t.matrixWorld,n=new S.Matrix4,r=t instanceof S.InstancedMesh,a=new Set;if(e&&t instanceof Ut.FragmentMesh)for(const l of e){const E=t.fragment.getInstancesIDs(l);if(E)for(const d of E)a.add(d)}else a.add(0);for(const l of a){const E=i.min.clone(),d=i.max.clone();r&&(t.getMatrixAt(l,n),E.applyMatrix4(n),d.applyMatrix4(n)),E.applyMatrix4(o),d.applyMatrix4(o),E.x<this._absoluteMin.x&&(this._absoluteMin.x=E.x),E.y<this._absoluteMin.y&&(this._absoluteMin.y=E.y),E.z<this._absoluteMin.z&&(this._absoluteMin.z=E.z),E.x>this._absoluteMax.x&&(this._absoluteMax.x=E.x),E.y>this._absoluteMax.y&&(this._absoluteMax.y=E.y),E.z>this._absoluteMax.z&&(this._absoluteMax.z=E.z),d.x>this._absoluteMax.x&&(this._absoluteMax.x=d.x),d.y>this._absoluteMax.y&&(this._absoluteMax.y=d.y),d.z>this._absoluteMax.z&&(this._absoluteMax.z=d.z),d.x<this._absoluteMin.x&&(this._absoluteMin.x=d.x),d.y<this._absoluteMin.y&&(this._absoluteMin.y=d.y),d.z<this._absoluteMin.z&&(this._absoluteMin.z=d.z)}}static getFragmentBounds(t){const e=t.geometry.attributes.position,i=Number.MAX_VALUE,o=-i,n=new S.Vector3(i,i,i),r=new S.Vector3(o,o,o);if(!t.geometry.index)throw new Error("Geometry must be indexed!");const a=Array.from(t.geometry.index.array);for(let l=0;l<a.length;l++){if(l%3===0&&a[l]===0&&a[l+1]===0&&a[l+2]===0){l+=2;continue}const E=a[l],d=e.getX(E),h=e.getY(E),u=e.getZ(E);d<n.x&&(n.x=d),h<n.y&&(n.y=h),u<n.z&&(n.z=u),d>r.x&&(r.x=d),h>r.y&&(r.y=h),u>r.z&&(r.z=u)}return new S.Box3(n,r)}};I(mt,"uuid","d1444724-dba6-4cdd-a0c7-68ee1450d166");let ui=mt;const Fi=new Set([1123145078,574549367,1675464909,2059837836,3798115385,32440307,3125803723,3207858831,2740243338,2624227202,4240577450,3615266464,3724593414,220341763,477187591,1878645084,1300840506,3303107099,1607154358,1878645084,846575682,1351298697,2417041796,3049322572,3331915920,1416205885,776857604,3285139300,3958052878,2827736869,2732653382,673634403,3448662350,4142052618,2924175390,803316827,2556980723,1809719519,2205249479,807026263,3737207727,1660063152,2347385850,3940055652,2705031697,3732776249,2485617015,2611217952,1704287377,2937912522,2770003689,1281925730,1484403080,3448662350,4142052618,3800577675,4006246654,3590301190,1383045692,2775532180,2047409740,370225590,3593883385,2665983363,4124623270,812098782,3649129432,987898635,1105321065,3510044353,1635779807,2603310189,3406155212,1310608509,4261334040,2736907675,3649129432,1136057603,1260505505,4182860854,2713105998,2898889636,59481748,3749851601,3486308946,3150382593,1062206242,3264961684,15328376,1485152156,370225590,1981873012,2859738748,45288368,2614616156,2732653382,775493141,2147822146,2601014836,2629017746,1186437898,2367409068,1213902940,3632507154,3900360178,476780140,1472233963,2804161546,3008276851,738692330,374418227,315944413,3905492369,3570813810,2571569899,178912537,2294589976,1437953363,2133299955,572779678,3092502836,388784114,2624227202,1425443689,3057273783,2347385850,1682466193,2519244187,2839578677,3958567839,2513912981,2830218821,427810014]);class wn{async export(s,t,e=!1,i=!0){const o={},n=new Set(s.GetIfcEntityList(t)),r=new Set([x.IFCPROJECT,x.IFCSITE,x.IFCBUILDING,x.IFCBUILDINGSTOREY,x.IFCSPACE]);for(const a of r)n.add(a);for(const a of n){if(Fi.has(a))continue;const l=r.has(a)&&i,E=s.GetLineIDsWithType(t,a);for(const d of E){const h=s.GetLine(0,d,l,e);o[h.expressID]=h}}return o}}const Dn={103090709:"IFCPROJECT",4097777520:"IFCSITE",4031249490:"IFCBUILDING",3124254112:"IFCBUILDINGSTOREY",3856911033:"IFCSPACE",1674181508:"IFCANNOTATION",25142252:"IFCCONTROLLER",32344328:"IFCBOILER",76236018:"IFCLAMP",90941305:"IFCPUMP",177149247:"IFCAIRTERMINALBOX",182646315:"IFCFLOWINSTRUMENT",263784265:"IFCFURNISHINGELEMENT",264262732:"IFCELECTRICGENERATOR",277319702:"IFCAUDIOVISUALAPPLIANCE",310824031:"IFCPIPEFITTING",331165859:"IFCSTAIR",342316401:"IFCDUCTFITTING",377706215:"IFCMECHANICALFASTENER",395920057:"IFCDOOR",402227799:"IFCELECTRICMOTOR",413509423:"IFCSYSTEMFURNITUREELEMENT",484807127:"IFCEVAPORATOR",486154966:"IFCWINDOWSTANDARDCASE",629592764:"IFCLIGHTFIXTURE",630975310:"IFCUNITARYCONTROLELEMENT",635142910:"IFCCABLECARRIERFITTING",639361253:"IFCCOIL",647756555:"IFCFASTENER",707683696:"IFCFLOWSTORAGEDEVICE",738039164:"IFCPROTECTIVEDEVICE",753842376:"IFCBEAM",812556717:"IFCTANK",819412036:"IFCFILTER",843113511:"IFCCOLUMN",862014818:"IFCELECTRICDISTRIBUTIONBOARD",900683007:"IFCFOOTING",905975707:"IFCCOLUMNSTANDARDCASE",926996030:"IFCVOIDINGFEATURE",979691226:"IFCREINFORCINGBAR",987401354:"IFCFLOWSEGMENT",1003880860:"IFCELECTRICTIMECONTROL",1051757585:"IFCCABLEFITTING",1052013943:"IFCDISTRIBUTIONCHAMBERELEMENT",1062813311:"IFCDISTRIBUTIONCONTROLELEMENT",1073191201:"IFCMEMBER",1095909175:"IFCBUILDINGELEMENTPROXY",1156407060:"IFCPLATESTANDARDCASE",1162798199:"IFCSWITCHINGDEVICE",1329646415:"IFCSHADINGDEVICE",1335981549:"IFCDISCRETEACCESSORY",1360408905:"IFCDUCTSILENCER",1404847402:"IFCSTACKTERMINAL",1426591983:"IFCFIRESUPPRESSIONTERMINAL",1437502449:"IFCMEDICALDEVICE",1509553395:"IFCFURNITURE",1529196076:"IFCSLAB",1620046519:"IFCTRANSPORTELEMENT",1634111441:"IFCAIRTERMINAL",1658829314:"IFCENERGYCONVERSIONDEVICE",1677625105:"IFCCIVILELEMENT",1687234759:"IFCPILE",1904799276:"IFCELECTRICAPPLIANCE",1911478936:"IFCMEMBERSTANDARDCASE",1945004755:"IFCDISTRIBUTIONELEMENT",1973544240:"IFCCOVERING",1999602285:"IFCSPACEHEATER",2016517767:"IFCROOF",2056796094:"IFCAIRTOAIRHEATRECOVERY",2058353004:"IFCFLOWCONTROLLER",2068733104:"IFCHUMIDIFIER",2176052936:"IFCJUNCTIONBOX",2188021234:"IFCFLOWMETER",2223149337:"IFCFLOWTERMINAL",2262370178:"IFCRAILING",2272882330:"IFCCONDENSER",2295281155:"IFCPROTECTIVEDEVICETRIPPINGUNIT",2320036040:"IFCREINFORCINGMESH",2347447852:"IFCTENDONANCHOR",2391383451:"IFCVIBRATIONISOLATOR",2391406946:"IFCWALL",2474470126:"IFCMOTORCONNECTION",2769231204:"IFCVIRTUALELEMENT",2814081492:"IFCENGINE",2906023776:"IFCBEAMSTANDARDCASE",2938176219:"IFCBURNER",2979338954:"IFCBUILDINGELEMENTPART",3024970846:"IFCRAMP",3026737570:"IFCTUBEBUNDLE",3027962421:"IFCSLABSTANDARDCASE",3040386961:"IFCDISTRIBUTIONFLOWELEMENT",3053780830:"IFCSANITARYTERMINAL",3079942009:"IFCOPENINGSTANDARDCASE",3087945054:"IFCALARM",3101698114:"IFCSURFACEFEATURE",3127900445:"IFCSLABELEMENTEDCASE",3132237377:"IFCFLOWMOVINGDEVICE",3171933400:"IFCPLATE",3221913625:"IFCCOMMUNICATIONSAPPLIANCE",3242481149:"IFCDOORSTANDARDCASE",3283111854:"IFCRAMPFLIGHT",3296154744:"IFCCHIMNEY",3304561284:"IFCWINDOW",3310460725:"IFCELECTRICFLOWSTORAGEDEVICE",3319311131:"IFCHEATEXCHANGER",3415622556:"IFCFAN",3420628829:"IFCSOLARDEVICE",3493046030:"IFCGEOGRAPHICELEMENT",3495092785:"IFCCURTAINWALL",3508470533:"IFCFLOWTREATMENTDEVICE",3512223829:"IFCWALLSTANDARDCASE",3518393246:"IFCDUCTSEGMENT",3571504051:"IFCCOMPRESSOR",3588315303:"IFCOPENINGELEMENT",3612865200:"IFCPIPESEGMENT",3640358203:"IFCCOOLINGTOWER",3651124850:"IFCPROJECTIONELEMENT",3694346114:"IFCOUTLET",3747195512:"IFCEVAPORATIVECOOLER",3758799889:"IFCCABLECARRIERSEGMENT",3824725483:"IFCTENDON",3825984169:"IFCTRANSFORMER",3902619387:"IFCCHILLER",4074379575:"IFCDAMPER",4086658281:"IFCSENSOR",4123344466:"IFCELEMENTASSEMBLY",4136498852:"IFCCOOLEDBEAM",4156078855:"IFCWALLELEMENTEDCASE",4175244083:"IFCINTERCEPTOR",4207607924:"IFCVALVE",4217484030:"IFCCABLESEGMENT",4237592921:"IFCWASTETERMINAL",4252922144:"IFCSTAIRFLIGHT",4278956645:"IFCFLOWFITTING",4288193352:"IFCACTUATOR",4292641817:"IFCUNITARYEQUIPMENT",3009204131:"IFCGRID"};class yr{getAll(s,t){const e={},i=Object.keys(Dn).map(o=>parseInt(o,10));for(let o=0;o<i.length;o++){const n=i[o],r=s.GetLineIDsWithType(t,n),a=r.size();for(let l=0;l<a;l++)e[r.get(l)]=n}return e}}const gi={950732822:"IFCURIREFERENCE",4075327185:"IFCTIME",1209108979:"IFCTEMPERATURERATEOFCHANGEMEASURE",3457685358:"IFCSOUNDPRESSURELEVELMEASURE",4157543285:"IFCSOUNDPOWERLEVELMEASURE",2798247006:"IFCPROPERTYSETDEFINITIONSET",1790229001:"IFCPOSITIVEINTEGER",525895558:"IFCNONNEGATIVELENGTHMEASURE",1774176899:"IFCLINEINDEX",1275358634:"IFCLANGUAGEID",2541165894:"IFCDURATION",3701338814:"IFCDAYINWEEKNUMBER",2195413836:"IFCDATETIME",937566702:"IFCDATE",1683019596:"IFCCARDINALPOINTREFERENCE",2314439260:"IFCBINARY",1500781891:"IFCAREADENSITYMEASURE",3683503648:"IFCARCINDEX",4065007721:"IFCYEARNUMBER",1718600412:"IFCWARPINGMOMENTMEASURE",51269191:"IFCWARPINGCONSTANTMEASURE",2593997549:"IFCVOLUMETRICFLOWRATEMEASURE",3458127941:"IFCVOLUMEMEASURE",3345633955:"IFCVAPORPERMEABILITYMEASURE",1278329552:"IFCTORQUEMEASURE",2591213694:"IFCTIMESTAMP",2726807636:"IFCTIMEMEASURE",743184107:"IFCTHERMODYNAMICTEMPERATUREMEASURE",2016195849:"IFCTHERMALTRANSMITTANCEMEASURE",857959152:"IFCTHERMALRESISTANCEMEASURE",2281867870:"IFCTHERMALEXPANSIONCOEFFICIENTMEASURE",2645777649:"IFCTHERMALCONDUCTIVITYMEASURE",232962298:"IFCTHERMALADMITTANCEMEASURE",296282323:"IFCTEXTTRANSFORMATION",603696268:"IFCTEXTFONTNAME",3490877962:"IFCTEXTDECORATION",1460886941:"IFCTEXTALIGNMENT",2801250643:"IFCTEXT",58845555:"IFCTEMPERATUREGRADIENTMEASURE",361837227:"IFCSPECULARROUGHNESS",2757832317:"IFCSPECULAREXPONENT",3477203348:"IFCSPECIFICHEATCAPACITYMEASURE",993287707:"IFCSOUNDPRESSUREMEASURE",846465480:"IFCSOUNDPOWERMEASURE",3471399674:"IFCSOLIDANGLEMEASURE",408310005:"IFCSHEARMODULUSMEASURE",2190458107:"IFCSECTIONALAREAINTEGRALMEASURE",3467162246:"IFCSECTIONMODULUSMEASURE",2766185779:"IFCSECONDINMINUTE",3211557302:"IFCROTATIONALSTIFFNESSMEASURE",1755127002:"IFCROTATIONALMASSMEASURE",2133746277:"IFCROTATIONALFREQUENCYMEASURE",200335297:"IFCREAL",96294661:"IFCRATIOMEASURE",3972513137:"IFCRADIOACTIVITYMEASURE",3665567075:"IFCPRESSUREMEASURE",2169031380:"IFCPRESENTABLETEXT",1364037233:"IFCPOWERMEASURE",1245737093:"IFCPOSITIVERATIOMEASURE",3054510233:"IFCPOSITIVEPLANEANGLEMEASURE",2815919920:"IFCPOSITIVELENGTHMEASURE",4042175685:"IFCPLANEANGLEMEASURE",2642773653:"IFCPLANARFORCEMEASURE",2260317790:"IFCPARAMETERVALUE",929793134:"IFCPHMEASURE",2395907400:"IFCNUMERICMEASURE",2095195183:"IFCNORMALISEDRATIOMEASURE",765770214:"IFCMONTHINYEARNUMBER",2615040989:"IFCMONETARYMEASURE",3114022597:"IFCMOMENTOFINERTIAMEASURE",1648970520:"IFCMOLECULARWEIGHTMEASURE",3177669450:"IFCMOISTUREDIFFUSIVITYMEASURE",1753493141:"IFCMODULUSOFSUBGRADEREACTIONMEASURE",1052454078:"IFCMODULUSOFROTATIONALSUBGRADEREACTIONMEASURE",2173214787:"IFCMODULUSOFLINEARSUBGRADEREACTIONMEASURE",3341486342:"IFCMODULUSOFELASTICITYMEASURE",102610177:"IFCMINUTEINHOUR",3531705166:"IFCMASSPERLENGTHMEASURE",3124614049:"IFCMASSMEASURE",4017473158:"IFCMASSFLOWRATEMEASURE",1477762836:"IFCMASSDENSITYMEASURE",2486716878:"IFCMAGNETICFLUXMEASURE",286949696:"IFCMAGNETICFLUXDENSITYMEASURE",151039812:"IFCLUMINOUSINTENSITYMEASURE",2755797622:"IFCLUMINOUSINTENSITYDISTRIBUTIONMEASURE",2095003142:"IFCLUMINOUSFLUXMEASURE",503418787:"IFCLOGICAL",3086160713:"IFCLINEARVELOCITYMEASURE",1307019551:"IFCLINEARSTIFFNESSMEASURE",2128979029:"IFCLINEARMOMENTMEASURE",191860431:"IFCLINEARFORCEMEASURE",1243674935:"IFCLENGTHMEASURE",3258342251:"IFCLABEL",2054016361:"IFCKINEMATICVISCOSITYMEASURE",3192672207:"IFCISOTHERMALMOISTURECAPACITYMEASURE",3686016028:"IFCIONCONCENTRATIONMEASURE",3809634241:"IFCINTEGERCOUNTRATEMEASURE",1939436016:"IFCINTEGER",2679005408:"IFCINDUCTANCEMEASURE",3358199106:"IFCILLUMINANCEMEASURE",983778844:"IFCIDENTIFIER",2589826445:"IFCHOURINDAY",1158859006:"IFCHEATINGVALUEMEASURE",3113092358:"IFCHEATFLUXDENSITYMEASURE",3064340077:"IFCGLOBALLYUNIQUEID",3044325142:"IFCFREQUENCYMEASURE",1361398929:"IFCFORCEMEASURE",2590844177:"IFCFONTWEIGHT",2715512545:"IFCFONTVARIANT",1102727119:"IFCFONTSTYLE",2078135608:"IFCENERGYMEASURE",2506197118:"IFCELECTRICVOLTAGEMEASURE",2951915441:"IFCELECTRICRESISTANCEMEASURE",3790457270:"IFCELECTRICCURRENTMEASURE",2093906313:"IFCELECTRICCONDUCTANCEMEASURE",3818826038:"IFCELECTRICCHARGEMEASURE",1827137117:"IFCELECTRICCAPACITANCEMEASURE",69416015:"IFCDYNAMICVISCOSITYMEASURE",524656162:"IFCDOSEEQUIVALENTMEASURE",4134073009:"IFCDIMENSIONCOUNT",1514641115:"IFCDESCRIPTIVEMEASURE",300323983:"IFCDAYLIGHTSAVINGHOUR",86635668:"IFCDAYINMONTHNUMBER",94842927:"IFCCURVATUREMEASURE",1778710042:"IFCCOUNTMEASURE",3238673880:"IFCCONTEXTDEPENDENTMEASURE",3812528620:"IFCCOMPOUNDPLANEANGLEMEASURE",2991860651:"IFCCOMPLEXNUMBER",1867003952:"IFCBOXALIGNMENT",2735952531:"IFCBOOLEAN",2650437152:"IFCAREAMEASURE",632304761:"IFCANGULARVELOCITYMEASURE",360377573:"IFCAMOUNTOFSUBSTANCEMEASURE",4182062534:"IFCACCELERATIONMEASURE",3699917729:"IFCABSORBEDDOSEMEASURE",1971632696:"IFCGEOSLICE",2680139844:"IFCGEOMODEL",24726584:"IFCELECTRICFLOWTREATMENTDEVICE",3693000487:"IFCDISTRIBUTIONBOARD",3460952963:"IFCCONVEYORSEGMENT",3999819293:"IFCCAISSONFOUNDATION",3314249567:"IFCBOREHOLE",4196446775:"IFCBEARING",325726236:"IFCALIGNMENT",3425753595:"IFCTRACKELEMENT",991950508:"IFCSIGNAL",3798194928:"IFCREINFORCEDSOIL",3290496277:"IFCRAIL",1383356374:"IFCPAVEMENT",2182337498:"IFCNAVIGATIONELEMENT",234836483:"IFCMOORINGDEVICE",2078563270:"IFCMOBILETELECOMMUNICATIONSAPPLIANCE",1638804497:"IFCLIQUIDTERMINAL",1154579445:"IFCLINEARPOSITIONINGELEMENT",2696325953:"IFCKERB",2713699986:"IFCGEOTECHNICALASSEMBLY",2142170206:"IFCELECTRICFLOWTREATMENTDEVICETYPE",3376911765:"IFCEARTHWORKSFILL",1077100507:"IFCEARTHWORKSELEMENT",3071239417:"IFCEARTHWORKSCUT",479945903:"IFCDISTRIBUTIONBOARDTYPE",3426335179:"IFCDEEPFOUNDATION",1502416096:"IFCCOURSE",2940368186:"IFCCONVEYORSEGMENTTYPE",3203706013:"IFCCAISSONFOUNDATIONTYPE",3862327254:"IFCBUILTSYSTEM",1876633798:"IFCBUILTELEMENT",963979645:"IFCBRIDGEPART",644574406:"IFCBRIDGE",3649138523:"IFCBEARINGTYPE",1662888072:"IFCALIGNMENTVERTICAL",317615605:"IFCALIGNMENTSEGMENT",1545765605:"IFCALIGNMENTHORIZONTAL",4266260250:"IFCALIGNMENTCANT",3956297820:"IFCVIBRATIONDAMPERTYPE",1530820697:"IFCVIBRATIONDAMPER",840318589:"IFCVEHICLE",1953115116:"IFCTRANSPORTATIONDEVICE",618700268:"IFCTRACKELEMENTTYPE",2281632017:"IFCTENDONCONDUITTYPE",3663046924:"IFCTENDONCONDUIT",42703149:"IFCSINESPIRAL",1894708472:"IFCSIGNALTYPE",3599934289:"IFCSIGNTYPE",33720170:"IFCSIGN",1027922057:"IFCSEVENTHORDERPOLYNOMIALSPIRAL",544395925:"IFCSEGMENTEDREFERENCECURVE",3649235739:"IFCSECONDORDERPOLYNOMIALSPIRAL",550521510:"IFCROADPART",146592293:"IFCROAD",3818125796:"IFCRELADHERESTOELEMENT",4021432810:"IFCREFERENT",1891881377:"IFCRAILWAYPART",3992365140:"IFCRAILWAY",1763565496:"IFCRAILTYPE",1946335990:"IFCPOSITIONINGELEMENT",514975943:"IFCPAVEMENTTYPE",506776471:"IFCNAVIGATIONELEMENTTYPE",710110818:"IFCMOORINGDEVICETYPE",1950438474:"IFCMOBILETELECOMMUNICATIONSAPPLIANCETYPE",976884017:"IFCMARINEPART",525669439:"IFCMARINEFACILITY",1770583370:"IFCLIQUIDTERMINALTYPE",2176059722:"IFCLINEARELEMENT",679976338:"IFCKERBTYPE",3948183225:"IFCIMPACTPROTECTIONDEVICETYPE",2568555532:"IFCIMPACTPROTECTIONDEVICE",2898700619:"IFCGRADIENTCURVE",1594536857:"IFCGEOTECHNICALSTRATUM",4230923436:"IFCGEOTECHNICALELEMENT",4228831410:"IFCFACILITYPARTCOMMON",1310830890:"IFCFACILITYPART",24185140:"IFCFACILITY",4234616927:"IFCDIRECTRIXDERIVEDREFERENCESWEPTAREASOLID",1306400036:"IFCDEEPFOUNDATIONTYPE",4189326743:"IFCCOURSETYPE",2000195564:"IFCCOSINESPIRAL",3497074424:"IFCCLOTHOID",1626504194:"IFCBUILTELEMENTTYPE",3651464721:"IFCVEHICLETYPE",1229763772:"IFCTRIANGULATEDIRREGULARNETWORK",3665877780:"IFCTRANSPORTATIONDEVICETYPE",782932809:"IFCTHIRDORDERPOLYNOMIALSPIRAL",2735484536:"IFCSPIRAL",1356537516:"IFCSECTIONEDSURFACE",1290935644:"IFCSECTIONEDSOLIDHORIZONTAL",1862484736:"IFCSECTIONEDSOLID",1441486842:"IFCRELPOSITIONS",1033248425:"IFCRELASSOCIATESPROFILEDEF",3381221214:"IFCPOLYNOMIALCURVE",2485787929:"IFCOFFSETCURVEBYDISTANCES",590820931:"IFCOFFSETCURVE",3465909080:"IFCINDEXEDPOLYGONALTEXTUREMAP",593015953:"IFCDIRECTRIXCURVESWEPTAREASOLID",4212018352:"IFCCURVESEGMENT",3425423356:"IFCAXIS2PLACEMENTLINEAR",823603102:"IFCSEGMENT",2165702409:"IFCPOINTBYDISTANCEEXPRESSION",182550632:"IFCOPENCROSSPROFILEDEF",388784114:"IFCLINEARPLACEMENT",536804194:"IFCALIGNMENTHORIZONTALSEGMENT",3752311538:"IFCALIGNMENTCANTSEGMENT",1010789467:"IFCTEXTURECOORDINATEINDICESWITHVOIDS",222769930:"IFCTEXTURECOORDINATEINDICES",2691318326:"IFCQUANTITYNUMBER",3633395639:"IFCALIGNMENTVERTICALSEGMENT",2879124712:"IFCALIGNMENTPARAMETERSEGMENT",25142252:"IFCCONTROLLER",3087945054:"IFCALARM",4288193352:"IFCACTUATOR",630975310:"IFCUNITARYCONTROLELEMENT",4086658281:"IFCSENSOR",2295281155:"IFCPROTECTIVEDEVICETRIPPINGUNIT",182646315:"IFCFLOWINSTRUMENT",1426591983:"IFCFIRESUPPRESSIONTERMINAL",819412036:"IFCFILTER",3415622556:"IFCFAN",1003880860:"IFCELECTRICTIMECONTROL",402227799:"IFCELECTRICMOTOR",264262732:"IFCELECTRICGENERATOR",3310460725:"IFCELECTRICFLOWSTORAGEDEVICE",862014818:"IFCELECTRICDISTRIBUTIONBOARD",1904799276:"IFCELECTRICAPPLIANCE",1360408905:"IFCDUCTSILENCER",3518393246:"IFCDUCTSEGMENT",342316401:"IFCDUCTFITTING",562808652:"IFCDISTRIBUTIONCIRCUIT",4074379575:"IFCDAMPER",3640358203:"IFCCOOLINGTOWER",4136498852:"IFCCOOLEDBEAM",2272882330:"IFCCONDENSER",3571504051:"IFCCOMPRESSOR",3221913625:"IFCCOMMUNICATIONSAPPLIANCE",639361253:"IFCCOIL",3902619387:"IFCCHILLER",4217484030:"IFCCABLESEGMENT",1051757585:"IFCCABLEFITTING",3758799889:"IFCCABLECARRIERSEGMENT",635142910:"IFCCABLECARRIERFITTING",2938176219:"IFCBURNER",32344328:"IFCBOILER",2906023776:"IFCBEAMSTANDARDCASE",277319702:"IFCAUDIOVISUALAPPLIANCE",2056796094:"IFCAIRTOAIRHEATRECOVERY",177149247:"IFCAIRTERMINALBOX",1634111441:"IFCAIRTERMINAL",486154966:"IFCWINDOWSTANDARDCASE",4237592921:"IFCWASTETERMINAL",4156078855:"IFCWALLELEMENTEDCASE",4207607924:"IFCVALVE",4292641817:"IFCUNITARYEQUIPMENT",3179687236:"IFCUNITARYCONTROLELEMENTTYPE",3026737570:"IFCTUBEBUNDLE",3825984169:"IFCTRANSFORMER",812556717:"IFCTANK",1162798199:"IFCSWITCHINGDEVICE",385403989:"IFCSTRUCTURALLOADCASE",1404847402:"IFCSTACKTERMINAL",1999602285:"IFCSPACEHEATER",3420628829:"IFCSOLARDEVICE",3027962421:"IFCSLABSTANDARDCASE",3127900445:"IFCSLABELEMENTEDCASE",1329646415:"IFCSHADINGDEVICE",3053780830:"IFCSANITARYTERMINAL",2572171363:"IFCREINFORCINGBARTYPE",1232101972:"IFCRATIONALBSPLINECURVEWITHKNOTS",90941305:"IFCPUMP",655969474:"IFCPROTECTIVEDEVICETRIPPINGUNITTYPE",738039164:"IFCPROTECTIVEDEVICE",1156407060:"IFCPLATESTANDARDCASE",3612865200:"IFCPIPESEGMENT",310824031:"IFCPIPEFITTING",3694346114:"IFCOUTLET",144952367:"IFCOUTERBOUNDARYCURVE",2474470126:"IFCMOTORCONNECTION",1911478936:"IFCMEMBERSTANDARDCASE",1437502449:"IFCMEDICALDEVICE",629592764:"IFCLIGHTFIXTURE",76236018:"IFCLAMP",2176052936:"IFCJUNCTIONBOX",4175244083:"IFCINTERCEPTOR",2068733104:"IFCHUMIDIFIER",3319311131:"IFCHEATEXCHANGER",2188021234:"IFCFLOWMETER",1209101575:"IFCEXTERNALSPATIALELEMENT",484807127:"IFCEVAPORATOR",3747195512:"IFCEVAPORATIVECOOLER",2814081492:"IFCENGINE",2417008758:"IFCELECTRICDISTRIBUTIONBOARDTYPE",3242481149:"IFCDOORSTANDARDCASE",3205830791:"IFCDISTRIBUTIONSYSTEM",400855858:"IFCCOMMUNICATIONSAPPLIANCETYPE",905975707:"IFCCOLUMNSTANDARDCASE",1677625105:"IFCCIVILELEMENT",3296154744:"IFCCHIMNEY",2674252688:"IFCCABLEFITTINGTYPE",2188180465:"IFCBURNERTYPE",1177604601:"IFCBUILDINGSYSTEM",39481116:"IFCBUILDINGELEMENTPARTTYPE",1136057603:"IFCBOUNDARYCURVE",2461110595:"IFCBSPLINECURVEWITHKNOTS",1532957894:"IFCAUDIOVISUALAPPLIANCETYPE",4088093105:"IFCWORKCALENDAR",4009809668:"IFCWINDOWTYPE",926996030:"IFCVOIDINGFEATURE",2391383451:"IFCVIBRATIONISOLATOR",2415094496:"IFCTENDONTYPE",3081323446:"IFCTENDONANCHORTYPE",413509423:"IFCSYSTEMFURNITUREELEMENT",3101698114:"IFCSURFACEFEATURE",3657597509:"IFCSTRUCTURALSURFACEACTION",2757150158:"IFCSTRUCTURALCURVEREACTION",1004757350:"IFCSTRUCTURALCURVEACTION",338393293:"IFCSTAIRTYPE",1072016465:"IFCSOLARDEVICETYPE",4074543187:"IFCSHADINGDEVICETYPE",2157484638:"IFCSEAMCURVE",2781568857:"IFCROOFTYPE",2310774935:"IFCREINFORCINGMESHTYPE",964333572:"IFCREINFORCINGELEMENTTYPE",683857671:"IFCRATIONALBSPLINESURFACEWITHKNOTS",1469900589:"IFCRAMPTYPE",2839578677:"IFCPOLYGONALFACESET",1158309216:"IFCPILETYPE",3079942009:"IFCOPENINGSTANDARDCASE",1114901282:"IFCMEDICALDEVICETYPE",3113134337:"IFCINTERSECTIONCURVE",3946677679:"IFCINTERCEPTORTYPE",2571569899:"IFCINDEXEDPOLYCURVE",3493046030:"IFCGEOGRAPHICELEMENT",1509553395:"IFCFURNITURE",1893162501:"IFCFOOTINGTYPE",2853485674:"IFCEXTERNALSPATIALSTRUCTUREELEMENT",4148101412:"IFCEVENT",132023988:"IFCENGINETYPE",2397081782:"IFCELEMENTASSEMBLYTYPE",2323601079:"IFCDOORTYPE",1213902940:"IFCCYLINDRICALSURFACE",1525564444:"IFCCONSTRUCTIONPRODUCTRESOURCETYPE",4105962743:"IFCCONSTRUCTIONMATERIALRESOURCETYPE",2185764099:"IFCCONSTRUCTIONEQUIPMENTRESOURCETYPE",15328376:"IFCCOMPOSITECURVEONSURFACE",3875453745:"IFCCOMPLEXPROPERTYTEMPLATE",3893394355:"IFCCIVILELEMENTTYPE",2197970202:"IFCCHIMNEYTYPE",167062518:"IFCBSPLINESURFACEWITHKNOTS",2887950389:"IFCBSPLINESURFACE",2603310189:"IFCADVANCEDBREPWITHVOIDS",1635779807:"IFCADVANCEDBREP",2916149573:"IFCTRIANGULATEDFACESET",1935646853:"IFCTOROIDALSURFACE",2387106220:"IFCTESSELLATEDFACESET",3206491090:"IFCTASKTYPE",699246055:"IFCSURFACECURVE",4095615324:"IFCSUBCONTRACTRESOURCETYPE",603775116:"IFCSTRUCTURALSURFACEREACTION",4015995234:"IFCSPHERICALSURFACE",2481509218:"IFCSPATIALZONETYPE",463610769:"IFCSPATIALZONE",710998568:"IFCSPATIALELEMENTTYPE",1412071761:"IFCSPATIALELEMENT",3663146110:"IFCSIMPLEPROPERTYTEMPLATE",3243963512:"IFCREVOLVEDAREASOLIDTAPERED",816062949:"IFCREPARAMETRISEDCOMPOSITECURVESEGMENT",1521410863:"IFCRELSPACEBOUNDARY2NDLEVEL",3523091289:"IFCRELSPACEBOUNDARY1STLEVEL",427948657:"IFCRELINTERFERESELEMENTS",307848117:"IFCRELDEFINESBYTEMPLATE",1462361463:"IFCRELDEFINESBYOBJECT",2565941209:"IFCRELDECLARES",1027710054:"IFCRELASSIGNSTOGROUPBYFACTOR",3521284610:"IFCPROPERTYTEMPLATE",492091185:"IFCPROPERTYSETTEMPLATE",653396225:"IFCPROJECTLIBRARY",569719735:"IFCPROCEDURETYPE",3967405729:"IFCPREDEFINEDPROPERTYSET",1682466193:"IFCPCURVE",428585644:"IFCLABORRESOURCETYPE",2294589976:"IFCINDEXEDPOLYGONALFACEWITHVOIDS",178912537:"IFCINDEXEDPOLYGONALFACE",4095422895:"IFCGEOGRAPHICELEMENTTYPE",2652556860:"IFCFIXEDREFERENCESWEPTAREASOLID",2804161546:"IFCEXTRUDEDAREASOLIDTAPERED",4024345920:"IFCEVENTTYPE",2629017746:"IFCCURVEBOUNDEDSURFACE",1815067380:"IFCCREWRESOURCETYPE",3419103109:"IFCCONTEXT",2574617495:"IFCCONSTRUCTIONRESOURCETYPE",2059837836:"IFCCARTESIANPOINTLIST3D",1675464909:"IFCCARTESIANPOINTLIST2D",574549367:"IFCCARTESIANPOINTLIST",3406155212:"IFCADVANCEDFACE",3698973494:"IFCTYPERESOURCE",3736923433:"IFCTYPEPROCESS",901063453:"IFCTESSELLATEDITEM",1096409881:"IFCSWEPTDISKSOLIDPOLYGONAL",1042787934:"IFCRESOURCETIME",1608871552:"IFCRESOURCECONSTRAINTRELATIONSHIP",2943643501:"IFCRESOURCEAPPROVALRELATIONSHIP",2090586900:"IFCQUANTITYSET",1482703590:"IFCPROPERTYTEMPLATEDEFINITION",3778827333:"IFCPREDEFINEDPROPERTIES",2998442950:"IFCMIRROREDPROFILEDEF",853536259:"IFCMATERIALRELATIONSHIP",3404854881:"IFCMATERIALPROFILESETUSAGETAPERING",3079605661:"IFCMATERIALPROFILESETUSAGE",2852063980:"IFCMATERIALCONSTITUENTSET",3708119e3:"IFCMATERIALCONSTITUENT",1585845231:"IFCLAGTIME",2133299955:"IFCINDEXEDTRIANGLETEXTUREMAP",1437953363:"IFCINDEXEDTEXTUREMAP",3570813810:"IFCINDEXEDCOLOURMAP",1437805879:"IFCEXTERNALREFERENCERELATIONSHIP",297599258:"IFCEXTENDEDPROPERTIES",211053100:"IFCEVENTTIME",2713554722:"IFCCONVERSIONBASEDUNITWITHOFFSET",3285139300:"IFCCOLOURRGBLIST",1236880293:"IFCWORKTIME",1199560280:"IFCTIMEPERIOD",3611470254:"IFCTEXTUREVERTEXLIST",2771591690:"IFCTASKTIMERECURRING",1549132990:"IFCTASKTIME",2043862942:"IFCTABLECOLUMN",2934153892:"IFCSURFACEREINFORCEMENTAREA",609421318:"IFCSTRUCTURALLOADORRESULT",3478079324:"IFCSTRUCTURALLOADCONFIGURATION",1054537805:"IFCSCHEDULINGTIME",2439245199:"IFCRESOURCELEVELRELATIONSHIP",2433181523:"IFCREFERENCE",3915482550:"IFCRECURRENCEPATTERN",986844984:"IFCPROPERTYABSTRACTION",3843373140:"IFCPROJECTEDCRS",677532197:"IFCPRESENTATIONITEM",1507914824:"IFCMATERIALUSAGEDEFINITION",552965576:"IFCMATERIALPROFILEWITHOFFSETS",164193824:"IFCMATERIALPROFILESET",2235152071:"IFCMATERIALPROFILE",1847252529:"IFCMATERIALLAYERWITHOFFSETS",760658860:"IFCMATERIALDEFINITION",3057273783:"IFCMAPCONVERSION",4294318154:"IFCEXTERNALINFORMATION",1466758467:"IFCCOORDINATEREFERENCESYSTEM",1785450214:"IFCCOORDINATEOPERATION",775493141:"IFCCONNECTIONVOLUMEGEOMETRY",979691226:"IFCREINFORCINGBAR",3700593921:"IFCELECTRICDISTRIBUTIONPOINT",1062813311:"IFCDISTRIBUTIONCONTROLELEMENT",1052013943:"IFCDISTRIBUTIONCHAMBERELEMENT",578613899:"IFCCONTROLLERTYPE",2454782716:"IFCCHAMFEREDGEFEATURE",753842376:"IFCBEAM",3001207471:"IFCALARMTYPE",2874132201:"IFCACTUATORTYPE",3304561284:"IFCWINDOW",3512223829:"IFCWALLSTANDARDCASE",2391406946:"IFCWALL",3313531582:"IFCVIBRATIONISOLATORTYPE",2347447852:"IFCTENDONANCHOR",3824725483:"IFCTENDON",2515109513:"IFCSTRUCTURALANALYSISMODEL",4252922144:"IFCSTAIRFLIGHT",331165859:"IFCSTAIR",1529196076:"IFCSLAB",1783015770:"IFCSENSORTYPE",1376911519:"IFCROUNDEDEDGEFEATURE",2016517767:"IFCROOF",2320036040:"IFCREINFORCINGMESH",3027567501:"IFCREINFORCINGELEMENT",3055160366:"IFCRATIONALBEZIERCURVE",3283111854:"IFCRAMPFLIGHT",3024970846:"IFCRAMP",2262370178:"IFCRAILING",3171933400:"IFCPLATE",1687234759:"IFCPILE",1073191201:"IFCMEMBER",900683007:"IFCFOOTING",3508470533:"IFCFLOWTREATMENTDEVICE",2223149337:"IFCFLOWTERMINAL",707683696:"IFCFLOWSTORAGEDEVICE",987401354:"IFCFLOWSEGMENT",3132237377:"IFCFLOWMOVINGDEVICE",4037862832:"IFCFLOWINSTRUMENTTYPE",4278956645:"IFCFLOWFITTING",2058353004:"IFCFLOWCONTROLLER",4222183408:"IFCFIRESUPPRESSIONTERMINALTYPE",1810631287:"IFCFILTERTYPE",346874300:"IFCFANTYPE",1658829314:"IFCENERGYCONVERSIONDEVICE",857184966:"IFCELECTRICALELEMENT",1634875225:"IFCELECTRICALCIRCUIT",712377611:"IFCELECTRICTIMECONTROLTYPE",1217240411:"IFCELECTRICMOTORTYPE",1365060375:"IFCELECTRICHEATERTYPE",1534661035:"IFCELECTRICGENERATORTYPE",3277789161:"IFCELECTRICFLOWSTORAGEDEVICETYPE",663422040:"IFCELECTRICAPPLIANCETYPE",855621170:"IFCEDGEFEATURE",2030761528:"IFCDUCTSILENCERTYPE",3760055223:"IFCDUCTSEGMENTTYPE",869906466:"IFCDUCTFITTINGTYPE",395920057:"IFCDOOR",3041715199:"IFCDISTRIBUTIONPORT",3040386961:"IFCDISTRIBUTIONFLOWELEMENT",1945004755:"IFCDISTRIBUTIONELEMENT",2063403501:"IFCDISTRIBUTIONCONTROLELEMENTTYPE",1599208980:"IFCDISTRIBUTIONCHAMBERELEMENTTYPE",2635815018:"IFCDISCRETEACCESSORYTYPE",1335981549:"IFCDISCRETEACCESSORY",4147604152:"IFCDIAMETERDIMENSION",3961806047:"IFCDAMPERTYPE",3495092785:"IFCCURTAINWALL",1973544240:"IFCCOVERING",2954562838:"IFCCOOLINGTOWERTYPE",335055490:"IFCCOOLEDBEAMTYPE",488727124:"IFCCONSTRUCTIONPRODUCTRESOURCE",1060000209:"IFCCONSTRUCTIONMATERIALRESOURCE",3898045240:"IFCCONSTRUCTIONEQUIPMENTRESOURCE",1163958913:"IFCCONDITIONCRITERION",2188551683:"IFCCONDITION",2816379211:"IFCCONDENSERTYPE",3850581409:"IFCCOMPRESSORTYPE",843113511:"IFCCOLUMN",2301859152:"IFCCOILTYPE",2611217952:"IFCCIRCLE",2951183804:"IFCCHILLERTYPE",1285652485:"IFCCABLESEGMENTTYPE",3293546465:"IFCCABLECARRIERSEGMENTTYPE",395041908:"IFCCABLECARRIERFITTINGTYPE",1909888760:"IFCBUILDINGELEMENTPROXYTYPE",1095909175:"IFCBUILDINGELEMENTPROXY",2979338954:"IFCBUILDINGELEMENTPART",52481810:"IFCBUILDINGELEMENTCOMPONENT",3299480353:"IFCBUILDINGELEMENT",231477066:"IFCBOILERTYPE",1916977116:"IFCBEZIERCURVE",819618141:"IFCBEAMTYPE",1967976161:"IFCBSPLINECURVE",3460190687:"IFCASSET",2470393545:"IFCANGULARDIMENSION",1871374353:"IFCAIRTOAIRHEATRECOVERYTYPE",3352864051:"IFCAIRTERMINALTYPE",1411407467:"IFCAIRTERMINALBOXTYPE",3821786052:"IFCACTIONREQUEST",1213861670:"IFC2DCOMPOSITECURVE",1033361043:"IFCZONE",3342526732:"IFCWORKSCHEDULE",4218914973:"IFCWORKPLAN",1028945134:"IFCWORKCONTROL",1133259667:"IFCWASTETERMINALTYPE",1898987631:"IFCWALLTYPE",2769231204:"IFCVIRTUALELEMENT",728799441:"IFCVALVETYPE",1911125066:"IFCUNITARYEQUIPMENTTYPE",1600972822:"IFCTUBEBUNDLETYPE",3593883385:"IFCTRIMMEDCURVE",1620046519:"IFCTRANSPORTELEMENT",1692211062:"IFCTRANSFORMERTYPE",1637806684:"IFCTIMESERIESSCHEDULE",5716631:"IFCTANKTYPE",2254336722:"IFCSYSTEM",2315554128:"IFCSWITCHINGDEVICETYPE",148013059:"IFCSUBCONTRACTRESOURCE",1975003073:"IFCSTRUCTURALSURFACECONNECTION",2986769608:"IFCSTRUCTURALRESULTGROUP",1235345126:"IFCSTRUCTURALPOINTREACTION",734778138:"IFCSTRUCTURALPOINTCONNECTION",2082059205:"IFCSTRUCTURALPOINTACTION",3987759626:"IFCSTRUCTURALPLANARACTIONVARYING",1621171031:"IFCSTRUCTURALPLANARACTION",1252848954:"IFCSTRUCTURALLOADGROUP",1721250024:"IFCSTRUCTURALLINEARACTIONVARYING",1807405624:"IFCSTRUCTURALLINEARACTION",2445595289:"IFCSTRUCTURALCURVEMEMBERVARYING",214636428:"IFCSTRUCTURALCURVEMEMBER",4243806635:"IFCSTRUCTURALCURVECONNECTION",1179482911:"IFCSTRUCTURALCONNECTION",682877961:"IFCSTRUCTURALACTION",1039846685:"IFCSTAIRFLIGHTTYPE",3112655638:"IFCSTACKTERMINALTYPE",3812236995:"IFCSPACETYPE",652456506:"IFCSPACEPROGRAM",1305183839:"IFCSPACEHEATERTYPE",3856911033:"IFCSPACE",2533589738:"IFCSLABTYPE",4097777520:"IFCSITE",4105383287:"IFCSERVICELIFE",3517283431:"IFCSCHEDULETIMECONTROL",1768891740:"IFCSANITARYTERMINALTYPE",2863920197:"IFCRELASSIGNSTASKS",160246688:"IFCRELAGGREGATES",2324767716:"IFCRAMPFLIGHTTYPE",2893384427:"IFCRAILINGTYPE",3248260540:"IFCRADIUSDIMENSION",2250791053:"IFCPUMPTYPE",1842657554:"IFCPROTECTIVEDEVICETYPE",3651124850:"IFCPROJECTIONELEMENT",3642467123:"IFCPROJECTORDERRECORD",2904328755:"IFCPROJECTORDER",2744685151:"IFCPROCEDURE",3740093272:"IFCPORT",3724593414:"IFCPOLYLINE",4017108033:"IFCPLATETYPE",4231323485:"IFCPIPESEGMENTTYPE",804291784:"IFCPIPEFITTINGTYPE",3327091369:"IFCPERMIT",2382730787:"IFCPERFORMANCEHISTORY",2837617999:"IFCOUTLETTYPE",3425660407:"IFCORDERACTION",3588315303:"IFCOPENINGELEMENT",4143007308:"IFCOCCUPANT",1916936684:"IFCMOVE",977012517:"IFCMOTORCONNECTIONTYPE",3181161470:"IFCMEMBERTYPE",2108223431:"IFCMECHANICALFASTENERTYPE",377706215:"IFCMECHANICALFASTENER",2506943328:"IFCLINEARDIMENSION",1161773419:"IFCLIGHTFIXTURETYPE",1051575348:"IFCLAMPTYPE",3827777499:"IFCLABORRESOURCE",4288270099:"IFCJUNCTIONBOXTYPE",2391368822:"IFCINVENTORY",1806887404:"IFCHUMIDIFIERTYPE",1251058090:"IFCHEATEXCHANGERTYPE",2706460486:"IFCGROUP",3009204131:"IFCGRID",200128114:"IFCGASTERMINALTYPE",814719939:"IFCFURNITURESTANDARD",263784265:"IFCFURNISHINGELEMENT",3009222698:"IFCFLOWTREATMENTDEVICETYPE",2297155007:"IFCFLOWTERMINALTYPE",1339347760:"IFCFLOWSTORAGEDEVICETYPE",1834744321:"IFCFLOWSEGMENTTYPE",1482959167:"IFCFLOWMOVINGDEVICETYPE",3815607619:"IFCFLOWMETERTYPE",3198132628:"IFCFLOWFITTINGTYPE",3907093117:"IFCFLOWCONTROLLERTYPE",1287392070:"IFCFEATUREELEMENTSUBTRACTION",2143335405:"IFCFEATUREELEMENTADDITION",2827207264:"IFCFEATUREELEMENT",2489546625:"IFCFASTENERTYPE",647756555:"IFCFASTENER",3737207727:"IFCFACETEDBREPWITHVOIDS",807026263:"IFCFACETEDBREP",3390157468:"IFCEVAPORATORTYPE",3174744832:"IFCEVAPORATIVECOOLERTYPE",3272907226:"IFCEQUIPMENTSTANDARD",1962604670:"IFCEQUIPMENTELEMENT",2107101300:"IFCENERGYCONVERSIONDEVICETYPE",1704287377:"IFCELLIPSE",2590856083:"IFCELEMENTCOMPONENTTYPE",1623761950:"IFCELEMENTCOMPONENT",4123344466:"IFCELEMENTASSEMBLY",1758889154:"IFCELEMENT",360485395:"IFCELECTRICALBASEPROPERTIES",3849074793:"IFCDISTRIBUTIONFLOWELEMENTTYPE",3256556792:"IFCDISTRIBUTIONELEMENTTYPE",681481545:"IFCDIMENSIONCURVEDIRECTEDCALLOUT",1457835157:"IFCCURTAINWALLTYPE",3295246426:"IFCCREWRESOURCE",1916426348:"IFCCOVERINGTYPE",1419761937:"IFCCOSTSCHEDULE",3895139033:"IFCCOSTITEM",3293443760:"IFCCONTROL",2559216714:"IFCCONSTRUCTIONRESOURCE",2510884976:"IFCCONIC",3732776249:"IFCCOMPOSITECURVE",300633059:"IFCCOLUMNTYPE",2937912522:"IFCCIRCLEHOLLOWPROFILEDEF",3124254112:"IFCBUILDINGSTOREY",1950629157:"IFCBUILDINGELEMENTTYPE",4031249490:"IFCBUILDING",1260505505:"IFCBOUNDEDCURVE",3649129432:"IFCBOOLEANCLIPPINGRESULT",1334484129:"IFCBLOCK",3207858831:"IFCASYMMETRICISHAPEPROFILEDEF",1674181508:"IFCANNOTATION",2296667514:"IFCACTOR",2097647324:"IFCTRANSPORTELEMENTTYPE",3473067441:"IFCTASK",1580310250:"IFCSYSTEMFURNITUREELEMENTTYPE",4124788165:"IFCSURFACEOFREVOLUTION",2809605785:"IFCSURFACEOFLINEAREXTRUSION",2028607225:"IFCSURFACECURVESWEPTAREASOLID",4070609034:"IFCSTRUCTUREDDIMENSIONCALLOUT",2218152070:"IFCSTRUCTURALSURFACEMEMBERVARYING",3979015343:"IFCSTRUCTURALSURFACEMEMBER",3689010777:"IFCSTRUCTURALREACTION",530289379:"IFCSTRUCTURALMEMBER",3136571912:"IFCSTRUCTURALITEM",3544373492:"IFCSTRUCTURALACTIVITY",451544542:"IFCSPHERE",3893378262:"IFCSPATIALSTRUCTUREELEMENTTYPE",2706606064:"IFCSPATIALSTRUCTUREELEMENT",3626867408:"IFCRIGHTCIRCULARCYLINDER",4158566097:"IFCRIGHTCIRCULARCONE",1856042241:"IFCREVOLVEDAREASOLID",2914609552:"IFCRESOURCE",1401173127:"IFCRELVOIDSELEMENT",3451746338:"IFCRELSPACEBOUNDARY",366585022:"IFCRELSERVICESBUILDINGS",4122056220:"IFCRELSEQUENCE",1058617721:"IFCRELSCHEDULESCOSTITEMS",1245217292:"IFCRELREFERENCEDINSPATIALSTRUCTURE",750771296:"IFCRELPROJECTSELEMENT",202636808:"IFCRELOVERRIDESPROPERTIES",2051452291:"IFCRELOCCUPIESSPACES",3268803585:"IFCRELNESTS",4189434867:"IFCRELINTERACTIONREQUIREMENTS",279856033:"IFCRELFLOWCONTROLELEMENTS",3940055652:"IFCRELFILLSELEMENT",781010003:"IFCRELDEFINESBYTYPE",4186316022:"IFCRELDEFINESBYPROPERTIES",693640335:"IFCRELDEFINES",2551354335:"IFCRELDECOMPOSES",2802773753:"IFCRELCOVERSSPACES",886880790:"IFCRELCOVERSBLDGELEMENTS",3242617779:"IFCRELCONTAINEDINSPATIALSTRUCTURE",3678494232:"IFCRELCONNECTSWITHREALIZINGELEMENTS",504942748:"IFCRELCONNECTSWITHECCENTRICITY",1638771189:"IFCRELCONNECTSSTRUCTURALMEMBER",3912681535:"IFCRELCONNECTSSTRUCTURALELEMENT",2127690289:"IFCRELCONNECTSSTRUCTURALACTIVITY",3190031847:"IFCRELCONNECTSPORTS",4201705270:"IFCRELCONNECTSPORTTOELEMENT",3945020480:"IFCRELCONNECTSPATHELEMENTS",1204542856:"IFCRELCONNECTSELEMENTS",826625072:"IFCRELCONNECTS",2851387026:"IFCRELASSOCIATESPROFILEPROPERTIES",2655215786:"IFCRELASSOCIATESMATERIAL",3840914261:"IFCRELASSOCIATESLIBRARY",982818633:"IFCRELASSOCIATESDOCUMENT",2728634034:"IFCRELASSOCIATESCONSTRAINT",919958153:"IFCRELASSOCIATESCLASSIFICATION",4095574036:"IFCRELASSOCIATESAPPROVAL",1327628568:"IFCRELASSOCIATESAPPLIEDVALUE",1865459582:"IFCRELASSOCIATES",205026976:"IFCRELASSIGNSTORESOURCE",3372526763:"IFCRELASSIGNSTOPROJECTORDER",2857406711:"IFCRELASSIGNSTOPRODUCT",4278684876:"IFCRELASSIGNSTOPROCESS",1307041759:"IFCRELASSIGNSTOGROUP",2495723537:"IFCRELASSIGNSTOCONTROL",1683148259:"IFCRELASSIGNSTOACTOR",3939117080:"IFCRELASSIGNS",3454111270:"IFCRECTANGULARTRIMMEDSURFACE",2798486643:"IFCRECTANGULARPYRAMID",2770003689:"IFCRECTANGLEHOLLOWPROFILEDEF",3219374653:"IFCPROXY",1451395588:"IFCPROPERTYSET",4194566429:"IFCPROJECTIONCURVE",103090709:"IFCPROJECT",4208778838:"IFCPRODUCT",2945172077:"IFCPROCESS",220341763:"IFCPLANE",603570806:"IFCPLANARBOX",3566463478:"IFCPERMEABLECOVERINGPROPERTIES",3505215534:"IFCOFFSETCURVE3D",3388369263:"IFCOFFSETCURVE2D",3888040117:"IFCOBJECT",1425443689:"IFCMANIFOLDSOLIDBREP",1281925730:"IFCLINE",572779678:"IFCLSHAPEPROFILEDEF",1484403080:"IFCISHAPEPROFILEDEF",987898635:"IFCGEOMETRICCURVESET",1268542332:"IFCFURNITURETYPE",4238390223:"IFCFURNISHINGELEMENTTYPE",3455213021:"IFCFLUIDFLOWPROPERTIES",315944413:"IFCFILLAREASTYLETILES",4203026998:"IFCFILLAREASTYLETILESYMBOLWITHSTYLE",374418227:"IFCFILLAREASTYLEHATCHING",2047409740:"IFCFACEBASEDSURFACEMODEL",477187591:"IFCEXTRUDEDAREASOLID",80994333:"IFCENERGYPROPERTIES",2835456948:"IFCELLIPSEPROFILEDEF",2777663545:"IFCELEMENTARYSURFACE",339256511:"IFCELEMENTTYPE",1883228015:"IFCELEMENTQUANTITY",1472233963:"IFCEDGELOOP",4006246654:"IFCDRAUGHTINGPREDEFINEDCURVEFONT",445594917:"IFCDRAUGHTINGPREDEFINEDCOLOUR",3073041342:"IFCDRAUGHTINGCALLOUT",526551008:"IFCDOORSTYLE",1714330368:"IFCDOORPANELPROPERTIES",2963535650:"IFCDOORLININGPROPERTIES",32440307:"IFCDIRECTION",4054601972:"IFCDIMENSIONCURVETERMINATOR",606661476:"IFCDIMENSIONCURVE",693772133:"IFCDEFINEDSYMBOL",2827736869:"IFCCURVEBOUNDEDPLANE",2601014836:"IFCCURVE",2147822146:"IFCCSGSOLID",2506170314:"IFCCSGPRIMITIVE3D",194851669:"IFCCRANERAILFSHAPEPROFILEDEF",4133800736:"IFCCRANERAILASHAPEPROFILEDEF",2485617015:"IFCCOMPOSITECURVESEGMENT",2205249479:"IFCCLOSEDSHELL",1383045692:"IFCCIRCLEPROFILEDEF",1416205885:"IFCCARTESIANTRANSFORMATIONOPERATOR3DNONUNIFORM",3331915920:"IFCCARTESIANTRANSFORMATIONOPERATOR3D",3486308946:"IFCCARTESIANTRANSFORMATIONOPERATOR2DNONUNIFORM",3749851601:"IFCCARTESIANTRANSFORMATIONOPERATOR2D",59481748:"IFCCARTESIANTRANSFORMATIONOPERATOR",1123145078:"IFCCARTESIANPOINT",2898889636:"IFCCSHAPEPROFILEDEF",2713105998:"IFCBOXEDHALFSPACE",2581212453:"IFCBOUNDINGBOX",4182860854:"IFCBOUNDEDSURFACE",2736907675:"IFCBOOLEANRESULT",2740243338:"IFCAXIS2PLACEMENT3D",3125803723:"IFCAXIS2PLACEMENT2D",4261334040:"IFCAXIS1PLACEMENT",1302238472:"IFCANNOTATIONSURFACE",2265737646:"IFCANNOTATIONFILLAREAOCCURRENCE",669184980:"IFCANNOTATIONFILLAREA",3288037868:"IFCANNOTATIONCURVEOCCURRENCE",2543172580:"IFCZSHAPEPROFILEDEF",1299126871:"IFCWINDOWSTYLE",512836454:"IFCWINDOWPANELPROPERTIES",336235671:"IFCWINDOWLININGPROPERTIES",2759199220:"IFCVERTEXLOOP",1417489154:"IFCVECTOR",427810014:"IFCUSHAPEPROFILEDEF",2347495698:"IFCTYPEPRODUCT",1628702193:"IFCTYPEOBJECT",1345879162:"IFCTWODIRECTIONREPEATFACTOR",2715220739:"IFCTRAPEZIUMPROFILEDEF",3124975700:"IFCTEXTLITERALWITHEXTENT",4282788508:"IFCTEXTLITERAL",3028897424:"IFCTERMINATORSYMBOL",3071757647:"IFCTSHAPEPROFILEDEF",230924584:"IFCSWEPTSURFACE",1260650574:"IFCSWEPTDISKSOLID",2247615214:"IFCSWEPTAREASOLID",1878645084:"IFCSURFACESTYLERENDERING",2513912981:"IFCSURFACE",2233826070:"IFCSUBEDGE",3653947884:"IFCSTRUCTURALSTEELPROFILEPROPERTIES",3843319758:"IFCSTRUCTURALPROFILEPROPERTIES",1190533807:"IFCSTRUCTURALLOADSINGLEFORCEWARPING",1597423693:"IFCSTRUCTURALLOADSINGLEFORCE",1973038258:"IFCSTRUCTURALLOADSINGLEDISPLACEMENTDISTORTION",2473145415:"IFCSTRUCTURALLOADSINGLEDISPLACEMENT",2668620305:"IFCSTRUCTURALLOADPLANARFORCE",1595516126:"IFCSTRUCTURALLOADLINEARFORCE",390701378:"IFCSPACETHERMALLOADPROPERTIES",1202362311:"IFCSOUNDVALUE",2485662743:"IFCSOUNDPROPERTIES",723233188:"IFCSOLIDMODEL",2609359061:"IFCSLIPPAGECONNECTIONCONDITION",4124623270:"IFCSHELLBASEDSURFACEMODEL",2411513650:"IFCSERVICELIFEFACTOR",1509187699:"IFCSECTIONEDSPINE",2778083089:"IFCROUNDEDRECTANGLEPROFILEDEF",478536968:"IFCRELATIONSHIP",3765753017:"IFCREINFORCEMENTDEFINITIONPROPERTIES",3413951693:"IFCREGULARTIMESERIES",3615266464:"IFCRECTANGLEPROFILEDEF",110355661:"IFCPROPERTYTABLEVALUE",3650150729:"IFCPROPERTYSINGLEVALUE",3357820518:"IFCPROPERTYSETDEFINITION",941946838:"IFCPROPERTYREFERENCEVALUE",2752243245:"IFCPROPERTYLISTVALUE",4166981789:"IFCPROPERTYENUMERATEDVALUE",1680319473:"IFCPROPERTYDEFINITION",871118103:"IFCPROPERTYBOUNDEDVALUE",673634403:"IFCPRODUCTDEFINITIONSHAPE",179317114:"IFCPREDEFINEDPOINTMARKERSYMBOL",433424934:"IFCPREDEFINEDDIMENSIONSYMBOL",2559016684:"IFCPREDEFINEDCURVEFONT",759155922:"IFCPREDEFINEDCOLOUR",2775532180:"IFCPOLYGONALBOUNDEDHALFSPACE",2924175390:"IFCPOLYLOOP",1423911732:"IFCPOINTONSURFACE",4022376103:"IFCPOINTONCURVE",2067069095:"IFCPOINT",1663979128:"IFCPLANAREXTENT",2004835150:"IFCPLACEMENT",597895409:"IFCPIXELTEXTURE",3021840470:"IFCPHYSICALCOMPLEXQUANTITY",2519244187:"IFCPATH",2529465313:"IFCPARAMETERIZEDPROFILEDEF",1029017970:"IFCORIENTEDEDGE",2665983363:"IFCOPENSHELL",2833995503:"IFCONEDIRECTIONREPEATFACTOR",219451334:"IFCOBJECTDEFINITION",1430189142:"IFCMECHANICALCONCRETEMATERIALPROPERTIES",2022407955:"IFCMATERIALDEFINITIONREPRESENTATION",2347385850:"IFCMAPPEDITEM",1008929658:"IFCLOOP",2624227202:"IFCLOCALPLACEMENT",3422422726:"IFCLIGHTSOURCESPOT",1520743889:"IFCLIGHTSOURCEPOSITIONAL",4266656042:"IFCLIGHTSOURCEGONIOMETRIC",2604431987:"IFCLIGHTSOURCEDIRECTIONAL",125510826:"IFCLIGHTSOURCEAMBIENT",1402838566:"IFCLIGHTSOURCE",3741457305:"IFCIRREGULARTIMESERIES",3905492369:"IFCIMAGETEXTURE",2445078500:"IFCHYGROSCOPICMATERIALPROPERTIES",812098782:"IFCHALFSPACESOLID",178086475:"IFCGRIDPLACEMENT",3590301190:"IFCGEOMETRICSET",4142052618:"IFCGEOMETRICREPRESENTATIONSUBCONTEXT",2453401579:"IFCGEOMETRICREPRESENTATIONITEM",3448662350:"IFCGEOMETRICREPRESENTATIONCONTEXT",1446786286:"IFCGENERALPROFILEPROPERTIES",803998398:"IFCGENERALMATERIALPROPERTIES",3857492461:"IFCFUELPROPERTIES",738692330:"IFCFILLAREASTYLE",4219587988:"IFCFAILURECONNECTIONCONDITION",3008276851:"IFCFACESURFACE",803316827:"IFCFACEOUTERBOUND",1809719519:"IFCFACEBOUND",2556980723:"IFCFACE",1860660968:"IFCEXTENDEDMATERIALPROPERTIES",476780140:"IFCEDGECURVE",3900360178:"IFCEDGE",4170525392:"IFCDRAUGHTINGPREDEFINEDTEXTFONT",3732053477:"IFCDOCUMENTREFERENCE",1694125774:"IFCDIMENSIONPAIR",2273265877:"IFCDIMENSIONCALLOUTRELATIONSHIP",3632507154:"IFCDERIVEDPROFILEDEF",3800577675:"IFCCURVESTYLE",2889183280:"IFCCONVERSIONBASEDUNIT",3050246964:"IFCCONTEXTDEPENDENTUNIT",45288368:"IFCCONNECTIONPOINTECCENTRICITY",1981873012:"IFCCONNECTIONCURVEGEOMETRY",370225590:"IFCCONNECTEDFACESET",1485152156:"IFCCOMPOSITEPROFILEDEF",2542286263:"IFCCOMPLEXPROPERTY",776857604:"IFCCOLOURRGB",647927063:"IFCCLASSIFICATIONREFERENCE",3150382593:"IFCCENTERLINEPROFILEDEF",616511568:"IFCBLOBTEXTURE",2705031697:"IFCARBITRARYPROFILEDEFWITHVOIDS",1310608509:"IFCARBITRARYOPENPROFILEDEF",3798115385:"IFCARBITRARYCLOSEDPROFILEDEF",2297822566:"IFCANNOTATIONTEXTOCCURRENCE",3612888222:"IFCANNOTATIONSYMBOLOCCURRENCE",962685235:"IFCANNOTATIONSURFACEOCCURRENCE",2442683028:"IFCANNOTATIONOCCURRENCE",1065908215:"IFCWATERPROPERTIES",891718957:"IFCVIRTUALGRIDINTERSECTION",1907098498:"IFCVERTEXPOINT",3304826586:"IFCVERTEXBASEDTEXTUREMAP",2799835756:"IFCVERTEX",180925521:"IFCUNITASSIGNMENT",1735638870:"IFCTOPOLOGYREPRESENTATION",1377556343:"IFCTOPOLOGICALREPRESENTATIONITEM",581633288:"IFCTIMESERIESVALUE",1718945513:"IFCTIMESERIESREFERENCERELATIONSHIP",3101149627:"IFCTIMESERIES",3317419933:"IFCTHERMALMATERIALPROPERTIES",1210645708:"IFCTEXTUREVERTEX",2552916305:"IFCTEXTUREMAP",1742049831:"IFCTEXTURECOORDINATEGENERATOR",280115917:"IFCTEXTURECOORDINATE",1484833681:"IFCTEXTSTYLEWITHBOXCHARACTERISTICS",1640371178:"IFCTEXTSTYLETEXTMODEL",2636378356:"IFCTEXTSTYLEFORDEFINEDFONT",1983826977:"IFCTEXTSTYLEFONTMODEL",1447204868:"IFCTEXTSTYLE",912023232:"IFCTELECOMADDRESS",531007025:"IFCTABLEROW",985171141:"IFCTABLE",1290481447:"IFCSYMBOLSTYLE",626085974:"IFCSURFACETEXTURE",1351298697:"IFCSURFACESTYLEWITHTEXTURES",846575682:"IFCSURFACESTYLESHADING",1607154358:"IFCSURFACESTYLEREFRACTION",3303107099:"IFCSURFACESTYLELIGHTING",1300840506:"IFCSURFACESTYLE",3049322572:"IFCSTYLEDREPRESENTATION",3958052878:"IFCSTYLEDITEM",2830218821:"IFCSTYLEMODEL",3408363356:"IFCSTRUCTURALLOADTEMPERATURE",2525727697:"IFCSTRUCTURALLOADSTATIC",2162789131:"IFCSTRUCTURALLOAD",2273995522:"IFCSTRUCTURALCONNECTIONCONDITION",3692461612:"IFCSIMPLEPROPERTY",4240577450:"IFCSHAPEREPRESENTATION",3982875396:"IFCSHAPEMODEL",867548509:"IFCSHAPEASPECT",4165799628:"IFCSECTIONREINFORCEMENTPROPERTIES",2042790032:"IFCSECTIONPROPERTIES",448429030:"IFCSIUNIT",2341007311:"IFCROOT",3679540991:"IFCRIBPLATEPROFILEPROPERTIES",1660063152:"IFCREPRESENTATIONMAP",3008791417:"IFCREPRESENTATIONITEM",3377609919:"IFCREPRESENTATIONCONTEXT",1076942058:"IFCREPRESENTATION",1222501353:"IFCRELAXATION",1580146022:"IFCREINFORCEMENTBARPROPERTIES",2692823254:"IFCREFERENCESVALUEDOCUMENT",825690147:"IFCQUANTITYWEIGHT",2405470396:"IFCQUANTITYVOLUME",3252649465:"IFCQUANTITYTIME",931644368:"IFCQUANTITYLENGTH",2093928680:"IFCQUANTITYCOUNT",2044713172:"IFCQUANTITYAREA",3710013099:"IFCPROPERTYENUMERATION",148025276:"IFCPROPERTYDEPENDENCYRELATIONSHIP",3896028662:"IFCPROPERTYCONSTRAINTRELATIONSHIP",2598011224:"IFCPROPERTY",2802850158:"IFCPROFILEPROPERTIES",3958567839:"IFCPROFILEDEF",2267347899:"IFCPRODUCTSOFCOMBUSTIONPROPERTIES",2095639259:"IFCPRODUCTREPRESENTATION",2417041796:"IFCPRESENTATIONSTYLEASSIGNMENT",3119450353:"IFCPRESENTATIONSTYLE",1304840413:"IFCPRESENTATIONLAYERWITHSTYLE",2022622350:"IFCPRESENTATIONLAYERASSIGNMENT",1775413392:"IFCPREDEFINEDTEXTFONT",3213052703:"IFCPREDEFINEDTERMINATORSYMBOL",990879717:"IFCPREDEFINEDSYMBOL",3727388367:"IFCPREDEFINEDITEM",3355820592:"IFCPOSTALADDRESS",2226359599:"IFCPHYSICALSIMPLEQUANTITY",2483315170:"IFCPHYSICALQUANTITY",101040310:"IFCPERSONANDORGANIZATION",2077209135:"IFCPERSON",1207048766:"IFCOWNERHISTORY",1411181986:"IFCORGANIZATIONRELATIONSHIP",4251960020:"IFCORGANIZATION",1227763645:"IFCOPTICALMATERIALPROPERTIES",2251480897:"IFCOBJECTIVE",3701648758:"IFCOBJECTPLACEMENT",1918398963:"IFCNAMEDUNIT",2706619895:"IFCMONETARYUNIT",3368373690:"IFCMETRIC",677618848:"IFCMECHANICALSTEELMATERIALPROPERTIES",4256014907:"IFCMECHANICALMATERIALPROPERTIES",2597039031:"IFCMEASUREWITHUNIT",3265635763:"IFCMATERIALPROPERTIES",2199411900:"IFCMATERIALLIST",1303795690:"IFCMATERIALLAYERSETUSAGE",3303938423:"IFCMATERIALLAYERSET",248100487:"IFCMATERIALLAYER",1847130766:"IFCMATERIALCLASSIFICATIONRELATIONSHIP",1838606355:"IFCMATERIAL",30780891:"IFCLOCALTIME",1566485204:"IFCLIGHTINTENSITYDISTRIBUTION",4162380809:"IFCLIGHTDISTRIBUTIONDATA",3452421091:"IFCLIBRARYREFERENCE",2655187982:"IFCLIBRARYINFORMATION",3020489413:"IFCIRREGULARTIMESERIESVALUE",852622518:"IFCGRIDAXIS",3548104201:"IFCEXTERNALLYDEFINEDTEXTFONT",3207319532:"IFCEXTERNALLYDEFINEDSYMBOL",1040185647:"IFCEXTERNALLYDEFINEDSURFACESTYLE",2242383968:"IFCEXTERNALLYDEFINEDHATCHSTYLE",3200245327:"IFCEXTERNALREFERENCE",1648886627:"IFCENVIRONMENTALIMPACTVALUE",3796139169:"IFCDRAUGHTINGCALLOUTRELATIONSHIP",770865208:"IFCDOCUMENTINFORMATIONRELATIONSHIP",1154170062:"IFCDOCUMENTINFORMATION",1376555844:"IFCDOCUMENTELECTRONICFORMAT",2949456006:"IFCDIMENSIONALEXPONENTS",1045800335:"IFCDERIVEDUNITELEMENT",1765591967:"IFCDERIVEDUNIT",1072939445:"IFCDATEANDTIME",3510044353:"IFCCURVESTYLEFONTPATTERN",2367409068:"IFCCURVESTYLEFONTANDSCALING",1105321065:"IFCCURVESTYLEFONT",539742890:"IFCCURRENCYRELATIONSHIP",602808272:"IFCCOSTVALUE",1065062679:"IFCCOORDINATEDUNIVERSALTIMEOFFSET",347226245:"IFCCONSTRAINTRELATIONSHIP",613356794:"IFCCONSTRAINTCLASSIFICATIONRELATIONSHIP",1658513725:"IFCCONSTRAINTAGGREGATIONRELATIONSHIP",1959218052:"IFCCONSTRAINT",2732653382:"IFCCONNECTIONSURFACEGEOMETRY",4257277454:"IFCCONNECTIONPORTGEOMETRY",2614616156:"IFCCONNECTIONPOINTGEOMETRY",2859738748:"IFCCONNECTIONGEOMETRY",3264961684:"IFCCOLOURSPECIFICATION",3639012971:"IFCCLASSIFICATIONNOTATIONFACET",938368621:"IFCCLASSIFICATIONNOTATION",1098599126:"IFCCLASSIFICATIONITEMRELATIONSHIP",1767535486:"IFCCLASSIFICATIONITEM",747523909:"IFCCLASSIFICATION",622194075:"IFCCALENDARDATE",2069777674:"IFCBOUNDARYNODECONDITIONWARPING",1387855156:"IFCBOUNDARYNODECONDITION",3367102660:"IFCBOUNDARYFACECONDITION",1560379544:"IFCBOUNDARYEDGECONDITION",4037036970:"IFCBOUNDARYCONDITION",3869604511:"IFCAPPROVALRELATIONSHIP",390851274:"IFCAPPROVALPROPERTYRELATIONSHIP",2080292479:"IFCAPPROVALACTORRELATIONSHIP",130549933:"IFCAPPROVAL",1110488051:"IFCAPPLIEDVALUERELATIONSHIP",411424972:"IFCAPPLIEDVALUE",639542469:"IFCAPPLICATION",618182010:"IFCADDRESS",3630933823:"IFCACTORROLE",599546466:"FILE_DESCRIPTION",1390159747:"FILE_NAME",1109904537:"FILE_SCHEMA"};class ft{static async getUnits(s){var n;const{IFCUNITASSIGNMENT:t}=x,e=await s.getAllPropertiesOfType(t);if(!e)return 1;const i=Object.keys(e),o=e[parseInt(i[0],10)];for(const r of o.Units){if(r.value===void 0||r.value===null)continue;const a=await s.getProperties(r.value);if(!a||!a.UnitType||!a.UnitType.value||a.UnitType.value!=="LENGTHUNIT")continue;let E=1,d=1;return a.Name.value==="METRE"&&(d=1),a.Name.value==="FOOT"&&(d=.3048),((n=a.Prefix)==null?void 0:n.value)==="MILLI"&&(E=.001),d*E}return 1}static async findItemByGuid(s,t){var i;const e=s.getAllPropertiesIDs();for(const o of e){const n=await s.getProperties(o);if(n&&((i=n.GlobalId)==null?void 0:i.value)===t)return n}return null}static async getRelationMap(s,t,e){var a;const o=e??(()=>{}),n={},r=s.getAllPropertiesIDs();for(const l of r){const E=await s.getProperties(l);if(!E)continue;const d=E.type===t,h=Object.keys(E).find(T=>T.startsWith("Relating")),u=Object.keys(E).find(T=>T.startsWith("Related"));if(!(d&&h&&u))continue;const p=await s.getProperties((a=E[h])==null?void 0:a.value),m=E[u];if(!p||!m||!(m&&Array.isArray(m)))continue;const F=m.map(T=>T.value);o(p.expressID,F),n[p.expressID]=F}return n}static async getQsetQuantities(s,t,e){const o=e??(()=>{}),n=await s.getProperties(t);return!n||n.type!==x.IFCELEMENTQUANTITY?null:(n.Quantities??[{}]).map(l=>(l.value&&o(l.value),l.value)).filter(l=>l!==null)}static async getPsetProps(s,t,e){const o=e??(()=>{}),n=await s.getProperties(t);return!n||n.type!==x.IFCPROPERTYSET?null:(n.HasProperties??[{}]).map(l=>(l.value&&o(l.value),l.value)).filter(l=>l!==null)}static async getPsetRel(s,t){var r;if(!await s.getProperties(t))return null;const i=await s.getAllPropertiesOfType(x.IFCRELDEFINESBYPROPERTIES);if(!i)return null;const o=Object.values(i);let n=null;for(const a of o)((r=a.RelatingPropertyDefinition)==null?void 0:r.value)===t&&(n=a.expressID);return n}static async getQsetRel(s,t){return ft.getPsetRel(s,t)}static async getEntityName(s,t){var n;const e=await s.getProperties(t);if(!e)return{key:null,name:null};const i=Object.keys(e).find(r=>r.endsWith("Name"))??null,o=i?(n=e[i])==null?void 0:n.value:null;return{key:i,name:o}}static async getQuantityValue(s,t){const e=await s.getProperties(t);if(!e)return{key:null,value:null};const i=Object.keys(e).find(n=>n.endsWith("Value"))??null;let o;return i===null||e[i]===void 0||e[i]===null?o=null:o=e[i].value,{key:i,value:o}}static isRel(s){return gi[s].startsWith("IFCREL")}static async attributeExists(s,t,e){const i=await s.getProperties(t);return i?Object.keys(i).includes(e):!1}static async groupEntitiesByType(s,t){var i;const e=new Map;for(const o of t){const n=await s.getProperties(o);if(!n)continue;const r=n.type;e.get(r)||e.set(r,new Set),(i=e.get(r))==null||i.add(o)}return e}}const As=class As extends ${constructor(t){super(t);I(this,"onDisposed",new D);I(this,"onFragmentsLoaded",new D);I(this,"onFragmentsDisposed",new D);I(this,"list",new Map);I(this,"groups",new Map);I(this,"enabled",!0);I(this,"baseCoordinationModel","");I(this,"_loader",new En.Serializer);this.components.add(As.uuid,this)}get meshes(){const t=[];for(const[e,i]of this.list)t.push(i.mesh);return t}dispose(){for(const[t,e]of this.groups)e.dispose(!0);this.baseCoordinationModel="",this.groups.clear(),this.list.clear(),this.onFragmentsLoaded.reset(),this.onFragmentsDisposed.reset(),this.onDisposed.trigger(),this.onDisposed.reset()}disposeGroup(t){const{uuid:e}=t,i=[];for(const o of t.items)i.push(o.id),this.list.delete(o.id);t.dispose(!0),this.groups.delete(t.uuid),this.onFragmentsDisposed.trigger({groupID:e,fragmentIDs:i})}load(t,e=!0){const i=this._loader.import(t);for(const o of i.items)o.group=i,this.list.set(o.id,o);return e&&this.coordinate([i]),this.groups.set(i.uuid,i),this.onFragmentsLoaded.trigger(i),i}export(t){return this._loader.export(t)}coordinate(t=Array.from(this.groups.values())){if(this.baseCoordinationModel.length===0){const o=t.pop();if(!o)return;this.baseCoordinationModel=o.uuid}if(!t.length)return;const i=this.groups.get(this.baseCoordinationModel);if(!i){console.log("No base model found for coordination!");return}for(const o of t)o!==i&&(o.position.set(0,0,0),o.rotation.set(0,0,0),o.scale.set(1,1,1),o.updateMatrix(),o.applyMatrix4(o.coordinationMatrix.clone().invert()),o.applyMatrix4(i.coordinationMatrix))}};I(As,"uuid","fef46874-46a3-461b-8c44-2922ab77c806");let ot=As;class Nr extends ${constructor(t){super(t);I(this,"onFound",new D);I(this,"onDisposed",new D);I(this,"enabled",!0);I(this,"indexedModels",{});I(this,"_conditionFunctions");I(this,"_noHandleAttributes",["type"]);I(this,"onFragmentsDisposed",t=>{delete this.indexedModels[t.groupID]});this._conditionFunctions=this.getConditionFunctions(),t.get(ot).onFragmentsDisposed.add(this.onFragmentsDisposed)}dispose(){this.indexedModels={},this.onFound.reset(),this.onDisposed.trigger(),this.onDisposed.reset()}async indexEntityRelations(t){const e={};await ft.getRelationMap(t,x.IFCRELDEFINESBYPROPERTIES,async(o,n)=>{e[o]||(e[o]=new Set);const r=[];await ft.getPsetProps(t,o,a=>{r.push(a),e[o].add(a),e[a]||(e[a]=new Set),e[a].add(o)});for(const a of n){e[o].add(a);for(const l of r)e[l].add(a);e[a]||(e[a]=new Set),e[a].add(a)}});const i=[x.IFCRELCONTAINEDINSPATIALSTRUCTURE,x.IFCRELDEFINESBYTYPE,x.IFCRELASSIGNSTOGROUP];for(const o of i)await ft.getRelationMap(t,o,async(n,r)=>{e[n]||(e[n]=new Set);for(const a of r)e[n].add(a),e[a]||(e[a]=new Set),e[a].add(a)});return this.indexedModels[t.uuid]=e,e}async find(t,e){const i=this.components.get(ot),o=e||i.groups.values(),n={};for(const a of o){let l=this.indexedModels[a.uuid];l||(l=await this.indexEntityRelations(a));let E=[];for(const[u,p]of t.entries()){const m=new Set,F=this.simpleQuery(a,p,m),T=[];for(const R of F){const g=l[R];if(g){T.push(R);for(const f of g)m.has(f)||T.push(f)}}E=p.operator==="AND"&&u>0?this.getCommonElements(E,T):[...E,...T]}const d=new Set;for(const[u]of a.data)E.includes(u)&&d.add(u);const h=new Set;for(const u of E)d.has(u)||h.add(u);n[a.uuid]={modelEntities:d,otherEntities:h}}const r=this.toFragmentMap(n);return this.onFound.trigger(r),r}toFragmentMap(t){const e=this.components.get(ot),i={};for(const o in t){const n=e.groups.get(o);if(!n)continue;const r=t[o].modelEntities;for(const a of r){const l=n.data.get(a);if(l)for(const E of l[0]){const d=n.keyFragments.get(E);if(!d)throw new Error("Fragment ID not found!");i[d]||(i[d]=new Set),i[d].add(a)}}}return i}simpleQuery(t,e,i){const o=t.getLocalProperties();if(!o)throw new Error("Model has no properties");let n={},r=0,a=[];for(const l of e.queries){let E=[];const d=l.operator==="AND"?n:o;if(l.condition){const u=this.getMatchingEntities(d,l,i);E=u.expressIDs,n={...n,...u.entities}}else E=[...this.simpleQuery(t,l,i)];a=r===0?E:this.combineArrays(a,E,l.operator??"AND"),r++}return new Set(a)}getMatchingEntities(t,e,i){const{attribute:o,condition:n}=e;let{value:r}=e;const a=!this._noHandleAttributes.includes(o),l=[],E=[];for(const d in t){const h=t[d];if(h===void 0)continue;const u=h[o];let p=a?u==null?void 0:u.value:u;if(p==null)continue;const m=typeof r,F=typeof p;m==="number"&&F==="string"?r=r.toString():m==="string"&&F==="number"&&(p=p.toString());let T=this._conditionFunctions[n](p,r);if(e.negateResult&&(T=!T),!T){e.negateResult&&i.add(h.expressID);continue}l.push(h.expressID),E.push(h)}return{expressIDs:l,entities:E,excludedItems:i}}combineArrays(t,e,i){return i?i==="AND"?this.arrayIntersection(t,e):this.arrayUnion(t,e):e}getCommonElements(...t){const e=[],i=new Map;for(const o of t){const n=new Set(o);for(const r of n)i.has(r)?i.set(r,i.get(r)+1):i.set(r,1)}for(const[o,n]of i)n===t.length&&e.push(o);return e}arrayIntersection(t,e){return t.filter(i=>e.includes(i))}arrayUnion(t,e){return[...t,...e]}getConditionFunctions(){return{is:(t,e)=>t===e,includes:(t,e)=>t.toString().includes(e.toString()),startsWith:(t,e)=>t.toString().startsWith(e.toString()),endsWith:(t,e)=>t.toString().endsWith(e.toString()),matches:(t,e)=>new RegExp(e.toString()).test(t.toString())}}}const Pr=(c,s,t)=>{var r;const i=t??(()=>{}),o={},n=Object.keys(c);for(const a of n){const l=c[a];if(!l)continue;const E=l.type===s,d=Object.keys(l).find(F=>F.startsWith("Relating")),h=Object.keys(l).find(F=>F.startsWith("Related"));if(!(E&&d&&h))continue;const u=c[(r=l[d])==null?void 0:r.value],p=l[h];if(!u||!p||!(p&&Array.isArray(p)))continue;const m=p.map(F=>F.value);i(u.expressID,m),o[u.expressID]=m}return o},Lr=new Map([[x.IFCRELAGGREGATES,{forRelating:"IsDecomposedBy",forRelated:"Decomposes"}],[x.IFCRELASSOCIATESMATERIAL,{forRelating:"AssociatedTo",forRelated:"HasAssociations"}],[x.IFCRELASSOCIATESCLASSIFICATION,{forRelating:"ClassificationForObjects",forRelated:"HasAssociations"}],[x.IFCRELASSIGNSTOGROUP,{forRelating:"IsGroupedBy",forRelated:"HasAssignments"}],[x.IFCRELDEFINESBYPROPERTIES,{forRelated:"IsDefinedBy",forRelating:"DefinesOcurrence"}],[x.IFCRELDEFINESBYTYPE,{forRelated:"IsTypedBy",forRelating:"Types"}],[x.IFCRELDEFINESBYTEMPLATE,{forRelated:"IsDefinedBy",forRelating:"Defines"}],[x.IFCRELCONTAINEDINSPATIALSTRUCTURE,{forRelated:"ContainedInStructure",forRelating:"ContainsElements"}]]),De=class De extends ${constructor(t){super(t);I(this,"onDisposed",new D);I(this,"enabled",!0);I(this,"onRelationsIndexed",new D);I(this,"_relToAttributesMap",Lr);I(this,"inverseAttributes",["IsDecomposedBy","Decomposes","AssociatedTo","HasAssociations","ClassificationForObjects","IsGroupedBy","HasAssignments","IsDefinedBy","DefinesOcurrence","IsTypedBy","Types","Defines","ContainedInStructure","ContainsElements"]);I(this,"relationMaps",{});I(this,"onFragmentsDisposed",t=>{delete this.relationMaps[t.groupID]});this.components.add(De.uuid,this),t.get(ot).onFragmentsDisposed.add(this.onFragmentsDisposed)}getAttributeRels(t){const e=[];for(const[i,o]of this._relToAttributesMap.entries()){const{forRelating:n,forRelated:r}=o;(n===t||r===t)&&e.push(i)}return e}setRelationMap(t,e){this.relationMaps[t.uuid]=e,this.onRelationsIndexed.trigger({modelID:t.uuid,relationsMap:e})}async process(t){if(!t.hasProperties)throw new Error("FragmentsGroup properties not found");const e=new Map;for(const i of this.inverseAttributes){const o=this.getAttributeRels(i);for(const n of o)await ft.getRelationMap(t,n,async(r,a)=>{const l=this._relToAttributesMap.get(n);if(!l)return;const{forRelated:E,forRelating:d}=l;if(d){const h=e.get(r)??new Map,u=this.inverseAttributes.indexOf(d);h.set(u,a),e.set(r,h)}if(E)for(const h of a){const u=e.get(h)??new Map,p=this.inverseAttributes.indexOf(E),m=u.get(p)??[];m.push(r),u.set(p,m),e.set(h,u)}})}return this.setRelationMap(t,e),e}async processFromWebIfc(t,e){const i=new Map,o={},n=t.GetAllLines(e);for(let r=0;r<n.size();r++){const a=n.get(r),l=await t.properties.getItemProperties(e,a);o[a]=l}for(const r of this.inverseAttributes){const a=this.getAttributeRels(r);for(const l of a)Pr(o,l,(E,d)=>{const h=this._relToAttributesMap.get(l);if(!h)return;const{forRelated:u,forRelating:p}=h;if(p){const m=i.get(E)??new Map,F=this.inverseAttributes.indexOf(p);m.set(F,d),i.set(E,m)}if(u)for(const m of d){const F=i.get(m)??new Map,T=this.inverseAttributes.indexOf(u),R=F.get(T)??[];R.push(E),F.set(T,R),i.set(m,F)}})}return this.onRelationsIndexed.trigger({modelID:e.toString(),relationsMap:i}),i}getEntityRelations(t,e,i){const o=this.relationMaps[t.uuid];if(!o)return null;const n=o.get(e),r=this.inverseAttributes.indexOf(i);if(!n||r===-1)return null;const a=n.get(r);return a||null}serializeRelations(t){const e={};for(const[i,o]of t.entries()){e[i]||(e[i]={});for(const[n,r]of o.entries())e[i][n]=r}return JSON.stringify(e)}serializeModelRelations(t){const e=this.relationMaps[t.uuid];return e?this.serializeRelations(e):null}serializeAllRelations(){const t={};for(const e in this.relationMaps){const i=this.relationMaps[e],o={};for(const[n,r]of i.entries()){o[n]||(o[n]={});for(const[a,l]of r.entries())o[n][a]=l}t[e]=o}return JSON.stringify(t)}getRelationsMapFromJSON(t){const e=JSON.parse(t),i=new Map;for(const o in e){const n=e[o],r=new Map;for(const a in n)r.set(Number(a),n[a]);i.set(Number(o),r)}return i}dispose(){this.relationMaps={},this.components.get(ot).onFragmentsDisposed.remove(this.onFragmentsDisposed),this.onDisposed.trigger(De.uuid),this.onDisposed.reset()}};I(De,"uuid","23a889ab-83b3-44a4-8bee-ead83438370b");let Is=De;class Mr{constructor(){I(this,"factor",1);I(this,"complement",1)}apply(s){const e=this.getScaleMatrix().multiply(s);s.copy(e)}setUp(s){var o;this.factor=1;const t=this.getLengthUnits(s);if(!t)return;const e=t==null,i=t.Name===void 0||t.Name===null;e||i||(t.Name.value==="FOOT"?this.factor=.3048:((o=t.Prefix)==null?void 0:o.value)==="MILLI"&&(this.complement=.001))}getLengthUnits(s){try{const e=s.GetLineIDsWithType(0,x.IFCUNITASSIGNMENT).get(0),i=s.GetLine(0,e);for(const o of i.Units){if(!o||o.value===null||o.value===void 0)continue;const n=s.GetLine(0,o.value);if(n.UnitType&&n.UnitType.value==="LENGTHUNIT")return n}return null}catch{return console.log("Could not get units"),null}}getScaleMatrix(){const s=this.factor;return new S.Matrix4().fromArray([s,0,0,0,0,s,0,0,0,0,s,0,0,0,0,1])}}class Un{constructor(){I(this,"itemsByFloor",{});I(this,"_units",new Mr)}setUp(s){this._units.setUp(s),this.cleanUp();try{const t=s.GetLineIDsWithType(0,x.IFCRELCONTAINEDINSPATIALSTRUCTURE),e=new Set,i=s.GetLineIDsWithType(0,x.IFCSPACE);for(let l=0;l<i.size();l++)e.add(i.get(l));const o=s.GetLineIDsWithType(0,x.IFCRELAGGREGATES),n=o.size();for(let l=0;l<n;l++){const E=o.get(l),d=s.GetLine(0,E);if(!d||!d.RelatingObject||!d.RelatedObjects)continue;const h=d.RelatingObject.value,u=d.RelatedObjects;for(const p of u){const m=p.value;e.has(m)&&(this.itemsByFloor[m]=h)}}const r={},a=t.size();for(let l=0;l<a;l++){const E=t.get(l),d=s.GetLine(0,E);if(!d||!d.RelatingStructure||!d.RelatedElements)continue;const h=d.RelatingStructure.value,u=d.RelatedElements;if(e.has(h))for(const p of u){r[h]||(r[h]=[]);const m=p.value;r[h].push(m)}else for(const p of u){const m=p.value;this.itemsByFloor[m]=h}}for(const l in r){const E=this.itemsByFloor[l];if(E!==void 0){const d=r[l];for(const h of d)this.itemsByFloor[h]=E}}for(let l=0;l<n;l++){const E=o.get(l),d=s.GetLine(0,E);if(!d||!d.RelatingObject||!d.RelatedObjects)continue;const h=d.RelatingObject.value,u=d.RelatedObjects;for(const p of u){const m=p.value,F=this.itemsByFloor[h];F!==void 0&&(this.itemsByFloor[m]=F)}}}catch{console.log("Could not get floors.")}}cleanUp(){this.itemsByFloor={}}}class Oi{constructor(){I(this,"includeProperties",!0);I(this,"optionalCategories",[x.IFCSPACE]);I(this,"coordinate",!0);I(this,"wasm",{path:"",absolute:!1,logLevel:x.LogLevel.LOG_LEVEL_OFF});I(this,"excludedCategories",new Set);I(this,"saveLocations",!1);I(this,"webIfc",{COORDINATE_TO_ORIGIN:!0,OPTIMIZE_PROFILES:!0});I(this,"autoSetWasm",!0);I(this,"customLocateFileHandler",null)}}class xn{constructor(){I(this,"defLineMat",new S.LineBasicMaterial({color:16777215}))}read(s){const t=s.GetAllAlignments(0),e=s.GetAllCrossSections2D(0),i=s.GetAllCrossSections3D(0),o={IfcAlignment:t,IfcCrossSection2D:e,IfcCrossSection3D:i};return this.get(o)}get(s){if(s.IfcAlignment){const t=new Map;for(const e of s.IfcAlignment){const i=new Ut.Alignment;i.absolute=this.getCurves(e.curve3D,i),i.horizontal=this.getCurves(e.horizontal,i),i.vertical=this.getCurves(e.vertical,i),t.set(t.size,i)}return{alignments:t,coordinationMatrix:new S.Matrix4}}}getCurves(s,t){const e=[];let i=0;for(const o of s){const n={};if(o.data)for(const h of o.data){const[u,p]=h.split(": "),m=parseFloat(p);n[u]=m||p}const{points:r}=o,a=new Float32Array(r.length*3);for(let h=0;h<r.length;h++){const{x:u,y:p,z:m}=r[h];a[h*3]=u,a[h*3+1]=p,a[h*3+2]=m||0}const l=new S.BufferAttribute(a,3),E=new S.EdgesGeometry;E.setAttribute("position",l);const d=new Ut.CurveMesh(i,n,t,E,this.defLineMat);e.push(d.curve),i++}return e}}class bn{get(s,t){let e="";const i=s.GetHeaderLine(0,t)||"";if(!i)return e;for(const o of i.arguments)if(o!=null)if(Array.isArray(o))for(const n of o)e+=`${n.value}|`;else e+=`${o.value}|`;return e}}const Ue=class Ue extends ${constructor(t){super(t);I(this,"onIfcStartedLoading",new D);I(this,"onSetup",new D);I(this,"onDisposed",new D);I(this,"settings",new Oi);I(this,"enabled",!0);I(this,"webIfc",new x.IfcAPI);I(this,"_material",new S.MeshLambertMaterial);I(this,"_spatialTree",new Un);I(this,"_metaData",new bn);I(this,"_fragmentInstances",new Map);I(this,"_civil",new xn);I(this,"_propertyExporter",new wn);I(this,"_visitedFragments",new Map);I(this,"_materialT",new S.MeshLambertMaterial({transparent:!0,opacity:.5}));this.components.add(Ue.uuid,this),this.settings.excludedCategories.add(x.IFCOPENINGELEMENT)}dispose(){this.webIfc=null,this.onDisposed.trigger(Ue.uuid),this.onDisposed.reset()}async setup(t){this.settings={...this.settings,...t},this.settings.autoSetWasm&&await this.autoSetWasm(),this.onSetup.trigger()}async load(t,e=!0){const i=performance.now();this.onIfcStartedLoading.trigger(),await this.readIfcFile(t);const o=await this.getAllGeometries(),n=await this._propertyExporter.export(this.webIfc,0);o.setLocalProperties(n),this.cleanUp();const r=this.components.get(ot);r.groups.set(o.uuid,o);for(const a of o.items)r.list.set(a.id,a),a.mesh.uuid=a.id,a.group=o;return r.onFragmentsLoaded.trigger(o),e&&r.coordinate([o]),console.log(`Streaming the IFC took ${performance.now()-i} ms!`),o}async readIfcFile(t){const{path:e,absolute:i,logLevel:o}=this.settings.wasm;return this.webIfc.SetWasmPath(e,i),await this.webIfc.Init(),o&&this.webIfc.SetLogLevel(o),this.webIfc.OpenModel(t,this.settings.webIfc)}async getAllGeometries(){this._spatialTree.setUp(this.webIfc);const t=this.webIfc.GetIfcEntityList(0),e=new Ut.FragmentsGroup,{FILE_NAME:i,FILE_DESCRIPTION:o}=x;e.ifcMetadata={name:this._metaData.get(this.webIfc,i),description:this._metaData.get(this.webIfc,o),schema:this.webIfc.GetModelSchema(0)||"IFC2X3",maxExpressID:this.webIfc.GetMaxExpressID(0)};const n=[];for(const a of t){if(!this.webIfc.IsIfcElement(a)&&a!==x.IFCSPACE||this.settings.excludedCategories.has(a))continue;const l=this.webIfc.GetLineIDsWithType(0,a),E=l.size();for(let d=0;d<E;d++){const h=l.get(d);n.push(h);const u=this._spatialTree.itemsByFloor[h]||0;e.data.set(h,[[],[u,a]])}}this._spatialTree.cleanUp(),this.webIfc.StreamMeshes(0,n,a=>{this.getMesh(a,e)});for(const a of this._visitedFragments){const{index:l,fragment:E}=a[1];e.keyFragments.set(l,E.id)}for(const a of e.items){const l=this._fragmentInstances.get(a.id);if(!l)throw new Error("Fragment not found!");const E=[];for(const[d,h]of l)E.push(h);a.add(E)}const r=this.webIfc.GetCoordinationMatrix(0);return e.coordinationMatrix.fromArray(r),e.civilData=this._civil.read(this.webIfc),e}cleanUp(){this.webIfc=null,this.webIfc=new x.IfcAPI,this._visitedFragments.clear(),this._fragmentInstances.clear()}getMesh(t,e){const i=t.geometries.size(),o=t.expressID;for(let n=0;n<i;n++){const r=t.geometries.get(n),{x:a,y:l,z:E,w:d}=r.color,h=d!==1,{geometryExpressID:u}=r,p=`${u}-${h}`;if(!this._visitedFragments.has(p)){const A=this.getGeometry(this.webIfc,u),O=h?this._materialT:this._material,_=new Ut.Fragment(A,O,1);e.add(_.mesh),e.items.push(_);const y=this._visitedFragments.size;this._visitedFragments.set(p,{index:y,fragment:_})}const m=new S.Color().setRGB(a,l,E,"srgb"),F=new S.Matrix4;F.fromArray(r.flatTransformation);const T=this._visitedFragments.get(p);if(T===void 0)throw new Error("Error getting geometry data for streaming!");const R=e.data.get(o);if(!R)throw new Error("Data not found!");R[0].push(T.index);const{fragment:g}=T;this._fragmentInstances.has(g.id)||this._fragmentInstances.set(g.id,new Map);const f=this._fragmentInstances.get(g.id);if(!f)throw new Error("Instances not found!");if(f.has(o)){const A=f.get(o);if(!A)throw new Error("Instance not found!");A.transforms.push(F),A.colors&&A.colors.push(m)}else f.set(o,{id:o,transforms:[F],colors:[m]})}}getGeometry(t,e){const i=t.GetGeometry(0,e),o=t.GetIndexArray(i.GetIndexData(),i.GetIndexDataSize()),n=t.GetVertexArray(i.GetVertexData(),i.GetVertexDataSize()),r=new Float32Array(n.length/2),a=new Float32Array(n.length/2);for(let h=0;h<n.length;h+=6)r[h/2]=n[h],r[h/2+1]=n[h+1],r[h/2+2]=n[h+2],a[h/2]=n[h+3],a[h/2+1]=n[h+4],a[h/2+2]=n[h+5];const l=new S.BufferGeometry,E=new S.BufferAttribute(r,3),d=new S.BufferAttribute(a,3);return l.setAttribute("position",E),l.setAttribute("normal",d),l.setIndex(Array.from(o)),i.delete(),l}async autoSetWasm(){const t=await fetch(`https://unpkg.com/openbim-components@${Es.release}/package.json`);if(!t.ok){console.warn("Couldn't get openbim-components package.json. Set wasm settings manually.");return}const e=await t.json();if(!("web-ifc"in e.peerDependencies))console.warn("Couldn't get web-ifc from peer dependencies in openbim-components. Set wasm settings manually.");else{const i=e.peerDependencies["web-ifc"];this.settings.wasm.path=`https://unpkg.com/web-ifc@${i}/`,this.settings.wasm.absolute=!0}}};I(Ue,"uuid","a659add7-1418-4771-a0d6-7d4d438e4624");let fs=Ue;const wt=class wt extends ${constructor(t){super(t);I(this,"onDisposed",new D);I(this,"onRequestFile",new D);I(this,"ifcToExport",null);I(this,"onElementToPset",new D);I(this,"onPropToPset",new D);I(this,"onPsetRemoved",new D);I(this,"onDataChanged",new D);I(this,"wasm",{path:"/",absolute:!1});I(this,"enabled",!0);I(this,"attributeListeners",{});I(this,"selectedModel");I(this,"_changeMap",{});this.components.add(wt.uuid,this)}get(){return this._changeMap}dispose(){this.selectedModel=void 0,this.attributeListeners={},this._changeMap={},this.onElementToPset.reset(),this.onPropToPset.reset(),this.onPsetRemoved.reset(),this.onDataChanged.reset(),this.onDisposed.trigger(wt.uuid),this.onDisposed.reset()}increaseMaxID(t){return t.ifcMetadata.maxExpressID++,t.ifcMetadata.maxExpressID}static getIFCSchema(t){const e=t.ifcMetadata.schema;if(!e)throw new Error("IFC Schema not found");return e}newGUID(t){const e=wt.getIFCSchema(t);return new x[e].IfcGloballyUniqueId(ae.create())}async getOwnerHistory(t){const e=await t.getAllPropertiesOfType(x.IFCOWNERHISTORY);if(!e)throw new Error("No OwnerHistory was found.");const i=Object.keys(e).map(r=>parseInt(r,10)),o=e[i[0]],n=new x.Handle(o.expressID);return{ownerHistory:o,ownerHistoryHandle:n}}registerChange(t,...e){this._changeMap[t.uuid]||(this._changeMap[t.uuid]=new Set);for(const i of e)this._changeMap[t.uuid].add(i),this.onDataChanged.trigger({model:t,expressID:i})}async setData(t,...e){for(const i of e){const o=i.expressID;o&&(await t.setProperties(o,i),this.registerChange(t,o))}}async newPset(t,e,i){const o=wt.getIFCSchema(t),{ownerHistoryHandle:n}=await this.getOwnerHistory(t),r=this.newGUID(t),a=new x[o].IfcLabel(e),l=i?new x[o].IfcText(i):null,E=new x[o].IfcPropertySet(r,n,a,l,[]);E.expressID=this.increaseMaxID(t);const d=this.newGUID(t),h=new x[o].IfcRelDefinesByProperties(d,n,null,null,[],new x.Handle(E.expressID));return h.expressID=this.increaseMaxID(t),await this.setData(t,E,h),{pset:E,rel:h}}async removePset(t,...e){for(const i of e){const o=await t.getProperties(i);if((o==null?void 0:o.type)!==x.IFCPROPERTYSET)continue;const n=await ft.getPsetRel(t,i);if(n&&(await t.setProperties(n,null),this.registerChange(t,n)),o){for(const r of o.HasProperties)await t.setProperties(r.value,null);await t.setProperties(i,null),this.onPsetRemoved.trigger({model:t,psetID:i}),this.registerChange(t,i)}}}async newSingleProperty(t,e,i,o){const n=wt.getIFCSchema(t),r=new x[n].IfcIdentifier(i),a=new x[n][e](o),l=new x[n].IfcPropertySingleValue(r,null,a,null);return l.expressID=this.increaseMaxID(t),await this.setData(t,l),l}newSingleStringProperty(t,e,i,o){return this.newSingleProperty(t,e,i,o)}newSingleNumericProperty(t,e,i,o){return this.newSingleProperty(t,e,i,o)}newSingleBooleanProperty(t,e,i,o){return this.newSingleProperty(t,e,i,o)}async removePsetProp(t,e,i){const o=await t.getProperties(e),n=await t.getProperties(i);!o||!n||o.type===x.IFCPROPERTYSET&&n&&(o.HasProperties=o.HasProperties.filter(r=>r.value!==i),await t.setProperties(i,null),this.registerChange(t,e,i))}async addElementToPset(t,e,...i){const o=await ft.getPsetRel(t,e);if(!o)return;const n=await t.getProperties(o);if(n){for(const r of i){const a=new x.Handle(r);n.RelatedObjects.push(a),this.onElementToPset.trigger({model:t,psetID:e,elementID:r})}this.registerChange(t,e)}}async addPropToPset(t,e,...i){const o=await t.getProperties(e);if(o){for(const n of i){if(o.HasProperties.includes(n))continue;const r=new x.Handle(n);o.HasProperties.push(r),this.onPropToPset.trigger({model:t,psetID:e,propID:n})}this.registerChange(t,e)}}async saveToIfc(t,e){const i=this.components.get(fs),o=i.webIfc,n=await i.readIfcFile(e),r=this._changeMap[t.uuid]??[];for(const l of r){const E=await t.getProperties(l);if(E)try{o.WriteLine(n,E)}catch{}else try{o.DeleteLine(n,l)}catch{}}const a=o.SaveModel(n);return i.webIfc.CloseModel(n),i.cleanUp(),a}async setAttributeListener(t,e,i){this.attributeListeners[t.uuid]||(this.attributeListeners[t.uuid]={});const o=this.attributeListeners[t.uuid][e]?this.attributeListeners[t.uuid][e][i]:null;if(o)return o;const n=await t.getProperties(e);if(!n)throw new Error(`Entity with expressID ${e} doesn't exists.`);const r=n[i];if(Array.isArray(r)||!r)throw new Error(`Attribute ${i} is array or null, and it can't have a listener.`);const a=r.value;if(a===void 0||a==null)throw new Error(`Attribute ${i} has a badly defined handle.`);const l=new D;return Object.defineProperty(n[i],"value",{get(){return this._value},async set(E){this._value=E,l.trigger(E)}}),n[i].value=a,this.attributeListeners[t.uuid][e]||(this.attributeListeners[t.uuid][e]={}),this.attributeListeners[t.uuid][e][i]=l,l}};I(wt,"uuid","58c2d9f0-183c-48d6-a402-dfcf5b9a34df");let Ii=wt;const Fs=class Fs extends ${constructor(t){super(t);I(this,"enabled",!0);I(this,"list",{});I(this,"onDisposed",new D);I(this,"onFragmentsDisposed",t=>{const{groupID:e,fragmentIDs:i}=t;for(const o in this.list){const n=this.list[o],r=Object.keys(n);if(r.includes(e))delete n[e],Object.values(n).length===0&&delete this.list[o];else for(const a of r){const l=n[a];for(const E of i)delete l[E];Object.values(l).length===0&&delete n[a]}}});t.add(Fs.uuid,this),t.get(ot).onFragmentsDisposed.add(this.onFragmentsDisposed)}dispose(){this.list={},this.components.get(ot).onFragmentsDisposed.remove(this.onFragmentsDisposed),this.onDisposed.trigger(),this.onDisposed.reset()}remove(t){for(const e in this.list){const i=this.list[e];for(const o in i){const n=i[o];delete n[t]}}}find(t){const e=this.components.get(ot);if(!t){const r={};for(const[a,l]of e.list)r[a]=new Set(l.ids);return r}const i=Object.keys(t).length,o={};for(const r in t){const a=t[r];if(!this.list[r]){console.warn(`Classification ${r} does not exist.`);continue}for(const l of a){const E=this.list[r][l];if(E)for(const d in E){o[d]||(o[d]=new Map);for(const h of E[d]){const u=o[d].get(h);u===void 0?o[d].set(h,1):o[d].set(h,u+1)}}}}const n={};for(const r in o){const a=o[r];for(const[l,E]of a){if(E===void 0)throw new Error("Malformed fragments map!");E===i&&(n[r]||(n[r]=new Set),n[r].add(l))}}return n}byModel(t,e){this.list.model||(this.list.model={});const i=this.list.model;i[t]||(i[t]={});const o=i[t];for(const[n,r]of e.data){const a=r[0];for(const l of a){const E=e.keyFragments.get(l);E&&(o[E]||(o[E]=new Set),o[E].add(n))}}}async byPredefinedType(t){var o;this.list.predefinedTypes||(this.list.predefinedTypes={});const e=this.list.predefinedTypes,i=t.getAllPropertiesIDs();for(const n of i){const r=await t.getProperties(n);if(!r)continue;const a=String((o=r.PredefinedType)==null?void 0:o.value).toUpperCase();e[a]||(e[a]={});const l=e[a];for(const[E,d]of t.data){const h=d[0];for(const u of h){const p=t.keyFragments.get(u);if(!p)throw new Error("Fragment ID not found!");l[p]||(l[p]=new Set),l[p].add(r.expressID)}}}}byEntity(t){this.list.entities||(this.list.entities={});for(const[e,i]of t.data){const n=i[1][1],r=gi[n];this.saveItem(t,"entities",r,e)}}byStorey(t){for(const[e,i]of t.data){const r=i[1][0].toString();this.saveItem(t,"storeys",r,e)}}async byIfcRel(t,e,i){ft.isRel(e)&&await ft.getRelationMap(t,e,async(o,n)=>{const{name:r}=await ft.getEntityName(t,o);for(const a of n)this.saveItem(t,i,r??"NO REL NAME",a)})}setColor(t,e,i=!1){const o=this.components.get(ot);for(const n in t){const r=o.list.get(n);if(!r)continue;const a=t[n];r.setColor(e,a,i)}}resetColor(t){const e=this.components.get(ot);for(const i in t){const o=e.list.get(i);if(!o)continue;const n=t[i];o.resetColor(n)}}saveItem(t,e,i,o){this.list[e]||(this.list[e]={});const n=t.data.get(o);if(n)for(const r of n[0]){const a=t.keyFragments.get(r);if(a){const l=this.list[e];l[i]||(l[i]={}),l[i][a]||(l[i][a]=new Set),l[i][a].add(o)}}}};I(Fs,"uuid","e25a7f3c-46c4-4a14-9d3d-5115f24ebeb7");let ps=Fs;const xe=class xe extends ${constructor(t){super(t);I(this,"enabled",!1);I(this,"height",10);I(this,"groupName","storeys");I(this,"onDisposed",new D);I(this,"list",new Set);t.add(xe.uuid,this)}dispose(){this.list.clear(),this.onDisposed.trigger(xe.uuid),this.onDisposed.reset()}explode(){this.enabled=!0,this.update()}reset(){this.enabled=!1,this.update()}update(){const t=this.components.get(ps),e=this.components.get(ot),i=this.enabled?1:-1;let o=0;const n=t.list[this.groupName],r=new S.Matrix4;for(const a in n){r.elements[13]=o*i*this.height;for(const l in n[a]){const E=e.list.get(l),d=a+l,h=this.list.has(d);if(!E||this.enabled&&h||!this.enabled&&!h)continue;this.enabled?this.list.add(d):this.list.delete(d);const u=n[a][l];E.applyTransform(u,r)}o++}}};I(xe,"uuid","d260618b-ce88-4c7d-826c-6debb91de3e2");let fi=xe;const gs=class gs extends ${constructor(t){super(t);I(this,"enabled",!0);this.components.add(gs.uuid,this)}set(t,e){const i=this.components.get(ot);if(!e){for(const o in i.list){const n=i.list.get(o);n&&(n.setVisibility(t),this.updateCulledVisibility(n))}return}for(const o in e){const n=e[o],r=i.list.get(o);r&&(r.setVisibility(t,n),this.updateCulledVisibility(r))}}isolate(t){this.set(!1),this.set(!0,t)}updateCulledVisibility(t){const e=this.components.get(us);for(const[i,o]of e.list){const n=o.colorMeshes.get(t.id);n&&(n.count=t.mesh.count)}}};I(gs,"uuid","dd9ccf2d-8a21-4821-b7f6-2949add16a29");let pi=gs;class vn extends Oi{constructor(){super(...arguments);I(this,"minGeometrySize",10);I(this,"minAssetsSize",1e3)}}class Si extends Oi{constructor(){super(...arguments);I(this,"propertiesSize",100)}}class Bn extends ${constructor(){super(...arguments);I(this,"onPropertiesStreamed",new xt);I(this,"onProgress",new xt);I(this,"onIndicesStreamed",new xt);I(this,"onDisposed",new D);I(this,"enabled",!0);I(this,"settings",new Si);I(this,"webIfc",new x.IfcAPI)}async dispose(){this.onIndicesStreamed.reset(),this.onPropertiesStreamed.reset(),this.webIfc=null,this.onDisposed.reset()}async streamFromBuffer(t){const e=performance.now();await this.readIfcFile(t),await this.streamAllProperties(),this.cleanUp(),console.log(`Streaming the IFC took ${performance.now()-e} ms!`)}async streamFromCallBack(t){const e=performance.now();await this.streamIfcFile(t),await this.streamAllProperties(),this.cleanUp(),console.log(`Streaming the IFC took ${performance.now()-e} ms!`)}async readIfcFile(t){const{path:e,absolute:i,logLevel:o}=this.settings.wasm;this.webIfc.SetWasmPath(e,i),await this.webIfc.Init(),o&&this.webIfc.SetLogLevel(o),this.webIfc.OpenModel(t,this.settings.webIfc)}async streamIfcFile(t){const{path:e,absolute:i,logLevel:o}=this.settings.wasm;this.webIfc.SetWasmPath(e,i),await this.webIfc.Init(),o&&this.webIfc.SetLogLevel(o),this.webIfc.OpenModelFromCallback(t,this.settings.webIfc)}async streamAllProperties(){const{propertiesSize:t}=this.settings,e=new Set(this.webIfc.GetIfcEntityList(0)),i=[x.IFCRELDEFINESBYPROPERTIES,x.IFCRELDEFINESBYTYPE,x.IFCRELASSOCIATESMATERIAL,x.IFCRELCONTAINEDINSPATIALSTRUCTURE,x.IFCRELASSOCIATESCLASSIFICATION,x.IFCRELASSIGNSTOGROUP],o=new Map,n=new Set([x.IFCPROJECT,x.IFCSITE,x.IFCBUILDING,x.IFCBUILDINGSTOREY,x.IFCSPACE]);for(const E of n)e.add(E);let r=.01,a=0;for(const E of e){if(a++,Fi.has(E))continue;const d=n.has(E),h=this.webIfc.GetLineIDsWithType(0,E),u=h.size();let p=0;for(let F=0;F<u-t;F+=t){const T={};for(let R=0;R<t;R++){p++;const g=h.get(F+R);try{const f=this.webIfc.GetLine(0,g,d);i.includes(E)&&this.getIndices(f,g,o),T[f.expressID]=f}catch{console.log(`Could not get property: ${g}`)}}await this.onPropertiesStreamed.trigger({type:E,data:T})}if(p!==u){const F={};for(let T=p;T<u;T++){const R=h.get(T);try{const g=this.webIfc.GetLine(0,R,d);i.includes(E)&&this.getIndices(g,R,o),F[g.expressID]=g}catch{console.log(`Could not get property: ${R}`)}}await this.onPropertiesStreamed.trigger({type:E,data:F})}const m=a/e.size;m>r&&(r+=.01,r=Math.max(r,m),await this.onProgress.trigger(Math.round(r*100)/100))}const l=[];for(const[E,d]of o)l.push([E,...d]);await this.onIndicesStreamed.trigger(l)}getIndices(t,e,i){const o=t.RelatedObjects||t.RelatedElements;if(!o){console.log(`Related objects not found: ${e}`);return}const n=t.RelatingType||t.RelatingMaterial||t.RelatingStructure||t.RelatingPropertyDefinition||t.RelatingGroup||t.RelatingClassification;if(!n){console.log(`Relating object not found: ${e}`);return}if(!Array.isArray(o)||n.value===void 0)return;const r=n.value;for(const a of o){if(a.value===void 0||a.value===null)continue;const l=a.value;i.has(l)||i.set(l,new Set),i.get(l).add(r)}}cleanUp(){this.webIfc=null,this.webIfc=new x.IfcAPI}}I(Bn,"uuid","88d2c89c-ce32-47d7-8cb6-d51e4b311a0b");const Os=class Os extends ${constructor(t){super(t);I(this,"onGeometryStreamed",new D);I(this,"onAssetStreamed",new D);I(this,"onProgress",new D);I(this,"onIfcLoaded",new D);I(this,"onDisposed",new D);I(this,"settings",new vn);I(this,"enabled",!0);I(this,"webIfc",new x.IfcAPI);I(this,"_spatialTree",new Un);I(this,"_metaData",new bn);I(this,"_visitedGeometries",new Map);I(this,"_streamSerializer",new Ut.StreamSerializer);I(this,"_geometries",new Map);I(this,"_geometryCount",0);I(this,"_civil",new xn);I(this,"_groupSerializer",new Ut.Serializer);I(this,"_assets",[]);I(this,"_meshesWithHoles",new Set);this.components.add(Os.uuid,this),this.settings.excludedCategories.add(x.IFCOPENINGELEMENT)}dispose(){this.onIfcLoaded.reset(),this.onGeometryStreamed.reset(),this.onAssetStreamed.reset(),this.webIfc=null,this.onDisposed.trigger(),this.onDisposed.reset()}async streamFromBuffer(t){const e=performance.now();await this.readIfcFile(t),await this.streamAllGeometries(),this.cleanUp(),console.log(`Streaming the IFC took ${performance.now()-e} ms!`)}async streamFromCallBack(t){const e=performance.now();await this.streamIfcFile(t),await this.streamAllGeometries(),this.cleanUp(),console.log(`Streaming the IFC took ${performance.now()-e} ms!`)}async readIfcFile(t){const{path:e,absolute:i,logLevel:o}=this.settings.wasm;this.webIfc.SetWasmPath(e,i),await this.webIfc.Init(),o&&this.webIfc.SetLogLevel(o),this.webIfc.OpenModel(t,this.settings.webIfc)}async streamIfcFile(t){const{path:e,absolute:i,logLevel:o}=this.settings.wasm;this.webIfc.SetWasmPath(e,i),await this.webIfc.Init(),o&&this.webIfc.SetLogLevel(o),this.webIfc.OpenModelFromCallback(t,this.settings.webIfc)}async streamAllGeometries(){const{minGeometrySize:t,minAssetsSize:e}=this.settings;this._spatialTree.setUp(this.webIfc);const i=this.webIfc.GetIfcEntityList(0),o=[[]],n=new Ut.FragmentsGroup,{FILE_NAME:r,FILE_DESCRIPTION:a}=x;n.ifcMetadata={name:this._metaData.get(this.webIfc,r),description:this._metaData.get(this.webIfc,a),schema:this.webIfc.GetModelSchema(0)||"IFC2X3",maxExpressID:this.webIfc.GetMaxExpressID(0)};let l=0,E=0;for(const R of i){if(!this.webIfc.IsIfcElement(R)&&R!==x.IFCSPACE||this.settings.excludedCategories.has(R))continue;const g=this.webIfc.GetLineIDsWithType(0,R),f=g.size();for(let A=0;A<f;A++){l>t&&(l=0,E++,o.push([]));const O=g.get(A);if(O!==9056429)continue;o[E].push(O);const _=this._spatialTree.itemsByFloor[O]||0;n.data.set(O,[[],[_,R]]),l++}}this._spatialTree.cleanUp();let d=.01,h=0;for(const R of o){h++,this.webIfc.StreamMeshes(0,R,f=>{this.getMesh(this.webIfc,f,n)}),this._geometryCount>t&&await this.streamGeometries(),this._assets.length>e&&await this.streamAssets();const g=h/o.length;g>d&&(d+=.01,d=Math.max(d,g),this.onProgress.trigger(Math.round(d*100)/100))}this._geometryCount&&await this.streamGeometries(),this._assets.length&&await this.streamAssets();const{opaque:u,transparent:p}=n.geometryIDs;for(const[R,{index:g,uuid:f}]of this._visitedGeometries)n.keyFragments.set(g,f),(R>1?u:p).set(R,g);const m=n.data.keys();for(const R of m){const[g]=n.data.get(R);g.length||n.data.delete(R)}const F=this.webIfc.GetCoordinationMatrix(0);n.coordinationMatrix.fromArray(F),n.civilData=this._civil.read(this.webIfc);const T=this._groupSerializer.export(n);this.onIfcLoaded.trigger(T),n.dispose(!0)}cleanUp(){this.webIfc=null,this.webIfc=new x.IfcAPI,this._visitedGeometries.clear(),this._geometries.clear(),this._assets=[],this._meshesWithHoles.clear()}getMesh(t,e,i){const o=e.geometries.size(),n=e.expressID,r={id:n,geometries:[]};for(let a=0;a<o;a++){const l=e.geometries.get(a),E=l.geometryExpressID,d=l.color.w===1?1:-1,h=E*d;if(!this._visitedGeometries.has(h)){this._visitedGeometries.has(E)||this.getGeometry(t,E);const A=this._visitedGeometries.size,O=S.MathUtils.generateUUID();this._visitedGeometries.set(h,{uuid:O,index:A})}const u=this._visitedGeometries.get(h);if(u===void 0)throw new Error("Error getting geometry data for streaming!");const p=i.data.get(n);if(!p)throw new Error("Data not found!");p[0].push(u.index);const{x:m,y:F,z:T,w:R}=l.color,g=[m,F,T,R],f=l.flatTransformation;r.geometries.push({color:g,geometryID:E,transformation:f})}this._assets.push(r)}getGeometry(t,e){const i=t.GetGeometry(0,e),o=t.GetIndexArray(i.GetIndexData(),i.GetIndexDataSize()),n=t.GetVertexArray(i.GetVertexData(),i.GetVertexDataSize()),r=new Float32Array(n.length/2),a=new Float32Array(n.length/2);for(let u=0;u<n.length;u+=6)r[u/2]=n[u],r[u/2+1]=n[u+1],r[u/2+2]=n[u+2],a[u/2]=n[u+3],a[u/2+1]=n[u+4],a[u/2+2]=n[u+5];const l=mn(r),E=new Float32Array(l.transformation.elements),d=[l.center.x,l.center.y,l.center.z];let h=!1;for(let u=0;u<r.length-2;u+=3){const p=r[u],m=r[u+1],F=r[u+2],T=a[u],R=a[u+1],g=a[u+2];if(Rn(d,[p,m,F],[T,R,g])){h=!0;break}}this._geometries.set(e,{position:r,normal:a,index:o,boundingBox:E,hasHoles:h}),i.delete(),this._geometryCount++}async streamAssets(){await this.onAssetStreamed.trigger(this._assets),this._assets=null,this._assets=[]}async streamGeometries(){let t=this._streamSerializer.export(this._geometries),e={};for(const[i,{boundingBox:o,hasHoles:n}]of this._geometries)e[i]={boundingBox:o,hasHoles:n};this.onGeometryStreamed.trigger({data:e,buffer:t}),e=null,t=null,this._geometries.clear(),this._geometryCount=0}};I(Os,"uuid","d9999a00-e1f5-4d3f-8cfe-c56e08609764");let Ci=Os;class Vn extends ${constructor(){super(...arguments);I(this,"onPropertiesStreamed",new xt);I(this,"onProgress",new xt);I(this,"onIndicesStreamed",new xt);I(this,"onDisposed",new D);I(this,"enabled",!0);I(this,"settings",new Si);I(this,"webIfc",new x.IfcAPI)}async dispose(){this.onIndicesStreamed.reset(),this.onPropertiesStreamed.reset(),this.webIfc=null,this.onDisposed.reset()}async streamFromBuffer(t){const e=performance.now();await this.readIfcFile(t),await this.streamAllProperties(),this.cleanUp(),console.log(`Streaming the IFC took ${performance.now()-e} ms!`)}async streamFromCallBack(t){const e=performance.now();await this.streamIfcFile(t),await this.streamAllProperties(),this.cleanUp(),console.log(`Streaming the IFC took ${performance.now()-e} ms!`)}async readIfcFile(t){const{path:e,absolute:i,logLevel:o}=this.settings.wasm;this.webIfc.SetWasmPath(e,i),await this.webIfc.Init(),o&&this.webIfc.SetLogLevel(o),this.webIfc.OpenModel(t,this.settings.webIfc)}async streamIfcFile(t){const{path:e,absolute:i,logLevel:o}=this.settings.wasm;this.webIfc.SetWasmPath(e,i),await this.webIfc.Init(),o&&this.webIfc.SetLogLevel(o),this.webIfc.OpenModelFromCallback(t,this.settings.webIfc)}async streamAllProperties(){const{propertiesSize:t}=this.settings,e=new Set(this.webIfc.GetIfcEntityList(0)),i=new Set([x.IFCPROJECT,x.IFCSITE,x.IFCBUILDING,x.IFCBUILDINGSTOREY,x.IFCSPACE]);for(const l of i)e.add(l);let o=.01,n=0;for(const l of e){if(n++,Fi.has(l))continue;const E=i.has(l),d=this.webIfc.GetLineIDsWithType(0,l),h=d.size();let u=0;for(let m=0;m<h-t;m+=t){const F={};for(let T=0;T<t;T++){u++;const R=d.get(m+T);try{const g=this.webIfc.GetLine(0,R,E);F[g.expressID]=g}catch{console.log(`Could not get property: ${R}`)}}await this.onPropertiesStreamed.trigger({type:l,data:F})}if(u!==h){const m={};for(let F=u;F<h;F++){const T=d.get(F);try{const R=this.webIfc.GetLine(0,T,E);m[R.expressID]=R}catch{console.log(`Could not get property: ${T}`)}}await this.onPropertiesStreamed.trigger({type:l,data:m})}const p=n/e.size;p>o&&(o+=.01,o=Math.max(o,p),await this.onProgress.trigger(Math.round(o*100)/100))}const a=await this.components.get(Is).processFromWebIfc(this.webIfc,0);await this.onIndicesStreamed.trigger(a)}cleanUp(){this.webIfc=null,this.webIfc=new x.IfcAPI}}I(Vn,"uuid","88d2c89c-ce32-47d7-8cb6-d51e4b311a0b");class wr{static getFace(s,t,e){if(!s.geometry.index)throw new Error("Geometry must be indexed!");const i=new Map,o=s.geometry.index.array,{plane:n}=this.getFaceData(t,e,s),r=[];for(let d=0;d<o.length/3;d++){const{plane:h,edges:u}=this.getFaceData(d,e,s);if(h.equals(n)){r.push({index:d,edges:u});for(const{id:p,points:m,distance:F}of u)i.set(p,{points:m,distance:F})}}let a=0;const l=new Map,E=new Map;for(const{index:d,edges:h}of r){const u=new Map;for(const{id:f}of h)if(l.has(f)){const A=l.get(f);u.set(f,A)}const p=h.map(f=>f.id);if(!u.size){const f=a++;for(const{id:A}of h)l.set(A,f);E.set(f,{edges:new Set(p),indices:new Set([d])});continue}let m=null;const F=new Set,T=new Set(p);for(const[f,A]of u){m===null?m=A:A!==m&&F.add(A),l.delete(f);const{edges:O}=E.get(A);O.delete(f),T.delete(f)}if(m===null)throw new Error("Error computing face!");const R=E.get(m),{indices:g}=R;g.add(d);for(const f of T){l.set(f,m);const{edges:A}=R;A.add(f)}for(const f of F){const A=E.get(f),{edges:O,indices:_}=A,y=E.get(m),{edges:N,indices:L}=y;for(const w of O)N.add(w),l.set(w,m);for(const w of _)L.add(w);E.delete(f)}}for(const[d,{indices:h,edges:u}]of E)if(h.has(t)){const p=[];for(const m of u){const F=i.get(m);p.push(F)}return{edges:p,indices:h}}return null}static distanceFromPointToLine(s,t,e,i=!1){const o=new S.Line3,n=new S.Vector3;return o.set(t,e),o.closestPointToPoint(s,i,n),n.distanceTo(s)}static getFaceData(s,t,e){const i=this.getVerticesAndNormal(e,s,t),{p1:o,p2:n,p3:r,faceNormal:a}=i;this.round(o),this.round(n),this.round(r),this.round(a);const l=[{id:`${o.x}|${o.y}|${o.z}`,value:o},{id:`${n.x}|${n.y}|${n.z}`,value:n},{id:`${r.x}|${r.y}|${r.z}`,value:r}];l.sort((R,g)=>R.id<g.id?-1:R.id>g.id?1:0);const[{id:E,value:d},{id:h,value:u},{id:p,value:m}]=l,F=[{id:`${E}|${h}`,distance:d.distanceTo(u),points:[d,u]},{id:`${h}|${p}`,distance:u.distanceTo(m),points:[u,m]},{id:`${E}|${p}`,distance:d.distanceTo(m),points:[d,m]}],T=new S.Plane;return T.setFromNormalAndCoplanarPoint(a,o),T.constant=Math.round(T.constant*10)/10,{plane:T,edges:F}}static getVerticesAndNormal(s,t,e){if(!s.geometry.index)throw new Error("Geometry must be indexed!");const i=s.geometry.index.array,o=s.geometry.attributes.position.array,n=s.geometry.attributes.normal.array,r=i[t*3]*3,a=i[t*3+1]*3,l=i[t*3+2]*3,E=new S.Vector3(o[r],o[r+1],o[r+2]),d=new S.Vector3(o[a],o[a+1],o[a+2]),h=new S.Vector3(o[l],o[l+1],o[l+2]),u=new S.Vector3(n[r],n[r+1],n[r+2]),p=new S.Vector3(n[a],n[a+1],n[a+2]),m=new S.Vector3(n[l],n[l+1],n[l+2]),F=(u.x+p.x+m.x)/3,T=(u.y+p.y+m.y)/3,R=(u.z+p.z+m.z)/3,g=new S.Vector3(F,T,R);if(!g.x&&!g.y&&!g.z&&console.log("hey"),e!==void 0&&s instanceof S.InstancedMesh){const f=new S.Matrix4;s.getMatrixAt(e,f);const A=new S.Matrix4;A.extractRotation(f),g.applyMatrix4(A),E.applyMatrix4(f),d.applyMatrix4(f),h.applyMatrix4(f)}return{p1:E,p2:d,p3:h,faceNormal:g}}static round(s){s.x=Math.trunc(s.x*1e3)/1e3,s.y=Math.trunc(s.y*1e3)/1e3,s.z=Math.trunc(s.z*1e3)/1e3}}exports.AsyncEvent=xt;exports.Base=ys;exports.BaseCamera=pn;exports.BaseRenderer=Cn;exports.BaseScene=Tn;exports.BaseWorldItem=Ns;exports.BoundingBoxes=ui;exports.Clipper=hi;exports.Component=$;exports.Components=Es;exports.CullerRenderer=_n;exports.Cullers=us;exports.Disposer=yt;exports.Event=D;exports.FirstPersonMode=Nn;exports.FragmentClassifier=ps;exports.FragmentExploder=fi;exports.FragmentHider=pi;exports.FragmentIfcLoader=fs;exports.FragmentManager=ot;exports.FragmentPropsStreamConverter=Bn;exports.Grids=On;exports.IfcCategories=yr;exports.IfcCategoryMap=gi;exports.IfcElements=Dn;exports.IfcGeometryTiler=Ci;exports.IfcJsonExporter=wn;exports.IfcPropertiesFinder=Nr;exports.IfcPropertiesManager=Ii;exports.IfcPropertiesTiler=Vn;exports.IfcPropertiesUtils=ft;exports.IfcRelationsIndexer=Is;exports.IfcStreamingSettings=vn;exports.Materials=Ei;exports.MaterialsUtils=li;exports.MeasurementUtils=wr;exports.MeshCullerRenderer=yn;exports.MiniMaps=di;exports.OrbitMode=Pn;exports.OrthoPerspectiveCamera=_r;exports.PlanMode=Ln;exports.ProjectionManager=Mn;exports.PropertiesStreamingSettings=Si;exports.Raycasters=ce;exports.SimpleCamera=le;exports.SimplePlane=Ps;exports.SimpleRenderer=lr;exports.SimpleScene=cr;exports.SimpleWorld=An;exports.UUID=ae;exports.VertexPicker=or;exports.Worlds=ds;exports.isPointInFrontOfPlane=Rn;exports.obbFromPoints=mn;exports.readPixelsAsync=Sn;