UNPKG

phy-engine

Version:

JavaScript 3D Physics for three.js

1 lines 2.87 MB
const A=new Map,g=new Map,I=new Map,B={Ar:null,ArPos:{},needTrigger:!1,needContact:!1,world:null,bodyRef:null,queryCollector:null,timestep:1/60,delta:0,ms:0,deltaTime:0,tmpStep:0,substep:1,key:[],gravity:[0,9.81,0],reflow:{ray:[],point:{},contact:{},velocity:{},stat:{fps:0,delta:0,ms:0}}},Q={clear:()=>{A.clear(),g.clear(),I.clear()},byName:g=>A.has(g)?A.get(g):null,byId:A=>g.has(A)?g.get(A):null,add:I=>{"ray"!==I.type&&"contact"!==I.type&&"terrain"!==I.type&&"joint"!==I.type&&I.type,"body"!==I.type&&"solid"!==I.type||g.set(I[0],I),A.set(I.name,I)},remove:g=>{if("ray"!==g.type&&"contact"!==g.type)switch(g.type){case"terrain":g.release();break;case"joint":havok.HP_Constraint_SetEnabled(g,!1),havok.HP_Constraint_Release(g);break;default:havok.HP_World_RemoveBody(B.world,g),havok.HP_Body_Release(g)}A.delete(g.name)},stats:()=>{},extends:()=>{},byContact:A=>!!I.has(A),clearContact:()=>{I.clear()},addContact:(A,g={})=>{I.set(A,g)},removeContact:A=>{I.delete(A)}},C=4e3,E=1e3,D=4e3,w=100,i=100,o={bodyFull:14,body:8,joint:16,contact:1,ray:11,character:16,vehicle:72,solver:128},F=3.141592653589793,M=F/180,G=180/F,U=Number.EPSILON,H=.5*F,S={luminousPowers:{"110000 lm (1000W)":11e4,"3500 lm (300W)":3500,"1700 lm (100W)":1700,"800 lm (60W)":800,"400 lm (40W)":400,"180 lm (25W)":180,"20 lm (4W)":20,Off:0},luminousIrradiances:{"0.0001 lx (Moonless Night)":1e-4,"0.002 lx (Night Airglow)":.002,"0.5 lx (Full Moon)":.5,"3.4 lx (City Twilight)":3.4,"50 lx (Living Room)":50,"100 lx (Very Overcast)":100,"350 lx (Office Room)":350,"400 lx (Sunrise/Sunset)":400,"1000 lx (Overcast)":1e3,"18000 lx (Daylight)":18e3,"50000 lx (Direct Sun)":5e4},exposure:A=>Math.pow(A,5),candelaToLumens:A=>4*A*Math.PI,lumensToCandela:A=>A/(4*Math.PI),average:A=>A?.reduce(((A,g)=>A+g),0)/A.length,atan2:(A,g)=>Math.fround(Math.atan2(A,g)),pow:(A,g)=>Math.fround(Math.pow(A,g)),sin:A=>Math.fround(Math.sin(A)),cos:A=>Math.fround(Math.cos(A)),sqrt:A=>Math.fround(Math.sqrt(A)),exp:A=>Math.fround(Math.exp(A)),todeg:G,torad:M,toFixed:(A,g=3)=>1*A.toFixed(g),toRound:(A,g=3)=>Math.trunc(A),clamp:(A,g=0,I=1)=>A<g?g:A>I?I:A,min:(A,g)=>A<g?A:g,max:(A,g)=>A>g?A:g,lerp:(A,g,I)=>(1-I)*A+I*g,sign:A=>A>0?1:A<0?-1:0,fast_negexp:A=>1/(1+A+.48*A*A+.235*A*A*A),fast_atan:A=>{let g=Math.abs(A),I=g>1?1/g:g,B=F/4*I-I*(I-1)*(.2447+.0663*I);return copysign(g>1?F/2-B:B,A)},clampA:(A,g,I)=>Math.max(g,Math.min(I,A)),smoothstep:(A,g,I)=>A*(I=-2*(I=S.clamp(I))*I*I+3*I*I)+g*(1-I),remap:(A,g,I,B,Q)=>B+(A-g)*(Q-B)/(I-g),damp:(A,g,I,B)=>S.lerp(A,g,1-Math.exp(-I*B)),nearAngle:(A,g,I=!1)=>g+Math.atan2(Math.sin(A-g),Math.cos(A-g))*(I?G:1),unwrapDeg:A=>A-360*Math.floor((A+180)/360),unwrapRad:A=>Math.atan2(Math.sin(A),Math.cos(A)),nearEquals:(A,g,I=1e-4)=>Math.abs(A-g)<=I,autoSize:(A=[1,1,1],g="box")=>{1===A.length&&(A[1]=A[0]);let I=A[0],B=A[1];return"sphere"===g&&(A=[I,I,I]),"cylinder"!==g&&"wheel"!==g&&"capsule"!==g||(A=[I,B,I]),"cone"!==g&&"pyramid"!==g||(A=[I,B,I]),2===A.length&&(A[2]=A[0]),A},shuffle:A=>A.map((A=>({value:A,sort:Math.random()}))).sort(((A,g)=>A.sort-g.sort)).map((({value:A})=>A)),randomSign:()=>Math.random()<.5?-1:1,randSpread:A=>A*(.5-Math.random()),rand:(A=0,g=1)=>A+Math.random()*(g-A),randInt:(A,g)=>A+Math.floor(Math.random()*(g-A+1)),randIntUnic:(A,g,I)=>{for(var B=[];B.length<I;){var Q=S.randInt(A,g);-1===B.indexOf(Q)&&B.push(Q)}return B},fromTransform:(A,g,I,B=[0,0,0,1],Q=!1)=>{let C=S.composeMatrixArray(A,g),E=S.composeMatrixArray(I,B);return Q&&(C=S.invertMatrixArray(C)),C=S.multiplyMatrixArray(C,E),[C[12],C[13],C[14]]},fromTransformToQ:(A,g,I=!1)=>{let B=S.composeMatrixArray(A,g),Q=S.decomposeFullMatrixArray(B).q;return I&&(Q=S.quatInvert(Q)),Q},lerpTransform:(A,g,I)=>{let B=A[0],Q=A[1],C=g[0],E=g[1];return C=S.lerpArray(B,C,I),E=S.slerpQuatArray(Q,E,I),[C,E]},Mat3FromQuatArray:A=>{const g=A[0],I=A[1],B=A[2],Q=A[3],C=g+g,E=I+I,D=B+B,w=g*C,i=g*E,o=g*D,F=I*E,M=I*D,G=B*D,U=Q*C,H=Q*E,S=Q*D;return[[1*(1-(F+G)),1*(i-S),1*(o+H)],[1*(i+S),1*(1-(w+G)),1*(M-U)],[1*(o-H),1*(M+U),1*(1-(w+F))]]},composeMatrixArray:(A,g,I=[1,1,1])=>{const B=g[0],Q=g[1],C=g[2],E=g[3],D=B+B,w=Q+Q,i=C+C,o=B*D,F=B*w,M=B*i,G=Q*w,U=Q*i,H=C*i,S=E*D,R=E*w,N=E*i,k=I[0],K=I[1],Y=I[2];return[(1-(G+H))*k,(F+N)*k,(M-R)*k,0,(F-N)*K,(1-(o+H))*K,(U+S)*K,0,(M+R)*Y,(U-S)*Y,(1-(o+G))*Y,0,A[0],A[1],A[2],1]},multiplyMatrixArray:(A,g)=>{const I=A,B=g,Q=[],C=I[0],E=I[4],D=I[8],w=I[12],i=I[1],o=I[5],F=I[9],M=I[13],G=I[2],U=I[6],H=I[10],S=I[14],R=I[3],N=I[7],k=I[11],K=I[15],Y=B[0],y=B[4],L=B[8],s=B[12],J=B[1],h=B[5],c=B[9],P=B[13],a=B[2],f=B[6],e=B[10],q=B[14],T=B[3],d=B[7],x=B[11],v=B[15];return Q[0]=C*Y+E*J+D*a+w*T,Q[4]=C*y+E*h+D*f+w*d,Q[8]=C*L+E*c+D*e+w*x,Q[12]=C*s+E*P+D*q+w*v,Q[1]=i*Y+o*J+F*a+M*T,Q[5]=i*y+o*h+F*f+M*d,Q[9]=i*L+o*c+F*e+M*x,Q[13]=i*s+o*P+F*q+M*v,Q[2]=G*Y+U*J+H*a+S*T,Q[6]=G*y+U*h+H*f+S*d,Q[10]=G*L+U*c+H*e+S*x,Q[14]=G*s+U*P+H*q+S*v,Q[3]=R*Y+N*J+k*a+K*T,Q[7]=R*y+N*h+k*f+K*d,Q[11]=R*L+N*c+k*e+K*x,Q[15]=R*s+N*P+k*q+K*v,Q},invertMatrixArray:A=>{const g=A,I=g[0],B=g[1],Q=g[2],C=g[3],E=g[4],D=g[5],w=g[6],i=g[7],o=g[8],F=g[9],M=g[10],G=g[11],U=g[12],H=g[13],S=g[14],R=g[15],N=F*S*i-H*M*i+H*w*G-D*S*G-F*w*R+D*M*R,k=U*M*i-o*S*i-U*w*G+E*S*G+o*w*R-E*M*R,K=o*H*i-U*F*i+U*D*G-E*H*G-o*D*R+E*F*R,Y=U*F*w-o*H*w-U*D*M+E*H*M+o*D*S-E*F*S,y=I*N+B*k+Q*K+C*Y;if(0===y)return[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];const L=1/y;return g[0]=N*L,g[1]=(H*M*C-F*S*C-H*Q*G+B*S*G+F*Q*R-B*M*R)*L,g[2]=(D*S*C-H*w*C+H*Q*i-B*S*i-D*Q*R+B*w*R)*L,g[3]=(F*w*C-D*M*C-F*Q*i+B*M*i+D*Q*G-B*w*G)*L,g[4]=k*L,g[5]=(o*S*C-U*M*C+U*Q*G-I*S*G-o*Q*R+I*M*R)*L,g[6]=(U*w*C-E*S*C-U*Q*i+I*S*i+E*Q*R-I*w*R)*L,g[7]=(E*M*C-o*w*C+o*Q*i-I*M*i-E*Q*G+I*w*G)*L,g[8]=K*L,g[9]=(U*F*C-o*H*C-U*B*G+I*H*G+o*B*R-I*F*R)*L,g[10]=(E*H*C-U*D*C+U*B*i-I*H*i-E*B*R+I*D*R)*L,g[11]=(o*D*C-E*F*C-o*B*i+I*F*i+E*B*G-I*D*G)*L,g[12]=Y*L,g[13]=(o*H*Q-U*F*Q+U*B*M-I*H*M-o*B*S+I*F*S)*L,g[14]=(U*D*Q-E*H*Q-U*B*w+I*H*w+E*B*S-I*D*S)*L,g[15]=(E*F*Q-o*D*Q+o*B*w-I*F*w-E*B*M+I*D*M)*L,g},matrixArrayDeterminant:A=>{const g=A,I=g[0],B=g[4],Q=g[8],C=g[12],E=g[1],D=g[5],w=g[9],i=g[13],o=g[2],F=g[6],M=g[10],G=g[14];return g[3]*(+C*w*F-Q*i*F-C*D*M+B*i*M+Q*D*G-B*w*G)+g[7]*(+I*w*G-I*i*M+C*E*M-Q*E*G+Q*i*o-C*w*o)+g[11]*(+I*i*F-I*D*G-C*E*F+B*E*G+C*D*o-B*i*o)+g[15]*(-Q*D*o-I*w*F+I*D*M+Q*E*F-B*E*M+B*w*o)},decomposeMatrixArray:A=>[A[12],A[13],A[14]],decomposeFullMatrixArray:A=>{const g=A;let I=S.lengthArray([g[0],g[1],g[2]]);const B=S.lengthArray([g[4],g[5],g[6]]),Q=S.lengthArray([g[8],g[9],g[10]]);S.matrixArrayDeterminant(A)<0&&(I=-I);let C=[...A];const E=1/I,D=1/B,w=1/Q;C[0]*=E,C[1]*=E,C[2]*=E,C[4]*=D,C[5]*=D,C[6]*=D,C[8]*=w,C[9]*=w,C[10]*=w;let i=S.quatFromRotationMatrix(C);return{p:[A[12],A[13],A[14]],q:i,s:[I,B,Q]}},applyTransformArray:(A,g,I,B=[1,1,1])=>{const Q=S.composeMatrixArray(g,I,B),C=A[0],E=A[1],D=A[2],w=1/(Q[3]*C+Q[7]*E+Q[11]*D+Q[15]);return[(Q[0]*C+Q[4]*E+Q[8]*D+Q[12])*w,(Q[1]*C+Q[5]*E+Q[9]*D+Q[13])*w,(Q[2]*C+Q[6]*E+Q[10]*D+Q[14])*w]},slerpQuatArray:(A,g,I)=>{if(0===I)return A;if(1===I)return g;let B=[...A];const Q=A[0],C=A[1],E=A[2],D=A[3],w=g[0],i=g[1],o=g[2],F=g[3];let M=D*F+Q*w+C*i+E*o;if(M<0?(B=[-w,-i,-o,-F],M=-M):B=[...g],M>=1)return A;const G=1-M*M;if(G<=U){const A=1-I;return B[3]=A*D+I*B[3],B[0]=A*Q+I*B[0],B[1]=A*C+I*B[1],B[2]=A*E+I*B[2],S.quatNomalize(B)}const H=Math.sqrt(G),R=Math.atan2(H,M),N=Math.sin((1-I)*R)/H,k=Math.sin(I*R)/H;return B[3]=D*N+B[3]*k,B[0]=Q*N+B[0]*k,B[1]=C*N+B[1]*k,B[2]=E*N+B[2]*k,B},toLocalQuatArray:(A=[0,0,0],g)=>{let I=S.quatFromEuler(A),B=S.quatInvert(g.quaternion.toArray());return S.quatMultiply(B,I)},quatFromRotationMatrix:A=>{let g=[0,0,0,1];const I=A,B=I[0],Q=I[4],C=I[8],E=I[1],D=I[5],w=I[9],i=I[2],o=I[6],F=I[10],M=B+D+F;if(M>0){const A=.5/Math.sqrt(M+1);g[3]=.25/A,g[0]=(o-w)*A,g[1]=(C-i)*A,g[2]=(E-Q)*A}else if(B>D&&B>F){const A=2*Math.sqrt(1+B-D-F);g[3]=(o-w)/A,g[0]=.25*A,g[1]=(Q+E)/A,g[2]=(C+i)/A}else if(D>F){const A=2*Math.sqrt(1+D-B-F);g[3]=(C-i)/A,g[0]=(Q+E)/A,g[1]=.25*A,g[2]=(w+o)/A}else{const A=2*Math.sqrt(1+F-B-D);g[3]=(E-Q)/A,g[0]=(C+i)/A,g[1]=(w+o)/A,g[2]=.25*A}return g},quatFromEuler:(A=[0,0,0],g=!0,I="XYZ")=>{const B=Math.cos,Q=Math.sin,C=g?M:1,E=A[0]*C/2,D=A[1]*C/2,w=A[2]*C/2,i=B(E),o=B(D),F=B(w),G=Q(E),U=Q(D),H=Q(w);let S,R,N,k;switch(I){case"XYZ":S=G*o*F+i*U*H,R=i*U*F-G*o*H,N=i*o*H+G*U*F,k=i*o*F-G*U*H;break;case"YXZ":S=G*o*F+i*U*H,R=i*U*F-G*o*H,N=i*o*H-G*U*F,k=i*o*F+G*U*H;break;case"ZXY":S=G*o*F-i*U*H,R=i*U*F+G*o*H,N=i*o*H+G*U*F,k=i*o*F-G*U*H;break;case"ZYX":S=G*o*F-i*U*H,R=i*U*F+G*o*H,N=i*o*H-G*U*F,k=i*o*F+G*U*H;break;case"YZX":S=G*o*F+i*U*H,R=i*U*F+G*o*H,N=i*o*H-G*U*F,k=i*o*F-G*U*H;break;case"XZY":S=G*o*F-i*U*H,R=i*U*F-G*o*H,N=i*o*H+G*U*F,k=i*o*F+G*U*H}return[S,R,N,k]},quatFromAxis:(A=[0,0,0],g,I=!0)=>{const B=.5*g*(I?M:1),Q=Math.sin(B);return[A[0]*Q,A[1]*Q,A[2]*Q,Math.cos(B)]},quatNomalize:A=>{let g=S.lengthArray(A);return 0===g?[0,0,0,1]:(g=1/g,S.scaleArray(A,g,4))},quatInvert:A=>[-A[0],-A[1],-A[2],A[3]],quatMultiply:(A,g)=>{const I=A[0],B=A[1],Q=A[2],C=A[3],E=g[0],D=g[1],w=g[2],i=g[3];return[I*i+C*E+B*w-Q*D,B*i+C*D+Q*E-I*w,Q*i+C*w+I*D-B*E,C*i-I*E-B*D-Q*w]},quatToAxis:A=>{Math.acos(A[3]);let g=Math.sqrt(1-A[3]*A[3]);return g<1e-5&&(g=1),[A[0]/g,A[1]/g,A[2]/g]},eulerFromMatrix:A=>{const g=A[0],I=A[4],B=A[8];A[1];const Q=A[5],C=A[9];A[2];const E=A[6],D=A[10];let w=[0,0,0];return w[1]=Math.asin(S.clamp(B,-1,1)),Math.abs(B)<.9999999?(w[0]=Math.atan2(-C,D),w[2]=Math.atan2(-I,g)):(w[0]=Math.atan2(E,Q),w[2]=0),w},angleTo:(A,g)=>2*Math.acos(Math.abs(S.clamp(S.dotArray(A,g),-1,1))),fixedArray:(A,g)=>{let I=A.length,B=[];for(;I--;)B[I]=S.toFixed(A[I],g);return B},getSize:A=>.001*A.byteLength+"kb",perpendicularArray0:A=>{const g=A[0],I=A[1],B=A[2],Q=g*g,C=I*I,E=B*B;let D,w;switch(w=Q<C?Q<E?"X":"Z":C<E?"Y":"Z",w){case"X":return D=1/Math.sqrt(C+E),[0,B*D,-I*D];case"Y":return D=1/Math.sqrt(E+Q),[-B*D,0,g*D];case"Z":return D=1/Math.sqrt(Q+C),[I*D,-g*D,0]}},perpendicularArray:A=>{const g=Math.sqrt(A[0]*A[0]+A[1]*A[1]+A[2]*A[2]);let I=Math.acos(A[1]/g);const B=Math.atan2(A[2],A[0]);I-=H;return[g*Math.sin(I)*Math.cos(B),g*Math.cos(I),g*Math.sin(I)*Math.sin(B)]},crossArray:(A,g)=>{const I=A[0],B=A[1],Q=A[2],C=g[0],E=g[1],D=g[2];return[B*D-Q*E,Q*C-I*D,I*E-B*C]},applyQuaternion:(A,g)=>{const I=A[0],B=A[1],Q=A[2],C=g[0],E=g[1],D=g[2],w=g[3],i=2*(E*Q-D*B),o=2*(D*I-C*Q),F=2*(C*B-E*I);return[I+w*i+E*F-D*o,B+w*o+D*i-C*F,Q+w*F+C*o-E*i]},nullArray:(A,g,I)=>{let B=0;for(;I--;)B+=A[g+I];return B},equalArray:(A,g)=>{let I=A.length;for(;I--;)if(A[I]!==g[I])return!1;return!0},lerpArray:(A,g,I)=>{if(0===I)return A;if(1===I)return g;let B=A.length,Q=[];for(;B--;)Q[B]=A[B],Q[B]+=(g[B]-Q[B])*I;return Q},zeroArray:(A,g=0,I)=>{for(I=I??A.length;I--;)A[g+I]=0;return A},lengthArray:A=>{let g=A.length,I=0;for(;g--;)I+=A[g]*A[g];return Math.sqrt(I)},dotArray:(A,g)=>{let I=A.length,B=0;for(;I--;)B+=A[I]*g[I];return B},addArray:(A,g,I)=>{I=I??A.length;let B=[];for(;I--;)B[I]=A[I]+g[I];return B},subArray:(A,g,I)=>{I=I??A.length;let B=[];for(;I--;)B[I]=A[I]-g[I];return B},mulArray:(A,g,I)=>{if(g instanceof Array){let B=[];for(I=I??A.length;I--;)B[I]=A[I]*g[I];return B}return A.map((A=>A*g))},worldscale:(A,g)=>A.map((A=>A*g)),divArray:(A,g,I)=>S.mulArray(A,1/g,I),scaleArray:(A,g,I)=>S.mulArray(A,g,I),fillArray:(A,g,I=0,B)=>{for(B=B??A.length;B--;)g[I+B]=A[B]},copyArray:(A,g)=>{},cloneArray:A=>[...A],distanceArray:(A,g=[0,0,0])=>S.lengthArray(S.subArray(A,g)),normalizeArray:A=>S.divArray(A,S.lengthArray(A)||1),normalArray:(A,g=[0,0,0])=>S.normalizeArray(S.subArray(g,A)),getCenter:(A,g)=>(A.computeBoundingBox(),A.boundingBox.getCenter(g)),getVolume:(A,g,I=null)=>{let B=1,Q=g;switch(A){case"sphere":B=4*Math.PI*Q[0]*Q[0]*Q[0]/3;break;case"cone":B=Math.PI*Q[0]*(.5*Q[1])*2;break;case"box":B=.5*Q[0]*8*(.5*Q[1])*(.5*Q[2]);break;case"cylinder":B=Math.PI*Q[0]*Q[0]*(.5*Q[1])*2;break;case"capsule":B=4*Math.PI*Q[0]*Q[0]*Q[0]/3+Math.PI*Q[0]*Q[0]*(.5*Q[1])*2;break;case"convex":case"mesh":B=S.getConvexVolume(I)}return B},getConvexVolume:A=>{let g,I=A.length/3,B=[0,0,0],Q=[0,0,0];for(;I--;)g=3*I,A[g]<B[0]?B[0]=A[g]:A[g]>Q[0]&&(Q[0]=A[g]),A[g+1]<B[1]?B[1]=A[g+1]:A[g+1]>Q[1]&&(Q[1]=A[g+1]),A[g+2]<B[2]?B[2]=A[g+2]:A[g+2]>Q[2]&&(Q[2]=A[g+2]);let C=[Q[0]-B[0],Q[1]-B[1],Q[2]-B[2]];return.5*C[0]*8*(.5*C[1])*(.5*C[2])},massFromDensity:(A,g)=>A*g,densityFromMass:(A,g)=>A/g,toNonIndexed:A=>A.index?A.clone().toNonIndexed():A,getIndex:(A,g)=>!A.index||g?null:A.index.array||null,getSameVertex:A=>{const g=A.getAttribute("position"),I=g.array,B=[],Q=[],C={};new THREE.Vector3;let E,D=0;S.getHash(A);let w,i,o=!1,F=0;for(let A=0;A<g.count;A++){D=3*A,w={x:I[D],y:I[D+1],z:I[D+2],id:A},o=!1,E=B.length;for(let g=0;g<E;g++)i=B[g],w.x===i.x&&w.y===i.y&&w.z===i.z&&(o=!0,C[A]=i.id);o||(w.id=F++,B.push(w),Q.push([w.x,w.y,w.z]))}return[Q,C]},getVertex:(A,g)=>{let I=A.attributes.position.array;return g&&A.index&&(I=(A=A.clone().toNonIndexed()).attributes.position.array),I},getNormal:A=>A.attributes.normal.array,getFaces:A=>{let g=[];if(A.index){let I=A.getIndex();for(let A=0;A<I.count;A+=3)g.push([I.getX(A),I.getX(A+1),I.getX(A+2)])}else{let I=A.getAttribute("position").count;for(let A=0;A<I;A+=3)g.push([A,A+1,A+2])}return g},getConnectedFaces:A=>{const g=[];let I,B,Q,C,E,D,w,i=A.length,o=i;for(;o--;)for(B=A[o],I=i;I--;)I!==o&&(Q=A[I],C=B.filter((A=>Q.includes(A))),C.length>1&&(w=[],E=[...B],D=E.indexOf(C[0]),E.splice(D,1),D=E.indexOf(C[1]),E.splice(D,1),w.push(E[0]),E=[...Q],D=E.indexOf(C[0]),E.splice(D,1),D=E.indexOf(C[1]),E.splice(D,1),w.push(E[0]),g.push(w)));return g},reduce:A=>{},barycentric:(A,g)=>{},solve:(A,g)=>{},getHash:(A,g=1e-4)=>{g=Math.max(g,Number.EPSILON);const I={},B={},Q=A.getAttribute("position"),C=Q.count,E=Q.array,D=.5*g,w=Math.log10(1/g),i=Math.pow(10,w),o=D*i;let F;for(let A=0;A<C;A++){F=3*A;let g=`${~~(E[F]*i+o)},${~~(E[F+1]*i+o)},${~~(E[F+2]*i+o)}`;I[g]?I[g].push(A):I[g]=[A]}let M=0;for(let A in I)B[M++]=I[A];return B}},R=S;class N{constructor(){this.id=0,this.list=[],this.type="item",this.Utils=null}reset(){let A=this.list.length;for(;A--;)this.dispose(this.list[A]);this.list=[],this.id=0}byName(A){return this.Utils.byName(A)}setName(A={}){let g=void 0!==A.name?A.name:this.type+this.id++;return A.id=this.remove(g,!0),A.name=g,g}addToWorld(A,g=-1){this.Utils.add(A),-1!==g?this.list[g]=A:this.list.push(A)}remove(A,g){let I=this.byName(A);return I?this.clear(I,g):-1}clear(A,g){let I=this.list.indexOf(A);return-1===I||g?this.list[I]=null:this.list.splice(I,1),this.dispose(A),I}dispose(A){null!==A&&this.Utils.remove(A)}add(A={}){}set(A={}){}step(A,g){}}class k extends N{constructor(){super(),this.Utils=Q,this.type="ray"}step(){const A=B.Ar,g=B.ArPos[this.type];B.reflow.ray=[];let I,C,E,D,w,i,F,M,G,U,H,S,N,k=this.list.length;for(;k--;)C=g+k*o.ray,I=this.list[k],w=I.getPoint(),F=-1,M=-1,G=!1,U=[BigInt(0)],D=[w[0],w[1],[-1,-1],false,U],A[C]=0,havok.HP_World_CastRayWithCollector(B.world,B.queryCollector,D),H=havok.HP_QueryCollector_GetNumHits(B.queryCollector)[1],H>0&&(N=this.nearest(H,w[0]),i=N[1][3],S=N[1][4],N[1][5],A[C]=1,A[C+1]=R.distanceArray(w[0],i),A[C+2]=w[0][0],A[C+3]=w[0][1],A[C+4]=w[0][2],A[C+5]=i[0],A[C+6]=i[1],A[C+7]=i[2],A[C+8]=S[0],A[C+9]=S[1],A[C+10]=S[2],E=Q.byId(N[1][0][0]),E&&(B.reflow.ray[k]=E.name))}nearest(A,g){if(1===A)return havok.HP_QueryCollector_GetCastRayResult(B.queryCollector,0)[1];let I,Q,C,E=0,D=1/0,w=A;for(;w--;)I=havok.HP_QueryCollector_GetCastRayResult(B.queryCollector,w)[1],Q=I[1][3],C=R.distanceArray(g,Q),C<D&&(D=C,E=I);return E}add(A={}){this.setName(A);let g=new K(A);this.addToWorld(g,A.id)}set(A={},g=null){null===g&&(g=this.byName(A.name)),null!==g&&(A.begin&&(g.begin=A.begin),A.end&&(g.end=A.end))}}class K{constructor(A={}){this.type="ray",this.name=A.name,this.parent=A.parent||"",this.selfHit=A.selfHit||!1,this.noRotation=A.noRotation||!1,this.begin=A.begin||[0,0,0],this.end=A.end||[0,0,1]}getPoint(){if(this.parent){const A=Q.byName(this.parent);if(A){const g=havok.HP_Body_GetQTransform(A)[1],I=g[0],B=this.noRotation?[0,0,0,1]:g[1];return[R.applyTransformArray(this.begin,I,B),R.applyTransformArray(this.end,I,B)]}}return[this.begin,this.end]}}class Y extends N{constructor(){super(),this.Utils=Q,this.type="body",this.itype="body",this.num=o[this.type],this.full=!1,this.kinematic={}}setFull(A){this.num=o[A?"bodyFull":"body"],this.full=A}reset(){this.kinematic={},super.reset()}clear(A,g){return A.isKinematic&&delete this.kinematic[A.name],super.clear(A,g)}postStep(){let A,g;for(let I in this.kinematic)A=this.kinematic[I],A.first?(g=A.transform,A.first=!1):(g=havok.HP_Body_GetQTransform(A)[1],havok.HP_Body_SetTargetQTransform(A,R.lerpTransform(g,A.transform,1/B.substep)))}step(){const A=B.Ar,g=B.ArPos[this.itype];let I,Q,C,E,D,w,i=this.list.length;for(;i--;)I=this.list[i],Q=g+i*this.num,w=1===havok.HP_Body_GetActivationState(I)[1].value,A[Q]=w?0:1,I.sleep||(C=havok.HP_Body_GetQTransform(I)[1],R.fillArray(C[0],A,Q+1,3),R.fillArray(C[1],A,Q+4,4),I.deepSleep&&(havok.HP_Body_SetActivationControl(I,havok.ActivationControl.SIMULATION_CONTROLLED),I.deepSleep=!1),this.full?(E=havok.HP_Body_GetLinearVelocity(I)[1],D=havok.HP_Body_GetAngularVelocity(I)[1],R.fillArray(E,A,Q+8,3),R.fillArray(D,A,Q+11,3),1===A[Q]&&(A[Q]=9.8*R.lengthArray(E))):I.getVelocity&&(E=havok.HP_Body_GetLinearVelocity(I)[1],D=havok.HP_Body_GetAngularVelocity(I)[1],B.reflow.velocity[I.name]=[...E,...D]))}shape(A={}){let g,I,B,Q,C=A.type||"box",E=A.size||[1,1,1],D=A.localPos||[0,0,0],w=[D[0],D[1]-.5*E[1],D[2]],i=[D[0],D[1]+.5*E[1],D[2]],o=A.localQuat||[0,0,0,1];switch(C){case"plane":1===E[0]&&(E=[300,0,300]),E[1]=0,I=[.5*E[0],0,.5*E[2],.5*E[0],0,.5*-E[2],.5*-E[0],0,.5*-E[2],.5*-E[0],0,.5*E[2]],Q=this.getVertices(I),g=havok.HP_Shape_CreateConvexHull(Q.byteOffset,4)[1],havok._free(Q.byteOffset);break;case"box":g=havok.HP_Shape_CreateBox(D,o,E)[1];break;case"sphere":g=havok.HP_Shape_CreateSphere(D,E[0])[1];break;case"particle":g=havok.HP_Shape_CreateSphere(D,A.pSize)[1];break;case"cylinder":g=havok.HP_Shape_CreateCylinder(w,i,E[0])[1];break;case"capsule":g=havok.HP_Shape_CreateCapsule(w,i,E[0])[1];break;case"convex":B=Math.floor(A.v.length/3),Q=this.getVertices(A.v),g=havok.HP_Shape_CreateConvexHull(Q.byteOffset,B)[1],havok._free(Q.byteOffset);break;case"mesh":B=A.v.length/3,Q=this.getVertices(A.v);let C=A.index.length/3,F=this.getTriangles(A.index);g=havok.HP_Shape_CreateMesh(Q.byteOffset,B,F.byteOffset,C)[1],havok._free(Q.byteOffset),havok._free(F.byteOffset)}return A.density&&havok.HP_Shape_SetDensity(g,A.density),A.isTrigger&&havok.HP_Shape_SetTrigger(g,!0),this.setMaterial(g,A),this.setFilter(g,A),g.volume=void 0!==A.volume?A.volume:R.getVolume(C,E,A.v),g}getVertices(A){const g=A.length,I=4*g,B=havok._malloc(I),Q=new Float32Array(havok.HEAPU8.buffer,B,g);for(let I=0;I<g;I++)Q[I]=A[I];return Q}getTriangles(A,g=!1){const I=A.length,B=I/3,Q=4*I,C=havok._malloc(Q),E=new Int32Array(havok.HEAPU8.buffer,C,I);let D,w=B,i=0;for(;w--;)D=3*i,g?(E[D+0]=A[D+2],E[D+1]=A[D+1],E[D+2]=A[D+0]):(E[D+0]=A[D+0],E[D+1]=A[D+1],E[D+2]=A[D+2]),i++;return E}setFilter(A,g){g.mask||(g.mask=-1),g.group||(g.group="body"===this.type?1:2),havok.HP_Shape_SetFilterInfo(A,[g.group,g.mask])}setMaterial(A,g){const I=void 0!==g.friction?g.friction:.5,B=void 0!==g.staticFriction?g.staticFriction:I,Q=void 0!==g.restitution?g.restitution:0,C=g.frictionMode??"GEOMETRIC_MEAN",E=g.restitutionMode??"GEOMETRIC_MEAN",D=[B,I,Q,this.materialCombine(C),this.materialCombine(E)];havok.HP_Shape_SetMaterial(A,D)}materialCombine(A){switch(A){case"GEOMETRIC_MEAN":case"geo":return havok.MaterialCombine.GEOMETRIC_MEAN;case"MINIMUM":case"min":return havok.MaterialCombine.MINIMUM;case"MAXIMUM":case"max":return havok.MaterialCombine.MAXIMUM;case"ARITHMETIC_MEAN":case"num":return havok.MaterialCombine.ARITHMETIC_MEAN;case"MULTIPLY":case"mult":return havok.MaterialCombine.MULTIPLY}}add(A={}){let g=this.setName(A);const I="body"===this.type?A.kinematic?"KINEMATIC":"DYNAMIC":"STATIC";let Q,C=havok.HP_Body_Create()[1];switch(A.type){case"null":Q=havok.HP_Shape_CreateContainer()[1],havok.HP_Body_SetShape(C,Q),this.applyMass(C,Q,A);break;case"compound":let g;Q=havok.HP_Shape_CreateContainer()[1];for(let I=0;I<A.shapes.length;I++){g=A.shapes[I],void 0!==A.density&&(g.density=A.density),void 0!==A.friction&&(g.friction=A.friction),void 0!==A.restitution&&(g.restitution=A.restitution),void 0!==A.mask&&(g.collisionMask=A.mask),void 0!==A.group&&(g.collisionGroup=A.group),g.localQuat&&delete g.localQuat,g.localPos&&delete g.localPos;let B=[g.pos||[0,0,0],g.quat||[0,0,0,1],[1,1,1]];havok.HP_Shape_AddChild(Q,this.shape(g),B)}havok.HP_Body_SetShape(C,Q),this.applyMass(C,Q,A);break;default:A.shapeType&&(A.type=A.shapeType),Q=this.shape(A),havok.HP_Body_SetShape(C,Q),this.applyMass(C,Q,A)}C.name=g,C.type=this.type,C.breakable=A.breakable||!1,C.trigger=A.isTrigger||!1,C.isKinematic=A.kinematic||!1,C.isKinematic&&(this.kinematic[C.name]=C,C.first=!0),C.button=A.button||!1,C.transform=[A.pos||[0,0,0],A.quat||[0,0,0,1]],C.isKinematic&&havok.HP_Body_SetTargetQTransform(C,C.transform),havok.HP_Body_SetQTransform(C,C.transform),A.pos&&delete A.pos,A.quat&&delete A.quat,A.mass&&delete A.mass,havok.HP_Body_SetMotionType(C,havok.MotionType[I]),void 0!==A.kinematic&&delete A.kinematic,havok.HP_World_AddBody(B.world,C,A.sleep||!1),this.addToWorld(C,A.id),this.set(A,C)}applyMass(A,g,I){if("solid"===this.type)return;let B=[[0,0,0],1,[1,1,1],[0,0,0,1]];const Q=havok.HP_Body_GetShape(A);if(Q[0]==havok.Result.RESULT_OK){const A=havok.HP_Shape_BuildMassProperties(Q[1]);A[0]==havok.Result.RESULT_OK&&(B=A[1])}I.massCenter&&(B[0]=I.massCenter),void 0!==I.mass&&(B[1]=I.mass),I.inertia&&(B[2]=I.inertia),I.inertiaOrientation&&(B[3]=I.inertiaOrientation),havok.HP_Body_SetMassProperties(A,B)}setMassInfo(A,g){const I=havok.HP_Body_GetMassProperties(A)[1];g.linearFactor&&(I[2]=R.mulArray(I[2],g.linearFactor)),g.angularFactor&&(I[3]=R.mulArray(I[3],g.angularFactor)),g.massCenter&&(I[0]=g.massCenter),g.mass&&(I[1]=g.mass),g.inertia&&(I[2]=g.inertia),g.inertiaOrientation&&(I[3]=g.inertiaOrientation),havok.HP_Body_SetMassProperties(A,I)}getMassInfo(A){const g=havok.HP_Body_GetMassProperties(A)[1],I={centerOfMass:g[0],mass:g[1],inertia:g[2],inertiaOrientation:g[3],damping:[havok.HP_Body_GetLinearDamping(A)[1],havok.HP_Body_GetAngularDamping(A)[1]]};console.log(I)}set(A={},g=null){if(null===g&&(g=this.byName(A.name)),null!==g){if(void 0!==A.getVelocity&&(g.getVelocity=A.getVelocity),void 0!==A.kinematic&&(havok.HP_Body_SetMotionType(g,havok.MotionType[A.kinematic?"KINEMATIC":"DYNAMIC"]),g.isKinematic=A.kinematic,g.isKinematic?this.kinematic[g.name]=g:delete this.kinematic[g.name]),void 0!==A.gravityScale&&havok.HP_Body_SetGravityFactor(g,A.gravityScale),void 0!==A.gravityFactor&&havok.HP_Body_SetGravityFactor(g,A.gravityFactor),void 0!==A.gravity&&havok.HP_Body_SetGravityFactor(g,A.gravity?1:0),A.sleep&&(havok.HP_Body_SetActivationState(g,havok.ActivationState.INACTIVE),g.deepSleep=!0,havok.HP_Body_SetActivationControl(g,havok.ActivationControl.ALWAYS_INACTIVE)),(A.activate||A.wake)&&(g.neverSleep||havok.HP_Body_SetActivationControl(g,havok.ActivationControl.SIMULATION_CONTROLLED),havok.HP_Body_SetActivationState(g,havok.ActivationState.ACTIVE)),void 0!==A.neverSleep&&(g.neverSleep=A.neverSleep,havok.HP_Body_SetActivationControl(g,A.neverSleep?havok.ActivationControl.ALWAYS_ACTIVE:havok.ActivationControl.SIMULATION_CONTROLLED)),void 0!==A.alwaySleep&&havok.HP_Body_SetActivationControl(g,A.alwaySleep?havok.ActivationControl.ALWAYS_INACTIVE:havok.ActivationControl.SIMULATION_CONTROLLED),A.priority&&havok.HP_Body_SetActivationPriority(g,A.priority),A.pos||A.quat){let I;A.pos||(I=havok.HP_Body_GetQTransform(g)[1],A.pos=I[0]),A.quat||(I=havok.HP_Body_GetQTransform(g)[1],A.quat=I[1]),g.transform=[A.pos,A.quat],g.isKinematic||havok.HP_Body_SetQTransform(g,g.transform)}if(A.damping&&(havok.HP_Body_SetLinearDamping(g,A.damping[0]),havok.HP_Body_SetAngularDamping(g,A.damping[1])),A.force){let I=A.forceMode||"force",Q=A.forcePosition?A.forcePosition:havok.HP_Body_GetPosition(g)[1];"force"===I&&(A.force=R.scaleArray(A.force,B.timestep,3)),havok.HP_Body_ApplyImpulse(g,Q,A.force)}A.impulse&&(A.impulseCenter?havok.HP_Body_ApplyImpulse(g,A.impulseCenter,A.impulse):havok.HP_Body_ApplyImpulse(g,havok.HP_Body_GetPosition(g)[1],A.impulse)),A.angularImpulse&&havok.HP_Body_ApplyAngularImpulse(g,A.angularImpulse),A.torque&&havok.HP_Body_ApplyAngularImpulse(g,A.torque),A.linearVelocity&&(A.linear=A.linearVelocity),A.angularVelocity&&(A.angular=A.angularVelocity),void 0!==A.velocityOperation?this.velocityOperation(A,g):(A.linear&&havok.HP_Body_SetLinearVelocity(g,A.linear),A.angular&&havok.HP_Body_SetAngularVelocity(g,A.angular)),A.reset&&(havok.HP_Body_SetLinearVelocity(g,[0,0,0]),havok.HP_Body_SetAngularVelocity(g,[0,0,0])),A.inertiaScale&&(A.linearFactor=A.inertiaScale),(A.linearFactor||A.angularFactor)&&this.setMassInfo(g,A),A.massInfo&&this.getMassInfo(g)}}velocityOperation(A,g){let I=havok.HP_Body_GetLinearVelocity(g)[1],Q=havok.HP_Body_GetAngularVelocity(g)[1];switch(A.velocityOperation){case"xz":A.linear&&(I=[A.linear[0],I[1],A.linear[2]]);break;case"add":A.linear&&(I=R.addArray(I,A.linear,3)),A.angular&&(Q=R.addArray(Q,A.angular,3));break;case"sub":A.linear&&(I=R.subArray(I,A.linear,3)),A.angular&&(Q=R.subArray(Q,A.angular,3));break;case"multy":A.linear&&(I=R.mulArray(I,A.linear,3)),A.angular&&(Q=R.mulArray(Q,A.angular,3));break;case"lerp":A.linear&&(I=R.lerpArray(I,A.linear,A.time)),A.angular&&(Q=R.lerpArray(Q,A.angular,A.time));break;case"step":A.linear&&(I=R.mulArray(I,B.substep)),A.angular&&(Q=R.mulArray(Q,B.substep));break;case"local":let C=havok.HP_Body_GetQTransform(g)[1][1];A.linear&&(I=R.applyQuaternion(I,C)),A.angular&&(Q=R.applyQuaternion(Q,C))}havok.HP_Body_SetLinearVelocity(g,I),havok.HP_Body_SetAngularVelocity(g,Q)}getBoundingBox(A){const g=havok.HP_Shape_GetBoundingBox(A,[[0,0,0],[0,0,0,1]])[1];return{min:[g[0][0],g[0][1],g[0][2]],max:[g[1][0],g[1][1],g[1][2]]}}addCollisionCallback(A,g){if(A.trigger){let I=havok.HP_Body_GetShape(A)[1];havok.HP_Shape_SetTrigger(I,g)}else{const I=havok.EventType.COLLISION_STARTED.value|havok.EventType.COLLISION_CONTINUED.value|havok.EventType.COLLISION_FINISHED.value;havok.HP_Body_SetEventMask(A,g?I:0)}}freeze(A,g){g?(havok.HP_Body_SetGravityFactor(A,0),havok.HP_Body_SetLinearVelocity(A,[0,0,0]),havok.HP_Body_SetAngularVelocity(A,[0,0,0]),A.sleep=!0):A.sleep&&(havok.HP_Body_SetGravityFactor(A,1),A.sleep=!1)}setShapes(A={},g=null){}}class y extends N{constructor(){super(),this.Utils=Q,this.type="joint",this.LimitMode={FREE:havok.ConstraintAxisLimitMode.FREE,LIMITED:havok.ConstraintAxisLimitMode.LIMITED,LOCKED:havok.ConstraintAxisLimitMode.LOCKED},this.ConstraintAxis={LINEAR_X:havok.ConstraintAxis.LINEAR_X,LINEAR_Y:havok.ConstraintAxis.LINEAR_Y,LINEAR_Z:havok.ConstraintAxis.LINEAR_Z,ANGULAR_X:havok.ConstraintAxis.ANGULAR_X,ANGULAR_Y:havok.ConstraintAxis.ANGULAR_Y,ANGULAR_Z:havok.ConstraintAxis.ANGULAR_Z,LINEAR_DISTANCE:havok.ConstraintAxis.LINEAR_DISTANCE},this.MotorType={NONE:havok.ConstraintMotorType.NONE,VELOCITY:havok.ConstraintMotorType.VELOCITY,POSITION:havok.ConstraintMotorType.POSITION,SPRING_FORCE:havok.ConstraintMotorType.SPRING_FORCE,SPRING_ACCELERATION:havok.ConstraintMotorType.SPRING_ACCELERATION},this.convert={x:"LINEAR_X",y:"LINEAR_Y",z:"LINEAR_Z",rx:"ANGULAR_X",ry:"ANGULAR_Y",rz:"ANGULAR_Z",distance:"LINEAR_DISTANCE",twist:"ANGULAR_X",swing1:"ANGULAR_Y",swing2:"ANGULAR_Z",free:"FREE",locked:"LOCKED",limited:"LIMITED"},this.angulars=["ANGULAR_X","ANGULAR_Y","ANGULAR_Z"]}step(){}crossVectors(A,g){const I=A[0],B=A[1],Q=A[2],C=g[0],E=g[1],D=g[2];return[B*D-Q*E,Q*C-I*D,I*E-B*C]}add(A={}){let g=this.setName(A);const I=havok.HP_Constraint_Create()[1];let B=this.byName(A.b1),Q=this.byName(A.b2);null!==B&&havok.HP_Constraint_SetParentBody(I,B),null!==Q&&havok.HP_Constraint_SetChildBody(I,Q);const C=A.pos1?A.pos1:[0,0,0],E=A.axis1?A.axis1:[1,0,0],D=A.axis1Y||R.perpendicularArray(E);havok.HP_Constraint_SetAnchorInParent(I,C,E,D);const w=A.pos2?A.pos2:[0,0,0],i=A.axis2?A.axis2:[1,0,0],o=A.axis2Y||R.perpendicularArray(i);havok.HP_Constraint_SetAnchorInChild(I,w,i,o);let F=A.mode||"hinge";switch(F){case"fixe":case"generic":this.lock(I,["x","y","z","rx","ry","rz"]);break;case"hinge":this.lock(I,["x","y","z","ry","rz"]);break;case"prismatic":this.lock(I,["y","z","rx","ry","rz"]);break;case"cylindrical":this.lock(I,["y","z","ry","rz"]);break;case"spherical":case"ragdoll":this.lock(I,["x","y","z"])}let M=void 0!==A.collision&&A.collision;havok.HP_Constraint_SetCollisionsEnabled(I,M),havok.HP_Constraint_SetEnabled(I,!0),I.name=g,I.type=this.type,I.mode=F,I.visible=void 0===A.visible||A.visible,I.isAcceleration=!1,B&&(I.massInfo1=this.getMassInfo(B)),Q&&(I.massInfo2=this.getMassInfo(Q)),this.set(A,I),this.addToWorld(I)}getMassInfo(A){const g=havok.HP_Body_GetMassProperties(A)[1];return{centerOfMass:g[0],mass:g[1],inertia:g[2],inertiaOrientation:g[3],damping:[havok.HP_Body_GetLinearDamping(A)[1],havok.HP_Body_GetAngularDamping(A)[1]]}}set(A={},g=null){if(null===g&&(g=this.byName(A.name)),null===g)return;let I;switch(this.ConstraintAxis,this.LimitMode,void 0!==A.enable&&havok.HP_Constraint_SetEnabled(g,A.enable),g.mode){case"hinge":A.limit&&this.setLimit(g,["rx",...A.limit]),A.spring&&this.setSpring(g,["rx",...A.spring]),A.motor&&this.setMotor(g,A.motor[1],A.motor[2],"ANGULAR_X"),void 0!==A.friction&&this.setFriction(g,A.friction,"ANGULAR_X");break;case"prismatic":A.lm&&this.setLimit(g,["x",...A.lm]),A.limit&&this.setLimit(g,["x",...A.limit]),A.spring&&this.setSpring(g,["x",...A.spring]),A.friction&&this.setFriction(g,"x",A.friction);break;case"cylindrical":A.lm&&this.setLimit(g,["x",...A.lm]),A.lmr&&this.setLimit(g,["rx",...A.lmr]);break;case"spherical":A.lm&&(this.setLimit(g,["rx",...A.lm]),this.setLimit(g,["ry",...A.lm]),this.setLimit(g,["rz",...A.lm]));break;case"distance":A.limit&&this.setLimit(g,["distance",...A.limit]),A.spring&&this.setSpring(g,["distance",...A.spring]),A.friction&&this.setFriction(g,"distance",A.friction);break;case"generic":case"ragdoll":if(A.motion)for(I=A.motion.length;I--;)this.setLimitMode(g,this.convert[A.motion[I][0]],this.convert[A.motion[I][1]]);if(A.lm)for(I=A.lm.length;I--;)this.setLimit(g,A.lm[I]);if(A.drive)for(I=A.drive.length;I--;)this.setDrive(g,A.drive[I]);if(void 0!==A.friction){let B=[];if(A.friction instanceof Array)B=[...A.friction];else{let g=A.friction;B=[["x",g],["y",g],["z",g],["rx",g],["ry",g],["rz",g]]}for(I=B.length;I--;)this.setFriction(g,B[I][0],B[I][1])}A.drivePosition&&this.setDrivePosition(g,A.drivePosition),A.driveVelocity&&this.setDriveVelocity(g,A.driveVelocity)}A.getInfo&&this.getInfo(g)}getDriveTarget(A){return[havok.HP_Constraint_GetAxisMotorTarget(A,this.ConstraintAxis.LINEAR_X)[1],havok.HP_Constraint_GetAxisMotorTarget(A,this.ConstraintAxis.LINEAR_Y)[1],havok.HP_Constraint_GetAxisMotorTarget(A,this.ConstraintAxis.LINEAR_Z)[1],havok.HP_Constraint_GetAxisMotorTarget(A,this.ConstraintAxis.ANGULAR_X)[1],havok.HP_Constraint_GetAxisMotorTarget(A,this.ConstraintAxis.ANGULAR_Y)[1],havok.HP_Constraint_GetAxisMotorTarget(A,this.ConstraintAxis.ANGULAR_Z)[1],0]}getInfo(A){console.log({})}lock(A,g){let I=g.length;for(;I--;)havok.HP_Constraint_SetAxisMode(A,this.ConstraintAxis[this.convert[g[I]]],this.LimitMode.LOCKED)}setLimitMode(A,g,I){havok.HP_Constraint_SetAxisMode(A,this.ConstraintAxis[g],this.LimitMode[I])}setDriveMode(A,g,I){havok.HP_Constraint_SetAxisMotorType(A,this.ConstraintAxis[g],this.MotorType[I])}setLimit(A,g){const I=this.convert[g[0]],B=-1!==this.angulars.indexOf(I)?M:1,Q=this.ConstraintAxis[I];if(havok.HP_Constraint_SetAxisMode(A,Q,this.LimitMode.LIMITED),havok.HP_Constraint_SetAxisMinLimit(A,Q,g[1]*B),havok.HP_Constraint_SetAxisMaxLimit(A,Q,g[2]*B),g.length>3){let I=[g[0],...g.slice(3)];this.setSpring(A,I)}}setSpring(A,g){const I=this.ConstraintAxis[this.convert[g[0]]];void 0!==g[1]&&havok.HP_Constraint_SetAxisStiffness(A,I,g[1]),void 0!==g[2]&&havok.HP_Constraint_SetAxisDamping(A,I,g[2])}setFriction(A,g,I=0){const B=this.ConstraintAxis[this.convert[g]];havok.HP_Constraint_SetAxisFriction(A,B,I)}setMotorType(A,g){const I=this.convert[g[0]],B=this.ConstraintAxis[I];havok.HP_Constraint_SetAxisMotorType(A,B,this.MotorType[type.toUpperCase()])}setDrive(A,g){let I=g[0];const B=this.convert[I],Q=this.ConstraintAxis[B];void 0!==g[1]&&havok.HP_Constraint_SetAxisMotorStiffness(A,Q,g[1]),void 0!==g[2]&&havok.HP_Constraint_SetAxisMotorDamping(A,Q,g[2]),void 0!==g[3]?havok.HP_Constraint_SetAxisMotorMaxForce(A,Q,g[3]):havok.HP_Constraint_SetAxisMotorMaxForce(A,Q,0),A.isAcceleration=void 0===g[4]||g[4]}setDrivePosition(A,g){g.pos&&(havok.HP_Constraint_SetAxisMotorType(A,this.ConstraintAxis.LINEAR_X,this.MotorType.POSITION),havok.HP_Constraint_SetAxisMotorType(A,this.ConstraintAxis.LINEAR_Y,this.MotorType.POSITION),havok.HP_Constraint_SetAxisMotorType(A,this.ConstraintAxis.LINEAR_Z,this.MotorType.POSITION),havok.HP_Constraint_SetAxisMotorPositionTarget(A,this.ConstraintAxis.LINEAR_X,g.pos[0]),havok.HP_Constraint_SetAxisMotorPositionTarget(A,this.ConstraintAxis.LINEAR_Y,g.pos[1]),havok.HP_Constraint_SetAxisMotorPositionTarget(A,this.ConstraintAxis.LINEAR_Z,g.pos[2])),g.rot&&(havok.HP_Constraint_SetAxisMotorType(A,this.ConstraintAxis.ANGULAR_X,this.MotorType.POSITION),havok.HP_Constraint_SetAxisMotorType(A,this.ConstraintAxis.ANGULAR_Y,this.MotorType.POSITION),havok.HP_Constraint_SetAxisMotorType(A,this.ConstraintAxis.ANGULAR_Z,this.MotorType.POSITION),havok.HP_Constraint_SetAxisMotorPositionTarget(A,this.ConstraintAxis.ANGULAR_X,g.rot[0]*M),havok.HP_Constraint_SetAxisMotorPositionTarget(A,this.ConstraintAxis.ANGULAR_Y,g.rot[1]*M),havok.HP_Constraint_SetAxisMotorPositionTarget(A,this.ConstraintAxis.ANGULAR_Z,g.rot[2]*M))}setDriveVelocity(A,g){let I=-1;A.isAcceleration&&(I=-1/A.massInfo2.mass),g.pos&&(havok.HP_Constraint_SetAxisMotorType(A,this.ConstraintAxis.LINEAR_X,this.MotorType.VELOCITY),havok.HP_Constraint_SetAxisMotorType(A,this.ConstraintAxis.LINEAR_Y,this.MotorType.VELOCITY),havok.HP_Constraint_SetAxisMotorType(A,this.ConstraintAxis.LINEAR_Z,this.MotorType.VELOCITY),havok.HP_Constraint_SetAxisMotorVelocityTarget(A,this.ConstraintAxis.LINEAR_X,g.pos[0]*I),havok.HP_Constraint_SetAxisMotorVelocityTarget(A,this.ConstraintAxis.LINEAR_Y,g.pos[1]*I),havok.HP_Constraint_SetAxisMotorVelocityTarget(A,this.ConstraintAxis.LINEAR_Z,g.pos[2]*I)),g.rot&&(havok.HP_Constraint_SetAxisMotorType(A,this.ConstraintAxis.ANGULAR_X,this.MotorType.VELOCITY),havok.HP_Constraint_SetAxisMotorType(A,this.ConstraintAxis.ANGULAR_Y,this.MotorType.VELOCITY),havok.HP_Constraint_SetAxisMotorType(A,this.ConstraintAxis.ANGULAR_Z,this.MotorType.VELOCITY),havok.HP_Constraint_SetAxisMotorVelocityTarget(A,this.ConstraintAxis.ANGULAR_X,g.rot[0]*I),havok.HP_Constraint_SetAxisMotorVelocityTarget(A,this.ConstraintAxis.ANGULAR_Y,g.rot[1]*I),havok.HP_Constraint_SetAxisMotorVelocityTarget(A,this.ConstraintAxis.ANGULAR_Z,g.rot[2]*I))}getMotor(A,g){const I=this.convert[g],B=this.ConstraintAxis[I];havok.HP_Constraint_GetAxisMotorType(A,B)[1],havok.HP_Constraint_GetAxisMotorTarget(A,B)[1]}}class L extends N{constructor(){super(),this.type="terrain",this.Utils=Q}add(A){this.setName(A);let g=new s(A);this.addToWorld(g,A.id)}set(A={},g=null){null===g&&(g=this.byName(A.name)),null!==g&&g.set(A)}}class s{constructor(A){this.type="terrain",this.name=A.name,this.needUpdate=!1,this.heightField=null,this.geometry=null,this.heights=null,this.init(A)}init(A){this.size=A.size,this.sample=A.sample,this.squarSize=[this.size[0]/(this.sample[0]-1),this.size[2]/(this.sample[1]-1)],this.setData(A),this.body=havok.HP_Body_Create()[1],havok.HP_Body_SetShape(this.body,this.geometry);let g=A.pos||[0,0,0];havok.HP_Body_SetPosition(this.body,g),A.quat&&havok.HP_Body_SetOrientation(this.body,A.quat),havok.HP_World_AddBody(B.world,this.body,!1)}setData(A){this.getVertices(A.heightData),this.divid=A.sample?A.sample:this.sample,this.scale=[this.squarSize[0],this.size[1],this.squarSize[1]],this.geometry=havok.HP_Shape_CreateHeightField(this.divid[0],this.divid[1],this.scale,this.heights.byteOffset)[1],havok._free(this.heights.byteOffset),this.setMaterial(this.geometry,A)}getVertices(A){if(!this.heights){const g=A.length,I=g*4,B=havok._malloc(I);this.heights=new Float32Array(havok.HEAPU8.buffer,B,g)}let g=A.length,I=0;for(;g--;)this.heights[g]=A[I],I++}setMaterial(A,g){if(!g.friction&&!g.restitution)return;if(.5===g.friction&&0===!g.restitution)return;const I=g.friction??.5,B=g.staticFriction??I,Q=g.restitution??0,C=g.frictionCombine??"MINIMUM",E=g.restitutionCombine??"MAXIMUM",D=[B,I,Q,this.materialCombine(C),this.materialCombine(E)];havok.HP_Shape_SetMaterial(A,D)}release(){havok.HP_World_RemoveBody(B.world,this.body),havok.HP_Body_Release(this.body)}set(A){A.heightData&&(this.geometry&&havok.HP_Shape_Release(this.geometry),this.getVertices(A.heightData),this.geometry=havok.HP_Shape_CreateHeightField(this.divid[0],this.divid[1],this.scale,this.heights.byteOffset)[1],this.setMaterial(this.geometry,A),havok.HP_Body_SetShape(this.body,this.geometry))}}class J extends N{constructor(){super(),this.Utils=Q,this.type="contact"}step(){const A=B.Ar,g=B.ArPos[this.type];let I,C,E,D=this.list.length;for(;D--;)I=this.list[D],C=g+D*o.contact,E=Q.byContact(I.cc)?1:0,E||(E=Q.byContact(I.cr)?1:0),A[C]=E}add(A={}){this.setName(A);let g=this.byName(A.b1);if(this.byName(A.b2),null===g)return;B.bodyRef.addCollisionCallback(g,!0);let I=new a(A);this.addToWorld(I,A.id),B.needContact=!0,B.needTrigger=!0}}class h{constructor(){this.body=null,this.position=[0,0,0],this.normal=[0,0,0]}}class c{constructor(){this.contactOnA=new h,this.contactOnB=new h,this.impulseApplied=0,this.type=0}static readToRef(A,g,I){const B=new Int32Array(A,g),C=new Float32Array(A,g);I.contactOnA.body=Q.byId(BigInt(B[2])),I.contactOnA.position=[C[10],C[11],C[12]],I.contactOnA.normal=[C[13],C[14],C[15]];I.contactOnB.body=Q.byId(BigInt(B[18])),I.contactOnB.position=[C[26],C[27],C[28]],I.contactOnB.normal=[C[29],C[30],C[31]],I.impulseApplied=C[34],I.type=(A=>{let g="COLLISION_STARTED";switch(A){case havok.EventType.COLLISION_STARTED.value:g="COLLISION_STARTED";break;case havok.EventType.COLLISION_FINISHED.value:g="COLLISION_FINISHED";break;case havok.EventType.COLLISION_CONTINUED.value:g="COLLISION_CONTINUED"}return g})(B[0])}}class P{constructor(){this.bodyA=BigInt(0),this.bodyB=BigInt(0),this.type=0}static readToRef(A,g,I){const B=new Int32Array(A,g);I.type=(A=>{let g="TRIGGER_ENTERED";return 16===A&&(g="TRIGGER_EXITED"),g})(B[0]),I.bodyA=Q.byId(BigInt(B[2])),I.bodyB=Q.byId(BigInt(B[6]))}}class a{constructor(A={}){this.type="contact",this.name=A.name,this.cc=A.b1+"_"+A.b2,this.cr=A.b2+"_"+A.b1}}var f,e=(f="undefined"!=typeof document?document.currentScript?.src:void 0,async function(A={}){var g,I,B=A;async function Q(A){var g,I,Q=await(g="data:application/octet-stream;base64,AGFzbQEAAAABngdwYAN/f38AYAJ/fwBgA39/fwF/YAF/AX9gAn9/AX9gAX8AYAR/f39/AGAGf39/f39/AGAFf39/f38AYAV/f39/fwF/YAl/f39/f39/f38AYAR/f39/AX9gAn9+AX9gA39+fwBgCH9/f39/f39/AGACfn8Bf2AFf35/f38AYAR/fn9/AGACf34AYAABf2AGf35/f39/AX9gCn9/f39/f39/f38AYAd/f39/f39/AGADf35/AX9gA35/fwF/YAh/f39/f39/fwF/YAZ/f39/f38Bf2AEf39/fgF/YAR/fn1/AGADf39+AGAFf35/f38Bf2AHf35/f39/fwF/YAN+fn8Bf2ACf30Bf2ADfn99AX9gAn99AGADf399AGADf359AGABfwF9YAAAYAl/fn9/f399fX8Bf2ACfn0Bf2ADf39+AX5gBH9/fn4Bf2ABfwF7YAl/f39/f39/f38Bf2AHf35/f31/fwF/YAR/f31/AX9gAn5+AX9gA39/fQF/YAd/f39/f31/AX9gBH9+f38Bf2ANf39/f39/f39/f39/fwBgCH9+f39/f39/AX9gBX9/f399AGAEf39/fgBgB39+f39/fX8Bf2AHf35+f39/fwF/YAF+AX9gBH5/f38Bf2AEf39/fQBgAn9/AX5gAn9/AX1gBH9/fX8AYAV/f399fwF/YAJ/fQF9YAZ/fn99f38Bf2AFf35+f38Bf2ADf359AX9gA359fQF/YAR/f399AX9gAn9/AXtgC39/f39/f39/f39/AGADf31/AGAHf39/f39/fwF/YAR/f35/AGACf34BfWADf35/AX5gBn98f39/fwF/YAV/f39/fwF8YAV/f39+fgBgAAF8YAN/fX8Bf2AFfn9/f38Bf2ADf39+AX9gBH9/fX0Bf2ABfwF+YAN/fn4Bf2ABfQF9YBB/f39/f39/f39/f39/f39/AGAMf39/f39/f39/f39/AGAFf39/fX8AYAd/fX9/f39/AGAKf39/f39/f31/fwF/YAV/f39+fwBgBH9/fX0AYAR/fX9/AX1gA39/fwF9YAV/f319fwBgBX9/f39/AXtgA399fQBgBn9/fX1/fwBgD39/f39/fX1/f39/f319fwBgEH9/f319fX9/f39/f39/f38Bf2AIf35+f39/f38AYAZ/fn5/f38AYAR/f35+AGAKf39/f39/f39/fwF/YAR/fX9/AGADf31/AX1gAX0Bf2ACfH8BfAL9BRkDZW52GF9lbXZhbF9nZXRfbWV0aG9kX2NhbGxlcgACA2VudhJfZW12YWxfY2FsbF9tZXRob2QATwNlbnYWX2VtdmFsX3J1bl9kZXN0cnVjdG9ycwAFA2VudhxfZW1iaW5kX3JlZ2lzdGVyX3ZhbHVlX2FycmF5AAcDZW52JF9lbWJpbmRfcmVnaXN0ZXJfdmFsdWVfYXJyYXlfZWxlbWVudAAKA2VudhxfZW1iaW5kX2ZpbmFsaXplX3ZhbHVlX2FycmF5AAUDZW52FV9lbWJpbmRfcmVnaXN0ZXJfZW51bQAGA2VudhtfZW1iaW5kX3JlZ2lzdGVyX2VudW1fdmFsdWUAAANlbnYZX2VtYmluZF9yZWdpc3Rlcl9mdW5jdGlvbgAOA2Vudg1fZW12YWxfZGVjcmVmAAUDZW52FV9lbWJpbmRfcmVnaXN0ZXJfdm9pZAABA2VudhVfZW1iaW5kX3JlZ2lzdGVyX2Jvb2wABgNlbnYYX2VtYmluZF9yZWdpc3Rlcl9pbnRlZ2VyAAgDZW52F19lbWJpbmRfcmVnaXN0ZXJfYmlnaW50AFADZW52Fl9lbWJpbmRfcmVnaXN0ZXJfZmxvYXQAAANlbnYbX2VtYmluZF9yZWdpc3Rlcl9zdGRfc3RyaW5nAAEDZW52HF9lbWJpbmRfcmVnaXN0ZXJfc3RkX3dzdHJpbmcAAANlbnYWX2VtYmluZF9yZWdpc3Rlcl9lbXZhbAAFA2VudhxfZW1iaW5kX3JlZ2lzdGVyX21lbW9yeV92aWV3AAADZW52CV9hYm9ydF9qcwAnA2VudiBfZW1zY3JpcHRlbl9nZXRfbm93X2lzX21vbm90b25pYwATA2VudhJlbXNjcmlwdGVuX2dldF9ub3cAURZ3YXNpX3NuYXBzaG90X3ByZXZpZXcxCGZkX3dyaXRlAAsDZW52F2Vtc2NyaXB0ZW5fZ2V0X2hlYXBfbWF4ABMDZW52FmVtc2NyaXB0ZW5fcmVzaXplX2hlYXAAAwO8FLoUJwNSLy8LAgkJAzoPIA8PGBgYDw8PDykPGFMPAg8PDwMwDw8PDw8PDykPKQ8pDw8PDw8PDw8PDw8PDxgPDw8PDw8DMA8wDzs7Dw8YDw8iGCIYGBgiGBgYIhgi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Qm94AB4ZSFBfU2hhcGVfQ3JlYXRlQ29udmV4SHVsbAAfE0hQX1NoYXBlX0NyZWF0ZU1lc2gAIBpIUF9TaGFwZV9DcmVhdGVIZWlnaHRGaWVsZAAhGEhQX1NoYXBlX0NyZWF0ZUNvbnRhaW5lcgAiEEhQX1NoYXBlX1JlbGVhc2UAIxBIUF9TaGFwZV9HZXRUeXBlACQZX19pbmRpcmVjdF9mdW5jdGlvbl90YWJsZQEAEUhQX1NoYXBlX0FkZENoaWxkACUUSFBfU2hhcGVfUmVtb3ZlQ2hpbGQAJhdIUF9TaGFwZV9HZXROdW1DaGlsZHJlbgAnFkhQX1NoYXBlX0dldENoaWxkU2hhcGUAKBxIUF9TaGFwZV9TZXRDaGlsZFFTVHJhbnNmb3JtACkcSFBfU2hhcGVfR2V0Q2hpbGRRU1RyYW5zZm9ybQAqFkhQX1NoYXBlX1NldEZpbHRlckluZm8AKxZIUF9TaGFwZV9HZXRGaWx0ZXJJbmZvACwUSFBfU2hhcGVfU2V0TWF0ZXJpYWwALRRIUF9TaGFwZV9HZXRNYXRlcmlhbAAuE0hQX1NoYXBlX1NldERlbnNpdHkALxNIUF9TaGFwZV9HZXREZW5zaXR5ADAXSFBfU2hhcGVfR2V0Qm91bmRpbmdCb3gAMRBIUF9TaGFwZV9DYXN0UmF5ADIcSFBfU2hhcGVfQnVpbGRNYXNzUHJvcGVydGllcwAzHEhQX1NoYXBlUGF0aEl0ZXJhdG9yX0dldE5leHQANBNIUF9TaGFwZV9TZXRUcmlnZ2VyADUjSFBfU2hhcGVfQ3JlYXRlRGVidWdEaXNwbGF5R2VvbWV0cnkANhhIUF9EZWJ1Z0dlb21ldHJ5X0dldEluZm8ANxhIUF9EZWJ1Z0dlb21ldHJ5X1JlbGVhc2UAIw5IUF9Cb2R5X0NyZWF0ZQA4D0hQX0JvZHlfUmVsZWFzZQAjEEhQX0JvZHlfU2V0U2hhcGUAORBIUF9Cb2R5X0dldFNoYXBlADoVSFBfQm9keV9TZXRNb3Rpb25UeXBlADsVSFBfQm9keV9HZXRNb3Rpb25UeXBlADwUSFBfQm9keV9TZXRFdmVudE1hc2sAPRRIUF9Cb2R5X0dldEV2ZW50TWFzawA+GUhQX0JvZHlfU2V0TWFzc1Byb3BlcnRpZXMAPxlIUF9Cb2R5X0dldE1hc3NQcm9wZXJ0aWVzAEAYSFBfQm9keV9TZXRMaW5lYXJEYW1waW5nAEEYSFBfQm9keV9HZXRMaW5lYXJEYW1waW5nAEIZSFBfQm9keV9TZXRBbmd1bGFyRGFtcGluZwBDGUhQX0JvZHlfR2V0QW5ndWxhckRhbXBpbmcARBhIUF9Cb2R5X1NldEdyYXZpdHlGYWN0b3IARRhIUF9Cb2R5X0dldEdyYXZpdHlGYWN0b3IARhBIUF9Cb2R5X0dldFdvcmxkAEcTSFBfQm9keV9TZXRQb3NpdGlvbgBIE0hQX0JvZHlfR2V0UG9zaXRpb24ASRZIUF9Cb2R5X1NldE9yaWVudGF0aW9uAEoWSFBfQm9keV9HZXRPcmllbnRhdGlvbgBLFUhQX0JvZHlfU2V0UVRyYW5zZm9ybQBMH0hQX0JvZHlfR2V0V29ybGRUcmFuc2Zvcm1PZmZzZXQATRVIUF9Cb2R5X0dldFFUcmFuc2Zvcm0AThlIUF9Cb2R5X1NldExpbmVhclZlbG9jaXR5AE8ZSFBfQm9keV9HZXRMaW5lYXJWZWxvY2l0eQBQGkhQX0JvZHlfU2V0QW5ndWxhclZlbG9jaXR5AFEaSFBfQm9keV9HZXRBbmd1bGFyVmVsb2NpdHkAUhRIUF9Cb2R5X0FwcGx5SW1wdWxzZQBTG0hQX0JvZHlfQXBwbHlBbmd1bGFySW1wdWxzZQBUG0hQX0JvZHlfU2V0VGFyZ2V0UVRyYW5zZm9ybQBVGkhQX0JvZHlfU2V0QWN0aXZhdGlvblN0YXRlAFYaSFBfQm9keV9HZXRBY3RpdmF0aW9uU3RhdGUAVxxIUF9Cb2R5X1NldEFjdGl2YXRpb25Db250cm9sAFgdSFBfQm9keV9TZXRBY3RpdmF0aW9uUHJpb3JpdHkAWRRIUF9Db25zdHJhaW50X0NyZWF0ZQBaFUhQX0NvbnN0cmFpbnRfUmVsZWFzZQAjG0hQX0NvbnN0cmFpbnRfU2V0UGFyZW50Qm9keQBbG0hQX0NvbnN0cmFpbnRfR2V0UGFyZW50Qm9keQBcGkhQX0NvbnN0cmFpbnRfU2V0Q2hpbGRCb2R5AF0aSFBfQ29uc3RyYWludF9HZXRDaGlsZEJvZHkAXh9IUF9Db25zdHJhaW50X1NldEFuY2hvckluUGFyZW50AF8eSFBfQ29uc3RyYWludF9TZXRBbmNob3JJbkNoaWxkAGAiSFBfQ29uc3RyYWludF9TZXRDb2xsaXNpb25zRW5hYmxlZABhIkhQX0NvbnN0cmFpbnRfR2V0Q29sbGlzaW9uc0VuYWJsZWQAYiBIUF9Db25zdHJhaW50X0dldEFwcGxpZWRJbXB1bHNlcwBjGEhQX0NvbnN0cmFpbnRfU2V0RW5hYmxlZABkGEhQX0NvbnN0cmFpbnRfR2V0RW5hYmxlZABlHUhQX0NvbnN0cmFpbnRfU2V0QXhpc01pbkxpbWl0AGYdSFBfQ29uc3RyYWludF9HZXRBeGlzTWluTGltaXQAZx1IUF9Db25zdHJhaW50X1NldEF4aXNNYXhMaW1pdABoHUhQX0NvbnN0cmFpbnRfR2V0QXhpc01heExpbWl0AGkZSFBfQ29uc3RyYWludF9HZXRBeGlzTW9kZQBqGUhQX0NvbnN0cmFpbnRfU2V0QXhpc01vZGUAax1IUF9Db25zdHJhaW50X1NldEF4aXNGcmljdGlvbgBsHUhQX0NvbnN0cmFpbnRfR2V0QXhpc0ZyaWN0aW9uAG0eSFBfQ29uc3RyYWludF9TZXRBeGlzTW90b3JUeXBlAG4eSFBfQ29uc3RyYWludF9HZXRBeGlzTW90b3JUeXBlAG8oSFBfQ29uc3RyYWludF9TZXRBeGlzTW90b3JQb3NpdGlvblRhcmdldABwKEhQX0NvbnN0cmFpbnRfR2V0QXhpc01vdG9yUG9zaXRpb25UYXJnZXQAcShIUF9Db25zdHJhaW50X1NldEF4aXNNb3RvclZlbG9jaXR5VGFyZ2V0AHIoSFBfQ29uc3RyYWludF9HZXRBeGlzTW90b3JWZWxvY2l0eVRhcmdldABzIkhQX0NvbnN0cmFpbnRfU2V0QXhpc01vdG9yTWF4Rm9yY2UAdCJIUF9Db25zdHJhaW50X0dldEF4aXNNb3Rvck1heEZvcmNlAHUjSFBfQ29uc3RyYWludF9TZXRBeGlzTW90b3JTdGlmZm5lc3MAdiNIUF9Db25zdHJhaW50X0dldEF4aXNNb3RvclN0aWZmbmVzcwB3IUhQX0NvbnN0cmFpbnRfU2V0QXhpc01vdG9yRGFtcGluZwB4IUhQX0NvbnN0cmFpbnRfR2V0QXhpc01vdG9yRGFtcGluZwB5HkhQX0NvbnN0cmFpbnRfU2V0QXhpc1N0aWZmbmVzcwB6HEhQX0NvbnN0cmFpbnRfU2V0QXhpc0RhbXBpbmcAeyBIUF9Db25zdHJhaW50X1NldEF4aXNNb3RvclRhcmdldAB8IEhQX0NvbnN0cmFpbnRfR2V0QXhpc01vdG9yVGFyZ2V0AH0PSFBfV29ybGRfQ3JlYXRlAH4QSFBfV29ybGRfUmVsZWFzZQAjFkhQX1dvcmxkX0dldEJvZHlCdWZmZXIAfxNIUF9Xb3JsZF9TZXRHcmF2aXR5AIABE0hQX1dvcmxkX0dldEdyYXZpdHkAgQEQSFBfV29ybGRfQWRkQm9keQCCARNIUF9Xb3JsZF9SZW1vdmVCb2R5AIMBFUhQX1dvcmxkX0dldE51bUJvZGllcwCEAR1IUF9Xb3JsZF9DYXN0UmF5V2l0aENvbGxlY3RvcgCFASRIUF9Xb3JsZF9Qb2ludFByb3hpbWl0eVdpdGhDb2xsZWN0b3IAhgEkSFBfV29ybGRfU2hhcGVQcm94aW1pdHlXaXRoQ29sbGVjdG9yAIcBH0hQX1dvcmxkX1NoYXBlQ2FzdFdpdGhDb2xsZWN0b3IAiAENSFBfV29ybGRfU3RlcACJARlIUF9Xb3JsZF9TZXRJZGVhbFN0ZXBUaW1lAIoBFkhQX1dvcmxkX1NldFNwZWVkTGltaXQAiwEWSFBfV29ybGRfR2V0U3BlZWRMaW1pdACMAR5IUF9Xb3JsZF9HZXROZXh0Q29sbGlzaW9uRXZlbnQAjQEcSFBfV29ybGRfR2V0TmV4dFRyaWdnZXJFdmVudACOARhIUF9RdWVyeUNvbGxlY3Rvcl9DcmVhdGUAjwEZSFBfUXVlcnlDb2xsZWN0b3JfUmVsZWFzZQAjHEhQX1F1ZXJ5Q29sbGVjdG9yX0dldE51bUhpdHMAkAEiSFBfUXVlcnlDb2xsZWN0b3JfR2V0Q2FzdFJheVJlc3VsdACRASlIUF9RdWVyeUNvbGxlY3Rvcl9HZXRQb2ludFByb3hpbWl0eVJlc3VsdACSASlIUF9RdWVyeUNvbGxlY3Rvcl9HZXRTaGFwZVByb3hpbWl0eVJlc3VsdACTASRIUF9RdWVyeUNvbGxlY3Rvcl9HZXRTaGFwZUNhc3RSZXN1bHQAlAEEbWFpbgCVAQZtYWxsb2MAvhQEZnJlZQC/FBxIUF9EZWJ1Z19TdGFydFJlY29yZGluZ1N0YXRzAI8CG0hQX0RlYnVnX1N0b3BSZWNvcmRpbmdTdGF0cwCQAg1fX2dldFR5cGVOYW1lAI0EBWh0b25zAKQUBW50b2hzAKQUBWh0b25sANIUGV9lbXNjcmlwdGVuX3N0YWNrX3Jlc3RvcmUAzxQXX2Vtc2NyaXB0ZW5fc3RhY2tfYWxsb2MA0BQcZW1zY3JpcHRlbl9zdGFja19nZXRfY3VycmVudADRFAnqJwEAQQELihSWAZcBxQWbAZoBmgGcAaABnQGhAZ4BogGjAaMBpAGlAZoBnwGmAacBpwGoAesK5wqSC+YK5QrkCqgB4wriCuEK4ArfCt4K3QqPC6kB9ArzCo4L6AqLC4oL3Ar9BewK9gqMBPUKpwumC+oK6QrvCvIK8QrwCu4K7QqqAasBsgGzAcMBxAG0AbU