diff --git a/demo/embedding.html b/demo/embedding.html index c0f4f608..b74cd5fa 100644 --- a/demo/embedding.html +++ b/demo/embedding.html @@ -23,12 +23,23 @@ -
Sample Images: -
-
Selected Face (Enhanced):
- - -

Extracted Faces - click on a face to sort by similarity and get a known face match:
-
+
+
+
+ Selected Face
+ +
+
+
+ Sample Images
+
+
+ +
+
+
+ Extracted Faces - click on a face to sort by similarity and get a known face match:
+
+
diff --git a/demo/embedding.js b/demo/embedding.js index 97748bc6..98a85b41 100644 --- a/demo/embedding.js +++ b/demo/embedding.js @@ -61,10 +61,9 @@ async function analyze(face) { for (const canvas of canvases) { // calculate similarity from selected face to current one in the loop const current = all[canvas.tag.sample][canvas.tag.face]; - const similarity = human.similarity(face.embedding, current.embedding, 2); + const similarity = human.similarity(face.embedding, current.embedding, 3); // get best match - const person = await human.match(current.embedding, db); - // draw the canvas and similarity score + // draw the canvas canvas.title = similarity; await human.tf.browser.toPixels(current.tensor, canvas); const ctx = canvas.getContext('2d'); @@ -75,8 +74,10 @@ async function analyze(face) { ctx.fillText(`${(100 * similarity).toFixed(1)}%`, 4, 24); ctx.font = 'small-caps 0.8rem "Lato"'; ctx.fillText(`${current.age}y ${(100 * current.genderConfidence).toFixed(1)}% ${current.gender}`, 4, canvas.height - 6); - ctx.font = 'small-caps 1rem "Lato"'; - if (person.similarity) ctx.fillText(`${(100 * person.similarity).toFixed(1)}% ${person.name}`, 4, canvas.height - 30); + // identify person + // ctx.font = 'small-caps 1rem "Lato"'; + // const person = await human.match(current.embedding, db); + // if (person.similarity) ctx.fillText(`${(100 * person.similarity).toFixed(1)}% ${person.name}`, 4, canvas.height - 30); } // sort all faces by similarity @@ -109,9 +110,9 @@ async function faces(index, res, fileName) { ctx.font = 'small-caps 0.8rem "Lato"'; ctx.fillStyle = 'rgba(255, 255, 255, 1)'; ctx.fillText(`${res.face[i].age}y ${(100 * res.face[i].genderConfidence).toFixed(1)}% ${res.face[i].gender}`, 4, canvas.height - 6); - const person = await human.match(res.face[i].embedding, db); - ctx.font = 'small-caps 1rem "Lato"'; - if (person.similarity && person.similarity > 0.60) ctx.fillText(`${(100 * person.similarity).toFixed(1)}% ${person.name}`, 4, canvas.height - 30); + // const person = await human.match(res.face[i].embedding, db); + // ctx.font = 'small-caps 1rem "Lato"'; + // if (person.similarity && person.similarity > 0.60) ctx.fillText(`${(100 * person.similarity).toFixed(1)}% ${person.name}`, 4, canvas.height - 30); } } } diff --git a/dist/demo-browser-index.js b/dist/demo-browser-index.js index ae89de95..fd17a2f3 100644 --- a/dist/demo-browser-index.js +++ b/dist/demo-browser-index.js @@ -5,31 +5,28557 @@ author: ' */ -var $8=Object.create,Nh=Object.defineProperty,D8=Object.getPrototypeOf,O8=Object.prototype.hasOwnProperty,z8=Object.getOwnPropertyNames,P8=Object.getOwnPropertyDescriptor;var gf=e=>Nh(e,"__esModule",{value:!0});var Q2=(e,t)=>()=>(t||(t={exports:{}},e(t.exports,t)),t.exports),ar=(e,t)=>{for(var n in t)Nh(e,n,{get:t[n],enumerable:!0})},L8=(e,t,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of z8(t))!O8.call(e,r)&&r!=="default"&&Nh(e,r,{get:()=>t[r],enumerable:!(n=P8(t,r))||n.enumerable});return e},Sh=e=>L8(gf(Nh(e!=null?$8(D8(e)):{},"default",e&&e.__esModule&&"default"in e?{get:()=>e.default,enumerable:!0}:{value:e,enumerable:!0})),e);var e5=(e,t,n)=>{if(!t.has(e))throw TypeError("Cannot "+n)},sr=(e,t,n)=>(e5(e,t,"read from private field"),n?n.call(e):t.get(e)),hs=(e,t,n,r)=>(e5(e,t,"write to private field"),r?r.call(e,n):t.set(e,n),n);var X6=Q2(q6=>{gf(q6);ar(q6,{MediaPipeFaceMesh:()=>i2,load:()=>Vae});var i2=class{constructor(t,n,r,a){this.facePipeline=new s2(t,n,r),this.config=a}async estimateFaces(t,n){let r=await this.facePipeline.predict(t,n),a=[];for(let s of r||[]){if(s.isDisposedInternal)continue;let i=s.coords?s.coords.arraySync():[],o=i.map(h=>[h[0]/t.shape[2],h[1]/t.shape[1],h[2]/this.facePipeline.meshSize]),l={};if(i&&i.length>0)for(let h of Object.keys(Jr))l[h]=Jr[h].map(d=>i[d]);let c=s.box?[Math.max(0,s.box.startPoint[0]),Math.max(0,s.box.startPoint[1]),Math.min(t.shape[1],s.box.endPoint[0])-Math.max(0,s.box.startPoint[0]),Math.min(t.shape[2],s.box.endPoint[1])-Math.max(0,s.box.startPoint[1])]:0,u=s.box?[s.box.startPoint[0]/t.shape[2],s.box.startPoint[1]/t.shape[1],(s.box.endPoint[0]-s.box.startPoint[0])/t.shape[2],(s.box.endPoint[1]-s.box.startPoint[1])/t.shape[1]]:[];a.push({confidence:s.faceConfidence||s.boxConfidence||0,boxConfidence:s.boxConfidence,faceConfidence:s.faceConfidence,box:c,boxRaw:u,mesh:i,meshRaw:o,annotations:l,image:s.image?s.image.clone():null}),s.coords&&s.coords.dispose(),s.image&&s.image.dispose()}return a}},Wi=[null,null,null];async function Vae(e){Wi=await Promise.all([!Wi[0]&&e.face.enabled?W6(e):null,!Wi[1]&&e.face.mesh.enabled?bt(e.face.mesh.modelPath,{fromTFHub:e.face.mesh.modelPath.includes("tfhub.dev")}):null,!Wi[2]&&e.face.iris.enabled?bt(e.face.iris.modelPath,{fromTFHub:e.face.iris.modelPath.includes("tfhub.dev")}):null]);let t=new i2(Wi[0],Wi[1],Wi[2],e);return e.face.mesh.enabled&&e.debug&&Ee(`load model: ${e.face.mesh.modelPath.match(/\/(.*)\./)[1]}`),e.face.iris.enabled&&e.debug&&Ee(`load model: ${e.face.iris.modelPath.match(/\/(.*)\./)[1]}`),t}q6.triangulation=Li});var D0=Q2(c2=>{gf(c2);ar(c2,{NUM_KEYPOINTS:()=>Gae,connectedPartIndices:()=>Xae,partChannels:()=>Zae,partIds:()=>h2,partNames:()=>Hae,poseChain:()=>Kae});var Hae=["nose","leftEye","rightEye","leftEar","rightEar","leftShoulder","rightShoulder","leftElbow","rightElbow","leftWrist","rightWrist","leftHip","rightHip","leftKnee","rightKnee","leftAnkle","rightAnkle"],Gae=c2.partNames.length,h2=c2.partNames.reduce((e,t,n)=>(e[t]=n,e),{}),qae=[["leftHip","leftShoulder"],["leftElbow","leftShoulder"],["leftElbow","leftWrist"],["leftHip","leftKnee"],["leftKnee","leftAnkle"],["rightHip","rightShoulder"],["rightElbow","rightShoulder"],["rightElbow","rightWrist"],["rightHip","rightKnee"],["rightKnee","rightAnkle"],["leftShoulder","rightShoulder"],["leftHip","rightHip"]],Xae=qae.map(([e,t])=>[h2[e],h2[t]]),Kae=[["nose","leftEye"],["leftEye","leftEar"],["nose","rightEye"],["rightEye","rightEar"],["nose","leftShoulder"],["leftShoulder","leftElbow"],["leftElbow","leftWrist"],["leftShoulder","leftHip"],["leftHip","leftKnee"],["leftKnee","leftAnkle"],["nose","rightShoulder"],["rightShoulder","rightElbow"],["rightElbow","rightWrist"],["rightShoulder","rightHip"],["rightHip","rightKnee"],["rightKnee","rightAnkle"]],Zae=["left_face","right_face","right_upper_leg_front","right_lower_leg_back","right_upper_leg_back","left_lower_leg_front","left_upper_leg_front","left_upper_leg_back","left_lower_leg_back","right_feet","right_lower_leg_front","left_feet","torso_front","torso_back","right_upper_arm_front","right_upper_arm_back","right_lower_arm_back","left_lower_arm_front","left_upper_arm_front","left_upper_arm_back","left_lower_arm_back","right_hand","right_lower_arm_front","left_hand"]});function Ee(...e){let t=new Date,n=`${t.getHours().toString().padStart(2,"0")}:${t.getMinutes().toString().padStart(2,"0")}:${t.getSeconds().toString().padStart(2,"0")}.${t.getMilliseconds().toString().padStart(3,"0")}`;e&&console.log(n,"Human:",...e)}var et=()=>typeof performance!="undefined"?performance.now():parseInt((Number(process.hrtime.bigint())/1e3/1e3).toString());function to(...e){let t=n=>n&&typeof n=="object";return e.reduce((n,r)=>(Object.keys(r||{}).forEach(a=>{let s=n[a],i=r[a];Array.isArray(s)&&Array.isArray(i)?n[a]=s.concat(...i):t(s)&&t(i)?n[a]=to(s,i):n[a]=i}),n),{})}function t5(){let e,t;if(typeof navigator!="undefined"){let n=navigator.userAgent.match(/\(([^()]+)\)/g);n&&n[0]&&(e=n[0].match(/\(([^()]+)\)/g)[0].replace(/\(|\)/g,""),t=navigator.userAgent.replace(n[0],""),e[1]&&(t=t.replace(n[1],"")),t=t.replace(/ /g," "))}else typeof process!="undefined"&&(e=`${process.platform} ${process.arch}`,t=`NodeJS ${process.version}`);return{platform:e,agent:t}}var Th={};ar(Th,{Abs:()=>so,Acos:()=>io,Acosh:()=>oo,AdadeltaOptimizer:()=>ep,AdagradOptimizer:()=>tp,AdamOptimizer:()=>np,AdamaxOptimizer:()=>rp,Add:()=>Ea,AddN:()=>fs,All:()=>$h,Any:()=>Dh,ArgMax:()=>ms,ArgMin:()=>gu,Asin:()=>lo,Asinh:()=>uo,Atan:()=>co,Atan2:()=>po,Atanh:()=>ho,AvgPool:()=>As,AvgPool3D:()=>xu,AvgPool3DGrad:()=>zh,AvgPoolGrad:()=>Oh,BackendWasm:()=>j3,BatchMatMul:()=>ys,BatchToSpaceND:()=>wu,Bincount:()=>Ph,BroadcastTo:()=>g5,Callback:()=>Dv,CallbackList:()=>M7,Cast:()=>gs,Ceil:()=>xs,ClipByValue:()=>Ca,Complex:()=>Lh,ComplexAbs:()=>bu,Concat:()=>fo,Conv2D:()=>ws,Conv2DBackpropFilter:()=>Wh,Conv2DBackpropInput:()=>bs,Conv3D:()=>_u,Conv3DBackpropFilterV2:()=>Bh,Conv3DBackpropInputV2:()=>Vh,Cos:()=>_s,Cosh:()=>mo,CropAndResize:()=>Ao,Cumsum:()=>vs,CustomCallback:()=>D7,DataStorage:()=>Ch,DenseBincount:()=>Uh,DepthToSpace:()=>yo,DepthwiseConv2dNative:()=>ks,DepthwiseConv2dNativeBackpropFilter:()=>jh,DepthwiseConv2dNativeBackpropInput:()=>Hh,Diag:()=>Gh,Dilation2D:()=>vu,Dilation2DBackpropFilter:()=>Xh,Dilation2DBackpropInput:()=>qh,ENV:()=>xr,EarlyStopping:()=>zv,Elu:()=>go,EluGrad:()=>Kh,Environment:()=>A5,Equal:()=>wo,Erf:()=>xo,Exp:()=>Ns,ExpandDims:()=>bo,Expm1:()=>_o,FFT:()=>Zh,Fill:()=>ku,FlipLeftRight:()=>vo,Floor:()=>Ss,FloorDiv:()=>Ts,FromPixels:()=>hd,FusedBatchNorm:()=>Es,FusedConv2D:()=>oi,FusedDepthwiseConv2D:()=>li,GPGPUContext:()=>wp,GatherNd:()=>Io,GatherV2:()=>ko,GraphModel:()=>p6,Greater:()=>No,GreaterEqual:()=>Cs,History:()=>$7,IFFT:()=>Yh,Identity:()=>Rs,Imag:()=>Jh,InputSpec:()=>Zt,IsFinite:()=>So,IsInf:()=>To,IsNan:()=>Eo,KernelBackend:()=>mu,LRN:()=>Su,LRNGrad:()=>ed,LayerVariable:()=>T7,LayersModel:()=>fa,LeakyRelu:()=>Fs,Less:()=>Co,LessEqual:()=>Ro,LinSpace:()=>Qh,Log:()=>Ms,Log1p:()=>Fo,LogSoftmax:()=>x5,LogicalAnd:()=>Mo,LogicalNot:()=>Iu,LogicalOr:()=>Nu,MathBackendCPU:()=>op,MathBackendWebGL:()=>Ll,Max:()=>$s,MaxPool:()=>Os,MaxPool3D:()=>Tu,MaxPool3DGrad:()=>nd,MaxPoolGrad:()=>td,MaxPoolWithArgmax:()=>rd,Maximum:()=>Ds,Mean:()=>zs,Min:()=>Ps,Minimum:()=>Ls,MirrorPad:()=>Eu,Mod:()=>$o,MomentumOptimizer:()=>ap,Multinomial:()=>ad,Multiply:()=>Ws,Neg:()=>Do,NonMaxSuppressionV3:()=>zo,NonMaxSuppressionV4:()=>Po,NonMaxSuppressionV5:()=>Lo,NotEqual:()=>Oo,OP_SCOPE_SUFFIX:()=>C5,OneHot:()=>Bs,OnesLike:()=>Wo,Optimizer:()=>ca,Pack:()=>Bo,PadV2:()=>Vs,Pool:()=>Wk,Pow:()=>Us,Prelu:()=>js,Prod:()=>Vo,RMSPropOptimizer:()=>sp,RNN:()=>Kr,Range:()=>Cu,Rank:()=>Ef,Real:()=>sd,RealDiv:()=>Is,Reciprocal:()=>Uo,Reduction:()=>pn,Relu:()=>Hs,Relu6:()=>qs,Reshape:()=>jo,ResizeBilinear:()=>Gs,ResizeBilinearGrad:()=>od,ResizeNearestNeighbor:()=>Ru,ResizeNearestNeighborGrad:()=>id,Reverse:()=>Xs,RotateWithOffset:()=>al,Round:()=>Ks,Rsqrt:()=>Zs,SGDOptimizer:()=>cc,ScatterNd:()=>Ho,Select:()=>Go,Selu:()=>qo,Sequential:()=>Kl,Sigmoid:()=>Js,Sign:()=>Zo,Sin:()=>Ys,Sinh:()=>Ko,Slice:()=>Xo,Softmax:()=>ti,Softplus:()=>Yo,SpaceToBatchND:()=>Fu,SparseToDense:()=>ld,SplitV:()=>Jo,Sqrt:()=>Qs,Square:()=>Mu,SquaredDifference:()=>ni,Step:()=>Fa,StridedSlice:()=>Qo,Sub:()=>ri,Sum:()=>ei,SymbolicTensor:()=>Tr,Tan:()=>el,Tanh:()=>ai,Tensor:()=>Ge,TensorBuffer:()=>Pt,Tile:()=>Ra,TopK:()=>tl,Transform:()=>ud,Transpose:()=>si,Unique:()=>cd,Unpack:()=>nl,UnsortedSegmentSum:()=>$u,Variable:()=>Bu,ZerosLike:()=>rl,_FusedMatMul:()=>ii,abs:()=>Lt,acos:()=>tm,acosh:()=>nm,add:()=>ie,addN:()=>za,all:()=>vd,any:()=>Gu,argMax:()=>qu,argMin:()=>rm,asin:()=>am,asinh:()=>sm,atan:()=>im,atan2:()=>om,atanh:()=>lm,avgPool:()=>Ku,avgPool3d:()=>hm,backend:()=>hx,backend_util:()=>R,basicLSTMCell:()=>gN,batchNorm:()=>mi,batchNorm2d:()=>mx,batchNorm3d:()=>Ax,batchNorm4d:()=>yx,batchToSpaceND:()=>Zu,bincount:()=>gx,booleanMaskAsync:()=>vE,broadcastTo:()=>Yu,browser:()=>dl,buffer:()=>Ve,callbacks:()=>Une,cast:()=>ge,ceil:()=>dm,clipByValue:()=>kn,clone:()=>Or,complex:()=>Ma,concat:()=>it,concat1d:()=>xx,concat2d:()=>yl,concat3d:()=>wx,concat4d:()=>bx,constraints:()=>t7,conv1d:()=>Id,conv2d:()=>ia,conv2dTranspose:()=>Nd,conv3d:()=>fm,conv3dTranspose:()=>WN,copyRegisteredKernels:()=>Uk,cos:()=>Ju,cosh:()=>Sd,cosineWindow:()=>Bm,cumsum:()=>Td,customGrad:()=>Lr,data:()=>f6,denseBincount:()=>vx,deprecationWarn:()=>Qf,depthToSpace:()=>mm,depthwiseConv2d:()=>gl,deregisterOp:()=>Hne,device_util:()=>Uu,diag:()=>XN,dilation2d:()=>Am,disableDeprecationWarnings:()=>FI,dispose:()=>Te,disposeVariables:()=>MI,div:()=>be,divNoNan:()=>ym,dot:()=>kx,dropout:()=>Hx,elu:()=>xl,enableDebugMode:()=>RI,enableProdMode:()=>CI,enclosingPowerOfTwo:()=>Gx,engine:()=>zr,env:()=>J,equal:()=>La,erf:()=>gm,exp:()=>Zn,expandDims:()=>hn,expm1:()=>xm,eye:()=>wm,fft:()=>lc,fill:()=>Qu,findBackend:()=>em,findBackendFactory:()=>LI,floor:()=>wl,floorDiv:()=>_d,forceHalfFloat:()=>r_,fused:()=>Ua,gather:()=>Ai,gatherND:()=>jx,gather_util:()=>Gf,getBackend:()=>zI,getGradient:()=>Nf,getKernel:()=>dd,getKernelsForBackend:()=>il,gpgpu_util:()=>Sb,grad:()=>vS,grads:()=>kS,greater:()=>ur,greaterEqual:()=>Ba,ifft:()=>Il,imag:()=>Ed,image:()=>je,inTopKAsync:()=>$E,initializers:()=>l7,input:()=>b7,io:()=>_n,irfft:()=>Hd,isFinite:()=>Ix,isInf:()=>Nx,isNaN:()=>Sx,keep:()=>qt,kernel_impls:()=>Ur,layers:()=>w7,leakyRelu:()=>ec,less:()=>Cd,lessEqual:()=>yi,linalg:()=>aw,linspace:()=>Tx,loadGraphModel:()=>bt,loadLayersModel:()=>une,localResponseNormalization:()=>bm,log:()=>Dn,log1p:()=>Rd,logSigmoid:()=>Cx,logSoftmax:()=>Md,logSumExp:()=>km,logicalAnd:()=>cr,logicalNot:()=>tc,logicalOr:()=>$d,logicalXor:()=>$x,losses:()=>YC,matMul:()=>Ke,math:()=>G5,max:()=>Yn,maxPool:()=>nc,maxPool3d:()=>Im,maxPoolWithArgmax:()=>Dx,maximum:()=>Wr,mean:()=>St,memory:()=>bd,metrics:()=>Fv,min:()=>_l,minimum:()=>vl,mirrorPad:()=>Nm,mod:()=>Sm,model:()=>one,models:()=>Mv,moments:()=>Dd,movingAverage:()=>NE,mul:()=>P,multiRNNCell:()=>QS,multinomial:()=>Ox,neg:()=>Nt,nextFrame:()=>ip,norm:()=>Kd,notEqual:()=>xi,oneHot:()=>hl,ones:()=>Br,onesLike:()=>On,op:()=>D,outerProduct:()=>aT,pad:()=>oa,pad1d:()=>oT,pad2d:()=>uT,pad3d:()=>hT,pad4d:()=>pT,pool:()=>zx,pow:()=>la,prelu:()=>ac,print:()=>W5,prod:()=>Od,profile:()=>vn,rand:()=>_T,randomGamma:()=>NT,randomNormal:()=>Px,randomUniform:()=>kl,range:()=>zd,ready:()=>OI,real:()=>sc,reciprocal:()=>Cm,registerBackend:()=>fl,registerCallbackConstructor:()=>cne,registerGradient:()=>w5,registerKernel:()=>ui,registerOp:()=>jne,regularizers:()=>$v,relu:()=>Vr,relu6:()=>Pd,removeBackend:()=>PI,reshape:()=>H,reverse:()=>zn,reverse1d:()=>DT,reverse2d:()=>zT,reverse3d:()=>LT,reverse4d:()=>BT,rfft:()=>uc,round:()=>Rm,rsqrt:()=>Ld,scalar:()=>Ie,scatterND:()=>Ux,scatter_util:()=>qf,selu:()=>Wd,separableConv2d:()=>Fm,sequential:()=>lne,serialization:()=>ae,setBackend:()=>DI,setPlatform:()=>WI,setWasmPath:()=>aY,setWasmPaths:()=>sY,setWebGLContext:()=>Ap,setdiff1dAsync:()=>Lx,shared:()=>Hm,sigmoid:()=>$n,sign:()=>Mm,signal:()=>ZC,sin:()=>Bd,sinh:()=>Vd,slice:()=>Me,slice1d:()=>Ud,slice2d:()=>$m,slice3d:()=>jd,slice4d:()=>ic,slice_util:()=>cn,softmax:()=>oc,softplus:()=>bl,spaceToBatchND:()=>rc,sparseToDense:()=>Wm,spectral:()=>KC,split:()=>Bt,sqrt:()=>tn,square:()=>ut,squaredDifference:()=>Gd,squeeze:()=>Va,stack:()=>dn,step:()=>Nl,stridedSlice:()=>Dm,sub:()=>we,sum:()=>Fe,sumOutType:()=>Ad,tan:()=>Om,tanh:()=>Al,tensor:()=>_r,tensor1d:()=>ln,tensor2d:()=>Nn,tensor3d:()=>xd,tensor4d:()=>pE,tensor5d:()=>fE,tensor6d:()=>mE,tensor_util:()=>wr,test_util:()=>lx,tidy:()=>z,tile:()=>Wa,time:()=>$I,topk:()=>zm,train:()=>bi,transpose:()=>st,truncatedNormal:()=>qd,unique:()=>Xd,unregisterGradient:()=>Vk,unregisterKernel:()=>Bk,unsortedSegmentSum:()=>Pm,unstack:()=>hr,upcastType:()=>lr,util:()=>v,valueAndGrad:()=>IS,valueAndGrads:()=>NS,variable:()=>Wx,variableGrads:()=>Ex,version:()=>Cae,version_converter:()=>jre,version_core:()=>EI,version_cpu:()=>$w,version_layers:()=>cy,version_wasm:()=>G3,version_webgl:()=>n_,webgl:()=>_L,webgl_util:()=>tb,where:()=>In,whereAsync:()=>Lm,zeros:()=>Mt,zerosLike:()=>qe});var W8=Object.create,Eh=Object.defineProperty,B8=Object.getPrototypeOf,V8=Object.prototype.hasOwnProperty,U8=Object.getOwnPropertyNames,j8=Object.getOwnPropertyDescriptor,H8=e=>Eh(e,"__esModule",{value:!0}),kt=(e,t)=>()=>(t||(t={exports:{}},e(t.exports,t)),t.exports),Le=(e,t)=>{for(var n in t)Eh(e,n,{get:t[n],enumerable:!0})},G8=(e,t,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of U8(t))!V8.call(e,r)&&r!=="default"&&Eh(e,r,{get:()=>t[r],enumerable:!(n=j8(t,r))||n.enumerable});return e},no=e=>G8(H8(Eh(e!=null?W8(B8(e)):{},"default",e&&e.__esModule&&"default"in e?{get:()=>e.default,enumerable:!0}:{value:e,enumerable:!0})),e),q8=kt(()=>{}),X8=kt((e,t)=>{(function(n,r,a){function s(c){var u=this,h=l();u.next=function(){var d=2091639*u.s0+u.c*23283064365386963e-26;return u.s0=u.s1,u.s1=u.s2,u.s2=d-(u.c=d|0)},u.c=1,u.s0=h(" "),u.s1=h(" "),u.s2=h(" "),u.s0-=h(c),u.s0<0&&(u.s0+=1),u.s1-=h(c),u.s1<0&&(u.s1+=1),u.s2-=h(c),u.s2<0&&(u.s2+=1),h=null}function i(c,u){return u.c=c.c,u.s0=c.s0,u.s1=c.s1,u.s2=c.s2,u}function o(c,u){var h=new s(c),d=u&&u.state,p=h.next;return p.int32=function(){return h.next()*4294967296|0},p.double=function(){return p()+(p()*2097152|0)*11102230246251565e-32},p.quick=p,d&&(typeof d=="object"&&i(d,h),p.state=function(){return i(h,{})}),p}function l(){var c=4022871197,u=function(h){h=h.toString();for(var d=0;d>>0,p-=c,p*=c,c=p>>>0,p-=c,c+=p*4294967296}return(c>>>0)*23283064365386963e-26};return u}r&&r.exports?r.exports=o:a&&a.amd?a(function(){return o}):this.alea=o})(e,typeof t=="object"&&t,typeof define=="function"&&define)}),K8=kt((e,t)=>{(function(n,r,a){function s(l){var c=this,u="";c.x=0,c.y=0,c.z=0,c.w=0,c.next=function(){var d=c.x^c.x<<11;return c.x=c.y,c.y=c.z,c.z=c.w,c.w^=c.w>>>19^d^d>>>8},l===(l|0)?c.x=l:u+=l;for(var h=0;h>>0)/4294967296};return d.double=function(){do var p=u.next()>>>11,f=(u.next()>>>0)/4294967296,m=(p+f)/(1<<21);while(m===0);return m},d.int32=u.next,d.quick=d,h&&(typeof h=="object"&&i(h,u),d.state=function(){return i(u,{})}),d}r&&r.exports?r.exports=o:a&&a.amd?a(function(){return o}):this.xor128=o})(e,typeof t=="object"&&t,typeof define=="function"&&define)}),Z8=kt((e,t)=>{(function(n,r,a){function s(l){var c=this,u="";c.next=function(){var d=c.x^c.x>>>2;return c.x=c.y,c.y=c.z,c.z=c.w,c.w=c.v,(c.d=c.d+362437|0)+(c.v=c.v^c.v<<4^(d^d<<1))|0},c.x=0,c.y=0,c.z=0,c.w=0,c.v=0,l===(l|0)?c.x=l:u+=l;for(var h=0;h>>4),c.next()}function i(l,c){return c.x=l.x,c.y=l.y,c.z=l.z,c.w=l.w,c.v=l.v,c.d=l.d,c}function o(l,c){var u=new s(l),h=c&&c.state,d=function(){return(u.next()>>>0)/4294967296};return d.double=function(){do var p=u.next()>>>11,f=(u.next()>>>0)/4294967296,m=(p+f)/(1<<21);while(m===0);return m},d.int32=u.next,d.quick=d,h&&(typeof h=="object"&&i(h,u),d.state=function(){return i(u,{})}),d}r&&r.exports?r.exports=o:a&&a.amd?a(function(){return o}):this.xorwow=o})(e,typeof t=="object"&&t,typeof define=="function"&&define)}),Y8=kt((e,t)=>{(function(n,r,a){function s(l){var c=this;c.next=function(){var h=c.x,d=c.i,p,f,m;return p=h[d],p^=p>>>7,f=p^p<<24,p=h[d+1&7],f^=p^p>>>10,p=h[d+3&7],f^=p^p>>>3,p=h[d+4&7],f^=p^p<<7,p=h[d+7&7],p=p^p<<13,f^=p^p<<9,h[d]=f,c.i=d+1&7,f};function u(h,d){var p,f,m=[];if(d===(d|0))f=m[0]=d;else for(d=""+d,p=0;p0;--p)h.next()}u(c,l)}function i(l,c){return c.x=l.x.slice(),c.i=l.i,c}function o(l,c){l==null&&(l=+new Date);var u=new s(l),h=c&&c.state,d=function(){return(u.next()>>>0)/4294967296};return d.double=function(){do var p=u.next()>>>11,f=(u.next()>>>0)/4294967296,m=(p+f)/(1<<21);while(m===0);return m},d.int32=u.next,d.quick=d,h&&(h.x&&i(h,u),d.state=function(){return i(u,{})}),d}r&&r.exports?r.exports=o:a&&a.amd?a(function(){return o}):this.xorshift7=o})(e,typeof t=="object"&&t,typeof define=="function"&&define)}),J8=kt((e,t)=>{(function(n,r,a){function s(l){var c=this;c.next=function(){var h=c.w,d=c.X,p=c.i,f,m;return c.w=h=h+1640531527|0,m=d[p+34&127],f=d[p=p+1&127],m^=m<<13,f^=f<<17,m^=m>>>15,f^=f>>>12,m=d[p]=m^f,c.i=p,m+(h^h>>>16)|0};function u(h,d){var p,f,m,A,y,g=[],w=128;for(d===(d|0)?(f=d,d=null):(d=d+"\0",f=0,w=Math.max(w,d.length)),m=0,A=-32;A>>15,f^=f<<4,f^=f>>>13,A>=0&&(y=y+1640531527|0,p=g[A&127]^=f+y,m=p==0?m+1:0);for(m>=128&&(g[(d&&d.length||0)&127]=-1),m=127,A=4*128;A>0;--A)f=g[m+34&127],p=g[m=m+1&127],f^=f<<13,p^=p<<17,f^=f>>>15,p^=p>>>12,g[m]=f^p;h.w=y,h.X=g,h.i=m}u(c,l)}function i(l,c){return c.i=l.i,c.w=l.w,c.X=l.X.slice(),c}function o(l,c){l==null&&(l=+new Date);var u=new s(l),h=c&&c.state,d=function(){return(u.next()>>>0)/4294967296};return d.double=function(){do var p=u.next()>>>11,f=(u.next()>>>0)/4294967296,m=(p+f)/(1<<21);while(m===0);return m},d.int32=u.next,d.quick=d,h&&(h.X&&i(h,u),d.state=function(){return i(u,{})}),d}r&&r.exports?r.exports=o:a&&a.amd?a(function(){return o}):this.xor4096=o})(e,typeof t=="object"&&t,typeof define=="function"&&define)}),Q8=kt((e,t)=>{(function(n,r,a){function s(l){var c=this,u="";c.next=function(){var d=c.b,p=c.c,f=c.d,m=c.a;return d=d<<25^d>>>7^p,p=p-f|0,f=f<<24^f>>>8^m,m=m-d|0,c.b=d=d<<20^d>>>12^p,c.c=p=p-f|0,c.d=f<<16^p>>>16^m,c.a=m-d|0},c.a=0,c.b=0,c.c=2654435769|0,c.d=1367130551,l===Math.floor(l)?(c.a=l/4294967296|0,c.b=l|0):u+=l;for(var h=0;h>>0)/4294967296};return d.double=function(){do var p=u.next()>>>11,f=(u.next()>>>0)/4294967296,m=(p+f)/(1<<21);while(m===0);return m},d.int32=u.next,d.quick=d,h&&(typeof h=="object"&&i(h,u),d.state=function(){return i(u,{})}),d}r&&r.exports?r.exports=o:a&&a.amd?a(function(){return o}):this.tychei=o})(e,typeof t=="object"&&t,typeof define=="function"&&define)}),n5=kt(()=>{}),ek=kt((e,t)=>{(function(n,r){var a=this,s=256,i=6,o=52,l="random",c=r.pow(s,i),u=r.pow(2,o),h=u*2,d=s-1,p;function f(_,x,N){var T=[];x=x==!0?{entropy:!0}:x||{};var E=g(y(x.entropy?[_,b(n)]:_==null?w():_,3),T),M=new m(T),O=function(){for(var W=M.g(i),V=c,U=0;W=h;)W/=2,V/=2,U>>>=1;return(W+U)/V};return O.int32=function(){return M.g(4)|0},O.quick=function(){return M.g(4)/4294967296},O.double=O,g(b(M.S),n),(x.pass||N||function(W,V,U,j){return j&&(j.S&&A(j,M),W.state=function(){return A(M,{})}),U?(r[l]=W,V):W})(O,E,"global"in x?x.global:this==r,x.state)}r["seed"+l]=f;function m(_){var x,N=_.length,T=this,E=0,M=T.i=T.j=0,O=T.S=[];for(N||(_=[N++]);E{var n=X8(),r=K8(),a=Z8(),s=Y8(),i=J8(),o=Q8(),l=ek();l.alea=n,l.xor128=r,l.xorwow=a,l.xorshift7=s,l.xor4096=i,l.tychei=o,t.exports=l}),fu=kt(()=>{}),tk=kt(()=>{}),nk=kt(()=>{}),rk=kt((e,t)=>{var n=function(){var r=typeof document!="undefined"&&document.currentScript?document.currentScript.src:void 0;return typeof __filename!="undefined"&&(r=r||__filename),function(a){a=a||{};function s(){return Q.buffer!=Ue&&Qt(Q.buffer),yn}function i(){return Q.buffer!=Ue&&Qt(Q.buffer),vt}function o(){return Q.buffer!=Ue&&Qt(Q.buffer),gn}function l(){return Q.buffer!=Ue&&Qt(Q.buffer),qn}function c(){return Q.buffer!=Ue&&Qt(Q.buffer),un}var u=typeof a!="undefined"?a:{},h,d;u.ready=new Promise(function(I,S){h=I,d=S});var p={},f;for(f in u)u.hasOwnProperty(f)&&(p[f]=u[f]);var m=[],A="./this.program",y=function(I,S){throw S},g=!1,w=!1,b=!1,_=!1;g=typeof window=="object",w=typeof importScripts=="function",b=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string",_=!g&&!b&&!w;var x=u.ENVIRONMENT_IS_PTHREAD||!1;x&&(Ue=u.buffer);var N="";function T(I){return u.locateFile?u.locateFile(I,N):N+I}var E,M,O,W,V,U;if(b){w?N=fu().dirname(N)+"/":N=__dirname+"/",E=function(I,S){return V||(V=require("fs")),U||(U=fu()),I=U.normalize(I),V.readFileSync(I,S?null:"utf8")},O=function(I){var S=E(I,!0);return S.buffer||(S=new Uint8Array(S)),me(S.buffer),S},process.argv.length>1&&(A=process.argv[1].replace(/\\/g,"/")),m=process.argv.slice(2),process.on("uncaughtException",function(I){if(!(I instanceof pu))throw I}),process.on("unhandledRejection",ta),y=function(I){process.exit(I)},u.inspect=function(){return"[Emscripten Module object]"};var j;try{j=tk()}catch(I){throw console.error('The "worker_threads" module is not supported in this node.js build - perhaps a newer version is needed?'),I}global.Worker=j.Worker}else _?(typeof read!="undefined"&&(E=function(I){return read(I)}),O=function(I){var S;return typeof readbuffer=="function"?new Uint8Array(readbuffer(I)):(S=read(I,"binary"),me(typeof S=="object"),S)},typeof scriptArgs!="undefined"?m=scriptArgs:typeof arguments!="undefined"&&(m=arguments),typeof quit=="function"&&(y=function(I){quit(I)}),typeof print!="undefined"&&(typeof console=="undefined"&&(console={}),console.log=print,console.warn=console.error=typeof printErr!="undefined"?printErr:print)):(g||w)&&(w?N=self.location.href:typeof document!="undefined"&&document.currentScript&&(N=document.currentScript.src),typeof r!="undefined"&&r&&(N=r),N.indexOf("blob:")!==0?N=N.substr(0,N.lastIndexOf("/")+1):N="",b?(E=function(I,S){return V||(V=require("fs")),U||(U=fu()),I=U.normalize(I),V.readFileSync(I,S?null:"utf8")},O=function(I){var S=E(I,!0);return S.buffer||(S=new Uint8Array(S)),me(S.buffer),S}):(E=function(I){var S=new XMLHttpRequest;return S.open("GET",I,!1),S.send(null),S.responseText},w&&(O=function(I){var S=new XMLHttpRequest;return S.open("GET",I,!1),S.responseType="arraybuffer",S.send(null),new Uint8Array(S.response)}),M=function(I,S,L){var q=new XMLHttpRequest;q.open("GET",I,!0),q.responseType="arraybuffer",q.onload=function(){if(q.status==200||q.status==0&&q.response){S(q.response);return}L()},q.onerror=L,q.send(null)}),W=function(I){document.title=I});b&&typeof performance=="undefined"&&(global.performance=nk().performance);var X=u.print||console.log.bind(console),G=u.printErr||console.warn.bind(console);for(f in p)p.hasOwnProperty(f)&&(u[f]=p[f]);p=null,u.arguments&&(m=u.arguments),u.thisProgram&&(A=u.thisProgram),u.quit&&(y=u.quit);var ee=Atomics.load,Y=Atomics.store,se=Atomics.compareExchange,te;u.wasmBinary&&(te=u.wasmBinary);var le=u.noExitRuntime||!0;typeof WebAssembly!="object"&&ta("no native wasm support detected");var Q,pe,ue=!1,ye;function me(I,S){I||ta("Assertion failed: "+S)}function Ne(I){var S=u["_"+I];return me(S,"Cannot call unknown function "+I+", make sure it is exported"),S}function Ce(I,S,L,q,fe){var ce={string:function(bn){var eo=0;if(bn!=null&&bn!==0){var J2=(bn.length<<2)+1;eo=Yi(J2),rt(bn,eo,J2)}return eo},array:function(bn){var eo=Yi(bn.length);return Je(bn,eo),eo}};function de(bn){return S==="string"?Oe(bn):S==="boolean"?Boolean(bn):bn}var ve=Ne(I),at=[],Ht=0;if(q)for(var Ot=0;Ot=q);){var ce=I[S++];if(!ce)return fe;if(!(ce&128)){fe+=String.fromCharCode(ce);continue}var de=I[S++]&63;if((ce&224)==192){fe+=String.fromCharCode((ce&31)<<6|de);continue}var ve=I[S++]&63;if((ce&240)==224?ce=(ce&15)<<12|de<<6|ve:ce=(ce&7)<<18|de<<12|ve<<6|I[S++]&63,ce<65536)fe+=String.fromCharCode(ce);else{var at=ce-65536;fe+=String.fromCharCode(55296|at>>10,56320|at&1023)}}return fe}function Oe(I,S){return I?Pe(i(),I,S):""}function nt(I,S,L,q){if(!(q>0))return 0;for(var fe=L,ce=L+q-1,de=0;de=55296&&ve<=57343){var at=I.charCodeAt(++de);ve=65536+((ve&1023)<<10)|at&1023}if(ve<=127){if(L>=ce)break;S[L++]=ve}else if(ve<=2047){if(L+1>=ce)break;S[L++]=192|ve>>6,S[L++]=128|ve&63}else if(ve<=65535){if(L+2>=ce)break;S[L++]=224|ve>>12,S[L++]=128|ve>>6&63,S[L++]=128|ve&63}else{if(L+3>=ce)break;S[L++]=240|ve>>18,S[L++]=128|ve>>12&63,S[L++]=128|ve>>6&63,S[L++]=128|ve&63}}return S[L]=0,L-fe}function rt(I,S,L){return nt(I,i(),S,L)}function lt(I){for(var S=0,L=0;L=55296&&q<=57343&&(q=65536+((q&1023)<<10)|I.charCodeAt(++L)&1023),q<=127?++S:q<=2047?S+=2:q<=65535?S+=3:S+=4}return S}function Je(I,S){s().set(I,S)}function pt(I,S){return I%S>0&&(I+=S-I%S),I}var Ue,yn,vt,Gn,Jt,gn,qn,Mn,un;function Qt(I){Ue=I,u.HEAP8=yn=new Int8Array(I),u.HEAP16=Gn=new Int16Array(I),u.HEAP32=gn=new Int32Array(I),u.HEAPU8=vt=new Uint8Array(I),u.HEAPU16=Jt=new Uint16Array(I),u.HEAPU32=qn=new Uint32Array(I),u.HEAPF32=Mn=new Float32Array(I),u.HEAPF64=un=new Float64Array(I)}var Mr=u.INITIAL_MEMORY||16777216;if(x)Q=u.wasmMemory,Ue=u.buffer;else if(u.wasmMemory)Q=u.wasmMemory;else if(Q=new WebAssembly.Memory({initial:Mr/65536,maximum:2147483648/65536,shared:!0}),!(Q.buffer instanceof SharedArrayBuffer))throw G("requested a shared WebAssembly.Memory but the returned buffer is not a SharedArrayBuffer, indicating that while the browser has SharedArrayBuffer it does not have WebAssembly threads support - you may need to set a flag"),b&&console.log("(on node you may need: --experimental-wasm-threads --experimental-wasm-bulk-memory and also use a recent version)"),Error("bad memory");Q&&(Ue=Q.buffer),Mr=Ue.byteLength,Qt(Ue);var nr,rr=[],wa=[],Qr=[],ba=[],Ui=[],gr=!1,rh=!1;x||wa.push({func:function(){xh()}}),x&&(gr=!0);function n1(){if(!x){if(u.preRun)for(typeof u.preRun=="function"&&(u.preRun=[u.preRun]);u.preRun.length;)ih(u.preRun.shift());Hi(rr)}}function ah(){gr=!0,Hi(wa)}function r1(){x||Hi(Qr)}function sh(){x||(rh=!0)}function xn(){if(!x){if(u.postRun)for(typeof u.postRun=="function"&&(u.postRun=[u.postRun]);u.postRun.length;)a1(u.postRun.shift());Hi(Ui)}}function ih(I){rr.unshift(I)}function a1(I){Ui.unshift(I)}var ea=0,_a=null,ls=null;function s1(I){me(!x,"addRunDependency cannot be used in a pthread worker"),ea++,u.monitorRunDependencies&&u.monitorRunDependencies(ea)}function i1(I){if(ea--,u.monitorRunDependencies&&u.monitorRunDependencies(ea),ea==0&&(_a!==null&&(clearInterval(_a),_a=null),ls)){var S=ls;ls=null,S()}}u.preloadedImages={},u.preloadedAudios={};function ta(I){u.onAbort&&u.onAbort(I),x&&console.error("Pthread aborting at "+new Error().stack),I+="",G(I),ue=!0,ye=1,I="abort("+I+"). Build with -s ASSERTIONS=1 for more info.";var S=new WebAssembly.RuntimeError(I);throw d(S),S}function oh(I,S){return String.prototype.startsWith?I.startsWith(S):I.indexOf(S)===0}var ji="data:application/octet-stream;base64,";function lh(I){return oh(I,ji)}var o1="file://";function uh(I){return oh(I,o1)}var wn="tfjs-backend-wasm-threaded-simd.wasm";lh(wn)||(wn=T(wn));function l1(I){try{if(I==wn&&te)return new Uint8Array(te);if(O)return O(I);throw"both async and sync fetching of the wasm failed"}catch(S){ta(S)}}function ch(){if(!te&&(g||w)){if(typeof fetch=="function"&&!uh(wn))return fetch(wn,{credentials:"same-origin"}).then(function(I){if(!I.ok)throw"failed to load wasm binary file at '"+wn+"'";return I.arrayBuffer()}).catch(function(){return l1(wn)});if(M)return new Promise(function(I,S){M(wn,function(L){I(new Uint8Array(L))},S)})}return Promise.resolve().then(function(){return l1(wn)})}function u1(){var I={a:Q1};function S(de,ve){var at=de.exports;if(u.asm=at,nr=u.asm.F,pe=ve,!x){var Ht=Se.unusedWorkers.length;Se.unusedWorkers.forEach(function(Ot){Se.loadWasmModuleToWorker(Ot,function(){--Ht||i1("wasm-instantiate")})})}}x||s1("wasm-instantiate");function L(de){S(de.instance,de.module)}function q(de){return ch().then(function(ve){return WebAssembly.instantiate(ve,I)}).then(de,function(ve){G("failed to asynchronously prepare wasm: "+ve),ta(ve)})}function fe(){return!te&&typeof WebAssembly.instantiateStreaming=="function"&&!lh(wn)&&!uh(wn)&&typeof fetch=="function"?fetch(wn,{credentials:"same-origin"}).then(function(de){var ve=WebAssembly.instantiateStreaming(de,I);return ve.then(L,function(at){return G("wasm streaming compile failed: "+at),G("falling back to ArrayBuffer instantiation"),q(L)})}):q(L)}if(u.instantiateWasm)try{var ce=u.instantiateWasm(I,S);return ce}catch(de){return G("Module.instantiateWasm callback failed with error: "+de),!1}return fe().catch(d),{}}var hh={8991:function(I,S){setTimeout(function(){G2(I,S)},0)}};function c1(){Se.initRuntime()}function Hi(I){for(;I.length>0;){var S=I.shift();if(typeof S=="function"){S(u);continue}var L=S.func;typeof L=="number"?S.arg===void 0?nr.get(L)():nr.get(L)(S.arg):L(S.arg===void 0?null:S.arg)}}function Gi(I,S){if(I<=0||I>s().length||I&!0||S<0)return-28;if(S==0)return 0;S>=2147483647&&(S=Infinity);var L=Atomics.load(o(),Ji>>2),q=0;if(L==I){var fe=Atomics.compareExchange(o(),Ji>>2,L,0);if(fe==L&&(--S,q=1,S<=0))return 1}var ce=Atomics.notify(o(),I>>2,S);if(ce>=0)return ce+q;throw"Atomics.notify returned an unexpected value "+ce}u._emscripten_futex_wake=Gi;function h1(I){if(x)throw"Internal Error! killThread() can only ever be called from main application thread!";if(!I)throw"Internal Error! Null pthread_ptr in killThread!";o()[I+12>>2]=0;var S=Se.pthreads[I];S.worker.terminate(),Se.freeThreadData(S),Se.runningWorkers.splice(Se.runningWorkers.indexOf(S.worker),1),S.worker.pthread=void 0}function d1(I){if(x)throw"Internal Error! cancelThread() can only ever be called from main application thread!";if(!I)throw"Internal Error! Null pthread_ptr in cancelThread!";var S=Se.pthreads[I];S.worker.postMessage({cmd:"cancel"})}function p1(I){if(x)throw"Internal Error! cleanupThread() can only ever be called from main application thread!";if(!I)throw"Internal Error! Null pthread_ptr in cleanupThread!";o()[I+12>>2]=0;var S=Se.pthreads[I];if(S){var L=S.worker;Se.returnWorkerToPool(L)}}var Se={unusedWorkers:[],runningWorkers:[],initMainThreadBlock:function(){for(var I=8,S=0;S>2]=I;var L=I+152;o()[L>>2]=L;for(var q=cs(512),S=0;S<128;++S)l()[q/4+S]=0;Atomics.store(l(),I+100>>2,q),Atomics.store(l(),I+40>>2,I),kh(I,!w,1),H2(I)},initWorker:function(){},pthreads:{},threadExitHandlers:[],setThreadStatus:function(){},runExitHandlers:function(){for(;Se.threadExitHandlers.length>0;)Se.threadExitHandlers.pop()();x&&Ki()&&j2()},threadExit:function(I){var S=Ki();S&&(Atomics.store(l(),S+4>>2,I),Atomics.store(l(),S+0>>2,1),Atomics.store(l(),S+56>>2,1),Atomics.store(l(),S+60>>2,0),Se.runExitHandlers(),Gi(S+0,2147483647),kh(0,0,0),x&&postMessage({cmd:"exit"}))},threadCancel:function(){Se.runExitHandlers();var I=Ki();Atomics.store(l(),I+4>>2,-1),Atomics.store(l(),I+0>>2,1),Gi(I+0,2147483647),kh(0,0,0),postMessage({cmd:"cancelDone"})},terminateAllThreads:function(){for(var I in Se.pthreads){var S=Se.pthreads[I];S&&S.worker&&Se.returnWorkerToPool(S.worker)}Se.pthreads={};for(var L=0;L>2];o()[I.threadInfoStruct+100>>2]=0,hu(S),hu(I.threadInfoStruct)}I.threadInfoStruct=0,I.allocatedOwnStack&&I.stackBase&&hu(I.stackBase),I.stackBase=0,I.worker&&(I.worker.pthread=null)}},returnWorkerToPool:function(I){Se.runWithoutMainThreadQueuedCalls(function(){delete Se.pthreads[I.pthread.threadInfoStruct],Se.unusedWorkers.push(I),Se.runningWorkers.splice(Se.runningWorkers.indexOf(I),1),Se.freeThreadData(I.pthread),I.pthread=void 0})},runWithoutMainThreadQueuedCalls:function(I){o()[Y2>>2]=0;try{I()}finally{o()[Y2>>2]=1}},receiveObjectTransfer:function(I){},loadWasmModuleToWorker:function(I,S){I.onmessage=function(L){var q=L.data,fe=q.cmd;if(I.pthread&&(Se.currentProxiedOperationCallerThread=I.pthread.threadInfoStruct),q.targetThread&&q.targetThread!=Ki()){var ce=Se.pthreads[q.targetThread];ce?ce.worker.postMessage(L.data,q.transferList):console.error('Internal error! Worker sent a message "'+fe+'" to target pthread '+q.targetThread+", but that thread no longer exists!"),Se.currentProxiedOperationCallerThread=void 0;return}if(fe==="processQueuedMainThreadWork")mf();else if(fe==="spawnThread")yh(L.data);else if(fe==="cleanupThread")p1(q.thread);else if(fe==="killThread")h1(q.thread);else if(fe==="cancelThread")d1(q.thread);else if(fe==="loaded")I.loaded=!0,S&&S(I),I.runPthread&&(I.runPthread(),delete I.runPthread);else if(fe==="print")X("Thread "+q.threadId+": "+q.text);else if(fe==="printErr")G("Thread "+q.threadId+": "+q.text);else if(fe==="alert")alert("Thread "+q.threadId+": "+q.text);else if(fe==="exit"){var de=I.pthread&&Atomics.load(l(),I.pthread.threadInfoStruct+64>>2);de&&Se.returnWorkerToPool(I)}else if(fe==="exitProcess")try{M8(q.returnCode)}catch(ve){if(ve instanceof pu)return;throw ve}else fe==="cancelDone"?Se.returnWorkerToPool(I):fe==="objectTransfer"?Se.receiveObjectTransfer(L.data):L.data.target==="setimmediate"?I.postMessage(L.data):G("worker sent an unknown command "+fe);Se.currentProxiedOperationCallerThread=void 0},I.onerror=function(L){G("pthread sent an error! "+L.filename+":"+L.lineno+": "+L.message)},b&&(I.on("message",function(L){I.onmessage({data:L})}),I.on("error",function(L){I.onerror(L)}),I.on("exit",function(L){})),I.postMessage({cmd:"load",urlOrBlob:u.mainScriptUrlOrBlob||r,wasmMemory:Q,wasmModule:pe})},allocateUnusedWorker:function(){var I=T("tfjs-backend-wasm-threaded-simd.worker.js");Se.unusedWorkers.push(new Worker(I))},getNewWorker:function(){return Se.unusedWorkers.length==0&&(Se.allocateUnusedWorker(),Se.loadWasmModuleToWorker(Se.unusedWorkers[0])),Se.unusedWorkers.length>0?Se.unusedWorkers.pop():null},busySpinWait:function(I){for(var S=performance.now()+I;performance.now()>2]=I,I}function w1(I,S){if(x)return va(1,1,I,S)}function b1(I,S){if(I==S)postMessage({cmd:"processQueuedMainThreadWork"});else if(x)postMessage({targetThread:I,cmd:"processThreadQueue"});else{var L=Se.pthreads[I],q=L&&L.worker;if(!q)return;q.postMessage({cmd:"processThreadQueue"})}return 1}function _1(){ta()}function v1(I,S,L){var q=T1(S,L);return hh[I].apply(null,q)}function k1(I,S){}function I1(I,S,L){if(I<=0||I>s().length||I&!0)return-28;if(g){if(Atomics.load(o(),I>>2)!=S)return-6;for(var q=performance.now(),fe=q+L,ce=Atomics.exchange(o(),Ji>>2,I);;){if(q=performance.now(),q>fe)return ce=Atomics.exchange(o(),Ji>>2,0),-73;if(ce=Atomics.exchange(o(),Ji>>2,0),ce==0)break;if(mf(),Atomics.load(o(),I>>2)!=S)return-6;ce=Atomics.exchange(o(),Ji>>2,I)}return 0}else{var de=Atomics.wait(o(),I>>2,S,L);if(de==="timed-out")return-73;if(de==="not-equal")return-6;if(de==="ok")return 0;throw"Atomics.wait returned an unexpected value "+de}}function N1(I,S,L){i().copyWithin(I,S,S+L)}function S1(){return b?require("os").cpus().length:navigator.hardwareConcurrency}function va(I,S){for(var L=arguments.length-2,q=du(),fe=L,ce=Yi(fe*8),de=ce>>3,ve=0;ve>=2;L=i()[I++];){var q=L<105;q&&S&1&&S++,iu.push(q?c()[S++>>1]:o()[S]),++S}return iu}function E1(I,S,L){su.length=S;for(var q=L>>3,fe=0;fe>>16),Qt(Q.buffer),1}catch(S){}}function F1(I){var S=C1();if(I<=S)return!1;var L=2147483648;if(I>L)return!1;for(var q=1;q<=4;q*=2){var fe=S*(1+.2/q);fe=Math.min(fe,I+100663296);var ce=Math.min(L,pt(Math.max(I,fe),65536)),de=R1(ce);if(de)return!0}return!1}var Be={inEventHandler:0,removeAllEventListeners:function(){for(var I=Be.eventHandlers.length-1;I>=0;--I)Be._removeHandler(I);Be.eventHandlers=[],Be.deferredCalls=[]},registerRemoveEventListeners:function(){Be.removeEventListenersRegistered||(ba.push(Be.removeAllEventListeners),Be.removeEventListenersRegistered=!0)},deferredCalls:[],deferCall:function(I,S,L){function q(de,ve){if(de.length!=ve.length)return!1;for(var at in de)if(de[at]!=ve[at])return!1;return!0}for(var fe in Be.deferredCalls){var ce=Be.deferredCalls[fe];if(ce.targetFunction==I&&q(ce.argsList,L))return}Be.deferredCalls.push({targetFunction:I,precedence:S,argsList:L}),Be.deferredCalls.sort(function(de,ve){return de.precedence>2]=L,o()[de+4>>2]=q,o()[de+8>>2]=fe,Af(0,I,637534208,S,q,de),Zi(ce)},getTargetThreadForEventCallback:function(I){switch(I){case 1:return 0;case 2:return Se.currentProxiedOperationCallerThread;default:return I}},getNodeNameForTarget:function(I){return I?I==window?"#window":I==screen?"#screen":I&&I.nodeName?I.nodeName:"":""},fullscreenEnabled:function(){return document.fullscreenEnabled||document.webkitFullscreenEnabled}};function M1(I){var S=lt(I)+1,L=cs(S);return rt(I,L,S),L}function $1(I,S,L,q){var fe=du(),ce=Yi(12),de=0;S&&(de=M1(S)),o()[ce>>2]=de,o()[ce+4>>2]=L,o()[ce+8>>2]=q,Af(0,I,657457152,0,de,ce),Zi(fe)}function D1(I,S,L,q){S=S?Oe(S):"",$1(I,S,L,q)}function O1(I){return I>2?Oe(I):I}var z1=[0,typeof document!="undefined"?document:0,typeof window!="undefined"?window:0];function P1(I){I=O1(I);var S=z1[I]||(typeof document!="undefined"?document.querySelector(I):void 0);return S}function ou(I){return P1(I)}function dh(I,S,L){var q=ou(I);if(!q)return-4;if(q.canvasSharedPtr&&(o()[q.canvasSharedPtr>>2]=S,o()[q.canvasSharedPtr+4>>2]=L),q.offscreenCanvas||!q.controlTransferredOffscreen){q.offscreenCanvas&&(q=q.offscreenCanvas);var fe=!1;if(q.GLctxObject&&q.GLctxObject.GLctx){var ce=q.GLctxObject.GLctx.getParameter(2978);fe=ce[0]===0&&ce[1]===0&&ce[2]===q.width&&ce[3]===q.height}q.width=S,q.height=L,fe&&q.GLctxObject.GLctx.viewport(0,0,S,L)}else if(q.canvasSharedPtr){var de=o()[q.canvasSharedPtr+8>>2];return D1(de,I,S,L),1}else return-4;return 0}function ph(I,S,L){return x?va(2,1,I,S,L):dh(I,S,L)}function L1(I,S,L){var q=ou(I);return q?dh(I,S,L):ph(I,S,L)}function W1(I){}function B1(I,S){}function V1(I){var S=I.getExtension("ANGLE_instanced_arrays");if(S)return I.vertexAttribDivisor=function(L,q){S.vertexAttribDivisorANGLE(L,q)},I.drawArraysInstanced=function(L,q,fe,ce){S.drawArraysInstancedANGLE(L,q,fe,ce)},I.drawElementsInstanced=function(L,q,fe,ce,de){S.drawElementsInstancedANGLE(L,q,fe,ce,de)},1}function U1(I){var S=I.getExtension("OES_vertex_array_object");if(S)return I.createVertexArray=function(){return S.createVertexArrayOES()},I.deleteVertexArray=function(L){S.deleteVertexArrayOES(L)},I.bindVertexArray=function(L){S.bindVertexArrayOES(L)},I.isVertexArray=function(L){return S.isVertexArrayOES(L)},1}function j1(I){var S=I.getExtension("WEBGL_draw_buffers");if(S)return I.drawBuffers=function(L,q){S.drawBuffersWEBGL(L,q)},1}function H1(I){return!!(I.multiDrawWebgl=I.getExtension("WEBGL_multi_draw"))}var tt={counter:1,buffers:[],programs:[],framebuffers:[],renderbuffers:[],textures:[],uniforms:[],shaders:[],vaos:[],contexts:{},offscreenCanvases:{},timerQueriesEXT:[],programInfos:{},stringCache:{},unpackAlignment:4,recordError:function(I){tt.lastError||(tt.lastError=I)},getNewId:function(I){for(var S=tt.counter++,L=I.length;L>2]:-1;fe+=Oe(o()[L+ce*4>>2],de<0?void 0:de)}return fe},createContext:function(I,S){var L=I.getContext("webgl",S);if(!L)return 0;var q=tt.registerContext(L,S);return q},registerContext:function(I,S){var L=cs(8);o()[L+4>>2]=Ki();var q={handle:L,attributes:S,version:S.majorVersion,GLctx:I};return I.canvas&&(I.canvas.GLctxObject=q),tt.contexts[L]=q,(typeof S.enableExtensionsByDefault=="undefined"||S.enableExtensionsByDefault)&&tt.initExtensions(q),L},makeContextCurrent:function(I){return tt.currentContext=tt.contexts[I],u.ctx=ka=tt.currentContext&&tt.currentContext.GLctx,!(I&&!ka)},getContext:function(I){return tt.contexts[I]},deleteContext:function(I){tt.currentContext===tt.contexts[I]&&(tt.currentContext=null),typeof Be=="object"&&Be.removeAllHandlersOnTarget(tt.contexts[I].GLctx.canvas),tt.contexts[I]&&tt.contexts[I].GLctx.canvas&&(tt.contexts[I].GLctx.canvas.GLctxObject=void 0),hu(tt.contexts[I].handle),tt.contexts[I]=null},initExtensions:function(I){if(I||(I=tt.currentContext),!I.initExtensionsDone){I.initExtensionsDone=!0;var S=I.GLctx;V1(S),U1(S),j1(S),S.disjointTimerQueryExt=S.getExtension("EXT_disjoint_timer_query"),H1(S);var L=S.getSupportedExtensions()||[];L.forEach(function(q){q.indexOf("lose_context")<0&&q.indexOf("debug")<0&&S.getExtension(q)})}},populateUniformTable:function(I){for(var S=tt.programs[I],L=tt.programInfos[I]={uniforms:{},maxUniformLength:0,maxAttributeLength:-1,maxUniformBlockNameLength:-1},q=L.uniforms,fe=ka.getProgramParameter(S,35718),ce=0;ce>2,q=o()[L+(24>>2)],fe={alpha:!!o()[L+(0>>2)],depth:!!o()[L+(4>>2)],stencil:!!o()[L+(8>>2)],antialias:!!o()[L+(12>>2)],premultipliedAlpha:!!o()[L+(16>>2)],preserveDrawingBuffer:!!o()[L+(20>>2)],powerPreference:G1[q],failIfMajorPerformanceCaveat:!!o()[L+(28>>2)],majorVersion:o()[L+(32>>2)],minorVersion:o()[L+(36>>2)],enableExtensionsByDefault:o()[L+(40>>2)],explicitSwapControl:o()[L+(44>>2)],proxyContextToMainThread:o()[L+(48>>2)],renderViaOffscreenBackBuffer:o()[L+(52>>2)]},ce=ou(I);if(!ce||fe.explicitSwapControl)return 0;var de=tt.createContext(ce,fe);return de}function X1(I,S){return q1(I,S)}var qi={mappings:{},buffers:[null,[],[]],printChar:function(I,S){var L=qi.buffers[I];S===0||S===10?((I===1?X:G)(Pe(L,0)),L.length=0):L.push(S)},varargs:void 0,get:function(){qi.varargs+=4;var I=o()[qi.varargs-4>>2];return I},getStr:function(I){var S=Oe(I);return S},get64:function(I,S){return I}};function fh(I){return x?va(3,1,I):0}function mh(I,S,L,q,fe){if(x)return va(4,1,I,S,L,q,fe)}function Ah(I,S,L,q){if(x)return va(5,1,I,S,L,q);for(var fe=0,ce=0;ce>2],ve=o()[S+(ce*8+4)>>2],at=0;at>2]=fe,0}function K1(I){var S=Se.threadExitHandlers.pop();I&&S()}function Z1(I,S){Se.threadExitHandlers.push(function(){nr.get(I)(S)})}function yh(I){if(x)throw"Internal Error! spawnThread() can only ever be called from main application thread!";var S=Se.getNewWorker();if(S.pthread!==void 0)throw"Internal error!";if(!I.pthread_ptr)throw"Internal error, no pthread ptr!";Se.runningWorkers.push(S);for(var L=cs(128*4),q=0;q<128;++q)o()[L+q*4>>2]=0;var fe=I.stackBase+I.stackSize,ce=Se.pthreads[I.pthread_ptr]={worker:S,stackBase:I.stackBase,stackSize:I.stackSize,allocatedOwnStack:I.allocatedOwnStack,threadInfoStruct:I.pthread_ptr},de=ce.threadInfoStruct>>2;Atomics.store(l(),de+(64>>2),I.detached),Atomics.store(l(),de+(100>>2),L),Atomics.store(l(),de+(40>>2),ce.threadInfoStruct),Atomics.store(l(),de+(80>>2),I.stackSize),Atomics.store(l(),de+(76>>2),fe),Atomics.store(l(),de+(104>>2),I.stackSize),Atomics.store(l(),de+(104+8>>2),fe),Atomics.store(l(),de+(104+12>>2),I.detached);var ve=U2(),at=ve+40;Atomics.store(l(),de+(172>>2),at),S.pthread=ce;var Ht={cmd:"run",start_routine:I.startRoutine,arg:I.arg,threadInfoStruct:I.pthread_ptr,stackBase:I.stackBase,stackSize:I.stackSize};S.runPthread=function(){Ht.time=performance.now(),S.postMessage(Ht,I.transferList)},S.loaded&&(S.runPthread(),delete S.runPthread)}function Y1(I,S,L,q){if(typeof SharedArrayBuffer=="undefined")return G("Current environment does not support SharedArrayBuffer, pthreads are not available!"),6;if(!I)return G("pthread_create called with a null thread pointer!"),28;var fe=[],ce=0;if(x&&(fe.length===0||ce))return q2(687865856,I,S,L,q);if(ce)return ce;var de=0,ve=0,at=0;S&&S!=-1?(de=o()[S>>2],de+=81920,ve=o()[S+8>>2],at=o()[S+12>>2]!==0):de=2097152;var Ht=ve==0;Ht?ve=Z2(16,de):(ve-=de,me(ve>0));for(var Ot=cs(228),Na=0;Na<228>>2;++Na)l()[(Ot>>2)+Na]=0;o()[I>>2]=Ot,o()[Ot+12>>2]=Ot;var Qi=Ot+152;o()[Qi>>2]=Qi;var bn={stackBase:ve,stackSize:de,allocatedOwnStack:Ht,detached:at,startRoutine:L,pthread_ptr:Ot,arg:q,transferList:fe};return x?(bn.cmd="spawnThread",postMessage(bn,fe)):yh(bn),0}function gh(I){if(x)return va(6,1,I);switch(I){case 30:return 16384;case 85:var S=2147483648;return S/16384;case 132:case 133:case 12:case 137:case 138:case 15:case 235:case 16:case 17:case 18:case 19:case 20:case 149:case 13:case 10:case 236:case 153:case 9:case 21:case 22:case 159:case 154:case 14:case 77:case 78:case 139:case 82:case 68:case 67:case 164:case 11:case 29:case 47:case 48:case 95:case 52:case 51:case 46:return 200809;case 27:case 246:case 127:case 128:case 23:case 24:case 160:case 161:case 181:case 182:case 242:case 183:case 184:case 243:case 244:case 245:case 165:case 178:case 179:case 49:case 50:case 168:case 169:case 175:case 170:case 171:case 172:case 97:case 76:case 32:case 173:case 35:case 80:case 81:case 79:return-1;case 176:case 177:case 7:case 155:case 8:case 157:case 125:case 126:case 92:case 93:case 129:case 130:case 131:case 94:case 91:return 1;case 74:case 60:case 69:case 70:case 4:return 1024;case 31:case 42:case 72:return 32;case 87:case 26:case 33:return 2147483647;case 34:case 1:return 47839;case 38:case 36:return 99;case 43:case 37:return 2048;case 0:return 2097152;case 3:return 65536;case 28:return 32768;case 44:return 32767;case 75:return 16384;case 39:return 1e3;case 89:return 700;case 71:return 256;case 40:return 255;case 2:return 100;case 180:return 64;case 25:return 20;case 5:return 16;case 6:return 6;case 73:return 4;case 84:return typeof navigator=="object"&&navigator.hardwareConcurrency||1}return x1(28),-1}x||Se.initMainThreadBlock();var ka,J1=[null,w1,ph,fh,mh,Ah,gh],Q1={e:y1,r:g1,x:b1,b:_1,y:v1,j:k1,c:I1,d:Gi,f:us,p:N1,z:S1,u:E1,q:F1,v:L1,i:W1,t:B1,w:X1,m:fh,n:mh,g:Ah,o:c1,a:Q||u.wasmMemory,k:K1,l:Z1,h:Y1,s:gh},B2=u1(),xh=u.___wasm_call_ctors=function(){return(xh=u.___wasm_call_ctors=u.asm.A).apply(null,arguments)},ef=u._init=function(){return(ef=u._init=u.asm.B).apply(null,arguments)},tf=u._register_tensor=function(){return(tf=u._register_tensor=u.asm.C).apply(null,arguments)},nf=u._dispose_data=function(){return(nf=u._dispose_data=u.asm.D).apply(null,arguments)},rf=u._dispose=function(){return(rf=u._dispose=u.asm.E).apply(null,arguments)},af=u._Abs=function(){return(af=u._Abs=u.asm.G).apply(null,arguments)},sf=u._Add=function(){return(sf=u._Add=u.asm.H).apply(null,arguments)},of=u._AddN=function(){return(of=u._AddN=u.asm.I).apply(null,arguments)},lf=u._ArgMax=function(){return(lf=u._ArgMax=u.asm.J).apply(null,arguments)},uf=u._AvgPool=function(){return(uf=u._AvgPool=u.asm.K).apply(null,arguments)},cf=u._BatchMatMul=function(){return(cf=u._BatchMatMul=u.asm.L).apply(null,arguments)},hf=u._Ceil=function(){return(hf=u._Ceil=u.asm.M).apply(null,arguments)},df=u._ClipByValue=function(){return(df=u._ClipByValue=u.asm.N).apply(null,arguments)},pf=u._Conv2D=function(){return(pf=u._Conv2D=u.asm.O).apply(null,arguments)},wh=u._Conv2DBackpropInput=function(){return(wh=u._Conv2DBackpropInput=u.asm.P).apply(null,arguments)},bh=u._Cos=function(){return(bh=u._Cos=u.asm.Q).apply(null,arguments)},lu=u._CropAndResize=function(){return(lu=u._CropAndResize=u.asm.R).apply(null,arguments)},Xi=u._Cumsum=function(){return(Xi=u._Cumsum=u.asm.S).apply(null,arguments)},ff=u._DepthToSpace=function(){return(ff=u._DepthToSpace=u.asm.T).apply(null,arguments)},uu=u._DepthwiseConv2dNative=function(){return(uu=u._DepthwiseConv2dNative=u.asm.U).apply(null,arguments)},K=u._Equal=function(){return(K=u._Equal=u.asm.V).apply(null,arguments)},ne=u._Exp=function(){return(ne=u._Exp=u.asm.W).apply(null,arguments)},Re=u._FlipLeftRight=function(){return(Re=u._FlipLeftRight=u.asm.X).apply(null,arguments)},Qe=u._Floor=function(){return(Qe=u._Floor=u.asm.Y).apply(null,arguments)},Et=u._FloorDiv=function(){return(Et=u._FloorDiv=u.asm.Z).apply(null,arguments)},At=u._FusedBatchNorm=function(){return(At=u._FusedBatchNorm=u.asm._).apply(null,arguments)},He=u._FusedConv2D=function(){return(He=u._FusedConv2D=u.asm.$).apply(null,arguments)},Xe=u._FusedDepthwiseConv2D=function(){return(Xe=u._FusedDepthwiseConv2D=u.asm.aa).apply(null,arguments)},en=u._Gather=function(){return(en=u._Gather=u.asm.ba).apply(null,arguments)},na=u._GatherNd=function(){return(na=u._GatherNd=u.asm.ca).apply(null,arguments)},ra=u._Greater=function(){return(ra=u._Greater=u.asm.da).apply(null,arguments)},_h=u._GreaterEqual=function(){return(_h=u._GreaterEqual=u.asm.ea).apply(null,arguments)},cu=u._LeakyRelu=function(){return(cu=u._LeakyRelu=u.asm.fa).apply(null,arguments)},Xn=u._Less=function(){return(Xn=u._Less=u.asm.ga).apply(null,arguments)},Ia=u._LessEqual=function(){return(Ia=u._LessEqual=u.asm.ha).apply(null,arguments)},vh=u._Log=function(){return(vh=u._Log=u.asm.ia).apply(null,arguments)},V4=u._LogicalAnd=function(){return(V4=u._LogicalAnd=u.asm.ja).apply(null,arguments)},U4=u._Max=function(){return(U4=u._Max=u.asm.ka).apply(null,arguments)},j4=u._MaxPool=function(){return(j4=u._MaxPool=u.asm.la).apply(null,arguments)},H4=u._Maximum=function(){return(H4=u._Maximum=u.asm.ma).apply(null,arguments)},G4=u._Mean=function(){return(G4=u._Mean=u.asm.na).apply(null,arguments)},q4=u._Min=function(){return(q4=u._Min=u.asm.oa).apply(null,arguments)},X4=u._Minimum=function(){return(X4=u._Minimum=u.asm.pa).apply(null,arguments)},K4=u._Multiply=function(){return(K4=u._Multiply=u.asm.qa).apply(null,arguments)},Z4=u._Neg=function(){return(Z4=u._Neg=u.asm.ra).apply(null,arguments)},Y4=u._NonMaxSuppressionV3=function(){return(Y4=u._NonMaxSuppressionV3=u.asm.sa).apply(null,arguments)},J4=u._NonMaxSuppressionV4=function(){return(J4=u._NonMaxSuppressionV4=u.asm.ta).apply(null,arguments)},Q4=u._NonMaxSuppressionV5=function(){return(Q4=u._NonMaxSuppressionV5=u.asm.ua).apply(null,arguments)},e8=u._NotEqual=function(){return(e8=u._NotEqual=u.asm.va).apply(null,arguments)},t8=u._OneHot=function(){return(t8=u._OneHot=u.asm.wa).apply(null,arguments)},n8=u._PadV2=function(){return(n8=u._PadV2=u.asm.xa).apply(null,arguments)},r8=u._Pow=function(){return(r8=u._Pow=u.asm.ya).apply(null,arguments)},a8=u._Prelu=function(){return(a8=u._Prelu=u.asm.za).apply(null,arguments)},s8=u._Prod=function(){return(s8=u._Prod=u.asm.Aa).apply(null,arguments)},i8=u._RealDiv=function(){return(i8=u._RealDiv=u.asm.Ba).apply(null,arguments)},o8=u._Relu=function(){return(o8=u._Relu=u.asm.Ca).apply(null,arguments)},l8=u._Relu6=function(){return(l8=u._Relu6=u.asm.Da).apply(null,arguments)},u8=u._ResizeBilinear=function(){return(u8=u._ResizeBilinear=u.asm.Ea).apply(null,arguments)},c8=u._Reverse=function(){return(c8=u._Reverse=u.asm.Fa).apply(null,arguments)},h8=u._RotateWithOffset=function(){return(h8=u._RotateWithOffset=u.asm.Ga).apply(null,arguments)},d8=u._Round=function(){return(d8=u._Round=u.asm.Ha).apply(null,arguments)},p8=u._Rsqrt=function(){return(p8=u._Rsqrt=u.asm.Ia).apply(null,arguments)},f8=u._ScatterNd=function(){return(f8=u._ScatterNd=u.asm.Ja).apply(null,arguments)},m8=u._SelectV2=function(){return(m8=u._SelectV2=u.asm.Ka).apply(null,arguments)},A8=u._Sigmoid=function(){return(A8=u._Sigmoid=u.asm.La).apply(null,arguments)},y8=u._Sin=function(){return(y8=u._Sin=u.asm.Ma).apply(null,arguments)},g8=u._Softmax=function(){return(g8=u._Softmax=u.asm.Na).apply(null,arguments)},x8=u._Sqrt=function(){return(x8=u._Sqrt=u.asm.Oa).apply(null,arguments)},w8=u._Square=function(){return(w8=u._Square=u.asm.Pa).apply(null,arguments)},b8=u._SquaredDifference=function(){return(b8=u._SquaredDifference=u.asm.Qa).apply(null,arguments)},_8=u._Step=function(){return(_8=u._Step=u.asm.Ra).apply(null,arguments)},v8=u._StridedSlice=function(){return(v8=u._StridedSlice=u.asm.Sa).apply(null,arguments)},k8=u._Sub=function(){return(k8=u._Sub=u.asm.Ta).apply(null,arguments)},I8=u._Sum=function(){return(I8=u._Sum=u.asm.Ua).apply(null,arguments)},N8=u._Tanh=function(){return(N8=u._Tanh=u.asm.Va).apply(null,arguments)},S8=u._Tile=function(){return(S8=u._Tile=u.asm.Wa).apply(null,arguments)},T8=u._TopK=function(){return(T8=u._TopK=u.asm.Xa).apply(null,arguments)},E8=u._Transpose=function(){return(E8=u._Transpose=u.asm.Ya).apply(null,arguments)},C8=u.__FusedMatMul=function(){return(C8=u.__FusedMatMul=u.asm.Za).apply(null,arguments)},cs=u._malloc=function(){return(cs=u._malloc=u.asm._a).apply(null,arguments)},hu=u._free=function(){return(hu=u._free=u.asm.$a).apply(null,arguments)},V2=u.___errno_location=function(){return(V2=u.___errno_location=u.asm.ab).apply(null,arguments)},U2=u._emscripten_get_global_libc=function(){return(U2=u._emscripten_get_global_libc=u.asm.bb).apply(null,arguments)},Ki=u._pthread_self=function(){return(Ki=u._pthread_self=u.asm.cb).apply(null,arguments)},j2=u.___pthread_tsd_run_dtors=function(){return(j2=u.___pthread_tsd_run_dtors=u.asm.db).apply(null,arguments)},mf=u._emscripten_main_thread_process_queued_calls=function(){return(mf=u._emscripten_main_thread_process_queued_calls=u.asm.eb).apply(null,arguments)},R8=u._emscripten_current_thread_process_queued_calls=function(){return(R8=u._emscripten_current_thread_process_queued_calls=u.asm.fb).apply(null,arguments)},H2=u._emscripten_register_main_browser_thread_id=function(){return(H2=u._emscripten_register_main_browser_thread_id=u.asm.gb).apply(null,arguments)},G2=u.__emscripten_do_dispatch_to_thread=function(){return(G2=u.__emscripten_do_dispatch_to_thread=u.asm.hb).apply(null,arguments)},q2=u._emscripten_sync_run_in_main_thread_4=function(){return(q2=u._emscripten_sync_run_in_main_thread_4=u.asm.ib).apply(null,arguments)},X2=u._emscripten_run_in_main_runtime_thread_js=function(){return(X2=u._emscripten_run_in_main_runtime_thread_js=u.asm.jb).apply(null,arguments)},Af=u.__emscripten_call_on_thread=function(){return(Af=u.__emscripten_call_on_thread=u.asm.kb).apply(null,arguments)},F8=u._emscripten_tls_init=function(){return(F8=u._emscripten_tls_init=u.asm.lb).apply(null,arguments)},kh=u.__emscripten_thread_init=function(){return(kh=u.__emscripten_thread_init=u.asm.mb).apply(null,arguments)},du=u.stackSave=function(){return(du=u.stackSave=u.asm.nb).apply(null,arguments)},Zi=u.stackRestore=function(){return(Zi=u.stackRestore=u.asm.ob).apply(null,arguments)},Yi=u.stackAlloc=function(){return(Yi=u.stackAlloc=u.asm.pb).apply(null,arguments)},K2=u._emscripten_stack_set_limits=function(){return(K2=u._emscripten_stack_set_limits=u.asm.qb).apply(null,arguments)},Z2=u._memalign=function(){return(Z2=u._memalign=u.asm.rb).apply(null,arguments)},Y2=u.__emscripten_allow_main_runtime_queued_calls=9880,Ji=u.__emscripten_main_thread_futex=11368;u.cwrap=De,u.PThread=Se,u.PThread=Se,u.wasmMemory=Q,u.ExitStatus=pu;var Ih;function pu(I){this.name="ExitStatus",this.message="Program terminated with exit("+I+")",this.status=I}ls=function I(){Ih||yf(),Ih||(ls=I)};function yf(I){if(I=I||m,ea>0)return;if(x){h(u),postMessage({cmd:"loaded"});return}if(n1(),ea>0)return;function S(){Ih||(Ih=!0,u.calledRun=!0,!ue&&(ah(),r1(),h(u),u.onRuntimeInitialized&&u.onRuntimeInitialized(),xn()))}u.setStatus?(u.setStatus("Running..."),setTimeout(function(){setTimeout(function(){u.setStatus("")},1),S()},1)):S()}u.run=yf;function M8(I,S){if(!(S&&le&&I===0)){if(!S&&x)throw postMessage({cmd:"exitProcess",returnCode:I}),new pu(I);le||(Se.terminateAllThreads(),ye=I,sh(),u.onExit&&u.onExit(I),ue=!0),y(I,new pu(I))}}if(u.preInit)for(typeof u.preInit=="function"&&(u.preInit=[u.preInit]);u.preInit.length>0;)u.preInit.pop()();return x&&(le=!1,Se.initWorker()),yf(),a.ready}}();typeof e=="object"&&typeof t=="object"?t.exports=n:typeof define=="function"&&define.amd?define([],function(){return n}):typeof e=="object"&&(e.WasmBackendModuleThreadedSimd=n)}),ak=kt((e,t)=>{var n=function(){var r=typeof document!="undefined"&&document.currentScript?document.currentScript.src:void 0;return typeof __filename!="undefined"&&(r=r||__filename),function(a){a=a||{};var s=typeof a!="undefined"?a:{},i,o;s.ready=new Promise(function(K,ne){i=K,o=ne});var l={},c;for(c in s)s.hasOwnProperty(c)&&(l[c]=s[c]);var u=[],h="./this.program",d=function(K,ne){throw ne},p=!1,f=!1,m=!1,A=!1;p=typeof window=="object",f=typeof importScripts=="function",m=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string",A=!p&&!m&&!f;var y="";function g(K){return s.locateFile?s.locateFile(K,y):y+K}var w,b,_,x,N,T;m?(f?y=fu().dirname(y)+"/":y=__dirname+"/",w=function(K,ne){return N||(N=require("fs")),T||(T=fu()),K=T.normalize(K),N.readFileSync(K,ne?null:"utf8")},_=function(K){var ne=w(K,!0);return ne.buffer||(ne=new Uint8Array(ne)),X(ne.buffer),ne},process.argv.length>1&&(h=process.argv[1].replace(/\\/g,"/")),u=process.argv.slice(2),process.on("uncaughtException",function(K){if(!(K instanceof ff))throw K}),process.on("unhandledRejection",gr),d=function(K){process.exit(K)},s.inspect=function(){return"[Emscripten Module object]"}):A?(typeof read!="undefined"&&(w=function(K){return read(K)}),_=function(K){var ne;return typeof readbuffer=="function"?new Uint8Array(readbuffer(K)):(ne=read(K,"binary"),X(typeof ne=="object"),ne)},typeof scriptArgs!="undefined"?u=scriptArgs:typeof arguments!="undefined"&&(u=arguments),typeof quit=="function"&&(d=function(K){quit(K)}),typeof print!="undefined"&&(typeof console=="undefined"&&(console={}),console.log=print,console.warn=console.error=typeof printErr!="undefined"?printErr:print)):(p||f)&&(f?y=self.location.href:typeof document!="undefined"&&document.currentScript&&(y=document.currentScript.src),r&&(y=r),y.indexOf("blob:")!==0?y=y.substr(0,y.lastIndexOf("/")+1):y="",w=function(K){var ne=new XMLHttpRequest;return ne.open("GET",K,!1),ne.send(null),ne.responseText},f&&(_=function(K){var ne=new XMLHttpRequest;return ne.open("GET",K,!1),ne.responseType="arraybuffer",ne.send(null),new Uint8Array(ne.response)}),b=function(K,ne,Re){var Qe=new XMLHttpRequest;Qe.open("GET",K,!0),Qe.responseType="arraybuffer",Qe.onload=function(){if(Qe.status==200||Qe.status==0&&Qe.response){ne(Qe.response);return}Re()},Qe.onerror=Re,Qe.send(null)},x=function(K){document.title=K});var E=s.print||console.log.bind(console),M=s.printErr||console.warn.bind(console);for(c in l)l.hasOwnProperty(c)&&(s[c]=l[c]);l=null,s.arguments&&(u=s.arguments),s.thisProgram&&(h=s.thisProgram),s.quit&&(d=s.quit);var O;s.wasmBinary&&(O=s.wasmBinary);var W=s.noExitRuntime||!0;typeof WebAssembly!="object"&&gr("no native wasm support detected");var V,U=!1,j;function X(K,ne){K||gr("Assertion failed: "+ne)}function G(K){var ne=s["_"+K];return X(ne,"Cannot call unknown function "+K+", make sure it is exported"),ne}function ee(K,ne,Re,Qe,Et){var At={string:function(Xn){var Ia=0;if(Xn!=null&&Xn!==0){var vh=(Xn.length<<2)+1;Ia=lu(vh),pe(Xn,Ia,vh)}return Ia},array:function(Xn){var Ia=lu(Xn.length);return ue(Xn,Ia),Ia}};function He(Xn){return ne==="string"?le(Xn):ne==="boolean"?Boolean(Xn):Xn}var Xe=G(K),en=[],na=0;if(Qe)for(var ra=0;ra=Qe);)++Et;if(Et-ne>16&&K.subarray&&se)return se.decode(K.subarray(ne,Et));for(var At="";ne>10,56320|na&1023)}}return At}function le(K,ne){return K?te(Ce,K,ne):""}function Q(K,ne,Re,Qe){if(!(Qe>0))return 0;for(var Et=Re,At=Re+Qe-1,He=0;He=55296&&Xe<=57343){var en=K.charCodeAt(++He);Xe=65536+((Xe&1023)<<10)|en&1023}if(Xe<=127){if(Re>=At)break;ne[Re++]=Xe}else if(Xe<=2047){if(Re+1>=At)break;ne[Re++]=192|Xe>>6,ne[Re++]=128|Xe&63}else if(Xe<=65535){if(Re+2>=At)break;ne[Re++]=224|Xe>>12,ne[Re++]=128|Xe>>6&63,ne[Re++]=128|Xe&63}else{if(Re+3>=At)break;ne[Re++]=240|Xe>>18,ne[Re++]=128|Xe>>12&63,ne[Re++]=128|Xe>>6&63,ne[Re++]=128|Xe&63}}return ne[Re]=0,Re-Et}function pe(K,ne,Re){return Q(K,Ce,ne,Re)}function ue(K,ne){Ne.set(K,ne)}function ye(K,ne){return K%ne>0&&(K+=ne-K%ne),K}var me,Ne,Ce,De,Pe,Oe,nt,rt,lt;function Je(K){me=K,s.HEAP8=Ne=new Int8Array(K),s.HEAP16=De=new Int16Array(K),s.HEAP32=Oe=new Int32Array(K),s.HEAPU8=Ce=new Uint8Array(K),s.HEAPU16=Pe=new Uint16Array(K),s.HEAPU32=nt=new Uint32Array(K),s.HEAPF32=rt=new Float32Array(K),s.HEAPF64=lt=new Float64Array(K)}var pt=s.INITIAL_MEMORY||16777216,Ue,yn=[],vt=[],Gn=[],Jt=[],gn=!1;vt.push({func:function(){ch()}});function qn(){if(s.preRun)for(typeof s.preRun=="function"&&(s.preRun=[s.preRun]);s.preRun.length;)Mr(s.preRun.shift());_a(yn)}function Mn(){gn=!0,_a(vt)}function un(){_a(Gn)}function Qt(){if(s.postRun)for(typeof s.postRun=="function"&&(s.postRun=[s.postRun]);s.postRun.length;)nr(s.postRun.shift());_a(Jt)}function Mr(K){yn.unshift(K)}function nr(K){Jt.unshift(K)}var rr=0,wa=null,Qr=null;function ba(K){rr++,s.monitorRunDependencies&&s.monitorRunDependencies(rr)}function Ui(K){if(rr--,s.monitorRunDependencies&&s.monitorRunDependencies(rr),rr==0&&(wa!==null&&(clearInterval(wa),wa=null),Qr)){var ne=Qr;Qr=null,ne()}}s.preloadedImages={},s.preloadedAudios={};function gr(K){s.onAbort&&s.onAbort(K),K+="",M(K),U=!0,j=1,K="abort("+K+"). Build with -s ASSERTIONS=1 for more info.";var ne=new WebAssembly.RuntimeError(K);throw o(ne),ne}function rh(K,ne){return String.prototype.startsWith?K.startsWith(ne):K.indexOf(ne)===0}var n1="data:application/octet-stream;base64,";function ah(K){return rh(K,n1)}var r1="file://";function sh(K){return rh(K,r1)}var xn="tfjs-backend-wasm.wasm";ah(xn)||(xn=g(xn));function ih(K){try{if(K==xn&&O)return new Uint8Array(O);if(_)return _(K);throw"both async and sync fetching of the wasm failed"}catch(ne){gr(ne)}}function a1(){if(!O&&(p||f)){if(typeof fetch=="function"&&!sh(xn))return fetch(xn,{credentials:"same-origin"}).then(function(K){if(!K.ok)throw"failed to load wasm binary file at '"+xn+"'";return K.arrayBuffer()}).catch(function(){return ih(xn)});if(b)return new Promise(function(K,ne){b(xn,function(Re){K(new Uint8Array(Re))},ne)})}return Promise.resolve().then(function(){return ih(xn)})}function ea(){var K={a:wn};function ne(He,Xe){var en=He.exports;s.asm=en,V=s.asm.g,Je(V.buffer),Ue=s.asm.m,Ui("wasm-instantiate")}ba("wasm-instantiate");function Re(He){ne(He.instance)}function Qe(He){return a1().then(function(Xe){return WebAssembly.instantiate(Xe,K)}).then(He,function(Xe){M("failed to asynchronously prepare wasm: "+Xe),gr(Xe)})}function Et(){return!O&&typeof WebAssembly.instantiateStreaming=="function"&&!ah(xn)&&!sh(xn)&&typeof fetch=="function"?fetch(xn,{credentials:"same-origin"}).then(function(He){var Xe=WebAssembly.instantiateStreaming(He,K);return Xe.then(Re,function(en){return M("wasm streaming compile failed: "+en),M("falling back to ArrayBuffer instantiation"),Qe(Re)})}):Qe(Re)}if(s.instantiateWasm)try{var At=s.instantiateWasm(K,ne);return At}catch(He){return M("Module.instantiateWasm callback failed with error: "+He),!1}return Et().catch(o),{}}function _a(K){for(;K.length>0;){var ne=K.shift();if(typeof ne=="function"){ne(s);continue}var Re=ne.func;typeof Re=="number"?ne.arg===void 0?Ue.get(Re)():Ue.get(Re)(ne.arg):Re(ne.arg===void 0?null:ne.arg)}}function ls(){gr()}function s1(K,ne,Re){Ce.copyWithin(K,ne,ne+Re)}function i1(){return Ce.length}function ta(K){try{return V.grow(K-me.byteLength+65535>>>16),Je(V.buffer),1}catch(ne){}}function oh(K){var ne=i1(),Re=2147483648;if(K>Re)return!1;for(var Qe=1;Qe<=4;Qe*=2){var Et=ne*(1+.2/Qe);Et=Math.min(Et,K+100663296);var At=Math.min(Re,ye(Math.max(K,Et),65536)),He=ta(At);if(He)return!0}return!1}var ji={mappings:{},buffers:[null,[],[]],printChar:function(K,ne){var Re=ji.buffers[K];ne===0||ne===10?((K===1?E:M)(te(Re,0)),Re.length=0):Re.push(ne)},varargs:void 0,get:function(){ji.varargs+=4;var K=Oe[ji.varargs-4>>2];return K},getStr:function(K){var ne=le(K);return ne},get64:function(K,ne){return K}};function lh(K){return 0}function o1(K,ne,Re,Qe,Et){}function uh(K,ne,Re,Qe){for(var Et=0,At=0;At>2],Xe=Oe[ne+(At*8+4)>>2],en=0;en>2]=Et,0}var wn={a:ls,d:s1,e:oh,f:lh,c:o1,b:uh},l1=ea(),ch=s.___wasm_call_ctors=function(){return(ch=s.___wasm_call_ctors=s.asm.h).apply(null,arguments)},u1=s._init=function(){return(u1=s._init=s.asm.i).apply(null,arguments)},hh=s._register_tensor=function(){return(hh=s._register_tensor=s.asm.j).apply(null,arguments)},c1=s._dispose_data=function(){return(c1=s._dispose_data=s.asm.k).apply(null,arguments)},Hi=s._dispose=function(){return(Hi=s._dispose=s.asm.l).apply(null,arguments)},Gi=s._Abs=function(){return(Gi=s._Abs=s.asm.n).apply(null,arguments)},h1=s._Add=function(){return(h1=s._Add=s.asm.o).apply(null,arguments)},d1=s._AddN=function(){return(d1=s._AddN=s.asm.p).apply(null,arguments)},p1=s._ArgMax=function(){return(p1=s._ArgMax=s.asm.q).apply(null,arguments)},Se=s._AvgPool=function(){return(Se=s._AvgPool=s.asm.r).apply(null,arguments)},f1=s._BatchMatMul=function(){return(f1=s._BatchMatMul=s.asm.s).apply(null,arguments)},m1=s._Ceil=function(){return(m1=s._Ceil=s.asm.t).apply(null,arguments)},A1=s._ClipByValue=function(){return(A1=s._ClipByValue=s.asm.u).apply(null,arguments)},y1=s._Conv2D=function(){return(y1=s._Conv2D=s.asm.v).apply(null,arguments)},g1=s._Conv2DBackpropInput=function(){return(g1=s._Conv2DBackpropInput=s.asm.w).apply(null,arguments)},us=s._Cos=function(){return(us=s._Cos=s.asm.x).apply(null,arguments)},x1=s._CropAndResize=function(){return(x1=s._CropAndResize=s.asm.y).apply(null,arguments)},w1=s._Cumsum=function(){return(w1=s._Cumsum=s.asm.z).apply(null,arguments)},b1=s._DepthToSpace=function(){return(b1=s._DepthToSpace=s.asm.A).apply(null,arguments)},_1=s._DepthwiseConv2dNative=function(){return(_1=s._DepthwiseConv2dNative=s.asm.B).apply(null,arguments)},v1=s._Equal=function(){return(v1=s._Equal=s.asm.C).apply(null,arguments)},k1=s._Exp=function(){return(k1=s._Exp=s.asm.D).apply(null,arguments)},I1=s._FlipLeftRight=function(){return(I1=s._FlipLeftRight=s.asm.E).apply(null,arguments)},N1=s._Floor=function(){return(N1=s._Floor=s.asm.F).apply(null,arguments)},S1=s._FloorDiv=function(){return(S1=s._FloorDiv=s.asm.G).apply(null,arguments)},va=s._FusedBatchNorm=function(){return(va=s._FusedBatchNorm=s.asm.H).apply(null,arguments)},su=s._FusedConv2D=function(){return(su=s._FusedConv2D=s.asm.I).apply(null,arguments)},iu=s._FusedDepthwiseConv2D=function(){return(iu=s._FusedDepthwiseConv2D=s.asm.J).apply(null,arguments)},T1=s._Gather=function(){return(T1=s._Gather=s.asm.K).apply(null,arguments)},E1=s._GatherNd=function(){return(E1=s._GatherNd=s.asm.L).apply(null,arguments)},C1=s._Greater=function(){return(C1=s._Greater=s.asm.M).apply(null,arguments)},R1=s._GreaterEqual=function(){return(R1=s._GreaterEqual=s.asm.N).apply(null,arguments)},F1=s._LeakyRelu=function(){return(F1=s._LeakyRelu=s.asm.O).apply(null,arguments)},Be=s._Less=function(){return(Be=s._Less=s.asm.P).apply(null,arguments)},M1=s._LessEqual=function(){return(M1=s._LessEqual=s.asm.Q).apply(null,arguments)},$1=s._Log=function(){return($1=s._Log=s.asm.R).apply(null,arguments)},D1=s._LogicalAnd=function(){return(D1=s._LogicalAnd=s.asm.S).apply(null,arguments)},O1=s._Max=function(){return(O1=s._Max=s.asm.T).apply(null,arguments)},z1=s._MaxPool=function(){return(z1=s._MaxPool=s.asm.U).apply(null,arguments)},P1=s._Maximum=function(){return(P1=s._Maximum=s.asm.V).apply(null,arguments)},ou=s._Mean=function(){return(ou=s._Mean=s.asm.W).apply(null,arguments)},dh=s._Min=function(){return(dh=s._Min=s.asm.X).apply(null,arguments)},ph=s._Minimum=function(){return(ph=s._Minimum=s.asm.Y).apply(null,arguments)},L1=s._Multiply=function(){return(L1=s._Multiply=s.asm.Z).apply(null,arguments)},W1=s._Neg=function(){return(W1=s._Neg=s.asm._).apply(null,arguments)},B1=s._NonMaxSuppressionV3=function(){return(B1=s._NonMaxSuppressionV3=s.asm.$).apply(null,arguments)},V1=s._NonMaxSuppressionV4=function(){return(V1=s._NonMaxSuppressionV4=s.asm.aa).apply(null,arguments)},U1=s._NonMaxSuppressionV5=function(){return(U1=s._NonMaxSuppressionV5=s.asm.ba).apply(null,arguments)},j1=s._NotEqual=function(){return(j1=s._NotEqual=s.asm.ca).apply(null,arguments)},H1=s._OneHot=function(){return(H1=s._OneHot=s.asm.da).apply(null,arguments)},tt=s._PadV2=function(){return(tt=s._PadV2=s.asm.ea).apply(null,arguments)},G1=s._Pow=function(){return(G1=s._Pow=s.asm.fa).apply(null,arguments)},q1=s._Prelu=function(){return(q1=s._Prelu=s.asm.ga).apply(null,arguments)},X1=s._Prod=function(){return(X1=s._Prod=s.asm.ha).apply(null,arguments)},qi=s._RealDiv=function(){return(qi=s._RealDiv=s.asm.ia).apply(null,arguments)},fh=s._Relu=function(){return(fh=s._Relu=s.asm.ja).apply(null,arguments)},mh=s._Relu6=function(){return(mh=s._Relu6=s.asm.ka).apply(null,arguments)},Ah=s._ResizeBilinear=function(){return(Ah=s._ResizeBilinear=s.asm.la).apply(null,arguments)},K1=s._Reverse=function(){return(K1=s._Reverse=s.asm.ma).apply(null,arguments)},Z1=s._RotateWithOffset=function(){return(Z1=s._RotateWithOffset=s.asm.na).apply(null,arguments)},yh=s._Round=function(){return(yh=s._Round=s.asm.oa).apply(null,arguments)},Y1=s._Rsqrt=function(){return(Y1=s._Rsqrt=s.asm.pa).apply(null,arguments)},gh=s._ScatterNd=function(){return(gh=s._ScatterNd=s.asm.qa).apply(null,arguments)},ka=s._SelectV2=function(){return(ka=s._SelectV2=s.asm.ra).apply(null,arguments)},J1=s._Sigmoid=function(){return(J1=s._Sigmoid=s.asm.sa).apply(null,arguments)},Q1=s._Sin=function(){return(Q1=s._Sin=s.asm.ta).apply(null,arguments)},B2=s._Softmax=function(){return(B2=s._Softmax=s.asm.ua).apply(null,arguments)},xh=s._Sqrt=function(){return(xh=s._Sqrt=s.asm.va).apply(null,arguments)},ef=s._Square=function(){return(ef=s._Square=s.asm.wa).apply(null,arguments)},tf=s._SquaredDifference=function(){return(tf=s._SquaredDifference=s.asm.xa).apply(null,arguments)},nf=s._Step=function(){return(nf=s._Step=s.asm.ya).apply(null,arguments)},rf=s._StridedSlice=function(){return(rf=s._StridedSlice=s.asm.za).apply(null,arguments)},af=s._Sub=function(){return(af=s._Sub=s.asm.Aa).apply(null,arguments)},sf=s._Sum=function(){return(sf=s._Sum=s.asm.Ba).apply(null,arguments)},of=s._Tanh=function(){return(of=s._Tanh=s.asm.Ca).apply(null,arguments)},lf=s._Tile=function(){return(lf=s._Tile=s.asm.Da).apply(null,arguments)},uf=s._TopK=function(){return(uf=s._TopK=s.asm.Ea).apply(null,arguments)},cf=s._Transpose=function(){return(cf=s._Transpose=s.asm.Fa).apply(null,arguments)},hf=s.__FusedMatMul=function(){return(hf=s.__FusedMatMul=s.asm.Ga).apply(null,arguments)},df=s._malloc=function(){return(df=s._malloc=s.asm.Ha).apply(null,arguments)},pf=s._free=function(){return(pf=s._free=s.asm.Ia).apply(null,arguments)},wh=s.stackSave=function(){return(wh=s.stackSave=s.asm.Ja).apply(null,arguments)},bh=s.stackRestore=function(){return(bh=s.stackRestore=s.asm.Ka).apply(null,arguments)},lu=s.stackAlloc=function(){return(lu=s.stackAlloc=s.asm.La).apply(null,arguments)};s.cwrap=Y;var Xi;function ff(K){this.name="ExitStatus",this.message="Program terminated with exit("+K+")",this.status=K}Qr=function K(){Xi||uu(),Xi||(Qr=K)};function uu(K){if(K=K||u,rr>0||(qn(),rr>0))return;function ne(){Xi||(Xi=!0,s.calledRun=!0,!U&&(Mn(),un(),i(s),s.onRuntimeInitialized&&s.onRuntimeInitialized(),Qt()))}s.setStatus?(s.setStatus("Running..."),setTimeout(function(){setTimeout(function(){s.setStatus("")},1),ne()},1)):ne()}if(s.run=uu,s.preInit)for(typeof s.preInit=="function"&&(s.preInit=[s.preInit]);s.preInit.length>0;)s.preInit.pop()();return uu(),a.ready}}();typeof e=="object"&&typeof t=="object"?t.exports=n:typeof define=="function"&&define.amd?define([],function(){return n}):typeof e=="object"&&(e.WasmBackendModule=n)}),sk=kt((e,t)=>{(function(n,r,a){function s(c){var u=this,h=l();u.next=function(){var d=2091639*u.s0+u.c*23283064365386963e-26;return u.s0=u.s1,u.s1=u.s2,u.s2=d-(u.c=d|0)},u.c=1,u.s0=h(" "),u.s1=h(" "),u.s2=h(" "),u.s0-=h(c),u.s0<0&&(u.s0+=1),u.s1-=h(c),u.s1<0&&(u.s1+=1),u.s2-=h(c),u.s2<0&&(u.s2+=1),h=null}function i(c,u){return u.c=c.c,u.s0=c.s0,u.s1=c.s1,u.s2=c.s2,u}function o(c,u){var h=new s(c),d=u&&u.state,p=h.next;return p.int32=function(){return h.next()*4294967296|0},p.double=function(){return p()+(p()*2097152|0)*11102230246251565e-32},p.quick=p,d&&(typeof d=="object"&&i(d,h),p.state=function(){return i(h,{})}),p}function l(){var c=4022871197,u=function(h){h=String(h);for(var d=0;d>>0,p-=c,p*=c,c=p>>>0,p-=c,c+=p*4294967296}return(c>>>0)*23283064365386963e-26};return u}r&&r.exports?r.exports=o:a&&a.amd?a(function(){return o}):this.alea=o})(e,typeof t=="object"&&t,typeof define=="function"&&define)}),ik=kt((e,t)=>{(function(n,r,a){function s(l){var c=this,u="";c.x=0,c.y=0,c.z=0,c.w=0,c.next=function(){var d=c.x^c.x<<11;return c.x=c.y,c.y=c.z,c.z=c.w,c.w^=c.w>>>19^d^d>>>8},l===(l|0)?c.x=l:u+=l;for(var h=0;h>>0)/4294967296};return d.double=function(){do var p=u.next()>>>11,f=(u.next()>>>0)/4294967296,m=(p+f)/(1<<21);while(m===0);return m},d.int32=u.next,d.quick=d,h&&(typeof h=="object"&&i(h,u),d.state=function(){return i(u,{})}),d}r&&r.exports?r.exports=o:a&&a.amd?a(function(){return o}):this.xor128=o})(e,typeof t=="object"&&t,typeof define=="function"&&define)}),ok=kt((e,t)=>{(function(n,r,a){function s(l){var c=this,u="";c.next=function(){var d=c.x^c.x>>>2;return c.x=c.y,c.y=c.z,c.z=c.w,c.w=c.v,(c.d=c.d+362437|0)+(c.v=c.v^c.v<<4^(d^d<<1))|0},c.x=0,c.y=0,c.z=0,c.w=0,c.v=0,l===(l|0)?c.x=l:u+=l;for(var h=0;h>>4),c.next()}function i(l,c){return c.x=l.x,c.y=l.y,c.z=l.z,c.w=l.w,c.v=l.v,c.d=l.d,c}function o(l,c){var u=new s(l),h=c&&c.state,d=function(){return(u.next()>>>0)/4294967296};return d.double=function(){do var p=u.next()>>>11,f=(u.next()>>>0)/4294967296,m=(p+f)/(1<<21);while(m===0);return m},d.int32=u.next,d.quick=d,h&&(typeof h=="object"&&i(h,u),d.state=function(){return i(u,{})}),d}r&&r.exports?r.exports=o:a&&a.amd?a(function(){return o}):this.xorwow=o})(e,typeof t=="object"&&t,typeof define=="function"&&define)}),lk=kt((e,t)=>{(function(n,r,a){function s(l){var c=this;c.next=function(){var h=c.x,d=c.i,p,f,m;return p=h[d],p^=p>>>7,f=p^p<<24,p=h[d+1&7],f^=p^p>>>10,p=h[d+3&7],f^=p^p>>>3,p=h[d+4&7],f^=p^p<<7,p=h[d+7&7],p=p^p<<13,f^=p^p<<9,h[d]=f,c.i=d+1&7,f};function u(h,d){var p,f,m=[];if(d===(d|0))f=m[0]=d;else for(d=""+d,p=0;p0;--p)h.next()}u(c,l)}function i(l,c){return c.x=l.x.slice(),c.i=l.i,c}function o(l,c){l==null&&(l=+new Date);var u=new s(l),h=c&&c.state,d=function(){return(u.next()>>>0)/4294967296};return d.double=function(){do var p=u.next()>>>11,f=(u.next()>>>0)/4294967296,m=(p+f)/(1<<21);while(m===0);return m},d.int32=u.next,d.quick=d,h&&(h.x&&i(h,u),d.state=function(){return i(u,{})}),d}r&&r.exports?r.exports=o:a&&a.amd?a(function(){return o}):this.xorshift7=o})(e,typeof t=="object"&&t,typeof define=="function"&&define)}),uk=kt((e,t)=>{(function(n,r,a){function s(l){var c=this;c.next=function(){var h=c.w,d=c.X,p=c.i,f,m;return c.w=h=h+1640531527|0,m=d[p+34&127],f=d[p=p+1&127],m^=m<<13,f^=f<<17,m^=m>>>15,f^=f>>>12,m=d[p]=m^f,c.i=p,m+(h^h>>>16)|0};function u(h,d){var p,f,m,A,y,g=[],w=128;for(d===(d|0)?(f=d,d=null):(d=d+"\0",f=0,w=Math.max(w,d.length)),m=0,A=-32;A>>15,f^=f<<4,f^=f>>>13,A>=0&&(y=y+1640531527|0,p=g[A&127]^=f+y,m=p==0?m+1:0);for(m>=128&&(g[(d&&d.length||0)&127]=-1),m=127,A=4*128;A>0;--A)f=g[m+34&127],p=g[m=m+1&127],f^=f<<13,p^=p<<17,f^=f>>>15,p^=p>>>12,g[m]=f^p;h.w=y,h.X=g,h.i=m}u(c,l)}function i(l,c){return c.i=l.i,c.w=l.w,c.X=l.X.slice(),c}function o(l,c){l==null&&(l=+new Date);var u=new s(l),h=c&&c.state,d=function(){return(u.next()>>>0)/4294967296};return d.double=function(){do var p=u.next()>>>11,f=(u.next()>>>0)/4294967296,m=(p+f)/(1<<21);while(m===0);return m},d.int32=u.next,d.quick=d,h&&(h.X&&i(h,u),d.state=function(){return i(u,{})}),d}r&&r.exports?r.exports=o:a&&a.amd?a(function(){return o}):this.xor4096=o})(e,typeof t=="object"&&t,typeof define=="function"&&define)}),ck=kt((e,t)=>{(function(n,r,a){function s(l){var c=this,u="";c.next=function(){var d=c.b,p=c.c,f=c.d,m=c.a;return d=d<<25^d>>>7^p,p=p-f|0,f=f<<24^f>>>8^m,m=m-d|0,c.b=d=d<<20^d>>>12^p,c.c=p=p-f|0,c.d=f<<16^p>>>16^m,c.a=m-d|0},c.a=0,c.b=0,c.c=2654435769|0,c.d=1367130551,l===Math.floor(l)?(c.a=l/4294967296|0,c.b=l|0):u+=l;for(var h=0;h>>0)/4294967296};return d.double=function(){do var p=u.next()>>>11,f=(u.next()>>>0)/4294967296,m=(p+f)/(1<<21);while(m===0);return m},d.int32=u.next,d.quick=d,h&&(typeof h=="object"&&i(h,u),d.state=function(){return i(u,{})}),d}r&&r.exports?r.exports=o:a&&a.amd?a(function(){return o}):this.tychei=o})(e,typeof t=="object"&&t,typeof define=="function"&&define)}),hk=kt((e,t)=>{(function(n,r,a){var s=256,i=6,o=52,l="random",c=a.pow(s,i),u=a.pow(2,o),h=u*2,d=s-1,p;function f(_,x,N){var T=[];x=x==!0?{entropy:!0}:x||{};var E=g(y(x.entropy?[_,b(r)]:_==null?w():_,3),T),M=new m(T),O=function(){for(var W=M.g(i),V=c,U=0;W=h;)W/=2,V/=2,U>>>=1;return(W+U)/V};return O.int32=function(){return M.g(4)|0},O.quick=function(){return M.g(4)/4294967296},O.double=O,g(b(M.S),r),(x.pass||N||function(W,V,U,j){return j&&(j.S&&A(j,M),W.state=function(){return A(M,{})}),U?(a[l]=W,V):W})(O,E,"global"in x?x.global:this==a,x.state)}function m(_){var x,N=_.length,T=this,E=0,M=T.i=T.j=0,O=T.S=[];for(N||(_=[N++]);E{var n=sk(),r=ik(),a=ok(),s=lk(),i=uk(),o=ck(),l=hk();l.alea=n,l.xor128=r,l.xorwow=a,l.xorshift7=s,l.xor4096=i,l.tychei=o,t.exports=l}),dk=kt(()=>{}),pk="3.3.0",fk="3.3.0",mk="3.3.0",Ak="3.3.0",yk="3.3.0",gk=1e-7,xk=1e-4,Ch=class{constructor(e,t){this.backend=e,this.dataMover=t,this.data=new WeakMap,this.dataIdsCount=0}get(e){return this.data.has(e)||this.dataMover.moveData(this.backend,e),this.data.get(e)}set(e,t){this.dataIdsCount++,this.data.set(e,t)}has(e){return this.data.has(e)}delete(e){return this.dataIdsCount--,this.data.delete(e)}numDataIds(){return this.dataIdsCount}},mu=class{refCount(e){return ir("refCount")}incRef(e){return ir("incRef")}timerAvailable(){return!0}time(e){return ir("time")}read(e){return ir("read")}readSync(e){return ir("readSync")}numDataIds(){return ir("numDataIds")}disposeData(e,t){return ir("disposeData")}write(e,t,n){return ir("write")}move(e,t,n,r,a){return ir("move")}memory(){return ir("memory")}floatPrecision(){return ir("floatPrecision")}epsilon(){return this.floatPrecision()===32?gk:xk}dispose(){return ir("dispose")}};function ir(e){throw new Error(`'${e}' not yet implemented or not found in the registry. This kernel may not be supported by the tfjs backend you have chosen`)}function s5(e){let t=e.length,n=0,r=0;for(;t>0;)r=Math.random()*t|0,t--,n=e[t],e[t]=e[r],e[r]=n}function wk(e,t){if(e.length!==t.length)throw new Error(`Array sizes must match to be shuffled together First array length was ${e.length}Second array length was ${t.length}`);let n=e.length,r,a,s=0;for(;n>0;)s=Math.random()*n|0,n--,r=e[n],a=t[n],e[n]=e[s],t[n]=t[s],e[s]=r,t[s]=a}function Au(e,t,n){return Math.max(e,Math.min(t,n))}function bk(e){return e%2==0?e:e+1}function _k(e){let t=0;for(let n=0;nn+` Shapes ${e} and ${t} must match`)}function ds(e){F(e!=null,()=>"The input to the tensor constructor must be a non-null value.")}function ps(e,t=[],n=!1){if(t==null&&(t=[]),Array.isArray(e)||on(e)&&!n)for(let r=0;r0,n){return new Promise((r,a)=>{let s=0,i=()=>{if(e()){r();return}s++;let o=t(s);if(n!=null&&s>=n){a();return}setTimeout(i,o)};i()})}function Ck(e,t){let n=1,r=-1;for(let s=0;s=0)n*=e[s];else if(e[s]===-1){if(r!==-1)throw Error(`Shapes can only have 1 implicit size. Found -1 at dim ${r} and dim ${s}`);r=s}else if(e[s]<0)throw Error(`Shapes can not be < 0. Found ${e[s]} at dim ${s}`);if(r===-1){if(t>0&&t!==n)throw Error(`Size(${t}) must match the product of shape ${e}`);return e}if(n===0)throw Error(`Cannot infer the missing size in [${e}] when there are 0 elements`);if(t%n!=0)throw Error(`The implicit shape can't be a fractional number. Got ${t} / ${n}`);let a=e.slice();return a[r]=t/n,a}function or(e,t){let n=t.length;return e=e==null?t.map((r,a)=>a):[].concat(e),F(e.every(r=>r>=-n&&r`All values in axis param must be in range [-${n}, ${n}) but got axis ${e}`),F(e.every(r=>Gt(r)),()=>`All values in axis param must be integers but got axis ${e}`),e.map(r=>r<0?n+r:r)}function i5(e,t){let n=[],r=[],a=t!=null&&Array.isArray(t)&&t.length===0,s=t==null||a?null:or(t,e).sort(),i=0;for(let o=0;oo)&&e[o]===1&&(n.push(e[o]),r.push(o)),s[i]<=o&&i++}e[o]!==1&&(n.push(e[o]),r.push(o))}return{newShape:n,keptDims:r}}function o5(e,t){let n=null;if(e==null||e==="float32")n=new Float32Array(t);else if(e==="int32")n=new Int32Array(t);else if(e==="bool")n=new Uint8Array(t);else throw new Error(`Unknown data type ${e}`);return n}function l5(e,t){let n=null;if(e==null||e==="float32")n=new Float32Array(t);else if(e==="int32")n=new Int32Array(t);else if(e==="bool")n=new Uint8Array(t);else if(e==="string")n=new Array(t);else throw new Error(`Unknown data type ${e}`);return n}function u5(e,t){for(let n=0;nt+=n.length),t}function Sa(e){return typeof e=="string"||e instanceof String}function d5(e){return typeof e=="boolean"}function p5(e){return typeof e=="number"}function Rh(e){return Array.isArray(e)?Rh(e[0]):e instanceof Float32Array?"float32":e instanceof Int32Array||e instanceof Uint8Array?"int32":p5(e)?"float32":Sa(e)?"string":d5(e)?"bool":"float32"}function Ta(e){return!!(e&&e.constructor&&e.call&&e.apply)}function Fh(e,t){for(let n=t;n=0;--r)n[r]=n[r+1]*e[r+1];return n}function f5(e,t,n){let r=new Array;if(t.length===1){let a=t[0];for(let s=0;so*l);for(let o=0;or*a);if(n===0)return[];if(n!==t.length)throw new Error(`[${e}] does not match the input size ${t.length}.`);return f5(0,e,t)}function wf(e,t){let n=Mh(e,t);for(let r=0;rr*a,1);if(t==null||t==="float32")return ao(e,new Float32Array(n));if(t==="int32")return ao(e,new Int32Array(n));if(t==="bool")return ao(e,new Uint8Array(n));throw new Error(`Unknown data type ${t}`)}function bf(e){e.forEach(t=>{F(Number.isInteger(t)&&t>=0,()=>`Tensor must have a shape comprised of positive integers but got shape [${e}].`)})}function Mk(e,t,n){if(t===0)return 0;if(t===1)return e[0];let r=e[e.length-1];for(let a=0;a{let[n,r]=t.split(":");this.urlFlags[n]=Ok(n,r)})}};function Dk(e){let t={};return e.replace(/[?&]([^=?&]+)(?:=([^&]*))?/g,(n,...r)=>(zk(t,r[0],r[1]),r.join("="))),t}function zk(e,t,n){e[decodeURIComponent(t)]=decodeURIComponent(n||"")}function Ok(e,t){if(t=t.toLowerCase(),t==="true"||t==="false")return t==="true";if(`${+t}`===t)return+t;throw new Error(`Could not parse value flag value ${t} for flag ${e}.`)}function J(){return xr}var xr=null;function Pk(e){xr=e}var vf;function y5(){if(vf==null){let e;if(typeof window!="undefined")e=window;else if(typeof global!="undefined")e=global;else if(typeof process!="undefined")e=process;else if(typeof self!="undefined")e=self;else throw new Error("Could not find a global object");vf=e}return vf}function Lk(){let e=y5();return e._tfGlobals==null&&(e._tfGlobals=new Map),e._tfGlobals}function kf(e,t){let n=Lk();if(n.has(e))return n.get(e);{let r=t();return n.set(e,r),n.get(e)}}var so="Abs",io="Acos",oo="Acosh",Ea="Add",fs="AddN",$h="All",Dh="Any",ms="ArgMax",gu="ArgMin",lo="Asin",uo="Asinh",co="Atan",ho="Atanh",po="Atan2",As="AvgPool",Oh="AvgPoolGrad",xu="AvgPool3D",zh="AvgPool3DGrad",ys="BatchMatMul",wu="BatchToSpaceND",Ph="Bincount",g5="BroadcastTo",gs="Cast",xs="Ceil",Ca="ClipByValue",Lh="Complex",bu="ComplexAbs",fo="Concat",ws="Conv2D",Wh="Conv2DBackpropFilter",bs="Conv2DBackpropInput",_u="Conv3D",Bh="Conv3DBackpropFilterV2",Vh="Conv3DBackpropInputV2",_s="Cos",mo="Cosh",vs="Cumsum",Ao="CropAndResize",Uh="DenseBincount",yo="DepthToSpace",ks="DepthwiseConv2dNative",jh="DepthwiseConv2dNativeBackpropFilter",Hh="DepthwiseConv2dNativeBackpropInput",Gh="Diag",vu="Dilation2D",qh="Dilation2DBackpropInput",Xh="Dilation2DBackpropFilter",Is="RealDiv",go="Elu",Kh="EluGrad",xo="Erf",wo="Equal",Ns="Exp",bo="ExpandDims",_o="Expm1",Zh="FFT",ku="Fill",vo="FlipLeftRight",Ss="Floor",Ts="FloorDiv",Es="FusedBatchNorm",ko="GatherV2",Io="GatherNd",No="Greater",Cs="GreaterEqual",Rs="Identity",Yh="IFFT",Jh="Imag",So="IsFinite",To="IsInf",Eo="IsNan",Fs="LeakyRelu",Co="Less",Ro="LessEqual",Qh="LinSpace",Ms="Log",Fo="Log1p",Mo="LogicalAnd",Iu="LogicalNot",Nu="LogicalOr",x5="LogSoftmax",Su="LRN",ed="LRNGrad",$s="Max",Ds="Maximum",Os="MaxPool",td="MaxPoolGrad",Tu="MaxPool3D",nd="MaxPool3DGrad",rd="MaxPoolWithArgmax",zs="Mean",Ps="Min",Ls="Minimum",Eu="MirrorPad",$o="Mod",ad="Multinomial",Ws="Multiply",Do="Neg",Oo="NotEqual",zo="NonMaxSuppressionV3",Po="NonMaxSuppressionV4",Lo="NonMaxSuppressionV5",Wo="OnesLike",Bs="OneHot",Bo="Pack",Vs="PadV2",Wk="Pool",Us="Pow",js="Prelu",Vo="Prod",Cu="Range",sd="Real",Uo="Reciprocal",Hs="Relu",jo="Reshape",Ru="ResizeNearestNeighbor",id="ResizeNearestNeighborGrad",Gs="ResizeBilinear",od="ResizeBilinearGrad",qs="Relu6",Xs="Reverse",Ks="Round",Zs="Rsqrt",Ho="ScatterNd",Go="Select",qo="Selu",Xo="Slice",Ys="Sin",Ko="Sinh",Zo="Sign",Js="Sigmoid",Yo="Softplus",Qs="Sqrt",ei="Sum",Fu="SpaceToBatchND",Jo="SplitV",ti="Softmax",ni="SquaredDifference",Mu="Square",ri="Sub",ld="SparseToDense",Qo="StridedSlice",el="Tan",ai="Tanh",Ra="Tile",tl="TopK",ud="Transform",si="Transpose",cd="Unique",nl="Unpack",$u="UnsortedSegmentSum",rl="ZerosLike",Fa="Step",hd="FromPixels",al="RotateWithOffset",ii="_FusedMatMul",oi="FusedConv2D",li="FusedDepthwiseConv2D",sl=kf("kernelRegistry",()=>new Map),Du=kf("gradRegistry",()=>new Map);function dd(e,t){let n=If(e,t);return sl.get(n)}function Nf(e){return Du.get(e)}function il(e){let t=sl.entries(),n=[];for(;;){let{done:r,value:a}=t.next();if(r)break;let[s,i]=a,[o]=s.split("_");o===e&&n.push(i)}return n}function ui(e){let{kernelName:t,backendName:n}=e,r=If(t,n);sl.has(r)&&console.warn(`The kernel '${t}' for backend '${n}' is already registered`),sl.set(r,e)}function w5(e){let{kernelName:t}=e;Du.has(t)&&J().getBool("DEBUG")&&console.warn(`Overriding the gradient for '${t}'`),Du.set(t,e)}function Bk(e,t){let n=If(e,t);if(!sl.has(n))throw new Error(`The kernel '${e}' for backend '${t}' is not registered`);sl.delete(n)}function Vk(e){if(!Du.has(e))throw new Error(`The gradient '${e}' for backend is not registered`);Du.delete(e)}function Uk(e,t){il(e).forEach(n=>{let r=Object.assign({},n,{backendName:t});ui(r)})}function If(e,t){return`${t}_${e}`}var v={};Le(v,{arraysEqual:()=>aa,assert:()=>F,assertNonNegativeIntegerDimensions:()=>bf,assertNonNull:()=>ds,assertShapesMatch:()=>sn,bytesFromStringArray:()=>h5,bytesPerElement:()=>xf,checkConversionForErrors:()=>u5,clamp:()=>Au,computeStrides:()=>ro,createScalarValue:()=>jk,createShuffledIndices:()=>Tk,decodeString:()=>fd,distSquared:()=>kk,encodeString:()=>zu,fetch:()=>Hk,flatten:()=>ps,getArrayFromDType:()=>l5,getTypedArrayFromDType:()=>o5,hasEncodingLoss:()=>Rk,indexToLoc:()=>$k,inferDtype:()=>Rh,inferFromImplicitShape:()=>Ck,isBoolean:()=>d5,isFunction:()=>Ta,isInt:()=>Gt,isNumber:()=>p5,isPromise:()=>_f,isScalarShape:()=>Ik,isString:()=>Sa,isTypedArray:()=>on,isValidDtype:()=>c5,locToIndex:()=>Mk,makeOnesTypedArray:()=>wf,makeZerosNestedTypedArray:()=>Fk,makeZerosTypedArray:()=>Mh,nearestDivisor:()=>Fh,nearestLargerEven:()=>bk,now:()=>Ou,parseAxisParam:()=>or,randUniform:()=>vk,repeatedTry:()=>Ek,rightPad:()=>yu,shuffle:()=>s5,shuffleCombo:()=>wk,sizeFromShape:()=>zt,sizeToSquarishShape:()=>Sk,squeezeShape:()=>i5,sum:()=>_k,tanh:()=>Nk,toNestedArray:()=>ao,toTypedArray:()=>pd});function jk(e,t){return t==="string"?zu(e):pd([e],t)}function Gk(e,t){return e instanceof Float32Array&&t==="float32"||e instanceof Int32Array&&t==="int32"||e instanceof Uint8Array&&t==="bool"}function pd(e,t){if(t==="string")throw new Error("Cannot convert a string[] to a TypedArray");if(Array.isArray(e)&&(e=ps(e)),J().getBool("DEBUG")&&u5(e,t),Gk(e,t))return e;if(t==null||t==="float32"||t==="complex64")return new Float32Array(e);if(t==="int32")return new Int32Array(e);if(t==="bool"){let n=new Uint8Array(e.length);for(let r=0;r{r=n()},s,i=Ou();if(this.backendTimer.timerAvailable())s=this.backendTimer.time(a);else{a();for(let o of r)o.dataSync();s=Promise.resolve({kernelMs:Ou()-i})}if(J().getBool("CHECK_COMPUTATION_FOR_ERRORS"))for(let o=0;o{qk(c,l.dtype,e)})}return{kernelName:e,outputs:r,inputs:t,timeMs:s.then(o=>o.kernelMs),extraInfo:s.then(o=>o.getExtraProfileInfo!=null?o.getExtraProfileInfo():"")}}logKernelProfile(e){let{kernelName:t,outputs:n,timeMs:r,inputs:a,extraInfo:s}=e;n.forEach(i=>{Promise.all([i.data(),r,s]).then(o=>{this.logger.logKernelProfile(t,i,o[0],o[1],a,o[2])})})}};function qk(e,t,n){if(t!=="float32")return!1;for(let r=0;r0?f:""} `}}console.log(`%c${o} %c${i} %c${l}D ${u} %c${c} %c${h} %c${s}`,"font-weight:bold","color:red","color:blue","color: orange","color: green","color: steelblue")}};function Zk(e,t,n){let r={},a={};for(let l=0;lr[m.id]=!0),p=!0,a[c.id]=!0;break}if(p)break}}let s={};s[n.id]=!0;let i={};for(let l=e.length-1;l>=0;l--){let c=e[l],u=c.inputs;for(let h=0;h=0;a--){let s=t[a],i=[];if(s.outputs.forEach(l=>{let c=e[l.id];c!=null?i.push(c):i.push(null)}),s.gradient==null)throw new Error(`Cannot compute gradient: gradient function not found for ${s.kernelName}.`);let o=s.gradient(i);for(let l in s.inputs){if(!(l in o))throw new Error(`Cannot backprop through input ${l}. Available gradients found: ${Object.keys(o)}.`);let c=n(()=>o[l]());if(c.dtype!=="float32")throw new Error(`Error in gradient for op ${s.kernelName}. The gradient of input ${l} must have 'float32' dtype, but has '${c.dtype}'`);let u=s.inputs[l];if(!aa(c.shape,u.shape))throw new Error(`Error in gradient for op ${s.kernelName}. The gradient of input '${l}' has shape '${c.shape}', which does not match the shape of the input '${u.shape}'`);if(e[u.id]==null)e[u.id]=c;else{let h=e[u.id];e[u.id]=r(h,c),h.dispose()}}}}var b5=20,Pu=3,Sf=7;function Qk(e,t,n,r){let a=ro(t),s=Jk(e,t,n,a),i=t.length,o=md(e,t,n,a,s),l=["Tensor"];return r&&(l.push(` dtype: ${n}`),l.push(` rank: ${i}`),l.push(` shape: [${t}]`),l.push(" values:")),l.push(o.map(c=>" "+c).join(` -`)),l.join(` -`)}function Jk(e,t,n,r){let a=zt(t),s=r[r.length-1],i=new Array(s).fill(0),o=t.length,l=n==="complex64"?Wu(e):e;if(o>1)for(let c=0;cb5){let A=Pu*i,y=Array.from(e.slice(0,A)),g=Array.from(e.slice((o-Pu)*i,o*i));return n==="complex64"&&(y=Wu(y),g=Wu(g)),["["+y.map((w,b)=>Lu(w,a[b],n)).join(", ")+", ..., "+g.map((w,b)=>Lu(w,a[o-Pu+b],n)).join(", ")+"]"]}let m=n==="complex64"?Wu(e):Array.from(e);return["["+m.map((A,y)=>Lu(A,a[y],n)).join(", ")+"]"]}let c=t.slice(1),u=r.slice(1),h=r[0]*i,d=[];if(o>b5){for(let m=0;m`Length of values '${r}' does not match the size inferred by the shape '${this.size}'.`)}if(t==="complex64")throw new Error("complex64 dtype TensorBuffers are not supported. Please create a TensorBuffer for the real and imaginary parts separately and call tf.complex(real, imag).");this.values=n||l5(t,this.size),this.strides=ro(e)}set(e,...t){t.length===0&&(t=[0]),F(t.length===this.rank,()=>`The number of provided coordinates (${t.length}) must match the rank (${this.rank})`);let n=this.locToIndex(t);this.values[n]=e}get(...e){e.length===0&&(e=[0]);let t=0;for(let r of e){if(r<0||r>=this.shape[t]){let a=`Requested out of range element at ${e}. Buffer shape=${this.shape}`;throw new Error(a)}t++}let n=e[e.length-1];for(let r=0;rfd(n))}catch(n){throw new Error("Failed to decode the string bytes into utf-8. To get the original bytes, call tensor.bytes().")}}return e}dataSync(){this.throwIfDisposed();let e=$r().readSync(this.dataId);if(this.dtype==="string")try{return e.map(t=>fd(t))}catch(t){throw new Error("Failed to decode the string bytes into utf-8. To get the original bytes, call tensor.bytes().")}return e}async bytes(){this.throwIfDisposed();let e=await $r().read(this.dataId);return this.dtype==="string"?e:new Uint8Array(e.buffer)}dispose(){this.isDisposed||($r().disposeTensor(this),this.isDisposedInternal=!0)}get isDisposed(){return this.isDisposedInternal}throwIfDisposed(){if(this.isDisposed)throw new Error("Tensor is disposed.")}print(e=!1){return ol.print(this,e)}clone(){return this.throwIfDisposed(),ol.clone(this)}toString(e=!1){let t=this.dataSync();return Qk(t,this.shape,this.dtype,e)}cast(e){return this.throwIfDisposed(),ol.cast(this,e)}variable(e=!0,t,n){return this.throwIfDisposed(),$r().makeVariable(this,e,t,n)}};Object.defineProperty(Ge,Symbol.hasInstance,{value:e=>!!e&&e.data!=null&&e.dataSync!=null&&e.throwIfDisposed!=null});function Z(){return kf("Tensor",()=>Ge)}Z();var Bu=class extends Ge{constructor(e,t,n,r){super(e.shape,e.dtype,e.dataId,r);this.trainable=t,this.name=n}assign(e){if(e.dtype!==this.dtype)throw new Error(`dtype of the new value (${e.dtype}) and previous value (${this.dtype}) must match`);if(!aa(e.shape,this.shape))throw new Error(`shape of the new value (${e.shape}) and previous value (${this.shape}) must match`);$r().disposeTensor(this),this.dataId=e.dataId,$r().incRef(this,null)}dispose(){$r().disposeVariable(this),this.isDisposedInternal=!0}};Object.defineProperty(Bu,Symbol.hasInstance,{value:e=>e instanceof Ge&&e.assign!=null&&e.assign instanceof Function});var wr={};Le(wr,{assertTypesMatch:()=>v5,getTensorsInContainer:()=>Tf,isTensorInList:()=>a9,makeTypesMatch:()=>It});var Ef;(function(e){e.R0="R0",e.R1="R1",e.R2="R2",e.R3="R3",e.R4="R4",e.R5="R5",e.R6="R6"})(Ef||(Ef={}));var Cf;(function(e){e.float32="float32",e.int32="int32",e.bool="int32",e.complex64="complex64"})(Cf||(Cf={}));var Rf;(function(e){e.float32="float32",e.int32="int32",e.bool="bool",e.complex64="complex64"})(Rf||(Rf={}));var Ff;(function(e){e.float32="float32",e.int32="float32",e.bool="float32",e.complex64="complex64"})(Ff||(Ff={}));var Mf;(function(e){e.float32="complex64",e.int32="complex64",e.bool="complex64",e.complex64="complex64"})(Mf||(Mf={}));var s9={float32:Ff,int32:Cf,bool:Rf,complex64:Mf};function lr(e,t){if(e==="string"||t==="string"){if(e==="string"&&t==="string")return"string";throw new Error(`Can not upcast ${e} with ${t}`)}return s9[e][t]}function Ad(e){return lr(e,"int32")}function It(e,t){if(e.dtype===t.dtype)return[e,t];let n=lr(e.dtype,t.dtype);return[e.cast(n),t.cast(n)]}function v5(e,t){F(e.dtype===t.dtype,()=>`The dtypes of the first(${e.dtype}) and second(${t.dtype}) input must match`)}function a9(e,t){return t.some(n=>n.id===e.id)}function Tf(e){let t=[],n=new Set;return k5(e,t,n),t}function k5(e,t,n){if(e==null)return;if(e instanceof Ge){t.push(e);return}if(!i9(e))return;let r=e;for(let a in r){let s=r[a];n.has(s)||(n.add(s),k5(s,t,n))}}function i9(e){return Array.isArray(e)||typeof e=="object"}function $f(e){return e.kernelName!=null}var I5=class{constructor(){this.registeredVariables={},this.nextTapeNodeId=0,this.numBytes=0,this.numTensors=0,this.numStringTensors=0,this.numDataBuffers=0,this.gradientDepth=0,this.kernelDepth=0,this.scopeStack=[],this.numDataMovesStack=[],this.nextScopeId=0,this.tensorInfo=new WeakMap,this.profiling=!1,this.activeProfile={newBytes:0,newTensors:0,peakBytes:0,kernels:[],result:null,get kernelNames(){return Array.from(new Set(this.kernels.map(e=>e.name)))}}}dispose(){for(let e in this.registeredVariables)this.registeredVariables[e].dispose()}},Vu=class{constructor(e){this.ENV=e,this.registry={},this.registryFactory={},this.pendingBackendInitId=0,this.state=new I5}async ready(){if(this.pendingBackendInit!=null)return this.pendingBackendInit.then(()=>{});if(this.backendInstance!=null)return;let e=this.getSortedBackends();for(let t=0;t{e.setupFunc!=null&&e.setupFunc(this.backendInstance)})}disposeRegisteredKernels(e){il(e).forEach(t=>{t.disposeFunc!=null&&t.disposeFunc(this.registry[e])})}initializeBackend(e){let t=this.registryFactory[e];if(t==null)throw new Error(`Cannot initialize backend ${e}, no registration found.`);try{let n=t.factory();if(n&&!(n instanceof mu)&&typeof n.then=="function"){let r=++this.pendingBackendInitId,a=n.then(s=>r(rthis.registryFactory[t].priority-this.registryFactory[e].priority)}initializeBackendsAndReturnBest(){let e=this.getSortedBackends();for(let t=0;tthis.startScope(n),()=>this.endScope(r),()=>(r=t(),r instanceof Promise&&console.error("Cannot return a Promise inside of tidy."),r))}scopedRun(e,t,n){e();try{let r=n();return t(),r}catch(r){throw t(),r}}nextTensorId(){return Vu.nextTensorId++}nextVariableId(){return Vu.nextVariableId++}clone(e){let t=$.runKernel(Rs,{x:e}),n={x:e},r=s=>({x:()=>{let i="float32",o={x:s},l={dtype:i};return $.runKernel(gs,o,l)}}),a=[];return this.addTapeNode(this.state.activeScope.name,n,[t],r,a,{}),t}runKernel(e,t,n){if(dd(e,this.backendName)==null)throw new Error(`Kernel '${e}' not registered for backend '${this.backendName}'`);return this.runKernelFunc({kernelName:e,inputs:t,attrs:n})}shouldCheckForMemLeaks(){return this.ENV.getBool("IS_TEST")}checkKernelForMemLeak(e,t,n){let r=this.backend.numDataIds(),a=0;n.forEach(o=>{a+=o.dtype==="complex64"?3:1});let s=this.state.numDataMovesStack[this.state.numDataMovesStack.length-1],i=r-t-a-s;if(i>0)throw new Error(`Backend '${this.backendName}' has an internal memory leak (${i} data ids) after running '${e}'`)}runKernelFunc(e){let t,n=[],r=this.isTapeOn(),a=this.state.numBytes,s=this.state.numTensors;this.shouldCheckForMemLeaks()&&this.state.numDataMovesStack.push(0);let i;this.backendName==null&&this.backend;let o,l=$f(e)?e.kernelName:this.state.activeScope!=null?this.state.activeScope.name:"";if($f(e)){let{kernelName:p,inputs:f,attrs:m}=e;this.backendName==null&&this.backend;let A=dd(p,this.backendName);F(A!=null,()=>`Cannot find registered kernel '${p}' for backend '${this.backendName}'`),i=()=>{let y=this.backend.numDataIds();o=A.kernelFunc({inputs:f,attrs:m,backend:this.backend});let g=Array.isArray(o)?o:[o];this.shouldCheckForMemLeaks()&&this.checkKernelForMemLeak(p,y,g);let w=g.map(b=>{if(b.rank!=null)return b;let{dataId:_,shape:x,dtype:N}=b;return this.makeTensorFromDataId(_,x,N)});if(r){let b=this.getTensorsForGradient(p,f,w);n=this.saveTensorsForBackwardMode(b)}return w}}else{let{forwardFunc:p}=e,f=m=>{!r||(n=m.map(A=>this.keep(this.clone(A))))};i=()=>{let m=this.backend.numDataIds();o=this.tidy(()=>p(this.backend,f));let A=Array.isArray(o)?o:[o];return this.shouldCheckForMemLeaks()&&this.checkKernelForMemLeak(l,m,A),A}}let{inputs:c,attrs:u}=e,h=$f(e)?null:e.backwardsFunc,d;return this.scopedRun(()=>this.state.kernelDepth++,()=>this.state.kernelDepth--,()=>{!this.ENV.getBool("DEBUG")&&!this.state.profiling?t=i():(d=this.profiler.profileKernel(l,c,()=>i()),this.ENV.getBool("DEBUG")&&this.profiler.logKernelProfile(d),t=d.outputs)}),r&&this.addTapeNode(l,c,t,h,n,u),this.state.profiling&&this.state.activeProfile.kernels.push({name:l,bytesAdded:this.state.numBytes-a,totalBytesSnapshot:this.state.numBytes,tensorsAdded:this.state.numTensors-s,totalTensorsSnapshot:this.state.numTensors,inputShapes:Object.keys(c).map(p=>c[p]!=null?c[p].shape:null),outputShapes:t.map(p=>p.shape),kernelTimeMs:d.timeMs,extraInfo:d.extraInfo}),Array.isArray(o)?t:t[0]}saveTensorsForBackwardMode(e){return e.map(t=>this.keep(this.clone(t)))}getTensorsForGradient(e,t,n){let r=Nf(e);if(r!=null){let a=r.inputsToSave||[],s=r.outputsToSave||[],i;r.saveAllInputs?(F(Array.isArray(t),()=>"saveAllInputs is true, expected inputs to be an array."),i=Object.keys(t).map(l=>t[l])):i=a.map(l=>t[l]);let o=n.filter((l,c)=>s[c]);return i.concat(o)}return[]}makeTensor(e,t,n,r){if(e==null)throw new Error("Values passed to engine.makeTensor() are null");n=n||"float32",r=r||this.backend;let a=e;n==="string"&&Sa(e[0])&&(a=e.map(o=>zu(o)));let s=r.write(a,t,n),i=new Ge(t,n,s,this.nextTensorId());if(this.trackTensor(i,r),n==="string"){let o=this.state.tensorInfo.get(s),l=h5(a);this.state.numBytes+=l-o.bytes,o.bytes=l}return i}makeTensorFromDataId(e,t,n,r){n=n||"float32";let a=new Ge(t,n,e,this.nextTensorId());return this.trackTensor(a,r),a}makeVariable(e,t=!0,n,r){n=n||this.nextVariableId().toString(),r!=null&&r!==e.dtype&&(e=e.cast(r));let a=new Bu(e,t,n,this.nextTensorId());if(this.state.registeredVariables[a.name]!=null)throw new Error(`Variable with name ${a.name} was already registered`);return this.state.registeredVariables[a.name]=a,this.incRef(a,this.backend),a}trackTensor(e,t){this.state.numTensors++,e.dtype==="string"&&this.state.numStringTensors++;let n=0;e.dtype!=="complex64"&&e.dtype!=="string"&&(n=e.size*xf(e.dtype)),this.state.numBytes+=n,this.state.tensorInfo.has(e.dataId)||(this.state.numDataBuffers++,this.state.tensorInfo.set(e.dataId,{backend:t||this.backend,dtype:e.dtype,shape:e.shape,bytes:n})),e instanceof Bu||this.track(e)}incRef(e,t){this.trackTensor(e,t),this.backend.incRef(e.dataId)}removeDataId(e,t){this.state.tensorInfo.has(e)&&this.state.tensorInfo.get(e).backend===t&&(this.state.tensorInfo.delete(e),this.state.numDataBuffers--)}disposeTensor(e){if(!this.state.tensorInfo.has(e.dataId))return;let t=this.state.tensorInfo.get(e.dataId);if(this.state.numTensors--,e.dtype==="string"&&(this.state.numStringTensors--,this.state.numBytes-=t.bytes),e.dtype!=="complex64"&&e.dtype!=="string"){let n=e.size*xf(e.dtype);this.state.numBytes-=n}t.backend.disposeData(e.dataId)&&this.removeDataId(e.dataId,t.backend)}disposeVariables(){for(let e in this.state.registeredVariables){let t=this.state.registeredVariables[e];this.disposeVariable(t)}}disposeVariable(e){this.disposeTensor(e),this.state.registeredVariables[e.name]!=null&&delete this.state.registeredVariables[e.name]}memory(){let e=this.backend.memory();return e.numTensors=this.state.numTensors,e.numDataBuffers=this.state.numDataBuffers,e.numBytes=this.state.numBytes,this.state.numStringTensors>0&&(e.unreliable=!0,e.reasons==null&&(e.reasons=[]),e.reasons.push("Memory usage by string tensors is approximate (2 bytes per character)")),e}async profile(e){this.state.profiling=!0;let t=this.state.numBytes,n=this.state.numTensors;this.state.activeProfile.kernels=[],this.state.activeProfile.result=await e(),this.state.profiling=!1,this.state.activeProfile.peakBytes=Math.max(...this.state.activeProfile.kernels.map(r=>r.totalBytesSnapshot)),this.state.activeProfile.newBytes=this.state.numBytes-t,this.state.activeProfile.newTensors=this.state.numTensors-n;for(let r of this.state.activeProfile.kernels)r.kernelTimeMs=await r.kernelTimeMs,r.extraInfo=await r.extraInfo;return this.state.activeProfile}isTapeOn(){return this.state.gradientDepth>0&&this.state.kernelDepth===0}addTapeNode(e,t,n,r,a,s){let i={id:this.state.nextTapeNodeId++,kernelName:e,inputs:t,outputs:n,saved:a},o=Nf(e);o!=null&&(r=o.gradFunc),r!=null&&(i.gradient=l=>(l=l.map((c,u)=>{if(c==null){let h=n[u],d=Mh(h.size,h.dtype);return this.makeTensor(d,h.shape,h.dtype)}return c}),r(l.length>1?l:l[0],a,s))),this.state.activeTape.push(i)}keep(e){return e.kept=!0,e}startTape(){this.state.gradientDepth===0&&(this.state.activeTape=[]),this.state.gradientDepth++}endTape(){this.state.gradientDepth--}startScope(e){let t={track:[],name:"unnamed scope",id:this.state.nextScopeId++};e&&(t.name=e),this.state.scopeStack.push(t),this.state.activeScope=t}endScope(e){let t=Tf(e),n=new Set(t.map(a=>a.id));for(let a=0;a{!a.kept&&a.scopeId===r.id&&this.track(a)})}gradients(e,t,n,r=!1){if(F(t.length>0,()=>"gradients() received an empty list of xs."),n!=null&&n.dtype!=="float32")throw new Error(`dy must have 'float32' dtype, but has '${n.dtype}'`);let a=this.scopedRun(()=>this.startTape(),()=>this.endTape(),()=>this.tidy("forward",e));F(a instanceof Ge,()=>"The result y returned by f() must be a tensor.");let s=Zk(this.state.activeTape,t,a);if(!r&&s.length===0&&t.length>0)throw new Error("Cannot compute gradient of y=f(x) with respect to x. Make sure that the f you passed encloses all operations that lead from x to y.");return this.tidy("backward",()=>{let i={};i[a.id]=n==null?o9(a.shape):n,Yk(i,s,l=>this.tidy(l),l9);let o=t.map(l=>i[l.id]);return this.state.gradientDepth===0&&(this.state.activeTape.forEach(l=>{for(let c of l.saved)c.dispose()}),this.state.activeTape=null),{value:a,grads:o}})}customGrad(e){return F(Ta(e),()=>"The f passed in customGrad(f) must be a function."),(...t)=>{F(t.every(i=>i instanceof Ge),()=>"The args passed in customGrad(f)(x1, x2,...) must all be tensors");let n,r={};t.forEach((i,o)=>{r[o]=i});let a=(i,o)=>(n=e(...t,o),F(n.value instanceof Ge,()=>"The function f passed in customGrad(f) must return an object where `obj.value` is a tensor"),F(Ta(n.gradFunc),()=>"The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function."),n.value),s=(i,o)=>{let l=n.gradFunc(i,o),c=Array.isArray(l)?l:[l];F(c.length===t.length,()=>"The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function that returns the same number of tensors as inputs passed to f(...)."),F(c.every(h=>h instanceof Ge),()=>"The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function that returns a list of only tensors.");let u={};return c.forEach((h,d)=>{u[d]=()=>h}),u};return this.runKernelFunc({forwardFunc:a,backwardsFunc:s,inputs:r})}}readSync(e){return this.state.tensorInfo.get(e).backend.readSync(e)}read(e){return this.state.tensorInfo.get(e).backend.read(e)}async time(e){let t=Ou(),n=await this.backend.time(e);return n.wallMs=Ou()-t,n}track(e){return this.state.activeScope!=null&&(e.scopeId=this.state.activeScope.id,this.state.activeScope.track.push(e)),e}get registeredVariables(){return this.state.registeredVariables}reset(){this.pendingBackendInitId++,this.state.dispose(),this.ENV.reset(),this.state=new I5;for(let e in this.registry)this.disposeRegisteredKernels(e),this.registry[e].dispose(),delete this.registry[e];this.backendName=null,this.backendInstance=null,this.pendingBackendInit=null}};Vu.nextTensorId=0;Vu.nextVariableId=0;function o9(e){let t=wf(zt(e),"float32");return $.makeTensor(t,e,"float32")}function N5(){let e=y5();if(e._tfengine==null){let t=new A5(e);e._tfengine=new Vu(t)}return Pk(e._tfengine.ENV),t9(()=>e._tfengine),e._tfengine}var $=N5();function l9(e,t){let n={a:e,b:t};return $.runKernel(Ea,n)}var Uu={};Le(Uu,{isBrowser:()=>S5,isMobile:()=>u9});function c9(){return typeof navigator!="undefined"&&navigator!=null}function u9(){if(c9()){let e=navigator.userAgent||navigator.vendor||window.opera;return/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(e)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(e.substr(0,4))}return!1}function S5(){return typeof window!="undefined"&&window.document!=null||typeof WorkerGlobalScope!="undefined"}var br=J();br.registerFlag("DEBUG",()=>!1,e=>{e&&console.warn("Debugging mode is ON. The output of every math call will be downloaded to CPU and checked for NaNs. This significantly impacts performance.")});br.registerFlag("IS_BROWSER",()=>S5());br.registerFlag("IS_NODE",()=>typeof process!="undefined"&&typeof process.versions!="undefined"&&typeof process.versions.node!="undefined");br.registerFlag("IS_CHROME",()=>typeof navigator!="undefined"&&navigator!=null&&navigator.userAgent!=null&&/Chrome/.test(navigator.userAgent)&&/Google Inc/.test(navigator.vendor));br.registerFlag("PROD",()=>!1);br.registerFlag("TENSORLIKE_CHECK_SHAPE_CONSISTENCY",()=>br.getBool("DEBUG"));br.registerFlag("DEPRECATION_WARNINGS_ENABLED",()=>!0);br.registerFlag("IS_TEST",()=>!1);br.registerFlag("CHECK_COMPUTATION_FOR_ERRORS",()=>!0);br.registerFlag("WRAP_TO_IMAGEBITMAP",()=>!1);function Dr(e,t){let n=e;if(on(e))return t==="string"?[]:[e.length];if(!Array.isArray(e))return[];let r=[];for(;Array.isArray(n)||on(n)&&t!=="string";)r.push(n.length),n=n[0];return Array.isArray(e)&&J().getBool("TENSORLIKE_CHECK_SHAPE_CONSISTENCY")&&T5(e,r,[]),r}function T5(e,t,n){if(n=n||[],!Array.isArray(e)&&!on(e)){F(t.length===0,()=>`Element arr[${n.join("][")}] is a primitive, but should be an array/TypedArray of ${t[0]} elements`);return}F(t.length>0,()=>`Element arr[${n.join("][")}] should be a primitive, but is an array of ${e.length} elements`),F(e.length===t[0],()=>`Element arr[${n.join("][")}] should have ${t[0]} elements, but has ${e.length} elements`);let r=t.slice(1);for(let a=0;a=0&&(a=r),E5(r,a,t,n),e==null||!on(e)&&!Array.isArray(e)&&typeof e!="number"&&typeof e!="boolean"&&typeof e!="string"){let o=e==null?"null":e.constructor.name;throw new Error(`Argument '${t}' passed to '${n}' must be a Tensor or TensorLike, but got '${o}'`)}let s=Dr(e,a);!on(e)&&!Array.isArray(e)&&(e=[e]);let i=a!=="string"?pd(e,a):ps(e,[],!0);return $.makeTensor(i,s,a)}function ju(e,t,n,r="numeric"){if(!Array.isArray(e))throw new Error(`Argument ${t} passed to ${n} must be a \`Tensor[]\` or \`TensorLike[]\``);return e.map((a,s)=>C(a,`${t}[${s}]`,n,r))}var C5="__op";function D(e){let t=Object.keys(e);if(t.length!==1)throw new Error(`Please provide an object with a single key (operation name) mapping to a function. Got an object with ${t.length} keys.`);let n=t[0],r=e[n];n.endsWith("_")&&(n=n.substring(0,n.length-1)),n=n+C5;let a=(...s)=>{$.startScope(n);try{let i=r(...s);return _f(i)&&console.error("Cannot return a Promise inside of tidy."),$.endScope(i),i}catch(i){throw $.endScope(null),i}};return Object.defineProperty(a,"name",{value:n,configurable:!0}),a}function h9(e,t){let n=C(e,"real","complex"),r=C(t,"imag","complex");sn(n.shape,r.shape,`real and imag shapes, ${n.shape} and ${r.shape}, must match in call to tf.complex().`);let a={real:n,imag:r};return $.runKernel(Lh,a)}var Ma=D({complex_:h9});function $a(e,t,n,r){if(r==null&&(r=Rh(e)),r==="complex64")throw new Error("Cannot construct a complex64 tensor directly. Please use tf.complex(real, imag).");if(!on(e)&&!Array.isArray(e)&&typeof e!="number"&&typeof e!="boolean"&&typeof e!="string")throw new Error("values passed to tensor(values) must be a number/boolean/string or an array of numbers/booleans/strings, or a TypedArray");if(t!=null){bf(t);let a=zt(t),s=zt(n);F(a===s,()=>`Based on the provided shape, [${t}], the tensor should have ${a} values but has ${s}`);for(let i=0;i`Error creating a new Tensor. Inferred shape (${n}) does not match the provided shape (${t}). `)}}return!on(e)&&!Array.isArray(e)&&(e=[e]),t=t||n,e=r!=="string"?pd(e,r):ps(e,[],!0),$.makeTensor(e,t,r)}function _r(e,t,n){let r=Dr(e,n);return $a(e,t,r,n)}var Df={float32:4,float16:2,int32:4,uint16:2,uint8:1,bool:1,complex64:8},yd=4;async function p9(e,t){let n=[],r=[],a=Array.isArray(e)?e.map(i=>i.name):Object.keys(e);for(let i=0;i{let d=await l.bytes(),p=d.reduce((A,y)=>A+y.length,0)+yd*d.length,f=new Uint8Array(p),m=0;for(let A=0;A{if(t+=s.byteLength,n.push(s.byteLength===s.buffer.byteLength?s:new s.constructor(s)),!(s instanceof Float32Array||s instanceof Int32Array||s instanceof Uint8Array))throw new Error(`Unsupported TypedArray subtype: ${s.constructor.name}`)});let r=new Uint8Array(t),a=0;return n.forEach(s=>{r.set(new Uint8Array(s.buffer),a),a+=s.byteLength}),r.buffer}var Of=typeof Buffer!="undefined"&&(typeof Blob=="undefined"||typeof atob=="undefined"||typeof btoa=="undefined");function F5(e){return Of?Buffer.byteLength(e):new Blob([e]).size}function m9(e){if(Of)return Buffer.from(e).toString("base64");let t=new Uint8Array(e),n="";for(let r=0,a=t.length;r{t+=a.byteLength});let n=new Uint8Array(t),r=0;return e.forEach(a=>{n.set(new Uint8Array(a),r),r+=a.byteLength}),n.buffer}function M5(e){let t="/";for(e=e.trim();e.endsWith(t);)e=e.slice(0,e.length-1);let n=e.split(t);return n[n.length-1]}function Hu(e){if(e.modelTopology instanceof ArrayBuffer)throw new Error("Expected JSON model topology, received ArrayBuffer.");return{dateSaved:new Date,modelTopologyType:"JSON",modelTopologyBytes:e.modelTopology==null?0:F5(JSON.stringify(e.modelTopology)),weightSpecsBytes:e.weightSpecs==null?0:F5(JSON.stringify(e.weightSpecs)),weightDataBytes:e.weightData==null?0:e.weightData.byteLength}}function y9(){let e=n=>{let r=n<<13,a=0;for(;(r&8388608)==0;)a-=8388608,r<<=1;return r&=~8388608,a+=947912704,r|a},t=new Uint32Array(2048);t[0]=0;for(let n=1;n<1024;n++)t[n]=e(n);for(let n=1024;n<2048;n++)t[n]=939524096+(n-1024<<13);return t}function g9(){let e=new Uint32Array(64);e[0]=0,e[31]=1199570944,e[32]=2147483648,e[63]=3347054592;for(let t=1;t<31;t++)e[t]=t<<23;for(let t=33;t<63;t++)e[t]=2147483648+(t-32<<23);return e}function x9(){let e=new Uint32Array(64);for(let t=0;t<64;t++)e[t]=1024;return e[0]=e[32]=0,e}function f9(){let e=y9(),t=g9(),n=x9();return r=>{let a=new ArrayBuffer(4*r.length),s=new Uint32Array(a);for(let i=0;i>10]+(o&1023)]+t[o>>10];s[i]=l}return new Float32Array(a)}}var Ct=class{constructor(){this.saveRouters=[],this.loadRouters=[]}static getInstance(){return Ct.instance==null&&(Ct.instance=new Ct),Ct.instance}static registerSaveRouter(e){Ct.getInstance().saveRouters.push(e)}static registerLoadRouter(e){Ct.getInstance().loadRouters.push(e)}static getSaveHandlers(e){return Ct.getHandlers(e,"save")}static getLoadHandlers(e,t){return Ct.getHandlers(e,"load",t)}static getHandlers(e,t,n){let r=[];return(t==="load"?Ct.getInstance().loadRouters:Ct.getInstance().saveRouters).forEach(a=>{let s=a(e,n);s!==null&&r.push(s)}),r}},w9=e=>Ct.registerSaveRouter(e),b9=e=>Ct.registerLoadRouter(e),_9=e=>Ct.getSaveHandlers(e),v9=(e,t)=>Ct.getLoadHandlers(e,t),Pf="tensorflowjs",Lf=1,ci="models_store",Da="model_info_store";function $5(){if(!J().getBool("IS_BROWSER"))throw new Error("Failed to obtain IndexedDB factory because the current environmentis not a web browser.");let e=typeof window=="undefined"?self:window,t=e.indexedDB||e.mozIndexedDB||e.webkitIndexedDB||e.msIndexedDB||e.shimIndexedDB;if(t==null)throw new Error("The current browser does not appear to support IndexedDB.");return t}function Wf(e){let t=e.result;t.createObjectStore(ci,{keyPath:"modelPath"}),t.createObjectStore(Da,{keyPath:"modelPath"})}var hi=class{constructor(e){if(this.indexedDB=$5(),e==null||!e)throw new Error("For IndexedDB, modelPath must not be null, undefined or empty.");this.modelPath=e}async save(e){if(e.modelTopology instanceof ArrayBuffer)throw new Error("BrowserLocalStorage.save() does not support saving model topology in binary formats yet.");return this.databaseAction(this.modelPath,e)}async load(){return this.databaseAction(this.modelPath)}databaseAction(e,t){return new Promise((n,r)=>{let a=this.indexedDB.open(Pf,Lf);a.onupgradeneeded=()=>Wf(a),a.onsuccess=()=>{let s=a.result;if(t==null){let i=s.transaction(ci,"readonly"),o=i.objectStore(ci).get(this.modelPath);o.onsuccess=()=>{if(o.result==null)return s.close(),r(new Error(`Cannot find model with path '${this.modelPath}' in IndexedDB.`));n(o.result.modelArtifacts)},o.onerror=l=>(s.close(),r(o.error)),i.oncomplete=()=>s.close()}else{let i=Hu(t),o=s.transaction(Da,"readwrite"),l=o.objectStore(Da),c=l.put({modelPath:this.modelPath,modelArtifactsInfo:i}),u;c.onsuccess=()=>{u=s.transaction(ci,"readwrite");let h=u.objectStore(ci).put({modelPath:this.modelPath,modelArtifacts:t,modelArtifactsInfo:i});h.onsuccess=()=>n({modelArtifactsInfo:i}),h.onerror=d=>{l=o.objectStore(Da);let p=l.delete(this.modelPath);p.onsuccess=()=>(s.close(),r(h.error)),p.onerror=f=>(s.close(),r(h.error))}},c.onerror=h=>(s.close(),r(c.error)),o.oncomplete=()=>{u==null?s.close():u.oncomplete=()=>s.close()}}},a.onerror=s=>r(a.error)})}};hi.URL_SCHEME="indexeddb://";var D5=e=>J().getBool("IS_BROWSER")&&!Array.isArray(e)&&e.startsWith(hi.URL_SCHEME)?k9(e.slice(hi.URL_SCHEME.length)):null;Ct.registerSaveRouter(D5);Ct.registerLoadRouter(D5);function k9(e){return new hi(e)}function I9(e){return e.startsWith(hi.URL_SCHEME)?e.slice(hi.URL_SCHEME.length):e}var N9=class{constructor(){this.indexedDB=$5()}async listModels(){return new Promise((e,t)=>{let n=this.indexedDB.open(Pf,Lf);n.onupgradeneeded=()=>Wf(n),n.onsuccess=()=>{let r=n.result,a=r.transaction(Da,"readonly"),s=a.objectStore(Da).getAll();s.onsuccess=()=>{let i={};for(let o of s.result)i[o.modelPath]=o.modelArtifactsInfo;e(i)},s.onerror=i=>(r.close(),t(s.error)),a.oncomplete=()=>r.close()},n.onerror=r=>t(n.error)})}async removeModel(e){return e=I9(e),new Promise((t,n)=>{let r=this.indexedDB.open(Pf,Lf);r.onupgradeneeded=()=>Wf(r),r.onsuccess=()=>{let a=r.result,s=a.transaction(Da,"readwrite"),i=s.objectStore(Da),o=i.get(e),l;o.onsuccess=()=>{if(o.result==null)return a.close(),n(new Error(`Cannot find model with path '${e}' in IndexedDB.`));{let c=i.delete(e),u=()=>{l=a.transaction(ci,"readwrite");let h=l.objectStore(ci).delete(e);h.onsuccess=()=>t(o.result.modelArtifactsInfo),h.onerror=d=>n(o.error)};c.onsuccess=u,c.onerror=h=>(u(),a.close(),n(o.error))}},o.onerror=c=>(a.close(),n(o.error)),s.oncomplete=()=>{l==null?a.close():l.oncomplete=()=>a.close()}},r.onerror=a=>n(r.error)})}},sa="/",ll="tensorflowjs_models",O5="info",S9="model_topology",T9="weight_specs",E9="weight_data",C9="model_metadata";function z5(e){return{info:[ll,e,O5].join(sa),topology:[ll,e,S9].join(sa),weightSpecs:[ll,e,T9].join(sa),weightData:[ll,e,E9].join(sa),modelMetadata:[ll,e,C9].join(sa)}}function R9(e){let t=e.split(sa);if(t.length<3)throw new Error(`Invalid key format: ${e}`);return t.slice(1,t.length-1).join(sa)}function F9(e){return e.startsWith(di.URL_SCHEME)?e.slice(di.URL_SCHEME.length):e}var di=class{constructor(e){if(!J().getBool("IS_BROWSER")||typeof window=="undefined"||typeof window.localStorage=="undefined")throw new Error("The current environment does not support local storage.");if(this.LS=window.localStorage,e==null||!e)throw new Error("For local storage, modelPath must not be null, undefined or empty.");this.modelPath=e,this.keys=z5(this.modelPath)}async save(e){if(e.modelTopology instanceof ArrayBuffer)throw new Error("BrowserLocalStorage.save() does not support saving model topology in binary formats yet.");{let t=JSON.stringify(e.modelTopology),n=JSON.stringify(e.weightSpecs),r=Hu(e);try{this.LS.setItem(this.keys.info,JSON.stringify(r)),this.LS.setItem(this.keys.topology,t),this.LS.setItem(this.keys.weightSpecs,n),this.LS.setItem(this.keys.weightData,m9(e.weightData));let a={format:e.format,generatedBy:e.generatedBy,convertedBy:e.convertedBy};return e.signature!=null&&(a.signature=e.signature),e.userDefinedMetadata!=null&&(a.userDefinedMetadata=e.userDefinedMetadata),e.modelInitializer!=null&&(a.modelInitializer=e.modelInitializer),this.LS.setItem(this.keys.modelMetadata,JSON.stringify(a)),{modelArtifactsInfo:r}}catch(a){throw this.LS.removeItem(this.keys.info),this.LS.removeItem(this.keys.topology),this.LS.removeItem(this.keys.weightSpecs),this.LS.removeItem(this.keys.weightData),this.LS.removeItem(this.keys.modelMetadata),new Error(`Failed to save model '${this.modelPath}' to local storage: size quota being exceeded is a possible cause of this failure: modelTopologyBytes=${r.modelTopologyBytes}, weightSpecsBytes=${r.weightSpecsBytes}, weightDataBytes=${r.weightDataBytes}.`)}}}async load(){let e=JSON.parse(this.LS.getItem(this.keys.info));if(e==null)throw new Error(`In local storage, there is no model with name '${this.modelPath}'`);if(e.modelTopologyType!=="JSON")throw new Error("BrowserLocalStorage does not support loading non-JSON model topology yet.");let t={},n=JSON.parse(this.LS.getItem(this.keys.topology));if(n==null)throw new Error(`In local storage, the topology of model '${this.modelPath}' is missing.`);t.modelTopology=n;let r=JSON.parse(this.LS.getItem(this.keys.weightSpecs));if(r==null)throw new Error(`In local storage, the weight specs of model '${this.modelPath}' are missing.`);t.weightSpecs=r;let a=this.LS.getItem(this.keys.modelMetadata);if(a!=null){let i=JSON.parse(a);t.format=i.format,t.generatedBy=i.generatedBy,t.convertedBy=i.convertedBy,i.signature!=null&&(t.signature=i.signature),i.userDefinedMetadata!=null&&(t.userDefinedMetadata=i.userDefinedMetadata),i.modelInitializer!=null&&(t.modelInitializer=i.modelInitializer)}let s=this.LS.getItem(this.keys.weightData);if(s==null)throw new Error(`In local storage, the binary weight values of model '${this.modelPath}' are missing.`);return t.weightData=A9(s),t}};di.URL_SCHEME="localstorage://";var P5=e=>J().getBool("IS_BROWSER")&&!Array.isArray(e)&&e.startsWith(di.URL_SCHEME)?M9(e.slice(di.URL_SCHEME.length)):null;Ct.registerSaveRouter(P5);Ct.registerLoadRouter(P5);function M9(e){return new di(e)}var $9=class{constructor(){F(J().getBool("IS_BROWSER"),()=>"Current environment is not a web browser"),F(typeof window=="undefined"||typeof window.localStorage!="undefined",()=>"Current browser does not appear to support localStorage"),this.LS=window.localStorage}async listModels(){let e={},t=ll+sa,n=sa+O5;for(let r=0;r"scheme must not be undefined or null."),e.endsWith(ul)&&(e=e.slice(0,e.indexOf(ul))),F(e.length>0,()=>"scheme must not be an empty string.");let n=Kn.getInstance();F(n.managers[e]==null,()=>`A model store manager is already registered for scheme '${e}'.`),n.managers[e]=t}static getManager(e){let t=this.getInstance().managers[e];if(t==null)throw new Error(`Cannot find model manager for scheme '${e}'`);return t}static getSchemes(){return Object.keys(this.getInstance().managers)}};function gd(e){if(e.indexOf(ul)===-1)throw new Error(`The url string provided does not contain a scheme. Supported schemes are: ${Kn.getSchemes().join(",")}`);return{scheme:e.split(ul)[0],path:e.split(ul)[1]}}async function L5(e,t,n=!1){F(e!==t,()=>`Old path and new path are the same: '${e}'`);let r=Ct.getLoadHandlers(e);F(r.length>0,()=>`Copying failed because no load handler is found for source URL ${e}.`),F(r.length<2,()=>`Copying failed because more than one (${r.length}) load handlers for source URL ${e}.`);let a=r[0],s=Ct.getSaveHandlers(t);F(s.length>0,()=>`Copying failed because no save handler is found for destination URL ${t}.`),F(s.length<2,()=>`Copying failed because more than one (${r.length}) save handlers for destination URL ${t}.`);let i=s[0],o=gd(e).scheme,l=gd(e).path,c=o===gd(e).scheme,u=await a.load();n&&c&&await Kn.getManager(o).removeModel(l);let h=await i.save(u);return n&&!c&&await Kn.getManager(o).removeModel(l),h.modelArtifactsInfo}async function D9(){let e=Kn.getSchemes(),t={};for(let n of e){let r=await Kn.getManager(n).listModels();for(let a in r){let s=n+ul+a;t[s]=r[a]}}return t}async function O9(e){let t=gd(e);return Kn.getManager(t.scheme).removeModel(t.path)}async function z9(e,t){return L5(e,t,!1)}async function P9(e,t){return L5(e,t,!0)}var L9=class{fetch(e,t){return fetch(e,t)}now(){return performance.now()}encode(e,t){if(t!=="utf-8"&&t!=="utf8")throw new Error(`Browser's encoder only supports utf-8, but got ${t}`);return this.textEncoder==null&&(this.textEncoder=new TextEncoder),this.textEncoder.encode(e)}decode(e,t){return new TextDecoder(t).decode(e)}};if(J().get("IS_BROWSER")){J().setPlatform("browser",new L9);try{Kn.registerManager(di.URL_SCHEME,new $9)}catch(e){}try{Kn.registerManager(hi.URL_SCHEME,new N9)}catch(e){}}var W9={importFetch:()=>q8()},Bf,B9=class{constructor(){this.util=require("util"),this.textEncoder=new this.util.TextEncoder}fetch(e,t){return J().global.fetch!=null?J().global.fetch(e,t):(Bf==null&&(Bf=W9.importFetch()),Bf(e,t))}now(){let e=process.hrtime();return e[0]*1e3+e[1]/1e6}encode(e,t){if(t!=="utf-8"&&t!=="utf8")throw new Error(`Node built-in encoder only supports utf-8, but got ${t}`);return this.textEncoder.encode(e)}decode(e,t){return e.length===0?"":new this.util.TextDecoder(t).decode(e)}};J().get("IS_NODE")&&J().setPlatform("node",new B9);function Ve(e,t="float32",n){return t=t||"float32",bf(e),new Pt(e,t,n)}function V9(e,t){let n=C(e,"x","cast");if(!c5(t))throw new Error(`Failed to cast to unknown dtype ${t}`);if(t==="string"&&n.dtype!=="string"||t!=="string"&&n.dtype==="string")throw new Error("Only strings can be casted to strings");let r={x:n},a={dtype:t};return $.runKernel(gs,r,a)}var ge=D({cast_:V9});function U9(e){let t={x:C(e,"x","clone","string_or_numeric")};return $.runKernel(Rs,t)}var Or=D({clone_:U9});function W5(e,t=!1){console.log(e.toString(t))}N5();var j9={buffer:Ve,cast:ge,clone:Or,print:W5};n9(j9);var _n={};Le(_n,{browserFiles:()=>H9,browserHTTPRequest:()=>q9,concatenateArrayBuffers:()=>zf,copyModel:()=>z9,decodeWeights:()=>R5,encodeWeights:()=>p9,fromMemory:()=>X9,getLoadHandlers:()=>v9,getModelArtifactsInfoForJSON:()=>Hu,getSaveHandlers:()=>_9,http:()=>Uf,isHTTPScheme:()=>Vf,listModels:()=>D9,loadWeights:()=>G9,moveModel:()=>P9,registerLoadRouter:()=>b9,registerSaveRouter:()=>w9,removeModel:()=>O9,weightsLoaderFactory:()=>B5,withSaveHandler:()=>K9});var Z9="model",Y9=".json",J9=".weights.bin";function V5(e){return new Promise(t=>setTimeout(t)).then(e)}var cl=class{constructor(e){if(!J().getBool("IS_BROWSER"))throw new Error("browserDownloads() cannot proceed because the current environment is not a browser.");e.startsWith(cl.URL_SCHEME)&&(e=e.slice(cl.URL_SCHEME.length)),(e==null||e.length===0)&&(e=Z9),this.modelTopologyFileName=e+Y9,this.weightDataFileName=e+J9}async save(e){if(typeof document=="undefined")throw new Error("Browser downloads are not supported in this environment since `document` is not present");let t=window.URL.createObjectURL(new Blob([e.weightData],{type:"application/octet-stream"}));if(e.modelTopology instanceof ArrayBuffer)throw new Error("BrowserDownloads.save() does not support saving model topology in binary formats yet.");{let n=[{paths:["./"+this.weightDataFileName],weights:e.weightSpecs}],r={modelTopology:e.modelTopology,format:e.format,generatedBy:e.generatedBy,convertedBy:e.convertedBy,weightsManifest:n};e.signature!=null&&(r.signature=e.signature),e.userDefinedMetadata!=null&&(r.userDefinedMetadata=e.userDefinedMetadata),e.modelInitializer!=null&&(r.modelInitializer=e.modelInitializer);let a=window.URL.createObjectURL(new Blob([JSON.stringify(r)],{type:"application/json"})),s=this.jsonAnchor==null?document.createElement("a"):this.jsonAnchor;if(s.download=this.modelTopologyFileName,s.href=a,await V5(()=>s.dispatchEvent(new MouseEvent("click"))),e.weightData!=null){let i=this.weightDataAnchor==null?document.createElement("a"):this.weightDataAnchor;i.download=this.weightDataFileName,i.href=t,await V5(()=>i.dispatchEvent(new MouseEvent("click")))}return{modelArtifactsInfo:Hu(e)}}}};cl.URL_SCHEME="downloads://";var Q9=class{constructor(e){if(e==null||e.length<1)throw new Error(`When calling browserFiles, at least 1 file is required, but received ${e}`);this.files=e}async load(){let e=this.files[0],t=this.files.slice(1);return new Promise((n,r)=>{let a=new FileReader;a.onload=s=>{let i=JSON.parse(s.target.result),o=i.modelTopology;if(o==null){r(new Error(`modelTopology field is missing from file ${e.name}`));return}t.length===0&&n({modelTopology:o});let l=i.weightsManifest;if(l==null){r(new Error(`weightManifest field is missing from file ${e.name}`));return}let c;try{c=this.checkManifestAndWeightFiles(l,t)}catch(p){r(p);return}let u=[],h=[],d=[];l.forEach(p=>{p.paths.forEach(f=>{h.push(f),d.push(null)}),u.push(...p.weights)}),l.forEach(p=>{p.paths.forEach(f=>{let m=new FileReader;m.onload=A=>{let y=A.target.result,g=h.indexOf(f);if(d[g]=y,d.indexOf(null)===-1){let w={modelTopology:o,weightSpecs:u,weightData:zf(d),format:i.format,generatedBy:i.generatedBy,convertedBy:i.convertedBy};i.signature!=null&&(w.signature=i.signature),i.userDefinedMetadata!=null&&(w.userDefinedMetadata=i.userDefinedMetadata),i.modelInitializer!=null&&(w.modelInitializer=i.modelInitializer),n(w)}},m.onerror=A=>r(`Failed to weights data from file of path '${f}'.`),m.readAsArrayBuffer(c[f])})})},a.onerror=s=>r(`Failed to read model topology and weights manifest JSON from file '${e.name}'. BrowserFiles supports loading Keras-style tf.Model artifacts only.`),a.readAsText(e)})}checkManifestAndWeightFiles(e,t){let n=[],r=t.map(s=>M5(s.name)),a={};for(let s of e)s.paths.forEach(i=>{let o=M5(i);if(n.indexOf(o)!==-1)throw new Error(`Duplicate file basename found in weights manifest: '${o}'`);if(n.push(o),r.indexOf(o)===-1)throw new Error(`Weight file with basename '${o}' is not provided.`);a[i]=t[r.indexOf(o)]});if(n.length!==t.length)throw new Error(`Mismatch in the number of files in weights manifest (${n.length}) and the number of weight files provided (${t.length}).`);return a}},tI=e=>J().getBool("IS_BROWSER")&&!Array.isArray(e)&&e.startsWith(cl.URL_SCHEME)?eI(e.slice(cl.URL_SCHEME.length)):null;Ct.registerSaveRouter(tI);function eI(e="model"){return new cl(e)}function H9(e){return new Q9(e)}function U5(e,t,n,r){i(e),n=n==null?0:n,r=r==null?1:r,o(n,r);let a=0,s=l=>(l.then(c=>{let u=n+ ++a/e.length*(r-n);return t(u),c}),l);function i(l){F(l!=null&&Array.isArray(l)&&l.length>0,()=>"promises must be a none empty array")}function o(l,c){F(l>=0&&l<=1,()=>`Progress fraction must be in range [0, 1], but got startFraction ${l}`),F(c>=0&&c<=1,()=>`Progress fraction must be in range [0, 1], but got endFraction ${c}`),F(c>=l,()=>`startFraction must be no more than endFraction, but got startFraction ${l} and endFraction ${c}`)}return Promise.all(e.map(s))}async function j5(e,t){t==null&&(t={});let n=t.fetchFunc==null?J().platform.fetch:t.fetchFunc,r=e.map(c=>n(c,t.requestInit,{isBinary:!0})),a=0,s=.5,i=(t.onProgress==null?await Promise.all(r):await U5(r,t.onProgress,a,s)).map(c=>c.arrayBuffer()),o=.5,l=1;return t.onProgress==null?await Promise.all(i):await U5(i,t.onProgress,o,l)}async function G9(e,t="",n,r){return B5(a=>j5(a,{requestInit:r}))(e,t,n)}function B5(e){return async(t,n="",r)=>{let a=t.map(()=>!1),s={},i=r!=null?r.map(()=>!1):[],o=[];if(t.forEach((p,f)=>{let m=0;p.weights.forEach(A=>{let y="quantization"in A?A.quantization.dtype:A.dtype,g=Df[y]*zt(A.shape),w=()=>{a[f]=!0,s[f]==null&&(s[f]=[]),s[f].push({manifestEntry:A,groupOffset:m,sizeBytes:g})};r!=null?r.forEach((b,_)=>{b===A.name&&(w(),i[_]=!0)}):w(),o.push(A.name),m+=g})}),!i.every(p=>p)){let p=r.filter((f,m)=>!i[m]);throw new Error(`Could not find weights in manifest with names: ${p.join(", ")}. -Manifest JSON has weights with names: ${o.join(", ")}.`)}let l=a.reduce((p,f,m)=>(f&&p.push(m),p),[]),c=[];l.forEach(p=>{t[p].paths.forEach(f=>{let m=n+(n.endsWith("/")?"":"/")+f;c.push(m)})});let u=await e(c),h={},d=0;return l.forEach(p=>{let f=t[p].paths.length,m=0;for(let w=0;w{let b=A.slice(w.groupOffset,w.groupOffset+w.sizeBytes),_=R5(b,[w.manifestEntry]);for(let x in _)h[x]=_[x]}),d+=f}),h}}var nI="application/octet-stream",rI="application/json",jf=class{constructor(e,t){if(this.DEFAULT_METHOD="POST",t==null&&(t={}),this.weightPathPrefix=t.weightPathPrefix,this.onProgress=t.onProgress,this.weightUrlConverter=t.weightUrlConverter,t.fetchFunc!=null?(F(typeof t.fetchFunc=="function",()=>"Must pass a function that matches the signature of `fetch` (see https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API)"),this.fetch=t.fetchFunc):this.fetch=J().platform.fetch,F(e!=null&&e.length>0,()=>"URL path for http must not be null, undefined or empty."),Array.isArray(e)&&F(e.length===2,()=>`URL paths for http must have a length of 2, (actual length is ${e.length}).`),this.path=e,t.requestInit!=null&&t.requestInit.body!=null)throw new Error("requestInit is expected to have no pre-existing body, but has one.");this.requestInit=t.requestInit||{}}async save(e){if(e.modelTopology instanceof ArrayBuffer)throw new Error("BrowserHTTPRequest.save() does not support saving model topology in binary formats yet.");let t=Object.assign({method:this.DEFAULT_METHOD},this.requestInit);t.body=new FormData;let n=[{paths:["./model.weights.bin"],weights:e.weightSpecs}],r={modelTopology:e.modelTopology,format:e.format,generatedBy:e.generatedBy,convertedBy:e.convertedBy,weightsManifest:n};e.signature!=null&&(r.signature=e.signature),e.userDefinedMetadata!=null&&(r.userDefinedMetadata=e.userDefinedMetadata),e.modelInitializer!=null&&(r.modelInitializer=e.modelInitializer),t.body.append("model.json",new Blob([JSON.stringify(r)],{type:rI}),"model.json"),e.weightData!=null&&t.body.append("model.weights.bin",new Blob([e.weightData],{type:nI}),"model.weights.bin");let a=await this.fetch(this.path,t);if(a.ok)return{modelArtifactsInfo:Hu(e),responses:[a]};throw new Error(`BrowserHTTPRequest.save() failed due to HTTP response status ${a.status}.`)}async load(){let e=await this.fetch(this.path,this.requestInit);if(!e.ok)throw new Error(`Request to ${this.path} failed with status code ${e.status}. Please verify this URL points to the model JSON of the model to load.`);let t;try{t=await e.json()}catch(p){let f=`Failed to parse model JSON of response from ${this.path}.`;throw this.path.endsWith(".pb")?f+=" Your path contains a .pb file extension. Support for .pb models have been removed in TensorFlow.js 1.0 in favor of .json models. You can re-convert your Python TensorFlow model using the TensorFlow.js 1.0 conversion scripts or you can convert your.pb models with the 'pb2json'NPM script in the tensorflow/tfjs-converter repository.":f+=" Please make sure the server is serving valid JSON for this request.",new Error(f)}let n=t.modelTopology,r=t.weightsManifest,a=t.generatedBy,s=t.convertedBy,i=t.format,o=t.signature,l=t.userDefinedMetadata;if(n==null&&r==null)throw new Error(`The JSON from HTTP path ${this.path} contains neither model topology or manifest for weights.`);let c,u;r!=null&&([c,u]=await this.loadWeights(r));let h={modelTopology:n,weightSpecs:c,weightData:u,generatedBy:a,convertedBy:s,format:i};o!=null&&(h.signature=o),l!=null&&(h.userDefinedMetadata=l);let d=t.modelInitializer;return d&&(h.modelInitializer=d),h}async loadWeights(e){let t=Array.isArray(this.path)?this.path[1]:this.path,[n,r]=aI(t),a=this.weightPathPrefix||n,s=[];for(let c of e)s.push(...c.weights);let i=[],o=[];for(let c of e)for(let u of c.paths)this.weightUrlConverter!=null?o.push(this.weightUrlConverter(u)):i.push(a+u+r);this.weightUrlConverter&&i.push(...await Promise.all(o));let l=await j5(i,{requestInit:this.requestInit,fetchFunc:this.fetch,onProgress:this.onProgress});return[s,zf(l)]}};jf.URL_SCHEME_REGEX=/^https?:\/\//;function aI(e){let t=e.lastIndexOf("/"),n=e.lastIndexOf("?"),r=e.substring(0,t),a=n>t?e.substring(n):"";return[r+"/",a]}function Vf(e){return e.match(jf.URL_SCHEME_REGEX)!=null}var H5=(e,t)=>{if(typeof fetch=="undefined"&&(t==null||t.fetchFunc==null))return null;{let n=!0;if(Array.isArray(e)?n=e.every(r=>Vf(r)):n=Vf(e),n)return Uf(e,t)}return null};Ct.registerSaveRouter(H5);Ct.registerLoadRouter(H5);function Uf(e,t){return new jf(e,t)}function q9(e,t){return Uf(e,t)}var Hf=class{constructor(e){this.modelArtifacts=e}async load(){return this.modelArtifacts}},sI=class{constructor(e){this.saveHandler=e}async save(e){return this.saveHandler(e)}};function X9(e,t,n,r){return arguments.length===1?e.modelTopology!=null||e.weightSpecs!=null?new Hf(e):(console.warn("Please call tf.io.fromMemory() with only one argument. The argument should be of type ModelArtifacts. The multi-argument signature of tf.io.fromMemory() has been deprecated and will be removed in a future release."),new Hf({modelTopology:e})):(console.warn("Please call tf.io.fromMemory() with only one argument. The argument should be of type ModelArtifacts. The multi-argument signature of tf.io.fromMemory() has been deprecated and will be removed in a future release."),new Hf({modelTopology:e,weightSpecs:t,weightData:n,trainingConfig:r}))}function K9(e){return new sI(e)}var G5={};Le(G5,{confusionMatrix:()=>iI});function oI(e,t,n=!1,r=!1){let a=C(e,"a","matMul"),s=C(t,"b","matMul");[a,s]=It(a,s);let i={a,b:s},o={transposeA:n,transposeB:r};return $.runKernel(ys,i,o)}var Ke=D({matMul_:oI});function lI(e,t,n=1,r=0){if(t<2)throw new Error(`Error in oneHot: depth must be >=2, but it is ${t}`);let a={indices:C(e,"indices","oneHot","int32")},s={depth:t,onValue:n,offValue:r};return $.runKernel(Bs,a,s)}var hl=D({oneHot_:lI});function uI(e,t){let n=C(e,"x","transpose");if(t==null&&(t=n.shape.map((s,i)=>i).reverse()),F(n.rank===t.length,()=>`Error in transpose: rank of input ${n.rank} must match length of perm ${t}.`),t.forEach(s=>{F(s>=0&&s`All entries in 'perm' must be between 0 and ${n.rank-1} but got ${t}`)}),n.rank<=1)return n.clone();let r={x:n},a={perm:t};return $.runKernel(si,r,a)}var st=D({transpose_:uI});function cI(e,t,n){let r=C(e,"labels","confusionMatrix"),a=C(t,"predictions","confusionMatrix");F(n==null||n>0&&Number.isInteger(n),()=>`If provided, numClasses must be a positive integer, but got ${n}`),F(r.rank===1,()=>`Expected the rank of labels to be 1, but got ${r.rank}`),F(a.rank===1,()=>`Expected the rank of predictions to be 1, but got ${a.rank}`),F(r.shape[0]===a.shape[0],()=>`Mismatch in the number of examples: ${r.shape[0]} vs. ${a.shape[0]}. Labels and predictions should have the same number of elements.`),F(n>0&&Number.isInteger(n),()=>`numClasses is required to be a positive integer, but got ${n}`);let s=hl(ge(r,"int32"),n),i=hl(ge(a,"int32"),n),o=st(s),l=Ke(o,i);return ge(l,"int32")}var iI=D({confusionMatrix_:cI}),dl={};Le(dl,{fromPixels:()=>pI,fromPixelsAsync:()=>hI,toPixels:()=>dI});function xd(e,t,n){if(ds(e),t!=null&&t.length!==3)throw new Error("tensor3d() requires shape to have three numbers");let r=Dr(e,n);if(r.length!==3&&r.length!==1)throw new Error("tensor3d() requires values to be number[][][] or flat/TypedArray");if(r.length===1&&t==null)throw new Error("tensor3d() requires shape to be provided when `values` are a flat array");return $a(e,t,r,n)}var pl;function q5(e,t=3){if(t>4)throw new Error("Cannot construct Tensor with more than 4 channels from pixels.");if(e==null)throw new Error("pixels passed to tf.browser.fromPixels() can not be null");let n=!1,r=!1,a=!1,s=!1,i=!1,o=!1;if(e.data instanceof Uint8Array)n=!0;else if(typeof ImageData!="undefined"&&e instanceof ImageData)r=!0;else if(typeof HTMLVideoElement!="undefined"&&e instanceof HTMLVideoElement)a=!0;else if(typeof HTMLImageElement!="undefined"&&e instanceof HTMLImageElement)s=!0;else if(e.getContext!=null)i=!0;else if(typeof ImageBitmap!="undefined"&&e instanceof ImageBitmap)o=!0;else throw new Error(`pixels passed to tf.browser.fromPixels() must be either an HTMLVideoElement, HTMLImageElement, HTMLCanvasElement, ImageData in browser, or OffscreenCanvas, ImageData in webworker or {data: Uint32Array, width: number, height: number}, but was ${e.constructor.name}`);if(a){let d=2;if(a&&e.readyState element.")}if(dd(hd,$.backendName)!=null){let d={pixels:e},p={numChannels:t};return $.runKernel(hd,d,p)}let[l,c]=a?[e.videoWidth,e.videoHeight]:[e.width,e.height],u;i?u=e.getContext("2d").getImageData(0,0,l,c).data:r||n?u=e.data:(s||a||o)&&(pl==null&&(pl=document.createElement("canvas").getContext("2d")),pl.canvas.width=l,pl.canvas.height=c,pl.drawImage(e,0,0,l,c),u=pl.getImageData(0,0,l,c).data);let h;if(t===4)h=new Int32Array(u);else{let d=l*c;h=new Int32Array(d*t);for(let p=0;p4||s===2)throw new Error(`toPixels only supports depth of size 1, 3 or 4 but got ${s}`);if(n.dtype!=="float32"&&n.dtype!=="int32")throw new Error(`Unsupported type for toPixels: ${n.dtype}. Please use float32 or int32 tensors.`);let i=await n.data(),o=n.dtype==="float32"?255:1,l=new Uint8ClampedArray(a*r*4);for(let c=0;c1)throw new Error(`Tensor values for a float32 Tensor must be in the range [0 - 1] but encountered ${p}.`)}else if(n.dtype==="int32"&&(p<0||p>255))throw new Error(`Tensor values for a int32 Tensor must be in the range [0 - 255] but encountered ${p}.`);s===1?(u[0]=p*o,u[1]=p*o,u[2]=p*o):u[d]=p*o}let h=c*4;l[h+0]=Math.round(u[0]),l[h+1]=Math.round(u[1]),l[h+2]=Math.round(u[2]),l[h+3]=Math.round(u[3])}if(t!=null){t.width=a,t.height=r;let c=t.getContext("2d"),u=new ImageData(l,a,r);c.putImageData(u,0,0)}return n!==e&&n.dispose(),l}var pI=D({fromPixels_:q5}),Gf={};Le(Gf,{prepareAndValidate:()=>X5});function X5(e,t){let n=e.shape.length,r=t.shape.length;if(n<1)throw new Error(`tf.gatherND() expects the input to be rank 1 or higher, but the rank was ${n}.`);if(r<1)throw new Error(`tf.gatherND() expects the indices to be rank 1 or higher, but the rank was ${r}.`);if(t.dtype!=="int32")throw new Error(`tf.gatherND() expects the indices to be int32 type, but the dtype was ${t.dtype}.`);if(t.shape[r-1]>n)throw new Error(`index innermost dimension length must be <= tensor rank; saw: ${t.shape[r-1]} vs. ${n}`);if(zt(e.shape)===0)throw new Error(`Requested more than 0 entries, but input is empty. Input shape: ${e.shape}.`);let a=t.shape,s=a[a.length-1],i=1;for(let h=0;hh/c),1].slice(0,s);return[l,i,c,u]}var qf={};Le(qf,{calculateShapes:()=>K5,validateInput:()=>Kf,validateUpdateShape:()=>Xf});function Xf(e,t,n){let r=t.rank>1?t.shape[t.rank-1]:1,a=t.rank>1?t.rank-1:1,s=`Must have updates.shape = indices.shape[:batchDim] + shape[sliceDim:], got updates.shape: ${n.shape}, indices.shape: ${t.shape}, shape: ${e}, sliceDim: ${r}, and batchDim: ${a}.`;if(n.rank1?t.shape[r-1]:1,s=n.length,i=1;for(let h=a;hgI,computeFlatOffset:()=>wI,computeOutShape:()=>Z5,getNormalizedAxes:()=>J5,isSliceContinous:()=>xI,maskToAxes:()=>wd,parseSliceParams:()=>ax,sliceInfo:()=>bI,startForAxis:()=>nx,startIndicesWithElidedDims:()=>Q5,stopForAxis:()=>rx,stopIndicesWithElidedDims:()=>ex,stridesForAxis:()=>tx,stridesWithElidedDims:()=>Y5});function gI(e,t,n){let r=e.shape.length;F(r===t.length,()=>`Error in slice${r}D: Length of begin ${t} must match the rank of the array (${r}).`),F(r===n.length,()=>`Error in slice${r}D: Length of size ${n} must match the rank of the array (${r}).`);for(let a=0;a`Error in slice${r}D: begin[${a}] + size[${a}] (${t[a]+n[a]}) would overflow input.shape[${a}] (${e.shape[a]})`)}function wd(e){let t=[],n=0;for(;e>0;)e&1&&t.push(n),e/=2,n++;return t}function Z5(e,t,n){let r=[];for(let a=0;a0){let p=t[0],f=n+1;u=Q5(i,p,f,r,e),h=ex(o,p,f,a,e),d=Y5(s,p,f,e)}else for(let p=0;p-1)s[o]=0;else{let l=sx(t,n,o),c=r[l];e&1<-1)s[o]=Number.MAX_SAFE_INTEGER;else{let l=sx(t,n,o),c=r[l];e&1<0?i=Number.MIN_SAFE_INTEGER:i=Number.MAX_SAFE_INTEGER);let l=r[a];return i<0&&(i+=l),i=Au(0,i,l-1),i}function rx(e,t,n,r,a,s){let i=t[a],o=n[a]||1;(e&1<0?i=Number.MAX_SAFE_INTEGER:i=Number.MIN_SAFE_INTEGER);let l=r[a];return i<0&&(i+=l),o>0?i=Au(0,i,l):i=Au(-1,i,l-1),i}function xI(e,t,n){let r=n.length;for(let a=0;a1){r=a;break}for(let a=r+1;a0||n[a]!==e[a])return!1;return!0}function wI(e,t){let n=e.length>0?e[e.length-1]:1;for(let r=0;r{F(i!==-1,()=>"slice() does not support negative begin indexing.")});let s;return n==null?s=new Array(a).fill(-1):typeof n=="number"?s=[n,...new Array(a-1).fill(-1)]:n.lengthi>=0?i:(F(i===-1,()=>`Negative size values should be exactly -1 but got ${i} for the slice() size at index ${o}.`),e.shape[o]-r[o])),[r,s]}function bI(e,t,n,r,a,s,i,o,l){let c=t.slice(),u=n.slice(),h=r;r==null&&(h=new Array(c.length));let d=wd(i);if(d.length>1)throw new Error("Multiple ellipses in slice is not allowed.");if(i!==0&&o!==0)throw new Error("Using both ellipsisMask and newAxisMask is not yet supported.");if(i!==0&&l!==0)throw new Error("Using both ellipsisMask and shrinkAxisMask is not yet supported.");let p=e.length-c.length,f=wd(o),m=e.slice();f.forEach(x=>{c[x]=0,u[x]=1,m.splice(x,0,1)});let{begin:A,end:y,strides:g}=J5(m,d,p,c,u,h,a,s,i);c=A,u=y,h=g;let w=wd(l);w.forEach(x=>{u[x]=c[x]+1,h[x]=1});let b=Z5(c,u,h),_=b.filter((x,N)=>w.indexOf(N)===-1);return{nonStrided:h.every(x=>x===1),$begin:c,$end:u,$strides:h,size:b,newShape:m,outShape:_}}var ae={};Le(ae,{Serializable:()=>ox,SerializationMap:()=>pi,registerClass:()=>Oa});var ox=class{getClassName(){return this.constructor.className}static fromConfig(e,t){return new e(t)}},pi=class{constructor(){this.classNameMap={}}static getMap(){return pi.instance==null&&(pi.instance=new pi),pi.instance}static register(e){pi.getMap().classNameMap[e.className]=[e,e.fromConfig]}};function Oa(e){F(e.className!=null,()=>"Class being registered does not have the static className property defined."),F(typeof e.className=="string",()=>"className is required to be a string, but got type "+typeof e.className),F(e.className.length>0,()=>"Class being registered has an empty-string as its className, which is disallowed."),pi.register(e)}var lx={};Le(lx,{TEST_EPSILON_FLOAT16:()=>ux,encodeStrings:()=>cx,expectArrayBuffersEqual:()=>SI,expectArraysClose:()=>_I,expectArraysEqual:()=>kI,expectNumbersClose:()=>II,expectPromiseToFail:()=>vI,expectValuesInRange:()=>NI,testEpsilon:()=>Zf});var TI=.001,ux=.1;function _I(e,t,n){return n==null&&(n=Zf()),Yf(e,t,(r,a)=>Jf(r,a,n))}function Zf(){return $.backend.floatPrecision()===32?TI:ux}function Yf(e,t,n){let r=!0;if((on(e)||on(t))&&(r=!1),on(e)&&on(t)&&(r=!0),r){let i=e.constructor.name,o=t.constructor.name;if(i!==o)throw new Error(`Arrays are of different type. Actual: ${i}. Expected: ${o}`)}if(Array.isArray(e)&&Array.isArray(t)){let i=Dr(e),o=Dr(t);if(!aa(i,o))throw new Error(`Arrays have different shapes. Actual: [${i}]. Expected: [${o}]`)}let a=on(e)?e:ps(e),s=on(t)?t:ps(t);if(a.length!==s.length)throw new Error(`Arrays have different lengths actual: ${a.length} vs expected: ${s.length}. -Actual: ${a}. -Expected: ${s}.`);for(let i=0;it.fail(),()=>t())}function kI(e,t){let n=typeof t=="string"||typeof t=="number"||typeof t=="boolean"?[t]:t;return Sa(e)||Sa(e[0])||Sa(t)||Sa(t[0])?Yf(e,n,(r,a)=>r==a):Yf(e,t,(r,a)=>Jf(r,a,0))}function II(e,t,n){if(n==null&&(n=Zf()),!Jf(e,t,n))throw new Error(`Numbers differ: actual === ${e}, expected === ${t}`)}function Jf(e,t,n){return!isFinite(e)&&!isFinite(t)?!0:!(isNaN(e)||isNaN(t)||Math.abs(e-t)>n)}function NI(e,t,n){for(let r=0;rn)throw new Error(`Value out of range:${e[r]} low: ${t}, high: ${n}`)}function SI(e,t){expect(new Float32Array(e)).toEqual(new Float32Array(t))}function cx(e){for(let t=0;tt.dispose())}function qt(e){return $.keep(e)}function $I(e){return $.time(e)}function DI(e){return $.setBackend(e)}function OI(){return $.ready()}function zI(){return $.backendName}function PI(e){$.removeBackend(e)}function em(e){return $.findBackend(e)}function LI(e){return $.findBackendFactory(e)}function fl(e,t,n=1){return $.registerBackend(e,t,n)}function hx(){return $.backend}function WI(e,t){J().setPlatform(e,t)}function BI(e,t){let n=C(e,"a","add"),r=C(t,"b","add");[n,r]=It(n,r);let a={a:n,b:r};return $.runKernel(Ea,a)}var ie=D({add_:BI});function VI(e,t){let n=C(e,"a","floorDiv"),r=C(t,"b","floorDiv");[n,r]=It(n,r);let a={a:n,b:r};return $.runKernel(Ts,a)}var _d=D({floorDiv_:VI});function UI(e,t){let n=C(e,"a","div"),r=C(t,"b","div");if([n,r]=It(n,r),n.dtype==="int32"&&r.dtype==="int32")return _d(n,r);let a={a:n,b:r},s={};return $.runKernel(Is,a,s)}var be=D({div_:UI});function jI(e,t){let n=C(e,"a","mul"),r=C(t,"b","mul");[n,r]=It(n,r);let a={a:n,b:r};return $.runKernel(Ws,a)}var P=D({mul_:jI});function HI(e){let t=C(e,"x","abs");if(t.dtype==="complex64"){let n={x:t};return $.runKernel(bu,n)}else{let n={x:t};return $.runKernel(so,n)}}var Lt=D({abs_:HI});function GI(e){let t={x:C(e,"x","acos")};return $.runKernel(io,t)}var tm=D({acos_:GI});function qI(e){let t={x:C(e,"x","acosh")};return $.runKernel(oo,t)}var nm=D({acosh_:qI});function XI(e){F(Array.isArray(e),()=>"The argument passed to tf.addN() must be a list of tensors"),F(e.length>=1,()=>`Must pass at least one tensor to tf.addN(), but got ${e.length}`);let t=e.map((a,s)=>C(a,`tensors${s}`,"addN")),n=t[0];t.forEach(a=>{if(a.dtype!==n.dtype)throw new Error("All tensors passed to tf.addN() must have the same dtype")}),t.forEach(a=>{if(!aa(a.shape,n.shape))throw new Error("All tensors passed to tf.addN() must have the same shape")});let r=t;return $.runKernel(fs,r)}var za=D({addN_:XI});function KI(e,t=null,n=!1){let r={x:C(e,"x","all","bool")},a={axis:t,keepDims:n};return $.runKernel($h,r,a)}var vd=D({all_:KI});function ZI(e,t=null,n=!1){let r={x:C(e,"x","any","bool")},a={axis:t,keepDims:n};return $.runKernel(Dh,r,a)}var Gu=D({any_:ZI});function YI(e,t=0){let n={x:C(e,"x","argMax")},r={axis:t};return $.runKernel(ms,n,r)}var qu=D({argMax_:YI});function JI(e,t=0){let n={x:C(e,"x","argMin")},r={axis:t};return $.runKernel(gu,n,r)}var rm=D({argMin_:JI});function QI(e){let t={x:C(e,"x","asin")};return $.runKernel(lo,t)}var am=D({asin_:QI});function eN(e){let t={x:C(e,"x","asinh")};return $.runKernel(uo,t)}var sm=D({asinh_:eN});function tN(e){let t={x:C(e,"x","atan")};return $.runKernel(co,t)}var im=D({atan_:tN});function nN(e,t){let n=C(e,"a","atan2"),r=C(t,"b","atan2");[n,r]=It(n,r);let a={a:n,b:r};return $.runKernel(po,a)}var om=D({atan2_:nN});function rN(e){let t={x:C(e,"x","atanh")};return $.runKernel(ho,t)}var lm=D({atanh_:rN});function aN(e,t,n,r,a="NHWC",s){let i=e[3],o=[...t,i],l=dx(a);return Xu(e,o,n,s,r,null,null,l)}function px(e,t,n,r,a,s,i="channelsLast"){let[o,l]=kd(t),c;if(i==="channelsLast")c=[o,l,e[3],e[3]];else if(i==="channelsFirst")c=[o,l,e[1],e[1]];else throw new Error(`Unknown dataFormat ${i}`);return Xu(e,c,n,r,a,s,!1,i)}function sN(e,t,n,r,a,s,i="NDHWC"){let[o,l,c]=um(t),u,h;if(i==="NDHWC")h="channelsLast",u=[o,l,c,e[4],e[4]];else if(i==="NCDHW")h="channelsFirst",u=[o,l,c,e[1],e[1]];else throw new Error(`Unknown dataFormat ${i}`);return fx(e,u,n,r,a,!1,h,s)}function Xu(e,t,n,r,a,s,i=!1,o="channelsLast"){let[l,c,u,h]=[-1,-1,-1,-1];if(o==="channelsLast")[l,c,u,h]=e;else if(o==="channelsFirst")[l,h,c,u]=e;else throw new Error(`Unknown dataFormat ${o}`);let[d,p,,f]=t,[m,A]=kd(n),[y,g]=kd(r),w=ml(d,y),b=ml(p,g),{padInfo:_,outHeight:x,outWidth:N}=iN(a,c,u,m,A,w,b,s,o),T=i?f*h:f,E;return o==="channelsFirst"?E=[l,T,x,N]:o==="channelsLast"&&(E=[l,x,N,T]),{batchSize:l,dataFormat:o,inHeight:c,inWidth:u,inChannels:h,outHeight:x,outWidth:N,outChannels:T,padInfo:_,strideHeight:m,strideWidth:A,filterHeight:d,filterWidth:p,effectiveFilterHeight:w,effectiveFilterWidth:b,dilationHeight:y,dilationWidth:g,inShape:e,outShape:E,filterShape:t}}function fx(e,t,n,r,a,s=!1,i="channelsLast",o){let[l,c,u,h,d]=[-1,-1,-1,-1,-1];if(i==="channelsLast")[l,c,u,h,d]=e;else if(i==="channelsFirst")[l,d,c,u,h]=e;else throw new Error(`Unknown dataFormat ${i}`);let[p,f,m,,A]=t,[y,g,w]=um(n),[b,_,x]=um(r),N=ml(p,b),T=ml(f,_),E=ml(m,x),{padInfo:M,outDepth:O,outHeight:W,outWidth:V}=oN(a,c,u,h,y,g,w,N,T,E,o),U=s?A*d:A,j;return i==="channelsFirst"?j=[l,U,O,W,V]:i==="channelsLast"&&(j=[l,O,W,V,U]),{batchSize:l,dataFormat:i,inDepth:c,inHeight:u,inWidth:h,inChannels:d,outDepth:O,outHeight:W,outWidth:V,outChannels:U,padInfo:M,strideDepth:y,strideHeight:g,strideWidth:w,filterDepth:p,filterHeight:f,filterWidth:m,effectiveFilterDepth:N,effectiveFilterHeight:T,effectiveFilterWidth:E,dilationDepth:b,dilationHeight:_,dilationWidth:x,inShape:e,outShape:j,filterShape:t}}function lN(e,t,n,r,a){r==null&&(r=cm(e,t,n));let s=e[0],i=e[1],o=fi((s-t+2*r)/n+1,a),l=fi((i-t+2*r)/n+1,a);return[o,l]}function uN(e,t,n,r,a,s){a==null&&(a=cm(e,t,r));let i=e[0],o=e[1],l=e[2],c=fi((i-t+2*a)/r+1,s),u=fi((o-t+2*a)/r+1,s),h=fi((l-t+2*a)/r+1,s);return[c,u,h,n]}function cm(e,t,n,r=1){let a=ml(t,r);return Math.floor((e[0]*(n-1)-n+a)/2)}function kd(e){return typeof e=="number"?[e,e,e]:e.length===2?[e[0],e[1],1]:e}function um(e){return typeof e=="number"?[e,e,e]:e}function ml(e,t){return t<=1?e:e+(e-1)*(t-1)}function iN(e,t,n,r,a,s,i,o,l){let c,u,h;if(typeof e=="number"){c={top:e,bottom:e,left:e,right:e,type:e===0?"VALID":"NUMBER"};let d=lN([t,n],s,r,e,o);u=d[0],h=d[1]}else if(e==="same"){u=Math.ceil(t/r),h=Math.ceil(n/a);let d=Math.max(0,(u-1)*r+s-t),p=Math.max(0,(h-1)*a+i-n),f=Math.floor(d/2),m=d-f,A=Math.floor(p/2),y=p-A;c={top:f,bottom:m,left:A,right:y,type:"SAME"}}else if(e==="valid")c={top:0,bottom:0,left:0,right:0,type:"VALID"},u=Math.ceil((t-s+1)/r),h=Math.ceil((n-i+1)/a);else if(typeof e=="object"){let d=l==="channelsLast"?e[1][0]:e[2][0],p=l==="channelsLast"?e[1][1]:e[2][1],f=l==="channelsLast"?e[2][0]:e[3][0],m=l==="channelsLast"?e[2][1]:e[3][1];c={top:d,bottom:p,left:f,right:m,type:d===0&&p===0&&f===0&&m===0?"VALID":"EXPLICIT"},u=fi((t-s+d+p)/r+1,o),h=fi((n-i+f+m)/a+1,o)}else throw Error(`Unknown padding parameter: ${e}`);return{padInfo:c,outHeight:u,outWidth:h}}function oN(e,t,n,r,a,s,i,o,l,c,u){let h,d,p,f;if(typeof e=="number"){h={top:e,bottom:e,left:e,right:e,front:e,back:e,type:e===0?"VALID":"NUMBER"};let m=uN([t,n,r,1],o,1,a,e,u);d=m[0],p=m[1],f=m[2]}else if(e==="same"){d=Math.ceil(t/a),p=Math.ceil(n/s),f=Math.ceil(r/i);let m=(d-1)*a+o-t,A=(p-1)*s+l-n,y=(f-1)*i+c-r,g=Math.floor(m/2),w=m-g,b=Math.floor(A/2),_=A-b,x=Math.floor(y/2),N=y-x;h={top:b,bottom:_,left:x,right:N,front:g,back:w,type:"SAME"}}else if(e==="valid")h={top:0,bottom:0,left:0,right:0,front:0,back:0,type:"VALID"},d=Math.ceil((t-o+1)/a),p=Math.ceil((n-l+1)/s),f=Math.ceil((r-c+1)/i);else throw Error(`Unknown padding parameter: ${e}`);return{padInfo:h,outDepth:d,outHeight:p,outWidth:f}}function fi(e,t){if(!t)return Math.trunc(e);switch(t){case"round":return Math.round(e);case"ceil":return Math.ceil(e);case"floor":return Math.floor(e);default:throw new Error(`Unknown roundingMode ${t}`)}}function Pa(e){let[t,n,r]=kd(e);return t===1&&n===1&&r===1}function Pr(e,t){return Pa(e)||Pa(t)}function dx(e){if(e==="NHWC")return"channelsLast";if(e==="NCHW")return"channelsFirst";throw new Error(`Unknown dataFormat ${e}`)}function cN(e,t){let n={x:C(e,"x","reshape","string_or_numeric")},r={shape:t};return $.runKernel(jo,n,r)}var H=D({reshape_:cN});function hN(e,t,n,r,a){let s=C(e,"x","avgPool","float32"),i=1;F(Pr(n,i),()=>`Error in avgPool: Either strides or dilations must be 1. Got strides ${n} and dilations '${i}'`);let o=s,l=!1;s.rank===3&&(l=!0,o=H(s,[1,s.shape[0],s.shape[1],s.shape[2]])),F(o.rank===4,()=>`Error in avgPool: x must be rank 4 but got rank ${o.rank}.`),a!=null&&F(Gt(r),()=>`Error in avgPool: pad must be an integer when using, dimRoundingMode ${a} but got pad ${r}.`);let c={x:o},u={filterSize:t,strides:n,pad:r,dimRoundingMode:a},h=$.runKernel(As,c,u);return h=ge(h,s.dtype),l?H(h,[h.shape[1],h.shape[2],h.shape[3]]):h}var Ku=D({avgPool_:hN});function dN(e,t,n,r,a,s="NDHWC"){let i=C(e,"x","avgPool3d","float32"),o=i,l=!1;i.rank===4&&(l=!0,o=H(i,[1,i.shape[0],i.shape[1],i.shape[2],i.shape[3]])),F(o.rank===5,()=>`Error in avgPool3d: x must be rank 5 but got rank ${o.rank}.`),F(s==="NDHWC",()=>`Error in avgPool3d: Only NDHWC is currently supported, but got dataFormat of ${s}`),a!=null&&F(Gt(r),()=>`Error in avgPool3d: pad must be an integer when using, dimRoundingMode ${a} but got pad ${r}.`);let c={x:o},u={filterSize:t,strides:n,pad:r,dimRoundingMode:a,dataFormat:s},h=$.runKernel(xu,c,u);return h=ge(h,o.dtype),l?H(h,[h.shape[1],h.shape[2],h.shape[3],h.shape[4]]):h}var hm=D({avgPool3d_:dN});function pN(e,t=0){F(e.length>=1,()=>"Pass at least one tensor to concat");let n=ju(e,"tensors","concat","string_or_numeric");if(n[0].dtype==="complex64"&&n.forEach(s=>{if(s.dtype!=="complex64")throw new Error(`Cannot concatenate complex64 tensors with a tensor - with dtype ${s.dtype}. `)}),n.length===1)return Or(n[0]);let r=n,a={axis:t};return $.runKernel(fo,r,a)}var it=D({concat_:pN});function fN(e){let t={x:C(e,"x","sigmoid")};return $.runKernel(Js,t)}var $n=D({sigmoid_:fN});function mN(e,t,n){let r=C(e,"x","slice","string_or_numeric");if(r.rank===0)throw new Error("Slicing scalar is not possible");let a={x:r},s={begin:t,size:n};return $.runKernel(Xo,a,s)}var Me=D({slice_:mN});function AN(e){let t={x:C(e,"x","tanh")};return $.runKernel(ai,t)}var Al=D({tanh_:AN});function yN(e,t,n,r,a,s){let i=C(e,"forgetBias","basicLSTMCell"),o=C(t,"lstmKernel","basicLSTMCell"),l=C(n,"lstmBias","basicLSTMCell"),c=C(r,"data","basicLSTMCell"),u=C(a,"c","basicLSTMCell"),h=C(s,"h","basicLSTMCell"),d=it([c,h],1),p=Ke(d,o),f=ie(p,l),m=f.shape[0],A=f.shape[1]/4,y=[m,A],g=Me(f,[0,0],y),w=Me(f,[0,A],y),b=Me(f,[0,A*2],y),_=Me(f,[0,A*3],y),x=ie(P($n(g),Al(w)),P(u,$n(ie(i,b)))),N=P(Al(x),$n(_));return[x,N]}var gN=D({basicLSTMCell_:yN});function xN(e,t,n){let r=C(e,"x","batchToSpaceND"),a=t.reduce((o,l)=>o*l);F(r.rank>=1+t.length,()=>`input rank is ${r.rank} but should be > than blockShape.length ${t.length}`),F(n.length===t.length,()=>`crops.length is ${n.length} but should be equal to blockShape.length ${t.length}`),F(r.shape[0]%a==0,()=>`input tensor batch is ${r.shape[0]} but is not divisible by the product of the elements of blockShape ${t.join(" * ")} === ${a}`);let s={x:r},i={blockShape:t,crops:n};return $.runKernel(wu,s,i)}var Zu=D({batchToSpaceND_:xN});function wN(e){let t;return e.rank===0||e.rank===1?t=H(e,[1,1,1,e.size]):e.rank===2?t=H(e,[1,1,e.shape[0],e.shape[1]]):e.rank===3?t=H(e,[1,e.shape[0],e.shape[1],e.shape[2]]):t=e,t}function bN(e,t,n,r,a,s){s==null&&(s=.001);let i=C(e,"x","batchNorm"),o=C(t,"mean","batchNorm"),l=C(n,"variance","batchNorm"),c;a!=null&&(c=C(a,"scale","batchNorm"));let u;r!=null&&(u=C(r,"offset","batchNorm")),F(o.rank===l.rank,()=>"Batch normalization gradient requires mean and variance to have equal ranks."),F(u==null||o.rank===u.rank,()=>"Batch normalization gradient requires mean and offset to have equal ranks."),F(c==null||o.rank===c.rank,()=>"Batch normalization gradient requires mean and scale to have equal ranks.");let h={x:wN(i),scale:c,offset:u,mean:o,variance:l},d={varianceEpsilon:s},p=$.runKernel(Es,h,d);return H(p,i.shape)}var mi=D({batchNorm_:bN});function _N(e,t,n,r,a,s){let i=C(e,"x","batchNorm"),o=C(t,"mean","batchNorm"),l=C(n,"variance","batchNorm"),c;a!=null&&(c=C(a,"scale","batchNorm"));let u;return r!=null&&(u=C(r,"offset","batchNorm")),F(i.rank===2,()=>`Error in batchNorm2D: x must be rank 2 but got rank ${i.rank}.`),F(o.rank===2||o.rank===1,()=>`Error in batchNorm2D: mean must be rank 2 or rank 1 but got rank ${o.rank}.`),F(l.rank===2||l.rank===1,()=>`Error in batchNorm2D: variance must be rank 2 or rank 1 but got rank ${l.rank}.`),c!=null&&F(c.rank===2||c.rank===1,()=>`Error in batchNorm2D: scale must be rank 2 or rank 1 but got rank ${c.rank}.`),u!=null&&F(u.rank===2||u.rank===1,()=>`Error in batchNorm2D: offset must be rank 2 or rank 1 but got rank ${u.rank}.`),mi(i,o,l,u,c,s)}var mx=D({batchNorm2d_:_N});function vN(e,t,n,r,a,s){let i=C(e,"x","batchNorm"),o=C(t,"mean","batchNorm"),l=C(n,"variance","batchNorm"),c;a!=null&&(c=C(a,"scale","batchNorm"));let u;return r!=null&&(u=C(r,"offset","batchNorm")),F(i.rank===3,()=>`Error in batchNorm3D: x must be rank 3 but got rank ${i.rank}.`),F(o.rank===3||o.rank===1,()=>`Error in batchNorm3D: mean must be rank 3 or rank 1 but got rank ${o.rank}.`),F(l.rank===3||l.rank===1,()=>`Error in batchNorm3D: variance must be rank 3 or rank 1 but got rank ${l.rank}.`),c!=null&&F(c.rank===3||c.rank===1,()=>`Error in batchNorm3D: scale must be rank 3 or rank 1 but got rank ${c.rank}.`),u!=null&&F(u.rank===3||u.rank===1,()=>`Error in batchNorm3D: offset must be rank 3 or rank 1 but got rank ${u.rank}.`),mi(i,o,l,u,c,s)}var Ax=D({batchNorm3d_:vN});function kN(e,t,n,r,a,s){let i=C(e,"x","batchNorm"),o=C(t,"mean","batchNorm"),l=C(n,"variance","batchNorm"),c;a!=null&&(c=C(a,"scale","batchNorm"));let u;return r!=null&&(u=C(r,"offset","batchNorm")),F(i.rank===4,()=>`Error in batchNorm4D: x must be rank 4 but got rank ${i.rank}.`),F(o.rank===4||o.rank===1,()=>`Error in batchNorm4D: mean must be rank 4 or rank 1 but got rank ${o.rank}.`),F(l.rank===4||l.rank===1,()=>`Error in batchNorm4D: variance must be rank 4 or rank 1 but got rank ${l.rank}.`),c!=null&&F(c.rank===4||c.rank===1,()=>`Error in batchNorm4D: scale must be rank 4 or rank 1 but got rank ${c.rank}.`),u!=null&&F(u.rank===4||u.rank===1,()=>`Error in batchNorm4D: offset must be rank 4 or rank 1 but got rank ${u.rank}.`),mi(i,o,l,u,c,s)}var yx=D({batchNorm4d_:kN});function IN(e,t,n){let r=C(e,"x","bincount"),a=C(t,"weights","bincount");F(r.dtype==="int32",()=>`Error in bincount: input dtype must be int32, but got ${r.dtype}`),F(n>=0,()=>`size must be non-negative, but got ${n}.`),F(a.size===r.size||a.size===0,()=>`Error in bincount: weights must have the same size as input or0-length, but got input shape: ${r.shape}, weights shape: ${a.shape}.`);let s={x:r,weights:a},i={size:n};return $.runKernel(Ph,s,i)}var gx=D({bincount_:IN});function NN(e,t){let n=C(e,"broadcastTo","x"),r=n.shape;if(t.some(l=>!(l>0)||l%1!=0))throw new Error(`broadcastTo(): Invalid broadcast shape [${t}].`);if(t.lengthn.rank){let l=n.shape.slice();for(;l.length=0;l--)if(a[l]===t[l])s[l]=1;else if(n.shape[l]!==1)throw new Error(`broadcastTo(): [${r}] cannot be broadcast to [${t}].`);if(s.map((l,c)=>l>1?c:-1).filter(l=>l>=0).length===0)return Or(n);let i={x:n},o={reps:s};return $.runKernel(Ra,i,o)}var Yu=D({broadcastTo_:NN});function SN(e){let t={x:C(e,"x","ceil")};return $.runKernel(xs,t)}var dm=D({ceil_:SN});function TN(e,t,n){let r=C(e,"x","clipByValue");F(t<=n,()=>`Error in clip: min (${t}) must be less than or equal to max (${n}).`);let a={x:r},s={clipValueMin:t,clipValueMax:n};return $.runKernel(Ca,a,s)}var kn=D({clipByValue_:TN});function EN(e){return it(e,0)}var xx=D({concat1d_:EN});function CN(e,t){return it(e,t)}var yl=D({concat2d_:CN});function RN(e,t){return it(e,t)}var wx=D({concat3d_:RN});function FN(e,t){return it(e,t)}var bx=D({concat4d_:FN});function MN(e,t,n,r,a="NHWC",s=[1,1],i){let o=C(e,"x","conv2d"),l=C(t,"filter","conv2d"),c=o,u=!1;o.rank===3&&(u=!0,c=H(o,[1,o.shape[0],o.shape[1],o.shape[2]])),F(c.rank===4,()=>`Error in conv2d: input must be rank 4, but got rank ${c.rank}.`),F(l.rank===4,()=>`Error in conv2d: filter must be rank 4, but got rank ${l.rank}.`),i!=null&&F(Gt(r),()=>`Error in conv2d: pad must be an integer when using, dimRoundingMode ${i} but got pad ${r}.`);let h=a==="NHWC"?c.shape[3]:c.shape[1];F(h===l.shape[2],()=>`Error in conv2d: depth of input (${h}) must match input depth for filter ${l.shape[2]}.`),F(Pr(n,s),()=>`Error in conv2D: Either strides or dilations must be 1. Got strides ${n} and dilations '${s}'`);let d={x:c,filter:l},p={strides:n,pad:r,dataFormat:a,dilations:s,dimRoundingMode:i},f=$.runKernel(ws,d,p);return u?H(f,[f.shape[1],f.shape[2],f.shape[3]]):f}var ia=D({conv2d_:MN});function $N(e,t,n,r,a="NWC",s=1,i){let o=C(e,"x","conv1d"),l=C(t,"filter","conv1d"),c=o,u=!1;o.rank===2&&(u=!0,c=H(o,[1,o.shape[0],o.shape[1]])),F(c.rank===3,()=>`Error in conv1d: input must be rank 3, but got rank ${c.rank}.`),F(l.rank===3,()=>`Error in conv1d: filter must be rank 3, but got rank ${l.rank}.`),i!=null&&F(Gt(r),()=>`Error in conv1d: pad must be an integer when using, dimRoundingMode ${i} but got pad ${r}.`),F(c.shape[2]===l.shape[1],()=>`Error in conv1d: depth of input (${c.shape[2]}) must match input depth for filter ${l.shape[1]}.`),F(Pr(n,s),()=>`Error in conv1D: Either stride or dilation must be 1. Got stride ${n} and dilation '${s}'`),F(a==="NWC",()=>`Error in conv1d: got dataFormat of ${a} but only NWC is currently supported.`);let h=H(l,[1,l.shape[0],l.shape[1],l.shape[2]]),d=H(c,[c.shape[0],1,c.shape[1],c.shape[2]]),p=ia(d,h,[1,n],r,"NHWC",[1,s],i);return u?H(p,[p.shape[2],p.shape[3]]):H(p,[p.shape[0],p.shape[2],p.shape[3]])}var Id=D({conv1d_:$N});function DN(e,t,n,r,a,s="NHWC",i){F(e.length===t.rank,()=>`Length of inShape (${e.length}) and rank of dy (${t.rank}) must match`);let o=e,l=t,c=!1;t.rank===3&&(c=!0,l=H(t,[1,t.shape[0],t.shape[1],t.shape[2]]),o=[1,e[0],e[1],e[2]]),F(o.length===4,()=>`Error in conv2dDerInput: inShape must be length 4, but got length ${o.length}.`),F(l.rank===4,()=>`Error in conv2dDerInput: dy must be rank 4, but got rank ${l.rank}`),F(n.rank===4,()=>`Error in conv2dDerInput: filter must be rank 4, but got rank ${n.rank}`);let u=s==="NHWC"?o[3]:o[1],h=s==="NHWC"?l.shape[3]:l.shape[1];F(u===n.shape[2],()=>`Error in conv2dDerInput: depth of input (${u}) must match input depth for filter ${n.shape[2]}.`),F(h===n.shape[3],()=>`Error in conv2dDerInput: depth of output (${h}) must match output depth for filter ${n.shape[3]}.`),i!=null&&F(Gt(a),()=>`Error in conv2dDerInput: pad must be an integer when using, dimRoundingMode ${i} but got pad ${a}.`);let d={dy:l,filter:n},p={strides:r,pad:a,dataFormat:s,dimRoundingMode:i,inputShape:o},f=$.runKernel(bs,d,p);return c?H(f,[f.shape[1],f.shape[2],f.shape[3]]):f}var pm=D({conv2DBackpropInput_:DN});function ON(e,t,n,r,a,s){let i=C(e,"x","conv2dTranspose"),o=C(t,"filter","conv2dTranspose");return pm(n,i,o,r,a,"NHWC",s)}var Nd=D({conv2dTranspose_:ON});function zN(e,t,n,r,a="NDHWC",s=[1,1,1]){let i=C(e,"x","conv3d"),o=C(t,"filter","conv3d"),l=i,c=!1;i.rank===4&&(c=!0,l=H(i,[1,i.shape[0],i.shape[1],i.shape[2],i.shape[3]])),F(l.rank===5,()=>`Error in conv3d: input must be rank 5, but got rank ${l.rank}.`),F(o.rank===5,()=>`Error in conv3d: filter must be rank 5, but got rank ${o.rank}.`),F(l.shape[4]===o.shape[3],()=>`Error in conv3d: depth of input (${l.shape[4]}) must match input depth for filter ${o.shape[3]}.`),F(Pr(n,s),()=>`Error in conv3D: Either strides or dilations must be 1. Got strides ${n} and dilations '${s}'`),F(a==="NDHWC",()=>`Error in conv3d: got dataFormat of ${a} but only NDHWC is currently supported.`);let u={x:l,filter:o},h={strides:n,pad:r,dataFormat:a,dilations:s},d=$.runKernel(_u,u,h);return c?H(d,[d.shape[1],d.shape[2],d.shape[3],d.shape[4]]):d}var fm=D({conv3d_:zN});function PN(e,t,n,r,a){F(e.length===t.rank,()=>`Length of inShape (${e.length}) and rank of dy (${t.rank}) must match`);let s=e,i=t,o=!1;t.rank===4&&(o=!0,i=H(t,[1,t.shape[0],t.shape[1],t.shape[2],t.shape[3]]),s=[1,e[0],e[1],e[2],e[3]]);let l=s[4],c=i.shape[4];F(s.length===5,()=>`Error in conv3dDerInput: inShape must be length 5, but got length ${s.length}.`),F(i.rank===5,()=>`Error in conv3dDerInput: dy must be rank 5, but got rank ${i.rank}`),F(n.rank===5,()=>`Error in conv3dDerInput: filter must be rank 5, but got rank ${n.rank}`),F(l===n.shape[3],()=>`Error in conv3dDerInput: depth of input (${l}) must match input depth for filter ${n.shape[3]}.`),F(c===n.shape[4],()=>`Error in conv3dDerInput: depth of output (${c}) must match output depth for filter ${n.shape[4]}.`);let u={dy:i,filter:n},h={pad:a,strides:r,inputShape:s},d=$.runKernel(Vh,u,h);return o?H(d,[d.shape[1],d.shape[2],d.shape[3],d.shape[4]]):d}var _x=D({conv3DBackpropInput_:PN});function LN(e,t,n,r,a){let s=C(e,"x","conv3dTranspose"),i=C(t,"filter","conv3dTranspose");return _x(n,s,i,r,a)}var WN=D({conv3dTranspose_:LN});function BN(e){let t={x:C(e,"x","cos")};return $.runKernel(_s,t)}var Ju=D({cos_:BN});function VN(e){let t={x:C(e,"x","cosh")};return $.runKernel(mo,t)}var Sd=D({cosh_:VN});function UN(e,t=0,n=!1,r=!1){let a={x:C(e,"x","cumsum")},s={axis:t,exclusive:n,reverse:r};return $.runKernel(vs,a,s)}var Td=D({cumsum_:UN});function jN(e,t,n,r=!1){let a=C(e,"x","denseBincount"),s=C(t,"weights","denseBincount");F(a.dtype==="int32",()=>`Error in denseBincount: input dtype must be int32, but got ${a.dtype}`),F(a.rank<=2,()=>`Error in denseBincount: input must be at most rank 2, but got rank ${a.rank}.`),F(n>=0,()=>`size must be non-negative, but got ${n}.`),F(s.size===a.size||s.size===0,()=>`Error in denseBincount: weights must have the same shape as x or 0-length, but got x shape: ${a.shape}, weights shape: ${s.shape}.`);let i={x:a,weights:s},o={size:n,binaryOutput:r};return $.runKernel(Uh,i,o)}var vx=D({denseBincount_:jN});function HN(e,t,n="NHWC"){let r=C(e,"x","depthToSpace"),a=n==="NHWC"?r.shape[1]:r.shape[2],s=n==="NHWC"?r.shape[2]:r.shape[3],i=n==="NHWC"?r.shape[3]:r.shape[1];F(a*t>=0,()=>`Negative dimension size caused by overflow when multiplying - ${a} and ${t} for depthToSpace with input shape - ${r.shape}`),F(s*t>=0,()=>`Negative dimension size caused by overflow when multiplying - ${s} and ${t} for depthToSpace with input shape - ${r.shape}`),F(i%(t*t)==0,()=>`Dimension size must be evenly divisible by ${t*t} but is ${i} for depthToSpace with input shape ${r.shape}`);let o={x:r},l={blockSize:t,dataFormat:n};return $.runKernel(yo,o,l)}var mm=D({depthToSpace_:HN});function GN(e,t,n,r,a="NHWC",s=[1,1],i){let o=C(e,"x","depthwiseConv2d"),l=C(t,"filter","depthwiseConv2d"),c=o,u=!1;o.rank===3&&(u=!0,c=H(o,[1,o.shape[0],o.shape[1],o.shape[2]])),F(c.rank===4,()=>`Error in depthwiseConv2d: input must be rank 4, but got rank ${c.rank}.`),F(l.rank===4,()=>`Error in depthwiseConv2d: filter must be rank 4, but got rank ${l.rank}.`),F(c.shape[3]===l.shape[2],()=>`Error in depthwiseConv2d: number of input channels (${c.shape[3]}) must match the inChannels dimension in filter ${l.shape[2]}.`),i!=null&&F(Gt(r),()=>`Error in depthwiseConv2d: pad must be an integer when using, dimRoundingMode ${i} but got pad ${r}.`);let h={x:c,filter:l},d={strides:n,pad:r,dataFormat:a,dilations:s,dimRoundingMode:i},p=$.runKernel(ks,h,d);return u?H(p,[p.shape[1],p.shape[2],p.shape[3]]):p}var gl=D({depthwiseConv2d_:GN});function qN(e){let t={x:C(e,"x","diag")};return $.runKernel(Gh,t)}var XN=D({diag_:qN});function KN(e,t,n,r,a=[1,1],s="NHWC"){let i=C(e,"x","dilation2d"),o=C(t,"filter","dilation2d");F(i.rank===3||i.rank===4,()=>`Error in dilation2d: input must be rank 3 or 4, but got rank ${i.rank}.`),F(o.rank===3,()=>`Error in dilation2d: filter must be rank 3, but got rank ${o.rank}.`),F(s==="NHWC",()=>`Error in dilation2d: Only NHWC is currently supported, but got dataFormat of ${s}`);let l=i,c=!1;i.rank===3&&(l=H(i,[1,i.shape[0],i.shape[1],i.shape[2]]),c=!0);let u={x:l,filter:o},h={strides:n,pad:r,dilations:a},d=$.runKernel(vu,u,h);return c?H(d,[d.shape[1],d.shape[2],d.shape[3]]):d}var Am=D({dilation2d_:KN});function ZN(e,t){let n=e.length,r=[];for(let a=0;a1&&i===1&&r.unshift(s)}return r}function Wt(e,t){let n=[];for(let r=0;r1)&&n.unshift(s)}return n}function yt(e,t){let n=[],r=Math.max(e.length,t.length);for(let a=0;a"The first dimension of `a` must match the size of `condition`."),s.rank!==1&&sn(s.shape,l.shape,"Error in where: ");let c={condition:s,t:o,e:l};return $.runKernel(Go,c)}var In=D({where_:JN});function QN(e){let t={x:C(e,"x","zerosLike")};return $.runKernel(rl,t)}var qe=D({zerosLike_:QN});function eS(e,t){let n=C(e,"a","div"),r=C(t,"b","div");[n,r]=It(n,r);let a=be(n,r),s=qe(a),i=La(r,s);return In(i,s,a)}var ym=D({divNoNan_:eS});function tS(e,t){let n=C(e,"t1","dot"),r=C(t,"t2","dot");F((n.rank===1||n.rank===2)&&(r.rank===1||r.rank===2),()=>`Error in dot: inputs must all be rank 1 or 2, but got ranks ${n.rank} and ${r.rank}.`);let a=n.rank===1?n.size:n.shape[1],s=r.rank===1?r.size:r.shape[0];if(F(a===s,()=>`Error in dot: inner dimensions of inputs must match, but got ${a} and ${s}.`),n.rank===1&&r.rank===1){let i=H(n,[1,-1]),o=H(r,[-1,1]),l=Ke(i,o);return H(l,[])}else if(n.rank===1&&r.rank===2){let i=H(n,[1,-1]),o=H(r,[r.shape[0],r.shape[1]]),l=Ke(i,o);return H(l,[l.size])}else if(n.rank===2&&r.rank===1){let i=H(r,[-1,1]),o=Ke(n,i);return H(o,[o.size])}else{let i=H(r,[r.shape[0],r.shape[1]]);return Ke(n,i)}}var kx=D({dot_:tS});function nS(e){let t={x:C(e,"x","elu")};return $.runKernel(go,t)}var xl=D({elu_:nS});function rS(e){let t=C(e,"x","erf");F(t.dtype==="int32"||t.dtype==="float32",()=>"Input dtype must be `int32` or `float32`."),t.dtype==="int32"&&(t=ge(t,"float32"));let n={x:t};return $.runKernel(xo,n)}var gm=D({erf_:rS});function aS(e){let t={x:C(e,"x","exp")};return $.runKernel(Ns,t)}var Zn=D({exp_:aS});function sS(e,t=0){let n=C(e,"x","expandDims","string_or_numeric");F(t<=n.rank,()=>"Axis must be <= rank of the tensor");let r={input:n},a={dim:t};return $.runKernel(bo,r,a)}var hn=D({expandDims_:sS});function iS(e){let t={x:C(e,"x","expm1")};return $.runKernel(_o,t)}var xm=D({expm1_:iS});function oS(e,t){let n=C(e,"x","tile","string_or_numeric");F(n.rank===t.length,()=>`Error in transpose: rank of input ${n.rank} must match length of reps ${t}.`);let r={x:n},a={reps:t};return $.runKernel(Ra,r,a)}var Wa=D({tile_:oS});function lS(e,t,n,r="float32"){t==null&&(t=e);let a=Ve([e,t],r),s=e<=t?e:t;for(let o=0;o`Error in localResponseNormalization: x must be rank 3 or 4 but got - rank ${s.rank}.`),F(Gt(t),()=>`Error in localResponseNormalization: depthRadius must be an integer but got depthRadius ${t}.`);let i=s,o=!1;s.rank===3&&(o=!0,i=H(s,[1,s.shape[0],s.shape[1],s.shape[2]]));let l={x:i},c={depthRadius:t,bias:n,alpha:r,beta:a},u=$.runKernel(Su,l,c);return o?H(u,[u.shape[1],u.shape[2],u.shape[3]]):u}var bm=D({localResponseNormalization_:wS});function bS(e){let t={x:C(e,"x","log")};return $.runKernel(Ms,t)}var Dn=D({log_:bS});function _S(e){let t={x:C(e,"x","log1p")};return $.runKernel(Fo,t)}var Rd=D({log1p_:_S});function vS(e){return F(Ta(e),()=>"The f passed in grad(f) must be a function"),(t,n)=>{let r=C(t,"x","tf.grad","string_or_numeric"),a=n!=null?C(n,"dy","tf.grad"):null;return $.tidy(()=>{let{value:s,grads:i}=$.gradients(()=>e(r),[r],a);return a!=null&&sn(s.shape,a.shape,"The shape of dy passed in grad(f)(x, dy) must match the shape returned by f(x)"),Fd(i),i[0]})}}function kS(e){return F(Ta(e),()=>"The f passed in grads(f) must be a function"),(t,n)=>{F(Array.isArray(t),()=>"The args passed in grads(f)(args) must be an array of `Tensor`s or `TensorLike`s");let r=ju(t,"args","tf.grads","string_or_numeric"),a=n!=null?C(n,"dy","tf.grads"):null;return $.tidy(()=>{let{value:s,grads:i}=$.gradients(()=>e(...r),r,a);return a!=null&&sn(s.shape,a.shape,"The shape of dy passed in grads(f)([x1,...], dy) must match the shape returned by f([x1,...])"),Fd(i),i})}}function IS(e){return F(Ta(e),()=>"The f passed in valueAndGrad(f) must be a function"),(t,n)=>{F(t instanceof Ge,()=>"The x passed in valueAndGrad(f)(x) must be a tensor"),F(n==null||n instanceof Ge,()=>"The dy passed in valueAndGrad(f)(x, dy) must be a tensor");let{grads:r,value:a}=$.gradients(()=>e(t),[t],n);return Fd(r),{grad:r[0],value:a}}}function NS(e){return F(Ta(e),()=>"The f passed in valueAndGrads(f) must be a function"),(t,n)=>{F(Array.isArray(t)&&t.every(a=>a instanceof Ge),()=>"The args passed in valueAndGrads(f)(args) must be array of tensors"),F(n==null||n instanceof Ge,()=>"The dy passed in valueAndGrads(f)(args, dy) must be a tensor");let r=$.gradients(()=>e(...t),t,n);return n!=null&&sn(r.value.shape,n.shape,"The shape of dy passed in valueAndGrads(f)([x1,...], dy) must match the shape returned by f([x1,...])"),Fd(r.grads),r}}function Ex(e,t){F(Ta(e),()=>"The f passed in variableGrads(f) must be a function"),F(t==null||Array.isArray(t)&&t.every(c=>c instanceof Bu),()=>"The varList passed in variableGrads(f, varList) must be an array of variables");let n=t!=null;if(!n){t=[];for(let c in $.registeredVariables)t.push($.registeredVariables[c])}let r=n?t.filter(c=>!c.trainable):null,a=t.length;t=t.filter(c=>c.trainable),F(t.length>0,()=>`variableGrads() expects at least one of the input variables to be trainable, but none of the ${a} variables is trainable.`);let s=!0,{value:i,grads:o}=$.gradients(e,t,null,s);F(o.some(c=>c!=null),()=>"Cannot find a connection between any variable and the result of the loss function y=f(x). Please make sure the operations that use variables are inside the function f passed to minimize()."),F(i.rank===0,()=>`The f passed in variableGrads(f) must return a scalar, but it returned a rank-${i.rank} tensor`);let l={};return t.forEach((c,u)=>{o[u]!=null&&(l[c.name]=o[u])}),r!=null&&r.forEach(c=>l[c.name]=null),{value:i,grads:l}}function Lr(e){return $.customGrad(e)}function Fd(e){if(e.filter(t=>t==null).length>0)throw new Error(`Cannot compute gradient of y=f(x) with respect to x. Make sure that - the f you passed encloses all operations that lead from x to y.`)}function SS(e){let t={x:C(e,"x","neg")};return $.runKernel(Do,t)}var Nt=D({neg_:SS});function TS(e){let t={x:C(e,"x","softplus")};return $.runKernel(Yo,t)}var bl=D({softplus_:TS});function ES(e){let t=C(e,"x","logSigmoid");return Lr(n=>({value:Nt(bl(Nt(n))),gradFunc:r=>P(r,$n(Nt(n)))}))(t)}var Cx=D({logSigmoid_:ES});function CS(e,t=null,n=!1){let r={x:C(e,"x","max")},a={reductionIndices:t,keepDims:n};return $.runKernel($s,r,a)}var Yn=D({max_:CS});function RS(e,t){let n=C(e,"a","sub"),r=C(t,"b","sub");[n,r]=It(n,r);let a={a:n,b:r};return $.runKernel(ri,a)}var we=D({sub_:RS});function FS(e,t=null,n=!1){let r=C(e,"x","sum");r.dtype==="bool"&&(r=ge(r,"int32"));let a={x:r},s={axis:t,keepDims:n};return $.runKernel(ei,a,s)}var Fe=D({sum_:FS});function MS(e,t=-1){let n=C(e,"logits","logSoftmax");if(t===-1&&(t=n.rank-1),t!==n.rank-1)throw Error(`Log Softmax along a non-last dimension is not yet supported. Logits was rank ${n.rank} and axis was ${t}`);return Lr((r,a)=>{let s=!0,i=Yn(r,t,!0),o=we(r,i),l=we(ge(o,"float32"),Dn(Fe(Zn(o),t,s)));return a([l]),{value:l,gradFunc:(c,u)=>{let[h]=u,d=!0,p=Zn(h);return we(c,P(Fe(c,t,d),p))}}})(n)}var Md=D({logSoftmax_:MS});function _m(e,t){for(let n=0;ne[s]);return[n,a]}function gi(e,t){let n=t.map(r=>1);return Rx(e,n,t)}function $S(e,t,n){F(_m(t,n),()=>`${e} supports only inner-most axes for now. Got axes ${t} and rank-${n} input.`)}function Mx(e,t){if(_m(e,t))return null;let n=[];for(let r=0;rn.push(r)),n}function vm(e){return e.map((t,n)=>[n,t]).sort((t,n)=>t[1]-n[1]).map(t=>t[0])}function DS(e,t){let n=[];for(let r=t-e;r`Error in maxPool: input must be rank 4 but got rank ${o.rank}.`),F(Pr(n,i),()=>`Error in maxPool: Either strides or dilations must be 1. Got strides ${n} and dilations '${i}'`),a!=null&&F(Gt(r),()=>`Error in maxPool: pad must be an integer when using, dimRoundingMode ${a} but got pad ${r}.`);let c={x:o},u={filterSize:t,strides:n,pad:r,dimRoundingMode:a},h=$.runKernel(Os,c,u);return l?H(h,[h.shape[1],h.shape[2],h.shape[3]]):h}var nc=D({maxPool_:BS});function VS(e,t=[1,1,1],n,r,a,s="NDHWC"){let i=C(e,"x","maxPool3d"),o=i,l=!1;i.rank===4&&(l=!0,o=H(i,[1,i.shape[0],i.shape[1],i.shape[2],i.shape[3]])),F(o.rank===5,()=>`Error in maxPool3d: x must be rank 5 but got rank ${o.rank}.`),F(s==="NDHWC",()=>`Error in maxPool3d: Only NDHWC is currently supported, but got dataFormat of ${s}`),a!=null&&F(Gt(r),()=>`Error in maxPool3d: pad must be an integer when using, dimRoundingMode ${a} but got pad ${r}.`);let c={x:o},u={filterSize:t,strides:n,pad:r,dimRoundingMode:a,dataFormat:s},h=$.runKernel(Tu,c,u);return l?H(h,[h.shape[1],h.shape[2],h.shape[3],h.shape[4]]):h}var Im=D({maxPool3d_:VS});function US(e,t,n,r,a=!1){let s={x:C(e,"x","maxPoolWithArgmax")},i={filterSize:t,strides:n,pad:r,includeBatchInIndex:a},o=$.runKernel(rd,s,i);return{result:o[0],indexes:o[1]}}var Dx=D({maxPoolWithArgmax_:US});function jS(e,t){let n=C(e,"a","maximum"),r=C(t,"b","maximum");[n,r]=It(n,r),n.dtype==="bool"&&(n=ge(n,"int32"),r=ge(r,"int32")),yt(n.shape,r.shape);let a={a:n,b:r};return $.runKernel(Ds,a)}var Wr=D({maximum_:jS});function HS(e,t=null,n=!1){let r={x:C(e,"x","mean")},a={axis:t,keepDims:n};return $.runKernel(zs,r,a)}var St=D({mean_:HS});function GS(e,t=null,n=!1){let r={x:C(e,"x","min")},a={axis:t,keepDims:n};return $.runKernel(Ps,r,a)}var _l=D({min_:GS});function qS(e,t){let n=C(e,"a","minimum"),r=C(t,"b","minimum");[n,r]=It(n,r),n.dtype==="bool"&&(n=ge(n,"int32"),r=ge(r,"int32")),yt(n.shape,r.shape);let a={a:n,b:r};return $.runKernel(Ls,a)}var vl=D({minimum_:qS});function XS(e,t,n){F(n==="reflect"||n==="symmetric",()=>`Invalid mode. Mode must be either reflect or symmetric. Got ${n}.`);let r=C(e,"x","mirrorPad");if(r.rank===0)throw new Error("mirrorPad(scalar) is not defined. Pass non-scalar to mirrorPad");F(t.length===r.rank,()=>`Padding doesn't match input. Must be ${r.rank}. Got ${t.length}.`);let a=n==="reflect"?1:0;for(let o=0;o"Invalid number of paddings. Must be length of 2 each."),F(t[o][0]>=0&&t[o][0]<=r.shape[o]-a&&t[o][1]>=0&&t[o][1]<=r.shape[o]-a,()=>`Padding in dimension ${o} cannot be greater than or equal to ${r.shape[o]-a} or less than 0 for input of shape ${r.shape}`);let s={paddings:t,mode:n},i={x:r};return $.runKernel(Eu,i,s)}var Nm=D({mirrorPad_:XS});function KS(e,t){let n=C(e,"a","mod"),r=C(t,"b","mod");[n,r]=It(n,r);let a={a:n,b:r};return $.runKernel($o,a)}var Sm=D({mod_:KS});function ZS(e){let t=C(e,"x","square"),n={};return $.runKernel("Square",{x:t},n)}var ut=D({square_:ZS});function YS(e,t=null,n=!1){e=C(e,"x","moments");let r=or(t,e.shape),a=St(e,r,n),s=a.shape;n||(s=gi(a.shape,r));let i=ut(we(ge(e,"float32"),H(a,s))),o=St(i,r,n);return{mean:a,variance:o}}var Dd=D({moments_:YS});function JS(e,t,n,r){let a=C(t,"data","multiRNNCell"),s=ju(n,"c","multiRNNCell"),i=ju(r,"h","multiRNNCell"),o=a,l=[];for(let h=0;h2)throw new Error(`Rank of probabilities must be 1 or 2, but is ${i}`);n=n||Math.random();let o={logits:i===1?H(a,[1,-1]):a},l={numSamples:t,seed:n,normalized:r},c=$.runKernel(ad,o,l);return i===1?H(c,[c.size]):c}var Ox=D({multinomial_:eT});function tT(e,t){let n=C(e,"a","notEqual"),r=C(t,"b","notEqual");[n,r]=It(n,r),yt(n.shape,r.shape);let a={a:n,b:r};return $.runKernel(Oo,a)}var xi=D({notEqual_:tT});function Mt(e,t="float32"){if(t==="complex64"){let r=Mt(e,"float32"),a=Mt(e,"float32");return Ma(r,a)}let n=Mh(zt(e),t);return $.makeTensor(n,e,t)}function Br(e,t="float32"){if(t==="complex64"){let r=Br(e,"float32"),a=Mt(e,"float32");return Ma(r,a)}let n=wf(zt(e),t);return $.makeTensor(n,e,t)}function nT(e){let t={x:C(e,"x","onesLike")};return $.runKernel(Wo,t)}var On=D({onesLike_:nT});function rT(e,t){let n=C(e,"v1","outerProduct"),r=C(t,"v2","outerProduct");F(n.rank===1&&r.rank===1,()=>`Error in outerProduct: inputs must be rank 1, but got ranks ${n.rank} and ${r.rank}.`);let a=H(n,[-1,1]),s=H(r,[1,-1]);return Ke(a,s)}var aT=D({outerProduct_:rT});function sT(e,t,n=0){let r=C(e,"x","pad");if(r.rank===0)throw new Error("pad(scalar) is not defined. Pass non-scalar to pad");let a={paddings:t,constantValue:n},s={x:r};return $.runKernel(Vs,s,a)}var oa=D({pad_:sT});function iT(e,t,n=0){return F(t.length===2,()=>"Invalid number of paddings. Must be length of 2."),oa(e,[t],n)}var oT=D({pad1d_:iT});function lT(e,t,n=0){return F(t.length===2&&t[0].length===2&&t[1].length===2,()=>"Invalid number of paddings. Must be length of 2 each."),oa(e,t,n)}var uT=D({pad2d_:lT});function cT(e,t,n=0){return F(t.length===3&&t[0].length===2&&t[1].length===2&&t[2].length===2,()=>"Invalid number of paddings. Must be length of 2 each."),oa(e,t,n)}var hT=D({pad3d_:cT});function dT(e,t,n=0){return F(t.length===4&&t[0].length===2&&t[1].length===2&&t[2].length===2&&t[3].length===2,()=>"Invalid number of paddings. Must be length of 2 each."),oa(e,t,n)}var pT=D({pad4d_:dT});function fT(e,t,n){let r=C(e,"x","spaceToBatchND");F(r.rank>=1+t.length,()=>`input rank ${r.rank} should be > than [blockShape] ${t.length}`),F(n.length===t.length,()=>`paddings.shape[0] ${n.length} must be equal to [blockShape] ${t.length}`),F(r.shape.reduce((i,o,l)=>l>0&&l<=t.length?i&&(o+n[l-1][0]+n[l-1][1])%t[l-1]==0:i,!0),()=>`input spatial dimensions ${r.shape.slice(1)} with paddings ${n.toString()} must be divisible by blockShapes ${t.toString()}`);let a={x:r},s={blockShape:t,paddings:n};return $.runKernel(Fu,a,s)}var rc=D({spaceToBatchND_:fT});function yT(e,t,n,r,a,s){a==null&&(a=[1,1]),s==null&&(s=1),r===0&&(r="valid");let i=C(e,"x","maxPool"),o=i,l=!1;i.rank===3&&(l=!0,o=H(i,[1,i.shape[0],i.shape[1],i.shape[2]])),F(Pr(s,a),()=>`Error in pool: Either strides or dilations must be 1. Got strides ${s} and dilations '${a}'`);let c=px(o.shape,t,s,a,r),u=[c.dilationHeight,c.dilationWidth],h;r==="same"?h=AT([c.filterHeight,c.filterWidth],u):h=[[0,0],[0,0]];let d=u[0]===1&&u[1]===1,[p,f]=mT([c.inHeight,c.inWidth],u,h),m=d?r:"valid",A=d?o:rc(o,u,p),y=(n==="avg"?()=>Ku(A,t,s,m):()=>nc(A,t,s,m))(),g=d?y:Zu(y,u,f);return l?H(g,[g.shape[1],g.shape[2],g.shape[3]]):g}function mT(e,t,n){let r=n.map(u=>u[0]),a=n.map(u=>u[1]),s=e.concat(r,a),i=t.map((u,h)=>(u-s[h]%u)%u),o=a.map((u,h)=>u+i[h]),l=t.map((u,h)=>[r[h],o[h]]),c=t.map((u,h)=>[0,i[h]]);return[l,c]}function AT(e,t){let n=e.map((s,i)=>s+(s-1)*(t[i]-1)).map(s=>s-1),r=n.map(s=>Math.floor(s/2)),a=n.map((s,i)=>s-r[i]);return n.map((s,i)=>[r[i],a[i]])}var zx=D({pool_:yT});function gT(e,t){let n=C(e,"base","pow"),r=C(t,"exp","pow");[n,r]=It(n,r);let a={a:n,b:r};return $.runKernel(Us,a)}var la=D({pow_:gT});function xT(e,t){let n=C(e,"x","prelu"),r=C(t,"alpha","prelu"),a={x:n,alpha:r};return $.runKernel(js,a)}var ac=D({prelu_:xT});function wT(e,t=null,n=!1){let r=C(e,"x","prod");r.dtype==="bool"&&(r=ge(r,"int32"));let a={x:r},s={axis:t,keepDims:n};return $.runKernel(Vo,a,s)}var Od=D({prod_:wT});function bT(e,t,n){let r=zt(e),a=null;if(n==null||n==="float32")a=new Float32Array(r);else if(n==="int32")a=new Int32Array(r);else if(n==="bool")a=new Uint8Array(r);else throw new Error(`Unknown data type ${n}`);for(let s=0;s=1||s===0);let i=Math.sqrt(-2*Math.log(s)/s);e=this.mean+this.stdDev*r*i,t=this.mean+this.stdDev*a*i,(!this.truncated||this.isValidTruncated(e))&&(n=!0)}return(!this.truncated||this.isValidTruncated(t))&&(this.nextVal=this.convertValue(t)),this.convertValue(e)}convertValue(e){return this.dtype==null||this.dtype==="float32"?e:Math.round(e)}isValidTruncated(e){return e<=this.upper&&e>=this.lower}},vT=class{constructor(e,t,n,r){this.alpha=e,this.beta=1/t,this.dtype=n;let a=r||Math.random();this.randu=Tm.alea(a.toString()),this.randn=new Em(0,1,n,!1,this.randu()),e<1?this.d=e+2/3:this.d=e-1/3,this.c=1/Math.sqrt(9*this.d)}nextValue(){let e,t,n,r,a,s;for(;;){do r=this.randn.nextValue(),s=1+this.c*r;while(s<=0);if(s*=s*s,e=r*r,t=1-.331*e*e,n=.5*e+this.d*(1-s+Math.log(s)),a=this.randu(),athis.dtype==null||this.dtype==="float32",this.min=e,this.range=t-e,this.dtype=n,r==null&&(r=Math.random()),typeof r=="number"&&(r=r.toString()),!this.canReturnFloat()&&this.range<=1)throw new Error(`The difference between ${e} - ${t} <= 1 and dtype is not float`);this.random=Tm.alea(r)}convertValue(e){return this.canReturnFloat()?e:Math.round(e)}nextValue(){return this.convertValue(this.min+this.range*this.random())}};function IT(e,t,n=1,r="float32",a){if(n==null&&(n=1),r==null&&(r="float32"),r!=="float32"&&r!=="int32")throw new Error(`Unsupported data type ${r}`);let s=new vT(t,n,r,a),i=Ve(e,r);for(let o=0;o`Error in reverse1D: x must be rank 1 but got rank ${t.rank}.`),zn(t,0)}var DT=D({reverse1d_:$T});function OT(e,t){let n=C(e,"x","reverse");return F(n.rank===2,()=>`Error in reverse2D: x must be rank 2 but got rank ${n.rank}.`),zn(n,t)}var zT=D({reverse2d_:OT});function PT(e,t){let n=C(e,"x","reverse");return F(n.rank===3,()=>`Error in reverse3D: x must be rank 3 but got rank ${n.rank}.`),zn(n,t)}var LT=D({reverse3d_:PT});function WT(e,t){let n=C(e,"x","reverse");return F(n.rank===4,()=>`Error in reverse4D: x must be rank 4 but got rank ${n.rank}.`),zn(n,t)}var BT=D({reverse4d_:WT});function VT(e){let t={x:C(e,"x","round")};return $.runKernel(Ks,t)}var Rm=D({round_:VT});function UT(e){let t={x:C(e,"x","rsqrt")};return $.runKernel(Zs,t)}var Ld=D({rsqrt_:UT});function Ie(e,t){if((on(e)&&t!=="string"||Array.isArray(e))&&t!=="complex64")throw new Error("Error creating a new Scalar: value must be a primitive (number|boolean|string)");if(t==="string"&&on(e)&&!(e instanceof Uint8Array))throw new Error("When making a scalar from encoded string, the value must be `Uint8Array`.");return $a(e,[],[],t)}function jT(e){let t={x:C(e,"x","selu")};return $.runKernel(qo,t)}var Wd=D({selu_:jT});function HT(e,t,n,r,a,s=[1,1],i="NHWC"){let o=C(e,"x","separableConv2d"),l=C(t,"depthwiseFilter","separableConv2d"),c=C(n,"pointwiseFilter","separableConv2d"),u=o,h=!1;if(o.rank===3&&(h=!0,u=H(o,[1,o.shape[0],o.shape[1],o.shape[2]])),i==="NCHW")throw new Error("separableConv2d currently does not support dataFormat NCHW; only NHWC is supported");F(u.rank===4,()=>`Error in separableConv2d: input must be rank 4, but got rank ${u.rank}.`),F(l.rank===4,()=>`Error in separableConv2d: depthwise filter must be rank 4, but got rank ${l.rank}.`),F(c.rank===4,()=>`Error in separableConv2d: pointwise filter must be rank 4, but got rank ${l.rank}.`),F(c.shape[0]===1,()=>`Error in separableConv2d: the first dimension of pointwise filter must be 1, but got ${c.shape[0]}.`),F(c.shape[1]===1,()=>`Error in separableConv2d: the second dimension of pointwise filter must be 1, but got ${c.shape[1]}.`);let d=l.shape[2],p=l.shape[3];F(c.shape[2]===d*p,()=>`Error in separableConv2d: the third dimension of pointwise filter must be ${d*p}, but got ${c.shape[2]}.`);let f=gl(u,l,r,a,i,s),m=ia(f,c,1,"valid",i);return h?H(m,[m.shape[1],m.shape[2],m.shape[3]]):m}var Fm=D({separableConv2d_:HT});async function GT(e,t){let n=C(e,"x","setdiff1d"),r=C(t,"y","setdiff1d");F(n.dtype===r.dtype,()=>`x and y should have the same dtype, but got x (${n.dtype}) and y (${r.dtype}).`),F(n.rank===1,()=>`x should be 1D tensor, but got x (${n.shape}).`),F(r.rank===1,()=>`y should be 1D tensor, but got y (${r.shape}).`);let a=await n.data(),s=await r.data(),i=new Set(s),o=0;for(let u=0;u`slice1d expects a rank-1 tensor, but got a rank-${r.rank} tensor`),Me(r,[t],[n])}var Ud=D({slice1d_:ZT});function YT(e,t,n){let r=C(e,"x","slice2d");return F(r.rank===2,()=>`slice2d expects a rank-2 tensor, but got a rank-${r.rank} tensor`),Me(r,t,n)}var $m=D({slice2d_:YT});function JT(e,t,n){let r=C(e,"x","slice3d");return F(r.rank===3,()=>`slice3d expects a rank-3 tensor, but got a rank-${r.rank} tensor`),Me(r,t,n)}var jd=D({slice3d_:JT});function QT(e,t,n){let r=C(e,"x","slice4d");return F(r.rank===4,()=>`slice4d expects a rank-4 tensor, but got a rank-${r.rank} tensor`),Me(r,t,n)}var ic=D({slice4d_:QT});function eE(e,t=-1){let n=C(e,"logits","softmax","float32");if(t===-1&&(t=n.rank-1),t!==n.rank-1)throw Error(`Softmax along a non-last dimension is not yet supported. Logits was rank ${n.rank} and dim was ${t}`);let r={logits:n},a={dim:t};return $.runKernel(ti,r,a)}var oc=D({softmax_:eE});function tE(e){F(e.dtype==="complex64",()=>`The dtype for tf.spectral.fft() must be complex64 but got ${e.dtype}.`);let t={input:e};return $.runKernel(Zh,t)}var lc=D({fft_:tE});function nE(e){F(e.dtype==="complex64",()=>`The dtype for tf.spectral.ifft() must be complex64 but got ${e.dtype}.`);let t={input:e};return $.runKernel(Yh,t)}var Il=D({ifft_:nE});function rE(e){let t=e.shape[e.shape.length-1],n=e.size/t,r;if(t<=2){let a=H(e,[n,t]);r=Il(a)}else{let a=[n,2*(t-1)],s=H(sc(e),[n,t]),i=H(Ed(e),[n,t]),o=zn(Me(s,[0,1],[n,t-2]),1),l=P(zn(Me(i,[0,1],[n,t-2]),1),Ie(-1)),c=it([s,o],1),u=it([i,l],1),h=H(Ma(c,u),[a[0],a[1]]);r=Il(h)}if(r=sc(r),e.rank===3&&e.shape[0]!==0){let a=r,s=e.shape[0];r=H(r,[s,r.shape[0]/s,r.shape[1]]),a.dispose()}return r}var Hd=D({irfft_:rE});function aE(e,t,n=0){let r={x:C(e,"x","split")},a={numOrSizeSplits:t,axis:n};return $.runKernel(Jo,r,a)}var Bt=D({split_:aE});function sE(e,t){F(e.dtype==="float32",()=>`The dtype for rfft() must be real value but got ${e.dtype}`);let n=e.shape[e.shape.length-1],r=e.size/n,a;if(t!=null&&t0),m=e.shape.map(A=>A);m[e.shape.length-1]=t,a=Me(e,f,m),n=t}else if(t!=null&&t>n){let f=e.shape.map(m=>m);f[e.shape.length-1]=t-n,a=it([e,Mt(f)],e.shape.length-1),n=t}else a=e;let s=qe(a),i=H(Ma(a,s),[r,n]),o=lc(i),l=Math.floor(n/2)+1,c=sc(o),u=Ed(o),h=Bt(c,[l,n-l],c.shape.length-1),d=Bt(u,[l,n-l],u.shape.length-1),p=a.shape.slice();return p[a.shape.length-1]=l,H(Ma(h[0],d[0]),p)}var uc=D({rfft_:sE});function iE(e){let t={x:C(e,"x","sqrt")};return $.runKernel(Qs,t)}var tn=D({sqrt_:iE});function oE(e,t){let n=C(e,"a","squaredDifference"),r=C(t,"b","squaredDifference");[n,r]=It(n,r),yt(n.shape,r.shape);let a={a:n,b:r},s={};return $.runKernel(ni,a,s)}var Gd=D({squaredDifference_:oE});function lE(e,t){let n=C(e,"x","squeeze");return H(n,i5(n.shape,t).newShape)}var Va=D({squeeze_:lE});function uE(e,t=0){let n=ju(e,"tensors","stack","string_or_numeric");F(n.length>=1,()=>"Pass at least one tensor to tf.stack"),n.length>0&&F(t<=n[0].rank,()=>"Axis must be <= rank of the tensor");let r=n,a={axis:t};return $.runKernel(Bo,r,a)}var dn=D({stack_:uE});function cE(e,t=0){let n={x:C(e,"x","step")},r={alpha:t};return $.runKernel(Fa,n,r)}var Nl=D({step_:cE});function hE(e,t,n,r,a=0,s=0,i=0,o=0,l=0){let c={x:C(e,"x","stridedSlice")},u={begin:t,end:n,strides:r,beginMask:a,endMask:s,ellipsisMask:i,newAxisMask:o,shrinkAxisMask:l};return $.runKernel(Qo,c,u)}var Dm=D({stridedSlice_:hE});function dE(e){let t={x:C(e,"x","tan")};return $.runKernel(el,t)}var Om=D({tan_:dE});function ln(e,t){ds(e);let n=Dr(e,t);if(n.length!==1)throw new Error("tensor1d() requires values to be a flat/TypedArray");return $a(e,null,n,t)}function Nn(e,t,n){if(ds(e),t!=null&&t.length!==2)throw new Error("tensor2d() requires shape to have two numbers");let r=Dr(e,n);if(r.length!==2&&r.length!==1)throw new Error("tensor2d() requires values to be number[][] or flat/TypedArray");if(r.length===1&&t==null)throw new Error("tensor2d() requires shape to be provided when `values` are a flat/TypedArray");return $a(e,t,r,n)}function pE(e,t,n){if(ds(e),t!=null&&t.length!==4)throw new Error("tensor4d() requires shape to have four numbers");let r=Dr(e,n);if(r.length!==4&&r.length!==1)throw new Error("tensor4d() requires values to be number[][][][] or flat/TypedArray");if(r.length===1&&t==null)throw new Error("tensor4d() requires shape to be provided when `values` are a flat array");return $a(e,t,r,n)}function fE(e,t,n){if(ds(e),t!=null&&t.length!==5)throw new Error("tensor5d() requires shape to have five numbers");let r=Dr(e,n);if(r.length!==5&&r.length!==1)throw new Error("tensor5d() requires values to be number[][][][][] or flat/TypedArray");if(r.length===1&&t==null)throw new Error("tensor5d() requires shape to be provided when `values` are a flat array");return $a(e,t,r,n)}function mE(e,t,n){if(ds(e),t!=null&&t.length!==6)throw new Error("tensor6d() requires shape to have six numbers");let r=Dr(e,n);if(r.length!==6&&r.length!==1)throw new Error("tensor6d() requires values to be number[][][][][][] or flat/TypedArray");if(r.length===1&&t==null)throw new Error("tensor6d() requires shape to be provided when `values` are a flat array");return t=t||r,$a(e,t,r,n)}function AE(e,t=1,n=!0){let r=C(e,"x","topk");if(r.rank===0)throw new Error("topk() expects the input to be of rank 1 or higher");let a=r.shape[r.shape.length-1];if(t>a)throw new Error(`'k' passed to topk() must be <= the last dimension (${a}) but got ${t}`);let s={x:r},i={k:t,sorted:n},[o,l]=$.runKernel(tl,s,i);return{values:o,indices:l}}var zm=D({topk_:AE});function yE(e,t=0,n=1,r,a){if(r!=null&&r==="bool")throw new Error("Unsupported data type $ { dtype }");let s=new Em(t,n,r,!0,a),i=Ve(e,r);for(let o=0;o0,()=>"The input tensor must be at least 1D");let r={x:n},a={axis:t},[s,i]=$.runKernel(cd,r,a);return{values:s,indices:i}}var Xd=D({unique_:gE});function xE(e,t,n){let r=C(e,"x","unsortedSegmentSum"),a=C(t,"segmentIds","unsortedSegmentSum","int32");F(Gt(n),()=>"numSegments must be of dtype int");let s={x:r,segmentIds:a},i={numSegments:n};return $.runKernel($u,s,i)}var Pm=D({unsortedSegmentSum_:xE});function wE(e,t=0){let n=C(e,"x","unstack","string_or_numeric");F(t>=-n.shape.length&&t`Axis = ${t} is not in [-${n.shape.length}, ${n.shape.length})`);let r={value:n},a={axis:t};return $.runKernel(nl,r,a)}var hr=D({unstack_:wE});function Wx(e,t=!0,n,r){return $.makeVariable(e,t,n,r)}function Bx(e,t){let n=[];for(let s=0;s0,()=>"mask cannot be scalar"),sn(o.slice(s,s+i),a.shape,"mask's shape must match the first K dimensions of tensor's shape,");let l=1;for(let m=s;m"Shape mismatch in v and x");let l=Ie(1),c=we(l,o),u=P(we(i,s),c);if(a){F(r!=null,()=>"When using zeroDebias: true, step is required.");let h=C(r,"step","movingAverage");u=be(u,we(l,la(o,h)))}return ie(s,u)}var NE=D({movingAverage_:IE});function SE(e,t,n){let r=C(e,"indices","scatterND","int32"),a=C(t,"updates","scatterND");Kf(a,r,n);let s={indices:r,updates:a},i={shape:n};return $.runKernel(Ho,s,i)}var Ux=D({scatterND_:SE});function TE(e,t,n,r){if(e.dtype!=="int32")throw new Error(`tf.sparseToDense() expects the indices to be int32 type, but the dtype was ${e.dtype}.`);if(e.rank>2)throw new Error(`sparseIndices should be a scalar, vector, or matrix, but got shape ${e.shape}.`);let a=e.rank>0?e.shape[0]:1,s=e.rank>1?e.shape[1]:1;if(n.length!==s)throw new Error(`outputShape has incorrect number of elements:, ${n.length}, should be: ${s}.`);let i=t.size;if(!(t.rank===0||t.rank===1&&i===a))throw new Error(`sparseValues has incorrect shape ${t.shape}, should be [] or [${a}]`);if(t.dtype!==r.dtype)throw new Error("sparseValues.dtype must match defaultValues.dtype")}function EE(e,t,n,r=0){let a=C(e,"sparseIndices","sparseToDense","int32"),s=C(t,"sparseValues","sparseToDense"),i=C(r,"defaultValue","sparseToDense",s.dtype);TE(a,s,n,i);let o={sparseIndices:a,sparseValues:s,defaultValue:i},l={outputShape:n};return $.runKernel(ld,o,l)}var Wm=D({sparseToDense_:EE});function CE(e,t){let n=C(t,"indices","gatherND","int32"),r={params:C(e,"x","gatherND"),indices:n};return $.runKernel(Io,r)}var jx=D({gatherND_:CE});function RE(e,t){if(t==null)return e.shape.slice();if(aa(e.shape,t))return t;if(e.shape.length===t.length){let n=[];for(let r=0;r`x has to be a floating point tensor since it's going to be scaled, but got a ${a.dtype} tensor instead.`),F(t>=0&&t<1,()=>`rate must be a float in the range [0, 1), but got ${t}.`),t===0)return e instanceof Ge?a.clone():a;let s=RE(a,n),i=1-t,o=be(wl(ie(kl(s,0,1,"float32",r),i)),i);return P(a,o)}var Hx=D({dropout_:FE});function Gx(e){return Math.floor(Math.pow(2,Math.ceil(Math.log(e)/Math.log(2))))}function Bm(e,t,n){let r=1-e%2,a=new Float32Array(e);for(let s=0;s1,()=>`inTopK() expects the predictions to be of rank 2 or higher, but got ${r.rank}`),F(r.rank-1===a.rank,()=>`predictions rank should be 1 larger than targets rank, but got predictions rank ${r.rank} and targets rank ${a.rank}`),sn(r.shape.slice(0,r.shape.length-1),a.shape,"predictions's shape should be align with the targets' shape, except the last dimension.");let s=r.shape[r.shape.length-1];F(n>0&&n<=s,()=>`'k' passed to inTopK() must be > 0 && <= the predictions last dimension (${s}), but got ${n}`);let i=await r.data(),o=await a.data(),[l,c]=[i.length/s,s],u=o5("bool",l);for(let h=0;hA.value-m.value),u[h]=0;for(let m=0;mDE,depthwiseConv2d:()=>OE,matMul:()=>zE});function PE(e,t,n,r,a,s="NHWC",i){let o=e;e.rank===3&&(o=H(e,[1,e.shape[0],e.shape[1],e.shape[2]]));let l=t;l.rank===3&&(l=H(t,[1,t.shape[0],t.shape[1],t.shape[2]])),F(o.rank===4,()=>`Error in conv2dDerFilter: input must be rank 4, but got shape ${o.shape}.`),F(l.rank===4,()=>`Error in conv2dDerFilter: dy must be rank 4, but got shape ${l.shape}.`),F(n.length===4,()=>`Error in conv2dDerFilter: filterShape must be length 4, but got ${n}.`);let c=s==="NHWC"?o.shape[3]:o.shape[1],u=s==="NHWC"?l.shape[3]:l.shape[1];F(c===n[2],()=>`Error in conv2dDerFilter: depth of input ${c}) must match input depth in filter (${n[2]}.`),F(u===n[3],()=>`Error in conv2dDerFilter: depth of dy (${u}) must match output depth for filter (${n[3]}).`),i!=null&&F(Gt(a),()=>`Error in conv2dDerFilter: pad must be an integer when using, dimRoundingMode ${i} but got pad ${a}.`);let h={x:o,dy:l},d={strides:r,pad:a,dataFormat:s,dimRoundingMode:i,filterShape:n};return $.runKernel(Wh,h,d)}var Vm=D({conv2DBackpropFilter_:PE});function Zd(e,t,n){if(n==null||n==="linear")return e;if(n==="relu")return P(e,Nl(t));throw new Error(`Cannot compute gradient for fused activation ${n}.`)}function Yd(e,t){let n=t,r=Wt(e.shape,t.shape);return r.length>0&&(n=Fe(n,r)),H(n,e.shape)}function Jd(e,t,n,r){if(t==="linear")return e;if(t==="relu")return Vr(e);if(t==="elu")return xl(e);if(t==="relu6")return Pd(e);if(t==="prelu")return ac(e,n);if(t==="leakyrelu")return ec(e,r);throw new Error(`Unknown fused activation ${t}.`)}var Qd=(e,t)=>!(e>0)||t==="linear";function LE({x:e,filter:t,strides:n,pad:r,dataFormat:a="NHWC",dilations:s=[1,1],dimRoundingMode:i,bias:o,activation:l="linear",preluActivationWeights:c,leakyreluAlpha:u}){if(l=l||"linear",Qd($.state.gradientDepth,l)===!1){let _=ia(e,t,n,r,a,s,i);return o!=null&&(_=ie(_,o)),Jd(_,l,c,u)}let h=C(e,"x","conv2d"),d=C(t,"filter","conv2d"),p=h,f=!1;h.rank===3&&(f=!0,p=H(h,[1,h.shape[0],h.shape[1],h.shape[2]])),F(p.rank===4,()=>`Error in fused conv2d: input must be rank 4, but got rank ${p.rank}.`),F(d.rank===4,()=>`Error in fused conv2d: filter must be rank 4, but got rank ${d.rank}.`),i!=null&&F(Gt(r),()=>`Error in fused conv2d: pad must be an integer when using, dimRoundingMode ${i} but got pad ${r}.`),F(p.shape[3]===d.shape[2],()=>`Error in conv2d: depth of input (${p.shape[3]}) must match input depth for filter ${d.shape[2]}.`),F(Pr(n,s),()=>`Error in conv2D: Either strides or dilations must be 1. Got strides ${n} and dilations '${s}'`),F(a==="NHWC",()=>`Error in conv2d: got dataFormat of ${a} but only NHWC is currently supported.`);let m=Xu(p.shape,d.shape,n,s,r,i),A;o!=null&&(A=C(o,"bias","fused conv2d"),[A]=It(A,h),yt(m.outShape,A.shape));let y;c!=null&&(y=C(c,"prelu weights","fused conv2d"));let g=(_,x)=>{let[N,T,E,M]=x,O=Zd(_,E,l);F(Pa(s),()=>`Error in gradient of fused conv2D: dilation rates greater than 1 are not yet supported in gradients. Got dilations '${s}'`);let W=pm(T.shape,O,N,n,r),V=Vm(T,O,N.shape,n,r),U=[W,V];if(M!=null){let j=Yd(M,O);U.push(j)}return U},w={x:p,filter:d,bias:A,preluActivationWeights:y},b={strides:n,pad:r,dataFormat:a,dilations:s,dimRoundingMode:i,activation:l,leakyreluAlpha:u};return o==null?Lr((_,x,N)=>{let T=$.runKernel(oi,w,b);return N([x,_,T]),f&&(T=H(T,[T.shape[1],T.shape[2],T.shape[3]])),{value:T,gradFunc:g}})(p,d):Lr((_,x,N,T)=>{let E=$.runKernel(oi,w,b);return T([x,_,E,N]),f&&(E=H(E,[E.shape[1],E.shape[2],E.shape[3]])),{value:E,gradFunc:g}})(p,d,A)}var DE=D({fusedConv2d_:LE});function WE(e,t,n,r,a,s=[1,1],i){let o=e;e.rank===3&&(o=H(e,[1,e.shape[0],e.shape[1],e.shape[2]]));let l=t;l.rank===3&&(l=H(t,[1,t.shape[0],t.shape[1],t.shape[2]]));let c={x:o,dy:l},u={strides:r,pad:a,dimRoundingMode:i,dilations:s,filterShape:n};return $.runKernel(jh,c,u)}var qx=D({depthwiseConv2dNativeBackpropFilter_:WE});function BE(e,t,n,r,a,s=[1,1],i){let o=t,l=!1;t.rank===3&&(l=!0,o=H(t,[1,t.shape[0],t.shape[1],t.shape[2]]));let c={dy:o,filter:n},u={strides:r,pad:a,dimRoundingMode:i,dilations:s,inputShape:e},h=$.runKernel(Hh,c,u);return l?H(h,[h.shape[1],h.shape[2],h.shape[3]]):h}var Xx=D({depthwiseConv2dNativeBackpropInput_:BE});function VE({x:e,filter:t,strides:n,pad:r,dataFormat:a="NHWC",dilations:s=[1,1],dimRoundingMode:i,bias:o,activation:l="linear",preluActivationWeights:c,leakyreluAlpha:u}){if(Qd($.state.gradientDepth,l)===!1){let _=gl(e,t,n,r,a,s,i);return o!=null&&(_=ie(_,o)),Jd(_,l,c,u)}let h=C(e,"x","depthwiseConv2d"),d=C(t,"filter","depthwiseConv2d"),p=h,f=!1;h.rank===3&&(f=!0,p=H(h,[1,h.shape[0],h.shape[1],h.shape[2]])),F(p.rank===4,()=>`Error in fused depthwiseConv2d: input must be rank 4, but got rank ${p.rank}.`),F(d.rank===4,()=>`Error in fused depthwiseConv2d: filter must be rank 4, but got rank ${d.rank}.`),F(p.shape[3]===d.shape[2],()=>`Error in fused depthwiseConv2d: number of input channels (${p.shape[3]}) must match the inChannels dimension in filter ${d.shape[2]}.`),s==null&&(s=[1,1]),F(Pr(n,s),()=>`Error in fused depthwiseConv2d: Either strides or dilations must be 1. Got strides ${n} and dilations '${s}'`),i!=null&&F(Gt(r),()=>`Error in fused depthwiseConv2d: pad must be an integer when using dimRoundingMode ${i} but got pad ${r}.`);let m=Xu(p.shape,d.shape,n,s,r,i,!0),A;o!=null&&(A=C(o,"bias","fused conv2d"),[A]=It(A,h),yt(m.outShape,A.shape));let y;c!=null&&(y=C(c,"prelu weights","fused depthwiseConv2d"));let g=(_,x)=>{F(Pa(s),()=>`Error in gradient of fused depthwiseConv2d: dilation rates greater than 1 are not yet supported. Got dilations '${s}'`);let[N,T,E,M]=x,O=Zd(_,E,l),W=Xx(T.shape,O,N,n,r,s,i),V=qx(T,O,N.shape,n,r,s,i);if(M!=null){let U=Yd(A,O);return[W,V,U]}return[W,V]},w={x:p,filter:d,bias:A,preluActivationWeights:y},b={strides:n,pad:r,dataFormat:a,dilations:s,dimRoundingMode:i,activation:l,leakyreluAlpha:u};return o==null?Lr((_,x,N)=>{let T=$.runKernel(li,w,b);return N([x,_,T]),f&&(T=H(T,[T.shape[1],T.shape[2],T.shape[3]])),{value:T,gradFunc:g}})(p,d):Lr((_,x,N,T)=>{let E=$.runKernel(li,w,b);return T([x,_,E,N]),f&&(E=H(E,[E.shape[1],E.shape[2],E.shape[3]])),{value:E,gradFunc:g}})(p,d,A)}var OE=D({fusedDepthwiseConv2d_:VE});function UE({a:e,b:t,transposeA:n=!1,transposeB:r=!1,bias:a,activation:s="linear",preluActivationWeights:i,leakyreluAlpha:o}){if(Qd($.state.gradientDepth,s)===!1){let M=Ke(e,t,n,r);return a!=null&&(M=ie(M,a)),Jd(M,s,i,o)}let l=C(e,"a","fused matMul"),c=C(t,"b","fused matMul");[l,c]=It(l,c);let u=n?l.shape[l.rank-2]:l.shape[l.rank-1],h=r?c.shape[c.rank-1]:c.shape[c.rank-2],d=n?l.shape[l.rank-1]:l.shape[l.rank-2],p=r?c.shape[c.rank-2]:c.shape[c.rank-1],f=l.shape.slice(0,-2),m=c.shape.slice(0,-2),A=zt(f),y=zt(m);F(l.rank>=2&&c.rank>=2&&l.rank===c.rank,()=>`Error in fused matMul: inputs must have the same rank of at least 2, got ranks ${l.rank} and ${c.rank}.`),F(aa(f,m),()=>`Error in fused matMul: outer dimensions (${f}) and (${m}) of Tensors with shapes ${l.shape} and ${c.shape} must match.`),F(u===h,()=>`Error in fused matMul: inner shapes (${u}) and (${h}) of Tensors with shapes ${l.shape} and ${c.shape} and transposeA=${n} and transposeB=${r} must match.`);let g=l.shape.slice(0,-2).concat([d,p]),w=n?H(l,[A,u,d]):H(l,[A,d,u]),b=r?H(c,[y,p,h]):H(c,[y,h,p]),_;a!=null&&(_=C(a,"bias","fused matMul"),[_]=It(_,l),yt(g,_.shape));let x;i!=null&&(x=C(i,"prelu weights","fused matMul"));let N=(M,O)=>{let[W,V,U,j]=O,X=Zd(H(M,U.shape),U,s),G,ee;if(!n&&!r?(G=Ke(X,V,!1,!0),ee=Ke(W,X,!0,!1)):!n&&r?(G=Ke(X,V,!1,!1),ee=Ke(X,W,!0,!1)):n&&!r?(G=Ke(V,X,!1,!0),ee=Ke(W,X,!1,!1)):(G=Ke(V,X,!0,!0),ee=Ke(X,W,!0,!0)),a!=null){let Y=Yd(j,X);return[G,ee,Y]}else return[G,ee]},T={a:w,b,bias:_,preluActivationWeights:x},E={transposeA:n,transposeB:r,activation:s,leakyreluAlpha:o};return a==null?Lr((M,O,W)=>{let V=$.runKernel(ii,T,E);return W([M,O,V]),{value:H(V,g),gradFunc:N}})(w,b):Lr((M,O,W,V)=>{let U=$.runKernel(ii,T,E);return V([M,O,U,W]),{value:H(U,g),gradFunc:N}})(w,b,_)}var zE=D({fusedMatMul_:UE});function jE(e){return Bm(e,.54,.46)}var HE=D({hammingWindow_:jE});function GE(e){return Bm(e,.5,.5)}var Kx=D({hannWindow_:GE});function qE(e,t,n,r=!1,a=0){let s=0,i=[];for(;s+t<=e.size;)i.push(Me(e,s,t)),s+=n;if(r)for(;s`Error in cropAndResize: image must be rank 4,but got rank ${i.rank}.`),F(o.rank===2&&o.shape[1]===4,()=>`Error in cropAndResize: boxes must be have size [${c},4] but had shape ${o.shape}.`),F(l.rank===1&&l.shape[0]===c,()=>`Error in cropAndResize: boxInd must be have size [${c}] but had shape ${o.shape}.`),F(r.length===2,()=>`Error in cropAndResize: cropSize must be of length 2, but got length ${r.length}.`),F(r[0]>=1&&r[1]>=1,()=>`cropSize must be atleast [1,1], but was ${r}`),F(a==="bilinear"||a==="nearest",()=>`method must be bilinear or nearest, but was ${a}`);let u={image:i,boxes:o,boxInd:l},h={method:a,extrapolationValue:s,cropSize:r};return $.runKernel(Ao,u,h)}var YE=D({cropAndResize_:ZE});function JE(e){let t=C(e,"image","flipLeftRight","float32");F(t.rank===4,()=>`Error in flipLeftRight: image must be rank 4,but got rank ${t.rank}.`);let n={image:t};return $.runKernel(vo,n,{})}var QE=D({flipLeftRight_:JE});function eC(e,t,n=0,r=.5){let a=C(e,"image","rotateWithOffset","float32");F(a.rank===4,()=>`Error in rotateWithOffset: image must be rank 4,but got rank ${a.rank}.`);let s={image:a},i={radians:t,fillValue:n,center:r};return $.runKernel(al,s,i)}var tC=D({rotateWithOffset_:eC});function Sl(e,t,n,r,a,s){r==null&&(r=.5),a==null&&(a=Number.NEGATIVE_INFINITY),s==null&&(s=0);let i=e.shape[0];return n=Math.min(n,i),F(0<=r&&r<=1,()=>`iouThreshold must be in [0, 1], but was '${r}'`),F(e.rank===2,()=>`boxes must be a 2D tensor, but was of rank '${e.rank}'`),F(e.shape[1]===4,()=>`boxes must have 4 columns, but 2nd dimension was ${e.shape[1]}`),F(t.rank===1,()=>"scores must be a 1D tensor"),F(t.shape[0]===i,()=>`scores has incompatible shape with boxes. Expected ${i}, but was ${t.shape[0]}`),F(0<=s&&s<=1,()=>`softNmsSigma must be in [0, 1], but was '${s}'`),{maxOutputSize:n,iouThreshold:r,scoreThreshold:a,softNmsSigma:s}}function nC(e,t,n,r=.5,a=Number.NEGATIVE_INFINITY){let s=C(e,"boxes","nonMaxSuppression"),i=C(t,"scores","nonMaxSuppression"),o=Sl(s,i,n,r,a);n=o.maxOutputSize,r=o.iouThreshold,a=o.scoreThreshold;let l={maxOutputSize:n,iouThreshold:r,scoreThreshold:a};return $.runKernel(zo,{boxes:s,scores:i},l)}var rC=D({nonMaxSuppression_:nC});function sC(e,t,n){let r=aC(e,t,n),a=r<0?-(r+1):r;e.splice(a,0,t)}function aC(e,t,n){return oC(e,t,n||iC)}function iC(e,t){return e>t?1:e>>1);let o=n(t,e[s]);o>0?r=s+1:(a=s,i=!o)}return i?r:-r-1}function Yx(e,t,n,r,a){return Um(e,t,n,r,a,0)}function Jx(e,t,n,r,a,s){return Um(e,t,n,r,a,0,!1,s,!0)}function Qx(e,t,n,r,a,s){return Um(e,t,n,r,a,s,!0)}function Um(e,t,n,r,a,s,i=!1,o=!1,l=!1){let c=[];for(let A=0;Aa&&c.push({score:t[A],boxIndex:A,suppressBeginIndex:0});c.sort(ew);let u=s>0?-.5/s:0,h=[],d=[];for(;h.length0;){let A=c.pop(),{score:y,boxIndex:g,suppressBeginIndex:w}=A;if(y=w;--_){let x=lC(e,g,h[_]);if(x>=r){b=!0;break}if(A.score=A.score*uC(r,u,x),A.score<=a)break}A.suppressBeginIndex=h.length,b||(A.score===y?(h.push(g),d.push(A.score)):A.score>a&&sC(c,A,ew))}let p=h.length,f=n-p;o&&f>0&&(h.push(...new Array(f).fill(0)),d.push(...new Array(f).fill(0)));let m={selectedIndices:h};return i&&(m.selectedScores=d),l&&(m.validOutputs=p),m}function lC(e,t,n){let r=e.subarray(t*4,t*4+4),a=e.subarray(n*4,n*4+4),s=Math.min(r[0],r[2]),i=Math.min(r[1],r[3]),o=Math.max(r[0],r[2]),l=Math.max(r[1],r[3]),c=Math.min(a[0],a[2]),u=Math.min(a[1],a[3]),h=Math.max(a[0],a[2]),d=Math.max(a[1],a[3]),p=(o-s)*(l-i),f=(h-c)*(d-u);if(p<=0||f<=0)return 0;let m=Math.max(s,c),A=Math.max(i,u),y=Math.min(o,h),g=Math.min(l,d),w=Math.max(y-m,0)*Math.max(g-A,0);return w/(p+f-w)}function uC(e,t,n){let r=Math.exp(t*n*n);return n<=e?r:0}function ew(e,t){return e.score-t.score||e.score===t.score&&t.boxIndex-e.boxIndex}async function cC(e,t,n,r=.5,a=Number.NEGATIVE_INFINITY){let s=C(e,"boxes","nonMaxSuppressionAsync"),i=C(t,"scores","nonMaxSuppressionAsync"),o=Sl(s,i,n,r,a);n=o.maxOutputSize,r=o.iouThreshold,a=o.scoreThreshold;let l=await Promise.all([s.data(),i.data()]),c=l[0],u=l[1],{selectedIndices:h}=Yx(c,u,n,r,a);return s!==e&&s.dispose(),i!==t&&i.dispose(),ln(h,"int32")}var hC=cC;function dC(e,t,n,r=.5,a=Number.NEGATIVE_INFINITY,s=0){let i=C(e,"boxes","nonMaxSuppression"),o=C(t,"scores","nonMaxSuppression"),l=Sl(i,o,n,r,a,s);n=l.maxOutputSize,r=l.iouThreshold,a=l.scoreThreshold,s=l.softNmsSigma;let c={boxes:i,scores:o},u={maxOutputSize:n,iouThreshold:r,scoreThreshold:a,softNmsSigma:s},h=$.runKernel(Lo,c,u);return{selectedIndices:h[0],selectedScores:h[1]}}var pC=D({nonMaxSuppressionWithScore_:dC});async function fC(e,t,n,r=.5,a=Number.NEGATIVE_INFINITY,s=0){let i=C(e,"boxes","nonMaxSuppressionAsync"),o=C(t,"scores","nonMaxSuppressionAsync"),l=Sl(i,o,n,r,a,s);n=l.maxOutputSize,r=l.iouThreshold,a=l.scoreThreshold,s=l.softNmsSigma;let c=await Promise.all([i.data(),o.data()]),u=c[0],h=c[1],{selectedIndices:d,selectedScores:p}=Qx(u,h,n,r,a,s);return i!==e&&i.dispose(),o!==t&&o.dispose(),{selectedIndices:ln(d,"int32"),selectedScores:ln(p)}}var mC=fC;function AC(e,t,n,r=.5,a=Number.NEGATIVE_INFINITY,s=!1){let i=C(e,"boxes","nonMaxSuppression"),o=C(t,"scores","nonMaxSuppression"),l=Sl(i,o,n,r,a,null),c=l.maxOutputSize,u=l.iouThreshold,h=l.scoreThreshold,d={boxes:i,scores:o},p={maxOutputSize:c,iouThreshold:u,scoreThreshold:h,padToMaxOutputSize:s},f=$.runKernel(Po,d,p);return{selectedIndices:f[0],validOutputs:f[1]}}var yC=D({nonMaxSuppressionPadded_:AC});async function gC(e,t,n,r=.5,a=Number.NEGATIVE_INFINITY,s=!1){let i=C(e,"boxes","nonMaxSuppressionAsync"),o=C(t,"scores","nonMaxSuppressionAsync"),l=Sl(i,o,n,r,a,null),c=l.maxOutputSize,u=l.iouThreshold,h=l.scoreThreshold,[d,p]=await Promise.all([i.data(),o.data()]),{selectedIndices:f,validOutputs:m}=Jx(d,p,c,u,h,s);return i!==e&&i.dispose(),o!==t&&o.dispose(),{selectedIndices:ln(f,"int32"),validOutputs:Ie(m,"int32")}}var xC=gC;function wC(e,t,n=!1,r=!1){let a=C(e,"images","resizeBilinear");F(a.rank===3||a.rank===4,()=>`Error in resizeBilinear: x must be rank 3 or 4, but got rank ${a.rank}.`),F(t.length===2,()=>`Error in resizeBilinear: new shape must 2D, but got shape ${t}.`),F(r===!1||n===!1,()=>"Error in resizeBilinear: If halfPixelCenters is true, alignCorners must be false.");let s=a,i=!1;a.rank===3&&(i=!0,s=H(a,[1,a.shape[0],a.shape[1],a.shape[2]]));let[]=t,o={images:s},l={alignCorners:n,halfPixelCenters:r,size:t},c=$.runKernel(Gs,o,l);return i?H(c,[c.shape[1],c.shape[2],c.shape[3]]):c}var tw=D({resizeBilinear_:wC});function bC(e,t,n=!1,r=!1){let a=C(e,"images","resizeNearestNeighbor");F(a.rank===3||a.rank===4,()=>`Error in resizeNearestNeighbor: x must be rank 3 or 4, but got rank ${a.rank}.`),F(t.length===2,()=>`Error in resizeNearestNeighbor: new shape must 2D, but got shape ${t}.`),F(a.dtype==="float32"||a.dtype==="int32",()=>"`images` must have `int32` or `float32` as dtype"),F(r===!1||n===!1,()=>"Error in resizeNearestNeighbor: If halfPixelCenters is true, alignCorners must be false.");let s=a,i=!1;a.rank===3&&(i=!0,s=H(a,[1,a.shape[0],a.shape[1],a.shape[2]]));let[]=t,o={images:s},l={alignCorners:n,halfPixelCenters:r,size:t},c=$.runKernel(Ru,o,l);return i?H(c,[c.shape[1],c.shape[2],c.shape[3]]):c}var nw=D({resizeNearestNeighbor_:bC});function _C(e,t,n="nearest",r="constant",a=0,s){let i=C(e,"image","transform","float32"),o=C(t,"transforms","transform","float32");F(i.rank===4,()=>`Error in transform: image must be rank 4,but got rank ${i.rank}.`),F(o.rank===2&&(o.shape[0]===i.shape[0]||o.shape[0]===1)&&o.shape[1]===8,()=>"Error in transform: Input transform should be batch x 8 or 1 x 8"),F(s==null||s.length===2,()=>`Error in transform: outputShape must be [height, width] or null, but got ${s}.`);let l={image:i,transforms:o},c={interpolation:n,fillMode:r,fillValue:a,outputShape:s};return $.runKernel(ud,l,c)}var vC=D({transform_:_C});function kC(e,t,n){F(t%1==0,()=>`bandPart(): numLower must be an integer, got ${t}.`),F(n%1==0,()=>`bandPart(): numUpper must be an integer, got ${n}.`);let r=C(e,"a","bandPart");F(r.rank>=2,()=>`bandPart(): Rank must be at least 2, got ${r.rank}.`);let a=r.shape,[s,i]=r.shape.slice(-2);if(!(t<=s))throw new Error(`bandPart(): numLower (${t}) must not be greater than the number of rows (${s}).`);if(!(n<=i))throw new Error(`bandPart(): numUpper (${n}) must not be greater than the number of columns (${i}).`);t<0&&(t=s),n<0&&(n=i);let o=H(zd(0,s,1,"int32"),[-1,1]),l=zd(0,i,1,"int32"),c=we(o,l),u=cr(yi(c,Ie(+t,"int32")),Ba(c,Ie(-n,"int32"))),h=Mt([s,i],r.dtype);return H(dn(hr(H(r,[-1,s,i])).map(d=>In(u,d,h))),a)}var IC=D({bandPart_:kC});function NC(e){let t;if(Array.isArray(e)){t=!1,F(e!=null&&e.length>0,()=>"Gram-Schmidt process: input must not be null, undefined, or empty");let a=e[0].shape[0];for(let s=1;s`Gram-Schmidt: Non-unique lengths found in the input vectors: (${e[s].shape[0]} vs. ${a})`)}else t=!0,e=Bt(e,e.shape[0],0).map(a=>Va(a,[0]));F(e.length<=e[0].shape[0],()=>`Gram-Schmidt: Number of vectors (${e.length}) exceeds number of dimensions (${e[0].shape[0]}).`);let n=[],r=e;for(let a=0;a{let s=r[a];if(a>0)for(let i=0;i=2,()=>`qr() requires input tensor to have a rank >= 2, but got rank ${e.rank}`),e.rank===2)return rw(e,t);{let n=e.shape.slice(0,e.shape.length-2).reduce((l,c)=>l*c),r=hr(H(e,[n,e.shape[e.shape.length-2],e.shape[e.shape.length-1]]),0),a=[],s=[];r.forEach(l=>{let[c,u]=rw(l,t);a.push(c),s.push(u)});let i=H(dn(a,0),e.shape),o=H(dn(s,0),e.shape);return[i,o]}}function rw(e,t=!1){return $.tidy(()=>{F(e.shape.length===2,()=>`qr2d() requires a 2D Tensor, but got a ${e.shape.length}D Tensor.`);let n=e.shape[0],r=e.shape[1],a=wm(n),s=Or(e),i=Nn([[1]],[1,1]),o=Or(i),l=n>=r?r:n;for(let c=0;c{let p=Me(s,[c,c],[n-c,1]),f=Kd(p),m=Me(s,[c,c],[1,1]),A=In(ur(m,0),Nn([[-1]]),Nn([[1]])),y=we(m,P(A,f)),g=be(p,y);g.shape[0]===1?o=Or(i):o=it([i,Me(g,[1,0],[g.shape[0]-1,g.shape[1]])],0);let w=Nt(be(Ke(A,y),f)),b=Me(s,[c,0],[n-c,r]),_=P(w,o),x=st(o);if(c===0)s=we(b,Ke(_,Ke(x,b)));else{let E=we(b,Ke(_,Ke(x,b)));s=it([Me(s,[0,0],[c,r]),E],0)}let N=st(_),T=Me(a,[0,c],[n,a.shape[1]-c]);if(c===0)a=we(T,Ke(Ke(T,o),N));else{let E=we(T,Ke(Ke(T,o),N));a=it([Me(a,[0,0],[n,c]),E],1)}return[o,s,a]}),Te([u,h,d])}return!t&&n>r&&(a=Me(a,[0,0],[n,r]),s=Me(s,[0,0],[r,r])),[a,s]})}var EC=D({qr_:TC}),pn;(function(e){e[e.NONE=0]="NONE",e[e.MEAN=1]="MEAN",e[e.SUM=2]="SUM",e[e.SUM_BY_NONZERO_WEIGHTS=3]="SUM_BY_NONZERO_WEIGHTS"})(pn||(pn={}));function CC(e,t,n=pn.SUM_BY_NONZERO_WEIGHTS){let r=C(e,"losses","computeWeightedLoss"),a=null;t!=null&&(a=C(t,"weights","computeWeightedLoss"));let s=a==null?r:P(r,a);if(n===pn.NONE)return s;if(n===pn.SUM)return Fe(s);if(n===pn.MEAN){if(a==null)return St(s);{let i=r.size/a.size,o=be(Fe(s),Fe(a));return i>1?be(o,Ie(i)):o}}if(n===pn.SUM_BY_NONZERO_WEIGHTS){if(a==null)return be(Fe(s),Ie(r.size));{let i=P(a,Br(r.shape)),o=ge(Fe(xi(i,Ie(0))),"float32");return be(Fe(s),o)}}throw Error(`Unknown reduction: ${n}`)}var ua=D({computeWeightedLoss_:CC});function RC(e,t,n,r=pn.SUM_BY_NONZERO_WEIGHTS){let a=C(e,"labels","absoluteDifference"),s=C(t,"predictions","absoluteDifference"),i=null;n!=null&&(i=C(n,"weights","absoluteDifference")),sn(a.shape,s.shape,"Error in absoluteDifference: ");let o=Lt(we(a,s));return ua(o,i,r)}var FC=D({absoluteDifference_:RC});function MC(e,t,n,r,a=pn.SUM_BY_NONZERO_WEIGHTS){let s=C(e,"labels","cosineDistance"),i=C(t,"predictions","cosineDistance"),o=null;r!=null&&(o=C(r,"weights","cosineDistance")),sn(s.shape,i.shape,"Error in cosineDistance: ");let l=Ie(1),c=we(l,Fe(P(s,i),n,!0));return ua(c,o,a)}var $C=D({cosineDistance_:MC});function DC(e,t,n,r=pn.SUM_BY_NONZERO_WEIGHTS){let a=C(e,"labels","hingeLoss"),s=C(t,"predictions","hingeLoss"),i=null;n!=null&&(i=C(n,"weights","hingeLoss")),sn(a.shape,s.shape,"Error in hingeLoss: ");let o=Ie(1);a=we(P(Ie(2),a),o);let l=Vr(we(o,P(a,s)));return ua(l,i,r)}var OC=D({hingeLoss_:DC});function zC(e,t,n,r=1,a=pn.SUM_BY_NONZERO_WEIGHTS){let s=C(e,"labels","huberLoss"),i=C(t,"predictions","huberLoss"),o=null;n!=null&&(o=C(n,"weights","huberLoss")),sn(s.shape,i.shape,"Error in huberLoss: ");let l=Ie(r),c=Lt(we(i,s)),u=vl(c,l),h=we(c,u),d=ie(P(Ie(.5),ut(u)),P(l,h));return ua(d,o,a)}var PC=D({huberLoss_:zC});function LC(e,t,n,r=1e-7,a=pn.SUM_BY_NONZERO_WEIGHTS){let s=C(e,"labels","logLoss"),i=C(t,"predictions","logLoss"),o=null;n!=null&&(o=C(n,"weights","logLoss")),sn(s.shape,i.shape,"Error in logLoss: ");let l=Ie(1),c=Ie(r),u=Nt(P(s,Dn(ie(i,c)))),h=P(we(l,s),Dn(ie(we(l,i),c))),d=we(u,h);return ua(d,o,a)}var WC=D({logLoss_:LC});function BC(e,t,n,r=pn.SUM_BY_NONZERO_WEIGHTS){let a=C(e,"labels","meanSquaredError"),s=C(t,"predictions","meanSquaredError"),i=null;n!=null&&(i=C(n,"weights","meanSquaredError")),sn(a.shape,s.shape,"Error in meanSquaredError: ");let o=Gd(a,s);return ua(o,i,r)}var VC=D({meanSquaredError_:BC});function UC(e,t){let n=C(e,"labels","sigmoidCrossEntropyWithLogits"),r=C(t,"logits","sigmoidCrossEntropyWithLogits");sn(n.shape,r.shape,"Error in sigmoidCrossEntropyWithLogits: ");let a=Vr(r),s=P(r,n),i=Rd(Zn(Nt(Lt(r))));return ie(we(a,s),i)}function jC(e,t,n,r=0,a=pn.SUM_BY_NONZERO_WEIGHTS){let s=C(e,"multiClassLabels","sigmoidCrossEntropy"),i=C(t,"logits","sigmoidCrossEntropy"),o=null;if(n!=null&&(o=C(n,"weights","sigmoidCrossEntropy")),sn(s.shape,i.shape,"Error in sigmoidCrossEntropy: "),r>0){let c=Ie(r),u=Ie(1),h=Ie(.5);s=ie(P(s,we(u,c)),P(h,c))}let l=UC(s,i);return ua(l,o,a)}var HC=D({sigmoidCrossEntropy_:jC});function GC(e,t,n=-1){if(n===-1&&(n=t.rank-1),n!==t.rank-1)throw Error(`Softmax cross entropy along a non-last dimension is not yet supported. Labels / logits was rank ${t.rank} and dim was ${n}`);return Lr((r,a,s)=>{let i=km(a,[n],!0),o=we(ge(a,"float32"),i);s([r,o]);let l=Nt(P(o,r));return{value:Fe(l,[n]),gradFunc:(c,u)=>{let[h,d]=u,p=gi(c.shape,[n]);return[P(H(c,p),we(ge(h,"float32"),Zn(d))),P(H(c,p),we(Zn(d),ge(h,"float32")))]}}})(e,t)}function qC(e,t,n,r=0,a=pn.SUM_BY_NONZERO_WEIGHTS){let s=C(e,"onehotLabels","softmaxCrossEntropy"),i=C(t,"logits","softmaxCrossEntropy"),o=null;if(n!=null&&(o=C(n,"weights","softmaxCrossEntropy")),sn(s.shape,i.shape,"Error in softmaxCrossEntropy: "),r>0){let c=Ie(r),u=Ie(1),h=Ie(s.shape[1]);s=ie(P(s,we(u,c)),be(c,h))}let l=GC(s,i);return ua(l,o,a)}var XC=D({softmaxCrossEntropy_:qC}),KC={fft:lc,ifft:Il,rfft:uc,irfft:Hd},ZC={hammingWindow:HE,hannWindow:Kx,frame:Zx,stft:KE},je={flipLeftRight:QE,resizeNearestNeighbor:nw,resizeBilinear:tw,rotateWithOffset:tC,cropAndResize:YE,nonMaxSuppression:rC,nonMaxSuppressionAsync:hC,nonMaxSuppressionWithScore:pC,nonMaxSuppressionWithScoreAsync:mC,nonMaxSuppressionPadded:yC,nonMaxSuppressionPaddedAsync:xC,transform:vC},aw={bandPart:IC,gramSchmidt:SC,qr:EC},YC={absoluteDifference:FC,computeWeightedLoss:ua,cosineDistance:$C,hingeLoss:OC,huberLoss:PC,logLoss:WC,meanSquaredError:VC,sigmoidCrossEntropy:HC,softmaxCrossEntropy:XC},ca=class extends ox{minimize(e,t=!1,n){let{value:r,grads:a}=this.computeGradients(e,n);if(n!=null){let s=n.map(i=>({name:i.name,tensor:a[i.name]}));this.applyGradients(s)}else this.applyGradients(a);return Te(a),t?r:(r.dispose(),null)}get iterations(){return this.iterations_==null&&(this.iterations_=0),this.iterations_}incrementIterations(){this.iterations_=this.iterations+1}computeGradients(e,t){return Ex(e,t)}dispose(){this.iterations_!=null&&Te(this.iterations_)}async saveIterations(){return this.iterations_==null&&(this.iterations_=0),{name:"iter",tensor:Ie(this.iterations_,"int32")}}async getWeights(){throw new Error("getWeights() is not implemented for this optimizer yet.")}async setWeights(e){throw new Error(`setWeights() is not implemented for this optimizer class ${this.getClassName()}`)}async extractIterations(e){return this.iterations_=(await e[0].tensor.data())[0],e.slice(1)}};Object.defineProperty(ca,Symbol.hasInstance,{value:e=>e.minimize!=null&&e.computeGradients!=null&&e.applyGradients!=null});var ep=class extends ca{constructor(e,t,n=null){super();this.learningRate=e,this.rho=t,this.epsilon=n,this.accumulatedGrads=[],this.accumulatedUpdates=[],n==null&&(this.epsilon=$.backend.epsilon())}applyGradients(e){(Array.isArray(e)?e.map(t=>t.name):Object.keys(e)).forEach((t,n)=>{let r=$.registeredVariables[t],a=!1;this.accumulatedGrads[n]==null&&(this.accumulatedGrads[n]={originalName:`${t}/accum_grad`,variable:z(()=>qe(r).variable(a))}),this.accumulatedUpdates[n]==null&&(this.accumulatedUpdates[n]={originalName:`${t}/accum_var`,variable:z(()=>qe(r).variable(a))});let s=Array.isArray(e)?e[n].tensor:e[t];if(s==null)return;let i=this.accumulatedGrads[n].variable,o=this.accumulatedUpdates[n].variable;z(()=>{let l=ie(P(i,this.rho),P(ut(s),1-this.rho)),c=P(be(tn(ie(o,this.epsilon)),tn(ie(i,this.epsilon))),s),u=ie(P(o,this.rho),P(ut(c),1-this.rho));i.assign(l),o.assign(u);let h=ie(P(c,-this.learningRate),r);r.assign(h)})}),this.incrementIterations()}dispose(){this.accumulatedUpdates!=null&&(Te(this.accumulatedGrads.map(e=>e.variable)),Te(this.accumulatedUpdates.map(e=>e.variable)))}async getWeights(){let e=[...this.accumulatedGrads,...this.accumulatedUpdates];return[await this.saveIterations()].concat(e.map(t=>({name:t.originalName,tensor:t.variable})))}async setWeights(e){e=await this.extractIterations(e);let t=e.length/2,n=!1;this.accumulatedGrads=e.slice(0,t).map(r=>({originalName:r.name,variable:r.tensor.variable(n)})),this.accumulatedUpdates=e.slice(t,t*2).map(r=>({originalName:r.name,variable:r.tensor.variable(n)}))}getConfig(){return{learningRate:this.learningRate,rho:this.rho,epsilon:this.epsilon}}static fromConfig(e,t){return new e(t.learningRate,t.rho,t.epsilon)}};ep.className="Adadelta";Oa(ep);var tp=class extends ca{constructor(e,t=.1){super();this.learningRate=e,this.initialAccumulatorValue=t,this.accumulatedGrads=[]}applyGradients(e){(Array.isArray(e)?e.map(t=>t.name):Object.keys(e)).forEach((t,n)=>{let r=$.registeredVariables[t];if(this.accumulatedGrads[n]==null){let i=!1;this.accumulatedGrads[n]={originalName:`${t}/accumulator`,variable:z(()=>Qu(r.shape,this.initialAccumulatorValue).variable(i))}}let a=Array.isArray(e)?e[n].tensor:e[t];if(a==null)return;let s=this.accumulatedGrads[n].variable;z(()=>{let i=ie(s,ut(a));s.assign(i);let o=ie(P(be(a,tn(ie(i,$.backend.epsilon()))),-this.learningRate),r);r.assign(o)})}),this.incrementIterations()}dispose(){this.accumulatedGrads!=null&&Te(this.accumulatedGrads.map(e=>e.variable))}async getWeights(){return[await this.saveIterations()].concat(this.accumulatedGrads.map(e=>({name:e.originalName,tensor:e.variable})))}async setWeights(e){e=await this.extractIterations(e);let t=!1;this.accumulatedGrads=e.map(n=>({originalName:n.name,variable:n.tensor.variable(t)}))}getConfig(){return{learningRate:this.learningRate,initialAccumulatorValue:this.initialAccumulatorValue}}static fromConfig(e,t){return new e(t.learningRate,t.initialAccumulatorValue)}};tp.className="Adagrad";Oa(tp);var np=class extends ca{constructor(e,t,n,r=null){super();this.learningRate=e,this.beta1=t,this.beta2=n,this.epsilon=r,this.accumulatedFirstMoment=[],this.accumulatedSecondMoment=[],z(()=>{this.accBeta1=Ie(t).variable(),this.accBeta2=Ie(n).variable()}),r==null&&(this.epsilon=$.backend.epsilon())}applyGradients(e){let t=Array.isArray(e)?e.map(n=>n.name):Object.keys(e);z(()=>{let n=we(1,this.accBeta1),r=we(1,this.accBeta2);t.forEach((a,s)=>{let i=$.registeredVariables[a],o=!1;this.accumulatedFirstMoment[s]==null&&(this.accumulatedFirstMoment[s]={originalName:`${a}/m`,variable:z(()=>qe(i).variable(o))}),this.accumulatedSecondMoment[s]==null&&(this.accumulatedSecondMoment[s]={originalName:`${a}/v`,variable:z(()=>qe(i).variable(o))});let l=Array.isArray(e)?e[s].tensor:e[a];if(l==null)return;let c=this.accumulatedFirstMoment[s].variable,u=this.accumulatedSecondMoment[s].variable,h=ie(P(c,this.beta1),P(l,1-this.beta1)),d=ie(P(u,this.beta2),P(ut(l),1-this.beta2)),p=be(h,n),f=be(d,r);c.assign(h),u.assign(d);let m=ie(P(be(p,ie(tn(f),this.epsilon)),-this.learningRate),i);i.assign(m)}),this.accBeta1.assign(P(this.accBeta1,this.beta1)),this.accBeta2.assign(P(this.accBeta2,this.beta2))}),this.incrementIterations()}dispose(){this.accBeta1.dispose(),this.accBeta2.dispose(),this.accumulatedFirstMoment!=null&&Te(this.accumulatedFirstMoment.map(e=>e.variable)),this.accumulatedSecondMoment!=null&&Te(this.accumulatedSecondMoment.map(e=>e.variable))}async getWeights(){let e=[...this.accumulatedFirstMoment,...this.accumulatedSecondMoment];return[await this.saveIterations()].concat(e.map(t=>({name:t.originalName,tensor:t.variable})))}async setWeights(e){e=await this.extractIterations(e),z(()=>{this.accBeta1.assign(la(this.beta1,this.iterations_+1)),this.accBeta2.assign(la(this.beta2,this.iterations_+1))});let t=e.length/2,n=!1;this.accumulatedFirstMoment=e.slice(0,t).map(r=>({originalName:r.name,variable:r.tensor.variable(n)})),this.accumulatedSecondMoment=e.slice(t,t*2).map(r=>({originalName:r.name,variable:r.tensor.variable(n)}))}getConfig(){return{learningRate:this.learningRate,beta1:this.beta1,beta2:this.beta2,epsilon:this.epsilon}}static fromConfig(e,t){return new e(t.learningRate,t.beta1,t.beta2,t.epsilon)}};np.className="Adam";Oa(np);var rp=class extends ca{constructor(e,t,n,r=null,a=0){super();this.learningRate=e,this.beta1=t,this.beta2=n,this.epsilon=r,this.decay=a,this.accumulatedFirstMoment=[],this.accumulatedWeightedInfNorm=[],z(()=>{this.iteration=Ie(0).variable(),this.accBeta1=Ie(t).variable()}),r==null&&(this.epsilon=$.backend.epsilon())}applyGradients(e){let t=Array.isArray(e)?e.map(n=>n.name):Object.keys(e);z(()=>{let n=we(1,this.accBeta1),r=be(-this.learningRate,ie(P(this.iteration,this.decay),1));t.forEach((a,s)=>{let i=$.registeredVariables[a],o=!1;this.accumulatedFirstMoment[s]==null&&(this.accumulatedFirstMoment[s]={originalName:`${a}/m`,variable:qe(i).variable(o)}),this.accumulatedWeightedInfNorm[s]==null&&(this.accumulatedWeightedInfNorm[s]={originalName:`${a}/v`,variable:qe(i).variable(o)});let l=Array.isArray(e)?e[s].tensor:e[a];if(l==null)return;let c=this.accumulatedFirstMoment[s].variable,u=this.accumulatedWeightedInfNorm[s].variable,h=ie(P(c,this.beta1),P(l,1-this.beta1)),d=P(u,this.beta2),p=Lt(l),f=Wr(d,p);c.assign(h),u.assign(f);let m=ie(P(be(r,n),be(h,ie(f,this.epsilon))),i);i.assign(m)}),this.iteration.assign(ie(this.iteration,1)),this.accBeta1.assign(P(this.accBeta1,this.beta1))}),this.incrementIterations()}dispose(){this.accBeta1.dispose(),this.iteration.dispose(),this.accumulatedFirstMoment!=null&&Te(this.accumulatedFirstMoment.map(e=>e.variable)),this.accumulatedWeightedInfNorm!=null&&Te(this.accumulatedWeightedInfNorm.map(e=>e.variable))}async getWeights(){throw new Error("getWeights() is not implemented for Adamax yet.")}async setWeights(e){throw new Error("setWeights() is not implemented for Adamax yet.")}getConfig(){return{learningRate:this.learningRate,beta1:this.beta1,beta2:this.beta2,epsilon:this.epsilon,decay:this.decay}}static fromConfig(e,t){return new e(t.learningRate,t.beta1,t.beta2,t.epsilon,t.decay)}};rp.className="Adamax";Oa(rp);var cc=class extends ca{constructor(e){super();this.learningRate=e,this.setLearningRate(e)}applyGradients(e){(Array.isArray(e)?e.map(t=>t.name):Object.keys(e)).forEach((t,n)=>{let r=Array.isArray(e)?e[n].tensor:e[t];if(r==null)return;let a=$.registeredVariables[t];z(()=>{let s=ie(P(this.c,r),a);a.assign(s)})}),this.incrementIterations()}setLearningRate(e){this.learningRate=e,this.c!=null&&this.c.dispose(),this.c=qt(Ie(-e))}dispose(){this.c.dispose()}async getWeights(){return[await this.saveIterations()]}async setWeights(e){if(e=await this.extractIterations(e),e.length!==0)throw new Error("SGD optimizer does not have settable weights.")}getConfig(){return{learningRate:this.learningRate}}static fromConfig(e,t){return new e(t.learningRate)}};cc.className="SGD";Oa(cc);var ap=class extends cc{constructor(e,t,n=!1){super(e);this.learningRate=e,this.momentum=t,this.useNesterov=n,this.accumulations=[],this.m=Ie(this.momentum)}applyGradients(e){(Array.isArray(e)?e.map(t=>t.name):Object.keys(e)).forEach((t,n)=>{let r=$.registeredVariables[t];if(this.accumulations[n]==null){let i=!1;this.accumulations[n]={originalName:`${t}/momentum`,variable:z(()=>qe(r).variable(i))}}let a=this.accumulations[n].variable,s=Array.isArray(e)?e[n].tensor:e[t];s!=null&&z(()=>{let i,o=ie(P(this.m,a),s);this.useNesterov?i=ie(P(this.c,ie(s,P(o,this.m))),r):i=ie(P(this.c,o),r),a.assign(o),r.assign(i)})}),this.incrementIterations()}dispose(){this.m.dispose(),this.accumulations!=null&&Te(this.accumulations.map(e=>e.variable))}setMomentum(e){this.momentum=e}async getWeights(){return[await this.saveIterations()].concat(this.accumulations.map(e=>({name:e.originalName,tensor:e.variable})))}async setWeights(e){e=await this.extractIterations(e);let t=!1;this.accumulations=e.map(n=>({originalName:n.name,variable:n.tensor.variable(t)}))}getConfig(){return{learningRate:this.learningRate,momentum:this.momentum,useNesterov:this.useNesterov}}static fromConfig(e,t){return new e(t.learningRate,t.momentum,t.useNesterov)}};ap.className="Momentum";Oa(ap);var sp=class extends ca{constructor(e,t=.9,n=0,r=null,a=!1){super();if(this.learningRate=e,this.decay=t,this.momentum=n,this.epsilon=r,this.accumulatedMeanSquares=[],this.accumulatedMoments=[],this.accumulatedMeanGrads=[],this.centered=a,r==null&&(this.epsilon=$.backend.epsilon()),e==null)throw new Error("learningRate for RMSPropOptimizer must be defined.")}applyGradients(e){(Array.isArray(e)?e.map(t=>t.name):Object.keys(e)).forEach((t,n)=>{let r=$.registeredVariables[t],a=!1;this.accumulatedMeanSquares[n]==null&&(this.accumulatedMeanSquares[n]={originalName:`${t}/rms`,variable:z(()=>qe(r).variable(a))}),this.accumulatedMoments[n]==null&&(this.accumulatedMoments[n]={originalName:`${t}/momentum`,variable:z(()=>qe(r).variable(a))}),this.accumulatedMeanGrads[n]==null&&this.centered&&(this.accumulatedMeanGrads[n]={originalName:`${t}/mg`,variable:z(()=>qe(r).variable(a))});let s=Array.isArray(e)?e[n].tensor:e[t];if(s==null)return;let i=this.accumulatedMeanSquares[n].variable,o=this.accumulatedMoments[n].variable;z(()=>{let l=ie(P(i,this.decay),P(ut(s),1-this.decay));if(this.centered){let c=this.accumulatedMeanGrads[n].variable,u=ie(P(c,this.decay),P(s,1-this.decay)),h=be(P(s,this.learningRate),tn(we(l,ie(ut(u),this.epsilon)))),d=ie(P(o,this.momentum),h);i.assign(l),c.assign(u),o.assign(d);let p=we(r,d);r.assign(p)}else{let c=ie(P(i,this.decay),P(ut(s),1-this.decay)),u=ie(P(o,this.momentum),be(P(s,this.learningRate),tn(ie(c,this.epsilon))));i.assign(c),o.assign(u);let h=we(r,u);r.assign(h)}})}),this.incrementIterations()}dispose(){this.accumulatedMeanSquares!=null&&Te(this.accumulatedMeanSquares.map(e=>e.variable)),this.accumulatedMeanGrads!=null&&this.centered&&Te(this.accumulatedMeanGrads.map(e=>e.variable)),this.accumulatedMoments!=null&&Te(this.accumulatedMoments.map(e=>e.variable))}async getWeights(){let e=[...this.accumulatedMeanSquares,...this.accumulatedMoments];return this.centered&&e.push(...this.accumulatedMeanGrads),[await this.saveIterations()].concat(e.map(t=>({name:t.originalName,tensor:t.variable})))}async setWeights(e){e=await this.extractIterations(e);let t=this.centered?e.length/3:e.length/2,n=!1;this.accumulatedMeanSquares=e.slice(0,t).map(r=>({originalName:r.name,variable:r.tensor.variable(n)})),this.accumulatedMoments=e.slice(t,t*2).map(r=>({originalName:r.name,variable:r.tensor.variable(n)})),this.centered&&(this.accumulatedMeanGrads=e.slice(t*2,t*3).map(r=>({originalName:r.name,variable:r.tensor.variable(n)})))}getConfig(){return{learningRate:this.learningRate,decay:this.decay,momentum:this.momentum,epsilon:this.epsilon,centered:this.centered}}static fromConfig(e,t){return new e(t.learningRate,t.decay,t.momentum,t.epsilon,t.centered)}};sp.className="RMSProp";Oa(sp);var wi=class{static sgd(e){return new cc(e)}static momentum(e,t,n=!1){return new ap(e,t,n)}static rmsprop(e,t=.9,n=0,r=null,a=!1){return new sp(e,t,n,r,a)}static adam(e=.001,t=.9,n=.999,r=null){return new np(e,t,n,r)}static adadelta(e=.001,t=.95,n=null){return new ep(e,t,n)}static adamax(e=.002,t=.9,n=.999,r=null,a=0){return new rp(e,t,n,r,a)}static adagrad(e,t=.1){return new tp(e,t)}},bi={sgd:wi.sgd,momentum:wi.momentum,adadelta:wi.adadelta,adagrad:wi.adagrad,rmsprop:wi.rmsprop,adamax:wi.adamax,adam:wi.adam},JC=(()=>typeof requestAnimationFrame!="undefined"?requestAnimationFrame:typeof setImmediate!="undefined"?setImmediate:e=>e())();function ip(){return new Promise(e=>JC(()=>e()))}var R={};Le(R,{ERF_A1:()=>uR,ERF_A2:()=>cR,ERF_A3:()=>hR,ERF_A4:()=>dR,ERF_A5:()=>pR,ERF_P:()=>lR,PARALLELIZE_THRESHOLD:()=>jm,SELU_SCALE:()=>iw,SELU_SCALEALPHA:()=>sw,applyActivation:()=>Jd,assertAndGetBroadcastShape:()=>yt,assertAxesAreInnerMostDims:()=>$S,assertParamsConsistent:()=>QC,assignToTypedArray:()=>bR,axesAreInnerMostDims:()=>_m,calculateShapes:()=>K5,combineLocations:()=>Rx,complexWithEvenIndex:()=>gR,complexWithOddIndex:()=>xR,computeConv2DInfo:()=>Xu,computeConv3DInfo:()=>fx,computeDefaultPad:()=>cm,computeDilation2DInfo:()=>aN,computeOptimalWindowSize:()=>tR,computeOutAndReduceShapes:()=>Fx,computeOutShape:()=>eR,computePool2DInfo:()=>px,computePool3DInfo:()=>sN,convertConv2DDataFormat:()=>dx,eitherStridesOrDilationsAreOne:()=>Pr,expandShapeToKeepDim:()=>gi,exponent:()=>vR,exponents:()=>_R,fromStringArrayToUint8:()=>NR,fromUint8ToStringArray:()=>IR,getAxesPermutation:()=>Mx,getBroadcastDims:()=>ZN,getComplexWithIndex:()=>wR,getFusedBiasGradient:()=>Yd,getFusedDyActivation:()=>Zd,getImageCenter:()=>nR,getInnerMostAxes:()=>DS,getPermuted:()=>aR,getReductionAxes:()=>Wt,getReshaped:()=>rR,getReshapedPermuted:()=>sR,getSliceBeginCoords:()=>iR,getSliceSize:()=>oR,getUndoAxesPermutation:()=>vm,log:()=>mR,mergeRealAndImagArrays:()=>AR,prepareAndValidate:()=>X5,prepareSplitSize:()=>kR,segment_util:()=>ow,shouldFuse:()=>Qd,slice_util:()=>cn,splitRealAndImagArrays:()=>yR,tupleValuesAreOne:()=>Pa,upcastType:()=>lr,validateInput:()=>Kf,validateUpdateShape:()=>Xf,warn:()=>fR});function QC(e,t){let n=e[0].length;e.forEach((a,s)=>{F(a.length===n,()=>`Error in concat${n}D: rank of tensors[${s}] must be the same as the rank of the rest (${n})`)}),F(t>=0&&t`Error in concat${n}D: axis must be between 0 and ${n-1}.`);let r=e[0];e.forEach((a,s)=>{for(let i=0;i`Error in concat${n}D: Shape of tensors[${s}] (${a}) does not match the shape of the rest (${r}) along the non-concatenated axis ${s}.`)})}function eR(e,t){let n=e[0].slice();for(let r=1;r=t*2+1||i%2==1?s.push(i):a.push(i);r.push(...a),r.push(0),r.push(...s)}return r}function sR(e,t,n,r=!0){let a=[];r?a.push(e[0]/n):a.push(e[0]*n);for(let s=1;s"Number of splits must evenly divide the axis."),r=new Array(t).fill(e.shape[n]/t);else{let a=t.reduce((i,o)=>(o===-1&&(i+=1),i),0);F(a<=1,()=>"There should be only one negative value in split array.");let s=t.indexOf(-1);if(s!==-1){let i=t.reduce((o,l)=>l>0?o+l:o);t[s]=e.shape[n]-i}F(e.shape[n]===t.reduce((i,o)=>i+o),()=>"The sum of sizes must match the size of the axis dimension."),r=t}return r}var ow={};Le(ow,{collectGatherOpShapeInfo:()=>ER,computeOutShape:()=>TR,segOpComputeOptimalWindowSize:()=>SR});function SR(e,t){let n=!1,r;for(e<=jm?(r=e,n=!0):r=Fh(e,Math.floor(Math.sqrt(e)));!n;)r>t||r===e?n=!0:r=Fh(e,r+1);return r}function TR(e,t,n){let r=[],a=e.length;for(let s=0;sa))throw new Error(`Expect batchDims in the range of [-${a}, ${a}], but got ${r}`);if(r<0&&(r+=a),r>s)throw new Error(`batchDims (${r}) must be less than rank(x) ( - ${s}).`);if(nfd(t))}catch(t){throw new Error(`Failed to decode encoded string bytes into utf-8, error: ${t}`)}}function NR(e){return e.map(t=>zu(t))}var Ur={};Le(Ur,{nonMaxSuppressionV3Impl:()=>Yx,nonMaxSuppressionV4Impl:()=>Jx,nonMaxSuppressionV5Impl:()=>Qx,whereImpl:()=>Bx});function ke(e,t){Array.isArray(e)||(e=[e]),e.forEach(n=>{n!=null&&v.assert(n.dtype!=="complex64",()=>`${t} does not support complex64 tensors in the CPU backend.`)})}var CR=Ur.whereImpl,op=class extends mu{constructor(){super();this.blockSize=48,this.firstUse=!0,this.data=new Ch(this,zr())}nextDataId(){return op.nextDataId++}write(e,t,n){this.firstUse&&(this.firstUse=!1,J().get("IS_NODE")&&R.warn(` -============================ -Hi there \u{1F44B}. Looks like you are running TensorFlow.js in Node.js. To speed things up dramatically, install our node backend, which binds to TensorFlow C++, by running npm i @tensorflow/tfjs-node, or npm i @tensorflow/tfjs-node-gpu if you have CUDA. Then call require('@tensorflow/tfjs-node'); (-gpu suffix for CUDA) at the start of your program. Visit https://github.com/tensorflow/tfjs-node for more details. -============================`));let r={id:this.nextDataId()};return this.data.set(r,{values:e,dtype:n,refCount:1}),r}makeTensorInfo(e,t,n){let r;if(t==="string"&&n!=null&&n.length>0&&v.isString(n[0])){let a=n.map(s=>v.encodeString(s));r=this.write(a,e,t)}else r=this.write(n,e,t);return{dataId:r,shape:e,dtype:t}}refCount(e){return this.data.has(e)?this.data.get(e).refCount:0}incRef(e){let t=this.data.get(e);t.refCount++}decRef(e){if(this.data.has(e)){let t=this.data.get(e);t.refCount--}}move(e,t,n,r,a){this.data.set(e,{values:t,dtype:r,refCount:a})}numDataIds(){return this.data.numDataIds()}async read(e){return this.readSync(e)}readSync(e){let{dtype:t,complexTensorInfos:n}=this.data.get(e);if(t==="complex64"){let r=this.readSync(n.real.dataId),a=this.readSync(n.imag.dataId);return R.mergeRealAndImagArrays(r,a)}return this.data.get(e).values}bufferSync(e){let t=this.readSync(e.dataId),n=t;if(e.dtype==="string")try{n=t.map(r=>v.decodeString(r))}catch(r){throw new Error("Failed to decode encoded string bytes into utf-8")}return Ve(e.shape,e.dtype,n)}makeOutput(e,t,n){let r=this.write(e,t,n);return zr().makeTensorFromDataId(r,t,n,this)}disposeData(e,t=!1){if(this.data.has(e)){if(this.data.get(e).refCount--,!t&&this.data.get(e).refCount>0)return!1;let{complexTensorInfos:n}=this.data.get(e);n!=null&&(this.disposeData(n.real.dataId,!0),this.disposeData(n.imag.dataId,!0)),this.data.delete(e)}return!0}disposeIntermediateTensorInfo(e){this.disposeData(e.dataId)}async time(e){let t=v.now();return e(),{kernelMs:v.now()-t}}memory(){return{unreliable:!0,reasons:["The reported memory is an upper bound. Due to automatic garbage collection, the true allocated memory may be less."]}}where(e){ke([e],"where");let t=this.readSync(e.dataId);return CR(e.shape,t)}dispose(){}floatPrecision(){return 32}epsilon(){return super.epsilon()}};op.nextDataId=0;var Hm={};Le(Hm,{addImpl:()=>uw,bincountImpl:()=>Gm,bincountReduceImpl:()=>cw,ceilImpl:()=>hw,concatImpl:()=>qm,expImpl:()=>dw,expm1Impl:()=>pw,floorImpl:()=>fw,gatherV2Impl:()=>mw,greaterImpl:()=>Aw,lessImpl:()=>yw,linSpaceImpl:()=>gw,logImpl:()=>xw,maxImpl:()=>ww,maximumImpl:()=>bw,minimumImpl:()=>_w,multiplyImpl:()=>Xm,negImpl:()=>vw,notEqualImpl:()=>kw,prodImpl:()=>Iw,rangeImpl:()=>Zm,rsqrtImpl:()=>Nw,simpleAbsImpl:()=>lw,sliceImpl:()=>lp,squaredDifferenceImpl:()=>Sw,stridedSliceImpl:()=>Tw,subImpl:()=>Ew,tileImpl:()=>Cw,topKImpl:()=>Rw,transposeImpl:()=>Km,uniqueImpl:()=>Fw});function lw(e){let t=new Float32Array(e.length);for(let n=0;n{let{x:t}=e.inputs,n=e.backend;ke(t,"abs");let r=new Float32Array(v.sizeFromShape(t.shape)),a=n.data.get(t.dataId).values;return r=lw(a),n.makeOutput(r,t.shape,"float32")},FR={kernelName:so,backendName:"cpu",kernelFunc:RR};function $t(e){return(t,n,r,a,s)=>{let i=R.assertAndGetBroadcastShape(t,n),o=i.length,l=v.computeStrides(i),c=v.sizeFromShape(i),u=v.getTypedArrayFromDType(s,c),h=t.length,d=n.length,p=v.computeStrides(t),f=v.computeStrides(n),m=R.getBroadcastDims(t,i),A=R.getBroadcastDims(n,i);if(m.length+A.length===0)for(let y=0;yw[N]=0);let b=v.locToIndex(w,h,p),_=g.slice(-d);A.forEach(N=>_[N]=0);let x=v.locToIndex(_,d,f);u[y]=e(r[b],a[x])}return[u,i]}}function Pn(e){let{inputs:t,backend:n}=e,{real:r,imag:a}=t,s=n.data.get(r.dataId).values,i=n.data.get(a.dataId).values,o=n.makeTensorInfo(r.shape,"complex64"),l=n.data.get(o.dataId);return l.complexTensorInfos={real:n.makeTensorInfo(r.shape,"float32",s),imag:n.makeTensorInfo(a.shape,"float32",i)},o}var MR={kernelName:Lh,backendName:"cpu",kernelFunc:Pn};function up(e,t,n="float32"){if(n==="complex64"){let a=up(e,t,"float32"),s=up(e,t,"float32");return Pn({inputs:{real:a,imag:s},backend:e})}let r=v.makeZerosTypedArray(v.sizeFromShape(t),n);return e.makeTensorInfo(t,n,r)}function jr(e){let{inputs:t,backend:n}=e,{x:r}=t;return n.incRef(r.dataId),{dataId:r.dataId,shape:r.shape,dtype:r.dtype}}var $R={kernelName:Rs,backendName:"cpu",kernelFunc:jr};function _i(e){let{inputs:t,backend:n}=e,{input:r}=t,a=n.data.get(r.dataId).complexTensorInfos.real,s=n.data.get(a.dataId).values;return n.makeTensorInfo(a.shape,a.dtype,s)}var DR={kernelName:sd,backendName:"cpu",kernelFunc:_i};function ja(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{dtype:s}=r;if(s==="complex64"){if(a.dtype==="complex64")return jr({inputs:{x:a},backend:n});let i=up(n,a.shape,a.dtype),o=ja({inputs:{x:a},backend:n,attrs:{dtype:"float32"}}),l=Pn({inputs:{real:o,imag:i},backend:n});return n.disposeIntermediateTensorInfo(i),n.disposeIntermediateTensorInfo(o),l}if(a.dtype==="complex64"){let i=_i({inputs:{input:a},backend:n}),o=ja({inputs:{x:i},backend:n,attrs:{dtype:s}});return n.disposeIntermediateTensorInfo(i),o}if(!v.hasEncodingLoss(a.dtype,s)){let i=jr({inputs:{x:a},backend:n});return{dataId:i.dataId,shape:i.shape,dtype:s}}if(s==="int32"){let i=n.data.get(a.dataId).values,o=Int32Array.from(i);return n.makeTensorInfo(a.shape,"int32",o)}if(s==="bool"){let i=n.data.get(a.dataId).values,o=v.toTypedArray([0],a.dtype),[l,c]=$t((u,h)=>u!==h?1:0)(a.shape,[],i,o,"bool");return n.makeTensorInfo(c,"bool",l)}throw new Error(`Error in Cast: failed to cast ${a.dtype} to ${s}`)}var OR={kernelName:gs,backendName:"cpu",kernelFunc:ja};function Xt(e,t,n,r){return n==null?({inputs:a,backend:s})=>{let{a:i,b:o}=a,l=s;ke([i,o],e);let c=l.data.get(i.dataId).values,u=l.data.get(o.dataId).values,h=r||i.dtype,[d,p]=t(i.shape,o.shape,c,u,h);return l.makeTensorInfo(p,h,d)}:({inputs:a,backend:s})=>{let{a:i,b:o}=a,l=s;if(i.dtype==="complex64"||o.dtype==="complex64"){let c=ja({inputs:{x:i},backend:l,attrs:{dtype:"complex64"}}),u=l.data.get(c.dataId),h=u.complexTensorInfos.real,d=u.complexTensorInfos.imag,p=l.data.get(h.dataId).values,f=l.data.get(d.dataId).values,m=ja({inputs:{x:o},backend:l,attrs:{dtype:"complex64"}}),A=l.data.get(m.dataId),y=A.complexTensorInfos.real,g=A.complexTensorInfos.imag,w=l.data.get(y.dataId).values,b=l.data.get(g.dataId).values,[_,x,N]=n(i.shape,o.shape,p,f,w,b),T=l.makeTensorInfo(N,"float32",_),E=l.makeTensorInfo(N,"float32",x),M=Pn({inputs:{real:T,imag:E},backend:l});return l.disposeIntermediateTensorInfo(c),l.disposeIntermediateTensorInfo(m),l.disposeIntermediateTensorInfo(T),l.disposeIntermediateTensorInfo(E),M}else{let c=l.data.get(i.dataId).values,u=l.data.get(o.dataId).values,h=r||i.dtype,[d,p]=t(i.shape,o.shape,c,u,h);return l.makeTensorInfo(p,h,d)}}}function Ym(e){return(t,n,r,a,s,i)=>{let o=R.assertAndGetBroadcastShape(t,n),l=v.sizeFromShape(o),c=o.length,u=v.computeStrides(o),h=v.getTypedArrayFromDType("float32",l),d=v.getTypedArrayFromDType("float32",l),p=R.getBroadcastDims(t,o),f=R.getBroadcastDims(n,o),m=R.mergeRealAndImagArrays(r,a),A=R.mergeRealAndImagArrays(s,i),y=t.length,g=v.computeStrides(t),w=n.length,b=v.computeStrides(n);if(p.length+f.length===0)for(let _=0;_N[W]=0);let T=v.locToIndex(N,y,g),E=x.slice(-w);f.forEach(W=>E[W]=0);let M=v.locToIndex(E,w,b),O=e(m[T*2],m[T*2+1],A[M*2],A[M*2+1]);h[_]=O.real,d[_]=O.imag}return[h,d,o]}}var uw=$t((e,t)=>e+t),zR=Ym((e,t,n,r)=>({real:e+n,imag:t+r})),hc=Xt(Ea,uw,zR),PR={kernelName:Ea,backendName:"cpu",kernelFunc:hc};function Gm(e,t,n,r,a){let s=v.sizeFromShape(r),i=v.makeZerosTypedArray(a,n);for(let o=0;o=a||(s>0?i[l]+=t[o]:i[l]+=1)}return i}function cw(e,t,n,r=!1){let a=e.shape[0],s=e.shape[1],i=Ve([a,n],t.dtype);for(let o=0;o=n||(r?i.set(1,o,c):t.size>0?i.set(i.get(o,c)+t.get(o,l),o,c):i.set(i.get(o,c)+1,o,c))}return i}function Tl(e){return(t,n,r)=>{let a=v.getTypedArrayFromDType(n,t.length);for(let s=0;s{let{x:i}=r;if(ke(i,e),i.dtype==="string"||n==="string")throw new Error("unaryKernelFunc does not support string input/output");let o=s,l=o.data.get(i.dataId).values,c=v.sizeFromShape(i.shape),u=n||i.dtype,h=v.getArrayFromDType(u,c);for(let d=0;d{let{x:i}=r;if(ke(i,e),i.dtype==="string"||n==="string")throw new Error("unaryKernelFunc does not support string input/output");let o=s,l=o.data.get(i.dataId).values,c=n||i.dtype,u=t(l,c,a);return o.makeTensorInfo(i.shape,c,u)}}var hw=Tl(e=>Math.ceil(e)),LR=El(xs,hw),WR={kernelName:xs,backendName:"cpu",kernelFunc:LR};function qm(e,t,n,r){let a=v.getArrayFromDType(n,v.sizeFromShape(t));if(r&&n!=="string"){let s=0;e.forEach(i=>{let o=v.sizeFromShape(i.shape);a.set(i.vals,s),s+=o})}else{let s=0;e.forEach(i=>{let o=n==="string"?R.fromUint8ToStringArray(i.vals):i.vals,l=0;for(let c=0;cMath.exp(e)),Mw=El(Ns,dw),BR={kernelName:Ns,backendName:"cpu",kernelFunc:Mw},pw=Tl(e=>Math.expm1(e)),VR=El(_o,pw),UR={kernelName:_o,backendName:"cpu",kernelFunc:VR},fw=Tl(e=>Math.floor(e)),jR=El(Ss,fw),HR={kernelName:Ss,backendName:"cpu",kernelFunc:jR};function mw(e,t,n){let r=Ve(n,e.dtype);for(let a=0;ae>t?1:0),GR=Xt(No,Aw,null,"bool"),qR={kernelName:No,backendName:"cpu",kernelFunc:GR},yw=$t((e,t)=>eMath.log(e)),ZR=El(Ms,xw),YR={kernelName:Ms,backendName:"cpu",kernelFunc:ZR};function ww(e,t,n,r){let a=v.getTypedArrayFromDType(r,v.sizeFromShape(n));for(let s=0;so&&(o=c)}a[s]=o}return a}var bw=$t((e,t)=>Math.max(e,t)),JR=Xt(Ds,bw),QR={kernelName:Ds,backendName:"cpu",kernelFunc:JR},_w=$t((e,t)=>Math.min(e,t)),eF=Xt(Ls,_w),tF={kernelName:Ls,backendName:"cpu",kernelFunc:eF},Xm=$t((e,t)=>e*t),nF=Ym((e,t,n,r)=>({real:e*n-t*r,imag:e*r+t*n})),Jm=Xt(Ws,Xm,nF),rF={kernelName:Ws,backendName:"cpu",kernelFunc:Jm};function vw(e,t,n){let r=v.createScalarValue(-1,n);return Xm([],t,r,e,n)}function aF(e){let{inputs:t,backend:n}=e,{x:r}=t;ke(r,"neg");let a=n.data.get(r.dataId).values,[s,i]=vw(a,r.shape,r.dtype);return n.makeTensorInfo(i,r.dtype,s)}var sF={kernelName:Do,backendName:"cpu",kernelFunc:aF},kw=$t((e,t)=>e!==t?1:0),iF=Xt(Oo,kw,null,"bool"),oF={kernelName:Oo,backendName:"cpu",kernelFunc:iF};function Km(e,t,n,r,a){let s=t.length,i=v.sizeFromShape(t),o=v.computeStrides(t),l=v.computeStrides(a),c=v.getTypedArrayFromDType(n,v.sizeFromShape(a));for(let u=0;un.disposeIntermediateTensorInfo(g)),n.makeTensorInfo(y,A,f)}var cF={kernelName:Vo,backendName:"cpu",kernelFunc:uF};function Zm(e,t,n,r){let a=e===t,s=e1;if(a||s||i)return v.makeZerosTypedArray(0,r);let o=Math.abs(Math.ceil((t-e)/n)),l=v.makeZerosTypedArray(o,r);t1/Math.sqrt(e)),hF=El(Zs,Nw),dF={kernelName:Zs,backendName:"cpu",kernelFunc:hF};function lp(e,t,n,r,a){let s=cn.isSliceContinous(r,t,n),i=v.sizeFromShape(n),o=v.computeStrides(r);if(s){let h=cn.computeFlatOffset(t,o);return a==="string"?e.slice(h,h+i):e.subarray(h,h+i)}let l=a==="string"?R.fromUint8ToStringArray(e):e,c=Ve(r,a,l),u=Ve(n,a);for(let h=0;hf+t[m]);u.set(c.get(...p),...d)}return a==="string"?R.fromStringArrayToUint8(u.values):u.values}function vi(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{begin:s,size:i}=r;ke(a,"slice");let[o,l]=cn.parseSliceParams(a,s,i);cn.assertParamsValid(a,o,l);let c=n.data.get(a.dataId).values,u=lp(c,o,l,a.shape,a.dtype);return n.makeTensorInfo(l,a.dtype,u)}var pF={kernelName:Xo,backendName:"cpu",kernelFunc:vi},Sw=$t((e,t)=>{let n=e-t;return n*n}),fF=Xt(ni,Sw),mF={kernelName:ni,backendName:"cpu",kernelFunc:fF};function Tw(e,t,n,r){let a=Ve(e,t.dtype);for(let s=0;se-t),AF=Ym((e,t,n,r)=>({real:e-n,imag:t-r})),Qm=Xt(ri,Ew,AF),yF={kernelName:ri,backendName:"cpu",kernelFunc:Qm};function Cw(e,t){let n=new Array(e.rank);for(let a=0;aw.value-g.value);let m=h*r,A=l.subarray(m,m+r),y=c.subarray(m,m+r);for(let g=0;g{for(let A=0;Anew op,1);var Dw=ot(go,e=>e>=0?e:Math.exp(e)-1),gF={kernelName:go,backendName:"cpu",kernelFunc:Dw};function Ow(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{alpha:s}=r;ke([a],"leakyRelu");let i=v.sizeFromShape(a.shape),o=n.data.get(a.dataId).values,l=v.getTypedArrayFromDType("float32",i);for(let c=0;ce<0?t*e:e);function zw(e){let{inputs:t,backend:n}=e,{x:r,alpha:a}=t;ke([r,a],"prelu");let s=n.data.get(r.dataId).values,i=n.data.get(a.dataId).values,[o,l]=wF(r.shape,a.shape,s,i,r.dtype);return n.makeTensorInfo(l,r.dtype,o)}var bF={kernelName:js,backendName:"cpu",kernelFunc:zw},Pw=ot(Hs,e=>Math.max(0,e)),_F={kernelName:Hs,backendName:"cpu",kernelFunc:Pw},Lw=ot(qs,e=>Math.min(Math.max(0,e),6)),vF={kernelName:qs,backendName:"cpu",kernelFunc:Lw};function eA(e,t,n,r,a){if(n==="linear")return jr({inputs:{x:t},backend:e});if(n==="relu")return Pw({inputs:{x:t},backend:e});if(n==="elu")return Dw({inputs:{x:t},backend:e});if(n==="relu6")return Lw({inputs:{x:t},backend:e});if(n==="prelu")return zw({inputs:{x:t,alpha:r},backend:e});if(n==="leakyrelu")return Ow({inputs:{x:t},backend:e,attrs:{alpha:a}});throw new Error(`Activation ${n} has not been implemented for the CPU backend.`)}function gt(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{shape:s}=r,i=v.sizeFromShape(a.shape),o=v.inferFromImplicitShape(s,i),l=v.sizeFromShape(o);v.assert(i===l,()=>`The new shape (${o}) has ${l} elements and the old shape (${a.shape}) has ${i} elements. The new shape and old shape must have the same number of elements.`),n.incRef(a.dataId);let c=n.data.get(a.dataId);if(c.complexTensorInfos!=null){let u=c.complexTensorInfos.real,h=c.complexTensorInfos.imag;u.shape=o,h.shape=o}return{dataId:a.dataId,shape:o,dtype:a.dtype}}var kF={kernelName:jo,backendName:"cpu",kernelFunc:gt};function Ww(e){let{inputs:t,backend:n,attrs:r}=e,{a,b:s}=t,{transposeA:i,transposeB:o}=r;ke([a,s],"matMul");let l=a.shape.length,c=s.shape.length,u=i?a.shape[l-2]:a.shape[l-1],h=o?s.shape[c-1]:s.shape[c-2],d=i?a.shape[l-1]:a.shape[l-2],p=o?s.shape[c-2]:s.shape[c-1],f=a.shape.slice(0,-2),m=s.shape.slice(0,-2),A=v.sizeFromShape(f),y=v.sizeFromShape(m),g=A===y||A===1||y===1;v.assert(l>=2&&c>=2&&g,()=>`Error in matMul: the input batch dimensions must either be the same or at least one input batch dimension must be 1. Got input batch dimensions of (${f}) and (${m}).`);let w=(A>y?a.shape.slice(0,-2):s.shape.slice(0,-2)).concat([d,p]);v.assert(u===h,()=>`Error in matMul: inner shapes (${u}) and (${h}) of Tensors with shapes ${a.shape} and ${s.shape} and transposeA=${i} and transposeB=${o} must match.`);let b=i?[A,u,d]:[A,d,u],_=o?[y,p,h]:[y,h,p],x=gt({inputs:{x:a},backend:n,attrs:{shape:b}}),N=gt({inputs:{x:s},backend:n,attrs:{shape:_}}),T=i?x.shape[1]:x.shape[2],E=i?x.shape[2]:x.shape[1],M=o?N.shape[1]:N.shape[2],O=Math.max(A,y),W=n.data.get(x.dataId).values,V=n.data.get(N.dataId).values,U=v.computeStrides(x.shape),j=v.computeStrides(N.shape),[X,G,ee]=i?[U[0],1,U[1]]:[U[0],U[1],1],[Y,se,te]=o?[1,j[1],j[0]]:[j[1],1,j[0]],le=E*M,Q=Ve([O,E,M],x.dtype),pe=Q.values,ue=n.blockSize;for(let ye=0;yeMath.acos(e)),EF={kernelName:io,backendName:"cpu",kernelFunc:TF},CF=ot(oo,e=>Math.acosh(e)),RF={kernelName:oo,backendName:"cpu",kernelFunc:CF};function FF(e){let{inputs:t,backend:n}=e,r=t;ke(t,"addN");let a=r.map(o=>n.data.get(o.dataId).values),s=Ve(r[0].shape,r[0].dtype),i=s.values;for(let o=0;og&&(g=_,w=b)}p[A]=w}return c.forEach(A=>n.disposeIntermediateTensorInfo(A)),n.makeTensorInfo(u,"int32",p)}var LF={kernelName:ms,backendName:"cpu",kernelFunc:PF};function WF(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{axis:s}=r;ke(a,"argMin");let i=v.parseAxisParam(s,a.shape),o=R.getAxesPermutation(i,a.shape.length),l=a,c=[];o!=null&&(l=dr({inputs:{x:a},backend:n,attrs:{perm:o}}),c.push(l),i=R.getInnerMostAxes(i.length,l.shape.length)),i=[i[0]],R.assertAxesAreInnerMostDims("argMin",i,l.shape.length);let[u,h]=R.computeOutAndReduceShapes(l.shape,i),d=v.sizeFromShape(u),p=v.makeZerosTypedArray(d,"int32"),f=v.sizeFromShape(h),m=n.data.get(l.dataId).values;for(let A=0;An.disposeIntermediateTensorInfo(A)),n.makeTensorInfo(u,"int32",p)}var BF={kernelName:gu,backendName:"cpu",kernelFunc:WF},VF=ot(lo,e=>Math.asin(e)),UF={kernelName:lo,backendName:"cpu",kernelFunc:VF},jF=ot(uo,e=>Math.asinh(e)),HF={kernelName:uo,backendName:"cpu",kernelFunc:jF},GF=ot(co,e=>Math.atan(e)),qF={kernelName:co,backendName:"cpu",kernelFunc:GF},XF=$t((e,t)=>Math.atan2(e,t)),KF=Xt(po,XF),ZF={kernelName:po,backendName:"cpu",kernelFunc:KF},YF=ot(ho,e=>Math.atanh(e)),JF={kernelName:ho,backendName:"cpu",kernelFunc:YF};function tA(e,t,n,r,a,s){let i=a.strideHeight,o=a.strideWidth,l=a.dilationHeight,c=a.dilationWidth,u=a.effectiveFilterHeight,h=a.effectiveFilterWidth,d=a.padInfo.top,p=a.padInfo.left,f=s==="max"?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY,m=Ve(a.outShape,n),A=m.values,y=a.outShape[1]*a.outShape[2]*a.outShape[3],g=a.outShape[2]*a.outShape[3],w=a.outShape[3];for(let b=0;bG?G=ue:s==="avg"&&(ee+=ue,Y++)}if(isNaN(G))break}let se=W+V*w+N;A[se]=s==="avg"?ee/Y:G}}}return m}function Bw(e,t,n,r,a=!1,s=!1){let i=Ve(r.outShape,"int32"),o=r.strideHeight,l=r.strideWidth,c=r.dilationHeight,u=r.dilationWidth,h=r.effectiveFilterHeight,d=r.effectiveFilterWidth,p=r.padInfo.top,f=r.padInfo.left,m=Ve(t,n,e);for(let A=0;AM&&(M=X,a?O=s?((A*r.inHeight+W)*r.inWidth+U)*r.inChannels+y:(W*r.inWidth+U)*r.inChannels+y:O=V*d+j)}}i.set(O,A,g,x,y)}}return i}function Vw(e,t,n,r,a,s){let i=a.strideDepth,o=a.strideHeight,l=a.strideWidth,c=a.dilationDepth,u=a.dilationHeight,h=a.dilationWidth,d=a.effectiveFilterDepth,p=a.effectiveFilterHeight,f=a.effectiveFilterWidth,m=a.padInfo.front,A=a.padInfo.top,y=a.padInfo.left,g=s==="max"?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY,w=Ve(a.outShape,n),b=w.values,_=a.outShape[1]*a.outShape[2]*a.outShape[3]*a.outShape[4],x=a.outShape[2]*a.outShape[3]*a.outShape[4],N=a.outShape[3]*a.outShape[4],T=a.outShape[4];for(let E=0;ENe?Ne=Ue:s==="avg"&&(Ce+=Ue,De++),isNaN(Ne))break}if(isNaN(Ne))break}if(isNaN(Ne))break}let Pe=me+W;b[Pe]=s==="avg"?Ce/De:Ne}}}}return w}function QF(e,t){let n=Ve(t.outShape,"int32"),r=t.strideDepth,a=t.strideHeight,s=t.strideWidth,i=t.dilationDepth,o=t.dilationHeight,l=t.dilationWidth,c=t.effectiveFilterDepth,u=t.effectiveFilterHeight,h=t.effectiveFilterWidth,d=t.padInfo.front,p=t.padInfo.top,f=t.padInfo.left;for(let m=0;m=V&&(V=te,U=X*u*h+ee*u+se)}}}n.set(U,m,y,_,E,A)}}}return n}function eM(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t;ke(a,"avgPool");let{filterSize:s,strides:i,pad:o,dimRoundingMode:l}=r,c=1;v.assert(R.eitherStridesOrDilationsAreOne(i,c),()=>`Error in avgPool: Either strides or dilations must be 1. Got strides ${i} and dilations '${c}'`);let u=R.computePool2DInfo(a.shape,s,i,c,o,l),h;if(u.filterWidth===1&&u.filterHeight===1&&v.arraysEqual(u.inShape,u.outShape))h=jr({inputs:{x:a},backend:n});else{let d=n.data.get(a.dataId).values,p=v.computeStrides(a.shape),f=tA(d,a.shape,a.dtype,p,u,"avg");h=n.makeTensorInfo(u.outShape,a.dtype,f.values)}return h}var tM={kernelName:As,backendName:"cpu",kernelFunc:eM};function nM(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{filterSize:s,strides:i,pad:o,dimRoundingMode:l,dataFormat:c}=r;ke(a,"avgPool3d");let u=R.computePool3DInfo(a.shape,s,i,1,o,l,c),h=n.data.get(a.dataId).values,d=Vw(h,a.shape,a.dtype,v.computeStrides(a.shape),u,"avg");return n.makeTensorInfo(d.shape,"float32",d.values)}var rM={kernelName:xu,backendName:"cpu",kernelFunc:nM};function aM(e){let{inputs:t,backend:n,attrs:r}=e,{dy:a,input:s}=t,{filterSize:i,strides:o,pad:l,dimRoundingMode:c}=r;ke([a,s],"avgPool3DGrad");let u=R.computePool3DInfo(s.shape,i,o,1,l,c),h=u.strideDepth,d=u.strideHeight,p=u.strideWidth,f=u.filterDepth,m=u.filterHeight,A=u.filterWidth,y=u.dilationDepth,g=u.dilationHeight,w=u.dilationWidth,b=u.effectiveFilterDepth,_=u.effectiveFilterHeight,x=u.effectiveFilterWidth,N=b-1-u.padInfo.front,T=x-1-u.padInfo.left,E=_-1-u.padInfo.top,M=Ve(s.shape,"float32"),O=1/(f*m*A),W=n.bufferSync(a);for(let V=0;V=u.outDepth||Math.floor(Q)!==Q))for(let pe=0;pe<_;pe+=g){let ue=(Y+pe)/d;if(!(ue<0||ue>=u.outHeight||Math.floor(ue)!==ue))for(let ye=0;ye=u.outWidth||Math.floor(me)!==me||(te+=W.get(V,Q,ue,me,U))}}}M.set(te*O,V,j,X,G,U)}return n.makeTensorInfo(M.shape,M.dtype,M.values)}var sM={kernelName:zh,backendName:"cpu",kernelFunc:aM};function iM(e){let{inputs:t,backend:n,attrs:r}=e,{dy:a,input:s}=t,i=s;ke([a,s],"avgPoolGrad");let{filterSize:o,strides:l,pad:c}=r,u=R.computePool2DInfo(i.shape,o,l,1,c),h=u.strideHeight,d=u.strideWidth,p=u.filterHeight,f=u.filterWidth,m=u.dilationHeight,A=u.dilationWidth,y=u.effectiveFilterHeight,g=u.effectiveFilterWidth,w=g-1-u.padInfo.left,b=y-1-u.padInfo.top,_=Ve(i.shape,"float32"),x=1/(p*f),N=n.data.get(a.dataId).values,T=Ve(a.shape,"float32",N);for(let E=0;E=u.outHeight||Math.floor(G)!==G))for(let ee=0;ee=u.outWidth||Math.floor(Y)!==Y||(j+=T.get(E,G,Y,M))}}_.set(j*x,E,O,W,M)}return n.makeTensorInfo(_.shape,_.dtype,_.values)}var oM={kernelName:Oh,backendName:"cpu",kernelFunc:iM};function lM(e){let{inputs:t,backend:n,attrs:r}=e,{x:a,scale:s,offset:i,mean:o,variance:l}=t;v.assert(o.shape.length===l.shape.length,()=>"Batch normalization gradient requires mean and variance to have equal ranks."),v.assert(i==null||o.shape.length===i.shape.length,()=>"Batch normalization gradient requires mean and offset to have equal ranks."),v.assert(s==null||o.shape.length===s.shape.length,()=>"Batch normalization gradient requires mean and scale to have equal ranks."),ke([a,o,l,s,i],"batchNorm");let{varianceEpsilon:c}=r;c==null&&(c=.001);let u=n.data.get(a.dataId).values,h=n.data.get(o.dataId).values,d=n.data.get(l.dataId).values,p=s?n.data.get(s.dataId).values:new Float32Array([1]),f=i?n.data.get(i.dataId).values:new Float32Array([0]),m=new Float32Array(u.length),A=f.length,y=p.length,g=d.length,w=h.length,b=0,_=0,x=0,N=0;for(let T=0;T=A&&(b=0),_>=w&&(_=0),x>=y&&(x=0),N>=g&&(N=0);return n.makeTensorInfo(a.shape,a.dtype,m)}var uM={kernelName:Es,backendName:"cpu",kernelFunc:lM};function cM(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{blockShape:s,crops:i}=r;ke([a],"batchToSpaceND");let o=s.reduce((y,g)=>y*g),l=R.getReshaped(a.shape,s,o),c=R.getPermuted(l.length,s.length),u=R.getReshapedPermuted(a.shape,s,o),h=R.getSliceBeginCoords(i,s.length),d=R.getSliceSize(u,i,s.length),p=gt({inputs:{x:a},backend:n,attrs:{shape:l}}),f=dr({inputs:{x:p},backend:n,attrs:{perm:c}}),m=gt({inputs:{x:f},backend:n,attrs:{shape:u}}),A=vi({inputs:{x:m},backend:n,attrs:{begin:h,size:d}});return n.disposeIntermediateTensorInfo(p),n.disposeIntermediateTensorInfo(f),n.disposeIntermediateTensorInfo(m),A}var hM={kernelName:wu,backendName:"cpu",kernelFunc:cM};function dM(e){let{inputs:t,backend:n,attrs:r}=e,{x:a,weights:s}=t,{size:i}=r,o=n.data.get(a.dataId).values,l=n.data.get(s.dataId).values,c=Gm(o,l,s.dtype,s.shape,i);return n.makeTensorInfo([i],s.dtype,c)}var pM={kernelName:Ph,backendName:"cpu",kernelFunc:dM},fM=ot(Ca,(e,t)=>{let n=t;return e>n.clipValueMax?n.clipValueMax:e{let{x:t}=e.inputs,n=e.backend,r=new Float32Array(v.sizeFromShape(t.shape)),a=n.data.get(t.dataId),s=a.complexTensorInfos.real,i=a.complexTensorInfos.imag,o=n.data.get(s.dataId).values,l=n.data.get(i.dataId).values;for(let c=0;cm.shape),s);if(v.sizeFromShape(i)===0)return n.makeTensorInfo(i,t[0].dtype,[]);let o=t.filter(m=>v.sizeFromShape(m.shape)>0);if(o.length===1)return jr({inputs:{x:o[0]},backend:n});let l=o.map(m=>m.shape);if(R.assertParamsConsistent(l,s),o[0].dtype==="complex64"){let m=o.map(b=>_i({inputs:{input:b},backend:n})),A=o.map(b=>Cl({inputs:{input:b},backend:n})),y=Rl({inputs:m,backend:n,attrs:{axis:s}}),g=Rl({inputs:A,backend:n,attrs:{axis:s}}),w=Pn({inputs:{real:y,imag:g},backend:n});return m.forEach(b=>n.disposeIntermediateTensorInfo(b)),A.forEach(b=>n.disposeIntermediateTensorInfo(b)),n.disposeIntermediateTensorInfo(y),n.disposeIntermediateTensorInfo(g),w}let c=o.map(m=>{let A=v.sizeFromShape(m.shape.slice(s));return gt({inputs:{x:m},backend:n,attrs:{shape:[-1,A]}})}),u=c.map(m=>({vals:n.data.get(m.dataId).values,shape:m.shape}));i=R.computeOutShape(c.map(m=>m.shape),1);let h=c[0].shape[0]===1,d=qm(u,i,t[0].dtype,h),p=R.computeOutShape(o.map(m=>m.shape),s),f=n.makeTensorInfo(p,t[0].dtype,d);return c.forEach(m=>n.disposeIntermediateTensorInfo(m)),f}var xM={kernelName:fo,backendName:"cpu",kernelFunc:Rl};function Uw(e){let{inputs:t,backend:n,attrs:r}=e,{x:a,filter:s}=t,{strides:i,pad:o,dataFormat:l,dilations:c,dimRoundingMode:u}=r;ke([a,s],"conv2d");let h=R.convertConv2DDataFormat(l),d=R.computeConv2DInfo(a.shape,s.shape,i,c,o,u,!1,h),p=d.filterHeight,f=d.filterWidth,m=d.dilationHeight,A=d.dilationWidth,y=d.padInfo.left,g=d.padInfo.top,w=d.dataFormat==="channelsLast",b=new Pt(d.outShape,a.dtype),_=v.computeStrides(a.shape),x=v.computeStrides(s.shape),N=_[0],T=w?_[1]:_[2],E=w?_[2]:1,M=w?1:_[1],O=b.strides[0],W=w?b.strides[1]:b.strides[2],V=w?b.strides[2]:1,U=w?1:b.strides[1],j=n.data.get(a.dataId).values,X=n.data.get(s.dataId).values,G=b.values;for(let ee=0;ee=d.inHeight)continue;let ye=pe*x[0],me=Y+ue*T;for(let Ne=0;Ne=d.inWidth)continue;let nt=ye+Pe*x[1],rt=me+Oe*E,lt=nt;for(let Je=0;Je=c.inDepth)continue;let ee=X*E[0],Y=O+G*T[1];for(let se=0;se=c.inHeight)continue;let ue=ee+Q*E[1],ye=Y+pe*T[2];for(let me=0;me=c.inWidth)continue;let Oe=ue+De*E[2],nt=ye+Pe*c.inChannels,rt=Oe;for(let lt=0;ltMath.cos(e)),FM={kernelName:_s,backendName:"cpu",kernelFunc:RM},MM=ot(mo,e=>Math.cosh(e)),$M={kernelName:mo,backendName:"cpu",kernelFunc:MM};function DM(e){let{inputs:t,backend:n,attrs:r}=e,{image:a,boxes:s,boxInd:i}=t,{cropSize:o,method:l,extrapolationValue:c}=r,[u,h,d,p]=a.shape,f=s.shape[0],[m,A]=o,y=Ve([f,m,A,p],"float32"),g=n.data.get(s.dataId).values,w=n.data.get(i.dataId).values,b=n.data.get(a.dataId).values,_=v.computeStrides(a.shape),x=v.computeStrides(y.shape);for(let N=0;N=u)continue;let U=m>1?(O-E)*(h-1)/(m-1):0,j=A>1?(W-M)*(d-1)/(A-1):0;for(let X=0;X1?E*(h-1)+X*U:.5*(E+O)*(h-1);if(G<0||G>h-1){for(let ee=0;ee1?M*(d-1)+te*j:.5*(M+W)*(d-1);if(le<0||le>d-1){for(let ye=0;ye1?M*(d-1)+ee*j:.5*(M+W)*(d-1);if(Y<0||Y>d-1){for(let le=0;ley+f-g-1:(y,g)=>y+g;for(let y=0;y`Only NHWC dataFormat supported on CPU for depthToSpace. Got ${i}`),v.assert(s>1,()=>`blockSize should be > 1 for depthToSpace, but was: ${s}`);let o=a.shape[0],l=a.shape[1],c=a.shape[2],u=a.shape[3],h=l*s,d=c*s,p=u/(s*s),f=n.data.get(a.dataId).values,m=new Float32Array(o*h*d*p),A=0;for(let y=0;y`Error in depthwiseConv2d: Either strides or dilations must be 1. Got strides ${i} and dilations '${d}'`);let p=R.computeConv2DInfo(a.shape,s.shape,i,d,o,c,!0),{filterHeight:f,filterWidth:m,dilationHeight:A,dilationWidth:y,padInfo:g}=p,w=g.left,b=g.top,_=p.outChannels/p.inChannels,x=new Pt(p.outShape,a.dtype),N=n.data.get(a.dataId).values,T=n.data.get(s.dataId).values,E=x.values;for(let M=0;M=p.inHeight)continue;let ee=X*h[0],Y=O+G*u[1];for(let se=0;se=p.inWidth)continue;let ue=ee+Q*h[1],ye=Y+pe*p.inChannels,me=te,Ne=ue;for(let Ce=0;Ce{let{x:r,filter:a}=e,{strides:s,pad:i,dilations:o}=n,l=t,c=l.data.get(r.dataId).values,u=r.shape.length,h=l.data.get(a.dataId).values,d=a.shape.length,{batchSize:p,inHeight:f,inWidth:m,inChannels:A,outHeight:y,outWidth:g,padInfo:w,strideHeight:b,strideWidth:_,filterHeight:x,filterWidth:N,dilationHeight:T,dilationWidth:E,outShape:M}=R.computeDilation2DInfo(r.shape,a.shape,s,i,"NHWC",o),O=v.sizeFromShape(M),W=M.length,V=v.getArrayFromDType(r.dtype,O);for(let U=0;U=0&&Q=0&&uese&&(se=Ne)}}}let te=v.locToIndex([U,j,G,Y],W,v.computeStrides(M));V[te]=se}}}return{dataId:l.write(v.toTypedArray(V,r.dtype),M,r.dtype),shape:M,dtype:r.dtype}}},YM={kernelName:Xh,backendName:"cpu",kernelFunc:({inputs:e,backend:t,attrs:n})=>{let{x:r,filter:a,dy:s}=e,{strides:i,pad:o,dilations:l}=n,c=t,u=v.toNestedArray(r.shape,c.data.get(r.dataId).values),h=v.toNestedArray(a.shape,c.data.get(a.dataId).values),{batchSize:d,inHeight:p,inWidth:f,inChannels:m,outHeight:A,outWidth:y,padInfo:g,strideHeight:w,strideWidth:b,filterHeight:_,filterWidth:x,dilationHeight:N,dilationWidth:T,outShape:E}=R.computeDilation2DInfo(r.shape,a.shape,i,o,"NHWC",l);v.assert(s.rank===E.length,()=>`Error in ${Xh}, dy must have the same rank as output ${E.length}, but got ${s.rank}`);let M=v.toNestedArray(E,c.data.get(s.dataId).values),O=v.makeZerosNestedTypedArray(a.shape,a.dtype);for(let W=0;W=0&&le=0&&peee&&(ee=ue,Y=te,se=Q)}}}O[Y][se][G]+=M[W][V][j][G]}}}return{dataId:c.write(v.toTypedArray(O,r.dtype),a.shape,a.dtype),shape:a.shape,dtype:a.dtype}}},JM={kernelName:qh,backendName:"cpu",kernelFunc:({inputs:e,backend:t,attrs:n})=>{let{x:r,filter:a,dy:s}=e,{strides:i,pad:o,dilations:l}=n,c=t,u=v.toNestedArray(r.shape,c.data.get(r.dataId).values),h=v.toNestedArray(a.shape,c.data.get(a.dataId).values),{batchSize:d,inHeight:p,inWidth:f,inChannels:m,outHeight:A,outWidth:y,padInfo:g,strideHeight:w,strideWidth:b,filterHeight:_,filterWidth:x,dilationHeight:N,dilationWidth:T,outShape:E}=R.computeDilation2DInfo(r.shape,a.shape,i,o,"NHWC",l);v.assert(s.rank===E.length,()=>`Error in ${qh}, dy must have the same rank as output ${E.length}, but got ${s.rank}`);let M=v.toNestedArray(E,c.data.get(s.dataId).values),O=v.makeZerosNestedTypedArray(r.shape,r.dtype);for(let W=0;W=0&&le=0&&peee&&(ee=ue,Y=le,se=pe)}}}O[W][Y][se][G]+=M[W][V][j][G]}}}return{dataId:c.write(v.toTypedArray(O,r.dtype),r.shape,r.dtype),shape:r.shape,dtype:r.dtype}}};function QM(e){let{inputs:t,backend:n}=e,{dy:r,y:a}=t;ke([r,a],"eluGrad");let s=new Float32Array(v.sizeFromShape(a.shape)),i=n.data.get(a.dataId).values,o=n.data.get(r.dataId).values;for(let l=0;l=1?s[l]=o[l]:s[l]=o[l]*(c+1)}return n.makeTensorInfo(a.shape,"float32",s)}var e$={kernelName:Kh,backendName:"cpu",kernelFunc:QM},t$=$t((e,t)=>e===t?1:0),Hw=Xt(wo,t$,null,"bool"),n$={kernelName:wo,backendName:"cpu",kernelFunc:Hw},r$=R.ERF_P,a$=R.ERF_A1,s$=R.ERF_A2,i$=R.ERF_A3,o$=R.ERF_A4,l$=R.ERF_A5,u$=ot(xo,e=>{let t=Math.sign(e),n=Math.abs(e),r=1/(1+r$*n);return t*(1-((((l$*r+o$)*r+i$)*r+s$)*r+a$)*r*Math.exp(-n*n))}),c$={kernelName:xo,backendName:"cpu",kernelFunc:u$};function cp(e){let{inputs:t,backend:n,attrs:r}=e,{input:a}=t,{dim:s}=r,i=a.shape.length,o=a.shape.slice(),l=s;return s<0&&(v.assert(-(i+1)<=s,()=>`Axis must be in the interval [${-(i+1)}, ${i}]`),l=i+s+1),o.splice(l,0,1),gt({inputs:{x:a},backend:n,attrs:{shape:o}})}var h$={kernelName:bo,backendName:"cpu",kernelFunc:cp},d$=$t((e,t)=>e/t),nA=Xt(Is,d$),rA={kernelName:Is,backendName:"cpu",kernelFunc:nA};function Gw(e,t,n){let r=e.shape,a=r[0],s=r[1],i=n.data.get(e.dataId),o=i.complexTensorInfos.real,l=i.complexTensorInfos.imag,c=[a,s],u=v.sizeFromShape(c),h=v.getTypedArrayFromDType("float32",u),d=v.getTypedArrayFromDType("float32",u);for(let A=0;A{let{image:r}=e,a=n,s=v.getTypedArrayFromDType(r.dtype,v.sizeFromShape(r.shape)),[i,o,l,c]=r.shape,u=a.data.get(r.dataId).values;for(let h=0;h=0&&wMath.floor(e/t)),_$=Xt(Ts,b$,null,"int32"),v$={kernelName:Ts,backendName:"cpu",kernelFunc:_$};function k$(e){let{inputs:t,backend:n,attrs:r}=e,{x:a,filter:s,bias:i,preluActivationWeights:o}=t,{strides:l,pad:c,dataFormat:u,dilations:h,dimRoundingMode:d,activation:p,leakyreluAlpha:f}=r,m=Uw({inputs:{x:a,filter:s},backend:n,attrs:{strides:l,pad:c,dataFormat:u,dilations:h,dimRoundingMode:d}});if(i){let A=m;m=hc({inputs:{a:m,b:i},backend:n}),n.disposeIntermediateTensorInfo(A)}if(p){let A=m;m=eA(n,m,p,o,f),n.disposeIntermediateTensorInfo(A)}return m}var I$={kernelName:oi,backendName:"cpu",kernelFunc:k$};function N$(e){let{inputs:t,backend:n,attrs:r}=e,{x:a,filter:s,bias:i,preluActivationWeights:o}=t,{strides:l,pad:c,dataFormat:u,dilations:h,dimRoundingMode:d,activation:p,leakyreluAlpha:f}=r,m=jw({inputs:{x:a,filter:s},backend:n,attrs:{strides:l,pad:c,dataFormat:u,dilations:h,dimRoundingMode:d}});if(i){let A=m;m=hc({inputs:{a:m,b:i},backend:n}),n.disposeIntermediateTensorInfo(A)}if(p){let A=m;m=eA(n,m,p,o,f),n.disposeIntermediateTensorInfo(A)}return m}var S$={kernelName:li,backendName:"cpu",kernelFunc:N$};function T$(e){let{inputs:t,backend:n}=e,{params:r,indices:a}=t,s=v.sizeFromShape(r.shape),i=a.shape,o=i[i.length-1],[l,c,u,h]=R.prepareAndValidate(r,a);if(c===0)return n.makeTensorInfo(l,r.dtype,[]);let d=Ve([c,u],r.dtype),p=n.data.get(a.dataId).values,f=n.data.get(r.dataId).values;for(let m=0;m=s/u)throw new Error(`Invalid indices: ${A} does not index into ${r.shape}`);for(let g=0;ge>=t?1:0),M$=Xt(Cs,F$,null,"bool"),$$={kernelName:Cs,backendName:"cpu",kernelFunc:M$};function D$(e){let{inputs:t,backend:n}=e,{input:r}=t,a=v.sizeFromShape(r.shape),s=r.shape[r.shape.length-1],i=a/s,o=gt({inputs:{x:r},backend:n,attrs:{shape:[i,s]}}),l=Gw(o,!0,n),c=gt({inputs:{x:l},backend:n,attrs:{shape:r.shape}});return n.disposeIntermediateTensorInfo(o),n.disposeIntermediateTensorInfo(l),c}var O$={kernelName:Yh,backendName:"cpu",kernelFunc:D$},z$=ot(So,e=>Number.isFinite(e)?1:0,"bool"),P$={kernelName:So,backendName:"cpu",kernelFunc:z$},L$=ot(To,e=>Math.abs(e)===Infinity?1:0,"bool"),W$={kernelName:To,backendName:"cpu",kernelFunc:L$},B$=ot(Eo,e=>Number.isNaN(e)?1:0,"bool"),V$={kernelName:Eo,backendName:"cpu",kernelFunc:B$},U$=$t((e,t)=>e<=t?1:0),j$=Xt(Ro,U$,null,"bool"),H$={kernelName:Ro,backendName:"cpu",kernelFunc:j$};function G$(e){let{backend:t,attrs:n}=e,{start:r,stop:a,num:s}=n,i=gw(r,a,s);return t.makeTensorInfo([i.length],"float32",i)}var q$={kernelName:Qh,backendName:"cpu",kernelFunc:G$},X$=ot(Fo,e=>Math.log1p(e)),K$={kernelName:Fo,backendName:"cpu",kernelFunc:X$},Z$=$t((e,t)=>e&&t),Y$=Xt(Mo,Z$,null,"bool"),J$={kernelName:Mo,backendName:"cpu",kernelFunc:Y$},Q$=ot(Iu,e=>e?0:1,"bool"),eD={kernelName:Iu,backendName:"cpu",kernelFunc:Q$},tD=$t((e,t)=>e||t),nD=Xt(Nu,tD,null,"bool"),rD={kernelName:Nu,backendName:"cpu",kernelFunc:nD};function aD(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{depthRadius:s,bias:i,alpha:o,beta:l}=r;ke(a,"LRN");let c=a.shape[3],u=c-1,h=n.data.get(a.dataId).values,d=v.sizeFromShape(a.shape),p=new Float32Array(d);function f(m){let A=m%c,y=m-A+Math.max(0,A-s),g=m-A+Math.min(A+s,u),w=0;for(;y<=g;y++){let b=h[y];w+=b*b}return w}for(let m=0;m`Error in maxPool: Either strides or dilations must be 1. Got strides ${i} and dilations '${c}'`);let u=R.computePool2DInfo(a.shape,s,i,c,o,l),h;if(u.filterWidth===1&&u.filterHeight===1&&v.arraysEqual(u.inShape,u.outShape))h=jr({inputs:{x:a},backend:n});else{let d=n.data.get(a.dataId).values,p=v.computeStrides(a.shape),f=tA(d,a.shape,a.dtype,p,u,"max");h=n.makeTensorInfo(u.outShape,a.dtype,f.values)}return h}var cD={kernelName:Os,backendName:"cpu",kernelFunc:uD};function hD(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{filterSize:s,strides:i,pad:o,dimRoundingMode:l,dataFormat:c}=r;ke(a,"maxPool3d");let u=R.computePool3DInfo(a.shape,s,i,1,o,l,c),h=n.data.get(a.dataId).values,d=Vw(h,a.shape,a.dtype,v.computeStrides(a.shape),u,"max");return n.makeTensorInfo(d.shape,"float32",d.values)}var dD={kernelName:Tu,backendName:"cpu",kernelFunc:hD};function pD(e){let{inputs:t,backend:n,attrs:r}=e,{dy:a,input:s}=t,{filterSize:i,strides:o,pad:l,dimRoundingMode:c}=r;ke([a,s],"maxPool3DGrad");let u=R.computePool3DInfo(s.shape,i,o,1,l,c),h=n.bufferSync(s),d=QF(h,u),p=u.strideDepth,f=u.strideHeight,m=u.strideWidth,A=u.dilationDepth,y=u.dilationHeight,g=u.dilationWidth,w=u.effectiveFilterDepth,b=u.effectiveFilterHeight,_=u.effectiveFilterWidth,x=w-1-u.padInfo.front,N=_-1-u.padInfo.left,T=b-1-u.padInfo.top,E=Ve(s.shape,"float32"),M=n.bufferSync(a);for(let O=0;O=u.outDepth||Math.floor(te)!==te))for(let le=0;le=u.outHeight||Math.floor(Q)!==Q))for(let pe=0;pe<_;pe+=g){let ue=(ee+pe)/m;if(ue<0||ue>=u.outWidth||Math.floor(ue)!==ue)continue;let ye=w*b*_-1-d.get(O,te,Q,ue,W),me=se*b*_+le*_+pe,Ne=ye===me?1:0;Ne!==0&&(Y+=M.get(O,te,Q,ue,W)*Ne)}}}E.set(Y,O,V,U,j,W)}return n.makeTensorInfo(E.shape,E.dtype,E.values)}var fD={kernelName:nd,backendName:"cpu",kernelFunc:pD};function mD(e){let{inputs:t,backend:n,attrs:r}=e,{dy:a,input:s,output:i}=t,o=s;ke([s,i],"maxPoolGrad");let{filterSize:l,strides:c,pad:u,dimRoundingMode:h}=r,d=R.computePool2DInfo(o.shape,l,c,1,u,h),p=n.data.get(o.dataId).values,f=Ve(d.outShape,o.dtype,Bw(p,o.shape,o.dtype,d).values),m=d.strideHeight,A=d.strideWidth,y=d.dilationHeight,g=d.dilationWidth,w=d.effectiveFilterHeight,b=d.effectiveFilterWidth,_=b-1-d.padInfo.left,x=w-1-d.padInfo.top,N=Ve(o.shape,"float32"),T=n.data.get(a.dataId).values,E=Ve(a.shape,"float32",T);for(let M=0;M=d.outHeight||Math.floor(ee)!==ee))for(let Y=0;Y=d.outWidth||Math.floor(se)!==se)continue;let te=w*b-1-f.get(M,ee,se,O),le=G*b+Y,Q=te===le?1:0;Q!==0&&(X+=E.get(M,ee,se,O)*Q)}}N.set(X,M,W,V,O)}return n.makeTensorInfo(N.shape,N.dtype,N.values)}var AD={kernelName:td,backendName:"cpu",kernelFunc:mD};function yD(e,t,n,r,a){let s=v.computeStrides(t),i=tA(e,t,n,s,a,"max"),o=Bw(e,t,n,a,!0,r);return[i.values,o.values]}var gD={kernelName:rd,backendName:"cpu",kernelFunc:({inputs:e,attrs:t,backend:n})=>{let{x:r}=e,{filterSize:a,strides:s,pad:i,includeBatchInIndex:o}=t,l=n;ke(r,"MaxPoolWithArgmax");let c=l.data.get(r.dataId).values,u=R.computePool2DInfo(r.shape,a,s,[1,1],i),[h,d]=yD(c,r.shape,r.dtype,o,u),p=l.write(h,u.outShape,r.dtype),f=l.write(d,u.outShape,r.dtype);return[{dataId:p,shape:u.outShape,dtype:r.dtype},{dataId:f,shape:u.outShape,dtype:"int32"}]}};function hp(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{axis:s,keepDims:i}=r;ke(a,"sum");let o;a.dtype==="bool"?o=ja({inputs:{x:a},backend:n,attrs:{dtype:"int32"}}):o=jr({inputs:{x:a},backend:n});let l=o.shape.length,c=v.parseAxisParam(s,o.shape),u=R.getAxesPermutation(c,l),h=c,d=o;u!=null&&(d=dr({inputs:{x:o},backend:n,attrs:{perm:u}}),h=R.getInnerMostAxes(h.length,l)),R.assertAxesAreInnerMostDims("sum",h,d.shape.length);let[p,f]=R.computeOutAndReduceShapes(d.shape,h),m=R.upcastType(d.dtype,"int32"),A=up(n,p,m),y=v.sizeFromShape(f),g=n.data.get(A.dataId).values,w=n.data.get(d.dataId).values;for(let b=0;bn.disposeIntermediateTensorInfo(m)),f}var bD={kernelName:zs,backendName:"cpu",kernelFunc:wD};function _D(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{axis:s,keepDims:i}=r;ke(a,"min");let o=v.parseAxisParam(s,a.shape),l=o,c=R.getAxesPermutation(l,a.shape.length),u=a;c!=null&&(u=dr({inputs:{x:a},backend:n,attrs:{perm:c}}),l=R.getInnerMostAxes(l.length,a.shape.length)),R.assertAxesAreInnerMostDims("min",l,u.shape.length);let[h,d]=R.computeOutAndReduceShapes(u.shape,l),p=v.sizeFromShape(d),f=v.makeZerosTypedArray(v.sizeFromShape(h),u.dtype),m=n.data.get(u.dataId).values;for(let y=0;yg[0]+a.shape[w]+g[1]),l=s.map(g=>g[0]),c=s.map((g,w)=>g[0]+a.shape[w]),u=i==="reflect"?0:1,h=n.data.get(a.dataId).values,d=a.shape.length,p=v.computeStrides(a.shape),f=v.sizeFromShape(o),m=o.length,A=v.computeStrides(o),y=v.getTypedArrayFromDType(a.dtype,f);for(let g=0;g=c[_]&&(w[_]=(c[_]-1)*2-w[_]+u);w=w.map((_,x)=>_-l[x]);let b=v.locToIndex(w,d,p);y[g]=h[b]}return{dataId:n.write(y,o,a.dtype),shape:o,dtype:a.dtype}}var ID={kernelName:Eu,backendName:"cpu",kernelFunc:kD},ND=$t((e,t)=>{let n=e%t;return e<0&&t<0||e>=0&&t>=0?n:(n+t)%t}),SD=Xt($o,ND),TD={kernelName:$o,backendName:"cpu",kernelFunc:SD},ED=no(r5());function Xw(e){let{inputs:t,backend:n,attrs:r}=e,{logits:a}=t,{dim:s}=r,i=a.shape.length,o=s;if(o===-1&&(o=i-1),o!==i-1)throw Error(`Softmax along a non-last dimension is not yet supported. Logits was rank ${i} and dim was ${o}`);let l=v.parseAxisParam([o],a.shape),c=qw({inputs:{x:a},backend:n,attrs:{reductionIndices:l,keepDims:!1}}),u=R.expandShapeToKeepDim(c.shape,l),h=gt({inputs:{x:c},backend:n,attrs:{shape:u}}),d=Qm({inputs:{a,b:h},backend:n}),p=Mw({inputs:{x:d},backend:n}),f=hp({inputs:{x:p},backend:n,attrs:{axis:l,keepDims:!1}}),m=gt({inputs:{x:f},backend:n,attrs:{shape:u}}),A=nA({inputs:{a:p,b:m},backend:n});return n.disposeIntermediateTensorInfo(c),n.disposeIntermediateTensorInfo(h),n.disposeIntermediateTensorInfo(d),n.disposeIntermediateTensorInfo(p),n.disposeIntermediateTensorInfo(f),n.disposeIntermediateTensorInfo(m),A}var CD={kernelName:ti,backendName:"cpu",kernelFunc:Xw};function RD(e){let{inputs:t,backend:n,attrs:r}=e,{logits:a}=t,{numSamples:s,seed:i,normalized:o}=r;ke(a,"multinomial");let l=o?a:Xw({inputs:{logits:a},backend:n,attrs:{dim:-1}}),c=l.shape[0],u=l.shape[1],h=n.data.get(l.dataId).values,d=[c,s],p=v.makeZerosTypedArray(v.sizeFromShape(d),"int32");for(let f=0;f=0&&u[h]{v.assertShapesMatch(s,u.shape,"All tensors passed to stack must have matching shapes"),v.assert(i===u.dtype,()=>"All tensors passed to stack must have matching dtypes")});let o=[],l=t.map(u=>{let h=cp({inputs:{input:u},backend:n,attrs:{dim:a}});return o.push(h),h}),c=Rl({inputs:l,backend:n,attrs:{axis:a}});return o.forEach(u=>n.disposeIntermediateTensorInfo(u)),c}var GD={kernelName:Bo,backendName:"cpu",kernelFunc:Zw};function qD(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{paddings:s,constantValue:i}=r;ke(a,"pad");let o=s.map((y,g)=>y[0]+a.shape[g]+y[1]),l=s.map(y=>y[0]),c=n.data.get(a.dataId).values,u=v.sizeFromShape(a.shape),h=a.shape.length,d=v.computeStrides(a.shape),p=v.sizeFromShape(o),f=o.length,m=v.computeStrides(o),A=v.getTypedArrayFromDType(a.dtype,p);i!==0&&A.fill(i);for(let y=0;yb+l[_]),w=v.locToIndex(g,f,m);A[w]=c[y]}return{dataId:n.write(A,o,a.dtype),shape:o,dtype:a.dtype}}var Yw={kernelName:Vs,backendName:"cpu",kernelFunc:qD},XD=$t((e,t)=>Math.pow(e,t)),KD=Xt(Us,XD),ZD={kernelName:Us,backendName:"cpu",kernelFunc:KD};function YD(e){let{backend:t,attrs:n}=e,{start:r,stop:a,dtype:s,step:i}=n,o=Zm(r,a,i,s);return t.makeTensorInfo([o.length],s,o)}var JD={kernelName:Cu,backendName:"cpu",kernelFunc:YD},QD=ot(Uo,e=>1/e),eO={kernelName:Uo,backendName:"cpu",kernelFunc:QD};function tO(e){let{inputs:t,backend:n,attrs:r}=e,{images:a}=t,{alignCorners:s,halfPixelCenters:i,size:o}=r;ke(a,"resizeBilinear");let l=v.computeStrides(a.shape),[c,u]=o,[h,d,p,f]=a.shape,m=n.data.get(a.dataId).values,A=new Float32Array(v.sizeFromShape([h,c,u,f])),y=[s&&c>1?d-1:d,s&&u>1?p-1:p],g=[s&&c>1?c-1:c,s&&u>1?u-1:u],w=0,b=y[0]/g[0],_=y[1]/g[1];for(let x=0;x1?c-1:c,i&&p>1?u-1:u],A=[i&&d>1?d-1:d,i&&p>1?p-1:p],y=m[0]/A[0],g=m[1]/A[1],w=n.data.get(s.dataId).values,b=0;for(let _=0;_1?d-1:d,s&&u>1?p-1:p],g=[s&&c>1?c-1:c,s&&u>1?u-1:u],w=y[0]/g[0],b=y[1]/g[1],_=0;for(let x=0;x1?u-1:u,i&&f>1?h-1:h],g=[i&&p>1?p-1:p,i&&f>1?f-1:f],w=y[0]/g[0],b=y[1]/g[1],_=1/w,x=1/b,N=Math.ceil(_)*2+2,T=Math.ceil(x)*2+2;for(let E=0;E=p)continue;let Q=M+le*l[1],pe=le*w,ue=Math.min(u-1,i?Math.round(pe):Math.floor(pe));if(O===ue)for(let ye=0;ye=f)continue;let Ne=Q+me*l[2],Ce=me*b,De=Math.min(h-1,i?Math.round(Ce):Math.floor(Ce));j===De&&(se+=A[Ne+Y])}}m[X+Y]=se}}}}return n.makeTensorInfo(a.shape,a.dtype,m)}var lO={kernelName:id,backendName:"cpu",kernelFunc:oO};function uO(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{dims:s}=r;ke(a,"reverse");let i=a.shape.length,o=v.parseAxisParam(s,a.shape);if(i===0)return jr({inputs:{x:a},backend:n});let l=new Pt(a.shape,a.dtype),c=n.bufferSync(a);for(let u=0;ud[p]=a.shape[p]-1-d[p]),l.set(c.get(...d),...h)}return n.makeTensorInfo(l.shape,l.dtype,l.values)}var cO={kernelName:Xs,backendName:"cpu",kernelFunc:uO},hO={kernelName:al,backendName:"cpu",kernelFunc:({inputs:e,attrs:t,backend:n})=>{let{image:r}=e,{radians:a,fillValue:s,center:i}=t,o=n,l=v.getTypedArrayFromDType(r.dtype,v.sizeFromShape(r.shape)),[c,u,h,d]=r.shape,[p,f]=R.getImageCenter(i,u,h),m=255,A=Math.sin(a),y=Math.cos(a),g=o.data.get(r.dataId).values;for(let w=0;w=0&&V=0&&U{let t=Math.floor(e);return e-t<.5?Math.floor(e):e-t>.5?Math.ceil(e):t%2==0?t:t+1}),pO={kernelName:Ks,backendName:"cpu",kernelFunc:dO};function Jw(e,t,n,r,a,s,i,o,l,c){let u=[r/a,a],h=e.values,d=t.values;if(r===0)return Ve(n,t.dtype);let p=Ve(u,t.dtype);p.values.fill(l);for(let f=0;f=r/a)throw new Error(`Invalid indices: ${m} does not index into ${n}`);for(let y=0;y1||a.shape.length===1?1:v.sizeFromShape(a.shape.slice(1));for(let f=0;fe>=0?xO*e:gO*(Math.exp(e)-1)),bO={kernelName:qo,backendName:"cpu",kernelFunc:wO},_O=ot(Js,e=>1/(1+Math.exp(-e))),vO={kernelName:Js,backendName:"cpu",kernelFunc:_O},kO=ot(Zo,e=>e<0?-1:e>0?1:0),IO={kernelName:Zo,backendName:"cpu",kernelFunc:kO},NO=ot(Ys,e=>Math.sin(e)),SO={kernelName:Ys,backendName:"cpu",kernelFunc:NO},TO=ot(Ko,e=>Math.sinh(e)),EO={kernelName:Ko,backendName:"cpu",kernelFunc:TO},CO=11920928955078125e-23,Qw=Math.log(CO)+2,RO=ot(Yo,e=>{let t=e>-Qw,n=e{let d=[...u];d[o]=h;let p=vi({inputs:{x:a},backend:n,attrs:{begin:c,size:d}});return c[o]+=h,p})}var PO={kernelName:Jo,backendName:"cpu",kernelFunc:zO},LO=ot(Qs,e=>Math.sqrt(e)),WO={kernelName:Qs,backendName:"cpu",kernelFunc:LO},BO={kernelName:Mu,backendName:"cpu",kernelFunc:({inputs:e,backend:t})=>{let{x:n}=e,r=t;ke(n,"square");let a=r.data.get(n.dataId).values,s=new Float32Array(a.length);for(let i=0;i{let n=t;return isNaN(e)?NaN:e>0?1:n.alpha}),UO={kernelName:Fa,backendName:"cpu",kernelFunc:VO};function jO(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{begin:s,end:i,strides:o,beginMask:l,endMask:c,ellipsisMask:u,newAxisMask:h,shrinkAxisMask:d}=r;ke(a,"stridedSlice");let{nonStrided:p,$begin:f,$strides:m,size:A,newShape:y,outShape:g}=cn.sliceInfo(a.shape,s,i,o,l,c,u,h,d),w=gt({inputs:{x:a},backend:n,attrs:{shape:y}}),b;if(p){let x=vi({inputs:{x:w},backend:n,attrs:{begin:f,size:A}});b=gt({inputs:{x},backend:n,attrs:{shape:g}}),n.disposeIntermediateTensorInfo(x)}else if(g.some(x=>x===0))b=n.makeTensorInfo(g,a.dtype,[]);else{let x=n.bufferSync(w),N=Tw(g,x,m,f);b=n.makeTensorInfo(N.shape,N.dtype,N.values)}let _=gt({inputs:{x:b},backend:n,attrs:{shape:g}});return n.disposeIntermediateTensorInfo(w),n.disposeIntermediateTensorInfo(b),_}var HO={kernelName:Qo,backendName:"cpu",kernelFunc:jO},GO=ot(el,e=>Math.tan(e)),qO={kernelName:el,backendName:"cpu",kernelFunc:GO},XO=ot(ai,e=>Math.tanh(e)),KO={kernelName:ai,backendName:"cpu",kernelFunc:XO};function ZO(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{reps:s}=r;ke(a,"tile");let i=Cw(n.bufferSync(a),s);return n.makeTensorInfo(i.shape,i.dtype,i.values)}var YO={kernelName:Ra,backendName:"cpu",kernelFunc:ZO};function JO(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{k:s,sorted:i}=r;ke(a,"topk");let o=n.data.get(a.dataId).values,[l,c]=Rw(o,a.shape,a.dtype,s,i);return[n.makeTensorInfo(l.shape,l.dtype,l.values),n.makeTensorInfo(c.shape,c.dtype,c.values)]}var QO={kernelName:tl,backendName:"cpu",kernelFunc:JO};function nz(e){let{inputs:t,attrs:n,backend:r}=e,{image:a,transforms:s}=t,{interpolation:i,fillMode:o,fillValue:l,outputShape:c}=n,[u,h,d,p]=a.shape,[f,m]=c!=null?c:[h,d],A=[u,f,m,p],y=v.computeStrides(a.shape),g=y[0],w=y[1],b=y[2],_=v.getTypedArrayFromDType(a.dtype,v.sizeFromShape(A));_.fill(l);let x=r.data.get(a.dataId).values,N=r.data.get(s.dataId).values;for(let T=0;Tt-1)if(t<=1)n=0;else{let r=2*t;n-=r*Math.trunc(n/r),n>=t&&(n=r-n-1)}return v.clamp(0,n,t-1)}function sz(e,t){let n=e;if(n<0)if(t<=1)n=0;else{let r=t-1;n+=t*(Math.trunc(-n/r)+1)}else if(n>t-1)if(t<=1)n=0;else{let r=t-1;n-=t*Math.trunc(n/r)}return v.clamp(0,n,t-1)}function iz(e,t){return e}function oz(e,t){return v.clamp(0,e,t-1)}function dc(e,t,n,r,a,s,i,o,l,c,u){let h=i*r+o*a+l*s+c;return 0<=o&&on.disposeIntermediateTensorInfo(f)),p}var pz={kernelName:$u,backendName:"cpu",kernelFunc:dz},fz=[SF,FR,EF,RF,PR,MF,DF,zF,LF,BF,UF,HF,qF,ZF,JF,tM,rM,sM,oM,IF,uM,hM,pM,OR,WR,mM,MR,yM,xM,_M,kM,wM,TM,CM,NM,FM,$M,OM,PM,WM,VM,UM,HM,qM,KM,ZM,JM,YM,rA,gF,e$,n$,c$,BR,h$,UR,y$,x$,w$,HR,v$,I$,S$,E$,R$,qR,$$,$R,O$,gM,P$,W$,V$,xF,KR,H$,q$,YR,K$,J$,eD,rD,sD,oD,QR,cD,dD,fD,AD,gD,lD,bD,vD,tF,ID,TD,FD,rF,sF,DD,PD,BD,oF,UD,HD,GD,Yw,ZD,bF,cF,JD,DR,eO,_F,vF,kF,nO,aO,iO,lO,cO,hO,pO,dF,mO,yO,bO,vO,IO,SO,EO,pF,CD,FO,$O,OO,PO,WO,BO,mF,UO,HO,yF,xD,qO,KO,YO,QO,lF,rz,uz,hz,pz,jD];for(let e of fz)ui(e);var tb={};Le(tb,{assertNotComplex:()=>Fl,bindCanvasToFramebuffer:()=>yz,bindColorTextureToFramebuffer:()=>fp,bindTextureToProgramUniformSampler:()=>Ab,bindTextureUnit:()=>pb,bindVertexBufferToProgramAttribute:()=>iA,callAndCheck:()=>_e,canBeRepresented:()=>nb,createFragmentShader:()=>sb,createFramebuffer:()=>db,createProgram:()=>ib,createStaticIndexBuffer:()=>ub,createStaticVertexBuffer:()=>lb,createTexture:()=>cb,createVertexShader:()=>ab,getBatchDim:()=>ki,getExtensionOrThrow:()=>pc,getFramebufferErrorMessage:()=>yb,getMaxTexturesInShader:()=>wb,getNumChannels:()=>mz,getProgramUniformLocation:()=>mb,getProgramUniformLocationOrThrow:()=>fb,getRowsCols:()=>Ii,getShapeAs3D:()=>mp,getTextureShapeFromLogicalShape:()=>gb,getWebGLDisjointQueryTimerVersion:()=>bb,getWebGLErrorMessage:()=>rb,getWebGLMaxTextureSize:()=>xb,hasExtension:()=>Jn,isCapableOfRenderingToFloatTexture:()=>_b,isDownloadFloatTextureEnabled:()=>vb,isReshapeFree:()=>mc,isWebGLFenceEnabled:()=>kb,isWebGLVersionEnabled:()=>lA,linkProgram:()=>ob,resetMaxTextureSize:()=>gz,resetMaxTexturesInShader:()=>xz,unbindColorTextureFromFramebuffer:()=>oA,unbindTextureUnit:()=>Az,validateFramebuffer:()=>fc,validateProgram:()=>pp,validateTextureSize:()=>hb});var Ni={},uA={alpha:!1,antialias:!1,premultipliedAlpha:!1,preserveDrawingBuffer:!1,depth:!1,stencil:!1,failIfMajorPerformanceCaveat:!0};function Ap(e,t){Ni[e]=t}function Hr(e){if(!(e in Ni)){let n=wz(e);if(n!==null)Ni[e]=n;else return console.log("Could not get context for WebGL version",e),null}let t=Ni[e];return t.isContextLost()?(delete Ni[e],Hr(e)):(t.disable(t.DEPTH_TEST),t.disable(t.STENCIL_TEST),t.disable(t.BLEND),t.disable(t.DITHER),t.disable(t.POLYGON_OFFSET_FILL),t.disable(t.SAMPLE_COVERAGE),t.enable(t.SCISSOR_TEST),t.enable(t.CULL_FACE),t.cullFace(t.BACK),Ni[e])}function bz(e){if(typeof OffscreenCanvas!="undefined"&&e===2)return new OffscreenCanvas(300,150);if(typeof document!="undefined")return document.createElement("canvas");throw new Error("Cannot create a canvas in this context")}function wz(e){if(e!==1&&e!==2)throw new Error("Cannot get WebGL rendering context, WebGL is disabled.");let t=bz(e);return t.addEventListener("webglcontextlost",n=>{n.preventDefault(),delete Ni[e]},!1),e===1?t.getContext("webgl",uA)||t.getContext("experimental-webgl",uA):t.getContext("webgl2",uA)}var Ac;(function(e){e[e.DENSE=0]="DENSE",e[e.SHARED_BATCH=1]="SHARED_BATCH"})(Ac||(Ac={}));var Qn;(function(e){e[e.RENDER=0]="RENDER",e[e.UPLOAD=1]="UPLOAD",e[e.PIXELS=2]="PIXELS",e[e.DOWNLOAD=3]="DOWNLOAD"})(Qn||(Qn={}));var nn;(function(e){e[e.UNPACKED_FLOAT16=0]="UNPACKED_FLOAT16",e[e.UNPACKED_FLOAT32=1]="UNPACKED_FLOAT32",e[e.PACKED_4X1_UNSIGNED_BYTE=2]="PACKED_4X1_UNSIGNED_BYTE",e[e.PACKED_2X2_FLOAT32=3]="PACKED_2X2_FLOAT32",e[e.PACKED_2X2_FLOAT16=4]="PACKED_2X2_FLOAT16"})(nn||(nn={}));function yc(e,t){return[t,e]}function _z(e,t){return e*t}function gc(e){let t=v.sizeFromShape(e),n=Math.ceil(t/4);return v.sizeToSquarishShape(n)}function Ml(e,t){return[Math.max(1,Math.ceil(t/2)),Math.max(1,Math.ceil(e/2))]}function vz(e,t){let[n,r]=Ml(e,t);return n*r*4}function cA(e,t){let n=e,r,a,s,i,o,l,c,u,h,d;return J().getNumber("WEBGL_VERSION")===2?(r=n.R32F,a=n.R16F,s=n.RGBA16F,i=n.RGBA32F,o=n.RED,c=4,u=1,h=n.HALF_FLOAT,d=n.FLOAT):(r=e.RGBA,a=e.RGBA,s=e.RGBA,i=n.RGBA,o=e.RGBA,c=4,u=4,h=t!=null?t.HALF_FLOAT_OES:null,d=e.FLOAT),l=e.RGBA,{internalFormatFloat:r,internalFormatHalfFloat:a,internalFormatPackedHalfFloat:s,internalFormatPackedFloat:i,textureFormatFloat:o,downloadTextureFormat:l,downloadUnpackNumChannels:c,defaultNumChannels:u,textureTypeHalfFloat:h,textureTypeFloat:d}}function _e(e,t){let n=t();return J().getBool("DEBUG")&&kz(e),n}function kz(e){let t=e.getError();if(t!==e.NO_ERROR)throw new Error("WebGL Error: "+rb(e,t))}var Iz=596e-10,Nz=65504;function nb(e){return!!(J().getBool("WEBGL_RENDER_FLOAT32_ENABLED")||e===0||Ize.getExtension(t),'Extension "'+t+'" not supported on this browser.')}function ab(e,t){let n=ha(e,()=>e.createShader(e.VERTEX_SHADER),"Unable to create vertex WebGLShader.");if(_e(e,()=>e.shaderSource(n,t)),_e(e,()=>e.compileShader(n)),e.getShaderParameter(n,e.COMPILE_STATUS)===!1)throw console.log(e.getShaderInfoLog(n)),new Error("Failed to compile vertex shader.");return n}function sb(e,t){let n=ha(e,()=>e.createShader(e.FRAGMENT_SHADER),"Unable to create fragment WebGLShader.");if(_e(e,()=>e.shaderSource(n,t)),_e(e,()=>e.compileShader(n)),e.getShaderParameter(n,e.COMPILE_STATUS)===!1)throw Sz(t,e.getShaderInfoLog(n)),new Error("Failed to compile fragment shader.");return n}var Tz=/ERROR: [0-9]+:([0-9]+):/g;function Sz(e,t){let n=Tz.exec(t);if(n==null){console.log(`Couldn't parse line number in error: ${t}`),console.log(e);return}let r=+n[1],a=e.split(` -`),s=a.length.toString().length+2,i=a.map((h,d)=>v.rightPad((d+1).toString(),s)+h),o=0;for(let h=0;he.createProgram(),"Unable to create WebGLProgram.")}function ob(e,t){if(_e(e,()=>e.linkProgram(t)),e.getProgramParameter(t,e.LINK_STATUS)===!1)throw console.log(e.getProgramInfoLog(t)),new Error("Failed to link vertex and fragment shaders.")}function pp(e,t){if(_e(e,()=>e.validateProgram(t)),e.getProgramParameter(t,e.VALIDATE_STATUS)===!1)throw console.log(e.getProgramInfoLog(t)),new Error("Shader program validation failed.")}function lb(e,t){let n=ha(e,()=>e.createBuffer(),"Unable to create WebGLBuffer");return _e(e,()=>e.bindBuffer(e.ARRAY_BUFFER,n)),_e(e,()=>e.bufferData(e.ARRAY_BUFFER,t,e.STATIC_DRAW)),n}function ub(e,t){let n=ha(e,()=>e.createBuffer(),"Unable to create WebGLBuffer");return _e(e,()=>e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,n)),_e(e,()=>e.bufferData(e.ELEMENT_ARRAY_BUFFER,t,e.STATIC_DRAW)),n}function mz(){return J().getNumber("WEBGL_VERSION")===2?1:4}function cb(e){return ha(e,()=>e.createTexture(),"Unable to create WebGLTexture.")}function hb(e,t){let n=J().getNumber("WEBGL_MAX_TEXTURE_SIZE");if(e<=0||t<=0){let r=`[${e}x${t}]`;throw new Error("Requested texture size "+r+" is invalid.")}if(e>n||t>n){let r=`[${e}x${t}]`,a=`[${n}x${n}]`;throw new Error("Requested texture size "+r+" greater than WebGL maximum on this browser / GPU "+a+".")}}function db(e){return ha(e,()=>e.createFramebuffer(),"Unable to create WebGLFramebuffer.")}function iA(e,t,n,r,a,s,i){let o=e.getAttribLocation(t,n);return o===-1?!1:(_e(e,()=>e.bindBuffer(e.ARRAY_BUFFER,r)),_e(e,()=>e.vertexAttribPointer(o,a,e.FLOAT,!1,s,i)),_e(e,()=>e.enableVertexAttribArray(o)),!0)}function pb(e,t,n){Ib(e,n),_e(e,()=>e.activeTexture(e.TEXTURE0+n)),_e(e,()=>e.bindTexture(e.TEXTURE_2D,t))}function Az(e,t){Ib(e,t),_e(e,()=>e.activeTexture(e.TEXTURE0+t)),_e(e,()=>e.bindTexture(e.TEXTURE_2D,null))}function fb(e,t,n){return ha(e,()=>e.getUniformLocation(t,n),'uniform "'+n+'" not present in program.')}function mb(e,t,n){return e.getUniformLocation(t,n)}function Ab(e,t,n,r){_e(e,()=>pb(e,t,r)),_e(e,()=>e.uniform1i(n,r))}function yz(e){_e(e,()=>e.bindFramebuffer(e.FRAMEBUFFER,null)),_e(e,()=>e.viewport(0,0,e.canvas.width,e.canvas.height)),_e(e,()=>e.scissor(0,0,e.canvas.width,e.canvas.height))}function fp(e,t,n){_e(e,()=>e.bindFramebuffer(e.FRAMEBUFFER,n)),_e(e,()=>e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,t,0))}function oA(e,t){_e(e,()=>e.bindFramebuffer(e.FRAMEBUFFER,t)),_e(e,()=>e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,null,0))}function fc(e){let t=e.checkFramebufferStatus(e.FRAMEBUFFER);if(t!==e.FRAMEBUFFER_COMPLETE)throw new Error("Error binding framebuffer: "+yb(e,t))}function yb(e,t){switch(t){case e.FRAMEBUFFER_INCOMPLETE_ATTACHMENT:return"FRAMEBUFFER_INCOMPLETE_ATTACHMENT";case e.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT:return"FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT";case e.FRAMEBUFFER_INCOMPLETE_DIMENSIONS:return"FRAMEBUFFER_INCOMPLETE_DIMENSIONS";case e.FRAMEBUFFER_UNSUPPORTED:return"FRAMEBUFFER_UNSUPPORTED";default:return`unknown error ${t}`}}function ha(e,t,n){let r=_e(e,()=>t());if(r==null)throw new Error(n);return r}function Ib(e,t){let n=e.MAX_COMBINED_TEXTURE_IMAGE_UNITS-1,r=t+e.TEXTURE0;if(rn){let a=`[gl.TEXTURE0, gl.TEXTURE${n}]`;throw new Error(`textureUnit must be in ${a}.`)}}function ki(e,t=2){return v.sizeFromShape(e.slice(0,e.length-t))}function Ii(e){if(e.length===0)throw Error("Cannot get rows and columns of an empty shape array.");return[e.length>1?e[e.length-2]:1,e[e.length-1]]}function mp(e){let t=[1,1,1];return e.length===0||e.length===1&&e[0]===1||(t=[ki(e),...Ii(e)]),t}function gb(e,t=!1){let n=J().getNumber("WEBGL_MAX_TEXTURE_SIZE");t&&(n=n*2,e=e.map((a,s)=>s>=e.length-2?v.nearestLargerEven(e[s]):e[s]),e.length===1&&(e=[2,e[0]])),e.length!==2&&(e=v.squeezeShape(e).newShape);let r=v.sizeFromShape(e);if(e.length<=1&&r<=n)return[1,r];if(e.length===2&&e[0]<=n&&e[1]<=n)return e;if(e.length===3&&e[0]*e[1]<=n&&e[2]<=n)return[e[0]*e[1],e[2]];if(e.length===3&&e[0]<=n&&e[1]*e[2]<=n)return[e[0],e[1]*e[2]];if(e.length===4&&e[0]*e[1]*e[2]<=n&&e[3]<=n)return[e[0]*e[1]*e[2],e[3]];if(e.length===4&&e[0]<=n&&e[1]*e[2]*e[3]<=n)return[e[0],e[1]*e[2]*e[3]];if(t){let a=ki(e),s=2,i=2;return e.length&&([s,i]=Ii(e)),r=a*(s/2)*(i/2),v.sizeToSquarishShape(r).map(o=>o*2)}return v.sizeToSquarishShape(r)}function yp(e){return e%2==0}function mc(e,t){if(e=e.slice(-2),t=t.slice(-2),v.arraysEqual(e,t)||!e.length||!t.length||e[0]===0||e[1]===0||t[0]===0||t[1]===0)return!0;if(e.length!==t.length){let n=e.slice(-1)[0],r=t.slice(-1)[0];if(n===r||yp(n)&&yp(r)&&(e[0]===1||t[0]===1))return!0}return e[1]===t[1]&&yp(e[0])&&yp(t[0])}var gp,xp;function xb(e){if(gp==null){let t=Hr(e);gp=t.getParameter(t.MAX_TEXTURE_SIZE)}return gp}function gz(){gp=null}function xz(){xp=null}function wb(e){if(xp==null){let t=Hr(e);xp=t.getParameter(t.MAX_TEXTURE_IMAGE_UNITS)}return Math.min(16,xp)}function bb(e){if(e===0)return 0;let t,n=Hr(e);return Jn(n,"EXT_disjoint_timer_query_webgl2")&&e===2?t=2:Jn(n,"EXT_disjoint_timer_query")?t=1:t=0,t}function Jn(e,t){return e.getExtension(t)!=null}function lA(e){try{if(Hr(e)!=null)return!0}catch(t){return console.log("Error when getting WebGL context: ",t),!1}return!1}function _b(e){if(e===0)return!1;let t=Hr(e);if(e===1){if(!Jn(t,"OES_texture_float"))return!1}else if(!Jn(t,"EXT_color_buffer_float"))return!1;return hA(t)}function vb(e){if(e===0)return!1;let t=Hr(e);if(e===1){if(!Jn(t,"OES_texture_float")||!Jn(t,"WEBGL_color_buffer_float"))return!1}else{if(Jn(t,"EXT_color_buffer_float"))return hA(t);let n="EXT_color_buffer_half_float";if(Jn(t,n)){let r=t.getExtension(n);return Ez(t,r)}return!1}return hA(t)}function hA(e){let t=cA(e),n=e.createTexture();e.bindTexture(e.TEXTURE_2D,n);let r=1,a=1;e.texImage2D(e.TEXTURE_2D,0,t.internalFormatFloat,r,a,0,t.textureFormatFloat,t.textureTypeFloat,null);let s=e.createFramebuffer();e.bindFramebuffer(e.FRAMEBUFFER,s),e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,n,0);let i=e.checkFramebufferStatus(e.FRAMEBUFFER)===e.FRAMEBUFFER_COMPLETE;return e.bindTexture(e.TEXTURE_2D,null),e.bindFramebuffer(e.FRAMEBUFFER,null),e.deleteTexture(n),e.deleteFramebuffer(s),i}function Ez(e,t){let n=cA(e,t),r=e.createTexture();e.bindTexture(e.TEXTURE_2D,r);let a=1,s=1;e.texImage2D(e.TEXTURE_2D,0,n.internalFormatHalfFloat,a,s,0,n.textureFormatFloat,n.textureTypeHalfFloat,null);let i=e.createFramebuffer();e.bindFramebuffer(e.FRAMEBUFFER,i),e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,r,0);let o=e.checkFramebufferStatus(e.FRAMEBUFFER)===e.FRAMEBUFFER_COMPLETE;return e.bindTexture(e.TEXTURE_2D,null),e.bindFramebuffer(e.FRAMEBUFFER,null),e.deleteTexture(r),e.deleteFramebuffer(i),o}function kb(e){return e!==2?!1:Hr(e).fenceSync!=null}function Fl(e,t){Array.isArray(e)||(e=[e]),e.forEach(n=>{n!=null&&v.assert(n.dtype!=="complex64",()=>`${t} does not support complex64 tensors in the WebGL backend.`)})}var $e=J();$e.registerFlag("HAS_WEBGL",()=>$e.getNumber("WEBGL_VERSION")>0);$e.registerFlag("WEBGL_VERSION",()=>lA(2)?2:lA(1)?1:0);$e.registerFlag("WEBGL_CHECK_NUMERICAL_PROBLEMS",()=>!1);$e.registerFlag("WEBGL_BUFFER_SUPPORTED",()=>$e.get("WEBGL_VERSION")===2);$e.registerFlag("WEBGL_CPU_FORWARD",()=>!0);$e.registerFlag("WEBGL_FORCE_F16_TEXTURES",()=>!1);$e.registerFlag("WEBGL_PACK",()=>$e.getBool("HAS_WEBGL"));$e.registerFlag("WEBGL_PACK_NORMALIZATION",()=>$e.getBool("WEBGL_PACK"));$e.registerFlag("WEBGL_PACK_CLIP",()=>$e.getBool("WEBGL_PACK"));$e.registerFlag("WEBGL_PACK_DEPTHWISECONV",()=>!1);$e.registerFlag("WEBGL_PACK_BINARY_OPERATIONS",()=>$e.getBool("WEBGL_PACK"));$e.registerFlag("WEBGL_PACK_UNARY_OPERATIONS",()=>$e.getBool("WEBGL_PACK"));$e.registerFlag("WEBGL_PACK_ARRAY_OPERATIONS",()=>$e.getBool("WEBGL_PACK"));$e.registerFlag("WEBGL_PACK_IMAGE_OPERATIONS",()=>$e.getBool("WEBGL_PACK"));$e.registerFlag("WEBGL_PACK_REDUCE",()=>$e.getBool("WEBGL_PACK"));$e.registerFlag("WEBGL_LAZILY_UNPACK",()=>$e.getBool("WEBGL_PACK"));$e.registerFlag("WEBGL_CONV_IM2COL",()=>$e.getBool("WEBGL_PACK"));$e.registerFlag("WEBGL_MAX_TEXTURE_SIZE",()=>xb($e.getNumber("WEBGL_VERSION")));$e.registerFlag("WEBGL_MAX_TEXTURES_IN_SHADER",()=>wb($e.getNumber("WEBGL_VERSION")));$e.registerFlag("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION",()=>{let e=$e.getNumber("WEBGL_VERSION");return e===0?0:bb(e)});$e.registerFlag("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE",()=>$e.getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")>0&&!Uu.isMobile());$e.registerFlag("WEBGL_RENDER_FLOAT32_CAPABLE",()=>_b($e.getNumber("WEBGL_VERSION")));$e.registerFlag("WEBGL_RENDER_FLOAT32_ENABLED",()=>$e.getBool("WEBGL_FORCE_F16_TEXTURES")?!1:$e.getBool("WEBGL_RENDER_FLOAT32_CAPABLE"));$e.registerFlag("WEBGL_DOWNLOAD_FLOAT_ENABLED",()=>vb($e.getNumber("WEBGL_VERSION")));$e.registerFlag("WEBGL_FENCE_API_ENABLED",()=>kb($e.getNumber("WEBGL_VERSION")));$e.registerFlag("WEBGL_SIZE_UPLOAD_UNIFORM",()=>$e.getBool("WEBGL_RENDER_FLOAT32_ENABLED")?4:0);$e.registerFlag("WEBGL_DELETE_TEXTURE_THRESHOLD",()=>-1,e=>{if(e<0&&e!==-1)throw new Error(`WEBGL_DELETE_TEXTURE_THRESHOLD must be -1 (indicating never delete) or at least 0, but got ${e}.`)});$e.registerFlag("WEBGL_FLUSH_THRESHOLD",()=>Uu.isMobile()&&$e.getBool("IS_CHROME")?1:-1,e=>{if(e<0&&e!==-1)throw new Error(`WEBGL_FLUSH_THRESHOLD must be -1 (indicating never manual flush) or at least 0, but got ${e}.`)});function fn(){let e,t,n,r,a,s,i,o,l,c;return J().getNumber("WEBGL_VERSION")===2?(e="#version 300 es",t="in",n="out",r="in",a="texture",s="outputColor",i="out vec4 outputColor;",o=` +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __markAsModule = (target) => __defProp(target, "__esModule", {value: true}); +var __commonJS = (callback, module) => () => { + if (!module) { + module = {exports: {}}; + callback(module.exports, module); + } + return module.exports; +}; +var __export = (target, all5) => { + for (var name in all5) + __defProp(target, name, {get: all5[name], enumerable: true}); +}; +var __exportStar = (target, module, desc) => { + if (module && typeof module === "object" || typeof module === "function") { + for (let key of __getOwnPropNames(module)) + if (!__hasOwnProp.call(target, key) && key !== "default") + __defProp(target, key, {get: () => module[key], enumerable: !(desc = __getOwnPropDesc(module, key)) || desc.enumerable}); + } + return target; +}; +var __toModule = (module) => { + return __exportStar(__markAsModule(__defProp(module != null ? __create(__getProtoOf(module)) : {}, "default", module && module.__esModule && "default" in module ? {get: () => module.default, enumerable: true} : {value: module, enumerable: true})), module); +}; +var __accessCheck = (obj, member, msg) => { + if (!member.has(obj)) + throw TypeError("Cannot " + msg); +}; +var __privateGet = (obj, member, getter) => { + __accessCheck(obj, member, "read from private field"); + return getter ? getter.call(obj) : member.get(obj); +}; +var __privateSet = (obj, member, value, setter) => { + __accessCheck(obj, member, "write to private field"); + setter ? setter.call(obj, value) : member.set(obj, value); + return value; +}; + +// src/blazeface/facemesh.ts +var require_facemesh = __commonJS((exports) => { + __markAsModule(exports); + __export(exports, { + MediaPipeFaceMesh: () => MediaPipeFaceMesh, + load: () => load11 + }); + var MediaPipeFaceMesh = class { + constructor(blazeFace, blazeMeshModel, irisModel, config3) { + this.facePipeline = new Pipeline(blazeFace, blazeMeshModel, irisModel); + this.config = config3; + } + async estimateFaces(input2, config3) { + const predictions = await this.facePipeline.predict(input2, config3); + const results = []; + for (const prediction of predictions || []) { + if (prediction.isDisposedInternal) + continue; + const mesh = prediction.coords ? prediction.coords.arraySync() : []; + const meshRaw = mesh.map((pt) => [ + pt[0] / input2.shape[2], + pt[1] / input2.shape[1], + pt[2] / this.facePipeline.meshSize + ]); + const annotations3 = {}; + if (mesh && mesh.length > 0) { + for (const key of Object.keys(MESH_ANNOTATIONS)) + annotations3[key] = MESH_ANNOTATIONS[key].map((index) => mesh[index]); + } + const box3 = prediction.box ? [ + Math.max(0, prediction.box.startPoint[0]), + Math.max(0, prediction.box.startPoint[1]), + Math.min(input2.shape[1], prediction.box.endPoint[0]) - Math.max(0, prediction.box.startPoint[0]), + Math.min(input2.shape[2], prediction.box.endPoint[1]) - Math.max(0, prediction.box.startPoint[1]) + ] : 0; + const boxRaw = prediction.box ? [ + prediction.box.startPoint[0] / input2.shape[2], + prediction.box.startPoint[1] / input2.shape[1], + (prediction.box.endPoint[0] - prediction.box.startPoint[0]) / input2.shape[2], + (prediction.box.endPoint[1] - prediction.box.startPoint[1]) / input2.shape[1] + ] : []; + results.push({ + confidence: prediction.faceConfidence || prediction.boxConfidence || 0, + boxConfidence: prediction.boxConfidence, + faceConfidence: prediction.faceConfidence, + box: box3, + boxRaw, + mesh, + meshRaw, + annotations: annotations3, + image: prediction.image ? prediction.image.clone() : null + }); + if (prediction.coords) + prediction.coords.dispose(); + if (prediction.image) + prediction.image.dispose(); + } + return results; + } + }; + var faceModels = [null, null, null]; + async function load11(config3) { + faceModels = await Promise.all([ + !faceModels[0] && config3.face.enabled ? load6(config3) : null, + !faceModels[1] && config3.face.mesh.enabled ? loadGraphModel(config3.face.mesh.modelPath, {fromTFHub: config3.face.mesh.modelPath.includes("tfhub.dev")}) : null, + !faceModels[2] && config3.face.iris.enabled ? loadGraphModel(config3.face.iris.modelPath, {fromTFHub: config3.face.iris.modelPath.includes("tfhub.dev")}) : null + ]); + const faceMesh = new MediaPipeFaceMesh(faceModels[0], faceModels[1], faceModels[2], config3); + if (config3.face.mesh.enabled && config3.debug) + log(`load model: ${config3.face.mesh.modelPath.match(/\/(.*)\./)[1]}`); + if (config3.face.iris.enabled && config3.debug) + log(`load model: ${config3.face.iris.modelPath.match(/\/(.*)\./)[1]}`); + return faceMesh; + } + exports.triangulation = TRI468; +}); + +// src/posenet/keypoints.ts +var require_keypoints = __commonJS((exports) => { + __markAsModule(exports); + __export(exports, { + NUM_KEYPOINTS: () => NUM_KEYPOINTS3, + connectedPartIndices: () => connectedPartIndices, + partChannels: () => partChannels, + partIds: () => partIds2, + partNames: () => partNames2, + poseChain: () => poseChain2 + }); + var partNames2 = [ + "nose", + "leftEye", + "rightEye", + "leftEar", + "rightEar", + "leftShoulder", + "rightShoulder", + "leftElbow", + "rightElbow", + "leftWrist", + "rightWrist", + "leftHip", + "rightHip", + "leftKnee", + "rightKnee", + "leftAnkle", + "rightAnkle" + ]; + var NUM_KEYPOINTS3 = exports.partNames.length; + var partIds2 = exports.partNames.reduce((result, jointName, i) => { + result[jointName] = i; + return result; + }, {}); + var connectedPartNames = [ + ["leftHip", "leftShoulder"], + ["leftElbow", "leftShoulder"], + ["leftElbow", "leftWrist"], + ["leftHip", "leftKnee"], + ["leftKnee", "leftAnkle"], + ["rightHip", "rightShoulder"], + ["rightElbow", "rightShoulder"], + ["rightElbow", "rightWrist"], + ["rightHip", "rightKnee"], + ["rightKnee", "rightAnkle"], + ["leftShoulder", "rightShoulder"], + ["leftHip", "rightHip"] + ]; + var connectedPartIndices = connectedPartNames.map(([jointNameA, jointNameB]) => [partIds2[jointNameA], partIds2[jointNameB]]); + var poseChain2 = [ + ["nose", "leftEye"], + ["leftEye", "leftEar"], + ["nose", "rightEye"], + ["rightEye", "rightEar"], + ["nose", "leftShoulder"], + ["leftShoulder", "leftElbow"], + ["leftElbow", "leftWrist"], + ["leftShoulder", "leftHip"], + ["leftHip", "leftKnee"], + ["leftKnee", "leftAnkle"], + ["nose", "rightShoulder"], + ["rightShoulder", "rightElbow"], + ["rightElbow", "rightWrist"], + ["rightShoulder", "rightHip"], + ["rightHip", "rightKnee"], + ["rightKnee", "rightAnkle"] + ]; + var partChannels = [ + "left_face", + "right_face", + "right_upper_leg_front", + "right_lower_leg_back", + "right_upper_leg_back", + "left_lower_leg_front", + "left_upper_leg_front", + "left_upper_leg_back", + "left_lower_leg_back", + "right_feet", + "right_lower_leg_front", + "left_feet", + "torso_front", + "torso_back", + "right_upper_arm_front", + "right_upper_arm_back", + "right_lower_arm_back", + "left_lower_arm_front", + "left_upper_arm_front", + "left_upper_arm_back", + "left_lower_arm_back", + "right_hand", + "right_lower_arm_front", + "left_hand" + ]; +}); + +// src/helpers.ts +function log(...msg) { + const dt = new Date(); + const ts = `${dt.getHours().toString().padStart(2, "0")}:${dt.getMinutes().toString().padStart(2, "0")}:${dt.getSeconds().toString().padStart(2, "0")}.${dt.getMilliseconds().toString().padStart(3, "0")}`; + if (msg) + console.log(ts, "Human:", ...msg); +} +var now = () => { + if (typeof performance !== "undefined") + return performance.now(); + return parseInt((Number(process.hrtime.bigint()) / 1e3 / 1e3).toString()); +}; +function mergeDeep(...objects) { + const isObject = (obj) => obj && typeof obj === "object"; + return objects.reduce((prev, obj) => { + Object.keys(obj || {}).forEach((key) => { + const pVal = prev[key]; + const oVal = obj[key]; + if (Array.isArray(pVal) && Array.isArray(oVal)) + prev[key] = pVal.concat(...oVal); + else if (isObject(pVal) && isObject(oVal)) + prev[key] = mergeDeep(pVal, oVal); + else + prev[key] = oVal; + }); + return prev; + }, {}); +} + +// src/sysinfo.ts +function info() { + let platform; + let agent; + if (typeof navigator !== "undefined") { + const raw = navigator.userAgent.match(/\(([^()]+)\)/g); + if (raw && raw[0]) { + platform = raw[0].match(/\(([^()]+)\)/g)[0].replace(/\(|\)/g, ""); + agent = navigator.userAgent.replace(raw[0], ""); + if (platform[1]) + agent = agent.replace(raw[1], ""); + agent = agent.replace(/ /g, " "); + } + } else if (typeof process !== "undefined") { + platform = `${process.platform} ${process.arch}`; + agent = `NodeJS ${process.version}`; + } + return {platform, agent}; +} + +// dist/tfjs.esm.js +var tfjs_esm_exports = {}; +__export(tfjs_esm_exports, { + Abs: () => Abs, + Acos: () => Acos, + Acosh: () => Acosh, + AdadeltaOptimizer: () => AdadeltaOptimizer, + AdagradOptimizer: () => AdagradOptimizer, + AdamOptimizer: () => AdamOptimizer, + AdamaxOptimizer: () => AdamaxOptimizer, + Add: () => Add, + AddN: () => AddN, + All: () => All, + Any: () => Any, + ArgMax: () => ArgMax, + ArgMin: () => ArgMin, + Asin: () => Asin, + Asinh: () => Asinh, + Atan: () => Atan, + Atan2: () => Atan2, + Atanh: () => Atanh, + AvgPool: () => AvgPool, + AvgPool3D: () => AvgPool3D, + AvgPool3DGrad: () => AvgPool3DGrad, + AvgPoolGrad: () => AvgPoolGrad, + BackendWasm: () => BackendWasm, + BatchMatMul: () => BatchMatMul, + BatchToSpaceND: () => BatchToSpaceND, + Bincount: () => Bincount, + BroadcastTo: () => BroadcastTo, + Callback: () => Callback, + CallbackList: () => CallbackList, + Cast: () => Cast, + Ceil: () => Ceil, + ClipByValue: () => ClipByValue, + Complex: () => Complex, + ComplexAbs: () => ComplexAbs, + Concat: () => Concat, + Conv2D: () => Conv2D, + Conv2DBackpropFilter: () => Conv2DBackpropFilter, + Conv2DBackpropInput: () => Conv2DBackpropInput, + Conv3D: () => Conv3D, + Conv3DBackpropFilterV2: () => Conv3DBackpropFilterV2, + Conv3DBackpropInputV2: () => Conv3DBackpropInputV2, + Cos: () => Cos, + Cosh: () => Cosh, + CropAndResize: () => CropAndResize, + Cumsum: () => Cumsum, + CustomCallback: () => CustomCallback, + DataStorage: () => DataStorage, + DenseBincount: () => DenseBincount, + DepthToSpace: () => DepthToSpace, + DepthwiseConv2dNative: () => DepthwiseConv2dNative, + DepthwiseConv2dNativeBackpropFilter: () => DepthwiseConv2dNativeBackpropFilter, + DepthwiseConv2dNativeBackpropInput: () => DepthwiseConv2dNativeBackpropInput, + Diag: () => Diag, + Dilation2D: () => Dilation2D, + Dilation2DBackpropFilter: () => Dilation2DBackpropFilter, + Dilation2DBackpropInput: () => Dilation2DBackpropInput, + ENV: () => ENV, + EarlyStopping: () => EarlyStopping, + Elu: () => Elu, + EluGrad: () => EluGrad, + Environment: () => Environment, + Equal: () => Equal, + Erf: () => Erf, + Exp: () => Exp, + ExpandDims: () => ExpandDims, + Expm1: () => Expm1, + FFT: () => FFT, + Fill: () => Fill, + FlipLeftRight: () => FlipLeftRight, + Floor: () => Floor, + FloorDiv: () => FloorDiv, + FromPixels: () => FromPixels, + FusedBatchNorm: () => FusedBatchNorm, + FusedConv2D: () => FusedConv2D, + FusedDepthwiseConv2D: () => FusedDepthwiseConv2D, + GPGPUContext: () => GPGPUContext, + GatherNd: () => GatherNd, + GatherV2: () => GatherV2, + GraphModel: () => GraphModel, + Greater: () => Greater, + GreaterEqual: () => GreaterEqual, + History: () => History, + IFFT: () => IFFT, + Identity: () => Identity, + Imag: () => Imag, + InputSpec: () => InputSpec, + IsFinite: () => IsFinite, + IsInf: () => IsInf, + IsNan: () => IsNan, + KernelBackend: () => KernelBackend, + LRN: () => LRN, + LRNGrad: () => LRNGrad, + LayerVariable: () => LayerVariable, + LayersModel: () => LayersModel, + LeakyRelu: () => LeakyRelu, + Less: () => Less, + LessEqual: () => LessEqual, + LinSpace: () => LinSpace, + Log: () => Log, + Log1p: () => Log1p, + LogSoftmax: () => LogSoftmax, + LogicalAnd: () => LogicalAnd, + LogicalNot: () => LogicalNot, + LogicalOr: () => LogicalOr, + MathBackendCPU: () => MathBackendCPU, + MathBackendWebGL: () => MathBackendWebGL, + Max: () => Max, + MaxPool: () => MaxPool, + MaxPool3D: () => MaxPool3D, + MaxPool3DGrad: () => MaxPool3DGrad, + MaxPoolGrad: () => MaxPoolGrad, + MaxPoolWithArgmax: () => MaxPoolWithArgmax, + Maximum: () => Maximum, + Mean: () => Mean, + Min: () => Min, + Minimum: () => Minimum, + MirrorPad: () => MirrorPad, + Mod: () => Mod, + MomentumOptimizer: () => MomentumOptimizer, + Multinomial: () => Multinomial, + Multiply: () => Multiply, + Neg: () => Neg, + NonMaxSuppressionV3: () => NonMaxSuppressionV3, + NonMaxSuppressionV4: () => NonMaxSuppressionV4, + NonMaxSuppressionV5: () => NonMaxSuppressionV5, + NotEqual: () => NotEqual, + OP_SCOPE_SUFFIX: () => OP_SCOPE_SUFFIX, + OneHot: () => OneHot, + OnesLike: () => OnesLike, + Optimizer: () => Optimizer, + Pack: () => Pack, + PadV2: () => PadV2, + Pool: () => Pool, + Pow: () => Pow, + Prelu: () => Prelu, + Prod: () => Prod, + RMSPropOptimizer: () => RMSPropOptimizer, + RNN: () => RNN, + Range: () => Range, + Rank: () => Rank, + Real: () => Real, + RealDiv: () => RealDiv, + Reciprocal: () => Reciprocal, + Reduction: () => Reduction, + Relu: () => Relu, + Relu6: () => Relu6, + Reshape: () => Reshape, + ResizeBilinear: () => ResizeBilinear, + ResizeBilinearGrad: () => ResizeBilinearGrad, + ResizeNearestNeighbor: () => ResizeNearestNeighbor, + ResizeNearestNeighborGrad: () => ResizeNearestNeighborGrad, + Reverse: () => Reverse, + RotateWithOffset: () => RotateWithOffset, + Round: () => Round, + Rsqrt: () => Rsqrt, + SGDOptimizer: () => SGDOptimizer, + ScatterNd: () => ScatterNd, + Select: () => Select, + Selu: () => Selu, + Sequential: () => Sequential, + Sigmoid: () => Sigmoid, + Sign: () => Sign, + Sin: () => Sin, + Sinh: () => Sinh, + Slice: () => Slice, + Softmax: () => Softmax, + Softplus: () => Softplus, + SpaceToBatchND: () => SpaceToBatchND, + SparseToDense: () => SparseToDense, + SplitV: () => SplitV, + Sqrt: () => Sqrt, + Square: () => Square, + SquaredDifference: () => SquaredDifference, + Step: () => Step, + StridedSlice: () => StridedSlice, + Sub: () => Sub, + Sum: () => Sum, + SymbolicTensor: () => SymbolicTensor, + Tan: () => Tan, + Tanh: () => Tanh, + Tensor: () => Tensor, + TensorBuffer: () => TensorBuffer, + Tile: () => Tile, + TopK: () => TopK, + Transform: () => Transform, + Transpose: () => Transpose, + Unique: () => Unique, + Unpack: () => Unpack, + UnsortedSegmentSum: () => UnsortedSegmentSum, + Variable: () => Variable, + ZerosLike: () => ZerosLike, + _FusedMatMul: () => _FusedMatMul, + abs: () => abs, + acos: () => acos, + acosh: () => acosh, + add: () => add2, + addN: () => addN, + all: () => all, + any: () => any, + argMax: () => argMax, + argMin: () => argMin, + asin: () => asin, + asinh: () => asinh, + atan: () => atan, + atan2: () => atan2, + atanh: () => atanh, + avgPool: () => avgPool, + avgPool3d: () => avgPool3d, + backend: () => backend, + backend_util: () => backend_util_exports, + basicLSTMCell: () => basicLSTMCell, + batchNorm: () => batchNorm, + batchNorm2d: () => batchNorm2d, + batchNorm3d: () => batchNorm3d, + batchNorm4d: () => batchNorm4d, + batchToSpaceND: () => batchToSpaceND, + bincount: () => bincount, + booleanMaskAsync: () => booleanMaskAsync, + broadcastTo: () => broadcastTo, + browser: () => browser_exports, + buffer: () => buffer, + callbacks: () => callbacks, + cast: () => cast, + ceil: () => ceil, + clipByValue: () => clipByValue, + clone: () => clone, + complex: () => complex, + concat: () => concat, + concat1d: () => concat1d, + concat2d: () => concat2d, + concat3d: () => concat3d, + concat4d: () => concat4d, + constraints: () => exports_constraints_exports, + conv1d: () => conv1d, + conv2d: () => conv2d, + conv2dTranspose: () => conv2dTranspose, + conv3d: () => conv3d, + conv3dTranspose: () => conv3dTranspose, + copyRegisteredKernels: () => copyRegisteredKernels, + cos: () => cos, + cosh: () => cosh, + cosineWindow: () => cosineWindow, + cumsum: () => cumsum, + customGrad: () => customGrad, + data: () => dist_exports, + denseBincount: () => denseBincount, + deprecationWarn: () => deprecationWarn, + depthToSpace: () => depthToSpace, + depthwiseConv2d: () => depthwiseConv2d, + deregisterOp: () => deregisterOp, + device_util: () => device_util_exports, + diag: () => diag, + dilation2d: () => dilation2d, + disableDeprecationWarnings: () => disableDeprecationWarnings, + dispose: () => dispose, + disposeVariables: () => disposeVariables, + div: () => div, + divNoNan: () => divNoNan, + dot: () => dot, + dropout: () => dropout, + elu: () => elu, + enableDebugMode: () => enableDebugMode, + enableProdMode: () => enableProdMode, + enclosingPowerOfTwo: () => enclosingPowerOfTwo, + engine: () => engine, + env: () => env, + equal: () => equal, + erf: () => erf, + exp: () => exp, + expandDims: () => expandDims, + expm1: () => expm1, + eye: () => eye, + fft: () => fft, + fill: () => fill, + findBackend: () => findBackend, + findBackendFactory: () => findBackendFactory, + floor: () => floor, + floorDiv: () => floorDiv, + forceHalfFloat: () => forceHalfFloat, + fused: () => fused_ops_exports, + gather: () => gather, + gatherND: () => gatherND, + gather_util: () => gather_nd_util_exports, + getBackend: () => getBackend, + getGradient: () => getGradient, + getKernel: () => getKernel, + getKernelsForBackend: () => getKernelsForBackend, + gpgpu_util: () => gpgpu_util_exports, + grad: () => grad, + grads: () => grads, + greater: () => greater, + greaterEqual: () => greaterEqual, + ifft: () => ifft, + imag: () => imag, + image: () => image, + inTopKAsync: () => inTopKAsync, + initializers: () => exports_initializers_exports, + input: () => input, + io: () => io_exports, + irfft: () => irfft, + isFinite: () => isFinite2, + isInf: () => isInf, + isNaN: () => isNaN2, + keep: () => keep, + kernel_impls: () => kernel_impls_exports, + layers: () => exports_layers_exports, + leakyRelu: () => leakyRelu, + less: () => less, + lessEqual: () => lessEqual, + linalg: () => linalg, + linspace: () => linspace, + loadGraphModel: () => loadGraphModel, + loadLayersModel: () => loadLayersModel, + localResponseNormalization: () => localResponseNormalization, + log: () => log2, + log1p: () => log1p, + logSigmoid: () => logSigmoid, + logSoftmax: () => logSoftmax, + logSumExp: () => logSumExp, + logicalAnd: () => logicalAnd, + logicalNot: () => logicalNot, + logicalOr: () => logicalOr, + logicalXor: () => logicalXor, + losses: () => losses, + matMul: () => matMul, + math: () => math_exports, + max: () => max, + maxPool: () => maxPool, + maxPool3d: () => maxPool3d, + maxPoolWithArgmax: () => maxPoolWithArgmax, + maximum: () => maximum, + mean: () => mean, + memory: () => memory, + metrics: () => exports_metrics_exports, + min: () => min, + minimum: () => minimum, + mirrorPad: () => mirrorPad, + mod: () => mod, + model: () => model, + models: () => exports_models_exports, + moments: () => moments, + movingAverage: () => movingAverage, + mul: () => mul, + multiRNNCell: () => multiRNNCell, + multinomial: () => multinomial, + neg: () => neg, + nextFrame: () => nextFrame, + norm: () => norm, + notEqual: () => notEqual, + oneHot: () => oneHot, + ones: () => ones2, + onesLike: () => onesLike, + op: () => op, + outerProduct: () => outerProduct, + pad: () => pad, + pad1d: () => pad1d, + pad2d: () => pad2d, + pad3d: () => pad3d, + pad4d: () => pad4d, + pool: () => pool, + pow: () => pow, + prelu: () => prelu, + print: () => print2, + prod: () => prod, + profile: () => profile, + rand: () => rand, + randomGamma: () => randomGamma, + randomNormal: () => randomNormal, + randomUniform: () => randomUniform, + range: () => range, + ready: () => ready, + real: () => real, + reciprocal: () => reciprocal, + registerBackend: () => registerBackend, + registerCallbackConstructor: () => registerCallbackConstructor, + registerGradient: () => registerGradient, + registerKernel: () => registerKernel, + registerOp: () => registerOp, + regularizers: () => exports_regularizers_exports, + relu: () => relu, + relu6: () => relu6, + removeBackend: () => removeBackend, + reshape: () => reshape, + reverse: () => reverse, + reverse1d: () => reverse1d, + reverse2d: () => reverse2d, + reverse3d: () => reverse3d, + reverse4d: () => reverse4d, + rfft: () => rfft, + round: () => round2, + rsqrt: () => rsqrt, + scalar: () => scalar, + scatterND: () => scatterND, + scatter_util: () => scatter_nd_util_exports, + selu: () => selu, + separableConv2d: () => separableConv2d, + sequential: () => sequential, + serialization: () => serialization_exports, + setBackend: () => setBackend, + setPlatform: () => setPlatform, + setWasmPath: () => setWasmPath, + setWasmPaths: () => setWasmPaths, + setWebGLContext: () => setWebGLContext, + setdiff1dAsync: () => setdiff1dAsync, + shared: () => shared_exports, + sigmoid: () => sigmoid, + sign: () => sign, + signal: () => signal, + sin: () => sin, + sinh: () => sinh, + slice: () => slice, + slice1d: () => slice1d, + slice2d: () => slice2d, + slice3d: () => slice3d, + slice4d: () => slice4d, + slice_util: () => slice_util_exports, + softmax: () => softmax, + softplus: () => softplus, + spaceToBatchND: () => spaceToBatchND, + sparseToDense: () => sparseToDense, + spectral: () => spectral, + split: () => split, + sqrt: () => sqrt, + square: () => square, + squaredDifference: () => squaredDifference, + squeeze: () => squeeze, + stack: () => stack, + step: () => step, + stridedSlice: () => stridedSlice, + sub: () => sub, + sum: () => sum2, + sumOutType: () => sumOutType, + tan: () => tan, + tanh: () => tanh2, + tensor: () => tensor, + tensor1d: () => tensor1d, + tensor2d: () => tensor2d, + tensor3d: () => tensor3d, + tensor4d: () => tensor4d, + tensor5d: () => tensor5d, + tensor6d: () => tensor6d, + tensor_util: () => tensor_util_exports, + test_util: () => test_util_exports, + tidy: () => tidy, + tile: () => tile, + time: () => time, + topk: () => topk, + train: () => train, + transpose: () => transpose, + truncatedNormal: () => truncatedNormal, + unique: () => unique, + unregisterGradient: () => unregisterGradient, + unregisterKernel: () => unregisterKernel, + unsortedSegmentSum: () => unsortedSegmentSum, + unstack: () => unstack, + upcastType: () => upcastType, + util: () => util_exports, + valueAndGrad: () => valueAndGrad, + valueAndGrads: () => valueAndGrads, + variable: () => variable, + variableGrads: () => variableGrads, + version: () => version13, + version_converter: () => version11, + version_core: () => version6, + version_cpu: () => version7, + version_layers: () => version10, + version_wasm: () => version9, + version_webgl: () => version8, + webgl: () => webgl, + webgl_util: () => webgl_util_exports, + where: () => where, + whereAsync: () => whereAsync, + zeros: () => zeros, + zerosLike: () => zerosLike +}); +var __create2 = Object.create; +var __defProp2 = Object.defineProperty; +var __getProtoOf2 = Object.getPrototypeOf; +var __hasOwnProp2 = Object.prototype.hasOwnProperty; +var __getOwnPropNames2 = Object.getOwnPropertyNames; +var __getOwnPropDesc2 = Object.getOwnPropertyDescriptor; +var __markAsModule2 = (target) => __defProp2(target, "__esModule", {value: true}); +var __commonJS2 = (callback, module) => () => { + if (!module) { + module = {exports: {}}; + callback(module.exports, module); + } + return module.exports; +}; +var __export2 = (target, all42) => { + for (var name in all42) + __defProp2(target, name, {get: all42[name], enumerable: true}); +}; +var __exportStar2 = (target, module, desc) => { + if (module && typeof module === "object" || typeof module === "function") { + for (let key of __getOwnPropNames2(module)) + if (!__hasOwnProp2.call(target, key) && key !== "default") + __defProp2(target, key, {get: () => module[key], enumerable: !(desc = __getOwnPropDesc2(module, key)) || desc.enumerable}); + } + return target; +}; +var __toModule2 = (module) => { + return __exportStar2(__markAsModule2(__defProp2(module != null ? __create2(__getProtoOf2(module)) : {}, "default", module && module.__esModule && "default" in module ? {get: () => module.default, enumerable: true} : {value: module, enumerable: true})), module); +}; +var require_browser = __commonJS2(() => { +}); +var require_alea = __commonJS2((exports, module) => { + (function(global2, module2, define2) { + function Alea(seed) { + var me = this, mash = Mash(); + me.next = function() { + var t = 2091639 * me.s0 + me.c * 23283064365386963e-26; + me.s0 = me.s1; + me.s1 = me.s2; + return me.s2 = t - (me.c = t | 0); + }; + me.c = 1; + me.s0 = mash(" "); + me.s1 = mash(" "); + me.s2 = mash(" "); + me.s0 -= mash(seed); + if (me.s0 < 0) { + me.s0 += 1; + } + me.s1 -= mash(seed); + if (me.s1 < 0) { + me.s1 += 1; + } + me.s2 -= mash(seed); + if (me.s2 < 0) { + me.s2 += 1; + } + mash = null; + } + function copy(f, t) { + t.c = f.c; + t.s0 = f.s0; + t.s1 = f.s1; + t.s2 = f.s2; + return t; + } + function impl(seed, opts) { + var xg = new Alea(seed), state = opts && opts.state, prng = xg.next; + prng.int32 = function() { + return xg.next() * 4294967296 | 0; + }; + prng.double = function() { + return prng() + (prng() * 2097152 | 0) * 11102230246251565e-32; + }; + prng.quick = prng; + if (state) { + if (typeof state == "object") + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + function Mash() { + var n = 4022871197; + var mash = function(data2) { + data2 = data2.toString(); + for (var i = 0; i < data2.length; i++) { + n += data2.charCodeAt(i); + var h = 0.02519603282416938 * n; + n = h >>> 0; + h -= n; + h *= n; + n = h >>> 0; + h -= n; + n += h * 4294967296; + } + return (n >>> 0) * 23283064365386963e-26; + }; + return mash; + } + if (module2 && module2.exports) { + module2.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.alea = impl; + } + })(exports, typeof module == "object" && module, typeof define == "function" && define); +}); +var require_xor128 = __commonJS2((exports, module) => { + (function(global2, module2, define2) { + function XorGen(seed) { + var me = this, strseed = ""; + me.x = 0; + me.y = 0; + me.z = 0; + me.w = 0; + me.next = function() { + var t = me.x ^ me.x << 11; + me.x = me.y; + me.y = me.z; + me.z = me.w; + return me.w ^= me.w >>> 19 ^ t ^ t >>> 8; + }; + if (seed === (seed | 0)) { + me.x = seed; + } else { + strseed += seed; + } + for (var k = 0; k < strseed.length + 64; k++) { + me.x ^= strseed.charCodeAt(k) | 0; + me.next(); + } + } + function copy(f, t) { + t.x = f.x; + t.y = f.y; + t.z = f.z; + t.w = f.w; + return t; + } + function impl(seed, opts) { + var xg = new XorGen(seed), state = opts && opts.state, prng = function() { + return (xg.next() >>> 0) / 4294967296; + }; + prng.double = function() { + do { + var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); + } while (result === 0); + return result; + }; + prng.int32 = xg.next; + prng.quick = prng; + if (state) { + if (typeof state == "object") + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + if (module2 && module2.exports) { + module2.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.xor128 = impl; + } + })(exports, typeof module == "object" && module, typeof define == "function" && define); +}); +var require_xorwow = __commonJS2((exports, module) => { + (function(global2, module2, define2) { + function XorGen(seed) { + var me = this, strseed = ""; + me.next = function() { + var t = me.x ^ me.x >>> 2; + me.x = me.y; + me.y = me.z; + me.z = me.w; + me.w = me.v; + return (me.d = me.d + 362437 | 0) + (me.v = me.v ^ me.v << 4 ^ (t ^ t << 1)) | 0; + }; + me.x = 0; + me.y = 0; + me.z = 0; + me.w = 0; + me.v = 0; + if (seed === (seed | 0)) { + me.x = seed; + } else { + strseed += seed; + } + for (var k = 0; k < strseed.length + 64; k++) { + me.x ^= strseed.charCodeAt(k) | 0; + if (k == strseed.length) { + me.d = me.x << 10 ^ me.x >>> 4; + } + me.next(); + } + } + function copy(f, t) { + t.x = f.x; + t.y = f.y; + t.z = f.z; + t.w = f.w; + t.v = f.v; + t.d = f.d; + return t; + } + function impl(seed, opts) { + var xg = new XorGen(seed), state = opts && opts.state, prng = function() { + return (xg.next() >>> 0) / 4294967296; + }; + prng.double = function() { + do { + var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); + } while (result === 0); + return result; + }; + prng.int32 = xg.next; + prng.quick = prng; + if (state) { + if (typeof state == "object") + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + if (module2 && module2.exports) { + module2.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.xorwow = impl; + } + })(exports, typeof module == "object" && module, typeof define == "function" && define); +}); +var require_xorshift7 = __commonJS2((exports, module) => { + (function(global2, module2, define2) { + function XorGen(seed) { + var me = this; + me.next = function() { + var X = me.x, i = me.i, t, v, w; + t = X[i]; + t ^= t >>> 7; + v = t ^ t << 24; + t = X[i + 1 & 7]; + v ^= t ^ t >>> 10; + t = X[i + 3 & 7]; + v ^= t ^ t >>> 3; + t = X[i + 4 & 7]; + v ^= t ^ t << 7; + t = X[i + 7 & 7]; + t = t ^ t << 13; + v ^= t ^ t << 9; + X[i] = v; + me.i = i + 1 & 7; + return v; + }; + function init2(me2, seed2) { + var j, w, X = []; + if (seed2 === (seed2 | 0)) { + w = X[0] = seed2; + } else { + seed2 = "" + seed2; + for (j = 0; j < seed2.length; ++j) { + X[j & 7] = X[j & 7] << 15 ^ seed2.charCodeAt(j) + X[j + 1 & 7] << 13; + } + } + while (X.length < 8) + X.push(0); + for (j = 0; j < 8 && X[j] === 0; ++j) + ; + if (j == 8) + w = X[7] = -1; + else + w = X[j]; + me2.x = X; + me2.i = 0; + for (j = 256; j > 0; --j) { + me2.next(); + } + } + init2(me, seed); + } + function copy(f, t) { + t.x = f.x.slice(); + t.i = f.i; + return t; + } + function impl(seed, opts) { + if (seed == null) + seed = +new Date(); + var xg = new XorGen(seed), state = opts && opts.state, prng = function() { + return (xg.next() >>> 0) / 4294967296; + }; + prng.double = function() { + do { + var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); + } while (result === 0); + return result; + }; + prng.int32 = xg.next; + prng.quick = prng; + if (state) { + if (state.x) + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + if (module2 && module2.exports) { + module2.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.xorshift7 = impl; + } + })(exports, typeof module == "object" && module, typeof define == "function" && define); +}); +var require_xor4096 = __commonJS2((exports, module) => { + (function(global2, module2, define2) { + function XorGen(seed) { + var me = this; + me.next = function() { + var w = me.w, X = me.X, i = me.i, t, v; + me.w = w = w + 1640531527 | 0; + v = X[i + 34 & 127]; + t = X[i = i + 1 & 127]; + v ^= v << 13; + t ^= t << 17; + v ^= v >>> 15; + t ^= t >>> 12; + v = X[i] = v ^ t; + me.i = i; + return v + (w ^ w >>> 16) | 0; + }; + function init2(me2, seed2) { + var t, v, i, j, w, X = [], limit = 128; + if (seed2 === (seed2 | 0)) { + v = seed2; + seed2 = null; + } else { + seed2 = seed2 + "\0"; + v = 0; + limit = Math.max(limit, seed2.length); + } + for (i = 0, j = -32; j < limit; ++j) { + if (seed2) + v ^= seed2.charCodeAt((j + 32) % seed2.length); + if (j === 0) + w = v; + v ^= v << 10; + v ^= v >>> 15; + v ^= v << 4; + v ^= v >>> 13; + if (j >= 0) { + w = w + 1640531527 | 0; + t = X[j & 127] ^= v + w; + i = t == 0 ? i + 1 : 0; + } + } + if (i >= 128) { + X[(seed2 && seed2.length || 0) & 127] = -1; + } + i = 127; + for (j = 4 * 128; j > 0; --j) { + v = X[i + 34 & 127]; + t = X[i = i + 1 & 127]; + v ^= v << 13; + t ^= t << 17; + v ^= v >>> 15; + t ^= t >>> 12; + X[i] = v ^ t; + } + me2.w = w; + me2.X = X; + me2.i = i; + } + init2(me, seed); + } + function copy(f, t) { + t.i = f.i; + t.w = f.w; + t.X = f.X.slice(); + return t; + } + ; + function impl(seed, opts) { + if (seed == null) + seed = +new Date(); + var xg = new XorGen(seed), state = opts && opts.state, prng = function() { + return (xg.next() >>> 0) / 4294967296; + }; + prng.double = function() { + do { + var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); + } while (result === 0); + return result; + }; + prng.int32 = xg.next; + prng.quick = prng; + if (state) { + if (state.X) + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + if (module2 && module2.exports) { + module2.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.xor4096 = impl; + } + })(exports, typeof module == "object" && module, typeof define == "function" && define); +}); +var require_tychei = __commonJS2((exports, module) => { + (function(global2, module2, define2) { + function XorGen(seed) { + var me = this, strseed = ""; + me.next = function() { + var b = me.b, c = me.c, d = me.d, a = me.a; + b = b << 25 ^ b >>> 7 ^ c; + c = c - d | 0; + d = d << 24 ^ d >>> 8 ^ a; + a = a - b | 0; + me.b = b = b << 20 ^ b >>> 12 ^ c; + me.c = c = c - d | 0; + me.d = d << 16 ^ c >>> 16 ^ a; + return me.a = a - b | 0; + }; + me.a = 0; + me.b = 0; + me.c = 2654435769 | 0; + me.d = 1367130551; + if (seed === Math.floor(seed)) { + me.a = seed / 4294967296 | 0; + me.b = seed | 0; + } else { + strseed += seed; + } + for (var k = 0; k < strseed.length + 20; k++) { + me.b ^= strseed.charCodeAt(k) | 0; + me.next(); + } + } + function copy(f, t) { + t.a = f.a; + t.b = f.b; + t.c = f.c; + t.d = f.d; + return t; + } + ; + function impl(seed, opts) { + var xg = new XorGen(seed), state = opts && opts.state, prng = function() { + return (xg.next() >>> 0) / 4294967296; + }; + prng.double = function() { + do { + var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); + } while (result === 0); + return result; + }; + prng.int32 = xg.next; + prng.quick = prng; + if (state) { + if (typeof state == "object") + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + if (module2 && module2.exports) { + module2.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.tychei = impl; + } + })(exports, typeof module == "object" && module, typeof define == "function" && define); +}); +var require_crypto = __commonJS2(() => { +}); +var require_seedrandom = __commonJS2((exports, module) => { + (function(pool3, math) { + var global2 = this, width = 256, chunks = 6, digits = 52, rngname = "random", startdenom = math.pow(width, chunks), significance = math.pow(2, digits), overflow = significance * 2, mask = width - 1, nodecrypto; + function seedrandom5(seed, options, callback) { + var key = []; + options = options == true ? {entropy: true} : options || {}; + var shortseed = mixkey(flatten4(options.entropy ? [seed, tostring(pool3)] : seed == null ? autoseed() : seed, 3), key); + var arc4 = new ARC4(key); + var prng = function() { + var n = arc4.g(chunks), d = startdenom, x = 0; + while (n < significance) { + n = (n + x) * width; + d *= width; + x = arc4.g(1); + } + while (n >= overflow) { + n /= 2; + d /= 2; + x >>>= 1; + } + return (n + x) / d; + }; + prng.int32 = function() { + return arc4.g(4) | 0; + }; + prng.quick = function() { + return arc4.g(4) / 4294967296; + }; + prng.double = prng; + mixkey(tostring(arc4.S), pool3); + return (options.pass || callback || function(prng2, seed2, is_math_call, state) { + if (state) { + if (state.S) { + copy(state, arc4); + } + prng2.state = function() { + return copy(arc4, {}); + }; + } + if (is_math_call) { + math[rngname] = prng2; + return seed2; + } else + return prng2; + })(prng, shortseed, "global" in options ? options.global : this == math, options.state); + } + math["seed" + rngname] = seedrandom5; + function ARC4(key) { + var t, keylen = key.length, me = this, i = 0, j = me.i = me.j = 0, s = me.S = []; + if (!keylen) { + key = [keylen++]; + } + while (i < width) { + s[i] = i++; + } + for (i = 0; i < width; i++) { + s[i] = s[j = mask & j + key[i % keylen] + (t = s[i])]; + s[j] = t; + } + (me.g = function(count2) { + var t2, r = 0, i2 = me.i, j2 = me.j, s2 = me.S; + while (count2--) { + t2 = s2[i2 = mask & i2 + 1]; + r = r * width + s2[mask & (s2[i2] = s2[j2 = mask & j2 + t2]) + (s2[j2] = t2)]; + } + me.i = i2; + me.j = j2; + return r; + })(width); + } + function copy(f, t) { + t.i = f.i; + t.j = f.j; + t.S = f.S.slice(); + return t; + } + ; + function flatten4(obj, depth) { + var result = [], typ = typeof obj, prop; + if (depth && typ == "object") { + for (prop in obj) { + try { + result.push(flatten4(obj[prop], depth - 1)); + } catch (e) { + } + } + } + return result.length ? result : typ == "string" ? obj : obj + "\0"; + } + function mixkey(seed, key) { + var stringseed = seed + "", smear, j = 0; + while (j < stringseed.length) { + key[mask & j] = mask & (smear ^= key[mask & j] * 19) + stringseed.charCodeAt(j++); + } + return tostring(key); + } + function autoseed() { + try { + var out; + if (nodecrypto && (out = nodecrypto.randomBytes)) { + out = out(width); + } else { + out = new Uint8Array(width); + (global2.crypto || global2.msCrypto).getRandomValues(out); + } + return tostring(out); + } catch (e) { + var browser = global2.navigator, plugins = browser && browser.plugins; + return [+new Date(), global2, plugins, global2.screen, tostring(pool3)]; + } + } + function tostring(a) { + return String.fromCharCode.apply(0, a); + } + mixkey(math.random(), pool3); + if (typeof module == "object" && module.exports) { + module.exports = seedrandom5; + try { + nodecrypto = require_crypto(); + } catch (ex) { + } + } else if (typeof define == "function" && define.amd) { + define(function() { + return seedrandom5; + }); + } + })([], Math); +}); +var require_seedrandom2 = __commonJS2((exports, module) => { + var alea5 = require_alea(); + var xor128 = require_xor128(); + var xorwow = require_xorwow(); + var xorshift7 = require_xorshift7(); + var xor4096 = require_xor4096(); + var tychei = require_tychei(); + var sr = require_seedrandom(); + sr.alea = alea5; + sr.xor128 = xor128; + sr.xorwow = xorwow; + sr.xorshift7 = xorshift7; + sr.xor4096 = xor4096; + sr.tychei = tychei; + module.exports = sr; +}); +var require_path = __commonJS2(() => { +}); +var require_worker_threads = __commonJS2(() => { +}); +var require_perf_hooks = __commonJS2(() => { +}); +var require_tfjs_backend_wasm_threaded_simd = __commonJS2((exports, module) => { + var WasmBackendModuleThreadedSimd = function() { + var _scriptDir = typeof document !== "undefined" && document.currentScript ? document.currentScript.src : void 0; + if (typeof __filename !== "undefined") + _scriptDir = _scriptDir || __filename; + return function(WasmBackendModuleThreadedSimd2) { + WasmBackendModuleThreadedSimd2 = WasmBackendModuleThreadedSimd2 || {}; + function GROWABLE_HEAP_I8() { + if (wasmMemory.buffer != buffer2) { + updateGlobalBufferAndViews(wasmMemory.buffer); + } + return HEAP8; + } + function GROWABLE_HEAP_U8() { + if (wasmMemory.buffer != buffer2) { + updateGlobalBufferAndViews(wasmMemory.buffer); + } + return HEAPU8; + } + function GROWABLE_HEAP_I32() { + if (wasmMemory.buffer != buffer2) { + updateGlobalBufferAndViews(wasmMemory.buffer); + } + return HEAP32; + } + function GROWABLE_HEAP_U32() { + if (wasmMemory.buffer != buffer2) { + updateGlobalBufferAndViews(wasmMemory.buffer); + } + return HEAPU32; + } + function GROWABLE_HEAP_F64() { + if (wasmMemory.buffer != buffer2) { + updateGlobalBufferAndViews(wasmMemory.buffer); + } + return HEAPF64; + } + var Module = typeof WasmBackendModuleThreadedSimd2 !== "undefined" ? WasmBackendModuleThreadedSimd2 : {}; + var readyPromiseResolve, readyPromiseReject; + Module["ready"] = new Promise(function(resolve, reject) { + readyPromiseResolve = resolve; + readyPromiseReject = reject; + }); + var moduleOverrides = {}; + var key; + for (key in Module) { + if (Module.hasOwnProperty(key)) { + moduleOverrides[key] = Module[key]; + } + } + var arguments_ = []; + var thisProgram = "./this.program"; + var quit_ = function(status2, toThrow) { + throw toThrow; + }; + var ENVIRONMENT_IS_WEB = false; + var ENVIRONMENT_IS_WORKER = false; + var ENVIRONMENT_IS_NODE = false; + var ENVIRONMENT_IS_SHELL = false; + ENVIRONMENT_IS_WEB = typeof window === "object"; + ENVIRONMENT_IS_WORKER = typeof importScripts === "function"; + ENVIRONMENT_IS_NODE = typeof process === "object" && typeof process.versions === "object" && typeof process.versions.node === "string"; + ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER; + var ENVIRONMENT_IS_PTHREAD = Module["ENVIRONMENT_IS_PTHREAD"] || false; + if (ENVIRONMENT_IS_PTHREAD) { + buffer2 = Module["buffer"]; + } + var scriptDirectory = ""; + function locateFile(path) { + if (Module["locateFile"]) { + return Module["locateFile"](path, scriptDirectory); + } + return scriptDirectory + path; + } + var read_, readAsync, readBinary, setWindowTitle; + var nodeFS; + var nodePath; + if (ENVIRONMENT_IS_NODE) { + if (ENVIRONMENT_IS_WORKER) { + scriptDirectory = require_path().dirname(scriptDirectory) + "/"; + } else { + scriptDirectory = __dirname + "/"; + } + read_ = function shell_read(filename, binary) { + if (!nodeFS) + nodeFS = require("fs"); + if (!nodePath) + nodePath = require_path(); + filename = nodePath["normalize"](filename); + return nodeFS["readFileSync"](filename, binary ? null : "utf8"); + }; + readBinary = function readBinary2(filename) { + var ret = read_(filename, true); + if (!ret.buffer) { + ret = new Uint8Array(ret); + } + assert3(ret.buffer); + return ret; + }; + if (process["argv"].length > 1) { + thisProgram = process["argv"][1].replace(/\\/g, "/"); + } + arguments_ = process["argv"].slice(2); + process["on"]("uncaughtException", function(ex) { + if (!(ex instanceof ExitStatus)) { + throw ex; + } + }); + process["on"]("unhandledRejection", abort); + quit_ = function(status2) { + process["exit"](status2); + }; + Module["inspect"] = function() { + return "[Emscripten Module object]"; + }; + var nodeWorkerThreads; + try { + nodeWorkerThreads = require_worker_threads(); + } catch (e) { + console.error('The "worker_threads" module is not supported in this node.js build - perhaps a newer version is needed?'); + throw e; + } + global.Worker = nodeWorkerThreads.Worker; + } else if (ENVIRONMENT_IS_SHELL) { + if (typeof read != "undefined") { + read_ = function shell_read(f) { + return read(f); + }; + } + readBinary = function readBinary2(f) { + var data2; + if (typeof readbuffer === "function") { + return new Uint8Array(readbuffer(f)); + } + data2 = read(f, "binary"); + assert3(typeof data2 === "object"); + return data2; + }; + if (typeof scriptArgs != "undefined") { + arguments_ = scriptArgs; + } else if (typeof arguments != "undefined") { + arguments_ = arguments; + } + if (typeof quit === "function") { + quit_ = function(status2) { + quit(status2); + }; + } + if (typeof print !== "undefined") { + if (typeof console === "undefined") + console = {}; + console.log = print; + console.warn = console.error = typeof printErr !== "undefined" ? printErr : print; + } + } else if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) { + if (ENVIRONMENT_IS_WORKER) { + scriptDirectory = self.location.href; + } else if (typeof document !== "undefined" && document.currentScript) { + scriptDirectory = document.currentScript.src; + } + if (typeof _scriptDir !== "undefined" && _scriptDir) { + scriptDirectory = _scriptDir; + } + if (scriptDirectory.indexOf("blob:") !== 0) { + scriptDirectory = scriptDirectory.substr(0, scriptDirectory.lastIndexOf("/") + 1); + } else { + scriptDirectory = ""; + } + if (ENVIRONMENT_IS_NODE) { + read_ = function shell_read(filename, binary) { + if (!nodeFS) + nodeFS = require("fs"); + if (!nodePath) + nodePath = require_path(); + filename = nodePath["normalize"](filename); + return nodeFS["readFileSync"](filename, binary ? null : "utf8"); + }; + readBinary = function readBinary2(filename) { + var ret = read_(filename, true); + if (!ret.buffer) { + ret = new Uint8Array(ret); + } + assert3(ret.buffer); + return ret; + }; + } else { + read_ = function(url) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", url, false); + xhr.send(null); + return xhr.responseText; + }; + if (ENVIRONMENT_IS_WORKER) { + readBinary = function(url) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", url, false); + xhr.responseType = "arraybuffer"; + xhr.send(null); + return new Uint8Array(xhr.response); + }; + } + readAsync = function(url, onload, onerror) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", url, true); + xhr.responseType = "arraybuffer"; + xhr.onload = function() { + if (xhr.status == 200 || xhr.status == 0 && xhr.response) { + onload(xhr.response); + return; + } + onerror(); + }; + xhr.onerror = onerror; + xhr.send(null); + }; + } + setWindowTitle = function(title) { + document.title = title; + }; + } else { + } + if (ENVIRONMENT_IS_NODE) { + if (typeof performance === "undefined") { + global.performance = require_perf_hooks().performance; + } + } + var out = Module["print"] || console.log.bind(console); + var err = Module["printErr"] || console.warn.bind(console); + for (key in moduleOverrides) { + if (moduleOverrides.hasOwnProperty(key)) { + Module[key] = moduleOverrides[key]; + } + } + moduleOverrides = null; + if (Module["arguments"]) + arguments_ = Module["arguments"]; + if (Module["thisProgram"]) + thisProgram = Module["thisProgram"]; + if (Module["quit"]) + quit_ = Module["quit"]; + var Atomics_load = Atomics.load; + var Atomics_store = Atomics.store; + var Atomics_compareExchange = Atomics.compareExchange; + var wasmBinary; + if (Module["wasmBinary"]) + wasmBinary = Module["wasmBinary"]; + var noExitRuntime = Module["noExitRuntime"] || true; + if (typeof WebAssembly !== "object") { + abort("no native wasm support detected"); + } + var wasmMemory; + var wasmModule; + var ABORT = false; + var EXITSTATUS; + function assert3(condition, text) { + if (!condition) { + abort("Assertion failed: " + text); + } + } + function getCFunc(ident) { + var func2 = Module["_" + ident]; + assert3(func2, "Cannot call unknown function " + ident + ", make sure it is exported"); + return func2; + } + function ccall(ident, returnType, argTypes, args, opts) { + var toC = {string: function(str2) { + var ret2 = 0; + if (str2 !== null && str2 !== void 0 && str2 !== 0) { + var len = (str2.length << 2) + 1; + ret2 = stackAlloc(len); + stringToUTF8(str2, ret2, len); + } + return ret2; + }, array: function(arr) { + var ret2 = stackAlloc(arr.length); + writeArrayToMemory(arr, ret2); + return ret2; + }}; + function convertReturnValue(ret2) { + if (returnType === "string") + return UTF8ToString(ret2); + if (returnType === "boolean") + return Boolean(ret2); + return ret2; + } + var func2 = getCFunc(ident); + var cArgs = []; + var stack2 = 0; + if (args) { + for (var i = 0; i < args.length; i++) { + var converter = toC[argTypes[i]]; + if (converter) { + if (stack2 === 0) + stack2 = stackSave(); + cArgs[i] = converter(args[i]); + } else { + cArgs[i] = args[i]; + } + } + } + var ret = func2.apply(null, cArgs); + ret = convertReturnValue(ret); + if (stack2 !== 0) + stackRestore(stack2); + return ret; + } + function cwrap(ident, returnType, argTypes, opts) { + argTypes = argTypes || []; + var numericArgs = argTypes.every(function(type) { + return type === "number"; + }); + var numericRet = returnType !== "string"; + if (numericRet && numericArgs && !opts) { + return getCFunc(ident); + } + return function() { + return ccall(ident, returnType, argTypes, arguments, opts); + }; + } + function UTF8ArrayToString(heap, idx, maxBytesToRead) { + var endIdx = idx + maxBytesToRead; + var str2 = ""; + while (!(idx >= endIdx)) { + var u0 = heap[idx++]; + if (!u0) + return str2; + if (!(u0 & 128)) { + str2 += String.fromCharCode(u0); + continue; + } + var u1 = heap[idx++] & 63; + if ((u0 & 224) == 192) { + str2 += String.fromCharCode((u0 & 31) << 6 | u1); + continue; + } + var u2 = heap[idx++] & 63; + if ((u0 & 240) == 224) { + u0 = (u0 & 15) << 12 | u1 << 6 | u2; + } else { + u0 = (u0 & 7) << 18 | u1 << 12 | u2 << 6 | heap[idx++] & 63; + } + if (u0 < 65536) { + str2 += String.fromCharCode(u0); + } else { + var ch = u0 - 65536; + str2 += String.fromCharCode(55296 | ch >> 10, 56320 | ch & 1023); + } + } + return str2; + } + function UTF8ToString(ptr, maxBytesToRead) { + return ptr ? UTF8ArrayToString(GROWABLE_HEAP_U8(), ptr, maxBytesToRead) : ""; + } + function stringToUTF8Array(str2, heap, outIdx, maxBytesToWrite) { + if (!(maxBytesToWrite > 0)) + return 0; + var startIdx = outIdx; + var endIdx = outIdx + maxBytesToWrite - 1; + for (var i = 0; i < str2.length; ++i) { + var u = str2.charCodeAt(i); + if (u >= 55296 && u <= 57343) { + var u1 = str2.charCodeAt(++i); + u = 65536 + ((u & 1023) << 10) | u1 & 1023; + } + if (u <= 127) { + if (outIdx >= endIdx) + break; + heap[outIdx++] = u; + } else if (u <= 2047) { + if (outIdx + 1 >= endIdx) + break; + heap[outIdx++] = 192 | u >> 6; + heap[outIdx++] = 128 | u & 63; + } else if (u <= 65535) { + if (outIdx + 2 >= endIdx) + break; + heap[outIdx++] = 224 | u >> 12; + heap[outIdx++] = 128 | u >> 6 & 63; + heap[outIdx++] = 128 | u & 63; + } else { + if (outIdx + 3 >= endIdx) + break; + heap[outIdx++] = 240 | u >> 18; + heap[outIdx++] = 128 | u >> 12 & 63; + heap[outIdx++] = 128 | u >> 6 & 63; + heap[outIdx++] = 128 | u & 63; + } + } + heap[outIdx] = 0; + return outIdx - startIdx; + } + function stringToUTF8(str2, outPtr, maxBytesToWrite) { + return stringToUTF8Array(str2, GROWABLE_HEAP_U8(), outPtr, maxBytesToWrite); + } + function lengthBytesUTF8(str2) { + var len = 0; + for (var i = 0; i < str2.length; ++i) { + var u = str2.charCodeAt(i); + if (u >= 55296 && u <= 57343) + u = 65536 + ((u & 1023) << 10) | str2.charCodeAt(++i) & 1023; + if (u <= 127) + ++len; + else if (u <= 2047) + len += 2; + else if (u <= 65535) + len += 3; + else + len += 4; + } + return len; + } + function writeArrayToMemory(array2, buffer3) { + GROWABLE_HEAP_I8().set(array2, buffer3); + } + function alignUp(x, multiple) { + if (x % multiple > 0) { + x += multiple - x % multiple; + } + return x; + } + var buffer2, HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64; + function updateGlobalBufferAndViews(buf) { + buffer2 = buf; + Module["HEAP8"] = HEAP8 = new Int8Array(buf); + Module["HEAP16"] = HEAP16 = new Int16Array(buf); + Module["HEAP32"] = HEAP32 = new Int32Array(buf); + Module["HEAPU8"] = HEAPU8 = new Uint8Array(buf); + Module["HEAPU16"] = HEAPU16 = new Uint16Array(buf); + Module["HEAPU32"] = HEAPU32 = new Uint32Array(buf); + Module["HEAPF32"] = HEAPF32 = new Float32Array(buf); + Module["HEAPF64"] = HEAPF64 = new Float64Array(buf); + } + var INITIAL_MEMORY = Module["INITIAL_MEMORY"] || 16777216; + if (ENVIRONMENT_IS_PTHREAD) { + wasmMemory = Module["wasmMemory"]; + buffer2 = Module["buffer"]; + } else { + if (Module["wasmMemory"]) { + wasmMemory = Module["wasmMemory"]; + } else { + wasmMemory = new WebAssembly.Memory({initial: INITIAL_MEMORY / 65536, maximum: 2147483648 / 65536, shared: true}); + if (!(wasmMemory.buffer instanceof SharedArrayBuffer)) { + err("requested a shared WebAssembly.Memory but the returned buffer is not a SharedArrayBuffer, indicating that while the browser has SharedArrayBuffer it does not have WebAssembly threads support - you may need to set a flag"); + if (ENVIRONMENT_IS_NODE) { + console.log("(on node you may need: --experimental-wasm-threads --experimental-wasm-bulk-memory and also use a recent version)"); + } + throw Error("bad memory"); + } + } + } + if (wasmMemory) { + buffer2 = wasmMemory.buffer; + } + INITIAL_MEMORY = buffer2.byteLength; + updateGlobalBufferAndViews(buffer2); + var wasmTable; + var __ATPRERUN__ = []; + var __ATINIT__ = []; + var __ATMAIN__ = []; + var __ATEXIT__ = []; + var __ATPOSTRUN__ = []; + var runtimeInitialized = false; + var runtimeExited = false; + if (!ENVIRONMENT_IS_PTHREAD) + __ATINIT__.push({func: function() { + ___wasm_call_ctors(); + }}); + if (ENVIRONMENT_IS_PTHREAD) + runtimeInitialized = true; + function preRun() { + if (ENVIRONMENT_IS_PTHREAD) + return; + if (Module["preRun"]) { + if (typeof Module["preRun"] == "function") + Module["preRun"] = [Module["preRun"]]; + while (Module["preRun"].length) { + addOnPreRun(Module["preRun"].shift()); + } + } + callRuntimeCallbacks(__ATPRERUN__); + } + function initRuntime() { + runtimeInitialized = true; + callRuntimeCallbacks(__ATINIT__); + } + function preMain() { + if (ENVIRONMENT_IS_PTHREAD) + return; + callRuntimeCallbacks(__ATMAIN__); + } + function exitRuntime() { + if (ENVIRONMENT_IS_PTHREAD) + return; + runtimeExited = true; + } + function postRun() { + if (ENVIRONMENT_IS_PTHREAD) + return; + if (Module["postRun"]) { + if (typeof Module["postRun"] == "function") + Module["postRun"] = [Module["postRun"]]; + while (Module["postRun"].length) { + addOnPostRun(Module["postRun"].shift()); + } + } + callRuntimeCallbacks(__ATPOSTRUN__); + } + function addOnPreRun(cb) { + __ATPRERUN__.unshift(cb); + } + function addOnPostRun(cb) { + __ATPOSTRUN__.unshift(cb); + } + var runDependencies = 0; + var runDependencyWatcher = null; + var dependenciesFulfilled = null; + function addRunDependency(id) { + assert3(!ENVIRONMENT_IS_PTHREAD, "addRunDependency cannot be used in a pthread worker"); + runDependencies++; + if (Module["monitorRunDependencies"]) { + Module["monitorRunDependencies"](runDependencies); + } + } + function removeRunDependency(id) { + runDependencies--; + if (Module["monitorRunDependencies"]) { + Module["monitorRunDependencies"](runDependencies); + } + if (runDependencies == 0) { + if (runDependencyWatcher !== null) { + clearInterval(runDependencyWatcher); + runDependencyWatcher = null; + } + if (dependenciesFulfilled) { + var callback = dependenciesFulfilled; + dependenciesFulfilled = null; + callback(); + } + } + } + Module["preloadedImages"] = {}; + Module["preloadedAudios"] = {}; + function abort(what) { + if (Module["onAbort"]) { + Module["onAbort"](what); + } + if (ENVIRONMENT_IS_PTHREAD) + console.error("Pthread aborting at " + new Error().stack); + what += ""; + err(what); + ABORT = true; + EXITSTATUS = 1; + what = "abort(" + what + "). Build with -s ASSERTIONS=1 for more info."; + var e = new WebAssembly.RuntimeError(what); + readyPromiseReject(e); + throw e; + } + function hasPrefix(str2, prefix) { + return String.prototype.startsWith ? str2.startsWith(prefix) : str2.indexOf(prefix) === 0; + } + var dataURIPrefix = "data:application/octet-stream;base64,"; + function isDataURI(filename) { + return hasPrefix(filename, dataURIPrefix); + } + var fileURIPrefix = "file://"; + function isFileURI(filename) { + return hasPrefix(filename, fileURIPrefix); + } + var wasmBinaryFile = "tfjs-backend-wasm-threaded-simd.wasm"; + if (!isDataURI(wasmBinaryFile)) { + wasmBinaryFile = locateFile(wasmBinaryFile); + } + function getBinary(file) { + try { + if (file == wasmBinaryFile && wasmBinary) { + return new Uint8Array(wasmBinary); + } + if (readBinary) { + return readBinary(file); + } else { + throw "both async and sync fetching of the wasm failed"; + } + } catch (err2) { + abort(err2); + } + } + function getBinaryPromise() { + if (!wasmBinary && (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER)) { + if (typeof fetch === "function" && !isFileURI(wasmBinaryFile)) { + return fetch(wasmBinaryFile, {credentials: "same-origin"}).then(function(response) { + if (!response["ok"]) { + throw "failed to load wasm binary file at '" + wasmBinaryFile + "'"; + } + return response["arrayBuffer"](); + }).catch(function() { + return getBinary(wasmBinaryFile); + }); + } else { + if (readAsync) { + return new Promise(function(resolve, reject) { + readAsync(wasmBinaryFile, function(response) { + resolve(new Uint8Array(response)); + }, reject); + }); + } + } + } + return Promise.resolve().then(function() { + return getBinary(wasmBinaryFile); + }); + } + function createWasm() { + var info2 = {a: asmLibraryArg}; + function receiveInstance(instance2, module2) { + var exports3 = instance2.exports; + Module["asm"] = exports3; + wasmTable = Module["asm"]["F"]; + wasmModule = module2; + if (!ENVIRONMENT_IS_PTHREAD) { + var numWorkersToLoad = PThread.unusedWorkers.length; + PThread.unusedWorkers.forEach(function(w) { + PThread.loadWasmModuleToWorker(w, function() { + if (!--numWorkersToLoad) + removeRunDependency("wasm-instantiate"); + }); + }); + } + } + if (!ENVIRONMENT_IS_PTHREAD) { + addRunDependency("wasm-instantiate"); + } + function receiveInstantiatedSource(output) { + receiveInstance(output["instance"], output["module"]); + } + function instantiateArrayBuffer(receiver) { + return getBinaryPromise().then(function(binary) { + return WebAssembly.instantiate(binary, info2); + }).then(receiver, function(reason) { + err("failed to asynchronously prepare wasm: " + reason); + abort(reason); + }); + } + function instantiateAsync() { + if (!wasmBinary && typeof WebAssembly.instantiateStreaming === "function" && !isDataURI(wasmBinaryFile) && !isFileURI(wasmBinaryFile) && typeof fetch === "function") { + return fetch(wasmBinaryFile, {credentials: "same-origin"}).then(function(response) { + var result = WebAssembly.instantiateStreaming(response, info2); + return result.then(receiveInstantiatedSource, function(reason) { + err("wasm streaming compile failed: " + reason); + err("falling back to ArrayBuffer instantiation"); + return instantiateArrayBuffer(receiveInstantiatedSource); + }); + }); + } else { + return instantiateArrayBuffer(receiveInstantiatedSource); + } + } + if (Module["instantiateWasm"]) { + try { + var exports2 = Module["instantiateWasm"](info2, receiveInstance); + return exports2; + } catch (e) { + err("Module.instantiateWasm callback failed with error: " + e); + return false; + } + } + instantiateAsync().catch(readyPromiseReject); + return {}; + } + var ASM_CONSTS = {8991: function($0, $1) { + setTimeout(function() { + __emscripten_do_dispatch_to_thread($0, $1); + }, 0); + }}; + function initPthreadsJS() { + PThread.initRuntime(); + } + function callRuntimeCallbacks(callbacks2) { + while (callbacks2.length > 0) { + var callback = callbacks2.shift(); + if (typeof callback == "function") { + callback(Module); + continue; + } + var func2 = callback.func; + if (typeof func2 === "number") { + if (callback.arg === void 0) { + wasmTable.get(func2)(); + } else { + wasmTable.get(func2)(callback.arg); + } + } else { + func2(callback.arg === void 0 ? null : callback.arg); + } + } + } + function _emscripten_futex_wake(addr, count2) { + if (addr <= 0 || addr > GROWABLE_HEAP_I8().length || addr & true || count2 < 0) + return -28; + if (count2 == 0) + return 0; + if (count2 >= 2147483647) + count2 = Infinity; + var mainThreadWaitAddress = Atomics.load(GROWABLE_HEAP_I32(), __emscripten_main_thread_futex >> 2); + var mainThreadWoken = 0; + if (mainThreadWaitAddress == addr) { + var loadedAddr = Atomics.compareExchange(GROWABLE_HEAP_I32(), __emscripten_main_thread_futex >> 2, mainThreadWaitAddress, 0); + if (loadedAddr == mainThreadWaitAddress) { + --count2; + mainThreadWoken = 1; + if (count2 <= 0) + return 1; + } + } + var ret = Atomics.notify(GROWABLE_HEAP_I32(), addr >> 2, count2); + if (ret >= 0) + return ret + mainThreadWoken; + throw "Atomics.notify returned an unexpected value " + ret; + } + Module["_emscripten_futex_wake"] = _emscripten_futex_wake; + function killThread(pthread_ptr) { + if (ENVIRONMENT_IS_PTHREAD) + throw "Internal Error! killThread() can only ever be called from main application thread!"; + if (!pthread_ptr) + throw "Internal Error! Null pthread_ptr in killThread!"; + GROWABLE_HEAP_I32()[pthread_ptr + 12 >> 2] = 0; + var pthread = PThread.pthreads[pthread_ptr]; + pthread.worker.terminate(); + PThread.freeThreadData(pthread); + PThread.runningWorkers.splice(PThread.runningWorkers.indexOf(pthread.worker), 1); + pthread.worker.pthread = void 0; + } + function cancelThread(pthread_ptr) { + if (ENVIRONMENT_IS_PTHREAD) + throw "Internal Error! cancelThread() can only ever be called from main application thread!"; + if (!pthread_ptr) + throw "Internal Error! Null pthread_ptr in cancelThread!"; + var pthread = PThread.pthreads[pthread_ptr]; + pthread.worker.postMessage({cmd: "cancel"}); + } + function cleanupThread(pthread_ptr) { + if (ENVIRONMENT_IS_PTHREAD) + throw "Internal Error! cleanupThread() can only ever be called from main application thread!"; + if (!pthread_ptr) + throw "Internal Error! Null pthread_ptr in cleanupThread!"; + GROWABLE_HEAP_I32()[pthread_ptr + 12 >> 2] = 0; + var pthread = PThread.pthreads[pthread_ptr]; + if (pthread) { + var worker2 = pthread.worker; + PThread.returnWorkerToPool(worker2); + } + } + var PThread = {unusedWorkers: [], runningWorkers: [], initMainThreadBlock: function() { + var pthreadPoolSize = 8; + for (var i = 0; i < pthreadPoolSize; ++i) { + PThread.allocateUnusedWorker(); + } + }, initRuntime: function() { + var tb = _malloc(228); + for (var i = 0; i < 228 / 4; ++i) + GROWABLE_HEAP_U32()[tb / 4 + i] = 0; + GROWABLE_HEAP_I32()[tb + 12 >> 2] = tb; + var headPtr = tb + 152; + GROWABLE_HEAP_I32()[headPtr >> 2] = headPtr; + var tlsMemory = _malloc(512); + for (var i = 0; i < 128; ++i) + GROWABLE_HEAP_U32()[tlsMemory / 4 + i] = 0; + Atomics.store(GROWABLE_HEAP_U32(), tb + 100 >> 2, tlsMemory); + Atomics.store(GROWABLE_HEAP_U32(), tb + 40 >> 2, tb); + __emscripten_thread_init(tb, !ENVIRONMENT_IS_WORKER, 1); + _emscripten_register_main_browser_thread_id(tb); + }, initWorker: function() { + }, pthreads: {}, threadExitHandlers: [], setThreadStatus: function() { + }, runExitHandlers: function() { + while (PThread.threadExitHandlers.length > 0) { + PThread.threadExitHandlers.pop()(); + } + if (ENVIRONMENT_IS_PTHREAD && _pthread_self()) + ___pthread_tsd_run_dtors(); + }, threadExit: function(exitCode) { + var tb = _pthread_self(); + if (tb) { + Atomics.store(GROWABLE_HEAP_U32(), tb + 4 >> 2, exitCode); + Atomics.store(GROWABLE_HEAP_U32(), tb + 0 >> 2, 1); + Atomics.store(GROWABLE_HEAP_U32(), tb + 56 >> 2, 1); + Atomics.store(GROWABLE_HEAP_U32(), tb + 60 >> 2, 0); + PThread.runExitHandlers(); + _emscripten_futex_wake(tb + 0, 2147483647); + __emscripten_thread_init(0, 0, 0); + if (ENVIRONMENT_IS_PTHREAD) { + postMessage({cmd: "exit"}); + } + } + }, threadCancel: function() { + PThread.runExitHandlers(); + var tb = _pthread_self(); + Atomics.store(GROWABLE_HEAP_U32(), tb + 4 >> 2, -1); + Atomics.store(GROWABLE_HEAP_U32(), tb + 0 >> 2, 1); + _emscripten_futex_wake(tb + 0, 2147483647); + __emscripten_thread_init(0, 0, 0); + postMessage({cmd: "cancelDone"}); + }, terminateAllThreads: function() { + for (var t in PThread.pthreads) { + var pthread = PThread.pthreads[t]; + if (pthread && pthread.worker) { + PThread.returnWorkerToPool(pthread.worker); + } + } + PThread.pthreads = {}; + for (var i = 0; i < PThread.unusedWorkers.length; ++i) { + var worker2 = PThread.unusedWorkers[i]; + worker2.terminate(); + } + PThread.unusedWorkers = []; + for (var i = 0; i < PThread.runningWorkers.length; ++i) { + var worker2 = PThread.runningWorkers[i]; + var pthread = worker2.pthread; + PThread.freeThreadData(pthread); + worker2.terminate(); + } + PThread.runningWorkers = []; + }, freeThreadData: function(pthread) { + if (!pthread) + return; + if (pthread.threadInfoStruct) { + var tlsMemory = GROWABLE_HEAP_I32()[pthread.threadInfoStruct + 100 >> 2]; + GROWABLE_HEAP_I32()[pthread.threadInfoStruct + 100 >> 2] = 0; + _free(tlsMemory); + _free(pthread.threadInfoStruct); + } + pthread.threadInfoStruct = 0; + if (pthread.allocatedOwnStack && pthread.stackBase) + _free(pthread.stackBase); + pthread.stackBase = 0; + if (pthread.worker) + pthread.worker.pthread = null; + }, returnWorkerToPool: function(worker2) { + PThread.runWithoutMainThreadQueuedCalls(function() { + delete PThread.pthreads[worker2.pthread.threadInfoStruct]; + PThread.unusedWorkers.push(worker2); + PThread.runningWorkers.splice(PThread.runningWorkers.indexOf(worker2), 1); + PThread.freeThreadData(worker2.pthread); + worker2.pthread = void 0; + }); + }, runWithoutMainThreadQueuedCalls: function(func2) { + GROWABLE_HEAP_I32()[__emscripten_allow_main_runtime_queued_calls >> 2] = 0; + try { + func2(); + } finally { + GROWABLE_HEAP_I32()[__emscripten_allow_main_runtime_queued_calls >> 2] = 1; + } + }, receiveObjectTransfer: function(data2) { + }, loadWasmModuleToWorker: function(worker2, onFinishedLoading) { + worker2.onmessage = function(e) { + var d = e["data"]; + var cmd = d["cmd"]; + if (worker2.pthread) + PThread.currentProxiedOperationCallerThread = worker2.pthread.threadInfoStruct; + if (d["targetThread"] && d["targetThread"] != _pthread_self()) { + var thread = PThread.pthreads[d.targetThread]; + if (thread) { + thread.worker.postMessage(e.data, d["transferList"]); + } else { + console.error('Internal error! Worker sent a message "' + cmd + '" to target pthread ' + d["targetThread"] + ", but that thread no longer exists!"); + } + PThread.currentProxiedOperationCallerThread = void 0; + return; + } + if (cmd === "processQueuedMainThreadWork") { + _emscripten_main_thread_process_queued_calls(); + } else if (cmd === "spawnThread") { + spawnThread(e.data); + } else if (cmd === "cleanupThread") { + cleanupThread(d["thread"]); + } else if (cmd === "killThread") { + killThread(d["thread"]); + } else if (cmd === "cancelThread") { + cancelThread(d["thread"]); + } else if (cmd === "loaded") { + worker2.loaded = true; + if (onFinishedLoading) + onFinishedLoading(worker2); + if (worker2.runPthread) { + worker2.runPthread(); + delete worker2.runPthread; + } + } else if (cmd === "print") { + out("Thread " + d["threadId"] + ": " + d["text"]); + } else if (cmd === "printErr") { + err("Thread " + d["threadId"] + ": " + d["text"]); + } else if (cmd === "alert") { + alert("Thread " + d["threadId"] + ": " + d["text"]); + } else if (cmd === "exit") { + var detached = worker2.pthread && Atomics.load(GROWABLE_HEAP_U32(), worker2.pthread.threadInfoStruct + 64 >> 2); + if (detached) { + PThread.returnWorkerToPool(worker2); + } + } else if (cmd === "exitProcess") { + try { + exit(d["returnCode"]); + } catch (e2) { + if (e2 instanceof ExitStatus) + return; + throw e2; + } + } else if (cmd === "cancelDone") { + PThread.returnWorkerToPool(worker2); + } else if (cmd === "objectTransfer") { + PThread.receiveObjectTransfer(e.data); + } else if (e.data.target === "setimmediate") { + worker2.postMessage(e.data); + } else { + err("worker sent an unknown command " + cmd); + } + PThread.currentProxiedOperationCallerThread = void 0; + }; + worker2.onerror = function(e) { + err("pthread sent an error! " + e.filename + ":" + e.lineno + ": " + e.message); + }; + if (ENVIRONMENT_IS_NODE) { + worker2.on("message", function(data2) { + worker2.onmessage({data: data2}); + }); + worker2.on("error", function(data2) { + worker2.onerror(data2); + }); + worker2.on("exit", function(data2) { + }); + } + worker2.postMessage({cmd: "load", urlOrBlob: Module["mainScriptUrlOrBlob"] || _scriptDir, wasmMemory, wasmModule}); + }, allocateUnusedWorker: function() { + var pthreadMainJs = locateFile("tfjs-backend-wasm-threaded-simd.worker.js"); + PThread.unusedWorkers.push(new Worker(pthreadMainJs)); + }, getNewWorker: function() { + if (PThread.unusedWorkers.length == 0) { + PThread.allocateUnusedWorker(); + PThread.loadWasmModuleToWorker(PThread.unusedWorkers[0]); + } + if (PThread.unusedWorkers.length > 0) + return PThread.unusedWorkers.pop(); + else + return null; + }, busySpinWait: function(msecs) { + var t = performance.now() + msecs; + while (performance.now() < t) { + } + }}; + function establishStackSpace(stackTop, stackMax) { + _emscripten_stack_set_limits(stackTop, stackMax); + stackRestore(stackTop); + } + Module["establishStackSpace"] = establishStackSpace; + function getNoExitRuntime() { + return noExitRuntime; + } + Module["getNoExitRuntime"] = getNoExitRuntime; + function invokeEntryPoint(ptr, arg) { + return wasmTable.get(ptr)(arg); + } + Module["invokeEntryPoint"] = invokeEntryPoint; + function ___assert_fail(condition, filename, line, func2) { + abort("Assertion failed: " + UTF8ToString(condition) + ", at: " + [filename ? UTF8ToString(filename) : "unknown filename", line, func2 ? UTF8ToString(func2) : "unknown function"]); + } + function ___call_main(argc, argv) { + var returnCode = _main(argc, argv); + } + var _emscripten_get_now; + if (ENVIRONMENT_IS_NODE) { + _emscripten_get_now = function() { + var t = process["hrtime"](); + return t[0] * 1e3 + t[1] / 1e6; + }; + } else if (ENVIRONMENT_IS_PTHREAD) { + _emscripten_get_now = function() { + return performance.now() - Module["__performance_now_clock_drift"]; + }; + } else if (typeof dateNow !== "undefined") { + _emscripten_get_now = dateNow; + } else + _emscripten_get_now = function() { + return performance.now(); + }; + function setErrNo(value) { + GROWABLE_HEAP_I32()[___errno_location() >> 2] = value; + return value; + } + function _atexit(func2, arg) { + if (ENVIRONMENT_IS_PTHREAD) + return _emscripten_proxy_to_main_thread_js(1, 1, func2, arg); + } + function __emscripten_notify_thread_queue(targetThreadId, mainThreadId) { + if (targetThreadId == mainThreadId) { + postMessage({cmd: "processQueuedMainThreadWork"}); + } else if (ENVIRONMENT_IS_PTHREAD) { + postMessage({targetThread: targetThreadId, cmd: "processThreadQueue"}); + } else { + var pthread = PThread.pthreads[targetThreadId]; + var worker2 = pthread && pthread.worker; + if (!worker2) { + return; + } + worker2.postMessage({cmd: "processThreadQueue"}); + } + return 1; + } + function _abort() { + abort(); + } + function _emscripten_asm_const_int(code, sigPtr, argbuf) { + var args = readAsmConstArgs(sigPtr, argbuf); + return ASM_CONSTS[code].apply(null, args); + } + function _emscripten_conditional_set_current_thread_status(expectedStatus, newStatus) { + } + function _emscripten_futex_wait(addr, val, timeout) { + if (addr <= 0 || addr > GROWABLE_HEAP_I8().length || addr & true) + return -28; + if (!ENVIRONMENT_IS_WEB) { + var ret = Atomics.wait(GROWABLE_HEAP_I32(), addr >> 2, val, timeout); + if (ret === "timed-out") + return -73; + if (ret === "not-equal") + return -6; + if (ret === "ok") + return 0; + throw "Atomics.wait returned an unexpected value " + ret; + } else { + if (Atomics.load(GROWABLE_HEAP_I32(), addr >> 2) != val) { + return -6; + } + var tNow = performance.now(); + var tEnd = tNow + timeout; + var lastAddr = Atomics.exchange(GROWABLE_HEAP_I32(), __emscripten_main_thread_futex >> 2, addr); + while (1) { + tNow = performance.now(); + if (tNow > tEnd) { + lastAddr = Atomics.exchange(GROWABLE_HEAP_I32(), __emscripten_main_thread_futex >> 2, 0); + return -73; + } + lastAddr = Atomics.exchange(GROWABLE_HEAP_I32(), __emscripten_main_thread_futex >> 2, 0); + if (lastAddr == 0) { + break; + } + _emscripten_main_thread_process_queued_calls(); + if (Atomics.load(GROWABLE_HEAP_I32(), addr >> 2) != val) { + return -6; + } + lastAddr = Atomics.exchange(GROWABLE_HEAP_I32(), __emscripten_main_thread_futex >> 2, addr); + } + return 0; + } + } + function _emscripten_memcpy_big(dest, src, num) { + GROWABLE_HEAP_U8().copyWithin(dest, src, src + num); + } + function _emscripten_num_logical_cores() { + if (ENVIRONMENT_IS_NODE) + return require("os").cpus().length; + return navigator["hardwareConcurrency"]; + } + function _emscripten_proxy_to_main_thread_js(index, sync) { + var numCallArgs = arguments.length - 2; + var stack2 = stackSave(); + var serializedNumCallArgs = numCallArgs; + var args = stackAlloc(serializedNumCallArgs * 8); + var b = args >> 3; + for (var i = 0; i < numCallArgs; i++) { + var arg = arguments[2 + i]; + GROWABLE_HEAP_F64()[b + i] = arg; + } + var ret = _emscripten_run_in_main_runtime_thread_js(index, serializedNumCallArgs, args, sync); + stackRestore(stack2); + return ret; + } + var _emscripten_receive_on_main_thread_js_callArgs = []; + var readAsmConstArgsArray = []; + function readAsmConstArgs(sigPtr, buf) { + readAsmConstArgsArray.length = 0; + var ch; + buf >>= 2; + while (ch = GROWABLE_HEAP_U8()[sigPtr++]) { + var double = ch < 105; + if (double && buf & 1) + buf++; + readAsmConstArgsArray.push(double ? GROWABLE_HEAP_F64()[buf++ >> 1] : GROWABLE_HEAP_I32()[buf]); + ++buf; + } + return readAsmConstArgsArray; + } + function _emscripten_receive_on_main_thread_js(index, numCallArgs, args) { + _emscripten_receive_on_main_thread_js_callArgs.length = numCallArgs; + var b = args >> 3; + for (var i = 0; i < numCallArgs; i++) { + _emscripten_receive_on_main_thread_js_callArgs[i] = GROWABLE_HEAP_F64()[b + i]; + } + var isEmAsmConst = index < 0; + var func2 = !isEmAsmConst ? proxiedFunctionTable[index] : ASM_CONSTS[-index - 1]; + return func2.apply(null, _emscripten_receive_on_main_thread_js_callArgs); + } + function _emscripten_get_heap_size() { + return GROWABLE_HEAP_U8().length; + } + function emscripten_realloc_buffer(size) { + try { + wasmMemory.grow(size - buffer2.byteLength + 65535 >>> 16); + updateGlobalBufferAndViews(wasmMemory.buffer); + return 1; + } catch (e) { + } + } + function _emscripten_resize_heap(requestedSize) { + var oldSize = _emscripten_get_heap_size(); + if (requestedSize <= oldSize) { + return false; + } + var maxHeapSize = 2147483648; + if (requestedSize > maxHeapSize) { + return false; + } + for (var cutDown = 1; cutDown <= 4; cutDown *= 2) { + var overGrownHeapSize = oldSize * (1 + 0.2 / cutDown); + overGrownHeapSize = Math.min(overGrownHeapSize, requestedSize + 100663296); + var newSize = Math.min(maxHeapSize, alignUp(Math.max(requestedSize, overGrownHeapSize), 65536)); + var replacement = emscripten_realloc_buffer(newSize); + if (replacement) { + return true; + } + } + return false; + } + var JSEvents = {inEventHandler: 0, removeAllEventListeners: function() { + for (var i = JSEvents.eventHandlers.length - 1; i >= 0; --i) { + JSEvents._removeHandler(i); + } + JSEvents.eventHandlers = []; + JSEvents.deferredCalls = []; + }, registerRemoveEventListeners: function() { + if (!JSEvents.removeEventListenersRegistered) { + __ATEXIT__.push(JSEvents.removeAllEventListeners); + JSEvents.removeEventListenersRegistered = true; + } + }, deferredCalls: [], deferCall: function(targetFunction, precedence, argsList) { + function arraysHaveEqualContent(arrA, arrB) { + if (arrA.length != arrB.length) + return false; + for (var i2 in arrA) { + if (arrA[i2] != arrB[i2]) + return false; + } + return true; + } + for (var i in JSEvents.deferredCalls) { + var call = JSEvents.deferredCalls[i]; + if (call.targetFunction == targetFunction && arraysHaveEqualContent(call.argsList, argsList)) { + return; + } + } + JSEvents.deferredCalls.push({targetFunction, precedence, argsList}); + JSEvents.deferredCalls.sort(function(x, y) { + return x.precedence < y.precedence; + }); + }, removeDeferredCalls: function(targetFunction) { + for (var i = 0; i < JSEvents.deferredCalls.length; ++i) { + if (JSEvents.deferredCalls[i].targetFunction == targetFunction) { + JSEvents.deferredCalls.splice(i, 1); + --i; + } + } + }, canPerformEventHandlerRequests: function() { + return JSEvents.inEventHandler && JSEvents.currentEventHandler.allowsDeferredCalls; + }, runDeferredCalls: function() { + if (!JSEvents.canPerformEventHandlerRequests()) { + return; + } + for (var i = 0; i < JSEvents.deferredCalls.length; ++i) { + var call = JSEvents.deferredCalls[i]; + JSEvents.deferredCalls.splice(i, 1); + --i; + call.targetFunction.apply(null, call.argsList); + } + }, eventHandlers: [], removeAllHandlersOnTarget: function(target, eventTypeString) { + for (var i = 0; i < JSEvents.eventHandlers.length; ++i) { + if (JSEvents.eventHandlers[i].target == target && (!eventTypeString || eventTypeString == JSEvents.eventHandlers[i].eventTypeString)) { + JSEvents._removeHandler(i--); + } + } + }, _removeHandler: function(i) { + var h = JSEvents.eventHandlers[i]; + h.target.removeEventListener(h.eventTypeString, h.eventListenerFunc, h.useCapture); + JSEvents.eventHandlers.splice(i, 1); + }, registerOrRemoveHandler: function(eventHandler) { + var jsEventHandler = function jsEventHandler2(event) { + ++JSEvents.inEventHandler; + JSEvents.currentEventHandler = eventHandler; + JSEvents.runDeferredCalls(); + eventHandler.handlerFunc(event); + JSEvents.runDeferredCalls(); + --JSEvents.inEventHandler; + }; + if (eventHandler.callbackfunc) { + eventHandler.eventListenerFunc = jsEventHandler; + eventHandler.target.addEventListener(eventHandler.eventTypeString, jsEventHandler, eventHandler.useCapture); + JSEvents.eventHandlers.push(eventHandler); + JSEvents.registerRemoveEventListeners(); + } else { + for (var i = 0; i < JSEvents.eventHandlers.length; ++i) { + if (JSEvents.eventHandlers[i].target == eventHandler.target && JSEvents.eventHandlers[i].eventTypeString == eventHandler.eventTypeString) { + JSEvents._removeHandler(i--); + } + } + } + }, queueEventHandlerOnThread_iiii: function(targetThread, eventHandlerFunc, eventTypeId, eventData, userData) { + var stackTop = stackSave(); + var varargs = stackAlloc(12); + GROWABLE_HEAP_I32()[varargs >> 2] = eventTypeId; + GROWABLE_HEAP_I32()[varargs + 4 >> 2] = eventData; + GROWABLE_HEAP_I32()[varargs + 8 >> 2] = userData; + __emscripten_call_on_thread(0, targetThread, 637534208, eventHandlerFunc, eventData, varargs); + stackRestore(stackTop); + }, getTargetThreadForEventCallback: function(targetThread) { + switch (targetThread) { + case 1: + return 0; + case 2: + return PThread.currentProxiedOperationCallerThread; + default: + return targetThread; + } + }, getNodeNameForTarget: function(target) { + if (!target) + return ""; + if (target == window) + return "#window"; + if (target == screen) + return "#screen"; + return target && target.nodeName ? target.nodeName : ""; + }, fullscreenEnabled: function() { + return document.fullscreenEnabled || document.webkitFullscreenEnabled; + }}; + function stringToNewUTF8(jsString) { + var length = lengthBytesUTF8(jsString) + 1; + var cString = _malloc(length); + stringToUTF8(jsString, cString, length); + return cString; + } + function _emscripten_set_offscreencanvas_size_on_target_thread_js(targetThread, targetCanvas, width, height) { + var stackTop = stackSave(); + var varargs = stackAlloc(12); + var targetCanvasPtr = 0; + if (targetCanvas) { + targetCanvasPtr = stringToNewUTF8(targetCanvas); + } + GROWABLE_HEAP_I32()[varargs >> 2] = targetCanvasPtr; + GROWABLE_HEAP_I32()[varargs + 4 >> 2] = width; + GROWABLE_HEAP_I32()[varargs + 8 >> 2] = height; + __emscripten_call_on_thread(0, targetThread, 657457152, 0, targetCanvasPtr, varargs); + stackRestore(stackTop); + } + function _emscripten_set_offscreencanvas_size_on_target_thread(targetThread, targetCanvas, width, height) { + targetCanvas = targetCanvas ? UTF8ToString(targetCanvas) : ""; + _emscripten_set_offscreencanvas_size_on_target_thread_js(targetThread, targetCanvas, width, height); + } + function maybeCStringToJsString(cString) { + return cString > 2 ? UTF8ToString(cString) : cString; + } + var specialHTMLTargets = [0, typeof document !== "undefined" ? document : 0, typeof window !== "undefined" ? window : 0]; + function findEventTarget(target) { + target = maybeCStringToJsString(target); + var domElement = specialHTMLTargets[target] || (typeof document !== "undefined" ? document.querySelector(target) : void 0); + return domElement; + } + function findCanvasEventTarget(target) { + return findEventTarget(target); + } + function _emscripten_set_canvas_element_size_calling_thread(target, width, height) { + var canvas2 = findCanvasEventTarget(target); + if (!canvas2) + return -4; + if (canvas2.canvasSharedPtr) { + GROWABLE_HEAP_I32()[canvas2.canvasSharedPtr >> 2] = width; + GROWABLE_HEAP_I32()[canvas2.canvasSharedPtr + 4 >> 2] = height; + } + if (canvas2.offscreenCanvas || !canvas2.controlTransferredOffscreen) { + if (canvas2.offscreenCanvas) + canvas2 = canvas2.offscreenCanvas; + var autoResizeViewport = false; + if (canvas2.GLctxObject && canvas2.GLctxObject.GLctx) { + var prevViewport = canvas2.GLctxObject.GLctx.getParameter(2978); + autoResizeViewport = prevViewport[0] === 0 && prevViewport[1] === 0 && prevViewport[2] === canvas2.width && prevViewport[3] === canvas2.height; + } + canvas2.width = width; + canvas2.height = height; + if (autoResizeViewport) { + canvas2.GLctxObject.GLctx.viewport(0, 0, width, height); + } + } else if (canvas2.canvasSharedPtr) { + var targetThread = GROWABLE_HEAP_I32()[canvas2.canvasSharedPtr + 8 >> 2]; + _emscripten_set_offscreencanvas_size_on_target_thread(targetThread, target, width, height); + return 1; + } else { + return -4; + } + return 0; + } + function _emscripten_set_canvas_element_size_main_thread(target, width, height) { + if (ENVIRONMENT_IS_PTHREAD) + return _emscripten_proxy_to_main_thread_js(2, 1, target, width, height); + return _emscripten_set_canvas_element_size_calling_thread(target, width, height); + } + function _emscripten_set_canvas_element_size(target, width, height) { + var canvas2 = findCanvasEventTarget(target); + if (canvas2) { + return _emscripten_set_canvas_element_size_calling_thread(target, width, height); + } else { + return _emscripten_set_canvas_element_size_main_thread(target, width, height); + } + } + function _emscripten_set_current_thread_status(newStatus) { + } + function _emscripten_set_thread_name(threadId, name) { + } + function __webgl_enable_ANGLE_instanced_arrays(ctx) { + var ext = ctx.getExtension("ANGLE_instanced_arrays"); + if (ext) { + ctx["vertexAttribDivisor"] = function(index, divisor) { + ext["vertexAttribDivisorANGLE"](index, divisor); + }; + ctx["drawArraysInstanced"] = function(mode, first, count2, primcount) { + ext["drawArraysInstancedANGLE"](mode, first, count2, primcount); + }; + ctx["drawElementsInstanced"] = function(mode, count2, type, indices, primcount) { + ext["drawElementsInstancedANGLE"](mode, count2, type, indices, primcount); + }; + return 1; + } + } + function __webgl_enable_OES_vertex_array_object(ctx) { + var ext = ctx.getExtension("OES_vertex_array_object"); + if (ext) { + ctx["createVertexArray"] = function() { + return ext["createVertexArrayOES"](); + }; + ctx["deleteVertexArray"] = function(vao) { + ext["deleteVertexArrayOES"](vao); + }; + ctx["bindVertexArray"] = function(vao) { + ext["bindVertexArrayOES"](vao); + }; + ctx["isVertexArray"] = function(vao) { + return ext["isVertexArrayOES"](vao); + }; + return 1; + } + } + function __webgl_enable_WEBGL_draw_buffers(ctx) { + var ext = ctx.getExtension("WEBGL_draw_buffers"); + if (ext) { + ctx["drawBuffers"] = function(n, bufs) { + ext["drawBuffersWEBGL"](n, bufs); + }; + return 1; + } + } + function __webgl_enable_WEBGL_multi_draw(ctx) { + return !!(ctx.multiDrawWebgl = ctx.getExtension("WEBGL_multi_draw")); + } + var GL = {counter: 1, buffers: [], programs: [], framebuffers: [], renderbuffers: [], textures: [], uniforms: [], shaders: [], vaos: [], contexts: {}, offscreenCanvases: {}, timerQueriesEXT: [], programInfos: {}, stringCache: {}, unpackAlignment: 4, recordError: function recordError(errorCode) { + if (!GL.lastError) { + GL.lastError = errorCode; + } + }, getNewId: function(table) { + var ret = GL.counter++; + for (var i = table.length; i < ret; i++) { + table[i] = null; + } + return ret; + }, getSource: function(shader, count2, string, length) { + var source = ""; + for (var i = 0; i < count2; ++i) { + var len = length ? GROWABLE_HEAP_I32()[length + i * 4 >> 2] : -1; + source += UTF8ToString(GROWABLE_HEAP_I32()[string + i * 4 >> 2], len < 0 ? void 0 : len); + } + return source; + }, createContext: function(canvas2, webGLContextAttributes) { + var ctx = canvas2.getContext("webgl", webGLContextAttributes); + if (!ctx) + return 0; + var handle = GL.registerContext(ctx, webGLContextAttributes); + return handle; + }, registerContext: function(ctx, webGLContextAttributes) { + var handle = _malloc(8); + GROWABLE_HEAP_I32()[handle + 4 >> 2] = _pthread_self(); + var context = {handle, attributes: webGLContextAttributes, version: webGLContextAttributes.majorVersion, GLctx: ctx}; + if (ctx.canvas) + ctx.canvas.GLctxObject = context; + GL.contexts[handle] = context; + if (typeof webGLContextAttributes.enableExtensionsByDefault === "undefined" || webGLContextAttributes.enableExtensionsByDefault) { + GL.initExtensions(context); + } + return handle; + }, makeContextCurrent: function(contextHandle) { + GL.currentContext = GL.contexts[contextHandle]; + Module.ctx = GLctx = GL.currentContext && GL.currentContext.GLctx; + return !(contextHandle && !GLctx); + }, getContext: function(contextHandle) { + return GL.contexts[contextHandle]; + }, deleteContext: function(contextHandle) { + if (GL.currentContext === GL.contexts[contextHandle]) + GL.currentContext = null; + if (typeof JSEvents === "object") + JSEvents.removeAllHandlersOnTarget(GL.contexts[contextHandle].GLctx.canvas); + if (GL.contexts[contextHandle] && GL.contexts[contextHandle].GLctx.canvas) + GL.contexts[contextHandle].GLctx.canvas.GLctxObject = void 0; + _free(GL.contexts[contextHandle].handle); + GL.contexts[contextHandle] = null; + }, initExtensions: function(context) { + if (!context) + context = GL.currentContext; + if (context.initExtensionsDone) + return; + context.initExtensionsDone = true; + var GLctx2 = context.GLctx; + __webgl_enable_ANGLE_instanced_arrays(GLctx2); + __webgl_enable_OES_vertex_array_object(GLctx2); + __webgl_enable_WEBGL_draw_buffers(GLctx2); + GLctx2.disjointTimerQueryExt = GLctx2.getExtension("EXT_disjoint_timer_query"); + __webgl_enable_WEBGL_multi_draw(GLctx2); + var exts = GLctx2.getSupportedExtensions() || []; + exts.forEach(function(ext) { + if (ext.indexOf("lose_context") < 0 && ext.indexOf("debug") < 0) { + GLctx2.getExtension(ext); + } + }); + }, populateUniformTable: function(program) { + var p2 = GL.programs[program]; + var ptable = GL.programInfos[program] = {uniforms: {}, maxUniformLength: 0, maxAttributeLength: -1, maxUniformBlockNameLength: -1}; + var utable = ptable.uniforms; + var numUniforms = GLctx.getProgramParameter(p2, 35718); + for (var i = 0; i < numUniforms; ++i) { + var u = GLctx.getActiveUniform(p2, i); + var name = u.name; + ptable.maxUniformLength = Math.max(ptable.maxUniformLength, name.length + 1); + if (name.slice(-1) == "]") { + name = name.slice(0, name.lastIndexOf("[")); + } + var loc = GLctx.getUniformLocation(p2, name); + if (loc) { + var id = GL.getNewId(GL.uniforms); + utable[name] = [u.size, id]; + GL.uniforms[id] = loc; + for (var j = 1; j < u.size; ++j) { + var n = name + "[" + j + "]"; + loc = GLctx.getUniformLocation(p2, n); + id = GL.getNewId(GL.uniforms); + GL.uniforms[id] = loc; + } + } + } + }}; + var __emscripten_webgl_power_preferences = ["default", "low-power", "high-performance"]; + function _emscripten_webgl_do_create_context(target, attributes) { + var a = attributes >> 2; + var powerPreference = GROWABLE_HEAP_I32()[a + (24 >> 2)]; + var contextAttributes = {alpha: !!GROWABLE_HEAP_I32()[a + (0 >> 2)], depth: !!GROWABLE_HEAP_I32()[a + (4 >> 2)], stencil: !!GROWABLE_HEAP_I32()[a + (8 >> 2)], antialias: !!GROWABLE_HEAP_I32()[a + (12 >> 2)], premultipliedAlpha: !!GROWABLE_HEAP_I32()[a + (16 >> 2)], preserveDrawingBuffer: !!GROWABLE_HEAP_I32()[a + (20 >> 2)], powerPreference: __emscripten_webgl_power_preferences[powerPreference], failIfMajorPerformanceCaveat: !!GROWABLE_HEAP_I32()[a + (28 >> 2)], majorVersion: GROWABLE_HEAP_I32()[a + (32 >> 2)], minorVersion: GROWABLE_HEAP_I32()[a + (36 >> 2)], enableExtensionsByDefault: GROWABLE_HEAP_I32()[a + (40 >> 2)], explicitSwapControl: GROWABLE_HEAP_I32()[a + (44 >> 2)], proxyContextToMainThread: GROWABLE_HEAP_I32()[a + (48 >> 2)], renderViaOffscreenBackBuffer: GROWABLE_HEAP_I32()[a + (52 >> 2)]}; + var canvas2 = findCanvasEventTarget(target); + if (!canvas2) { + return 0; + } + if (contextAttributes.explicitSwapControl) { + return 0; + } + var contextHandle = GL.createContext(canvas2, contextAttributes); + return contextHandle; + } + function _emscripten_webgl_create_context(a0, a12) { + return _emscripten_webgl_do_create_context(a0, a12); + } + var SYSCALLS = {mappings: {}, buffers: [null, [], []], printChar: function(stream, curr) { + var buffer3 = SYSCALLS.buffers[stream]; + if (curr === 0 || curr === 10) { + (stream === 1 ? out : err)(UTF8ArrayToString(buffer3, 0)); + buffer3.length = 0; + } else { + buffer3.push(curr); + } + }, varargs: void 0, get: function() { + SYSCALLS.varargs += 4; + var ret = GROWABLE_HEAP_I32()[SYSCALLS.varargs - 4 >> 2]; + return ret; + }, getStr: function(ptr) { + var ret = UTF8ToString(ptr); + return ret; + }, get64: function(low, high) { + return low; + }}; + function _fd_close(fd) { + if (ENVIRONMENT_IS_PTHREAD) + return _emscripten_proxy_to_main_thread_js(3, 1, fd); + return 0; + } + function _fd_seek(fd, offset_low, offset_high, whence, newOffset) { + if (ENVIRONMENT_IS_PTHREAD) + return _emscripten_proxy_to_main_thread_js(4, 1, fd, offset_low, offset_high, whence, newOffset); + } + function _fd_write(fd, iov, iovcnt, pnum) { + if (ENVIRONMENT_IS_PTHREAD) + return _emscripten_proxy_to_main_thread_js(5, 1, fd, iov, iovcnt, pnum); + var num = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = GROWABLE_HEAP_I32()[iov + i * 8 >> 2]; + var len = GROWABLE_HEAP_I32()[iov + (i * 8 + 4) >> 2]; + for (var j = 0; j < len; j++) { + SYSCALLS.printChar(fd, GROWABLE_HEAP_U8()[ptr + j]); + } + num += len; + } + GROWABLE_HEAP_I32()[pnum >> 2] = num; + return 0; + } + function _pthread_cleanup_pop(execute2) { + var routine = PThread.threadExitHandlers.pop(); + if (execute2) + routine(); + } + function _pthread_cleanup_push(routine, arg) { + PThread.threadExitHandlers.push(function() { + wasmTable.get(routine)(arg); + }); + } + function spawnThread(threadParams) { + if (ENVIRONMENT_IS_PTHREAD) + throw "Internal Error! spawnThread() can only ever be called from main application thread!"; + var worker2 = PThread.getNewWorker(); + if (worker2.pthread !== void 0) + throw "Internal error!"; + if (!threadParams.pthread_ptr) + throw "Internal error, no pthread ptr!"; + PThread.runningWorkers.push(worker2); + var tlsMemory = _malloc(128 * 4); + for (var i = 0; i < 128; ++i) { + GROWABLE_HEAP_I32()[tlsMemory + i * 4 >> 2] = 0; + } + var stackHigh = threadParams.stackBase + threadParams.stackSize; + var pthread = PThread.pthreads[threadParams.pthread_ptr] = {worker: worker2, stackBase: threadParams.stackBase, stackSize: threadParams.stackSize, allocatedOwnStack: threadParams.allocatedOwnStack, threadInfoStruct: threadParams.pthread_ptr}; + var tis = pthread.threadInfoStruct >> 2; + Atomics.store(GROWABLE_HEAP_U32(), tis + (64 >> 2), threadParams.detached); + Atomics.store(GROWABLE_HEAP_U32(), tis + (100 >> 2), tlsMemory); + Atomics.store(GROWABLE_HEAP_U32(), tis + (40 >> 2), pthread.threadInfoStruct); + Atomics.store(GROWABLE_HEAP_U32(), tis + (80 >> 2), threadParams.stackSize); + Atomics.store(GROWABLE_HEAP_U32(), tis + (76 >> 2), stackHigh); + Atomics.store(GROWABLE_HEAP_U32(), tis + (104 >> 2), threadParams.stackSize); + Atomics.store(GROWABLE_HEAP_U32(), tis + (104 + 8 >> 2), stackHigh); + Atomics.store(GROWABLE_HEAP_U32(), tis + (104 + 12 >> 2), threadParams.detached); + var global_libc = _emscripten_get_global_libc(); + var global_locale = global_libc + 40; + Atomics.store(GROWABLE_HEAP_U32(), tis + (172 >> 2), global_locale); + worker2.pthread = pthread; + var msg = {cmd: "run", start_routine: threadParams.startRoutine, arg: threadParams.arg, threadInfoStruct: threadParams.pthread_ptr, stackBase: threadParams.stackBase, stackSize: threadParams.stackSize}; + worker2.runPthread = function() { + msg.time = performance.now(); + worker2.postMessage(msg, threadParams.transferList); + }; + if (worker2.loaded) { + worker2.runPthread(); + delete worker2.runPthread; + } + } + function _pthread_create(pthread_ptr, attr, start_routine, arg) { + if (typeof SharedArrayBuffer === "undefined") { + err("Current environment does not support SharedArrayBuffer, pthreads are not available!"); + return 6; + } + if (!pthread_ptr) { + err("pthread_create called with a null thread pointer!"); + return 28; + } + var transferList = []; + var error = 0; + if (ENVIRONMENT_IS_PTHREAD && (transferList.length === 0 || error)) { + return _emscripten_sync_run_in_main_thread_4(687865856, pthread_ptr, attr, start_routine, arg); + } + if (error) + return error; + var stackSize = 0; + var stackBase = 0; + var detached = 0; + if (attr && attr != -1) { + stackSize = GROWABLE_HEAP_I32()[attr >> 2]; + stackSize += 81920; + stackBase = GROWABLE_HEAP_I32()[attr + 8 >> 2]; + detached = GROWABLE_HEAP_I32()[attr + 12 >> 2] !== 0; + } else { + stackSize = 2097152; + } + var allocatedOwnStack = stackBase == 0; + if (allocatedOwnStack) { + stackBase = _memalign(16, stackSize); + } else { + stackBase -= stackSize; + assert3(stackBase > 0); + } + var threadInfoStruct = _malloc(228); + for (var i = 0; i < 228 >> 2; ++i) + GROWABLE_HEAP_U32()[(threadInfoStruct >> 2) + i] = 0; + GROWABLE_HEAP_I32()[pthread_ptr >> 2] = threadInfoStruct; + GROWABLE_HEAP_I32()[threadInfoStruct + 12 >> 2] = threadInfoStruct; + var headPtr = threadInfoStruct + 152; + GROWABLE_HEAP_I32()[headPtr >> 2] = headPtr; + var threadParams = {stackBase, stackSize, allocatedOwnStack, detached, startRoutine: start_routine, pthread_ptr: threadInfoStruct, arg, transferList}; + if (ENVIRONMENT_IS_PTHREAD) { + threadParams.cmd = "spawnThread"; + postMessage(threadParams, transferList); + } else { + spawnThread(threadParams); + } + return 0; + } + function _sysconf(name) { + if (ENVIRONMENT_IS_PTHREAD) + return _emscripten_proxy_to_main_thread_js(6, 1, name); + switch (name) { + case 30: + return 16384; + case 85: + var maxHeapSize = 2147483648; + return maxHeapSize / 16384; + case 132: + case 133: + case 12: + case 137: + case 138: + case 15: + case 235: + case 16: + case 17: + case 18: + case 19: + case 20: + case 149: + case 13: + case 10: + case 236: + case 153: + case 9: + case 21: + case 22: + case 159: + case 154: + case 14: + case 77: + case 78: + case 139: + case 82: + case 68: + case 67: + case 164: + case 11: + case 29: + case 47: + case 48: + case 95: + case 52: + case 51: + case 46: + return 200809; + case 27: + case 246: + case 127: + case 128: + case 23: + case 24: + case 160: + case 161: + case 181: + case 182: + case 242: + case 183: + case 184: + case 243: + case 244: + case 245: + case 165: + case 178: + case 179: + case 49: + case 50: + case 168: + case 169: + case 175: + case 170: + case 171: + case 172: + case 97: + case 76: + case 32: + case 173: + case 35: + case 80: + case 81: + case 79: + return -1; + case 176: + case 177: + case 7: + case 155: + case 8: + case 157: + case 125: + case 126: + case 92: + case 93: + case 129: + case 130: + case 131: + case 94: + case 91: + return 1; + case 74: + case 60: + case 69: + case 70: + case 4: + return 1024; + case 31: + case 42: + case 72: + return 32; + case 87: + case 26: + case 33: + return 2147483647; + case 34: + case 1: + return 47839; + case 38: + case 36: + return 99; + case 43: + case 37: + return 2048; + case 0: + return 2097152; + case 3: + return 65536; + case 28: + return 32768; + case 44: + return 32767; + case 75: + return 16384; + case 39: + return 1e3; + case 89: + return 700; + case 71: + return 256; + case 40: + return 255; + case 2: + return 100; + case 180: + return 64; + case 25: + return 20; + case 5: + return 16; + case 6: + return 6; + case 73: + return 4; + case 84: { + if (typeof navigator === "object") + return navigator["hardwareConcurrency"] || 1; + return 1; + } + } + setErrNo(28); + return -1; + } + if (!ENVIRONMENT_IS_PTHREAD) + PThread.initMainThreadBlock(); + var GLctx; + var proxiedFunctionTable = [null, _atexit, _emscripten_set_canvas_element_size_main_thread, _fd_close, _fd_seek, _fd_write, _sysconf]; + var asmLibraryArg = {e: ___assert_fail, r: ___call_main, x: __emscripten_notify_thread_queue, b: _abort, y: _emscripten_asm_const_int, j: _emscripten_conditional_set_current_thread_status, c: _emscripten_futex_wait, d: _emscripten_futex_wake, f: _emscripten_get_now, p: _emscripten_memcpy_big, z: _emscripten_num_logical_cores, u: _emscripten_receive_on_main_thread_js, q: _emscripten_resize_heap, v: _emscripten_set_canvas_element_size, i: _emscripten_set_current_thread_status, t: _emscripten_set_thread_name, w: _emscripten_webgl_create_context, m: _fd_close, n: _fd_seek, g: _fd_write, o: initPthreadsJS, a: wasmMemory || Module["wasmMemory"], k: _pthread_cleanup_pop, l: _pthread_cleanup_push, h: _pthread_create, s: _sysconf}; + var asm = createWasm(); + var ___wasm_call_ctors = Module["___wasm_call_ctors"] = function() { + return (___wasm_call_ctors = Module["___wasm_call_ctors"] = Module["asm"]["A"]).apply(null, arguments); + }; + var _init = Module["_init"] = function() { + return (_init = Module["_init"] = Module["asm"]["B"]).apply(null, arguments); + }; + var _register_tensor = Module["_register_tensor"] = function() { + return (_register_tensor = Module["_register_tensor"] = Module["asm"]["C"]).apply(null, arguments); + }; + var _dispose_data = Module["_dispose_data"] = function() { + return (_dispose_data = Module["_dispose_data"] = Module["asm"]["D"]).apply(null, arguments); + }; + var _dispose = Module["_dispose"] = function() { + return (_dispose = Module["_dispose"] = Module["asm"]["E"]).apply(null, arguments); + }; + var _Abs = Module["_Abs"] = function() { + return (_Abs = Module["_Abs"] = Module["asm"]["G"]).apply(null, arguments); + }; + var _Add = Module["_Add"] = function() { + return (_Add = Module["_Add"] = Module["asm"]["H"]).apply(null, arguments); + }; + var _AddN = Module["_AddN"] = function() { + return (_AddN = Module["_AddN"] = Module["asm"]["I"]).apply(null, arguments); + }; + var _ArgMax = Module["_ArgMax"] = function() { + return (_ArgMax = Module["_ArgMax"] = Module["asm"]["J"]).apply(null, arguments); + }; + var _AvgPool = Module["_AvgPool"] = function() { + return (_AvgPool = Module["_AvgPool"] = Module["asm"]["K"]).apply(null, arguments); + }; + var _BatchMatMul = Module["_BatchMatMul"] = function() { + return (_BatchMatMul = Module["_BatchMatMul"] = Module["asm"]["L"]).apply(null, arguments); + }; + var _Ceil = Module["_Ceil"] = function() { + return (_Ceil = Module["_Ceil"] = Module["asm"]["M"]).apply(null, arguments); + }; + var _ClipByValue = Module["_ClipByValue"] = function() { + return (_ClipByValue = Module["_ClipByValue"] = Module["asm"]["N"]).apply(null, arguments); + }; + var _Conv2D = Module["_Conv2D"] = function() { + return (_Conv2D = Module["_Conv2D"] = Module["asm"]["O"]).apply(null, arguments); + }; + var _Conv2DBackpropInput = Module["_Conv2DBackpropInput"] = function() { + return (_Conv2DBackpropInput = Module["_Conv2DBackpropInput"] = Module["asm"]["P"]).apply(null, arguments); + }; + var _Cos = Module["_Cos"] = function() { + return (_Cos = Module["_Cos"] = Module["asm"]["Q"]).apply(null, arguments); + }; + var _CropAndResize = Module["_CropAndResize"] = function() { + return (_CropAndResize = Module["_CropAndResize"] = Module["asm"]["R"]).apply(null, arguments); + }; + var _Cumsum = Module["_Cumsum"] = function() { + return (_Cumsum = Module["_Cumsum"] = Module["asm"]["S"]).apply(null, arguments); + }; + var _DepthToSpace = Module["_DepthToSpace"] = function() { + return (_DepthToSpace = Module["_DepthToSpace"] = Module["asm"]["T"]).apply(null, arguments); + }; + var _DepthwiseConv2dNative = Module["_DepthwiseConv2dNative"] = function() { + return (_DepthwiseConv2dNative = Module["_DepthwiseConv2dNative"] = Module["asm"]["U"]).apply(null, arguments); + }; + var _Equal = Module["_Equal"] = function() { + return (_Equal = Module["_Equal"] = Module["asm"]["V"]).apply(null, arguments); + }; + var _Exp = Module["_Exp"] = function() { + return (_Exp = Module["_Exp"] = Module["asm"]["W"]).apply(null, arguments); + }; + var _FlipLeftRight = Module["_FlipLeftRight"] = function() { + return (_FlipLeftRight = Module["_FlipLeftRight"] = Module["asm"]["X"]).apply(null, arguments); + }; + var _Floor = Module["_Floor"] = function() { + return (_Floor = Module["_Floor"] = Module["asm"]["Y"]).apply(null, arguments); + }; + var _FloorDiv = Module["_FloorDiv"] = function() { + return (_FloorDiv = Module["_FloorDiv"] = Module["asm"]["Z"]).apply(null, arguments); + }; + var _FusedBatchNorm = Module["_FusedBatchNorm"] = function() { + return (_FusedBatchNorm = Module["_FusedBatchNorm"] = Module["asm"]["_"]).apply(null, arguments); + }; + var _FusedConv2D = Module["_FusedConv2D"] = function() { + return (_FusedConv2D = Module["_FusedConv2D"] = Module["asm"]["$"]).apply(null, arguments); + }; + var _FusedDepthwiseConv2D = Module["_FusedDepthwiseConv2D"] = function() { + return (_FusedDepthwiseConv2D = Module["_FusedDepthwiseConv2D"] = Module["asm"]["aa"]).apply(null, arguments); + }; + var _Gather = Module["_Gather"] = function() { + return (_Gather = Module["_Gather"] = Module["asm"]["ba"]).apply(null, arguments); + }; + var _GatherNd = Module["_GatherNd"] = function() { + return (_GatherNd = Module["_GatherNd"] = Module["asm"]["ca"]).apply(null, arguments); + }; + var _Greater = Module["_Greater"] = function() { + return (_Greater = Module["_Greater"] = Module["asm"]["da"]).apply(null, arguments); + }; + var _GreaterEqual = Module["_GreaterEqual"] = function() { + return (_GreaterEqual = Module["_GreaterEqual"] = Module["asm"]["ea"]).apply(null, arguments); + }; + var _LeakyRelu = Module["_LeakyRelu"] = function() { + return (_LeakyRelu = Module["_LeakyRelu"] = Module["asm"]["fa"]).apply(null, arguments); + }; + var _Less = Module["_Less"] = function() { + return (_Less = Module["_Less"] = Module["asm"]["ga"]).apply(null, arguments); + }; + var _LessEqual = Module["_LessEqual"] = function() { + return (_LessEqual = Module["_LessEqual"] = Module["asm"]["ha"]).apply(null, arguments); + }; + var _Log = Module["_Log"] = function() { + return (_Log = Module["_Log"] = Module["asm"]["ia"]).apply(null, arguments); + }; + var _LogicalAnd = Module["_LogicalAnd"] = function() { + return (_LogicalAnd = Module["_LogicalAnd"] = Module["asm"]["ja"]).apply(null, arguments); + }; + var _Max = Module["_Max"] = function() { + return (_Max = Module["_Max"] = Module["asm"]["ka"]).apply(null, arguments); + }; + var _MaxPool = Module["_MaxPool"] = function() { + return (_MaxPool = Module["_MaxPool"] = Module["asm"]["la"]).apply(null, arguments); + }; + var _Maximum = Module["_Maximum"] = function() { + return (_Maximum = Module["_Maximum"] = Module["asm"]["ma"]).apply(null, arguments); + }; + var _Mean = Module["_Mean"] = function() { + return (_Mean = Module["_Mean"] = Module["asm"]["na"]).apply(null, arguments); + }; + var _Min = Module["_Min"] = function() { + return (_Min = Module["_Min"] = Module["asm"]["oa"]).apply(null, arguments); + }; + var _Minimum = Module["_Minimum"] = function() { + return (_Minimum = Module["_Minimum"] = Module["asm"]["pa"]).apply(null, arguments); + }; + var _Multiply = Module["_Multiply"] = function() { + return (_Multiply = Module["_Multiply"] = Module["asm"]["qa"]).apply(null, arguments); + }; + var _Neg = Module["_Neg"] = function() { + return (_Neg = Module["_Neg"] = Module["asm"]["ra"]).apply(null, arguments); + }; + var _NonMaxSuppressionV3 = Module["_NonMaxSuppressionV3"] = function() { + return (_NonMaxSuppressionV3 = Module["_NonMaxSuppressionV3"] = Module["asm"]["sa"]).apply(null, arguments); + }; + var _NonMaxSuppressionV4 = Module["_NonMaxSuppressionV4"] = function() { + return (_NonMaxSuppressionV4 = Module["_NonMaxSuppressionV4"] = Module["asm"]["ta"]).apply(null, arguments); + }; + var _NonMaxSuppressionV5 = Module["_NonMaxSuppressionV5"] = function() { + return (_NonMaxSuppressionV5 = Module["_NonMaxSuppressionV5"] = Module["asm"]["ua"]).apply(null, arguments); + }; + var _NotEqual = Module["_NotEqual"] = function() { + return (_NotEqual = Module["_NotEqual"] = Module["asm"]["va"]).apply(null, arguments); + }; + var _OneHot = Module["_OneHot"] = function() { + return (_OneHot = Module["_OneHot"] = Module["asm"]["wa"]).apply(null, arguments); + }; + var _PadV2 = Module["_PadV2"] = function() { + return (_PadV2 = Module["_PadV2"] = Module["asm"]["xa"]).apply(null, arguments); + }; + var _Pow = Module["_Pow"] = function() { + return (_Pow = Module["_Pow"] = Module["asm"]["ya"]).apply(null, arguments); + }; + var _Prelu = Module["_Prelu"] = function() { + return (_Prelu = Module["_Prelu"] = Module["asm"]["za"]).apply(null, arguments); + }; + var _Prod = Module["_Prod"] = function() { + return (_Prod = Module["_Prod"] = Module["asm"]["Aa"]).apply(null, arguments); + }; + var _RealDiv = Module["_RealDiv"] = function() { + return (_RealDiv = Module["_RealDiv"] = Module["asm"]["Ba"]).apply(null, arguments); + }; + var _Relu = Module["_Relu"] = function() { + return (_Relu = Module["_Relu"] = Module["asm"]["Ca"]).apply(null, arguments); + }; + var _Relu6 = Module["_Relu6"] = function() { + return (_Relu6 = Module["_Relu6"] = Module["asm"]["Da"]).apply(null, arguments); + }; + var _ResizeBilinear = Module["_ResizeBilinear"] = function() { + return (_ResizeBilinear = Module["_ResizeBilinear"] = Module["asm"]["Ea"]).apply(null, arguments); + }; + var _Reverse = Module["_Reverse"] = function() { + return (_Reverse = Module["_Reverse"] = Module["asm"]["Fa"]).apply(null, arguments); + }; + var _RotateWithOffset = Module["_RotateWithOffset"] = function() { + return (_RotateWithOffset = Module["_RotateWithOffset"] = Module["asm"]["Ga"]).apply(null, arguments); + }; + var _Round = Module["_Round"] = function() { + return (_Round = Module["_Round"] = Module["asm"]["Ha"]).apply(null, arguments); + }; + var _Rsqrt = Module["_Rsqrt"] = function() { + return (_Rsqrt = Module["_Rsqrt"] = Module["asm"]["Ia"]).apply(null, arguments); + }; + var _ScatterNd = Module["_ScatterNd"] = function() { + return (_ScatterNd = Module["_ScatterNd"] = Module["asm"]["Ja"]).apply(null, arguments); + }; + var _SelectV2 = Module["_SelectV2"] = function() { + return (_SelectV2 = Module["_SelectV2"] = Module["asm"]["Ka"]).apply(null, arguments); + }; + var _Sigmoid = Module["_Sigmoid"] = function() { + return (_Sigmoid = Module["_Sigmoid"] = Module["asm"]["La"]).apply(null, arguments); + }; + var _Sin = Module["_Sin"] = function() { + return (_Sin = Module["_Sin"] = Module["asm"]["Ma"]).apply(null, arguments); + }; + var _Softmax = Module["_Softmax"] = function() { + return (_Softmax = Module["_Softmax"] = Module["asm"]["Na"]).apply(null, arguments); + }; + var _Sqrt = Module["_Sqrt"] = function() { + return (_Sqrt = Module["_Sqrt"] = Module["asm"]["Oa"]).apply(null, arguments); + }; + var _Square = Module["_Square"] = function() { + return (_Square = Module["_Square"] = Module["asm"]["Pa"]).apply(null, arguments); + }; + var _SquaredDifference = Module["_SquaredDifference"] = function() { + return (_SquaredDifference = Module["_SquaredDifference"] = Module["asm"]["Qa"]).apply(null, arguments); + }; + var _Step = Module["_Step"] = function() { + return (_Step = Module["_Step"] = Module["asm"]["Ra"]).apply(null, arguments); + }; + var _StridedSlice = Module["_StridedSlice"] = function() { + return (_StridedSlice = Module["_StridedSlice"] = Module["asm"]["Sa"]).apply(null, arguments); + }; + var _Sub = Module["_Sub"] = function() { + return (_Sub = Module["_Sub"] = Module["asm"]["Ta"]).apply(null, arguments); + }; + var _Sum = Module["_Sum"] = function() { + return (_Sum = Module["_Sum"] = Module["asm"]["Ua"]).apply(null, arguments); + }; + var _Tanh = Module["_Tanh"] = function() { + return (_Tanh = Module["_Tanh"] = Module["asm"]["Va"]).apply(null, arguments); + }; + var _Tile = Module["_Tile"] = function() { + return (_Tile = Module["_Tile"] = Module["asm"]["Wa"]).apply(null, arguments); + }; + var _TopK = Module["_TopK"] = function() { + return (_TopK = Module["_TopK"] = Module["asm"]["Xa"]).apply(null, arguments); + }; + var _Transpose = Module["_Transpose"] = function() { + return (_Transpose = Module["_Transpose"] = Module["asm"]["Ya"]).apply(null, arguments); + }; + var __FusedMatMul = Module["__FusedMatMul"] = function() { + return (__FusedMatMul = Module["__FusedMatMul"] = Module["asm"]["Za"]).apply(null, arguments); + }; + var _malloc = Module["_malloc"] = function() { + return (_malloc = Module["_malloc"] = Module["asm"]["_a"]).apply(null, arguments); + }; + var _free = Module["_free"] = function() { + return (_free = Module["_free"] = Module["asm"]["$a"]).apply(null, arguments); + }; + var ___errno_location = Module["___errno_location"] = function() { + return (___errno_location = Module["___errno_location"] = Module["asm"]["ab"]).apply(null, arguments); + }; + var _emscripten_get_global_libc = Module["_emscripten_get_global_libc"] = function() { + return (_emscripten_get_global_libc = Module["_emscripten_get_global_libc"] = Module["asm"]["bb"]).apply(null, arguments); + }; + var _pthread_self = Module["_pthread_self"] = function() { + return (_pthread_self = Module["_pthread_self"] = Module["asm"]["cb"]).apply(null, arguments); + }; + var ___pthread_tsd_run_dtors = Module["___pthread_tsd_run_dtors"] = function() { + return (___pthread_tsd_run_dtors = Module["___pthread_tsd_run_dtors"] = Module["asm"]["db"]).apply(null, arguments); + }; + var _emscripten_main_thread_process_queued_calls = Module["_emscripten_main_thread_process_queued_calls"] = function() { + return (_emscripten_main_thread_process_queued_calls = Module["_emscripten_main_thread_process_queued_calls"] = Module["asm"]["eb"]).apply(null, arguments); + }; + var _emscripten_current_thread_process_queued_calls = Module["_emscripten_current_thread_process_queued_calls"] = function() { + return (_emscripten_current_thread_process_queued_calls = Module["_emscripten_current_thread_process_queued_calls"] = Module["asm"]["fb"]).apply(null, arguments); + }; + var _emscripten_register_main_browser_thread_id = Module["_emscripten_register_main_browser_thread_id"] = function() { + return (_emscripten_register_main_browser_thread_id = Module["_emscripten_register_main_browser_thread_id"] = Module["asm"]["gb"]).apply(null, arguments); + }; + var __emscripten_do_dispatch_to_thread = Module["__emscripten_do_dispatch_to_thread"] = function() { + return (__emscripten_do_dispatch_to_thread = Module["__emscripten_do_dispatch_to_thread"] = Module["asm"]["hb"]).apply(null, arguments); + }; + var _emscripten_sync_run_in_main_thread_4 = Module["_emscripten_sync_run_in_main_thread_4"] = function() { + return (_emscripten_sync_run_in_main_thread_4 = Module["_emscripten_sync_run_in_main_thread_4"] = Module["asm"]["ib"]).apply(null, arguments); + }; + var _emscripten_run_in_main_runtime_thread_js = Module["_emscripten_run_in_main_runtime_thread_js"] = function() { + return (_emscripten_run_in_main_runtime_thread_js = Module["_emscripten_run_in_main_runtime_thread_js"] = Module["asm"]["jb"]).apply(null, arguments); + }; + var __emscripten_call_on_thread = Module["__emscripten_call_on_thread"] = function() { + return (__emscripten_call_on_thread = Module["__emscripten_call_on_thread"] = Module["asm"]["kb"]).apply(null, arguments); + }; + var _emscripten_tls_init = Module["_emscripten_tls_init"] = function() { + return (_emscripten_tls_init = Module["_emscripten_tls_init"] = Module["asm"]["lb"]).apply(null, arguments); + }; + var __emscripten_thread_init = Module["__emscripten_thread_init"] = function() { + return (__emscripten_thread_init = Module["__emscripten_thread_init"] = Module["asm"]["mb"]).apply(null, arguments); + }; + var stackSave = Module["stackSave"] = function() { + return (stackSave = Module["stackSave"] = Module["asm"]["nb"]).apply(null, arguments); + }; + var stackRestore = Module["stackRestore"] = function() { + return (stackRestore = Module["stackRestore"] = Module["asm"]["ob"]).apply(null, arguments); + }; + var stackAlloc = Module["stackAlloc"] = function() { + return (stackAlloc = Module["stackAlloc"] = Module["asm"]["pb"]).apply(null, arguments); + }; + var _emscripten_stack_set_limits = Module["_emscripten_stack_set_limits"] = function() { + return (_emscripten_stack_set_limits = Module["_emscripten_stack_set_limits"] = Module["asm"]["qb"]).apply(null, arguments); + }; + var _memalign = Module["_memalign"] = function() { + return (_memalign = Module["_memalign"] = Module["asm"]["rb"]).apply(null, arguments); + }; + var __emscripten_allow_main_runtime_queued_calls = Module["__emscripten_allow_main_runtime_queued_calls"] = 9880; + var __emscripten_main_thread_futex = Module["__emscripten_main_thread_futex"] = 11368; + Module["cwrap"] = cwrap; + Module["PThread"] = PThread; + Module["PThread"] = PThread; + Module["wasmMemory"] = wasmMemory; + Module["ExitStatus"] = ExitStatus; + var calledRun; + function ExitStatus(status2) { + this.name = "ExitStatus"; + this.message = "Program terminated with exit(" + status2 + ")"; + this.status = status2; + } + dependenciesFulfilled = function runCaller() { + if (!calledRun) + run2(); + if (!calledRun) + dependenciesFulfilled = runCaller; + }; + function run2(args) { + args = args || arguments_; + if (runDependencies > 0) { + return; + } + if (ENVIRONMENT_IS_PTHREAD) { + readyPromiseResolve(Module); + postMessage({cmd: "loaded"}); + return; + } + preRun(); + if (runDependencies > 0) { + return; + } + function doRun() { + if (calledRun) + return; + calledRun = true; + Module["calledRun"] = true; + if (ABORT) + return; + initRuntime(); + preMain(); + readyPromiseResolve(Module); + if (Module["onRuntimeInitialized"]) + Module["onRuntimeInitialized"](); + postRun(); + } + if (Module["setStatus"]) { + Module["setStatus"]("Running..."); + setTimeout(function() { + setTimeout(function() { + Module["setStatus"](""); + }, 1); + doRun(); + }, 1); + } else { + doRun(); + } + } + Module["run"] = run2; + function exit(status2, implicit) { + if (implicit && noExitRuntime && status2 === 0) { + return; + } + if (!implicit) { + if (ENVIRONMENT_IS_PTHREAD) { + postMessage({cmd: "exitProcess", returnCode: status2}); + throw new ExitStatus(status2); + } else { + } + } + if (noExitRuntime) { + } else { + PThread.terminateAllThreads(); + EXITSTATUS = status2; + exitRuntime(); + if (Module["onExit"]) + Module["onExit"](status2); + ABORT = true; + } + quit_(status2, new ExitStatus(status2)); + } + if (Module["preInit"]) { + if (typeof Module["preInit"] == "function") + Module["preInit"] = [Module["preInit"]]; + while (Module["preInit"].length > 0) { + Module["preInit"].pop()(); + } + } + if (ENVIRONMENT_IS_PTHREAD) { + noExitRuntime = false; + PThread.initWorker(); + } + run2(); + return WasmBackendModuleThreadedSimd2.ready; + }; + }(); + if (typeof exports === "object" && typeof module === "object") + module.exports = WasmBackendModuleThreadedSimd; + else if (typeof define === "function" && define["amd"]) + define([], function() { + return WasmBackendModuleThreadedSimd; + }); + else if (typeof exports === "object") + exports["WasmBackendModuleThreadedSimd"] = WasmBackendModuleThreadedSimd; +}); +var require_tfjs_backend_wasm = __commonJS2((exports, module) => { + var WasmBackendModule = function() { + var _scriptDir = typeof document !== "undefined" && document.currentScript ? document.currentScript.src : void 0; + if (typeof __filename !== "undefined") + _scriptDir = _scriptDir || __filename; + return function(WasmBackendModule2) { + WasmBackendModule2 = WasmBackendModule2 || {}; + var Module = typeof WasmBackendModule2 !== "undefined" ? WasmBackendModule2 : {}; + var readyPromiseResolve, readyPromiseReject; + Module["ready"] = new Promise(function(resolve, reject) { + readyPromiseResolve = resolve; + readyPromiseReject = reject; + }); + var moduleOverrides = {}; + var key; + for (key in Module) { + if (Module.hasOwnProperty(key)) { + moduleOverrides[key] = Module[key]; + } + } + var arguments_ = []; + var thisProgram = "./this.program"; + var quit_ = function(status2, toThrow) { + throw toThrow; + }; + var ENVIRONMENT_IS_WEB = false; + var ENVIRONMENT_IS_WORKER = false; + var ENVIRONMENT_IS_NODE = false; + var ENVIRONMENT_IS_SHELL = false; + ENVIRONMENT_IS_WEB = typeof window === "object"; + ENVIRONMENT_IS_WORKER = typeof importScripts === "function"; + ENVIRONMENT_IS_NODE = typeof process === "object" && typeof process.versions === "object" && typeof process.versions.node === "string"; + ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER; + var scriptDirectory = ""; + function locateFile(path) { + if (Module["locateFile"]) { + return Module["locateFile"](path, scriptDirectory); + } + return scriptDirectory + path; + } + var read_, readAsync, readBinary, setWindowTitle; + var nodeFS; + var nodePath; + if (ENVIRONMENT_IS_NODE) { + if (ENVIRONMENT_IS_WORKER) { + scriptDirectory = require_path().dirname(scriptDirectory) + "/"; + } else { + scriptDirectory = __dirname + "/"; + } + read_ = function shell_read(filename, binary) { + if (!nodeFS) + nodeFS = require("fs"); + if (!nodePath) + nodePath = require_path(); + filename = nodePath["normalize"](filename); + return nodeFS["readFileSync"](filename, binary ? null : "utf8"); + }; + readBinary = function readBinary2(filename) { + var ret = read_(filename, true); + if (!ret.buffer) { + ret = new Uint8Array(ret); + } + assert3(ret.buffer); + return ret; + }; + if (process["argv"].length > 1) { + thisProgram = process["argv"][1].replace(/\\/g, "/"); + } + arguments_ = process["argv"].slice(2); + process["on"]("uncaughtException", function(ex) { + if (!(ex instanceof ExitStatus)) { + throw ex; + } + }); + process["on"]("unhandledRejection", abort); + quit_ = function(status2) { + process["exit"](status2); + }; + Module["inspect"] = function() { + return "[Emscripten Module object]"; + }; + } else if (ENVIRONMENT_IS_SHELL) { + if (typeof read != "undefined") { + read_ = function shell_read(f) { + return read(f); + }; + } + readBinary = function readBinary2(f) { + var data2; + if (typeof readbuffer === "function") { + return new Uint8Array(readbuffer(f)); + } + data2 = read(f, "binary"); + assert3(typeof data2 === "object"); + return data2; + }; + if (typeof scriptArgs != "undefined") { + arguments_ = scriptArgs; + } else if (typeof arguments != "undefined") { + arguments_ = arguments; + } + if (typeof quit === "function") { + quit_ = function(status2) { + quit(status2); + }; + } + if (typeof print !== "undefined") { + if (typeof console === "undefined") + console = {}; + console.log = print; + console.warn = console.error = typeof printErr !== "undefined" ? printErr : print; + } + } else if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) { + if (ENVIRONMENT_IS_WORKER) { + scriptDirectory = self.location.href; + } else if (typeof document !== "undefined" && document.currentScript) { + scriptDirectory = document.currentScript.src; + } + if (_scriptDir) { + scriptDirectory = _scriptDir; + } + if (scriptDirectory.indexOf("blob:") !== 0) { + scriptDirectory = scriptDirectory.substr(0, scriptDirectory.lastIndexOf("/") + 1); + } else { + scriptDirectory = ""; + } + { + read_ = function(url) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", url, false); + xhr.send(null); + return xhr.responseText; + }; + if (ENVIRONMENT_IS_WORKER) { + readBinary = function(url) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", url, false); + xhr.responseType = "arraybuffer"; + xhr.send(null); + return new Uint8Array(xhr.response); + }; + } + readAsync = function(url, onload, onerror) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", url, true); + xhr.responseType = "arraybuffer"; + xhr.onload = function() { + if (xhr.status == 200 || xhr.status == 0 && xhr.response) { + onload(xhr.response); + return; + } + onerror(); + }; + xhr.onerror = onerror; + xhr.send(null); + }; + } + setWindowTitle = function(title) { + document.title = title; + }; + } else { + } + var out = Module["print"] || console.log.bind(console); + var err = Module["printErr"] || console.warn.bind(console); + for (key in moduleOverrides) { + if (moduleOverrides.hasOwnProperty(key)) { + Module[key] = moduleOverrides[key]; + } + } + moduleOverrides = null; + if (Module["arguments"]) + arguments_ = Module["arguments"]; + if (Module["thisProgram"]) + thisProgram = Module["thisProgram"]; + if (Module["quit"]) + quit_ = Module["quit"]; + var wasmBinary; + if (Module["wasmBinary"]) + wasmBinary = Module["wasmBinary"]; + var noExitRuntime = Module["noExitRuntime"] || true; + if (typeof WebAssembly !== "object") { + abort("no native wasm support detected"); + } + var wasmMemory; + var ABORT = false; + var EXITSTATUS; + function assert3(condition, text) { + if (!condition) { + abort("Assertion failed: " + text); + } + } + function getCFunc(ident) { + var func2 = Module["_" + ident]; + assert3(func2, "Cannot call unknown function " + ident + ", make sure it is exported"); + return func2; + } + function ccall(ident, returnType, argTypes, args, opts) { + var toC = {string: function(str2) { + var ret2 = 0; + if (str2 !== null && str2 !== void 0 && str2 !== 0) { + var len = (str2.length << 2) + 1; + ret2 = stackAlloc(len); + stringToUTF8(str2, ret2, len); + } + return ret2; + }, array: function(arr) { + var ret2 = stackAlloc(arr.length); + writeArrayToMemory(arr, ret2); + return ret2; + }}; + function convertReturnValue(ret2) { + if (returnType === "string") + return UTF8ToString(ret2); + if (returnType === "boolean") + return Boolean(ret2); + return ret2; + } + var func2 = getCFunc(ident); + var cArgs = []; + var stack2 = 0; + if (args) { + for (var i = 0; i < args.length; i++) { + var converter = toC[argTypes[i]]; + if (converter) { + if (stack2 === 0) + stack2 = stackSave(); + cArgs[i] = converter(args[i]); + } else { + cArgs[i] = args[i]; + } + } + } + var ret = func2.apply(null, cArgs); + ret = convertReturnValue(ret); + if (stack2 !== 0) + stackRestore(stack2); + return ret; + } + function cwrap(ident, returnType, argTypes, opts) { + argTypes = argTypes || []; + var numericArgs = argTypes.every(function(type) { + return type === "number"; + }); + var numericRet = returnType !== "string"; + if (numericRet && numericArgs && !opts) { + return getCFunc(ident); + } + return function() { + return ccall(ident, returnType, argTypes, arguments, opts); + }; + } + var UTF8Decoder = typeof TextDecoder !== "undefined" ? new TextDecoder("utf8") : void 0; + function UTF8ArrayToString(heap, idx, maxBytesToRead) { + var endIdx = idx + maxBytesToRead; + var endPtr = idx; + while (heap[endPtr] && !(endPtr >= endIdx)) + ++endPtr; + if (endPtr - idx > 16 && heap.subarray && UTF8Decoder) { + return UTF8Decoder.decode(heap.subarray(idx, endPtr)); + } else { + var str2 = ""; + while (idx < endPtr) { + var u0 = heap[idx++]; + if (!(u0 & 128)) { + str2 += String.fromCharCode(u0); + continue; + } + var u1 = heap[idx++] & 63; + if ((u0 & 224) == 192) { + str2 += String.fromCharCode((u0 & 31) << 6 | u1); + continue; + } + var u2 = heap[idx++] & 63; + if ((u0 & 240) == 224) { + u0 = (u0 & 15) << 12 | u1 << 6 | u2; + } else { + u0 = (u0 & 7) << 18 | u1 << 12 | u2 << 6 | heap[idx++] & 63; + } + if (u0 < 65536) { + str2 += String.fromCharCode(u0); + } else { + var ch = u0 - 65536; + str2 += String.fromCharCode(55296 | ch >> 10, 56320 | ch & 1023); + } + } + } + return str2; + } + function UTF8ToString(ptr, maxBytesToRead) { + return ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ""; + } + function stringToUTF8Array(str2, heap, outIdx, maxBytesToWrite) { + if (!(maxBytesToWrite > 0)) + return 0; + var startIdx = outIdx; + var endIdx = outIdx + maxBytesToWrite - 1; + for (var i = 0; i < str2.length; ++i) { + var u = str2.charCodeAt(i); + if (u >= 55296 && u <= 57343) { + var u1 = str2.charCodeAt(++i); + u = 65536 + ((u & 1023) << 10) | u1 & 1023; + } + if (u <= 127) { + if (outIdx >= endIdx) + break; + heap[outIdx++] = u; + } else if (u <= 2047) { + if (outIdx + 1 >= endIdx) + break; + heap[outIdx++] = 192 | u >> 6; + heap[outIdx++] = 128 | u & 63; + } else if (u <= 65535) { + if (outIdx + 2 >= endIdx) + break; + heap[outIdx++] = 224 | u >> 12; + heap[outIdx++] = 128 | u >> 6 & 63; + heap[outIdx++] = 128 | u & 63; + } else { + if (outIdx + 3 >= endIdx) + break; + heap[outIdx++] = 240 | u >> 18; + heap[outIdx++] = 128 | u >> 12 & 63; + heap[outIdx++] = 128 | u >> 6 & 63; + heap[outIdx++] = 128 | u & 63; + } + } + heap[outIdx] = 0; + return outIdx - startIdx; + } + function stringToUTF8(str2, outPtr, maxBytesToWrite) { + return stringToUTF8Array(str2, HEAPU8, outPtr, maxBytesToWrite); + } + function writeArrayToMemory(array2, buffer3) { + HEAP8.set(array2, buffer3); + } + function alignUp(x, multiple) { + if (x % multiple > 0) { + x += multiple - x % multiple; + } + return x; + } + var buffer2, HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64; + function updateGlobalBufferAndViews(buf) { + buffer2 = buf; + Module["HEAP8"] = HEAP8 = new Int8Array(buf); + Module["HEAP16"] = HEAP16 = new Int16Array(buf); + Module["HEAP32"] = HEAP32 = new Int32Array(buf); + Module["HEAPU8"] = HEAPU8 = new Uint8Array(buf); + Module["HEAPU16"] = HEAPU16 = new Uint16Array(buf); + Module["HEAPU32"] = HEAPU32 = new Uint32Array(buf); + Module["HEAPF32"] = HEAPF32 = new Float32Array(buf); + Module["HEAPF64"] = HEAPF64 = new Float64Array(buf); + } + var INITIAL_MEMORY = Module["INITIAL_MEMORY"] || 16777216; + var wasmTable; + var __ATPRERUN__ = []; + var __ATINIT__ = []; + var __ATMAIN__ = []; + var __ATPOSTRUN__ = []; + var runtimeInitialized = false; + __ATINIT__.push({func: function() { + ___wasm_call_ctors(); + }}); + function preRun() { + if (Module["preRun"]) { + if (typeof Module["preRun"] == "function") + Module["preRun"] = [Module["preRun"]]; + while (Module["preRun"].length) { + addOnPreRun(Module["preRun"].shift()); + } + } + callRuntimeCallbacks(__ATPRERUN__); + } + function initRuntime() { + runtimeInitialized = true; + callRuntimeCallbacks(__ATINIT__); + } + function preMain() { + callRuntimeCallbacks(__ATMAIN__); + } + function postRun() { + if (Module["postRun"]) { + if (typeof Module["postRun"] == "function") + Module["postRun"] = [Module["postRun"]]; + while (Module["postRun"].length) { + addOnPostRun(Module["postRun"].shift()); + } + } + callRuntimeCallbacks(__ATPOSTRUN__); + } + function addOnPreRun(cb) { + __ATPRERUN__.unshift(cb); + } + function addOnPostRun(cb) { + __ATPOSTRUN__.unshift(cb); + } + var runDependencies = 0; + var runDependencyWatcher = null; + var dependenciesFulfilled = null; + function addRunDependency(id) { + runDependencies++; + if (Module["monitorRunDependencies"]) { + Module["monitorRunDependencies"](runDependencies); + } + } + function removeRunDependency(id) { + runDependencies--; + if (Module["monitorRunDependencies"]) { + Module["monitorRunDependencies"](runDependencies); + } + if (runDependencies == 0) { + if (runDependencyWatcher !== null) { + clearInterval(runDependencyWatcher); + runDependencyWatcher = null; + } + if (dependenciesFulfilled) { + var callback = dependenciesFulfilled; + dependenciesFulfilled = null; + callback(); + } + } + } + Module["preloadedImages"] = {}; + Module["preloadedAudios"] = {}; + function abort(what) { + if (Module["onAbort"]) { + Module["onAbort"](what); + } + what += ""; + err(what); + ABORT = true; + EXITSTATUS = 1; + what = "abort(" + what + "). Build with -s ASSERTIONS=1 for more info."; + var e = new WebAssembly.RuntimeError(what); + readyPromiseReject(e); + throw e; + } + function hasPrefix(str2, prefix) { + return String.prototype.startsWith ? str2.startsWith(prefix) : str2.indexOf(prefix) === 0; + } + var dataURIPrefix = "data:application/octet-stream;base64,"; + function isDataURI(filename) { + return hasPrefix(filename, dataURIPrefix); + } + var fileURIPrefix = "file://"; + function isFileURI(filename) { + return hasPrefix(filename, fileURIPrefix); + } + var wasmBinaryFile = "tfjs-backend-wasm.wasm"; + if (!isDataURI(wasmBinaryFile)) { + wasmBinaryFile = locateFile(wasmBinaryFile); + } + function getBinary(file) { + try { + if (file == wasmBinaryFile && wasmBinary) { + return new Uint8Array(wasmBinary); + } + if (readBinary) { + return readBinary(file); + } else { + throw "both async and sync fetching of the wasm failed"; + } + } catch (err2) { + abort(err2); + } + } + function getBinaryPromise() { + if (!wasmBinary && (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER)) { + if (typeof fetch === "function" && !isFileURI(wasmBinaryFile)) { + return fetch(wasmBinaryFile, {credentials: "same-origin"}).then(function(response) { + if (!response["ok"]) { + throw "failed to load wasm binary file at '" + wasmBinaryFile + "'"; + } + return response["arrayBuffer"](); + }).catch(function() { + return getBinary(wasmBinaryFile); + }); + } else { + if (readAsync) { + return new Promise(function(resolve, reject) { + readAsync(wasmBinaryFile, function(response) { + resolve(new Uint8Array(response)); + }, reject); + }); + } + } + } + return Promise.resolve().then(function() { + return getBinary(wasmBinaryFile); + }); + } + function createWasm() { + var info2 = {a: asmLibraryArg}; + function receiveInstance(instance2, module2) { + var exports3 = instance2.exports; + Module["asm"] = exports3; + wasmMemory = Module["asm"]["g"]; + updateGlobalBufferAndViews(wasmMemory.buffer); + wasmTable = Module["asm"]["m"]; + removeRunDependency("wasm-instantiate"); + } + addRunDependency("wasm-instantiate"); + function receiveInstantiatedSource(output) { + receiveInstance(output["instance"]); + } + function instantiateArrayBuffer(receiver) { + return getBinaryPromise().then(function(binary) { + return WebAssembly.instantiate(binary, info2); + }).then(receiver, function(reason) { + err("failed to asynchronously prepare wasm: " + reason); + abort(reason); + }); + } + function instantiateAsync() { + if (!wasmBinary && typeof WebAssembly.instantiateStreaming === "function" && !isDataURI(wasmBinaryFile) && !isFileURI(wasmBinaryFile) && typeof fetch === "function") { + return fetch(wasmBinaryFile, {credentials: "same-origin"}).then(function(response) { + var result = WebAssembly.instantiateStreaming(response, info2); + return result.then(receiveInstantiatedSource, function(reason) { + err("wasm streaming compile failed: " + reason); + err("falling back to ArrayBuffer instantiation"); + return instantiateArrayBuffer(receiveInstantiatedSource); + }); + }); + } else { + return instantiateArrayBuffer(receiveInstantiatedSource); + } + } + if (Module["instantiateWasm"]) { + try { + var exports2 = Module["instantiateWasm"](info2, receiveInstance); + return exports2; + } catch (e) { + err("Module.instantiateWasm callback failed with error: " + e); + return false; + } + } + instantiateAsync().catch(readyPromiseReject); + return {}; + } + function callRuntimeCallbacks(callbacks2) { + while (callbacks2.length > 0) { + var callback = callbacks2.shift(); + if (typeof callback == "function") { + callback(Module); + continue; + } + var func2 = callback.func; + if (typeof func2 === "number") { + if (callback.arg === void 0) { + wasmTable.get(func2)(); + } else { + wasmTable.get(func2)(callback.arg); + } + } else { + func2(callback.arg === void 0 ? null : callback.arg); + } + } + } + function _abort() { + abort(); + } + function _emscripten_memcpy_big(dest, src, num) { + HEAPU8.copyWithin(dest, src, src + num); + } + function _emscripten_get_heap_size() { + return HEAPU8.length; + } + function emscripten_realloc_buffer(size) { + try { + wasmMemory.grow(size - buffer2.byteLength + 65535 >>> 16); + updateGlobalBufferAndViews(wasmMemory.buffer); + return 1; + } catch (e) { + } + } + function _emscripten_resize_heap(requestedSize) { + var oldSize = _emscripten_get_heap_size(); + var maxHeapSize = 2147483648; + if (requestedSize > maxHeapSize) { + return false; + } + for (var cutDown = 1; cutDown <= 4; cutDown *= 2) { + var overGrownHeapSize = oldSize * (1 + 0.2 / cutDown); + overGrownHeapSize = Math.min(overGrownHeapSize, requestedSize + 100663296); + var newSize = Math.min(maxHeapSize, alignUp(Math.max(requestedSize, overGrownHeapSize), 65536)); + var replacement = emscripten_realloc_buffer(newSize); + if (replacement) { + return true; + } + } + return false; + } + var SYSCALLS = {mappings: {}, buffers: [null, [], []], printChar: function(stream, curr) { + var buffer3 = SYSCALLS.buffers[stream]; + if (curr === 0 || curr === 10) { + (stream === 1 ? out : err)(UTF8ArrayToString(buffer3, 0)); + buffer3.length = 0; + } else { + buffer3.push(curr); + } + }, varargs: void 0, get: function() { + SYSCALLS.varargs += 4; + var ret = HEAP32[SYSCALLS.varargs - 4 >> 2]; + return ret; + }, getStr: function(ptr) { + var ret = UTF8ToString(ptr); + return ret; + }, get64: function(low, high) { + return low; + }}; + function _fd_close(fd) { + return 0; + } + function _fd_seek(fd, offset_low, offset_high, whence, newOffset) { + } + function _fd_write(fd, iov, iovcnt, pnum) { + var num = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAP32[iov + i * 8 >> 2]; + var len = HEAP32[iov + (i * 8 + 4) >> 2]; + for (var j = 0; j < len; j++) { + SYSCALLS.printChar(fd, HEAPU8[ptr + j]); + } + num += len; + } + HEAP32[pnum >> 2] = num; + return 0; + } + var asmLibraryArg = {a: _abort, d: _emscripten_memcpy_big, e: _emscripten_resize_heap, f: _fd_close, c: _fd_seek, b: _fd_write}; + var asm = createWasm(); + var ___wasm_call_ctors = Module["___wasm_call_ctors"] = function() { + return (___wasm_call_ctors = Module["___wasm_call_ctors"] = Module["asm"]["h"]).apply(null, arguments); + }; + var _init = Module["_init"] = function() { + return (_init = Module["_init"] = Module["asm"]["i"]).apply(null, arguments); + }; + var _register_tensor = Module["_register_tensor"] = function() { + return (_register_tensor = Module["_register_tensor"] = Module["asm"]["j"]).apply(null, arguments); + }; + var _dispose_data = Module["_dispose_data"] = function() { + return (_dispose_data = Module["_dispose_data"] = Module["asm"]["k"]).apply(null, arguments); + }; + var _dispose = Module["_dispose"] = function() { + return (_dispose = Module["_dispose"] = Module["asm"]["l"]).apply(null, arguments); + }; + var _Abs = Module["_Abs"] = function() { + return (_Abs = Module["_Abs"] = Module["asm"]["n"]).apply(null, arguments); + }; + var _Add = Module["_Add"] = function() { + return (_Add = Module["_Add"] = Module["asm"]["o"]).apply(null, arguments); + }; + var _AddN = Module["_AddN"] = function() { + return (_AddN = Module["_AddN"] = Module["asm"]["p"]).apply(null, arguments); + }; + var _ArgMax = Module["_ArgMax"] = function() { + return (_ArgMax = Module["_ArgMax"] = Module["asm"]["q"]).apply(null, arguments); + }; + var _AvgPool = Module["_AvgPool"] = function() { + return (_AvgPool = Module["_AvgPool"] = Module["asm"]["r"]).apply(null, arguments); + }; + var _BatchMatMul = Module["_BatchMatMul"] = function() { + return (_BatchMatMul = Module["_BatchMatMul"] = Module["asm"]["s"]).apply(null, arguments); + }; + var _Ceil = Module["_Ceil"] = function() { + return (_Ceil = Module["_Ceil"] = Module["asm"]["t"]).apply(null, arguments); + }; + var _ClipByValue = Module["_ClipByValue"] = function() { + return (_ClipByValue = Module["_ClipByValue"] = Module["asm"]["u"]).apply(null, arguments); + }; + var _Conv2D = Module["_Conv2D"] = function() { + return (_Conv2D = Module["_Conv2D"] = Module["asm"]["v"]).apply(null, arguments); + }; + var _Conv2DBackpropInput = Module["_Conv2DBackpropInput"] = function() { + return (_Conv2DBackpropInput = Module["_Conv2DBackpropInput"] = Module["asm"]["w"]).apply(null, arguments); + }; + var _Cos = Module["_Cos"] = function() { + return (_Cos = Module["_Cos"] = Module["asm"]["x"]).apply(null, arguments); + }; + var _CropAndResize = Module["_CropAndResize"] = function() { + return (_CropAndResize = Module["_CropAndResize"] = Module["asm"]["y"]).apply(null, arguments); + }; + var _Cumsum = Module["_Cumsum"] = function() { + return (_Cumsum = Module["_Cumsum"] = Module["asm"]["z"]).apply(null, arguments); + }; + var _DepthToSpace = Module["_DepthToSpace"] = function() { + return (_DepthToSpace = Module["_DepthToSpace"] = Module["asm"]["A"]).apply(null, arguments); + }; + var _DepthwiseConv2dNative = Module["_DepthwiseConv2dNative"] = function() { + return (_DepthwiseConv2dNative = Module["_DepthwiseConv2dNative"] = Module["asm"]["B"]).apply(null, arguments); + }; + var _Equal = Module["_Equal"] = function() { + return (_Equal = Module["_Equal"] = Module["asm"]["C"]).apply(null, arguments); + }; + var _Exp = Module["_Exp"] = function() { + return (_Exp = Module["_Exp"] = Module["asm"]["D"]).apply(null, arguments); + }; + var _FlipLeftRight = Module["_FlipLeftRight"] = function() { + return (_FlipLeftRight = Module["_FlipLeftRight"] = Module["asm"]["E"]).apply(null, arguments); + }; + var _Floor = Module["_Floor"] = function() { + return (_Floor = Module["_Floor"] = Module["asm"]["F"]).apply(null, arguments); + }; + var _FloorDiv = Module["_FloorDiv"] = function() { + return (_FloorDiv = Module["_FloorDiv"] = Module["asm"]["G"]).apply(null, arguments); + }; + var _FusedBatchNorm = Module["_FusedBatchNorm"] = function() { + return (_FusedBatchNorm = Module["_FusedBatchNorm"] = Module["asm"]["H"]).apply(null, arguments); + }; + var _FusedConv2D = Module["_FusedConv2D"] = function() { + return (_FusedConv2D = Module["_FusedConv2D"] = Module["asm"]["I"]).apply(null, arguments); + }; + var _FusedDepthwiseConv2D = Module["_FusedDepthwiseConv2D"] = function() { + return (_FusedDepthwiseConv2D = Module["_FusedDepthwiseConv2D"] = Module["asm"]["J"]).apply(null, arguments); + }; + var _Gather = Module["_Gather"] = function() { + return (_Gather = Module["_Gather"] = Module["asm"]["K"]).apply(null, arguments); + }; + var _GatherNd = Module["_GatherNd"] = function() { + return (_GatherNd = Module["_GatherNd"] = Module["asm"]["L"]).apply(null, arguments); + }; + var _Greater = Module["_Greater"] = function() { + return (_Greater = Module["_Greater"] = Module["asm"]["M"]).apply(null, arguments); + }; + var _GreaterEqual = Module["_GreaterEqual"] = function() { + return (_GreaterEqual = Module["_GreaterEqual"] = Module["asm"]["N"]).apply(null, arguments); + }; + var _LeakyRelu = Module["_LeakyRelu"] = function() { + return (_LeakyRelu = Module["_LeakyRelu"] = Module["asm"]["O"]).apply(null, arguments); + }; + var _Less = Module["_Less"] = function() { + return (_Less = Module["_Less"] = Module["asm"]["P"]).apply(null, arguments); + }; + var _LessEqual = Module["_LessEqual"] = function() { + return (_LessEqual = Module["_LessEqual"] = Module["asm"]["Q"]).apply(null, arguments); + }; + var _Log = Module["_Log"] = function() { + return (_Log = Module["_Log"] = Module["asm"]["R"]).apply(null, arguments); + }; + var _LogicalAnd = Module["_LogicalAnd"] = function() { + return (_LogicalAnd = Module["_LogicalAnd"] = Module["asm"]["S"]).apply(null, arguments); + }; + var _Max = Module["_Max"] = function() { + return (_Max = Module["_Max"] = Module["asm"]["T"]).apply(null, arguments); + }; + var _MaxPool = Module["_MaxPool"] = function() { + return (_MaxPool = Module["_MaxPool"] = Module["asm"]["U"]).apply(null, arguments); + }; + var _Maximum = Module["_Maximum"] = function() { + return (_Maximum = Module["_Maximum"] = Module["asm"]["V"]).apply(null, arguments); + }; + var _Mean = Module["_Mean"] = function() { + return (_Mean = Module["_Mean"] = Module["asm"]["W"]).apply(null, arguments); + }; + var _Min = Module["_Min"] = function() { + return (_Min = Module["_Min"] = Module["asm"]["X"]).apply(null, arguments); + }; + var _Minimum = Module["_Minimum"] = function() { + return (_Minimum = Module["_Minimum"] = Module["asm"]["Y"]).apply(null, arguments); + }; + var _Multiply = Module["_Multiply"] = function() { + return (_Multiply = Module["_Multiply"] = Module["asm"]["Z"]).apply(null, arguments); + }; + var _Neg = Module["_Neg"] = function() { + return (_Neg = Module["_Neg"] = Module["asm"]["_"]).apply(null, arguments); + }; + var _NonMaxSuppressionV3 = Module["_NonMaxSuppressionV3"] = function() { + return (_NonMaxSuppressionV3 = Module["_NonMaxSuppressionV3"] = Module["asm"]["$"]).apply(null, arguments); + }; + var _NonMaxSuppressionV4 = Module["_NonMaxSuppressionV4"] = function() { + return (_NonMaxSuppressionV4 = Module["_NonMaxSuppressionV4"] = Module["asm"]["aa"]).apply(null, arguments); + }; + var _NonMaxSuppressionV5 = Module["_NonMaxSuppressionV5"] = function() { + return (_NonMaxSuppressionV5 = Module["_NonMaxSuppressionV5"] = Module["asm"]["ba"]).apply(null, arguments); + }; + var _NotEqual = Module["_NotEqual"] = function() { + return (_NotEqual = Module["_NotEqual"] = Module["asm"]["ca"]).apply(null, arguments); + }; + var _OneHot = Module["_OneHot"] = function() { + return (_OneHot = Module["_OneHot"] = Module["asm"]["da"]).apply(null, arguments); + }; + var _PadV2 = Module["_PadV2"] = function() { + return (_PadV2 = Module["_PadV2"] = Module["asm"]["ea"]).apply(null, arguments); + }; + var _Pow = Module["_Pow"] = function() { + return (_Pow = Module["_Pow"] = Module["asm"]["fa"]).apply(null, arguments); + }; + var _Prelu = Module["_Prelu"] = function() { + return (_Prelu = Module["_Prelu"] = Module["asm"]["ga"]).apply(null, arguments); + }; + var _Prod = Module["_Prod"] = function() { + return (_Prod = Module["_Prod"] = Module["asm"]["ha"]).apply(null, arguments); + }; + var _RealDiv = Module["_RealDiv"] = function() { + return (_RealDiv = Module["_RealDiv"] = Module["asm"]["ia"]).apply(null, arguments); + }; + var _Relu = Module["_Relu"] = function() { + return (_Relu = Module["_Relu"] = Module["asm"]["ja"]).apply(null, arguments); + }; + var _Relu6 = Module["_Relu6"] = function() { + return (_Relu6 = Module["_Relu6"] = Module["asm"]["ka"]).apply(null, arguments); + }; + var _ResizeBilinear = Module["_ResizeBilinear"] = function() { + return (_ResizeBilinear = Module["_ResizeBilinear"] = Module["asm"]["la"]).apply(null, arguments); + }; + var _Reverse = Module["_Reverse"] = function() { + return (_Reverse = Module["_Reverse"] = Module["asm"]["ma"]).apply(null, arguments); + }; + var _RotateWithOffset = Module["_RotateWithOffset"] = function() { + return (_RotateWithOffset = Module["_RotateWithOffset"] = Module["asm"]["na"]).apply(null, arguments); + }; + var _Round = Module["_Round"] = function() { + return (_Round = Module["_Round"] = Module["asm"]["oa"]).apply(null, arguments); + }; + var _Rsqrt = Module["_Rsqrt"] = function() { + return (_Rsqrt = Module["_Rsqrt"] = Module["asm"]["pa"]).apply(null, arguments); + }; + var _ScatterNd = Module["_ScatterNd"] = function() { + return (_ScatterNd = Module["_ScatterNd"] = Module["asm"]["qa"]).apply(null, arguments); + }; + var _SelectV2 = Module["_SelectV2"] = function() { + return (_SelectV2 = Module["_SelectV2"] = Module["asm"]["ra"]).apply(null, arguments); + }; + var _Sigmoid = Module["_Sigmoid"] = function() { + return (_Sigmoid = Module["_Sigmoid"] = Module["asm"]["sa"]).apply(null, arguments); + }; + var _Sin = Module["_Sin"] = function() { + return (_Sin = Module["_Sin"] = Module["asm"]["ta"]).apply(null, arguments); + }; + var _Softmax = Module["_Softmax"] = function() { + return (_Softmax = Module["_Softmax"] = Module["asm"]["ua"]).apply(null, arguments); + }; + var _Sqrt = Module["_Sqrt"] = function() { + return (_Sqrt = Module["_Sqrt"] = Module["asm"]["va"]).apply(null, arguments); + }; + var _Square = Module["_Square"] = function() { + return (_Square = Module["_Square"] = Module["asm"]["wa"]).apply(null, arguments); + }; + var _SquaredDifference = Module["_SquaredDifference"] = function() { + return (_SquaredDifference = Module["_SquaredDifference"] = Module["asm"]["xa"]).apply(null, arguments); + }; + var _Step = Module["_Step"] = function() { + return (_Step = Module["_Step"] = Module["asm"]["ya"]).apply(null, arguments); + }; + var _StridedSlice = Module["_StridedSlice"] = function() { + return (_StridedSlice = Module["_StridedSlice"] = Module["asm"]["za"]).apply(null, arguments); + }; + var _Sub = Module["_Sub"] = function() { + return (_Sub = Module["_Sub"] = Module["asm"]["Aa"]).apply(null, arguments); + }; + var _Sum = Module["_Sum"] = function() { + return (_Sum = Module["_Sum"] = Module["asm"]["Ba"]).apply(null, arguments); + }; + var _Tanh = Module["_Tanh"] = function() { + return (_Tanh = Module["_Tanh"] = Module["asm"]["Ca"]).apply(null, arguments); + }; + var _Tile = Module["_Tile"] = function() { + return (_Tile = Module["_Tile"] = Module["asm"]["Da"]).apply(null, arguments); + }; + var _TopK = Module["_TopK"] = function() { + return (_TopK = Module["_TopK"] = Module["asm"]["Ea"]).apply(null, arguments); + }; + var _Transpose = Module["_Transpose"] = function() { + return (_Transpose = Module["_Transpose"] = Module["asm"]["Fa"]).apply(null, arguments); + }; + var __FusedMatMul = Module["__FusedMatMul"] = function() { + return (__FusedMatMul = Module["__FusedMatMul"] = Module["asm"]["Ga"]).apply(null, arguments); + }; + var _malloc = Module["_malloc"] = function() { + return (_malloc = Module["_malloc"] = Module["asm"]["Ha"]).apply(null, arguments); + }; + var _free = Module["_free"] = function() { + return (_free = Module["_free"] = Module["asm"]["Ia"]).apply(null, arguments); + }; + var stackSave = Module["stackSave"] = function() { + return (stackSave = Module["stackSave"] = Module["asm"]["Ja"]).apply(null, arguments); + }; + var stackRestore = Module["stackRestore"] = function() { + return (stackRestore = Module["stackRestore"] = Module["asm"]["Ka"]).apply(null, arguments); + }; + var stackAlloc = Module["stackAlloc"] = function() { + return (stackAlloc = Module["stackAlloc"] = Module["asm"]["La"]).apply(null, arguments); + }; + Module["cwrap"] = cwrap; + var calledRun; + function ExitStatus(status2) { + this.name = "ExitStatus"; + this.message = "Program terminated with exit(" + status2 + ")"; + this.status = status2; + } + dependenciesFulfilled = function runCaller() { + if (!calledRun) + run2(); + if (!calledRun) + dependenciesFulfilled = runCaller; + }; + function run2(args) { + args = args || arguments_; + if (runDependencies > 0) { + return; + } + preRun(); + if (runDependencies > 0) { + return; + } + function doRun() { + if (calledRun) + return; + calledRun = true; + Module["calledRun"] = true; + if (ABORT) + return; + initRuntime(); + preMain(); + readyPromiseResolve(Module); + if (Module["onRuntimeInitialized"]) + Module["onRuntimeInitialized"](); + postRun(); + } + if (Module["setStatus"]) { + Module["setStatus"]("Running..."); + setTimeout(function() { + setTimeout(function() { + Module["setStatus"](""); + }, 1); + doRun(); + }, 1); + } else { + doRun(); + } + } + Module["run"] = run2; + if (Module["preInit"]) { + if (typeof Module["preInit"] == "function") + Module["preInit"] = [Module["preInit"]]; + while (Module["preInit"].length > 0) { + Module["preInit"].pop()(); + } + } + run2(); + return WasmBackendModule2.ready; + }; + }(); + if (typeof exports === "object" && typeof module === "object") + module.exports = WasmBackendModule; + else if (typeof define === "function" && define["amd"]) + define([], function() { + return WasmBackendModule; + }); + else if (typeof exports === "object") + exports["WasmBackendModule"] = WasmBackendModule; +}); +var require_alea2 = __commonJS2((exports, module) => { + (function(global2, module2, define2) { + function Alea(seed) { + var me = this, mash = Mash(); + me.next = function() { + var t = 2091639 * me.s0 + me.c * 23283064365386963e-26; + me.s0 = me.s1; + me.s1 = me.s2; + return me.s2 = t - (me.c = t | 0); + }; + me.c = 1; + me.s0 = mash(" "); + me.s1 = mash(" "); + me.s2 = mash(" "); + me.s0 -= mash(seed); + if (me.s0 < 0) { + me.s0 += 1; + } + me.s1 -= mash(seed); + if (me.s1 < 0) { + me.s1 += 1; + } + me.s2 -= mash(seed); + if (me.s2 < 0) { + me.s2 += 1; + } + mash = null; + } + function copy(f, t) { + t.c = f.c; + t.s0 = f.s0; + t.s1 = f.s1; + t.s2 = f.s2; + return t; + } + function impl(seed, opts) { + var xg = new Alea(seed), state = opts && opts.state, prng = xg.next; + prng.int32 = function() { + return xg.next() * 4294967296 | 0; + }; + prng.double = function() { + return prng() + (prng() * 2097152 | 0) * 11102230246251565e-32; + }; + prng.quick = prng; + if (state) { + if (typeof state == "object") + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + function Mash() { + var n = 4022871197; + var mash = function(data2) { + data2 = String(data2); + for (var i = 0; i < data2.length; i++) { + n += data2.charCodeAt(i); + var h = 0.02519603282416938 * n; + n = h >>> 0; + h -= n; + h *= n; + n = h >>> 0; + h -= n; + n += h * 4294967296; + } + return (n >>> 0) * 23283064365386963e-26; + }; + return mash; + } + if (module2 && module2.exports) { + module2.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.alea = impl; + } + })(exports, typeof module == "object" && module, typeof define == "function" && define); +}); +var require_xor1282 = __commonJS2((exports, module) => { + (function(global2, module2, define2) { + function XorGen(seed) { + var me = this, strseed = ""; + me.x = 0; + me.y = 0; + me.z = 0; + me.w = 0; + me.next = function() { + var t = me.x ^ me.x << 11; + me.x = me.y; + me.y = me.z; + me.z = me.w; + return me.w ^= me.w >>> 19 ^ t ^ t >>> 8; + }; + if (seed === (seed | 0)) { + me.x = seed; + } else { + strseed += seed; + } + for (var k = 0; k < strseed.length + 64; k++) { + me.x ^= strseed.charCodeAt(k) | 0; + me.next(); + } + } + function copy(f, t) { + t.x = f.x; + t.y = f.y; + t.z = f.z; + t.w = f.w; + return t; + } + function impl(seed, opts) { + var xg = new XorGen(seed), state = opts && opts.state, prng = function() { + return (xg.next() >>> 0) / 4294967296; + }; + prng.double = function() { + do { + var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); + } while (result === 0); + return result; + }; + prng.int32 = xg.next; + prng.quick = prng; + if (state) { + if (typeof state == "object") + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + if (module2 && module2.exports) { + module2.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.xor128 = impl; + } + })(exports, typeof module == "object" && module, typeof define == "function" && define); +}); +var require_xorwow2 = __commonJS2((exports, module) => { + (function(global2, module2, define2) { + function XorGen(seed) { + var me = this, strseed = ""; + me.next = function() { + var t = me.x ^ me.x >>> 2; + me.x = me.y; + me.y = me.z; + me.z = me.w; + me.w = me.v; + return (me.d = me.d + 362437 | 0) + (me.v = me.v ^ me.v << 4 ^ (t ^ t << 1)) | 0; + }; + me.x = 0; + me.y = 0; + me.z = 0; + me.w = 0; + me.v = 0; + if (seed === (seed | 0)) { + me.x = seed; + } else { + strseed += seed; + } + for (var k = 0; k < strseed.length + 64; k++) { + me.x ^= strseed.charCodeAt(k) | 0; + if (k == strseed.length) { + me.d = me.x << 10 ^ me.x >>> 4; + } + me.next(); + } + } + function copy(f, t) { + t.x = f.x; + t.y = f.y; + t.z = f.z; + t.w = f.w; + t.v = f.v; + t.d = f.d; + return t; + } + function impl(seed, opts) { + var xg = new XorGen(seed), state = opts && opts.state, prng = function() { + return (xg.next() >>> 0) / 4294967296; + }; + prng.double = function() { + do { + var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); + } while (result === 0); + return result; + }; + prng.int32 = xg.next; + prng.quick = prng; + if (state) { + if (typeof state == "object") + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + if (module2 && module2.exports) { + module2.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.xorwow = impl; + } + })(exports, typeof module == "object" && module, typeof define == "function" && define); +}); +var require_xorshift72 = __commonJS2((exports, module) => { + (function(global2, module2, define2) { + function XorGen(seed) { + var me = this; + me.next = function() { + var X = me.x, i = me.i, t, v, w; + t = X[i]; + t ^= t >>> 7; + v = t ^ t << 24; + t = X[i + 1 & 7]; + v ^= t ^ t >>> 10; + t = X[i + 3 & 7]; + v ^= t ^ t >>> 3; + t = X[i + 4 & 7]; + v ^= t ^ t << 7; + t = X[i + 7 & 7]; + t = t ^ t << 13; + v ^= t ^ t << 9; + X[i] = v; + me.i = i + 1 & 7; + return v; + }; + function init2(me2, seed2) { + var j, w, X = []; + if (seed2 === (seed2 | 0)) { + w = X[0] = seed2; + } else { + seed2 = "" + seed2; + for (j = 0; j < seed2.length; ++j) { + X[j & 7] = X[j & 7] << 15 ^ seed2.charCodeAt(j) + X[j + 1 & 7] << 13; + } + } + while (X.length < 8) + X.push(0); + for (j = 0; j < 8 && X[j] === 0; ++j) + ; + if (j == 8) + w = X[7] = -1; + else + w = X[j]; + me2.x = X; + me2.i = 0; + for (j = 256; j > 0; --j) { + me2.next(); + } + } + init2(me, seed); + } + function copy(f, t) { + t.x = f.x.slice(); + t.i = f.i; + return t; + } + function impl(seed, opts) { + if (seed == null) + seed = +new Date(); + var xg = new XorGen(seed), state = opts && opts.state, prng = function() { + return (xg.next() >>> 0) / 4294967296; + }; + prng.double = function() { + do { + var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); + } while (result === 0); + return result; + }; + prng.int32 = xg.next; + prng.quick = prng; + if (state) { + if (state.x) + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + if (module2 && module2.exports) { + module2.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.xorshift7 = impl; + } + })(exports, typeof module == "object" && module, typeof define == "function" && define); +}); +var require_xor40962 = __commonJS2((exports, module) => { + (function(global2, module2, define2) { + function XorGen(seed) { + var me = this; + me.next = function() { + var w = me.w, X = me.X, i = me.i, t, v; + me.w = w = w + 1640531527 | 0; + v = X[i + 34 & 127]; + t = X[i = i + 1 & 127]; + v ^= v << 13; + t ^= t << 17; + v ^= v >>> 15; + t ^= t >>> 12; + v = X[i] = v ^ t; + me.i = i; + return v + (w ^ w >>> 16) | 0; + }; + function init2(me2, seed2) { + var t, v, i, j, w, X = [], limit = 128; + if (seed2 === (seed2 | 0)) { + v = seed2; + seed2 = null; + } else { + seed2 = seed2 + "\0"; + v = 0; + limit = Math.max(limit, seed2.length); + } + for (i = 0, j = -32; j < limit; ++j) { + if (seed2) + v ^= seed2.charCodeAt((j + 32) % seed2.length); + if (j === 0) + w = v; + v ^= v << 10; + v ^= v >>> 15; + v ^= v << 4; + v ^= v >>> 13; + if (j >= 0) { + w = w + 1640531527 | 0; + t = X[j & 127] ^= v + w; + i = t == 0 ? i + 1 : 0; + } + } + if (i >= 128) { + X[(seed2 && seed2.length || 0) & 127] = -1; + } + i = 127; + for (j = 4 * 128; j > 0; --j) { + v = X[i + 34 & 127]; + t = X[i = i + 1 & 127]; + v ^= v << 13; + t ^= t << 17; + v ^= v >>> 15; + t ^= t >>> 12; + X[i] = v ^ t; + } + me2.w = w; + me2.X = X; + me2.i = i; + } + init2(me, seed); + } + function copy(f, t) { + t.i = f.i; + t.w = f.w; + t.X = f.X.slice(); + return t; + } + ; + function impl(seed, opts) { + if (seed == null) + seed = +new Date(); + var xg = new XorGen(seed), state = opts && opts.state, prng = function() { + return (xg.next() >>> 0) / 4294967296; + }; + prng.double = function() { + do { + var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); + } while (result === 0); + return result; + }; + prng.int32 = xg.next; + prng.quick = prng; + if (state) { + if (state.X) + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + if (module2 && module2.exports) { + module2.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.xor4096 = impl; + } + })(exports, typeof module == "object" && module, typeof define == "function" && define); +}); +var require_tychei2 = __commonJS2((exports, module) => { + (function(global2, module2, define2) { + function XorGen(seed) { + var me = this, strseed = ""; + me.next = function() { + var b = me.b, c = me.c, d = me.d, a = me.a; + b = b << 25 ^ b >>> 7 ^ c; + c = c - d | 0; + d = d << 24 ^ d >>> 8 ^ a; + a = a - b | 0; + me.b = b = b << 20 ^ b >>> 12 ^ c; + me.c = c = c - d | 0; + me.d = d << 16 ^ c >>> 16 ^ a; + return me.a = a - b | 0; + }; + me.a = 0; + me.b = 0; + me.c = 2654435769 | 0; + me.d = 1367130551; + if (seed === Math.floor(seed)) { + me.a = seed / 4294967296 | 0; + me.b = seed | 0; + } else { + strseed += seed; + } + for (var k = 0; k < strseed.length + 20; k++) { + me.b ^= strseed.charCodeAt(k) | 0; + me.next(); + } + } + function copy(f, t) { + t.a = f.a; + t.b = f.b; + t.c = f.c; + t.d = f.d; + return t; + } + ; + function impl(seed, opts) { + var xg = new XorGen(seed), state = opts && opts.state, prng = function() { + return (xg.next() >>> 0) / 4294967296; + }; + prng.double = function() { + do { + var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); + } while (result === 0); + return result; + }; + prng.int32 = xg.next; + prng.quick = prng; + if (state) { + if (typeof state == "object") + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + if (module2 && module2.exports) { + module2.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.tychei = impl; + } + })(exports, typeof module == "object" && module, typeof define == "function" && define); +}); +var require_seedrandom3 = __commonJS2((exports, module) => { + (function(global2, pool3, math) { + var width = 256, chunks = 6, digits = 52, rngname = "random", startdenom = math.pow(width, chunks), significance = math.pow(2, digits), overflow = significance * 2, mask = width - 1, nodecrypto; + function seedrandom5(seed, options, callback) { + var key = []; + options = options == true ? {entropy: true} : options || {}; + var shortseed = mixkey(flatten4(options.entropy ? [seed, tostring(pool3)] : seed == null ? autoseed() : seed, 3), key); + var arc4 = new ARC4(key); + var prng = function() { + var n = arc4.g(chunks), d = startdenom, x = 0; + while (n < significance) { + n = (n + x) * width; + d *= width; + x = arc4.g(1); + } + while (n >= overflow) { + n /= 2; + d /= 2; + x >>>= 1; + } + return (n + x) / d; + }; + prng.int32 = function() { + return arc4.g(4) | 0; + }; + prng.quick = function() { + return arc4.g(4) / 4294967296; + }; + prng.double = prng; + mixkey(tostring(arc4.S), pool3); + return (options.pass || callback || function(prng2, seed2, is_math_call, state) { + if (state) { + if (state.S) { + copy(state, arc4); + } + prng2.state = function() { + return copy(arc4, {}); + }; + } + if (is_math_call) { + math[rngname] = prng2; + return seed2; + } else + return prng2; + })(prng, shortseed, "global" in options ? options.global : this == math, options.state); + } + function ARC4(key) { + var t, keylen = key.length, me = this, i = 0, j = me.i = me.j = 0, s = me.S = []; + if (!keylen) { + key = [keylen++]; + } + while (i < width) { + s[i] = i++; + } + for (i = 0; i < width; i++) { + s[i] = s[j = mask & j + key[i % keylen] + (t = s[i])]; + s[j] = t; + } + (me.g = function(count2) { + var t2, r = 0, i2 = me.i, j2 = me.j, s2 = me.S; + while (count2--) { + t2 = s2[i2 = mask & i2 + 1]; + r = r * width + s2[mask & (s2[i2] = s2[j2 = mask & j2 + t2]) + (s2[j2] = t2)]; + } + me.i = i2; + me.j = j2; + return r; + })(width); + } + function copy(f, t) { + t.i = f.i; + t.j = f.j; + t.S = f.S.slice(); + return t; + } + ; + function flatten4(obj, depth) { + var result = [], typ = typeof obj, prop; + if (depth && typ == "object") { + for (prop in obj) { + try { + result.push(flatten4(obj[prop], depth - 1)); + } catch (e) { + } + } + } + return result.length ? result : typ == "string" ? obj : obj + "\0"; + } + function mixkey(seed, key) { + var stringseed = seed + "", smear, j = 0; + while (j < stringseed.length) { + key[mask & j] = mask & (smear ^= key[mask & j] * 19) + stringseed.charCodeAt(j++); + } + return tostring(key); + } + function autoseed() { + try { + var out; + if (nodecrypto && (out = nodecrypto.randomBytes)) { + out = out(width); + } else { + out = new Uint8Array(width); + (global2.crypto || global2.msCrypto).getRandomValues(out); + } + return tostring(out); + } catch (e) { + var browser = global2.navigator, plugins = browser && browser.plugins; + return [+new Date(), global2, plugins, global2.screen, tostring(pool3)]; + } + } + function tostring(a) { + return String.fromCharCode.apply(0, a); + } + mixkey(math.random(), pool3); + if (typeof module == "object" && module.exports) { + module.exports = seedrandom5; + try { + nodecrypto = require_crypto(); + } catch (ex) { + } + } else if (typeof define == "function" && define.amd) { + define(function() { + return seedrandom5; + }); + } else { + math["seed" + rngname] = seedrandom5; + } + })(typeof self !== "undefined" ? self : exports, [], Math); +}); +var require_seedrandom4 = __commonJS2((exports, module) => { + var alea5 = require_alea2(); + var xor128 = require_xor1282(); + var xorwow = require_xorwow2(); + var xorshift7 = require_xorshift72(); + var xor4096 = require_xor40962(); + var tychei = require_tychei2(); + var sr = require_seedrandom3(); + sr.alea = alea5; + sr.xor128 = xor128; + sr.xorwow = xorwow; + sr.xorshift7 = xorshift7; + sr.xor4096 = xor4096; + sr.tychei = tychei; + module.exports = sr; +}); +var require_string_decoder = __commonJS2(() => { +}); +var version = "3.3.0"; +var version2 = "3.3.0"; +var version3 = "3.3.0"; +var version4 = "3.3.0"; +var version5 = "3.3.0"; +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +var EPSILON_FLOAT32 = 1e-7; +var EPSILON_FLOAT16 = 1e-4; +var DataStorage = class { + constructor(backend22, dataMover) { + this.backend = backend22; + this.dataMover = dataMover; + this.data = new WeakMap(); + this.dataIdsCount = 0; + } + get(dataId) { + if (!this.data.has(dataId)) { + this.dataMover.moveData(this.backend, dataId); + } + return this.data.get(dataId); + } + set(dataId, value) { + this.dataIdsCount++; + this.data.set(dataId, value); + } + has(dataId) { + return this.data.has(dataId); + } + delete(dataId) { + this.dataIdsCount--; + return this.data.delete(dataId); + } + numDataIds() { + return this.dataIdsCount; + } +}; +var KernelBackend = class { + refCount(dataId) { + return notYetImplemented("refCount"); + } + incRef(dataId) { + return notYetImplemented("incRef"); + } + timerAvailable() { + return true; + } + time(f) { + return notYetImplemented("time"); + } + read(dataId) { + return notYetImplemented("read"); + } + readSync(dataId) { + return notYetImplemented("readSync"); + } + numDataIds() { + return notYetImplemented("numDataIds"); + } + disposeData(dataId, force) { + return notYetImplemented("disposeData"); + } + write(values, shape, dtype) { + return notYetImplemented("write"); + } + move(dataId, values, shape, dtype, refCount) { + return notYetImplemented("move"); + } + memory() { + return notYetImplemented("memory"); + } + floatPrecision() { + return notYetImplemented("floatPrecision"); + } + epsilon() { + return this.floatPrecision() === 32 ? EPSILON_FLOAT32 : EPSILON_FLOAT16; + } + dispose() { + return notYetImplemented("dispose"); + } +}; +function notYetImplemented(kernelName) { + throw new Error(`'${kernelName}' not yet implemented or not found in the registry. This kernel may not be supported by the tfjs backend you have chosen`); +} +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function shuffle(array2) { + let counter = array2.length; + let temp = 0; + let index = 0; + while (counter > 0) { + index = Math.random() * counter | 0; + counter--; + temp = array2[counter]; + array2[counter] = array2[index]; + array2[index] = temp; + } +} +function shuffleCombo(array2, array22) { + if (array2.length !== array22.length) { + throw new Error(`Array sizes must match to be shuffled together First array length was ${array2.length}Second array length was ${array22.length}`); + } + let counter = array2.length; + let temp, temp2; + let index = 0; + while (counter > 0) { + index = Math.random() * counter | 0; + counter--; + temp = array2[counter]; + temp2 = array22[counter]; + array2[counter] = array2[index]; + array22[counter] = array22[index]; + array2[index] = temp; + array22[index] = temp2; + } +} +function clamp(min6, x, max6) { + return Math.max(min6, Math.min(x, max6)); +} +function nearestLargerEven(val) { + return val % 2 === 0 ? val : val + 1; +} +function sum(arr) { + let sum6 = 0; + for (let i = 0; i < arr.length; i++) { + sum6 += arr[i]; + } + return sum6; +} +function randUniform(a, b) { + const r = Math.random(); + return b * r + (1 - r) * a; +} +function distSquared(a, b) { + let result = 0; + for (let i = 0; i < a.length; i++) { + const diff = Number(a[i]) - Number(b[i]); + result += diff * diff; + } + return result; +} +function assert(expr, msg) { + if (!expr) { + throw new Error(typeof msg === "string" ? msg : msg()); + } +} +function assertShapesMatch(shapeA, shapeB, errorMessagePrefix = "") { + assert(arraysEqual(shapeA, shapeB), () => errorMessagePrefix + ` Shapes ${shapeA} and ${shapeB} must match`); +} +function assertNonNull(a) { + assert(a != null, () => `The input to the tensor constructor must be a non-null value.`); +} +function flatten(arr, result = [], skipTypedArray = false) { + if (result == null) { + result = []; + } + if (Array.isArray(arr) || isTypedArray(arr) && !skipTypedArray) { + for (let i = 0; i < arr.length; ++i) { + flatten(arr[i], result, skipTypedArray); + } + } else { + result.push(arr); + } + return result; +} +function sizeFromShape(shape) { + if (shape.length === 0) { + return 1; + } + let size = shape[0]; + for (let i = 1; i < shape.length; i++) { + size *= shape[i]; + } + return size; +} +function isScalarShape(shape) { + return shape.length === 0; +} +function arraysEqual(n1, n2) { + if (n1 === n2) { + return true; + } + if (n1 == null || n2 == null) { + return false; + } + if (n1.length !== n2.length) { + return false; + } + for (let i = 0; i < n1.length; i++) { + if (n1[i] !== n2[i]) { + return false; + } + } + return true; +} +function isInt(a) { + return a % 1 === 0; +} +function tanh(x) { + if (Math.tanh != null) { + return Math.tanh(x); + } + if (x === Infinity) { + return 1; + } else if (x === -Infinity) { + return -1; + } else { + const e2x = Math.exp(2 * x); + return (e2x - 1) / (e2x + 1); + } +} +function sizeToSquarishShape(size) { + const width = Math.ceil(Math.sqrt(size)); + return [width, Math.ceil(size / width)]; +} +function createShuffledIndices(n) { + const shuffledIndices = new Uint32Array(n); + for (let i = 0; i < n; ++i) { + shuffledIndices[i] = i; + } + shuffle(shuffledIndices); + return shuffledIndices; +} +function rightPad(a, size) { + if (size <= a.length) { + return a; + } + return a + " ".repeat(size - a.length); +} +function repeatedTry(checkFn, delayFn = (counter) => 0, maxCounter) { + return new Promise((resolve, reject) => { + let tryCount = 0; + const tryFn = () => { + if (checkFn()) { + resolve(); + return; + } + tryCount++; + const nextBackoff = delayFn(tryCount); + if (maxCounter != null && tryCount >= maxCounter) { + reject(); + return; + } + setTimeout(tryFn, nextBackoff); + }; + tryFn(); + }); +} +function inferFromImplicitShape(shape, size) { + let shapeProd = 1; + let implicitIdx = -1; + for (let i = 0; i < shape.length; ++i) { + if (shape[i] >= 0) { + shapeProd *= shape[i]; + } else if (shape[i] === -1) { + if (implicitIdx !== -1) { + throw Error(`Shapes can only have 1 implicit size. Found -1 at dim ${implicitIdx} and dim ${i}`); + } + implicitIdx = i; + } else if (shape[i] < 0) { + throw Error(`Shapes can not be < 0. Found ${shape[i]} at dim ${i}`); + } + } + if (implicitIdx === -1) { + if (size > 0 && size !== shapeProd) { + throw Error(`Size(${size}) must match the product of shape ${shape}`); + } + return shape; + } + if (shapeProd === 0) { + throw Error(`Cannot infer the missing size in [${shape}] when there are 0 elements`); + } + if (size % shapeProd !== 0) { + throw Error(`The implicit shape can't be a fractional number. Got ${size} / ${shapeProd}`); + } + const newShape = shape.slice(); + newShape[implicitIdx] = size / shapeProd; + return newShape; +} +function parseAxisParam(axis, shape) { + const rank = shape.length; + axis = axis == null ? shape.map((s, i) => i) : [].concat(axis); + assert(axis.every((ax) => ax >= -rank && ax < rank), () => `All values in axis param must be in range [-${rank}, ${rank}) but got axis ${axis}`); + assert(axis.every((ax) => isInt(ax)), () => `All values in axis param must be integers but got axis ${axis}`); + return axis.map((a) => a < 0 ? rank + a : a); +} +function squeezeShape(shape, axis) { + const newShape = []; + const keptDims = []; + const isEmptyArray = axis != null && Array.isArray(axis) && axis.length === 0; + const axes = axis == null || isEmptyArray ? null : parseAxisParam(axis, shape).sort(); + let j = 0; + for (let i = 0; i < shape.length; ++i) { + if (axes != null) { + if (axes[j] === i && shape[i] !== 1) { + throw new Error(`Can't squeeze axis ${i} since its dim '${shape[i]}' is not 1`); + } + if ((axes[j] == null || axes[j] > i) && shape[i] === 1) { + newShape.push(shape[i]); + keptDims.push(i); + } + if (axes[j] <= i) { + j++; + } + } + if (shape[i] !== 1) { + newShape.push(shape[i]); + keptDims.push(i); + } + } + return {newShape, keptDims}; +} +function getTypedArrayFromDType(dtype, size) { + let values = null; + if (dtype == null || dtype === "float32") { + values = new Float32Array(size); + } else if (dtype === "int32") { + values = new Int32Array(size); + } else if (dtype === "bool") { + values = new Uint8Array(size); + } else { + throw new Error(`Unknown data type ${dtype}`); + } + return values; +} +function getArrayFromDType(dtype, size) { + let values = null; + if (dtype == null || dtype === "float32") { + values = new Float32Array(size); + } else if (dtype === "int32") { + values = new Int32Array(size); + } else if (dtype === "bool") { + values = new Uint8Array(size); + } else if (dtype === "string") { + values = new Array(size); + } else { + throw new Error(`Unknown data type ${dtype}`); + } + return values; +} +function checkConversionForErrors(vals, dtype) { + for (let i = 0; i < vals.length; i++) { + const num = vals[i]; + if (isNaN(num) || !isFinite(num)) { + throw Error(`A tensor of type ${dtype} being uploaded contains ${num}.`); + } + } +} +function isValidDtype(dtype) { + return dtype === "bool" || dtype === "complex64" || dtype === "float32" || dtype === "int32" || dtype === "string"; +} +function hasEncodingLoss(oldType, newType) { + if (newType === "complex64") { + return false; + } + if (newType === "float32" && oldType !== "complex64") { + return false; + } + if (newType === "int32" && oldType !== "float32" && oldType !== "complex64") { + return false; + } + if (newType === "bool" && oldType === "bool") { + return false; + } + return true; +} +function isTypedArray(a) { + return a instanceof Float32Array || a instanceof Int32Array || a instanceof Uint8Array; +} +function bytesPerElement(dtype) { + if (dtype === "float32" || dtype === "int32") { + return 4; + } else if (dtype === "complex64") { + return 8; + } else if (dtype === "bool") { + return 1; + } else { + throw new Error(`Unknown dtype ${dtype}`); + } +} +function bytesFromStringArray(arr) { + if (arr == null) { + return 0; + } + let bytes = 0; + arr.forEach((x) => bytes += x.length); + return bytes; +} +function isString(value) { + return typeof value === "string" || value instanceof String; +} +function isBoolean(value) { + return typeof value === "boolean"; +} +function isNumber(value) { + return typeof value === "number"; +} +function inferDtype(values) { + if (Array.isArray(values)) { + return inferDtype(values[0]); + } + if (values instanceof Float32Array) { + return "float32"; + } else if (values instanceof Int32Array || values instanceof Uint8Array) { + return "int32"; + } else if (isNumber(values)) { + return "float32"; + } else if (isString(values)) { + return "string"; + } else if (isBoolean(values)) { + return "bool"; + } + return "float32"; +} +function isFunction(f) { + return !!(f && f.constructor && f.call && f.apply); +} +function nearestDivisor(size, start) { + for (let i = start; i < size; ++i) { + if (size % i === 0) { + return i; + } + } + return size; +} +function computeStrides(shape) { + const rank = shape.length; + if (rank < 2) { + return []; + } + const strides = new Array(rank - 1); + strides[rank - 2] = shape[rank - 1]; + for (let i = rank - 3; i >= 0; --i) { + strides[i] = strides[i + 1] * shape[i + 1]; + } + return strides; +} +function createNestedArray(offset, shape, a) { + const ret = new Array(); + if (shape.length === 1) { + const d = shape[0]; + for (let i = 0; i < d; i++) { + ret[i] = a[offset + i]; + } + } else { + const d = shape[0]; + const rest = shape.slice(1); + const len = rest.reduce((acc, c) => acc * c); + for (let i = 0; i < d; i++) { + ret[i] = createNestedArray(offset + i * len, rest, a); + } + } + return ret; +} +function toNestedArray(shape, a) { + if (shape.length === 0) { + return a[0]; + } + const size = shape.reduce((acc, c) => acc * c); + if (size === 0) { + return []; + } + if (size !== a.length) { + throw new Error(`[${shape}] does not match the input size ${a.length}.`); + } + return createNestedArray(0, shape, a); +} +function makeOnesTypedArray(size, dtype) { + const array2 = makeZerosTypedArray(size, dtype); + for (let i = 0; i < array2.length; i++) { + array2[i] = 1; + } + return array2; +} +function makeZerosTypedArray(size, dtype) { + if (dtype == null || dtype === "float32" || dtype === "complex64") { + return new Float32Array(size); + } else if (dtype === "int32") { + return new Int32Array(size); + } else if (dtype === "bool") { + return new Uint8Array(size); + } else { + throw new Error(`Unknown data type ${dtype}`); + } +} +function makeZerosNestedTypedArray(shape, dtype) { + const size = shape.reduce((prev, curr) => prev * curr, 1); + if (dtype == null || dtype === "float32") { + return toNestedArray(shape, new Float32Array(size)); + } else if (dtype === "int32") { + return toNestedArray(shape, new Int32Array(size)); + } else if (dtype === "bool") { + return toNestedArray(shape, new Uint8Array(size)); + } else { + throw new Error(`Unknown data type ${dtype}`); + } +} +function assertNonNegativeIntegerDimensions(shape) { + shape.forEach((dimSize) => { + assert(Number.isInteger(dimSize) && dimSize >= 0, () => `Tensor must have a shape comprised of positive integers but got shape [${shape}].`); + }); +} +function locToIndex(locs, rank, strides) { + if (rank === 0) { + return 0; + } else if (rank === 1) { + return locs[0]; + } + let index = locs[locs.length - 1]; + for (let i = 0; i < locs.length - 1; ++i) { + index += strides[i] * locs[i]; + } + return index; +} +function indexToLoc(index, rank, strides) { + if (rank === 0) { + return []; + } else if (rank === 1) { + return [index]; + } + const locs = new Array(rank); + for (let i = 0; i < locs.length - 1; ++i) { + locs[i] = Math.floor(index / strides[i]); + index -= locs[i] * strides[i]; + } + locs[locs.length - 1] = index; + return locs; +} +function isPromise(object2) { + return object2 && object2.then && typeof object2.then === "function"; +} +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +var TENSORFLOWJS_FLAGS_PREFIX = "tfjsflags"; +var Environment = class { + constructor(global2) { + this.global = global2; + this.flags = {}; + this.flagRegistry = {}; + this.urlFlags = {}; + this.populateURLFlags(); + } + setPlatform(platformName, platform) { + if (this.platform != null) { + console.warn(`Platform ${this.platformName} has already been set. Overwriting the platform with ${platform}.`); + } + this.platformName = platformName; + this.platform = platform; + } + registerFlag(flagName, evaluationFn, setHook) { + this.flagRegistry[flagName] = {evaluationFn, setHook}; + if (this.urlFlags[flagName] != null) { + const flagValue = this.urlFlags[flagName]; + console.warn(`Setting feature override from URL ${flagName}: ${flagValue}.`); + this.set(flagName, flagValue); + } + } + async getAsync(flagName) { + if (flagName in this.flags) { + return this.flags[flagName]; + } + this.flags[flagName] = await this.evaluateFlag(flagName); + return this.flags[flagName]; + } + get(flagName) { + if (flagName in this.flags) { + return this.flags[flagName]; + } + const flagValue = this.evaluateFlag(flagName); + if (isPromise(flagValue)) { + throw new Error(`Flag ${flagName} cannot be synchronously evaluated. Please use getAsync() instead.`); + } + this.flags[flagName] = flagValue; + return this.flags[flagName]; + } + getNumber(flagName) { + return this.get(flagName); + } + getBool(flagName) { + return this.get(flagName); + } + getFlags() { + return this.flags; + } + get features() { + return this.flags; + } + set(flagName, value) { + if (this.flagRegistry[flagName] == null) { + throw new Error(`Cannot set flag ${flagName} as it has not been registered.`); + } + this.flags[flagName] = value; + if (this.flagRegistry[flagName].setHook != null) { + this.flagRegistry[flagName].setHook(value); + } + } + evaluateFlag(flagName) { + if (this.flagRegistry[flagName] == null) { + throw new Error(`Cannot evaluate flag '${flagName}': no evaluation function found.`); + } + return this.flagRegistry[flagName].evaluationFn(); + } + setFlags(flags) { + this.flags = Object.assign({}, flags); + } + reset() { + this.flags = {}; + this.urlFlags = {}; + this.populateURLFlags(); + } + populateURLFlags() { + if (typeof this.global === "undefined" || typeof this.global.location === "undefined" || typeof this.global.location.search === "undefined") { + return; + } + const urlParams = getQueryParams(this.global.location.search); + if (TENSORFLOWJS_FLAGS_PREFIX in urlParams) { + const keyValues = urlParams[TENSORFLOWJS_FLAGS_PREFIX].split(","); + keyValues.forEach((keyValue) => { + const [key, value] = keyValue.split(":"); + this.urlFlags[key] = parseValue(key, value); + }); + } + } +}; +function getQueryParams(queryString) { + const params = {}; + queryString.replace(/[?&]([^=?&]+)(?:=([^&]*))?/g, (s, ...t) => { + decodeParam(params, t[0], t[1]); + return t.join("="); + }); + return params; +} +function decodeParam(params, name, value) { + params[decodeURIComponent(name)] = decodeURIComponent(value || ""); +} +function parseValue(flagName, value) { + value = value.toLowerCase(); + if (value === "true" || value === "false") { + return value === "true"; + } else if (`${+value}` === value) { + return +value; + } + throw new Error(`Could not parse value flag value ${value} for flag ${flagName}.`); +} +function env() { + return ENV; +} +var ENV = null; +function setEnvironmentGlobal(environment) { + ENV = environment; +} +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +var globalNameSpace; +function getGlobalNamespace() { + if (globalNameSpace == null) { + let ns; + if (typeof window !== "undefined") { + ns = window; + } else if (typeof global !== "undefined") { + ns = global; + } else if (typeof process !== "undefined") { + ns = process; + } else if (typeof self !== "undefined") { + ns = self; + } else { + throw new Error("Could not find a global object"); + } + globalNameSpace = ns; + } + return globalNameSpace; +} +function getGlobalMap() { + const ns = getGlobalNamespace(); + if (ns._tfGlobals == null) { + ns._tfGlobals = new Map(); + } + return ns._tfGlobals; +} +function getGlobal(key, init2) { + const globalMap = getGlobalMap(); + if (globalMap.has(key)) { + return globalMap.get(key); + } else { + const singleton = init2(); + globalMap.set(key, singleton); + return globalMap.get(key); + } +} +var Abs = "Abs"; +var Acos = "Acos"; +var Acosh = "Acosh"; +var Add = "Add"; +var AddN = "AddN"; +var All = "All"; +var Any = "Any"; +var ArgMax = "ArgMax"; +var ArgMin = "ArgMin"; +var Asin = "Asin"; +var Asinh = "Asinh"; +var Atan = "Atan"; +var Atanh = "Atanh"; +var Atan2 = "Atan2"; +var AvgPool = "AvgPool"; +var AvgPoolGrad = "AvgPoolGrad"; +var AvgPool3D = "AvgPool3D"; +var AvgPool3DGrad = "AvgPool3DGrad"; +var BatchMatMul = "BatchMatMul"; +var BatchToSpaceND = "BatchToSpaceND"; +var Bincount = "Bincount"; +var BroadcastTo = "BroadcastTo"; +var Cast = "Cast"; +var Ceil = "Ceil"; +var ClipByValue = "ClipByValue"; +var Complex = "Complex"; +var ComplexAbs = "ComplexAbs"; +var Concat = "Concat"; +var Conv2D = "Conv2D"; +var Conv2DBackpropFilter = "Conv2DBackpropFilter"; +var Conv2DBackpropInput = "Conv2DBackpropInput"; +var Conv3D = "Conv3D"; +var Conv3DBackpropFilterV2 = "Conv3DBackpropFilterV2"; +var Conv3DBackpropInputV2 = "Conv3DBackpropInputV2"; +var Cos = "Cos"; +var Cosh = "Cosh"; +var Cumsum = "Cumsum"; +var CropAndResize = "CropAndResize"; +var DenseBincount = "DenseBincount"; +var DepthToSpace = "DepthToSpace"; +var DepthwiseConv2dNative = "DepthwiseConv2dNative"; +var DepthwiseConv2dNativeBackpropFilter = "DepthwiseConv2dNativeBackpropFilter"; +var DepthwiseConv2dNativeBackpropInput = "DepthwiseConv2dNativeBackpropInput"; +var Diag = "Diag"; +var Dilation2D = "Dilation2D"; +var Dilation2DBackpropInput = "Dilation2DBackpropInput"; +var Dilation2DBackpropFilter = "Dilation2DBackpropFilter"; +var RealDiv = "RealDiv"; +var Elu = "Elu"; +var EluGrad = "EluGrad"; +var Erf = "Erf"; +var Equal = "Equal"; +var Exp = "Exp"; +var ExpandDims = "ExpandDims"; +var Expm1 = "Expm1"; +var FFT = "FFT"; +var Fill = "Fill"; +var FlipLeftRight = "FlipLeftRight"; +var Floor = "Floor"; +var FloorDiv = "FloorDiv"; +var FusedBatchNorm = "FusedBatchNorm"; +var GatherV2 = "GatherV2"; +var GatherNd = "GatherNd"; +var Greater = "Greater"; +var GreaterEqual = "GreaterEqual"; +var Identity = "Identity"; +var IFFT = "IFFT"; +var Imag = "Imag"; +var IsFinite = "IsFinite"; +var IsInf = "IsInf"; +var IsNan = "IsNan"; +var LeakyRelu = "LeakyRelu"; +var Less = "Less"; +var LessEqual = "LessEqual"; +var LinSpace = "LinSpace"; +var Log = "Log"; +var Log1p = "Log1p"; +var LogicalAnd = "LogicalAnd"; +var LogicalNot = "LogicalNot"; +var LogicalOr = "LogicalOr"; +var LogSoftmax = "LogSoftmax"; +var LRN = "LRN"; +var LRNGrad = "LRNGrad"; +var Max = "Max"; +var Maximum = "Maximum"; +var MaxPool = "MaxPool"; +var MaxPoolGrad = "MaxPoolGrad"; +var MaxPool3D = "MaxPool3D"; +var MaxPool3DGrad = "MaxPool3DGrad"; +var MaxPoolWithArgmax = "MaxPoolWithArgmax"; +var Mean = "Mean"; +var Min = "Min"; +var Minimum = "Minimum"; +var MirrorPad = "MirrorPad"; +var Mod = "Mod"; +var Multinomial = "Multinomial"; +var Multiply = "Multiply"; +var Neg = "Neg"; +var NotEqual = "NotEqual"; +var NonMaxSuppressionV3 = "NonMaxSuppressionV3"; +var NonMaxSuppressionV4 = "NonMaxSuppressionV4"; +var NonMaxSuppressionV5 = "NonMaxSuppressionV5"; +var OnesLike = "OnesLike"; +var OneHot = "OneHot"; +var Pack = "Pack"; +var PadV2 = "PadV2"; +var Pool = "Pool"; +var Pow = "Pow"; +var Prelu = "Prelu"; +var Prod = "Prod"; +var Range = "Range"; +var Real = "Real"; +var Reciprocal = "Reciprocal"; +var Relu = "Relu"; +var Reshape = "Reshape"; +var ResizeNearestNeighbor = "ResizeNearestNeighbor"; +var ResizeNearestNeighborGrad = "ResizeNearestNeighborGrad"; +var ResizeBilinear = "ResizeBilinear"; +var ResizeBilinearGrad = "ResizeBilinearGrad"; +var Relu6 = "Relu6"; +var Reverse = "Reverse"; +var Round = "Round"; +var Rsqrt = "Rsqrt"; +var ScatterNd = "ScatterNd"; +var Select = "Select"; +var Selu = "Selu"; +var Slice = "Slice"; +var Sin = "Sin"; +var Sinh = "Sinh"; +var Sign = "Sign"; +var Sigmoid = "Sigmoid"; +var Softplus = "Softplus"; +var Sqrt = "Sqrt"; +var Sum = "Sum"; +var SpaceToBatchND = "SpaceToBatchND"; +var SplitV = "SplitV"; +var Softmax = "Softmax"; +var SquaredDifference = "SquaredDifference"; +var Square = "Square"; +var Sub = "Sub"; +var SparseToDense = "SparseToDense"; +var StridedSlice = "StridedSlice"; +var Tan = "Tan"; +var Tanh = "Tanh"; +var Tile = "Tile"; +var TopK = "TopK"; +var Transform = "Transform"; +var Transpose = "Transpose"; +var Unique = "Unique"; +var Unpack = "Unpack"; +var UnsortedSegmentSum = "UnsortedSegmentSum"; +var ZerosLike = "ZerosLike"; +var Step = "Step"; +var FromPixels = "FromPixels"; +var RotateWithOffset = "RotateWithOffset"; +var _FusedMatMul = "_FusedMatMul"; +var FusedConv2D = "FusedConv2D"; +var FusedDepthwiseConv2D = "FusedDepthwiseConv2D"; +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +var kernelRegistry = getGlobal("kernelRegistry", () => new Map()); +var gradRegistry = getGlobal("gradRegistry", () => new Map()); +function getKernel(kernelName, backendName) { + const key = makeKey(kernelName, backendName); + return kernelRegistry.get(key); +} +function getGradient(kernelName) { + return gradRegistry.get(kernelName); +} +function getKernelsForBackend(backendName) { + const it = kernelRegistry.entries(); + const result = []; + while (true) { + const {done, value} = it.next(); + if (done) { + break; + } + const [key, config3] = value; + const [backend22] = key.split("_"); + if (backend22 === backendName) { + result.push(config3); + } + } + return result; +} +function registerKernel(config3) { + const {kernelName, backendName} = config3; + const key = makeKey(kernelName, backendName); + if (kernelRegistry.has(key)) { + console.warn(`The kernel '${kernelName}' for backend '${backendName}' is already registered`); + } + kernelRegistry.set(key, config3); +} +function registerGradient(config3) { + const {kernelName} = config3; + if (gradRegistry.has(kernelName)) { + if (env().getBool("DEBUG")) { + console.warn(`Overriding the gradient for '${kernelName}'`); + } + } + gradRegistry.set(kernelName, config3); +} +function unregisterKernel(kernelName, backendName) { + const key = makeKey(kernelName, backendName); + if (!kernelRegistry.has(key)) { + throw new Error(`The kernel '${kernelName}' for backend '${backendName}' is not registered`); + } + kernelRegistry.delete(key); +} +function unregisterGradient(kernelName) { + if (!gradRegistry.has(kernelName)) { + throw new Error(`The gradient '${kernelName}' for backend is not registered`); + } + gradRegistry.delete(kernelName); +} +function copyRegisteredKernels(registeredBackendName, newBackendName) { + const kernels = getKernelsForBackend(registeredBackendName); + kernels.forEach((kernelConfig) => { + const newKernelConfig = Object.assign({}, kernelConfig, {backendName: newBackendName}); + registerKernel(newKernelConfig); + }); +} +function makeKey(kernelName, backendName) { + return `${backendName}_${kernelName}`; +} +var util_exports = {}; +__export2(util_exports, { + arraysEqual: () => arraysEqual, + assert: () => assert, + assertNonNegativeIntegerDimensions: () => assertNonNegativeIntegerDimensions, + assertNonNull: () => assertNonNull, + assertShapesMatch: () => assertShapesMatch, + bytesFromStringArray: () => bytesFromStringArray, + bytesPerElement: () => bytesPerElement, + checkConversionForErrors: () => checkConversionForErrors, + clamp: () => clamp, + computeStrides: () => computeStrides, + createScalarValue: () => createScalarValue, + createShuffledIndices: () => createShuffledIndices, + decodeString: () => decodeString, + distSquared: () => distSquared, + encodeString: () => encodeString, + fetch: () => fetch2, + flatten: () => flatten, + getArrayFromDType: () => getArrayFromDType, + getTypedArrayFromDType: () => getTypedArrayFromDType, + hasEncodingLoss: () => hasEncodingLoss, + indexToLoc: () => indexToLoc, + inferDtype: () => inferDtype, + inferFromImplicitShape: () => inferFromImplicitShape, + isBoolean: () => isBoolean, + isFunction: () => isFunction, + isInt: () => isInt, + isNumber: () => isNumber, + isPromise: () => isPromise, + isScalarShape: () => isScalarShape, + isString: () => isString, + isTypedArray: () => isTypedArray, + isValidDtype: () => isValidDtype, + locToIndex: () => locToIndex, + makeOnesTypedArray: () => makeOnesTypedArray, + makeZerosNestedTypedArray: () => makeZerosNestedTypedArray, + makeZerosTypedArray: () => makeZerosTypedArray, + nearestDivisor: () => nearestDivisor, + nearestLargerEven: () => nearestLargerEven, + now: () => now2, + parseAxisParam: () => parseAxisParam, + randUniform: () => randUniform, + repeatedTry: () => repeatedTry, + rightPad: () => rightPad, + shuffle: () => shuffle, + shuffleCombo: () => shuffleCombo, + sizeFromShape: () => sizeFromShape, + sizeToSquarishShape: () => sizeToSquarishShape, + squeezeShape: () => squeezeShape, + sum: () => sum, + tanh: () => tanh, + toNestedArray: () => toNestedArray, + toTypedArray: () => toTypedArray +}); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function createScalarValue(value, dtype) { + if (dtype === "string") { + return encodeString(value); + } + return toTypedArray([value], dtype); +} +function noConversionNeeded(a, dtype) { + return a instanceof Float32Array && dtype === "float32" || a instanceof Int32Array && dtype === "int32" || a instanceof Uint8Array && dtype === "bool"; +} +function toTypedArray(a, dtype) { + if (dtype === "string") { + throw new Error("Cannot convert a string[] to a TypedArray"); + } + if (Array.isArray(a)) { + a = flatten(a); + } + if (env().getBool("DEBUG")) { + checkConversionForErrors(a, dtype); + } + if (noConversionNeeded(a, dtype)) { + return a; + } + if (dtype == null || dtype === "float32" || dtype === "complex64") { + return new Float32Array(a); + } else if (dtype === "int32") { + return new Int32Array(a); + } else if (dtype === "bool") { + const bool = new Uint8Array(a.length); + for (let i = 0; i < bool.length; ++i) { + if (Math.round(a[i]) !== 0) { + bool[i] = 1; + } + } + return bool; + } else { + throw new Error(`Unknown data type ${dtype}`); + } +} +function now2() { + return env().platform.now(); +} +function fetch2(path, requestInits) { + return env().platform.fetch(path, requestInits); +} +function encodeString(s, encoding = "utf-8") { + encoding = encoding || "utf-8"; + return env().platform.encode(s, encoding); +} +function decodeString(bytes, encoding = "utf-8") { + encoding = encoding || "utf-8"; + return env().platform.decode(bytes, encoding); +} +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +var Profiler = class { + constructor(backendTimer, logger) { + this.backendTimer = backendTimer; + this.logger = logger; + if (logger == null) { + this.logger = new Logger(); + } + } + profileKernel(kernelName, inputs, f) { + let outputs; + const holdResultWrapperFn = () => { + outputs = f(); + }; + let timer; + const start = now2(); + if (this.backendTimer.timerAvailable()) { + timer = this.backendTimer.time(holdResultWrapperFn); + } else { + holdResultWrapperFn(); + for (const output of outputs) { + output.dataSync(); + } + timer = Promise.resolve({kernelMs: now2() - start}); + } + if (env().getBool("CHECK_COMPUTATION_FOR_ERRORS")) { + for (let i = 0; i < outputs.length; i++) { + const output = outputs[i]; + output.data().then((tensorVals) => { + checkComputationForErrors(tensorVals, output.dtype, kernelName); + }); + } + } + const kernelProfile = { + kernelName, + outputs, + inputs, + timeMs: timer.then((timing) => timing.kernelMs), + extraInfo: timer.then((timing) => timing.getExtraProfileInfo != null ? timing.getExtraProfileInfo() : "") + }; + return kernelProfile; + } + logKernelProfile(kernelProfile) { + const {kernelName, outputs, timeMs, inputs, extraInfo} = kernelProfile; + outputs.forEach((result) => { + Promise.all([result.data(), timeMs, extraInfo]).then((valueContainer) => { + this.logger.logKernelProfile(kernelName, result, valueContainer[0], valueContainer[1], inputs, valueContainer[2]); + }); + }); + } +}; +function checkComputationForErrors(vals, dtype, kernelName) { + if (dtype !== "float32") { + return false; + } + for (let i = 0; i < vals.length; i++) { + const num = vals[i]; + if (isNaN(num) || !isFinite(num)) { + console.warn(`Found ${num} in the result of '${kernelName}'`); + return true; + } + } + return false; +} +var Logger = class { + logKernelProfile(name, result, vals, timeMs, inputs, extraInfo) { + const time2 = typeof timeMs === "number" ? rightPad(`${timeMs}ms`, 9) : timeMs["error"]; + const paddedName = rightPad(name, 25); + const rank = result.rank; + const size = result.size; + const shape = rightPad(result.shape.toString(), 14); + let inputShapesDescription = ""; + for (const name2 in inputs) { + const input2 = inputs[name2]; + if (input2 != null) { + const inputShape = input2.shape || result.shape; + const inputRank = inputShape.length; + inputShapesDescription += `${name2}: ${inputRank}D ${inputRank > 0 ? inputShape : ""} `; + } + } + console.log(`%c${paddedName} %c${time2} %c${rank}D ${shape} %c${size} %c${inputShapesDescription} %c${extraInfo}`, "font-weight:bold", "color:red", "color:blue", "color: orange", "color: green", "color: steelblue"); + } +}; +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function getFilteredNodesXToY(tape, xs, y) { + const tensorsFromX = {}; + const nodesFromX = {}; + for (let i = 0; i < xs.length; i++) { + tensorsFromX[xs[i].id] = true; + } + for (let i = 0; i < tape.length; i++) { + const node = tape[i]; + const nodeInputs = node.inputs; + for (const inputName in nodeInputs) { + const input2 = nodeInputs[inputName]; + let anyInputFromX = false; + for (let j = 0; j < xs.length; j++) { + if (tensorsFromX[input2.id]) { + node.outputs.forEach((output) => tensorsFromX[output.id] = true); + anyInputFromX = true; + nodesFromX[node.id] = true; + break; + } + } + if (anyInputFromX) { + break; + } + } + } + const tensorsLeadToY = {}; + tensorsLeadToY[y.id] = true; + const nodesToY = {}; + for (let i = tape.length - 1; i >= 0; i--) { + const node = tape[i]; + const nodeInputs = node.inputs; + for (let j = 0; j < node.outputs.length; j++) { + if (tensorsLeadToY[node.outputs[j].id]) { + for (const inputName in nodeInputs) { + tensorsLeadToY[nodeInputs[inputName].id] = true; + nodesToY[node.id] = true; + } + break; + } + } + } + const filteredTape = []; + for (let i = 0; i < tape.length; i++) { + const node = tape[i]; + if (nodesFromX[node.id] && nodesToY[node.id]) { + const prunedInputs = {}; + for (const inputName in node.inputs) { + const nodeInput = node.inputs[inputName]; + if (tensorsFromX[nodeInput.id]) { + prunedInputs[inputName] = nodeInput; + } + } + const prunedNode = Object.assign({}, node); + prunedNode.inputs = prunedInputs; + prunedNode.outputs = node.outputs; + filteredTape.push(prunedNode); + } + } + return filteredTape; +} +function backpropagateGradients(tensorAccumulatedGradientMap, filteredTape, tidy2, add5) { + for (let i = filteredTape.length - 1; i >= 0; i--) { + const node = filteredTape[i]; + const dys = []; + node.outputs.forEach((o) => { + const gradTensor = tensorAccumulatedGradientMap[o.id]; + if (gradTensor != null) { + dys.push(gradTensor); + } else { + dys.push(null); + } + }); + if (node.gradient == null) { + throw new Error(`Cannot compute gradient: gradient function not found for ${node.kernelName}.`); + } + const inputGradients = node.gradient(dys); + for (const inputName in node.inputs) { + if (!(inputName in inputGradients)) { + throw new Error(`Cannot backprop through input ${inputName}. Available gradients found: ${Object.keys(inputGradients)}.`); + } + const dx = tidy2(() => inputGradients[inputName]()); + if (dx.dtype !== "float32") { + throw new Error(`Error in gradient for op ${node.kernelName}. The gradient of input ${inputName} must have 'float32' dtype, but has '${dx.dtype}'`); + } + const x = node.inputs[inputName]; + if (!arraysEqual(dx.shape, x.shape)) { + throw new Error(`Error in gradient for op ${node.kernelName}. The gradient of input '${inputName}' has shape '${dx.shape}', which does not match the shape of the input '${x.shape}'`); + } + if (tensorAccumulatedGradientMap[x.id] == null) { + tensorAccumulatedGradientMap[x.id] = dx; + } else { + const curGradient = tensorAccumulatedGradientMap[x.id]; + tensorAccumulatedGradientMap[x.id] = add5(curGradient, dx); + curGradient.dispose(); + } + } + } +} +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +var FORMAT_LIMIT_NUM_VALS = 20; +var FORMAT_NUM_FIRST_LAST_VALS = 3; +var FORMAT_NUM_SIG_DIGITS = 7; +function tensorToString(vals, shape, dtype, verbose) { + const strides = computeStrides(shape); + const padPerCol = computeMaxSizePerColumn(vals, shape, dtype, strides); + const rank = shape.length; + const valsLines = subTensorToString(vals, shape, dtype, strides, padPerCol); + const lines2 = ["Tensor"]; + if (verbose) { + lines2.push(` dtype: ${dtype}`); + lines2.push(` rank: ${rank}`); + lines2.push(` shape: [${shape}]`); + lines2.push(` values:`); + } + lines2.push(valsLines.map((l) => " " + l).join("\n")); + return lines2.join("\n"); +} +function computeMaxSizePerColumn(vals, shape, dtype, strides) { + const n = sizeFromShape(shape); + const numCols = strides[strides.length - 1]; + const padPerCol = new Array(numCols).fill(0); + const rank = shape.length; + const valuesOrTuples = dtype === "complex64" ? createComplexTuples(vals) : vals; + if (rank > 1) { + for (let row = 0; row < n / numCols; row++) { + const offset = row * numCols; + for (let j = 0; j < numCols; j++) { + padPerCol[j] = Math.max(padPerCol[j], valToString(valuesOrTuples[offset + j], 0, dtype).length); + } + } + } + return padPerCol; +} +function valToString(val, pad3, dtype) { + let valStr; + if (Array.isArray(val)) { + valStr = `${parseFloat(val[0].toFixed(FORMAT_NUM_SIG_DIGITS))} + ${parseFloat(val[1].toFixed(FORMAT_NUM_SIG_DIGITS))}j`; + } else if (isString(val)) { + valStr = `'${val}'`; + } else if (dtype === "bool") { + valStr = boolNumToString(val); + } else { + valStr = parseFloat(val.toFixed(FORMAT_NUM_SIG_DIGITS)).toString(); + } + return rightPad(valStr, pad3); +} +function boolNumToString(v) { + return v === 0 ? "false" : "true"; +} +function subTensorToString(vals, shape, dtype, strides, padPerCol, isLast = true) { + const storagePerElement = dtype === "complex64" ? 2 : 1; + const size = shape[0]; + const rank = shape.length; + if (rank === 0) { + if (dtype === "complex64") { + const complexTuple = createComplexTuples(vals); + return [valToString(complexTuple[0], 0, dtype)]; + } + if (dtype === "bool") { + return [boolNumToString(vals[0])]; + } + return [vals[0].toString()]; + } + if (rank === 1) { + if (size > FORMAT_LIMIT_NUM_VALS) { + const firstValsSize = FORMAT_NUM_FIRST_LAST_VALS * storagePerElement; + let firstVals = Array.from(vals.slice(0, firstValsSize)); + let lastVals = Array.from(vals.slice((size - FORMAT_NUM_FIRST_LAST_VALS) * storagePerElement, size * storagePerElement)); + if (dtype === "complex64") { + firstVals = createComplexTuples(firstVals); + lastVals = createComplexTuples(lastVals); + } + return [ + "[" + firstVals.map((x, i) => valToString(x, padPerCol[i], dtype)).join(", ") + ", ..., " + lastVals.map((x, i) => valToString(x, padPerCol[size - FORMAT_NUM_FIRST_LAST_VALS + i], dtype)).join(", ") + "]" + ]; + } + const displayVals = dtype === "complex64" ? createComplexTuples(vals) : Array.from(vals); + return [ + "[" + displayVals.map((x, i) => valToString(x, padPerCol[i], dtype)).join(", ") + "]" + ]; + } + const subshape = shape.slice(1); + const substrides = strides.slice(1); + const stride = strides[0] * storagePerElement; + const lines2 = []; + if (size > FORMAT_LIMIT_NUM_VALS) { + for (let i = 0; i < FORMAT_NUM_FIRST_LAST_VALS; i++) { + const start = i * stride; + const end = start + stride; + lines2.push(...subTensorToString(vals.slice(start, end), subshape, dtype, substrides, padPerCol, false)); + } + lines2.push("..."); + for (let i = size - FORMAT_NUM_FIRST_LAST_VALS; i < size; i++) { + const start = i * stride; + const end = start + stride; + lines2.push(...subTensorToString(vals.slice(start, end), subshape, dtype, substrides, padPerCol, i === size - 1)); + } + } else { + for (let i = 0; i < size; i++) { + const start = i * stride; + const end = start + stride; + lines2.push(...subTensorToString(vals.slice(start, end), subshape, dtype, substrides, padPerCol, i === size - 1)); + } + } + const sep = rank === 2 ? "," : ""; + lines2[0] = "[" + lines2[0] + sep; + for (let i = 1; i < lines2.length - 1; i++) { + lines2[i] = " " + lines2[i] + sep; + } + let newLineSep = ",\n"; + for (let i = 2; i < rank; i++) { + newLineSep += "\n"; + } + lines2[lines2.length - 1] = " " + lines2[lines2.length - 1] + "]" + (isLast ? "" : newLineSep); + return lines2; +} +function createComplexTuples(vals) { + const complexTuples = []; + for (let i = 0; i < vals.length; i += 2) { + complexTuples.push([vals[i], vals[i + 1]]); + } + return complexTuples; +} +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +var TensorBuffer = class { + constructor(shape, dtype, values) { + this.dtype = dtype; + this.shape = shape.slice(); + this.size = sizeFromShape(shape); + if (values != null) { + const n = values.length; + assert(n === this.size, () => `Length of values '${n}' does not match the size inferred by the shape '${this.size}'.`); + } + if (dtype === "complex64") { + throw new Error(`complex64 dtype TensorBuffers are not supported. Please create a TensorBuffer for the real and imaginary parts separately and call tf.complex(real, imag).`); + } + this.values = values || getArrayFromDType(dtype, this.size); + this.strides = computeStrides(shape); + } + set(value, ...locs) { + if (locs.length === 0) { + locs = [0]; + } + assert(locs.length === this.rank, () => `The number of provided coordinates (${locs.length}) must match the rank (${this.rank})`); + const index = this.locToIndex(locs); + this.values[index] = value; + } + get(...locs) { + if (locs.length === 0) { + locs = [0]; + } + let i = 0; + for (const loc of locs) { + if (loc < 0 || loc >= this.shape[i]) { + const msg = `Requested out of range element at ${locs}. Buffer shape=${this.shape}`; + throw new Error(msg); + } + i++; + } + let index = locs[locs.length - 1]; + for (let i2 = 0; i2 < locs.length - 1; ++i2) { + index += this.strides[i2] * locs[i2]; + } + return this.values[index]; + } + locToIndex(locs) { + if (this.rank === 0) { + return 0; + } else if (this.rank === 1) { + return locs[0]; + } + let index = locs[locs.length - 1]; + for (let i = 0; i < locs.length - 1; ++i) { + index += this.strides[i] * locs[i]; + } + return index; + } + indexToLoc(index) { + if (this.rank === 0) { + return []; + } else if (this.rank === 1) { + return [index]; + } + const locs = new Array(this.shape.length); + for (let i = 0; i < locs.length - 1; ++i) { + locs[i] = Math.floor(index / this.strides[i]); + index -= locs[i] * this.strides[i]; + } + locs[locs.length - 1] = index; + return locs; + } + get rank() { + return this.shape.length; + } + toTensor() { + return trackerFn().makeTensor(this.values, this.shape, this.dtype); + } +}; +var trackerFn = null; +var opHandler = null; +var deprecationWarningFn = null; +function setTensorTracker(fn) { + trackerFn = fn; +} +function setOpHandler(handler) { + opHandler = handler; +} +function setDeprecationWarningFn(fn) { + deprecationWarningFn = fn; +} +var Tensor = class { + constructor(shape, dtype, dataId, id) { + this.kept = false; + this.isDisposedInternal = false; + this.shape = shape.slice(); + this.dtype = dtype || "float32"; + this.size = sizeFromShape(shape); + this.strides = computeStrides(shape); + this.dataId = dataId; + this.id = id; + this.rankType = this.rank < 5 ? this.rank.toString() : "higher"; + } + get rank() { + return this.shape.length; + } + async buffer() { + const vals = await this.data(); + return opHandler.buffer(this.shape, this.dtype, vals); + } + bufferSync() { + return opHandler.buffer(this.shape, this.dtype, this.dataSync()); + } + async array() { + const vals = await this.data(); + return toNestedArray(this.shape, vals); + } + arraySync() { + return toNestedArray(this.shape, this.dataSync()); + } + async data() { + this.throwIfDisposed(); + const data2 = trackerFn().read(this.dataId); + if (this.dtype === "string") { + const bytes = await data2; + try { + return bytes.map((b) => decodeString(b)); + } catch (_a) { + throw new Error("Failed to decode the string bytes into utf-8. To get the original bytes, call tensor.bytes()."); + } + } + return data2; + } + dataSync() { + this.throwIfDisposed(); + const data2 = trackerFn().readSync(this.dataId); + if (this.dtype === "string") { + try { + return data2.map((b) => decodeString(b)); + } catch (_a) { + throw new Error("Failed to decode the string bytes into utf-8. To get the original bytes, call tensor.bytes()."); + } + } + return data2; + } + async bytes() { + this.throwIfDisposed(); + const data2 = await trackerFn().read(this.dataId); + if (this.dtype === "string") { + return data2; + } else { + return new Uint8Array(data2.buffer); + } + } + dispose() { + if (this.isDisposed) { + return; + } + trackerFn().disposeTensor(this); + this.isDisposedInternal = true; + } + get isDisposed() { + return this.isDisposedInternal; + } + throwIfDisposed() { + if (this.isDisposed) { + throw new Error(`Tensor is disposed.`); + } + } + print(verbose = false) { + return opHandler.print(this, verbose); + } + clone() { + this.throwIfDisposed(); + return opHandler.clone(this); + } + toString(verbose = false) { + const vals = this.dataSync(); + return tensorToString(vals, this.shape, this.dtype, verbose); + } + cast(dtype) { + this.throwIfDisposed(); + return opHandler.cast(this, dtype); + } + variable(trainable = true, name, dtype) { + this.throwIfDisposed(); + return trackerFn().makeVariable(this, trainable, name, dtype); + } +}; +Object.defineProperty(Tensor, Symbol.hasInstance, { + value: (instance2) => { + return !!instance2 && instance2.data != null && instance2.dataSync != null && instance2.throwIfDisposed != null; + } +}); +function getGlobalTensorClass() { + return getGlobal("Tensor", () => { + return Tensor; + }); +} +getGlobalTensorClass(); +var Variable = class extends Tensor { + constructor(initialValue, trainable, name, tensorId) { + super(initialValue.shape, initialValue.dtype, initialValue.dataId, tensorId); + this.trainable = trainable; + this.name = name; + } + assign(newValue) { + if (newValue.dtype !== this.dtype) { + throw new Error(`dtype of the new value (${newValue.dtype}) and previous value (${this.dtype}) must match`); + } + if (!arraysEqual(newValue.shape, this.shape)) { + throw new Error(`shape of the new value (${newValue.shape}) and previous value (${this.shape}) must match`); + } + trackerFn().disposeTensor(this); + this.dataId = newValue.dataId; + trackerFn().incRef(this, null); + } + dispose() { + trackerFn().disposeVariable(this); + this.isDisposedInternal = true; + } +}; +Object.defineProperty(Variable, Symbol.hasInstance, { + value: (instance2) => { + return instance2 instanceof Tensor && instance2.assign != null && instance2.assign instanceof Function; + } +}); +var tensor_util_exports = {}; +__export2(tensor_util_exports, { + assertTypesMatch: () => assertTypesMatch, + getTensorsInContainer: () => getTensorsInContainer, + isTensorInList: () => isTensorInList, + makeTypesMatch: () => makeTypesMatch +}); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +var Rank; +(function(Rank2) { + Rank2["R0"] = "R0"; + Rank2["R1"] = "R1"; + Rank2["R2"] = "R2"; + Rank2["R3"] = "R3"; + Rank2["R4"] = "R4"; + Rank2["R5"] = "R5"; + Rank2["R6"] = "R6"; +})(Rank || (Rank = {})); +var UpcastInt32AndMap; +(function(UpcastInt32AndMap2) { + UpcastInt32AndMap2["float32"] = "float32"; + UpcastInt32AndMap2["int32"] = "int32"; + UpcastInt32AndMap2["bool"] = "int32"; + UpcastInt32AndMap2["complex64"] = "complex64"; +})(UpcastInt32AndMap || (UpcastInt32AndMap = {})); +var UpcastBoolAndMap; +(function(UpcastBoolAndMap2) { + UpcastBoolAndMap2["float32"] = "float32"; + UpcastBoolAndMap2["int32"] = "int32"; + UpcastBoolAndMap2["bool"] = "bool"; + UpcastBoolAndMap2["complex64"] = "complex64"; +})(UpcastBoolAndMap || (UpcastBoolAndMap = {})); +var UpcastFloat32AndMap; +(function(UpcastFloat32AndMap2) { + UpcastFloat32AndMap2["float32"] = "float32"; + UpcastFloat32AndMap2["int32"] = "float32"; + UpcastFloat32AndMap2["bool"] = "float32"; + UpcastFloat32AndMap2["complex64"] = "complex64"; +})(UpcastFloat32AndMap || (UpcastFloat32AndMap = {})); +var UpcastComplex64AndMap; +(function(UpcastComplex64AndMap2) { + UpcastComplex64AndMap2["float32"] = "complex64"; + UpcastComplex64AndMap2["int32"] = "complex64"; + UpcastComplex64AndMap2["bool"] = "complex64"; + UpcastComplex64AndMap2["complex64"] = "complex64"; +})(UpcastComplex64AndMap || (UpcastComplex64AndMap = {})); +var upcastTypeMap = { + float32: UpcastFloat32AndMap, + int32: UpcastInt32AndMap, + bool: UpcastBoolAndMap, + complex64: UpcastComplex64AndMap +}; +function upcastType(typeA, typeB) { + if (typeA === "string" || typeB === "string") { + if (typeA === "string" && typeB === "string") { + return "string"; + } + throw new Error(`Can not upcast ${typeA} with ${typeB}`); + } + return upcastTypeMap[typeA][typeB]; +} +function sumOutType(type) { + return upcastType(type, "int32"); +} +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function makeTypesMatch(a, b) { + if (a.dtype === b.dtype) { + return [a, b]; + } + const dtype = upcastType(a.dtype, b.dtype); + return [a.cast(dtype), b.cast(dtype)]; +} +function assertTypesMatch(a, b) { + assert(a.dtype === b.dtype, () => `The dtypes of the first(${a.dtype}) and second(${b.dtype}) input must match`); +} +function isTensorInList(tensor2, tensorList) { + return tensorList.some((x) => x.id === tensor2.id); +} +function getTensorsInContainer(result) { + const list = []; + const seen = new Set(); + walkTensorContainer(result, list, seen); + return list; +} +function walkTensorContainer(container, list, seen) { + if (container == null) { + return; + } + if (container instanceof Tensor) { + list.push(container); + return; + } + if (!isIterable(container)) { + return; + } + const iterable = container; + for (const k in iterable) { + const val = iterable[k]; + if (!seen.has(val)) { + seen.add(val); + walkTensorContainer(val, list, seen); + } + } +} +function isIterable(obj) { + return Array.isArray(obj) || typeof obj === "object"; +} +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function isRegisteredKernelInvocation(kernelInvocation) { + return kernelInvocation.kernelName != null; +} +var EngineState = class { + constructor() { + this.registeredVariables = {}; + this.nextTapeNodeId = 0; + this.numBytes = 0; + this.numTensors = 0; + this.numStringTensors = 0; + this.numDataBuffers = 0; + this.gradientDepth = 0; + this.kernelDepth = 0; + this.scopeStack = []; + this.numDataMovesStack = []; + this.nextScopeId = 0; + this.tensorInfo = new WeakMap(); + this.profiling = false; + this.activeProfile = { + newBytes: 0, + newTensors: 0, + peakBytes: 0, + kernels: [], + result: null, + get kernelNames() { + return Array.from(new Set(this.kernels.map((k) => k.name))); + } + }; + } + dispose() { + for (const variableName in this.registeredVariables) { + this.registeredVariables[variableName].dispose(); + } + } +}; +var Engine = class { + constructor(ENV5) { + this.ENV = ENV5; + this.registry = {}; + this.registryFactory = {}; + this.pendingBackendInitId = 0; + this.state = new EngineState(); + } + async ready() { + if (this.pendingBackendInit != null) { + return this.pendingBackendInit.then(() => { + }); + } + if (this.backendInstance != null) { + return; + } + const sortedBackends = this.getSortedBackends(); + for (let i = 0; i < sortedBackends.length; i++) { + const backendName = sortedBackends[i]; + const success = await this.initializeBackend(backendName).success; + if (success) { + await this.setBackend(backendName); + return; + } + } + throw new Error(`Could not initialize any backends, all backend initializations failed.`); + } + get backend() { + if (this.pendingBackendInit != null) { + throw new Error(`Backend '${this.backendName}' has not yet been initialized. Make sure to await tf.ready() or await tf.setBackend() before calling other methods`); + } + if (this.backendInstance == null) { + const {name, asyncInit} = this.initializeBackendsAndReturnBest(); + if (asyncInit) { + throw new Error(`The highest priority backend '${name}' has not yet been initialized. Make sure to await tf.ready() or await tf.setBackend() before calling other methods`); + } + this.setBackend(name); + } + return this.backendInstance; + } + backendNames() { + return Object.keys(this.registryFactory); + } + findBackend(backendName) { + if (!(backendName in this.registry)) { + if (backendName in this.registryFactory) { + const {asyncInit} = this.initializeBackend(backendName); + if (asyncInit) { + return null; + } + } else { + return null; + } + } + return this.registry[backendName]; + } + findBackendFactory(backendName) { + if (!(backendName in this.registryFactory)) { + return null; + } + return this.registryFactory[backendName].factory; + } + registerBackend(backendName, factory, priority = 1) { + if (backendName in this.registryFactory) { + console.warn(`${backendName} backend was already registered. Reusing existing backend factory.`); + return false; + } + this.registryFactory[backendName] = {factory, priority}; + return true; + } + async setBackend(backendName) { + if (this.registryFactory[backendName] == null) { + throw new Error(`Backend name '${backendName}' not found in registry`); + } + this.backendName = backendName; + if (this.registry[backendName] == null) { + this.backendInstance = null; + const {success, asyncInit} = this.initializeBackend(backendName); + const result = asyncInit ? await success : success; + if (!result) { + return false; + } + } + this.backendInstance = this.registry[backendName]; + this.setupRegisteredKernels(); + this.profiler = new Profiler(this.backendInstance); + return true; + } + setupRegisteredKernels() { + const kernels = getKernelsForBackend(this.backendName); + kernels.forEach((kernel) => { + if (kernel.setupFunc != null) { + kernel.setupFunc(this.backendInstance); + } + }); + } + disposeRegisteredKernels(backendName) { + const kernels = getKernelsForBackend(backendName); + kernels.forEach((kernel) => { + if (kernel.disposeFunc != null) { + kernel.disposeFunc(this.registry[backendName]); + } + }); + } + initializeBackend(backendName) { + const registryFactoryEntry = this.registryFactory[backendName]; + if (registryFactoryEntry == null) { + throw new Error(`Cannot initialize backend ${backendName}, no registration found.`); + } + try { + const backend22 = registryFactoryEntry.factory(); + if (backend22 && !(backend22 instanceof KernelBackend) && typeof backend22.then === "function") { + const promiseId = ++this.pendingBackendInitId; + const success = backend22.then((backendInstance) => { + if (promiseId < this.pendingBackendInitId) { + return false; + } + this.registry[backendName] = backendInstance; + this.pendingBackendInit = null; + return true; + }).catch((err) => { + if (promiseId < this.pendingBackendInitId) { + return false; + } + this.pendingBackendInit = null; + console.warn(`Initialization of backend ${backendName} failed`); + console.warn(err.stack || err.message); + return false; + }); + this.pendingBackendInit = success; + return {success, asyncInit: true}; + } else { + this.registry[backendName] = backend22; + return {success: true, asyncInit: false}; + } + } catch (err) { + console.warn(`Initialization of backend ${backendName} failed`); + console.warn(err.stack || err.message); + return {success: false, asyncInit: false}; + } + } + removeBackend(backendName) { + if (!(backendName in this.registryFactory)) { + throw new Error(`${backendName} backend not found in registry`); + } + if (this.backendName === backendName && this.pendingBackendInit != null) { + this.pendingBackendInitId++; + } + if (backendName in this.registry) { + this.disposeRegisteredKernels(backendName); + this.registry[backendName].dispose(); + delete this.registry[backendName]; + } + delete this.registryFactory[backendName]; + if (this.backendName === backendName) { + this.pendingBackendInit = null; + this.backendName = null; + this.backendInstance = null; + } + } + getSortedBackends() { + if (Object.keys(this.registryFactory).length === 0) { + throw new Error("No backend found in registry."); + } + return Object.keys(this.registryFactory).sort((a, b) => { + return this.registryFactory[b].priority - this.registryFactory[a].priority; + }); + } + initializeBackendsAndReturnBest() { + const sortedBackends = this.getSortedBackends(); + for (let i = 0; i < sortedBackends.length; i++) { + const backendName = sortedBackends[i]; + const {success, asyncInit} = this.initializeBackend(backendName); + if (asyncInit || success) { + return {name: backendName, asyncInit}; + } + } + throw new Error(`Could not initialize any backends, all backend initializations failed.`); + } + moveData(backend22, dataId) { + const info2 = this.state.tensorInfo.get(dataId); + const srcBackend = info2.backend; + const values = this.readSync(dataId); + const refCount = srcBackend.refCount(dataId); + srcBackend.disposeData(dataId, true); + info2.backend = backend22; + backend22.move(dataId, values, info2.shape, info2.dtype, refCount); + if (this.shouldCheckForMemLeaks()) { + this.state.numDataMovesStack[this.state.numDataMovesStack.length - 1]++; + } + } + tidy(nameOrFn, fn) { + let name = null; + if (fn == null) { + if (typeof nameOrFn !== "function") { + throw new Error("Please provide a function to tidy()"); + } + fn = nameOrFn; + } else { + if (typeof nameOrFn !== "string" && !(nameOrFn instanceof String)) { + throw new Error("When calling with two arguments, the first argument to tidy() must be a string"); + } + if (typeof fn !== "function") { + throw new Error("When calling with two arguments, the 2nd argument to tidy() must be a function"); + } + name = nameOrFn; + } + let result; + return this.scopedRun(() => this.startScope(name), () => this.endScope(result), () => { + result = fn(); + if (result instanceof Promise) { + console.error("Cannot return a Promise inside of tidy."); + } + return result; + }); + } + scopedRun(start, end, f) { + start(); + try { + const res = f(); + end(); + return res; + } catch (ex) { + end(); + throw ex; + } + } + nextTensorId() { + return Engine.nextTensorId++; + } + nextVariableId() { + return Engine.nextVariableId++; + } + clone(x) { + const y = ENGINE.runKernel(Identity, {x}); + const inputs = {x}; + const grad2 = (dy) => ({ + x: () => { + const dtype = "float32"; + const gradInputs = {x: dy}; + const attrs = {dtype}; + return ENGINE.runKernel(Cast, gradInputs, attrs); + } + }); + const saved = []; + this.addTapeNode(this.state.activeScope.name, inputs, [y], grad2, saved, {}); + return y; + } + runKernel(kernelName, inputs, attrs) { + const hasKernel = getKernel(kernelName, this.backendName) != null; + if (!hasKernel) { + throw new Error(`Kernel '${kernelName}' not registered for backend '${this.backendName}'`); + } + return this.runKernelFunc({kernelName, inputs, attrs}); + } + shouldCheckForMemLeaks() { + return this.ENV.getBool("IS_TEST"); + } + checkKernelForMemLeak(kernelName, numDataIdsBefore, outInfos) { + const numDataIdsAfter = this.backend.numDataIds(); + let numOutputDataIds = 0; + outInfos.forEach((info2) => { + numOutputDataIds += info2.dtype === "complex64" ? 3 : 1; + }); + const numMoves = this.state.numDataMovesStack[this.state.numDataMovesStack.length - 1]; + const dataIdsLeaked = numDataIdsAfter - numDataIdsBefore - numOutputDataIds - numMoves; + if (dataIdsLeaked > 0) { + throw new Error(`Backend '${this.backendName}' has an internal memory leak (${dataIdsLeaked} data ids) after running '${kernelName}'`); + } + } + runKernelFunc(kernelParams) { + let outputs; + let saved = []; + const isTapeOn = this.isTapeOn(); + const startingBytecount = this.state.numBytes; + const startingNumTensors = this.state.numTensors; + if (this.shouldCheckForMemLeaks()) { + this.state.numDataMovesStack.push(0); + } + let kernelFunc3; + if (this.backendName == null) { + this.backend; + } + let out; + const kernelOrScopeName = isRegisteredKernelInvocation(kernelParams) ? kernelParams.kernelName : this.state.activeScope != null ? this.state.activeScope.name : ""; + if (isRegisteredKernelInvocation(kernelParams)) { + const {kernelName, inputs: inputs2, attrs: attrs2} = kernelParams; + if (this.backendName == null) { + this.backend; + } + const kernel = getKernel(kernelName, this.backendName); + assert(kernel != null, () => `Cannot find registered kernel '${kernelName}' for backend '${this.backendName}'`); + kernelFunc3 = () => { + const numDataIdsBefore = this.backend.numDataIds(); + out = kernel.kernelFunc({inputs: inputs2, attrs: attrs2, backend: this.backend}); + const outInfos = Array.isArray(out) ? out : [out]; + if (this.shouldCheckForMemLeaks()) { + this.checkKernelForMemLeak(kernelName, numDataIdsBefore, outInfos); + } + const outTensors = outInfos.map((outInfo) => { + if (outInfo.rank != null) { + return outInfo; + } + const {dataId, shape, dtype} = outInfo; + return this.makeTensorFromDataId(dataId, shape, dtype); + }); + if (isTapeOn) { + const tensorsToSave = this.getTensorsForGradient(kernelName, inputs2, outTensors); + saved = this.saveTensorsForBackwardMode(tensorsToSave); + } + return outTensors; + }; + } else { + const {forwardFunc} = kernelParams; + const saveFunc = (tensors) => { + if (!isTapeOn) { + return; + } + saved = tensors.map((tensor2) => this.keep(this.clone(tensor2))); + }; + kernelFunc3 = () => { + const numDataIdsBefore = this.backend.numDataIds(); + out = this.tidy(() => forwardFunc(this.backend, saveFunc)); + const outs = Array.isArray(out) ? out : [out]; + if (this.shouldCheckForMemLeaks()) { + this.checkKernelForMemLeak(kernelOrScopeName, numDataIdsBefore, outs); + } + return outs; + }; + } + const {inputs, attrs} = kernelParams; + const backwardsFunc = isRegisteredKernelInvocation(kernelParams) ? null : kernelParams.backwardsFunc; + let kernelProfile; + this.scopedRun(() => this.state.kernelDepth++, () => this.state.kernelDepth--, () => { + if (!this.ENV.getBool("DEBUG") && !this.state.profiling) { + outputs = kernelFunc3(); + } else { + kernelProfile = this.profiler.profileKernel(kernelOrScopeName, inputs, () => kernelFunc3()); + if (this.ENV.getBool("DEBUG")) { + this.profiler.logKernelProfile(kernelProfile); + } + outputs = kernelProfile.outputs; + } + }); + if (isTapeOn) { + this.addTapeNode(kernelOrScopeName, inputs, outputs, backwardsFunc, saved, attrs); + } + if (this.state.profiling) { + this.state.activeProfile.kernels.push({ + name: kernelOrScopeName, + bytesAdded: this.state.numBytes - startingBytecount, + totalBytesSnapshot: this.state.numBytes, + tensorsAdded: this.state.numTensors - startingNumTensors, + totalTensorsSnapshot: this.state.numTensors, + inputShapes: Object.keys(inputs).map((key) => inputs[key] != null ? inputs[key].shape : null), + outputShapes: outputs.map((item) => item.shape), + kernelTimeMs: kernelProfile.timeMs, + extraInfo: kernelProfile.extraInfo + }); + } + return Array.isArray(out) ? outputs : outputs[0]; + } + saveTensorsForBackwardMode(tensors) { + const saved = tensors.map((tensor2) => this.keep(this.clone(tensor2))); + return saved; + } + getTensorsForGradient(kernelName, inputs, outputs) { + const gradConfig = getGradient(kernelName); + if (gradConfig != null) { + const inputsToSave = gradConfig.inputsToSave || []; + const outputsToSave = gradConfig.outputsToSave || []; + let inputTensorsToSave; + if (gradConfig.saveAllInputs) { + assert(Array.isArray(inputs), () => "saveAllInputs is true, expected inputs to be an array."); + inputTensorsToSave = Object.keys(inputs).map((key) => inputs[key]); + } else { + inputTensorsToSave = inputsToSave.map((inputName) => inputs[inputName]); + } + const outputTensorsToSave = outputs.filter((_, i) => outputsToSave[i]); + return inputTensorsToSave.concat(outputTensorsToSave); + } + return []; + } + makeTensor(values, shape, dtype, backend22) { + if (values == null) { + throw new Error("Values passed to engine.makeTensor() are null"); + } + dtype = dtype || "float32"; + backend22 = backend22 || this.backend; + let backendVals = values; + if (dtype === "string" && isString(values[0])) { + backendVals = values.map((d) => encodeString(d)); + } + const dataId = backend22.write(backendVals, shape, dtype); + const t = new Tensor(shape, dtype, dataId, this.nextTensorId()); + this.trackTensor(t, backend22); + if (dtype === "string") { + const info2 = this.state.tensorInfo.get(dataId); + const newBytes = bytesFromStringArray(backendVals); + this.state.numBytes += newBytes - info2.bytes; + info2.bytes = newBytes; + } + return t; + } + makeTensorFromDataId(dataId, shape, dtype, backend22) { + dtype = dtype || "float32"; + const t = new Tensor(shape, dtype, dataId, this.nextTensorId()); + this.trackTensor(t, backend22); + return t; + } + makeVariable(initialValue, trainable = true, name, dtype) { + name = name || this.nextVariableId().toString(); + if (dtype != null && dtype !== initialValue.dtype) { + initialValue = initialValue.cast(dtype); + } + const v = new Variable(initialValue, trainable, name, this.nextTensorId()); + if (this.state.registeredVariables[v.name] != null) { + throw new Error(`Variable with name ${v.name} was already registered`); + } + this.state.registeredVariables[v.name] = v; + this.incRef(v, this.backend); + return v; + } + trackTensor(a, backend22) { + this.state.numTensors++; + if (a.dtype === "string") { + this.state.numStringTensors++; + } + let bytes = 0; + if (a.dtype !== "complex64" && a.dtype !== "string") { + bytes = a.size * bytesPerElement(a.dtype); + } + this.state.numBytes += bytes; + if (!this.state.tensorInfo.has(a.dataId)) { + this.state.numDataBuffers++; + this.state.tensorInfo.set(a.dataId, { + backend: backend22 || this.backend, + dtype: a.dtype, + shape: a.shape, + bytes + }); + } + if (!(a instanceof Variable)) { + this.track(a); + } + } + incRef(a, backend22) { + this.trackTensor(a, backend22); + this.backend.incRef(a.dataId); + } + removeDataId(dataId, backend22) { + if (this.state.tensorInfo.has(dataId) && this.state.tensorInfo.get(dataId).backend === backend22) { + this.state.tensorInfo.delete(dataId); + this.state.numDataBuffers--; + } + } + disposeTensor(a) { + if (!this.state.tensorInfo.has(a.dataId)) { + return; + } + const info2 = this.state.tensorInfo.get(a.dataId); + this.state.numTensors--; + if (a.dtype === "string") { + this.state.numStringTensors--; + this.state.numBytes -= info2.bytes; + } + if (a.dtype !== "complex64" && a.dtype !== "string") { + const bytes = a.size * bytesPerElement(a.dtype); + this.state.numBytes -= bytes; + } + if (info2.backend.disposeData(a.dataId)) { + this.removeDataId(a.dataId, info2.backend); + } + } + disposeVariables() { + for (const varName in this.state.registeredVariables) { + const v = this.state.registeredVariables[varName]; + this.disposeVariable(v); + } + } + disposeVariable(v) { + this.disposeTensor(v); + if (this.state.registeredVariables[v.name] != null) { + delete this.state.registeredVariables[v.name]; + } + } + memory() { + const info2 = this.backend.memory(); + info2.numTensors = this.state.numTensors; + info2.numDataBuffers = this.state.numDataBuffers; + info2.numBytes = this.state.numBytes; + if (this.state.numStringTensors > 0) { + info2.unreliable = true; + if (info2.reasons == null) { + info2.reasons = []; + } + info2.reasons.push("Memory usage by string tensors is approximate (2 bytes per character)"); + } + return info2; + } + async profile(query) { + this.state.profiling = true; + const startBytes = this.state.numBytes; + const startNumTensors = this.state.numTensors; + this.state.activeProfile.kernels = []; + this.state.activeProfile.result = await query(); + this.state.profiling = false; + this.state.activeProfile.peakBytes = Math.max(...this.state.activeProfile.kernels.map((d) => d.totalBytesSnapshot)); + this.state.activeProfile.newBytes = this.state.numBytes - startBytes; + this.state.activeProfile.newTensors = this.state.numTensors - startNumTensors; + for (const kernel of this.state.activeProfile.kernels) { + kernel.kernelTimeMs = await kernel.kernelTimeMs; + kernel.extraInfo = await kernel.extraInfo; + } + return this.state.activeProfile; + } + isTapeOn() { + return this.state.gradientDepth > 0 && this.state.kernelDepth === 0; + } + addTapeNode(kernelName, inputs, outputs, gradientsFunc, saved, attrs) { + const tapeNode = {id: this.state.nextTapeNodeId++, kernelName, inputs, outputs, saved}; + const gradConfig = getGradient(kernelName); + if (gradConfig != null) { + gradientsFunc = gradConfig.gradFunc; + } + if (gradientsFunc != null) { + tapeNode.gradient = (dys) => { + dys = dys.map((dy, i) => { + if (dy == null) { + const output = outputs[i]; + const vals = makeZerosTypedArray(output.size, output.dtype); + return this.makeTensor(vals, output.shape, output.dtype); + } + return dy; + }); + return gradientsFunc(dys.length > 1 ? dys : dys[0], saved, attrs); + }; + } + this.state.activeTape.push(tapeNode); + } + keep(result) { + result.kept = true; + return result; + } + startTape() { + if (this.state.gradientDepth === 0) { + this.state.activeTape = []; + } + this.state.gradientDepth++; + } + endTape() { + this.state.gradientDepth--; + } + startScope(name) { + const scopeInfo = { + track: [], + name: "unnamed scope", + id: this.state.nextScopeId++ + }; + if (name) { + scopeInfo.name = name; + } + this.state.scopeStack.push(scopeInfo); + this.state.activeScope = scopeInfo; + } + endScope(result) { + const tensorsToTrackInParent = getTensorsInContainer(result); + const tensorsToTrackInParentSet = new Set(tensorsToTrackInParent.map((t) => t.id)); + for (let i = 0; i < this.state.activeScope.track.length; i++) { + const tensor2 = this.state.activeScope.track[i]; + if (!tensor2.kept && !tensorsToTrackInParentSet.has(tensor2.id)) { + tensor2.dispose(); + } + } + const oldScope = this.state.scopeStack.pop(); + this.state.activeScope = this.state.scopeStack.length === 0 ? null : this.state.scopeStack[this.state.scopeStack.length - 1]; + tensorsToTrackInParent.forEach((tensor2) => { + if (!tensor2.kept && tensor2.scopeId === oldScope.id) { + this.track(tensor2); + } + }); + } + gradients(f, xs, dy, allowNoGradients = false) { + assert(xs.length > 0, () => "gradients() received an empty list of xs."); + if (dy != null && dy.dtype !== "float32") { + throw new Error(`dy must have 'float32' dtype, but has '${dy.dtype}'`); + } + const y = this.scopedRun(() => this.startTape(), () => this.endTape(), () => this.tidy("forward", f)); + assert(y instanceof Tensor, () => "The result y returned by f() must be a tensor."); + const filteredTape = getFilteredNodesXToY(this.state.activeTape, xs, y); + if (!allowNoGradients && filteredTape.length === 0 && xs.length > 0) { + throw new Error("Cannot compute gradient of y=f(x) with respect to x. Make sure that the f you passed encloses all operations that lead from x to y."); + } + return this.tidy("backward", () => { + const accumulatedGradientMap = {}; + accumulatedGradientMap[y.id] = dy == null ? ones(y.shape) : dy; + backpropagateGradients(accumulatedGradientMap, filteredTape, (f2) => this.tidy(f2), add); + const grads2 = xs.map((x) => accumulatedGradientMap[x.id]); + if (this.state.gradientDepth === 0) { + this.state.activeTape.forEach((node) => { + for (const tensor2 of node.saved) { + tensor2.dispose(); + } + }); + this.state.activeTape = null; + } + return {value: y, grads: grads2}; + }); + } + customGrad(f) { + assert(isFunction(f), () => "The f passed in customGrad(f) must be a function."); + return (...inputs) => { + assert(inputs.every((t) => t instanceof Tensor), () => "The args passed in customGrad(f)(x1, x2,...) must all be tensors"); + let res; + const inputMap = {}; + inputs.forEach((input2, i) => { + inputMap[i] = input2; + }); + const forwardFunc = (_, save) => { + res = f(...[...inputs, save]); + assert(res.value instanceof Tensor, () => "The function f passed in customGrad(f) must return an object where `obj.value` is a tensor"); + assert(isFunction(res.gradFunc), () => "The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function."); + return res.value; + }; + const backwardsFunc = (dy, saved) => { + const gradRes = res.gradFunc(dy, saved); + const grads2 = Array.isArray(gradRes) ? gradRes : [gradRes]; + assert(grads2.length === inputs.length, () => "The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function that returns the same number of tensors as inputs passed to f(...)."); + assert(grads2.every((t) => t instanceof Tensor), () => "The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function that returns a list of only tensors."); + const gradMap = {}; + grads2.forEach((grad2, i) => { + gradMap[i] = () => grad2; + }); + return gradMap; + }; + return this.runKernelFunc({ + forwardFunc, + backwardsFunc, + inputs: inputMap + }); + }; + } + readSync(dataId) { + const info2 = this.state.tensorInfo.get(dataId); + return info2.backend.readSync(dataId); + } + read(dataId) { + const info2 = this.state.tensorInfo.get(dataId); + return info2.backend.read(dataId); + } + async time(query) { + const start = now2(); + const timingInfo = await this.backend.time(query); + timingInfo.wallMs = now2() - start; + return timingInfo; + } + track(result) { + if (this.state.activeScope != null) { + result.scopeId = this.state.activeScope.id; + this.state.activeScope.track.push(result); + } + return result; + } + get registeredVariables() { + return this.state.registeredVariables; + } + reset() { + this.pendingBackendInitId++; + this.state.dispose(); + this.ENV.reset(); + this.state = new EngineState(); + for (const backendName in this.registry) { + this.disposeRegisteredKernels(backendName); + this.registry[backendName].dispose(); + delete this.registry[backendName]; + } + this.backendName = null; + this.backendInstance = null; + this.pendingBackendInit = null; + } +}; +Engine.nextTensorId = 0; +Engine.nextVariableId = 0; +function ones(shape) { + const values = makeOnesTypedArray(sizeFromShape(shape), "float32"); + return ENGINE.makeTensor(values, shape, "float32"); +} +function getOrMakeEngine() { + const ns = getGlobalNamespace(); + if (ns._tfengine == null) { + const environment = new Environment(ns); + ns._tfengine = new Engine(environment); + } + setEnvironmentGlobal(ns._tfengine.ENV); + setTensorTracker(() => ns._tfengine); + return ns._tfengine; +} +var ENGINE = getOrMakeEngine(); +function add(a, b) { + const inputs = {a, b}; + return ENGINE.runKernel(Add, inputs); +} +var device_util_exports = {}; +__export2(device_util_exports, { + isBrowser: () => isBrowser, + isMobile: () => isMobile +}); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function _isNavigatorDefined() { + return typeof navigator !== "undefined" && navigator != null; +} +function isMobile() { + if (_isNavigatorDefined()) { + const a = navigator.userAgent || navigator.vendor || window.opera; + return /(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0, 4)); + } + return false; +} +function isBrowser() { + return typeof window !== "undefined" && window.document != null || typeof WorkerGlobalScope !== "undefined"; +} +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +var ENV2 = env(); +ENV2.registerFlag("DEBUG", () => false, (debugValue) => { + if (debugValue) { + console.warn("Debugging mode is ON. The output of every math call will be downloaded to CPU and checked for NaNs. This significantly impacts performance."); + } +}); +ENV2.registerFlag("IS_BROWSER", () => isBrowser()); +ENV2.registerFlag("IS_NODE", () => typeof process !== "undefined" && typeof process.versions !== "undefined" && typeof process.versions.node !== "undefined"); +ENV2.registerFlag("IS_CHROME", () => typeof navigator !== "undefined" && navigator != null && navigator.userAgent != null && /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor)); +ENV2.registerFlag("PROD", () => false); +ENV2.registerFlag("TENSORLIKE_CHECK_SHAPE_CONSISTENCY", () => ENV2.getBool("DEBUG")); +ENV2.registerFlag("DEPRECATION_WARNINGS_ENABLED", () => true); +ENV2.registerFlag("IS_TEST", () => false); +ENV2.registerFlag("CHECK_COMPUTATION_FOR_ERRORS", () => true); +ENV2.registerFlag("WRAP_TO_IMAGEBITMAP", () => false); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function inferShape(val, dtype) { + let firstElem = val; + if (isTypedArray(val)) { + return dtype === "string" ? [] : [val.length]; + } + if (!Array.isArray(val)) { + return []; + } + const shape = []; + while (Array.isArray(firstElem) || isTypedArray(firstElem) && dtype !== "string") { + shape.push(firstElem.length); + firstElem = firstElem[0]; + } + if (Array.isArray(val) && env().getBool("TENSORLIKE_CHECK_SHAPE_CONSISTENCY")) { + deepAssertShapeConsistency(val, shape, []); + } + return shape; +} +function deepAssertShapeConsistency(val, shape, indices) { + indices = indices || []; + if (!Array.isArray(val) && !isTypedArray(val)) { + assert(shape.length === 0, () => `Element arr[${indices.join("][")}] is a primitive, but should be an array/TypedArray of ${shape[0]} elements`); + return; + } + assert(shape.length > 0, () => `Element arr[${indices.join("][")}] should be a primitive, but is an array of ${val.length} elements`); + assert(val.length === shape[0], () => `Element arr[${indices.join("][")}] should have ${shape[0]} elements, but has ${val.length} elements`); + const subShape = shape.slice(1); + for (let i = 0; i < val.length; ++i) { + deepAssertShapeConsistency(val[i], subShape, indices.concat(i)); + } +} +function assertDtype(expectedDtype, actualDType, argName, functionName) { + if (expectedDtype === "string_or_numeric") { + return; + } + if (expectedDtype == null) { + throw new Error(`Expected dtype cannot be null.`); + } + if (expectedDtype !== "numeric" && expectedDtype !== actualDType || expectedDtype === "numeric" && actualDType === "string") { + throw new Error(`Argument '${argName}' passed to '${functionName}' must be ${expectedDtype} tensor, but got ${actualDType} tensor`); + } +} +function convertToTensor(x, argName, functionName, parseAsDtype = "numeric") { + if (x instanceof Tensor) { + assertDtype(parseAsDtype, x.dtype, argName, functionName); + return x; + } + let inferredDtype = inferDtype(x); + if (inferredDtype !== "string" && ["bool", "int32", "float32"].indexOf(parseAsDtype) >= 0) { + inferredDtype = parseAsDtype; + } + assertDtype(parseAsDtype, inferredDtype, argName, functionName); + if (x == null || !isTypedArray(x) && !Array.isArray(x) && typeof x !== "number" && typeof x !== "boolean" && typeof x !== "string") { + const type = x == null ? "null" : x.constructor.name; + throw new Error(`Argument '${argName}' passed to '${functionName}' must be a Tensor or TensorLike, but got '${type}'`); + } + const inferredShape = inferShape(x, inferredDtype); + if (!isTypedArray(x) && !Array.isArray(x)) { + x = [x]; + } + const skipTypedArray = true; + const values = inferredDtype !== "string" ? toTypedArray(x, inferredDtype) : flatten(x, [], skipTypedArray); + return ENGINE.makeTensor(values, inferredShape, inferredDtype); +} +function convertToTensorArray(arg, argName, functionName, parseAsDtype = "numeric") { + if (!Array.isArray(arg)) { + throw new Error(`Argument ${argName} passed to ${functionName} must be a \`Tensor[]\` or \`TensorLike[]\``); + } + const tensors = arg; + return tensors.map((t, i) => convertToTensor(t, `${argName}[${i}]`, functionName, parseAsDtype)); +} +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +var OP_SCOPE_SUFFIX = "__op"; +function op(f) { + const keys = Object.keys(f); + if (keys.length !== 1) { + throw new Error(`Please provide an object with a single key (operation name) mapping to a function. Got an object with ${keys.length} keys.`); + } + let opName = keys[0]; + const fn = f[opName]; + if (opName.endsWith("_")) { + opName = opName.substring(0, opName.length - 1); + } + opName = opName + OP_SCOPE_SUFFIX; + const f2 = (...args) => { + ENGINE.startScope(opName); + try { + const result = fn(...args); + if (isPromise(result)) { + console.error("Cannot return a Promise inside of tidy."); + } + ENGINE.endScope(result); + return result; + } catch (ex) { + ENGINE.endScope(null); + throw ex; + } + }; + Object.defineProperty(f2, "name", {value: opName, configurable: true}); + return f2; +} +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function complex_(real4, imag4) { + const $real = convertToTensor(real4, "real", "complex"); + const $imag = convertToTensor(imag4, "imag", "complex"); + assertShapesMatch($real.shape, $imag.shape, `real and imag shapes, ${$real.shape} and ${$imag.shape}, must match in call to tf.complex().`); + const inputs = {real: $real, imag: $imag}; + return ENGINE.runKernel(Complex, inputs); +} +var complex = op({complex_}); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function makeTensor(values, shape, inferredShape, dtype) { + if (dtype == null) { + dtype = inferDtype(values); + } + if (dtype === "complex64") { + throw new Error(`Cannot construct a complex64 tensor directly. Please use tf.complex(real, imag).`); + } + if (!isTypedArray(values) && !Array.isArray(values) && typeof values !== "number" && typeof values !== "boolean" && typeof values !== "string") { + throw new Error("values passed to tensor(values) must be a number/boolean/string or an array of numbers/booleans/strings, or a TypedArray"); + } + if (shape != null) { + assertNonNegativeIntegerDimensions(shape); + const providedSize = sizeFromShape(shape); + const inferredSize = sizeFromShape(inferredShape); + assert(providedSize === inferredSize, () => `Based on the provided shape, [${shape}], the tensor should have ${providedSize} values but has ${inferredSize}`); + for (let i = 0; i < inferredShape.length; ++i) { + const inferred = inferredShape[i]; + const flatDimsDontMatch = i === inferredShape.length - 1 ? inferred !== sizeFromShape(shape.slice(i)) : true; + assert(inferredShape[i] === shape[i] || !flatDimsDontMatch, () => `Error creating a new Tensor. Inferred shape (${inferredShape}) does not match the provided shape (${shape}). `); + } + } + if (!isTypedArray(values) && !Array.isArray(values)) { + values = [values]; + } + shape = shape || inferredShape; + values = dtype !== "string" ? toTypedArray(values, dtype) : flatten(values, [], true); + return ENGINE.makeTensor(values, shape, dtype); +} +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function tensor(values, shape, dtype) { + const inferredShape = inferShape(values, dtype); + return makeTensor(values, shape, inferredShape, dtype); +} +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +var DTYPE_VALUE_SIZE_MAP = { + float32: 4, + float16: 2, + int32: 4, + uint16: 2, + uint8: 1, + bool: 1, + complex64: 8 +}; +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +var NUM_BYTES_STRING_LENGTH = 4; +async function encodeWeights(tensors, group) { + const specs = []; + const dataPromises = []; + const names = Array.isArray(tensors) ? tensors.map((tensor2) => tensor2.name) : Object.keys(tensors); + for (let i = 0; i < names.length; ++i) { + const name = names[i]; + const t = Array.isArray(tensors) ? tensors[i].tensor : tensors[name]; + if (t.dtype !== "float32" && t.dtype !== "int32" && t.dtype !== "bool" && t.dtype !== "string" && t.dtype !== "complex64") { + throw new Error(`Unsupported dtype in weight '${name}': ${t.dtype}`); + } + const spec = {name, shape: t.shape, dtype: t.dtype}; + if (t.dtype === "string") { + const utf8bytes = new Promise(async (resolve) => { + const vals = await t.bytes(); + const totalNumBytes = vals.reduce((p2, c) => p2 + c.length, 0) + NUM_BYTES_STRING_LENGTH * vals.length; + const bytes = new Uint8Array(totalNumBytes); + let offset = 0; + for (let i2 = 0; i2 < vals.length; i2++) { + const val = vals[i2]; + const bytesOfLength = new Uint8Array(new Uint32Array([val.length]).buffer); + bytes.set(bytesOfLength, offset); + offset += NUM_BYTES_STRING_LENGTH; + bytes.set(val, offset); + offset += val.length; + } + resolve(bytes); + }); + dataPromises.push(utf8bytes); + } else { + dataPromises.push(t.data()); + } + if (group != null) { + spec.group = group; + } + specs.push(spec); + } + const tensorValues = await Promise.all(dataPromises); + return {data: concatenateTypedArrays(tensorValues), specs}; +} +function decodeWeights(buffer2, specs) { + const out = {}; + let float16Decode; + let offset = 0; + for (const spec of specs) { + const name = spec.name; + const dtype = spec.dtype; + const shape = spec.shape; + const size = sizeFromShape(shape); + let values; + if ("quantization" in spec) { + const quantization = spec.quantization; + if (quantization.dtype === "uint8" || quantization.dtype === "uint16") { + if (!("min" in quantization && "scale" in quantization)) { + throw new Error(`Weight ${spec.name} with quantization ${quantization.dtype} doesn't have corresponding metadata min and scale.`); + } + } else if (quantization.dtype === "float16") { + if (dtype !== "float32") { + throw new Error(`Weight ${spec.name} is quantized with ${quantization.dtype} which only supports weights of type float32 not ${dtype}.`); + } + } else { + throw new Error(`Weight ${spec.name} has unknown quantization dtype ${quantization.dtype}. Supported quantization dtypes are: 'uint8', 'uint16', and 'float16'.`); + } + const quantizationSizeFactor = DTYPE_VALUE_SIZE_MAP[quantization.dtype]; + const byteBuffer = buffer2.slice(offset, offset + size * quantizationSizeFactor); + const quantizedArray = quantization.dtype === "uint8" ? new Uint8Array(byteBuffer) : new Uint16Array(byteBuffer); + if (dtype === "float32") { + if (quantization.dtype === "uint8" || quantization.dtype === "uint16") { + values = new Float32Array(quantizedArray.length); + for (let i = 0; i < quantizedArray.length; i++) { + const v = quantizedArray[i]; + values[i] = v * quantization.scale + quantization.min; + } + } else if (quantization.dtype === "float16") { + if (float16Decode === void 0) { + float16Decode = getFloat16Decoder(); + } + values = float16Decode(quantizedArray); + } else { + throw new Error(`Unsupported quantization type ${quantization.dtype} for weight type float32.`); + } + } else if (dtype === "int32") { + if (quantization.dtype !== "uint8" && quantization.dtype !== "uint16") { + throw new Error(`Unsupported quantization type ${quantization.dtype} for weight type int32.`); + } + values = new Int32Array(quantizedArray.length); + for (let i = 0; i < quantizedArray.length; i++) { + const v = quantizedArray[i]; + values[i] = Math.round(v * quantization.scale + quantization.min); + } + } else { + throw new Error(`Unsupported dtype in weight '${name}': ${dtype}`); + } + offset += size * quantizationSizeFactor; + } else if (dtype === "string") { + const size2 = sizeFromShape(spec.shape); + values = []; + for (let i = 0; i < size2; i++) { + const byteLength = new Uint32Array(buffer2.slice(offset, offset + NUM_BYTES_STRING_LENGTH))[0]; + offset += NUM_BYTES_STRING_LENGTH; + const bytes = new Uint8Array(buffer2.slice(offset, offset + byteLength)); + values.push(bytes); + offset += byteLength; + } + } else { + const dtypeFactor = DTYPE_VALUE_SIZE_MAP[dtype]; + const byteBuffer = buffer2.slice(offset, offset + size * dtypeFactor); + if (dtype === "float32") { + values = new Float32Array(byteBuffer); + } else if (dtype === "int32") { + values = new Int32Array(byteBuffer); + } else if (dtype === "bool") { + values = new Uint8Array(byteBuffer); + } else if (dtype === "complex64") { + values = new Float32Array(byteBuffer); + const real4 = new Float32Array(values.length / 2); + const image3 = new Float32Array(values.length / 2); + for (let i = 0; i < real4.length; i++) { + real4[i] = values[i * 2]; + image3[i] = values[i * 2 + 1]; + } + const realTensor = tensor(real4, shape, "float32"); + const imageTensor = tensor(image3, shape, "float32"); + out[name] = complex(realTensor, imageTensor); + realTensor.dispose(); + imageTensor.dispose(); + } else { + throw new Error(`Unsupported dtype in weight '${name}': ${dtype}`); + } + offset += size * dtypeFactor; + } + if (dtype !== "complex64") { + out[name] = tensor(values, shape, dtype); + } + } + return out; +} +function concatenateTypedArrays(xs) { + if (xs === null) { + throw new Error(`Invalid input value: ${JSON.stringify(xs)}`); + } + let totalByteLength = 0; + const normalizedXs = []; + xs.forEach((x) => { + totalByteLength += x.byteLength; + normalizedXs.push(x.byteLength === x.buffer.byteLength ? x : new x.constructor(x)); + if (!(x instanceof Float32Array || x instanceof Int32Array || x instanceof Uint8Array)) { + throw new Error(`Unsupported TypedArray subtype: ${x.constructor.name}`); + } + }); + const y = new Uint8Array(totalByteLength); + let offset = 0; + normalizedXs.forEach((x) => { + y.set(new Uint8Array(x.buffer), offset); + offset += x.byteLength; + }); + return y.buffer; +} +var useNodeBuffer = typeof Buffer !== "undefined" && (typeof Blob === "undefined" || typeof atob === "undefined" || typeof btoa === "undefined"); +function stringByteLength(str2) { + if (useNodeBuffer) { + return Buffer.byteLength(str2); + } + return new Blob([str2]).size; +} +function arrayBufferToBase64String(buffer2) { + if (useNodeBuffer) { + return Buffer.from(buffer2).toString("base64"); + } + const buf = new Uint8Array(buffer2); + let s = ""; + for (let i = 0, l = buf.length; i < l; i++) { + s += String.fromCharCode(buf[i]); + } + return btoa(s); +} +function base64StringToArrayBuffer(str2) { + if (useNodeBuffer) { + const buf = Buffer.from(str2, "base64"); + return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength); + } + const s = atob(str2); + const buffer2 = new Uint8Array(s.length); + for (let i = 0; i < s.length; ++i) { + buffer2.set([s.charCodeAt(i)], i); + } + return buffer2.buffer; +} +function concatenateArrayBuffers(buffers) { + if (buffers.length === 1) { + return buffers[0]; + } + let totalByteLength = 0; + buffers.forEach((buffer2) => { + totalByteLength += buffer2.byteLength; + }); + const temp = new Uint8Array(totalByteLength); + let offset = 0; + buffers.forEach((buffer2) => { + temp.set(new Uint8Array(buffer2), offset); + offset += buffer2.byteLength; + }); + return temp.buffer; +} +function basename(path) { + const SEPARATOR = "/"; + path = path.trim(); + while (path.endsWith(SEPARATOR)) { + path = path.slice(0, path.length - 1); + } + const items = path.split(SEPARATOR); + return items[items.length - 1]; +} +function getModelArtifactsInfoForJSON(modelArtifacts) { + if (modelArtifacts.modelTopology instanceof ArrayBuffer) { + throw new Error("Expected JSON model topology, received ArrayBuffer."); + } + return { + dateSaved: new Date(), + modelTopologyType: "JSON", + modelTopologyBytes: modelArtifacts.modelTopology == null ? 0 : stringByteLength(JSON.stringify(modelArtifacts.modelTopology)), + weightSpecsBytes: modelArtifacts.weightSpecs == null ? 0 : stringByteLength(JSON.stringify(modelArtifacts.weightSpecs)), + weightDataBytes: modelArtifacts.weightData == null ? 0 : modelArtifacts.weightData.byteLength + }; +} +function computeFloat16MantisaTable() { + const convertMantissa = (i) => { + let m = i << 13; + let e = 0; + while ((m & 8388608) === 0) { + e -= 8388608; + m <<= 1; + } + m &= ~8388608; + e += 947912704; + return m | e; + }; + const mantisaTable = new Uint32Array(2048); + mantisaTable[0] = 0; + for (let i = 1; i < 1024; i++) { + mantisaTable[i] = convertMantissa(i); + } + for (let i = 1024; i < 2048; i++) { + mantisaTable[i] = 939524096 + (i - 1024 << 13); + } + return mantisaTable; +} +function computeFloat16ExponentTable() { + const exponentTable = new Uint32Array(64); + exponentTable[0] = 0; + exponentTable[31] = 1199570944; + exponentTable[32] = 2147483648; + exponentTable[63] = 3347054592; + for (let i = 1; i < 31; i++) { + exponentTable[i] = i << 23; + } + for (let i = 33; i < 63; i++) { + exponentTable[i] = 2147483648 + (i - 32 << 23); + } + return exponentTable; +} +function computeFloat16OffsetTable() { + const offsetTable = new Uint32Array(64); + for (let i = 0; i < 64; i++) { + offsetTable[i] = 1024; + } + offsetTable[0] = offsetTable[32] = 0; + return offsetTable; +} +function getFloat16Decoder() { + const mantisaTable = computeFloat16MantisaTable(); + const exponentTable = computeFloat16ExponentTable(); + const offsetTable = computeFloat16OffsetTable(); + return (quantizedArray) => { + const buffer2 = new ArrayBuffer(4 * quantizedArray.length); + const bufferUint32View = new Uint32Array(buffer2); + for (let index = 0; index < quantizedArray.length; index++) { + const float16Bits = quantizedArray[index]; + const float32Bits = mantisaTable[offsetTable[float16Bits >> 10] + (float16Bits & 1023)] + exponentTable[float16Bits >> 10]; + bufferUint32View[index] = float32Bits; + } + return new Float32Array(buffer2); + }; +} +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +var IORouterRegistry = class { + constructor() { + this.saveRouters = []; + this.loadRouters = []; + } + static getInstance() { + if (IORouterRegistry.instance == null) { + IORouterRegistry.instance = new IORouterRegistry(); + } + return IORouterRegistry.instance; + } + static registerSaveRouter(saveRouter) { + IORouterRegistry.getInstance().saveRouters.push(saveRouter); + } + static registerLoadRouter(loadRouter) { + IORouterRegistry.getInstance().loadRouters.push(loadRouter); + } + static getSaveHandlers(url) { + return IORouterRegistry.getHandlers(url, "save"); + } + static getLoadHandlers(url, loadOptions) { + return IORouterRegistry.getHandlers(url, "load", loadOptions); + } + static getHandlers(url, handlerType, loadOptions) { + const validHandlers = []; + const routers = handlerType === "load" ? IORouterRegistry.getInstance().loadRouters : IORouterRegistry.getInstance().saveRouters; + routers.forEach((router) => { + const handler = router(url, loadOptions); + if (handler !== null) { + validHandlers.push(handler); + } + }); + return validHandlers; + } +}; +var registerSaveRouter = (loudRouter) => IORouterRegistry.registerSaveRouter(loudRouter); +var registerLoadRouter = (loudRouter) => IORouterRegistry.registerLoadRouter(loudRouter); +var getSaveHandlers = (url) => IORouterRegistry.getSaveHandlers(url); +var getLoadHandlers = (url, loadOptions) => IORouterRegistry.getLoadHandlers(url, loadOptions); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +var DATABASE_NAME = "tensorflowjs"; +var DATABASE_VERSION = 1; +var MODEL_STORE_NAME = "models_store"; +var INFO_STORE_NAME = "model_info_store"; +function getIndexedDBFactory() { + if (!env().getBool("IS_BROWSER")) { + throw new Error("Failed to obtain IndexedDB factory because the current environmentis not a web browser."); + } + const theWindow = typeof window === "undefined" ? self : window; + const factory = theWindow.indexedDB || theWindow.mozIndexedDB || theWindow.webkitIndexedDB || theWindow.msIndexedDB || theWindow.shimIndexedDB; + if (factory == null) { + throw new Error("The current browser does not appear to support IndexedDB."); + } + return factory; +} +function setUpDatabase(openRequest) { + const db = openRequest.result; + db.createObjectStore(MODEL_STORE_NAME, {keyPath: "modelPath"}); + db.createObjectStore(INFO_STORE_NAME, {keyPath: "modelPath"}); +} +var BrowserIndexedDB = class { + constructor(modelPath) { + this.indexedDB = getIndexedDBFactory(); + if (modelPath == null || !modelPath) { + throw new Error("For IndexedDB, modelPath must not be null, undefined or empty."); + } + this.modelPath = modelPath; + } + async save(modelArtifacts) { + if (modelArtifacts.modelTopology instanceof ArrayBuffer) { + throw new Error("BrowserLocalStorage.save() does not support saving model topology in binary formats yet."); + } + return this.databaseAction(this.modelPath, modelArtifacts); + } + async load() { + return this.databaseAction(this.modelPath); + } + databaseAction(modelPath, modelArtifacts) { + return new Promise((resolve, reject) => { + const openRequest = this.indexedDB.open(DATABASE_NAME, DATABASE_VERSION); + openRequest.onupgradeneeded = () => setUpDatabase(openRequest); + openRequest.onsuccess = () => { + const db = openRequest.result; + if (modelArtifacts == null) { + const modelTx = db.transaction(MODEL_STORE_NAME, "readonly"); + const modelStore = modelTx.objectStore(MODEL_STORE_NAME); + const getRequest = modelStore.get(this.modelPath); + getRequest.onsuccess = () => { + if (getRequest.result == null) { + db.close(); + return reject(new Error(`Cannot find model with path '${this.modelPath}' in IndexedDB.`)); + } else { + resolve(getRequest.result.modelArtifacts); + } + }; + getRequest.onerror = (error) => { + db.close(); + return reject(getRequest.error); + }; + modelTx.oncomplete = () => db.close(); + } else { + const modelArtifactsInfo = getModelArtifactsInfoForJSON(modelArtifacts); + const infoTx = db.transaction(INFO_STORE_NAME, "readwrite"); + let infoStore = infoTx.objectStore(INFO_STORE_NAME); + const putInfoRequest = infoStore.put({modelPath: this.modelPath, modelArtifactsInfo}); + let modelTx; + putInfoRequest.onsuccess = () => { + modelTx = db.transaction(MODEL_STORE_NAME, "readwrite"); + const modelStore = modelTx.objectStore(MODEL_STORE_NAME); + const putModelRequest = modelStore.put({ + modelPath: this.modelPath, + modelArtifacts, + modelArtifactsInfo + }); + putModelRequest.onsuccess = () => resolve({modelArtifactsInfo}); + putModelRequest.onerror = (error) => { + infoStore = infoTx.objectStore(INFO_STORE_NAME); + const deleteInfoRequest = infoStore.delete(this.modelPath); + deleteInfoRequest.onsuccess = () => { + db.close(); + return reject(putModelRequest.error); + }; + deleteInfoRequest.onerror = (error2) => { + db.close(); + return reject(putModelRequest.error); + }; + }; + }; + putInfoRequest.onerror = (error) => { + db.close(); + return reject(putInfoRequest.error); + }; + infoTx.oncomplete = () => { + if (modelTx == null) { + db.close(); + } else { + modelTx.oncomplete = () => db.close(); + } + }; + } + }; + openRequest.onerror = (error) => reject(openRequest.error); + }); + } +}; +BrowserIndexedDB.URL_SCHEME = "indexeddb://"; +var indexedDBRouter = (url) => { + if (!env().getBool("IS_BROWSER")) { + return null; + } else { + if (!Array.isArray(url) && url.startsWith(BrowserIndexedDB.URL_SCHEME)) { + return browserIndexedDB(url.slice(BrowserIndexedDB.URL_SCHEME.length)); + } else { + return null; + } + } +}; +IORouterRegistry.registerSaveRouter(indexedDBRouter); +IORouterRegistry.registerLoadRouter(indexedDBRouter); +function browserIndexedDB(modelPath) { + return new BrowserIndexedDB(modelPath); +} +function maybeStripScheme(key) { + return key.startsWith(BrowserIndexedDB.URL_SCHEME) ? key.slice(BrowserIndexedDB.URL_SCHEME.length) : key; +} +var BrowserIndexedDBManager = class { + constructor() { + this.indexedDB = getIndexedDBFactory(); + } + async listModels() { + return new Promise((resolve, reject) => { + const openRequest = this.indexedDB.open(DATABASE_NAME, DATABASE_VERSION); + openRequest.onupgradeneeded = () => setUpDatabase(openRequest); + openRequest.onsuccess = () => { + const db = openRequest.result; + const tx = db.transaction(INFO_STORE_NAME, "readonly"); + const store = tx.objectStore(INFO_STORE_NAME); + const getAllInfoRequest = store.getAll(); + getAllInfoRequest.onsuccess = () => { + const out = {}; + for (const item of getAllInfoRequest.result) { + out[item.modelPath] = item.modelArtifactsInfo; + } + resolve(out); + }; + getAllInfoRequest.onerror = (error) => { + db.close(); + return reject(getAllInfoRequest.error); + }; + tx.oncomplete = () => db.close(); + }; + openRequest.onerror = (error) => reject(openRequest.error); + }); + } + async removeModel(path) { + path = maybeStripScheme(path); + return new Promise((resolve, reject) => { + const openRequest = this.indexedDB.open(DATABASE_NAME, DATABASE_VERSION); + openRequest.onupgradeneeded = () => setUpDatabase(openRequest); + openRequest.onsuccess = () => { + const db = openRequest.result; + const infoTx = db.transaction(INFO_STORE_NAME, "readwrite"); + const infoStore = infoTx.objectStore(INFO_STORE_NAME); + const getInfoRequest = infoStore.get(path); + let modelTx; + getInfoRequest.onsuccess = () => { + if (getInfoRequest.result == null) { + db.close(); + return reject(new Error(`Cannot find model with path '${path}' in IndexedDB.`)); + } else { + const deleteInfoRequest = infoStore.delete(path); + const deleteModelData = () => { + modelTx = db.transaction(MODEL_STORE_NAME, "readwrite"); + const modelStore = modelTx.objectStore(MODEL_STORE_NAME); + const deleteModelRequest = modelStore.delete(path); + deleteModelRequest.onsuccess = () => resolve(getInfoRequest.result.modelArtifactsInfo); + deleteModelRequest.onerror = (error) => reject(getInfoRequest.error); + }; + deleteInfoRequest.onsuccess = deleteModelData; + deleteInfoRequest.onerror = (error) => { + deleteModelData(); + db.close(); + return reject(getInfoRequest.error); + }; + } + }; + getInfoRequest.onerror = (error) => { + db.close(); + return reject(getInfoRequest.error); + }; + infoTx.oncomplete = () => { + if (modelTx == null) { + db.close(); + } else { + modelTx.oncomplete = () => db.close(); + } + }; + }; + openRequest.onerror = (error) => reject(openRequest.error); + }); + } +}; +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +var PATH_SEPARATOR = "/"; +var PATH_PREFIX = "tensorflowjs_models"; +var INFO_SUFFIX = "info"; +var MODEL_TOPOLOGY_SUFFIX = "model_topology"; +var WEIGHT_SPECS_SUFFIX = "weight_specs"; +var WEIGHT_DATA_SUFFIX = "weight_data"; +var MODEL_METADATA_SUFFIX = "model_metadata"; +function getModelKeys(path) { + return { + info: [PATH_PREFIX, path, INFO_SUFFIX].join(PATH_SEPARATOR), + topology: [PATH_PREFIX, path, MODEL_TOPOLOGY_SUFFIX].join(PATH_SEPARATOR), + weightSpecs: [PATH_PREFIX, path, WEIGHT_SPECS_SUFFIX].join(PATH_SEPARATOR), + weightData: [PATH_PREFIX, path, WEIGHT_DATA_SUFFIX].join(PATH_SEPARATOR), + modelMetadata: [PATH_PREFIX, path, MODEL_METADATA_SUFFIX].join(PATH_SEPARATOR) + }; +} +function getModelPathFromKey(key) { + const items = key.split(PATH_SEPARATOR); + if (items.length < 3) { + throw new Error(`Invalid key format: ${key}`); + } + return items.slice(1, items.length - 1).join(PATH_SEPARATOR); +} +function maybeStripScheme2(key) { + return key.startsWith(BrowserLocalStorage.URL_SCHEME) ? key.slice(BrowserLocalStorage.URL_SCHEME.length) : key; +} +var BrowserLocalStorage = class { + constructor(modelPath) { + if (!env().getBool("IS_BROWSER") || typeof window === "undefined" || typeof window.localStorage === "undefined") { + throw new Error("The current environment does not support local storage."); + } + this.LS = window.localStorage; + if (modelPath == null || !modelPath) { + throw new Error("For local storage, modelPath must not be null, undefined or empty."); + } + this.modelPath = modelPath; + this.keys = getModelKeys(this.modelPath); + } + async save(modelArtifacts) { + if (modelArtifacts.modelTopology instanceof ArrayBuffer) { + throw new Error("BrowserLocalStorage.save() does not support saving model topology in binary formats yet."); + } else { + const topology = JSON.stringify(modelArtifacts.modelTopology); + const weightSpecs = JSON.stringify(modelArtifacts.weightSpecs); + const modelArtifactsInfo = getModelArtifactsInfoForJSON(modelArtifacts); + try { + this.LS.setItem(this.keys.info, JSON.stringify(modelArtifactsInfo)); + this.LS.setItem(this.keys.topology, topology); + this.LS.setItem(this.keys.weightSpecs, weightSpecs); + this.LS.setItem(this.keys.weightData, arrayBufferToBase64String(modelArtifacts.weightData)); + const result = { + format: modelArtifacts.format, + generatedBy: modelArtifacts.generatedBy, + convertedBy: modelArtifacts.convertedBy + }; + if (modelArtifacts.signature != null) { + result.signature = modelArtifacts.signature; + } + if (modelArtifacts.userDefinedMetadata != null) { + result.userDefinedMetadata = modelArtifacts.userDefinedMetadata; + } + if (modelArtifacts.modelInitializer != null) { + result.modelInitializer = modelArtifacts.modelInitializer; + } + this.LS.setItem(this.keys.modelMetadata, JSON.stringify(result)); + return {modelArtifactsInfo}; + } catch (err) { + this.LS.removeItem(this.keys.info); + this.LS.removeItem(this.keys.topology); + this.LS.removeItem(this.keys.weightSpecs); + this.LS.removeItem(this.keys.weightData); + this.LS.removeItem(this.keys.modelMetadata); + throw new Error(`Failed to save model '${this.modelPath}' to local storage: size quota being exceeded is a possible cause of this failure: modelTopologyBytes=${modelArtifactsInfo.modelTopologyBytes}, weightSpecsBytes=${modelArtifactsInfo.weightSpecsBytes}, weightDataBytes=${modelArtifactsInfo.weightDataBytes}.`); + } + } + } + async load() { + const info2 = JSON.parse(this.LS.getItem(this.keys.info)); + if (info2 == null) { + throw new Error(`In local storage, there is no model with name '${this.modelPath}'`); + } + if (info2.modelTopologyType !== "JSON") { + throw new Error("BrowserLocalStorage does not support loading non-JSON model topology yet."); + } + const out = {}; + const topology = JSON.parse(this.LS.getItem(this.keys.topology)); + if (topology == null) { + throw new Error(`In local storage, the topology of model '${this.modelPath}' is missing.`); + } + out.modelTopology = topology; + const weightSpecs = JSON.parse(this.LS.getItem(this.keys.weightSpecs)); + if (weightSpecs == null) { + throw new Error(`In local storage, the weight specs of model '${this.modelPath}' are missing.`); + } + out.weightSpecs = weightSpecs; + const metadataString = this.LS.getItem(this.keys.modelMetadata); + if (metadataString != null) { + const metadata = JSON.parse(metadataString); + out.format = metadata["format"]; + out.generatedBy = metadata["generatedBy"]; + out.convertedBy = metadata["convertedBy"]; + if (metadata["signature"] != null) { + out.signature = metadata["signature"]; + } + if (metadata["userDefinedMetadata"] != null) { + out.userDefinedMetadata = metadata["userDefinedMetadata"]; + } + if (metadata["modelInitializer"] != null) { + out.modelInitializer = metadata["modelInitializer"]; + } + } + const weightDataBase64 = this.LS.getItem(this.keys.weightData); + if (weightDataBase64 == null) { + throw new Error(`In local storage, the binary weight values of model '${this.modelPath}' are missing.`); + } + out.weightData = base64StringToArrayBuffer(weightDataBase64); + return out; + } +}; +BrowserLocalStorage.URL_SCHEME = "localstorage://"; +var localStorageRouter = (url) => { + if (!env().getBool("IS_BROWSER")) { + return null; + } else { + if (!Array.isArray(url) && url.startsWith(BrowserLocalStorage.URL_SCHEME)) { + return browserLocalStorage(url.slice(BrowserLocalStorage.URL_SCHEME.length)); + } else { + return null; + } + } +}; +IORouterRegistry.registerSaveRouter(localStorageRouter); +IORouterRegistry.registerLoadRouter(localStorageRouter); +function browserLocalStorage(modelPath) { + return new BrowserLocalStorage(modelPath); +} +var BrowserLocalStorageManager = class { + constructor() { + assert(env().getBool("IS_BROWSER"), () => "Current environment is not a web browser"); + assert(typeof window === "undefined" || typeof window.localStorage !== "undefined", () => "Current browser does not appear to support localStorage"); + this.LS = window.localStorage; + } + async listModels() { + const out = {}; + const prefix = PATH_PREFIX + PATH_SEPARATOR; + const suffix = PATH_SEPARATOR + INFO_SUFFIX; + for (let i = 0; i < this.LS.length; ++i) { + const key = this.LS.key(i); + if (key.startsWith(prefix) && key.endsWith(suffix)) { + const modelPath = getModelPathFromKey(key); + out[modelPath] = JSON.parse(this.LS.getItem(key)); + } + } + return out; + } + async removeModel(path) { + path = maybeStripScheme2(path); + const keys = getModelKeys(path); + if (this.LS.getItem(keys.info) == null) { + throw new Error(`Cannot find model at path '${path}'`); + } + const info2 = JSON.parse(this.LS.getItem(keys.info)); + this.LS.removeItem(keys.info); + this.LS.removeItem(keys.topology); + this.LS.removeItem(keys.weightSpecs); + this.LS.removeItem(keys.weightData); + return info2; + } +}; +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +var URL_SCHEME_SUFFIX = "://"; +var ModelStoreManagerRegistry = class { + constructor() { + this.managers = {}; + } + static getInstance() { + if (ModelStoreManagerRegistry.instance == null) { + ModelStoreManagerRegistry.instance = new ModelStoreManagerRegistry(); + } + return ModelStoreManagerRegistry.instance; + } + static registerManager(scheme, manager) { + assert(scheme != null, () => "scheme must not be undefined or null."); + if (scheme.endsWith(URL_SCHEME_SUFFIX)) { + scheme = scheme.slice(0, scheme.indexOf(URL_SCHEME_SUFFIX)); + } + assert(scheme.length > 0, () => "scheme must not be an empty string."); + const registry = ModelStoreManagerRegistry.getInstance(); + assert(registry.managers[scheme] == null, () => `A model store manager is already registered for scheme '${scheme}'.`); + registry.managers[scheme] = manager; + } + static getManager(scheme) { + const manager = this.getInstance().managers[scheme]; + if (manager == null) { + throw new Error(`Cannot find model manager for scheme '${scheme}'`); + } + return manager; + } + static getSchemes() { + return Object.keys(this.getInstance().managers); + } +}; +function parseURL(url) { + if (url.indexOf(URL_SCHEME_SUFFIX) === -1) { + throw new Error(`The url string provided does not contain a scheme. Supported schemes are: ${ModelStoreManagerRegistry.getSchemes().join(",")}`); + } + return { + scheme: url.split(URL_SCHEME_SUFFIX)[0], + path: url.split(URL_SCHEME_SUFFIX)[1] + }; +} +async function cloneModelInternal(sourceURL, destURL, deleteSource = false) { + assert(sourceURL !== destURL, () => `Old path and new path are the same: '${sourceURL}'`); + const loadHandlers = IORouterRegistry.getLoadHandlers(sourceURL); + assert(loadHandlers.length > 0, () => `Copying failed because no load handler is found for source URL ${sourceURL}.`); + assert(loadHandlers.length < 2, () => `Copying failed because more than one (${loadHandlers.length}) load handlers for source URL ${sourceURL}.`); + const loadHandler = loadHandlers[0]; + const saveHandlers = IORouterRegistry.getSaveHandlers(destURL); + assert(saveHandlers.length > 0, () => `Copying failed because no save handler is found for destination URL ${destURL}.`); + assert(saveHandlers.length < 2, () => `Copying failed because more than one (${loadHandlers.length}) save handlers for destination URL ${destURL}.`); + const saveHandler = saveHandlers[0]; + const sourceScheme = parseURL(sourceURL).scheme; + const sourcePath = parseURL(sourceURL).path; + const sameMedium = sourceScheme === parseURL(sourceURL).scheme; + const modelArtifacts = await loadHandler.load(); + if (deleteSource && sameMedium) { + await ModelStoreManagerRegistry.getManager(sourceScheme).removeModel(sourcePath); + } + const saveResult = await saveHandler.save(modelArtifacts); + if (deleteSource && !sameMedium) { + await ModelStoreManagerRegistry.getManager(sourceScheme).removeModel(sourcePath); + } + return saveResult.modelArtifactsInfo; +} +async function listModels() { + const schemes = ModelStoreManagerRegistry.getSchemes(); + const out = {}; + for (const scheme of schemes) { + const schemeOut = await ModelStoreManagerRegistry.getManager(scheme).listModels(); + for (const path in schemeOut) { + const url = scheme + URL_SCHEME_SUFFIX + path; + out[url] = schemeOut[path]; + } + } + return out; +} +async function removeModel(url) { + const schemeAndPath = parseURL(url); + const manager = ModelStoreManagerRegistry.getManager(schemeAndPath.scheme); + return manager.removeModel(schemeAndPath.path); +} +async function copyModel(sourceURL, destURL) { + const deleteSource = false; + return cloneModelInternal(sourceURL, destURL, deleteSource); +} +async function moveModel(sourceURL, destURL) { + const deleteSource = true; + return cloneModelInternal(sourceURL, destURL, deleteSource); +} +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +var PlatformBrowser = class { + fetch(path, init2) { + return fetch(path, init2); + } + now() { + return performance.now(); + } + encode(text, encoding) { + if (encoding !== "utf-8" && encoding !== "utf8") { + throw new Error(`Browser's encoder only supports utf-8, but got ${encoding}`); + } + if (this.textEncoder == null) { + this.textEncoder = new TextEncoder(); + } + return this.textEncoder.encode(text); + } + decode(bytes, encoding) { + return new TextDecoder(encoding).decode(bytes); + } +}; +if (env().get("IS_BROWSER")) { + env().setPlatform("browser", new PlatformBrowser()); + try { + ModelStoreManagerRegistry.registerManager(BrowserLocalStorage.URL_SCHEME, new BrowserLocalStorageManager()); + } catch (err) { + } + try { + ModelStoreManagerRegistry.registerManager(BrowserIndexedDB.URL_SCHEME, new BrowserIndexedDBManager()); + } catch (err) { + } +} +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +var getNodeFetch = { + importFetch: () => require_browser() +}; +var systemFetch; +var PlatformNode = class { + constructor() { + this.util = require("util"); + this.textEncoder = new this.util.TextEncoder(); + } + fetch(path, requestInits) { + if (env().global.fetch != null) { + return env().global.fetch(path, requestInits); + } + if (systemFetch == null) { + systemFetch = getNodeFetch.importFetch(); + } + return systemFetch(path, requestInits); + } + now() { + const time2 = process.hrtime(); + return time2[0] * 1e3 + time2[1] / 1e6; + } + encode(text, encoding) { + if (encoding !== "utf-8" && encoding !== "utf8") { + throw new Error(`Node built-in encoder only supports utf-8, but got ${encoding}`); + } + return this.textEncoder.encode(text); + } + decode(bytes, encoding) { + if (bytes.length === 0) { + return ""; + } + return new this.util.TextDecoder(encoding).decode(bytes); + } +}; +if (env().get("IS_NODE")) { + env().setPlatform("node", new PlatformNode()); +} +/** + * @license + * Copyright 2020 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function buffer(shape, dtype = "float32", values) { + dtype = dtype || "float32"; + assertNonNegativeIntegerDimensions(shape); + return new TensorBuffer(shape, dtype, values); +} +/** + * @license + * Copyright 2020 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function cast_(x, dtype) { + const $x = convertToTensor(x, "x", "cast"); + if (!isValidDtype(dtype)) { + throw new Error(`Failed to cast to unknown dtype ${dtype}`); + } + if (dtype === "string" && $x.dtype !== "string" || dtype !== "string" && $x.dtype === "string") { + throw new Error("Only strings can be casted to strings"); + } + const inputs = {x: $x}; + const attrs = {dtype}; + return ENGINE.runKernel(Cast, inputs, attrs); +} +var cast = op({cast_}); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function clone_(x) { + const $x = convertToTensor(x, "x", "clone", "string_or_numeric"); + const inputs = {x: $x}; + return ENGINE.runKernel(Identity, inputs); +} +var clone = op({clone_}); +/** + * @license + * Copyright 2020 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function print2(x, verbose = false) { + console.log(x.toString(verbose)); +} +/** + * @license + * Copyright 2020 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +getOrMakeEngine(); +var opHandler2 = { + buffer, + cast, + clone, + print: print2 +}; +setOpHandler(opHandler2); +var io_exports = {}; +__export2(io_exports, { + browserFiles: () => browserFiles, + browserHTTPRequest: () => browserHTTPRequest, + concatenateArrayBuffers: () => concatenateArrayBuffers, + copyModel: () => copyModel, + decodeWeights: () => decodeWeights, + encodeWeights: () => encodeWeights, + fromMemory: () => fromMemory, + getLoadHandlers: () => getLoadHandlers, + getModelArtifactsInfoForJSON: () => getModelArtifactsInfoForJSON, + getSaveHandlers: () => getSaveHandlers, + http: () => http, + isHTTPScheme: () => isHTTPScheme, + listModels: () => listModels, + loadWeights: () => loadWeights, + moveModel: () => moveModel, + registerLoadRouter: () => registerLoadRouter, + registerSaveRouter: () => registerSaveRouter, + removeModel: () => removeModel, + weightsLoaderFactory: () => weightsLoaderFactory, + withSaveHandler: () => withSaveHandler +}); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +var DEFAULT_FILE_NAME_PREFIX = "model"; +var DEFAULT_JSON_EXTENSION_NAME = ".json"; +var DEFAULT_WEIGHT_DATA_EXTENSION_NAME = ".weights.bin"; +function defer(f) { + return new Promise((resolve) => setTimeout(resolve)).then(f); +} +var BrowserDownloads = class { + constructor(fileNamePrefix) { + if (!env().getBool("IS_BROWSER")) { + throw new Error("browserDownloads() cannot proceed because the current environment is not a browser."); + } + if (fileNamePrefix.startsWith(BrowserDownloads.URL_SCHEME)) { + fileNamePrefix = fileNamePrefix.slice(BrowserDownloads.URL_SCHEME.length); + } + if (fileNamePrefix == null || fileNamePrefix.length === 0) { + fileNamePrefix = DEFAULT_FILE_NAME_PREFIX; + } + this.modelTopologyFileName = fileNamePrefix + DEFAULT_JSON_EXTENSION_NAME; + this.weightDataFileName = fileNamePrefix + DEFAULT_WEIGHT_DATA_EXTENSION_NAME; + } + async save(modelArtifacts) { + if (typeof document === "undefined") { + throw new Error("Browser downloads are not supported in this environment since `document` is not present"); + } + const weightsURL = window.URL.createObjectURL(new Blob([modelArtifacts.weightData], {type: "application/octet-stream"})); + if (modelArtifacts.modelTopology instanceof ArrayBuffer) { + throw new Error("BrowserDownloads.save() does not support saving model topology in binary formats yet."); + } else { + const weightsManifest = [{ + paths: ["./" + this.weightDataFileName], + weights: modelArtifacts.weightSpecs + }]; + const modelTopologyAndWeightManifest = { + modelTopology: modelArtifacts.modelTopology, + format: modelArtifacts.format, + generatedBy: modelArtifacts.generatedBy, + convertedBy: modelArtifacts.convertedBy, + weightsManifest + }; + if (modelArtifacts.signature != null) { + modelTopologyAndWeightManifest.signature = modelArtifacts.signature; + } + if (modelArtifacts.userDefinedMetadata != null) { + modelTopologyAndWeightManifest.userDefinedMetadata = modelArtifacts.userDefinedMetadata; + } + if (modelArtifacts.modelInitializer != null) { + modelTopologyAndWeightManifest.modelInitializer = modelArtifacts.modelInitializer; + } + const modelTopologyAndWeightManifestURL = window.URL.createObjectURL(new Blob([JSON.stringify(modelTopologyAndWeightManifest)], {type: "application/json"})); + const jsonAnchor = this.jsonAnchor == null ? document.createElement("a") : this.jsonAnchor; + jsonAnchor.download = this.modelTopologyFileName; + jsonAnchor.href = modelTopologyAndWeightManifestURL; + await defer(() => jsonAnchor.dispatchEvent(new MouseEvent("click"))); + if (modelArtifacts.weightData != null) { + const weightDataAnchor = this.weightDataAnchor == null ? document.createElement("a") : this.weightDataAnchor; + weightDataAnchor.download = this.weightDataFileName; + weightDataAnchor.href = weightsURL; + await defer(() => weightDataAnchor.dispatchEvent(new MouseEvent("click"))); + } + return {modelArtifactsInfo: getModelArtifactsInfoForJSON(modelArtifacts)}; + } + } +}; +BrowserDownloads.URL_SCHEME = "downloads://"; +var BrowserFiles = class { + constructor(files) { + if (files == null || files.length < 1) { + throw new Error(`When calling browserFiles, at least 1 file is required, but received ${files}`); + } + this.files = files; + } + async load() { + const jsonFile = this.files[0]; + const weightFiles = this.files.slice(1); + return new Promise((resolve, reject) => { + const jsonReader = new FileReader(); + jsonReader.onload = (event) => { + const modelJSON = JSON.parse(event.target.result); + const modelTopology = modelJSON.modelTopology; + if (modelTopology == null) { + reject(new Error(`modelTopology field is missing from file ${jsonFile.name}`)); + return; + } + if (weightFiles.length === 0) { + resolve({modelTopology}); + } + const weightsManifest = modelJSON.weightsManifest; + if (weightsManifest == null) { + reject(new Error(`weightManifest field is missing from file ${jsonFile.name}`)); + return; + } + let pathToFile; + try { + pathToFile = this.checkManifestAndWeightFiles(weightsManifest, weightFiles); + } catch (err) { + reject(err); + return; + } + const weightSpecs = []; + const paths = []; + const perFileBuffers = []; + weightsManifest.forEach((weightsGroup) => { + weightsGroup.paths.forEach((path) => { + paths.push(path); + perFileBuffers.push(null); + }); + weightSpecs.push(...weightsGroup.weights); + }); + weightsManifest.forEach((weightsGroup) => { + weightsGroup.paths.forEach((path) => { + const weightFileReader = new FileReader(); + weightFileReader.onload = (event2) => { + const weightData = event2.target.result; + const index = paths.indexOf(path); + perFileBuffers[index] = weightData; + if (perFileBuffers.indexOf(null) === -1) { + const result = { + modelTopology, + weightSpecs, + weightData: concatenateArrayBuffers(perFileBuffers), + format: modelJSON.format, + generatedBy: modelJSON.generatedBy, + convertedBy: modelJSON.convertedBy + }; + if (modelJSON.signature != null) { + result.signature = modelJSON.signature; + } + if (modelJSON.userDefinedMetadata != null) { + result.userDefinedMetadata = modelJSON.userDefinedMetadata; + } + if (modelJSON.modelInitializer != null) { + result.modelInitializer = modelJSON.modelInitializer; + } + resolve(result); + } + }; + weightFileReader.onerror = (error) => reject(`Failed to weights data from file of path '${path}'.`); + weightFileReader.readAsArrayBuffer(pathToFile[path]); + }); + }); + }; + jsonReader.onerror = (error) => reject(`Failed to read model topology and weights manifest JSON from file '${jsonFile.name}'. BrowserFiles supports loading Keras-style tf.Model artifacts only.`); + jsonReader.readAsText(jsonFile); + }); + } + checkManifestAndWeightFiles(manifest, files) { + const basenames = []; + const fileNames = files.map((file) => basename(file.name)); + const pathToFile = {}; + for (const group of manifest) { + group.paths.forEach((path) => { + const pathBasename = basename(path); + if (basenames.indexOf(pathBasename) !== -1) { + throw new Error(`Duplicate file basename found in weights manifest: '${pathBasename}'`); + } + basenames.push(pathBasename); + if (fileNames.indexOf(pathBasename) === -1) { + throw new Error(`Weight file with basename '${pathBasename}' is not provided.`); + } else { + pathToFile[path] = files[fileNames.indexOf(pathBasename)]; + } + }); + } + if (basenames.length !== files.length) { + throw new Error(`Mismatch in the number of files in weights manifest (${basenames.length}) and the number of weight files provided (${files.length}).`); + } + return pathToFile; + } +}; +var browserDownloadsRouter = (url) => { + if (!env().getBool("IS_BROWSER")) { + return null; + } else { + if (!Array.isArray(url) && url.startsWith(BrowserDownloads.URL_SCHEME)) { + return browserDownloads(url.slice(BrowserDownloads.URL_SCHEME.length)); + } else { + return null; + } + } +}; +IORouterRegistry.registerSaveRouter(browserDownloadsRouter); +function browserDownloads(fileNamePrefix = "model") { + return new BrowserDownloads(fileNamePrefix); +} +function browserFiles(files) { + return new BrowserFiles(files); +} +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function monitorPromisesProgress(promises, onProgress, startFraction, endFraction) { + checkPromises(promises); + startFraction = startFraction == null ? 0 : startFraction; + endFraction = endFraction == null ? 1 : endFraction; + checkFraction(startFraction, endFraction); + let resolvedPromise = 0; + const registerMonitor = (promise) => { + promise.then((value) => { + const fraction = startFraction + ++resolvedPromise / promises.length * (endFraction - startFraction); + onProgress(fraction); + return value; + }); + return promise; + }; + function checkPromises(promises2) { + assert(promises2 != null && Array.isArray(promises2) && promises2.length > 0, () => "promises must be a none empty array"); + } + function checkFraction(startFraction2, endFraction2) { + assert(startFraction2 >= 0 && startFraction2 <= 1, () => `Progress fraction must be in range [0, 1], but got startFraction ${startFraction2}`); + assert(endFraction2 >= 0 && endFraction2 <= 1, () => `Progress fraction must be in range [0, 1], but got endFraction ${endFraction2}`); + assert(endFraction2 >= startFraction2, () => `startFraction must be no more than endFraction, but got startFraction ${startFraction2} and endFraction ${endFraction2}`); + } + return Promise.all(promises.map(registerMonitor)); +} +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +async function loadWeightsAsArrayBuffer(fetchURLs, loadOptions) { + if (loadOptions == null) { + loadOptions = {}; + } + const fetchFunc = loadOptions.fetchFunc == null ? env().platform.fetch : loadOptions.fetchFunc; + const requests = fetchURLs.map((fetchURL) => fetchFunc(fetchURL, loadOptions.requestInit, {isBinary: true})); + const fetchStartFraction = 0; + const fetchEndFraction = 0.5; + const responses = loadOptions.onProgress == null ? await Promise.all(requests) : await monitorPromisesProgress(requests, loadOptions.onProgress, fetchStartFraction, fetchEndFraction); + const bufferPromises = responses.map((response) => response.arrayBuffer()); + const bufferStartFraction = 0.5; + const bufferEndFraction = 1; + const buffers = loadOptions.onProgress == null ? await Promise.all(bufferPromises) : await monitorPromisesProgress(bufferPromises, loadOptions.onProgress, bufferStartFraction, bufferEndFraction); + return buffers; +} +async function loadWeights(manifest, filePathPrefix = "", weightNames, requestInit) { + const fetchWeights = (fetchUrls) => loadWeightsAsArrayBuffer(fetchUrls, {requestInit}); + const loadWeights2 = weightsLoaderFactory(fetchWeights); + return loadWeights2(manifest, filePathPrefix, weightNames); +} +function weightsLoaderFactory(fetchWeightsFunction) { + return async (manifest, filePathPrefix = "", weightNames) => { + const groupIndicesToFetchMap = manifest.map(() => false); + const groupWeightsToFetch = {}; + const weightsFound = weightNames != null ? weightNames.map(() => false) : []; + const allManifestWeightNames = []; + manifest.forEach((manifestGroupConfig, groupIndex) => { + let groupOffset = 0; + manifestGroupConfig.weights.forEach((weightsEntry) => { + const rawDtype = "quantization" in weightsEntry ? weightsEntry.quantization.dtype : weightsEntry.dtype; + const weightsBytes = DTYPE_VALUE_SIZE_MAP[rawDtype] * sizeFromShape(weightsEntry.shape); + const enqueueWeightsForFetchingFn = () => { + groupIndicesToFetchMap[groupIndex] = true; + if (groupWeightsToFetch[groupIndex] == null) { + groupWeightsToFetch[groupIndex] = []; + } + groupWeightsToFetch[groupIndex].push({ + manifestEntry: weightsEntry, + groupOffset, + sizeBytes: weightsBytes + }); + }; + if (weightNames != null) { + weightNames.forEach((weightName, weightIndex) => { + if (weightName === weightsEntry.name) { + enqueueWeightsForFetchingFn(); + weightsFound[weightIndex] = true; + } + }); + } else { + enqueueWeightsForFetchingFn(); + } + allManifestWeightNames.push(weightsEntry.name); + groupOffset += weightsBytes; + }); + }); + if (!weightsFound.every((found) => found)) { + const weightsNotFound = weightNames.filter((_, i) => !weightsFound[i]); + throw new Error(`Could not find weights in manifest with names: ${weightsNotFound.join(", ")}. +Manifest JSON has weights with names: ${allManifestWeightNames.join(", ")}.`); + } + const groupIndicesToFetch = groupIndicesToFetchMap.reduce((accumulator, shouldFetch, i) => { + if (shouldFetch) { + accumulator.push(i); + } + return accumulator; + }, []); + const fetchUrls = []; + groupIndicesToFetch.forEach((i) => { + manifest[i].paths.forEach((filepath) => { + const fetchUrl = filePathPrefix + (!filePathPrefix.endsWith("/") ? "/" : "") + filepath; + fetchUrls.push(fetchUrl); + }); + }); + const buffers = await fetchWeightsFunction(fetchUrls); + const weightsTensorMap = {}; + let bufferIndexOffset = 0; + groupIndicesToFetch.forEach((i) => { + const numBuffers = manifest[i].paths.length; + let groupBytes = 0; + for (let i2 = 0; i2 < numBuffers; i2++) { + groupBytes += buffers[bufferIndexOffset + i2].byteLength; + } + const groupBuffer = new ArrayBuffer(groupBytes); + const groupByteBuffer = new Uint8Array(groupBuffer); + let groupBufferOffset = 0; + for (let i2 = 0; i2 < numBuffers; i2++) { + const buffer2 = new Uint8Array(buffers[bufferIndexOffset + i2]); + groupByteBuffer.set(buffer2, groupBufferOffset); + groupBufferOffset += buffer2.byteLength; + } + const weightsEntries = groupWeightsToFetch[i]; + weightsEntries.forEach((weightsEntry) => { + const byteBuffer = groupBuffer.slice(weightsEntry.groupOffset, weightsEntry.groupOffset + weightsEntry.sizeBytes); + const nameToTensorMap = decodeWeights(byteBuffer, [weightsEntry.manifestEntry]); + for (const name in nameToTensorMap) { + weightsTensorMap[name] = nameToTensorMap[name]; + } + }); + bufferIndexOffset += numBuffers; + }); + return weightsTensorMap; + }; +} +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +var OCTET_STREAM_MIME_TYPE = "application/octet-stream"; +var JSON_TYPE = "application/json"; +var HTTPRequest = class { + constructor(path, loadOptions) { + this.DEFAULT_METHOD = "POST"; + if (loadOptions == null) { + loadOptions = {}; + } + this.weightPathPrefix = loadOptions.weightPathPrefix; + this.onProgress = loadOptions.onProgress; + this.weightUrlConverter = loadOptions.weightUrlConverter; + if (loadOptions.fetchFunc != null) { + assert(typeof loadOptions.fetchFunc === "function", () => "Must pass a function that matches the signature of `fetch` (see https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API)"); + this.fetch = loadOptions.fetchFunc; + } else { + this.fetch = env().platform.fetch; + } + assert(path != null && path.length > 0, () => "URL path for http must not be null, undefined or empty."); + if (Array.isArray(path)) { + assert(path.length === 2, () => `URL paths for http must have a length of 2, (actual length is ${path.length}).`); + } + this.path = path; + if (loadOptions.requestInit != null && loadOptions.requestInit.body != null) { + throw new Error("requestInit is expected to have no pre-existing body, but has one."); + } + this.requestInit = loadOptions.requestInit || {}; + } + async save(modelArtifacts) { + if (modelArtifacts.modelTopology instanceof ArrayBuffer) { + throw new Error("BrowserHTTPRequest.save() does not support saving model topology in binary formats yet."); + } + const init2 = Object.assign({method: this.DEFAULT_METHOD}, this.requestInit); + init2.body = new FormData(); + const weightsManifest = [{ + paths: ["./model.weights.bin"], + weights: modelArtifacts.weightSpecs + }]; + const modelTopologyAndWeightManifest = { + modelTopology: modelArtifacts.modelTopology, + format: modelArtifacts.format, + generatedBy: modelArtifacts.generatedBy, + convertedBy: modelArtifacts.convertedBy, + weightsManifest + }; + if (modelArtifacts.signature != null) { + modelTopologyAndWeightManifest.signature = modelArtifacts.signature; + } + if (modelArtifacts.userDefinedMetadata != null) { + modelTopologyAndWeightManifest.userDefinedMetadata = modelArtifacts.userDefinedMetadata; + } + if (modelArtifacts.modelInitializer != null) { + modelTopologyAndWeightManifest.modelInitializer = modelArtifacts.modelInitializer; + } + init2.body.append("model.json", new Blob([JSON.stringify(modelTopologyAndWeightManifest)], {type: JSON_TYPE}), "model.json"); + if (modelArtifacts.weightData != null) { + init2.body.append("model.weights.bin", new Blob([modelArtifacts.weightData], {type: OCTET_STREAM_MIME_TYPE}), "model.weights.bin"); + } + const response = await this.fetch(this.path, init2); + if (response.ok) { + return { + modelArtifactsInfo: getModelArtifactsInfoForJSON(modelArtifacts), + responses: [response] + }; + } else { + throw new Error(`BrowserHTTPRequest.save() failed due to HTTP response status ${response.status}.`); + } + } + async load() { + const modelConfigRequest = await this.fetch(this.path, this.requestInit); + if (!modelConfigRequest.ok) { + throw new Error(`Request to ${this.path} failed with status code ${modelConfigRequest.status}. Please verify this URL points to the model JSON of the model to load.`); + } + let modelConfig; + try { + modelConfig = await modelConfigRequest.json(); + } catch (e) { + let message = `Failed to parse model JSON of response from ${this.path}.`; + if (this.path.endsWith(".pb")) { + message += " Your path contains a .pb file extension. Support for .pb models have been removed in TensorFlow.js 1.0 in favor of .json models. You can re-convert your Python TensorFlow model using the TensorFlow.js 1.0 conversion scripts or you can convert your.pb models with the 'pb2json'NPM script in the tensorflow/tfjs-converter repository."; + } else { + message += " Please make sure the server is serving valid JSON for this request."; + } + throw new Error(message); + } + const modelTopology = modelConfig.modelTopology; + const weightsManifest = modelConfig.weightsManifest; + const generatedBy = modelConfig.generatedBy; + const convertedBy = modelConfig.convertedBy; + const format = modelConfig.format; + const signature = modelConfig.signature; + const userDefinedMetadata = modelConfig.userDefinedMetadata; + if (modelTopology == null && weightsManifest == null) { + throw new Error(`The JSON from HTTP path ${this.path} contains neither model topology or manifest for weights.`); + } + let weightSpecs; + let weightData; + if (weightsManifest != null) { + const results = await this.loadWeights(weightsManifest); + [weightSpecs, weightData] = results; + } + const artifacts = { + modelTopology, + weightSpecs, + weightData, + generatedBy, + convertedBy, + format + }; + if (signature != null) { + artifacts.signature = signature; + } + if (userDefinedMetadata != null) { + artifacts.userDefinedMetadata = userDefinedMetadata; + } + const initializer = modelConfig.modelInitializer; + if (initializer) { + artifacts.modelInitializer = initializer; + } + return artifacts; + } + async loadWeights(weightsManifest) { + const weightPath = Array.isArray(this.path) ? this.path[1] : this.path; + const [prefix, suffix] = parseUrl(weightPath); + const pathPrefix = this.weightPathPrefix || prefix; + const weightSpecs = []; + for (const entry of weightsManifest) { + weightSpecs.push(...entry.weights); + } + const fetchURLs = []; + const urlPromises = []; + for (const weightsGroup of weightsManifest) { + for (const path of weightsGroup.paths) { + if (this.weightUrlConverter != null) { + urlPromises.push(this.weightUrlConverter(path)); + } else { + fetchURLs.push(pathPrefix + path + suffix); + } + } + } + if (this.weightUrlConverter) { + fetchURLs.push(...await Promise.all(urlPromises)); + } + const buffers = await loadWeightsAsArrayBuffer(fetchURLs, { + requestInit: this.requestInit, + fetchFunc: this.fetch, + onProgress: this.onProgress + }); + return [weightSpecs, concatenateArrayBuffers(buffers)]; + } +}; +HTTPRequest.URL_SCHEME_REGEX = /^https?:\/\//; +function parseUrl(url) { + const lastSlash = url.lastIndexOf("/"); + const lastSearchParam = url.lastIndexOf("?"); + const prefix = url.substring(0, lastSlash); + const suffix = lastSearchParam > lastSlash ? url.substring(lastSearchParam) : ""; + return [prefix + "/", suffix]; +} +function isHTTPScheme(url) { + return url.match(HTTPRequest.URL_SCHEME_REGEX) != null; +} +var httpRouter = (url, loadOptions) => { + if (typeof fetch === "undefined" && (loadOptions == null || loadOptions.fetchFunc == null)) { + return null; + } else { + let isHTTP = true; + if (Array.isArray(url)) { + isHTTP = url.every((urlItem) => isHTTPScheme(urlItem)); + } else { + isHTTP = isHTTPScheme(url); + } + if (isHTTP) { + return http(url, loadOptions); + } + } + return null; +}; +IORouterRegistry.registerSaveRouter(httpRouter); +IORouterRegistry.registerLoadRouter(httpRouter); +function http(path, loadOptions) { + return new HTTPRequest(path, loadOptions); +} +function browserHTTPRequest(path, loadOptions) { + return http(path, loadOptions); +} +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +var PassthroughLoader = class { + constructor(modelArtifacts) { + this.modelArtifacts = modelArtifacts; + } + async load() { + return this.modelArtifacts; + } +}; +var PassthroughSaver = class { + constructor(saveHandler) { + this.saveHandler = saveHandler; + } + async save(modelArtifacts) { + return this.saveHandler(modelArtifacts); + } +}; +function fromMemory(modelArtifacts, weightSpecs, weightData, trainingConfig) { + if (arguments.length === 1) { + const isModelArtifacts = modelArtifacts.modelTopology != null || modelArtifacts.weightSpecs != null; + if (isModelArtifacts) { + return new PassthroughLoader(modelArtifacts); + } else { + console.warn("Please call tf.io.fromMemory() with only one argument. The argument should be of type ModelArtifacts. The multi-argument signature of tf.io.fromMemory() has been deprecated and will be removed in a future release."); + return new PassthroughLoader({modelTopology: modelArtifacts}); + } + } else { + console.warn("Please call tf.io.fromMemory() with only one argument. The argument should be of type ModelArtifacts. The multi-argument signature of tf.io.fromMemory() has been deprecated and will be removed in a future release."); + return new PassthroughLoader({ + modelTopology: modelArtifacts, + weightSpecs, + weightData, + trainingConfig + }); + } +} +function withSaveHandler(saveHandler) { + return new PassthroughSaver(saveHandler); +} +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +var math_exports = {}; +__export2(math_exports, { + confusionMatrix: () => confusionMatrix +}); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function matMul_(a, b, transposeA = false, transposeB = false) { + let $a = convertToTensor(a, "a", "matMul"); + let $b = convertToTensor(b, "b", "matMul"); + [$a, $b] = makeTypesMatch($a, $b); + const inputs = {a: $a, b: $b}; + const attrs = {transposeA, transposeB}; + return ENGINE.runKernel(BatchMatMul, inputs, attrs); +} +var matMul = op({matMul_}); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function oneHot_(indices, depth, onValue = 1, offValue = 0) { + if (depth < 2) { + throw new Error(`Error in oneHot: depth must be >=2, but it is ${depth}`); + } + const $indices = convertToTensor(indices, "indices", "oneHot", "int32"); + const inputs = {indices: $indices}; + const attrs = {depth, onValue, offValue}; + return ENGINE.runKernel(OneHot, inputs, attrs); +} +var oneHot = op({oneHot_}); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function transpose_(x, perm) { + const $x = convertToTensor(x, "x", "transpose"); + if (perm == null) { + perm = $x.shape.map((s, i) => i).reverse(); + } + assert($x.rank === perm.length, () => `Error in transpose: rank of input ${$x.rank} must match length of perm ${perm}.`); + perm.forEach((axis) => { + assert(axis >= 0 && axis < $x.rank, () => `All entries in 'perm' must be between 0 and ${$x.rank - 1} but got ${perm}`); + }); + if ($x.rank <= 1) { + return $x.clone(); + } + const inputs = {x: $x}; + const attrs = {perm}; + return ENGINE.runKernel(Transpose, inputs, attrs); +} +var transpose = op({transpose_}); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function confusionMatrix_(labels2, predictions, numClasses) { + const $labels = convertToTensor(labels2, "labels", "confusionMatrix"); + const $predictions = convertToTensor(predictions, "predictions", "confusionMatrix"); + assert(numClasses == null || numClasses > 0 && Number.isInteger(numClasses), () => `If provided, numClasses must be a positive integer, but got ${numClasses}`); + assert($labels.rank === 1, () => `Expected the rank of labels to be 1, but got ${$labels.rank}`); + assert($predictions.rank === 1, () => `Expected the rank of predictions to be 1, but got ${$predictions.rank}`); + assert($labels.shape[0] === $predictions.shape[0], () => `Mismatch in the number of examples: ${$labels.shape[0]} vs. ${$predictions.shape[0]}. Labels and predictions should have the same number of elements.`); + assert(numClasses > 0 && Number.isInteger(numClasses), () => `numClasses is required to be a positive integer, but got ${numClasses}`); + const oneHotLabels = oneHot(cast($labels, "int32"), numClasses); + const oneHotPredictions = oneHot(cast($predictions, "int32"), numClasses); + const oneHotLabelsT = transpose(oneHotLabels); + const product = matMul(oneHotLabelsT, oneHotPredictions); + return cast(product, "int32"); +} +var confusionMatrix = op({confusionMatrix_}); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +var browser_exports = {}; +__export2(browser_exports, { + fromPixels: () => fromPixels, + fromPixelsAsync: () => fromPixelsAsync, + toPixels: () => toPixels +}); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function tensor3d(values, shape, dtype) { + assertNonNull(values); + if (shape != null && shape.length !== 3) { + throw new Error("tensor3d() requires shape to have three numbers"); + } + const inferredShape = inferShape(values, dtype); + if (inferredShape.length !== 3 && inferredShape.length !== 1) { + throw new Error("tensor3d() requires values to be number[][][] or flat/TypedArray"); + } + if (inferredShape.length === 1 && shape == null) { + throw new Error("tensor3d() requires shape to be provided when `values` are a flat array"); + } + return makeTensor(values, shape, inferredShape, dtype); +} +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +var fromPixels2DContext; +function fromPixels_(pixels, numChannels = 3) { + if (numChannels > 4) { + throw new Error("Cannot construct Tensor with more than 4 channels from pixels."); + } + if (pixels == null) { + throw new Error("pixels passed to tf.browser.fromPixels() can not be null"); + } + let isPixelData2 = false; + let isImageData = false; + let isVideo = false; + let isImage = false; + let isCanvasLike = false; + let isImageBitmap = false; + if (pixels.data instanceof Uint8Array) { + isPixelData2 = true; + } else if (typeof ImageData !== "undefined" && pixels instanceof ImageData) { + isImageData = true; + } else if (typeof HTMLVideoElement !== "undefined" && pixels instanceof HTMLVideoElement) { + isVideo = true; + } else if (typeof HTMLImageElement !== "undefined" && pixels instanceof HTMLImageElement) { + isImage = true; + } else if (pixels.getContext != null) { + isCanvasLike = true; + } else if (typeof ImageBitmap !== "undefined" && pixels instanceof ImageBitmap) { + isImageBitmap = true; + } else { + throw new Error(`pixels passed to tf.browser.fromPixels() must be either an HTMLVideoElement, HTMLImageElement, HTMLCanvasElement, ImageData in browser, or OffscreenCanvas, ImageData in webworker or {data: Uint32Array, width: number, height: number}, but was ${pixels.constructor.name}`); + } + if (isVideo) { + const HAVE_CURRENT_DATA_READY_STATE = 2; + if (isVideo && pixels.readyState < HAVE_CURRENT_DATA_READY_STATE) { + throw new Error("The video element has not loaded data yet. Please wait for `loadeddata` event on the a5){let A=Cu*i,y=Array.from(e.slice(0,A)),g=Array.from(e.slice((o-Cu)*i,o*i));return n==="complex64"&&(y=Ru(y),g=Ru(g)),["["+y.map((w,b)=>Eu(w,a[b],n)).join(", ")+", ..., "+g.map((w,b)=>Eu(w,a[o-Cu+b],n)).join(", ")+"]"]}let m=n==="complex64"?Ru(e):Array.from(e);return["["+m.map((A,y)=>Eu(A,a[y],n)).join(", ")+"]"]}let c=t.slice(1),u=r.slice(1),h=r[0]*i,d=[];if(o>a5){for(let m=0;m`Length of values '${r}' does not match the size inferred by the shape '${this.size}'.`)}if(t==="complex64")throw new Error("complex64 dtype TensorBuffers are not supported. Please create a TensorBuffer for the real and imaginary parts separately and call tf.complex(real, imag).");this.values=n||Hg(t,this.size),this.strides=Xi(e)}set(e,...t){t.length===0&&(t=[0]),M(t.length===this.rank,()=>`The number of provided coordinates (${t.length}) must match the rank (${this.rank})`);let n=this.locToIndex(t);this.values[n]=e}get(...e){e.length===0&&(e=[0]);let t=0;for(let r of e){if(r<0||r>=this.shape[t]){let a=`Requested out of range element at ${e}. Buffer shape=${this.shape}`;throw new Error(a)}t++}let n=e[e.length-1];for(let r=0;rnd(n))}catch(n){throw new Error("Failed to decode the string bytes into utf-8. To get the original bytes, call tensor.bytes().")}}return e}dataSync(){this.throwIfDisposed();let e=Tr().readSync(this.dataId);if(this.dtype==="string")try{return e.map(t=>nd(t))}catch(t){throw new Error("Failed to decode the string bytes into utf-8. To get the original bytes, call tensor.bytes().")}return e}async bytes(){this.throwIfDisposed();let e=await Tr().read(this.dataId);return this.dtype==="string"?e:new Uint8Array(e.buffer)}dispose(){this.isDisposed||(Tr().disposeTensor(this),this.isDisposedInternal=!0)}get isDisposed(){return this.isDisposedInternal}throwIfDisposed(){if(this.isDisposed)throw new Error("Tensor is disposed.")}print(e=!1){return Jo.print(this,e)}clone(){return this.throwIfDisposed(),Jo.clone(this)}toString(e=!1){let t=this.dataSync();return Ek(t,this.shape,this.dtype,e)}cast(e){return this.throwIfDisposed(),Jo.cast(this,e)}variable(e=!0,t,n){return this.throwIfDisposed(),Tr().makeVariable(this,e,t,n)}};Object.defineProperty(Ue,Symbol.hasInstance,{value:e=>!!e&&e.data!=null&&e.dataSync!=null&&e.throwIfDisposed!=null});function Z(){return lf("Tensor",()=>Ue)}Z();var Mu=class extends Ue{constructor(e,t,n,r){super(e.shape,e.dtype,e.dataId,r);this.trainable=t,this.name=n}assign(e){if(e.dtype!==this.dtype)throw new Error(`dtype of the new value (${e.dtype}) and previous value (${this.dtype}) must match`);if(!Jr(e.shape,this.shape))throw new Error(`shape of the new value (${e.shape}) and previous value (${this.shape}) must match`);Tr().disposeTensor(this),this.dataId=e.dataId,Tr().incRef(this,null)}dispose(){Tr().disposeVariable(this),this.isDisposedInternal=!0}};Object.defineProperty(Mu,Symbol.hasInstance,{value:e=>e instanceof Ue&&e.assign!=null&&e.assign instanceof Function});var fr={};Oe(fr,{assertTypesMatch:()=>i5,getTensorsInContainer:()=>df,isTensorInList:()=>Dk,makeTypesMatch:()=>bt});var pf;(function(e){e.R0="R0",e.R1="R1",e.R2="R2",e.R3="R3",e.R4="R4",e.R5="R5",e.R6="R6"})(pf||(pf={}));var ff;(function(e){e.float32="float32",e.int32="int32",e.bool="int32",e.complex64="complex64"})(ff||(ff={}));var mf;(function(e){e.float32="float32",e.int32="int32",e.bool="bool",e.complex64="complex64"})(mf||(mf={}));var Af;(function(e){e.float32="float32",e.int32="float32",e.bool="float32",e.complex64="complex64"})(Af||(Af={}));var yf;(function(e){e.float32="complex64",e.int32="complex64",e.bool="complex64",e.complex64="complex64"})(yf||(yf={}));var Ok={float32:Af,int32:ff,bool:mf,complex64:yf};function nr(e,t){if(e==="string"||t==="string"){if(e==="string"&&t==="string")return"string";throw new Error(`Can not upcast ${e} with ${t}`)}return Ok[e][t]}function ad(e){return nr(e,"int32")}function bt(e,t){if(e.dtype===t.dtype)return[e,t];let n=nr(e.dtype,t.dtype);return[e.cast(n),t.cast(n)]}function i5(e,t){M(e.dtype===t.dtype,()=>`The dtypes of the first(${e.dtype}) and second(${t.dtype}) input must match`)}function Dk(e,t){return t.some(n=>n.id===e.id)}function df(e){let t=[],n=new Set;return o5(e,t,n),t}function o5(e,t,n){if(e==null)return;if(e instanceof Ue){t.push(e);return}if(!zk(e))return;let r=e;for(let a in r){let s=r[a];n.has(s)||(n.add(s),o5(s,t,n))}}function zk(e){return Array.isArray(e)||typeof e=="object"}function gf(e){return e.kernelName!=null}var l5=class{constructor(){this.registeredVariables={},this.nextTapeNodeId=0,this.numBytes=0,this.numTensors=0,this.numStringTensors=0,this.numDataBuffers=0,this.gradientDepth=0,this.kernelDepth=0,this.scopeStack=[],this.numDataMovesStack=[],this.nextScopeId=0,this.tensorInfo=new WeakMap,this.profiling=!1,this.activeProfile={newBytes:0,newTensors:0,peakBytes:0,kernels:[],result:null,get kernelNames(){return Array.from(new Set(this.kernels.map(e=>e.name)))}}}dispose(){for(let e in this.registeredVariables)this.registeredVariables[e].dispose()}},Fu=class{constructor(e){this.ENV=e,this.registry={},this.registryFactory={},this.pendingBackendInitId=0,this.state=new l5}async ready(){if(this.pendingBackendInit!=null)return this.pendingBackendInit.then(()=>{});if(this.backendInstance!=null)return;let e=this.getSortedBackends();for(let t=0;t{e.setupFunc!=null&&e.setupFunc(this.backendInstance)})}disposeRegisteredKernels(e){Yo(e).forEach(t=>{t.disposeFunc!=null&&t.disposeFunc(this.registry[e])})}initializeBackend(e){let t=this.registryFactory[e];if(t==null)throw new Error(`Cannot initialize backend ${e}, no registration found.`);try{let n=t.factory();if(n&&!(n instanceof iu)&&typeof n.then=="function"){let r=++this.pendingBackendInitId,a=n.then(s=>r(rthis.registryFactory[t].priority-this.registryFactory[e].priority)}initializeBackendsAndReturnBest(){let e=this.getSortedBackends();for(let t=0;tthis.startScope(n),()=>this.endScope(r),()=>(r=t(),r instanceof Promise&&console.error("Cannot return a Promise inside of tidy."),r))}scopedRun(e,t,n){e();try{let r=n();return t(),r}catch(r){throw t(),r}}nextTensorId(){return Fu.nextTensorId++}nextVariableId(){return Fu.nextVariableId++}clone(e){let t=$.runKernel(vs,{x:e}),n={x:e},r=s=>({x:()=>{let i="float32",o={x:s},l={dtype:i};return $.runKernel(cs,o,l)}}),a=[];return this.addTapeNode(this.state.activeScope.name,n,[t],r,a,{}),t}runKernel(e,t,n){if(ed(e,this.backendName)==null)throw new Error(`Kernel '${e}' not registered for backend '${this.backendName}'`);return this.runKernelFunc({kernelName:e,inputs:t,attrs:n})}shouldCheckForMemLeaks(){return this.ENV.getBool("IS_TEST")}checkKernelForMemLeak(e,t,n){let r=this.backend.numDataIds(),a=0;n.forEach(o=>{a+=o.dtype==="complex64"?3:1});let s=this.state.numDataMovesStack[this.state.numDataMovesStack.length-1],i=r-t-a-s;if(i>0)throw new Error(`Backend '${this.backendName}' has an internal memory leak (${i} data ids) after running '${e}'`)}runKernelFunc(e){let t,n=[],r=this.isTapeOn(),a=this.state.numBytes,s=this.state.numTensors;this.shouldCheckForMemLeaks()&&this.state.numDataMovesStack.push(0);let i;this.backendName==null&&this.backend;let o,l=gf(e)?e.kernelName:this.state.activeScope!=null?this.state.activeScope.name:"";if(gf(e)){let{kernelName:p,inputs:f,attrs:m}=e;this.backendName==null&&this.backend;let A=ed(p,this.backendName);M(A!=null,()=>`Cannot find registered kernel '${p}' for backend '${this.backendName}'`),i=()=>{let y=this.backend.numDataIds();o=A.kernelFunc({inputs:f,attrs:m,backend:this.backend});let g=Array.isArray(o)?o:[o];this.shouldCheckForMemLeaks()&&this.checkKernelForMemLeak(p,y,g);let w=g.map(b=>{if(b.rank!=null)return b;let{dataId:_,shape:x,dtype:N}=b;return this.makeTensorFromDataId(_,x,N)});if(r){let b=this.getTensorsForGradient(p,f,w);n=this.saveTensorsForBackwardMode(b)}return w}}else{let{forwardFunc:p}=e,f=m=>{!r||(n=m.map(A=>this.keep(this.clone(A))))};i=()=>{let m=this.backend.numDataIds();o=this.tidy(()=>p(this.backend,f));let A=Array.isArray(o)?o:[o];return this.shouldCheckForMemLeaks()&&this.checkKernelForMemLeak(l,m,A),A}}let{inputs:c,attrs:u}=e,h=gf(e)?null:e.backwardsFunc,d;return this.scopedRun(()=>this.state.kernelDepth++,()=>this.state.kernelDepth--,()=>{!this.ENV.getBool("DEBUG")&&!this.state.profiling?t=i():(d=this.profiler.profileKernel(l,c,()=>i()),this.ENV.getBool("DEBUG")&&this.profiler.logKernelProfile(d),t=d.outputs)}),r&&this.addTapeNode(l,c,t,h,n,u),this.state.profiling&&this.state.activeProfile.kernels.push({name:l,bytesAdded:this.state.numBytes-a,totalBytesSnapshot:this.state.numBytes,tensorsAdded:this.state.numTensors-s,totalTensorsSnapshot:this.state.numTensors,inputShapes:Object.keys(c).map(p=>c[p]!=null?c[p].shape:null),outputShapes:t.map(p=>p.shape),kernelTimeMs:d.timeMs,extraInfo:d.extraInfo}),Array.isArray(o)?t:t[0]}saveTensorsForBackwardMode(e){return e.map(t=>this.keep(this.clone(t)))}getTensorsForGradient(e,t,n){let r=cf(e);if(r!=null){let a=r.inputsToSave||[],s=r.outputsToSave||[],i;r.saveAllInputs?(M(Array.isArray(t),()=>"saveAllInputs is true, expected inputs to be an array."),i=Object.keys(t).map(l=>t[l])):i=a.map(l=>t[l]);let o=n.filter((l,c)=>s[c]);return i.concat(o)}return[]}makeTensor(e,t,n,r){if(e==null)throw new Error("Values passed to engine.makeTensor() are null");n=n||"float32",r=r||this.backend;let a=e;n==="string"&&wa(e[0])&&(a=e.map(o=>Tu(o)));let s=r.write(a,t,n),i=new Ue(t,n,s,this.nextTensorId());if(this.trackTensor(i,r),n==="string"){let o=this.state.tensorInfo.get(s),l=Xg(a);this.state.numBytes+=l-o.bytes,o.bytes=l}return i}makeTensorFromDataId(e,t,n,r){n=n||"float32";let a=new Ue(t,n,e,this.nextTensorId());return this.trackTensor(a,r),a}makeVariable(e,t=!0,n,r){n=n||this.nextVariableId().toString(),r!=null&&r!==e.dtype&&(e=e.cast(r));let a=new Mu(e,t,n,this.nextTensorId());if(this.state.registeredVariables[a.name]!=null)throw new Error(`Variable with name ${a.name} was already registered`);return this.state.registeredVariables[a.name]=a,this.incRef(a,this.backend),a}trackTensor(e,t){this.state.numTensors++,e.dtype==="string"&&this.state.numStringTensors++;let n=0;e.dtype!=="complex64"&&e.dtype!=="string"&&(n=e.size*nf(e.dtype)),this.state.numBytes+=n,this.state.tensorInfo.has(e.dataId)||(this.state.numDataBuffers++,this.state.tensorInfo.set(e.dataId,{backend:t||this.backend,dtype:e.dtype,shape:e.shape,bytes:n})),e instanceof Mu||this.track(e)}incRef(e,t){this.trackTensor(e,t),this.backend.incRef(e.dataId)}removeDataId(e,t){this.state.tensorInfo.has(e)&&this.state.tensorInfo.get(e).backend===t&&(this.state.tensorInfo.delete(e),this.state.numDataBuffers--)}disposeTensor(e){if(!this.state.tensorInfo.has(e.dataId))return;let t=this.state.tensorInfo.get(e.dataId);if(this.state.numTensors--,e.dtype==="string"&&(this.state.numStringTensors--,this.state.numBytes-=t.bytes),e.dtype!=="complex64"&&e.dtype!=="string"){let n=e.size*nf(e.dtype);this.state.numBytes-=n}t.backend.disposeData(e.dataId)&&this.removeDataId(e.dataId,t.backend)}disposeVariables(){for(let e in this.state.registeredVariables){let t=this.state.registeredVariables[e];this.disposeVariable(t)}}disposeVariable(e){this.disposeTensor(e),this.state.registeredVariables[e.name]!=null&&delete this.state.registeredVariables[e.name]}memory(){let e=this.backend.memory();return e.numTensors=this.state.numTensors,e.numDataBuffers=this.state.numDataBuffers,e.numBytes=this.state.numBytes,this.state.numStringTensors>0&&(e.unreliable=!0,e.reasons==null&&(e.reasons=[]),e.reasons.push("Memory usage by string tensors is approximate (2 bytes per character)")),e}async profile(e){this.state.profiling=!0;let t=this.state.numBytes,n=this.state.numTensors;this.state.activeProfile.kernels=[],this.state.activeProfile.result=await e(),this.state.profiling=!1,this.state.activeProfile.peakBytes=Math.max(...this.state.activeProfile.kernels.map(r=>r.totalBytesSnapshot)),this.state.activeProfile.newBytes=this.state.numBytes-t,this.state.activeProfile.newTensors=this.state.numTensors-n;for(let r of this.state.activeProfile.kernels)r.kernelTimeMs=await r.kernelTimeMs,r.extraInfo=await r.extraInfo;return this.state.activeProfile}isTapeOn(){return this.state.gradientDepth>0&&this.state.kernelDepth===0}addTapeNode(e,t,n,r,a,s){let i={id:this.state.nextTapeNodeId++,kernelName:e,inputs:t,outputs:n,saved:a},o=cf(e);o!=null&&(r=o.gradFunc),r!=null&&(i.gradient=l=>(l=l.map((c,u)=>{if(c==null){let h=n[u],d=bh(h.size,h.dtype);return this.makeTensor(d,h.shape,h.dtype)}return c}),r(l.length>1?l:l[0],a,s))),this.state.activeTape.push(i)}keep(e){return e.kept=!0,e}startTape(){this.state.gradientDepth===0&&(this.state.activeTape=[]),this.state.gradientDepth++}endTape(){this.state.gradientDepth--}startScope(e){let t={track:[],name:"unnamed scope",id:this.state.nextScopeId++};e&&(t.name=e),this.state.scopeStack.push(t),this.state.activeScope=t}endScope(e){let t=df(e),n=new Set(t.map(a=>a.id));for(let a=0;a{!a.kept&&a.scopeId===r.id&&this.track(a)})}gradients(e,t,n,r=!1){if(M(t.length>0,()=>"gradients() received an empty list of xs."),n!=null&&n.dtype!=="float32")throw new Error(`dy must have 'float32' dtype, but has '${n.dtype}'`);let a=this.scopedRun(()=>this.startTape(),()=>this.endTape(),()=>this.tidy("forward",e));M(a instanceof Ue,()=>"The result y returned by f() must be a tensor.");let s=Sk(this.state.activeTape,t,a);if(!r&&s.length===0&&t.length>0)throw new Error("Cannot compute gradient of y=f(x) with respect to x. Make sure that the f you passed encloses all operations that lead from x to y.");return this.tidy("backward",()=>{let i={};i[a.id]=n==null?Pk(a.shape):n,Tk(i,s,l=>this.tidy(l),Lk);let o=t.map(l=>i[l.id]);return this.state.gradientDepth===0&&(this.state.activeTape.forEach(l=>{for(let c of l.saved)c.dispose()}),this.state.activeTape=null),{value:a,grads:o}})}customGrad(e){return M(ba(e),()=>"The f passed in customGrad(f) must be a function."),(...t)=>{M(t.every(i=>i instanceof Ue),()=>"The args passed in customGrad(f)(x1, x2,...) must all be tensors");let n,r={};t.forEach((i,o)=>{r[o]=i});let a=(i,o)=>(n=e(...t,o),M(n.value instanceof Ue,()=>"The function f passed in customGrad(f) must return an object where `obj.value` is a tensor"),M(ba(n.gradFunc),()=>"The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function."),n.value),s=(i,o)=>{let l=n.gradFunc(i,o),c=Array.isArray(l)?l:[l];M(c.length===t.length,()=>"The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function that returns the same number of tensors as inputs passed to f(...)."),M(c.every(h=>h instanceof Ue),()=>"The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function that returns a list of only tensors.");let u={};return c.forEach((h,d)=>{u[d]=()=>h}),u};return this.runKernelFunc({forwardFunc:a,backwardsFunc:s,inputs:r})}}readSync(e){return this.state.tensorInfo.get(e).backend.readSync(e)}read(e){return this.state.tensorInfo.get(e).backend.read(e)}async time(e){let t=Su(),n=await this.backend.time(e);return n.wallMs=Su()-t,n}track(e){return this.state.activeScope!=null&&(e.scopeId=this.state.activeScope.id,this.state.activeScope.track.push(e)),e}get registeredVariables(){return this.state.registeredVariables}reset(){this.pendingBackendInitId++,this.state.dispose(),this.ENV.reset(),this.state=new l5;for(let e in this.registry)this.disposeRegisteredKernels(e),this.registry[e].dispose(),delete this.registry[e];this.backendName=null,this.backendInstance=null,this.pendingBackendInit=null}};Fu.nextTensorId=0;Fu.nextVariableId=0;function Pk(e){let t=rf(Ft(e),"float32");return $.makeTensor(t,e,"float32")}function u5(){let e=e5();if(e._tfengine==null){let t=new Qg(e);e._tfengine=new Fu(t)}return mk(e._tfengine.ENV),Mk(()=>e._tfengine),e._tfengine}var $=u5();function Lk(e,t){let n={a:e,b:t};return $.runKernel(_a,n)}var $u={};Oe($u,{isBrowser:()=>c5,isMobile:()=>Wk});function Bk(){return typeof navigator!="undefined"&&navigator!=null}function Wk(){if(Bk()){let e=navigator.userAgent||navigator.vendor||window.opera;return/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(e)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(e.substr(0,4))}return!1}function c5(){return typeof window!="undefined"&&window.document!=null||typeof WorkerGlobalScope!="undefined"}var mr=J();mr.registerFlag("DEBUG",()=>!1,e=>{e&&console.warn("Debugging mode is ON. The output of every math call will be downloaded to CPU and checked for NaNs. This significantly impacts performance.")});mr.registerFlag("IS_BROWSER",()=>c5());mr.registerFlag("IS_NODE",()=>typeof process!="undefined"&&typeof process.versions!="undefined"&&typeof process.versions.node!="undefined");mr.registerFlag("IS_CHROME",()=>typeof navigator!="undefined"&&navigator!=null&&navigator.userAgent!=null&&/Chrome/.test(navigator.userAgent)&&/Google Inc/.test(navigator.vendor));mr.registerFlag("PROD",()=>!1);mr.registerFlag("TENSORLIKE_CHECK_SHAPE_CONSISTENCY",()=>mr.getBool("DEBUG"));mr.registerFlag("DEPRECATION_WARNINGS_ENABLED",()=>!0);mr.registerFlag("IS_TEST",()=>!1);mr.registerFlag("CHECK_COMPUTATION_FOR_ERRORS",()=>!0);mr.registerFlag("WRAP_TO_IMAGEBITMAP",()=>!1);function Cr(e,t){let n=e;if(nn(e))return t==="string"?[]:[e.length];if(!Array.isArray(e))return[];let r=[];for(;Array.isArray(n)||nn(n)&&t!=="string";)r.push(n.length),n=n[0];return Array.isArray(e)&&J().getBool("TENSORLIKE_CHECK_SHAPE_CONSISTENCY")&&h5(e,r,[]),r}function h5(e,t,n){if(n=n||[],!Array.isArray(e)&&!nn(e)){M(t.length===0,()=>`Element arr[${n.join("][")}] is a primitive, but should be an array/TypedArray of ${t[0]} elements`);return}M(t.length>0,()=>`Element arr[${n.join("][")}] should be a primitive, but is an array of ${e.length} elements`),M(e.length===t[0],()=>`Element arr[${n.join("][")}] should have ${t[0]} elements, but has ${e.length} elements`);let r=t.slice(1);for(let a=0;a=0&&(a=r),d5(r,a,t,n),e==null||!nn(e)&&!Array.isArray(e)&&typeof e!="number"&&typeof e!="boolean"&&typeof e!="string"){let o=e==null?"null":e.constructor.name;throw new Error(`Argument '${t}' passed to '${n}' must be a Tensor or TensorLike, but got '${o}'`)}let s=Cr(e,a);!nn(e)&&!Array.isArray(e)&&(e=[e]);let i=a!=="string"?td(e,a):ss(e,[],!0);return $.makeTensor(i,s,a)}function Du(e,t,n,r="numeric"){if(!Array.isArray(e))throw new Error(`Argument ${t} passed to ${n} must be a \`Tensor[]\` or \`TensorLike[]\``);return e.map((a,s)=>E(a,`${t}[${s}]`,n,r))}var p5="__op";function D(e){let t=Object.keys(e);if(t.length!==1)throw new Error(`Please provide an object with a single key (operation name) mapping to a function. Got an object with ${t.length} keys.`);let n=t[0],r=e[n];n.endsWith("_")&&(n=n.substring(0,n.length-1)),n=n+p5;let a=(...s)=>{$.startScope(n);try{let i=r(...s);return sf(i)&&console.error("Cannot return a Promise inside of tidy."),$.endScope(i),i}catch(i){throw $.endScope(null),i}};return Object.defineProperty(a,"name",{value:n,configurable:!0}),a}function Vk(e,t){let n=E(e,"real","complex"),r=E(t,"imag","complex");tn(n.shape,r.shape,`real and imag shapes, ${n.shape} and ${r.shape}, must match in call to tf.complex().`);let a={real:n,imag:r};return $.runKernel(Sh,a)}var Na=D({complex_:Vk});function Sa(e,t,n,r){if(r==null&&(r=xh(e)),r==="complex64")throw new Error("Cannot construct a complex64 tensor directly. Please use tf.complex(real, imag).");if(!nn(e)&&!Array.isArray(e)&&typeof e!="number"&&typeof e!="boolean"&&typeof e!="string")throw new Error("values passed to tensor(values) must be a number/boolean/string or an array of numbers/booleans/strings, or a TypedArray");if(t!=null){af(t);let a=Ft(t),s=Ft(n);M(a===s,()=>`Based on the provided shape, [${t}], the tensor should have ${a} values but has ${s}`);for(let i=0;i`Error creating a new Tensor. Inferred shape (${n}) does not match the provided shape (${t}). `)}}return!nn(e)&&!Array.isArray(e)&&(e=[e]),t=t||n,e=r!=="string"?td(e,r):ss(e,[],!0),$.makeTensor(e,t,r)}function Ar(e,t,n){let r=Cr(e,n);return Sa(e,t,r,n)}var xf={float32:4,float16:2,int32:4,uint16:2,uint8:1,bool:1,complex64:8},sd=4;async function jk(e,t){let n=[],r=[],a=Array.isArray(e)?e.map(i=>i.name):Object.keys(e);for(let i=0;i{let d=await l.bytes(),p=d.reduce((A,y)=>A+y.length,0)+sd*d.length,f=new Uint8Array(p),m=0;for(let A=0;A{if(t+=s.byteLength,n.push(s.byteLength===s.buffer.byteLength?s:new s.constructor(s)),!(s instanceof Float32Array||s instanceof Int32Array||s instanceof Uint8Array))throw new Error(`Unsupported TypedArray subtype: ${s.constructor.name}`)});let r=new Uint8Array(t),a=0;return n.forEach(s=>{r.set(new Uint8Array(s.buffer),a),a+=s.byteLength}),r.buffer}var wf=typeof Buffer!="undefined"&&(typeof Blob=="undefined"||typeof atob=="undefined"||typeof btoa=="undefined");function m5(e){return wf?Buffer.byteLength(e):new Blob([e]).size}function Gk(e){if(wf)return Buffer.from(e).toString("base64");let t=new Uint8Array(e),n="";for(let r=0,a=t.length;r{t+=a.byteLength});let n=new Uint8Array(t),r=0;return e.forEach(a=>{n.set(new Uint8Array(a),r),r+=a.byteLength}),n.buffer}function A5(e){let t="/";for(e=e.trim();e.endsWith(t);)e=e.slice(0,e.length-1);let n=e.split(t);return n[n.length-1]}function Ou(e){if(e.modelTopology instanceof ArrayBuffer)throw new Error("Expected JSON model topology, received ArrayBuffer.");return{dateSaved:new Date,modelTopologyType:"JSON",modelTopologyBytes:e.modelTopology==null?0:m5(JSON.stringify(e.modelTopology)),weightSpecsBytes:e.weightSpecs==null?0:m5(JSON.stringify(e.weightSpecs)),weightDataBytes:e.weightData==null?0:e.weightData.byteLength}}function Xk(){let e=n=>{let r=n<<13,a=0;for(;(r&8388608)==0;)a-=8388608,r<<=1;return r&=~8388608,a+=947912704,r|a},t=new Uint32Array(2048);t[0]=0;for(let n=1;n<1024;n++)t[n]=e(n);for(let n=1024;n<2048;n++)t[n]=939524096+(n-1024<<13);return t}function Kk(){let e=new Uint32Array(64);e[0]=0,e[31]=1199570944,e[32]=2147483648,e[63]=3347054592;for(let t=1;t<31;t++)e[t]=t<<23;for(let t=33;t<63;t++)e[t]=2147483648+(t-32<<23);return e}function Zk(){let e=new Uint32Array(64);for(let t=0;t<64;t++)e[t]=1024;return e[0]=e[32]=0,e}function Hk(){let e=Xk(),t=Kk(),n=Zk();return r=>{let a=new ArrayBuffer(4*r.length),s=new Uint32Array(a);for(let i=0;i>10]+(o&1023)]+t[o>>10];s[i]=l}return new Float32Array(a)}}var Nt=class{constructor(){this.saveRouters=[],this.loadRouters=[]}static getInstance(){return Nt.instance==null&&(Nt.instance=new Nt),Nt.instance}static registerSaveRouter(e){Nt.getInstance().saveRouters.push(e)}static registerLoadRouter(e){Nt.getInstance().loadRouters.push(e)}static getSaveHandlers(e){return Nt.getHandlers(e,"save")}static getLoadHandlers(e,t){return Nt.getHandlers(e,"load",t)}static getHandlers(e,t,n){let r=[];return(t==="load"?Nt.getInstance().loadRouters:Nt.getInstance().saveRouters).forEach(a=>{let s=a(e,n);s!==null&&r.push(s)}),r}},Yk=e=>Nt.registerSaveRouter(e),Jk=e=>Nt.registerLoadRouter(e),Qk=e=>Nt.getSaveHandlers(e),e9=(e,t)=>Nt.getLoadHandlers(e,t),_f="tensorflowjs",vf=1,ni="models_store",Ta="model_info_store";function y5(){if(!J().getBool("IS_BROWSER"))throw new Error("Failed to obtain IndexedDB factory because the current environmentis not a web browser.");let e=typeof window=="undefined"?self:window,t=e.indexedDB||e.mozIndexedDB||e.webkitIndexedDB||e.msIndexedDB||e.shimIndexedDB;if(t==null)throw new Error("The current browser does not appear to support IndexedDB.");return t}function kf(e){let t=e.result;t.createObjectStore(ni,{keyPath:"modelPath"}),t.createObjectStore(Ta,{keyPath:"modelPath"})}var ri=class{constructor(e){if(this.indexedDB=y5(),e==null||!e)throw new Error("For IndexedDB, modelPath must not be null, undefined or empty.");this.modelPath=e}async save(e){if(e.modelTopology instanceof ArrayBuffer)throw new Error("BrowserLocalStorage.save() does not support saving model topology in binary formats yet.");return this.databaseAction(this.modelPath,e)}async load(){return this.databaseAction(this.modelPath)}databaseAction(e,t){return new Promise((n,r)=>{let a=this.indexedDB.open(_f,vf);a.onupgradeneeded=()=>kf(a),a.onsuccess=()=>{let s=a.result;if(t==null){let i=s.transaction(ni,"readonly"),o=i.objectStore(ni).get(this.modelPath);o.onsuccess=()=>{if(o.result==null)return s.close(),r(new Error(`Cannot find model with path '${this.modelPath}' in IndexedDB.`));n(o.result.modelArtifacts)},o.onerror=l=>(s.close(),r(o.error)),i.oncomplete=()=>s.close()}else{let i=Ou(t),o=s.transaction(Ta,"readwrite"),l=o.objectStore(Ta),c=l.put({modelPath:this.modelPath,modelArtifactsInfo:i}),u;c.onsuccess=()=>{u=s.transaction(ni,"readwrite");let h=u.objectStore(ni).put({modelPath:this.modelPath,modelArtifacts:t,modelArtifactsInfo:i});h.onsuccess=()=>n({modelArtifactsInfo:i}),h.onerror=d=>{l=o.objectStore(Ta);let p=l.delete(this.modelPath);p.onsuccess=()=>(s.close(),r(h.error)),p.onerror=f=>(s.close(),r(h.error))}},c.onerror=h=>(s.close(),r(c.error)),o.oncomplete=()=>{u==null?s.close():u.oncomplete=()=>s.close()}}},a.onerror=s=>r(a.error)})}};ri.URL_SCHEME="indexeddb://";var g5=e=>J().getBool("IS_BROWSER")&&!Array.isArray(e)&&e.startsWith(ri.URL_SCHEME)?t9(e.slice(ri.URL_SCHEME.length)):null;Nt.registerSaveRouter(g5);Nt.registerLoadRouter(g5);function t9(e){return new ri(e)}function n9(e){return e.startsWith(ri.URL_SCHEME)?e.slice(ri.URL_SCHEME.length):e}var r9=class{constructor(){this.indexedDB=y5()}async listModels(){return new Promise((e,t)=>{let n=this.indexedDB.open(_f,vf);n.onupgradeneeded=()=>kf(n),n.onsuccess=()=>{let r=n.result,a=r.transaction(Ta,"readonly"),s=a.objectStore(Ta).getAll();s.onsuccess=()=>{let i={};for(let o of s.result)i[o.modelPath]=o.modelArtifactsInfo;e(i)},s.onerror=i=>(r.close(),t(s.error)),a.oncomplete=()=>r.close()},n.onerror=r=>t(n.error)})}async removeModel(e){return e=n9(e),new Promise((t,n)=>{let r=this.indexedDB.open(_f,vf);r.onupgradeneeded=()=>kf(r),r.onsuccess=()=>{let a=r.result,s=a.transaction(Ta,"readwrite"),i=s.objectStore(Ta),o=i.get(e),l;o.onsuccess=()=>{if(o.result==null)return a.close(),n(new Error(`Cannot find model with path '${e}' in IndexedDB.`));{let c=i.delete(e),u=()=>{l=a.transaction(ni,"readwrite");let h=l.objectStore(ni).delete(e);h.onsuccess=()=>t(o.result.modelArtifactsInfo),h.onerror=d=>n(o.error)};c.onsuccess=u,c.onerror=h=>(u(),a.close(),n(o.error))}},o.onerror=c=>(a.close(),n(o.error)),s.oncomplete=()=>{l==null?a.close():l.oncomplete=()=>a.close()}},r.onerror=a=>n(r.error)})}},Qr="/",Qo="tensorflowjs_models",x5="info",a9="model_topology",s9="weight_specs",i9="weight_data",o9="model_metadata";function w5(e){return{info:[Qo,e,x5].join(Qr),topology:[Qo,e,a9].join(Qr),weightSpecs:[Qo,e,s9].join(Qr),weightData:[Qo,e,i9].join(Qr),modelMetadata:[Qo,e,o9].join(Qr)}}function l9(e){let t=e.split(Qr);if(t.length<3)throw new Error(`Invalid key format: ${e}`);return t.slice(1,t.length-1).join(Qr)}function u9(e){return e.startsWith(ai.URL_SCHEME)?e.slice(ai.URL_SCHEME.length):e}var ai=class{constructor(e){if(!J().getBool("IS_BROWSER")||typeof window=="undefined"||typeof window.localStorage=="undefined")throw new Error("The current environment does not support local storage.");if(this.LS=window.localStorage,e==null||!e)throw new Error("For local storage, modelPath must not be null, undefined or empty.");this.modelPath=e,this.keys=w5(this.modelPath)}async save(e){if(e.modelTopology instanceof ArrayBuffer)throw new Error("BrowserLocalStorage.save() does not support saving model topology in binary formats yet.");{let t=JSON.stringify(e.modelTopology),n=JSON.stringify(e.weightSpecs),r=Ou(e);try{this.LS.setItem(this.keys.info,JSON.stringify(r)),this.LS.setItem(this.keys.topology,t),this.LS.setItem(this.keys.weightSpecs,n),this.LS.setItem(this.keys.weightData,Gk(e.weightData));let a={format:e.format,generatedBy:e.generatedBy,convertedBy:e.convertedBy};return e.signature!=null&&(a.signature=e.signature),e.userDefinedMetadata!=null&&(a.userDefinedMetadata=e.userDefinedMetadata),e.modelInitializer!=null&&(a.modelInitializer=e.modelInitializer),this.LS.setItem(this.keys.modelMetadata,JSON.stringify(a)),{modelArtifactsInfo:r}}catch(a){throw this.LS.removeItem(this.keys.info),this.LS.removeItem(this.keys.topology),this.LS.removeItem(this.keys.weightSpecs),this.LS.removeItem(this.keys.weightData),this.LS.removeItem(this.keys.modelMetadata),new Error(`Failed to save model '${this.modelPath}' to local storage: size quota being exceeded is a possible cause of this failure: modelTopologyBytes=${r.modelTopologyBytes}, weightSpecsBytes=${r.weightSpecsBytes}, weightDataBytes=${r.weightDataBytes}.`)}}}async load(){let e=JSON.parse(this.LS.getItem(this.keys.info));if(e==null)throw new Error(`In local storage, there is no model with name '${this.modelPath}'`);if(e.modelTopologyType!=="JSON")throw new Error("BrowserLocalStorage does not support loading non-JSON model topology yet.");let t={},n=JSON.parse(this.LS.getItem(this.keys.topology));if(n==null)throw new Error(`In local storage, the topology of model '${this.modelPath}' is missing.`);t.modelTopology=n;let r=JSON.parse(this.LS.getItem(this.keys.weightSpecs));if(r==null)throw new Error(`In local storage, the weight specs of model '${this.modelPath}' are missing.`);t.weightSpecs=r;let a=this.LS.getItem(this.keys.modelMetadata);if(a!=null){let i=JSON.parse(a);t.format=i.format,t.generatedBy=i.generatedBy,t.convertedBy=i.convertedBy,i.signature!=null&&(t.signature=i.signature),i.userDefinedMetadata!=null&&(t.userDefinedMetadata=i.userDefinedMetadata),i.modelInitializer!=null&&(t.modelInitializer=i.modelInitializer)}let s=this.LS.getItem(this.keys.weightData);if(s==null)throw new Error(`In local storage, the binary weight values of model '${this.modelPath}' are missing.`);return t.weightData=qk(s),t}};ai.URL_SCHEME="localstorage://";var b5=e=>J().getBool("IS_BROWSER")&&!Array.isArray(e)&&e.startsWith(ai.URL_SCHEME)?c9(e.slice(ai.URL_SCHEME.length)):null;Nt.registerSaveRouter(b5);Nt.registerLoadRouter(b5);function c9(e){return new ai(e)}var h9=class{constructor(){M(J().getBool("IS_BROWSER"),()=>"Current environment is not a web browser"),M(typeof window=="undefined"||typeof window.localStorage!="undefined",()=>"Current browser does not appear to support localStorage"),this.LS=window.localStorage}async listModels(){let e={},t=Qo+Qr,n=Qr+x5;for(let r=0;r"scheme must not be undefined or null."),e.endsWith(el)&&(e=e.slice(0,e.indexOf(el))),M(e.length>0,()=>"scheme must not be an empty string.");let n=jn.getInstance();M(n.managers[e]==null,()=>`A model store manager is already registered for scheme '${e}'.`),n.managers[e]=t}static getManager(e){let t=this.getInstance().managers[e];if(t==null)throw new Error(`Cannot find model manager for scheme '${e}'`);return t}static getSchemes(){return Object.keys(this.getInstance().managers)}};function id(e){if(e.indexOf(el)===-1)throw new Error(`The url string provided does not contain a scheme. Supported schemes are: ${jn.getSchemes().join(",")}`);return{scheme:e.split(el)[0],path:e.split(el)[1]}}async function _5(e,t,n=!1){M(e!==t,()=>`Old path and new path are the same: '${e}'`);let r=Nt.getLoadHandlers(e);M(r.length>0,()=>`Copying failed because no load handler is found for source URL ${e}.`),M(r.length<2,()=>`Copying failed because more than one (${r.length}) load handlers for source URL ${e}.`);let a=r[0],s=Nt.getSaveHandlers(t);M(s.length>0,()=>`Copying failed because no save handler is found for destination URL ${t}.`),M(s.length<2,()=>`Copying failed because more than one (${r.length}) save handlers for destination URL ${t}.`);let i=s[0],o=id(e).scheme,l=id(e).path,c=o===id(e).scheme,u=await a.load();n&&c&&await jn.getManager(o).removeModel(l);let h=await i.save(u);return n&&!c&&await jn.getManager(o).removeModel(l),h.modelArtifactsInfo}async function d9(){let e=jn.getSchemes(),t={};for(let n of e){let r=await jn.getManager(n).listModels();for(let a in r){let s=n+el+a;t[s]=r[a]}}return t}async function p9(e){let t=id(e);return jn.getManager(t.scheme).removeModel(t.path)}async function f9(e,t){return _5(e,t,!1)}async function m9(e,t){return _5(e,t,!0)}var A9=class{fetch(e,t){return fetch(e,t)}now(){return performance.now()}encode(e,t){if(t!=="utf-8"&&t!=="utf8")throw new Error(`Browser's encoder only supports utf-8, but got ${t}`);return this.textEncoder==null&&(this.textEncoder=new TextEncoder),this.textEncoder.encode(e)}decode(e,t){return new TextDecoder(t).decode(e)}};if(J().get("IS_BROWSER")){J().setPlatform("browser",new A9);try{jn.registerManager(ai.URL_SCHEME,new h9)}catch(e){}try{jn.registerManager(ri.URL_SCHEME,new r9)}catch(e){}}var y9={importFetch:()=>k8()},If,g9=class{constructor(){this.util=require("util"),this.textEncoder=new this.util.TextEncoder}fetch(e,t){return J().global.fetch!=null?J().global.fetch(e,t):(If==null&&(If=y9.importFetch()),If(e,t))}now(){let e=process.hrtime();return e[0]*1e3+e[1]/1e6}encode(e,t){if(t!=="utf-8"&&t!=="utf8")throw new Error(`Node built-in encoder only supports utf-8, but got ${t}`);return this.textEncoder.encode(e)}decode(e,t){return e.length===0?"":new this.util.TextDecoder(t).decode(e)}};J().get("IS_NODE")&&J().setPlatform("node",new g9);function Le(e,t="float32",n){return t=t||"float32",af(e),new $t(e,t,n)}function x9(e,t){let n=E(e,"x","cast");if(!qg(t))throw new Error(`Failed to cast to unknown dtype ${t}`);if(t==="string"&&n.dtype!=="string"||t!=="string"&&n.dtype==="string")throw new Error("Only strings can be casted to strings");let r={x:n},a={dtype:t};return $.runKernel(cs,r,a)}var me=D({cast_:x9});function w9(e){let t={x:E(e,"x","clone","string_or_numeric")};return $.runKernel(vs,t)}var Er=D({clone_:w9});function v5(e,t=!1){console.log(e.toString(t))}u5();var b9={buffer:Le,cast:me,clone:Er,print:v5};Fk(b9);var gn={};Oe(gn,{browserFiles:()=>_9,browserHTTPRequest:()=>k9,concatenateArrayBuffers:()=>bf,copyModel:()=>f9,decodeWeights:()=>f5,encodeWeights:()=>jk,fromMemory:()=>I9,getLoadHandlers:()=>e9,getModelArtifactsInfoForJSON:()=>Ou,getSaveHandlers:()=>Qk,http:()=>Sf,isHTTPScheme:()=>Nf,listModels:()=>d9,loadWeights:()=>v9,moveModel:()=>m9,registerLoadRouter:()=>Jk,registerSaveRouter:()=>Yk,removeModel:()=>p9,weightsLoaderFactory:()=>k5,withSaveHandler:()=>N9});var S9="model",T9=".json",C9=".weights.bin";function I5(e){return new Promise(t=>setTimeout(t)).then(e)}var tl=class{constructor(e){if(!J().getBool("IS_BROWSER"))throw new Error("browserDownloads() cannot proceed because the current environment is not a browser.");e.startsWith(tl.URL_SCHEME)&&(e=e.slice(tl.URL_SCHEME.length)),(e==null||e.length===0)&&(e=S9),this.modelTopologyFileName=e+T9,this.weightDataFileName=e+C9}async save(e){if(typeof document=="undefined")throw new Error("Browser downloads are not supported in this environment since `document` is not present");let t=window.URL.createObjectURL(new Blob([e.weightData],{type:"application/octet-stream"}));if(e.modelTopology instanceof ArrayBuffer)throw new Error("BrowserDownloads.save() does not support saving model topology in binary formats yet.");{let n=[{paths:["./"+this.weightDataFileName],weights:e.weightSpecs}],r={modelTopology:e.modelTopology,format:e.format,generatedBy:e.generatedBy,convertedBy:e.convertedBy,weightsManifest:n};e.signature!=null&&(r.signature=e.signature),e.userDefinedMetadata!=null&&(r.userDefinedMetadata=e.userDefinedMetadata),e.modelInitializer!=null&&(r.modelInitializer=e.modelInitializer);let a=window.URL.createObjectURL(new Blob([JSON.stringify(r)],{type:"application/json"})),s=this.jsonAnchor==null?document.createElement("a"):this.jsonAnchor;if(s.download=this.modelTopologyFileName,s.href=a,await I5(()=>s.dispatchEvent(new MouseEvent("click"))),e.weightData!=null){let i=this.weightDataAnchor==null?document.createElement("a"):this.weightDataAnchor;i.download=this.weightDataFileName,i.href=t,await I5(()=>i.dispatchEvent(new MouseEvent("click")))}return{modelArtifactsInfo:Ou(e)}}}};tl.URL_SCHEME="downloads://";var E9=class{constructor(e){if(e==null||e.length<1)throw new Error(`When calling browserFiles, at least 1 file is required, but received ${e}`);this.files=e}async load(){let e=this.files[0],t=this.files.slice(1);return new Promise((n,r)=>{let a=new FileReader;a.onload=s=>{let i=JSON.parse(s.target.result),o=i.modelTopology;if(o==null){r(new Error(`modelTopology field is missing from file ${e.name}`));return}t.length===0&&n({modelTopology:o});let l=i.weightsManifest;if(l==null){r(new Error(`weightManifest field is missing from file ${e.name}`));return}let c;try{c=this.checkManifestAndWeightFiles(l,t)}catch(p){r(p);return}let u=[],h=[],d=[];l.forEach(p=>{p.paths.forEach(f=>{h.push(f),d.push(null)}),u.push(...p.weights)}),l.forEach(p=>{p.paths.forEach(f=>{let m=new FileReader;m.onload=A=>{let y=A.target.result,g=h.indexOf(f);if(d[g]=y,d.indexOf(null)===-1){let w={modelTopology:o,weightSpecs:u,weightData:bf(d),format:i.format,generatedBy:i.generatedBy,convertedBy:i.convertedBy};i.signature!=null&&(w.signature=i.signature),i.userDefinedMetadata!=null&&(w.userDefinedMetadata=i.userDefinedMetadata),i.modelInitializer!=null&&(w.modelInitializer=i.modelInitializer),n(w)}},m.onerror=A=>r(`Failed to weights data from file of path '${f}'.`),m.readAsArrayBuffer(c[f])})})},a.onerror=s=>r(`Failed to read model topology and weights manifest JSON from file '${e.name}'. BrowserFiles supports loading Keras-style tf.Model artifacts only.`),a.readAsText(e)})}checkManifestAndWeightFiles(e,t){let n=[],r=t.map(s=>A5(s.name)),a={};for(let s of e)s.paths.forEach(i=>{let o=A5(i);if(n.indexOf(o)!==-1)throw new Error(`Duplicate file basename found in weights manifest: '${o}'`);if(n.push(o),r.indexOf(o)===-1)throw new Error(`Weight file with basename '${o}' is not provided.`);a[i]=t[r.indexOf(o)]});if(n.length!==t.length)throw new Error(`Mismatch in the number of files in weights manifest (${n.length}) and the number of weight files provided (${t.length}).`);return a}},M9=e=>J().getBool("IS_BROWSER")&&!Array.isArray(e)&&e.startsWith(tl.URL_SCHEME)?R9(e.slice(tl.URL_SCHEME.length)):null;Nt.registerSaveRouter(M9);function R9(e="model"){return new tl(e)}function _9(e){return new E9(e)}function N5(e,t,n,r){i(e),n=n==null?0:n,r=r==null?1:r,o(n,r);let a=0,s=l=>(l.then(c=>{let u=n+ ++a/e.length*(r-n);return t(u),c}),l);function i(l){M(l!=null&&Array.isArray(l)&&l.length>0,()=>"promises must be a none empty array")}function o(l,c){M(l>=0&&l<=1,()=>`Progress fraction must be in range [0, 1], but got startFraction ${l}`),M(c>=0&&c<=1,()=>`Progress fraction must be in range [0, 1], but got endFraction ${c}`),M(c>=l,()=>`startFraction must be no more than endFraction, but got startFraction ${l} and endFraction ${c}`)}return Promise.all(e.map(s))}async function S5(e,t){t==null&&(t={});let n=t.fetchFunc==null?J().platform.fetch:t.fetchFunc,r=e.map(c=>n(c,t.requestInit,{isBinary:!0})),a=0,s=.5,i=(t.onProgress==null?await Promise.all(r):await N5(r,t.onProgress,a,s)).map(c=>c.arrayBuffer()),o=.5,l=1;return t.onProgress==null?await Promise.all(i):await N5(i,t.onProgress,o,l)}async function v9(e,t="",n,r){return k5(a=>S5(a,{requestInit:r}))(e,t,n)}function k5(e){return async(t,n="",r)=>{let a=t.map(()=>!1),s={},i=r!=null?r.map(()=>!1):[],o=[];if(t.forEach((p,f)=>{let m=0;p.weights.forEach(A=>{let y="quantization"in A?A.quantization.dtype:A.dtype,g=xf[y]*Ft(A.shape),w=()=>{a[f]=!0,s[f]==null&&(s[f]=[]),s[f].push({manifestEntry:A,groupOffset:m,sizeBytes:g})};r!=null?r.forEach((b,_)=>{b===A.name&&(w(),i[_]=!0)}):w(),o.push(A.name),m+=g})}),!i.every(p=>p)){let p=r.filter((f,m)=>!i[m]);throw new Error(`Could not find weights in manifest with names: ${p.join(", ")}. -Manifest JSON has weights with names: ${o.join(", ")}.`)}let l=a.reduce((p,f,m)=>(f&&p.push(m),p),[]),c=[];l.forEach(p=>{t[p].paths.forEach(f=>{let m=n+(n.endsWith("/")?"":"/")+f;c.push(m)})});let u=await e(c),h={},d=0;return l.forEach(p=>{let f=t[p].paths.length,m=0;for(let w=0;w{let b=A.slice(w.groupOffset,w.groupOffset+w.sizeBytes),_=f5(b,[w.manifestEntry]);for(let x in _)h[x]=_[x]}),d+=f}),h}}var F9="application/octet-stream",$9="application/json",Tf=class{constructor(e,t){if(this.DEFAULT_METHOD="POST",t==null&&(t={}),this.weightPathPrefix=t.weightPathPrefix,this.onProgress=t.onProgress,this.weightUrlConverter=t.weightUrlConverter,t.fetchFunc!=null?(M(typeof t.fetchFunc=="function",()=>"Must pass a function that matches the signature of `fetch` (see https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API)"),this.fetch=t.fetchFunc):this.fetch=J().platform.fetch,M(e!=null&&e.length>0,()=>"URL path for http must not be null, undefined or empty."),Array.isArray(e)&&M(e.length===2,()=>`URL paths for http must have a length of 2, (actual length is ${e.length}).`),this.path=e,t.requestInit!=null&&t.requestInit.body!=null)throw new Error("requestInit is expected to have no pre-existing body, but has one.");this.requestInit=t.requestInit||{}}async save(e){if(e.modelTopology instanceof ArrayBuffer)throw new Error("BrowserHTTPRequest.save() does not support saving model topology in binary formats yet.");let t=Object.assign({method:this.DEFAULT_METHOD},this.requestInit);t.body=new FormData;let n=[{paths:["./model.weights.bin"],weights:e.weightSpecs}],r={modelTopology:e.modelTopology,format:e.format,generatedBy:e.generatedBy,convertedBy:e.convertedBy,weightsManifest:n};e.signature!=null&&(r.signature=e.signature),e.userDefinedMetadata!=null&&(r.userDefinedMetadata=e.userDefinedMetadata),e.modelInitializer!=null&&(r.modelInitializer=e.modelInitializer),t.body.append("model.json",new Blob([JSON.stringify(r)],{type:$9}),"model.json"),e.weightData!=null&&t.body.append("model.weights.bin",new Blob([e.weightData],{type:F9}),"model.weights.bin");let a=await this.fetch(this.path,t);if(a.ok)return{modelArtifactsInfo:Ou(e),responses:[a]};throw new Error(`BrowserHTTPRequest.save() failed due to HTTP response status ${a.status}.`)}async load(){let e=await this.fetch(this.path,this.requestInit);if(!e.ok)throw new Error(`Request to ${this.path} failed with status code ${e.status}. Please verify this URL points to the model JSON of the model to load.`);let t;try{t=await e.json()}catch(p){let f=`Failed to parse model JSON of response from ${this.path}.`;throw this.path.endsWith(".pb")?f+=" Your path contains a .pb file extension. Support for .pb models have been removed in TensorFlow.js 1.0 in favor of .json models. You can re-convert your Python TensorFlow model using the TensorFlow.js 1.0 conversion scripts or you can convert your.pb models with the 'pb2json'NPM script in the tensorflow/tfjs-converter repository.":f+=" Please make sure the server is serving valid JSON for this request.",new Error(f)}let n=t.modelTopology,r=t.weightsManifest,a=t.generatedBy,s=t.convertedBy,i=t.format,o=t.signature,l=t.userDefinedMetadata;if(n==null&&r==null)throw new Error(`The JSON from HTTP path ${this.path} contains neither model topology or manifest for weights.`);let c,u;r!=null&&([c,u]=await this.loadWeights(r));let h={modelTopology:n,weightSpecs:c,weightData:u,generatedBy:a,convertedBy:s,format:i};o!=null&&(h.signature=o),l!=null&&(h.userDefinedMetadata=l);let d=t.modelInitializer;return d&&(h.modelInitializer=d),h}async loadWeights(e){let t=Array.isArray(this.path)?this.path[1]:this.path,[n,r]=D9(t),a=this.weightPathPrefix||n,s=[];for(let c of e)s.push(...c.weights);let i=[],o=[];for(let c of e)for(let u of c.paths)this.weightUrlConverter!=null?o.push(this.weightUrlConverter(u)):i.push(a+u+r);this.weightUrlConverter&&i.push(...await Promise.all(o));let l=await S5(i,{requestInit:this.requestInit,fetchFunc:this.fetch,onProgress:this.onProgress});return[s,bf(l)]}};Tf.URL_SCHEME_REGEX=/^https?:\/\//;function D9(e){let t=e.lastIndexOf("/"),n=e.lastIndexOf("?"),r=e.substring(0,t),a=n>t?e.substring(n):"";return[r+"/",a]}function Nf(e){return e.match(Tf.URL_SCHEME_REGEX)!=null}var T5=(e,t)=>{if(typeof fetch=="undefined"&&(t==null||t.fetchFunc==null))return null;{let n=!0;if(Array.isArray(e)?n=e.every(r=>Nf(r)):n=Nf(e),n)return Sf(e,t)}return null};Nt.registerSaveRouter(T5);Nt.registerLoadRouter(T5);function Sf(e,t){return new Tf(e,t)}function k9(e,t){return Sf(e,t)}var Cf=class{constructor(e){this.modelArtifacts=e}async load(){return this.modelArtifacts}},O9=class{constructor(e){this.saveHandler=e}async save(e){return this.saveHandler(e)}};function I9(e,t,n,r){return arguments.length===1?e.modelTopology!=null||e.weightSpecs!=null?new Cf(e):(console.warn("Please call tf.io.fromMemory() with only one argument. The argument should be of type ModelArtifacts. The multi-argument signature of tf.io.fromMemory() has been deprecated and will be removed in a future release."),new Cf({modelTopology:e})):(console.warn("Please call tf.io.fromMemory() with only one argument. The argument should be of type ModelArtifacts. The multi-argument signature of tf.io.fromMemory() has been deprecated and will be removed in a future release."),new Cf({modelTopology:e,weightSpecs:t,weightData:n,trainingConfig:r}))}function N9(e){return new O9(e)}var C5={};Oe(C5,{confusionMatrix:()=>z9});function P9(e,t,n=!1,r=!1){let a=E(e,"a","matMul"),s=E(t,"b","matMul");[a,s]=bt(a,s);let i={a,b:s},o={transposeA:n,transposeB:r};return $.runKernel(us,i,o)}var Ge=D({matMul_:P9});function L9(e,t,n=1,r=0){if(t<2)throw new Error(`Error in oneHot: depth must be >=2, but it is ${t}`);let a={indices:E(e,"indices","oneHot","int32")},s={depth:t,onValue:n,offValue:r};return $.runKernel(Fs,a,s)}var nl=D({oneHot_:L9});function W9(e,t){let n=E(e,"x","transpose");if(t==null&&(t=n.shape.map((s,i)=>i).reverse()),M(n.rank===t.length,()=>`Error in transpose: rank of input ${n.rank} must match length of perm ${t}.`),t.forEach(s=>{M(s>=0&&s`All entries in 'perm' must be between 0 and ${n.rank-1} but got ${t}`)}),n.rank<=1)return n.clone();let r={x:n},a={perm:t};return $.runKernel(Ys,r,a)}var nt=D({transpose_:W9});function B9(e,t,n){let r=E(e,"labels","confusionMatrix"),a=E(t,"predictions","confusionMatrix");M(n==null||n>0&&Number.isInteger(n),()=>`If provided, numClasses must be a positive integer, but got ${n}`),M(r.rank===1,()=>`Expected the rank of labels to be 1, but got ${r.rank}`),M(a.rank===1,()=>`Expected the rank of predictions to be 1, but got ${a.rank}`),M(r.shape[0]===a.shape[0],()=>`Mismatch in the number of examples: ${r.shape[0]} vs. ${a.shape[0]}. Labels and predictions should have the same number of elements.`),M(n>0&&Number.isInteger(n),()=>`numClasses is required to be a positive integer, but got ${n}`);let s=nl(me(r,"int32"),n),i=nl(me(a,"int32"),n),o=nt(s),l=Ge(o,i);return me(l,"int32")}var z9=D({confusionMatrix_:B9}),rl={};Oe(rl,{fromPixels:()=>j9,fromPixelsAsync:()=>V9,toPixels:()=>U9});function od(e,t,n){if(as(e),t!=null&&t.length!==3)throw new Error("tensor3d() requires shape to have three numbers");let r=Cr(e,n);if(r.length!==3&&r.length!==1)throw new Error("tensor3d() requires values to be number[][][] or flat/TypedArray");if(r.length===1&&t==null)throw new Error("tensor3d() requires shape to be provided when `values` are a flat array");return Sa(e,t,r,n)}var al;function E5(e,t=3){if(t>4)throw new Error("Cannot construct Tensor with more than 4 channels from pixels.");if(e==null)throw new Error("pixels passed to tf.browser.fromPixels() can not be null");let n=!1,r=!1,a=!1,s=!1,i=!1,o=!1;if(e.data instanceof Uint8Array)n=!0;else if(typeof ImageData!="undefined"&&e instanceof ImageData)r=!0;else if(typeof HTMLVideoElement!="undefined"&&e instanceof HTMLVideoElement)a=!0;else if(typeof HTMLImageElement!="undefined"&&e instanceof HTMLImageElement)s=!0;else if(e.getContext!=null)i=!0;else if(typeof ImageBitmap!="undefined"&&e instanceof ImageBitmap)o=!0;else throw new Error(`pixels passed to tf.browser.fromPixels() must be either an HTMLVideoElement, HTMLImageElement, HTMLCanvasElement, ImageData in browser, or OffscreenCanvas, ImageData in webworker or {data: Uint32Array, width: number, height: number}, but was ${e.constructor.name}`);if(a){let d=2;if(a&&e.readyState element.")}if(ed(Qh,$.backendName)!=null){let d={pixels:e},p={numChannels:t};return $.runKernel(Qh,d,p)}let[l,c]=a?[e.videoWidth,e.videoHeight]:[e.width,e.height],u;i?u=e.getContext("2d").getImageData(0,0,l,c).data:r||n?u=e.data:(s||a||o)&&(al==null&&(al=document.createElement("canvas").getContext("2d")),al.canvas.width=l,al.canvas.height=c,al.drawImage(e,0,0,l,c),u=al.getImageData(0,0,l,c).data);let h;if(t===4)h=new Int32Array(u);else{let d=l*c;h=new Int32Array(d*t);for(let p=0;p4||s===2)throw new Error(`toPixels only supports depth of size 1, 3 or 4 but got ${s}`);if(n.dtype!=="float32"&&n.dtype!=="int32")throw new Error(`Unsupported type for toPixels: ${n.dtype}. Please use float32 or int32 tensors.`);let i=await n.data(),o=n.dtype==="float32"?255:1,l=new Uint8ClampedArray(a*r*4);for(let c=0;c1)throw new Error(`Tensor values for a float32 Tensor must be in the range [0 - 1] but encountered ${p}.`)}else if(n.dtype==="int32"&&(p<0||p>255))throw new Error(`Tensor values for a int32 Tensor must be in the range [0 - 255] but encountered ${p}.`);s===1?(u[0]=p*o,u[1]=p*o,u[2]=p*o):u[d]=p*o}let h=c*4;l[h+0]=Math.round(u[0]),l[h+1]=Math.round(u[1]),l[h+2]=Math.round(u[2]),l[h+3]=Math.round(u[3])}if(t!=null){t.width=a,t.height=r;let c=t.getContext("2d"),u=new ImageData(l,a,r);c.putImageData(u,0,0)}return n!==e&&n.dispose(),l}var j9=D({fromPixels_:E5}),Ef={};Oe(Ef,{prepareAndValidate:()=>R5});function R5(e,t){let n=e.shape.length,r=t.shape.length;if(n<1)throw new Error(`tf.gatherND() expects the input to be rank 1 or higher, but the rank was ${n}.`);if(r<1)throw new Error(`tf.gatherND() expects the indices to be rank 1 or higher, but the rank was ${r}.`);if(t.dtype!=="int32")throw new Error(`tf.gatherND() expects the indices to be int32 type, but the dtype was ${t.dtype}.`);if(t.shape[r-1]>n)throw new Error(`index innermost dimension length must be <= tensor rank; saw: ${t.shape[r-1]} vs. ${n}`);if(Ft(e.shape)===0)throw new Error(`Requested more than 0 entries, but input is empty. Input shape: ${e.shape}.`);let a=t.shape,s=a[a.length-1],i=1;for(let h=0;hh/c),1].slice(0,s);return[l,i,c,u]}var Rf={};Oe(Rf,{calculateShapes:()=>M5,validateInput:()=>Ff,validateUpdateShape:()=>Mf});function Mf(e,t,n){let r=t.rank>1?t.shape[t.rank-1]:1,a=t.rank>1?t.rank-1:1,s=`Must have updates.shape = indices.shape[:batchDim] + shape[sliceDim:], got updates.shape: ${n.shape}, indices.shape: ${t.shape}, shape: ${e}, sliceDim: ${r}, and batchDim: ${a}.`;if(n.rank1?t.shape[r-1]:1,s=n.length,i=1;for(let h=a;hK9,computeFlatOffset:()=>Y9,computeOutShape:()=>F5,getNormalizedAxes:()=>D5,isSliceContinous:()=>Z9,maskToAxes:()=>ld,parseSliceParams:()=>B5,sliceInfo:()=>J9,startForAxis:()=>L5,startIndicesWithElidedDims:()=>O5,stopForAxis:()=>W5,stopIndicesWithElidedDims:()=>z5,stridesForAxis:()=>P5,stridesWithElidedDims:()=>$5});function K9(e,t,n){let r=e.shape.length;M(r===t.length,()=>`Error in slice${r}D: Length of begin ${t} must match the rank of the array (${r}).`),M(r===n.length,()=>`Error in slice${r}D: Length of size ${n} must match the rank of the array (${r}).`);for(let a=0;a`Error in slice${r}D: begin[${a}] + size[${a}] (${t[a]+n[a]}) would overflow input.shape[${a}] (${e.shape[a]})`)}function ld(e){let t=[],n=0;for(;e>0;)e&1&&t.push(n),e/=2,n++;return t}function F5(e,t,n){let r=[];for(let a=0;a0){let p=t[0],f=n+1;u=O5(i,p,f,r,e),h=z5(o,p,f,a,e),d=$5(s,p,f,e)}else for(let p=0;p-1)s[o]=0;else{let l=V5(t,n,o),c=r[l];e&1<-1)s[o]=Number.MAX_SAFE_INTEGER;else{let l=V5(t,n,o),c=r[l];e&1<0?i=Number.MIN_SAFE_INTEGER:i=Number.MAX_SAFE_INTEGER);let l=r[a];return i<0&&(i+=l),i=ou(0,i,l-1),i}function W5(e,t,n,r,a,s){let i=t[a],o=n[a]||1;(e&1<0?i=Number.MAX_SAFE_INTEGER:i=Number.MIN_SAFE_INTEGER);let l=r[a];return i<0&&(i+=l),o>0?i=ou(0,i,l):i=ou(-1,i,l-1),i}function Z9(e,t,n){let r=n.length;for(let a=0;a1){r=a;break}for(let a=r+1;a0||n[a]!==e[a])return!1;return!0}function Y9(e,t){let n=e.length>0?e[e.length-1]:1;for(let r=0;r{M(i!==-1,()=>"slice() does not support negative begin indexing.")});let s;return n==null?s=new Array(a).fill(-1):typeof n=="number"?s=[n,...new Array(a-1).fill(-1)]:n.lengthi>=0?i:(M(i===-1,()=>`Negative size values should be exactly -1 but got ${i} for the slice() size at index ${o}.`),e.shape[o]-r[o])),[r,s]}function J9(e,t,n,r,a,s,i,o,l){let c=t.slice(),u=n.slice(),h=r;r==null&&(h=new Array(c.length));let d=ld(i);if(d.length>1)throw new Error("Multiple ellipses in slice is not allowed.");if(i!==0&&o!==0)throw new Error("Using both ellipsisMask and newAxisMask is not yet supported.");if(i!==0&&l!==0)throw new Error("Using both ellipsisMask and shrinkAxisMask is not yet supported.");let p=e.length-c.length,f=ld(o),m=e.slice();f.forEach(x=>{c[x]=0,u[x]=1,m.splice(x,0,1)});let{begin:A,end:y,strides:g}=D5(m,d,p,c,u,h,a,s,i);c=A,u=y,h=g;let w=ld(l);w.forEach(x=>{u[x]=c[x]+1,h[x]=1});let b=F5(c,u,h),_=b.filter((x,N)=>w.indexOf(N)===-1);return{nonStrided:h.every(x=>x===1),$begin:c,$end:u,$strides:h,size:b,newShape:m,outShape:_}}var re={};Oe(re,{Serializable:()=>j5,SerializationMap:()=>si,registerClass:()=>Ca});var j5=class{getClassName(){return this.constructor.className}static fromConfig(e,t){return new e(t)}},si=class{constructor(){this.classNameMap={}}static getMap(){return si.instance==null&&(si.instance=new si),si.instance}static register(e){si.getMap().classNameMap[e.className]=[e,e.fromConfig]}};function Ca(e){M(e.className!=null,()=>"Class being registered does not have the static className property defined."),M(typeof e.className=="string",()=>"className is required to be a string, but got type "+typeof e.className),M(e.className.length>0,()=>"Class being registered has an empty-string as its className, which is disallowed."),si.register(e)}var H5={};Oe(H5,{TEST_EPSILON_FLOAT16:()=>G5,encodeStrings:()=>q5,expectArrayBuffersEqual:()=>aI,expectArraysClose:()=>Q9,expectArraysEqual:()=>tI,expectNumbersClose:()=>nI,expectPromiseToFail:()=>eI,expectValuesInRange:()=>rI,testEpsilon:()=>$f});var sI=.001,G5=.1;function Q9(e,t,n){return n==null&&(n=$f()),Df(e,t,(r,a)=>Of(r,a,n))}function $f(){return $.backend.floatPrecision()===32?sI:G5}function Df(e,t,n){let r=!0;if((nn(e)||nn(t))&&(r=!1),nn(e)&&nn(t)&&(r=!0),r){let i=e.constructor.name,o=t.constructor.name;if(i!==o)throw new Error(`Arrays are of different type. Actual: ${i}. Expected: ${o}`)}if(Array.isArray(e)&&Array.isArray(t)){let i=Cr(e),o=Cr(t);if(!Jr(i,o))throw new Error(`Arrays have different shapes. Actual: [${i}]. Expected: [${o}]`)}let a=nn(e)?e:ss(e),s=nn(t)?t:ss(t);if(a.length!==s.length)throw new Error(`Arrays have different lengths actual: ${a.length} vs expected: ${s.length}. -Actual: ${a}. -Expected: ${s}.`);for(let i=0;it.fail(),()=>t())}function tI(e,t){let n=typeof t=="string"||typeof t=="number"||typeof t=="boolean"?[t]:t;return wa(e)||wa(e[0])||wa(t)||wa(t[0])?Df(e,n,(r,a)=>r==a):Df(e,t,(r,a)=>Of(r,a,0))}function nI(e,t,n){if(n==null&&(n=$f()),!Of(e,t,n))throw new Error(`Numbers differ: actual === ${e}, expected === ${t}`)}function Of(e,t,n){return!isFinite(e)&&!isFinite(t)?!0:!(isNaN(e)||isNaN(t)||Math.abs(e-t)>n)}function rI(e,t,n){for(let r=0;rn)throw new Error(`Value out of range:${e[r]} low: ${t}, high: ${n}`)}function aI(e,t){expect(new Float32Array(e)).toEqual(new Float32Array(t))}function q5(e){for(let t=0;tt.dispose())}function Ut(e){return $.keep(e)}function hI(e){return $.time(e)}function dI(e){return $.setBackend(e)}function pI(){return $.ready()}function fI(){return $.backendName}function mI(e){$.removeBackend(e)}function Pf(e){return $.findBackend(e)}function AI(e){return $.findBackendFactory(e)}function sl(e,t,n=1){return $.registerBackend(e,t,n)}function X5(){return $.backend}function yI(e,t){J().setPlatform(e,t)}function gI(e,t){let n=E(e,"a","add"),r=E(t,"b","add");[n,r]=bt(n,r);let a={a:n,b:r};return $.runKernel(_a,a)}var se=D({add_:gI});function xI(e,t){let n=E(e,"a","floorDiv"),r=E(t,"b","floorDiv");[n,r]=bt(n,r);let a={a:n,b:r};return $.runKernel(ws,a)}var cd=D({floorDiv_:xI});function wI(e,t){let n=E(e,"a","div"),r=E(t,"b","div");if([n,r]=bt(n,r),n.dtype==="int32"&&r.dtype==="int32")return cd(n,r);let a={a:n,b:r},s={};return $.runKernel(ys,a,s)}var ge=D({div_:wI});function bI(e,t){let n=E(e,"a","mul"),r=E(t,"b","mul");[n,r]=bt(n,r);let a={a:n,b:r};return $.runKernel(Ms,a)}var P=D({mul_:bI});function _I(e){let t=E(e,"x","abs");if(t.dtype==="complex64"){let n={x:t};return $.runKernel(du,n)}else{let n={x:t};return $.runKernel(Zi,n)}}var Dt=D({abs_:_I});function vI(e){let t={x:E(e,"x","acos")};return $.runKernel(Yi,t)}var Lf=D({acos_:vI});function kI(e){let t={x:E(e,"x","acosh")};return $.runKernel(Ji,t)}var Wf=D({acosh_:kI});function II(e){M(Array.isArray(e),()=>"The argument passed to tf.addN() must be a list of tensors"),M(e.length>=1,()=>`Must pass at least one tensor to tf.addN(), but got ${e.length}`);let t=e.map((a,s)=>E(a,`tensors${s}`,"addN")),n=t[0];t.forEach(a=>{if(a.dtype!==n.dtype)throw new Error("All tensors passed to tf.addN() must have the same dtype")}),t.forEach(a=>{if(!Jr(a.shape,n.shape))throw new Error("All tensors passed to tf.addN() must have the same shape")});let r=t;return $.runKernel(is,r)}var Ea=D({addN_:II});function NI(e,t=null,n=!1){let r={x:E(e,"x","all","bool")},a={axis:t,keepDims:n};return $.runKernel(_h,r,a)}var hd=D({all_:NI});function SI(e,t=null,n=!1){let r={x:E(e,"x","any","bool")},a={axis:t,keepDims:n};return $.runKernel(vh,r,a)}var zu=D({any_:SI});function TI(e,t=0){let n={x:E(e,"x","argMax")},r={axis:t};return $.runKernel(os,n,r)}var Pu=D({argMax_:TI});function CI(e,t=0){let n={x:E(e,"x","argMin")},r={axis:t};return $.runKernel(uu,n,r)}var Bf=D({argMin_:CI});function EI(e){let t={x:E(e,"x","asin")};return $.runKernel(Qi,t)}var Vf=D({asin_:EI});function RI(e){let t={x:E(e,"x","asinh")};return $.runKernel(eo,t)}var Uf=D({asinh_:RI});function MI(e){let t={x:E(e,"x","atan")};return $.runKernel(to,t)}var jf=D({atan_:MI});function FI(e,t){let n=E(e,"a","atan2"),r=E(t,"b","atan2");[n,r]=bt(n,r);let a={a:n,b:r};return $.runKernel(ro,a)}var Hf=D({atan2_:FI});function $I(e){let t={x:E(e,"x","atanh")};return $.runKernel(no,t)}var Gf=D({atanh_:$I});function DI(e,t,n,r,a="NHWC",s){let i=e[3],o=[...t,i],l=K5(a);return Lu(e,o,n,s,r,null,null,l)}function Z5(e,t,n,r,a,s,i="channelsLast"){let[o,l]=dd(t),c;if(i==="channelsLast")c=[o,l,e[3],e[3]];else if(i==="channelsFirst")c=[o,l,e[1],e[1]];else throw new Error(`Unknown dataFormat ${i}`);return Lu(e,c,n,r,a,s,!1,i)}function OI(e,t,n,r,a,s,i="NDHWC"){let[o,l,c]=qf(t),u,h;if(i==="NDHWC")h="channelsLast",u=[o,l,c,e[4],e[4]];else if(i==="NCDHW")h="channelsFirst",u=[o,l,c,e[1],e[1]];else throw new Error(`Unknown dataFormat ${i}`);return Y5(e,u,n,r,a,!1,h,s)}function Lu(e,t,n,r,a,s,i=!1,o="channelsLast"){let[l,c,u,h]=[-1,-1,-1,-1];if(o==="channelsLast")[l,c,u,h]=e;else if(o==="channelsFirst")[l,h,c,u]=e;else throw new Error(`Unknown dataFormat ${o}`);let[d,p,,f]=t,[m,A]=dd(n),[y,g]=dd(r),w=il(d,y),b=il(p,g),{padInfo:_,outHeight:x,outWidth:N}=zI(a,c,u,m,A,w,b,s,o),T=i?f*h:f,C;return o==="channelsFirst"?C=[l,T,x,N]:o==="channelsLast"&&(C=[l,x,N,T]),{batchSize:l,dataFormat:o,inHeight:c,inWidth:u,inChannels:h,outHeight:x,outWidth:N,outChannels:T,padInfo:_,strideHeight:m,strideWidth:A,filterHeight:d,filterWidth:p,effectiveFilterHeight:w,effectiveFilterWidth:b,dilationHeight:y,dilationWidth:g,inShape:e,outShape:C,filterShape:t}}function Y5(e,t,n,r,a,s=!1,i="channelsLast",o){let[l,c,u,h,d]=[-1,-1,-1,-1,-1];if(i==="channelsLast")[l,c,u,h,d]=e;else if(i==="channelsFirst")[l,d,c,u,h]=e;else throw new Error(`Unknown dataFormat ${i}`);let[p,f,m,,A]=t,[y,g,w]=qf(n),[b,_,x]=qf(r),N=il(p,b),T=il(f,_),C=il(m,x),{padInfo:F,outDepth:O,outHeight:W,outWidth:V}=PI(a,c,u,h,y,g,w,N,T,C,o),U=s?A*d:A,j;return i==="channelsFirst"?j=[l,U,O,W,V]:i==="channelsLast"&&(j=[l,O,W,V,U]),{batchSize:l,dataFormat:i,inDepth:c,inHeight:u,inWidth:h,inChannels:d,outDepth:O,outHeight:W,outWidth:V,outChannels:U,padInfo:F,strideDepth:y,strideHeight:g,strideWidth:w,filterDepth:p,filterHeight:f,filterWidth:m,effectiveFilterDepth:N,effectiveFilterHeight:T,effectiveFilterWidth:C,dilationDepth:b,dilationHeight:_,dilationWidth:x,inShape:e,outShape:j,filterShape:t}}function LI(e,t,n,r,a){r==null&&(r=Xf(e,t,n));let s=e[0],i=e[1],o=ii((s-t+2*r)/n+1,a),l=ii((i-t+2*r)/n+1,a);return[o,l]}function WI(e,t,n,r,a,s){a==null&&(a=Xf(e,t,r));let i=e[0],o=e[1],l=e[2],c=ii((i-t+2*a)/r+1,s),u=ii((o-t+2*a)/r+1,s),h=ii((l-t+2*a)/r+1,s);return[c,u,h,n]}function Xf(e,t,n,r=1){let a=il(t,r);return Math.floor((e[0]*(n-1)-n+a)/2)}function dd(e){return typeof e=="number"?[e,e,e]:e.length===2?[e[0],e[1],1]:e}function qf(e){return typeof e=="number"?[e,e,e]:e}function il(e,t){return t<=1?e:e+(e-1)*(t-1)}function zI(e,t,n,r,a,s,i,o,l){let c,u,h;if(typeof e=="number"){c={top:e,bottom:e,left:e,right:e,type:e===0?"VALID":"NUMBER"};let d=LI([t,n],s,r,e,o);u=d[0],h=d[1]}else if(e==="same"){u=Math.ceil(t/r),h=Math.ceil(n/a);let d=Math.max(0,(u-1)*r+s-t),p=Math.max(0,(h-1)*a+i-n),f=Math.floor(d/2),m=d-f,A=Math.floor(p/2),y=p-A;c={top:f,bottom:m,left:A,right:y,type:"SAME"}}else if(e==="valid")c={top:0,bottom:0,left:0,right:0,type:"VALID"},u=Math.ceil((t-s+1)/r),h=Math.ceil((n-i+1)/a);else if(typeof e=="object"){let d=l==="channelsLast"?e[1][0]:e[2][0],p=l==="channelsLast"?e[1][1]:e[2][1],f=l==="channelsLast"?e[2][0]:e[3][0],m=l==="channelsLast"?e[2][1]:e[3][1];c={top:d,bottom:p,left:f,right:m,type:d===0&&p===0&&f===0&&m===0?"VALID":"EXPLICIT"},u=ii((t-s+d+p)/r+1,o),h=ii((n-i+f+m)/a+1,o)}else throw Error(`Unknown padding parameter: ${e}`);return{padInfo:c,outHeight:u,outWidth:h}}function PI(e,t,n,r,a,s,i,o,l,c,u){let h,d,p,f;if(typeof e=="number"){h={top:e,bottom:e,left:e,right:e,front:e,back:e,type:e===0?"VALID":"NUMBER"};let m=WI([t,n,r,1],o,1,a,e,u);d=m[0],p=m[1],f=m[2]}else if(e==="same"){d=Math.ceil(t/a),p=Math.ceil(n/s),f=Math.ceil(r/i);let m=(d-1)*a+o-t,A=(p-1)*s+l-n,y=(f-1)*i+c-r,g=Math.floor(m/2),w=m-g,b=Math.floor(A/2),_=A-b,x=Math.floor(y/2),N=y-x;h={top:b,bottom:_,left:x,right:N,front:g,back:w,type:"SAME"}}else if(e==="valid")h={top:0,bottom:0,left:0,right:0,front:0,back:0,type:"VALID"},d=Math.ceil((t-o+1)/a),p=Math.ceil((n-l+1)/s),f=Math.ceil((r-c+1)/i);else throw Error(`Unknown padding parameter: ${e}`);return{padInfo:h,outDepth:d,outHeight:p,outWidth:f}}function ii(e,t){if(!t)return Math.trunc(e);switch(t){case"round":return Math.round(e);case"ceil":return Math.ceil(e);case"floor":return Math.floor(e);default:throw new Error(`Unknown roundingMode ${t}`)}}function Ra(e){let[t,n,r]=dd(e);return t===1&&n===1&&r===1}function Mr(e,t){return Ra(e)||Ra(t)}function K5(e){if(e==="NHWC")return"channelsLast";if(e==="NCHW")return"channelsFirst";throw new Error(`Unknown dataFormat ${e}`)}function BI(e,t){let n={x:E(e,"x","reshape","string_or_numeric")},r={shape:t};return $.runKernel(Do,n,r)}var H=D({reshape_:BI});function VI(e,t,n,r,a){let s=E(e,"x","avgPool","float32"),i=1;M(Mr(n,i),()=>`Error in avgPool: Either strides or dilations must be 1. Got strides ${n} and dilations '${i}'`);let o=s,l=!1;s.rank===3&&(l=!0,o=H(s,[1,s.shape[0],s.shape[1],s.shape[2]])),M(o.rank===4,()=>`Error in avgPool: x must be rank 4 but got rank ${o.rank}.`),a!=null&&M(Vt(r),()=>`Error in avgPool: pad must be an integer when using, dimRoundingMode ${a} but got pad ${r}.`);let c={x:o},u={filterSize:t,strides:n,pad:r,dimRoundingMode:a},h=$.runKernel(ls,c,u);return h=me(h,s.dtype),l?H(h,[h.shape[1],h.shape[2],h.shape[3]]):h}var Wu=D({avgPool_:VI});function UI(e,t,n,r,a,s="NDHWC"){let i=E(e,"x","avgPool3d","float32"),o=i,l=!1;i.rank===4&&(l=!0,o=H(i,[1,i.shape[0],i.shape[1],i.shape[2],i.shape[3]])),M(o.rank===5,()=>`Error in avgPool3d: x must be rank 5 but got rank ${o.rank}.`),M(s==="NDHWC",()=>`Error in avgPool3d: Only NDHWC is currently supported, but got dataFormat of ${s}`),a!=null&&M(Vt(r),()=>`Error in avgPool3d: pad must be an integer when using, dimRoundingMode ${a} but got pad ${r}.`);let c={x:o},u={filterSize:t,strides:n,pad:r,dimRoundingMode:a,dataFormat:s},h=$.runKernel(cu,c,u);return h=me(h,o.dtype),l?H(h,[h.shape[1],h.shape[2],h.shape[3],h.shape[4]]):h}var Kf=D({avgPool3d_:UI});function jI(e,t=0){M(e.length>=1,()=>"Pass at least one tensor to concat");let n=Du(e,"tensors","concat","string_or_numeric");if(n[0].dtype==="complex64"&&n.forEach(s=>{if(s.dtype!=="complex64")throw new Error(`Cannot concatenate complex64 tensors with a tensor - with dtype ${s.dtype}. `)}),n.length===1)return Er(n[0]);let r=n,a={axis:t};return $.runKernel(ao,r,a)}var rt=D({concat_:jI});function HI(e){let t={x:E(e,"x","sigmoid")};return $.runKernel(js,t)}var Cn=D({sigmoid_:HI});function GI(e,t,n){let r=E(e,"x","slice","string_or_numeric");if(r.rank===0)throw new Error("Slicing scalar is not possible");let a={x:r},s={begin:t,size:n};return $.runKernel(Lo,a,s)}var Ee=D({slice_:GI});function qI(e){let t={x:E(e,"x","tanh")};return $.runKernel(Zs,t)}var ol=D({tanh_:qI});function XI(e,t,n,r,a,s){let i=E(e,"forgetBias","basicLSTMCell"),o=E(t,"lstmKernel","basicLSTMCell"),l=E(n,"lstmBias","basicLSTMCell"),c=E(r,"data","basicLSTMCell"),u=E(a,"c","basicLSTMCell"),h=E(s,"h","basicLSTMCell"),d=rt([c,h],1),p=Ge(d,o),f=se(p,l),m=f.shape[0],A=f.shape[1]/4,y=[m,A],g=Ee(f,[0,0],y),w=Ee(f,[0,A],y),b=Ee(f,[0,A*2],y),_=Ee(f,[0,A*3],y),x=se(P(Cn(g),ol(w)),P(u,Cn(se(i,b)))),N=P(ol(x),Cn(_));return[x,N]}var KI=D({basicLSTMCell_:XI});function ZI(e,t,n){let r=E(e,"x","batchToSpaceND"),a=t.reduce((o,l)=>o*l);M(r.rank>=1+t.length,()=>`input rank is ${r.rank} but should be > than blockShape.length ${t.length}`),M(n.length===t.length,()=>`crops.length is ${n.length} but should be equal to blockShape.length ${t.length}`),M(r.shape[0]%a==0,()=>`input tensor batch is ${r.shape[0]} but is not divisible by the product of the elements of blockShape ${t.join(" * ")} === ${a}`);let s={x:r},i={blockShape:t,crops:n};return $.runKernel(hu,s,i)}var Bu=D({batchToSpaceND_:ZI});function YI(e){let t;return e.rank===0||e.rank===1?t=H(e,[1,1,1,e.size]):e.rank===2?t=H(e,[1,1,e.shape[0],e.shape[1]]):e.rank===3?t=H(e,[1,e.shape[0],e.shape[1],e.shape[2]]):t=e,t}function JI(e,t,n,r,a,s){s==null&&(s=.001);let i=E(e,"x","batchNorm"),o=E(t,"mean","batchNorm"),l=E(n,"variance","batchNorm"),c;a!=null&&(c=E(a,"scale","batchNorm"));let u;r!=null&&(u=E(r,"offset","batchNorm")),M(o.rank===l.rank,()=>"Batch normalization gradient requires mean and variance to have equal ranks."),M(u==null||o.rank===u.rank,()=>"Batch normalization gradient requires mean and offset to have equal ranks."),M(c==null||o.rank===c.rank,()=>"Batch normalization gradient requires mean and scale to have equal ranks.");let h={x:YI(i),scale:c,offset:u,mean:o,variance:l},d={varianceEpsilon:s},p=$.runKernel(bs,h,d);return H(p,i.shape)}var oi=D({batchNorm_:JI});function QI(e,t,n,r,a,s){let i=E(e,"x","batchNorm"),o=E(t,"mean","batchNorm"),l=E(n,"variance","batchNorm"),c;a!=null&&(c=E(a,"scale","batchNorm"));let u;return r!=null&&(u=E(r,"offset","batchNorm")),M(i.rank===2,()=>`Error in batchNorm2D: x must be rank 2 but got rank ${i.rank}.`),M(o.rank===2||o.rank===1,()=>`Error in batchNorm2D: mean must be rank 2 or rank 1 but got rank ${o.rank}.`),M(l.rank===2||l.rank===1,()=>`Error in batchNorm2D: variance must be rank 2 or rank 1 but got rank ${l.rank}.`),c!=null&&M(c.rank===2||c.rank===1,()=>`Error in batchNorm2D: scale must be rank 2 or rank 1 but got rank ${c.rank}.`),u!=null&&M(u.rank===2||u.rank===1,()=>`Error in batchNorm2D: offset must be rank 2 or rank 1 but got rank ${u.rank}.`),oi(i,o,l,u,c,s)}var J5=D({batchNorm2d_:QI});function eN(e,t,n,r,a,s){let i=E(e,"x","batchNorm"),o=E(t,"mean","batchNorm"),l=E(n,"variance","batchNorm"),c;a!=null&&(c=E(a,"scale","batchNorm"));let u;return r!=null&&(u=E(r,"offset","batchNorm")),M(i.rank===3,()=>`Error in batchNorm3D: x must be rank 3 but got rank ${i.rank}.`),M(o.rank===3||o.rank===1,()=>`Error in batchNorm3D: mean must be rank 3 or rank 1 but got rank ${o.rank}.`),M(l.rank===3||l.rank===1,()=>`Error in batchNorm3D: variance must be rank 3 or rank 1 but got rank ${l.rank}.`),c!=null&&M(c.rank===3||c.rank===1,()=>`Error in batchNorm3D: scale must be rank 3 or rank 1 but got rank ${c.rank}.`),u!=null&&M(u.rank===3||u.rank===1,()=>`Error in batchNorm3D: offset must be rank 3 or rank 1 but got rank ${u.rank}.`),oi(i,o,l,u,c,s)}var Q5=D({batchNorm3d_:eN});function tN(e,t,n,r,a,s){let i=E(e,"x","batchNorm"),o=E(t,"mean","batchNorm"),l=E(n,"variance","batchNorm"),c;a!=null&&(c=E(a,"scale","batchNorm"));let u;return r!=null&&(u=E(r,"offset","batchNorm")),M(i.rank===4,()=>`Error in batchNorm4D: x must be rank 4 but got rank ${i.rank}.`),M(o.rank===4||o.rank===1,()=>`Error in batchNorm4D: mean must be rank 4 or rank 1 but got rank ${o.rank}.`),M(l.rank===4||l.rank===1,()=>`Error in batchNorm4D: variance must be rank 4 or rank 1 but got rank ${l.rank}.`),c!=null&&M(c.rank===4||c.rank===1,()=>`Error in batchNorm4D: scale must be rank 4 or rank 1 but got rank ${c.rank}.`),u!=null&&M(u.rank===4||u.rank===1,()=>`Error in batchNorm4D: offset must be rank 4 or rank 1 but got rank ${u.rank}.`),oi(i,o,l,u,c,s)}var ex=D({batchNorm4d_:tN});function nN(e,t,n){let r=E(e,"x","bincount"),a=E(t,"weights","bincount");M(r.dtype==="int32",()=>`Error in bincount: input dtype must be int32, but got ${r.dtype}`),M(n>=0,()=>`size must be non-negative, but got ${n}.`),M(a.size===r.size||a.size===0,()=>`Error in bincount: weights must have the same size as input or0-length, but got input shape: ${r.shape}, weights shape: ${a.shape}.`);let s={x:r,weights:a},i={size:n};return $.runKernel(Nh,s,i)}var tx=D({bincount_:nN});function rN(e,t){let n=E(e,"broadcastTo","x"),r=n.shape;if(t.some(l=>!(l>0)||l%1!=0))throw new Error(`broadcastTo(): Invalid broadcast shape [${t}].`);if(t.lengthn.rank){let l=n.shape.slice();for(;l.length=0;l--)if(a[l]===t[l])s[l]=1;else if(n.shape[l]!==1)throw new Error(`broadcastTo(): [${r}] cannot be broadcast to [${t}].`);if(s.map((l,c)=>l>1?c:-1).filter(l=>l>=0).length===0)return Er(n);let i={x:n},o={reps:s};return $.runKernel(ka,i,o)}var Vu=D({broadcastTo_:rN});function aN(e){let t={x:E(e,"x","ceil")};return $.runKernel(hs,t)}var Zf=D({ceil_:aN});function sN(e,t,n){let r=E(e,"x","clipByValue");M(t<=n,()=>`Error in clip: min (${t}) must be less than or equal to max (${n}).`);let a={x:r},s={clipValueMin:t,clipValueMax:n};return $.runKernel(va,a,s)}var wn=D({clipByValue_:sN});function iN(e){return rt(e,0)}var nx=D({concat1d_:iN});function oN(e,t){return rt(e,t)}var ll=D({concat2d_:oN});function lN(e,t){return rt(e,t)}var rx=D({concat3d_:lN});function uN(e,t){return rt(e,t)}var ax=D({concat4d_:uN});function cN(e,t,n,r,a="NHWC",s=[1,1],i){let o=E(e,"x","conv2d"),l=E(t,"filter","conv2d"),c=o,u=!1;o.rank===3&&(u=!0,c=H(o,[1,o.shape[0],o.shape[1],o.shape[2]])),M(c.rank===4,()=>`Error in conv2d: input must be rank 4, but got rank ${c.rank}.`),M(l.rank===4,()=>`Error in conv2d: filter must be rank 4, but got rank ${l.rank}.`),i!=null&&M(Vt(r),()=>`Error in conv2d: pad must be an integer when using, dimRoundingMode ${i} but got pad ${r}.`);let h=a==="NHWC"?c.shape[3]:c.shape[1];M(h===l.shape[2],()=>`Error in conv2d: depth of input (${h}) must match input depth for filter ${l.shape[2]}.`),M(Mr(n,s),()=>`Error in conv2D: Either strides or dilations must be 1. Got strides ${n} and dilations '${s}'`);let d={x:c,filter:l},p={strides:n,pad:r,dataFormat:a,dilations:s,dimRoundingMode:i},f=$.runKernel(ds,d,p);return u?H(f,[f.shape[1],f.shape[2],f.shape[3]]):f}var ea=D({conv2d_:cN});function hN(e,t,n,r,a="NWC",s=1,i){let o=E(e,"x","conv1d"),l=E(t,"filter","conv1d"),c=o,u=!1;o.rank===2&&(u=!0,c=H(o,[1,o.shape[0],o.shape[1]])),M(c.rank===3,()=>`Error in conv1d: input must be rank 3, but got rank ${c.rank}.`),M(l.rank===3,()=>`Error in conv1d: filter must be rank 3, but got rank ${l.rank}.`),i!=null&&M(Vt(r),()=>`Error in conv1d: pad must be an integer when using, dimRoundingMode ${i} but got pad ${r}.`),M(c.shape[2]===l.shape[1],()=>`Error in conv1d: depth of input (${c.shape[2]}) must match input depth for filter ${l.shape[1]}.`),M(Mr(n,s),()=>`Error in conv1D: Either stride or dilation must be 1. Got stride ${n} and dilation '${s}'`),M(a==="NWC",()=>`Error in conv1d: got dataFormat of ${a} but only NWC is currently supported.`);let h=H(l,[1,l.shape[0],l.shape[1],l.shape[2]]),d=H(c,[c.shape[0],1,c.shape[1],c.shape[2]]),p=ea(d,h,[1,n],r,"NHWC",[1,s],i);return u?H(p,[p.shape[2],p.shape[3]]):H(p,[p.shape[0],p.shape[2],p.shape[3]])}var pd=D({conv1d_:hN});function dN(e,t,n,r,a,s="NHWC",i){M(e.length===t.rank,()=>`Length of inShape (${e.length}) and rank of dy (${t.rank}) must match`);let o=e,l=t,c=!1;t.rank===3&&(c=!0,l=H(t,[1,t.shape[0],t.shape[1],t.shape[2]]),o=[1,e[0],e[1],e[2]]),M(o.length===4,()=>`Error in conv2dDerInput: inShape must be length 4, but got length ${o.length}.`),M(l.rank===4,()=>`Error in conv2dDerInput: dy must be rank 4, but got rank ${l.rank}`),M(n.rank===4,()=>`Error in conv2dDerInput: filter must be rank 4, but got rank ${n.rank}`);let u=s==="NHWC"?o[3]:o[1],h=s==="NHWC"?l.shape[3]:l.shape[1];M(u===n.shape[2],()=>`Error in conv2dDerInput: depth of input (${u}) must match input depth for filter ${n.shape[2]}.`),M(h===n.shape[3],()=>`Error in conv2dDerInput: depth of output (${h}) must match output depth for filter ${n.shape[3]}.`),i!=null&&M(Vt(a),()=>`Error in conv2dDerInput: pad must be an integer when using, dimRoundingMode ${i} but got pad ${a}.`);let d={dy:l,filter:n},p={strides:r,pad:a,dataFormat:s,dimRoundingMode:i,inputShape:o},f=$.runKernel(ps,d,p);return c?H(f,[f.shape[1],f.shape[2],f.shape[3]]):f}var Yf=D({conv2DBackpropInput_:dN});function pN(e,t,n,r,a,s){let i=E(e,"x","conv2dTranspose"),o=E(t,"filter","conv2dTranspose");return Yf(n,i,o,r,a,"NHWC",s)}var fd=D({conv2dTranspose_:pN});function fN(e,t,n,r,a="NDHWC",s=[1,1,1]){let i=E(e,"x","conv3d"),o=E(t,"filter","conv3d"),l=i,c=!1;i.rank===4&&(c=!0,l=H(i,[1,i.shape[0],i.shape[1],i.shape[2],i.shape[3]])),M(l.rank===5,()=>`Error in conv3d: input must be rank 5, but got rank ${l.rank}.`),M(o.rank===5,()=>`Error in conv3d: filter must be rank 5, but got rank ${o.rank}.`),M(l.shape[4]===o.shape[3],()=>`Error in conv3d: depth of input (${l.shape[4]}) must match input depth for filter ${o.shape[3]}.`),M(Mr(n,s),()=>`Error in conv3D: Either strides or dilations must be 1. Got strides ${n} and dilations '${s}'`),M(a==="NDHWC",()=>`Error in conv3d: got dataFormat of ${a} but only NDHWC is currently supported.`);let u={x:l,filter:o},h={strides:n,pad:r,dataFormat:a,dilations:s},d=$.runKernel(pu,u,h);return c?H(d,[d.shape[1],d.shape[2],d.shape[3],d.shape[4]]):d}var Jf=D({conv3d_:fN});function mN(e,t,n,r,a){M(e.length===t.rank,()=>`Length of inShape (${e.length}) and rank of dy (${t.rank}) must match`);let s=e,i=t,o=!1;t.rank===4&&(o=!0,i=H(t,[1,t.shape[0],t.shape[1],t.shape[2],t.shape[3]]),s=[1,e[0],e[1],e[2],e[3]]);let l=s[4],c=i.shape[4];M(s.length===5,()=>`Error in conv3dDerInput: inShape must be length 5, but got length ${s.length}.`),M(i.rank===5,()=>`Error in conv3dDerInput: dy must be rank 5, but got rank ${i.rank}`),M(n.rank===5,()=>`Error in conv3dDerInput: filter must be rank 5, but got rank ${n.rank}`),M(l===n.shape[3],()=>`Error in conv3dDerInput: depth of input (${l}) must match input depth for filter ${n.shape[3]}.`),M(c===n.shape[4],()=>`Error in conv3dDerInput: depth of output (${c}) must match output depth for filter ${n.shape[4]}.`);let u={dy:i,filter:n},h={pad:a,strides:r,inputShape:s},d=$.runKernel(Eh,u,h);return o?H(d,[d.shape[1],d.shape[2],d.shape[3],d.shape[4]]):d}var sx=D({conv3DBackpropInput_:mN});function AN(e,t,n,r,a){let s=E(e,"x","conv3dTranspose"),i=E(t,"filter","conv3dTranspose");return sx(n,s,i,r,a)}var yN=D({conv3dTranspose_:AN});function gN(e){let t={x:E(e,"x","cos")};return $.runKernel(fs,t)}var Uu=D({cos_:gN});function xN(e){let t={x:E(e,"x","cosh")};return $.runKernel(so,t)}var md=D({cosh_:xN});function wN(e,t=0,n=!1,r=!1){let a={x:E(e,"x","cumsum")},s={axis:t,exclusive:n,reverse:r};return $.runKernel(ms,a,s)}var Ad=D({cumsum_:wN});function bN(e,t,n,r=!1){let a=E(e,"x","denseBincount"),s=E(t,"weights","denseBincount");M(a.dtype==="int32",()=>`Error in denseBincount: input dtype must be int32, but got ${a.dtype}`),M(a.rank<=2,()=>`Error in denseBincount: input must be at most rank 2, but got rank ${a.rank}.`),M(n>=0,()=>`size must be non-negative, but got ${n}.`),M(s.size===a.size||s.size===0,()=>`Error in denseBincount: weights must have the same shape as x or 0-length, but got x shape: ${a.shape}, weights shape: ${s.shape}.`);let i={x:a,weights:s},o={size:n,binaryOutput:r};return $.runKernel(Rh,i,o)}var ix=D({denseBincount_:bN});function _N(e,t,n="NHWC"){let r=E(e,"x","depthToSpace"),a=n==="NHWC"?r.shape[1]:r.shape[2],s=n==="NHWC"?r.shape[2]:r.shape[3],i=n==="NHWC"?r.shape[3]:r.shape[1];M(a*t>=0,()=>`Negative dimension size caused by overflow when multiplying - ${a} and ${t} for depthToSpace with input shape - ${r.shape}`),M(s*t>=0,()=>`Negative dimension size caused by overflow when multiplying - ${s} and ${t} for depthToSpace with input shape - ${r.shape}`),M(i%(t*t)==0,()=>`Dimension size must be evenly divisible by ${t*t} but is ${i} for depthToSpace with input shape ${r.shape}`);let o={x:r},l={blockSize:t,dataFormat:n};return $.runKernel(oo,o,l)}var Qf=D({depthToSpace_:_N});function vN(e,t,n,r,a="NHWC",s=[1,1],i){let o=E(e,"x","depthwiseConv2d"),l=E(t,"filter","depthwiseConv2d"),c=o,u=!1;o.rank===3&&(u=!0,c=H(o,[1,o.shape[0],o.shape[1],o.shape[2]])),M(c.rank===4,()=>`Error in depthwiseConv2d: input must be rank 4, but got rank ${c.rank}.`),M(l.rank===4,()=>`Error in depthwiseConv2d: filter must be rank 4, but got rank ${l.rank}.`),M(c.shape[3]===l.shape[2],()=>`Error in depthwiseConv2d: number of input channels (${c.shape[3]}) must match the inChannels dimension in filter ${l.shape[2]}.`),i!=null&&M(Vt(r),()=>`Error in depthwiseConv2d: pad must be an integer when using, dimRoundingMode ${i} but got pad ${r}.`);let h={x:c,filter:l},d={strides:n,pad:r,dataFormat:a,dilations:s,dimRoundingMode:i},p=$.runKernel(As,h,d);return u?H(p,[p.shape[1],p.shape[2],p.shape[3]]):p}var ul=D({depthwiseConv2d_:vN});function kN(e){let t={x:E(e,"x","diag")};return $.runKernel($h,t)}var IN=D({diag_:kN});function NN(e,t,n,r,a=[1,1],s="NHWC"){let i=E(e,"x","dilation2d"),o=E(t,"filter","dilation2d");M(i.rank===3||i.rank===4,()=>`Error in dilation2d: input must be rank 3 or 4, but got rank ${i.rank}.`),M(o.rank===3,()=>`Error in dilation2d: filter must be rank 3, but got rank ${o.rank}.`),M(s==="NHWC",()=>`Error in dilation2d: Only NHWC is currently supported, but got dataFormat of ${s}`);let l=i,c=!1;i.rank===3&&(l=H(i,[1,i.shape[0],i.shape[1],i.shape[2]]),c=!0);let u={x:l,filter:o},h={strides:n,pad:r,dilations:a},d=$.runKernel(fu,u,h);return c?H(d,[d.shape[1],d.shape[2],d.shape[3]]):d}var em=D({dilation2d_:NN});function SN(e,t){let n=e.length,r=[];for(let a=0;a1&&i===1&&r.unshift(s)}return r}function Ot(e,t){let n=[];for(let r=0;r1)&&n.unshift(s)}return n}function ft(e,t){let n=[],r=Math.max(e.length,t.length);for(let a=0;a"The first dimension of `a` must match the size of `condition`."),s.rank!==1&&tn(s.shape,l.shape,"Error in where: ");let c={condition:s,t:o,e:l};return $.runKernel(zo,c)}var bn=D({where_:CN});function EN(e){let t={x:E(e,"x","zerosLike")};return $.runKernel(Xo,t)}var je=D({zerosLike_:EN});function RN(e,t){let n=E(e,"a","div"),r=E(t,"b","div");[n,r]=bt(n,r);let a=ge(n,r),s=je(a),i=Ma(r,s);return bn(i,s,a)}var tm=D({divNoNan_:RN});function MN(e,t){let n=E(e,"t1","dot"),r=E(t,"t2","dot");M((n.rank===1||n.rank===2)&&(r.rank===1||r.rank===2),()=>`Error in dot: inputs must all be rank 1 or 2, but got ranks ${n.rank} and ${r.rank}.`);let a=n.rank===1?n.size:n.shape[1],s=r.rank===1?r.size:r.shape[0];if(M(a===s,()=>`Error in dot: inner dimensions of inputs must match, but got ${a} and ${s}.`),n.rank===1&&r.rank===1){let i=H(n,[1,-1]),o=H(r,[-1,1]),l=Ge(i,o);return H(l,[])}else if(n.rank===1&&r.rank===2){let i=H(n,[1,-1]),o=H(r,[r.shape[0],r.shape[1]]),l=Ge(i,o);return H(l,[l.size])}else if(n.rank===2&&r.rank===1){let i=H(r,[-1,1]),o=Ge(n,i);return H(o,[o.size])}else{let i=H(r,[r.shape[0],r.shape[1]]);return Ge(n,i)}}var ox=D({dot_:MN});function FN(e){let t={x:E(e,"x","elu")};return $.runKernel(lo,t)}var cl=D({elu_:FN});function $N(e){let t=E(e,"x","erf");M(t.dtype==="int32"||t.dtype==="float32",()=>"Input dtype must be `int32` or `float32`."),t.dtype==="int32"&&(t=me(t,"float32"));let n={x:t};return $.runKernel(uo,n)}var nm=D({erf_:$N});function DN(e){let t={x:E(e,"x","exp")};return $.runKernel(gs,t)}var Hn=D({exp_:DN});function ON(e,t=0){let n=E(e,"x","expandDims","string_or_numeric");M(t<=n.rank,()=>"Axis must be <= rank of the tensor");let r={input:n},a={dim:t};return $.runKernel(ho,r,a)}var on=D({expandDims_:ON});function zN(e){let t={x:E(e,"x","expm1")};return $.runKernel(po,t)}var rm=D({expm1_:zN});function PN(e,t){let n=E(e,"x","tile","string_or_numeric");M(n.rank===t.length,()=>`Error in transpose: rank of input ${n.rank} must match length of reps ${t}.`);let r={x:n},a={reps:t};return $.runKernel(ka,r,a)}var Fa=D({tile_:PN});function LN(e,t,n,r="float32"){t==null&&(t=e);let a=Le([e,t],r),s=e<=t?e:t;for(let o=0;o`Error in localResponseNormalization: x must be rank 3 or 4 but got - rank ${s.rank}.`),M(Vt(t),()=>`Error in localResponseNormalization: depthRadius must be an integer but got depthRadius ${t}.`);let i=s,o=!1;s.rank===3&&(o=!0,i=H(s,[1,s.shape[0],s.shape[1],s.shape[2]]));let l={x:i},c={depthRadius:t,bias:n,alpha:r,beta:a},u=$.runKernel(gu,l,c);return o?H(u,[u.shape[1],u.shape[2],u.shape[3]]):u}var sm=D({localResponseNormalization_:YN});function JN(e){let t={x:E(e,"x","log")};return $.runKernel(Is,t)}var En=D({log_:JN});function QN(e){let t={x:E(e,"x","log1p")};return $.runKernel(vo,t)}var xd=D({log1p_:QN});function eS(e){return M(ba(e),()=>"The f passed in grad(f) must be a function"),(t,n)=>{let r=E(t,"x","tf.grad","string_or_numeric"),a=n!=null?E(n,"dy","tf.grad"):null;return $.tidy(()=>{let{value:s,grads:i}=$.gradients(()=>e(r),[r],a);return a!=null&&tn(s.shape,a.shape,"The shape of dy passed in grad(f)(x, dy) must match the shape returned by f(x)"),wd(i),i[0]})}}function tS(e){return M(ba(e),()=>"The f passed in grads(f) must be a function"),(t,n)=>{M(Array.isArray(t),()=>"The args passed in grads(f)(args) must be an array of `Tensor`s or `TensorLike`s");let r=Du(t,"args","tf.grads","string_or_numeric"),a=n!=null?E(n,"dy","tf.grads"):null;return $.tidy(()=>{let{value:s,grads:i}=$.gradients(()=>e(...r),r,a);return a!=null&&tn(s.shape,a.shape,"The shape of dy passed in grads(f)([x1,...], dy) must match the shape returned by f([x1,...])"),wd(i),i})}}function nS(e){return M(ba(e),()=>"The f passed in valueAndGrad(f) must be a function"),(t,n)=>{M(t instanceof Ue,()=>"The x passed in valueAndGrad(f)(x) must be a tensor"),M(n==null||n instanceof Ue,()=>"The dy passed in valueAndGrad(f)(x, dy) must be a tensor");let{grads:r,value:a}=$.gradients(()=>e(t),[t],n);return wd(r),{grad:r[0],value:a}}}function rS(e){return M(ba(e),()=>"The f passed in valueAndGrads(f) must be a function"),(t,n)=>{M(Array.isArray(t)&&t.every(a=>a instanceof Ue),()=>"The args passed in valueAndGrads(f)(args) must be array of tensors"),M(n==null||n instanceof Ue,()=>"The dy passed in valueAndGrads(f)(args, dy) must be a tensor");let r=$.gradients(()=>e(...t),t,n);return n!=null&&tn(r.value.shape,n.shape,"The shape of dy passed in valueAndGrads(f)([x1,...], dy) must match the shape returned by f([x1,...])"),wd(r.grads),r}}function dx(e,t){M(ba(e),()=>"The f passed in variableGrads(f) must be a function"),M(t==null||Array.isArray(t)&&t.every(c=>c instanceof Mu),()=>"The varList passed in variableGrads(f, varList) must be an array of variables");let n=t!=null;if(!n){t=[];for(let c in $.registeredVariables)t.push($.registeredVariables[c])}let r=n?t.filter(c=>!c.trainable):null,a=t.length;t=t.filter(c=>c.trainable),M(t.length>0,()=>`variableGrads() expects at least one of the input variables to be trainable, but none of the ${a} variables is trainable.`);let s=!0,{value:i,grads:o}=$.gradients(e,t,null,s);M(o.some(c=>c!=null),()=>"Cannot find a connection between any variable and the result of the loss function y=f(x). Please make sure the operations that use variables are inside the function f passed to minimize()."),M(i.rank===0,()=>`The f passed in variableGrads(f) must return a scalar, but it returned a rank-${i.rank} tensor`);let l={};return t.forEach((c,u)=>{o[u]!=null&&(l[c.name]=o[u])}),r!=null&&r.forEach(c=>l[c.name]=null),{value:i,grads:l}}function Fr(e){return $.customGrad(e)}function wd(e){if(e.filter(t=>t==null).length>0)throw new Error(`Cannot compute gradient of y=f(x) with respect to x. Make sure that - the f you passed encloses all operations that lead from x to y.`)}function aS(e){let t={x:E(e,"x","neg")};return $.runKernel(No,t)}var _t=D({neg_:aS});function sS(e){let t={x:E(e,"x","softplus")};return $.runKernel(Vo,t)}var dl=D({softplus_:sS});function iS(e){let t=E(e,"x","logSigmoid");return Fr(n=>({value:_t(dl(_t(n))),gradFunc:r=>P(r,Cn(_t(n)))}))(t)}var px=D({logSigmoid_:iS});function oS(e,t=null,n=!1){let r={x:E(e,"x","max")},a={reductionIndices:t,keepDims:n};return $.runKernel(Ns,r,a)}var Gn=D({max_:oS});function lS(e,t){let n=E(e,"a","sub"),r=E(t,"b","sub");[n,r]=bt(n,r);let a={a:n,b:r};return $.runKernel(Ks,a)}var ye=D({sub_:lS});function uS(e,t=null,n=!1){let r=E(e,"x","sum");r.dtype==="bool"&&(r=me(r,"int32"));let a={x:r},s={axis:t,keepDims:n};return $.runKernel(Gs,a,s)}var Ce=D({sum_:uS});function cS(e,t=-1){let n=E(e,"logits","logSoftmax");if(t===-1&&(t=n.rank-1),t!==n.rank-1)throw Error(`Log Softmax along a non-last dimension is not yet supported. Logits was rank ${n.rank} and axis was ${t}`);return Fr((r,a)=>{let s=!0,i=Gn(r,t,!0),o=ye(r,i),l=ye(me(o,"float32"),En(Ce(Hn(o),t,s)));return a([l]),{value:l,gradFunc:(c,u)=>{let[h]=u,d=!0,p=Hn(h);return ye(c,P(Ce(c,t,d),p))}}})(n)}var bd=D({logSoftmax_:cS});function im(e,t){for(let n=0;ne[s]);return[n,a]}function ci(e,t){let n=t.map(r=>1);return fx(e,n,t)}function hS(e,t,n){M(im(t,n),()=>`${e} supports only inner-most axes for now. Got axes ${t} and rank-${n} input.`)}function Ax(e,t){if(im(e,t))return null;let n=[];for(let r=0;rn.push(r)),n}function om(e){return e.map((t,n)=>[n,t]).sort((t,n)=>t[1]-n[1]).map(t=>t[0])}function dS(e,t){let n=[];for(let r=t-e;r`Error in maxPool: input must be rank 4 but got rank ${o.rank}.`),M(Mr(n,i),()=>`Error in maxPool: Either strides or dilations must be 1. Got strides ${n} and dilations '${i}'`),a!=null&&M(Vt(r),()=>`Error in maxPool: pad must be an integer when using, dimRoundingMode ${a} but got pad ${r}.`);let c={x:o},u={filterSize:t,strides:n,pad:r,dimRoundingMode:a},h=$.runKernel(Ts,c,u);return l?H(h,[h.shape[1],h.shape[2],h.shape[3]]):h}var qu=D({maxPool_:gS});function xS(e,t=[1,1,1],n,r,a,s="NDHWC"){let i=E(e,"x","maxPool3d"),o=i,l=!1;i.rank===4&&(l=!0,o=H(i,[1,i.shape[0],i.shape[1],i.shape[2],i.shape[3]])),M(o.rank===5,()=>`Error in maxPool3d: x must be rank 5 but got rank ${o.rank}.`),M(s==="NDHWC",()=>`Error in maxPool3d: Only NDHWC is currently supported, but got dataFormat of ${s}`),a!=null&&M(Vt(r),()=>`Error in maxPool3d: pad must be an integer when using, dimRoundingMode ${a} but got pad ${r}.`);let c={x:o},u={filterSize:t,strides:n,pad:r,dimRoundingMode:a,dataFormat:s},h=$.runKernel(xu,c,u);return l?H(h,[h.shape[1],h.shape[2],h.shape[3],h.shape[4]]):h}var um=D({maxPool3d_:xS});function wS(e,t,n,r,a=!1){let s={x:E(e,"x","maxPoolWithArgmax")},i={filterSize:t,strides:n,pad:r,includeBatchInIndex:a},o=$.runKernel(Hh,s,i);return{result:o[0],indexes:o[1]}}var gx=D({maxPoolWithArgmax_:wS});function bS(e,t){let n=E(e,"a","maximum"),r=E(t,"b","maximum");[n,r]=bt(n,r),n.dtype==="bool"&&(n=me(n,"int32"),r=me(r,"int32")),ft(n.shape,r.shape);let a={a:n,b:r};return $.runKernel(Ss,a)}var $r=D({maximum_:bS});function _S(e,t=null,n=!1){let r={x:E(e,"x","mean")},a={axis:t,keepDims:n};return $.runKernel(Cs,r,a)}var vt=D({mean_:_S});function vS(e,t=null,n=!1){let r={x:E(e,"x","min")},a={axis:t,keepDims:n};return $.runKernel(Es,r,a)}var pl=D({min_:vS});function kS(e,t){let n=E(e,"a","minimum"),r=E(t,"b","minimum");[n,r]=bt(n,r),n.dtype==="bool"&&(n=me(n,"int32"),r=me(r,"int32")),ft(n.shape,r.shape);let a={a:n,b:r};return $.runKernel(Rs,a)}var fl=D({minimum_:kS});function IS(e,t,n){M(n==="reflect"||n==="symmetric",()=>`Invalid mode. Mode must be either reflect or symmetric. Got ${n}.`);let r=E(e,"x","mirrorPad");if(r.rank===0)throw new Error("mirrorPad(scalar) is not defined. Pass non-scalar to mirrorPad");M(t.length===r.rank,()=>`Padding doesn't match input. Must be ${r.rank}. Got ${t.length}.`);let a=n==="reflect"?1:0;for(let o=0;o"Invalid number of paddings. Must be length of 2 each."),M(t[o][0]>=0&&t[o][0]<=r.shape[o]-a&&t[o][1]>=0&&t[o][1]<=r.shape[o]-a,()=>`Padding in dimension ${o} cannot be greater than or equal to ${r.shape[o]-a} or less than 0 for input of shape ${r.shape}`);let s={paddings:t,mode:n},i={x:r};return $.runKernel(wu,i,s)}var cm=D({mirrorPad_:IS});function NS(e,t){let n=E(e,"a","mod"),r=E(t,"b","mod");[n,r]=bt(n,r);let a={a:n,b:r};return $.runKernel(Io,a)}var hm=D({mod_:NS});function SS(e){let t=E(e,"x","square"),n={};return $.runKernel("Square",{x:t},n)}var it=D({square_:SS});function TS(e,t=null,n=!1){e=E(e,"x","moments");let r=tr(t,e.shape),a=vt(e,r,n),s=a.shape;n||(s=ci(a.shape,r));let i=it(ye(me(e,"float32"),H(a,s))),o=vt(i,r,n);return{mean:a,variance:o}}var vd=D({moments_:TS});function CS(e,t,n,r){let a=E(t,"data","multiRNNCell"),s=Du(n,"c","multiRNNCell"),i=Du(r,"h","multiRNNCell"),o=a,l=[];for(let h=0;h2)throw new Error(`Rank of probabilities must be 1 or 2, but is ${i}`);n=n||Math.random();let o={logits:i===1?H(a,[1,-1]):a},l={numSamples:t,seed:n,normalized:r},c=$.runKernel(Gh,o,l);return i===1?H(c,[c.size]):c}var xx=D({multinomial_:RS});function MS(e,t){let n=E(e,"a","notEqual"),r=E(t,"b","notEqual");[n,r]=bt(n,r),ft(n.shape,r.shape);let a={a:n,b:r};return $.runKernel(So,a)}var hi=D({notEqual_:MS});function Ct(e,t="float32"){if(t==="complex64"){let r=Ct(e,"float32"),a=Ct(e,"float32");return Na(r,a)}let n=bh(Ft(e),t);return $.makeTensor(n,e,t)}function Dr(e,t="float32"){if(t==="complex64"){let r=Dr(e,"float32"),a=Ct(e,"float32");return Na(r,a)}let n=rf(Ft(e),t);return $.makeTensor(n,e,t)}function FS(e){let t={x:E(e,"x","onesLike")};return $.runKernel(Ro,t)}var Rn=D({onesLike_:FS});function $S(e,t){let n=E(e,"v1","outerProduct"),r=E(t,"v2","outerProduct");M(n.rank===1&&r.rank===1,()=>`Error in outerProduct: inputs must be rank 1, but got ranks ${n.rank} and ${r.rank}.`);let a=H(n,[-1,1]),s=H(r,[1,-1]);return Ge(a,s)}var DS=D({outerProduct_:$S});function OS(e,t,n=0){let r=E(e,"x","pad");if(r.rank===0)throw new Error("pad(scalar) is not defined. Pass non-scalar to pad");let a={paddings:t,constantValue:n},s={x:r};return $.runKernel($s,s,a)}var ta=D({pad_:OS});function zS(e,t,n=0){return M(t.length===2,()=>"Invalid number of paddings. Must be length of 2."),ta(e,[t],n)}var PS=D({pad1d_:zS});function LS(e,t,n=0){return M(t.length===2&&t[0].length===2&&t[1].length===2,()=>"Invalid number of paddings. Must be length of 2 each."),ta(e,t,n)}var WS=D({pad2d_:LS});function BS(e,t,n=0){return M(t.length===3&&t[0].length===2&&t[1].length===2&&t[2].length===2,()=>"Invalid number of paddings. Must be length of 2 each."),ta(e,t,n)}var VS=D({pad3d_:BS});function US(e,t,n=0){return M(t.length===4&&t[0].length===2&&t[1].length===2&&t[2].length===2&&t[3].length===2,()=>"Invalid number of paddings. Must be length of 2 each."),ta(e,t,n)}var jS=D({pad4d_:US});function HS(e,t,n){let r=E(e,"x","spaceToBatchND");M(r.rank>=1+t.length,()=>`input rank ${r.rank} should be > than [blockShape] ${t.length}`),M(n.length===t.length,()=>`paddings.shape[0] ${n.length} must be equal to [blockShape] ${t.length}`),M(r.shape.reduce((i,o,l)=>l>0&&l<=t.length?i&&(o+n[l-1][0]+n[l-1][1])%t[l-1]==0:i,!0),()=>`input spatial dimensions ${r.shape.slice(1)} with paddings ${n.toString()} must be divisible by blockShapes ${t.toString()}`);let a={x:r},s={blockShape:t,paddings:n};return $.runKernel(vu,a,s)}var Xu=D({spaceToBatchND_:HS});function XS(e,t,n,r,a,s){a==null&&(a=[1,1]),s==null&&(s=1),r===0&&(r="valid");let i=E(e,"x","maxPool"),o=i,l=!1;i.rank===3&&(l=!0,o=H(i,[1,i.shape[0],i.shape[1],i.shape[2]])),M(Mr(s,a),()=>`Error in pool: Either strides or dilations must be 1. Got strides ${s} and dilations '${a}'`);let c=Z5(o.shape,t,s,a,r),u=[c.dilationHeight,c.dilationWidth],h;r==="same"?h=qS([c.filterHeight,c.filterWidth],u):h=[[0,0],[0,0]];let d=u[0]===1&&u[1]===1,[p,f]=GS([c.inHeight,c.inWidth],u,h),m=d?r:"valid",A=d?o:Xu(o,u,p),y=(n==="avg"?()=>Wu(A,t,s,m):()=>qu(A,t,s,m))(),g=d?y:Bu(y,u,f);return l?H(g,[g.shape[1],g.shape[2],g.shape[3]]):g}function GS(e,t,n){let r=n.map(u=>u[0]),a=n.map(u=>u[1]),s=e.concat(r,a),i=t.map((u,h)=>(u-s[h]%u)%u),o=a.map((u,h)=>u+i[h]),l=t.map((u,h)=>[r[h],o[h]]),c=t.map((u,h)=>[0,i[h]]);return[l,c]}function qS(e,t){let n=e.map((s,i)=>s+(s-1)*(t[i]-1)).map(s=>s-1),r=n.map(s=>Math.floor(s/2)),a=n.map((s,i)=>s-r[i]);return n.map((s,i)=>[r[i],a[i]])}var wx=D({pool_:XS});function KS(e,t){let n=E(e,"base","pow"),r=E(t,"exp","pow");[n,r]=bt(n,r);let a={a:n,b:r};return $.runKernel(Ds,a)}var na=D({pow_:KS});function ZS(e,t){let n=E(e,"x","prelu"),r=E(t,"alpha","prelu"),a={x:n,alpha:r};return $.runKernel(Os,a)}var Ku=D({prelu_:ZS});function YS(e,t=null,n=!1){let r=E(e,"x","prod");r.dtype==="bool"&&(r=me(r,"int32"));let a={x:r},s={axis:t,keepDims:n};return $.runKernel(Fo,a,s)}var kd=D({prod_:YS});function JS(e,t,n){let r=Ft(e),a=null;if(n==null||n==="float32")a=new Float32Array(r);else if(n==="int32")a=new Int32Array(r);else if(n==="bool")a=new Uint8Array(r);else throw new Error(`Unknown data type ${n}`);for(let s=0;s=1||s===0);let i=Math.sqrt(-2*Math.log(s)/s);e=this.mean+this.stdDev*r*i,t=this.mean+this.stdDev*a*i,(!this.truncated||this.isValidTruncated(e))&&(n=!0)}return(!this.truncated||this.isValidTruncated(t))&&(this.nextVal=this.convertValue(t)),this.convertValue(e)}convertValue(e){return this.dtype==null||this.dtype==="float32"?e:Math.round(e)}isValidTruncated(e){return e<=this.upper&&e>=this.lower}},eT=class{constructor(e,t,n,r){this.alpha=e,this.beta=1/t,this.dtype=n;let a=r||Math.random();this.randu=dm.alea(a.toString()),this.randn=new pm(0,1,n,!1,this.randu()),e<1?this.d=e+2/3:this.d=e-1/3,this.c=1/Math.sqrt(9*this.d)}nextValue(){let e,t,n,r,a,s;for(;;){do r=this.randn.nextValue(),s=1+this.c*r;while(s<=0);if(s*=s*s,e=r*r,t=1-.331*e*e,n=.5*e+this.d*(1-s+Math.log(s)),a=this.randu(),athis.dtype==null||this.dtype==="float32",this.min=e,this.range=t-e,this.dtype=n,r==null&&(r=Math.random()),typeof r=="number"&&(r=r.toString()),!this.canReturnFloat()&&this.range<=1)throw new Error(`The difference between ${e} - ${t} <= 1 and dtype is not float`);this.random=dm.alea(r)}convertValue(e){return this.canReturnFloat()?e:Math.round(e)}nextValue(){return this.convertValue(this.min+this.range*this.random())}};function nT(e,t,n=1,r="float32",a){if(n==null&&(n=1),r==null&&(r="float32"),r!=="float32"&&r!=="int32")throw new Error(`Unsupported data type ${r}`);let s=new eT(t,n,r,a),i=Le(e,r);for(let o=0;o`Error in reverse1D: x must be rank 1 but got rank ${t.rank}.`),Mn(t,0)}var dT=D({reverse1d_:hT});function pT(e,t){let n=E(e,"x","reverse");return M(n.rank===2,()=>`Error in reverse2D: x must be rank 2 but got rank ${n.rank}.`),Mn(n,t)}var fT=D({reverse2d_:pT});function mT(e,t){let n=E(e,"x","reverse");return M(n.rank===3,()=>`Error in reverse3D: x must be rank 3 but got rank ${n.rank}.`),Mn(n,t)}var AT=D({reverse3d_:mT});function yT(e,t){let n=E(e,"x","reverse");return M(n.rank===4,()=>`Error in reverse4D: x must be rank 4 but got rank ${n.rank}.`),Mn(n,t)}var gT=D({reverse4d_:yT});function xT(e){let t={x:E(e,"x","round")};return $.runKernel(Bs,t)}var mm=D({round_:xT});function wT(e){let t={x:E(e,"x","rsqrt")};return $.runKernel(Vs,t)}var Sd=D({rsqrt_:wT});function _e(e,t){if((nn(e)&&t!=="string"||Array.isArray(e))&&t!=="complex64")throw new Error("Error creating a new Scalar: value must be a primitive (number|boolean|string)");if(t==="string"&&nn(e)&&!(e instanceof Uint8Array))throw new Error("When making a scalar from encoded string, the value must be `Uint8Array`.");return Sa(e,[],[],t)}function bT(e){let t={x:E(e,"x","selu")};return $.runKernel(Po,t)}var Td=D({selu_:bT});function _T(e,t,n,r,a,s=[1,1],i="NHWC"){let o=E(e,"x","separableConv2d"),l=E(t,"depthwiseFilter","separableConv2d"),c=E(n,"pointwiseFilter","separableConv2d"),u=o,h=!1;if(o.rank===3&&(h=!0,u=H(o,[1,o.shape[0],o.shape[1],o.shape[2]])),i==="NCHW")throw new Error("separableConv2d currently does not support dataFormat NCHW; only NHWC is supported");M(u.rank===4,()=>`Error in separableConv2d: input must be rank 4, but got rank ${u.rank}.`),M(l.rank===4,()=>`Error in separableConv2d: depthwise filter must be rank 4, but got rank ${l.rank}.`),M(c.rank===4,()=>`Error in separableConv2d: pointwise filter must be rank 4, but got rank ${l.rank}.`),M(c.shape[0]===1,()=>`Error in separableConv2d: the first dimension of pointwise filter must be 1, but got ${c.shape[0]}.`),M(c.shape[1]===1,()=>`Error in separableConv2d: the second dimension of pointwise filter must be 1, but got ${c.shape[1]}.`);let d=l.shape[2],p=l.shape[3];M(c.shape[2]===d*p,()=>`Error in separableConv2d: the third dimension of pointwise filter must be ${d*p}, but got ${c.shape[2]}.`);let f=ul(u,l,r,a,i,s),m=ea(f,c,1,"valid",i);return h?H(m,[m.shape[1],m.shape[2],m.shape[3]]):m}var Am=D({separableConv2d_:_T});async function vT(e,t){let n=E(e,"x","setdiff1d"),r=E(t,"y","setdiff1d");M(n.dtype===r.dtype,()=>`x and y should have the same dtype, but got x (${n.dtype}) and y (${r.dtype}).`),M(n.rank===1,()=>`x should be 1D tensor, but got x (${n.shape}).`),M(r.rank===1,()=>`y should be 1D tensor, but got y (${r.shape}).`);let a=await n.data(),s=await r.data(),i=new Set(s),o=0;for(let u=0;u`slice1d expects a rank-1 tensor, but got a rank-${r.rank} tensor`),Ee(r,[t],[n])}var Rd=D({slice1d_:ST});function TT(e,t,n){let r=E(e,"x","slice2d");return M(r.rank===2,()=>`slice2d expects a rank-2 tensor, but got a rank-${r.rank} tensor`),Ee(r,t,n)}var gm=D({slice2d_:TT});function CT(e,t,n){let r=E(e,"x","slice3d");return M(r.rank===3,()=>`slice3d expects a rank-3 tensor, but got a rank-${r.rank} tensor`),Ee(r,t,n)}var Md=D({slice3d_:CT});function ET(e,t,n){let r=E(e,"x","slice4d");return M(r.rank===4,()=>`slice4d expects a rank-4 tensor, but got a rank-${r.rank} tensor`),Ee(r,t,n)}var Yu=D({slice4d_:ET});function RT(e,t=-1){let n=E(e,"logits","softmax","float32");if(t===-1&&(t=n.rank-1),t!==n.rank-1)throw Error(`Softmax along a non-last dimension is not yet supported. Logits was rank ${n.rank} and dim was ${t}`);let r={logits:n},a={dim:t};return $.runKernel(qs,r,a)}var Ju=D({softmax_:RT});function MT(e){M(e.dtype==="complex64",()=>`The dtype for tf.spectral.fft() must be complex64 but got ${e.dtype}.`);let t={input:e};return $.runKernel(Ph,t)}var Qu=D({fft_:MT});function FT(e){M(e.dtype==="complex64",()=>`The dtype for tf.spectral.ifft() must be complex64 but got ${e.dtype}.`);let t={input:e};return $.runKernel(Lh,t)}var Al=D({ifft_:FT});function $T(e){let t=e.shape[e.shape.length-1],n=e.size/t,r;if(t<=2){let a=H(e,[n,t]);r=Al(a)}else{let a=[n,2*(t-1)],s=H(Zu(e),[n,t]),i=H(yd(e),[n,t]),o=Mn(Ee(s,[0,1],[n,t-2]),1),l=P(Mn(Ee(i,[0,1],[n,t-2]),1),_e(-1)),c=rt([s,o],1),u=rt([i,l],1),h=H(Na(c,u),[a[0],a[1]]);r=Al(h)}if(r=Zu(r),e.rank===3&&e.shape[0]!==0){let a=r,s=e.shape[0];r=H(r,[s,r.shape[0]/s,r.shape[1]]),a.dispose()}return r}var Fd=D({irfft_:$T});function DT(e,t,n=0){let r={x:E(e,"x","split")},a={numOrSizeSplits:t,axis:n};return $.runKernel(Uo,r,a)}var zt=D({split_:DT});function OT(e,t){M(e.dtype==="float32",()=>`The dtype for rfft() must be real value but got ${e.dtype}`);let n=e.shape[e.shape.length-1],r=e.size/n,a;if(t!=null&&t0),m=e.shape.map(A=>A);m[e.shape.length-1]=t,a=Ee(e,f,m),n=t}else if(t!=null&&t>n){let f=e.shape.map(m=>m);f[e.shape.length-1]=t-n,a=rt([e,Ct(f)],e.shape.length-1),n=t}else a=e;let s=je(a),i=H(Na(a,s),[r,n]),o=Qu(i),l=Math.floor(n/2)+1,c=Zu(o),u=yd(o),h=zt(c,[l,n-l],c.shape.length-1),d=zt(u,[l,n-l],u.shape.length-1),p=a.shape.slice();return p[a.shape.length-1]=l,H(Na(h[0],d[0]),p)}var ec=D({rfft_:OT});function zT(e){let t={x:E(e,"x","sqrt")};return $.runKernel(Hs,t)}var Yt=D({sqrt_:zT});function PT(e,t){let n=E(e,"a","squaredDifference"),r=E(t,"b","squaredDifference");[n,r]=bt(n,r),ft(n.shape,r.shape);let a={a:n,b:r},s={};return $.runKernel(Xs,a,s)}var $d=D({squaredDifference_:PT});function LT(e,t){let n=E(e,"x","squeeze");return H(n,Ug(n.shape,t).newShape)}var Da=D({squeeze_:LT});function WT(e,t=0){let n=Du(e,"tensors","stack","string_or_numeric");M(n.length>=1,()=>"Pass at least one tensor to tf.stack"),n.length>0&&M(t<=n[0].rank,()=>"Axis must be <= rank of the tensor");let r=n,a={axis:t};return $.runKernel(Mo,r,a)}var ln=D({stack_:WT});function BT(e,t=0){let n={x:E(e,"x","step")},r={alpha:t};return $.runKernel(Ia,n,r)}var yl=D({step_:BT});function VT(e,t,n,r,a=0,s=0,i=0,o=0,l=0){let c={x:E(e,"x","stridedSlice")},u={begin:t,end:n,strides:r,beginMask:a,endMask:s,ellipsisMask:i,newAxisMask:o,shrinkAxisMask:l};return $.runKernel(jo,c,u)}var xm=D({stridedSlice_:VT});function UT(e){let t={x:E(e,"x","tan")};return $.runKernel(Ho,t)}var wm=D({tan_:UT});function rn(e,t){as(e);let n=Cr(e,t);if(n.length!==1)throw new Error("tensor1d() requires values to be a flat/TypedArray");return Sa(e,null,n,t)}function _n(e,t,n){if(as(e),t!=null&&t.length!==2)throw new Error("tensor2d() requires shape to have two numbers");let r=Cr(e,n);if(r.length!==2&&r.length!==1)throw new Error("tensor2d() requires values to be number[][] or flat/TypedArray");if(r.length===1&&t==null)throw new Error("tensor2d() requires shape to be provided when `values` are a flat/TypedArray");return Sa(e,t,r,n)}function jT(e,t,n){if(as(e),t!=null&&t.length!==4)throw new Error("tensor4d() requires shape to have four numbers");let r=Cr(e,n);if(r.length!==4&&r.length!==1)throw new Error("tensor4d() requires values to be number[][][][] or flat/TypedArray");if(r.length===1&&t==null)throw new Error("tensor4d() requires shape to be provided when `values` are a flat array");return Sa(e,t,r,n)}function HT(e,t,n){if(as(e),t!=null&&t.length!==5)throw new Error("tensor5d() requires shape to have five numbers");let r=Cr(e,n);if(r.length!==5&&r.length!==1)throw new Error("tensor5d() requires values to be number[][][][][] or flat/TypedArray");if(r.length===1&&t==null)throw new Error("tensor5d() requires shape to be provided when `values` are a flat array");return Sa(e,t,r,n)}function GT(e,t,n){if(as(e),t!=null&&t.length!==6)throw new Error("tensor6d() requires shape to have six numbers");let r=Cr(e,n);if(r.length!==6&&r.length!==1)throw new Error("tensor6d() requires values to be number[][][][][][] or flat/TypedArray");if(r.length===1&&t==null)throw new Error("tensor6d() requires shape to be provided when `values` are a flat array");return t=t||r,Sa(e,t,r,n)}function qT(e,t=1,n=!0){let r=E(e,"x","topk");if(r.rank===0)throw new Error("topk() expects the input to be of rank 1 or higher");let a=r.shape[r.shape.length-1];if(t>a)throw new Error(`'k' passed to topk() must be <= the last dimension (${a}) but got ${t}`);let s={x:r},i={k:t,sorted:n},[o,l]=$.runKernel(Go,s,i);return{values:o,indices:l}}var bm=D({topk_:qT});function XT(e,t=0,n=1,r,a){if(r!=null&&r==="bool")throw new Error("Unsupported data type $ { dtype }");let s=new pm(t,n,r,!0,a),i=Le(e,r);for(let o=0;o0,()=>"The input tensor must be at least 1D");let r={x:n},a={axis:t},[s,i]=$.runKernel(Jh,r,a);return{values:s,indices:i}}var Od=D({unique_:KT});function ZT(e,t,n){let r=E(e,"x","unsortedSegmentSum"),a=E(t,"segmentIds","unsortedSegmentSum","int32");M(Vt(n),()=>"numSegments must be of dtype int");let s={x:r,segmentIds:a},i={numSegments:n};return $.runKernel(Iu,s,i)}var _m=D({unsortedSegmentSum_:ZT});function YT(e,t=0){let n=E(e,"x","unstack","string_or_numeric");M(t>=-n.shape.length&&t`Axis = ${t} is not in [-${n.shape.length}, ${n.shape.length})`);let r={value:n},a={axis:t};return $.runKernel(qo,r,a)}var sr=D({unstack_:YT});function vx(e,t=!0,n,r){return $.makeVariable(e,t,n,r)}function kx(e,t){let n=[];for(let s=0;s0,()=>"mask cannot be scalar"),tn(o.slice(s,s+i),a.shape,"mask's shape must match the first K dimensions of tensor's shape,");let l=1;for(let m=s;m"Shape mismatch in v and x");let l=_e(1),c=ye(l,o),u=P(ye(i,s),c);if(a){M(r!=null,()=>"When using zeroDebias: true, step is required.");let h=E(r,"step","movingAverage");u=ge(u,ye(l,na(o,h)))}return se(s,u)}var rC=D({movingAverage_:nC});function aC(e,t,n){let r=E(e,"indices","scatterND","int32"),a=E(t,"updates","scatterND");Ff(a,r,n);let s={indices:r,updates:a},i={shape:n};return $.runKernel(Oo,s,i)}var Nx=D({scatterND_:aC});function sC(e,t,n,r){if(e.dtype!=="int32")throw new Error(`tf.sparseToDense() expects the indices to be int32 type, but the dtype was ${e.dtype}.`);if(e.rank>2)throw new Error(`sparseIndices should be a scalar, vector, or matrix, but got shape ${e.shape}.`);let a=e.rank>0?e.shape[0]:1,s=e.rank>1?e.shape[1]:1;if(n.length!==s)throw new Error(`outputShape has incorrect number of elements:, ${n.length}, should be: ${s}.`);let i=t.size;if(!(t.rank===0||t.rank===1&&i===a))throw new Error(`sparseValues has incorrect shape ${t.shape}, should be [] or [${a}]`);if(t.dtype!==r.dtype)throw new Error("sparseValues.dtype must match defaultValues.dtype")}function iC(e,t,n,r=0){let a=E(e,"sparseIndices","sparseToDense","int32"),s=E(t,"sparseValues","sparseToDense"),i=E(r,"defaultValue","sparseToDense",s.dtype);sC(a,s,n,i);let o={sparseIndices:a,sparseValues:s,defaultValue:i},l={outputShape:n};return $.runKernel(Zh,o,l)}var km=D({sparseToDense_:iC});function oC(e,t){let n=E(t,"indices","gatherND","int32"),r={params:E(e,"x","gatherND"),indices:n};return $.runKernel(Ao,r)}var Sx=D({gatherND_:oC});function lC(e,t){if(t==null)return e.shape.slice();if(Jr(e.shape,t))return t;if(e.shape.length===t.length){let n=[];for(let r=0;r`x has to be a floating point tensor since it's going to be scaled, but got a ${a.dtype} tensor instead.`),M(t>=0&&t<1,()=>`rate must be a float in the range [0, 1), but got ${t}.`),t===0)return e instanceof Ue?a.clone():a;let s=lC(a,n),i=1-t,o=ge(hl(se(ml(s,0,1,"float32",r),i)),i);return P(a,o)}var Tx=D({dropout_:uC});function Cx(e){return Math.floor(Math.pow(2,Math.ceil(Math.log(e)/Math.log(2))))}function Im(e,t,n){let r=1-e%2,a=new Float32Array(e);for(let s=0;s1,()=>`inTopK() expects the predictions to be of rank 2 or higher, but got ${r.rank}`),M(r.rank-1===a.rank,()=>`predictions rank should be 1 larger than targets rank, but got predictions rank ${r.rank} and targets rank ${a.rank}`),tn(r.shape.slice(0,r.shape.length-1),a.shape,"predictions's shape should be align with the targets' shape, except the last dimension.");let s=r.shape[r.shape.length-1];M(n>0&&n<=s,()=>`'k' passed to inTopK() must be > 0 && <= the predictions last dimension (${s}), but got ${n}`);let i=await r.data(),o=await a.data(),[l,c]=[i.length/s,s],u=jg("bool",l);for(let h=0;hA.value-m.value),u[h]=0;for(let m=0;mdC,depthwiseConv2d:()=>pC,matMul:()=>fC});function mC(e,t,n,r,a,s="NHWC",i){let o=e;e.rank===3&&(o=H(e,[1,e.shape[0],e.shape[1],e.shape[2]]));let l=t;l.rank===3&&(l=H(t,[1,t.shape[0],t.shape[1],t.shape[2]])),M(o.rank===4,()=>`Error in conv2dDerFilter: input must be rank 4, but got shape ${o.shape}.`),M(l.rank===4,()=>`Error in conv2dDerFilter: dy must be rank 4, but got shape ${l.shape}.`),M(n.length===4,()=>`Error in conv2dDerFilter: filterShape must be length 4, but got ${n}.`);let c=s==="NHWC"?o.shape[3]:o.shape[1],u=s==="NHWC"?l.shape[3]:l.shape[1];M(c===n[2],()=>`Error in conv2dDerFilter: depth of input ${c}) must match input depth in filter (${n[2]}.`),M(u===n[3],()=>`Error in conv2dDerFilter: depth of dy (${u}) must match output depth for filter (${n[3]}).`),i!=null&&M(Vt(a),()=>`Error in conv2dDerFilter: pad must be an integer when using, dimRoundingMode ${i} but got pad ${a}.`);let h={x:o,dy:l},d={strides:r,pad:a,dataFormat:s,dimRoundingMode:i,filterShape:n};return $.runKernel(Th,h,d)}var Nm=D({conv2DBackpropFilter_:mC});function Pd(e,t,n){if(n==null||n==="linear")return e;if(n==="relu")return P(e,yl(t));throw new Error(`Cannot compute gradient for fused activation ${n}.`)}function Ld(e,t){let n=t,r=Ot(e.shape,t.shape);return r.length>0&&(n=Ce(n,r)),H(n,e.shape)}function Wd(e,t,n,r){if(t==="linear")return e;if(t==="relu")return Or(e);if(t==="elu")return cl(e);if(t==="relu6")return Nd(e);if(t==="prelu")return Ku(e,n);if(t==="leakyrelu")return Hu(e,r);throw new Error(`Unknown fused activation ${t}.`)}var Bd=(e,t)=>!(e>0)||t==="linear";function AC({x:e,filter:t,strides:n,pad:r,dataFormat:a="NHWC",dilations:s=[1,1],dimRoundingMode:i,bias:o,activation:l="linear",preluActivationWeights:c,leakyreluAlpha:u}){if(l=l||"linear",Bd($.state.gradientDepth,l)===!1){let _=ea(e,t,n,r,a,s,i);return o!=null&&(_=se(_,o)),Wd(_,l,c,u)}let h=E(e,"x","conv2d"),d=E(t,"filter","conv2d"),p=h,f=!1;h.rank===3&&(f=!0,p=H(h,[1,h.shape[0],h.shape[1],h.shape[2]])),M(p.rank===4,()=>`Error in fused conv2d: input must be rank 4, but got rank ${p.rank}.`),M(d.rank===4,()=>`Error in fused conv2d: filter must be rank 4, but got rank ${d.rank}.`),i!=null&&M(Vt(r),()=>`Error in fused conv2d: pad must be an integer when using, dimRoundingMode ${i} but got pad ${r}.`),M(p.shape[3]===d.shape[2],()=>`Error in conv2d: depth of input (${p.shape[3]}) must match input depth for filter ${d.shape[2]}.`),M(Mr(n,s),()=>`Error in conv2D: Either strides or dilations must be 1. Got strides ${n} and dilations '${s}'`),M(a==="NHWC",()=>`Error in conv2d: got dataFormat of ${a} but only NHWC is currently supported.`);let m=Lu(p.shape,d.shape,n,s,r,i),A;o!=null&&(A=E(o,"bias","fused conv2d"),[A]=bt(A,h),ft(m.outShape,A.shape));let y;c!=null&&(y=E(c,"prelu weights","fused conv2d"));let g=(_,x)=>{let[N,T,C,F]=x,O=Pd(_,C,l);M(Ra(s),()=>`Error in gradient of fused conv2D: dilation rates greater than 1 are not yet supported in gradients. Got dilations '${s}'`);let W=Yf(T.shape,O,N,n,r),V=Nm(T,O,N.shape,n,r),U=[W,V];if(F!=null){let j=Ld(F,O);U.push(j)}return U},w={x:p,filter:d,bias:A,preluActivationWeights:y},b={strides:n,pad:r,dataFormat:a,dilations:s,dimRoundingMode:i,activation:l,leakyreluAlpha:u};return o==null?Fr((_,x,N)=>{let T=$.runKernel(Qs,w,b);return N([x,_,T]),f&&(T=H(T,[T.shape[1],T.shape[2],T.shape[3]])),{value:T,gradFunc:g}})(p,d):Fr((_,x,N,T)=>{let C=$.runKernel(Qs,w,b);return T([x,_,C,N]),f&&(C=H(C,[C.shape[1],C.shape[2],C.shape[3]])),{value:C,gradFunc:g}})(p,d,A)}var dC=D({fusedConv2d_:AC});function yC(e,t,n,r,a,s=[1,1],i){let o=e;e.rank===3&&(o=H(e,[1,e.shape[0],e.shape[1],e.shape[2]]));let l=t;l.rank===3&&(l=H(t,[1,t.shape[0],t.shape[1],t.shape[2]]));let c={x:o,dy:l},u={strides:r,pad:a,dimRoundingMode:i,dilations:s,filterShape:n};return $.runKernel(Mh,c,u)}var Ex=D({depthwiseConv2dNativeBackpropFilter_:yC});function gC(e,t,n,r,a,s=[1,1],i){let o=t,l=!1;t.rank===3&&(l=!0,o=H(t,[1,t.shape[0],t.shape[1],t.shape[2]]));let c={dy:o,filter:n},u={strides:r,pad:a,dimRoundingMode:i,dilations:s,inputShape:e},h=$.runKernel(Fh,c,u);return l?H(h,[h.shape[1],h.shape[2],h.shape[3]]):h}var Rx=D({depthwiseConv2dNativeBackpropInput_:gC});function xC({x:e,filter:t,strides:n,pad:r,dataFormat:a="NHWC",dilations:s=[1,1],dimRoundingMode:i,bias:o,activation:l="linear",preluActivationWeights:c,leakyreluAlpha:u}){if(Bd($.state.gradientDepth,l)===!1){let _=ul(e,t,n,r,a,s,i);return o!=null&&(_=se(_,o)),Wd(_,l,c,u)}let h=E(e,"x","depthwiseConv2d"),d=E(t,"filter","depthwiseConv2d"),p=h,f=!1;h.rank===3&&(f=!0,p=H(h,[1,h.shape[0],h.shape[1],h.shape[2]])),M(p.rank===4,()=>`Error in fused depthwiseConv2d: input must be rank 4, but got rank ${p.rank}.`),M(d.rank===4,()=>`Error in fused depthwiseConv2d: filter must be rank 4, but got rank ${d.rank}.`),M(p.shape[3]===d.shape[2],()=>`Error in fused depthwiseConv2d: number of input channels (${p.shape[3]}) must match the inChannels dimension in filter ${d.shape[2]}.`),s==null&&(s=[1,1]),M(Mr(n,s),()=>`Error in fused depthwiseConv2d: Either strides or dilations must be 1. Got strides ${n} and dilations '${s}'`),i!=null&&M(Vt(r),()=>`Error in fused depthwiseConv2d: pad must be an integer when using dimRoundingMode ${i} but got pad ${r}.`);let m=Lu(p.shape,d.shape,n,s,r,i,!0),A;o!=null&&(A=E(o,"bias","fused conv2d"),[A]=bt(A,h),ft(m.outShape,A.shape));let y;c!=null&&(y=E(c,"prelu weights","fused depthwiseConv2d"));let g=(_,x)=>{M(Ra(s),()=>`Error in gradient of fused depthwiseConv2d: dilation rates greater than 1 are not yet supported. Got dilations '${s}'`);let[N,T,C,F]=x,O=Pd(_,C,l),W=Rx(T.shape,O,N,n,r,s,i),V=Ex(T,O,N.shape,n,r,s,i);if(F!=null){let U=Ld(A,O);return[W,V,U]}return[W,V]},w={x:p,filter:d,bias:A,preluActivationWeights:y},b={strides:n,pad:r,dataFormat:a,dilations:s,dimRoundingMode:i,activation:l,leakyreluAlpha:u};return o==null?Fr((_,x,N)=>{let T=$.runKernel(ei,w,b);return N([x,_,T]),f&&(T=H(T,[T.shape[1],T.shape[2],T.shape[3]])),{value:T,gradFunc:g}})(p,d):Fr((_,x,N,T)=>{let C=$.runKernel(ei,w,b);return T([x,_,C,N]),f&&(C=H(C,[C.shape[1],C.shape[2],C.shape[3]])),{value:C,gradFunc:g}})(p,d,A)}var pC=D({fusedDepthwiseConv2d_:xC});function wC({a:e,b:t,transposeA:n=!1,transposeB:r=!1,bias:a,activation:s="linear",preluActivationWeights:i,leakyreluAlpha:o}){if(Bd($.state.gradientDepth,s)===!1){let F=Ge(e,t,n,r);return a!=null&&(F=se(F,a)),Wd(F,s,i,o)}let l=E(e,"a","fused matMul"),c=E(t,"b","fused matMul");[l,c]=bt(l,c);let u=n?l.shape[l.rank-2]:l.shape[l.rank-1],h=r?c.shape[c.rank-1]:c.shape[c.rank-2],d=n?l.shape[l.rank-1]:l.shape[l.rank-2],p=r?c.shape[c.rank-2]:c.shape[c.rank-1],f=l.shape.slice(0,-2),m=c.shape.slice(0,-2),A=Ft(f),y=Ft(m);M(l.rank>=2&&c.rank>=2&&l.rank===c.rank,()=>`Error in fused matMul: inputs must have the same rank of at least 2, got ranks ${l.rank} and ${c.rank}.`),M(Jr(f,m),()=>`Error in fused matMul: outer dimensions (${f}) and (${m}) of Tensors with shapes ${l.shape} and ${c.shape} must match.`),M(u===h,()=>`Error in fused matMul: inner shapes (${u}) and (${h}) of Tensors with shapes ${l.shape} and ${c.shape} and transposeA=${n} and transposeB=${r} must match.`);let g=l.shape.slice(0,-2).concat([d,p]),w=n?H(l,[A,u,d]):H(l,[A,d,u]),b=r?H(c,[y,p,h]):H(c,[y,h,p]),_;a!=null&&(_=E(a,"bias","fused matMul"),[_]=bt(_,l),ft(g,_.shape));let x;i!=null&&(x=E(i,"prelu weights","fused matMul"));let N=(F,O)=>{let[W,V,U,j]=O,X=Pd(H(F,U.shape),U,s),G,ee;if(!n&&!r?(G=Ge(X,V,!1,!0),ee=Ge(W,X,!0,!1)):!n&&r?(G=Ge(X,V,!1,!1),ee=Ge(X,W,!0,!1)):n&&!r?(G=Ge(V,X,!1,!0),ee=Ge(W,X,!1,!1)):(G=Ge(V,X,!0,!0),ee=Ge(X,W,!0,!0)),a!=null){let Y=Ld(j,X);return[G,ee,Y]}else return[G,ee]},T={a:w,b,bias:_,preluActivationWeights:x},C={transposeA:n,transposeB:r,activation:s,leakyreluAlpha:o};return a==null?Fr((F,O,W)=>{let V=$.runKernel(Js,T,C);return W([F,O,V]),{value:H(V,g),gradFunc:N}})(w,b):Fr((F,O,W,V)=>{let U=$.runKernel(Js,T,C);return V([F,O,U,W]),{value:H(U,g),gradFunc:N}})(w,b,_)}var fC=D({fusedMatMul_:wC});function bC(e){return Im(e,.54,.46)}var _C=D({hammingWindow_:bC});function vC(e){return Im(e,.5,.5)}var Mx=D({hannWindow_:vC});function kC(e,t,n,r=!1,a=0){let s=0,i=[];for(;s+t<=e.size;)i.push(Ee(e,s,t)),s+=n;if(r)for(;s`Error in cropAndResize: image must be rank 4,but got rank ${i.rank}.`),M(o.rank===2&&o.shape[1]===4,()=>`Error in cropAndResize: boxes must be have size [${c},4] but had shape ${o.shape}.`),M(l.rank===1&&l.shape[0]===c,()=>`Error in cropAndResize: boxInd must be have size [${c}] but had shape ${o.shape}.`),M(r.length===2,()=>`Error in cropAndResize: cropSize must be of length 2, but got length ${r.length}.`),M(r[0]>=1&&r[1]>=1,()=>`cropSize must be atleast [1,1], but was ${r}`),M(a==="bilinear"||a==="nearest",()=>`method must be bilinear or nearest, but was ${a}`);let u={image:i,boxes:o,boxInd:l},h={method:a,extrapolationValue:s,cropSize:r};return $.runKernel(io,u,h)}var TC=D({cropAndResize_:SC});function CC(e){let t=E(e,"image","flipLeftRight","float32");M(t.rank===4,()=>`Error in flipLeftRight: image must be rank 4,but got rank ${t.rank}.`);let n={image:t};return $.runKernel(fo,n,{})}var EC=D({flipLeftRight_:CC});function RC(e,t,n=0,r=.5){let a=E(e,"image","rotateWithOffset","float32");M(a.rank===4,()=>`Error in rotateWithOffset: image must be rank 4,but got rank ${a.rank}.`);let s={image:a},i={radians:t,fillValue:n,center:r};return $.runKernel(Ko,s,i)}var MC=D({rotateWithOffset_:RC});function gl(e,t,n,r,a,s){r==null&&(r=.5),a==null&&(a=Number.NEGATIVE_INFINITY),s==null&&(s=0);let i=e.shape[0];return n=Math.min(n,i),M(0<=r&&r<=1,()=>`iouThreshold must be in [0, 1], but was '${r}'`),M(e.rank===2,()=>`boxes must be a 2D tensor, but was of rank '${e.rank}'`),M(e.shape[1]===4,()=>`boxes must have 4 columns, but 2nd dimension was ${e.shape[1]}`),M(t.rank===1,()=>"scores must be a 1D tensor"),M(t.shape[0]===i,()=>`scores has incompatible shape with boxes. Expected ${i}, but was ${t.shape[0]}`),M(0<=s&&s<=1,()=>`softNmsSigma must be in [0, 1], but was '${s}'`),{maxOutputSize:n,iouThreshold:r,scoreThreshold:a,softNmsSigma:s}}function FC(e,t,n,r=.5,a=Number.NEGATIVE_INFINITY){let s=E(e,"boxes","nonMaxSuppression"),i=E(t,"scores","nonMaxSuppression"),o=gl(s,i,n,r,a);n=o.maxOutputSize,r=o.iouThreshold,a=o.scoreThreshold;let l={maxOutputSize:n,iouThreshold:r,scoreThreshold:a};return $.runKernel(To,{boxes:s,scores:i},l)}var $C=D({nonMaxSuppression_:FC});function OC(e,t,n){let r=DC(e,t,n),a=r<0?-(r+1):r;e.splice(a,0,t)}function DC(e,t,n){return PC(e,t,n||zC)}function zC(e,t){return e>t?1:e>>1);let o=n(t,e[s]);o>0?r=s+1:(a=s,i=!o)}return i?r:-r-1}function $x(e,t,n,r,a){return Sm(e,t,n,r,a,0)}function Dx(e,t,n,r,a,s){return Sm(e,t,n,r,a,0,!1,s,!0)}function Ox(e,t,n,r,a,s){return Sm(e,t,n,r,a,s,!0)}function Sm(e,t,n,r,a,s,i=!1,o=!1,l=!1){let c=[];for(let A=0;Aa&&c.push({score:t[A],boxIndex:A,suppressBeginIndex:0});c.sort(zx);let u=s>0?-.5/s:0,h=[],d=[];for(;h.length0;){let A=c.pop(),{score:y,boxIndex:g,suppressBeginIndex:w}=A;if(y=w;--_){let x=LC(e,g,h[_]);if(x>=r){b=!0;break}if(A.score=A.score*WC(r,u,x),A.score<=a)break}A.suppressBeginIndex=h.length,b||(A.score===y?(h.push(g),d.push(A.score)):A.score>a&&OC(c,A,zx))}let p=h.length,f=n-p;o&&f>0&&(h.push(...new Array(f).fill(0)),d.push(...new Array(f).fill(0)));let m={selectedIndices:h};return i&&(m.selectedScores=d),l&&(m.validOutputs=p),m}function LC(e,t,n){let r=e.subarray(t*4,t*4+4),a=e.subarray(n*4,n*4+4),s=Math.min(r[0],r[2]),i=Math.min(r[1],r[3]),o=Math.max(r[0],r[2]),l=Math.max(r[1],r[3]),c=Math.min(a[0],a[2]),u=Math.min(a[1],a[3]),h=Math.max(a[0],a[2]),d=Math.max(a[1],a[3]),p=(o-s)*(l-i),f=(h-c)*(d-u);if(p<=0||f<=0)return 0;let m=Math.max(s,c),A=Math.max(i,u),y=Math.min(o,h),g=Math.min(l,d),w=Math.max(y-m,0)*Math.max(g-A,0);return w/(p+f-w)}function WC(e,t,n){let r=Math.exp(t*n*n);return n<=e?r:0}function zx(e,t){return e.score-t.score||e.score===t.score&&t.boxIndex-e.boxIndex}async function BC(e,t,n,r=.5,a=Number.NEGATIVE_INFINITY){let s=E(e,"boxes","nonMaxSuppressionAsync"),i=E(t,"scores","nonMaxSuppressionAsync"),o=gl(s,i,n,r,a);n=o.maxOutputSize,r=o.iouThreshold,a=o.scoreThreshold;let l=await Promise.all([s.data(),i.data()]),c=l[0],u=l[1],{selectedIndices:h}=$x(c,u,n,r,a);return s!==e&&s.dispose(),i!==t&&i.dispose(),rn(h,"int32")}var VC=BC;function UC(e,t,n,r=.5,a=Number.NEGATIVE_INFINITY,s=0){let i=E(e,"boxes","nonMaxSuppression"),o=E(t,"scores","nonMaxSuppression"),l=gl(i,o,n,r,a,s);n=l.maxOutputSize,r=l.iouThreshold,a=l.scoreThreshold,s=l.softNmsSigma;let c={boxes:i,scores:o},u={maxOutputSize:n,iouThreshold:r,scoreThreshold:a,softNmsSigma:s},h=$.runKernel(Eo,c,u);return{selectedIndices:h[0],selectedScores:h[1]}}var jC=D({nonMaxSuppressionWithScore_:UC});async function HC(e,t,n,r=.5,a=Number.NEGATIVE_INFINITY,s=0){let i=E(e,"boxes","nonMaxSuppressionAsync"),o=E(t,"scores","nonMaxSuppressionAsync"),l=gl(i,o,n,r,a,s);n=l.maxOutputSize,r=l.iouThreshold,a=l.scoreThreshold,s=l.softNmsSigma;let c=await Promise.all([i.data(),o.data()]),u=c[0],h=c[1],{selectedIndices:d,selectedScores:p}=Ox(u,h,n,r,a,s);return i!==e&&i.dispose(),o!==t&&o.dispose(),{selectedIndices:rn(d,"int32"),selectedScores:rn(p)}}var GC=HC;function qC(e,t,n,r=.5,a=Number.NEGATIVE_INFINITY,s=!1){let i=E(e,"boxes","nonMaxSuppression"),o=E(t,"scores","nonMaxSuppression"),l=gl(i,o,n,r,a,null),c=l.maxOutputSize,u=l.iouThreshold,h=l.scoreThreshold,d={boxes:i,scores:o},p={maxOutputSize:c,iouThreshold:u,scoreThreshold:h,padToMaxOutputSize:s},f=$.runKernel(Co,d,p);return{selectedIndices:f[0],validOutputs:f[1]}}var XC=D({nonMaxSuppressionPadded_:qC});async function KC(e,t,n,r=.5,a=Number.NEGATIVE_INFINITY,s=!1){let i=E(e,"boxes","nonMaxSuppressionAsync"),o=E(t,"scores","nonMaxSuppressionAsync"),l=gl(i,o,n,r,a,null),c=l.maxOutputSize,u=l.iouThreshold,h=l.scoreThreshold,[d,p]=await Promise.all([i.data(),o.data()]),{selectedIndices:f,validOutputs:m}=Dx(d,p,c,u,h,s);return i!==e&&i.dispose(),o!==t&&o.dispose(),{selectedIndices:rn(f,"int32"),validOutputs:_e(m,"int32")}}var ZC=KC;function YC(e,t,n=!1,r=!1){let a=E(e,"images","resizeBilinear");M(a.rank===3||a.rank===4,()=>`Error in resizeBilinear: x must be rank 3 or 4, but got rank ${a.rank}.`),M(t.length===2,()=>`Error in resizeBilinear: new shape must 2D, but got shape ${t}.`),M(r===!1||n===!1,()=>"Error in resizeBilinear: If halfPixelCenters is true, alignCorners must be false.");let s=a,i=!1;a.rank===3&&(i=!0,s=H(a,[1,a.shape[0],a.shape[1],a.shape[2]]));let[]=t,o={images:s},l={alignCorners:n,halfPixelCenters:r,size:t},c=$.runKernel(Ps,o,l);return i?H(c,[c.shape[1],c.shape[2],c.shape[3]]):c}var Px=D({resizeBilinear_:YC});function JC(e,t,n=!1,r=!1){let a=E(e,"images","resizeNearestNeighbor");M(a.rank===3||a.rank===4,()=>`Error in resizeNearestNeighbor: x must be rank 3 or 4, but got rank ${a.rank}.`),M(t.length===2,()=>`Error in resizeNearestNeighbor: new shape must 2D, but got shape ${t}.`),M(a.dtype==="float32"||a.dtype==="int32",()=>"`images` must have `int32` or `float32` as dtype"),M(r===!1||n===!1,()=>"Error in resizeNearestNeighbor: If halfPixelCenters is true, alignCorners must be false.");let s=a,i=!1;a.rank===3&&(i=!0,s=H(a,[1,a.shape[0],a.shape[1],a.shape[2]]));let[]=t,o={images:s},l={alignCorners:n,halfPixelCenters:r,size:t},c=$.runKernel(_u,o,l);return i?H(c,[c.shape[1],c.shape[2],c.shape[3]]):c}var Lx=D({resizeNearestNeighbor_:JC});function QC(e,t,n="nearest",r="constant",a=0,s){let i=E(e,"image","transform","float32"),o=E(t,"transforms","transform","float32");M(i.rank===4,()=>`Error in transform: image must be rank 4,but got rank ${i.rank}.`),M(o.rank===2&&(o.shape[0]===i.shape[0]||o.shape[0]===1)&&o.shape[1]===8,()=>"Error in transform: Input transform should be batch x 8 or 1 x 8"),M(s==null||s.length===2,()=>`Error in transform: outputShape must be [height, width] or null, but got ${s}.`);let l={image:i,transforms:o},c={interpolation:n,fillMode:r,fillValue:a,outputShape:s};return $.runKernel(Yh,l,c)}var eE=D({transform_:QC});function tE(e,t,n){M(t%1==0,()=>`bandPart(): numLower must be an integer, got ${t}.`),M(n%1==0,()=>`bandPart(): numUpper must be an integer, got ${n}.`);let r=E(e,"a","bandPart");M(r.rank>=2,()=>`bandPart(): Rank must be at least 2, got ${r.rank}.`);let a=r.shape,[s,i]=r.shape.slice(-2);if(!(t<=s))throw new Error(`bandPart(): numLower (${t}) must not be greater than the number of rows (${s}).`);if(!(n<=i))throw new Error(`bandPart(): numUpper (${n}) must not be greater than the number of columns (${i}).`);t<0&&(t=s),n<0&&(n=i);let o=H(Id(0,s,1,"int32"),[-1,1]),l=Id(0,i,1,"int32"),c=ye(o,l),u=ar(ui(c,_e(+t,"int32")),$a(c,_e(-n,"int32"))),h=Ct([s,i],r.dtype);return H(ln(sr(H(r,[-1,s,i])).map(d=>bn(u,d,h))),a)}var nE=D({bandPart_:tE});function rE(e){let t;if(Array.isArray(e)){t=!1,M(e!=null&&e.length>0,()=>"Gram-Schmidt process: input must not be null, undefined, or empty");let a=e[0].shape[0];for(let s=1;s`Gram-Schmidt: Non-unique lengths found in the input vectors: (${e[s].shape[0]} vs. ${a})`)}else t=!0,e=zt(e,e.shape[0],0).map(a=>Da(a,[0]));M(e.length<=e[0].shape[0],()=>`Gram-Schmidt: Number of vectors (${e.length}) exceeds number of dimensions (${e[0].shape[0]}).`);let n=[],r=e;for(let a=0;a{let s=r[a];if(a>0)for(let i=0;i=2,()=>`qr() requires input tensor to have a rank >= 2, but got rank ${e.rank}`),e.rank===2)return Wx(e,t);{let n=e.shape.slice(0,e.shape.length-2).reduce((l,c)=>l*c),r=sr(H(e,[n,e.shape[e.shape.length-2],e.shape[e.shape.length-1]]),0),a=[],s=[];r.forEach(l=>{let[c,u]=Wx(l,t);a.push(c),s.push(u)});let i=H(ln(a,0),e.shape),o=H(ln(s,0),e.shape);return[i,o]}}function Wx(e,t=!1){return $.tidy(()=>{M(e.shape.length===2,()=>`qr2d() requires a 2D Tensor, but got a ${e.shape.length}D Tensor.`);let n=e.shape[0],r=e.shape[1],a=am(n),s=Er(e),i=_n([[1]],[1,1]),o=Er(i),l=n>=r?r:n;for(let c=0;c{let p=Ee(s,[c,c],[n-c,1]),f=zd(p),m=Ee(s,[c,c],[1,1]),A=bn(rr(m,0),_n([[-1]]),_n([[1]])),y=ye(m,P(A,f)),g=ge(p,y);g.shape[0]===1?o=Er(i):o=rt([i,Ee(g,[1,0],[g.shape[0]-1,g.shape[1]])],0);let w=_t(ge(Ge(A,y),f)),b=Ee(s,[c,0],[n-c,r]),_=P(w,o),x=nt(o);if(c===0)s=ye(b,Ge(_,Ge(x,b)));else{let C=ye(b,Ge(_,Ge(x,b)));s=rt([Ee(s,[0,0],[c,r]),C],0)}let N=nt(_),T=Ee(a,[0,c],[n,a.shape[1]-c]);if(c===0)a=ye(T,Ge(Ge(T,o),N));else{let C=ye(T,Ge(Ge(T,o),N));a=rt([Ee(a,[0,0],[n,c]),C],1)}return[o,s,a]}),Ie([u,h,d])}return!t&&n>r&&(a=Ee(a,[0,0],[n,r]),s=Ee(s,[0,0],[r,r])),[a,s]})}var iE=D({qr_:sE}),un;(function(e){e[e.NONE=0]="NONE",e[e.MEAN=1]="MEAN",e[e.SUM=2]="SUM",e[e.SUM_BY_NONZERO_WEIGHTS=3]="SUM_BY_NONZERO_WEIGHTS"})(un||(un={}));function oE(e,t,n=un.SUM_BY_NONZERO_WEIGHTS){let r=E(e,"losses","computeWeightedLoss"),a=null;t!=null&&(a=E(t,"weights","computeWeightedLoss"));let s=a==null?r:P(r,a);if(n===un.NONE)return s;if(n===un.SUM)return Ce(s);if(n===un.MEAN){if(a==null)return vt(s);{let i=r.size/a.size,o=ge(Ce(s),Ce(a));return i>1?ge(o,_e(i)):o}}if(n===un.SUM_BY_NONZERO_WEIGHTS){if(a==null)return ge(Ce(s),_e(r.size));{let i=P(a,Dr(r.shape)),o=me(Ce(hi(i,_e(0))),"float32");return ge(Ce(s),o)}}throw Error(`Unknown reduction: ${n}`)}var ra=D({computeWeightedLoss_:oE});function lE(e,t,n,r=un.SUM_BY_NONZERO_WEIGHTS){let a=E(e,"labels","absoluteDifference"),s=E(t,"predictions","absoluteDifference"),i=null;n!=null&&(i=E(n,"weights","absoluteDifference")),tn(a.shape,s.shape,"Error in absoluteDifference: ");let o=Dt(ye(a,s));return ra(o,i,r)}var uE=D({absoluteDifference_:lE});function cE(e,t,n,r,a=un.SUM_BY_NONZERO_WEIGHTS){let s=E(e,"labels","cosineDistance"),i=E(t,"predictions","cosineDistance"),o=null;r!=null&&(o=E(r,"weights","cosineDistance")),tn(s.shape,i.shape,"Error in cosineDistance: ");let l=_e(1),c=ye(l,Ce(P(s,i),n,!0));return ra(c,o,a)}var hE=D({cosineDistance_:cE});function dE(e,t,n,r=un.SUM_BY_NONZERO_WEIGHTS){let a=E(e,"labels","hingeLoss"),s=E(t,"predictions","hingeLoss"),i=null;n!=null&&(i=E(n,"weights","hingeLoss")),tn(a.shape,s.shape,"Error in hingeLoss: ");let o=_e(1);a=ye(P(_e(2),a),o);let l=Or(ye(o,P(a,s)));return ra(l,i,r)}var pE=D({hingeLoss_:dE});function fE(e,t,n,r=1,a=un.SUM_BY_NONZERO_WEIGHTS){let s=E(e,"labels","huberLoss"),i=E(t,"predictions","huberLoss"),o=null;n!=null&&(o=E(n,"weights","huberLoss")),tn(s.shape,i.shape,"Error in huberLoss: ");let l=_e(r),c=Dt(ye(i,s)),u=fl(c,l),h=ye(c,u),d=se(P(_e(.5),it(u)),P(l,h));return ra(d,o,a)}var mE=D({huberLoss_:fE});function AE(e,t,n,r=1e-7,a=un.SUM_BY_NONZERO_WEIGHTS){let s=E(e,"labels","logLoss"),i=E(t,"predictions","logLoss"),o=null;n!=null&&(o=E(n,"weights","logLoss")),tn(s.shape,i.shape,"Error in logLoss: ");let l=_e(1),c=_e(r),u=_t(P(s,En(se(i,c)))),h=P(ye(l,s),En(se(ye(l,i),c))),d=ye(u,h);return ra(d,o,a)}var yE=D({logLoss_:AE});function gE(e,t,n,r=un.SUM_BY_NONZERO_WEIGHTS){let a=E(e,"labels","meanSquaredError"),s=E(t,"predictions","meanSquaredError"),i=null;n!=null&&(i=E(n,"weights","meanSquaredError")),tn(a.shape,s.shape,"Error in meanSquaredError: ");let o=$d(a,s);return ra(o,i,r)}var xE=D({meanSquaredError_:gE});function wE(e,t){let n=E(e,"labels","sigmoidCrossEntropyWithLogits"),r=E(t,"logits","sigmoidCrossEntropyWithLogits");tn(n.shape,r.shape,"Error in sigmoidCrossEntropyWithLogits: ");let a=Or(r),s=P(r,n),i=xd(Hn(_t(Dt(r))));return se(ye(a,s),i)}function bE(e,t,n,r=0,a=un.SUM_BY_NONZERO_WEIGHTS){let s=E(e,"multiClassLabels","sigmoidCrossEntropy"),i=E(t,"logits","sigmoidCrossEntropy"),o=null;if(n!=null&&(o=E(n,"weights","sigmoidCrossEntropy")),tn(s.shape,i.shape,"Error in sigmoidCrossEntropy: "),r>0){let c=_e(r),u=_e(1),h=_e(.5);s=se(P(s,ye(u,c)),P(h,c))}let l=wE(s,i);return ra(l,o,a)}var _E=D({sigmoidCrossEntropy_:bE});function vE(e,t,n=-1){if(n===-1&&(n=t.rank-1),n!==t.rank-1)throw Error(`Softmax cross entropy along a non-last dimension is not yet supported. Labels / logits was rank ${t.rank} and dim was ${n}`);return Fr((r,a,s)=>{let i=lm(a,[n],!0),o=ye(me(a,"float32"),i);s([r,o]);let l=_t(P(o,r));return{value:Ce(l,[n]),gradFunc:(c,u)=>{let[h,d]=u,p=ci(c.shape,[n]);return[P(H(c,p),ye(me(h,"float32"),Hn(d))),P(H(c,p),ye(Hn(d),me(h,"float32")))]}}})(e,t)}function kE(e,t,n,r=0,a=un.SUM_BY_NONZERO_WEIGHTS){let s=E(e,"onehotLabels","softmaxCrossEntropy"),i=E(t,"logits","softmaxCrossEntropy"),o=null;if(n!=null&&(o=E(n,"weights","softmaxCrossEntropy")),tn(s.shape,i.shape,"Error in softmaxCrossEntropy: "),r>0){let c=_e(r),u=_e(1),h=_e(s.shape[1]);s=se(P(s,ye(u,c)),ge(c,h))}let l=vE(s,i);return ra(l,o,a)}var IE=D({softmaxCrossEntropy_:kE}),NE={fft:Qu,ifft:Al,rfft:ec,irfft:Fd},SE={hammingWindow:_C,hannWindow:Mx,frame:Fx,stft:NC},Be={flipLeftRight:EC,resizeNearestNeighbor:Lx,resizeBilinear:Px,rotateWithOffset:MC,cropAndResize:TC,nonMaxSuppression:$C,nonMaxSuppressionAsync:VC,nonMaxSuppressionWithScore:jC,nonMaxSuppressionWithScoreAsync:GC,nonMaxSuppressionPadded:XC,nonMaxSuppressionPaddedAsync:ZC,transform:eE},Bx={bandPart:nE,gramSchmidt:aE,qr:iE},TE={absoluteDifference:uE,computeWeightedLoss:ra,cosineDistance:hE,hingeLoss:pE,huberLoss:mE,logLoss:yE,meanSquaredError:xE,sigmoidCrossEntropy:_E,softmaxCrossEntropy:IE},aa=class extends j5{minimize(e,t=!1,n){let{value:r,grads:a}=this.computeGradients(e,n);if(n!=null){let s=n.map(i=>({name:i.name,tensor:a[i.name]}));this.applyGradients(s)}else this.applyGradients(a);return Ie(a),t?r:(r.dispose(),null)}get iterations(){return this.iterations_==null&&(this.iterations_=0),this.iterations_}incrementIterations(){this.iterations_=this.iterations+1}computeGradients(e,t){return dx(e,t)}dispose(){this.iterations_!=null&&Ie(this.iterations_)}async saveIterations(){return this.iterations_==null&&(this.iterations_=0),{name:"iter",tensor:_e(this.iterations_,"int32")}}async getWeights(){throw new Error("getWeights() is not implemented for this optimizer yet.")}async setWeights(e){throw new Error(`setWeights() is not implemented for this optimizer class ${this.getClassName()}`)}async extractIterations(e){return this.iterations_=(await e[0].tensor.data())[0],e.slice(1)}};Object.defineProperty(aa,Symbol.hasInstance,{value:e=>e.minimize!=null&&e.computeGradients!=null&&e.applyGradients!=null});var Vd=class extends aa{constructor(e,t,n=null){super();this.learningRate=e,this.rho=t,this.epsilon=n,this.accumulatedGrads=[],this.accumulatedUpdates=[],n==null&&(this.epsilon=$.backend.epsilon())}applyGradients(e){(Array.isArray(e)?e.map(t=>t.name):Object.keys(e)).forEach((t,n)=>{let r=$.registeredVariables[t],a=!1;this.accumulatedGrads[n]==null&&(this.accumulatedGrads[n]={originalName:`${t}/accum_grad`,variable:z(()=>je(r).variable(a))}),this.accumulatedUpdates[n]==null&&(this.accumulatedUpdates[n]={originalName:`${t}/accum_var`,variable:z(()=>je(r).variable(a))});let s=Array.isArray(e)?e[n].tensor:e[t];if(s==null)return;let i=this.accumulatedGrads[n].variable,o=this.accumulatedUpdates[n].variable;z(()=>{let l=se(P(i,this.rho),P(it(s),1-this.rho)),c=P(ge(Yt(se(o,this.epsilon)),Yt(se(i,this.epsilon))),s),u=se(P(o,this.rho),P(it(c),1-this.rho));i.assign(l),o.assign(u);let h=se(P(c,-this.learningRate),r);r.assign(h)})}),this.incrementIterations()}dispose(){this.accumulatedUpdates!=null&&(Ie(this.accumulatedGrads.map(e=>e.variable)),Ie(this.accumulatedUpdates.map(e=>e.variable)))}async getWeights(){let e=[...this.accumulatedGrads,...this.accumulatedUpdates];return[await this.saveIterations()].concat(e.map(t=>({name:t.originalName,tensor:t.variable})))}async setWeights(e){e=await this.extractIterations(e);let t=e.length/2,n=!1;this.accumulatedGrads=e.slice(0,t).map(r=>({originalName:r.name,variable:r.tensor.variable(n)})),this.accumulatedUpdates=e.slice(t,t*2).map(r=>({originalName:r.name,variable:r.tensor.variable(n)}))}getConfig(){return{learningRate:this.learningRate,rho:this.rho,epsilon:this.epsilon}}static fromConfig(e,t){return new e(t.learningRate,t.rho,t.epsilon)}};Vd.className="Adadelta";Ca(Vd);var Ud=class extends aa{constructor(e,t=.1){super();this.learningRate=e,this.initialAccumulatorValue=t,this.accumulatedGrads=[]}applyGradients(e){(Array.isArray(e)?e.map(t=>t.name):Object.keys(e)).forEach((t,n)=>{let r=$.registeredVariables[t];if(this.accumulatedGrads[n]==null){let i=!1;this.accumulatedGrads[n]={originalName:`${t}/accumulator`,variable:z(()=>ju(r.shape,this.initialAccumulatorValue).variable(i))}}let a=Array.isArray(e)?e[n].tensor:e[t];if(a==null)return;let s=this.accumulatedGrads[n].variable;z(()=>{let i=se(s,it(a));s.assign(i);let o=se(P(ge(a,Yt(se(i,$.backend.epsilon()))),-this.learningRate),r);r.assign(o)})}),this.incrementIterations()}dispose(){this.accumulatedGrads!=null&&Ie(this.accumulatedGrads.map(e=>e.variable))}async getWeights(){return[await this.saveIterations()].concat(this.accumulatedGrads.map(e=>({name:e.originalName,tensor:e.variable})))}async setWeights(e){e=await this.extractIterations(e);let t=!1;this.accumulatedGrads=e.map(n=>({originalName:n.name,variable:n.tensor.variable(t)}))}getConfig(){return{learningRate:this.learningRate,initialAccumulatorValue:this.initialAccumulatorValue}}static fromConfig(e,t){return new e(t.learningRate,t.initialAccumulatorValue)}};Ud.className="Adagrad";Ca(Ud);var jd=class extends aa{constructor(e,t,n,r=null){super();this.learningRate=e,this.beta1=t,this.beta2=n,this.epsilon=r,this.accumulatedFirstMoment=[],this.accumulatedSecondMoment=[],z(()=>{this.accBeta1=_e(t).variable(),this.accBeta2=_e(n).variable()}),r==null&&(this.epsilon=$.backend.epsilon())}applyGradients(e){let t=Array.isArray(e)?e.map(n=>n.name):Object.keys(e);z(()=>{let n=ye(1,this.accBeta1),r=ye(1,this.accBeta2);t.forEach((a,s)=>{let i=$.registeredVariables[a],o=!1;this.accumulatedFirstMoment[s]==null&&(this.accumulatedFirstMoment[s]={originalName:`${a}/m`,variable:z(()=>je(i).variable(o))}),this.accumulatedSecondMoment[s]==null&&(this.accumulatedSecondMoment[s]={originalName:`${a}/v`,variable:z(()=>je(i).variable(o))});let l=Array.isArray(e)?e[s].tensor:e[a];if(l==null)return;let c=this.accumulatedFirstMoment[s].variable,u=this.accumulatedSecondMoment[s].variable,h=se(P(c,this.beta1),P(l,1-this.beta1)),d=se(P(u,this.beta2),P(it(l),1-this.beta2)),p=ge(h,n),f=ge(d,r);c.assign(h),u.assign(d);let m=se(P(ge(p,se(Yt(f),this.epsilon)),-this.learningRate),i);i.assign(m)}),this.accBeta1.assign(P(this.accBeta1,this.beta1)),this.accBeta2.assign(P(this.accBeta2,this.beta2))}),this.incrementIterations()}dispose(){this.accBeta1.dispose(),this.accBeta2.dispose(),this.accumulatedFirstMoment!=null&&Ie(this.accumulatedFirstMoment.map(e=>e.variable)),this.accumulatedSecondMoment!=null&&Ie(this.accumulatedSecondMoment.map(e=>e.variable))}async getWeights(){let e=[...this.accumulatedFirstMoment,...this.accumulatedSecondMoment];return[await this.saveIterations()].concat(e.map(t=>({name:t.originalName,tensor:t.variable})))}async setWeights(e){e=await this.extractIterations(e),z(()=>{this.accBeta1.assign(na(this.beta1,this.iterations_+1)),this.accBeta2.assign(na(this.beta2,this.iterations_+1))});let t=e.length/2,n=!1;this.accumulatedFirstMoment=e.slice(0,t).map(r=>({originalName:r.name,variable:r.tensor.variable(n)})),this.accumulatedSecondMoment=e.slice(t,t*2).map(r=>({originalName:r.name,variable:r.tensor.variable(n)}))}getConfig(){return{learningRate:this.learningRate,beta1:this.beta1,beta2:this.beta2,epsilon:this.epsilon}}static fromConfig(e,t){return new e(t.learningRate,t.beta1,t.beta2,t.epsilon)}};jd.className="Adam";Ca(jd);var Hd=class extends aa{constructor(e,t,n,r=null,a=0){super();this.learningRate=e,this.beta1=t,this.beta2=n,this.epsilon=r,this.decay=a,this.accumulatedFirstMoment=[],this.accumulatedWeightedInfNorm=[],z(()=>{this.iteration=_e(0).variable(),this.accBeta1=_e(t).variable()}),r==null&&(this.epsilon=$.backend.epsilon())}applyGradients(e){let t=Array.isArray(e)?e.map(n=>n.name):Object.keys(e);z(()=>{let n=ye(1,this.accBeta1),r=ge(-this.learningRate,se(P(this.iteration,this.decay),1));t.forEach((a,s)=>{let i=$.registeredVariables[a],o=!1;this.accumulatedFirstMoment[s]==null&&(this.accumulatedFirstMoment[s]={originalName:`${a}/m`,variable:je(i).variable(o)}),this.accumulatedWeightedInfNorm[s]==null&&(this.accumulatedWeightedInfNorm[s]={originalName:`${a}/v`,variable:je(i).variable(o)});let l=Array.isArray(e)?e[s].tensor:e[a];if(l==null)return;let c=this.accumulatedFirstMoment[s].variable,u=this.accumulatedWeightedInfNorm[s].variable,h=se(P(c,this.beta1),P(l,1-this.beta1)),d=P(u,this.beta2),p=Dt(l),f=$r(d,p);c.assign(h),u.assign(f);let m=se(P(ge(r,n),ge(h,se(f,this.epsilon))),i);i.assign(m)}),this.iteration.assign(se(this.iteration,1)),this.accBeta1.assign(P(this.accBeta1,this.beta1))}),this.incrementIterations()}dispose(){this.accBeta1.dispose(),this.iteration.dispose(),this.accumulatedFirstMoment!=null&&Ie(this.accumulatedFirstMoment.map(e=>e.variable)),this.accumulatedWeightedInfNorm!=null&&Ie(this.accumulatedWeightedInfNorm.map(e=>e.variable))}async getWeights(){throw new Error("getWeights() is not implemented for Adamax yet.")}async setWeights(e){throw new Error("setWeights() is not implemented for Adamax yet.")}getConfig(){return{learningRate:this.learningRate,beta1:this.beta1,beta2:this.beta2,epsilon:this.epsilon,decay:this.decay}}static fromConfig(e,t){return new e(t.learningRate,t.beta1,t.beta2,t.epsilon,t.decay)}};Hd.className="Adamax";Ca(Hd);var tc=class extends aa{constructor(e){super();this.learningRate=e,this.setLearningRate(e)}applyGradients(e){(Array.isArray(e)?e.map(t=>t.name):Object.keys(e)).forEach((t,n)=>{let r=Array.isArray(e)?e[n].tensor:e[t];if(r==null)return;let a=$.registeredVariables[t];z(()=>{let s=se(P(this.c,r),a);a.assign(s)})}),this.incrementIterations()}setLearningRate(e){this.learningRate=e,this.c!=null&&this.c.dispose(),this.c=Ut(_e(-e))}dispose(){this.c.dispose()}async getWeights(){return[await this.saveIterations()]}async setWeights(e){if(e=await this.extractIterations(e),e.length!==0)throw new Error("SGD optimizer does not have settable weights.")}getConfig(){return{learningRate:this.learningRate}}static fromConfig(e,t){return new e(t.learningRate)}};tc.className="SGD";Ca(tc);var Gd=class extends tc{constructor(e,t,n=!1){super(e);this.learningRate=e,this.momentum=t,this.useNesterov=n,this.accumulations=[],this.m=_e(this.momentum)}applyGradients(e){(Array.isArray(e)?e.map(t=>t.name):Object.keys(e)).forEach((t,n)=>{let r=$.registeredVariables[t];if(this.accumulations[n]==null){let i=!1;this.accumulations[n]={originalName:`${t}/momentum`,variable:z(()=>je(r).variable(i))}}let a=this.accumulations[n].variable,s=Array.isArray(e)?e[n].tensor:e[t];s!=null&&z(()=>{let i,o=se(P(this.m,a),s);this.useNesterov?i=se(P(this.c,se(s,P(o,this.m))),r):i=se(P(this.c,o),r),a.assign(o),r.assign(i)})}),this.incrementIterations()}dispose(){this.m.dispose(),this.accumulations!=null&&Ie(this.accumulations.map(e=>e.variable))}setMomentum(e){this.momentum=e}async getWeights(){return[await this.saveIterations()].concat(this.accumulations.map(e=>({name:e.originalName,tensor:e.variable})))}async setWeights(e){e=await this.extractIterations(e);let t=!1;this.accumulations=e.map(n=>({originalName:n.name,variable:n.tensor.variable(t)}))}getConfig(){return{learningRate:this.learningRate,momentum:this.momentum,useNesterov:this.useNesterov}}static fromConfig(e,t){return new e(t.learningRate,t.momentum,t.useNesterov)}};Gd.className="Momentum";Ca(Gd);var qd=class extends aa{constructor(e,t=.9,n=0,r=null,a=!1){super();if(this.learningRate=e,this.decay=t,this.momentum=n,this.epsilon=r,this.accumulatedMeanSquares=[],this.accumulatedMoments=[],this.accumulatedMeanGrads=[],this.centered=a,r==null&&(this.epsilon=$.backend.epsilon()),e==null)throw new Error("learningRate for RMSPropOptimizer must be defined.")}applyGradients(e){(Array.isArray(e)?e.map(t=>t.name):Object.keys(e)).forEach((t,n)=>{let r=$.registeredVariables[t],a=!1;this.accumulatedMeanSquares[n]==null&&(this.accumulatedMeanSquares[n]={originalName:`${t}/rms`,variable:z(()=>je(r).variable(a))}),this.accumulatedMoments[n]==null&&(this.accumulatedMoments[n]={originalName:`${t}/momentum`,variable:z(()=>je(r).variable(a))}),this.accumulatedMeanGrads[n]==null&&this.centered&&(this.accumulatedMeanGrads[n]={originalName:`${t}/mg`,variable:z(()=>je(r).variable(a))});let s=Array.isArray(e)?e[n].tensor:e[t];if(s==null)return;let i=this.accumulatedMeanSquares[n].variable,o=this.accumulatedMoments[n].variable;z(()=>{let l=se(P(i,this.decay),P(it(s),1-this.decay));if(this.centered){let c=this.accumulatedMeanGrads[n].variable,u=se(P(c,this.decay),P(s,1-this.decay)),h=ge(P(s,this.learningRate),Yt(ye(l,se(it(u),this.epsilon)))),d=se(P(o,this.momentum),h);i.assign(l),c.assign(u),o.assign(d);let p=ye(r,d);r.assign(p)}else{let c=se(P(i,this.decay),P(it(s),1-this.decay)),u=se(P(o,this.momentum),ge(P(s,this.learningRate),Yt(se(c,this.epsilon))));i.assign(c),o.assign(u);let h=ye(r,u);r.assign(h)}})}),this.incrementIterations()}dispose(){this.accumulatedMeanSquares!=null&&Ie(this.accumulatedMeanSquares.map(e=>e.variable)),this.accumulatedMeanGrads!=null&&this.centered&&Ie(this.accumulatedMeanGrads.map(e=>e.variable)),this.accumulatedMoments!=null&&Ie(this.accumulatedMoments.map(e=>e.variable))}async getWeights(){let e=[...this.accumulatedMeanSquares,...this.accumulatedMoments];return this.centered&&e.push(...this.accumulatedMeanGrads),[await this.saveIterations()].concat(e.map(t=>({name:t.originalName,tensor:t.variable})))}async setWeights(e){e=await this.extractIterations(e);let t=this.centered?e.length/3:e.length/2,n=!1;this.accumulatedMeanSquares=e.slice(0,t).map(r=>({originalName:r.name,variable:r.tensor.variable(n)})),this.accumulatedMoments=e.slice(t,t*2).map(r=>({originalName:r.name,variable:r.tensor.variable(n)})),this.centered&&(this.accumulatedMeanGrads=e.slice(t*2,t*3).map(r=>({originalName:r.name,variable:r.tensor.variable(n)})))}getConfig(){return{learningRate:this.learningRate,decay:this.decay,momentum:this.momentum,epsilon:this.epsilon,centered:this.centered}}static fromConfig(e,t){return new e(t.learningRate,t.decay,t.momentum,t.epsilon,t.centered)}};qd.className="RMSProp";Ca(qd);var di=class{static sgd(e){return new tc(e)}static momentum(e,t,n=!1){return new Gd(e,t,n)}static rmsprop(e,t=.9,n=0,r=null,a=!1){return new qd(e,t,n,r,a)}static adam(e=.001,t=.9,n=.999,r=null){return new jd(e,t,n,r)}static adadelta(e=.001,t=.95,n=null){return new Vd(e,t,n)}static adamax(e=.002,t=.9,n=.999,r=null,a=0){return new Hd(e,t,n,r,a)}static adagrad(e,t=.1){return new Ud(e,t)}},pi={sgd:di.sgd,momentum:di.momentum,adadelta:di.adadelta,adagrad:di.adagrad,rmsprop:di.rmsprop,adamax:di.adamax,adam:di.adam},CE=(()=>typeof requestAnimationFrame!="undefined"?requestAnimationFrame:typeof setImmediate!="undefined"?setImmediate:e=>e())();function Xd(){return new Promise(e=>CE(()=>e()))}var R={};Oe(R,{ERF_A1:()=>WE,ERF_A2:()=>BE,ERF_A3:()=>VE,ERF_A4:()=>UE,ERF_A5:()=>jE,ERF_P:()=>LE,PARALLELIZE_THRESHOLD:()=>Tm,SELU_SCALE:()=>Ux,SELU_SCALEALPHA:()=>Vx,applyActivation:()=>Wd,assertAndGetBroadcastShape:()=>ft,assertAxesAreInnerMostDims:()=>hS,assertParamsConsistent:()=>EE,assignToTypedArray:()=>JE,axesAreInnerMostDims:()=>im,calculateShapes:()=>M5,combineLocations:()=>fx,complexWithEvenIndex:()=>KE,complexWithOddIndex:()=>ZE,computeConv2DInfo:()=>Lu,computeConv3DInfo:()=>Y5,computeDefaultPad:()=>Xf,computeDilation2DInfo:()=>DI,computeOptimalWindowSize:()=>ME,computeOutAndReduceShapes:()=>mx,computeOutShape:()=>RE,computePool2DInfo:()=>Z5,computePool3DInfo:()=>OI,convertConv2DDataFormat:()=>K5,eitherStridesOrDilationsAreOne:()=>Mr,expandShapeToKeepDim:()=>ci,exponent:()=>eR,exponents:()=>QE,fromStringArrayToUint8:()=>rR,fromUint8ToStringArray:()=>nR,getAxesPermutation:()=>Ax,getBroadcastDims:()=>SN,getComplexWithIndex:()=>YE,getFusedBiasGradient:()=>Ld,getFusedDyActivation:()=>Pd,getImageCenter:()=>FE,getInnerMostAxes:()=>dS,getPermuted:()=>DE,getReductionAxes:()=>Ot,getReshaped:()=>$E,getReshapedPermuted:()=>OE,getSliceBeginCoords:()=>zE,getSliceSize:()=>PE,getUndoAxesPermutation:()=>om,log:()=>GE,mergeRealAndImagArrays:()=>qE,prepareAndValidate:()=>R5,prepareSplitSize:()=>tR,segment_util:()=>jx,shouldFuse:()=>Bd,slice_util:()=>sn,splitRealAndImagArrays:()=>XE,tupleValuesAreOne:()=>Ra,upcastType:()=>nr,validateInput:()=>Ff,validateUpdateShape:()=>Mf,warn:()=>HE});function EE(e,t){let n=e[0].length;e.forEach((a,s)=>{M(a.length===n,()=>`Error in concat${n}D: rank of tensors[${s}] must be the same as the rank of the rest (${n})`)}),M(t>=0&&t`Error in concat${n}D: axis must be between 0 and ${n-1}.`);let r=e[0];e.forEach((a,s)=>{for(let i=0;i`Error in concat${n}D: Shape of tensors[${s}] (${a}) does not match the shape of the rest (${r}) along the non-concatenated axis ${s}.`)})}function RE(e,t){let n=e[0].slice();for(let r=1;r=t*2+1||i%2==1?s.push(i):a.push(i);r.push(...a),r.push(0),r.push(...s)}return r}function OE(e,t,n,r=!0){let a=[];r?a.push(e[0]/n):a.push(e[0]*n);for(let s=1;s"Number of splits must evenly divide the axis."),r=new Array(t).fill(e.shape[n]/t);else{let a=t.reduce((i,o)=>(o===-1&&(i+=1),i),0);M(a<=1,()=>"There should be only one negative value in split array.");let s=t.indexOf(-1);if(s!==-1){let i=t.reduce((o,l)=>l>0?o+l:o);t[s]=e.shape[n]-i}M(e.shape[n]===t.reduce((i,o)=>i+o),()=>"The sum of sizes must match the size of the axis dimension."),r=t}return r}var jx={};Oe(jx,{collectGatherOpShapeInfo:()=>iR,computeOutShape:()=>sR,segOpComputeOptimalWindowSize:()=>aR});function aR(e,t){let n=!1,r;for(e<=Tm?(r=e,n=!0):r=wh(e,Math.floor(Math.sqrt(e)));!n;)r>t||r===e?n=!0:r=wh(e,r+1);return r}function sR(e,t,n){let r=[],a=e.length;for(let s=0;sa))throw new Error(`Expect batchDims in the range of [-${a}, ${a}], but got ${r}`);if(r<0&&(r+=a),r>s)throw new Error(`batchDims (${r}) must be less than rank(x) ( - ${s}).`);if(nnd(t))}catch(t){throw new Error(`Failed to decode encoded string bytes into utf-8, error: ${t}`)}}function rR(e){return e.map(t=>Tu(t))}var zr={};Oe(zr,{nonMaxSuppressionV3Impl:()=>$x,nonMaxSuppressionV4Impl:()=>Dx,nonMaxSuppressionV5Impl:()=>Ox,whereImpl:()=>kx});function be(e,t){Array.isArray(e)||(e=[e]),e.forEach(n=>{n!=null&&v.assert(n.dtype!=="complex64",()=>`${t} does not support complex64 tensors in the CPU backend.`)})}var oR=zr.whereImpl,Kd=class extends iu{constructor(){super();this.blockSize=48,this.firstUse=!0,this.data=new gh(this,Rr())}nextDataId(){return Kd.nextDataId++}write(e,t,n){this.firstUse&&(this.firstUse=!1,J().get("IS_NODE")&&R.warn(` -============================ -Hi there \u{1F44B}. Looks like you are running TensorFlow.js in Node.js. To speed things up dramatically, install our node backend, which binds to TensorFlow C++, by running npm i @tensorflow/tfjs-node, or npm i @tensorflow/tfjs-node-gpu if you have CUDA. Then call require('@tensorflow/tfjs-node'); (-gpu suffix for CUDA) at the start of your program. Visit https://github.com/tensorflow/tfjs-node for more details. -============================`));let r={id:this.nextDataId()};return this.data.set(r,{values:e,dtype:n,refCount:1}),r}makeTensorInfo(e,t,n){let r;if(t==="string"&&n!=null&&n.length>0&&v.isString(n[0])){let a=n.map(s=>v.encodeString(s));r=this.write(a,e,t)}else r=this.write(n,e,t);return{dataId:r,shape:e,dtype:t}}refCount(e){return this.data.has(e)?this.data.get(e).refCount:0}incRef(e){let t=this.data.get(e);t.refCount++}decRef(e){if(this.data.has(e)){let t=this.data.get(e);t.refCount--}}move(e,t,n,r,a){this.data.set(e,{values:t,dtype:r,refCount:a})}numDataIds(){return this.data.numDataIds()}async read(e){return this.readSync(e)}readSync(e){let{dtype:t,complexTensorInfos:n}=this.data.get(e);if(t==="complex64"){let r=this.readSync(n.real.dataId),a=this.readSync(n.imag.dataId);return R.mergeRealAndImagArrays(r,a)}return this.data.get(e).values}bufferSync(e){let t=this.readSync(e.dataId),n=t;if(e.dtype==="string")try{n=t.map(r=>v.decodeString(r))}catch(r){throw new Error("Failed to decode encoded string bytes into utf-8")}return Le(e.shape,e.dtype,n)}makeOutput(e,t,n){let r=this.write(e,t,n);return Rr().makeTensorFromDataId(r,t,n,this)}disposeData(e,t=!1){if(this.data.has(e)){if(this.data.get(e).refCount--,!t&&this.data.get(e).refCount>0)return!1;let{complexTensorInfos:n}=this.data.get(e);n!=null&&(this.disposeData(n.real.dataId,!0),this.disposeData(n.imag.dataId,!0)),this.data.delete(e)}return!0}disposeIntermediateTensorInfo(e){this.disposeData(e.dataId)}async time(e){let t=v.now();return e(),{kernelMs:v.now()-t}}memory(){return{unreliable:!0,reasons:["The reported memory is an upper bound. Due to automatic garbage collection, the true allocated memory may be less."]}}where(e){be([e],"where");let t=this.readSync(e.dataId);return oR(e.shape,t)}dispose(){}floatPrecision(){return 32}epsilon(){return super.epsilon()}};Kd.nextDataId=0;var Cm={};Oe(Cm,{addImpl:()=>Gx,bincountImpl:()=>Em,bincountReduceImpl:()=>qx,ceilImpl:()=>Xx,concatImpl:()=>Rm,expImpl:()=>Kx,expm1Impl:()=>Zx,floorImpl:()=>Yx,gatherV2Impl:()=>Jx,greaterImpl:()=>Qx,lessImpl:()=>ew,linSpaceImpl:()=>tw,logImpl:()=>nw,maxImpl:()=>rw,maximumImpl:()=>aw,minimumImpl:()=>sw,multiplyImpl:()=>Mm,negImpl:()=>iw,notEqualImpl:()=>ow,prodImpl:()=>lw,rangeImpl:()=>$m,rsqrtImpl:()=>uw,simpleAbsImpl:()=>Hx,sliceImpl:()=>Zd,squaredDifferenceImpl:()=>cw,stridedSliceImpl:()=>hw,subImpl:()=>dw,tileImpl:()=>pw,topKImpl:()=>fw,transposeImpl:()=>Fm,uniqueImpl:()=>mw});function Hx(e){let t=new Float32Array(e.length);for(let n=0;n{let{x:t}=e.inputs,n=e.backend;be(t,"abs");let r=new Float32Array(v.sizeFromShape(t.shape)),a=n.data.get(t.dataId).values;return r=Hx(a),n.makeOutput(r,t.shape,"float32")},uR={kernelName:Zi,backendName:"cpu",kernelFunc:lR};function Et(e){return(t,n,r,a,s)=>{let i=R.assertAndGetBroadcastShape(t,n),o=i.length,l=v.computeStrides(i),c=v.sizeFromShape(i),u=v.getTypedArrayFromDType(s,c),h=t.length,d=n.length,p=v.computeStrides(t),f=v.computeStrides(n),m=R.getBroadcastDims(t,i),A=R.getBroadcastDims(n,i);if(m.length+A.length===0)for(let y=0;yw[N]=0);let b=v.locToIndex(w,h,p),_=g.slice(-d);A.forEach(N=>_[N]=0);let x=v.locToIndex(_,d,f);u[y]=e(r[b],a[x])}return[u,i]}}function Fn(e){let{inputs:t,backend:n}=e,{real:r,imag:a}=t,s=n.data.get(r.dataId).values,i=n.data.get(a.dataId).values,o=n.makeTensorInfo(r.shape,"complex64"),l=n.data.get(o.dataId);return l.complexTensorInfos={real:n.makeTensorInfo(r.shape,"float32",s),imag:n.makeTensorInfo(a.shape,"float32",i)},o}var cR={kernelName:Sh,backendName:"cpu",kernelFunc:Fn};function Yd(e,t,n="float32"){if(n==="complex64"){let a=Yd(e,t,"float32"),s=Yd(e,t,"float32");return Fn({inputs:{real:a,imag:s},backend:e})}let r=v.makeZerosTypedArray(v.sizeFromShape(t),n);return e.makeTensorInfo(t,n,r)}function Pr(e){let{inputs:t,backend:n}=e,{x:r}=t;return n.incRef(r.dataId),{dataId:r.dataId,shape:r.shape,dtype:r.dtype}}var hR={kernelName:vs,backendName:"cpu",kernelFunc:Pr};function fi(e){let{inputs:t,backend:n}=e,{input:r}=t,a=n.data.get(r.dataId).complexTensorInfos.real,s=n.data.get(a.dataId).values;return n.makeTensorInfo(a.shape,a.dtype,s)}var dR={kernelName:qh,backendName:"cpu",kernelFunc:fi};function za(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{dtype:s}=r;if(s==="complex64"){if(a.dtype==="complex64")return Pr({inputs:{x:a},backend:n});let i=Yd(n,a.shape,a.dtype),o=za({inputs:{x:a},backend:n,attrs:{dtype:"float32"}}),l=Fn({inputs:{real:o,imag:i},backend:n});return n.disposeIntermediateTensorInfo(i),n.disposeIntermediateTensorInfo(o),l}if(a.dtype==="complex64"){let i=fi({inputs:{input:a},backend:n}),o=za({inputs:{x:i},backend:n,attrs:{dtype:s}});return n.disposeIntermediateTensorInfo(i),o}if(!v.hasEncodingLoss(a.dtype,s)){let i=Pr({inputs:{x:a},backend:n});return{dataId:i.dataId,shape:i.shape,dtype:s}}if(s==="int32"){let i=n.data.get(a.dataId).values,o=Int32Array.from(i);return n.makeTensorInfo(a.shape,"int32",o)}if(s==="bool"){let i=n.data.get(a.dataId).values,o=v.toTypedArray([0],a.dtype),[l,c]=Et((u,h)=>u!==h?1:0)(a.shape,[],i,o,"bool");return n.makeTensorInfo(c,"bool",l)}throw new Error(`Error in Cast: failed to cast ${a.dtype} to ${s}`)}var pR={kernelName:cs,backendName:"cpu",kernelFunc:za};function jt(e,t,n,r){return n==null?({inputs:a,backend:s})=>{let{a:i,b:o}=a,l=s;be([i,o],e);let c=l.data.get(i.dataId).values,u=l.data.get(o.dataId).values,h=r||i.dtype,[d,p]=t(i.shape,o.shape,c,u,h);return l.makeTensorInfo(p,h,d)}:({inputs:a,backend:s})=>{let{a:i,b:o}=a,l=s;if(i.dtype==="complex64"||o.dtype==="complex64"){let c=za({inputs:{x:i},backend:l,attrs:{dtype:"complex64"}}),u=l.data.get(c.dataId),h=u.complexTensorInfos.real,d=u.complexTensorInfos.imag,p=l.data.get(h.dataId).values,f=l.data.get(d.dataId).values,m=za({inputs:{x:o},backend:l,attrs:{dtype:"complex64"}}),A=l.data.get(m.dataId),y=A.complexTensorInfos.real,g=A.complexTensorInfos.imag,w=l.data.get(y.dataId).values,b=l.data.get(g.dataId).values,[_,x,N]=n(i.shape,o.shape,p,f,w,b),T=l.makeTensorInfo(N,"float32",_),C=l.makeTensorInfo(N,"float32",x),F=Fn({inputs:{real:T,imag:C},backend:l});return l.disposeIntermediateTensorInfo(c),l.disposeIntermediateTensorInfo(m),l.disposeIntermediateTensorInfo(T),l.disposeIntermediateTensorInfo(C),F}else{let c=l.data.get(i.dataId).values,u=l.data.get(o.dataId).values,h=r||i.dtype,[d,p]=t(i.shape,o.shape,c,u,h);return l.makeTensorInfo(p,h,d)}}}function Dm(e){return(t,n,r,a,s,i)=>{let o=R.assertAndGetBroadcastShape(t,n),l=v.sizeFromShape(o),c=o.length,u=v.computeStrides(o),h=v.getTypedArrayFromDType("float32",l),d=v.getTypedArrayFromDType("float32",l),p=R.getBroadcastDims(t,o),f=R.getBroadcastDims(n,o),m=R.mergeRealAndImagArrays(r,a),A=R.mergeRealAndImagArrays(s,i),y=t.length,g=v.computeStrides(t),w=n.length,b=v.computeStrides(n);if(p.length+f.length===0)for(let _=0;_N[W]=0);let T=v.locToIndex(N,y,g),C=x.slice(-w);f.forEach(W=>C[W]=0);let F=v.locToIndex(C,w,b),O=e(m[T*2],m[T*2+1],A[F*2],A[F*2+1]);h[_]=O.real,d[_]=O.imag}return[h,d,o]}}var Gx=Et((e,t)=>e+t),fR=Dm((e,t,n,r)=>({real:e+n,imag:t+r})),nc=jt(_a,Gx,fR),mR={kernelName:_a,backendName:"cpu",kernelFunc:nc};function Em(e,t,n,r,a){let s=v.sizeFromShape(r),i=v.makeZerosTypedArray(a,n);for(let o=0;o=a||(s>0?i[l]+=t[o]:i[l]+=1)}return i}function qx(e,t,n,r=!1){let a=e.shape[0],s=e.shape[1],i=Le([a,n],t.dtype);for(let o=0;o=n||(r?i.set(1,o,c):t.size>0?i.set(i.get(o,c)+t.get(o,l),o,c):i.set(i.get(o,c)+1,o,c))}return i}function xl(e){return(t,n,r)=>{let a=v.getTypedArrayFromDType(n,t.length);for(let s=0;s{let{x:i}=r;if(be(i,e),i.dtype==="string"||n==="string")throw new Error("unaryKernelFunc does not support string input/output");let o=s,l=o.data.get(i.dataId).values,c=v.sizeFromShape(i.shape),u=n||i.dtype,h=v.getArrayFromDType(u,c);for(let d=0;d{let{x:i}=r;if(be(i,e),i.dtype==="string"||n==="string")throw new Error("unaryKernelFunc does not support string input/output");let o=s,l=o.data.get(i.dataId).values,c=n||i.dtype,u=t(l,c,a);return o.makeTensorInfo(i.shape,c,u)}}var Xx=xl(e=>Math.ceil(e)),AR=wl(hs,Xx),yR={kernelName:hs,backendName:"cpu",kernelFunc:AR};function Rm(e,t,n,r){let a=v.getArrayFromDType(n,v.sizeFromShape(t));if(r&&n!=="string"){let s=0;e.forEach(i=>{let o=v.sizeFromShape(i.shape);a.set(i.vals,s),s+=o})}else{let s=0;e.forEach(i=>{let o=n==="string"?R.fromUint8ToStringArray(i.vals):i.vals,l=0;for(let c=0;cMath.exp(e)),Aw=wl(gs,Kx),gR={kernelName:gs,backendName:"cpu",kernelFunc:Aw},Zx=xl(e=>Math.expm1(e)),xR=wl(po,Zx),wR={kernelName:po,backendName:"cpu",kernelFunc:xR},Yx=xl(e=>Math.floor(e)),bR=wl(xs,Yx),_R={kernelName:xs,backendName:"cpu",kernelFunc:bR};function Jx(e,t,n){let r=Le(n,e.dtype);for(let a=0;ae>t?1:0),vR=jt(yo,Qx,null,"bool"),kR={kernelName:yo,backendName:"cpu",kernelFunc:vR},ew=Et((e,t)=>eMath.log(e)),SR=wl(Is,nw),TR={kernelName:Is,backendName:"cpu",kernelFunc:SR};function rw(e,t,n,r){let a=v.getTypedArrayFromDType(r,v.sizeFromShape(n));for(let s=0;so&&(o=c)}a[s]=o}return a}var aw=Et((e,t)=>Math.max(e,t)),CR=jt(Ss,aw),ER={kernelName:Ss,backendName:"cpu",kernelFunc:CR},sw=Et((e,t)=>Math.min(e,t)),RR=jt(Rs,sw),MR={kernelName:Rs,backendName:"cpu",kernelFunc:RR},Mm=Et((e,t)=>e*t),FR=Dm((e,t,n,r)=>({real:e*n-t*r,imag:e*r+t*n})),Om=jt(Ms,Mm,FR),$R={kernelName:Ms,backendName:"cpu",kernelFunc:Om};function iw(e,t,n){let r=v.createScalarValue(-1,n);return Mm([],t,r,e,n)}function DR(e){let{inputs:t,backend:n}=e,{x:r}=t;be(r,"neg");let a=n.data.get(r.dataId).values,[s,i]=iw(a,r.shape,r.dtype);return n.makeTensorInfo(i,r.dtype,s)}var OR={kernelName:No,backendName:"cpu",kernelFunc:DR},ow=Et((e,t)=>e!==t?1:0),zR=jt(So,ow,null,"bool"),PR={kernelName:So,backendName:"cpu",kernelFunc:zR};function Fm(e,t,n,r,a){let s=t.length,i=v.sizeFromShape(t),o=v.computeStrides(t),l=v.computeStrides(a),c=v.getTypedArrayFromDType(n,v.sizeFromShape(a));for(let u=0;un.disposeIntermediateTensorInfo(g)),n.makeTensorInfo(y,A,f)}var BR={kernelName:Fo,backendName:"cpu",kernelFunc:WR};function $m(e,t,n,r){let a=e===t,s=e1;if(a||s||i)return v.makeZerosTypedArray(0,r);let o=Math.abs(Math.ceil((t-e)/n)),l=v.makeZerosTypedArray(o,r);t1/Math.sqrt(e)),VR=wl(Vs,uw),UR={kernelName:Vs,backendName:"cpu",kernelFunc:VR};function Zd(e,t,n,r,a){let s=sn.isSliceContinous(r,t,n),i=v.sizeFromShape(n),o=v.computeStrides(r);if(s){let h=sn.computeFlatOffset(t,o);return a==="string"?e.slice(h,h+i):e.subarray(h,h+i)}let l=a==="string"?R.fromUint8ToStringArray(e):e,c=Le(r,a,l),u=Le(n,a);for(let h=0;hf+t[m]);u.set(c.get(...p),...d)}return a==="string"?R.fromStringArrayToUint8(u.values):u.values}function mi(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{begin:s,size:i}=r;be(a,"slice");let[o,l]=sn.parseSliceParams(a,s,i);sn.assertParamsValid(a,o,l);let c=n.data.get(a.dataId).values,u=Zd(c,o,l,a.shape,a.dtype);return n.makeTensorInfo(l,a.dtype,u)}var jR={kernelName:Lo,backendName:"cpu",kernelFunc:mi},cw=Et((e,t)=>{let n=e-t;return n*n}),HR=jt(Xs,cw),GR={kernelName:Xs,backendName:"cpu",kernelFunc:HR};function hw(e,t,n,r){let a=Le(e,t.dtype);for(let s=0;se-t),qR=Dm((e,t,n,r)=>({real:e-n,imag:t-r})),zm=jt(Ks,dw,qR),XR={kernelName:Ks,backendName:"cpu",kernelFunc:zm};function pw(e,t){let n=new Array(e.rank);for(let a=0;aw.value-g.value);let m=h*r,A=l.subarray(m,m+r),y=c.subarray(m,m+r);for(let g=0;g{for(let A=0;Anew Kd,1);var gw=at(lo,e=>e>=0?e:Math.exp(e)-1),KR={kernelName:lo,backendName:"cpu",kernelFunc:gw};function xw(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{alpha:s}=r;be([a],"leakyRelu");let i=v.sizeFromShape(a.shape),o=n.data.get(a.dataId).values,l=v.getTypedArrayFromDType("float32",i);for(let c=0;ce<0?t*e:e);function ww(e){let{inputs:t,backend:n}=e,{x:r,alpha:a}=t;be([r,a],"prelu");let s=n.data.get(r.dataId).values,i=n.data.get(a.dataId).values,[o,l]=YR(r.shape,a.shape,s,i,r.dtype);return n.makeTensorInfo(l,r.dtype,o)}var JR={kernelName:Os,backendName:"cpu",kernelFunc:ww},bw=at(zs,e=>Math.max(0,e)),QR={kernelName:zs,backendName:"cpu",kernelFunc:bw},_w=at(Ls,e=>Math.min(Math.max(0,e),6)),eM={kernelName:Ls,backendName:"cpu",kernelFunc:_w};function Pm(e,t,n,r,a){if(n==="linear")return Pr({inputs:{x:t},backend:e});if(n==="relu")return bw({inputs:{x:t},backend:e});if(n==="elu")return gw({inputs:{x:t},backend:e});if(n==="relu6")return _w({inputs:{x:t},backend:e});if(n==="prelu")return ww({inputs:{x:t,alpha:r},backend:e});if(n==="leakyrelu")return xw({inputs:{x:t},backend:e,attrs:{alpha:a}});throw new Error(`Activation ${n} has not been implemented for the CPU backend.`)}function mt(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{shape:s}=r,i=v.sizeFromShape(a.shape),o=v.inferFromImplicitShape(s,i),l=v.sizeFromShape(o);v.assert(i===l,()=>`The new shape (${o}) has ${l} elements and the old shape (${a.shape}) has ${i} elements. The new shape and old shape must have the same number of elements.`),n.incRef(a.dataId);let c=n.data.get(a.dataId);if(c.complexTensorInfos!=null){let u=c.complexTensorInfos.real,h=c.complexTensorInfos.imag;u.shape=o,h.shape=o}return{dataId:a.dataId,shape:o,dtype:a.dtype}}var tM={kernelName:Do,backendName:"cpu",kernelFunc:mt};function vw(e){let{inputs:t,backend:n,attrs:r}=e,{a,b:s}=t,{transposeA:i,transposeB:o}=r;be([a,s],"matMul");let l=a.shape.length,c=s.shape.length,u=i?a.shape[l-2]:a.shape[l-1],h=o?s.shape[c-1]:s.shape[c-2],d=i?a.shape[l-1]:a.shape[l-2],p=o?s.shape[c-2]:s.shape[c-1],f=a.shape.slice(0,-2),m=s.shape.slice(0,-2),A=v.sizeFromShape(f),y=v.sizeFromShape(m),g=A===y||A===1||y===1;v.assert(l>=2&&c>=2&&g,()=>`Error in matMul: the input batch dimensions must either be the same or at least one input batch dimension must be 1. Got input batch dimensions of (${f}) and (${m}).`);let w=(A>y?a.shape.slice(0,-2):s.shape.slice(0,-2)).concat([d,p]);v.assert(u===h,()=>`Error in matMul: inner shapes (${u}) and (${h}) of Tensors with shapes ${a.shape} and ${s.shape} and transposeA=${i} and transposeB=${o} must match.`);let b=i?[A,u,d]:[A,d,u],_=o?[y,p,h]:[y,h,p],x=mt({inputs:{x:a},backend:n,attrs:{shape:b}}),N=mt({inputs:{x:s},backend:n,attrs:{shape:_}}),T=i?x.shape[1]:x.shape[2],C=i?x.shape[2]:x.shape[1],F=o?N.shape[1]:N.shape[2],O=Math.max(A,y),W=n.data.get(x.dataId).values,V=n.data.get(N.dataId).values,U=v.computeStrides(x.shape),j=v.computeStrides(N.shape),[X,G,ee]=i?[U[0],1,U[1]]:[U[0],U[1],1],[Y,ae,te]=o?[1,j[1],j[0]]:[j[1],1,j[0]],oe=C*F,Q=Le([O,C,F],x.dtype),he=Q.values,le=n.blockSize;for(let fe=0;feMath.acos(e)),iM={kernelName:Yi,backendName:"cpu",kernelFunc:sM},oM=at(Ji,e=>Math.acosh(e)),lM={kernelName:Ji,backendName:"cpu",kernelFunc:oM};function uM(e){let{inputs:t,backend:n}=e,r=t;be(t,"addN");let a=r.map(o=>n.data.get(o.dataId).values),s=Le(r[0].shape,r[0].dtype),i=s.values;for(let o=0;og&&(g=_,w=b)}p[A]=w}return c.forEach(A=>n.disposeIntermediateTensorInfo(A)),n.makeTensorInfo(u,"int32",p)}var AM={kernelName:os,backendName:"cpu",kernelFunc:mM};function yM(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{axis:s}=r;be(a,"argMin");let i=v.parseAxisParam(s,a.shape),o=R.getAxesPermutation(i,a.shape.length),l=a,c=[];o!=null&&(l=ir({inputs:{x:a},backend:n,attrs:{perm:o}}),c.push(l),i=R.getInnerMostAxes(i.length,l.shape.length)),i=[i[0]],R.assertAxesAreInnerMostDims("argMin",i,l.shape.length);let[u,h]=R.computeOutAndReduceShapes(l.shape,i),d=v.sizeFromShape(u),p=v.makeZerosTypedArray(d,"int32"),f=v.sizeFromShape(h),m=n.data.get(l.dataId).values;for(let A=0;An.disposeIntermediateTensorInfo(A)),n.makeTensorInfo(u,"int32",p)}var gM={kernelName:uu,backendName:"cpu",kernelFunc:yM},xM=at(Qi,e=>Math.asin(e)),wM={kernelName:Qi,backendName:"cpu",kernelFunc:xM},bM=at(eo,e=>Math.asinh(e)),_M={kernelName:eo,backendName:"cpu",kernelFunc:bM},vM=at(to,e=>Math.atan(e)),kM={kernelName:to,backendName:"cpu",kernelFunc:vM},IM=Et((e,t)=>Math.atan2(e,t)),NM=jt(ro,IM),SM={kernelName:ro,backendName:"cpu",kernelFunc:NM},TM=at(no,e=>Math.atanh(e)),CM={kernelName:no,backendName:"cpu",kernelFunc:TM};function Lm(e,t,n,r,a,s){let i=a.strideHeight,o=a.strideWidth,l=a.dilationHeight,c=a.dilationWidth,u=a.effectiveFilterHeight,h=a.effectiveFilterWidth,d=a.padInfo.top,p=a.padInfo.left,f=s==="max"?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY,m=Le(a.outShape,n),A=m.values,y=a.outShape[1]*a.outShape[2]*a.outShape[3],g=a.outShape[2]*a.outShape[3],w=a.outShape[3];for(let b=0;bG?G=le:s==="avg"&&(ee+=le,Y++)}if(isNaN(G))break}let ae=W+V*w+N;A[ae]=s==="avg"?ee/Y:G}}}return m}function kw(e,t,n,r,a=!1,s=!1){let i=Le(r.outShape,"int32"),o=r.strideHeight,l=r.strideWidth,c=r.dilationHeight,u=r.dilationWidth,h=r.effectiveFilterHeight,d=r.effectiveFilterWidth,p=r.padInfo.top,f=r.padInfo.left,m=Le(t,n,e);for(let A=0;AF&&(F=X,a?O=s?((A*r.inHeight+W)*r.inWidth+U)*r.inChannels+y:(W*r.inWidth+U)*r.inChannels+y:O=V*d+j)}}i.set(O,A,g,x,y)}}return i}function Iw(e,t,n,r,a,s){let i=a.strideDepth,o=a.strideHeight,l=a.strideWidth,c=a.dilationDepth,u=a.dilationHeight,h=a.dilationWidth,d=a.effectiveFilterDepth,p=a.effectiveFilterHeight,f=a.effectiveFilterWidth,m=a.padInfo.front,A=a.padInfo.top,y=a.padInfo.left,g=s==="max"?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY,w=Le(a.outShape,n),b=w.values,_=a.outShape[1]*a.outShape[2]*a.outShape[3]*a.outShape[4],x=a.outShape[2]*a.outShape[3]*a.outShape[4],N=a.outShape[3]*a.outShape[4],T=a.outShape[4];for(let C=0;Cve?ve=We:s==="avg"&&(Se+=We,Me++),isNaN(ve))break}if(isNaN(ve))break}if(isNaN(ve))break}let De=pe+W;b[De]=s==="avg"?Se/Me:ve}}}}return w}function EM(e,t){let n=Le(t.outShape,"int32"),r=t.strideDepth,a=t.strideHeight,s=t.strideWidth,i=t.dilationDepth,o=t.dilationHeight,l=t.dilationWidth,c=t.effectiveFilterDepth,u=t.effectiveFilterHeight,h=t.effectiveFilterWidth,d=t.padInfo.front,p=t.padInfo.top,f=t.padInfo.left;for(let m=0;m=V&&(V=te,U=X*u*h+ee*u+ae)}}}n.set(U,m,y,_,C,A)}}}return n}function RM(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t;be(a,"avgPool");let{filterSize:s,strides:i,pad:o,dimRoundingMode:l}=r,c=1;v.assert(R.eitherStridesOrDilationsAreOne(i,c),()=>`Error in avgPool: Either strides or dilations must be 1. Got strides ${i} and dilations '${c}'`);let u=R.computePool2DInfo(a.shape,s,i,c,o,l),h;if(u.filterWidth===1&&u.filterHeight===1&&v.arraysEqual(u.inShape,u.outShape))h=Pr({inputs:{x:a},backend:n});else{let d=n.data.get(a.dataId).values,p=v.computeStrides(a.shape),f=Lm(d,a.shape,a.dtype,p,u,"avg");h=n.makeTensorInfo(u.outShape,a.dtype,f.values)}return h}var MM={kernelName:ls,backendName:"cpu",kernelFunc:RM};function FM(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{filterSize:s,strides:i,pad:o,dimRoundingMode:l,dataFormat:c}=r;be(a,"avgPool3d");let u=R.computePool3DInfo(a.shape,s,i,1,o,l,c),h=n.data.get(a.dataId).values,d=Iw(h,a.shape,a.dtype,v.computeStrides(a.shape),u,"avg");return n.makeTensorInfo(d.shape,"float32",d.values)}var $M={kernelName:cu,backendName:"cpu",kernelFunc:FM};function DM(e){let{inputs:t,backend:n,attrs:r}=e,{dy:a,input:s}=t,{filterSize:i,strides:o,pad:l,dimRoundingMode:c}=r;be([a,s],"avgPool3DGrad");let u=R.computePool3DInfo(s.shape,i,o,1,l,c),h=u.strideDepth,d=u.strideHeight,p=u.strideWidth,f=u.filterDepth,m=u.filterHeight,A=u.filterWidth,y=u.dilationDepth,g=u.dilationHeight,w=u.dilationWidth,b=u.effectiveFilterDepth,_=u.effectiveFilterHeight,x=u.effectiveFilterWidth,N=b-1-u.padInfo.front,T=x-1-u.padInfo.left,C=_-1-u.padInfo.top,F=Le(s.shape,"float32"),O=1/(f*m*A),W=n.bufferSync(a);for(let V=0;V=u.outDepth||Math.floor(Q)!==Q))for(let he=0;he<_;he+=g){let le=(Y+he)/d;if(!(le<0||le>=u.outHeight||Math.floor(le)!==le))for(let fe=0;fe=u.outWidth||Math.floor(pe)!==pe||(te+=W.get(V,Q,le,pe,U))}}}F.set(te*O,V,j,X,G,U)}return n.makeTensorInfo(F.shape,F.dtype,F.values)}var OM={kernelName:Ih,backendName:"cpu",kernelFunc:DM};function zM(e){let{inputs:t,backend:n,attrs:r}=e,{dy:a,input:s}=t,i=s;be([a,s],"avgPoolGrad");let{filterSize:o,strides:l,pad:c}=r,u=R.computePool2DInfo(i.shape,o,l,1,c),h=u.strideHeight,d=u.strideWidth,p=u.filterHeight,f=u.filterWidth,m=u.dilationHeight,A=u.dilationWidth,y=u.effectiveFilterHeight,g=u.effectiveFilterWidth,w=g-1-u.padInfo.left,b=y-1-u.padInfo.top,_=Le(i.shape,"float32"),x=1/(p*f),N=n.data.get(a.dataId).values,T=Le(a.shape,"float32",N);for(let C=0;C=u.outHeight||Math.floor(G)!==G))for(let ee=0;ee=u.outWidth||Math.floor(Y)!==Y||(j+=T.get(C,G,Y,F))}}_.set(j*x,C,O,W,F)}return n.makeTensorInfo(_.shape,_.dtype,_.values)}var PM={kernelName:kh,backendName:"cpu",kernelFunc:zM};function LM(e){let{inputs:t,backend:n,attrs:r}=e,{x:a,scale:s,offset:i,mean:o,variance:l}=t;v.assert(o.shape.length===l.shape.length,()=>"Batch normalization gradient requires mean and variance to have equal ranks."),v.assert(i==null||o.shape.length===i.shape.length,()=>"Batch normalization gradient requires mean and offset to have equal ranks."),v.assert(s==null||o.shape.length===s.shape.length,()=>"Batch normalization gradient requires mean and scale to have equal ranks."),be([a,o,l,s,i],"batchNorm");let{varianceEpsilon:c}=r;c==null&&(c=.001);let u=n.data.get(a.dataId).values,h=n.data.get(o.dataId).values,d=n.data.get(l.dataId).values,p=s?n.data.get(s.dataId).values:new Float32Array([1]),f=i?n.data.get(i.dataId).values:new Float32Array([0]),m=new Float32Array(u.length),A=f.length,y=p.length,g=d.length,w=h.length,b=0,_=0,x=0,N=0;for(let T=0;T=A&&(b=0),_>=w&&(_=0),x>=y&&(x=0),N>=g&&(N=0);return n.makeTensorInfo(a.shape,a.dtype,m)}var WM={kernelName:bs,backendName:"cpu",kernelFunc:LM};function BM(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{blockShape:s,crops:i}=r;be([a],"batchToSpaceND");let o=s.reduce((y,g)=>y*g),l=R.getReshaped(a.shape,s,o),c=R.getPermuted(l.length,s.length),u=R.getReshapedPermuted(a.shape,s,o),h=R.getSliceBeginCoords(i,s.length),d=R.getSliceSize(u,i,s.length),p=mt({inputs:{x:a},backend:n,attrs:{shape:l}}),f=ir({inputs:{x:p},backend:n,attrs:{perm:c}}),m=mt({inputs:{x:f},backend:n,attrs:{shape:u}}),A=mi({inputs:{x:m},backend:n,attrs:{begin:h,size:d}});return n.disposeIntermediateTensorInfo(p),n.disposeIntermediateTensorInfo(f),n.disposeIntermediateTensorInfo(m),A}var VM={kernelName:hu,backendName:"cpu",kernelFunc:BM};function UM(e){let{inputs:t,backend:n,attrs:r}=e,{x:a,weights:s}=t,{size:i}=r,o=n.data.get(a.dataId).values,l=n.data.get(s.dataId).values,c=Em(o,l,s.dtype,s.shape,i);return n.makeTensorInfo([i],s.dtype,c)}var jM={kernelName:Nh,backendName:"cpu",kernelFunc:UM},HM=at(va,(e,t)=>{let n=t;return e>n.clipValueMax?n.clipValueMax:e{let{x:t}=e.inputs,n=e.backend,r=new Float32Array(v.sizeFromShape(t.shape)),a=n.data.get(t.dataId),s=a.complexTensorInfos.real,i=a.complexTensorInfos.imag,o=n.data.get(s.dataId).values,l=n.data.get(i.dataId).values;for(let c=0;cm.shape),s);if(v.sizeFromShape(i)===0)return n.makeTensorInfo(i,t[0].dtype,[]);let o=t.filter(m=>v.sizeFromShape(m.shape)>0);if(o.length===1)return Pr({inputs:{x:o[0]},backend:n});let l=o.map(m=>m.shape);if(R.assertParamsConsistent(l,s),o[0].dtype==="complex64"){let m=o.map(b=>fi({inputs:{input:b},backend:n})),A=o.map(b=>bl({inputs:{input:b},backend:n})),y=_l({inputs:m,backend:n,attrs:{axis:s}}),g=_l({inputs:A,backend:n,attrs:{axis:s}}),w=Fn({inputs:{real:y,imag:g},backend:n});return m.forEach(b=>n.disposeIntermediateTensorInfo(b)),A.forEach(b=>n.disposeIntermediateTensorInfo(b)),n.disposeIntermediateTensorInfo(y),n.disposeIntermediateTensorInfo(g),w}let c=o.map(m=>{let A=v.sizeFromShape(m.shape.slice(s));return mt({inputs:{x:m},backend:n,attrs:{shape:[-1,A]}})}),u=c.map(m=>({vals:n.data.get(m.dataId).values,shape:m.shape}));i=R.computeOutShape(c.map(m=>m.shape),1);let h=c[0].shape[0]===1,d=Rm(u,i,t[0].dtype,h),p=R.computeOutShape(o.map(m=>m.shape),s),f=n.makeTensorInfo(p,t[0].dtype,d);return c.forEach(m=>n.disposeIntermediateTensorInfo(m)),f}var ZM={kernelName:ao,backendName:"cpu",kernelFunc:_l};function Nw(e){let{inputs:t,backend:n,attrs:r}=e,{x:a,filter:s}=t,{strides:i,pad:o,dataFormat:l,dilations:c,dimRoundingMode:u}=r;be([a,s],"conv2d");let h=R.convertConv2DDataFormat(l),d=R.computeConv2DInfo(a.shape,s.shape,i,c,o,u,!1,h),p=d.filterHeight,f=d.filterWidth,m=d.dilationHeight,A=d.dilationWidth,y=d.padInfo.left,g=d.padInfo.top,w=d.dataFormat==="channelsLast",b=new $t(d.outShape,a.dtype),_=v.computeStrides(a.shape),x=v.computeStrides(s.shape),N=_[0],T=w?_[1]:_[2],C=w?_[2]:1,F=w?1:_[1],O=b.strides[0],W=w?b.strides[1]:b.strides[2],V=w?b.strides[2]:1,U=w?1:b.strides[1],j=n.data.get(a.dataId).values,X=n.data.get(s.dataId).values,G=b.values;for(let ee=0;ee=d.inHeight)continue;let fe=he*x[0],pe=Y+le*T;for(let ve=0;ve=d.inWidth)continue;let Qe=fe+De*x[1],et=pe+Fe*C,st=Qe;for(let Ke=0;Ke=c.inDepth)continue;let ee=X*C[0],Y=O+G*T[1];for(let ae=0;ae=c.inHeight)continue;let le=ee+Q*C[1],fe=Y+he*T[2];for(let pe=0;pe=c.inWidth)continue;let Fe=le+Me*C[2],Qe=fe+De*c.inChannels,et=Fe;for(let st=0;stMath.cos(e)),uF={kernelName:fs,backendName:"cpu",kernelFunc:lF},cF=at(so,e=>Math.cosh(e)),hF={kernelName:so,backendName:"cpu",kernelFunc:cF};function dF(e){let{inputs:t,backend:n,attrs:r}=e,{image:a,boxes:s,boxInd:i}=t,{cropSize:o,method:l,extrapolationValue:c}=r,[u,h,d,p]=a.shape,f=s.shape[0],[m,A]=o,y=Le([f,m,A,p],"float32"),g=n.data.get(s.dataId).values,w=n.data.get(i.dataId).values,b=n.data.get(a.dataId).values,_=v.computeStrides(a.shape),x=v.computeStrides(y.shape);for(let N=0;N=u)continue;let U=m>1?(O-C)*(h-1)/(m-1):0,j=A>1?(W-F)*(d-1)/(A-1):0;for(let X=0;X1?C*(h-1)+X*U:.5*(C+O)*(h-1);if(G<0||G>h-1){for(let ee=0;ee1?F*(d-1)+te*j:.5*(F+W)*(d-1);if(oe<0||oe>d-1){for(let fe=0;fe1?F*(d-1)+ee*j:.5*(F+W)*(d-1);if(Y<0||Y>d-1){for(let oe=0;oey+f-g-1:(y,g)=>y+g;for(let y=0;y`Only NHWC dataFormat supported on CPU for depthToSpace. Got ${i}`),v.assert(s>1,()=>`blockSize should be > 1 for depthToSpace, but was: ${s}`);let o=a.shape[0],l=a.shape[1],c=a.shape[2],u=a.shape[3],h=l*s,d=c*s,p=u/(s*s),f=n.data.get(a.dataId).values,m=new Float32Array(o*h*d*p),A=0;for(let y=0;y`Error in depthwiseConv2d: Either strides or dilations must be 1. Got strides ${i} and dilations '${d}'`);let p=R.computeConv2DInfo(a.shape,s.shape,i,d,o,c,!0),{filterHeight:f,filterWidth:m,dilationHeight:A,dilationWidth:y,padInfo:g}=p,w=g.left,b=g.top,_=p.outChannels/p.inChannels,x=new $t(p.outShape,a.dtype),N=n.data.get(a.dataId).values,T=n.data.get(s.dataId).values,C=x.values;for(let F=0;F=p.inHeight)continue;let ee=X*h[0],Y=O+G*u[1];for(let ae=0;ae=p.inWidth)continue;let le=ee+Q*h[1],fe=Y+he*p.inChannels,pe=te,ve=le;for(let Se=0;Se{let{x:r,filter:a}=e,{strides:s,pad:i,dilations:o}=n,l=t,c=l.data.get(r.dataId).values,u=r.shape.length,h=l.data.get(a.dataId).values,d=a.shape.length,{batchSize:p,inHeight:f,inWidth:m,inChannels:A,outHeight:y,outWidth:g,padInfo:w,strideHeight:b,strideWidth:_,filterHeight:x,filterWidth:N,dilationHeight:T,dilationWidth:C,outShape:F}=R.computeDilation2DInfo(r.shape,a.shape,s,i,"NHWC",o),O=v.sizeFromShape(F),W=F.length,V=v.getArrayFromDType(r.dtype,O);for(let U=0;U=0&&Q=0&&leae&&(ae=ve)}}}let te=v.locToIndex([U,j,G,Y],W,v.computeStrides(F));V[te]=ae}}}return{dataId:l.write(v.toTypedArray(V,r.dtype),F,r.dtype),shape:F,dtype:r.dtype}}},TF={kernelName:Oh,backendName:"cpu",kernelFunc:({inputs:e,backend:t,attrs:n})=>{let{x:r,filter:a,dy:s}=e,{strides:i,pad:o,dilations:l}=n,c=t,u=v.toNestedArray(r.shape,c.data.get(r.dataId).values),h=v.toNestedArray(a.shape,c.data.get(a.dataId).values),{batchSize:d,inHeight:p,inWidth:f,inChannels:m,outHeight:A,outWidth:y,padInfo:g,strideHeight:w,strideWidth:b,filterHeight:_,filterWidth:x,dilationHeight:N,dilationWidth:T,outShape:C}=R.computeDilation2DInfo(r.shape,a.shape,i,o,"NHWC",l);v.assert(s.rank===C.length,()=>`Error in ${Oh}, dy must have the same rank as output ${C.length}, but got ${s.rank}`);let F=v.toNestedArray(C,c.data.get(s.dataId).values),O=v.makeZerosNestedTypedArray(a.shape,a.dtype);for(let W=0;W=0&&oe=0&&heee&&(ee=le,Y=te,ae=Q)}}}O[Y][ae][G]+=F[W][V][j][G]}}}return{dataId:c.write(v.toTypedArray(O,r.dtype),a.shape,a.dtype),shape:a.shape,dtype:a.dtype}}},CF={kernelName:Dh,backendName:"cpu",kernelFunc:({inputs:e,backend:t,attrs:n})=>{let{x:r,filter:a,dy:s}=e,{strides:i,pad:o,dilations:l}=n,c=t,u=v.toNestedArray(r.shape,c.data.get(r.dataId).values),h=v.toNestedArray(a.shape,c.data.get(a.dataId).values),{batchSize:d,inHeight:p,inWidth:f,inChannels:m,outHeight:A,outWidth:y,padInfo:g,strideHeight:w,strideWidth:b,filterHeight:_,filterWidth:x,dilationHeight:N,dilationWidth:T,outShape:C}=R.computeDilation2DInfo(r.shape,a.shape,i,o,"NHWC",l);v.assert(s.rank===C.length,()=>`Error in ${Dh}, dy must have the same rank as output ${C.length}, but got ${s.rank}`);let F=v.toNestedArray(C,c.data.get(s.dataId).values),O=v.makeZerosNestedTypedArray(r.shape,r.dtype);for(let W=0;W=0&&oe=0&&heee&&(ee=le,Y=oe,ae=he)}}}O[W][Y][ae][G]+=F[W][V][j][G]}}}return{dataId:c.write(v.toTypedArray(O,r.dtype),r.shape,r.dtype),shape:r.shape,dtype:r.dtype}}};function EF(e){let{inputs:t,backend:n}=e,{dy:r,y:a}=t;be([r,a],"eluGrad");let s=new Float32Array(v.sizeFromShape(a.shape)),i=n.data.get(a.dataId).values,o=n.data.get(r.dataId).values;for(let l=0;l=1?s[l]=o[l]:s[l]=o[l]*(c+1)}return n.makeTensorInfo(a.shape,"float32",s)}var RF={kernelName:zh,backendName:"cpu",kernelFunc:EF},MF=Et((e,t)=>e===t?1:0),Tw=jt(co,MF,null,"bool"),FF={kernelName:co,backendName:"cpu",kernelFunc:Tw},$F=R.ERF_P,DF=R.ERF_A1,OF=R.ERF_A2,zF=R.ERF_A3,PF=R.ERF_A4,LF=R.ERF_A5,WF=at(uo,e=>{let t=Math.sign(e),n=Math.abs(e),r=1/(1+$F*n);return t*(1-((((LF*r+PF)*r+zF)*r+OF)*r+DF)*r*Math.exp(-n*n))}),BF={kernelName:uo,backendName:"cpu",kernelFunc:WF};function Jd(e){let{inputs:t,backend:n,attrs:r}=e,{input:a}=t,{dim:s}=r,i=a.shape.length,o=a.shape.slice(),l=s;return s<0&&(v.assert(-(i+1)<=s,()=>`Axis must be in the interval [${-(i+1)}, ${i}]`),l=i+s+1),o.splice(l,0,1),mt({inputs:{x:a},backend:n,attrs:{shape:o}})}var VF={kernelName:ho,backendName:"cpu",kernelFunc:Jd},UF=Et((e,t)=>e/t),Wm=jt(ys,UF),Bm={kernelName:ys,backendName:"cpu",kernelFunc:Wm};function Cw(e,t,n){let r=e.shape,a=r[0],s=r[1],i=n.data.get(e.dataId),o=i.complexTensorInfos.real,l=i.complexTensorInfos.imag,c=[a,s],u=v.sizeFromShape(c),h=v.getTypedArrayFromDType("float32",u),d=v.getTypedArrayFromDType("float32",u);for(let A=0;A{let{image:r}=e,a=n,s=v.getTypedArrayFromDType(r.dtype,v.sizeFromShape(r.shape)),[i,o,l,c]=r.shape,u=a.data.get(r.dataId).values;for(let h=0;h=0&&wMath.floor(e/t)),QF=jt(ws,JF,null,"int32"),e$={kernelName:ws,backendName:"cpu",kernelFunc:QF};function t$(e){let{inputs:t,backend:n,attrs:r}=e,{x:a,filter:s,bias:i,preluActivationWeights:o}=t,{strides:l,pad:c,dataFormat:u,dilations:h,dimRoundingMode:d,activation:p,leakyreluAlpha:f}=r,m=Nw({inputs:{x:a,filter:s},backend:n,attrs:{strides:l,pad:c,dataFormat:u,dilations:h,dimRoundingMode:d}});if(i){let A=m;m=nc({inputs:{a:m,b:i},backend:n}),n.disposeIntermediateTensorInfo(A)}if(p){let A=m;m=Pm(n,m,p,o,f),n.disposeIntermediateTensorInfo(A)}return m}var n$={kernelName:Qs,backendName:"cpu",kernelFunc:t$};function r$(e){let{inputs:t,backend:n,attrs:r}=e,{x:a,filter:s,bias:i,preluActivationWeights:o}=t,{strides:l,pad:c,dataFormat:u,dilations:h,dimRoundingMode:d,activation:p,leakyreluAlpha:f}=r,m=Sw({inputs:{x:a,filter:s},backend:n,attrs:{strides:l,pad:c,dataFormat:u,dilations:h,dimRoundingMode:d}});if(i){let A=m;m=nc({inputs:{a:m,b:i},backend:n}),n.disposeIntermediateTensorInfo(A)}if(p){let A=m;m=Pm(n,m,p,o,f),n.disposeIntermediateTensorInfo(A)}return m}var a$={kernelName:ei,backendName:"cpu",kernelFunc:r$};function s$(e){let{inputs:t,backend:n}=e,{params:r,indices:a}=t,s=v.sizeFromShape(r.shape),i=a.shape,o=i[i.length-1],[l,c,u,h]=R.prepareAndValidate(r,a);if(c===0)return n.makeTensorInfo(l,r.dtype,[]);let d=Le([c,u],r.dtype),p=n.data.get(a.dataId).values,f=n.data.get(r.dataId).values;for(let m=0;m=s/u)throw new Error(`Invalid indices: ${A} does not index into ${r.shape}`);for(let g=0;ge>=t?1:0),c$=jt(_s,u$,null,"bool"),h$={kernelName:_s,backendName:"cpu",kernelFunc:c$};function d$(e){let{inputs:t,backend:n}=e,{input:r}=t,a=v.sizeFromShape(r.shape),s=r.shape[r.shape.length-1],i=a/s,o=mt({inputs:{x:r},backend:n,attrs:{shape:[i,s]}}),l=Cw(o,!0,n),c=mt({inputs:{x:l},backend:n,attrs:{shape:r.shape}});return n.disposeIntermediateTensorInfo(o),n.disposeIntermediateTensorInfo(l),c}var p$={kernelName:Lh,backendName:"cpu",kernelFunc:d$},f$=at(go,e=>Number.isFinite(e)?1:0,"bool"),m$={kernelName:go,backendName:"cpu",kernelFunc:f$},A$=at(xo,e=>Math.abs(e)===Infinity?1:0,"bool"),y$={kernelName:xo,backendName:"cpu",kernelFunc:A$},g$=at(wo,e=>Number.isNaN(e)?1:0,"bool"),x$={kernelName:wo,backendName:"cpu",kernelFunc:g$},w$=Et((e,t)=>e<=t?1:0),b$=jt(_o,w$,null,"bool"),_$={kernelName:_o,backendName:"cpu",kernelFunc:b$};function v$(e){let{backend:t,attrs:n}=e,{start:r,stop:a,num:s}=n,i=tw(r,a,s);return t.makeTensorInfo([i.length],"float32",i)}var k$={kernelName:Bh,backendName:"cpu",kernelFunc:v$},I$=at(vo,e=>Math.log1p(e)),N$={kernelName:vo,backendName:"cpu",kernelFunc:I$},S$=Et((e,t)=>e&&t),T$=jt(ko,S$,null,"bool"),C$={kernelName:ko,backendName:"cpu",kernelFunc:T$},E$=at(Au,e=>e?0:1,"bool"),R$={kernelName:Au,backendName:"cpu",kernelFunc:E$},M$=Et((e,t)=>e||t),F$=jt(yu,M$,null,"bool"),$$={kernelName:yu,backendName:"cpu",kernelFunc:F$};function D$(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{depthRadius:s,bias:i,alpha:o,beta:l}=r;be(a,"LRN");let c=a.shape[3],u=c-1,h=n.data.get(a.dataId).values,d=v.sizeFromShape(a.shape),p=new Float32Array(d);function f(m){let A=m%c,y=m-A+Math.max(0,A-s),g=m-A+Math.min(A+s,u),w=0;for(;y<=g;y++){let b=h[y];w+=b*b}return w}for(let m=0;m`Error in maxPool: Either strides or dilations must be 1. Got strides ${i} and dilations '${c}'`);let u=R.computePool2DInfo(a.shape,s,i,c,o,l),h;if(u.filterWidth===1&&u.filterHeight===1&&v.arraysEqual(u.inShape,u.outShape))h=Pr({inputs:{x:a},backend:n});else{let d=n.data.get(a.dataId).values,p=v.computeStrides(a.shape),f=Lm(d,a.shape,a.dtype,p,u,"max");h=n.makeTensorInfo(u.outShape,a.dtype,f.values)}return h}var B$={kernelName:Ts,backendName:"cpu",kernelFunc:W$};function V$(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{filterSize:s,strides:i,pad:o,dimRoundingMode:l,dataFormat:c}=r;be(a,"maxPool3d");let u=R.computePool3DInfo(a.shape,s,i,1,o,l,c),h=n.data.get(a.dataId).values,d=Iw(h,a.shape,a.dtype,v.computeStrides(a.shape),u,"max");return n.makeTensorInfo(d.shape,"float32",d.values)}var U$={kernelName:xu,backendName:"cpu",kernelFunc:V$};function j$(e){let{inputs:t,backend:n,attrs:r}=e,{dy:a,input:s}=t,{filterSize:i,strides:o,pad:l,dimRoundingMode:c}=r;be([a,s],"maxPool3DGrad");let u=R.computePool3DInfo(s.shape,i,o,1,l,c),h=n.bufferSync(s),d=EM(h,u),p=u.strideDepth,f=u.strideHeight,m=u.strideWidth,A=u.dilationDepth,y=u.dilationHeight,g=u.dilationWidth,w=u.effectiveFilterDepth,b=u.effectiveFilterHeight,_=u.effectiveFilterWidth,x=w-1-u.padInfo.front,N=_-1-u.padInfo.left,T=b-1-u.padInfo.top,C=Le(s.shape,"float32"),F=n.bufferSync(a);for(let O=0;O=u.outDepth||Math.floor(te)!==te))for(let oe=0;oe=u.outHeight||Math.floor(Q)!==Q))for(let he=0;he<_;he+=g){let le=(ee+he)/m;if(le<0||le>=u.outWidth||Math.floor(le)!==le)continue;let fe=w*b*_-1-d.get(O,te,Q,le,W),pe=ae*b*_+oe*_+he,ve=fe===pe?1:0;ve!==0&&(Y+=F.get(O,te,Q,le,W)*ve)}}}C.set(Y,O,V,U,j,W)}return n.makeTensorInfo(C.shape,C.dtype,C.values)}var H$={kernelName:jh,backendName:"cpu",kernelFunc:j$};function G$(e){let{inputs:t,backend:n,attrs:r}=e,{dy:a,input:s,output:i}=t,o=s;be([s,i],"maxPoolGrad");let{filterSize:l,strides:c,pad:u,dimRoundingMode:h}=r,d=R.computePool2DInfo(o.shape,l,c,1,u,h),p=n.data.get(o.dataId).values,f=Le(d.outShape,o.dtype,kw(p,o.shape,o.dtype,d).values),m=d.strideHeight,A=d.strideWidth,y=d.dilationHeight,g=d.dilationWidth,w=d.effectiveFilterHeight,b=d.effectiveFilterWidth,_=b-1-d.padInfo.left,x=w-1-d.padInfo.top,N=Le(o.shape,"float32"),T=n.data.get(a.dataId).values,C=Le(a.shape,"float32",T);for(let F=0;F=d.outHeight||Math.floor(ee)!==ee))for(let Y=0;Y=d.outWidth||Math.floor(ae)!==ae)continue;let te=w*b-1-f.get(F,ee,ae,O),oe=G*b+Y,Q=te===oe?1:0;Q!==0&&(X+=C.get(F,ee,ae,O)*Q)}}N.set(X,F,W,V,O)}return n.makeTensorInfo(N.shape,N.dtype,N.values)}var q$={kernelName:Uh,backendName:"cpu",kernelFunc:G$};function X$(e,t,n,r,a){let s=v.computeStrides(t),i=Lm(e,t,n,s,a,"max"),o=kw(e,t,n,a,!0,r);return[i.values,o.values]}var K$={kernelName:Hh,backendName:"cpu",kernelFunc:({inputs:e,attrs:t,backend:n})=>{let{x:r}=e,{filterSize:a,strides:s,pad:i,includeBatchInIndex:o}=t,l=n;be(r,"MaxPoolWithArgmax");let c=l.data.get(r.dataId).values,u=R.computePool2DInfo(r.shape,a,s,[1,1],i),[h,d]=X$(c,r.shape,r.dtype,o,u),p=l.write(h,u.outShape,r.dtype),f=l.write(d,u.outShape,r.dtype);return[{dataId:p,shape:u.outShape,dtype:r.dtype},{dataId:f,shape:u.outShape,dtype:"int32"}]}};function Qd(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{axis:s,keepDims:i}=r;be(a,"sum");let o;a.dtype==="bool"?o=za({inputs:{x:a},backend:n,attrs:{dtype:"int32"}}):o=Pr({inputs:{x:a},backend:n});let l=o.shape.length,c=v.parseAxisParam(s,o.shape),u=R.getAxesPermutation(c,l),h=c,d=o;u!=null&&(d=ir({inputs:{x:o},backend:n,attrs:{perm:u}}),h=R.getInnerMostAxes(h.length,l)),R.assertAxesAreInnerMostDims("sum",h,d.shape.length);let[p,f]=R.computeOutAndReduceShapes(d.shape,h),m=R.upcastType(d.dtype,"int32"),A=Yd(n,p,m),y=v.sizeFromShape(f),g=n.data.get(A.dataId).values,w=n.data.get(d.dataId).values;for(let b=0;bn.disposeIntermediateTensorInfo(m)),f}var J$={kernelName:Cs,backendName:"cpu",kernelFunc:Y$};function Q$(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{axis:s,keepDims:i}=r;be(a,"min");let o=v.parseAxisParam(s,a.shape),l=o,c=R.getAxesPermutation(l,a.shape.length),u=a;c!=null&&(u=ir({inputs:{x:a},backend:n,attrs:{perm:c}}),l=R.getInnerMostAxes(l.length,a.shape.length)),R.assertAxesAreInnerMostDims("min",l,u.shape.length);let[h,d]=R.computeOutAndReduceShapes(u.shape,l),p=v.sizeFromShape(d),f=v.makeZerosTypedArray(v.sizeFromShape(h),u.dtype),m=n.data.get(u.dataId).values;for(let y=0;yg[0]+a.shape[w]+g[1]),l=s.map(g=>g[0]),c=s.map((g,w)=>g[0]+a.shape[w]),u=i==="reflect"?0:1,h=n.data.get(a.dataId).values,d=a.shape.length,p=v.computeStrides(a.shape),f=v.sizeFromShape(o),m=o.length,A=v.computeStrides(o),y=v.getTypedArrayFromDType(a.dtype,f);for(let g=0;g=c[_]&&(w[_]=(c[_]-1)*2-w[_]+u);w=w.map((_,x)=>_-l[x]);let b=v.locToIndex(w,d,p);y[g]=h[b]}return{dataId:n.write(y,o,a.dtype),shape:o,dtype:a.dtype}}var nD={kernelName:wu,backendName:"cpu",kernelFunc:tD},rD=Et((e,t)=>{let n=e%t;return e<0&&t<0||e>=0&&t>=0?n:(n+t)%t}),aD=jt(Io,rD),sD={kernelName:Io,backendName:"cpu",kernelFunc:aD},iD=qi(Wg());function Rw(e){let{inputs:t,backend:n,attrs:r}=e,{logits:a}=t,{dim:s}=r,i=a.shape.length,o=s;if(o===-1&&(o=i-1),o!==i-1)throw Error(`Softmax along a non-last dimension is not yet supported. Logits was rank ${i} and dim was ${o}`);let l=v.parseAxisParam([o],a.shape),c=Ew({inputs:{x:a},backend:n,attrs:{reductionIndices:l,keepDims:!1}}),u=R.expandShapeToKeepDim(c.shape,l),h=mt({inputs:{x:c},backend:n,attrs:{shape:u}}),d=zm({inputs:{a,b:h},backend:n}),p=Aw({inputs:{x:d},backend:n}),f=Qd({inputs:{x:p},backend:n,attrs:{axis:l,keepDims:!1}}),m=mt({inputs:{x:f},backend:n,attrs:{shape:u}}),A=Wm({inputs:{a:p,b:m},backend:n});return n.disposeIntermediateTensorInfo(c),n.disposeIntermediateTensorInfo(h),n.disposeIntermediateTensorInfo(d),n.disposeIntermediateTensorInfo(p),n.disposeIntermediateTensorInfo(f),n.disposeIntermediateTensorInfo(m),A}var oD={kernelName:qs,backendName:"cpu",kernelFunc:Rw};function lD(e){let{inputs:t,backend:n,attrs:r}=e,{logits:a}=t,{numSamples:s,seed:i,normalized:o}=r;be(a,"multinomial");let l=o?a:Rw({inputs:{logits:a},backend:n,attrs:{dim:-1}}),c=l.shape[0],u=l.shape[1],h=n.data.get(l.dataId).values,d=[c,s],p=v.makeZerosTypedArray(v.sizeFromShape(d),"int32");for(let f=0;f=0&&u[h]{v.assertShapesMatch(s,u.shape,"All tensors passed to stack must have matching shapes"),v.assert(i===u.dtype,()=>"All tensors passed to stack must have matching dtypes")});let o=[],l=t.map(u=>{let h=Jd({inputs:{input:u},backend:n,attrs:{dim:a}});return o.push(h),h}),c=_l({inputs:l,backend:n,attrs:{axis:a}});return o.forEach(u=>n.disposeIntermediateTensorInfo(u)),c}var vD={kernelName:Mo,backendName:"cpu",kernelFunc:Fw};function kD(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{paddings:s,constantValue:i}=r;be(a,"pad");let o=s.map((y,g)=>y[0]+a.shape[g]+y[1]),l=s.map(y=>y[0]),c=n.data.get(a.dataId).values,u=v.sizeFromShape(a.shape),h=a.shape.length,d=v.computeStrides(a.shape),p=v.sizeFromShape(o),f=o.length,m=v.computeStrides(o),A=v.getTypedArrayFromDType(a.dtype,p);i!==0&&A.fill(i);for(let y=0;yb+l[_]),w=v.locToIndex(g,f,m);A[w]=c[y]}return{dataId:n.write(A,o,a.dtype),shape:o,dtype:a.dtype}}var $w={kernelName:$s,backendName:"cpu",kernelFunc:kD},ID=Et((e,t)=>Math.pow(e,t)),ND=jt(Ds,ID),SD={kernelName:Ds,backendName:"cpu",kernelFunc:ND};function TD(e){let{backend:t,attrs:n}=e,{start:r,stop:a,dtype:s,step:i}=n,o=$m(r,a,i,s);return t.makeTensorInfo([o.length],s,o)}var CD={kernelName:bu,backendName:"cpu",kernelFunc:TD},ED=at($o,e=>1/e),RD={kernelName:$o,backendName:"cpu",kernelFunc:ED};function MD(e){let{inputs:t,backend:n,attrs:r}=e,{images:a}=t,{alignCorners:s,halfPixelCenters:i,size:o}=r;be(a,"resizeBilinear");let l=v.computeStrides(a.shape),[c,u]=o,[h,d,p,f]=a.shape,m=n.data.get(a.dataId).values,A=new Float32Array(v.sizeFromShape([h,c,u,f])),y=[s&&c>1?d-1:d,s&&u>1?p-1:p],g=[s&&c>1?c-1:c,s&&u>1?u-1:u],w=0,b=y[0]/g[0],_=y[1]/g[1];for(let x=0;x1?c-1:c,i&&p>1?u-1:u],A=[i&&d>1?d-1:d,i&&p>1?p-1:p],y=m[0]/A[0],g=m[1]/A[1],w=n.data.get(s.dataId).values,b=0;for(let _=0;_1?d-1:d,s&&u>1?p-1:p],g=[s&&c>1?c-1:c,s&&u>1?u-1:u],w=y[0]/g[0],b=y[1]/g[1],_=0;for(let x=0;x1?u-1:u,i&&f>1?h-1:h],g=[i&&p>1?p-1:p,i&&f>1?f-1:f],w=y[0]/g[0],b=y[1]/g[1],_=1/w,x=1/b,N=Math.ceil(_)*2+2,T=Math.ceil(x)*2+2;for(let C=0;C=p)continue;let Q=F+oe*l[1],he=oe*w,le=Math.min(u-1,i?Math.round(he):Math.floor(he));if(O===le)for(let fe=0;fe=f)continue;let ve=Q+pe*l[2],Se=pe*b,Me=Math.min(h-1,i?Math.round(Se):Math.floor(Se));j===Me&&(ae+=A[ve+Y])}}m[X+Y]=ae}}}}return n.makeTensorInfo(a.shape,a.dtype,m)}var LD={kernelName:Xh,backendName:"cpu",kernelFunc:PD};function WD(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{dims:s}=r;be(a,"reverse");let i=a.shape.length,o=v.parseAxisParam(s,a.shape);if(i===0)return Pr({inputs:{x:a},backend:n});let l=new $t(a.shape,a.dtype),c=n.bufferSync(a);for(let u=0;ud[p]=a.shape[p]-1-d[p]),l.set(c.get(...d),...h)}return n.makeTensorInfo(l.shape,l.dtype,l.values)}var BD={kernelName:Ws,backendName:"cpu",kernelFunc:WD},VD={kernelName:Ko,backendName:"cpu",kernelFunc:({inputs:e,attrs:t,backend:n})=>{let{image:r}=e,{radians:a,fillValue:s,center:i}=t,o=n,l=v.getTypedArrayFromDType(r.dtype,v.sizeFromShape(r.shape)),[c,u,h,d]=r.shape,[p,f]=R.getImageCenter(i,u,h),m=255,A=Math.sin(a),y=Math.cos(a),g=o.data.get(r.dataId).values;for(let w=0;w=0&&V=0&&U{let t=Math.floor(e);return e-t<.5?Math.floor(e):e-t>.5?Math.ceil(e):t%2==0?t:t+1}),jD={kernelName:Bs,backendName:"cpu",kernelFunc:UD};function Dw(e,t,n,r,a,s,i,o,l,c){let u=[r/a,a],h=e.values,d=t.values;if(r===0)return Le(n,t.dtype);let p=Le(u,t.dtype);p.values.fill(l);for(let f=0;f=r/a)throw new Error(`Invalid indices: ${m} does not index into ${n}`);for(let y=0;y1||a.shape.length===1?1:v.sizeFromShape(a.shape.slice(1));for(let f=0;fe>=0?ZD*e:KD*(Math.exp(e)-1)),JD={kernelName:Po,backendName:"cpu",kernelFunc:YD},QD=at(js,e=>1/(1+Math.exp(-e))),eO={kernelName:js,backendName:"cpu",kernelFunc:QD},tO=at(Bo,e=>e<0?-1:e>0?1:0),nO={kernelName:Bo,backendName:"cpu",kernelFunc:tO},rO=at(Us,e=>Math.sin(e)),aO={kernelName:Us,backendName:"cpu",kernelFunc:rO},sO=at(Wo,e=>Math.sinh(e)),iO={kernelName:Wo,backendName:"cpu",kernelFunc:sO},oO=11920928955078125e-23,Ow=Math.log(oO)+2,lO=at(Vo,e=>{let t=e>-Ow,n=e{let d=[...u];d[o]=h;let p=mi({inputs:{x:a},backend:n,attrs:{begin:c,size:d}});return c[o]+=h,p})}var mO={kernelName:Uo,backendName:"cpu",kernelFunc:fO},AO=at(Hs,e=>Math.sqrt(e)),yO={kernelName:Hs,backendName:"cpu",kernelFunc:AO},gO={kernelName:ku,backendName:"cpu",kernelFunc:({inputs:e,backend:t})=>{let{x:n}=e,r=t;be(n,"square");let a=r.data.get(n.dataId).values,s=new Float32Array(a.length);for(let i=0;i{let n=t;return isNaN(e)?NaN:e>0?1:n.alpha}),wO={kernelName:Ia,backendName:"cpu",kernelFunc:xO};function bO(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{begin:s,end:i,strides:o,beginMask:l,endMask:c,ellipsisMask:u,newAxisMask:h,shrinkAxisMask:d}=r;be(a,"stridedSlice");let{nonStrided:p,$begin:f,$strides:m,size:A,newShape:y,outShape:g}=sn.sliceInfo(a.shape,s,i,o,l,c,u,h,d),w=mt({inputs:{x:a},backend:n,attrs:{shape:y}}),b;if(p){let x=mi({inputs:{x:w},backend:n,attrs:{begin:f,size:A}});b=mt({inputs:{x},backend:n,attrs:{shape:g}}),n.disposeIntermediateTensorInfo(x)}else if(g.some(x=>x===0))b=n.makeTensorInfo(g,a.dtype,[]);else{let x=n.bufferSync(w),N=hw(g,x,m,f);b=n.makeTensorInfo(N.shape,N.dtype,N.values)}let _=mt({inputs:{x:b},backend:n,attrs:{shape:g}});return n.disposeIntermediateTensorInfo(w),n.disposeIntermediateTensorInfo(b),_}var _O={kernelName:jo,backendName:"cpu",kernelFunc:bO},vO=at(Ho,e=>Math.tan(e)),kO={kernelName:Ho,backendName:"cpu",kernelFunc:vO},IO=at(Zs,e=>Math.tanh(e)),NO={kernelName:Zs,backendName:"cpu",kernelFunc:IO};function SO(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{reps:s}=r;be(a,"tile");let i=pw(n.bufferSync(a),s);return n.makeTensorInfo(i.shape,i.dtype,i.values)}var TO={kernelName:ka,backendName:"cpu",kernelFunc:SO};function CO(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{k:s,sorted:i}=r;be(a,"topk");let o=n.data.get(a.dataId).values,[l,c]=fw(o,a.shape,a.dtype,s,i);return[n.makeTensorInfo(l.shape,l.dtype,l.values),n.makeTensorInfo(c.shape,c.dtype,c.values)]}var EO={kernelName:Go,backendName:"cpu",kernelFunc:CO};function FO(e){let{inputs:t,attrs:n,backend:r}=e,{image:a,transforms:s}=t,{interpolation:i,fillMode:o,fillValue:l,outputShape:c}=n,[u,h,d,p]=a.shape,[f,m]=c!=null?c:[h,d],A=[u,f,m,p],y=v.computeStrides(a.shape),g=y[0],w=y[1],b=y[2],_=v.getTypedArrayFromDType(a.dtype,v.sizeFromShape(A));_.fill(l);let x=r.data.get(a.dataId).values,N=r.data.get(s.dataId).values;for(let T=0;Tt-1)if(t<=1)n=0;else{let r=2*t;n-=r*Math.trunc(n/r),n>=t&&(n=r-n-1)}return v.clamp(0,n,t-1)}function OO(e,t){let n=e;if(n<0)if(t<=1)n=0;else{let r=t-1;n+=t*(Math.trunc(-n/r)+1)}else if(n>t-1)if(t<=1)n=0;else{let r=t-1;n-=t*Math.trunc(n/r)}return v.clamp(0,n,t-1)}function zO(e,t){return e}function PO(e,t){return v.clamp(0,e,t-1)}function rc(e,t,n,r,a,s,i,o,l,c,u){let h=i*r+o*a+l*s+c;return 0<=o&&on.disposeIntermediateTensorInfo(f)),p}var jO={kernelName:Iu,backendName:"cpu",kernelFunc:UO},HO=[aM,uR,iM,lM,mR,cM,dM,fM,AM,gM,wM,_M,kM,SM,CM,MM,$M,OM,PM,nM,WM,VM,jM,pR,yR,GM,cR,XM,ZM,QM,tF,YM,sF,oF,rF,uF,hF,pF,mF,yF,xF,wF,_F,kF,NF,SF,CF,TF,Bm,KR,RF,FF,BF,gR,VF,wR,XF,ZF,YF,_R,e$,n$,a$,i$,l$,kR,h$,hR,p$,KM,m$,y$,x$,ZR,NR,_$,k$,TR,N$,C$,R$,$$,O$,P$,ER,B$,U$,H$,q$,K$,L$,J$,eD,MR,nD,sD,uD,$R,OR,dD,mD,gD,PR,wD,_D,vD,$w,SD,JR,BR,CD,dR,RD,QR,eM,tM,FD,DD,zD,LD,BD,VD,jD,UR,GD,XD,JD,eO,nO,aO,iO,jR,oD,uO,hO,pO,mO,yO,gO,GR,wO,_O,XR,Z$,kO,NO,TO,EO,LR,$O,WO,VO,jO,bD];for(let e of HO)ti(e);var Pw={};Oe(Pw,{assertNotComplex:()=>vl,bindCanvasToFramebuffer:()=>XO,bindColorTextureToFramebuffer:()=>np,bindTextureToProgramUniformSampler:()=>Qw,bindTextureUnit:()=>Zw,bindVertexBufferToProgramAttribute:()=>jm,callAndCheck:()=>xe,canBeRepresented:()=>Lw,createFragmentShader:()=>Vw,createFramebuffer:()=>Kw,createProgram:()=>Uw,createStaticIndexBuffer:()=>Gw,createStaticVertexBuffer:()=>Hw,createTexture:()=>qw,createVertexShader:()=>Bw,getBatchDim:()=>Ai,getExtensionOrThrow:()=>ac,getFramebufferErrorMessage:()=>eb,getMaxTexturesInShader:()=>rb,getNumChannels:()=>GO,getProgramUniformLocation:()=>Jw,getProgramUniformLocationOrThrow:()=>Yw,getRowsCols:()=>yi,getShapeAs3D:()=>rp,getTextureShapeFromLogicalShape:()=>tb,getWebGLDisjointQueryTimerVersion:()=>ab,getWebGLErrorMessage:()=>Ww,getWebGLMaxTextureSize:()=>nb,hasExtension:()=>qn,isCapableOfRenderingToFloatTexture:()=>sb,isDownloadFloatTextureEnabled:()=>ib,isReshapeFree:()=>ic,isWebGLFenceEnabled:()=>ob,isWebGLVersionEnabled:()=>Gm,linkProgram:()=>jw,resetMaxTextureSize:()=>KO,resetMaxTexturesInShader:()=>ZO,unbindColorTextureFromFramebuffer:()=>Hm,unbindTextureUnit:()=>qO,validateFramebuffer:()=>sc,validateProgram:()=>tp,validateTextureSize:()=>Xw});var gi={},qm={alpha:!1,antialias:!1,premultipliedAlpha:!1,preserveDrawingBuffer:!1,depth:!1,stencil:!1,failIfMajorPerformanceCaveat:!0};function ap(e,t){gi[e]=t}function Lr(e){if(!(e in gi)){let n=YO(e);if(n!==null)gi[e]=n;else return console.log("Could not get context for WebGL version",e),null}let t=gi[e];return t.isContextLost()?(delete gi[e],Lr(e)):(t.disable(t.DEPTH_TEST),t.disable(t.STENCIL_TEST),t.disable(t.BLEND),t.disable(t.DITHER),t.disable(t.POLYGON_OFFSET_FILL),t.disable(t.SAMPLE_COVERAGE),t.enable(t.SCISSOR_TEST),t.enable(t.CULL_FACE),t.cullFace(t.BACK),gi[e])}function JO(e){if(typeof OffscreenCanvas!="undefined"&&e===2)return new OffscreenCanvas(300,150);if(typeof document!="undefined")return document.createElement("canvas");throw new Error("Cannot create a canvas in this context")}function YO(e){if(e!==1&&e!==2)throw new Error("Cannot get WebGL rendering context, WebGL is disabled.");let t=JO(e);return t.addEventListener("webglcontextlost",n=>{n.preventDefault(),delete gi[e]},!1),e===1?t.getContext("webgl",qm)||t.getContext("experimental-webgl",qm):t.getContext("webgl2",qm)}var oc;(function(e){e[e.DENSE=0]="DENSE",e[e.SHARED_BATCH=1]="SHARED_BATCH"})(oc||(oc={}));var Xn;(function(e){e[e.RENDER=0]="RENDER",e[e.UPLOAD=1]="UPLOAD",e[e.PIXELS=2]="PIXELS",e[e.DOWNLOAD=3]="DOWNLOAD"})(Xn||(Xn={}));var Jt;(function(e){e[e.UNPACKED_FLOAT16=0]="UNPACKED_FLOAT16",e[e.UNPACKED_FLOAT32=1]="UNPACKED_FLOAT32",e[e.PACKED_4X1_UNSIGNED_BYTE=2]="PACKED_4X1_UNSIGNED_BYTE",e[e.PACKED_2X2_FLOAT32=3]="PACKED_2X2_FLOAT32",e[e.PACKED_2X2_FLOAT16=4]="PACKED_2X2_FLOAT16"})(Jt||(Jt={}));function lc(e,t){return[t,e]}function QO(e,t){return e*t}function uc(e){let t=v.sizeFromShape(e),n=Math.ceil(t/4);return v.sizeToSquarishShape(n)}function kl(e,t){return[Math.max(1,Math.ceil(t/2)),Math.max(1,Math.ceil(e/2))]}function ez(e,t){let[n,r]=kl(e,t);return n*r*4}function Xm(e,t){let n=e,r,a,s,i,o,l,c,u,h,d;return J().getNumber("WEBGL_VERSION")===2?(r=n.R32F,a=n.R16F,s=n.RGBA16F,i=n.RGBA32F,o=n.RED,c=4,u=1,h=n.HALF_FLOAT,d=n.FLOAT):(r=e.RGBA,a=e.RGBA,s=e.RGBA,i=n.RGBA,o=e.RGBA,c=4,u=4,h=t!=null?t.HALF_FLOAT_OES:null,d=e.FLOAT),l=e.RGBA,{internalFormatFloat:r,internalFormatHalfFloat:a,internalFormatPackedHalfFloat:s,internalFormatPackedFloat:i,textureFormatFloat:o,downloadTextureFormat:l,downloadUnpackNumChannels:c,defaultNumChannels:u,textureTypeHalfFloat:h,textureTypeFloat:d}}function xe(e,t){let n=t();return J().getBool("DEBUG")&&tz(e),n}function tz(e){let t=e.getError();if(t!==e.NO_ERROR)throw new Error("WebGL Error: "+Ww(e,t))}var nz=596e-10,rz=65504;function Lw(e){return!!(J().getBool("WEBGL_RENDER_FLOAT32_ENABLED")||e===0||nze.getExtension(t),'Extension "'+t+'" not supported on this browser.')}function Bw(e,t){let n=sa(e,()=>e.createShader(e.VERTEX_SHADER),"Unable to create vertex WebGLShader.");if(xe(e,()=>e.shaderSource(n,t)),xe(e,()=>e.compileShader(n)),e.getShaderParameter(n,e.COMPILE_STATUS)===!1)throw console.log(e.getShaderInfoLog(n)),new Error("Failed to compile vertex shader.");return n}function Vw(e,t){let n=sa(e,()=>e.createShader(e.FRAGMENT_SHADER),"Unable to create fragment WebGLShader.");if(xe(e,()=>e.shaderSource(n,t)),xe(e,()=>e.compileShader(n)),e.getShaderParameter(n,e.COMPILE_STATUS)===!1)throw az(t,e.getShaderInfoLog(n)),new Error("Failed to compile fragment shader.");return n}var sz=/ERROR: [0-9]+:([0-9]+):/g;function az(e,t){let n=sz.exec(t);if(n==null){console.log(`Couldn't parse line number in error: ${t}`),console.log(e);return}let r=+n[1],a=e.split(` -`),s=a.length.toString().length+2,i=a.map((h,d)=>v.rightPad((d+1).toString(),s)+h),o=0;for(let h=0;he.createProgram(),"Unable to create WebGLProgram.")}function jw(e,t){if(xe(e,()=>e.linkProgram(t)),e.getProgramParameter(t,e.LINK_STATUS)===!1)throw console.log(e.getProgramInfoLog(t)),new Error("Failed to link vertex and fragment shaders.")}function tp(e,t){if(xe(e,()=>e.validateProgram(t)),e.getProgramParameter(t,e.VALIDATE_STATUS)===!1)throw console.log(e.getProgramInfoLog(t)),new Error("Shader program validation failed.")}function Hw(e,t){let n=sa(e,()=>e.createBuffer(),"Unable to create WebGLBuffer");return xe(e,()=>e.bindBuffer(e.ARRAY_BUFFER,n)),xe(e,()=>e.bufferData(e.ARRAY_BUFFER,t,e.STATIC_DRAW)),n}function Gw(e,t){let n=sa(e,()=>e.createBuffer(),"Unable to create WebGLBuffer");return xe(e,()=>e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,n)),xe(e,()=>e.bufferData(e.ELEMENT_ARRAY_BUFFER,t,e.STATIC_DRAW)),n}function GO(){return J().getNumber("WEBGL_VERSION")===2?1:4}function qw(e){return sa(e,()=>e.createTexture(),"Unable to create WebGLTexture.")}function Xw(e,t){let n=J().getNumber("WEBGL_MAX_TEXTURE_SIZE");if(e<=0||t<=0){let r=`[${e}x${t}]`;throw new Error("Requested texture size "+r+" is invalid.")}if(e>n||t>n){let r=`[${e}x${t}]`,a=`[${n}x${n}]`;throw new Error("Requested texture size "+r+" greater than WebGL maximum on this browser / GPU "+a+".")}}function Kw(e){return sa(e,()=>e.createFramebuffer(),"Unable to create WebGLFramebuffer.")}function jm(e,t,n,r,a,s,i){let o=e.getAttribLocation(t,n);return o===-1?!1:(xe(e,()=>e.bindBuffer(e.ARRAY_BUFFER,r)),xe(e,()=>e.vertexAttribPointer(o,a,e.FLOAT,!1,s,i)),xe(e,()=>e.enableVertexAttribArray(o)),!0)}function Zw(e,t,n){lb(e,n),xe(e,()=>e.activeTexture(e.TEXTURE0+n)),xe(e,()=>e.bindTexture(e.TEXTURE_2D,t))}function qO(e,t){lb(e,t),xe(e,()=>e.activeTexture(e.TEXTURE0+t)),xe(e,()=>e.bindTexture(e.TEXTURE_2D,null))}function Yw(e,t,n){return sa(e,()=>e.getUniformLocation(t,n),'uniform "'+n+'" not present in program.')}function Jw(e,t,n){return e.getUniformLocation(t,n)}function Qw(e,t,n,r){xe(e,()=>Zw(e,t,r)),xe(e,()=>e.uniform1i(n,r))}function XO(e){xe(e,()=>e.bindFramebuffer(e.FRAMEBUFFER,null)),xe(e,()=>e.viewport(0,0,e.canvas.width,e.canvas.height)),xe(e,()=>e.scissor(0,0,e.canvas.width,e.canvas.height))}function np(e,t,n){xe(e,()=>e.bindFramebuffer(e.FRAMEBUFFER,n)),xe(e,()=>e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,t,0))}function Hm(e,t){xe(e,()=>e.bindFramebuffer(e.FRAMEBUFFER,t)),xe(e,()=>e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,null,0))}function sc(e){let t=e.checkFramebufferStatus(e.FRAMEBUFFER);if(t!==e.FRAMEBUFFER_COMPLETE)throw new Error("Error binding framebuffer: "+eb(e,t))}function eb(e,t){switch(t){case e.FRAMEBUFFER_INCOMPLETE_ATTACHMENT:return"FRAMEBUFFER_INCOMPLETE_ATTACHMENT";case e.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT:return"FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT";case e.FRAMEBUFFER_INCOMPLETE_DIMENSIONS:return"FRAMEBUFFER_INCOMPLETE_DIMENSIONS";case e.FRAMEBUFFER_UNSUPPORTED:return"FRAMEBUFFER_UNSUPPORTED";default:return`unknown error ${t}`}}function sa(e,t,n){let r=xe(e,()=>t());if(r==null)throw new Error(n);return r}function lb(e,t){let n=e.MAX_COMBINED_TEXTURE_IMAGE_UNITS-1,r=t+e.TEXTURE0;if(rn){let a=`[gl.TEXTURE0, gl.TEXTURE${n}]`;throw new Error(`textureUnit must be in ${a}.`)}}function Ai(e,t=2){return v.sizeFromShape(e.slice(0,e.length-t))}function yi(e){if(e.length===0)throw Error("Cannot get rows and columns of an empty shape array.");return[e.length>1?e[e.length-2]:1,e[e.length-1]]}function rp(e){let t=[1,1,1];return e.length===0||e.length===1&&e[0]===1||(t=[Ai(e),...yi(e)]),t}function tb(e,t=!1){let n=J().getNumber("WEBGL_MAX_TEXTURE_SIZE");t&&(n=n*2,e=e.map((a,s)=>s>=e.length-2?v.nearestLargerEven(e[s]):e[s]),e.length===1&&(e=[2,e[0]])),e.length!==2&&(e=v.squeezeShape(e).newShape);let r=v.sizeFromShape(e);if(e.length<=1&&r<=n)return[1,r];if(e.length===2&&e[0]<=n&&e[1]<=n)return e;if(e.length===3&&e[0]*e[1]<=n&&e[2]<=n)return[e[0]*e[1],e[2]];if(e.length===3&&e[0]<=n&&e[1]*e[2]<=n)return[e[0],e[1]*e[2]];if(e.length===4&&e[0]*e[1]*e[2]<=n&&e[3]<=n)return[e[0]*e[1]*e[2],e[3]];if(e.length===4&&e[0]<=n&&e[1]*e[2]*e[3]<=n)return[e[0],e[1]*e[2]*e[3]];if(t){let a=Ai(e),s=2,i=2;return e.length&&([s,i]=yi(e)),r=a*(s/2)*(i/2),v.sizeToSquarishShape(r).map(o=>o*2)}return v.sizeToSquarishShape(r)}function sp(e){return e%2==0}function ic(e,t){if(e=e.slice(-2),t=t.slice(-2),v.arraysEqual(e,t)||!e.length||!t.length||e[0]===0||e[1]===0||t[0]===0||t[1]===0)return!0;if(e.length!==t.length){let n=e.slice(-1)[0],r=t.slice(-1)[0];if(n===r||sp(n)&&sp(r)&&(e[0]===1||t[0]===1))return!0}return e[1]===t[1]&&sp(e[0])&&sp(t[0])}var ip,op;function nb(e){if(ip==null){let t=Lr(e);ip=t.getParameter(t.MAX_TEXTURE_SIZE)}return ip}function KO(){ip=null}function ZO(){op=null}function rb(e){if(op==null){let t=Lr(e);op=t.getParameter(t.MAX_TEXTURE_IMAGE_UNITS)}return Math.min(16,op)}function ab(e){if(e===0)return 0;let t,n=Lr(e);return qn(n,"EXT_disjoint_timer_query_webgl2")&&e===2?t=2:qn(n,"EXT_disjoint_timer_query")?t=1:t=0,t}function qn(e,t){return e.getExtension(t)!=null}function Gm(e){try{if(Lr(e)!=null)return!0}catch(t){return console.log("Error when getting WebGL context: ",t),!1}return!1}function sb(e){if(e===0)return!1;let t=Lr(e);if(e===1){if(!qn(t,"OES_texture_float"))return!1}else if(!qn(t,"EXT_color_buffer_float"))return!1;return Km(t)}function ib(e){if(e===0)return!1;let t=Lr(e);if(e===1){if(!qn(t,"OES_texture_float")||!qn(t,"WEBGL_color_buffer_float"))return!1}else{if(qn(t,"EXT_color_buffer_float"))return Km(t);let n="EXT_color_buffer_half_float";if(qn(t,n)){let r=t.getExtension(n);return iz(t,r)}return!1}return Km(t)}function Km(e){let t=Xm(e),n=e.createTexture();e.bindTexture(e.TEXTURE_2D,n);let r=1,a=1;e.texImage2D(e.TEXTURE_2D,0,t.internalFormatFloat,r,a,0,t.textureFormatFloat,t.textureTypeFloat,null);let s=e.createFramebuffer();e.bindFramebuffer(e.FRAMEBUFFER,s),e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,n,0);let i=e.checkFramebufferStatus(e.FRAMEBUFFER)===e.FRAMEBUFFER_COMPLETE;return e.bindTexture(e.TEXTURE_2D,null),e.bindFramebuffer(e.FRAMEBUFFER,null),e.deleteTexture(n),e.deleteFramebuffer(s),i}function iz(e,t){let n=Xm(e,t),r=e.createTexture();e.bindTexture(e.TEXTURE_2D,r);let a=1,s=1;e.texImage2D(e.TEXTURE_2D,0,n.internalFormatHalfFloat,a,s,0,n.textureFormatFloat,n.textureTypeHalfFloat,null);let i=e.createFramebuffer();e.bindFramebuffer(e.FRAMEBUFFER,i),e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,r,0);let o=e.checkFramebufferStatus(e.FRAMEBUFFER)===e.FRAMEBUFFER_COMPLETE;return e.bindTexture(e.TEXTURE_2D,null),e.bindFramebuffer(e.FRAMEBUFFER,null),e.deleteTexture(r),e.deleteFramebuffer(i),o}function ob(e){return e!==2?!1:Lr(e).fenceSync!=null}function vl(e,t){Array.isArray(e)||(e=[e]),e.forEach(n=>{n!=null&&v.assert(n.dtype!=="complex64",()=>`${t} does not support complex64 tensors in the WebGL backend.`)})}var Re=J();Re.registerFlag("HAS_WEBGL",()=>Re.getNumber("WEBGL_VERSION")>0);Re.registerFlag("WEBGL_VERSION",()=>Gm(2)?2:Gm(1)?1:0);Re.registerFlag("WEBGL_CHECK_NUMERICAL_PROBLEMS",()=>!1);Re.registerFlag("WEBGL_BUFFER_SUPPORTED",()=>Re.get("WEBGL_VERSION")===2);Re.registerFlag("WEBGL_CPU_FORWARD",()=>!0);Re.registerFlag("WEBGL_FORCE_F16_TEXTURES",()=>!1);Re.registerFlag("WEBGL_PACK",()=>Re.getBool("HAS_WEBGL"));Re.registerFlag("WEBGL_PACK_NORMALIZATION",()=>Re.getBool("WEBGL_PACK"));Re.registerFlag("WEBGL_PACK_CLIP",()=>Re.getBool("WEBGL_PACK"));Re.registerFlag("WEBGL_PACK_DEPTHWISECONV",()=>!1);Re.registerFlag("WEBGL_PACK_BINARY_OPERATIONS",()=>Re.getBool("WEBGL_PACK"));Re.registerFlag("WEBGL_PACK_UNARY_OPERATIONS",()=>Re.getBool("WEBGL_PACK"));Re.registerFlag("WEBGL_PACK_ARRAY_OPERATIONS",()=>Re.getBool("WEBGL_PACK"));Re.registerFlag("WEBGL_PACK_IMAGE_OPERATIONS",()=>Re.getBool("WEBGL_PACK"));Re.registerFlag("WEBGL_PACK_REDUCE",()=>Re.getBool("WEBGL_PACK"));Re.registerFlag("WEBGL_LAZILY_UNPACK",()=>Re.getBool("WEBGL_PACK"));Re.registerFlag("WEBGL_CONV_IM2COL",()=>Re.getBool("WEBGL_PACK"));Re.registerFlag("WEBGL_MAX_TEXTURE_SIZE",()=>nb(Re.getNumber("WEBGL_VERSION")));Re.registerFlag("WEBGL_MAX_TEXTURES_IN_SHADER",()=>rb(Re.getNumber("WEBGL_VERSION")));Re.registerFlag("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION",()=>{let e=Re.getNumber("WEBGL_VERSION");return e===0?0:ab(e)});Re.registerFlag("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE",()=>Re.getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")>0&&!$u.isMobile());Re.registerFlag("WEBGL_RENDER_FLOAT32_CAPABLE",()=>sb(Re.getNumber("WEBGL_VERSION")));Re.registerFlag("WEBGL_RENDER_FLOAT32_ENABLED",()=>Re.getBool("WEBGL_FORCE_F16_TEXTURES")?!1:Re.getBool("WEBGL_RENDER_FLOAT32_CAPABLE"));Re.registerFlag("WEBGL_DOWNLOAD_FLOAT_ENABLED",()=>ib(Re.getNumber("WEBGL_VERSION")));Re.registerFlag("WEBGL_FENCE_API_ENABLED",()=>ob(Re.getNumber("WEBGL_VERSION")));Re.registerFlag("WEBGL_SIZE_UPLOAD_UNIFORM",()=>Re.getBool("WEBGL_RENDER_FLOAT32_ENABLED")?4:0);Re.registerFlag("WEBGL_DELETE_TEXTURE_THRESHOLD",()=>-1,e=>{if(e<0&&e!==-1)throw new Error(`WEBGL_DELETE_TEXTURE_THRESHOLD must be -1 (indicating never delete) or at least 0, but got ${e}.`)});Re.registerFlag("WEBGL_FLUSH_THRESHOLD",()=>$u.isMobile()&&Re.getBool("IS_CHROME")?1:-1,e=>{if(e<0&&e!==-1)throw new Error(`WEBGL_FLUSH_THRESHOLD must be -1 (indicating never manual flush) or at least 0, but got ${e}.`)});function cn(){let e,t,n,r,a,s,i,o,l,c;return J().getNumber("WEBGL_VERSION")===2?(e="#version 300 es",t="in",n="out",r="in",a="texture",s="outputColor",i="out vec4 outputColor;",o=` +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __markAsModule = (target) => __defProp(target, "__esModule", {value: true}); +var __commonJS = (callback, module) => () => { + if (!module) { + module = {exports: {}}; + callback(module.exports, module); + } + return module.exports; +}; +var __export = (target, all5) => { + for (var name in all5) + __defProp(target, name, {get: all5[name], enumerable: true}); +}; +var __exportStar = (target, module, desc) => { + if (module && typeof module === "object" || typeof module === "function") { + for (let key of __getOwnPropNames(module)) + if (!__hasOwnProp.call(target, key) && key !== "default") + __defProp(target, key, {get: () => module[key], enumerable: !(desc = __getOwnPropDesc(module, key)) || desc.enumerable}); + } + return target; +}; +var __toModule = (module) => { + return __exportStar(__markAsModule(__defProp(module != null ? __create(__getProtoOf(module)) : {}, "default", module && module.__esModule && "default" in module ? {get: () => module.default, enumerable: true} : {value: module, enumerable: true})), module); +}; +var __accessCheck = (obj, member, msg) => { + if (!member.has(obj)) + throw TypeError("Cannot " + msg); +}; +var __privateGet = (obj, member, getter) => { + __accessCheck(obj, member, "read from private field"); + return getter ? getter.call(obj) : member.get(obj); +}; +var __privateSet = (obj, member, value, setter) => { + __accessCheck(obj, member, "write to private field"); + setter ? setter.call(obj, value) : member.set(obj, value); + return value; +}; + +// src/blazeface/facemesh.ts +var require_facemesh = __commonJS((exports) => { + __markAsModule(exports); + __export(exports, { + MediaPipeFaceMesh: () => MediaPipeFaceMesh, + load: () => load11 + }); + var MediaPipeFaceMesh = class { + constructor(blazeFace, blazeMeshModel, irisModel, config3) { + this.facePipeline = new Pipeline(blazeFace, blazeMeshModel, irisModel); + this.config = config3; + } + async estimateFaces(input2, config3) { + const predictions = await this.facePipeline.predict(input2, config3); + const results = []; + for (const prediction of predictions || []) { + if (prediction.isDisposedInternal) + continue; + const mesh = prediction.coords ? prediction.coords.arraySync() : []; + const meshRaw = mesh.map((pt) => [ + pt[0] / input2.shape[2], + pt[1] / input2.shape[1], + pt[2] / this.facePipeline.meshSize + ]); + const annotations3 = {}; + if (mesh && mesh.length > 0) { + for (const key of Object.keys(MESH_ANNOTATIONS)) + annotations3[key] = MESH_ANNOTATIONS[key].map((index) => mesh[index]); + } + const box3 = prediction.box ? [ + Math.max(0, prediction.box.startPoint[0]), + Math.max(0, prediction.box.startPoint[1]), + Math.min(input2.shape[1], prediction.box.endPoint[0]) - Math.max(0, prediction.box.startPoint[0]), + Math.min(input2.shape[2], prediction.box.endPoint[1]) - Math.max(0, prediction.box.startPoint[1]) + ] : 0; + const boxRaw = prediction.box ? [ + prediction.box.startPoint[0] / input2.shape[2], + prediction.box.startPoint[1] / input2.shape[1], + (prediction.box.endPoint[0] - prediction.box.startPoint[0]) / input2.shape[2], + (prediction.box.endPoint[1] - prediction.box.startPoint[1]) / input2.shape[1] + ] : []; + results.push({ + confidence: prediction.faceConfidence || prediction.boxConfidence || 0, + boxConfidence: prediction.boxConfidence, + faceConfidence: prediction.faceConfidence, + box: box3, + boxRaw, + mesh, + meshRaw, + annotations: annotations3, + image: prediction.image ? prediction.image.clone() : null + }); + if (prediction.coords) + prediction.coords.dispose(); + if (prediction.image) + prediction.image.dispose(); + } + return results; + } + }; + var faceModels = [null, null, null]; + async function load11(config3) { + faceModels = await Promise.all([ + !faceModels[0] && config3.face.enabled ? load6(config3) : null, + !faceModels[1] && config3.face.mesh.enabled ? loadGraphModel(config3.face.mesh.modelPath, {fromTFHub: config3.face.mesh.modelPath.includes("tfhub.dev")}) : null, + !faceModels[2] && config3.face.iris.enabled ? loadGraphModel(config3.face.iris.modelPath, {fromTFHub: config3.face.iris.modelPath.includes("tfhub.dev")}) : null + ]); + const faceMesh = new MediaPipeFaceMesh(faceModels[0], faceModels[1], faceModels[2], config3); + if (config3.face.mesh.enabled && config3.debug) + log(`load model: ${config3.face.mesh.modelPath.match(/\/(.*)\./)[1]}`); + if (config3.face.iris.enabled && config3.debug) + log(`load model: ${config3.face.iris.modelPath.match(/\/(.*)\./)[1]}`); + return faceMesh; + } + exports.triangulation = TRI468; +}); + +// src/posenet/keypoints.ts +var require_keypoints = __commonJS((exports) => { + __markAsModule(exports); + __export(exports, { + NUM_KEYPOINTS: () => NUM_KEYPOINTS3, + connectedPartIndices: () => connectedPartIndices, + partChannels: () => partChannels, + partIds: () => partIds2, + partNames: () => partNames2, + poseChain: () => poseChain2 + }); + var partNames2 = [ + "nose", + "leftEye", + "rightEye", + "leftEar", + "rightEar", + "leftShoulder", + "rightShoulder", + "leftElbow", + "rightElbow", + "leftWrist", + "rightWrist", + "leftHip", + "rightHip", + "leftKnee", + "rightKnee", + "leftAnkle", + "rightAnkle" + ]; + var NUM_KEYPOINTS3 = exports.partNames.length; + var partIds2 = exports.partNames.reduce((result, jointName, i) => { + result[jointName] = i; + return result; + }, {}); + var connectedPartNames = [ + ["leftHip", "leftShoulder"], + ["leftElbow", "leftShoulder"], + ["leftElbow", "leftWrist"], + ["leftHip", "leftKnee"], + ["leftKnee", "leftAnkle"], + ["rightHip", "rightShoulder"], + ["rightElbow", "rightShoulder"], + ["rightElbow", "rightWrist"], + ["rightHip", "rightKnee"], + ["rightKnee", "rightAnkle"], + ["leftShoulder", "rightShoulder"], + ["leftHip", "rightHip"] + ]; + var connectedPartIndices = connectedPartNames.map(([jointNameA, jointNameB]) => [partIds2[jointNameA], partIds2[jointNameB]]); + var poseChain2 = [ + ["nose", "leftEye"], + ["leftEye", "leftEar"], + ["nose", "rightEye"], + ["rightEye", "rightEar"], + ["nose", "leftShoulder"], + ["leftShoulder", "leftElbow"], + ["leftElbow", "leftWrist"], + ["leftShoulder", "leftHip"], + ["leftHip", "leftKnee"], + ["leftKnee", "leftAnkle"], + ["nose", "rightShoulder"], + ["rightShoulder", "rightElbow"], + ["rightElbow", "rightWrist"], + ["rightShoulder", "rightHip"], + ["rightHip", "rightKnee"], + ["rightKnee", "rightAnkle"] + ]; + var partChannels = [ + "left_face", + "right_face", + "right_upper_leg_front", + "right_lower_leg_back", + "right_upper_leg_back", + "left_lower_leg_front", + "left_upper_leg_front", + "left_upper_leg_back", + "left_lower_leg_back", + "right_feet", + "right_lower_leg_front", + "left_feet", + "torso_front", + "torso_back", + "right_upper_arm_front", + "right_upper_arm_back", + "right_lower_arm_back", + "left_lower_arm_front", + "left_upper_arm_front", + "left_upper_arm_back", + "left_lower_arm_back", + "right_hand", + "right_lower_arm_front", + "left_hand" + ]; +}); + +// src/helpers.ts +function log(...msg) { + const dt = new Date(); + const ts = `${dt.getHours().toString().padStart(2, "0")}:${dt.getMinutes().toString().padStart(2, "0")}:${dt.getSeconds().toString().padStart(2, "0")}.${dt.getMilliseconds().toString().padStart(3, "0")}`; + if (msg) + console.log(ts, "Human:", ...msg); +} +var now = () => { + if (typeof performance !== "undefined") + return performance.now(); + return parseInt((Number(process.hrtime.bigint()) / 1e3 / 1e3).toString()); +}; +function mergeDeep(...objects) { + const isObject = (obj) => obj && typeof obj === "object"; + return objects.reduce((prev, obj) => { + Object.keys(obj || {}).forEach((key) => { + const pVal = prev[key]; + const oVal = obj[key]; + if (Array.isArray(pVal) && Array.isArray(oVal)) + prev[key] = pVal.concat(...oVal); + else if (isObject(pVal) && isObject(oVal)) + prev[key] = mergeDeep(pVal, oVal); + else + prev[key] = oVal; + }); + return prev; + }, {}); +} + +// src/sysinfo.ts +function info() { + let platform; + let agent; + if (typeof navigator !== "undefined") { + const raw = navigator.userAgent.match(/\(([^()]+)\)/g); + if (raw && raw[0]) { + platform = raw[0].match(/\(([^()]+)\)/g)[0].replace(/\(|\)/g, ""); + agent = navigator.userAgent.replace(raw[0], ""); + if (platform[1]) + agent = agent.replace(raw[1], ""); + agent = agent.replace(/ /g, " "); + } + } else if (typeof process !== "undefined") { + platform = `${process.platform} ${process.arch}`; + agent = `NodeJS ${process.version}`; + } + return {platform, agent}; +} + +// dist/tfjs.esm.js +var tfjs_esm_exports = {}; +__export(tfjs_esm_exports, { + Abs: () => Abs, + Acos: () => Acos, + Acosh: () => Acosh, + AdadeltaOptimizer: () => AdadeltaOptimizer, + AdagradOptimizer: () => AdagradOptimizer, + AdamOptimizer: () => AdamOptimizer, + AdamaxOptimizer: () => AdamaxOptimizer, + Add: () => Add, + AddN: () => AddN, + All: () => All, + Any: () => Any, + ArgMax: () => ArgMax, + ArgMin: () => ArgMin, + Asin: () => Asin, + Asinh: () => Asinh, + Atan: () => Atan, + Atan2: () => Atan2, + Atanh: () => Atanh, + AvgPool: () => AvgPool, + AvgPool3D: () => AvgPool3D, + AvgPool3DGrad: () => AvgPool3DGrad, + AvgPoolGrad: () => AvgPoolGrad, + BackendWasm: () => BackendWasm, + BatchMatMul: () => BatchMatMul, + BatchToSpaceND: () => BatchToSpaceND, + Bincount: () => Bincount, + BroadcastTo: () => BroadcastTo, + Callback: () => Callback, + CallbackList: () => CallbackList, + Cast: () => Cast, + Ceil: () => Ceil, + ClipByValue: () => ClipByValue, + Complex: () => Complex, + ComplexAbs: () => ComplexAbs, + Concat: () => Concat, + Conv2D: () => Conv2D, + Conv2DBackpropFilter: () => Conv2DBackpropFilter, + Conv2DBackpropInput: () => Conv2DBackpropInput, + Conv3D: () => Conv3D, + Conv3DBackpropFilterV2: () => Conv3DBackpropFilterV2, + Conv3DBackpropInputV2: () => Conv3DBackpropInputV2, + Cos: () => Cos, + Cosh: () => Cosh, + CropAndResize: () => CropAndResize, + Cumsum: () => Cumsum, + CustomCallback: () => CustomCallback, + DataStorage: () => DataStorage, + DenseBincount: () => DenseBincount, + DepthToSpace: () => DepthToSpace, + DepthwiseConv2dNative: () => DepthwiseConv2dNative, + DepthwiseConv2dNativeBackpropFilter: () => DepthwiseConv2dNativeBackpropFilter, + DepthwiseConv2dNativeBackpropInput: () => DepthwiseConv2dNativeBackpropInput, + Diag: () => Diag, + Dilation2D: () => Dilation2D, + Dilation2DBackpropFilter: () => Dilation2DBackpropFilter, + Dilation2DBackpropInput: () => Dilation2DBackpropInput, + ENV: () => ENV, + EarlyStopping: () => EarlyStopping, + Elu: () => Elu, + EluGrad: () => EluGrad, + Environment: () => Environment, + Equal: () => Equal, + Erf: () => Erf, + Exp: () => Exp, + ExpandDims: () => ExpandDims, + Expm1: () => Expm1, + FFT: () => FFT, + Fill: () => Fill, + FlipLeftRight: () => FlipLeftRight, + Floor: () => Floor, + FloorDiv: () => FloorDiv, + FromPixels: () => FromPixels, + FusedBatchNorm: () => FusedBatchNorm, + FusedConv2D: () => FusedConv2D, + FusedDepthwiseConv2D: () => FusedDepthwiseConv2D, + GPGPUContext: () => GPGPUContext, + GatherNd: () => GatherNd, + GatherV2: () => GatherV2, + GraphModel: () => GraphModel, + Greater: () => Greater, + GreaterEqual: () => GreaterEqual, + History: () => History, + IFFT: () => IFFT, + Identity: () => Identity, + Imag: () => Imag, + InputSpec: () => InputSpec, + IsFinite: () => IsFinite, + IsInf: () => IsInf, + IsNan: () => IsNan, + KernelBackend: () => KernelBackend, + LRN: () => LRN, + LRNGrad: () => LRNGrad, + LayerVariable: () => LayerVariable, + LayersModel: () => LayersModel, + LeakyRelu: () => LeakyRelu, + Less: () => Less, + LessEqual: () => LessEqual, + LinSpace: () => LinSpace, + Log: () => Log, + Log1p: () => Log1p, + LogSoftmax: () => LogSoftmax, + LogicalAnd: () => LogicalAnd, + LogicalNot: () => LogicalNot, + LogicalOr: () => LogicalOr, + MathBackendCPU: () => MathBackendCPU, + MathBackendWebGL: () => MathBackendWebGL, + Max: () => Max, + MaxPool: () => MaxPool, + MaxPool3D: () => MaxPool3D, + MaxPool3DGrad: () => MaxPool3DGrad, + MaxPoolGrad: () => MaxPoolGrad, + MaxPoolWithArgmax: () => MaxPoolWithArgmax, + Maximum: () => Maximum, + Mean: () => Mean, + Min: () => Min, + Minimum: () => Minimum, + MirrorPad: () => MirrorPad, + Mod: () => Mod, + MomentumOptimizer: () => MomentumOptimizer, + Multinomial: () => Multinomial, + Multiply: () => Multiply, + Neg: () => Neg, + NonMaxSuppressionV3: () => NonMaxSuppressionV3, + NonMaxSuppressionV4: () => NonMaxSuppressionV4, + NonMaxSuppressionV5: () => NonMaxSuppressionV5, + NotEqual: () => NotEqual, + OP_SCOPE_SUFFIX: () => OP_SCOPE_SUFFIX, + OneHot: () => OneHot, + OnesLike: () => OnesLike, + Optimizer: () => Optimizer, + Pack: () => Pack, + PadV2: () => PadV2, + Pool: () => Pool, + Pow: () => Pow, + Prelu: () => Prelu, + Prod: () => Prod, + RMSPropOptimizer: () => RMSPropOptimizer, + RNN: () => RNN, + Range: () => Range, + Rank: () => Rank, + Real: () => Real, + RealDiv: () => RealDiv, + Reciprocal: () => Reciprocal, + Reduction: () => Reduction, + Relu: () => Relu, + Relu6: () => Relu6, + Reshape: () => Reshape, + ResizeBilinear: () => ResizeBilinear, + ResizeBilinearGrad: () => ResizeBilinearGrad, + ResizeNearestNeighbor: () => ResizeNearestNeighbor, + ResizeNearestNeighborGrad: () => ResizeNearestNeighborGrad, + Reverse: () => Reverse, + RotateWithOffset: () => RotateWithOffset, + Round: () => Round, + Rsqrt: () => Rsqrt, + SGDOptimizer: () => SGDOptimizer, + ScatterNd: () => ScatterNd, + Select: () => Select, + Selu: () => Selu, + Sequential: () => Sequential, + Sigmoid: () => Sigmoid, + Sign: () => Sign, + Sin: () => Sin, + Sinh: () => Sinh, + Slice: () => Slice, + Softmax: () => Softmax, + Softplus: () => Softplus, + SpaceToBatchND: () => SpaceToBatchND, + SparseToDense: () => SparseToDense, + SplitV: () => SplitV, + Sqrt: () => Sqrt, + Square: () => Square, + SquaredDifference: () => SquaredDifference, + Step: () => Step, + StridedSlice: () => StridedSlice, + Sub: () => Sub, + Sum: () => Sum, + SymbolicTensor: () => SymbolicTensor, + Tan: () => Tan, + Tanh: () => Tanh, + Tensor: () => Tensor, + TensorBuffer: () => TensorBuffer, + Tile: () => Tile, + TopK: () => TopK, + Transform: () => Transform, + Transpose: () => Transpose, + Unique: () => Unique, + Unpack: () => Unpack, + UnsortedSegmentSum: () => UnsortedSegmentSum, + Variable: () => Variable, + ZerosLike: () => ZerosLike, + _FusedMatMul: () => _FusedMatMul, + abs: () => abs, + acos: () => acos, + acosh: () => acosh, + add: () => add2, + addN: () => addN, + all: () => all, + any: () => any, + argMax: () => argMax, + argMin: () => argMin, + asin: () => asin, + asinh: () => asinh, + atan: () => atan, + atan2: () => atan2, + atanh: () => atanh, + avgPool: () => avgPool, + avgPool3d: () => avgPool3d, + backend: () => backend, + backend_util: () => backend_util_exports, + basicLSTMCell: () => basicLSTMCell, + batchNorm: () => batchNorm, + batchNorm2d: () => batchNorm2d, + batchNorm3d: () => batchNorm3d, + batchNorm4d: () => batchNorm4d, + batchToSpaceND: () => batchToSpaceND, + bincount: () => bincount, + booleanMaskAsync: () => booleanMaskAsync, + broadcastTo: () => broadcastTo, + browser: () => browser_exports, + buffer: () => buffer, + callbacks: () => callbacks, + cast: () => cast, + ceil: () => ceil, + clipByValue: () => clipByValue, + clone: () => clone, + complex: () => complex, + concat: () => concat, + concat1d: () => concat1d, + concat2d: () => concat2d, + concat3d: () => concat3d, + concat4d: () => concat4d, + constraints: () => exports_constraints_exports, + conv1d: () => conv1d, + conv2d: () => conv2d, + conv2dTranspose: () => conv2dTranspose, + conv3d: () => conv3d, + conv3dTranspose: () => conv3dTranspose, + copyRegisteredKernels: () => copyRegisteredKernels, + cos: () => cos, + cosh: () => cosh, + cosineWindow: () => cosineWindow, + cumsum: () => cumsum, + customGrad: () => customGrad, + data: () => dist_exports, + denseBincount: () => denseBincount, + deprecationWarn: () => deprecationWarn, + depthToSpace: () => depthToSpace, + depthwiseConv2d: () => depthwiseConv2d, + deregisterOp: () => deregisterOp, + device_util: () => device_util_exports, + diag: () => diag, + dilation2d: () => dilation2d, + disableDeprecationWarnings: () => disableDeprecationWarnings, + dispose: () => dispose, + disposeVariables: () => disposeVariables, + div: () => div, + divNoNan: () => divNoNan, + dot: () => dot, + dropout: () => dropout, + elu: () => elu, + enableDebugMode: () => enableDebugMode, + enableProdMode: () => enableProdMode, + enclosingPowerOfTwo: () => enclosingPowerOfTwo, + engine: () => engine, + env: () => env, + equal: () => equal, + erf: () => erf, + exp: () => exp, + expandDims: () => expandDims, + expm1: () => expm1, + eye: () => eye, + fft: () => fft, + fill: () => fill, + findBackend: () => findBackend, + findBackendFactory: () => findBackendFactory, + floor: () => floor, + floorDiv: () => floorDiv, + forceHalfFloat: () => forceHalfFloat, + fused: () => fused_ops_exports, + gather: () => gather, + gatherND: () => gatherND, + gather_util: () => gather_nd_util_exports, + getBackend: () => getBackend, + getGradient: () => getGradient, + getKernel: () => getKernel, + getKernelsForBackend: () => getKernelsForBackend, + gpgpu_util: () => gpgpu_util_exports, + grad: () => grad, + grads: () => grads, + greater: () => greater, + greaterEqual: () => greaterEqual, + ifft: () => ifft, + imag: () => imag, + image: () => image, + inTopKAsync: () => inTopKAsync, + initializers: () => exports_initializers_exports, + input: () => input, + io: () => io_exports, + irfft: () => irfft, + isFinite: () => isFinite2, + isInf: () => isInf, + isNaN: () => isNaN2, + keep: () => keep, + kernel_impls: () => kernel_impls_exports, + layers: () => exports_layers_exports, + leakyRelu: () => leakyRelu, + less: () => less, + lessEqual: () => lessEqual, + linalg: () => linalg, + linspace: () => linspace, + loadGraphModel: () => loadGraphModel, + loadLayersModel: () => loadLayersModel, + localResponseNormalization: () => localResponseNormalization, + log: () => log2, + log1p: () => log1p, + logSigmoid: () => logSigmoid, + logSoftmax: () => logSoftmax, + logSumExp: () => logSumExp, + logicalAnd: () => logicalAnd, + logicalNot: () => logicalNot, + logicalOr: () => logicalOr, + logicalXor: () => logicalXor, + losses: () => losses, + matMul: () => matMul, + math: () => math_exports, + max: () => max, + maxPool: () => maxPool, + maxPool3d: () => maxPool3d, + maxPoolWithArgmax: () => maxPoolWithArgmax, + maximum: () => maximum, + mean: () => mean, + memory: () => memory, + metrics: () => exports_metrics_exports, + min: () => min, + minimum: () => minimum, + mirrorPad: () => mirrorPad, + mod: () => mod, + model: () => model, + models: () => exports_models_exports, + moments: () => moments, + movingAverage: () => movingAverage, + mul: () => mul, + multiRNNCell: () => multiRNNCell, + multinomial: () => multinomial, + neg: () => neg, + nextFrame: () => nextFrame, + norm: () => norm, + notEqual: () => notEqual, + oneHot: () => oneHot, + ones: () => ones2, + onesLike: () => onesLike, + op: () => op, + outerProduct: () => outerProduct, + pad: () => pad, + pad1d: () => pad1d, + pad2d: () => pad2d, + pad3d: () => pad3d, + pad4d: () => pad4d, + pool: () => pool, + pow: () => pow, + prelu: () => prelu, + print: () => print2, + prod: () => prod, + profile: () => profile, + rand: () => rand, + randomGamma: () => randomGamma, + randomNormal: () => randomNormal, + randomUniform: () => randomUniform, + range: () => range, + ready: () => ready, + real: () => real, + reciprocal: () => reciprocal, + registerBackend: () => registerBackend, + registerCallbackConstructor: () => registerCallbackConstructor, + registerGradient: () => registerGradient, + registerKernel: () => registerKernel, + registerOp: () => registerOp, + regularizers: () => exports_regularizers_exports, + relu: () => relu, + relu6: () => relu6, + removeBackend: () => removeBackend, + reshape: () => reshape, + reverse: () => reverse, + reverse1d: () => reverse1d, + reverse2d: () => reverse2d, + reverse3d: () => reverse3d, + reverse4d: () => reverse4d, + rfft: () => rfft, + round: () => round2, + rsqrt: () => rsqrt, + scalar: () => scalar, + scatterND: () => scatterND, + scatter_util: () => scatter_nd_util_exports, + selu: () => selu, + separableConv2d: () => separableConv2d, + sequential: () => sequential, + serialization: () => serialization_exports, + setBackend: () => setBackend, + setPlatform: () => setPlatform, + setWasmPath: () => setWasmPath, + setWasmPaths: () => setWasmPaths, + setWebGLContext: () => setWebGLContext, + setdiff1dAsync: () => setdiff1dAsync, + shared: () => shared_exports, + sigmoid: () => sigmoid, + sign: () => sign, + signal: () => signal, + sin: () => sin, + sinh: () => sinh, + slice: () => slice, + slice1d: () => slice1d, + slice2d: () => slice2d, + slice3d: () => slice3d, + slice4d: () => slice4d, + slice_util: () => slice_util_exports, + softmax: () => softmax, + softplus: () => softplus, + spaceToBatchND: () => spaceToBatchND, + sparseToDense: () => sparseToDense, + spectral: () => spectral, + split: () => split, + sqrt: () => sqrt, + square: () => square, + squaredDifference: () => squaredDifference, + squeeze: () => squeeze, + stack: () => stack, + step: () => step, + stridedSlice: () => stridedSlice, + sub: () => sub, + sum: () => sum2, + sumOutType: () => sumOutType, + tan: () => tan, + tanh: () => tanh2, + tensor: () => tensor, + tensor1d: () => tensor1d, + tensor2d: () => tensor2d, + tensor3d: () => tensor3d, + tensor4d: () => tensor4d, + tensor5d: () => tensor5d, + tensor6d: () => tensor6d, + tensor_util: () => tensor_util_exports, + test_util: () => test_util_exports, + tidy: () => tidy, + tile: () => tile, + time: () => time, + topk: () => topk, + train: () => train, + transpose: () => transpose, + truncatedNormal: () => truncatedNormal, + unique: () => unique, + unregisterGradient: () => unregisterGradient, + unregisterKernel: () => unregisterKernel, + unsortedSegmentSum: () => unsortedSegmentSum, + unstack: () => unstack, + upcastType: () => upcastType, + util: () => util_exports, + valueAndGrad: () => valueAndGrad, + valueAndGrads: () => valueAndGrads, + variable: () => variable, + variableGrads: () => variableGrads, + version: () => version13, + version_converter: () => version11, + version_core: () => version6, + version_cpu: () => version7, + version_layers: () => version10, + version_wasm: () => version9, + version_webgl: () => version8, + webgl: () => webgl, + webgl_util: () => webgl_util_exports, + where: () => where, + whereAsync: () => whereAsync, + zeros: () => zeros, + zerosLike: () => zerosLike +}); +var __create2 = Object.create; +var __defProp2 = Object.defineProperty; +var __getProtoOf2 = Object.getPrototypeOf; +var __hasOwnProp2 = Object.prototype.hasOwnProperty; +var __getOwnPropNames2 = Object.getOwnPropertyNames; +var __getOwnPropDesc2 = Object.getOwnPropertyDescriptor; +var __markAsModule2 = (target) => __defProp2(target, "__esModule", {value: true}); +var __commonJS2 = (callback, module) => () => { + if (!module) { + module = {exports: {}}; + callback(module.exports, module); + } + return module.exports; +}; +var __export2 = (target, all42) => { + for (var name in all42) + __defProp2(target, name, {get: all42[name], enumerable: true}); +}; +var __exportStar2 = (target, module, desc) => { + if (module && typeof module === "object" || typeof module === "function") { + for (let key of __getOwnPropNames2(module)) + if (!__hasOwnProp2.call(target, key) && key !== "default") + __defProp2(target, key, {get: () => module[key], enumerable: !(desc = __getOwnPropDesc2(module, key)) || desc.enumerable}); + } + return target; +}; +var __toModule2 = (module) => { + return __exportStar2(__markAsModule2(__defProp2(module != null ? __create2(__getProtoOf2(module)) : {}, "default", module && module.__esModule && "default" in module ? {get: () => module.default, enumerable: true} : {value: module, enumerable: true})), module); +}; +var require_browser = __commonJS2(() => { +}); +var require_alea = __commonJS2((exports, module) => { + (function(global2, module2, define2) { + function Alea(seed) { + var me = this, mash = Mash(); + me.next = function() { + var t = 2091639 * me.s0 + me.c * 23283064365386963e-26; + me.s0 = me.s1; + me.s1 = me.s2; + return me.s2 = t - (me.c = t | 0); + }; + me.c = 1; + me.s0 = mash(" "); + me.s1 = mash(" "); + me.s2 = mash(" "); + me.s0 -= mash(seed); + if (me.s0 < 0) { + me.s0 += 1; + } + me.s1 -= mash(seed); + if (me.s1 < 0) { + me.s1 += 1; + } + me.s2 -= mash(seed); + if (me.s2 < 0) { + me.s2 += 1; + } + mash = null; + } + function copy(f, t) { + t.c = f.c; + t.s0 = f.s0; + t.s1 = f.s1; + t.s2 = f.s2; + return t; + } + function impl(seed, opts) { + var xg = new Alea(seed), state = opts && opts.state, prng = xg.next; + prng.int32 = function() { + return xg.next() * 4294967296 | 0; + }; + prng.double = function() { + return prng() + (prng() * 2097152 | 0) * 11102230246251565e-32; + }; + prng.quick = prng; + if (state) { + if (typeof state == "object") + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + function Mash() { + var n = 4022871197; + var mash = function(data2) { + data2 = data2.toString(); + for (var i = 0; i < data2.length; i++) { + n += data2.charCodeAt(i); + var h = 0.02519603282416938 * n; + n = h >>> 0; + h -= n; + h *= n; + n = h >>> 0; + h -= n; + n += h * 4294967296; + } + return (n >>> 0) * 23283064365386963e-26; + }; + return mash; + } + if (module2 && module2.exports) { + module2.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.alea = impl; + } + })(exports, typeof module == "object" && module, typeof define == "function" && define); +}); +var require_xor128 = __commonJS2((exports, module) => { + (function(global2, module2, define2) { + function XorGen(seed) { + var me = this, strseed = ""; + me.x = 0; + me.y = 0; + me.z = 0; + me.w = 0; + me.next = function() { + var t = me.x ^ me.x << 11; + me.x = me.y; + me.y = me.z; + me.z = me.w; + return me.w ^= me.w >>> 19 ^ t ^ t >>> 8; + }; + if (seed === (seed | 0)) { + me.x = seed; + } else { + strseed += seed; + } + for (var k = 0; k < strseed.length + 64; k++) { + me.x ^= strseed.charCodeAt(k) | 0; + me.next(); + } + } + function copy(f, t) { + t.x = f.x; + t.y = f.y; + t.z = f.z; + t.w = f.w; + return t; + } + function impl(seed, opts) { + var xg = new XorGen(seed), state = opts && opts.state, prng = function() { + return (xg.next() >>> 0) / 4294967296; + }; + prng.double = function() { + do { + var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); + } while (result === 0); + return result; + }; + prng.int32 = xg.next; + prng.quick = prng; + if (state) { + if (typeof state == "object") + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + if (module2 && module2.exports) { + module2.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.xor128 = impl; + } + })(exports, typeof module == "object" && module, typeof define == "function" && define); +}); +var require_xorwow = __commonJS2((exports, module) => { + (function(global2, module2, define2) { + function XorGen(seed) { + var me = this, strseed = ""; + me.next = function() { + var t = me.x ^ me.x >>> 2; + me.x = me.y; + me.y = me.z; + me.z = me.w; + me.w = me.v; + return (me.d = me.d + 362437 | 0) + (me.v = me.v ^ me.v << 4 ^ (t ^ t << 1)) | 0; + }; + me.x = 0; + me.y = 0; + me.z = 0; + me.w = 0; + me.v = 0; + if (seed === (seed | 0)) { + me.x = seed; + } else { + strseed += seed; + } + for (var k = 0; k < strseed.length + 64; k++) { + me.x ^= strseed.charCodeAt(k) | 0; + if (k == strseed.length) { + me.d = me.x << 10 ^ me.x >>> 4; + } + me.next(); + } + } + function copy(f, t) { + t.x = f.x; + t.y = f.y; + t.z = f.z; + t.w = f.w; + t.v = f.v; + t.d = f.d; + return t; + } + function impl(seed, opts) { + var xg = new XorGen(seed), state = opts && opts.state, prng = function() { + return (xg.next() >>> 0) / 4294967296; + }; + prng.double = function() { + do { + var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); + } while (result === 0); + return result; + }; + prng.int32 = xg.next; + prng.quick = prng; + if (state) { + if (typeof state == "object") + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + if (module2 && module2.exports) { + module2.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.xorwow = impl; + } + })(exports, typeof module == "object" && module, typeof define == "function" && define); +}); +var require_xorshift7 = __commonJS2((exports, module) => { + (function(global2, module2, define2) { + function XorGen(seed) { + var me = this; + me.next = function() { + var X = me.x, i = me.i, t, v, w; + t = X[i]; + t ^= t >>> 7; + v = t ^ t << 24; + t = X[i + 1 & 7]; + v ^= t ^ t >>> 10; + t = X[i + 3 & 7]; + v ^= t ^ t >>> 3; + t = X[i + 4 & 7]; + v ^= t ^ t << 7; + t = X[i + 7 & 7]; + t = t ^ t << 13; + v ^= t ^ t << 9; + X[i] = v; + me.i = i + 1 & 7; + return v; + }; + function init2(me2, seed2) { + var j, w, X = []; + if (seed2 === (seed2 | 0)) { + w = X[0] = seed2; + } else { + seed2 = "" + seed2; + for (j = 0; j < seed2.length; ++j) { + X[j & 7] = X[j & 7] << 15 ^ seed2.charCodeAt(j) + X[j + 1 & 7] << 13; + } + } + while (X.length < 8) + X.push(0); + for (j = 0; j < 8 && X[j] === 0; ++j) + ; + if (j == 8) + w = X[7] = -1; + else + w = X[j]; + me2.x = X; + me2.i = 0; + for (j = 256; j > 0; --j) { + me2.next(); + } + } + init2(me, seed); + } + function copy(f, t) { + t.x = f.x.slice(); + t.i = f.i; + return t; + } + function impl(seed, opts) { + if (seed == null) + seed = +new Date(); + var xg = new XorGen(seed), state = opts && opts.state, prng = function() { + return (xg.next() >>> 0) / 4294967296; + }; + prng.double = function() { + do { + var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); + } while (result === 0); + return result; + }; + prng.int32 = xg.next; + prng.quick = prng; + if (state) { + if (state.x) + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + if (module2 && module2.exports) { + module2.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.xorshift7 = impl; + } + })(exports, typeof module == "object" && module, typeof define == "function" && define); +}); +var require_xor4096 = __commonJS2((exports, module) => { + (function(global2, module2, define2) { + function XorGen(seed) { + var me = this; + me.next = function() { + var w = me.w, X = me.X, i = me.i, t, v; + me.w = w = w + 1640531527 | 0; + v = X[i + 34 & 127]; + t = X[i = i + 1 & 127]; + v ^= v << 13; + t ^= t << 17; + v ^= v >>> 15; + t ^= t >>> 12; + v = X[i] = v ^ t; + me.i = i; + return v + (w ^ w >>> 16) | 0; + }; + function init2(me2, seed2) { + var t, v, i, j, w, X = [], limit = 128; + if (seed2 === (seed2 | 0)) { + v = seed2; + seed2 = null; + } else { + seed2 = seed2 + "\0"; + v = 0; + limit = Math.max(limit, seed2.length); + } + for (i = 0, j = -32; j < limit; ++j) { + if (seed2) + v ^= seed2.charCodeAt((j + 32) % seed2.length); + if (j === 0) + w = v; + v ^= v << 10; + v ^= v >>> 15; + v ^= v << 4; + v ^= v >>> 13; + if (j >= 0) { + w = w + 1640531527 | 0; + t = X[j & 127] ^= v + w; + i = t == 0 ? i + 1 : 0; + } + } + if (i >= 128) { + X[(seed2 && seed2.length || 0) & 127] = -1; + } + i = 127; + for (j = 4 * 128; j > 0; --j) { + v = X[i + 34 & 127]; + t = X[i = i + 1 & 127]; + v ^= v << 13; + t ^= t << 17; + v ^= v >>> 15; + t ^= t >>> 12; + X[i] = v ^ t; + } + me2.w = w; + me2.X = X; + me2.i = i; + } + init2(me, seed); + } + function copy(f, t) { + t.i = f.i; + t.w = f.w; + t.X = f.X.slice(); + return t; + } + ; + function impl(seed, opts) { + if (seed == null) + seed = +new Date(); + var xg = new XorGen(seed), state = opts && opts.state, prng = function() { + return (xg.next() >>> 0) / 4294967296; + }; + prng.double = function() { + do { + var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); + } while (result === 0); + return result; + }; + prng.int32 = xg.next; + prng.quick = prng; + if (state) { + if (state.X) + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + if (module2 && module2.exports) { + module2.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.xor4096 = impl; + } + })(exports, typeof module == "object" && module, typeof define == "function" && define); +}); +var require_tychei = __commonJS2((exports, module) => { + (function(global2, module2, define2) { + function XorGen(seed) { + var me = this, strseed = ""; + me.next = function() { + var b = me.b, c = me.c, d = me.d, a = me.a; + b = b << 25 ^ b >>> 7 ^ c; + c = c - d | 0; + d = d << 24 ^ d >>> 8 ^ a; + a = a - b | 0; + me.b = b = b << 20 ^ b >>> 12 ^ c; + me.c = c = c - d | 0; + me.d = d << 16 ^ c >>> 16 ^ a; + return me.a = a - b | 0; + }; + me.a = 0; + me.b = 0; + me.c = 2654435769 | 0; + me.d = 1367130551; + if (seed === Math.floor(seed)) { + me.a = seed / 4294967296 | 0; + me.b = seed | 0; + } else { + strseed += seed; + } + for (var k = 0; k < strseed.length + 20; k++) { + me.b ^= strseed.charCodeAt(k) | 0; + me.next(); + } + } + function copy(f, t) { + t.a = f.a; + t.b = f.b; + t.c = f.c; + t.d = f.d; + return t; + } + ; + function impl(seed, opts) { + var xg = new XorGen(seed), state = opts && opts.state, prng = function() { + return (xg.next() >>> 0) / 4294967296; + }; + prng.double = function() { + do { + var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); + } while (result === 0); + return result; + }; + prng.int32 = xg.next; + prng.quick = prng; + if (state) { + if (typeof state == "object") + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + if (module2 && module2.exports) { + module2.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.tychei = impl; + } + })(exports, typeof module == "object" && module, typeof define == "function" && define); +}); +var require_crypto = __commonJS2(() => { +}); +var require_seedrandom = __commonJS2((exports, module) => { + (function(pool3, math) { + var global2 = this, width = 256, chunks = 6, digits = 52, rngname = "random", startdenom = math.pow(width, chunks), significance = math.pow(2, digits), overflow = significance * 2, mask = width - 1, nodecrypto; + function seedrandom5(seed, options, callback) { + var key = []; + options = options == true ? {entropy: true} : options || {}; + var shortseed = mixkey(flatten4(options.entropy ? [seed, tostring(pool3)] : seed == null ? autoseed() : seed, 3), key); + var arc4 = new ARC4(key); + var prng = function() { + var n = arc4.g(chunks), d = startdenom, x = 0; + while (n < significance) { + n = (n + x) * width; + d *= width; + x = arc4.g(1); + } + while (n >= overflow) { + n /= 2; + d /= 2; + x >>>= 1; + } + return (n + x) / d; + }; + prng.int32 = function() { + return arc4.g(4) | 0; + }; + prng.quick = function() { + return arc4.g(4) / 4294967296; + }; + prng.double = prng; + mixkey(tostring(arc4.S), pool3); + return (options.pass || callback || function(prng2, seed2, is_math_call, state) { + if (state) { + if (state.S) { + copy(state, arc4); + } + prng2.state = function() { + return copy(arc4, {}); + }; + } + if (is_math_call) { + math[rngname] = prng2; + return seed2; + } else + return prng2; + })(prng, shortseed, "global" in options ? options.global : this == math, options.state); + } + math["seed" + rngname] = seedrandom5; + function ARC4(key) { + var t, keylen = key.length, me = this, i = 0, j = me.i = me.j = 0, s = me.S = []; + if (!keylen) { + key = [keylen++]; + } + while (i < width) { + s[i] = i++; + } + for (i = 0; i < width; i++) { + s[i] = s[j = mask & j + key[i % keylen] + (t = s[i])]; + s[j] = t; + } + (me.g = function(count2) { + var t2, r = 0, i2 = me.i, j2 = me.j, s2 = me.S; + while (count2--) { + t2 = s2[i2 = mask & i2 + 1]; + r = r * width + s2[mask & (s2[i2] = s2[j2 = mask & j2 + t2]) + (s2[j2] = t2)]; + } + me.i = i2; + me.j = j2; + return r; + })(width); + } + function copy(f, t) { + t.i = f.i; + t.j = f.j; + t.S = f.S.slice(); + return t; + } + ; + function flatten4(obj, depth) { + var result = [], typ = typeof obj, prop; + if (depth && typ == "object") { + for (prop in obj) { + try { + result.push(flatten4(obj[prop], depth - 1)); + } catch (e) { + } + } + } + return result.length ? result : typ == "string" ? obj : obj + "\0"; + } + function mixkey(seed, key) { + var stringseed = seed + "", smear, j = 0; + while (j < stringseed.length) { + key[mask & j] = mask & (smear ^= key[mask & j] * 19) + stringseed.charCodeAt(j++); + } + return tostring(key); + } + function autoseed() { + try { + var out; + if (nodecrypto && (out = nodecrypto.randomBytes)) { + out = out(width); + } else { + out = new Uint8Array(width); + (global2.crypto || global2.msCrypto).getRandomValues(out); + } + return tostring(out); + } catch (e) { + var browser = global2.navigator, plugins = browser && browser.plugins; + return [+new Date(), global2, plugins, global2.screen, tostring(pool3)]; + } + } + function tostring(a) { + return String.fromCharCode.apply(0, a); + } + mixkey(math.random(), pool3); + if (typeof module == "object" && module.exports) { + module.exports = seedrandom5; + try { + nodecrypto = require_crypto(); + } catch (ex) { + } + } else if (typeof define == "function" && define.amd) { + define(function() { + return seedrandom5; + }); + } + })([], Math); +}); +var require_seedrandom2 = __commonJS2((exports, module) => { + var alea5 = require_alea(); + var xor128 = require_xor128(); + var xorwow = require_xorwow(); + var xorshift7 = require_xorshift7(); + var xor4096 = require_xor4096(); + var tychei = require_tychei(); + var sr = require_seedrandom(); + sr.alea = alea5; + sr.xor128 = xor128; + sr.xorwow = xorwow; + sr.xorshift7 = xorshift7; + sr.xor4096 = xor4096; + sr.tychei = tychei; + module.exports = sr; +}); +var require_path = __commonJS2(() => { +}); +var require_worker_threads = __commonJS2(() => { +}); +var require_perf_hooks = __commonJS2(() => { +}); +var require_tfjs_backend_wasm_threaded_simd = __commonJS2((exports, module) => { + var WasmBackendModuleThreadedSimd = function() { + var _scriptDir = typeof document !== "undefined" && document.currentScript ? document.currentScript.src : void 0; + if (typeof __filename !== "undefined") + _scriptDir = _scriptDir || __filename; + return function(WasmBackendModuleThreadedSimd2) { + WasmBackendModuleThreadedSimd2 = WasmBackendModuleThreadedSimd2 || {}; + function GROWABLE_HEAP_I8() { + if (wasmMemory.buffer != buffer2) { + updateGlobalBufferAndViews(wasmMemory.buffer); + } + return HEAP8; + } + function GROWABLE_HEAP_U8() { + if (wasmMemory.buffer != buffer2) { + updateGlobalBufferAndViews(wasmMemory.buffer); + } + return HEAPU8; + } + function GROWABLE_HEAP_I32() { + if (wasmMemory.buffer != buffer2) { + updateGlobalBufferAndViews(wasmMemory.buffer); + } + return HEAP32; + } + function GROWABLE_HEAP_U32() { + if (wasmMemory.buffer != buffer2) { + updateGlobalBufferAndViews(wasmMemory.buffer); + } + return HEAPU32; + } + function GROWABLE_HEAP_F64() { + if (wasmMemory.buffer != buffer2) { + updateGlobalBufferAndViews(wasmMemory.buffer); + } + return HEAPF64; + } + var Module = typeof WasmBackendModuleThreadedSimd2 !== "undefined" ? WasmBackendModuleThreadedSimd2 : {}; + var readyPromiseResolve, readyPromiseReject; + Module["ready"] = new Promise(function(resolve, reject) { + readyPromiseResolve = resolve; + readyPromiseReject = reject; + }); + var moduleOverrides = {}; + var key; + for (key in Module) { + if (Module.hasOwnProperty(key)) { + moduleOverrides[key] = Module[key]; + } + } + var arguments_ = []; + var thisProgram = "./this.program"; + var quit_ = function(status, toThrow) { + throw toThrow; + }; + var ENVIRONMENT_IS_WEB = false; + var ENVIRONMENT_IS_WORKER = false; + var ENVIRONMENT_IS_NODE = false; + var ENVIRONMENT_IS_SHELL = false; + ENVIRONMENT_IS_WEB = typeof window === "object"; + ENVIRONMENT_IS_WORKER = typeof importScripts === "function"; + ENVIRONMENT_IS_NODE = typeof process === "object" && typeof process.versions === "object" && typeof process.versions.node === "string"; + ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER; + var ENVIRONMENT_IS_PTHREAD = Module["ENVIRONMENT_IS_PTHREAD"] || false; + if (ENVIRONMENT_IS_PTHREAD) { + buffer2 = Module["buffer"]; + } + var scriptDirectory = ""; + function locateFile(path) { + if (Module["locateFile"]) { + return Module["locateFile"](path, scriptDirectory); + } + return scriptDirectory + path; + } + var read_, readAsync, readBinary, setWindowTitle; + var nodeFS; + var nodePath; + if (ENVIRONMENT_IS_NODE) { + if (ENVIRONMENT_IS_WORKER) { + scriptDirectory = require_path().dirname(scriptDirectory) + "/"; + } else { + scriptDirectory = __dirname + "/"; + } + read_ = function shell_read(filename, binary) { + if (!nodeFS) + nodeFS = require("fs"); + if (!nodePath) + nodePath = require_path(); + filename = nodePath["normalize"](filename); + return nodeFS["readFileSync"](filename, binary ? null : "utf8"); + }; + readBinary = function readBinary2(filename) { + var ret = read_(filename, true); + if (!ret.buffer) { + ret = new Uint8Array(ret); + } + assert3(ret.buffer); + return ret; + }; + if (process["argv"].length > 1) { + thisProgram = process["argv"][1].replace(/\\/g, "/"); + } + arguments_ = process["argv"].slice(2); + process["on"]("uncaughtException", function(ex) { + if (!(ex instanceof ExitStatus)) { + throw ex; + } + }); + process["on"]("unhandledRejection", abort); + quit_ = function(status) { + process["exit"](status); + }; + Module["inspect"] = function() { + return "[Emscripten Module object]"; + }; + var nodeWorkerThreads; + try { + nodeWorkerThreads = require_worker_threads(); + } catch (e) { + console.error('The "worker_threads" module is not supported in this node.js build - perhaps a newer version is needed?'); + throw e; + } + global.Worker = nodeWorkerThreads.Worker; + } else if (ENVIRONMENT_IS_SHELL) { + if (typeof read != "undefined") { + read_ = function shell_read(f) { + return read(f); + }; + } + readBinary = function readBinary2(f) { + var data2; + if (typeof readbuffer === "function") { + return new Uint8Array(readbuffer(f)); + } + data2 = read(f, "binary"); + assert3(typeof data2 === "object"); + return data2; + }; + if (typeof scriptArgs != "undefined") { + arguments_ = scriptArgs; + } else if (typeof arguments != "undefined") { + arguments_ = arguments; + } + if (typeof quit === "function") { + quit_ = function(status) { + quit(status); + }; + } + if (typeof print !== "undefined") { + if (typeof console === "undefined") + console = {}; + console.log = print; + console.warn = console.error = typeof printErr !== "undefined" ? printErr : print; + } + } else if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) { + if (ENVIRONMENT_IS_WORKER) { + scriptDirectory = self.location.href; + } else if (typeof document !== "undefined" && document.currentScript) { + scriptDirectory = document.currentScript.src; + } + if (typeof _scriptDir !== "undefined" && _scriptDir) { + scriptDirectory = _scriptDir; + } + if (scriptDirectory.indexOf("blob:") !== 0) { + scriptDirectory = scriptDirectory.substr(0, scriptDirectory.lastIndexOf("/") + 1); + } else { + scriptDirectory = ""; + } + if (ENVIRONMENT_IS_NODE) { + read_ = function shell_read(filename, binary) { + if (!nodeFS) + nodeFS = require("fs"); + if (!nodePath) + nodePath = require_path(); + filename = nodePath["normalize"](filename); + return nodeFS["readFileSync"](filename, binary ? null : "utf8"); + }; + readBinary = function readBinary2(filename) { + var ret = read_(filename, true); + if (!ret.buffer) { + ret = new Uint8Array(ret); + } + assert3(ret.buffer); + return ret; + }; + } else { + read_ = function(url) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", url, false); + xhr.send(null); + return xhr.responseText; + }; + if (ENVIRONMENT_IS_WORKER) { + readBinary = function(url) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", url, false); + xhr.responseType = "arraybuffer"; + xhr.send(null); + return new Uint8Array(xhr.response); + }; + } + readAsync = function(url, onload, onerror) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", url, true); + xhr.responseType = "arraybuffer"; + xhr.onload = function() { + if (xhr.status == 200 || xhr.status == 0 && xhr.response) { + onload(xhr.response); + return; + } + onerror(); + }; + xhr.onerror = onerror; + xhr.send(null); + }; + } + setWindowTitle = function(title) { + document.title = title; + }; + } else { + } + if (ENVIRONMENT_IS_NODE) { + if (typeof performance === "undefined") { + global.performance = require_perf_hooks().performance; + } + } + var out = Module["print"] || console.log.bind(console); + var err = Module["printErr"] || console.warn.bind(console); + for (key in moduleOverrides) { + if (moduleOverrides.hasOwnProperty(key)) { + Module[key] = moduleOverrides[key]; + } + } + moduleOverrides = null; + if (Module["arguments"]) + arguments_ = Module["arguments"]; + if (Module["thisProgram"]) + thisProgram = Module["thisProgram"]; + if (Module["quit"]) + quit_ = Module["quit"]; + var Atomics_load = Atomics.load; + var Atomics_store = Atomics.store; + var Atomics_compareExchange = Atomics.compareExchange; + var wasmBinary; + if (Module["wasmBinary"]) + wasmBinary = Module["wasmBinary"]; + var noExitRuntime = Module["noExitRuntime"] || true; + if (typeof WebAssembly !== "object") { + abort("no native wasm support detected"); + } + var wasmMemory; + var wasmModule; + var ABORT = false; + var EXITSTATUS; + function assert3(condition, text) { + if (!condition) { + abort("Assertion failed: " + text); + } + } + function getCFunc(ident) { + var func2 = Module["_" + ident]; + assert3(func2, "Cannot call unknown function " + ident + ", make sure it is exported"); + return func2; + } + function ccall(ident, returnType, argTypes, args, opts) { + var toC = {string: function(str) { + var ret2 = 0; + if (str !== null && str !== void 0 && str !== 0) { + var len = (str.length << 2) + 1; + ret2 = stackAlloc(len); + stringToUTF8(str, ret2, len); + } + return ret2; + }, array: function(arr) { + var ret2 = stackAlloc(arr.length); + writeArrayToMemory(arr, ret2); + return ret2; + }}; + function convertReturnValue(ret2) { + if (returnType === "string") + return UTF8ToString(ret2); + if (returnType === "boolean") + return Boolean(ret2); + return ret2; + } + var func2 = getCFunc(ident); + var cArgs = []; + var stack2 = 0; + if (args) { + for (var i = 0; i < args.length; i++) { + var converter = toC[argTypes[i]]; + if (converter) { + if (stack2 === 0) + stack2 = stackSave(); + cArgs[i] = converter(args[i]); + } else { + cArgs[i] = args[i]; + } + } + } + var ret = func2.apply(null, cArgs); + ret = convertReturnValue(ret); + if (stack2 !== 0) + stackRestore(stack2); + return ret; + } + function cwrap(ident, returnType, argTypes, opts) { + argTypes = argTypes || []; + var numericArgs = argTypes.every(function(type) { + return type === "number"; + }); + var numericRet = returnType !== "string"; + if (numericRet && numericArgs && !opts) { + return getCFunc(ident); + } + return function() { + return ccall(ident, returnType, argTypes, arguments, opts); + }; + } + function UTF8ArrayToString(heap, idx, maxBytesToRead) { + var endIdx = idx + maxBytesToRead; + var str = ""; + while (!(idx >= endIdx)) { + var u0 = heap[idx++]; + if (!u0) + return str; + if (!(u0 & 128)) { + str += String.fromCharCode(u0); + continue; + } + var u1 = heap[idx++] & 63; + if ((u0 & 224) == 192) { + str += String.fromCharCode((u0 & 31) << 6 | u1); + continue; + } + var u2 = heap[idx++] & 63; + if ((u0 & 240) == 224) { + u0 = (u0 & 15) << 12 | u1 << 6 | u2; + } else { + u0 = (u0 & 7) << 18 | u1 << 12 | u2 << 6 | heap[idx++] & 63; + } + if (u0 < 65536) { + str += String.fromCharCode(u0); + } else { + var ch = u0 - 65536; + str += String.fromCharCode(55296 | ch >> 10, 56320 | ch & 1023); + } + } + return str; + } + function UTF8ToString(ptr, maxBytesToRead) { + return ptr ? UTF8ArrayToString(GROWABLE_HEAP_U8(), ptr, maxBytesToRead) : ""; + } + function stringToUTF8Array(str, heap, outIdx, maxBytesToWrite) { + if (!(maxBytesToWrite > 0)) + return 0; + var startIdx = outIdx; + var endIdx = outIdx + maxBytesToWrite - 1; + for (var i = 0; i < str.length; ++i) { + var u = str.charCodeAt(i); + if (u >= 55296 && u <= 57343) { + var u1 = str.charCodeAt(++i); + u = 65536 + ((u & 1023) << 10) | u1 & 1023; + } + if (u <= 127) { + if (outIdx >= endIdx) + break; + heap[outIdx++] = u; + } else if (u <= 2047) { + if (outIdx + 1 >= endIdx) + break; + heap[outIdx++] = 192 | u >> 6; + heap[outIdx++] = 128 | u & 63; + } else if (u <= 65535) { + if (outIdx + 2 >= endIdx) + break; + heap[outIdx++] = 224 | u >> 12; + heap[outIdx++] = 128 | u >> 6 & 63; + heap[outIdx++] = 128 | u & 63; + } else { + if (outIdx + 3 >= endIdx) + break; + heap[outIdx++] = 240 | u >> 18; + heap[outIdx++] = 128 | u >> 12 & 63; + heap[outIdx++] = 128 | u >> 6 & 63; + heap[outIdx++] = 128 | u & 63; + } + } + heap[outIdx] = 0; + return outIdx - startIdx; + } + function stringToUTF8(str, outPtr, maxBytesToWrite) { + return stringToUTF8Array(str, GROWABLE_HEAP_U8(), outPtr, maxBytesToWrite); + } + function lengthBytesUTF8(str) { + var len = 0; + for (var i = 0; i < str.length; ++i) { + var u = str.charCodeAt(i); + if (u >= 55296 && u <= 57343) + u = 65536 + ((u & 1023) << 10) | str.charCodeAt(++i) & 1023; + if (u <= 127) + ++len; + else if (u <= 2047) + len += 2; + else if (u <= 65535) + len += 3; + else + len += 4; + } + return len; + } + function writeArrayToMemory(array2, buffer3) { + GROWABLE_HEAP_I8().set(array2, buffer3); + } + function alignUp(x, multiple) { + if (x % multiple > 0) { + x += multiple - x % multiple; + } + return x; + } + var buffer2, HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64; + function updateGlobalBufferAndViews(buf) { + buffer2 = buf; + Module["HEAP8"] = HEAP8 = new Int8Array(buf); + Module["HEAP16"] = HEAP16 = new Int16Array(buf); + Module["HEAP32"] = HEAP32 = new Int32Array(buf); + Module["HEAPU8"] = HEAPU8 = new Uint8Array(buf); + Module["HEAPU16"] = HEAPU16 = new Uint16Array(buf); + Module["HEAPU32"] = HEAPU32 = new Uint32Array(buf); + Module["HEAPF32"] = HEAPF32 = new Float32Array(buf); + Module["HEAPF64"] = HEAPF64 = new Float64Array(buf); + } + var INITIAL_MEMORY = Module["INITIAL_MEMORY"] || 16777216; + if (ENVIRONMENT_IS_PTHREAD) { + wasmMemory = Module["wasmMemory"]; + buffer2 = Module["buffer"]; + } else { + if (Module["wasmMemory"]) { + wasmMemory = Module["wasmMemory"]; + } else { + wasmMemory = new WebAssembly.Memory({initial: INITIAL_MEMORY / 65536, maximum: 2147483648 / 65536, shared: true}); + if (!(wasmMemory.buffer instanceof SharedArrayBuffer)) { + err("requested a shared WebAssembly.Memory but the returned buffer is not a SharedArrayBuffer, indicating that while the browser has SharedArrayBuffer it does not have WebAssembly threads support - you may need to set a flag"); + if (ENVIRONMENT_IS_NODE) { + console.log("(on node you may need: --experimental-wasm-threads --experimental-wasm-bulk-memory and also use a recent version)"); + } + throw Error("bad memory"); + } + } + } + if (wasmMemory) { + buffer2 = wasmMemory.buffer; + } + INITIAL_MEMORY = buffer2.byteLength; + updateGlobalBufferAndViews(buffer2); + var wasmTable; + var __ATPRERUN__ = []; + var __ATINIT__ = []; + var __ATMAIN__ = []; + var __ATEXIT__ = []; + var __ATPOSTRUN__ = []; + var runtimeInitialized = false; + var runtimeExited = false; + if (!ENVIRONMENT_IS_PTHREAD) + __ATINIT__.push({func: function() { + ___wasm_call_ctors(); + }}); + if (ENVIRONMENT_IS_PTHREAD) + runtimeInitialized = true; + function preRun() { + if (ENVIRONMENT_IS_PTHREAD) + return; + if (Module["preRun"]) { + if (typeof Module["preRun"] == "function") + Module["preRun"] = [Module["preRun"]]; + while (Module["preRun"].length) { + addOnPreRun(Module["preRun"].shift()); + } + } + callRuntimeCallbacks(__ATPRERUN__); + } + function initRuntime() { + runtimeInitialized = true; + callRuntimeCallbacks(__ATINIT__); + } + function preMain() { + if (ENVIRONMENT_IS_PTHREAD) + return; + callRuntimeCallbacks(__ATMAIN__); + } + function exitRuntime() { + if (ENVIRONMENT_IS_PTHREAD) + return; + runtimeExited = true; + } + function postRun() { + if (ENVIRONMENT_IS_PTHREAD) + return; + if (Module["postRun"]) { + if (typeof Module["postRun"] == "function") + Module["postRun"] = [Module["postRun"]]; + while (Module["postRun"].length) { + addOnPostRun(Module["postRun"].shift()); + } + } + callRuntimeCallbacks(__ATPOSTRUN__); + } + function addOnPreRun(cb) { + __ATPRERUN__.unshift(cb); + } + function addOnPostRun(cb) { + __ATPOSTRUN__.unshift(cb); + } + var runDependencies = 0; + var runDependencyWatcher = null; + var dependenciesFulfilled = null; + function addRunDependency(id) { + assert3(!ENVIRONMENT_IS_PTHREAD, "addRunDependency cannot be used in a pthread worker"); + runDependencies++; + if (Module["monitorRunDependencies"]) { + Module["monitorRunDependencies"](runDependencies); + } + } + function removeRunDependency(id) { + runDependencies--; + if (Module["monitorRunDependencies"]) { + Module["monitorRunDependencies"](runDependencies); + } + if (runDependencies == 0) { + if (runDependencyWatcher !== null) { + clearInterval(runDependencyWatcher); + runDependencyWatcher = null; + } + if (dependenciesFulfilled) { + var callback = dependenciesFulfilled; + dependenciesFulfilled = null; + callback(); + } + } + } + Module["preloadedImages"] = {}; + Module["preloadedAudios"] = {}; + function abort(what) { + if (Module["onAbort"]) { + Module["onAbort"](what); + } + if (ENVIRONMENT_IS_PTHREAD) + console.error("Pthread aborting at " + new Error().stack); + what += ""; + err(what); + ABORT = true; + EXITSTATUS = 1; + what = "abort(" + what + "). Build with -s ASSERTIONS=1 for more info."; + var e = new WebAssembly.RuntimeError(what); + readyPromiseReject(e); + throw e; + } + function hasPrefix(str, prefix) { + return String.prototype.startsWith ? str.startsWith(prefix) : str.indexOf(prefix) === 0; + } + var dataURIPrefix = "data:application/octet-stream;base64,"; + function isDataURI(filename) { + return hasPrefix(filename, dataURIPrefix); + } + var fileURIPrefix = "file://"; + function isFileURI(filename) { + return hasPrefix(filename, fileURIPrefix); + } + var wasmBinaryFile = "tfjs-backend-wasm-threaded-simd.wasm"; + if (!isDataURI(wasmBinaryFile)) { + wasmBinaryFile = locateFile(wasmBinaryFile); + } + function getBinary(file) { + try { + if (file == wasmBinaryFile && wasmBinary) { + return new Uint8Array(wasmBinary); + } + if (readBinary) { + return readBinary(file); + } else { + throw "both async and sync fetching of the wasm failed"; + } + } catch (err2) { + abort(err2); + } + } + function getBinaryPromise() { + if (!wasmBinary && (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER)) { + if (typeof fetch === "function" && !isFileURI(wasmBinaryFile)) { + return fetch(wasmBinaryFile, {credentials: "same-origin"}).then(function(response) { + if (!response["ok"]) { + throw "failed to load wasm binary file at '" + wasmBinaryFile + "'"; + } + return response["arrayBuffer"](); + }).catch(function() { + return getBinary(wasmBinaryFile); + }); + } else { + if (readAsync) { + return new Promise(function(resolve, reject) { + readAsync(wasmBinaryFile, function(response) { + resolve(new Uint8Array(response)); + }, reject); + }); + } + } + } + return Promise.resolve().then(function() { + return getBinary(wasmBinaryFile); + }); + } + function createWasm() { + var info2 = {a: asmLibraryArg}; + function receiveInstance(instance, module2) { + var exports3 = instance.exports; + Module["asm"] = exports3; + wasmTable = Module["asm"]["F"]; + wasmModule = module2; + if (!ENVIRONMENT_IS_PTHREAD) { + var numWorkersToLoad = PThread.unusedWorkers.length; + PThread.unusedWorkers.forEach(function(w) { + PThread.loadWasmModuleToWorker(w, function() { + if (!--numWorkersToLoad) + removeRunDependency("wasm-instantiate"); + }); + }); + } + } + if (!ENVIRONMENT_IS_PTHREAD) { + addRunDependency("wasm-instantiate"); + } + function receiveInstantiatedSource(output) { + receiveInstance(output["instance"], output["module"]); + } + function instantiateArrayBuffer(receiver) { + return getBinaryPromise().then(function(binary) { + return WebAssembly.instantiate(binary, info2); + }).then(receiver, function(reason) { + err("failed to asynchronously prepare wasm: " + reason); + abort(reason); + }); + } + function instantiateAsync() { + if (!wasmBinary && typeof WebAssembly.instantiateStreaming === "function" && !isDataURI(wasmBinaryFile) && !isFileURI(wasmBinaryFile) && typeof fetch === "function") { + return fetch(wasmBinaryFile, {credentials: "same-origin"}).then(function(response) { + var result = WebAssembly.instantiateStreaming(response, info2); + return result.then(receiveInstantiatedSource, function(reason) { + err("wasm streaming compile failed: " + reason); + err("falling back to ArrayBuffer instantiation"); + return instantiateArrayBuffer(receiveInstantiatedSource); + }); + }); + } else { + return instantiateArrayBuffer(receiveInstantiatedSource); + } + } + if (Module["instantiateWasm"]) { + try { + var exports2 = Module["instantiateWasm"](info2, receiveInstance); + return exports2; + } catch (e) { + err("Module.instantiateWasm callback failed with error: " + e); + return false; + } + } + instantiateAsync().catch(readyPromiseReject); + return {}; + } + var ASM_CONSTS = {8991: function($0, $1) { + setTimeout(function() { + __emscripten_do_dispatch_to_thread($0, $1); + }, 0); + }}; + function initPthreadsJS() { + PThread.initRuntime(); + } + function callRuntimeCallbacks(callbacks2) { + while (callbacks2.length > 0) { + var callback = callbacks2.shift(); + if (typeof callback == "function") { + callback(Module); + continue; + } + var func2 = callback.func; + if (typeof func2 === "number") { + if (callback.arg === void 0) { + wasmTable.get(func2)(); + } else { + wasmTable.get(func2)(callback.arg); + } + } else { + func2(callback.arg === void 0 ? null : callback.arg); + } + } + } + function _emscripten_futex_wake(addr, count2) { + if (addr <= 0 || addr > GROWABLE_HEAP_I8().length || addr & true || count2 < 0) + return -28; + if (count2 == 0) + return 0; + if (count2 >= 2147483647) + count2 = Infinity; + var mainThreadWaitAddress = Atomics.load(GROWABLE_HEAP_I32(), __emscripten_main_thread_futex >> 2); + var mainThreadWoken = 0; + if (mainThreadWaitAddress == addr) { + var loadedAddr = Atomics.compareExchange(GROWABLE_HEAP_I32(), __emscripten_main_thread_futex >> 2, mainThreadWaitAddress, 0); + if (loadedAddr == mainThreadWaitAddress) { + --count2; + mainThreadWoken = 1; + if (count2 <= 0) + return 1; + } + } + var ret = Atomics.notify(GROWABLE_HEAP_I32(), addr >> 2, count2); + if (ret >= 0) + return ret + mainThreadWoken; + throw "Atomics.notify returned an unexpected value " + ret; + } + Module["_emscripten_futex_wake"] = _emscripten_futex_wake; + function killThread(pthread_ptr) { + if (ENVIRONMENT_IS_PTHREAD) + throw "Internal Error! killThread() can only ever be called from main application thread!"; + if (!pthread_ptr) + throw "Internal Error! Null pthread_ptr in killThread!"; + GROWABLE_HEAP_I32()[pthread_ptr + 12 >> 2] = 0; + var pthread = PThread.pthreads[pthread_ptr]; + pthread.worker.terminate(); + PThread.freeThreadData(pthread); + PThread.runningWorkers.splice(PThread.runningWorkers.indexOf(pthread.worker), 1); + pthread.worker.pthread = void 0; + } + function cancelThread(pthread_ptr) { + if (ENVIRONMENT_IS_PTHREAD) + throw "Internal Error! cancelThread() can only ever be called from main application thread!"; + if (!pthread_ptr) + throw "Internal Error! Null pthread_ptr in cancelThread!"; + var pthread = PThread.pthreads[pthread_ptr]; + pthread.worker.postMessage({cmd: "cancel"}); + } + function cleanupThread(pthread_ptr) { + if (ENVIRONMENT_IS_PTHREAD) + throw "Internal Error! cleanupThread() can only ever be called from main application thread!"; + if (!pthread_ptr) + throw "Internal Error! Null pthread_ptr in cleanupThread!"; + GROWABLE_HEAP_I32()[pthread_ptr + 12 >> 2] = 0; + var pthread = PThread.pthreads[pthread_ptr]; + if (pthread) { + var worker = pthread.worker; + PThread.returnWorkerToPool(worker); + } + } + var PThread = {unusedWorkers: [], runningWorkers: [], initMainThreadBlock: function() { + var pthreadPoolSize = 8; + for (var i = 0; i < pthreadPoolSize; ++i) { + PThread.allocateUnusedWorker(); + } + }, initRuntime: function() { + var tb = _malloc(228); + for (var i = 0; i < 228 / 4; ++i) + GROWABLE_HEAP_U32()[tb / 4 + i] = 0; + GROWABLE_HEAP_I32()[tb + 12 >> 2] = tb; + var headPtr = tb + 152; + GROWABLE_HEAP_I32()[headPtr >> 2] = headPtr; + var tlsMemory = _malloc(512); + for (var i = 0; i < 128; ++i) + GROWABLE_HEAP_U32()[tlsMemory / 4 + i] = 0; + Atomics.store(GROWABLE_HEAP_U32(), tb + 100 >> 2, tlsMemory); + Atomics.store(GROWABLE_HEAP_U32(), tb + 40 >> 2, tb); + __emscripten_thread_init(tb, !ENVIRONMENT_IS_WORKER, 1); + _emscripten_register_main_browser_thread_id(tb); + }, initWorker: function() { + }, pthreads: {}, threadExitHandlers: [], setThreadStatus: function() { + }, runExitHandlers: function() { + while (PThread.threadExitHandlers.length > 0) { + PThread.threadExitHandlers.pop()(); + } + if (ENVIRONMENT_IS_PTHREAD && _pthread_self()) + ___pthread_tsd_run_dtors(); + }, threadExit: function(exitCode) { + var tb = _pthread_self(); + if (tb) { + Atomics.store(GROWABLE_HEAP_U32(), tb + 4 >> 2, exitCode); + Atomics.store(GROWABLE_HEAP_U32(), tb + 0 >> 2, 1); + Atomics.store(GROWABLE_HEAP_U32(), tb + 56 >> 2, 1); + Atomics.store(GROWABLE_HEAP_U32(), tb + 60 >> 2, 0); + PThread.runExitHandlers(); + _emscripten_futex_wake(tb + 0, 2147483647); + __emscripten_thread_init(0, 0, 0); + if (ENVIRONMENT_IS_PTHREAD) { + postMessage({cmd: "exit"}); + } + } + }, threadCancel: function() { + PThread.runExitHandlers(); + var tb = _pthread_self(); + Atomics.store(GROWABLE_HEAP_U32(), tb + 4 >> 2, -1); + Atomics.store(GROWABLE_HEAP_U32(), tb + 0 >> 2, 1); + _emscripten_futex_wake(tb + 0, 2147483647); + __emscripten_thread_init(0, 0, 0); + postMessage({cmd: "cancelDone"}); + }, terminateAllThreads: function() { + for (var t in PThread.pthreads) { + var pthread = PThread.pthreads[t]; + if (pthread && pthread.worker) { + PThread.returnWorkerToPool(pthread.worker); + } + } + PThread.pthreads = {}; + for (var i = 0; i < PThread.unusedWorkers.length; ++i) { + var worker = PThread.unusedWorkers[i]; + worker.terminate(); + } + PThread.unusedWorkers = []; + for (var i = 0; i < PThread.runningWorkers.length; ++i) { + var worker = PThread.runningWorkers[i]; + var pthread = worker.pthread; + PThread.freeThreadData(pthread); + worker.terminate(); + } + PThread.runningWorkers = []; + }, freeThreadData: function(pthread) { + if (!pthread) + return; + if (pthread.threadInfoStruct) { + var tlsMemory = GROWABLE_HEAP_I32()[pthread.threadInfoStruct + 100 >> 2]; + GROWABLE_HEAP_I32()[pthread.threadInfoStruct + 100 >> 2] = 0; + _free(tlsMemory); + _free(pthread.threadInfoStruct); + } + pthread.threadInfoStruct = 0; + if (pthread.allocatedOwnStack && pthread.stackBase) + _free(pthread.stackBase); + pthread.stackBase = 0; + if (pthread.worker) + pthread.worker.pthread = null; + }, returnWorkerToPool: function(worker) { + PThread.runWithoutMainThreadQueuedCalls(function() { + delete PThread.pthreads[worker.pthread.threadInfoStruct]; + PThread.unusedWorkers.push(worker); + PThread.runningWorkers.splice(PThread.runningWorkers.indexOf(worker), 1); + PThread.freeThreadData(worker.pthread); + worker.pthread = void 0; + }); + }, runWithoutMainThreadQueuedCalls: function(func2) { + GROWABLE_HEAP_I32()[__emscripten_allow_main_runtime_queued_calls >> 2] = 0; + try { + func2(); + } finally { + GROWABLE_HEAP_I32()[__emscripten_allow_main_runtime_queued_calls >> 2] = 1; + } + }, receiveObjectTransfer: function(data2) { + }, loadWasmModuleToWorker: function(worker, onFinishedLoading) { + worker.onmessage = function(e) { + var d = e["data"]; + var cmd = d["cmd"]; + if (worker.pthread) + PThread.currentProxiedOperationCallerThread = worker.pthread.threadInfoStruct; + if (d["targetThread"] && d["targetThread"] != _pthread_self()) { + var thread = PThread.pthreads[d.targetThread]; + if (thread) { + thread.worker.postMessage(e.data, d["transferList"]); + } else { + console.error('Internal error! Worker sent a message "' + cmd + '" to target pthread ' + d["targetThread"] + ", but that thread no longer exists!"); + } + PThread.currentProxiedOperationCallerThread = void 0; + return; + } + if (cmd === "processQueuedMainThreadWork") { + _emscripten_main_thread_process_queued_calls(); + } else if (cmd === "spawnThread") { + spawnThread(e.data); + } else if (cmd === "cleanupThread") { + cleanupThread(d["thread"]); + } else if (cmd === "killThread") { + killThread(d["thread"]); + } else if (cmd === "cancelThread") { + cancelThread(d["thread"]); + } else if (cmd === "loaded") { + worker.loaded = true; + if (onFinishedLoading) + onFinishedLoading(worker); + if (worker.runPthread) { + worker.runPthread(); + delete worker.runPthread; + } + } else if (cmd === "print") { + out("Thread " + d["threadId"] + ": " + d["text"]); + } else if (cmd === "printErr") { + err("Thread " + d["threadId"] + ": " + d["text"]); + } else if (cmd === "alert") { + alert("Thread " + d["threadId"] + ": " + d["text"]); + } else if (cmd === "exit") { + var detached = worker.pthread && Atomics.load(GROWABLE_HEAP_U32(), worker.pthread.threadInfoStruct + 64 >> 2); + if (detached) { + PThread.returnWorkerToPool(worker); + } + } else if (cmd === "exitProcess") { + try { + exit(d["returnCode"]); + } catch (e2) { + if (e2 instanceof ExitStatus) + return; + throw e2; + } + } else if (cmd === "cancelDone") { + PThread.returnWorkerToPool(worker); + } else if (cmd === "objectTransfer") { + PThread.receiveObjectTransfer(e.data); + } else if (e.data.target === "setimmediate") { + worker.postMessage(e.data); + } else { + err("worker sent an unknown command " + cmd); + } + PThread.currentProxiedOperationCallerThread = void 0; + }; + worker.onerror = function(e) { + err("pthread sent an error! " + e.filename + ":" + e.lineno + ": " + e.message); + }; + if (ENVIRONMENT_IS_NODE) { + worker.on("message", function(data2) { + worker.onmessage({data: data2}); + }); + worker.on("error", function(data2) { + worker.onerror(data2); + }); + worker.on("exit", function(data2) { + }); + } + worker.postMessage({cmd: "load", urlOrBlob: Module["mainScriptUrlOrBlob"] || _scriptDir, wasmMemory, wasmModule}); + }, allocateUnusedWorker: function() { + var pthreadMainJs = locateFile("tfjs-backend-wasm-threaded-simd.worker.js"); + PThread.unusedWorkers.push(new Worker(pthreadMainJs)); + }, getNewWorker: function() { + if (PThread.unusedWorkers.length == 0) { + PThread.allocateUnusedWorker(); + PThread.loadWasmModuleToWorker(PThread.unusedWorkers[0]); + } + if (PThread.unusedWorkers.length > 0) + return PThread.unusedWorkers.pop(); + else + return null; + }, busySpinWait: function(msecs) { + var t = performance.now() + msecs; + while (performance.now() < t) { + } + }}; + function establishStackSpace(stackTop, stackMax) { + _emscripten_stack_set_limits(stackTop, stackMax); + stackRestore(stackTop); + } + Module["establishStackSpace"] = establishStackSpace; + function getNoExitRuntime() { + return noExitRuntime; + } + Module["getNoExitRuntime"] = getNoExitRuntime; + function invokeEntryPoint(ptr, arg) { + return wasmTable.get(ptr)(arg); + } + Module["invokeEntryPoint"] = invokeEntryPoint; + function ___assert_fail(condition, filename, line, func2) { + abort("Assertion failed: " + UTF8ToString(condition) + ", at: " + [filename ? UTF8ToString(filename) : "unknown filename", line, func2 ? UTF8ToString(func2) : "unknown function"]); + } + function ___call_main(argc, argv) { + var returnCode = _main(argc, argv); + } + var _emscripten_get_now; + if (ENVIRONMENT_IS_NODE) { + _emscripten_get_now = function() { + var t = process["hrtime"](); + return t[0] * 1e3 + t[1] / 1e6; + }; + } else if (ENVIRONMENT_IS_PTHREAD) { + _emscripten_get_now = function() { + return performance.now() - Module["__performance_now_clock_drift"]; + }; + } else if (typeof dateNow !== "undefined") { + _emscripten_get_now = dateNow; + } else + _emscripten_get_now = function() { + return performance.now(); + }; + function setErrNo(value) { + GROWABLE_HEAP_I32()[___errno_location() >> 2] = value; + return value; + } + function _atexit(func2, arg) { + if (ENVIRONMENT_IS_PTHREAD) + return _emscripten_proxy_to_main_thread_js(1, 1, func2, arg); + } + function __emscripten_notify_thread_queue(targetThreadId, mainThreadId) { + if (targetThreadId == mainThreadId) { + postMessage({cmd: "processQueuedMainThreadWork"}); + } else if (ENVIRONMENT_IS_PTHREAD) { + postMessage({targetThread: targetThreadId, cmd: "processThreadQueue"}); + } else { + var pthread = PThread.pthreads[targetThreadId]; + var worker = pthread && pthread.worker; + if (!worker) { + return; + } + worker.postMessage({cmd: "processThreadQueue"}); + } + return 1; + } + function _abort() { + abort(); + } + function _emscripten_asm_const_int(code, sigPtr, argbuf) { + var args = readAsmConstArgs(sigPtr, argbuf); + return ASM_CONSTS[code].apply(null, args); + } + function _emscripten_conditional_set_current_thread_status(expectedStatus, newStatus) { + } + function _emscripten_futex_wait(addr, val, timeout) { + if (addr <= 0 || addr > GROWABLE_HEAP_I8().length || addr & true) + return -28; + if (!ENVIRONMENT_IS_WEB) { + var ret = Atomics.wait(GROWABLE_HEAP_I32(), addr >> 2, val, timeout); + if (ret === "timed-out") + return -73; + if (ret === "not-equal") + return -6; + if (ret === "ok") + return 0; + throw "Atomics.wait returned an unexpected value " + ret; + } else { + if (Atomics.load(GROWABLE_HEAP_I32(), addr >> 2) != val) { + return -6; + } + var tNow = performance.now(); + var tEnd = tNow + timeout; + var lastAddr = Atomics.exchange(GROWABLE_HEAP_I32(), __emscripten_main_thread_futex >> 2, addr); + while (1) { + tNow = performance.now(); + if (tNow > tEnd) { + lastAddr = Atomics.exchange(GROWABLE_HEAP_I32(), __emscripten_main_thread_futex >> 2, 0); + return -73; + } + lastAddr = Atomics.exchange(GROWABLE_HEAP_I32(), __emscripten_main_thread_futex >> 2, 0); + if (lastAddr == 0) { + break; + } + _emscripten_main_thread_process_queued_calls(); + if (Atomics.load(GROWABLE_HEAP_I32(), addr >> 2) != val) { + return -6; + } + lastAddr = Atomics.exchange(GROWABLE_HEAP_I32(), __emscripten_main_thread_futex >> 2, addr); + } + return 0; + } + } + function _emscripten_memcpy_big(dest, src, num) { + GROWABLE_HEAP_U8().copyWithin(dest, src, src + num); + } + function _emscripten_num_logical_cores() { + if (ENVIRONMENT_IS_NODE) + return require("os").cpus().length; + return navigator["hardwareConcurrency"]; + } + function _emscripten_proxy_to_main_thread_js(index, sync) { + var numCallArgs = arguments.length - 2; + var stack2 = stackSave(); + var serializedNumCallArgs = numCallArgs; + var args = stackAlloc(serializedNumCallArgs * 8); + var b = args >> 3; + for (var i = 0; i < numCallArgs; i++) { + var arg = arguments[2 + i]; + GROWABLE_HEAP_F64()[b + i] = arg; + } + var ret = _emscripten_run_in_main_runtime_thread_js(index, serializedNumCallArgs, args, sync); + stackRestore(stack2); + return ret; + } + var _emscripten_receive_on_main_thread_js_callArgs = []; + var readAsmConstArgsArray = []; + function readAsmConstArgs(sigPtr, buf) { + readAsmConstArgsArray.length = 0; + var ch; + buf >>= 2; + while (ch = GROWABLE_HEAP_U8()[sigPtr++]) { + var double = ch < 105; + if (double && buf & 1) + buf++; + readAsmConstArgsArray.push(double ? GROWABLE_HEAP_F64()[buf++ >> 1] : GROWABLE_HEAP_I32()[buf]); + ++buf; + } + return readAsmConstArgsArray; + } + function _emscripten_receive_on_main_thread_js(index, numCallArgs, args) { + _emscripten_receive_on_main_thread_js_callArgs.length = numCallArgs; + var b = args >> 3; + for (var i = 0; i < numCallArgs; i++) { + _emscripten_receive_on_main_thread_js_callArgs[i] = GROWABLE_HEAP_F64()[b + i]; + } + var isEmAsmConst = index < 0; + var func2 = !isEmAsmConst ? proxiedFunctionTable[index] : ASM_CONSTS[-index - 1]; + return func2.apply(null, _emscripten_receive_on_main_thread_js_callArgs); + } + function _emscripten_get_heap_size() { + return GROWABLE_HEAP_U8().length; + } + function emscripten_realloc_buffer(size) { + try { + wasmMemory.grow(size - buffer2.byteLength + 65535 >>> 16); + updateGlobalBufferAndViews(wasmMemory.buffer); + return 1; + } catch (e) { + } + } + function _emscripten_resize_heap(requestedSize) { + var oldSize = _emscripten_get_heap_size(); + if (requestedSize <= oldSize) { + return false; + } + var maxHeapSize = 2147483648; + if (requestedSize > maxHeapSize) { + return false; + } + for (var cutDown = 1; cutDown <= 4; cutDown *= 2) { + var overGrownHeapSize = oldSize * (1 + 0.2 / cutDown); + overGrownHeapSize = Math.min(overGrownHeapSize, requestedSize + 100663296); + var newSize = Math.min(maxHeapSize, alignUp(Math.max(requestedSize, overGrownHeapSize), 65536)); + var replacement = emscripten_realloc_buffer(newSize); + if (replacement) { + return true; + } + } + return false; + } + var JSEvents = {inEventHandler: 0, removeAllEventListeners: function() { + for (var i = JSEvents.eventHandlers.length - 1; i >= 0; --i) { + JSEvents._removeHandler(i); + } + JSEvents.eventHandlers = []; + JSEvents.deferredCalls = []; + }, registerRemoveEventListeners: function() { + if (!JSEvents.removeEventListenersRegistered) { + __ATEXIT__.push(JSEvents.removeAllEventListeners); + JSEvents.removeEventListenersRegistered = true; + } + }, deferredCalls: [], deferCall: function(targetFunction, precedence, argsList) { + function arraysHaveEqualContent(arrA, arrB) { + if (arrA.length != arrB.length) + return false; + for (var i2 in arrA) { + if (arrA[i2] != arrB[i2]) + return false; + } + return true; + } + for (var i in JSEvents.deferredCalls) { + var call = JSEvents.deferredCalls[i]; + if (call.targetFunction == targetFunction && arraysHaveEqualContent(call.argsList, argsList)) { + return; + } + } + JSEvents.deferredCalls.push({targetFunction, precedence, argsList}); + JSEvents.deferredCalls.sort(function(x, y) { + return x.precedence < y.precedence; + }); + }, removeDeferredCalls: function(targetFunction) { + for (var i = 0; i < JSEvents.deferredCalls.length; ++i) { + if (JSEvents.deferredCalls[i].targetFunction == targetFunction) { + JSEvents.deferredCalls.splice(i, 1); + --i; + } + } + }, canPerformEventHandlerRequests: function() { + return JSEvents.inEventHandler && JSEvents.currentEventHandler.allowsDeferredCalls; + }, runDeferredCalls: function() { + if (!JSEvents.canPerformEventHandlerRequests()) { + return; + } + for (var i = 0; i < JSEvents.deferredCalls.length; ++i) { + var call = JSEvents.deferredCalls[i]; + JSEvents.deferredCalls.splice(i, 1); + --i; + call.targetFunction.apply(null, call.argsList); + } + }, eventHandlers: [], removeAllHandlersOnTarget: function(target, eventTypeString) { + for (var i = 0; i < JSEvents.eventHandlers.length; ++i) { + if (JSEvents.eventHandlers[i].target == target && (!eventTypeString || eventTypeString == JSEvents.eventHandlers[i].eventTypeString)) { + JSEvents._removeHandler(i--); + } + } + }, _removeHandler: function(i) { + var h = JSEvents.eventHandlers[i]; + h.target.removeEventListener(h.eventTypeString, h.eventListenerFunc, h.useCapture); + JSEvents.eventHandlers.splice(i, 1); + }, registerOrRemoveHandler: function(eventHandler) { + var jsEventHandler = function jsEventHandler2(event) { + ++JSEvents.inEventHandler; + JSEvents.currentEventHandler = eventHandler; + JSEvents.runDeferredCalls(); + eventHandler.handlerFunc(event); + JSEvents.runDeferredCalls(); + --JSEvents.inEventHandler; + }; + if (eventHandler.callbackfunc) { + eventHandler.eventListenerFunc = jsEventHandler; + eventHandler.target.addEventListener(eventHandler.eventTypeString, jsEventHandler, eventHandler.useCapture); + JSEvents.eventHandlers.push(eventHandler); + JSEvents.registerRemoveEventListeners(); + } else { + for (var i = 0; i < JSEvents.eventHandlers.length; ++i) { + if (JSEvents.eventHandlers[i].target == eventHandler.target && JSEvents.eventHandlers[i].eventTypeString == eventHandler.eventTypeString) { + JSEvents._removeHandler(i--); + } + } + } + }, queueEventHandlerOnThread_iiii: function(targetThread, eventHandlerFunc, eventTypeId, eventData, userData) { + var stackTop = stackSave(); + var varargs = stackAlloc(12); + GROWABLE_HEAP_I32()[varargs >> 2] = eventTypeId; + GROWABLE_HEAP_I32()[varargs + 4 >> 2] = eventData; + GROWABLE_HEAP_I32()[varargs + 8 >> 2] = userData; + __emscripten_call_on_thread(0, targetThread, 637534208, eventHandlerFunc, eventData, varargs); + stackRestore(stackTop); + }, getTargetThreadForEventCallback: function(targetThread) { + switch (targetThread) { + case 1: + return 0; + case 2: + return PThread.currentProxiedOperationCallerThread; + default: + return targetThread; + } + }, getNodeNameForTarget: function(target) { + if (!target) + return ""; + if (target == window) + return "#window"; + if (target == screen) + return "#screen"; + return target && target.nodeName ? target.nodeName : ""; + }, fullscreenEnabled: function() { + return document.fullscreenEnabled || document.webkitFullscreenEnabled; + }}; + function stringToNewUTF8(jsString) { + var length = lengthBytesUTF8(jsString) + 1; + var cString = _malloc(length); + stringToUTF8(jsString, cString, length); + return cString; + } + function _emscripten_set_offscreencanvas_size_on_target_thread_js(targetThread, targetCanvas, width, height) { + var stackTop = stackSave(); + var varargs = stackAlloc(12); + var targetCanvasPtr = 0; + if (targetCanvas) { + targetCanvasPtr = stringToNewUTF8(targetCanvas); + } + GROWABLE_HEAP_I32()[varargs >> 2] = targetCanvasPtr; + GROWABLE_HEAP_I32()[varargs + 4 >> 2] = width; + GROWABLE_HEAP_I32()[varargs + 8 >> 2] = height; + __emscripten_call_on_thread(0, targetThread, 657457152, 0, targetCanvasPtr, varargs); + stackRestore(stackTop); + } + function _emscripten_set_offscreencanvas_size_on_target_thread(targetThread, targetCanvas, width, height) { + targetCanvas = targetCanvas ? UTF8ToString(targetCanvas) : ""; + _emscripten_set_offscreencanvas_size_on_target_thread_js(targetThread, targetCanvas, width, height); + } + function maybeCStringToJsString(cString) { + return cString > 2 ? UTF8ToString(cString) : cString; + } + var specialHTMLTargets = [0, typeof document !== "undefined" ? document : 0, typeof window !== "undefined" ? window : 0]; + function findEventTarget(target) { + target = maybeCStringToJsString(target); + var domElement = specialHTMLTargets[target] || (typeof document !== "undefined" ? document.querySelector(target) : void 0); + return domElement; + } + function findCanvasEventTarget(target) { + return findEventTarget(target); + } + function _emscripten_set_canvas_element_size_calling_thread(target, width, height) { + var canvas2 = findCanvasEventTarget(target); + if (!canvas2) + return -4; + if (canvas2.canvasSharedPtr) { + GROWABLE_HEAP_I32()[canvas2.canvasSharedPtr >> 2] = width; + GROWABLE_HEAP_I32()[canvas2.canvasSharedPtr + 4 >> 2] = height; + } + if (canvas2.offscreenCanvas || !canvas2.controlTransferredOffscreen) { + if (canvas2.offscreenCanvas) + canvas2 = canvas2.offscreenCanvas; + var autoResizeViewport = false; + if (canvas2.GLctxObject && canvas2.GLctxObject.GLctx) { + var prevViewport = canvas2.GLctxObject.GLctx.getParameter(2978); + autoResizeViewport = prevViewport[0] === 0 && prevViewport[1] === 0 && prevViewport[2] === canvas2.width && prevViewport[3] === canvas2.height; + } + canvas2.width = width; + canvas2.height = height; + if (autoResizeViewport) { + canvas2.GLctxObject.GLctx.viewport(0, 0, width, height); + } + } else if (canvas2.canvasSharedPtr) { + var targetThread = GROWABLE_HEAP_I32()[canvas2.canvasSharedPtr + 8 >> 2]; + _emscripten_set_offscreencanvas_size_on_target_thread(targetThread, target, width, height); + return 1; + } else { + return -4; + } + return 0; + } + function _emscripten_set_canvas_element_size_main_thread(target, width, height) { + if (ENVIRONMENT_IS_PTHREAD) + return _emscripten_proxy_to_main_thread_js(2, 1, target, width, height); + return _emscripten_set_canvas_element_size_calling_thread(target, width, height); + } + function _emscripten_set_canvas_element_size(target, width, height) { + var canvas2 = findCanvasEventTarget(target); + if (canvas2) { + return _emscripten_set_canvas_element_size_calling_thread(target, width, height); + } else { + return _emscripten_set_canvas_element_size_main_thread(target, width, height); + } + } + function _emscripten_set_current_thread_status(newStatus) { + } + function _emscripten_set_thread_name(threadId, name) { + } + function __webgl_enable_ANGLE_instanced_arrays(ctx) { + var ext = ctx.getExtension("ANGLE_instanced_arrays"); + if (ext) { + ctx["vertexAttribDivisor"] = function(index, divisor) { + ext["vertexAttribDivisorANGLE"](index, divisor); + }; + ctx["drawArraysInstanced"] = function(mode, first, count2, primcount) { + ext["drawArraysInstancedANGLE"](mode, first, count2, primcount); + }; + ctx["drawElementsInstanced"] = function(mode, count2, type, indices, primcount) { + ext["drawElementsInstancedANGLE"](mode, count2, type, indices, primcount); + }; + return 1; + } + } + function __webgl_enable_OES_vertex_array_object(ctx) { + var ext = ctx.getExtension("OES_vertex_array_object"); + if (ext) { + ctx["createVertexArray"] = function() { + return ext["createVertexArrayOES"](); + }; + ctx["deleteVertexArray"] = function(vao) { + ext["deleteVertexArrayOES"](vao); + }; + ctx["bindVertexArray"] = function(vao) { + ext["bindVertexArrayOES"](vao); + }; + ctx["isVertexArray"] = function(vao) { + return ext["isVertexArrayOES"](vao); + }; + return 1; + } + } + function __webgl_enable_WEBGL_draw_buffers(ctx) { + var ext = ctx.getExtension("WEBGL_draw_buffers"); + if (ext) { + ctx["drawBuffers"] = function(n, bufs) { + ext["drawBuffersWEBGL"](n, bufs); + }; + return 1; + } + } + function __webgl_enable_WEBGL_multi_draw(ctx) { + return !!(ctx.multiDrawWebgl = ctx.getExtension("WEBGL_multi_draw")); + } + var GL = {counter: 1, buffers: [], programs: [], framebuffers: [], renderbuffers: [], textures: [], uniforms: [], shaders: [], vaos: [], contexts: {}, offscreenCanvases: {}, timerQueriesEXT: [], programInfos: {}, stringCache: {}, unpackAlignment: 4, recordError: function recordError(errorCode) { + if (!GL.lastError) { + GL.lastError = errorCode; + } + }, getNewId: function(table) { + var ret = GL.counter++; + for (var i = table.length; i < ret; i++) { + table[i] = null; + } + return ret; + }, getSource: function(shader, count2, string, length) { + var source = ""; + for (var i = 0; i < count2; ++i) { + var len = length ? GROWABLE_HEAP_I32()[length + i * 4 >> 2] : -1; + source += UTF8ToString(GROWABLE_HEAP_I32()[string + i * 4 >> 2], len < 0 ? void 0 : len); + } + return source; + }, createContext: function(canvas2, webGLContextAttributes) { + var ctx = canvas2.getContext("webgl", webGLContextAttributes); + if (!ctx) + return 0; + var handle = GL.registerContext(ctx, webGLContextAttributes); + return handle; + }, registerContext: function(ctx, webGLContextAttributes) { + var handle = _malloc(8); + GROWABLE_HEAP_I32()[handle + 4 >> 2] = _pthread_self(); + var context = {handle, attributes: webGLContextAttributes, version: webGLContextAttributes.majorVersion, GLctx: ctx}; + if (ctx.canvas) + ctx.canvas.GLctxObject = context; + GL.contexts[handle] = context; + if (typeof webGLContextAttributes.enableExtensionsByDefault === "undefined" || webGLContextAttributes.enableExtensionsByDefault) { + GL.initExtensions(context); + } + return handle; + }, makeContextCurrent: function(contextHandle) { + GL.currentContext = GL.contexts[contextHandle]; + Module.ctx = GLctx = GL.currentContext && GL.currentContext.GLctx; + return !(contextHandle && !GLctx); + }, getContext: function(contextHandle) { + return GL.contexts[contextHandle]; + }, deleteContext: function(contextHandle) { + if (GL.currentContext === GL.contexts[contextHandle]) + GL.currentContext = null; + if (typeof JSEvents === "object") + JSEvents.removeAllHandlersOnTarget(GL.contexts[contextHandle].GLctx.canvas); + if (GL.contexts[contextHandle] && GL.contexts[contextHandle].GLctx.canvas) + GL.contexts[contextHandle].GLctx.canvas.GLctxObject = void 0; + _free(GL.contexts[contextHandle].handle); + GL.contexts[contextHandle] = null; + }, initExtensions: function(context) { + if (!context) + context = GL.currentContext; + if (context.initExtensionsDone) + return; + context.initExtensionsDone = true; + var GLctx2 = context.GLctx; + __webgl_enable_ANGLE_instanced_arrays(GLctx2); + __webgl_enable_OES_vertex_array_object(GLctx2); + __webgl_enable_WEBGL_draw_buffers(GLctx2); + GLctx2.disjointTimerQueryExt = GLctx2.getExtension("EXT_disjoint_timer_query"); + __webgl_enable_WEBGL_multi_draw(GLctx2); + var exts = GLctx2.getSupportedExtensions() || []; + exts.forEach(function(ext) { + if (ext.indexOf("lose_context") < 0 && ext.indexOf("debug") < 0) { + GLctx2.getExtension(ext); + } + }); + }, populateUniformTable: function(program) { + var p2 = GL.programs[program]; + var ptable = GL.programInfos[program] = {uniforms: {}, maxUniformLength: 0, maxAttributeLength: -1, maxUniformBlockNameLength: -1}; + var utable = ptable.uniforms; + var numUniforms = GLctx.getProgramParameter(p2, 35718); + for (var i = 0; i < numUniforms; ++i) { + var u = GLctx.getActiveUniform(p2, i); + var name = u.name; + ptable.maxUniformLength = Math.max(ptable.maxUniformLength, name.length + 1); + if (name.slice(-1) == "]") { + name = name.slice(0, name.lastIndexOf("[")); + } + var loc = GLctx.getUniformLocation(p2, name); + if (loc) { + var id = GL.getNewId(GL.uniforms); + utable[name] = [u.size, id]; + GL.uniforms[id] = loc; + for (var j = 1; j < u.size; ++j) { + var n = name + "[" + j + "]"; + loc = GLctx.getUniformLocation(p2, n); + id = GL.getNewId(GL.uniforms); + GL.uniforms[id] = loc; + } + } + } + }}; + var __emscripten_webgl_power_preferences = ["default", "low-power", "high-performance"]; + function _emscripten_webgl_do_create_context(target, attributes) { + var a = attributes >> 2; + var powerPreference = GROWABLE_HEAP_I32()[a + (24 >> 2)]; + var contextAttributes = {alpha: !!GROWABLE_HEAP_I32()[a + (0 >> 2)], depth: !!GROWABLE_HEAP_I32()[a + (4 >> 2)], stencil: !!GROWABLE_HEAP_I32()[a + (8 >> 2)], antialias: !!GROWABLE_HEAP_I32()[a + (12 >> 2)], premultipliedAlpha: !!GROWABLE_HEAP_I32()[a + (16 >> 2)], preserveDrawingBuffer: !!GROWABLE_HEAP_I32()[a + (20 >> 2)], powerPreference: __emscripten_webgl_power_preferences[powerPreference], failIfMajorPerformanceCaveat: !!GROWABLE_HEAP_I32()[a + (28 >> 2)], majorVersion: GROWABLE_HEAP_I32()[a + (32 >> 2)], minorVersion: GROWABLE_HEAP_I32()[a + (36 >> 2)], enableExtensionsByDefault: GROWABLE_HEAP_I32()[a + (40 >> 2)], explicitSwapControl: GROWABLE_HEAP_I32()[a + (44 >> 2)], proxyContextToMainThread: GROWABLE_HEAP_I32()[a + (48 >> 2)], renderViaOffscreenBackBuffer: GROWABLE_HEAP_I32()[a + (52 >> 2)]}; + var canvas2 = findCanvasEventTarget(target); + if (!canvas2) { + return 0; + } + if (contextAttributes.explicitSwapControl) { + return 0; + } + var contextHandle = GL.createContext(canvas2, contextAttributes); + return contextHandle; + } + function _emscripten_webgl_create_context(a0, a12) { + return _emscripten_webgl_do_create_context(a0, a12); + } + var SYSCALLS = {mappings: {}, buffers: [null, [], []], printChar: function(stream, curr) { + var buffer3 = SYSCALLS.buffers[stream]; + if (curr === 0 || curr === 10) { + (stream === 1 ? out : err)(UTF8ArrayToString(buffer3, 0)); + buffer3.length = 0; + } else { + buffer3.push(curr); + } + }, varargs: void 0, get: function() { + SYSCALLS.varargs += 4; + var ret = GROWABLE_HEAP_I32()[SYSCALLS.varargs - 4 >> 2]; + return ret; + }, getStr: function(ptr) { + var ret = UTF8ToString(ptr); + return ret; + }, get64: function(low, high) { + return low; + }}; + function _fd_close(fd) { + if (ENVIRONMENT_IS_PTHREAD) + return _emscripten_proxy_to_main_thread_js(3, 1, fd); + return 0; + } + function _fd_seek(fd, offset_low, offset_high, whence, newOffset) { + if (ENVIRONMENT_IS_PTHREAD) + return _emscripten_proxy_to_main_thread_js(4, 1, fd, offset_low, offset_high, whence, newOffset); + } + function _fd_write(fd, iov, iovcnt, pnum) { + if (ENVIRONMENT_IS_PTHREAD) + return _emscripten_proxy_to_main_thread_js(5, 1, fd, iov, iovcnt, pnum); + var num = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = GROWABLE_HEAP_I32()[iov + i * 8 >> 2]; + var len = GROWABLE_HEAP_I32()[iov + (i * 8 + 4) >> 2]; + for (var j = 0; j < len; j++) { + SYSCALLS.printChar(fd, GROWABLE_HEAP_U8()[ptr + j]); + } + num += len; + } + GROWABLE_HEAP_I32()[pnum >> 2] = num; + return 0; + } + function _pthread_cleanup_pop(execute2) { + var routine = PThread.threadExitHandlers.pop(); + if (execute2) + routine(); + } + function _pthread_cleanup_push(routine, arg) { + PThread.threadExitHandlers.push(function() { + wasmTable.get(routine)(arg); + }); + } + function spawnThread(threadParams) { + if (ENVIRONMENT_IS_PTHREAD) + throw "Internal Error! spawnThread() can only ever be called from main application thread!"; + var worker = PThread.getNewWorker(); + if (worker.pthread !== void 0) + throw "Internal error!"; + if (!threadParams.pthread_ptr) + throw "Internal error, no pthread ptr!"; + PThread.runningWorkers.push(worker); + var tlsMemory = _malloc(128 * 4); + for (var i = 0; i < 128; ++i) { + GROWABLE_HEAP_I32()[tlsMemory + i * 4 >> 2] = 0; + } + var stackHigh = threadParams.stackBase + threadParams.stackSize; + var pthread = PThread.pthreads[threadParams.pthread_ptr] = {worker, stackBase: threadParams.stackBase, stackSize: threadParams.stackSize, allocatedOwnStack: threadParams.allocatedOwnStack, threadInfoStruct: threadParams.pthread_ptr}; + var tis = pthread.threadInfoStruct >> 2; + Atomics.store(GROWABLE_HEAP_U32(), tis + (64 >> 2), threadParams.detached); + Atomics.store(GROWABLE_HEAP_U32(), tis + (100 >> 2), tlsMemory); + Atomics.store(GROWABLE_HEAP_U32(), tis + (40 >> 2), pthread.threadInfoStruct); + Atomics.store(GROWABLE_HEAP_U32(), tis + (80 >> 2), threadParams.stackSize); + Atomics.store(GROWABLE_HEAP_U32(), tis + (76 >> 2), stackHigh); + Atomics.store(GROWABLE_HEAP_U32(), tis + (104 >> 2), threadParams.stackSize); + Atomics.store(GROWABLE_HEAP_U32(), tis + (104 + 8 >> 2), stackHigh); + Atomics.store(GROWABLE_HEAP_U32(), tis + (104 + 12 >> 2), threadParams.detached); + var global_libc = _emscripten_get_global_libc(); + var global_locale = global_libc + 40; + Atomics.store(GROWABLE_HEAP_U32(), tis + (172 >> 2), global_locale); + worker.pthread = pthread; + var msg = {cmd: "run", start_routine: threadParams.startRoutine, arg: threadParams.arg, threadInfoStruct: threadParams.pthread_ptr, stackBase: threadParams.stackBase, stackSize: threadParams.stackSize}; + worker.runPthread = function() { + msg.time = performance.now(); + worker.postMessage(msg, threadParams.transferList); + }; + if (worker.loaded) { + worker.runPthread(); + delete worker.runPthread; + } + } + function _pthread_create(pthread_ptr, attr, start_routine, arg) { + if (typeof SharedArrayBuffer === "undefined") { + err("Current environment does not support SharedArrayBuffer, pthreads are not available!"); + return 6; + } + if (!pthread_ptr) { + err("pthread_create called with a null thread pointer!"); + return 28; + } + var transferList = []; + var error = 0; + if (ENVIRONMENT_IS_PTHREAD && (transferList.length === 0 || error)) { + return _emscripten_sync_run_in_main_thread_4(687865856, pthread_ptr, attr, start_routine, arg); + } + if (error) + return error; + var stackSize = 0; + var stackBase = 0; + var detached = 0; + if (attr && attr != -1) { + stackSize = GROWABLE_HEAP_I32()[attr >> 2]; + stackSize += 81920; + stackBase = GROWABLE_HEAP_I32()[attr + 8 >> 2]; + detached = GROWABLE_HEAP_I32()[attr + 12 >> 2] !== 0; + } else { + stackSize = 2097152; + } + var allocatedOwnStack = stackBase == 0; + if (allocatedOwnStack) { + stackBase = _memalign(16, stackSize); + } else { + stackBase -= stackSize; + assert3(stackBase > 0); + } + var threadInfoStruct = _malloc(228); + for (var i = 0; i < 228 >> 2; ++i) + GROWABLE_HEAP_U32()[(threadInfoStruct >> 2) + i] = 0; + GROWABLE_HEAP_I32()[pthread_ptr >> 2] = threadInfoStruct; + GROWABLE_HEAP_I32()[threadInfoStruct + 12 >> 2] = threadInfoStruct; + var headPtr = threadInfoStruct + 152; + GROWABLE_HEAP_I32()[headPtr >> 2] = headPtr; + var threadParams = {stackBase, stackSize, allocatedOwnStack, detached, startRoutine: start_routine, pthread_ptr: threadInfoStruct, arg, transferList}; + if (ENVIRONMENT_IS_PTHREAD) { + threadParams.cmd = "spawnThread"; + postMessage(threadParams, transferList); + } else { + spawnThread(threadParams); + } + return 0; + } + function _sysconf(name) { + if (ENVIRONMENT_IS_PTHREAD) + return _emscripten_proxy_to_main_thread_js(6, 1, name); + switch (name) { + case 30: + return 16384; + case 85: + var maxHeapSize = 2147483648; + return maxHeapSize / 16384; + case 132: + case 133: + case 12: + case 137: + case 138: + case 15: + case 235: + case 16: + case 17: + case 18: + case 19: + case 20: + case 149: + case 13: + case 10: + case 236: + case 153: + case 9: + case 21: + case 22: + case 159: + case 154: + case 14: + case 77: + case 78: + case 139: + case 82: + case 68: + case 67: + case 164: + case 11: + case 29: + case 47: + case 48: + case 95: + case 52: + case 51: + case 46: + return 200809; + case 27: + case 246: + case 127: + case 128: + case 23: + case 24: + case 160: + case 161: + case 181: + case 182: + case 242: + case 183: + case 184: + case 243: + case 244: + case 245: + case 165: + case 178: + case 179: + case 49: + case 50: + case 168: + case 169: + case 175: + case 170: + case 171: + case 172: + case 97: + case 76: + case 32: + case 173: + case 35: + case 80: + case 81: + case 79: + return -1; + case 176: + case 177: + case 7: + case 155: + case 8: + case 157: + case 125: + case 126: + case 92: + case 93: + case 129: + case 130: + case 131: + case 94: + case 91: + return 1; + case 74: + case 60: + case 69: + case 70: + case 4: + return 1024; + case 31: + case 42: + case 72: + return 32; + case 87: + case 26: + case 33: + return 2147483647; + case 34: + case 1: + return 47839; + case 38: + case 36: + return 99; + case 43: + case 37: + return 2048; + case 0: + return 2097152; + case 3: + return 65536; + case 28: + return 32768; + case 44: + return 32767; + case 75: + return 16384; + case 39: + return 1e3; + case 89: + return 700; + case 71: + return 256; + case 40: + return 255; + case 2: + return 100; + case 180: + return 64; + case 25: + return 20; + case 5: + return 16; + case 6: + return 6; + case 73: + return 4; + case 84: { + if (typeof navigator === "object") + return navigator["hardwareConcurrency"] || 1; + return 1; + } + } + setErrNo(28); + return -1; + } + if (!ENVIRONMENT_IS_PTHREAD) + PThread.initMainThreadBlock(); + var GLctx; + var proxiedFunctionTable = [null, _atexit, _emscripten_set_canvas_element_size_main_thread, _fd_close, _fd_seek, _fd_write, _sysconf]; + var asmLibraryArg = {e: ___assert_fail, r: ___call_main, x: __emscripten_notify_thread_queue, b: _abort, y: _emscripten_asm_const_int, j: _emscripten_conditional_set_current_thread_status, c: _emscripten_futex_wait, d: _emscripten_futex_wake, f: _emscripten_get_now, p: _emscripten_memcpy_big, z: _emscripten_num_logical_cores, u: _emscripten_receive_on_main_thread_js, q: _emscripten_resize_heap, v: _emscripten_set_canvas_element_size, i: _emscripten_set_current_thread_status, t: _emscripten_set_thread_name, w: _emscripten_webgl_create_context, m: _fd_close, n: _fd_seek, g: _fd_write, o: initPthreadsJS, a: wasmMemory || Module["wasmMemory"], k: _pthread_cleanup_pop, l: _pthread_cleanup_push, h: _pthread_create, s: _sysconf}; + var asm = createWasm(); + var ___wasm_call_ctors = Module["___wasm_call_ctors"] = function() { + return (___wasm_call_ctors = Module["___wasm_call_ctors"] = Module["asm"]["A"]).apply(null, arguments); + }; + var _init = Module["_init"] = function() { + return (_init = Module["_init"] = Module["asm"]["B"]).apply(null, arguments); + }; + var _register_tensor = Module["_register_tensor"] = function() { + return (_register_tensor = Module["_register_tensor"] = Module["asm"]["C"]).apply(null, arguments); + }; + var _dispose_data = Module["_dispose_data"] = function() { + return (_dispose_data = Module["_dispose_data"] = Module["asm"]["D"]).apply(null, arguments); + }; + var _dispose = Module["_dispose"] = function() { + return (_dispose = Module["_dispose"] = Module["asm"]["E"]).apply(null, arguments); + }; + var _Abs = Module["_Abs"] = function() { + return (_Abs = Module["_Abs"] = Module["asm"]["G"]).apply(null, arguments); + }; + var _Add = Module["_Add"] = function() { + return (_Add = Module["_Add"] = Module["asm"]["H"]).apply(null, arguments); + }; + var _AddN = Module["_AddN"] = function() { + return (_AddN = Module["_AddN"] = Module["asm"]["I"]).apply(null, arguments); + }; + var _ArgMax = Module["_ArgMax"] = function() { + return (_ArgMax = Module["_ArgMax"] = Module["asm"]["J"]).apply(null, arguments); + }; + var _AvgPool = Module["_AvgPool"] = function() { + return (_AvgPool = Module["_AvgPool"] = Module["asm"]["K"]).apply(null, arguments); + }; + var _BatchMatMul = Module["_BatchMatMul"] = function() { + return (_BatchMatMul = Module["_BatchMatMul"] = Module["asm"]["L"]).apply(null, arguments); + }; + var _Ceil = Module["_Ceil"] = function() { + return (_Ceil = Module["_Ceil"] = Module["asm"]["M"]).apply(null, arguments); + }; + var _ClipByValue = Module["_ClipByValue"] = function() { + return (_ClipByValue = Module["_ClipByValue"] = Module["asm"]["N"]).apply(null, arguments); + }; + var _Conv2D = Module["_Conv2D"] = function() { + return (_Conv2D = Module["_Conv2D"] = Module["asm"]["O"]).apply(null, arguments); + }; + var _Conv2DBackpropInput = Module["_Conv2DBackpropInput"] = function() { + return (_Conv2DBackpropInput = Module["_Conv2DBackpropInput"] = Module["asm"]["P"]).apply(null, arguments); + }; + var _Cos = Module["_Cos"] = function() { + return (_Cos = Module["_Cos"] = Module["asm"]["Q"]).apply(null, arguments); + }; + var _CropAndResize = Module["_CropAndResize"] = function() { + return (_CropAndResize = Module["_CropAndResize"] = Module["asm"]["R"]).apply(null, arguments); + }; + var _Cumsum = Module["_Cumsum"] = function() { + return (_Cumsum = Module["_Cumsum"] = Module["asm"]["S"]).apply(null, arguments); + }; + var _DepthToSpace = Module["_DepthToSpace"] = function() { + return (_DepthToSpace = Module["_DepthToSpace"] = Module["asm"]["T"]).apply(null, arguments); + }; + var _DepthwiseConv2dNative = Module["_DepthwiseConv2dNative"] = function() { + return (_DepthwiseConv2dNative = Module["_DepthwiseConv2dNative"] = Module["asm"]["U"]).apply(null, arguments); + }; + var _Equal = Module["_Equal"] = function() { + return (_Equal = Module["_Equal"] = Module["asm"]["V"]).apply(null, arguments); + }; + var _Exp = Module["_Exp"] = function() { + return (_Exp = Module["_Exp"] = Module["asm"]["W"]).apply(null, arguments); + }; + var _FlipLeftRight = Module["_FlipLeftRight"] = function() { + return (_FlipLeftRight = Module["_FlipLeftRight"] = Module["asm"]["X"]).apply(null, arguments); + }; + var _Floor = Module["_Floor"] = function() { + return (_Floor = Module["_Floor"] = Module["asm"]["Y"]).apply(null, arguments); + }; + var _FloorDiv = Module["_FloorDiv"] = function() { + return (_FloorDiv = Module["_FloorDiv"] = Module["asm"]["Z"]).apply(null, arguments); + }; + var _FusedBatchNorm = Module["_FusedBatchNorm"] = function() { + return (_FusedBatchNorm = Module["_FusedBatchNorm"] = Module["asm"]["_"]).apply(null, arguments); + }; + var _FusedConv2D = Module["_FusedConv2D"] = function() { + return (_FusedConv2D = Module["_FusedConv2D"] = Module["asm"]["$"]).apply(null, arguments); + }; + var _FusedDepthwiseConv2D = Module["_FusedDepthwiseConv2D"] = function() { + return (_FusedDepthwiseConv2D = Module["_FusedDepthwiseConv2D"] = Module["asm"]["aa"]).apply(null, arguments); + }; + var _Gather = Module["_Gather"] = function() { + return (_Gather = Module["_Gather"] = Module["asm"]["ba"]).apply(null, arguments); + }; + var _GatherNd = Module["_GatherNd"] = function() { + return (_GatherNd = Module["_GatherNd"] = Module["asm"]["ca"]).apply(null, arguments); + }; + var _Greater = Module["_Greater"] = function() { + return (_Greater = Module["_Greater"] = Module["asm"]["da"]).apply(null, arguments); + }; + var _GreaterEqual = Module["_GreaterEqual"] = function() { + return (_GreaterEqual = Module["_GreaterEqual"] = Module["asm"]["ea"]).apply(null, arguments); + }; + var _LeakyRelu = Module["_LeakyRelu"] = function() { + return (_LeakyRelu = Module["_LeakyRelu"] = Module["asm"]["fa"]).apply(null, arguments); + }; + var _Less = Module["_Less"] = function() { + return (_Less = Module["_Less"] = Module["asm"]["ga"]).apply(null, arguments); + }; + var _LessEqual = Module["_LessEqual"] = function() { + return (_LessEqual = Module["_LessEqual"] = Module["asm"]["ha"]).apply(null, arguments); + }; + var _Log = Module["_Log"] = function() { + return (_Log = Module["_Log"] = Module["asm"]["ia"]).apply(null, arguments); + }; + var _LogicalAnd = Module["_LogicalAnd"] = function() { + return (_LogicalAnd = Module["_LogicalAnd"] = Module["asm"]["ja"]).apply(null, arguments); + }; + var _Max = Module["_Max"] = function() { + return (_Max = Module["_Max"] = Module["asm"]["ka"]).apply(null, arguments); + }; + var _MaxPool = Module["_MaxPool"] = function() { + return (_MaxPool = Module["_MaxPool"] = Module["asm"]["la"]).apply(null, arguments); + }; + var _Maximum = Module["_Maximum"] = function() { + return (_Maximum = Module["_Maximum"] = Module["asm"]["ma"]).apply(null, arguments); + }; + var _Mean = Module["_Mean"] = function() { + return (_Mean = Module["_Mean"] = Module["asm"]["na"]).apply(null, arguments); + }; + var _Min = Module["_Min"] = function() { + return (_Min = Module["_Min"] = Module["asm"]["oa"]).apply(null, arguments); + }; + var _Minimum = Module["_Minimum"] = function() { + return (_Minimum = Module["_Minimum"] = Module["asm"]["pa"]).apply(null, arguments); + }; + var _Multiply = Module["_Multiply"] = function() { + return (_Multiply = Module["_Multiply"] = Module["asm"]["qa"]).apply(null, arguments); + }; + var _Neg = Module["_Neg"] = function() { + return (_Neg = Module["_Neg"] = Module["asm"]["ra"]).apply(null, arguments); + }; + var _NonMaxSuppressionV3 = Module["_NonMaxSuppressionV3"] = function() { + return (_NonMaxSuppressionV3 = Module["_NonMaxSuppressionV3"] = Module["asm"]["sa"]).apply(null, arguments); + }; + var _NonMaxSuppressionV4 = Module["_NonMaxSuppressionV4"] = function() { + return (_NonMaxSuppressionV4 = Module["_NonMaxSuppressionV4"] = Module["asm"]["ta"]).apply(null, arguments); + }; + var _NonMaxSuppressionV5 = Module["_NonMaxSuppressionV5"] = function() { + return (_NonMaxSuppressionV5 = Module["_NonMaxSuppressionV5"] = Module["asm"]["ua"]).apply(null, arguments); + }; + var _NotEqual = Module["_NotEqual"] = function() { + return (_NotEqual = Module["_NotEqual"] = Module["asm"]["va"]).apply(null, arguments); + }; + var _OneHot = Module["_OneHot"] = function() { + return (_OneHot = Module["_OneHot"] = Module["asm"]["wa"]).apply(null, arguments); + }; + var _PadV2 = Module["_PadV2"] = function() { + return (_PadV2 = Module["_PadV2"] = Module["asm"]["xa"]).apply(null, arguments); + }; + var _Pow = Module["_Pow"] = function() { + return (_Pow = Module["_Pow"] = Module["asm"]["ya"]).apply(null, arguments); + }; + var _Prelu = Module["_Prelu"] = function() { + return (_Prelu = Module["_Prelu"] = Module["asm"]["za"]).apply(null, arguments); + }; + var _Prod = Module["_Prod"] = function() { + return (_Prod = Module["_Prod"] = Module["asm"]["Aa"]).apply(null, arguments); + }; + var _RealDiv = Module["_RealDiv"] = function() { + return (_RealDiv = Module["_RealDiv"] = Module["asm"]["Ba"]).apply(null, arguments); + }; + var _Relu = Module["_Relu"] = function() { + return (_Relu = Module["_Relu"] = Module["asm"]["Ca"]).apply(null, arguments); + }; + var _Relu6 = Module["_Relu6"] = function() { + return (_Relu6 = Module["_Relu6"] = Module["asm"]["Da"]).apply(null, arguments); + }; + var _ResizeBilinear = Module["_ResizeBilinear"] = function() { + return (_ResizeBilinear = Module["_ResizeBilinear"] = Module["asm"]["Ea"]).apply(null, arguments); + }; + var _Reverse = Module["_Reverse"] = function() { + return (_Reverse = Module["_Reverse"] = Module["asm"]["Fa"]).apply(null, arguments); + }; + var _RotateWithOffset = Module["_RotateWithOffset"] = function() { + return (_RotateWithOffset = Module["_RotateWithOffset"] = Module["asm"]["Ga"]).apply(null, arguments); + }; + var _Round = Module["_Round"] = function() { + return (_Round = Module["_Round"] = Module["asm"]["Ha"]).apply(null, arguments); + }; + var _Rsqrt = Module["_Rsqrt"] = function() { + return (_Rsqrt = Module["_Rsqrt"] = Module["asm"]["Ia"]).apply(null, arguments); + }; + var _ScatterNd = Module["_ScatterNd"] = function() { + return (_ScatterNd = Module["_ScatterNd"] = Module["asm"]["Ja"]).apply(null, arguments); + }; + var _SelectV2 = Module["_SelectV2"] = function() { + return (_SelectV2 = Module["_SelectV2"] = Module["asm"]["Ka"]).apply(null, arguments); + }; + var _Sigmoid = Module["_Sigmoid"] = function() { + return (_Sigmoid = Module["_Sigmoid"] = Module["asm"]["La"]).apply(null, arguments); + }; + var _Sin = Module["_Sin"] = function() { + return (_Sin = Module["_Sin"] = Module["asm"]["Ma"]).apply(null, arguments); + }; + var _Softmax = Module["_Softmax"] = function() { + return (_Softmax = Module["_Softmax"] = Module["asm"]["Na"]).apply(null, arguments); + }; + var _Sqrt = Module["_Sqrt"] = function() { + return (_Sqrt = Module["_Sqrt"] = Module["asm"]["Oa"]).apply(null, arguments); + }; + var _Square = Module["_Square"] = function() { + return (_Square = Module["_Square"] = Module["asm"]["Pa"]).apply(null, arguments); + }; + var _SquaredDifference = Module["_SquaredDifference"] = function() { + return (_SquaredDifference = Module["_SquaredDifference"] = Module["asm"]["Qa"]).apply(null, arguments); + }; + var _Step = Module["_Step"] = function() { + return (_Step = Module["_Step"] = Module["asm"]["Ra"]).apply(null, arguments); + }; + var _StridedSlice = Module["_StridedSlice"] = function() { + return (_StridedSlice = Module["_StridedSlice"] = Module["asm"]["Sa"]).apply(null, arguments); + }; + var _Sub = Module["_Sub"] = function() { + return (_Sub = Module["_Sub"] = Module["asm"]["Ta"]).apply(null, arguments); + }; + var _Sum = Module["_Sum"] = function() { + return (_Sum = Module["_Sum"] = Module["asm"]["Ua"]).apply(null, arguments); + }; + var _Tanh = Module["_Tanh"] = function() { + return (_Tanh = Module["_Tanh"] = Module["asm"]["Va"]).apply(null, arguments); + }; + var _Tile = Module["_Tile"] = function() { + return (_Tile = Module["_Tile"] = Module["asm"]["Wa"]).apply(null, arguments); + }; + var _TopK = Module["_TopK"] = function() { + return (_TopK = Module["_TopK"] = Module["asm"]["Xa"]).apply(null, arguments); + }; + var _Transpose = Module["_Transpose"] = function() { + return (_Transpose = Module["_Transpose"] = Module["asm"]["Ya"]).apply(null, arguments); + }; + var __FusedMatMul = Module["__FusedMatMul"] = function() { + return (__FusedMatMul = Module["__FusedMatMul"] = Module["asm"]["Za"]).apply(null, arguments); + }; + var _malloc = Module["_malloc"] = function() { + return (_malloc = Module["_malloc"] = Module["asm"]["_a"]).apply(null, arguments); + }; + var _free = Module["_free"] = function() { + return (_free = Module["_free"] = Module["asm"]["$a"]).apply(null, arguments); + }; + var ___errno_location = Module["___errno_location"] = function() { + return (___errno_location = Module["___errno_location"] = Module["asm"]["ab"]).apply(null, arguments); + }; + var _emscripten_get_global_libc = Module["_emscripten_get_global_libc"] = function() { + return (_emscripten_get_global_libc = Module["_emscripten_get_global_libc"] = Module["asm"]["bb"]).apply(null, arguments); + }; + var _pthread_self = Module["_pthread_self"] = function() { + return (_pthread_self = Module["_pthread_self"] = Module["asm"]["cb"]).apply(null, arguments); + }; + var ___pthread_tsd_run_dtors = Module["___pthread_tsd_run_dtors"] = function() { + return (___pthread_tsd_run_dtors = Module["___pthread_tsd_run_dtors"] = Module["asm"]["db"]).apply(null, arguments); + }; + var _emscripten_main_thread_process_queued_calls = Module["_emscripten_main_thread_process_queued_calls"] = function() { + return (_emscripten_main_thread_process_queued_calls = Module["_emscripten_main_thread_process_queued_calls"] = Module["asm"]["eb"]).apply(null, arguments); + }; + var _emscripten_current_thread_process_queued_calls = Module["_emscripten_current_thread_process_queued_calls"] = function() { + return (_emscripten_current_thread_process_queued_calls = Module["_emscripten_current_thread_process_queued_calls"] = Module["asm"]["fb"]).apply(null, arguments); + }; + var _emscripten_register_main_browser_thread_id = Module["_emscripten_register_main_browser_thread_id"] = function() { + return (_emscripten_register_main_browser_thread_id = Module["_emscripten_register_main_browser_thread_id"] = Module["asm"]["gb"]).apply(null, arguments); + }; + var __emscripten_do_dispatch_to_thread = Module["__emscripten_do_dispatch_to_thread"] = function() { + return (__emscripten_do_dispatch_to_thread = Module["__emscripten_do_dispatch_to_thread"] = Module["asm"]["hb"]).apply(null, arguments); + }; + var _emscripten_sync_run_in_main_thread_4 = Module["_emscripten_sync_run_in_main_thread_4"] = function() { + return (_emscripten_sync_run_in_main_thread_4 = Module["_emscripten_sync_run_in_main_thread_4"] = Module["asm"]["ib"]).apply(null, arguments); + }; + var _emscripten_run_in_main_runtime_thread_js = Module["_emscripten_run_in_main_runtime_thread_js"] = function() { + return (_emscripten_run_in_main_runtime_thread_js = Module["_emscripten_run_in_main_runtime_thread_js"] = Module["asm"]["jb"]).apply(null, arguments); + }; + var __emscripten_call_on_thread = Module["__emscripten_call_on_thread"] = function() { + return (__emscripten_call_on_thread = Module["__emscripten_call_on_thread"] = Module["asm"]["kb"]).apply(null, arguments); + }; + var _emscripten_tls_init = Module["_emscripten_tls_init"] = function() { + return (_emscripten_tls_init = Module["_emscripten_tls_init"] = Module["asm"]["lb"]).apply(null, arguments); + }; + var __emscripten_thread_init = Module["__emscripten_thread_init"] = function() { + return (__emscripten_thread_init = Module["__emscripten_thread_init"] = Module["asm"]["mb"]).apply(null, arguments); + }; + var stackSave = Module["stackSave"] = function() { + return (stackSave = Module["stackSave"] = Module["asm"]["nb"]).apply(null, arguments); + }; + var stackRestore = Module["stackRestore"] = function() { + return (stackRestore = Module["stackRestore"] = Module["asm"]["ob"]).apply(null, arguments); + }; + var stackAlloc = Module["stackAlloc"] = function() { + return (stackAlloc = Module["stackAlloc"] = Module["asm"]["pb"]).apply(null, arguments); + }; + var _emscripten_stack_set_limits = Module["_emscripten_stack_set_limits"] = function() { + return (_emscripten_stack_set_limits = Module["_emscripten_stack_set_limits"] = Module["asm"]["qb"]).apply(null, arguments); + }; + var _memalign = Module["_memalign"] = function() { + return (_memalign = Module["_memalign"] = Module["asm"]["rb"]).apply(null, arguments); + }; + var __emscripten_allow_main_runtime_queued_calls = Module["__emscripten_allow_main_runtime_queued_calls"] = 9880; + var __emscripten_main_thread_futex = Module["__emscripten_main_thread_futex"] = 11368; + Module["cwrap"] = cwrap; + Module["PThread"] = PThread; + Module["PThread"] = PThread; + Module["wasmMemory"] = wasmMemory; + Module["ExitStatus"] = ExitStatus; + var calledRun; + function ExitStatus(status) { + this.name = "ExitStatus"; + this.message = "Program terminated with exit(" + status + ")"; + this.status = status; + } + dependenciesFulfilled = function runCaller() { + if (!calledRun) + run2(); + if (!calledRun) + dependenciesFulfilled = runCaller; + }; + function run2(args) { + args = args || arguments_; + if (runDependencies > 0) { + return; + } + if (ENVIRONMENT_IS_PTHREAD) { + readyPromiseResolve(Module); + postMessage({cmd: "loaded"}); + return; + } + preRun(); + if (runDependencies > 0) { + return; + } + function doRun() { + if (calledRun) + return; + calledRun = true; + Module["calledRun"] = true; + if (ABORT) + return; + initRuntime(); + preMain(); + readyPromiseResolve(Module); + if (Module["onRuntimeInitialized"]) + Module["onRuntimeInitialized"](); + postRun(); + } + if (Module["setStatus"]) { + Module["setStatus"]("Running..."); + setTimeout(function() { + setTimeout(function() { + Module["setStatus"](""); + }, 1); + doRun(); + }, 1); + } else { + doRun(); + } + } + Module["run"] = run2; + function exit(status, implicit) { + if (implicit && noExitRuntime && status === 0) { + return; + } + if (!implicit) { + if (ENVIRONMENT_IS_PTHREAD) { + postMessage({cmd: "exitProcess", returnCode: status}); + throw new ExitStatus(status); + } else { + } + } + if (noExitRuntime) { + } else { + PThread.terminateAllThreads(); + EXITSTATUS = status; + exitRuntime(); + if (Module["onExit"]) + Module["onExit"](status); + ABORT = true; + } + quit_(status, new ExitStatus(status)); + } + if (Module["preInit"]) { + if (typeof Module["preInit"] == "function") + Module["preInit"] = [Module["preInit"]]; + while (Module["preInit"].length > 0) { + Module["preInit"].pop()(); + } + } + if (ENVIRONMENT_IS_PTHREAD) { + noExitRuntime = false; + PThread.initWorker(); + } + run2(); + return WasmBackendModuleThreadedSimd2.ready; + }; + }(); + if (typeof exports === "object" && typeof module === "object") + module.exports = WasmBackendModuleThreadedSimd; + else if (typeof define === "function" && define["amd"]) + define([], function() { + return WasmBackendModuleThreadedSimd; + }); + else if (typeof exports === "object") + exports["WasmBackendModuleThreadedSimd"] = WasmBackendModuleThreadedSimd; +}); +var require_tfjs_backend_wasm = __commonJS2((exports, module) => { + var WasmBackendModule = function() { + var _scriptDir = typeof document !== "undefined" && document.currentScript ? document.currentScript.src : void 0; + if (typeof __filename !== "undefined") + _scriptDir = _scriptDir || __filename; + return function(WasmBackendModule2) { + WasmBackendModule2 = WasmBackendModule2 || {}; + var Module = typeof WasmBackendModule2 !== "undefined" ? WasmBackendModule2 : {}; + var readyPromiseResolve, readyPromiseReject; + Module["ready"] = new Promise(function(resolve, reject) { + readyPromiseResolve = resolve; + readyPromiseReject = reject; + }); + var moduleOverrides = {}; + var key; + for (key in Module) { + if (Module.hasOwnProperty(key)) { + moduleOverrides[key] = Module[key]; + } + } + var arguments_ = []; + var thisProgram = "./this.program"; + var quit_ = function(status, toThrow) { + throw toThrow; + }; + var ENVIRONMENT_IS_WEB = false; + var ENVIRONMENT_IS_WORKER = false; + var ENVIRONMENT_IS_NODE = false; + var ENVIRONMENT_IS_SHELL = false; + ENVIRONMENT_IS_WEB = typeof window === "object"; + ENVIRONMENT_IS_WORKER = typeof importScripts === "function"; + ENVIRONMENT_IS_NODE = typeof process === "object" && typeof process.versions === "object" && typeof process.versions.node === "string"; + ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER; + var scriptDirectory = ""; + function locateFile(path) { + if (Module["locateFile"]) { + return Module["locateFile"](path, scriptDirectory); + } + return scriptDirectory + path; + } + var read_, readAsync, readBinary, setWindowTitle; + var nodeFS; + var nodePath; + if (ENVIRONMENT_IS_NODE) { + if (ENVIRONMENT_IS_WORKER) { + scriptDirectory = require_path().dirname(scriptDirectory) + "/"; + } else { + scriptDirectory = __dirname + "/"; + } + read_ = function shell_read(filename, binary) { + if (!nodeFS) + nodeFS = require("fs"); + if (!nodePath) + nodePath = require_path(); + filename = nodePath["normalize"](filename); + return nodeFS["readFileSync"](filename, binary ? null : "utf8"); + }; + readBinary = function readBinary2(filename) { + var ret = read_(filename, true); + if (!ret.buffer) { + ret = new Uint8Array(ret); + } + assert3(ret.buffer); + return ret; + }; + if (process["argv"].length > 1) { + thisProgram = process["argv"][1].replace(/\\/g, "/"); + } + arguments_ = process["argv"].slice(2); + process["on"]("uncaughtException", function(ex) { + if (!(ex instanceof ExitStatus)) { + throw ex; + } + }); + process["on"]("unhandledRejection", abort); + quit_ = function(status) { + process["exit"](status); + }; + Module["inspect"] = function() { + return "[Emscripten Module object]"; + }; + } else if (ENVIRONMENT_IS_SHELL) { + if (typeof read != "undefined") { + read_ = function shell_read(f) { + return read(f); + }; + } + readBinary = function readBinary2(f) { + var data2; + if (typeof readbuffer === "function") { + return new Uint8Array(readbuffer(f)); + } + data2 = read(f, "binary"); + assert3(typeof data2 === "object"); + return data2; + }; + if (typeof scriptArgs != "undefined") { + arguments_ = scriptArgs; + } else if (typeof arguments != "undefined") { + arguments_ = arguments; + } + if (typeof quit === "function") { + quit_ = function(status) { + quit(status); + }; + } + if (typeof print !== "undefined") { + if (typeof console === "undefined") + console = {}; + console.log = print; + console.warn = console.error = typeof printErr !== "undefined" ? printErr : print; + } + } else if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) { + if (ENVIRONMENT_IS_WORKER) { + scriptDirectory = self.location.href; + } else if (typeof document !== "undefined" && document.currentScript) { + scriptDirectory = document.currentScript.src; + } + if (_scriptDir) { + scriptDirectory = _scriptDir; + } + if (scriptDirectory.indexOf("blob:") !== 0) { + scriptDirectory = scriptDirectory.substr(0, scriptDirectory.lastIndexOf("/") + 1); + } else { + scriptDirectory = ""; + } + { + read_ = function(url) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", url, false); + xhr.send(null); + return xhr.responseText; + }; + if (ENVIRONMENT_IS_WORKER) { + readBinary = function(url) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", url, false); + xhr.responseType = "arraybuffer"; + xhr.send(null); + return new Uint8Array(xhr.response); + }; + } + readAsync = function(url, onload, onerror) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", url, true); + xhr.responseType = "arraybuffer"; + xhr.onload = function() { + if (xhr.status == 200 || xhr.status == 0 && xhr.response) { + onload(xhr.response); + return; + } + onerror(); + }; + xhr.onerror = onerror; + xhr.send(null); + }; + } + setWindowTitle = function(title) { + document.title = title; + }; + } else { + } + var out = Module["print"] || console.log.bind(console); + var err = Module["printErr"] || console.warn.bind(console); + for (key in moduleOverrides) { + if (moduleOverrides.hasOwnProperty(key)) { + Module[key] = moduleOverrides[key]; + } + } + moduleOverrides = null; + if (Module["arguments"]) + arguments_ = Module["arguments"]; + if (Module["thisProgram"]) + thisProgram = Module["thisProgram"]; + if (Module["quit"]) + quit_ = Module["quit"]; + var wasmBinary; + if (Module["wasmBinary"]) + wasmBinary = Module["wasmBinary"]; + var noExitRuntime = Module["noExitRuntime"] || true; + if (typeof WebAssembly !== "object") { + abort("no native wasm support detected"); + } + var wasmMemory; + var ABORT = false; + var EXITSTATUS; + function assert3(condition, text) { + if (!condition) { + abort("Assertion failed: " + text); + } + } + function getCFunc(ident) { + var func2 = Module["_" + ident]; + assert3(func2, "Cannot call unknown function " + ident + ", make sure it is exported"); + return func2; + } + function ccall(ident, returnType, argTypes, args, opts) { + var toC = {string: function(str) { + var ret2 = 0; + if (str !== null && str !== void 0 && str !== 0) { + var len = (str.length << 2) + 1; + ret2 = stackAlloc(len); + stringToUTF8(str, ret2, len); + } + return ret2; + }, array: function(arr) { + var ret2 = stackAlloc(arr.length); + writeArrayToMemory(arr, ret2); + return ret2; + }}; + function convertReturnValue(ret2) { + if (returnType === "string") + return UTF8ToString(ret2); + if (returnType === "boolean") + return Boolean(ret2); + return ret2; + } + var func2 = getCFunc(ident); + var cArgs = []; + var stack2 = 0; + if (args) { + for (var i = 0; i < args.length; i++) { + var converter = toC[argTypes[i]]; + if (converter) { + if (stack2 === 0) + stack2 = stackSave(); + cArgs[i] = converter(args[i]); + } else { + cArgs[i] = args[i]; + } + } + } + var ret = func2.apply(null, cArgs); + ret = convertReturnValue(ret); + if (stack2 !== 0) + stackRestore(stack2); + return ret; + } + function cwrap(ident, returnType, argTypes, opts) { + argTypes = argTypes || []; + var numericArgs = argTypes.every(function(type) { + return type === "number"; + }); + var numericRet = returnType !== "string"; + if (numericRet && numericArgs && !opts) { + return getCFunc(ident); + } + return function() { + return ccall(ident, returnType, argTypes, arguments, opts); + }; + } + var UTF8Decoder = typeof TextDecoder !== "undefined" ? new TextDecoder("utf8") : void 0; + function UTF8ArrayToString(heap, idx, maxBytesToRead) { + var endIdx = idx + maxBytesToRead; + var endPtr = idx; + while (heap[endPtr] && !(endPtr >= endIdx)) + ++endPtr; + if (endPtr - idx > 16 && heap.subarray && UTF8Decoder) { + return UTF8Decoder.decode(heap.subarray(idx, endPtr)); + } else { + var str = ""; + while (idx < endPtr) { + var u0 = heap[idx++]; + if (!(u0 & 128)) { + str += String.fromCharCode(u0); + continue; + } + var u1 = heap[idx++] & 63; + if ((u0 & 224) == 192) { + str += String.fromCharCode((u0 & 31) << 6 | u1); + continue; + } + var u2 = heap[idx++] & 63; + if ((u0 & 240) == 224) { + u0 = (u0 & 15) << 12 | u1 << 6 | u2; + } else { + u0 = (u0 & 7) << 18 | u1 << 12 | u2 << 6 | heap[idx++] & 63; + } + if (u0 < 65536) { + str += String.fromCharCode(u0); + } else { + var ch = u0 - 65536; + str += String.fromCharCode(55296 | ch >> 10, 56320 | ch & 1023); + } + } + } + return str; + } + function UTF8ToString(ptr, maxBytesToRead) { + return ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ""; + } + function stringToUTF8Array(str, heap, outIdx, maxBytesToWrite) { + if (!(maxBytesToWrite > 0)) + return 0; + var startIdx = outIdx; + var endIdx = outIdx + maxBytesToWrite - 1; + for (var i = 0; i < str.length; ++i) { + var u = str.charCodeAt(i); + if (u >= 55296 && u <= 57343) { + var u1 = str.charCodeAt(++i); + u = 65536 + ((u & 1023) << 10) | u1 & 1023; + } + if (u <= 127) { + if (outIdx >= endIdx) + break; + heap[outIdx++] = u; + } else if (u <= 2047) { + if (outIdx + 1 >= endIdx) + break; + heap[outIdx++] = 192 | u >> 6; + heap[outIdx++] = 128 | u & 63; + } else if (u <= 65535) { + if (outIdx + 2 >= endIdx) + break; + heap[outIdx++] = 224 | u >> 12; + heap[outIdx++] = 128 | u >> 6 & 63; + heap[outIdx++] = 128 | u & 63; + } else { + if (outIdx + 3 >= endIdx) + break; + heap[outIdx++] = 240 | u >> 18; + heap[outIdx++] = 128 | u >> 12 & 63; + heap[outIdx++] = 128 | u >> 6 & 63; + heap[outIdx++] = 128 | u & 63; + } + } + heap[outIdx] = 0; + return outIdx - startIdx; + } + function stringToUTF8(str, outPtr, maxBytesToWrite) { + return stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite); + } + function writeArrayToMemory(array2, buffer3) { + HEAP8.set(array2, buffer3); + } + function alignUp(x, multiple) { + if (x % multiple > 0) { + x += multiple - x % multiple; + } + return x; + } + var buffer2, HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64; + function updateGlobalBufferAndViews(buf) { + buffer2 = buf; + Module["HEAP8"] = HEAP8 = new Int8Array(buf); + Module["HEAP16"] = HEAP16 = new Int16Array(buf); + Module["HEAP32"] = HEAP32 = new Int32Array(buf); + Module["HEAPU8"] = HEAPU8 = new Uint8Array(buf); + Module["HEAPU16"] = HEAPU16 = new Uint16Array(buf); + Module["HEAPU32"] = HEAPU32 = new Uint32Array(buf); + Module["HEAPF32"] = HEAPF32 = new Float32Array(buf); + Module["HEAPF64"] = HEAPF64 = new Float64Array(buf); + } + var INITIAL_MEMORY = Module["INITIAL_MEMORY"] || 16777216; + var wasmTable; + var __ATPRERUN__ = []; + var __ATINIT__ = []; + var __ATMAIN__ = []; + var __ATPOSTRUN__ = []; + var runtimeInitialized = false; + __ATINIT__.push({func: function() { + ___wasm_call_ctors(); + }}); + function preRun() { + if (Module["preRun"]) { + if (typeof Module["preRun"] == "function") + Module["preRun"] = [Module["preRun"]]; + while (Module["preRun"].length) { + addOnPreRun(Module["preRun"].shift()); + } + } + callRuntimeCallbacks(__ATPRERUN__); + } + function initRuntime() { + runtimeInitialized = true; + callRuntimeCallbacks(__ATINIT__); + } + function preMain() { + callRuntimeCallbacks(__ATMAIN__); + } + function postRun() { + if (Module["postRun"]) { + if (typeof Module["postRun"] == "function") + Module["postRun"] = [Module["postRun"]]; + while (Module["postRun"].length) { + addOnPostRun(Module["postRun"].shift()); + } + } + callRuntimeCallbacks(__ATPOSTRUN__); + } + function addOnPreRun(cb) { + __ATPRERUN__.unshift(cb); + } + function addOnPostRun(cb) { + __ATPOSTRUN__.unshift(cb); + } + var runDependencies = 0; + var runDependencyWatcher = null; + var dependenciesFulfilled = null; + function addRunDependency(id) { + runDependencies++; + if (Module["monitorRunDependencies"]) { + Module["monitorRunDependencies"](runDependencies); + } + } + function removeRunDependency(id) { + runDependencies--; + if (Module["monitorRunDependencies"]) { + Module["monitorRunDependencies"](runDependencies); + } + if (runDependencies == 0) { + if (runDependencyWatcher !== null) { + clearInterval(runDependencyWatcher); + runDependencyWatcher = null; + } + if (dependenciesFulfilled) { + var callback = dependenciesFulfilled; + dependenciesFulfilled = null; + callback(); + } + } + } + Module["preloadedImages"] = {}; + Module["preloadedAudios"] = {}; + function abort(what) { + if (Module["onAbort"]) { + Module["onAbort"](what); + } + what += ""; + err(what); + ABORT = true; + EXITSTATUS = 1; + what = "abort(" + what + "). Build with -s ASSERTIONS=1 for more info."; + var e = new WebAssembly.RuntimeError(what); + readyPromiseReject(e); + throw e; + } + function hasPrefix(str, prefix) { + return String.prototype.startsWith ? str.startsWith(prefix) : str.indexOf(prefix) === 0; + } + var dataURIPrefix = "data:application/octet-stream;base64,"; + function isDataURI(filename) { + return hasPrefix(filename, dataURIPrefix); + } + var fileURIPrefix = "file://"; + function isFileURI(filename) { + return hasPrefix(filename, fileURIPrefix); + } + var wasmBinaryFile = "tfjs-backend-wasm.wasm"; + if (!isDataURI(wasmBinaryFile)) { + wasmBinaryFile = locateFile(wasmBinaryFile); + } + function getBinary(file) { + try { + if (file == wasmBinaryFile && wasmBinary) { + return new Uint8Array(wasmBinary); + } + if (readBinary) { + return readBinary(file); + } else { + throw "both async and sync fetching of the wasm failed"; + } + } catch (err2) { + abort(err2); + } + } + function getBinaryPromise() { + if (!wasmBinary && (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER)) { + if (typeof fetch === "function" && !isFileURI(wasmBinaryFile)) { + return fetch(wasmBinaryFile, {credentials: "same-origin"}).then(function(response) { + if (!response["ok"]) { + throw "failed to load wasm binary file at '" + wasmBinaryFile + "'"; + } + return response["arrayBuffer"](); + }).catch(function() { + return getBinary(wasmBinaryFile); + }); + } else { + if (readAsync) { + return new Promise(function(resolve, reject) { + readAsync(wasmBinaryFile, function(response) { + resolve(new Uint8Array(response)); + }, reject); + }); + } + } + } + return Promise.resolve().then(function() { + return getBinary(wasmBinaryFile); + }); + } + function createWasm() { + var info2 = {a: asmLibraryArg}; + function receiveInstance(instance, module2) { + var exports3 = instance.exports; + Module["asm"] = exports3; + wasmMemory = Module["asm"]["g"]; + updateGlobalBufferAndViews(wasmMemory.buffer); + wasmTable = Module["asm"]["m"]; + removeRunDependency("wasm-instantiate"); + } + addRunDependency("wasm-instantiate"); + function receiveInstantiatedSource(output) { + receiveInstance(output["instance"]); + } + function instantiateArrayBuffer(receiver) { + return getBinaryPromise().then(function(binary) { + return WebAssembly.instantiate(binary, info2); + }).then(receiver, function(reason) { + err("failed to asynchronously prepare wasm: " + reason); + abort(reason); + }); + } + function instantiateAsync() { + if (!wasmBinary && typeof WebAssembly.instantiateStreaming === "function" && !isDataURI(wasmBinaryFile) && !isFileURI(wasmBinaryFile) && typeof fetch === "function") { + return fetch(wasmBinaryFile, {credentials: "same-origin"}).then(function(response) { + var result = WebAssembly.instantiateStreaming(response, info2); + return result.then(receiveInstantiatedSource, function(reason) { + err("wasm streaming compile failed: " + reason); + err("falling back to ArrayBuffer instantiation"); + return instantiateArrayBuffer(receiveInstantiatedSource); + }); + }); + } else { + return instantiateArrayBuffer(receiveInstantiatedSource); + } + } + if (Module["instantiateWasm"]) { + try { + var exports2 = Module["instantiateWasm"](info2, receiveInstance); + return exports2; + } catch (e) { + err("Module.instantiateWasm callback failed with error: " + e); + return false; + } + } + instantiateAsync().catch(readyPromiseReject); + return {}; + } + function callRuntimeCallbacks(callbacks2) { + while (callbacks2.length > 0) { + var callback = callbacks2.shift(); + if (typeof callback == "function") { + callback(Module); + continue; + } + var func2 = callback.func; + if (typeof func2 === "number") { + if (callback.arg === void 0) { + wasmTable.get(func2)(); + } else { + wasmTable.get(func2)(callback.arg); + } + } else { + func2(callback.arg === void 0 ? null : callback.arg); + } + } + } + function _abort() { + abort(); + } + function _emscripten_memcpy_big(dest, src, num) { + HEAPU8.copyWithin(dest, src, src + num); + } + function _emscripten_get_heap_size() { + return HEAPU8.length; + } + function emscripten_realloc_buffer(size) { + try { + wasmMemory.grow(size - buffer2.byteLength + 65535 >>> 16); + updateGlobalBufferAndViews(wasmMemory.buffer); + return 1; + } catch (e) { + } + } + function _emscripten_resize_heap(requestedSize) { + var oldSize = _emscripten_get_heap_size(); + var maxHeapSize = 2147483648; + if (requestedSize > maxHeapSize) { + return false; + } + for (var cutDown = 1; cutDown <= 4; cutDown *= 2) { + var overGrownHeapSize = oldSize * (1 + 0.2 / cutDown); + overGrownHeapSize = Math.min(overGrownHeapSize, requestedSize + 100663296); + var newSize = Math.min(maxHeapSize, alignUp(Math.max(requestedSize, overGrownHeapSize), 65536)); + var replacement = emscripten_realloc_buffer(newSize); + if (replacement) { + return true; + } + } + return false; + } + var SYSCALLS = {mappings: {}, buffers: [null, [], []], printChar: function(stream, curr) { + var buffer3 = SYSCALLS.buffers[stream]; + if (curr === 0 || curr === 10) { + (stream === 1 ? out : err)(UTF8ArrayToString(buffer3, 0)); + buffer3.length = 0; + } else { + buffer3.push(curr); + } + }, varargs: void 0, get: function() { + SYSCALLS.varargs += 4; + var ret = HEAP32[SYSCALLS.varargs - 4 >> 2]; + return ret; + }, getStr: function(ptr) { + var ret = UTF8ToString(ptr); + return ret; + }, get64: function(low, high) { + return low; + }}; + function _fd_close(fd) { + return 0; + } + function _fd_seek(fd, offset_low, offset_high, whence, newOffset) { + } + function _fd_write(fd, iov, iovcnt, pnum) { + var num = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAP32[iov + i * 8 >> 2]; + var len = HEAP32[iov + (i * 8 + 4) >> 2]; + for (var j = 0; j < len; j++) { + SYSCALLS.printChar(fd, HEAPU8[ptr + j]); + } + num += len; + } + HEAP32[pnum >> 2] = num; + return 0; + } + var asmLibraryArg = {a: _abort, d: _emscripten_memcpy_big, e: _emscripten_resize_heap, f: _fd_close, c: _fd_seek, b: _fd_write}; + var asm = createWasm(); + var ___wasm_call_ctors = Module["___wasm_call_ctors"] = function() { + return (___wasm_call_ctors = Module["___wasm_call_ctors"] = Module["asm"]["h"]).apply(null, arguments); + }; + var _init = Module["_init"] = function() { + return (_init = Module["_init"] = Module["asm"]["i"]).apply(null, arguments); + }; + var _register_tensor = Module["_register_tensor"] = function() { + return (_register_tensor = Module["_register_tensor"] = Module["asm"]["j"]).apply(null, arguments); + }; + var _dispose_data = Module["_dispose_data"] = function() { + return (_dispose_data = Module["_dispose_data"] = Module["asm"]["k"]).apply(null, arguments); + }; + var _dispose = Module["_dispose"] = function() { + return (_dispose = Module["_dispose"] = Module["asm"]["l"]).apply(null, arguments); + }; + var _Abs = Module["_Abs"] = function() { + return (_Abs = Module["_Abs"] = Module["asm"]["n"]).apply(null, arguments); + }; + var _Add = Module["_Add"] = function() { + return (_Add = Module["_Add"] = Module["asm"]["o"]).apply(null, arguments); + }; + var _AddN = Module["_AddN"] = function() { + return (_AddN = Module["_AddN"] = Module["asm"]["p"]).apply(null, arguments); + }; + var _ArgMax = Module["_ArgMax"] = function() { + return (_ArgMax = Module["_ArgMax"] = Module["asm"]["q"]).apply(null, arguments); + }; + var _AvgPool = Module["_AvgPool"] = function() { + return (_AvgPool = Module["_AvgPool"] = Module["asm"]["r"]).apply(null, arguments); + }; + var _BatchMatMul = Module["_BatchMatMul"] = function() { + return (_BatchMatMul = Module["_BatchMatMul"] = Module["asm"]["s"]).apply(null, arguments); + }; + var _Ceil = Module["_Ceil"] = function() { + return (_Ceil = Module["_Ceil"] = Module["asm"]["t"]).apply(null, arguments); + }; + var _ClipByValue = Module["_ClipByValue"] = function() { + return (_ClipByValue = Module["_ClipByValue"] = Module["asm"]["u"]).apply(null, arguments); + }; + var _Conv2D = Module["_Conv2D"] = function() { + return (_Conv2D = Module["_Conv2D"] = Module["asm"]["v"]).apply(null, arguments); + }; + var _Conv2DBackpropInput = Module["_Conv2DBackpropInput"] = function() { + return (_Conv2DBackpropInput = Module["_Conv2DBackpropInput"] = Module["asm"]["w"]).apply(null, arguments); + }; + var _Cos = Module["_Cos"] = function() { + return (_Cos = Module["_Cos"] = Module["asm"]["x"]).apply(null, arguments); + }; + var _CropAndResize = Module["_CropAndResize"] = function() { + return (_CropAndResize = Module["_CropAndResize"] = Module["asm"]["y"]).apply(null, arguments); + }; + var _Cumsum = Module["_Cumsum"] = function() { + return (_Cumsum = Module["_Cumsum"] = Module["asm"]["z"]).apply(null, arguments); + }; + var _DepthToSpace = Module["_DepthToSpace"] = function() { + return (_DepthToSpace = Module["_DepthToSpace"] = Module["asm"]["A"]).apply(null, arguments); + }; + var _DepthwiseConv2dNative = Module["_DepthwiseConv2dNative"] = function() { + return (_DepthwiseConv2dNative = Module["_DepthwiseConv2dNative"] = Module["asm"]["B"]).apply(null, arguments); + }; + var _Equal = Module["_Equal"] = function() { + return (_Equal = Module["_Equal"] = Module["asm"]["C"]).apply(null, arguments); + }; + var _Exp = Module["_Exp"] = function() { + return (_Exp = Module["_Exp"] = Module["asm"]["D"]).apply(null, arguments); + }; + var _FlipLeftRight = Module["_FlipLeftRight"] = function() { + return (_FlipLeftRight = Module["_FlipLeftRight"] = Module["asm"]["E"]).apply(null, arguments); + }; + var _Floor = Module["_Floor"] = function() { + return (_Floor = Module["_Floor"] = Module["asm"]["F"]).apply(null, arguments); + }; + var _FloorDiv = Module["_FloorDiv"] = function() { + return (_FloorDiv = Module["_FloorDiv"] = Module["asm"]["G"]).apply(null, arguments); + }; + var _FusedBatchNorm = Module["_FusedBatchNorm"] = function() { + return (_FusedBatchNorm = Module["_FusedBatchNorm"] = Module["asm"]["H"]).apply(null, arguments); + }; + var _FusedConv2D = Module["_FusedConv2D"] = function() { + return (_FusedConv2D = Module["_FusedConv2D"] = Module["asm"]["I"]).apply(null, arguments); + }; + var _FusedDepthwiseConv2D = Module["_FusedDepthwiseConv2D"] = function() { + return (_FusedDepthwiseConv2D = Module["_FusedDepthwiseConv2D"] = Module["asm"]["J"]).apply(null, arguments); + }; + var _Gather = Module["_Gather"] = function() { + return (_Gather = Module["_Gather"] = Module["asm"]["K"]).apply(null, arguments); + }; + var _GatherNd = Module["_GatherNd"] = function() { + return (_GatherNd = Module["_GatherNd"] = Module["asm"]["L"]).apply(null, arguments); + }; + var _Greater = Module["_Greater"] = function() { + return (_Greater = Module["_Greater"] = Module["asm"]["M"]).apply(null, arguments); + }; + var _GreaterEqual = Module["_GreaterEqual"] = function() { + return (_GreaterEqual = Module["_GreaterEqual"] = Module["asm"]["N"]).apply(null, arguments); + }; + var _LeakyRelu = Module["_LeakyRelu"] = function() { + return (_LeakyRelu = Module["_LeakyRelu"] = Module["asm"]["O"]).apply(null, arguments); + }; + var _Less = Module["_Less"] = function() { + return (_Less = Module["_Less"] = Module["asm"]["P"]).apply(null, arguments); + }; + var _LessEqual = Module["_LessEqual"] = function() { + return (_LessEqual = Module["_LessEqual"] = Module["asm"]["Q"]).apply(null, arguments); + }; + var _Log = Module["_Log"] = function() { + return (_Log = Module["_Log"] = Module["asm"]["R"]).apply(null, arguments); + }; + var _LogicalAnd = Module["_LogicalAnd"] = function() { + return (_LogicalAnd = Module["_LogicalAnd"] = Module["asm"]["S"]).apply(null, arguments); + }; + var _Max = Module["_Max"] = function() { + return (_Max = Module["_Max"] = Module["asm"]["T"]).apply(null, arguments); + }; + var _MaxPool = Module["_MaxPool"] = function() { + return (_MaxPool = Module["_MaxPool"] = Module["asm"]["U"]).apply(null, arguments); + }; + var _Maximum = Module["_Maximum"] = function() { + return (_Maximum = Module["_Maximum"] = Module["asm"]["V"]).apply(null, arguments); + }; + var _Mean = Module["_Mean"] = function() { + return (_Mean = Module["_Mean"] = Module["asm"]["W"]).apply(null, arguments); + }; + var _Min = Module["_Min"] = function() { + return (_Min = Module["_Min"] = Module["asm"]["X"]).apply(null, arguments); + }; + var _Minimum = Module["_Minimum"] = function() { + return (_Minimum = Module["_Minimum"] = Module["asm"]["Y"]).apply(null, arguments); + }; + var _Multiply = Module["_Multiply"] = function() { + return (_Multiply = Module["_Multiply"] = Module["asm"]["Z"]).apply(null, arguments); + }; + var _Neg = Module["_Neg"] = function() { + return (_Neg = Module["_Neg"] = Module["asm"]["_"]).apply(null, arguments); + }; + var _NonMaxSuppressionV3 = Module["_NonMaxSuppressionV3"] = function() { + return (_NonMaxSuppressionV3 = Module["_NonMaxSuppressionV3"] = Module["asm"]["$"]).apply(null, arguments); + }; + var _NonMaxSuppressionV4 = Module["_NonMaxSuppressionV4"] = function() { + return (_NonMaxSuppressionV4 = Module["_NonMaxSuppressionV4"] = Module["asm"]["aa"]).apply(null, arguments); + }; + var _NonMaxSuppressionV5 = Module["_NonMaxSuppressionV5"] = function() { + return (_NonMaxSuppressionV5 = Module["_NonMaxSuppressionV5"] = Module["asm"]["ba"]).apply(null, arguments); + }; + var _NotEqual = Module["_NotEqual"] = function() { + return (_NotEqual = Module["_NotEqual"] = Module["asm"]["ca"]).apply(null, arguments); + }; + var _OneHot = Module["_OneHot"] = function() { + return (_OneHot = Module["_OneHot"] = Module["asm"]["da"]).apply(null, arguments); + }; + var _PadV2 = Module["_PadV2"] = function() { + return (_PadV2 = Module["_PadV2"] = Module["asm"]["ea"]).apply(null, arguments); + }; + var _Pow = Module["_Pow"] = function() { + return (_Pow = Module["_Pow"] = Module["asm"]["fa"]).apply(null, arguments); + }; + var _Prelu = Module["_Prelu"] = function() { + return (_Prelu = Module["_Prelu"] = Module["asm"]["ga"]).apply(null, arguments); + }; + var _Prod = Module["_Prod"] = function() { + return (_Prod = Module["_Prod"] = Module["asm"]["ha"]).apply(null, arguments); + }; + var _RealDiv = Module["_RealDiv"] = function() { + return (_RealDiv = Module["_RealDiv"] = Module["asm"]["ia"]).apply(null, arguments); + }; + var _Relu = Module["_Relu"] = function() { + return (_Relu = Module["_Relu"] = Module["asm"]["ja"]).apply(null, arguments); + }; + var _Relu6 = Module["_Relu6"] = function() { + return (_Relu6 = Module["_Relu6"] = Module["asm"]["ka"]).apply(null, arguments); + }; + var _ResizeBilinear = Module["_ResizeBilinear"] = function() { + return (_ResizeBilinear = Module["_ResizeBilinear"] = Module["asm"]["la"]).apply(null, arguments); + }; + var _Reverse = Module["_Reverse"] = function() { + return (_Reverse = Module["_Reverse"] = Module["asm"]["ma"]).apply(null, arguments); + }; + var _RotateWithOffset = Module["_RotateWithOffset"] = function() { + return (_RotateWithOffset = Module["_RotateWithOffset"] = Module["asm"]["na"]).apply(null, arguments); + }; + var _Round = Module["_Round"] = function() { + return (_Round = Module["_Round"] = Module["asm"]["oa"]).apply(null, arguments); + }; + var _Rsqrt = Module["_Rsqrt"] = function() { + return (_Rsqrt = Module["_Rsqrt"] = Module["asm"]["pa"]).apply(null, arguments); + }; + var _ScatterNd = Module["_ScatterNd"] = function() { + return (_ScatterNd = Module["_ScatterNd"] = Module["asm"]["qa"]).apply(null, arguments); + }; + var _SelectV2 = Module["_SelectV2"] = function() { + return (_SelectV2 = Module["_SelectV2"] = Module["asm"]["ra"]).apply(null, arguments); + }; + var _Sigmoid = Module["_Sigmoid"] = function() { + return (_Sigmoid = Module["_Sigmoid"] = Module["asm"]["sa"]).apply(null, arguments); + }; + var _Sin = Module["_Sin"] = function() { + return (_Sin = Module["_Sin"] = Module["asm"]["ta"]).apply(null, arguments); + }; + var _Softmax = Module["_Softmax"] = function() { + return (_Softmax = Module["_Softmax"] = Module["asm"]["ua"]).apply(null, arguments); + }; + var _Sqrt = Module["_Sqrt"] = function() { + return (_Sqrt = Module["_Sqrt"] = Module["asm"]["va"]).apply(null, arguments); + }; + var _Square = Module["_Square"] = function() { + return (_Square = Module["_Square"] = Module["asm"]["wa"]).apply(null, arguments); + }; + var _SquaredDifference = Module["_SquaredDifference"] = function() { + return (_SquaredDifference = Module["_SquaredDifference"] = Module["asm"]["xa"]).apply(null, arguments); + }; + var _Step = Module["_Step"] = function() { + return (_Step = Module["_Step"] = Module["asm"]["ya"]).apply(null, arguments); + }; + var _StridedSlice = Module["_StridedSlice"] = function() { + return (_StridedSlice = Module["_StridedSlice"] = Module["asm"]["za"]).apply(null, arguments); + }; + var _Sub = Module["_Sub"] = function() { + return (_Sub = Module["_Sub"] = Module["asm"]["Aa"]).apply(null, arguments); + }; + var _Sum = Module["_Sum"] = function() { + return (_Sum = Module["_Sum"] = Module["asm"]["Ba"]).apply(null, arguments); + }; + var _Tanh = Module["_Tanh"] = function() { + return (_Tanh = Module["_Tanh"] = Module["asm"]["Ca"]).apply(null, arguments); + }; + var _Tile = Module["_Tile"] = function() { + return (_Tile = Module["_Tile"] = Module["asm"]["Da"]).apply(null, arguments); + }; + var _TopK = Module["_TopK"] = function() { + return (_TopK = Module["_TopK"] = Module["asm"]["Ea"]).apply(null, arguments); + }; + var _Transpose = Module["_Transpose"] = function() { + return (_Transpose = Module["_Transpose"] = Module["asm"]["Fa"]).apply(null, arguments); + }; + var __FusedMatMul = Module["__FusedMatMul"] = function() { + return (__FusedMatMul = Module["__FusedMatMul"] = Module["asm"]["Ga"]).apply(null, arguments); + }; + var _malloc = Module["_malloc"] = function() { + return (_malloc = Module["_malloc"] = Module["asm"]["Ha"]).apply(null, arguments); + }; + var _free = Module["_free"] = function() { + return (_free = Module["_free"] = Module["asm"]["Ia"]).apply(null, arguments); + }; + var stackSave = Module["stackSave"] = function() { + return (stackSave = Module["stackSave"] = Module["asm"]["Ja"]).apply(null, arguments); + }; + var stackRestore = Module["stackRestore"] = function() { + return (stackRestore = Module["stackRestore"] = Module["asm"]["Ka"]).apply(null, arguments); + }; + var stackAlloc = Module["stackAlloc"] = function() { + return (stackAlloc = Module["stackAlloc"] = Module["asm"]["La"]).apply(null, arguments); + }; + Module["cwrap"] = cwrap; + var calledRun; + function ExitStatus(status) { + this.name = "ExitStatus"; + this.message = "Program terminated with exit(" + status + ")"; + this.status = status; + } + dependenciesFulfilled = function runCaller() { + if (!calledRun) + run2(); + if (!calledRun) + dependenciesFulfilled = runCaller; + }; + function run2(args) { + args = args || arguments_; + if (runDependencies > 0) { + return; + } + preRun(); + if (runDependencies > 0) { + return; + } + function doRun() { + if (calledRun) + return; + calledRun = true; + Module["calledRun"] = true; + if (ABORT) + return; + initRuntime(); + preMain(); + readyPromiseResolve(Module); + if (Module["onRuntimeInitialized"]) + Module["onRuntimeInitialized"](); + postRun(); + } + if (Module["setStatus"]) { + Module["setStatus"]("Running..."); + setTimeout(function() { + setTimeout(function() { + Module["setStatus"](""); + }, 1); + doRun(); + }, 1); + } else { + doRun(); + } + } + Module["run"] = run2; + if (Module["preInit"]) { + if (typeof Module["preInit"] == "function") + Module["preInit"] = [Module["preInit"]]; + while (Module["preInit"].length > 0) { + Module["preInit"].pop()(); + } + } + run2(); + return WasmBackendModule2.ready; + }; + }(); + if (typeof exports === "object" && typeof module === "object") + module.exports = WasmBackendModule; + else if (typeof define === "function" && define["amd"]) + define([], function() { + return WasmBackendModule; + }); + else if (typeof exports === "object") + exports["WasmBackendModule"] = WasmBackendModule; +}); +var require_alea2 = __commonJS2((exports, module) => { + (function(global2, module2, define2) { + function Alea(seed) { + var me = this, mash = Mash(); + me.next = function() { + var t = 2091639 * me.s0 + me.c * 23283064365386963e-26; + me.s0 = me.s1; + me.s1 = me.s2; + return me.s2 = t - (me.c = t | 0); + }; + me.c = 1; + me.s0 = mash(" "); + me.s1 = mash(" "); + me.s2 = mash(" "); + me.s0 -= mash(seed); + if (me.s0 < 0) { + me.s0 += 1; + } + me.s1 -= mash(seed); + if (me.s1 < 0) { + me.s1 += 1; + } + me.s2 -= mash(seed); + if (me.s2 < 0) { + me.s2 += 1; + } + mash = null; + } + function copy(f, t) { + t.c = f.c; + t.s0 = f.s0; + t.s1 = f.s1; + t.s2 = f.s2; + return t; + } + function impl(seed, opts) { + var xg = new Alea(seed), state = opts && opts.state, prng = xg.next; + prng.int32 = function() { + return xg.next() * 4294967296 | 0; + }; + prng.double = function() { + return prng() + (prng() * 2097152 | 0) * 11102230246251565e-32; + }; + prng.quick = prng; + if (state) { + if (typeof state == "object") + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + function Mash() { + var n = 4022871197; + var mash = function(data2) { + data2 = String(data2); + for (var i = 0; i < data2.length; i++) { + n += data2.charCodeAt(i); + var h = 0.02519603282416938 * n; + n = h >>> 0; + h -= n; + h *= n; + n = h >>> 0; + h -= n; + n += h * 4294967296; + } + return (n >>> 0) * 23283064365386963e-26; + }; + return mash; + } + if (module2 && module2.exports) { + module2.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.alea = impl; + } + })(exports, typeof module == "object" && module, typeof define == "function" && define); +}); +var require_xor1282 = __commonJS2((exports, module) => { + (function(global2, module2, define2) { + function XorGen(seed) { + var me = this, strseed = ""; + me.x = 0; + me.y = 0; + me.z = 0; + me.w = 0; + me.next = function() { + var t = me.x ^ me.x << 11; + me.x = me.y; + me.y = me.z; + me.z = me.w; + return me.w ^= me.w >>> 19 ^ t ^ t >>> 8; + }; + if (seed === (seed | 0)) { + me.x = seed; + } else { + strseed += seed; + } + for (var k = 0; k < strseed.length + 64; k++) { + me.x ^= strseed.charCodeAt(k) | 0; + me.next(); + } + } + function copy(f, t) { + t.x = f.x; + t.y = f.y; + t.z = f.z; + t.w = f.w; + return t; + } + function impl(seed, opts) { + var xg = new XorGen(seed), state = opts && opts.state, prng = function() { + return (xg.next() >>> 0) / 4294967296; + }; + prng.double = function() { + do { + var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); + } while (result === 0); + return result; + }; + prng.int32 = xg.next; + prng.quick = prng; + if (state) { + if (typeof state == "object") + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + if (module2 && module2.exports) { + module2.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.xor128 = impl; + } + })(exports, typeof module == "object" && module, typeof define == "function" && define); +}); +var require_xorwow2 = __commonJS2((exports, module) => { + (function(global2, module2, define2) { + function XorGen(seed) { + var me = this, strseed = ""; + me.next = function() { + var t = me.x ^ me.x >>> 2; + me.x = me.y; + me.y = me.z; + me.z = me.w; + me.w = me.v; + return (me.d = me.d + 362437 | 0) + (me.v = me.v ^ me.v << 4 ^ (t ^ t << 1)) | 0; + }; + me.x = 0; + me.y = 0; + me.z = 0; + me.w = 0; + me.v = 0; + if (seed === (seed | 0)) { + me.x = seed; + } else { + strseed += seed; + } + for (var k = 0; k < strseed.length + 64; k++) { + me.x ^= strseed.charCodeAt(k) | 0; + if (k == strseed.length) { + me.d = me.x << 10 ^ me.x >>> 4; + } + me.next(); + } + } + function copy(f, t) { + t.x = f.x; + t.y = f.y; + t.z = f.z; + t.w = f.w; + t.v = f.v; + t.d = f.d; + return t; + } + function impl(seed, opts) { + var xg = new XorGen(seed), state = opts && opts.state, prng = function() { + return (xg.next() >>> 0) / 4294967296; + }; + prng.double = function() { + do { + var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); + } while (result === 0); + return result; + }; + prng.int32 = xg.next; + prng.quick = prng; + if (state) { + if (typeof state == "object") + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + if (module2 && module2.exports) { + module2.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.xorwow = impl; + } + })(exports, typeof module == "object" && module, typeof define == "function" && define); +}); +var require_xorshift72 = __commonJS2((exports, module) => { + (function(global2, module2, define2) { + function XorGen(seed) { + var me = this; + me.next = function() { + var X = me.x, i = me.i, t, v, w; + t = X[i]; + t ^= t >>> 7; + v = t ^ t << 24; + t = X[i + 1 & 7]; + v ^= t ^ t >>> 10; + t = X[i + 3 & 7]; + v ^= t ^ t >>> 3; + t = X[i + 4 & 7]; + v ^= t ^ t << 7; + t = X[i + 7 & 7]; + t = t ^ t << 13; + v ^= t ^ t << 9; + X[i] = v; + me.i = i + 1 & 7; + return v; + }; + function init2(me2, seed2) { + var j, w, X = []; + if (seed2 === (seed2 | 0)) { + w = X[0] = seed2; + } else { + seed2 = "" + seed2; + for (j = 0; j < seed2.length; ++j) { + X[j & 7] = X[j & 7] << 15 ^ seed2.charCodeAt(j) + X[j + 1 & 7] << 13; + } + } + while (X.length < 8) + X.push(0); + for (j = 0; j < 8 && X[j] === 0; ++j) + ; + if (j == 8) + w = X[7] = -1; + else + w = X[j]; + me2.x = X; + me2.i = 0; + for (j = 256; j > 0; --j) { + me2.next(); + } + } + init2(me, seed); + } + function copy(f, t) { + t.x = f.x.slice(); + t.i = f.i; + return t; + } + function impl(seed, opts) { + if (seed == null) + seed = +new Date(); + var xg = new XorGen(seed), state = opts && opts.state, prng = function() { + return (xg.next() >>> 0) / 4294967296; + }; + prng.double = function() { + do { + var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); + } while (result === 0); + return result; + }; + prng.int32 = xg.next; + prng.quick = prng; + if (state) { + if (state.x) + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + if (module2 && module2.exports) { + module2.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.xorshift7 = impl; + } + })(exports, typeof module == "object" && module, typeof define == "function" && define); +}); +var require_xor40962 = __commonJS2((exports, module) => { + (function(global2, module2, define2) { + function XorGen(seed) { + var me = this; + me.next = function() { + var w = me.w, X = me.X, i = me.i, t, v; + me.w = w = w + 1640531527 | 0; + v = X[i + 34 & 127]; + t = X[i = i + 1 & 127]; + v ^= v << 13; + t ^= t << 17; + v ^= v >>> 15; + t ^= t >>> 12; + v = X[i] = v ^ t; + me.i = i; + return v + (w ^ w >>> 16) | 0; + }; + function init2(me2, seed2) { + var t, v, i, j, w, X = [], limit = 128; + if (seed2 === (seed2 | 0)) { + v = seed2; + seed2 = null; + } else { + seed2 = seed2 + "\0"; + v = 0; + limit = Math.max(limit, seed2.length); + } + for (i = 0, j = -32; j < limit; ++j) { + if (seed2) + v ^= seed2.charCodeAt((j + 32) % seed2.length); + if (j === 0) + w = v; + v ^= v << 10; + v ^= v >>> 15; + v ^= v << 4; + v ^= v >>> 13; + if (j >= 0) { + w = w + 1640531527 | 0; + t = X[j & 127] ^= v + w; + i = t == 0 ? i + 1 : 0; + } + } + if (i >= 128) { + X[(seed2 && seed2.length || 0) & 127] = -1; + } + i = 127; + for (j = 4 * 128; j > 0; --j) { + v = X[i + 34 & 127]; + t = X[i = i + 1 & 127]; + v ^= v << 13; + t ^= t << 17; + v ^= v >>> 15; + t ^= t >>> 12; + X[i] = v ^ t; + } + me2.w = w; + me2.X = X; + me2.i = i; + } + init2(me, seed); + } + function copy(f, t) { + t.i = f.i; + t.w = f.w; + t.X = f.X.slice(); + return t; + } + ; + function impl(seed, opts) { + if (seed == null) + seed = +new Date(); + var xg = new XorGen(seed), state = opts && opts.state, prng = function() { + return (xg.next() >>> 0) / 4294967296; + }; + prng.double = function() { + do { + var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); + } while (result === 0); + return result; + }; + prng.int32 = xg.next; + prng.quick = prng; + if (state) { + if (state.X) + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + if (module2 && module2.exports) { + module2.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.xor4096 = impl; + } + })(exports, typeof module == "object" && module, typeof define == "function" && define); +}); +var require_tychei2 = __commonJS2((exports, module) => { + (function(global2, module2, define2) { + function XorGen(seed) { + var me = this, strseed = ""; + me.next = function() { + var b = me.b, c = me.c, d = me.d, a = me.a; + b = b << 25 ^ b >>> 7 ^ c; + c = c - d | 0; + d = d << 24 ^ d >>> 8 ^ a; + a = a - b | 0; + me.b = b = b << 20 ^ b >>> 12 ^ c; + me.c = c = c - d | 0; + me.d = d << 16 ^ c >>> 16 ^ a; + return me.a = a - b | 0; + }; + me.a = 0; + me.b = 0; + me.c = 2654435769 | 0; + me.d = 1367130551; + if (seed === Math.floor(seed)) { + me.a = seed / 4294967296 | 0; + me.b = seed | 0; + } else { + strseed += seed; + } + for (var k = 0; k < strseed.length + 20; k++) { + me.b ^= strseed.charCodeAt(k) | 0; + me.next(); + } + } + function copy(f, t) { + t.a = f.a; + t.b = f.b; + t.c = f.c; + t.d = f.d; + return t; + } + ; + function impl(seed, opts) { + var xg = new XorGen(seed), state = opts && opts.state, prng = function() { + return (xg.next() >>> 0) / 4294967296; + }; + prng.double = function() { + do { + var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); + } while (result === 0); + return result; + }; + prng.int32 = xg.next; + prng.quick = prng; + if (state) { + if (typeof state == "object") + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + if (module2 && module2.exports) { + module2.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.tychei = impl; + } + })(exports, typeof module == "object" && module, typeof define == "function" && define); +}); +var require_seedrandom3 = __commonJS2((exports, module) => { + (function(global2, pool3, math) { + var width = 256, chunks = 6, digits = 52, rngname = "random", startdenom = math.pow(width, chunks), significance = math.pow(2, digits), overflow = significance * 2, mask = width - 1, nodecrypto; + function seedrandom5(seed, options, callback) { + var key = []; + options = options == true ? {entropy: true} : options || {}; + var shortseed = mixkey(flatten4(options.entropy ? [seed, tostring(pool3)] : seed == null ? autoseed() : seed, 3), key); + var arc4 = new ARC4(key); + var prng = function() { + var n = arc4.g(chunks), d = startdenom, x = 0; + while (n < significance) { + n = (n + x) * width; + d *= width; + x = arc4.g(1); + } + while (n >= overflow) { + n /= 2; + d /= 2; + x >>>= 1; + } + return (n + x) / d; + }; + prng.int32 = function() { + return arc4.g(4) | 0; + }; + prng.quick = function() { + return arc4.g(4) / 4294967296; + }; + prng.double = prng; + mixkey(tostring(arc4.S), pool3); + return (options.pass || callback || function(prng2, seed2, is_math_call, state) { + if (state) { + if (state.S) { + copy(state, arc4); + } + prng2.state = function() { + return copy(arc4, {}); + }; + } + if (is_math_call) { + math[rngname] = prng2; + return seed2; + } else + return prng2; + })(prng, shortseed, "global" in options ? options.global : this == math, options.state); + } + function ARC4(key) { + var t, keylen = key.length, me = this, i = 0, j = me.i = me.j = 0, s = me.S = []; + if (!keylen) { + key = [keylen++]; + } + while (i < width) { + s[i] = i++; + } + for (i = 0; i < width; i++) { + s[i] = s[j = mask & j + key[i % keylen] + (t = s[i])]; + s[j] = t; + } + (me.g = function(count2) { + var t2, r = 0, i2 = me.i, j2 = me.j, s2 = me.S; + while (count2--) { + t2 = s2[i2 = mask & i2 + 1]; + r = r * width + s2[mask & (s2[i2] = s2[j2 = mask & j2 + t2]) + (s2[j2] = t2)]; + } + me.i = i2; + me.j = j2; + return r; + })(width); + } + function copy(f, t) { + t.i = f.i; + t.j = f.j; + t.S = f.S.slice(); + return t; + } + ; + function flatten4(obj, depth) { + var result = [], typ = typeof obj, prop; + if (depth && typ == "object") { + for (prop in obj) { + try { + result.push(flatten4(obj[prop], depth - 1)); + } catch (e) { + } + } + } + return result.length ? result : typ == "string" ? obj : obj + "\0"; + } + function mixkey(seed, key) { + var stringseed = seed + "", smear, j = 0; + while (j < stringseed.length) { + key[mask & j] = mask & (smear ^= key[mask & j] * 19) + stringseed.charCodeAt(j++); + } + return tostring(key); + } + function autoseed() { + try { + var out; + if (nodecrypto && (out = nodecrypto.randomBytes)) { + out = out(width); + } else { + out = new Uint8Array(width); + (global2.crypto || global2.msCrypto).getRandomValues(out); + } + return tostring(out); + } catch (e) { + var browser = global2.navigator, plugins = browser && browser.plugins; + return [+new Date(), global2, plugins, global2.screen, tostring(pool3)]; + } + } + function tostring(a) { + return String.fromCharCode.apply(0, a); + } + mixkey(math.random(), pool3); + if (typeof module == "object" && module.exports) { + module.exports = seedrandom5; + try { + nodecrypto = require_crypto(); + } catch (ex) { + } + } else if (typeof define == "function" && define.amd) { + define(function() { + return seedrandom5; + }); + } else { + math["seed" + rngname] = seedrandom5; + } + })(typeof self !== "undefined" ? self : exports, [], Math); +}); +var require_seedrandom4 = __commonJS2((exports, module) => { + var alea5 = require_alea2(); + var xor128 = require_xor1282(); + var xorwow = require_xorwow2(); + var xorshift7 = require_xorshift72(); + var xor4096 = require_xor40962(); + var tychei = require_tychei2(); + var sr = require_seedrandom3(); + sr.alea = alea5; + sr.xor128 = xor128; + sr.xorwow = xorwow; + sr.xorshift7 = xorshift7; + sr.xor4096 = xor4096; + sr.tychei = tychei; + module.exports = sr; +}); +var require_string_decoder = __commonJS2(() => { +}); +var version = "3.3.0"; +var version2 = "3.3.0"; +var version3 = "3.3.0"; +var version4 = "3.3.0"; +var version5 = "3.3.0"; +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +var EPSILON_FLOAT32 = 1e-7; +var EPSILON_FLOAT16 = 1e-4; +var DataStorage = class { + constructor(backend22, dataMover) { + this.backend = backend22; + this.dataMover = dataMover; + this.data = new WeakMap(); + this.dataIdsCount = 0; + } + get(dataId) { + if (!this.data.has(dataId)) { + this.dataMover.moveData(this.backend, dataId); + } + return this.data.get(dataId); + } + set(dataId, value) { + this.dataIdsCount++; + this.data.set(dataId, value); + } + has(dataId) { + return this.data.has(dataId); + } + delete(dataId) { + this.dataIdsCount--; + return this.data.delete(dataId); + } + numDataIds() { + return this.dataIdsCount; + } +}; +var KernelBackend = class { + refCount(dataId) { + return notYetImplemented("refCount"); + } + incRef(dataId) { + return notYetImplemented("incRef"); + } + timerAvailable() { + return true; + } + time(f) { + return notYetImplemented("time"); + } + read(dataId) { + return notYetImplemented("read"); + } + readSync(dataId) { + return notYetImplemented("readSync"); + } + numDataIds() { + return notYetImplemented("numDataIds"); + } + disposeData(dataId, force) { + return notYetImplemented("disposeData"); + } + write(values, shape, dtype) { + return notYetImplemented("write"); + } + move(dataId, values, shape, dtype, refCount) { + return notYetImplemented("move"); + } + memory() { + return notYetImplemented("memory"); + } + floatPrecision() { + return notYetImplemented("floatPrecision"); + } + epsilon() { + return this.floatPrecision() === 32 ? EPSILON_FLOAT32 : EPSILON_FLOAT16; + } + dispose() { + return notYetImplemented("dispose"); + } +}; +function notYetImplemented(kernelName) { + throw new Error(`'${kernelName}' not yet implemented or not found in the registry. This kernel may not be supported by the tfjs backend you have chosen`); +} +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function shuffle(array2) { + let counter = array2.length; + let temp = 0; + let index = 0; + while (counter > 0) { + index = Math.random() * counter | 0; + counter--; + temp = array2[counter]; + array2[counter] = array2[index]; + array2[index] = temp; + } +} +function shuffleCombo(array2, array22) { + if (array2.length !== array22.length) { + throw new Error(`Array sizes must match to be shuffled together First array length was ${array2.length}Second array length was ${array22.length}`); + } + let counter = array2.length; + let temp, temp2; + let index = 0; + while (counter > 0) { + index = Math.random() * counter | 0; + counter--; + temp = array2[counter]; + temp2 = array22[counter]; + array2[counter] = array2[index]; + array22[counter] = array22[index]; + array2[index] = temp; + array22[index] = temp2; + } +} +function clamp(min6, x, max6) { + return Math.max(min6, Math.min(x, max6)); +} +function nearestLargerEven(val) { + return val % 2 === 0 ? val : val + 1; +} +function sum(arr) { + let sum6 = 0; + for (let i = 0; i < arr.length; i++) { + sum6 += arr[i]; + } + return sum6; +} +function randUniform(a, b) { + const r = Math.random(); + return b * r + (1 - r) * a; +} +function distSquared(a, b) { + let result = 0; + for (let i = 0; i < a.length; i++) { + const diff = Number(a[i]) - Number(b[i]); + result += diff * diff; + } + return result; +} +function assert(expr, msg) { + if (!expr) { + throw new Error(typeof msg === "string" ? msg : msg()); + } +} +function assertShapesMatch(shapeA, shapeB, errorMessagePrefix = "") { + assert(arraysEqual(shapeA, shapeB), () => errorMessagePrefix + ` Shapes ${shapeA} and ${shapeB} must match`); +} +function assertNonNull(a) { + assert(a != null, () => `The input to the tensor constructor must be a non-null value.`); +} +function flatten(arr, result = [], skipTypedArray = false) { + if (result == null) { + result = []; + } + if (Array.isArray(arr) || isTypedArray(arr) && !skipTypedArray) { + for (let i = 0; i < arr.length; ++i) { + flatten(arr[i], result, skipTypedArray); + } + } else { + result.push(arr); + } + return result; +} +function sizeFromShape(shape) { + if (shape.length === 0) { + return 1; + } + let size = shape[0]; + for (let i = 1; i < shape.length; i++) { + size *= shape[i]; + } + return size; +} +function isScalarShape(shape) { + return shape.length === 0; +} +function arraysEqual(n1, n2) { + if (n1 === n2) { + return true; + } + if (n1 == null || n2 == null) { + return false; + } + if (n1.length !== n2.length) { + return false; + } + for (let i = 0; i < n1.length; i++) { + if (n1[i] !== n2[i]) { + return false; + } + } + return true; +} +function isInt(a) { + return a % 1 === 0; +} +function tanh(x) { + if (Math.tanh != null) { + return Math.tanh(x); + } + if (x === Infinity) { + return 1; + } else if (x === -Infinity) { + return -1; + } else { + const e2x = Math.exp(2 * x); + return (e2x - 1) / (e2x + 1); + } +} +function sizeToSquarishShape(size) { + const width = Math.ceil(Math.sqrt(size)); + return [width, Math.ceil(size / width)]; +} +function createShuffledIndices(n) { + const shuffledIndices = new Uint32Array(n); + for (let i = 0; i < n; ++i) { + shuffledIndices[i] = i; + } + shuffle(shuffledIndices); + return shuffledIndices; +} +function rightPad(a, size) { + if (size <= a.length) { + return a; + } + return a + " ".repeat(size - a.length); +} +function repeatedTry(checkFn, delayFn = (counter) => 0, maxCounter) { + return new Promise((resolve, reject) => { + let tryCount = 0; + const tryFn = () => { + if (checkFn()) { + resolve(); + return; + } + tryCount++; + const nextBackoff = delayFn(tryCount); + if (maxCounter != null && tryCount >= maxCounter) { + reject(); + return; + } + setTimeout(tryFn, nextBackoff); + }; + tryFn(); + }); +} +function inferFromImplicitShape(shape, size) { + let shapeProd = 1; + let implicitIdx = -1; + for (let i = 0; i < shape.length; ++i) { + if (shape[i] >= 0) { + shapeProd *= shape[i]; + } else if (shape[i] === -1) { + if (implicitIdx !== -1) { + throw Error(`Shapes can only have 1 implicit size. Found -1 at dim ${implicitIdx} and dim ${i}`); + } + implicitIdx = i; + } else if (shape[i] < 0) { + throw Error(`Shapes can not be < 0. Found ${shape[i]} at dim ${i}`); + } + } + if (implicitIdx === -1) { + if (size > 0 && size !== shapeProd) { + throw Error(`Size(${size}) must match the product of shape ${shape}`); + } + return shape; + } + if (shapeProd === 0) { + throw Error(`Cannot infer the missing size in [${shape}] when there are 0 elements`); + } + if (size % shapeProd !== 0) { + throw Error(`The implicit shape can't be a fractional number. Got ${size} / ${shapeProd}`); + } + const newShape = shape.slice(); + newShape[implicitIdx] = size / shapeProd; + return newShape; +} +function parseAxisParam(axis, shape) { + const rank = shape.length; + axis = axis == null ? shape.map((s, i) => i) : [].concat(axis); + assert(axis.every((ax) => ax >= -rank && ax < rank), () => `All values in axis param must be in range [-${rank}, ${rank}) but got axis ${axis}`); + assert(axis.every((ax) => isInt(ax)), () => `All values in axis param must be integers but got axis ${axis}`); + return axis.map((a) => a < 0 ? rank + a : a); +} +function squeezeShape(shape, axis) { + const newShape = []; + const keptDims = []; + const isEmptyArray = axis != null && Array.isArray(axis) && axis.length === 0; + const axes = axis == null || isEmptyArray ? null : parseAxisParam(axis, shape).sort(); + let j = 0; + for (let i = 0; i < shape.length; ++i) { + if (axes != null) { + if (axes[j] === i && shape[i] !== 1) { + throw new Error(`Can't squeeze axis ${i} since its dim '${shape[i]}' is not 1`); + } + if ((axes[j] == null || axes[j] > i) && shape[i] === 1) { + newShape.push(shape[i]); + keptDims.push(i); + } + if (axes[j] <= i) { + j++; + } + } + if (shape[i] !== 1) { + newShape.push(shape[i]); + keptDims.push(i); + } + } + return {newShape, keptDims}; +} +function getTypedArrayFromDType(dtype, size) { + let values = null; + if (dtype == null || dtype === "float32") { + values = new Float32Array(size); + } else if (dtype === "int32") { + values = new Int32Array(size); + } else if (dtype === "bool") { + values = new Uint8Array(size); + } else { + throw new Error(`Unknown data type ${dtype}`); + } + return values; +} +function getArrayFromDType(dtype, size) { + let values = null; + if (dtype == null || dtype === "float32") { + values = new Float32Array(size); + } else if (dtype === "int32") { + values = new Int32Array(size); + } else if (dtype === "bool") { + values = new Uint8Array(size); + } else if (dtype === "string") { + values = new Array(size); + } else { + throw new Error(`Unknown data type ${dtype}`); + } + return values; +} +function checkConversionForErrors(vals, dtype) { + for (let i = 0; i < vals.length; i++) { + const num = vals[i]; + if (isNaN(num) || !isFinite(num)) { + throw Error(`A tensor of type ${dtype} being uploaded contains ${num}.`); + } + } +} +function isValidDtype(dtype) { + return dtype === "bool" || dtype === "complex64" || dtype === "float32" || dtype === "int32" || dtype === "string"; +} +function hasEncodingLoss(oldType, newType) { + if (newType === "complex64") { + return false; + } + if (newType === "float32" && oldType !== "complex64") { + return false; + } + if (newType === "int32" && oldType !== "float32" && oldType !== "complex64") { + return false; + } + if (newType === "bool" && oldType === "bool") { + return false; + } + return true; +} +function isTypedArray(a) { + return a instanceof Float32Array || a instanceof Int32Array || a instanceof Uint8Array; +} +function bytesPerElement(dtype) { + if (dtype === "float32" || dtype === "int32") { + return 4; + } else if (dtype === "complex64") { + return 8; + } else if (dtype === "bool") { + return 1; + } else { + throw new Error(`Unknown dtype ${dtype}`); + } +} +function bytesFromStringArray(arr) { + if (arr == null) { + return 0; + } + let bytes = 0; + arr.forEach((x) => bytes += x.length); + return bytes; +} +function isString(value) { + return typeof value === "string" || value instanceof String; +} +function isBoolean(value) { + return typeof value === "boolean"; +} +function isNumber(value) { + return typeof value === "number"; +} +function inferDtype(values) { + if (Array.isArray(values)) { + return inferDtype(values[0]); + } + if (values instanceof Float32Array) { + return "float32"; + } else if (values instanceof Int32Array || values instanceof Uint8Array) { + return "int32"; + } else if (isNumber(values)) { + return "float32"; + } else if (isString(values)) { + return "string"; + } else if (isBoolean(values)) { + return "bool"; + } + return "float32"; +} +function isFunction(f) { + return !!(f && f.constructor && f.call && f.apply); +} +function nearestDivisor(size, start) { + for (let i = start; i < size; ++i) { + if (size % i === 0) { + return i; + } + } + return size; +} +function computeStrides(shape) { + const rank = shape.length; + if (rank < 2) { + return []; + } + const strides = new Array(rank - 1); + strides[rank - 2] = shape[rank - 1]; + for (let i = rank - 3; i >= 0; --i) { + strides[i] = strides[i + 1] * shape[i + 1]; + } + return strides; +} +function createNestedArray(offset, shape, a) { + const ret = new Array(); + if (shape.length === 1) { + const d = shape[0]; + for (let i = 0; i < d; i++) { + ret[i] = a[offset + i]; + } + } else { + const d = shape[0]; + const rest = shape.slice(1); + const len = rest.reduce((acc, c) => acc * c); + for (let i = 0; i < d; i++) { + ret[i] = createNestedArray(offset + i * len, rest, a); + } + } + return ret; +} +function toNestedArray(shape, a) { + if (shape.length === 0) { + return a[0]; + } + const size = shape.reduce((acc, c) => acc * c); + if (size === 0) { + return []; + } + if (size !== a.length) { + throw new Error(`[${shape}] does not match the input size ${a.length}.`); + } + return createNestedArray(0, shape, a); +} +function makeOnesTypedArray(size, dtype) { + const array2 = makeZerosTypedArray(size, dtype); + for (let i = 0; i < array2.length; i++) { + array2[i] = 1; + } + return array2; +} +function makeZerosTypedArray(size, dtype) { + if (dtype == null || dtype === "float32" || dtype === "complex64") { + return new Float32Array(size); + } else if (dtype === "int32") { + return new Int32Array(size); + } else if (dtype === "bool") { + return new Uint8Array(size); + } else { + throw new Error(`Unknown data type ${dtype}`); + } +} +function makeZerosNestedTypedArray(shape, dtype) { + const size = shape.reduce((prev, curr) => prev * curr, 1); + if (dtype == null || dtype === "float32") { + return toNestedArray(shape, new Float32Array(size)); + } else if (dtype === "int32") { + return toNestedArray(shape, new Int32Array(size)); + } else if (dtype === "bool") { + return toNestedArray(shape, new Uint8Array(size)); + } else { + throw new Error(`Unknown data type ${dtype}`); + } +} +function assertNonNegativeIntegerDimensions(shape) { + shape.forEach((dimSize) => { + assert(Number.isInteger(dimSize) && dimSize >= 0, () => `Tensor must have a shape comprised of positive integers but got shape [${shape}].`); + }); +} +function locToIndex(locs, rank, strides) { + if (rank === 0) { + return 0; + } else if (rank === 1) { + return locs[0]; + } + let index = locs[locs.length - 1]; + for (let i = 0; i < locs.length - 1; ++i) { + index += strides[i] * locs[i]; + } + return index; +} +function indexToLoc(index, rank, strides) { + if (rank === 0) { + return []; + } else if (rank === 1) { + return [index]; + } + const locs = new Array(rank); + for (let i = 0; i < locs.length - 1; ++i) { + locs[i] = Math.floor(index / strides[i]); + index -= locs[i] * strides[i]; + } + locs[locs.length - 1] = index; + return locs; +} +function isPromise(object2) { + return object2 && object2.then && typeof object2.then === "function"; +} +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +var TENSORFLOWJS_FLAGS_PREFIX = "tfjsflags"; +var Environment = class { + constructor(global2) { + this.global = global2; + this.flags = {}; + this.flagRegistry = {}; + this.urlFlags = {}; + this.populateURLFlags(); + } + setPlatform(platformName, platform) { + if (this.platform != null) { + console.warn(`Platform ${this.platformName} has already been set. Overwriting the platform with ${platform}.`); + } + this.platformName = platformName; + this.platform = platform; + } + registerFlag(flagName, evaluationFn, setHook) { + this.flagRegistry[flagName] = {evaluationFn, setHook}; + if (this.urlFlags[flagName] != null) { + const flagValue = this.urlFlags[flagName]; + console.warn(`Setting feature override from URL ${flagName}: ${flagValue}.`); + this.set(flagName, flagValue); + } + } + async getAsync(flagName) { + if (flagName in this.flags) { + return this.flags[flagName]; + } + this.flags[flagName] = await this.evaluateFlag(flagName); + return this.flags[flagName]; + } + get(flagName) { + if (flagName in this.flags) { + return this.flags[flagName]; + } + const flagValue = this.evaluateFlag(flagName); + if (isPromise(flagValue)) { + throw new Error(`Flag ${flagName} cannot be synchronously evaluated. Please use getAsync() instead.`); + } + this.flags[flagName] = flagValue; + return this.flags[flagName]; + } + getNumber(flagName) { + return this.get(flagName); + } + getBool(flagName) { + return this.get(flagName); + } + getFlags() { + return this.flags; + } + get features() { + return this.flags; + } + set(flagName, value) { + if (this.flagRegistry[flagName] == null) { + throw new Error(`Cannot set flag ${flagName} as it has not been registered.`); + } + this.flags[flagName] = value; + if (this.flagRegistry[flagName].setHook != null) { + this.flagRegistry[flagName].setHook(value); + } + } + evaluateFlag(flagName) { + if (this.flagRegistry[flagName] == null) { + throw new Error(`Cannot evaluate flag '${flagName}': no evaluation function found.`); + } + return this.flagRegistry[flagName].evaluationFn(); + } + setFlags(flags) { + this.flags = Object.assign({}, flags); + } + reset() { + this.flags = {}; + this.urlFlags = {}; + this.populateURLFlags(); + } + populateURLFlags() { + if (typeof this.global === "undefined" || typeof this.global.location === "undefined" || typeof this.global.location.search === "undefined") { + return; + } + const urlParams = getQueryParams(this.global.location.search); + if (TENSORFLOWJS_FLAGS_PREFIX in urlParams) { + const keyValues = urlParams[TENSORFLOWJS_FLAGS_PREFIX].split(","); + keyValues.forEach((keyValue) => { + const [key, value] = keyValue.split(":"); + this.urlFlags[key] = parseValue(key, value); + }); + } + } +}; +function getQueryParams(queryString) { + const params = {}; + queryString.replace(/[?&]([^=?&]+)(?:=([^&]*))?/g, (s, ...t) => { + decodeParam(params, t[0], t[1]); + return t.join("="); + }); + return params; +} +function decodeParam(params, name, value) { + params[decodeURIComponent(name)] = decodeURIComponent(value || ""); +} +function parseValue(flagName, value) { + value = value.toLowerCase(); + if (value === "true" || value === "false") { + return value === "true"; + } else if (`${+value}` === value) { + return +value; + } + throw new Error(`Could not parse value flag value ${value} for flag ${flagName}.`); +} +function env() { + return ENV; +} +var ENV = null; +function setEnvironmentGlobal(environment) { + ENV = environment; +} +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +var globalNameSpace; +function getGlobalNamespace() { + if (globalNameSpace == null) { + let ns; + if (typeof window !== "undefined") { + ns = window; + } else if (typeof global !== "undefined") { + ns = global; + } else if (typeof process !== "undefined") { + ns = process; + } else if (typeof self !== "undefined") { + ns = self; + } else { + throw new Error("Could not find a global object"); + } + globalNameSpace = ns; + } + return globalNameSpace; +} +function getGlobalMap() { + const ns = getGlobalNamespace(); + if (ns._tfGlobals == null) { + ns._tfGlobals = new Map(); + } + return ns._tfGlobals; +} +function getGlobal(key, init2) { + const globalMap = getGlobalMap(); + if (globalMap.has(key)) { + return globalMap.get(key); + } else { + const singleton = init2(); + globalMap.set(key, singleton); + return globalMap.get(key); + } +} +var Abs = "Abs"; +var Acos = "Acos"; +var Acosh = "Acosh"; +var Add = "Add"; +var AddN = "AddN"; +var All = "All"; +var Any = "Any"; +var ArgMax = "ArgMax"; +var ArgMin = "ArgMin"; +var Asin = "Asin"; +var Asinh = "Asinh"; +var Atan = "Atan"; +var Atanh = "Atanh"; +var Atan2 = "Atan2"; +var AvgPool = "AvgPool"; +var AvgPoolGrad = "AvgPoolGrad"; +var AvgPool3D = "AvgPool3D"; +var AvgPool3DGrad = "AvgPool3DGrad"; +var BatchMatMul = "BatchMatMul"; +var BatchToSpaceND = "BatchToSpaceND"; +var Bincount = "Bincount"; +var BroadcastTo = "BroadcastTo"; +var Cast = "Cast"; +var Ceil = "Ceil"; +var ClipByValue = "ClipByValue"; +var Complex = "Complex"; +var ComplexAbs = "ComplexAbs"; +var Concat = "Concat"; +var Conv2D = "Conv2D"; +var Conv2DBackpropFilter = "Conv2DBackpropFilter"; +var Conv2DBackpropInput = "Conv2DBackpropInput"; +var Conv3D = "Conv3D"; +var Conv3DBackpropFilterV2 = "Conv3DBackpropFilterV2"; +var Conv3DBackpropInputV2 = "Conv3DBackpropInputV2"; +var Cos = "Cos"; +var Cosh = "Cosh"; +var Cumsum = "Cumsum"; +var CropAndResize = "CropAndResize"; +var DenseBincount = "DenseBincount"; +var DepthToSpace = "DepthToSpace"; +var DepthwiseConv2dNative = "DepthwiseConv2dNative"; +var DepthwiseConv2dNativeBackpropFilter = "DepthwiseConv2dNativeBackpropFilter"; +var DepthwiseConv2dNativeBackpropInput = "DepthwiseConv2dNativeBackpropInput"; +var Diag = "Diag"; +var Dilation2D = "Dilation2D"; +var Dilation2DBackpropInput = "Dilation2DBackpropInput"; +var Dilation2DBackpropFilter = "Dilation2DBackpropFilter"; +var RealDiv = "RealDiv"; +var Elu = "Elu"; +var EluGrad = "EluGrad"; +var Erf = "Erf"; +var Equal = "Equal"; +var Exp = "Exp"; +var ExpandDims = "ExpandDims"; +var Expm1 = "Expm1"; +var FFT = "FFT"; +var Fill = "Fill"; +var FlipLeftRight = "FlipLeftRight"; +var Floor = "Floor"; +var FloorDiv = "FloorDiv"; +var FusedBatchNorm = "FusedBatchNorm"; +var GatherV2 = "GatherV2"; +var GatherNd = "GatherNd"; +var Greater = "Greater"; +var GreaterEqual = "GreaterEqual"; +var Identity = "Identity"; +var IFFT = "IFFT"; +var Imag = "Imag"; +var IsFinite = "IsFinite"; +var IsInf = "IsInf"; +var IsNan = "IsNan"; +var LeakyRelu = "LeakyRelu"; +var Less = "Less"; +var LessEqual = "LessEqual"; +var LinSpace = "LinSpace"; +var Log = "Log"; +var Log1p = "Log1p"; +var LogicalAnd = "LogicalAnd"; +var LogicalNot = "LogicalNot"; +var LogicalOr = "LogicalOr"; +var LogSoftmax = "LogSoftmax"; +var LRN = "LRN"; +var LRNGrad = "LRNGrad"; +var Max = "Max"; +var Maximum = "Maximum"; +var MaxPool = "MaxPool"; +var MaxPoolGrad = "MaxPoolGrad"; +var MaxPool3D = "MaxPool3D"; +var MaxPool3DGrad = "MaxPool3DGrad"; +var MaxPoolWithArgmax = "MaxPoolWithArgmax"; +var Mean = "Mean"; +var Min = "Min"; +var Minimum = "Minimum"; +var MirrorPad = "MirrorPad"; +var Mod = "Mod"; +var Multinomial = "Multinomial"; +var Multiply = "Multiply"; +var Neg = "Neg"; +var NotEqual = "NotEqual"; +var NonMaxSuppressionV3 = "NonMaxSuppressionV3"; +var NonMaxSuppressionV4 = "NonMaxSuppressionV4"; +var NonMaxSuppressionV5 = "NonMaxSuppressionV5"; +var OnesLike = "OnesLike"; +var OneHot = "OneHot"; +var Pack = "Pack"; +var PadV2 = "PadV2"; +var Pool = "Pool"; +var Pow = "Pow"; +var Prelu = "Prelu"; +var Prod = "Prod"; +var Range = "Range"; +var Real = "Real"; +var Reciprocal = "Reciprocal"; +var Relu = "Relu"; +var Reshape = "Reshape"; +var ResizeNearestNeighbor = "ResizeNearestNeighbor"; +var ResizeNearestNeighborGrad = "ResizeNearestNeighborGrad"; +var ResizeBilinear = "ResizeBilinear"; +var ResizeBilinearGrad = "ResizeBilinearGrad"; +var Relu6 = "Relu6"; +var Reverse = "Reverse"; +var Round = "Round"; +var Rsqrt = "Rsqrt"; +var ScatterNd = "ScatterNd"; +var Select = "Select"; +var Selu = "Selu"; +var Slice = "Slice"; +var Sin = "Sin"; +var Sinh = "Sinh"; +var Sign = "Sign"; +var Sigmoid = "Sigmoid"; +var Softplus = "Softplus"; +var Sqrt = "Sqrt"; +var Sum = "Sum"; +var SpaceToBatchND = "SpaceToBatchND"; +var SplitV = "SplitV"; +var Softmax = "Softmax"; +var SquaredDifference = "SquaredDifference"; +var Square = "Square"; +var Sub = "Sub"; +var SparseToDense = "SparseToDense"; +var StridedSlice = "StridedSlice"; +var Tan = "Tan"; +var Tanh = "Tanh"; +var Tile = "Tile"; +var TopK = "TopK"; +var Transform = "Transform"; +var Transpose = "Transpose"; +var Unique = "Unique"; +var Unpack = "Unpack"; +var UnsortedSegmentSum = "UnsortedSegmentSum"; +var ZerosLike = "ZerosLike"; +var Step = "Step"; +var FromPixels = "FromPixels"; +var RotateWithOffset = "RotateWithOffset"; +var _FusedMatMul = "_FusedMatMul"; +var FusedConv2D = "FusedConv2D"; +var FusedDepthwiseConv2D = "FusedDepthwiseConv2D"; +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +var kernelRegistry = getGlobal("kernelRegistry", () => new Map()); +var gradRegistry = getGlobal("gradRegistry", () => new Map()); +function getKernel(kernelName, backendName) { + const key = makeKey(kernelName, backendName); + return kernelRegistry.get(key); +} +function getGradient(kernelName) { + return gradRegistry.get(kernelName); +} +function getKernelsForBackend(backendName) { + const it = kernelRegistry.entries(); + const result = []; + while (true) { + const {done, value} = it.next(); + if (done) { + break; + } + const [key, config3] = value; + const [backend22] = key.split("_"); + if (backend22 === backendName) { + result.push(config3); + } + } + return result; +} +function registerKernel(config3) { + const {kernelName, backendName} = config3; + const key = makeKey(kernelName, backendName); + if (kernelRegistry.has(key)) { + console.warn(`The kernel '${kernelName}' for backend '${backendName}' is already registered`); + } + kernelRegistry.set(key, config3); +} +function registerGradient(config3) { + const {kernelName} = config3; + if (gradRegistry.has(kernelName)) { + if (env().getBool("DEBUG")) { + console.warn(`Overriding the gradient for '${kernelName}'`); + } + } + gradRegistry.set(kernelName, config3); +} +function unregisterKernel(kernelName, backendName) { + const key = makeKey(kernelName, backendName); + if (!kernelRegistry.has(key)) { + throw new Error(`The kernel '${kernelName}' for backend '${backendName}' is not registered`); + } + kernelRegistry.delete(key); +} +function unregisterGradient(kernelName) { + if (!gradRegistry.has(kernelName)) { + throw new Error(`The gradient '${kernelName}' for backend is not registered`); + } + gradRegistry.delete(kernelName); +} +function copyRegisteredKernels(registeredBackendName, newBackendName) { + const kernels = getKernelsForBackend(registeredBackendName); + kernels.forEach((kernelConfig) => { + const newKernelConfig = Object.assign({}, kernelConfig, {backendName: newBackendName}); + registerKernel(newKernelConfig); + }); +} +function makeKey(kernelName, backendName) { + return `${backendName}_${kernelName}`; +} +var util_exports = {}; +__export2(util_exports, { + arraysEqual: () => arraysEqual, + assert: () => assert, + assertNonNegativeIntegerDimensions: () => assertNonNegativeIntegerDimensions, + assertNonNull: () => assertNonNull, + assertShapesMatch: () => assertShapesMatch, + bytesFromStringArray: () => bytesFromStringArray, + bytesPerElement: () => bytesPerElement, + checkConversionForErrors: () => checkConversionForErrors, + clamp: () => clamp, + computeStrides: () => computeStrides, + createScalarValue: () => createScalarValue, + createShuffledIndices: () => createShuffledIndices, + decodeString: () => decodeString, + distSquared: () => distSquared, + encodeString: () => encodeString, + fetch: () => fetch2, + flatten: () => flatten, + getArrayFromDType: () => getArrayFromDType, + getTypedArrayFromDType: () => getTypedArrayFromDType, + hasEncodingLoss: () => hasEncodingLoss, + indexToLoc: () => indexToLoc, + inferDtype: () => inferDtype, + inferFromImplicitShape: () => inferFromImplicitShape, + isBoolean: () => isBoolean, + isFunction: () => isFunction, + isInt: () => isInt, + isNumber: () => isNumber, + isPromise: () => isPromise, + isScalarShape: () => isScalarShape, + isString: () => isString, + isTypedArray: () => isTypedArray, + isValidDtype: () => isValidDtype, + locToIndex: () => locToIndex, + makeOnesTypedArray: () => makeOnesTypedArray, + makeZerosNestedTypedArray: () => makeZerosNestedTypedArray, + makeZerosTypedArray: () => makeZerosTypedArray, + nearestDivisor: () => nearestDivisor, + nearestLargerEven: () => nearestLargerEven, + now: () => now2, + parseAxisParam: () => parseAxisParam, + randUniform: () => randUniform, + repeatedTry: () => repeatedTry, + rightPad: () => rightPad, + shuffle: () => shuffle, + shuffleCombo: () => shuffleCombo, + sizeFromShape: () => sizeFromShape, + sizeToSquarishShape: () => sizeToSquarishShape, + squeezeShape: () => squeezeShape, + sum: () => sum, + tanh: () => tanh, + toNestedArray: () => toNestedArray, + toTypedArray: () => toTypedArray +}); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function createScalarValue(value, dtype) { + if (dtype === "string") { + return encodeString(value); + } + return toTypedArray([value], dtype); +} +function noConversionNeeded(a, dtype) { + return a instanceof Float32Array && dtype === "float32" || a instanceof Int32Array && dtype === "int32" || a instanceof Uint8Array && dtype === "bool"; +} +function toTypedArray(a, dtype) { + if (dtype === "string") { + throw new Error("Cannot convert a string[] to a TypedArray"); + } + if (Array.isArray(a)) { + a = flatten(a); + } + if (env().getBool("DEBUG")) { + checkConversionForErrors(a, dtype); + } + if (noConversionNeeded(a, dtype)) { + return a; + } + if (dtype == null || dtype === "float32" || dtype === "complex64") { + return new Float32Array(a); + } else if (dtype === "int32") { + return new Int32Array(a); + } else if (dtype === "bool") { + const bool = new Uint8Array(a.length); + for (let i = 0; i < bool.length; ++i) { + if (Math.round(a[i]) !== 0) { + bool[i] = 1; + } + } + return bool; + } else { + throw new Error(`Unknown data type ${dtype}`); + } +} +function now2() { + return env().platform.now(); +} +function fetch2(path, requestInits) { + return env().platform.fetch(path, requestInits); +} +function encodeString(s, encoding = "utf-8") { + encoding = encoding || "utf-8"; + return env().platform.encode(s, encoding); +} +function decodeString(bytes, encoding = "utf-8") { + encoding = encoding || "utf-8"; + return env().platform.decode(bytes, encoding); +} +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +var Profiler = class { + constructor(backendTimer, logger) { + this.backendTimer = backendTimer; + this.logger = logger; + if (logger == null) { + this.logger = new Logger(); + } + } + profileKernel(kernelName, inputs, f) { + let outputs; + const holdResultWrapperFn = () => { + outputs = f(); + }; + let timer; + const start = now2(); + if (this.backendTimer.timerAvailable()) { + timer = this.backendTimer.time(holdResultWrapperFn); + } else { + holdResultWrapperFn(); + for (const output of outputs) { + output.dataSync(); + } + timer = Promise.resolve({kernelMs: now2() - start}); + } + if (env().getBool("CHECK_COMPUTATION_FOR_ERRORS")) { + for (let i = 0; i < outputs.length; i++) { + const output = outputs[i]; + output.data().then((tensorVals) => { + checkComputationForErrors(tensorVals, output.dtype, kernelName); + }); + } + } + const kernelProfile = { + kernelName, + outputs, + inputs, + timeMs: timer.then((timing) => timing.kernelMs), + extraInfo: timer.then((timing) => timing.getExtraProfileInfo != null ? timing.getExtraProfileInfo() : "") + }; + return kernelProfile; + } + logKernelProfile(kernelProfile) { + const {kernelName, outputs, timeMs, inputs, extraInfo} = kernelProfile; + outputs.forEach((result) => { + Promise.all([result.data(), timeMs, extraInfo]).then((valueContainer) => { + this.logger.logKernelProfile(kernelName, result, valueContainer[0], valueContainer[1], inputs, valueContainer[2]); + }); + }); + } +}; +function checkComputationForErrors(vals, dtype, kernelName) { + if (dtype !== "float32") { + return false; + } + for (let i = 0; i < vals.length; i++) { + const num = vals[i]; + if (isNaN(num) || !isFinite(num)) { + console.warn(`Found ${num} in the result of '${kernelName}'`); + return true; + } + } + return false; +} +var Logger = class { + logKernelProfile(name, result, vals, timeMs, inputs, extraInfo) { + const time2 = typeof timeMs === "number" ? rightPad(`${timeMs}ms`, 9) : timeMs["error"]; + const paddedName = rightPad(name, 25); + const rank = result.rank; + const size = result.size; + const shape = rightPad(result.shape.toString(), 14); + let inputShapesDescription = ""; + for (const name2 in inputs) { + const input2 = inputs[name2]; + if (input2 != null) { + const inputShape = input2.shape || result.shape; + const inputRank = inputShape.length; + inputShapesDescription += `${name2}: ${inputRank}D ${inputRank > 0 ? inputShape : ""} `; + } + } + console.log(`%c${paddedName} %c${time2} %c${rank}D ${shape} %c${size} %c${inputShapesDescription} %c${extraInfo}`, "font-weight:bold", "color:red", "color:blue", "color: orange", "color: green", "color: steelblue"); + } +}; +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function getFilteredNodesXToY(tape, xs, y) { + const tensorsFromX = {}; + const nodesFromX = {}; + for (let i = 0; i < xs.length; i++) { + tensorsFromX[xs[i].id] = true; + } + for (let i = 0; i < tape.length; i++) { + const node = tape[i]; + const nodeInputs = node.inputs; + for (const inputName in nodeInputs) { + const input2 = nodeInputs[inputName]; + let anyInputFromX = false; + for (let j = 0; j < xs.length; j++) { + if (tensorsFromX[input2.id]) { + node.outputs.forEach((output) => tensorsFromX[output.id] = true); + anyInputFromX = true; + nodesFromX[node.id] = true; + break; + } + } + if (anyInputFromX) { + break; + } + } + } + const tensorsLeadToY = {}; + tensorsLeadToY[y.id] = true; + const nodesToY = {}; + for (let i = tape.length - 1; i >= 0; i--) { + const node = tape[i]; + const nodeInputs = node.inputs; + for (let j = 0; j < node.outputs.length; j++) { + if (tensorsLeadToY[node.outputs[j].id]) { + for (const inputName in nodeInputs) { + tensorsLeadToY[nodeInputs[inputName].id] = true; + nodesToY[node.id] = true; + } + break; + } + } + } + const filteredTape = []; + for (let i = 0; i < tape.length; i++) { + const node = tape[i]; + if (nodesFromX[node.id] && nodesToY[node.id]) { + const prunedInputs = {}; + for (const inputName in node.inputs) { + const nodeInput = node.inputs[inputName]; + if (tensorsFromX[nodeInput.id]) { + prunedInputs[inputName] = nodeInput; + } + } + const prunedNode = Object.assign({}, node); + prunedNode.inputs = prunedInputs; + prunedNode.outputs = node.outputs; + filteredTape.push(prunedNode); + } + } + return filteredTape; +} +function backpropagateGradients(tensorAccumulatedGradientMap, filteredTape, tidy2, add5) { + for (let i = filteredTape.length - 1; i >= 0; i--) { + const node = filteredTape[i]; + const dys = []; + node.outputs.forEach((o) => { + const gradTensor = tensorAccumulatedGradientMap[o.id]; + if (gradTensor != null) { + dys.push(gradTensor); + } else { + dys.push(null); + } + }); + if (node.gradient == null) { + throw new Error(`Cannot compute gradient: gradient function not found for ${node.kernelName}.`); + } + const inputGradients = node.gradient(dys); + for (const inputName in node.inputs) { + if (!(inputName in inputGradients)) { + throw new Error(`Cannot backprop through input ${inputName}. Available gradients found: ${Object.keys(inputGradients)}.`); + } + const dx = tidy2(() => inputGradients[inputName]()); + if (dx.dtype !== "float32") { + throw new Error(`Error in gradient for op ${node.kernelName}. The gradient of input ${inputName} must have 'float32' dtype, but has '${dx.dtype}'`); + } + const x = node.inputs[inputName]; + if (!arraysEqual(dx.shape, x.shape)) { + throw new Error(`Error in gradient for op ${node.kernelName}. The gradient of input '${inputName}' has shape '${dx.shape}', which does not match the shape of the input '${x.shape}'`); + } + if (tensorAccumulatedGradientMap[x.id] == null) { + tensorAccumulatedGradientMap[x.id] = dx; + } else { + const curGradient = tensorAccumulatedGradientMap[x.id]; + tensorAccumulatedGradientMap[x.id] = add5(curGradient, dx); + curGradient.dispose(); + } + } + } +} +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +var FORMAT_LIMIT_NUM_VALS = 20; +var FORMAT_NUM_FIRST_LAST_VALS = 3; +var FORMAT_NUM_SIG_DIGITS = 7; +function tensorToString(vals, shape, dtype, verbose) { + const strides = computeStrides(shape); + const padPerCol = computeMaxSizePerColumn(vals, shape, dtype, strides); + const rank = shape.length; + const valsLines = subTensorToString(vals, shape, dtype, strides, padPerCol); + const lines2 = ["Tensor"]; + if (verbose) { + lines2.push(` dtype: ${dtype}`); + lines2.push(` rank: ${rank}`); + lines2.push(` shape: [${shape}]`); + lines2.push(` values:`); + } + lines2.push(valsLines.map((l) => " " + l).join("\n")); + return lines2.join("\n"); +} +function computeMaxSizePerColumn(vals, shape, dtype, strides) { + const n = sizeFromShape(shape); + const numCols = strides[strides.length - 1]; + const padPerCol = new Array(numCols).fill(0); + const rank = shape.length; + const valuesOrTuples = dtype === "complex64" ? createComplexTuples(vals) : vals; + if (rank > 1) { + for (let row = 0; row < n / numCols; row++) { + const offset = row * numCols; + for (let j = 0; j < numCols; j++) { + padPerCol[j] = Math.max(padPerCol[j], valToString(valuesOrTuples[offset + j], 0, dtype).length); + } + } + } + return padPerCol; +} +function valToString(val, pad3, dtype) { + let valStr; + if (Array.isArray(val)) { + valStr = `${parseFloat(val[0].toFixed(FORMAT_NUM_SIG_DIGITS))} + ${parseFloat(val[1].toFixed(FORMAT_NUM_SIG_DIGITS))}j`; + } else if (isString(val)) { + valStr = `'${val}'`; + } else if (dtype === "bool") { + valStr = boolNumToString(val); + } else { + valStr = parseFloat(val.toFixed(FORMAT_NUM_SIG_DIGITS)).toString(); + } + return rightPad(valStr, pad3); +} +function boolNumToString(v) { + return v === 0 ? "false" : "true"; +} +function subTensorToString(vals, shape, dtype, strides, padPerCol, isLast = true) { + const storagePerElement = dtype === "complex64" ? 2 : 1; + const size = shape[0]; + const rank = shape.length; + if (rank === 0) { + if (dtype === "complex64") { + const complexTuple = createComplexTuples(vals); + return [valToString(complexTuple[0], 0, dtype)]; + } + if (dtype === "bool") { + return [boolNumToString(vals[0])]; + } + return [vals[0].toString()]; + } + if (rank === 1) { + if (size > FORMAT_LIMIT_NUM_VALS) { + const firstValsSize = FORMAT_NUM_FIRST_LAST_VALS * storagePerElement; + let firstVals = Array.from(vals.slice(0, firstValsSize)); + let lastVals = Array.from(vals.slice((size - FORMAT_NUM_FIRST_LAST_VALS) * storagePerElement, size * storagePerElement)); + if (dtype === "complex64") { + firstVals = createComplexTuples(firstVals); + lastVals = createComplexTuples(lastVals); + } + return [ + "[" + firstVals.map((x, i) => valToString(x, padPerCol[i], dtype)).join(", ") + ", ..., " + lastVals.map((x, i) => valToString(x, padPerCol[size - FORMAT_NUM_FIRST_LAST_VALS + i], dtype)).join(", ") + "]" + ]; + } + const displayVals = dtype === "complex64" ? createComplexTuples(vals) : Array.from(vals); + return [ + "[" + displayVals.map((x, i) => valToString(x, padPerCol[i], dtype)).join(", ") + "]" + ]; + } + const subshape = shape.slice(1); + const substrides = strides.slice(1); + const stride = strides[0] * storagePerElement; + const lines2 = []; + if (size > FORMAT_LIMIT_NUM_VALS) { + for (let i = 0; i < FORMAT_NUM_FIRST_LAST_VALS; i++) { + const start = i * stride; + const end = start + stride; + lines2.push(...subTensorToString(vals.slice(start, end), subshape, dtype, substrides, padPerCol, false)); + } + lines2.push("..."); + for (let i = size - FORMAT_NUM_FIRST_LAST_VALS; i < size; i++) { + const start = i * stride; + const end = start + stride; + lines2.push(...subTensorToString(vals.slice(start, end), subshape, dtype, substrides, padPerCol, i === size - 1)); + } + } else { + for (let i = 0; i < size; i++) { + const start = i * stride; + const end = start + stride; + lines2.push(...subTensorToString(vals.slice(start, end), subshape, dtype, substrides, padPerCol, i === size - 1)); + } + } + const sep = rank === 2 ? "," : ""; + lines2[0] = "[" + lines2[0] + sep; + for (let i = 1; i < lines2.length - 1; i++) { + lines2[i] = " " + lines2[i] + sep; + } + let newLineSep = ",\n"; + for (let i = 2; i < rank; i++) { + newLineSep += "\n"; + } + lines2[lines2.length - 1] = " " + lines2[lines2.length - 1] + "]" + (isLast ? "" : newLineSep); + return lines2; +} +function createComplexTuples(vals) { + const complexTuples = []; + for (let i = 0; i < vals.length; i += 2) { + complexTuples.push([vals[i], vals[i + 1]]); + } + return complexTuples; +} +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +var TensorBuffer = class { + constructor(shape, dtype, values) { + this.dtype = dtype; + this.shape = shape.slice(); + this.size = sizeFromShape(shape); + if (values != null) { + const n = values.length; + assert(n === this.size, () => `Length of values '${n}' does not match the size inferred by the shape '${this.size}'.`); + } + if (dtype === "complex64") { + throw new Error(`complex64 dtype TensorBuffers are not supported. Please create a TensorBuffer for the real and imaginary parts separately and call tf.complex(real, imag).`); + } + this.values = values || getArrayFromDType(dtype, this.size); + this.strides = computeStrides(shape); + } + set(value, ...locs) { + if (locs.length === 0) { + locs = [0]; + } + assert(locs.length === this.rank, () => `The number of provided coordinates (${locs.length}) must match the rank (${this.rank})`); + const index = this.locToIndex(locs); + this.values[index] = value; + } + get(...locs) { + if (locs.length === 0) { + locs = [0]; + } + let i = 0; + for (const loc of locs) { + if (loc < 0 || loc >= this.shape[i]) { + const msg = `Requested out of range element at ${locs}. Buffer shape=${this.shape}`; + throw new Error(msg); + } + i++; + } + let index = locs[locs.length - 1]; + for (let i2 = 0; i2 < locs.length - 1; ++i2) { + index += this.strides[i2] * locs[i2]; + } + return this.values[index]; + } + locToIndex(locs) { + if (this.rank === 0) { + return 0; + } else if (this.rank === 1) { + return locs[0]; + } + let index = locs[locs.length - 1]; + for (let i = 0; i < locs.length - 1; ++i) { + index += this.strides[i] * locs[i]; + } + return index; + } + indexToLoc(index) { + if (this.rank === 0) { + return []; + } else if (this.rank === 1) { + return [index]; + } + const locs = new Array(this.shape.length); + for (let i = 0; i < locs.length - 1; ++i) { + locs[i] = Math.floor(index / this.strides[i]); + index -= locs[i] * this.strides[i]; + } + locs[locs.length - 1] = index; + return locs; + } + get rank() { + return this.shape.length; + } + toTensor() { + return trackerFn().makeTensor(this.values, this.shape, this.dtype); + } +}; +var trackerFn = null; +var opHandler = null; +var deprecationWarningFn = null; +function setTensorTracker(fn) { + trackerFn = fn; +} +function setOpHandler(handler) { + opHandler = handler; +} +function setDeprecationWarningFn(fn) { + deprecationWarningFn = fn; +} +var Tensor = class { + constructor(shape, dtype, dataId, id) { + this.kept = false; + this.isDisposedInternal = false; + this.shape = shape.slice(); + this.dtype = dtype || "float32"; + this.size = sizeFromShape(shape); + this.strides = computeStrides(shape); + this.dataId = dataId; + this.id = id; + this.rankType = this.rank < 5 ? this.rank.toString() : "higher"; + } + get rank() { + return this.shape.length; + } + async buffer() { + const vals = await this.data(); + return opHandler.buffer(this.shape, this.dtype, vals); + } + bufferSync() { + return opHandler.buffer(this.shape, this.dtype, this.dataSync()); + } + async array() { + const vals = await this.data(); + return toNestedArray(this.shape, vals); + } + arraySync() { + return toNestedArray(this.shape, this.dataSync()); + } + async data() { + this.throwIfDisposed(); + const data2 = trackerFn().read(this.dataId); + if (this.dtype === "string") { + const bytes = await data2; + try { + return bytes.map((b) => decodeString(b)); + } catch (_a) { + throw new Error("Failed to decode the string bytes into utf-8. To get the original bytes, call tensor.bytes()."); + } + } + return data2; + } + dataSync() { + this.throwIfDisposed(); + const data2 = trackerFn().readSync(this.dataId); + if (this.dtype === "string") { + try { + return data2.map((b) => decodeString(b)); + } catch (_a) { + throw new Error("Failed to decode the string bytes into utf-8. To get the original bytes, call tensor.bytes()."); + } + } + return data2; + } + async bytes() { + this.throwIfDisposed(); + const data2 = await trackerFn().read(this.dataId); + if (this.dtype === "string") { + return data2; + } else { + return new Uint8Array(data2.buffer); + } + } + dispose() { + if (this.isDisposed) { + return; + } + trackerFn().disposeTensor(this); + this.isDisposedInternal = true; + } + get isDisposed() { + return this.isDisposedInternal; + } + throwIfDisposed() { + if (this.isDisposed) { + throw new Error(`Tensor is disposed.`); + } + } + print(verbose = false) { + return opHandler.print(this, verbose); + } + clone() { + this.throwIfDisposed(); + return opHandler.clone(this); + } + toString(verbose = false) { + const vals = this.dataSync(); + return tensorToString(vals, this.shape, this.dtype, verbose); + } + cast(dtype) { + this.throwIfDisposed(); + return opHandler.cast(this, dtype); + } + variable(trainable = true, name, dtype) { + this.throwIfDisposed(); + return trackerFn().makeVariable(this, trainable, name, dtype); + } +}; +Object.defineProperty(Tensor, Symbol.hasInstance, { + value: (instance) => { + return !!instance && instance.data != null && instance.dataSync != null && instance.throwIfDisposed != null; + } +}); +function getGlobalTensorClass() { + return getGlobal("Tensor", () => { + return Tensor; + }); +} +getGlobalTensorClass(); +var Variable = class extends Tensor { + constructor(initialValue, trainable, name, tensorId) { + super(initialValue.shape, initialValue.dtype, initialValue.dataId, tensorId); + this.trainable = trainable; + this.name = name; + } + assign(newValue) { + if (newValue.dtype !== this.dtype) { + throw new Error(`dtype of the new value (${newValue.dtype}) and previous value (${this.dtype}) must match`); + } + if (!arraysEqual(newValue.shape, this.shape)) { + throw new Error(`shape of the new value (${newValue.shape}) and previous value (${this.shape}) must match`); + } + trackerFn().disposeTensor(this); + this.dataId = newValue.dataId; + trackerFn().incRef(this, null); + } + dispose() { + trackerFn().disposeVariable(this); + this.isDisposedInternal = true; + } +}; +Object.defineProperty(Variable, Symbol.hasInstance, { + value: (instance) => { + return instance instanceof Tensor && instance.assign != null && instance.assign instanceof Function; + } +}); +var tensor_util_exports = {}; +__export2(tensor_util_exports, { + assertTypesMatch: () => assertTypesMatch, + getTensorsInContainer: () => getTensorsInContainer, + isTensorInList: () => isTensorInList, + makeTypesMatch: () => makeTypesMatch +}); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +var Rank; +(function(Rank2) { + Rank2["R0"] = "R0"; + Rank2["R1"] = "R1"; + Rank2["R2"] = "R2"; + Rank2["R3"] = "R3"; + Rank2["R4"] = "R4"; + Rank2["R5"] = "R5"; + Rank2["R6"] = "R6"; +})(Rank || (Rank = {})); +var UpcastInt32AndMap; +(function(UpcastInt32AndMap2) { + UpcastInt32AndMap2["float32"] = "float32"; + UpcastInt32AndMap2["int32"] = "int32"; + UpcastInt32AndMap2["bool"] = "int32"; + UpcastInt32AndMap2["complex64"] = "complex64"; +})(UpcastInt32AndMap || (UpcastInt32AndMap = {})); +var UpcastBoolAndMap; +(function(UpcastBoolAndMap2) { + UpcastBoolAndMap2["float32"] = "float32"; + UpcastBoolAndMap2["int32"] = "int32"; + UpcastBoolAndMap2["bool"] = "bool"; + UpcastBoolAndMap2["complex64"] = "complex64"; +})(UpcastBoolAndMap || (UpcastBoolAndMap = {})); +var UpcastFloat32AndMap; +(function(UpcastFloat32AndMap2) { + UpcastFloat32AndMap2["float32"] = "float32"; + UpcastFloat32AndMap2["int32"] = "float32"; + UpcastFloat32AndMap2["bool"] = "float32"; + UpcastFloat32AndMap2["complex64"] = "complex64"; +})(UpcastFloat32AndMap || (UpcastFloat32AndMap = {})); +var UpcastComplex64AndMap; +(function(UpcastComplex64AndMap2) { + UpcastComplex64AndMap2["float32"] = "complex64"; + UpcastComplex64AndMap2["int32"] = "complex64"; + UpcastComplex64AndMap2["bool"] = "complex64"; + UpcastComplex64AndMap2["complex64"] = "complex64"; +})(UpcastComplex64AndMap || (UpcastComplex64AndMap = {})); +var upcastTypeMap = { + float32: UpcastFloat32AndMap, + int32: UpcastInt32AndMap, + bool: UpcastBoolAndMap, + complex64: UpcastComplex64AndMap +}; +function upcastType(typeA, typeB) { + if (typeA === "string" || typeB === "string") { + if (typeA === "string" && typeB === "string") { + return "string"; + } + throw new Error(`Can not upcast ${typeA} with ${typeB}`); + } + return upcastTypeMap[typeA][typeB]; +} +function sumOutType(type) { + return upcastType(type, "int32"); +} +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function makeTypesMatch(a, b) { + if (a.dtype === b.dtype) { + return [a, b]; + } + const dtype = upcastType(a.dtype, b.dtype); + return [a.cast(dtype), b.cast(dtype)]; +} +function assertTypesMatch(a, b) { + assert(a.dtype === b.dtype, () => `The dtypes of the first(${a.dtype}) and second(${b.dtype}) input must match`); +} +function isTensorInList(tensor2, tensorList) { + return tensorList.some((x) => x.id === tensor2.id); +} +function getTensorsInContainer(result) { + const list = []; + const seen = new Set(); + walkTensorContainer(result, list, seen); + return list; +} +function walkTensorContainer(container, list, seen) { + if (container == null) { + return; + } + if (container instanceof Tensor) { + list.push(container); + return; + } + if (!isIterable(container)) { + return; + } + const iterable = container; + for (const k in iterable) { + const val = iterable[k]; + if (!seen.has(val)) { + seen.add(val); + walkTensorContainer(val, list, seen); + } + } +} +function isIterable(obj) { + return Array.isArray(obj) || typeof obj === "object"; +} +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function isRegisteredKernelInvocation(kernelInvocation) { + return kernelInvocation.kernelName != null; +} +var EngineState = class { + constructor() { + this.registeredVariables = {}; + this.nextTapeNodeId = 0; + this.numBytes = 0; + this.numTensors = 0; + this.numStringTensors = 0; + this.numDataBuffers = 0; + this.gradientDepth = 0; + this.kernelDepth = 0; + this.scopeStack = []; + this.numDataMovesStack = []; + this.nextScopeId = 0; + this.tensorInfo = new WeakMap(); + this.profiling = false; + this.activeProfile = { + newBytes: 0, + newTensors: 0, + peakBytes: 0, + kernels: [], + result: null, + get kernelNames() { + return Array.from(new Set(this.kernels.map((k) => k.name))); + } + }; + } + dispose() { + for (const variableName in this.registeredVariables) { + this.registeredVariables[variableName].dispose(); + } + } +}; +var Engine = class { + constructor(ENV5) { + this.ENV = ENV5; + this.registry = {}; + this.registryFactory = {}; + this.pendingBackendInitId = 0; + this.state = new EngineState(); + } + async ready() { + if (this.pendingBackendInit != null) { + return this.pendingBackendInit.then(() => { + }); + } + if (this.backendInstance != null) { + return; + } + const sortedBackends = this.getSortedBackends(); + for (let i = 0; i < sortedBackends.length; i++) { + const backendName = sortedBackends[i]; + const success = await this.initializeBackend(backendName).success; + if (success) { + await this.setBackend(backendName); + return; + } + } + throw new Error(`Could not initialize any backends, all backend initializations failed.`); + } + get backend() { + if (this.pendingBackendInit != null) { + throw new Error(`Backend '${this.backendName}' has not yet been initialized. Make sure to await tf.ready() or await tf.setBackend() before calling other methods`); + } + if (this.backendInstance == null) { + const {name, asyncInit} = this.initializeBackendsAndReturnBest(); + if (asyncInit) { + throw new Error(`The highest priority backend '${name}' has not yet been initialized. Make sure to await tf.ready() or await tf.setBackend() before calling other methods`); + } + this.setBackend(name); + } + return this.backendInstance; + } + backendNames() { + return Object.keys(this.registryFactory); + } + findBackend(backendName) { + if (!(backendName in this.registry)) { + if (backendName in this.registryFactory) { + const {asyncInit} = this.initializeBackend(backendName); + if (asyncInit) { + return null; + } + } else { + return null; + } + } + return this.registry[backendName]; + } + findBackendFactory(backendName) { + if (!(backendName in this.registryFactory)) { + return null; + } + return this.registryFactory[backendName].factory; + } + registerBackend(backendName, factory, priority = 1) { + if (backendName in this.registryFactory) { + console.warn(`${backendName} backend was already registered. Reusing existing backend factory.`); + return false; + } + this.registryFactory[backendName] = {factory, priority}; + return true; + } + async setBackend(backendName) { + if (this.registryFactory[backendName] == null) { + throw new Error(`Backend name '${backendName}' not found in registry`); + } + this.backendName = backendName; + if (this.registry[backendName] == null) { + this.backendInstance = null; + const {success, asyncInit} = this.initializeBackend(backendName); + const result = asyncInit ? await success : success; + if (!result) { + return false; + } + } + this.backendInstance = this.registry[backendName]; + this.setupRegisteredKernels(); + this.profiler = new Profiler(this.backendInstance); + return true; + } + setupRegisteredKernels() { + const kernels = getKernelsForBackend(this.backendName); + kernels.forEach((kernel) => { + if (kernel.setupFunc != null) { + kernel.setupFunc(this.backendInstance); + } + }); + } + disposeRegisteredKernels(backendName) { + const kernels = getKernelsForBackend(backendName); + kernels.forEach((kernel) => { + if (kernel.disposeFunc != null) { + kernel.disposeFunc(this.registry[backendName]); + } + }); + } + initializeBackend(backendName) { + const registryFactoryEntry = this.registryFactory[backendName]; + if (registryFactoryEntry == null) { + throw new Error(`Cannot initialize backend ${backendName}, no registration found.`); + } + try { + const backend22 = registryFactoryEntry.factory(); + if (backend22 && !(backend22 instanceof KernelBackend) && typeof backend22.then === "function") { + const promiseId = ++this.pendingBackendInitId; + const success = backend22.then((backendInstance) => { + if (promiseId < this.pendingBackendInitId) { + return false; + } + this.registry[backendName] = backendInstance; + this.pendingBackendInit = null; + return true; + }).catch((err) => { + if (promiseId < this.pendingBackendInitId) { + return false; + } + this.pendingBackendInit = null; + console.warn(`Initialization of backend ${backendName} failed`); + console.warn(err.stack || err.message); + return false; + }); + this.pendingBackendInit = success; + return {success, asyncInit: true}; + } else { + this.registry[backendName] = backend22; + return {success: true, asyncInit: false}; + } + } catch (err) { + console.warn(`Initialization of backend ${backendName} failed`); + console.warn(err.stack || err.message); + return {success: false, asyncInit: false}; + } + } + removeBackend(backendName) { + if (!(backendName in this.registryFactory)) { + throw new Error(`${backendName} backend not found in registry`); + } + if (this.backendName === backendName && this.pendingBackendInit != null) { + this.pendingBackendInitId++; + } + if (backendName in this.registry) { + this.disposeRegisteredKernels(backendName); + this.registry[backendName].dispose(); + delete this.registry[backendName]; + } + delete this.registryFactory[backendName]; + if (this.backendName === backendName) { + this.pendingBackendInit = null; + this.backendName = null; + this.backendInstance = null; + } + } + getSortedBackends() { + if (Object.keys(this.registryFactory).length === 0) { + throw new Error("No backend found in registry."); + } + return Object.keys(this.registryFactory).sort((a, b) => { + return this.registryFactory[b].priority - this.registryFactory[a].priority; + }); + } + initializeBackendsAndReturnBest() { + const sortedBackends = this.getSortedBackends(); + for (let i = 0; i < sortedBackends.length; i++) { + const backendName = sortedBackends[i]; + const {success, asyncInit} = this.initializeBackend(backendName); + if (asyncInit || success) { + return {name: backendName, asyncInit}; + } + } + throw new Error(`Could not initialize any backends, all backend initializations failed.`); + } + moveData(backend22, dataId) { + const info2 = this.state.tensorInfo.get(dataId); + const srcBackend = info2.backend; + const values = this.readSync(dataId); + const refCount = srcBackend.refCount(dataId); + srcBackend.disposeData(dataId, true); + info2.backend = backend22; + backend22.move(dataId, values, info2.shape, info2.dtype, refCount); + if (this.shouldCheckForMemLeaks()) { + this.state.numDataMovesStack[this.state.numDataMovesStack.length - 1]++; + } + } + tidy(nameOrFn, fn) { + let name = null; + if (fn == null) { + if (typeof nameOrFn !== "function") { + throw new Error("Please provide a function to tidy()"); + } + fn = nameOrFn; + } else { + if (typeof nameOrFn !== "string" && !(nameOrFn instanceof String)) { + throw new Error("When calling with two arguments, the first argument to tidy() must be a string"); + } + if (typeof fn !== "function") { + throw new Error("When calling with two arguments, the 2nd argument to tidy() must be a function"); + } + name = nameOrFn; + } + let result; + return this.scopedRun(() => this.startScope(name), () => this.endScope(result), () => { + result = fn(); + if (result instanceof Promise) { + console.error("Cannot return a Promise inside of tidy."); + } + return result; + }); + } + scopedRun(start, end, f) { + start(); + try { + const res = f(); + end(); + return res; + } catch (ex) { + end(); + throw ex; + } + } + nextTensorId() { + return Engine.nextTensorId++; + } + nextVariableId() { + return Engine.nextVariableId++; + } + clone(x) { + const y = ENGINE.runKernel(Identity, {x}); + const inputs = {x}; + const grad2 = (dy) => ({ + x: () => { + const dtype = "float32"; + const gradInputs = {x: dy}; + const attrs = {dtype}; + return ENGINE.runKernel(Cast, gradInputs, attrs); + } + }); + const saved = []; + this.addTapeNode(this.state.activeScope.name, inputs, [y], grad2, saved, {}); + return y; + } + runKernel(kernelName, inputs, attrs) { + const hasKernel = getKernel(kernelName, this.backendName) != null; + if (!hasKernel) { + throw new Error(`Kernel '${kernelName}' not registered for backend '${this.backendName}'`); + } + return this.runKernelFunc({kernelName, inputs, attrs}); + } + shouldCheckForMemLeaks() { + return this.ENV.getBool("IS_TEST"); + } + checkKernelForMemLeak(kernelName, numDataIdsBefore, outInfos) { + const numDataIdsAfter = this.backend.numDataIds(); + let numOutputDataIds = 0; + outInfos.forEach((info2) => { + numOutputDataIds += info2.dtype === "complex64" ? 3 : 1; + }); + const numMoves = this.state.numDataMovesStack[this.state.numDataMovesStack.length - 1]; + const dataIdsLeaked = numDataIdsAfter - numDataIdsBefore - numOutputDataIds - numMoves; + if (dataIdsLeaked > 0) { + throw new Error(`Backend '${this.backendName}' has an internal memory leak (${dataIdsLeaked} data ids) after running '${kernelName}'`); + } + } + runKernelFunc(kernelParams) { + let outputs; + let saved = []; + const isTapeOn = this.isTapeOn(); + const startingBytecount = this.state.numBytes; + const startingNumTensors = this.state.numTensors; + if (this.shouldCheckForMemLeaks()) { + this.state.numDataMovesStack.push(0); + } + let kernelFunc3; + if (this.backendName == null) { + this.backend; + } + let out; + const kernelOrScopeName = isRegisteredKernelInvocation(kernelParams) ? kernelParams.kernelName : this.state.activeScope != null ? this.state.activeScope.name : ""; + if (isRegisteredKernelInvocation(kernelParams)) { + const {kernelName, inputs: inputs2, attrs: attrs2} = kernelParams; + if (this.backendName == null) { + this.backend; + } + const kernel = getKernel(kernelName, this.backendName); + assert(kernel != null, () => `Cannot find registered kernel '${kernelName}' for backend '${this.backendName}'`); + kernelFunc3 = () => { + const numDataIdsBefore = this.backend.numDataIds(); + out = kernel.kernelFunc({inputs: inputs2, attrs: attrs2, backend: this.backend}); + const outInfos = Array.isArray(out) ? out : [out]; + if (this.shouldCheckForMemLeaks()) { + this.checkKernelForMemLeak(kernelName, numDataIdsBefore, outInfos); + } + const outTensors = outInfos.map((outInfo) => { + if (outInfo.rank != null) { + return outInfo; + } + const {dataId, shape, dtype} = outInfo; + return this.makeTensorFromDataId(dataId, shape, dtype); + }); + if (isTapeOn) { + const tensorsToSave = this.getTensorsForGradient(kernelName, inputs2, outTensors); + saved = this.saveTensorsForBackwardMode(tensorsToSave); + } + return outTensors; + }; + } else { + const {forwardFunc} = kernelParams; + const saveFunc = (tensors) => { + if (!isTapeOn) { + return; + } + saved = tensors.map((tensor2) => this.keep(this.clone(tensor2))); + }; + kernelFunc3 = () => { + const numDataIdsBefore = this.backend.numDataIds(); + out = this.tidy(() => forwardFunc(this.backend, saveFunc)); + const outs = Array.isArray(out) ? out : [out]; + if (this.shouldCheckForMemLeaks()) { + this.checkKernelForMemLeak(kernelOrScopeName, numDataIdsBefore, outs); + } + return outs; + }; + } + const {inputs, attrs} = kernelParams; + const backwardsFunc = isRegisteredKernelInvocation(kernelParams) ? null : kernelParams.backwardsFunc; + let kernelProfile; + this.scopedRun(() => this.state.kernelDepth++, () => this.state.kernelDepth--, () => { + if (!this.ENV.getBool("DEBUG") && !this.state.profiling) { + outputs = kernelFunc3(); + } else { + kernelProfile = this.profiler.profileKernel(kernelOrScopeName, inputs, () => kernelFunc3()); + if (this.ENV.getBool("DEBUG")) { + this.profiler.logKernelProfile(kernelProfile); + } + outputs = kernelProfile.outputs; + } + }); + if (isTapeOn) { + this.addTapeNode(kernelOrScopeName, inputs, outputs, backwardsFunc, saved, attrs); + } + if (this.state.profiling) { + this.state.activeProfile.kernels.push({ + name: kernelOrScopeName, + bytesAdded: this.state.numBytes - startingBytecount, + totalBytesSnapshot: this.state.numBytes, + tensorsAdded: this.state.numTensors - startingNumTensors, + totalTensorsSnapshot: this.state.numTensors, + inputShapes: Object.keys(inputs).map((key) => inputs[key] != null ? inputs[key].shape : null), + outputShapes: outputs.map((item) => item.shape), + kernelTimeMs: kernelProfile.timeMs, + extraInfo: kernelProfile.extraInfo + }); + } + return Array.isArray(out) ? outputs : outputs[0]; + } + saveTensorsForBackwardMode(tensors) { + const saved = tensors.map((tensor2) => this.keep(this.clone(tensor2))); + return saved; + } + getTensorsForGradient(kernelName, inputs, outputs) { + const gradConfig = getGradient(kernelName); + if (gradConfig != null) { + const inputsToSave = gradConfig.inputsToSave || []; + const outputsToSave = gradConfig.outputsToSave || []; + let inputTensorsToSave; + if (gradConfig.saveAllInputs) { + assert(Array.isArray(inputs), () => "saveAllInputs is true, expected inputs to be an array."); + inputTensorsToSave = Object.keys(inputs).map((key) => inputs[key]); + } else { + inputTensorsToSave = inputsToSave.map((inputName) => inputs[inputName]); + } + const outputTensorsToSave = outputs.filter((_, i) => outputsToSave[i]); + return inputTensorsToSave.concat(outputTensorsToSave); + } + return []; + } + makeTensor(values, shape, dtype, backend22) { + if (values == null) { + throw new Error("Values passed to engine.makeTensor() are null"); + } + dtype = dtype || "float32"; + backend22 = backend22 || this.backend; + let backendVals = values; + if (dtype === "string" && isString(values[0])) { + backendVals = values.map((d) => encodeString(d)); + } + const dataId = backend22.write(backendVals, shape, dtype); + const t = new Tensor(shape, dtype, dataId, this.nextTensorId()); + this.trackTensor(t, backend22); + if (dtype === "string") { + const info2 = this.state.tensorInfo.get(dataId); + const newBytes = bytesFromStringArray(backendVals); + this.state.numBytes += newBytes - info2.bytes; + info2.bytes = newBytes; + } + return t; + } + makeTensorFromDataId(dataId, shape, dtype, backend22) { + dtype = dtype || "float32"; + const t = new Tensor(shape, dtype, dataId, this.nextTensorId()); + this.trackTensor(t, backend22); + return t; + } + makeVariable(initialValue, trainable = true, name, dtype) { + name = name || this.nextVariableId().toString(); + if (dtype != null && dtype !== initialValue.dtype) { + initialValue = initialValue.cast(dtype); + } + const v = new Variable(initialValue, trainable, name, this.nextTensorId()); + if (this.state.registeredVariables[v.name] != null) { + throw new Error(`Variable with name ${v.name} was already registered`); + } + this.state.registeredVariables[v.name] = v; + this.incRef(v, this.backend); + return v; + } + trackTensor(a, backend22) { + this.state.numTensors++; + if (a.dtype === "string") { + this.state.numStringTensors++; + } + let bytes = 0; + if (a.dtype !== "complex64" && a.dtype !== "string") { + bytes = a.size * bytesPerElement(a.dtype); + } + this.state.numBytes += bytes; + if (!this.state.tensorInfo.has(a.dataId)) { + this.state.numDataBuffers++; + this.state.tensorInfo.set(a.dataId, { + backend: backend22 || this.backend, + dtype: a.dtype, + shape: a.shape, + bytes + }); + } + if (!(a instanceof Variable)) { + this.track(a); + } + } + incRef(a, backend22) { + this.trackTensor(a, backend22); + this.backend.incRef(a.dataId); + } + removeDataId(dataId, backend22) { + if (this.state.tensorInfo.has(dataId) && this.state.tensorInfo.get(dataId).backend === backend22) { + this.state.tensorInfo.delete(dataId); + this.state.numDataBuffers--; + } + } + disposeTensor(a) { + if (!this.state.tensorInfo.has(a.dataId)) { + return; + } + const info2 = this.state.tensorInfo.get(a.dataId); + this.state.numTensors--; + if (a.dtype === "string") { + this.state.numStringTensors--; + this.state.numBytes -= info2.bytes; + } + if (a.dtype !== "complex64" && a.dtype !== "string") { + const bytes = a.size * bytesPerElement(a.dtype); + this.state.numBytes -= bytes; + } + if (info2.backend.disposeData(a.dataId)) { + this.removeDataId(a.dataId, info2.backend); + } + } + disposeVariables() { + for (const varName in this.state.registeredVariables) { + const v = this.state.registeredVariables[varName]; + this.disposeVariable(v); + } + } + disposeVariable(v) { + this.disposeTensor(v); + if (this.state.registeredVariables[v.name] != null) { + delete this.state.registeredVariables[v.name]; + } + } + memory() { + const info2 = this.backend.memory(); + info2.numTensors = this.state.numTensors; + info2.numDataBuffers = this.state.numDataBuffers; + info2.numBytes = this.state.numBytes; + if (this.state.numStringTensors > 0) { + info2.unreliable = true; + if (info2.reasons == null) { + info2.reasons = []; + } + info2.reasons.push("Memory usage by string tensors is approximate (2 bytes per character)"); + } + return info2; + } + async profile(query) { + this.state.profiling = true; + const startBytes = this.state.numBytes; + const startNumTensors = this.state.numTensors; + this.state.activeProfile.kernels = []; + this.state.activeProfile.result = await query(); + this.state.profiling = false; + this.state.activeProfile.peakBytes = Math.max(...this.state.activeProfile.kernels.map((d) => d.totalBytesSnapshot)); + this.state.activeProfile.newBytes = this.state.numBytes - startBytes; + this.state.activeProfile.newTensors = this.state.numTensors - startNumTensors; + for (const kernel of this.state.activeProfile.kernels) { + kernel.kernelTimeMs = await kernel.kernelTimeMs; + kernel.extraInfo = await kernel.extraInfo; + } + return this.state.activeProfile; + } + isTapeOn() { + return this.state.gradientDepth > 0 && this.state.kernelDepth === 0; + } + addTapeNode(kernelName, inputs, outputs, gradientsFunc, saved, attrs) { + const tapeNode = {id: this.state.nextTapeNodeId++, kernelName, inputs, outputs, saved}; + const gradConfig = getGradient(kernelName); + if (gradConfig != null) { + gradientsFunc = gradConfig.gradFunc; + } + if (gradientsFunc != null) { + tapeNode.gradient = (dys) => { + dys = dys.map((dy, i) => { + if (dy == null) { + const output = outputs[i]; + const vals = makeZerosTypedArray(output.size, output.dtype); + return this.makeTensor(vals, output.shape, output.dtype); + } + return dy; + }); + return gradientsFunc(dys.length > 1 ? dys : dys[0], saved, attrs); + }; + } + this.state.activeTape.push(tapeNode); + } + keep(result) { + result.kept = true; + return result; + } + startTape() { + if (this.state.gradientDepth === 0) { + this.state.activeTape = []; + } + this.state.gradientDepth++; + } + endTape() { + this.state.gradientDepth--; + } + startScope(name) { + const scopeInfo = { + track: [], + name: "unnamed scope", + id: this.state.nextScopeId++ + }; + if (name) { + scopeInfo.name = name; + } + this.state.scopeStack.push(scopeInfo); + this.state.activeScope = scopeInfo; + } + endScope(result) { + const tensorsToTrackInParent = getTensorsInContainer(result); + const tensorsToTrackInParentSet = new Set(tensorsToTrackInParent.map((t) => t.id)); + for (let i = 0; i < this.state.activeScope.track.length; i++) { + const tensor2 = this.state.activeScope.track[i]; + if (!tensor2.kept && !tensorsToTrackInParentSet.has(tensor2.id)) { + tensor2.dispose(); + } + } + const oldScope = this.state.scopeStack.pop(); + this.state.activeScope = this.state.scopeStack.length === 0 ? null : this.state.scopeStack[this.state.scopeStack.length - 1]; + tensorsToTrackInParent.forEach((tensor2) => { + if (!tensor2.kept && tensor2.scopeId === oldScope.id) { + this.track(tensor2); + } + }); + } + gradients(f, xs, dy, allowNoGradients = false) { + assert(xs.length > 0, () => "gradients() received an empty list of xs."); + if (dy != null && dy.dtype !== "float32") { + throw new Error(`dy must have 'float32' dtype, but has '${dy.dtype}'`); + } + const y = this.scopedRun(() => this.startTape(), () => this.endTape(), () => this.tidy("forward", f)); + assert(y instanceof Tensor, () => "The result y returned by f() must be a tensor."); + const filteredTape = getFilteredNodesXToY(this.state.activeTape, xs, y); + if (!allowNoGradients && filteredTape.length === 0 && xs.length > 0) { + throw new Error("Cannot compute gradient of y=f(x) with respect to x. Make sure that the f you passed encloses all operations that lead from x to y."); + } + return this.tidy("backward", () => { + const accumulatedGradientMap = {}; + accumulatedGradientMap[y.id] = dy == null ? ones(y.shape) : dy; + backpropagateGradients(accumulatedGradientMap, filteredTape, (f2) => this.tidy(f2), add); + const grads2 = xs.map((x) => accumulatedGradientMap[x.id]); + if (this.state.gradientDepth === 0) { + this.state.activeTape.forEach((node) => { + for (const tensor2 of node.saved) { + tensor2.dispose(); + } + }); + this.state.activeTape = null; + } + return {value: y, grads: grads2}; + }); + } + customGrad(f) { + assert(isFunction(f), () => "The f passed in customGrad(f) must be a function."); + return (...inputs) => { + assert(inputs.every((t) => t instanceof Tensor), () => "The args passed in customGrad(f)(x1, x2,...) must all be tensors"); + let res; + const inputMap = {}; + inputs.forEach((input2, i) => { + inputMap[i] = input2; + }); + const forwardFunc = (_, save) => { + res = f(...[...inputs, save]); + assert(res.value instanceof Tensor, () => "The function f passed in customGrad(f) must return an object where `obj.value` is a tensor"); + assert(isFunction(res.gradFunc), () => "The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function."); + return res.value; + }; + const backwardsFunc = (dy, saved) => { + const gradRes = res.gradFunc(dy, saved); + const grads2 = Array.isArray(gradRes) ? gradRes : [gradRes]; + assert(grads2.length === inputs.length, () => "The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function that returns the same number of tensors as inputs passed to f(...)."); + assert(grads2.every((t) => t instanceof Tensor), () => "The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function that returns a list of only tensors."); + const gradMap = {}; + grads2.forEach((grad2, i) => { + gradMap[i] = () => grad2; + }); + return gradMap; + }; + return this.runKernelFunc({ + forwardFunc, + backwardsFunc, + inputs: inputMap + }); + }; + } + readSync(dataId) { + const info2 = this.state.tensorInfo.get(dataId); + return info2.backend.readSync(dataId); + } + read(dataId) { + const info2 = this.state.tensorInfo.get(dataId); + return info2.backend.read(dataId); + } + async time(query) { + const start = now2(); + const timingInfo = await this.backend.time(query); + timingInfo.wallMs = now2() - start; + return timingInfo; + } + track(result) { + if (this.state.activeScope != null) { + result.scopeId = this.state.activeScope.id; + this.state.activeScope.track.push(result); + } + return result; + } + get registeredVariables() { + return this.state.registeredVariables; + } + reset() { + this.pendingBackendInitId++; + this.state.dispose(); + this.ENV.reset(); + this.state = new EngineState(); + for (const backendName in this.registry) { + this.disposeRegisteredKernels(backendName); + this.registry[backendName].dispose(); + delete this.registry[backendName]; + } + this.backendName = null; + this.backendInstance = null; + this.pendingBackendInit = null; + } +}; +Engine.nextTensorId = 0; +Engine.nextVariableId = 0; +function ones(shape) { + const values = makeOnesTypedArray(sizeFromShape(shape), "float32"); + return ENGINE.makeTensor(values, shape, "float32"); +} +function getOrMakeEngine() { + const ns = getGlobalNamespace(); + if (ns._tfengine == null) { + const environment = new Environment(ns); + ns._tfengine = new Engine(environment); + } + setEnvironmentGlobal(ns._tfengine.ENV); + setTensorTracker(() => ns._tfengine); + return ns._tfengine; +} +var ENGINE = getOrMakeEngine(); +function add(a, b) { + const inputs = {a, b}; + return ENGINE.runKernel(Add, inputs); +} +var device_util_exports = {}; +__export2(device_util_exports, { + isBrowser: () => isBrowser, + isMobile: () => isMobile +}); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function _isNavigatorDefined() { + return typeof navigator !== "undefined" && navigator != null; +} +function isMobile() { + if (_isNavigatorDefined()) { + const a = navigator.userAgent || navigator.vendor || window.opera; + return /(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0, 4)); + } + return false; +} +function isBrowser() { + return typeof window !== "undefined" && window.document != null || typeof WorkerGlobalScope !== "undefined"; +} +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +var ENV2 = env(); +ENV2.registerFlag("DEBUG", () => false, (debugValue) => { + if (debugValue) { + console.warn("Debugging mode is ON. The output of every math call will be downloaded to CPU and checked for NaNs. This significantly impacts performance."); + } +}); +ENV2.registerFlag("IS_BROWSER", () => isBrowser()); +ENV2.registerFlag("IS_NODE", () => typeof process !== "undefined" && typeof process.versions !== "undefined" && typeof process.versions.node !== "undefined"); +ENV2.registerFlag("IS_CHROME", () => typeof navigator !== "undefined" && navigator != null && navigator.userAgent != null && /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor)); +ENV2.registerFlag("PROD", () => false); +ENV2.registerFlag("TENSORLIKE_CHECK_SHAPE_CONSISTENCY", () => ENV2.getBool("DEBUG")); +ENV2.registerFlag("DEPRECATION_WARNINGS_ENABLED", () => true); +ENV2.registerFlag("IS_TEST", () => false); +ENV2.registerFlag("CHECK_COMPUTATION_FOR_ERRORS", () => true); +ENV2.registerFlag("WRAP_TO_IMAGEBITMAP", () => false); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function inferShape(val, dtype) { + let firstElem = val; + if (isTypedArray(val)) { + return dtype === "string" ? [] : [val.length]; + } + if (!Array.isArray(val)) { + return []; + } + const shape = []; + while (Array.isArray(firstElem) || isTypedArray(firstElem) && dtype !== "string") { + shape.push(firstElem.length); + firstElem = firstElem[0]; + } + if (Array.isArray(val) && env().getBool("TENSORLIKE_CHECK_SHAPE_CONSISTENCY")) { + deepAssertShapeConsistency(val, shape, []); + } + return shape; +} +function deepAssertShapeConsistency(val, shape, indices) { + indices = indices || []; + if (!Array.isArray(val) && !isTypedArray(val)) { + assert(shape.length === 0, () => `Element arr[${indices.join("][")}] is a primitive, but should be an array/TypedArray of ${shape[0]} elements`); + return; + } + assert(shape.length > 0, () => `Element arr[${indices.join("][")}] should be a primitive, but is an array of ${val.length} elements`); + assert(val.length === shape[0], () => `Element arr[${indices.join("][")}] should have ${shape[0]} elements, but has ${val.length} elements`); + const subShape = shape.slice(1); + for (let i = 0; i < val.length; ++i) { + deepAssertShapeConsistency(val[i], subShape, indices.concat(i)); + } +} +function assertDtype(expectedDtype, actualDType, argName, functionName) { + if (expectedDtype === "string_or_numeric") { + return; + } + if (expectedDtype == null) { + throw new Error(`Expected dtype cannot be null.`); + } + if (expectedDtype !== "numeric" && expectedDtype !== actualDType || expectedDtype === "numeric" && actualDType === "string") { + throw new Error(`Argument '${argName}' passed to '${functionName}' must be ${expectedDtype} tensor, but got ${actualDType} tensor`); + } +} +function convertToTensor(x, argName, functionName, parseAsDtype = "numeric") { + if (x instanceof Tensor) { + assertDtype(parseAsDtype, x.dtype, argName, functionName); + return x; + } + let inferredDtype = inferDtype(x); + if (inferredDtype !== "string" && ["bool", "int32", "float32"].indexOf(parseAsDtype) >= 0) { + inferredDtype = parseAsDtype; + } + assertDtype(parseAsDtype, inferredDtype, argName, functionName); + if (x == null || !isTypedArray(x) && !Array.isArray(x) && typeof x !== "number" && typeof x !== "boolean" && typeof x !== "string") { + const type = x == null ? "null" : x.constructor.name; + throw new Error(`Argument '${argName}' passed to '${functionName}' must be a Tensor or TensorLike, but got '${type}'`); + } + const inferredShape = inferShape(x, inferredDtype); + if (!isTypedArray(x) && !Array.isArray(x)) { + x = [x]; + } + const skipTypedArray = true; + const values = inferredDtype !== "string" ? toTypedArray(x, inferredDtype) : flatten(x, [], skipTypedArray); + return ENGINE.makeTensor(values, inferredShape, inferredDtype); +} +function convertToTensorArray(arg, argName, functionName, parseAsDtype = "numeric") { + if (!Array.isArray(arg)) { + throw new Error(`Argument ${argName} passed to ${functionName} must be a \`Tensor[]\` or \`TensorLike[]\``); + } + const tensors = arg; + return tensors.map((t, i) => convertToTensor(t, `${argName}[${i}]`, functionName, parseAsDtype)); +} +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +var OP_SCOPE_SUFFIX = "__op"; +function op(f) { + const keys = Object.keys(f); + if (keys.length !== 1) { + throw new Error(`Please provide an object with a single key (operation name) mapping to a function. Got an object with ${keys.length} keys.`); + } + let opName = keys[0]; + const fn = f[opName]; + if (opName.endsWith("_")) { + opName = opName.substring(0, opName.length - 1); + } + opName = opName + OP_SCOPE_SUFFIX; + const f2 = (...args) => { + ENGINE.startScope(opName); + try { + const result = fn(...args); + if (isPromise(result)) { + console.error("Cannot return a Promise inside of tidy."); + } + ENGINE.endScope(result); + return result; + } catch (ex) { + ENGINE.endScope(null); + throw ex; + } + }; + Object.defineProperty(f2, "name", {value: opName, configurable: true}); + return f2; +} +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function complex_(real4, imag4) { + const $real = convertToTensor(real4, "real", "complex"); + const $imag = convertToTensor(imag4, "imag", "complex"); + assertShapesMatch($real.shape, $imag.shape, `real and imag shapes, ${$real.shape} and ${$imag.shape}, must match in call to tf.complex().`); + const inputs = {real: $real, imag: $imag}; + return ENGINE.runKernel(Complex, inputs); +} +var complex = op({complex_}); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function makeTensor(values, shape, inferredShape, dtype) { + if (dtype == null) { + dtype = inferDtype(values); + } + if (dtype === "complex64") { + throw new Error(`Cannot construct a complex64 tensor directly. Please use tf.complex(real, imag).`); + } + if (!isTypedArray(values) && !Array.isArray(values) && typeof values !== "number" && typeof values !== "boolean" && typeof values !== "string") { + throw new Error("values passed to tensor(values) must be a number/boolean/string or an array of numbers/booleans/strings, or a TypedArray"); + } + if (shape != null) { + assertNonNegativeIntegerDimensions(shape); + const providedSize = sizeFromShape(shape); + const inferredSize = sizeFromShape(inferredShape); + assert(providedSize === inferredSize, () => `Based on the provided shape, [${shape}], the tensor should have ${providedSize} values but has ${inferredSize}`); + for (let i = 0; i < inferredShape.length; ++i) { + const inferred = inferredShape[i]; + const flatDimsDontMatch = i === inferredShape.length - 1 ? inferred !== sizeFromShape(shape.slice(i)) : true; + assert(inferredShape[i] === shape[i] || !flatDimsDontMatch, () => `Error creating a new Tensor. Inferred shape (${inferredShape}) does not match the provided shape (${shape}). `); + } + } + if (!isTypedArray(values) && !Array.isArray(values)) { + values = [values]; + } + shape = shape || inferredShape; + values = dtype !== "string" ? toTypedArray(values, dtype) : flatten(values, [], true); + return ENGINE.makeTensor(values, shape, dtype); +} +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function tensor(values, shape, dtype) { + const inferredShape = inferShape(values, dtype); + return makeTensor(values, shape, inferredShape, dtype); +} +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +var DTYPE_VALUE_SIZE_MAP = { + float32: 4, + float16: 2, + int32: 4, + uint16: 2, + uint8: 1, + bool: 1, + complex64: 8 +}; +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +var NUM_BYTES_STRING_LENGTH = 4; +async function encodeWeights(tensors, group) { + const specs = []; + const dataPromises = []; + const names = Array.isArray(tensors) ? tensors.map((tensor2) => tensor2.name) : Object.keys(tensors); + for (let i = 0; i < names.length; ++i) { + const name = names[i]; + const t = Array.isArray(tensors) ? tensors[i].tensor : tensors[name]; + if (t.dtype !== "float32" && t.dtype !== "int32" && t.dtype !== "bool" && t.dtype !== "string" && t.dtype !== "complex64") { + throw new Error(`Unsupported dtype in weight '${name}': ${t.dtype}`); + } + const spec = {name, shape: t.shape, dtype: t.dtype}; + if (t.dtype === "string") { + const utf8bytes = new Promise(async (resolve) => { + const vals = await t.bytes(); + const totalNumBytes = vals.reduce((p2, c) => p2 + c.length, 0) + NUM_BYTES_STRING_LENGTH * vals.length; + const bytes = new Uint8Array(totalNumBytes); + let offset = 0; + for (let i2 = 0; i2 < vals.length; i2++) { + const val = vals[i2]; + const bytesOfLength = new Uint8Array(new Uint32Array([val.length]).buffer); + bytes.set(bytesOfLength, offset); + offset += NUM_BYTES_STRING_LENGTH; + bytes.set(val, offset); + offset += val.length; + } + resolve(bytes); + }); + dataPromises.push(utf8bytes); + } else { + dataPromises.push(t.data()); + } + if (group != null) { + spec.group = group; + } + specs.push(spec); + } + const tensorValues = await Promise.all(dataPromises); + return {data: concatenateTypedArrays(tensorValues), specs}; +} +function decodeWeights(buffer2, specs) { + const out = {}; + let float16Decode; + let offset = 0; + for (const spec of specs) { + const name = spec.name; + const dtype = spec.dtype; + const shape = spec.shape; + const size = sizeFromShape(shape); + let values; + if ("quantization" in spec) { + const quantization = spec.quantization; + if (quantization.dtype === "uint8" || quantization.dtype === "uint16") { + if (!("min" in quantization && "scale" in quantization)) { + throw new Error(`Weight ${spec.name} with quantization ${quantization.dtype} doesn't have corresponding metadata min and scale.`); + } + } else if (quantization.dtype === "float16") { + if (dtype !== "float32") { + throw new Error(`Weight ${spec.name} is quantized with ${quantization.dtype} which only supports weights of type float32 not ${dtype}.`); + } + } else { + throw new Error(`Weight ${spec.name} has unknown quantization dtype ${quantization.dtype}. Supported quantization dtypes are: 'uint8', 'uint16', and 'float16'.`); + } + const quantizationSizeFactor = DTYPE_VALUE_SIZE_MAP[quantization.dtype]; + const byteBuffer = buffer2.slice(offset, offset + size * quantizationSizeFactor); + const quantizedArray = quantization.dtype === "uint8" ? new Uint8Array(byteBuffer) : new Uint16Array(byteBuffer); + if (dtype === "float32") { + if (quantization.dtype === "uint8" || quantization.dtype === "uint16") { + values = new Float32Array(quantizedArray.length); + for (let i = 0; i < quantizedArray.length; i++) { + const v = quantizedArray[i]; + values[i] = v * quantization.scale + quantization.min; + } + } else if (quantization.dtype === "float16") { + if (float16Decode === void 0) { + float16Decode = getFloat16Decoder(); + } + values = float16Decode(quantizedArray); + } else { + throw new Error(`Unsupported quantization type ${quantization.dtype} for weight type float32.`); + } + } else if (dtype === "int32") { + if (quantization.dtype !== "uint8" && quantization.dtype !== "uint16") { + throw new Error(`Unsupported quantization type ${quantization.dtype} for weight type int32.`); + } + values = new Int32Array(quantizedArray.length); + for (let i = 0; i < quantizedArray.length; i++) { + const v = quantizedArray[i]; + values[i] = Math.round(v * quantization.scale + quantization.min); + } + } else { + throw new Error(`Unsupported dtype in weight '${name}': ${dtype}`); + } + offset += size * quantizationSizeFactor; + } else if (dtype === "string") { + const size2 = sizeFromShape(spec.shape); + values = []; + for (let i = 0; i < size2; i++) { + const byteLength = new Uint32Array(buffer2.slice(offset, offset + NUM_BYTES_STRING_LENGTH))[0]; + offset += NUM_BYTES_STRING_LENGTH; + const bytes = new Uint8Array(buffer2.slice(offset, offset + byteLength)); + values.push(bytes); + offset += byteLength; + } + } else { + const dtypeFactor = DTYPE_VALUE_SIZE_MAP[dtype]; + const byteBuffer = buffer2.slice(offset, offset + size * dtypeFactor); + if (dtype === "float32") { + values = new Float32Array(byteBuffer); + } else if (dtype === "int32") { + values = new Int32Array(byteBuffer); + } else if (dtype === "bool") { + values = new Uint8Array(byteBuffer); + } else if (dtype === "complex64") { + values = new Float32Array(byteBuffer); + const real4 = new Float32Array(values.length / 2); + const image3 = new Float32Array(values.length / 2); + for (let i = 0; i < real4.length; i++) { + real4[i] = values[i * 2]; + image3[i] = values[i * 2 + 1]; + } + const realTensor = tensor(real4, shape, "float32"); + const imageTensor = tensor(image3, shape, "float32"); + out[name] = complex(realTensor, imageTensor); + realTensor.dispose(); + imageTensor.dispose(); + } else { + throw new Error(`Unsupported dtype in weight '${name}': ${dtype}`); + } + offset += size * dtypeFactor; + } + if (dtype !== "complex64") { + out[name] = tensor(values, shape, dtype); + } + } + return out; +} +function concatenateTypedArrays(xs) { + if (xs === null) { + throw new Error(`Invalid input value: ${JSON.stringify(xs)}`); + } + let totalByteLength = 0; + const normalizedXs = []; + xs.forEach((x) => { + totalByteLength += x.byteLength; + normalizedXs.push(x.byteLength === x.buffer.byteLength ? x : new x.constructor(x)); + if (!(x instanceof Float32Array || x instanceof Int32Array || x instanceof Uint8Array)) { + throw new Error(`Unsupported TypedArray subtype: ${x.constructor.name}`); + } + }); + const y = new Uint8Array(totalByteLength); + let offset = 0; + normalizedXs.forEach((x) => { + y.set(new Uint8Array(x.buffer), offset); + offset += x.byteLength; + }); + return y.buffer; +} +var useNodeBuffer = typeof Buffer !== "undefined" && (typeof Blob === "undefined" || typeof atob === "undefined" || typeof btoa === "undefined"); +function stringByteLength(str) { + if (useNodeBuffer) { + return Buffer.byteLength(str); + } + return new Blob([str]).size; +} +function arrayBufferToBase64String(buffer2) { + if (useNodeBuffer) { + return Buffer.from(buffer2).toString("base64"); + } + const buf = new Uint8Array(buffer2); + let s = ""; + for (let i = 0, l = buf.length; i < l; i++) { + s += String.fromCharCode(buf[i]); + } + return btoa(s); +} +function base64StringToArrayBuffer(str) { + if (useNodeBuffer) { + const buf = Buffer.from(str, "base64"); + return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength); + } + const s = atob(str); + const buffer2 = new Uint8Array(s.length); + for (let i = 0; i < s.length; ++i) { + buffer2.set([s.charCodeAt(i)], i); + } + return buffer2.buffer; +} +function concatenateArrayBuffers(buffers) { + if (buffers.length === 1) { + return buffers[0]; + } + let totalByteLength = 0; + buffers.forEach((buffer2) => { + totalByteLength += buffer2.byteLength; + }); + const temp = new Uint8Array(totalByteLength); + let offset = 0; + buffers.forEach((buffer2) => { + temp.set(new Uint8Array(buffer2), offset); + offset += buffer2.byteLength; + }); + return temp.buffer; +} +function basename(path) { + const SEPARATOR = "/"; + path = path.trim(); + while (path.endsWith(SEPARATOR)) { + path = path.slice(0, path.length - 1); + } + const items = path.split(SEPARATOR); + return items[items.length - 1]; +} +function getModelArtifactsInfoForJSON(modelArtifacts) { + if (modelArtifacts.modelTopology instanceof ArrayBuffer) { + throw new Error("Expected JSON model topology, received ArrayBuffer."); + } + return { + dateSaved: new Date(), + modelTopologyType: "JSON", + modelTopologyBytes: modelArtifacts.modelTopology == null ? 0 : stringByteLength(JSON.stringify(modelArtifacts.modelTopology)), + weightSpecsBytes: modelArtifacts.weightSpecs == null ? 0 : stringByteLength(JSON.stringify(modelArtifacts.weightSpecs)), + weightDataBytes: modelArtifacts.weightData == null ? 0 : modelArtifacts.weightData.byteLength + }; +} +function computeFloat16MantisaTable() { + const convertMantissa = (i) => { + let m = i << 13; + let e = 0; + while ((m & 8388608) === 0) { + e -= 8388608; + m <<= 1; + } + m &= ~8388608; + e += 947912704; + return m | e; + }; + const mantisaTable = new Uint32Array(2048); + mantisaTable[0] = 0; + for (let i = 1; i < 1024; i++) { + mantisaTable[i] = convertMantissa(i); + } + for (let i = 1024; i < 2048; i++) { + mantisaTable[i] = 939524096 + (i - 1024 << 13); + } + return mantisaTable; +} +function computeFloat16ExponentTable() { + const exponentTable = new Uint32Array(64); + exponentTable[0] = 0; + exponentTable[31] = 1199570944; + exponentTable[32] = 2147483648; + exponentTable[63] = 3347054592; + for (let i = 1; i < 31; i++) { + exponentTable[i] = i << 23; + } + for (let i = 33; i < 63; i++) { + exponentTable[i] = 2147483648 + (i - 32 << 23); + } + return exponentTable; +} +function computeFloat16OffsetTable() { + const offsetTable = new Uint32Array(64); + for (let i = 0; i < 64; i++) { + offsetTable[i] = 1024; + } + offsetTable[0] = offsetTable[32] = 0; + return offsetTable; +} +function getFloat16Decoder() { + const mantisaTable = computeFloat16MantisaTable(); + const exponentTable = computeFloat16ExponentTable(); + const offsetTable = computeFloat16OffsetTable(); + return (quantizedArray) => { + const buffer2 = new ArrayBuffer(4 * quantizedArray.length); + const bufferUint32View = new Uint32Array(buffer2); + for (let index = 0; index < quantizedArray.length; index++) { + const float16Bits = quantizedArray[index]; + const float32Bits = mantisaTable[offsetTable[float16Bits >> 10] + (float16Bits & 1023)] + exponentTable[float16Bits >> 10]; + bufferUint32View[index] = float32Bits; + } + return new Float32Array(buffer2); + }; +} +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +var IORouterRegistry = class { + constructor() { + this.saveRouters = []; + this.loadRouters = []; + } + static getInstance() { + if (IORouterRegistry.instance == null) { + IORouterRegistry.instance = new IORouterRegistry(); + } + return IORouterRegistry.instance; + } + static registerSaveRouter(saveRouter) { + IORouterRegistry.getInstance().saveRouters.push(saveRouter); + } + static registerLoadRouter(loadRouter) { + IORouterRegistry.getInstance().loadRouters.push(loadRouter); + } + static getSaveHandlers(url) { + return IORouterRegistry.getHandlers(url, "save"); + } + static getLoadHandlers(url, loadOptions) { + return IORouterRegistry.getHandlers(url, "load", loadOptions); + } + static getHandlers(url, handlerType, loadOptions) { + const validHandlers = []; + const routers = handlerType === "load" ? IORouterRegistry.getInstance().loadRouters : IORouterRegistry.getInstance().saveRouters; + routers.forEach((router) => { + const handler = router(url, loadOptions); + if (handler !== null) { + validHandlers.push(handler); + } + }); + return validHandlers; + } +}; +var registerSaveRouter = (loudRouter) => IORouterRegistry.registerSaveRouter(loudRouter); +var registerLoadRouter = (loudRouter) => IORouterRegistry.registerLoadRouter(loudRouter); +var getSaveHandlers = (url) => IORouterRegistry.getSaveHandlers(url); +var getLoadHandlers = (url, loadOptions) => IORouterRegistry.getLoadHandlers(url, loadOptions); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +var DATABASE_NAME = "tensorflowjs"; +var DATABASE_VERSION = 1; +var MODEL_STORE_NAME = "models_store"; +var INFO_STORE_NAME = "model_info_store"; +function getIndexedDBFactory() { + if (!env().getBool("IS_BROWSER")) { + throw new Error("Failed to obtain IndexedDB factory because the current environmentis not a web browser."); + } + const theWindow = typeof window === "undefined" ? self : window; + const factory = theWindow.indexedDB || theWindow.mozIndexedDB || theWindow.webkitIndexedDB || theWindow.msIndexedDB || theWindow.shimIndexedDB; + if (factory == null) { + throw new Error("The current browser does not appear to support IndexedDB."); + } + return factory; +} +function setUpDatabase(openRequest) { + const db = openRequest.result; + db.createObjectStore(MODEL_STORE_NAME, {keyPath: "modelPath"}); + db.createObjectStore(INFO_STORE_NAME, {keyPath: "modelPath"}); +} +var BrowserIndexedDB = class { + constructor(modelPath) { + this.indexedDB = getIndexedDBFactory(); + if (modelPath == null || !modelPath) { + throw new Error("For IndexedDB, modelPath must not be null, undefined or empty."); + } + this.modelPath = modelPath; + } + async save(modelArtifacts) { + if (modelArtifacts.modelTopology instanceof ArrayBuffer) { + throw new Error("BrowserLocalStorage.save() does not support saving model topology in binary formats yet."); + } + return this.databaseAction(this.modelPath, modelArtifacts); + } + async load() { + return this.databaseAction(this.modelPath); + } + databaseAction(modelPath, modelArtifacts) { + return new Promise((resolve, reject) => { + const openRequest = this.indexedDB.open(DATABASE_NAME, DATABASE_VERSION); + openRequest.onupgradeneeded = () => setUpDatabase(openRequest); + openRequest.onsuccess = () => { + const db = openRequest.result; + if (modelArtifacts == null) { + const modelTx = db.transaction(MODEL_STORE_NAME, "readonly"); + const modelStore = modelTx.objectStore(MODEL_STORE_NAME); + const getRequest = modelStore.get(this.modelPath); + getRequest.onsuccess = () => { + if (getRequest.result == null) { + db.close(); + return reject(new Error(`Cannot find model with path '${this.modelPath}' in IndexedDB.`)); + } else { + resolve(getRequest.result.modelArtifacts); + } + }; + getRequest.onerror = (error) => { + db.close(); + return reject(getRequest.error); + }; + modelTx.oncomplete = () => db.close(); + } else { + const modelArtifactsInfo = getModelArtifactsInfoForJSON(modelArtifacts); + const infoTx = db.transaction(INFO_STORE_NAME, "readwrite"); + let infoStore = infoTx.objectStore(INFO_STORE_NAME); + const putInfoRequest = infoStore.put({modelPath: this.modelPath, modelArtifactsInfo}); + let modelTx; + putInfoRequest.onsuccess = () => { + modelTx = db.transaction(MODEL_STORE_NAME, "readwrite"); + const modelStore = modelTx.objectStore(MODEL_STORE_NAME); + const putModelRequest = modelStore.put({ + modelPath: this.modelPath, + modelArtifacts, + modelArtifactsInfo + }); + putModelRequest.onsuccess = () => resolve({modelArtifactsInfo}); + putModelRequest.onerror = (error) => { + infoStore = infoTx.objectStore(INFO_STORE_NAME); + const deleteInfoRequest = infoStore.delete(this.modelPath); + deleteInfoRequest.onsuccess = () => { + db.close(); + return reject(putModelRequest.error); + }; + deleteInfoRequest.onerror = (error2) => { + db.close(); + return reject(putModelRequest.error); + }; + }; + }; + putInfoRequest.onerror = (error) => { + db.close(); + return reject(putInfoRequest.error); + }; + infoTx.oncomplete = () => { + if (modelTx == null) { + db.close(); + } else { + modelTx.oncomplete = () => db.close(); + } + }; + } + }; + openRequest.onerror = (error) => reject(openRequest.error); + }); + } +}; +BrowserIndexedDB.URL_SCHEME = "indexeddb://"; +var indexedDBRouter = (url) => { + if (!env().getBool("IS_BROWSER")) { + return null; + } else { + if (!Array.isArray(url) && url.startsWith(BrowserIndexedDB.URL_SCHEME)) { + return browserIndexedDB(url.slice(BrowserIndexedDB.URL_SCHEME.length)); + } else { + return null; + } + } +}; +IORouterRegistry.registerSaveRouter(indexedDBRouter); +IORouterRegistry.registerLoadRouter(indexedDBRouter); +function browserIndexedDB(modelPath) { + return new BrowserIndexedDB(modelPath); +} +function maybeStripScheme(key) { + return key.startsWith(BrowserIndexedDB.URL_SCHEME) ? key.slice(BrowserIndexedDB.URL_SCHEME.length) : key; +} +var BrowserIndexedDBManager = class { + constructor() { + this.indexedDB = getIndexedDBFactory(); + } + async listModels() { + return new Promise((resolve, reject) => { + const openRequest = this.indexedDB.open(DATABASE_NAME, DATABASE_VERSION); + openRequest.onupgradeneeded = () => setUpDatabase(openRequest); + openRequest.onsuccess = () => { + const db = openRequest.result; + const tx = db.transaction(INFO_STORE_NAME, "readonly"); + const store = tx.objectStore(INFO_STORE_NAME); + const getAllInfoRequest = store.getAll(); + getAllInfoRequest.onsuccess = () => { + const out = {}; + for (const item of getAllInfoRequest.result) { + out[item.modelPath] = item.modelArtifactsInfo; + } + resolve(out); + }; + getAllInfoRequest.onerror = (error) => { + db.close(); + return reject(getAllInfoRequest.error); + }; + tx.oncomplete = () => db.close(); + }; + openRequest.onerror = (error) => reject(openRequest.error); + }); + } + async removeModel(path) { + path = maybeStripScheme(path); + return new Promise((resolve, reject) => { + const openRequest = this.indexedDB.open(DATABASE_NAME, DATABASE_VERSION); + openRequest.onupgradeneeded = () => setUpDatabase(openRequest); + openRequest.onsuccess = () => { + const db = openRequest.result; + const infoTx = db.transaction(INFO_STORE_NAME, "readwrite"); + const infoStore = infoTx.objectStore(INFO_STORE_NAME); + const getInfoRequest = infoStore.get(path); + let modelTx; + getInfoRequest.onsuccess = () => { + if (getInfoRequest.result == null) { + db.close(); + return reject(new Error(`Cannot find model with path '${path}' in IndexedDB.`)); + } else { + const deleteInfoRequest = infoStore.delete(path); + const deleteModelData = () => { + modelTx = db.transaction(MODEL_STORE_NAME, "readwrite"); + const modelStore = modelTx.objectStore(MODEL_STORE_NAME); + const deleteModelRequest = modelStore.delete(path); + deleteModelRequest.onsuccess = () => resolve(getInfoRequest.result.modelArtifactsInfo); + deleteModelRequest.onerror = (error) => reject(getInfoRequest.error); + }; + deleteInfoRequest.onsuccess = deleteModelData; + deleteInfoRequest.onerror = (error) => { + deleteModelData(); + db.close(); + return reject(getInfoRequest.error); + }; + } + }; + getInfoRequest.onerror = (error) => { + db.close(); + return reject(getInfoRequest.error); + }; + infoTx.oncomplete = () => { + if (modelTx == null) { + db.close(); + } else { + modelTx.oncomplete = () => db.close(); + } + }; + }; + openRequest.onerror = (error) => reject(openRequest.error); + }); + } +}; +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +var PATH_SEPARATOR = "/"; +var PATH_PREFIX = "tensorflowjs_models"; +var INFO_SUFFIX = "info"; +var MODEL_TOPOLOGY_SUFFIX = "model_topology"; +var WEIGHT_SPECS_SUFFIX = "weight_specs"; +var WEIGHT_DATA_SUFFIX = "weight_data"; +var MODEL_METADATA_SUFFIX = "model_metadata"; +function getModelKeys(path) { + return { + info: [PATH_PREFIX, path, INFO_SUFFIX].join(PATH_SEPARATOR), + topology: [PATH_PREFIX, path, MODEL_TOPOLOGY_SUFFIX].join(PATH_SEPARATOR), + weightSpecs: [PATH_PREFIX, path, WEIGHT_SPECS_SUFFIX].join(PATH_SEPARATOR), + weightData: [PATH_PREFIX, path, WEIGHT_DATA_SUFFIX].join(PATH_SEPARATOR), + modelMetadata: [PATH_PREFIX, path, MODEL_METADATA_SUFFIX].join(PATH_SEPARATOR) + }; +} +function getModelPathFromKey(key) { + const items = key.split(PATH_SEPARATOR); + if (items.length < 3) { + throw new Error(`Invalid key format: ${key}`); + } + return items.slice(1, items.length - 1).join(PATH_SEPARATOR); +} +function maybeStripScheme2(key) { + return key.startsWith(BrowserLocalStorage.URL_SCHEME) ? key.slice(BrowserLocalStorage.URL_SCHEME.length) : key; +} +var BrowserLocalStorage = class { + constructor(modelPath) { + if (!env().getBool("IS_BROWSER") || typeof window === "undefined" || typeof window.localStorage === "undefined") { + throw new Error("The current environment does not support local storage."); + } + this.LS = window.localStorage; + if (modelPath == null || !modelPath) { + throw new Error("For local storage, modelPath must not be null, undefined or empty."); + } + this.modelPath = modelPath; + this.keys = getModelKeys(this.modelPath); + } + async save(modelArtifacts) { + if (modelArtifacts.modelTopology instanceof ArrayBuffer) { + throw new Error("BrowserLocalStorage.save() does not support saving model topology in binary formats yet."); + } else { + const topology = JSON.stringify(modelArtifacts.modelTopology); + const weightSpecs = JSON.stringify(modelArtifacts.weightSpecs); + const modelArtifactsInfo = getModelArtifactsInfoForJSON(modelArtifacts); + try { + this.LS.setItem(this.keys.info, JSON.stringify(modelArtifactsInfo)); + this.LS.setItem(this.keys.topology, topology); + this.LS.setItem(this.keys.weightSpecs, weightSpecs); + this.LS.setItem(this.keys.weightData, arrayBufferToBase64String(modelArtifacts.weightData)); + const result = { + format: modelArtifacts.format, + generatedBy: modelArtifacts.generatedBy, + convertedBy: modelArtifacts.convertedBy + }; + if (modelArtifacts.signature != null) { + result.signature = modelArtifacts.signature; + } + if (modelArtifacts.userDefinedMetadata != null) { + result.userDefinedMetadata = modelArtifacts.userDefinedMetadata; + } + if (modelArtifacts.modelInitializer != null) { + result.modelInitializer = modelArtifacts.modelInitializer; + } + this.LS.setItem(this.keys.modelMetadata, JSON.stringify(result)); + return {modelArtifactsInfo}; + } catch (err) { + this.LS.removeItem(this.keys.info); + this.LS.removeItem(this.keys.topology); + this.LS.removeItem(this.keys.weightSpecs); + this.LS.removeItem(this.keys.weightData); + this.LS.removeItem(this.keys.modelMetadata); + throw new Error(`Failed to save model '${this.modelPath}' to local storage: size quota being exceeded is a possible cause of this failure: modelTopologyBytes=${modelArtifactsInfo.modelTopologyBytes}, weightSpecsBytes=${modelArtifactsInfo.weightSpecsBytes}, weightDataBytes=${modelArtifactsInfo.weightDataBytes}.`); + } + } + } + async load() { + const info2 = JSON.parse(this.LS.getItem(this.keys.info)); + if (info2 == null) { + throw new Error(`In local storage, there is no model with name '${this.modelPath}'`); + } + if (info2.modelTopologyType !== "JSON") { + throw new Error("BrowserLocalStorage does not support loading non-JSON model topology yet."); + } + const out = {}; + const topology = JSON.parse(this.LS.getItem(this.keys.topology)); + if (topology == null) { + throw new Error(`In local storage, the topology of model '${this.modelPath}' is missing.`); + } + out.modelTopology = topology; + const weightSpecs = JSON.parse(this.LS.getItem(this.keys.weightSpecs)); + if (weightSpecs == null) { + throw new Error(`In local storage, the weight specs of model '${this.modelPath}' are missing.`); + } + out.weightSpecs = weightSpecs; + const metadataString = this.LS.getItem(this.keys.modelMetadata); + if (metadataString != null) { + const metadata = JSON.parse(metadataString); + out.format = metadata["format"]; + out.generatedBy = metadata["generatedBy"]; + out.convertedBy = metadata["convertedBy"]; + if (metadata["signature"] != null) { + out.signature = metadata["signature"]; + } + if (metadata["userDefinedMetadata"] != null) { + out.userDefinedMetadata = metadata["userDefinedMetadata"]; + } + if (metadata["modelInitializer"] != null) { + out.modelInitializer = metadata["modelInitializer"]; + } + } + const weightDataBase64 = this.LS.getItem(this.keys.weightData); + if (weightDataBase64 == null) { + throw new Error(`In local storage, the binary weight values of model '${this.modelPath}' are missing.`); + } + out.weightData = base64StringToArrayBuffer(weightDataBase64); + return out; + } +}; +BrowserLocalStorage.URL_SCHEME = "localstorage://"; +var localStorageRouter = (url) => { + if (!env().getBool("IS_BROWSER")) { + return null; + } else { + if (!Array.isArray(url) && url.startsWith(BrowserLocalStorage.URL_SCHEME)) { + return browserLocalStorage(url.slice(BrowserLocalStorage.URL_SCHEME.length)); + } else { + return null; + } + } +}; +IORouterRegistry.registerSaveRouter(localStorageRouter); +IORouterRegistry.registerLoadRouter(localStorageRouter); +function browserLocalStorage(modelPath) { + return new BrowserLocalStorage(modelPath); +} +var BrowserLocalStorageManager = class { + constructor() { + assert(env().getBool("IS_BROWSER"), () => "Current environment is not a web browser"); + assert(typeof window === "undefined" || typeof window.localStorage !== "undefined", () => "Current browser does not appear to support localStorage"); + this.LS = window.localStorage; + } + async listModels() { + const out = {}; + const prefix = PATH_PREFIX + PATH_SEPARATOR; + const suffix = PATH_SEPARATOR + INFO_SUFFIX; + for (let i = 0; i < this.LS.length; ++i) { + const key = this.LS.key(i); + if (key.startsWith(prefix) && key.endsWith(suffix)) { + const modelPath = getModelPathFromKey(key); + out[modelPath] = JSON.parse(this.LS.getItem(key)); + } + } + return out; + } + async removeModel(path) { + path = maybeStripScheme2(path); + const keys = getModelKeys(path); + if (this.LS.getItem(keys.info) == null) { + throw new Error(`Cannot find model at path '${path}'`); + } + const info2 = JSON.parse(this.LS.getItem(keys.info)); + this.LS.removeItem(keys.info); + this.LS.removeItem(keys.topology); + this.LS.removeItem(keys.weightSpecs); + this.LS.removeItem(keys.weightData); + return info2; + } +}; +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +var URL_SCHEME_SUFFIX = "://"; +var ModelStoreManagerRegistry = class { + constructor() { + this.managers = {}; + } + static getInstance() { + if (ModelStoreManagerRegistry.instance == null) { + ModelStoreManagerRegistry.instance = new ModelStoreManagerRegistry(); + } + return ModelStoreManagerRegistry.instance; + } + static registerManager(scheme, manager) { + assert(scheme != null, () => "scheme must not be undefined or null."); + if (scheme.endsWith(URL_SCHEME_SUFFIX)) { + scheme = scheme.slice(0, scheme.indexOf(URL_SCHEME_SUFFIX)); + } + assert(scheme.length > 0, () => "scheme must not be an empty string."); + const registry = ModelStoreManagerRegistry.getInstance(); + assert(registry.managers[scheme] == null, () => `A model store manager is already registered for scheme '${scheme}'.`); + registry.managers[scheme] = manager; + } + static getManager(scheme) { + const manager = this.getInstance().managers[scheme]; + if (manager == null) { + throw new Error(`Cannot find model manager for scheme '${scheme}'`); + } + return manager; + } + static getSchemes() { + return Object.keys(this.getInstance().managers); + } +}; +function parseURL(url) { + if (url.indexOf(URL_SCHEME_SUFFIX) === -1) { + throw new Error(`The url string provided does not contain a scheme. Supported schemes are: ${ModelStoreManagerRegistry.getSchemes().join(",")}`); + } + return { + scheme: url.split(URL_SCHEME_SUFFIX)[0], + path: url.split(URL_SCHEME_SUFFIX)[1] + }; +} +async function cloneModelInternal(sourceURL, destURL, deleteSource = false) { + assert(sourceURL !== destURL, () => `Old path and new path are the same: '${sourceURL}'`); + const loadHandlers = IORouterRegistry.getLoadHandlers(sourceURL); + assert(loadHandlers.length > 0, () => `Copying failed because no load handler is found for source URL ${sourceURL}.`); + assert(loadHandlers.length < 2, () => `Copying failed because more than one (${loadHandlers.length}) load handlers for source URL ${sourceURL}.`); + const loadHandler = loadHandlers[0]; + const saveHandlers = IORouterRegistry.getSaveHandlers(destURL); + assert(saveHandlers.length > 0, () => `Copying failed because no save handler is found for destination URL ${destURL}.`); + assert(saveHandlers.length < 2, () => `Copying failed because more than one (${loadHandlers.length}) save handlers for destination URL ${destURL}.`); + const saveHandler = saveHandlers[0]; + const sourceScheme = parseURL(sourceURL).scheme; + const sourcePath = parseURL(sourceURL).path; + const sameMedium = sourceScheme === parseURL(sourceURL).scheme; + const modelArtifacts = await loadHandler.load(); + if (deleteSource && sameMedium) { + await ModelStoreManagerRegistry.getManager(sourceScheme).removeModel(sourcePath); + } + const saveResult = await saveHandler.save(modelArtifacts); + if (deleteSource && !sameMedium) { + await ModelStoreManagerRegistry.getManager(sourceScheme).removeModel(sourcePath); + } + return saveResult.modelArtifactsInfo; +} +async function listModels() { + const schemes = ModelStoreManagerRegistry.getSchemes(); + const out = {}; + for (const scheme of schemes) { + const schemeOut = await ModelStoreManagerRegistry.getManager(scheme).listModels(); + for (const path in schemeOut) { + const url = scheme + URL_SCHEME_SUFFIX + path; + out[url] = schemeOut[path]; + } + } + return out; +} +async function removeModel(url) { + const schemeAndPath = parseURL(url); + const manager = ModelStoreManagerRegistry.getManager(schemeAndPath.scheme); + return manager.removeModel(schemeAndPath.path); +} +async function copyModel(sourceURL, destURL) { + const deleteSource = false; + return cloneModelInternal(sourceURL, destURL, deleteSource); +} +async function moveModel(sourceURL, destURL) { + const deleteSource = true; + return cloneModelInternal(sourceURL, destURL, deleteSource); +} +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +var PlatformBrowser = class { + fetch(path, init2) { + return fetch(path, init2); + } + now() { + return performance.now(); + } + encode(text, encoding) { + if (encoding !== "utf-8" && encoding !== "utf8") { + throw new Error(`Browser's encoder only supports utf-8, but got ${encoding}`); + } + if (this.textEncoder == null) { + this.textEncoder = new TextEncoder(); + } + return this.textEncoder.encode(text); + } + decode(bytes, encoding) { + return new TextDecoder(encoding).decode(bytes); + } +}; +if (env().get("IS_BROWSER")) { + env().setPlatform("browser", new PlatformBrowser()); + try { + ModelStoreManagerRegistry.registerManager(BrowserLocalStorage.URL_SCHEME, new BrowserLocalStorageManager()); + } catch (err) { + } + try { + ModelStoreManagerRegistry.registerManager(BrowserIndexedDB.URL_SCHEME, new BrowserIndexedDBManager()); + } catch (err) { + } +} +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +var getNodeFetch = { + importFetch: () => require_browser() +}; +var systemFetch; +var PlatformNode = class { + constructor() { + this.util = require("util"); + this.textEncoder = new this.util.TextEncoder(); + } + fetch(path, requestInits) { + if (env().global.fetch != null) { + return env().global.fetch(path, requestInits); + } + if (systemFetch == null) { + systemFetch = getNodeFetch.importFetch(); + } + return systemFetch(path, requestInits); + } + now() { + const time2 = process.hrtime(); + return time2[0] * 1e3 + time2[1] / 1e6; + } + encode(text, encoding) { + if (encoding !== "utf-8" && encoding !== "utf8") { + throw new Error(`Node built-in encoder only supports utf-8, but got ${encoding}`); + } + return this.textEncoder.encode(text); + } + decode(bytes, encoding) { + if (bytes.length === 0) { + return ""; + } + return new this.util.TextDecoder(encoding).decode(bytes); + } +}; +if (env().get("IS_NODE")) { + env().setPlatform("node", new PlatformNode()); +} +/** + * @license + * Copyright 2020 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function buffer(shape, dtype = "float32", values) { + dtype = dtype || "float32"; + assertNonNegativeIntegerDimensions(shape); + return new TensorBuffer(shape, dtype, values); +} +/** + * @license + * Copyright 2020 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function cast_(x, dtype) { + const $x = convertToTensor(x, "x", "cast"); + if (!isValidDtype(dtype)) { + throw new Error(`Failed to cast to unknown dtype ${dtype}`); + } + if (dtype === "string" && $x.dtype !== "string" || dtype !== "string" && $x.dtype === "string") { + throw new Error("Only strings can be casted to strings"); + } + const inputs = {x: $x}; + const attrs = {dtype}; + return ENGINE.runKernel(Cast, inputs, attrs); +} +var cast = op({cast_}); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function clone_(x) { + const $x = convertToTensor(x, "x", "clone", "string_or_numeric"); + const inputs = {x: $x}; + return ENGINE.runKernel(Identity, inputs); +} +var clone = op({clone_}); +/** + * @license + * Copyright 2020 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function print2(x, verbose = false) { + console.log(x.toString(verbose)); +} +/** + * @license + * Copyright 2020 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +getOrMakeEngine(); +var opHandler2 = { + buffer, + cast, + clone, + print: print2 +}; +setOpHandler(opHandler2); +var io_exports = {}; +__export2(io_exports, { + browserFiles: () => browserFiles, + browserHTTPRequest: () => browserHTTPRequest, + concatenateArrayBuffers: () => concatenateArrayBuffers, + copyModel: () => copyModel, + decodeWeights: () => decodeWeights, + encodeWeights: () => encodeWeights, + fromMemory: () => fromMemory, + getLoadHandlers: () => getLoadHandlers, + getModelArtifactsInfoForJSON: () => getModelArtifactsInfoForJSON, + getSaveHandlers: () => getSaveHandlers, + http: () => http, + isHTTPScheme: () => isHTTPScheme, + listModels: () => listModels, + loadWeights: () => loadWeights, + moveModel: () => moveModel, + registerLoadRouter: () => registerLoadRouter, + registerSaveRouter: () => registerSaveRouter, + removeModel: () => removeModel, + weightsLoaderFactory: () => weightsLoaderFactory, + withSaveHandler: () => withSaveHandler +}); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +var DEFAULT_FILE_NAME_PREFIX = "model"; +var DEFAULT_JSON_EXTENSION_NAME = ".json"; +var DEFAULT_WEIGHT_DATA_EXTENSION_NAME = ".weights.bin"; +function defer(f) { + return new Promise((resolve) => setTimeout(resolve)).then(f); +} +var BrowserDownloads = class { + constructor(fileNamePrefix) { + if (!env().getBool("IS_BROWSER")) { + throw new Error("browserDownloads() cannot proceed because the current environment is not a browser."); + } + if (fileNamePrefix.startsWith(BrowserDownloads.URL_SCHEME)) { + fileNamePrefix = fileNamePrefix.slice(BrowserDownloads.URL_SCHEME.length); + } + if (fileNamePrefix == null || fileNamePrefix.length === 0) { + fileNamePrefix = DEFAULT_FILE_NAME_PREFIX; + } + this.modelTopologyFileName = fileNamePrefix + DEFAULT_JSON_EXTENSION_NAME; + this.weightDataFileName = fileNamePrefix + DEFAULT_WEIGHT_DATA_EXTENSION_NAME; + } + async save(modelArtifacts) { + if (typeof document === "undefined") { + throw new Error("Browser downloads are not supported in this environment since `document` is not present"); + } + const weightsURL = window.URL.createObjectURL(new Blob([modelArtifacts.weightData], {type: "application/octet-stream"})); + if (modelArtifacts.modelTopology instanceof ArrayBuffer) { + throw new Error("BrowserDownloads.save() does not support saving model topology in binary formats yet."); + } else { + const weightsManifest = [{ + paths: ["./" + this.weightDataFileName], + weights: modelArtifacts.weightSpecs + }]; + const modelTopologyAndWeightManifest = { + modelTopology: modelArtifacts.modelTopology, + format: modelArtifacts.format, + generatedBy: modelArtifacts.generatedBy, + convertedBy: modelArtifacts.convertedBy, + weightsManifest + }; + if (modelArtifacts.signature != null) { + modelTopologyAndWeightManifest.signature = modelArtifacts.signature; + } + if (modelArtifacts.userDefinedMetadata != null) { + modelTopologyAndWeightManifest.userDefinedMetadata = modelArtifacts.userDefinedMetadata; + } + if (modelArtifacts.modelInitializer != null) { + modelTopologyAndWeightManifest.modelInitializer = modelArtifacts.modelInitializer; + } + const modelTopologyAndWeightManifestURL = window.URL.createObjectURL(new Blob([JSON.stringify(modelTopologyAndWeightManifest)], {type: "application/json"})); + const jsonAnchor = this.jsonAnchor == null ? document.createElement("a") : this.jsonAnchor; + jsonAnchor.download = this.modelTopologyFileName; + jsonAnchor.href = modelTopologyAndWeightManifestURL; + await defer(() => jsonAnchor.dispatchEvent(new MouseEvent("click"))); + if (modelArtifacts.weightData != null) { + const weightDataAnchor = this.weightDataAnchor == null ? document.createElement("a") : this.weightDataAnchor; + weightDataAnchor.download = this.weightDataFileName; + weightDataAnchor.href = weightsURL; + await defer(() => weightDataAnchor.dispatchEvent(new MouseEvent("click"))); + } + return {modelArtifactsInfo: getModelArtifactsInfoForJSON(modelArtifacts)}; + } + } +}; +BrowserDownloads.URL_SCHEME = "downloads://"; +var BrowserFiles = class { + constructor(files) { + if (files == null || files.length < 1) { + throw new Error(`When calling browserFiles, at least 1 file is required, but received ${files}`); + } + this.files = files; + } + async load() { + const jsonFile = this.files[0]; + const weightFiles = this.files.slice(1); + return new Promise((resolve, reject) => { + const jsonReader = new FileReader(); + jsonReader.onload = (event) => { + const modelJSON = JSON.parse(event.target.result); + const modelTopology = modelJSON.modelTopology; + if (modelTopology == null) { + reject(new Error(`modelTopology field is missing from file ${jsonFile.name}`)); + return; + } + if (weightFiles.length === 0) { + resolve({modelTopology}); + } + const weightsManifest = modelJSON.weightsManifest; + if (weightsManifest == null) { + reject(new Error(`weightManifest field is missing from file ${jsonFile.name}`)); + return; + } + let pathToFile; + try { + pathToFile = this.checkManifestAndWeightFiles(weightsManifest, weightFiles); + } catch (err) { + reject(err); + return; + } + const weightSpecs = []; + const paths = []; + const perFileBuffers = []; + weightsManifest.forEach((weightsGroup) => { + weightsGroup.paths.forEach((path) => { + paths.push(path); + perFileBuffers.push(null); + }); + weightSpecs.push(...weightsGroup.weights); + }); + weightsManifest.forEach((weightsGroup) => { + weightsGroup.paths.forEach((path) => { + const weightFileReader = new FileReader(); + weightFileReader.onload = (event2) => { + const weightData = event2.target.result; + const index = paths.indexOf(path); + perFileBuffers[index] = weightData; + if (perFileBuffers.indexOf(null) === -1) { + const result = { + modelTopology, + weightSpecs, + weightData: concatenateArrayBuffers(perFileBuffers), + format: modelJSON.format, + generatedBy: modelJSON.generatedBy, + convertedBy: modelJSON.convertedBy + }; + if (modelJSON.signature != null) { + result.signature = modelJSON.signature; + } + if (modelJSON.userDefinedMetadata != null) { + result.userDefinedMetadata = modelJSON.userDefinedMetadata; + } + if (modelJSON.modelInitializer != null) { + result.modelInitializer = modelJSON.modelInitializer; + } + resolve(result); + } + }; + weightFileReader.onerror = (error) => reject(`Failed to weights data from file of path '${path}'.`); + weightFileReader.readAsArrayBuffer(pathToFile[path]); + }); + }); + }; + jsonReader.onerror = (error) => reject(`Failed to read model topology and weights manifest JSON from file '${jsonFile.name}'. BrowserFiles supports loading Keras-style tf.Model artifacts only.`); + jsonReader.readAsText(jsonFile); + }); + } + checkManifestAndWeightFiles(manifest, files) { + const basenames = []; + const fileNames = files.map((file) => basename(file.name)); + const pathToFile = {}; + for (const group of manifest) { + group.paths.forEach((path) => { + const pathBasename = basename(path); + if (basenames.indexOf(pathBasename) !== -1) { + throw new Error(`Duplicate file basename found in weights manifest: '${pathBasename}'`); + } + basenames.push(pathBasename); + if (fileNames.indexOf(pathBasename) === -1) { + throw new Error(`Weight file with basename '${pathBasename}' is not provided.`); + } else { + pathToFile[path] = files[fileNames.indexOf(pathBasename)]; + } + }); + } + if (basenames.length !== files.length) { + throw new Error(`Mismatch in the number of files in weights manifest (${basenames.length}) and the number of weight files provided (${files.length}).`); + } + return pathToFile; + } +}; +var browserDownloadsRouter = (url) => { + if (!env().getBool("IS_BROWSER")) { + return null; + } else { + if (!Array.isArray(url) && url.startsWith(BrowserDownloads.URL_SCHEME)) { + return browserDownloads(url.slice(BrowserDownloads.URL_SCHEME.length)); + } else { + return null; + } + } +}; +IORouterRegistry.registerSaveRouter(browserDownloadsRouter); +function browserDownloads(fileNamePrefix = "model") { + return new BrowserDownloads(fileNamePrefix); +} +function browserFiles(files) { + return new BrowserFiles(files); +} +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function monitorPromisesProgress(promises, onProgress, startFraction, endFraction) { + checkPromises(promises); + startFraction = startFraction == null ? 0 : startFraction; + endFraction = endFraction == null ? 1 : endFraction; + checkFraction(startFraction, endFraction); + let resolvedPromise = 0; + const registerMonitor = (promise) => { + promise.then((value) => { + const fraction = startFraction + ++resolvedPromise / promises.length * (endFraction - startFraction); + onProgress(fraction); + return value; + }); + return promise; + }; + function checkPromises(promises2) { + assert(promises2 != null && Array.isArray(promises2) && promises2.length > 0, () => "promises must be a none empty array"); + } + function checkFraction(startFraction2, endFraction2) { + assert(startFraction2 >= 0 && startFraction2 <= 1, () => `Progress fraction must be in range [0, 1], but got startFraction ${startFraction2}`); + assert(endFraction2 >= 0 && endFraction2 <= 1, () => `Progress fraction must be in range [0, 1], but got endFraction ${endFraction2}`); + assert(endFraction2 >= startFraction2, () => `startFraction must be no more than endFraction, but got startFraction ${startFraction2} and endFraction ${endFraction2}`); + } + return Promise.all(promises.map(registerMonitor)); +} +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +async function loadWeightsAsArrayBuffer(fetchURLs, loadOptions) { + if (loadOptions == null) { + loadOptions = {}; + } + const fetchFunc = loadOptions.fetchFunc == null ? env().platform.fetch : loadOptions.fetchFunc; + const requests = fetchURLs.map((fetchURL) => fetchFunc(fetchURL, loadOptions.requestInit, {isBinary: true})); + const fetchStartFraction = 0; + const fetchEndFraction = 0.5; + const responses = loadOptions.onProgress == null ? await Promise.all(requests) : await monitorPromisesProgress(requests, loadOptions.onProgress, fetchStartFraction, fetchEndFraction); + const bufferPromises = responses.map((response) => response.arrayBuffer()); + const bufferStartFraction = 0.5; + const bufferEndFraction = 1; + const buffers = loadOptions.onProgress == null ? await Promise.all(bufferPromises) : await monitorPromisesProgress(bufferPromises, loadOptions.onProgress, bufferStartFraction, bufferEndFraction); + return buffers; +} +async function loadWeights(manifest, filePathPrefix = "", weightNames, requestInit) { + const fetchWeights = (fetchUrls) => loadWeightsAsArrayBuffer(fetchUrls, {requestInit}); + const loadWeights2 = weightsLoaderFactory(fetchWeights); + return loadWeights2(manifest, filePathPrefix, weightNames); +} +function weightsLoaderFactory(fetchWeightsFunction) { + return async (manifest, filePathPrefix = "", weightNames) => { + const groupIndicesToFetchMap = manifest.map(() => false); + const groupWeightsToFetch = {}; + const weightsFound = weightNames != null ? weightNames.map(() => false) : []; + const allManifestWeightNames = []; + manifest.forEach((manifestGroupConfig, groupIndex) => { + let groupOffset = 0; + manifestGroupConfig.weights.forEach((weightsEntry) => { + const rawDtype = "quantization" in weightsEntry ? weightsEntry.quantization.dtype : weightsEntry.dtype; + const weightsBytes = DTYPE_VALUE_SIZE_MAP[rawDtype] * sizeFromShape(weightsEntry.shape); + const enqueueWeightsForFetchingFn = () => { + groupIndicesToFetchMap[groupIndex] = true; + if (groupWeightsToFetch[groupIndex] == null) { + groupWeightsToFetch[groupIndex] = []; + } + groupWeightsToFetch[groupIndex].push({ + manifestEntry: weightsEntry, + groupOffset, + sizeBytes: weightsBytes + }); + }; + if (weightNames != null) { + weightNames.forEach((weightName, weightIndex) => { + if (weightName === weightsEntry.name) { + enqueueWeightsForFetchingFn(); + weightsFound[weightIndex] = true; + } + }); + } else { + enqueueWeightsForFetchingFn(); + } + allManifestWeightNames.push(weightsEntry.name); + groupOffset += weightsBytes; + }); + }); + if (!weightsFound.every((found) => found)) { + const weightsNotFound = weightNames.filter((_, i) => !weightsFound[i]); + throw new Error(`Could not find weights in manifest with names: ${weightsNotFound.join(", ")}. +Manifest JSON has weights with names: ${allManifestWeightNames.join(", ")}.`); + } + const groupIndicesToFetch = groupIndicesToFetchMap.reduce((accumulator, shouldFetch, i) => { + if (shouldFetch) { + accumulator.push(i); + } + return accumulator; + }, []); + const fetchUrls = []; + groupIndicesToFetch.forEach((i) => { + manifest[i].paths.forEach((filepath) => { + const fetchUrl = filePathPrefix + (!filePathPrefix.endsWith("/") ? "/" : "") + filepath; + fetchUrls.push(fetchUrl); + }); + }); + const buffers = await fetchWeightsFunction(fetchUrls); + const weightsTensorMap = {}; + let bufferIndexOffset = 0; + groupIndicesToFetch.forEach((i) => { + const numBuffers = manifest[i].paths.length; + let groupBytes = 0; + for (let i2 = 0; i2 < numBuffers; i2++) { + groupBytes += buffers[bufferIndexOffset + i2].byteLength; + } + const groupBuffer = new ArrayBuffer(groupBytes); + const groupByteBuffer = new Uint8Array(groupBuffer); + let groupBufferOffset = 0; + for (let i2 = 0; i2 < numBuffers; i2++) { + const buffer2 = new Uint8Array(buffers[bufferIndexOffset + i2]); + groupByteBuffer.set(buffer2, groupBufferOffset); + groupBufferOffset += buffer2.byteLength; + } + const weightsEntries = groupWeightsToFetch[i]; + weightsEntries.forEach((weightsEntry) => { + const byteBuffer = groupBuffer.slice(weightsEntry.groupOffset, weightsEntry.groupOffset + weightsEntry.sizeBytes); + const nameToTensorMap = decodeWeights(byteBuffer, [weightsEntry.manifestEntry]); + for (const name in nameToTensorMap) { + weightsTensorMap[name] = nameToTensorMap[name]; + } + }); + bufferIndexOffset += numBuffers; + }); + return weightsTensorMap; + }; +} +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +var OCTET_STREAM_MIME_TYPE = "application/octet-stream"; +var JSON_TYPE = "application/json"; +var HTTPRequest = class { + constructor(path, loadOptions) { + this.DEFAULT_METHOD = "POST"; + if (loadOptions == null) { + loadOptions = {}; + } + this.weightPathPrefix = loadOptions.weightPathPrefix; + this.onProgress = loadOptions.onProgress; + this.weightUrlConverter = loadOptions.weightUrlConverter; + if (loadOptions.fetchFunc != null) { + assert(typeof loadOptions.fetchFunc === "function", () => "Must pass a function that matches the signature of `fetch` (see https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API)"); + this.fetch = loadOptions.fetchFunc; + } else { + this.fetch = env().platform.fetch; + } + assert(path != null && path.length > 0, () => "URL path for http must not be null, undefined or empty."); + if (Array.isArray(path)) { + assert(path.length === 2, () => `URL paths for http must have a length of 2, (actual length is ${path.length}).`); + } + this.path = path; + if (loadOptions.requestInit != null && loadOptions.requestInit.body != null) { + throw new Error("requestInit is expected to have no pre-existing body, but has one."); + } + this.requestInit = loadOptions.requestInit || {}; + } + async save(modelArtifacts) { + if (modelArtifacts.modelTopology instanceof ArrayBuffer) { + throw new Error("BrowserHTTPRequest.save() does not support saving model topology in binary formats yet."); + } + const init2 = Object.assign({method: this.DEFAULT_METHOD}, this.requestInit); + init2.body = new FormData(); + const weightsManifest = [{ + paths: ["./model.weights.bin"], + weights: modelArtifacts.weightSpecs + }]; + const modelTopologyAndWeightManifest = { + modelTopology: modelArtifacts.modelTopology, + format: modelArtifacts.format, + generatedBy: modelArtifacts.generatedBy, + convertedBy: modelArtifacts.convertedBy, + weightsManifest + }; + if (modelArtifacts.signature != null) { + modelTopologyAndWeightManifest.signature = modelArtifacts.signature; + } + if (modelArtifacts.userDefinedMetadata != null) { + modelTopologyAndWeightManifest.userDefinedMetadata = modelArtifacts.userDefinedMetadata; + } + if (modelArtifacts.modelInitializer != null) { + modelTopologyAndWeightManifest.modelInitializer = modelArtifacts.modelInitializer; + } + init2.body.append("model.json", new Blob([JSON.stringify(modelTopologyAndWeightManifest)], {type: JSON_TYPE}), "model.json"); + if (modelArtifacts.weightData != null) { + init2.body.append("model.weights.bin", new Blob([modelArtifacts.weightData], {type: OCTET_STREAM_MIME_TYPE}), "model.weights.bin"); + } + const response = await this.fetch(this.path, init2); + if (response.ok) { + return { + modelArtifactsInfo: getModelArtifactsInfoForJSON(modelArtifacts), + responses: [response] + }; + } else { + throw new Error(`BrowserHTTPRequest.save() failed due to HTTP response status ${response.status}.`); + } + } + async load() { + const modelConfigRequest = await this.fetch(this.path, this.requestInit); + if (!modelConfigRequest.ok) { + throw new Error(`Request to ${this.path} failed with status code ${modelConfigRequest.status}. Please verify this URL points to the model JSON of the model to load.`); + } + let modelConfig; + try { + modelConfig = await modelConfigRequest.json(); + } catch (e) { + let message = `Failed to parse model JSON of response from ${this.path}.`; + if (this.path.endsWith(".pb")) { + message += " Your path contains a .pb file extension. Support for .pb models have been removed in TensorFlow.js 1.0 in favor of .json models. You can re-convert your Python TensorFlow model using the TensorFlow.js 1.0 conversion scripts or you can convert your.pb models with the 'pb2json'NPM script in the tensorflow/tfjs-converter repository."; + } else { + message += " Please make sure the server is serving valid JSON for this request."; + } + throw new Error(message); + } + const modelTopology = modelConfig.modelTopology; + const weightsManifest = modelConfig.weightsManifest; + const generatedBy = modelConfig.generatedBy; + const convertedBy = modelConfig.convertedBy; + const format = modelConfig.format; + const signature = modelConfig.signature; + const userDefinedMetadata = modelConfig.userDefinedMetadata; + if (modelTopology == null && weightsManifest == null) { + throw new Error(`The JSON from HTTP path ${this.path} contains neither model topology or manifest for weights.`); + } + let weightSpecs; + let weightData; + if (weightsManifest != null) { + const results = await this.loadWeights(weightsManifest); + [weightSpecs, weightData] = results; + } + const artifacts = { + modelTopology, + weightSpecs, + weightData, + generatedBy, + convertedBy, + format + }; + if (signature != null) { + artifacts.signature = signature; + } + if (userDefinedMetadata != null) { + artifacts.userDefinedMetadata = userDefinedMetadata; + } + const initializer = modelConfig.modelInitializer; + if (initializer) { + artifacts.modelInitializer = initializer; + } + return artifacts; + } + async loadWeights(weightsManifest) { + const weightPath = Array.isArray(this.path) ? this.path[1] : this.path; + const [prefix, suffix] = parseUrl(weightPath); + const pathPrefix = this.weightPathPrefix || prefix; + const weightSpecs = []; + for (const entry of weightsManifest) { + weightSpecs.push(...entry.weights); + } + const fetchURLs = []; + const urlPromises = []; + for (const weightsGroup of weightsManifest) { + for (const path of weightsGroup.paths) { + if (this.weightUrlConverter != null) { + urlPromises.push(this.weightUrlConverter(path)); + } else { + fetchURLs.push(pathPrefix + path + suffix); + } + } + } + if (this.weightUrlConverter) { + fetchURLs.push(...await Promise.all(urlPromises)); + } + const buffers = await loadWeightsAsArrayBuffer(fetchURLs, { + requestInit: this.requestInit, + fetchFunc: this.fetch, + onProgress: this.onProgress + }); + return [weightSpecs, concatenateArrayBuffers(buffers)]; + } +}; +HTTPRequest.URL_SCHEME_REGEX = /^https?:\/\//; +function parseUrl(url) { + const lastSlash = url.lastIndexOf("/"); + const lastSearchParam = url.lastIndexOf("?"); + const prefix = url.substring(0, lastSlash); + const suffix = lastSearchParam > lastSlash ? url.substring(lastSearchParam) : ""; + return [prefix + "/", suffix]; +} +function isHTTPScheme(url) { + return url.match(HTTPRequest.URL_SCHEME_REGEX) != null; +} +var httpRouter = (url, loadOptions) => { + if (typeof fetch === "undefined" && (loadOptions == null || loadOptions.fetchFunc == null)) { + return null; + } else { + let isHTTP = true; + if (Array.isArray(url)) { + isHTTP = url.every((urlItem) => isHTTPScheme(urlItem)); + } else { + isHTTP = isHTTPScheme(url); + } + if (isHTTP) { + return http(url, loadOptions); + } + } + return null; +}; +IORouterRegistry.registerSaveRouter(httpRouter); +IORouterRegistry.registerLoadRouter(httpRouter); +function http(path, loadOptions) { + return new HTTPRequest(path, loadOptions); +} +function browserHTTPRequest(path, loadOptions) { + return http(path, loadOptions); +} +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +var PassthroughLoader = class { + constructor(modelArtifacts) { + this.modelArtifacts = modelArtifacts; + } + async load() { + return this.modelArtifacts; + } +}; +var PassthroughSaver = class { + constructor(saveHandler) { + this.saveHandler = saveHandler; + } + async save(modelArtifacts) { + return this.saveHandler(modelArtifacts); + } +}; +function fromMemory(modelArtifacts, weightSpecs, weightData, trainingConfig) { + if (arguments.length === 1) { + const isModelArtifacts = modelArtifacts.modelTopology != null || modelArtifacts.weightSpecs != null; + if (isModelArtifacts) { + return new PassthroughLoader(modelArtifacts); + } else { + console.warn("Please call tf.io.fromMemory() with only one argument. The argument should be of type ModelArtifacts. The multi-argument signature of tf.io.fromMemory() has been deprecated and will be removed in a future release."); + return new PassthroughLoader({modelTopology: modelArtifacts}); + } + } else { + console.warn("Please call tf.io.fromMemory() with only one argument. The argument should be of type ModelArtifacts. The multi-argument signature of tf.io.fromMemory() has been deprecated and will be removed in a future release."); + return new PassthroughLoader({ + modelTopology: modelArtifacts, + weightSpecs, + weightData, + trainingConfig + }); + } +} +function withSaveHandler(saveHandler) { + return new PassthroughSaver(saveHandler); +} +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +var math_exports = {}; +__export2(math_exports, { + confusionMatrix: () => confusionMatrix +}); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function matMul_(a, b, transposeA = false, transposeB = false) { + let $a = convertToTensor(a, "a", "matMul"); + let $b = convertToTensor(b, "b", "matMul"); + [$a, $b] = makeTypesMatch($a, $b); + const inputs = {a: $a, b: $b}; + const attrs = {transposeA, transposeB}; + return ENGINE.runKernel(BatchMatMul, inputs, attrs); +} +var matMul = op({matMul_}); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function oneHot_(indices, depth, onValue = 1, offValue = 0) { + if (depth < 2) { + throw new Error(`Error in oneHot: depth must be >=2, but it is ${depth}`); + } + const $indices = convertToTensor(indices, "indices", "oneHot", "int32"); + const inputs = {indices: $indices}; + const attrs = {depth, onValue, offValue}; + return ENGINE.runKernel(OneHot, inputs, attrs); +} +var oneHot = op({oneHot_}); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function transpose_(x, perm) { + const $x = convertToTensor(x, "x", "transpose"); + if (perm == null) { + perm = $x.shape.map((s, i) => i).reverse(); + } + assert($x.rank === perm.length, () => `Error in transpose: rank of input ${$x.rank} must match length of perm ${perm}.`); + perm.forEach((axis) => { + assert(axis >= 0 && axis < $x.rank, () => `All entries in 'perm' must be between 0 and ${$x.rank - 1} but got ${perm}`); + }); + if ($x.rank <= 1) { + return $x.clone(); + } + const inputs = {x: $x}; + const attrs = {perm}; + return ENGINE.runKernel(Transpose, inputs, attrs); +} +var transpose = op({transpose_}); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function confusionMatrix_(labels2, predictions, numClasses) { + const $labels = convertToTensor(labels2, "labels", "confusionMatrix"); + const $predictions = convertToTensor(predictions, "predictions", "confusionMatrix"); + assert(numClasses == null || numClasses > 0 && Number.isInteger(numClasses), () => `If provided, numClasses must be a positive integer, but got ${numClasses}`); + assert($labels.rank === 1, () => `Expected the rank of labels to be 1, but got ${$labels.rank}`); + assert($predictions.rank === 1, () => `Expected the rank of predictions to be 1, but got ${$predictions.rank}`); + assert($labels.shape[0] === $predictions.shape[0], () => `Mismatch in the number of examples: ${$labels.shape[0]} vs. ${$predictions.shape[0]}. Labels and predictions should have the same number of elements.`); + assert(numClasses > 0 && Number.isInteger(numClasses), () => `numClasses is required to be a positive integer, but got ${numClasses}`); + const oneHotLabels = oneHot(cast($labels, "int32"), numClasses); + const oneHotPredictions = oneHot(cast($predictions, "int32"), numClasses); + const oneHotLabelsT = transpose(oneHotLabels); + const product = matMul(oneHotLabelsT, oneHotPredictions); + return cast(product, "int32"); +} +var confusionMatrix = op({confusionMatrix_}); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +var browser_exports = {}; +__export2(browser_exports, { + fromPixels: () => fromPixels, + fromPixelsAsync: () => fromPixelsAsync, + toPixels: () => toPixels +}); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function tensor3d(values, shape, dtype) { + assertNonNull(values); + if (shape != null && shape.length !== 3) { + throw new Error("tensor3d() requires shape to have three numbers"); + } + const inferredShape = inferShape(values, dtype); + if (inferredShape.length !== 3 && inferredShape.length !== 1) { + throw new Error("tensor3d() requires values to be number[][][] or flat/TypedArray"); + } + if (inferredShape.length === 1 && shape == null) { + throw new Error("tensor3d() requires shape to be provided when `values` are a flat array"); + } + return makeTensor(values, shape, inferredShape, dtype); +} +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +var fromPixels2DContext; +function fromPixels_(pixels, numChannels = 3) { + if (numChannels > 4) { + throw new Error("Cannot construct Tensor with more than 4 channels from pixels."); + } + if (pixels == null) { + throw new Error("pixels passed to tf.browser.fromPixels() can not be null"); + } + let isPixelData2 = false; + let isImageData = false; + let isVideo = false; + let isImage = false; + let isCanvasLike = false; + let isImageBitmap = false; + if (pixels.data instanceof Uint8Array) { + isPixelData2 = true; + } else if (typeof ImageData !== "undefined" && pixels instanceof ImageData) { + isImageData = true; + } else if (typeof HTMLVideoElement !== "undefined" && pixels instanceof HTMLVideoElement) { + isVideo = true; + } else if (typeof HTMLImageElement !== "undefined" && pixels instanceof HTMLImageElement) { + isImage = true; + } else if (pixels.getContext != null) { + isCanvasLike = true; + } else if (typeof ImageBitmap !== "undefined" && pixels instanceof ImageBitmap) { + isImageBitmap = true; + } else { + throw new Error(`pixels passed to tf.browser.fromPixels() must be either an HTMLVideoElement, HTMLImageElement, HTMLCanvasElement, ImageData in browser, or OffscreenCanvas, ImageData in webworker or {data: Uint32Array, width: number, height: number}, but was ${pixels.constructor.name}`); + } + if (isVideo) { + const HAVE_CURRENT_DATA_READY_STATE = 2; + if (isVideo && pixels.readyState < HAVE_CURRENT_DATA_READY_STATE) { + throw new Error("The video element has not loaded data yet. Please wait for `loadeddata` event on the s5){let A=Cu*i,y=Array.from(e.slice(0,A)),g=Array.from(e.slice((o-Cu)*i,o*i));return n==="complex64"&&(y=Ru(y),g=Ru(g)),["["+y.map((w,b)=>Eu(w,a[b],n)).join(", ")+", ..., "+g.map((w,b)=>Eu(w,a[o-Cu+b],n)).join(", ")+"]"]}let m=n==="complex64"?Ru(e):Array.from(e);return["["+m.map((A,y)=>Eu(A,a[y],n)).join(", ")+"]"]}let c=t.slice(1),u=r.slice(1),h=r[0]*i,d=[];if(o>s5){for(let m=0;m`Length of values '${r}' does not match the size inferred by the shape '${this.size}'.`)}if(t==="complex64")throw new Error("complex64 dtype TensorBuffers are not supported. Please create a TensorBuffer for the real and imaginary parts separately and call tf.complex(real, imag).");this.values=n||Gg(t,this.size),this.strides=Xi(e)}set(e,...t){t.length===0&&(t=[0]),M(t.length===this.rank,()=>`The number of provided coordinates (${t.length}) must match the rank (${this.rank})`);let n=this.locToIndex(t);this.values[n]=e}get(...e){e.length===0&&(e=[0]);let t=0;for(let r of e){if(r<0||r>=this.shape[t]){let a=`Requested out of range element at ${e}. Buffer shape=${this.shape}`;throw new Error(a)}t++}let n=e[e.length-1];for(let r=0;rnd(n))}catch(n){throw new Error("Failed to decode the string bytes into utf-8. To get the original bytes, call tensor.bytes().")}}return e}dataSync(){this.throwIfDisposed();let e=Tr().readSync(this.dataId);if(this.dtype==="string")try{return e.map(t=>nd(t))}catch(t){throw new Error("Failed to decode the string bytes into utf-8. To get the original bytes, call tensor.bytes().")}return e}async bytes(){this.throwIfDisposed();let e=await Tr().read(this.dataId);return this.dtype==="string"?e:new Uint8Array(e.buffer)}dispose(){this.isDisposed||(Tr().disposeTensor(this),this.isDisposedInternal=!0)}get isDisposed(){return this.isDisposedInternal}throwIfDisposed(){if(this.isDisposed)throw new Error("Tensor is disposed.")}print(e=!1){return Jo.print(this,e)}clone(){return this.throwIfDisposed(),Jo.clone(this)}toString(e=!1){let t=this.dataSync();return Ek(t,this.shape,this.dtype,e)}cast(e){return this.throwIfDisposed(),Jo.cast(this,e)}variable(e=!0,t,n){return this.throwIfDisposed(),Tr().makeVariable(this,e,t,n)}};Object.defineProperty(Ue,Symbol.hasInstance,{value:e=>!!e&&e.data!=null&&e.dataSync!=null&&e.throwIfDisposed!=null});function Z(){return lf("Tensor",()=>Ue)}Z();var Mu=class extends Ue{constructor(e,t,n,r){super(e.shape,e.dtype,e.dataId,r);this.trainable=t,this.name=n}assign(e){if(e.dtype!==this.dtype)throw new Error(`dtype of the new value (${e.dtype}) and previous value (${this.dtype}) must match`);if(!Jr(e.shape,this.shape))throw new Error(`shape of the new value (${e.shape}) and previous value (${this.shape}) must match`);Tr().disposeTensor(this),this.dataId=e.dataId,Tr().incRef(this,null)}dispose(){Tr().disposeVariable(this),this.isDisposedInternal=!0}};Object.defineProperty(Mu,Symbol.hasInstance,{value:e=>e instanceof Ue&&e.assign!=null&&e.assign instanceof Function});var fr={};Oe(fr,{assertTypesMatch:()=>o5,getTensorsInContainer:()=>df,isTensorInList:()=>Dk,makeTypesMatch:()=>bt});var pf;(function(e){e.R0="R0",e.R1="R1",e.R2="R2",e.R3="R3",e.R4="R4",e.R5="R5",e.R6="R6"})(pf||(pf={}));var ff;(function(e){e.float32="float32",e.int32="int32",e.bool="int32",e.complex64="complex64"})(ff||(ff={}));var mf;(function(e){e.float32="float32",e.int32="int32",e.bool="bool",e.complex64="complex64"})(mf||(mf={}));var Af;(function(e){e.float32="float32",e.int32="float32",e.bool="float32",e.complex64="complex64"})(Af||(Af={}));var yf;(function(e){e.float32="complex64",e.int32="complex64",e.bool="complex64",e.complex64="complex64"})(yf||(yf={}));var Ok={float32:Af,int32:ff,bool:mf,complex64:yf};function nr(e,t){if(e==="string"||t==="string"){if(e==="string"&&t==="string")return"string";throw new Error(`Can not upcast ${e} with ${t}`)}return Ok[e][t]}function ad(e){return nr(e,"int32")}function bt(e,t){if(e.dtype===t.dtype)return[e,t];let n=nr(e.dtype,t.dtype);return[e.cast(n),t.cast(n)]}function o5(e,t){M(e.dtype===t.dtype,()=>`The dtypes of the first(${e.dtype}) and second(${t.dtype}) input must match`)}function Dk(e,t){return t.some(n=>n.id===e.id)}function df(e){let t=[],n=new Set;return l5(e,t,n),t}function l5(e,t,n){if(e==null)return;if(e instanceof Ue){t.push(e);return}if(!zk(e))return;let r=e;for(let a in r){let s=r[a];n.has(s)||(n.add(s),l5(s,t,n))}}function zk(e){return Array.isArray(e)||typeof e=="object"}function gf(e){return e.kernelName!=null}var u5=class{constructor(){this.registeredVariables={},this.nextTapeNodeId=0,this.numBytes=0,this.numTensors=0,this.numStringTensors=0,this.numDataBuffers=0,this.gradientDepth=0,this.kernelDepth=0,this.scopeStack=[],this.numDataMovesStack=[],this.nextScopeId=0,this.tensorInfo=new WeakMap,this.profiling=!1,this.activeProfile={newBytes:0,newTensors:0,peakBytes:0,kernels:[],result:null,get kernelNames(){return Array.from(new Set(this.kernels.map(e=>e.name)))}}}dispose(){for(let e in this.registeredVariables)this.registeredVariables[e].dispose()}},Fu=class{constructor(e){this.ENV=e,this.registry={},this.registryFactory={},this.pendingBackendInitId=0,this.state=new u5}async ready(){if(this.pendingBackendInit!=null)return this.pendingBackendInit.then(()=>{});if(this.backendInstance!=null)return;let e=this.getSortedBackends();for(let t=0;t{e.setupFunc!=null&&e.setupFunc(this.backendInstance)})}disposeRegisteredKernels(e){Yo(e).forEach(t=>{t.disposeFunc!=null&&t.disposeFunc(this.registry[e])})}initializeBackend(e){let t=this.registryFactory[e];if(t==null)throw new Error(`Cannot initialize backend ${e}, no registration found.`);try{let n=t.factory();if(n&&!(n instanceof iu)&&typeof n.then=="function"){let r=++this.pendingBackendInitId,a=n.then(s=>r(rthis.registryFactory[t].priority-this.registryFactory[e].priority)}initializeBackendsAndReturnBest(){let e=this.getSortedBackends();for(let t=0;tthis.startScope(n),()=>this.endScope(r),()=>(r=t(),r instanceof Promise&&console.error("Cannot return a Promise inside of tidy."),r))}scopedRun(e,t,n){e();try{let r=n();return t(),r}catch(r){throw t(),r}}nextTensorId(){return Fu.nextTensorId++}nextVariableId(){return Fu.nextVariableId++}clone(e){let t=$.runKernel(vs,{x:e}),n={x:e},r=s=>({x:()=>{let i="float32",o={x:s},l={dtype:i};return $.runKernel(cs,o,l)}}),a=[];return this.addTapeNode(this.state.activeScope.name,n,[t],r,a,{}),t}runKernel(e,t,n){if(ed(e,this.backendName)==null)throw new Error(`Kernel '${e}' not registered for backend '${this.backendName}'`);return this.runKernelFunc({kernelName:e,inputs:t,attrs:n})}shouldCheckForMemLeaks(){return this.ENV.getBool("IS_TEST")}checkKernelForMemLeak(e,t,n){let r=this.backend.numDataIds(),a=0;n.forEach(o=>{a+=o.dtype==="complex64"?3:1});let s=this.state.numDataMovesStack[this.state.numDataMovesStack.length-1],i=r-t-a-s;if(i>0)throw new Error(`Backend '${this.backendName}' has an internal memory leak (${i} data ids) after running '${e}'`)}runKernelFunc(e){let t,n=[],r=this.isTapeOn(),a=this.state.numBytes,s=this.state.numTensors;this.shouldCheckForMemLeaks()&&this.state.numDataMovesStack.push(0);let i;this.backendName==null&&this.backend;let o,l=gf(e)?e.kernelName:this.state.activeScope!=null?this.state.activeScope.name:"";if(gf(e)){let{kernelName:p,inputs:f,attrs:m}=e;this.backendName==null&&this.backend;let A=ed(p,this.backendName);M(A!=null,()=>`Cannot find registered kernel '${p}' for backend '${this.backendName}'`),i=()=>{let y=this.backend.numDataIds();o=A.kernelFunc({inputs:f,attrs:m,backend:this.backend});let g=Array.isArray(o)?o:[o];this.shouldCheckForMemLeaks()&&this.checkKernelForMemLeak(p,y,g);let w=g.map(b=>{if(b.rank!=null)return b;let{dataId:_,shape:x,dtype:N}=b;return this.makeTensorFromDataId(_,x,N)});if(r){let b=this.getTensorsForGradient(p,f,w);n=this.saveTensorsForBackwardMode(b)}return w}}else{let{forwardFunc:p}=e,f=m=>{!r||(n=m.map(A=>this.keep(this.clone(A))))};i=()=>{let m=this.backend.numDataIds();o=this.tidy(()=>p(this.backend,f));let A=Array.isArray(o)?o:[o];return this.shouldCheckForMemLeaks()&&this.checkKernelForMemLeak(l,m,A),A}}let{inputs:c,attrs:u}=e,h=gf(e)?null:e.backwardsFunc,d;return this.scopedRun(()=>this.state.kernelDepth++,()=>this.state.kernelDepth--,()=>{!this.ENV.getBool("DEBUG")&&!this.state.profiling?t=i():(d=this.profiler.profileKernel(l,c,()=>i()),this.ENV.getBool("DEBUG")&&this.profiler.logKernelProfile(d),t=d.outputs)}),r&&this.addTapeNode(l,c,t,h,n,u),this.state.profiling&&this.state.activeProfile.kernels.push({name:l,bytesAdded:this.state.numBytes-a,totalBytesSnapshot:this.state.numBytes,tensorsAdded:this.state.numTensors-s,totalTensorsSnapshot:this.state.numTensors,inputShapes:Object.keys(c).map(p=>c[p]!=null?c[p].shape:null),outputShapes:t.map(p=>p.shape),kernelTimeMs:d.timeMs,extraInfo:d.extraInfo}),Array.isArray(o)?t:t[0]}saveTensorsForBackwardMode(e){return e.map(t=>this.keep(this.clone(t)))}getTensorsForGradient(e,t,n){let r=cf(e);if(r!=null){let a=r.inputsToSave||[],s=r.outputsToSave||[],i;r.saveAllInputs?(M(Array.isArray(t),()=>"saveAllInputs is true, expected inputs to be an array."),i=Object.keys(t).map(l=>t[l])):i=a.map(l=>t[l]);let o=n.filter((l,c)=>s[c]);return i.concat(o)}return[]}makeTensor(e,t,n,r){if(e==null)throw new Error("Values passed to engine.makeTensor() are null");n=n||"float32",r=r||this.backend;let a=e;n==="string"&&wa(e[0])&&(a=e.map(o=>Tu(o)));let s=r.write(a,t,n),i=new Ue(t,n,s,this.nextTensorId());if(this.trackTensor(i,r),n==="string"){let o=this.state.tensorInfo.get(s),l=Kg(a);this.state.numBytes+=l-o.bytes,o.bytes=l}return i}makeTensorFromDataId(e,t,n,r){n=n||"float32";let a=new Ue(t,n,e,this.nextTensorId());return this.trackTensor(a,r),a}makeVariable(e,t=!0,n,r){n=n||this.nextVariableId().toString(),r!=null&&r!==e.dtype&&(e=e.cast(r));let a=new Mu(e,t,n,this.nextTensorId());if(this.state.registeredVariables[a.name]!=null)throw new Error(`Variable with name ${a.name} was already registered`);return this.state.registeredVariables[a.name]=a,this.incRef(a,this.backend),a}trackTensor(e,t){this.state.numTensors++,e.dtype==="string"&&this.state.numStringTensors++;let n=0;e.dtype!=="complex64"&&e.dtype!=="string"&&(n=e.size*nf(e.dtype)),this.state.numBytes+=n,this.state.tensorInfo.has(e.dataId)||(this.state.numDataBuffers++,this.state.tensorInfo.set(e.dataId,{backend:t||this.backend,dtype:e.dtype,shape:e.shape,bytes:n})),e instanceof Mu||this.track(e)}incRef(e,t){this.trackTensor(e,t),this.backend.incRef(e.dataId)}removeDataId(e,t){this.state.tensorInfo.has(e)&&this.state.tensorInfo.get(e).backend===t&&(this.state.tensorInfo.delete(e),this.state.numDataBuffers--)}disposeTensor(e){if(!this.state.tensorInfo.has(e.dataId))return;let t=this.state.tensorInfo.get(e.dataId);if(this.state.numTensors--,e.dtype==="string"&&(this.state.numStringTensors--,this.state.numBytes-=t.bytes),e.dtype!=="complex64"&&e.dtype!=="string"){let n=e.size*nf(e.dtype);this.state.numBytes-=n}t.backend.disposeData(e.dataId)&&this.removeDataId(e.dataId,t.backend)}disposeVariables(){for(let e in this.state.registeredVariables){let t=this.state.registeredVariables[e];this.disposeVariable(t)}}disposeVariable(e){this.disposeTensor(e),this.state.registeredVariables[e.name]!=null&&delete this.state.registeredVariables[e.name]}memory(){let e=this.backend.memory();return e.numTensors=this.state.numTensors,e.numDataBuffers=this.state.numDataBuffers,e.numBytes=this.state.numBytes,this.state.numStringTensors>0&&(e.unreliable=!0,e.reasons==null&&(e.reasons=[]),e.reasons.push("Memory usage by string tensors is approximate (2 bytes per character)")),e}async profile(e){this.state.profiling=!0;let t=this.state.numBytes,n=this.state.numTensors;this.state.activeProfile.kernels=[],this.state.activeProfile.result=await e(),this.state.profiling=!1,this.state.activeProfile.peakBytes=Math.max(...this.state.activeProfile.kernels.map(r=>r.totalBytesSnapshot)),this.state.activeProfile.newBytes=this.state.numBytes-t,this.state.activeProfile.newTensors=this.state.numTensors-n;for(let r of this.state.activeProfile.kernels)r.kernelTimeMs=await r.kernelTimeMs,r.extraInfo=await r.extraInfo;return this.state.activeProfile}isTapeOn(){return this.state.gradientDepth>0&&this.state.kernelDepth===0}addTapeNode(e,t,n,r,a,s){let i={id:this.state.nextTapeNodeId++,kernelName:e,inputs:t,outputs:n,saved:a},o=cf(e);o!=null&&(r=o.gradFunc),r!=null&&(i.gradient=l=>(l=l.map((c,u)=>{if(c==null){let h=n[u],d=bh(h.size,h.dtype);return this.makeTensor(d,h.shape,h.dtype)}return c}),r(l.length>1?l:l[0],a,s))),this.state.activeTape.push(i)}keep(e){return e.kept=!0,e}startTape(){this.state.gradientDepth===0&&(this.state.activeTape=[]),this.state.gradientDepth++}endTape(){this.state.gradientDepth--}startScope(e){let t={track:[],name:"unnamed scope",id:this.state.nextScopeId++};e&&(t.name=e),this.state.scopeStack.push(t),this.state.activeScope=t}endScope(e){let t=df(e),n=new Set(t.map(a=>a.id));for(let a=0;a{!a.kept&&a.scopeId===r.id&&this.track(a)})}gradients(e,t,n,r=!1){if(M(t.length>0,()=>"gradients() received an empty list of xs."),n!=null&&n.dtype!=="float32")throw new Error(`dy must have 'float32' dtype, but has '${n.dtype}'`);let a=this.scopedRun(()=>this.startTape(),()=>this.endTape(),()=>this.tidy("forward",e));M(a instanceof Ue,()=>"The result y returned by f() must be a tensor.");let s=Sk(this.state.activeTape,t,a);if(!r&&s.length===0&&t.length>0)throw new Error("Cannot compute gradient of y=f(x) with respect to x. Make sure that the f you passed encloses all operations that lead from x to y.");return this.tidy("backward",()=>{let i={};i[a.id]=n==null?Pk(a.shape):n,Tk(i,s,l=>this.tidy(l),Lk);let o=t.map(l=>i[l.id]);return this.state.gradientDepth===0&&(this.state.activeTape.forEach(l=>{for(let c of l.saved)c.dispose()}),this.state.activeTape=null),{value:a,grads:o}})}customGrad(e){return M(ba(e),()=>"The f passed in customGrad(f) must be a function."),(...t)=>{M(t.every(i=>i instanceof Ue),()=>"The args passed in customGrad(f)(x1, x2,...) must all be tensors");let n,r={};t.forEach((i,o)=>{r[o]=i});let a=(i,o)=>(n=e(...t,o),M(n.value instanceof Ue,()=>"The function f passed in customGrad(f) must return an object where `obj.value` is a tensor"),M(ba(n.gradFunc),()=>"The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function."),n.value),s=(i,o)=>{let l=n.gradFunc(i,o),c=Array.isArray(l)?l:[l];M(c.length===t.length,()=>"The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function that returns the same number of tensors as inputs passed to f(...)."),M(c.every(h=>h instanceof Ue),()=>"The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function that returns a list of only tensors.");let u={};return c.forEach((h,d)=>{u[d]=()=>h}),u};return this.runKernelFunc({forwardFunc:a,backwardsFunc:s,inputs:r})}}readSync(e){return this.state.tensorInfo.get(e).backend.readSync(e)}read(e){return this.state.tensorInfo.get(e).backend.read(e)}async time(e){let t=Su(),n=await this.backend.time(e);return n.wallMs=Su()-t,n}track(e){return this.state.activeScope!=null&&(e.scopeId=this.state.activeScope.id,this.state.activeScope.track.push(e)),e}get registeredVariables(){return this.state.registeredVariables}reset(){this.pendingBackendInitId++,this.state.dispose(),this.ENV.reset(),this.state=new u5;for(let e in this.registry)this.disposeRegisteredKernels(e),this.registry[e].dispose(),delete this.registry[e];this.backendName=null,this.backendInstance=null,this.pendingBackendInit=null}};Fu.nextTensorId=0;Fu.nextVariableId=0;function Pk(e){let t=rf(Ft(e),"float32");return $.makeTensor(t,e,"float32")}function c5(){let e=t5();if(e._tfengine==null){let t=new e5(e);e._tfengine=new Fu(t)}return mk(e._tfengine.ENV),Mk(()=>e._tfengine),e._tfengine}var $=c5();function Lk(e,t){let n={a:e,b:t};return $.runKernel(_a,n)}var $u={};Oe($u,{isBrowser:()=>h5,isMobile:()=>Wk});function Bk(){return typeof navigator!="undefined"&&navigator!=null}function Wk(){if(Bk()){let e=navigator.userAgent||navigator.vendor||window.opera;return/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(e)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(e.substr(0,4))}return!1}function h5(){return typeof window!="undefined"&&window.document!=null||typeof WorkerGlobalScope!="undefined"}var mr=J();mr.registerFlag("DEBUG",()=>!1,e=>{e&&console.warn("Debugging mode is ON. The output of every math call will be downloaded to CPU and checked for NaNs. This significantly impacts performance.")});mr.registerFlag("IS_BROWSER",()=>h5());mr.registerFlag("IS_NODE",()=>typeof process!="undefined"&&typeof process.versions!="undefined"&&typeof process.versions.node!="undefined");mr.registerFlag("IS_CHROME",()=>typeof navigator!="undefined"&&navigator!=null&&navigator.userAgent!=null&&/Chrome/.test(navigator.userAgent)&&/Google Inc/.test(navigator.vendor));mr.registerFlag("PROD",()=>!1);mr.registerFlag("TENSORLIKE_CHECK_SHAPE_CONSISTENCY",()=>mr.getBool("DEBUG"));mr.registerFlag("DEPRECATION_WARNINGS_ENABLED",()=>!0);mr.registerFlag("IS_TEST",()=>!1);mr.registerFlag("CHECK_COMPUTATION_FOR_ERRORS",()=>!0);mr.registerFlag("WRAP_TO_IMAGEBITMAP",()=>!1);function Cr(e,t){let n=e;if(nn(e))return t==="string"?[]:[e.length];if(!Array.isArray(e))return[];let r=[];for(;Array.isArray(n)||nn(n)&&t!=="string";)r.push(n.length),n=n[0];return Array.isArray(e)&&J().getBool("TENSORLIKE_CHECK_SHAPE_CONSISTENCY")&&d5(e,r,[]),r}function d5(e,t,n){if(n=n||[],!Array.isArray(e)&&!nn(e)){M(t.length===0,()=>`Element arr[${n.join("][")}] is a primitive, but should be an array/TypedArray of ${t[0]} elements`);return}M(t.length>0,()=>`Element arr[${n.join("][")}] should be a primitive, but is an array of ${e.length} elements`),M(e.length===t[0],()=>`Element arr[${n.join("][")}] should have ${t[0]} elements, but has ${e.length} elements`);let r=t.slice(1);for(let a=0;a=0&&(a=r),p5(r,a,t,n),e==null||!nn(e)&&!Array.isArray(e)&&typeof e!="number"&&typeof e!="boolean"&&typeof e!="string"){let o=e==null?"null":e.constructor.name;throw new Error(`Argument '${t}' passed to '${n}' must be a Tensor or TensorLike, but got '${o}'`)}let s=Cr(e,a);!nn(e)&&!Array.isArray(e)&&(e=[e]);let i=a!=="string"?td(e,a):ss(e,[],!0);return $.makeTensor(i,s,a)}function Du(e,t,n,r="numeric"){if(!Array.isArray(e))throw new Error(`Argument ${t} passed to ${n} must be a \`Tensor[]\` or \`TensorLike[]\``);return e.map((a,s)=>E(a,`${t}[${s}]`,n,r))}var f5="__op";function D(e){let t=Object.keys(e);if(t.length!==1)throw new Error(`Please provide an object with a single key (operation name) mapping to a function. Got an object with ${t.length} keys.`);let n=t[0],r=e[n];n.endsWith("_")&&(n=n.substring(0,n.length-1)),n=n+f5;let a=(...s)=>{$.startScope(n);try{let i=r(...s);return sf(i)&&console.error("Cannot return a Promise inside of tidy."),$.endScope(i),i}catch(i){throw $.endScope(null),i}};return Object.defineProperty(a,"name",{value:n,configurable:!0}),a}function Vk(e,t){let n=E(e,"real","complex"),r=E(t,"imag","complex");tn(n.shape,r.shape,`real and imag shapes, ${n.shape} and ${r.shape}, must match in call to tf.complex().`);let a={real:n,imag:r};return $.runKernel(Sh,a)}var Na=D({complex_:Vk});function Sa(e,t,n,r){if(r==null&&(r=xh(e)),r==="complex64")throw new Error("Cannot construct a complex64 tensor directly. Please use tf.complex(real, imag).");if(!nn(e)&&!Array.isArray(e)&&typeof e!="number"&&typeof e!="boolean"&&typeof e!="string")throw new Error("values passed to tensor(values) must be a number/boolean/string or an array of numbers/booleans/strings, or a TypedArray");if(t!=null){af(t);let a=Ft(t),s=Ft(n);M(a===s,()=>`Based on the provided shape, [${t}], the tensor should have ${a} values but has ${s}`);for(let i=0;i`Error creating a new Tensor. Inferred shape (${n}) does not match the provided shape (${t}). `)}}return!nn(e)&&!Array.isArray(e)&&(e=[e]),t=t||n,e=r!=="string"?td(e,r):ss(e,[],!0),$.makeTensor(e,t,r)}function Ar(e,t,n){let r=Cr(e,n);return Sa(e,t,r,n)}var xf={float32:4,float16:2,int32:4,uint16:2,uint8:1,bool:1,complex64:8},sd=4;async function jk(e,t){let n=[],r=[],a=Array.isArray(e)?e.map(i=>i.name):Object.keys(e);for(let i=0;i{let d=await l.bytes(),p=d.reduce((A,y)=>A+y.length,0)+sd*d.length,f=new Uint8Array(p),m=0;for(let A=0;A{if(t+=s.byteLength,n.push(s.byteLength===s.buffer.byteLength?s:new s.constructor(s)),!(s instanceof Float32Array||s instanceof Int32Array||s instanceof Uint8Array))throw new Error(`Unsupported TypedArray subtype: ${s.constructor.name}`)});let r=new Uint8Array(t),a=0;return n.forEach(s=>{r.set(new Uint8Array(s.buffer),a),a+=s.byteLength}),r.buffer}var wf=typeof Buffer!="undefined"&&(typeof Blob=="undefined"||typeof atob=="undefined"||typeof btoa=="undefined");function A5(e){return wf?Buffer.byteLength(e):new Blob([e]).size}function Gk(e){if(wf)return Buffer.from(e).toString("base64");let t=new Uint8Array(e),n="";for(let r=0,a=t.length;r{t+=a.byteLength});let n=new Uint8Array(t),r=0;return e.forEach(a=>{n.set(new Uint8Array(a),r),r+=a.byteLength}),n.buffer}function y5(e){let t="/";for(e=e.trim();e.endsWith(t);)e=e.slice(0,e.length-1);let n=e.split(t);return n[n.length-1]}function Ou(e){if(e.modelTopology instanceof ArrayBuffer)throw new Error("Expected JSON model topology, received ArrayBuffer.");return{dateSaved:new Date,modelTopologyType:"JSON",modelTopologyBytes:e.modelTopology==null?0:A5(JSON.stringify(e.modelTopology)),weightSpecsBytes:e.weightSpecs==null?0:A5(JSON.stringify(e.weightSpecs)),weightDataBytes:e.weightData==null?0:e.weightData.byteLength}}function Xk(){let e=n=>{let r=n<<13,a=0;for(;(r&8388608)==0;)a-=8388608,r<<=1;return r&=~8388608,a+=947912704,r|a},t=new Uint32Array(2048);t[0]=0;for(let n=1;n<1024;n++)t[n]=e(n);for(let n=1024;n<2048;n++)t[n]=939524096+(n-1024<<13);return t}function Kk(){let e=new Uint32Array(64);e[0]=0,e[31]=1199570944,e[32]=2147483648,e[63]=3347054592;for(let t=1;t<31;t++)e[t]=t<<23;for(let t=33;t<63;t++)e[t]=2147483648+(t-32<<23);return e}function Zk(){let e=new Uint32Array(64);for(let t=0;t<64;t++)e[t]=1024;return e[0]=e[32]=0,e}function Hk(){let e=Xk(),t=Kk(),n=Zk();return r=>{let a=new ArrayBuffer(4*r.length),s=new Uint32Array(a);for(let i=0;i>10]+(o&1023)]+t[o>>10];s[i]=l}return new Float32Array(a)}}var Nt=class{constructor(){this.saveRouters=[],this.loadRouters=[]}static getInstance(){return Nt.instance==null&&(Nt.instance=new Nt),Nt.instance}static registerSaveRouter(e){Nt.getInstance().saveRouters.push(e)}static registerLoadRouter(e){Nt.getInstance().loadRouters.push(e)}static getSaveHandlers(e){return Nt.getHandlers(e,"save")}static getLoadHandlers(e,t){return Nt.getHandlers(e,"load",t)}static getHandlers(e,t,n){let r=[];return(t==="load"?Nt.getInstance().loadRouters:Nt.getInstance().saveRouters).forEach(a=>{let s=a(e,n);s!==null&&r.push(s)}),r}},Yk=e=>Nt.registerSaveRouter(e),Jk=e=>Nt.registerLoadRouter(e),Qk=e=>Nt.getSaveHandlers(e),e9=(e,t)=>Nt.getLoadHandlers(e,t),_f="tensorflowjs",vf=1,ni="models_store",Ta="model_info_store";function g5(){if(!J().getBool("IS_BROWSER"))throw new Error("Failed to obtain IndexedDB factory because the current environmentis not a web browser.");let e=typeof window=="undefined"?self:window,t=e.indexedDB||e.mozIndexedDB||e.webkitIndexedDB||e.msIndexedDB||e.shimIndexedDB;if(t==null)throw new Error("The current browser does not appear to support IndexedDB.");return t}function kf(e){let t=e.result;t.createObjectStore(ni,{keyPath:"modelPath"}),t.createObjectStore(Ta,{keyPath:"modelPath"})}var ri=class{constructor(e){if(this.indexedDB=g5(),e==null||!e)throw new Error("For IndexedDB, modelPath must not be null, undefined or empty.");this.modelPath=e}async save(e){if(e.modelTopology instanceof ArrayBuffer)throw new Error("BrowserLocalStorage.save() does not support saving model topology in binary formats yet.");return this.databaseAction(this.modelPath,e)}async load(){return this.databaseAction(this.modelPath)}databaseAction(e,t){return new Promise((n,r)=>{let a=this.indexedDB.open(_f,vf);a.onupgradeneeded=()=>kf(a),a.onsuccess=()=>{let s=a.result;if(t==null){let i=s.transaction(ni,"readonly"),o=i.objectStore(ni).get(this.modelPath);o.onsuccess=()=>{if(o.result==null)return s.close(),r(new Error(`Cannot find model with path '${this.modelPath}' in IndexedDB.`));n(o.result.modelArtifacts)},o.onerror=l=>(s.close(),r(o.error)),i.oncomplete=()=>s.close()}else{let i=Ou(t),o=s.transaction(Ta,"readwrite"),l=o.objectStore(Ta),c=l.put({modelPath:this.modelPath,modelArtifactsInfo:i}),u;c.onsuccess=()=>{u=s.transaction(ni,"readwrite");let h=u.objectStore(ni).put({modelPath:this.modelPath,modelArtifacts:t,modelArtifactsInfo:i});h.onsuccess=()=>n({modelArtifactsInfo:i}),h.onerror=d=>{l=o.objectStore(Ta);let p=l.delete(this.modelPath);p.onsuccess=()=>(s.close(),r(h.error)),p.onerror=f=>(s.close(),r(h.error))}},c.onerror=h=>(s.close(),r(c.error)),o.oncomplete=()=>{u==null?s.close():u.oncomplete=()=>s.close()}}},a.onerror=s=>r(a.error)})}};ri.URL_SCHEME="indexeddb://";var x5=e=>J().getBool("IS_BROWSER")&&!Array.isArray(e)&&e.startsWith(ri.URL_SCHEME)?t9(e.slice(ri.URL_SCHEME.length)):null;Nt.registerSaveRouter(x5);Nt.registerLoadRouter(x5);function t9(e){return new ri(e)}function n9(e){return e.startsWith(ri.URL_SCHEME)?e.slice(ri.URL_SCHEME.length):e}var r9=class{constructor(){this.indexedDB=g5()}async listModels(){return new Promise((e,t)=>{let n=this.indexedDB.open(_f,vf);n.onupgradeneeded=()=>kf(n),n.onsuccess=()=>{let r=n.result,a=r.transaction(Ta,"readonly"),s=a.objectStore(Ta).getAll();s.onsuccess=()=>{let i={};for(let o of s.result)i[o.modelPath]=o.modelArtifactsInfo;e(i)},s.onerror=i=>(r.close(),t(s.error)),a.oncomplete=()=>r.close()},n.onerror=r=>t(n.error)})}async removeModel(e){return e=n9(e),new Promise((t,n)=>{let r=this.indexedDB.open(_f,vf);r.onupgradeneeded=()=>kf(r),r.onsuccess=()=>{let a=r.result,s=a.transaction(Ta,"readwrite"),i=s.objectStore(Ta),o=i.get(e),l;o.onsuccess=()=>{if(o.result==null)return a.close(),n(new Error(`Cannot find model with path '${e}' in IndexedDB.`));{let c=i.delete(e),u=()=>{l=a.transaction(ni,"readwrite");let h=l.objectStore(ni).delete(e);h.onsuccess=()=>t(o.result.modelArtifactsInfo),h.onerror=d=>n(o.error)};c.onsuccess=u,c.onerror=h=>(u(),a.close(),n(o.error))}},o.onerror=c=>(a.close(),n(o.error)),s.oncomplete=()=>{l==null?a.close():l.oncomplete=()=>a.close()}},r.onerror=a=>n(r.error)})}},Qr="/",Qo="tensorflowjs_models",w5="info",a9="model_topology",s9="weight_specs",i9="weight_data",o9="model_metadata";function b5(e){return{info:[Qo,e,w5].join(Qr),topology:[Qo,e,a9].join(Qr),weightSpecs:[Qo,e,s9].join(Qr),weightData:[Qo,e,i9].join(Qr),modelMetadata:[Qo,e,o9].join(Qr)}}function l9(e){let t=e.split(Qr);if(t.length<3)throw new Error(`Invalid key format: ${e}`);return t.slice(1,t.length-1).join(Qr)}function u9(e){return e.startsWith(ai.URL_SCHEME)?e.slice(ai.URL_SCHEME.length):e}var ai=class{constructor(e){if(!J().getBool("IS_BROWSER")||typeof window=="undefined"||typeof window.localStorage=="undefined")throw new Error("The current environment does not support local storage.");if(this.LS=window.localStorage,e==null||!e)throw new Error("For local storage, modelPath must not be null, undefined or empty.");this.modelPath=e,this.keys=b5(this.modelPath)}async save(e){if(e.modelTopology instanceof ArrayBuffer)throw new Error("BrowserLocalStorage.save() does not support saving model topology in binary formats yet.");{let t=JSON.stringify(e.modelTopology),n=JSON.stringify(e.weightSpecs),r=Ou(e);try{this.LS.setItem(this.keys.info,JSON.stringify(r)),this.LS.setItem(this.keys.topology,t),this.LS.setItem(this.keys.weightSpecs,n),this.LS.setItem(this.keys.weightData,Gk(e.weightData));let a={format:e.format,generatedBy:e.generatedBy,convertedBy:e.convertedBy};return e.signature!=null&&(a.signature=e.signature),e.userDefinedMetadata!=null&&(a.userDefinedMetadata=e.userDefinedMetadata),e.modelInitializer!=null&&(a.modelInitializer=e.modelInitializer),this.LS.setItem(this.keys.modelMetadata,JSON.stringify(a)),{modelArtifactsInfo:r}}catch(a){throw this.LS.removeItem(this.keys.info),this.LS.removeItem(this.keys.topology),this.LS.removeItem(this.keys.weightSpecs),this.LS.removeItem(this.keys.weightData),this.LS.removeItem(this.keys.modelMetadata),new Error(`Failed to save model '${this.modelPath}' to local storage: size quota being exceeded is a possible cause of this failure: modelTopologyBytes=${r.modelTopologyBytes}, weightSpecsBytes=${r.weightSpecsBytes}, weightDataBytes=${r.weightDataBytes}.`)}}}async load(){let e=JSON.parse(this.LS.getItem(this.keys.info));if(e==null)throw new Error(`In local storage, there is no model with name '${this.modelPath}'`);if(e.modelTopologyType!=="JSON")throw new Error("BrowserLocalStorage does not support loading non-JSON model topology yet.");let t={},n=JSON.parse(this.LS.getItem(this.keys.topology));if(n==null)throw new Error(`In local storage, the topology of model '${this.modelPath}' is missing.`);t.modelTopology=n;let r=JSON.parse(this.LS.getItem(this.keys.weightSpecs));if(r==null)throw new Error(`In local storage, the weight specs of model '${this.modelPath}' are missing.`);t.weightSpecs=r;let a=this.LS.getItem(this.keys.modelMetadata);if(a!=null){let i=JSON.parse(a);t.format=i.format,t.generatedBy=i.generatedBy,t.convertedBy=i.convertedBy,i.signature!=null&&(t.signature=i.signature),i.userDefinedMetadata!=null&&(t.userDefinedMetadata=i.userDefinedMetadata),i.modelInitializer!=null&&(t.modelInitializer=i.modelInitializer)}let s=this.LS.getItem(this.keys.weightData);if(s==null)throw new Error(`In local storage, the binary weight values of model '${this.modelPath}' are missing.`);return t.weightData=qk(s),t}};ai.URL_SCHEME="localstorage://";var _5=e=>J().getBool("IS_BROWSER")&&!Array.isArray(e)&&e.startsWith(ai.URL_SCHEME)?c9(e.slice(ai.URL_SCHEME.length)):null;Nt.registerSaveRouter(_5);Nt.registerLoadRouter(_5);function c9(e){return new ai(e)}var h9=class{constructor(){M(J().getBool("IS_BROWSER"),()=>"Current environment is not a web browser"),M(typeof window=="undefined"||typeof window.localStorage!="undefined",()=>"Current browser does not appear to support localStorage"),this.LS=window.localStorage}async listModels(){let e={},t=Qo+Qr,n=Qr+w5;for(let r=0;r"scheme must not be undefined or null."),e.endsWith(el)&&(e=e.slice(0,e.indexOf(el))),M(e.length>0,()=>"scheme must not be an empty string.");let n=Hn.getInstance();M(n.managers[e]==null,()=>`A model store manager is already registered for scheme '${e}'.`),n.managers[e]=t}static getManager(e){let t=this.getInstance().managers[e];if(t==null)throw new Error(`Cannot find model manager for scheme '${e}'`);return t}static getSchemes(){return Object.keys(this.getInstance().managers)}};function id(e){if(e.indexOf(el)===-1)throw new Error(`The url string provided does not contain a scheme. Supported schemes are: ${Hn.getSchemes().join(",")}`);return{scheme:e.split(el)[0],path:e.split(el)[1]}}async function v5(e,t,n=!1){M(e!==t,()=>`Old path and new path are the same: '${e}'`);let r=Nt.getLoadHandlers(e);M(r.length>0,()=>`Copying failed because no load handler is found for source URL ${e}.`),M(r.length<2,()=>`Copying failed because more than one (${r.length}) load handlers for source URL ${e}.`);let a=r[0],s=Nt.getSaveHandlers(t);M(s.length>0,()=>`Copying failed because no save handler is found for destination URL ${t}.`),M(s.length<2,()=>`Copying failed because more than one (${r.length}) save handlers for destination URL ${t}.`);let i=s[0],o=id(e).scheme,l=id(e).path,c=o===id(e).scheme,u=await a.load();n&&c&&await Hn.getManager(o).removeModel(l);let h=await i.save(u);return n&&!c&&await Hn.getManager(o).removeModel(l),h.modelArtifactsInfo}async function d9(){let e=Hn.getSchemes(),t={};for(let n of e){let r=await Hn.getManager(n).listModels();for(let a in r){let s=n+el+a;t[s]=r[a]}}return t}async function p9(e){let t=id(e);return Hn.getManager(t.scheme).removeModel(t.path)}async function f9(e,t){return v5(e,t,!1)}async function m9(e,t){return v5(e,t,!0)}var A9=class{fetch(e,t){return fetch(e,t)}now(){return performance.now()}encode(e,t){if(t!=="utf-8"&&t!=="utf8")throw new Error(`Browser's encoder only supports utf-8, but got ${t}`);return this.textEncoder==null&&(this.textEncoder=new TextEncoder),this.textEncoder.encode(e)}decode(e,t){return new TextDecoder(t).decode(e)}};if(J().get("IS_BROWSER")){J().setPlatform("browser",new A9);try{Hn.registerManager(ai.URL_SCHEME,new h9)}catch(e){}try{Hn.registerManager(ri.URL_SCHEME,new r9)}catch(e){}}var y9={importFetch:()=>k8()},If,g9=class{constructor(){this.util=require("util"),this.textEncoder=new this.util.TextEncoder}fetch(e,t){return J().global.fetch!=null?J().global.fetch(e,t):(If==null&&(If=y9.importFetch()),If(e,t))}now(){let e=process.hrtime();return e[0]*1e3+e[1]/1e6}encode(e,t){if(t!=="utf-8"&&t!=="utf8")throw new Error(`Node built-in encoder only supports utf-8, but got ${t}`);return this.textEncoder.encode(e)}decode(e,t){return e.length===0?"":new this.util.TextDecoder(t).decode(e)}};J().get("IS_NODE")&&J().setPlatform("node",new g9);function Le(e,t="float32",n){return t=t||"float32",af(e),new $t(e,t,n)}function x9(e,t){let n=E(e,"x","cast");if(!Xg(t))throw new Error(`Failed to cast to unknown dtype ${t}`);if(t==="string"&&n.dtype!=="string"||t!=="string"&&n.dtype==="string")throw new Error("Only strings can be casted to strings");let r={x:n},a={dtype:t};return $.runKernel(cs,r,a)}var me=D({cast_:x9});function w9(e){let t={x:E(e,"x","clone","string_or_numeric")};return $.runKernel(vs,t)}var Er=D({clone_:w9});function k5(e,t=!1){console.log(e.toString(t))}c5();var b9={buffer:Le,cast:me,clone:Er,print:k5};Fk(b9);var gn={};Oe(gn,{browserFiles:()=>_9,browserHTTPRequest:()=>k9,concatenateArrayBuffers:()=>bf,copyModel:()=>f9,decodeWeights:()=>m5,encodeWeights:()=>jk,fromMemory:()=>I9,getLoadHandlers:()=>e9,getModelArtifactsInfoForJSON:()=>Ou,getSaveHandlers:()=>Qk,http:()=>Sf,isHTTPScheme:()=>Nf,listModels:()=>d9,loadWeights:()=>v9,moveModel:()=>m9,registerLoadRouter:()=>Jk,registerSaveRouter:()=>Yk,removeModel:()=>p9,weightsLoaderFactory:()=>I5,withSaveHandler:()=>N9});var S9="model",T9=".json",C9=".weights.bin";function N5(e){return new Promise(t=>setTimeout(t)).then(e)}var tl=class{constructor(e){if(!J().getBool("IS_BROWSER"))throw new Error("browserDownloads() cannot proceed because the current environment is not a browser.");e.startsWith(tl.URL_SCHEME)&&(e=e.slice(tl.URL_SCHEME.length)),(e==null||e.length===0)&&(e=S9),this.modelTopologyFileName=e+T9,this.weightDataFileName=e+C9}async save(e){if(typeof document=="undefined")throw new Error("Browser downloads are not supported in this environment since `document` is not present");let t=window.URL.createObjectURL(new Blob([e.weightData],{type:"application/octet-stream"}));if(e.modelTopology instanceof ArrayBuffer)throw new Error("BrowserDownloads.save() does not support saving model topology in binary formats yet.");{let n=[{paths:["./"+this.weightDataFileName],weights:e.weightSpecs}],r={modelTopology:e.modelTopology,format:e.format,generatedBy:e.generatedBy,convertedBy:e.convertedBy,weightsManifest:n};e.signature!=null&&(r.signature=e.signature),e.userDefinedMetadata!=null&&(r.userDefinedMetadata=e.userDefinedMetadata),e.modelInitializer!=null&&(r.modelInitializer=e.modelInitializer);let a=window.URL.createObjectURL(new Blob([JSON.stringify(r)],{type:"application/json"})),s=this.jsonAnchor==null?document.createElement("a"):this.jsonAnchor;if(s.download=this.modelTopologyFileName,s.href=a,await N5(()=>s.dispatchEvent(new MouseEvent("click"))),e.weightData!=null){let i=this.weightDataAnchor==null?document.createElement("a"):this.weightDataAnchor;i.download=this.weightDataFileName,i.href=t,await N5(()=>i.dispatchEvent(new MouseEvent("click")))}return{modelArtifactsInfo:Ou(e)}}}};tl.URL_SCHEME="downloads://";var E9=class{constructor(e){if(e==null||e.length<1)throw new Error(`When calling browserFiles, at least 1 file is required, but received ${e}`);this.files=e}async load(){let e=this.files[0],t=this.files.slice(1);return new Promise((n,r)=>{let a=new FileReader;a.onload=s=>{let i=JSON.parse(s.target.result),o=i.modelTopology;if(o==null){r(new Error(`modelTopology field is missing from file ${e.name}`));return}t.length===0&&n({modelTopology:o});let l=i.weightsManifest;if(l==null){r(new Error(`weightManifest field is missing from file ${e.name}`));return}let c;try{c=this.checkManifestAndWeightFiles(l,t)}catch(p){r(p);return}let u=[],h=[],d=[];l.forEach(p=>{p.paths.forEach(f=>{h.push(f),d.push(null)}),u.push(...p.weights)}),l.forEach(p=>{p.paths.forEach(f=>{let m=new FileReader;m.onload=A=>{let y=A.target.result,g=h.indexOf(f);if(d[g]=y,d.indexOf(null)===-1){let w={modelTopology:o,weightSpecs:u,weightData:bf(d),format:i.format,generatedBy:i.generatedBy,convertedBy:i.convertedBy};i.signature!=null&&(w.signature=i.signature),i.userDefinedMetadata!=null&&(w.userDefinedMetadata=i.userDefinedMetadata),i.modelInitializer!=null&&(w.modelInitializer=i.modelInitializer),n(w)}},m.onerror=A=>r(`Failed to weights data from file of path '${f}'.`),m.readAsArrayBuffer(c[f])})})},a.onerror=s=>r(`Failed to read model topology and weights manifest JSON from file '${e.name}'. BrowserFiles supports loading Keras-style tf.Model artifacts only.`),a.readAsText(e)})}checkManifestAndWeightFiles(e,t){let n=[],r=t.map(s=>y5(s.name)),a={};for(let s of e)s.paths.forEach(i=>{let o=y5(i);if(n.indexOf(o)!==-1)throw new Error(`Duplicate file basename found in weights manifest: '${o}'`);if(n.push(o),r.indexOf(o)===-1)throw new Error(`Weight file with basename '${o}' is not provided.`);a[i]=t[r.indexOf(o)]});if(n.length!==t.length)throw new Error(`Mismatch in the number of files in weights manifest (${n.length}) and the number of weight files provided (${t.length}).`);return a}},M9=e=>J().getBool("IS_BROWSER")&&!Array.isArray(e)&&e.startsWith(tl.URL_SCHEME)?R9(e.slice(tl.URL_SCHEME.length)):null;Nt.registerSaveRouter(M9);function R9(e="model"){return new tl(e)}function _9(e){return new E9(e)}function S5(e,t,n,r){i(e),n=n==null?0:n,r=r==null?1:r,o(n,r);let a=0,s=l=>(l.then(c=>{let u=n+ ++a/e.length*(r-n);return t(u),c}),l);function i(l){M(l!=null&&Array.isArray(l)&&l.length>0,()=>"promises must be a none empty array")}function o(l,c){M(l>=0&&l<=1,()=>`Progress fraction must be in range [0, 1], but got startFraction ${l}`),M(c>=0&&c<=1,()=>`Progress fraction must be in range [0, 1], but got endFraction ${c}`),M(c>=l,()=>`startFraction must be no more than endFraction, but got startFraction ${l} and endFraction ${c}`)}return Promise.all(e.map(s))}async function T5(e,t){t==null&&(t={});let n=t.fetchFunc==null?J().platform.fetch:t.fetchFunc,r=e.map(c=>n(c,t.requestInit,{isBinary:!0})),a=0,s=.5,i=(t.onProgress==null?await Promise.all(r):await S5(r,t.onProgress,a,s)).map(c=>c.arrayBuffer()),o=.5,l=1;return t.onProgress==null?await Promise.all(i):await S5(i,t.onProgress,o,l)}async function v9(e,t="",n,r){return I5(a=>T5(a,{requestInit:r}))(e,t,n)}function I5(e){return async(t,n="",r)=>{let a=t.map(()=>!1),s={},i=r!=null?r.map(()=>!1):[],o=[];if(t.forEach((p,f)=>{let m=0;p.weights.forEach(A=>{let y="quantization"in A?A.quantization.dtype:A.dtype,g=xf[y]*Ft(A.shape),w=()=>{a[f]=!0,s[f]==null&&(s[f]=[]),s[f].push({manifestEntry:A,groupOffset:m,sizeBytes:g})};r!=null?r.forEach((b,_)=>{b===A.name&&(w(),i[_]=!0)}):w(),o.push(A.name),m+=g})}),!i.every(p=>p)){let p=r.filter((f,m)=>!i[m]);throw new Error(`Could not find weights in manifest with names: ${p.join(", ")}. -Manifest JSON has weights with names: ${o.join(", ")}.`)}let l=a.reduce((p,f,m)=>(f&&p.push(m),p),[]),c=[];l.forEach(p=>{t[p].paths.forEach(f=>{let m=n+(n.endsWith("/")?"":"/")+f;c.push(m)})});let u=await e(c),h={},d=0;return l.forEach(p=>{let f=t[p].paths.length,m=0;for(let w=0;w{let b=A.slice(w.groupOffset,w.groupOffset+w.sizeBytes),_=m5(b,[w.manifestEntry]);for(let x in _)h[x]=_[x]}),d+=f}),h}}var F9="application/octet-stream",$9="application/json",Tf=class{constructor(e,t){if(this.DEFAULT_METHOD="POST",t==null&&(t={}),this.weightPathPrefix=t.weightPathPrefix,this.onProgress=t.onProgress,this.weightUrlConverter=t.weightUrlConverter,t.fetchFunc!=null?(M(typeof t.fetchFunc=="function",()=>"Must pass a function that matches the signature of `fetch` (see https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API)"),this.fetch=t.fetchFunc):this.fetch=J().platform.fetch,M(e!=null&&e.length>0,()=>"URL path for http must not be null, undefined or empty."),Array.isArray(e)&&M(e.length===2,()=>`URL paths for http must have a length of 2, (actual length is ${e.length}).`),this.path=e,t.requestInit!=null&&t.requestInit.body!=null)throw new Error("requestInit is expected to have no pre-existing body, but has one.");this.requestInit=t.requestInit||{}}async save(e){if(e.modelTopology instanceof ArrayBuffer)throw new Error("BrowserHTTPRequest.save() does not support saving model topology in binary formats yet.");let t=Object.assign({method:this.DEFAULT_METHOD},this.requestInit);t.body=new FormData;let n=[{paths:["./model.weights.bin"],weights:e.weightSpecs}],r={modelTopology:e.modelTopology,format:e.format,generatedBy:e.generatedBy,convertedBy:e.convertedBy,weightsManifest:n};e.signature!=null&&(r.signature=e.signature),e.userDefinedMetadata!=null&&(r.userDefinedMetadata=e.userDefinedMetadata),e.modelInitializer!=null&&(r.modelInitializer=e.modelInitializer),t.body.append("model.json",new Blob([JSON.stringify(r)],{type:$9}),"model.json"),e.weightData!=null&&t.body.append("model.weights.bin",new Blob([e.weightData],{type:F9}),"model.weights.bin");let a=await this.fetch(this.path,t);if(a.ok)return{modelArtifactsInfo:Ou(e),responses:[a]};throw new Error(`BrowserHTTPRequest.save() failed due to HTTP response status ${a.status}.`)}async load(){let e=await this.fetch(this.path,this.requestInit);if(!e.ok)throw new Error(`Request to ${this.path} failed with status code ${e.status}. Please verify this URL points to the model JSON of the model to load.`);let t;try{t=await e.json()}catch(p){let f=`Failed to parse model JSON of response from ${this.path}.`;throw this.path.endsWith(".pb")?f+=" Your path contains a .pb file extension. Support for .pb models have been removed in TensorFlow.js 1.0 in favor of .json models. You can re-convert your Python TensorFlow model using the TensorFlow.js 1.0 conversion scripts or you can convert your.pb models with the 'pb2json'NPM script in the tensorflow/tfjs-converter repository.":f+=" Please make sure the server is serving valid JSON for this request.",new Error(f)}let n=t.modelTopology,r=t.weightsManifest,a=t.generatedBy,s=t.convertedBy,i=t.format,o=t.signature,l=t.userDefinedMetadata;if(n==null&&r==null)throw new Error(`The JSON from HTTP path ${this.path} contains neither model topology or manifest for weights.`);let c,u;r!=null&&([c,u]=await this.loadWeights(r));let h={modelTopology:n,weightSpecs:c,weightData:u,generatedBy:a,convertedBy:s,format:i};o!=null&&(h.signature=o),l!=null&&(h.userDefinedMetadata=l);let d=t.modelInitializer;return d&&(h.modelInitializer=d),h}async loadWeights(e){let t=Array.isArray(this.path)?this.path[1]:this.path,[n,r]=D9(t),a=this.weightPathPrefix||n,s=[];for(let c of e)s.push(...c.weights);let i=[],o=[];for(let c of e)for(let u of c.paths)this.weightUrlConverter!=null?o.push(this.weightUrlConverter(u)):i.push(a+u+r);this.weightUrlConverter&&i.push(...await Promise.all(o));let l=await T5(i,{requestInit:this.requestInit,fetchFunc:this.fetch,onProgress:this.onProgress});return[s,bf(l)]}};Tf.URL_SCHEME_REGEX=/^https?:\/\//;function D9(e){let t=e.lastIndexOf("/"),n=e.lastIndexOf("?"),r=e.substring(0,t),a=n>t?e.substring(n):"";return[r+"/",a]}function Nf(e){return e.match(Tf.URL_SCHEME_REGEX)!=null}var C5=(e,t)=>{if(typeof fetch=="undefined"&&(t==null||t.fetchFunc==null))return null;{let n=!0;if(Array.isArray(e)?n=e.every(r=>Nf(r)):n=Nf(e),n)return Sf(e,t)}return null};Nt.registerSaveRouter(C5);Nt.registerLoadRouter(C5);function Sf(e,t){return new Tf(e,t)}function k9(e,t){return Sf(e,t)}var Cf=class{constructor(e){this.modelArtifacts=e}async load(){return this.modelArtifacts}},O9=class{constructor(e){this.saveHandler=e}async save(e){return this.saveHandler(e)}};function I9(e,t,n,r){return arguments.length===1?e.modelTopology!=null||e.weightSpecs!=null?new Cf(e):(console.warn("Please call tf.io.fromMemory() with only one argument. The argument should be of type ModelArtifacts. The multi-argument signature of tf.io.fromMemory() has been deprecated and will be removed in a future release."),new Cf({modelTopology:e})):(console.warn("Please call tf.io.fromMemory() with only one argument. The argument should be of type ModelArtifacts. The multi-argument signature of tf.io.fromMemory() has been deprecated and will be removed in a future release."),new Cf({modelTopology:e,weightSpecs:t,weightData:n,trainingConfig:r}))}function N9(e){return new O9(e)}var E5={};Oe(E5,{confusionMatrix:()=>z9});function P9(e,t,n=!1,r=!1){let a=E(e,"a","matMul"),s=E(t,"b","matMul");[a,s]=bt(a,s);let i={a,b:s},o={transposeA:n,transposeB:r};return $.runKernel(us,i,o)}var Ge=D({matMul_:P9});function L9(e,t,n=1,r=0){if(t<2)throw new Error(`Error in oneHot: depth must be >=2, but it is ${t}`);let a={indices:E(e,"indices","oneHot","int32")},s={depth:t,onValue:n,offValue:r};return $.runKernel(Fs,a,s)}var nl=D({oneHot_:L9});function W9(e,t){let n=E(e,"x","transpose");if(t==null&&(t=n.shape.map((s,i)=>i).reverse()),M(n.rank===t.length,()=>`Error in transpose: rank of input ${n.rank} must match length of perm ${t}.`),t.forEach(s=>{M(s>=0&&s`All entries in 'perm' must be between 0 and ${n.rank-1} but got ${t}`)}),n.rank<=1)return n.clone();let r={x:n},a={perm:t};return $.runKernel(Ys,r,a)}var nt=D({transpose_:W9});function B9(e,t,n){let r=E(e,"labels","confusionMatrix"),a=E(t,"predictions","confusionMatrix");M(n==null||n>0&&Number.isInteger(n),()=>`If provided, numClasses must be a positive integer, but got ${n}`),M(r.rank===1,()=>`Expected the rank of labels to be 1, but got ${r.rank}`),M(a.rank===1,()=>`Expected the rank of predictions to be 1, but got ${a.rank}`),M(r.shape[0]===a.shape[0],()=>`Mismatch in the number of examples: ${r.shape[0]} vs. ${a.shape[0]}. Labels and predictions should have the same number of elements.`),M(n>0&&Number.isInteger(n),()=>`numClasses is required to be a positive integer, but got ${n}`);let s=nl(me(r,"int32"),n),i=nl(me(a,"int32"),n),o=nt(s),l=Ge(o,i);return me(l,"int32")}var z9=D({confusionMatrix_:B9}),rl={};Oe(rl,{fromPixels:()=>j9,fromPixelsAsync:()=>V9,toPixels:()=>U9});function od(e,t,n){if(as(e),t!=null&&t.length!==3)throw new Error("tensor3d() requires shape to have three numbers");let r=Cr(e,n);if(r.length!==3&&r.length!==1)throw new Error("tensor3d() requires values to be number[][][] or flat/TypedArray");if(r.length===1&&t==null)throw new Error("tensor3d() requires shape to be provided when `values` are a flat array");return Sa(e,t,r,n)}var al;function R5(e,t=3){if(t>4)throw new Error("Cannot construct Tensor with more than 4 channels from pixels.");if(e==null)throw new Error("pixels passed to tf.browser.fromPixels() can not be null");let n=!1,r=!1,a=!1,s=!1,i=!1,o=!1;if(e.data instanceof Uint8Array)n=!0;else if(typeof ImageData!="undefined"&&e instanceof ImageData)r=!0;else if(typeof HTMLVideoElement!="undefined"&&e instanceof HTMLVideoElement)a=!0;else if(typeof HTMLImageElement!="undefined"&&e instanceof HTMLImageElement)s=!0;else if(e.getContext!=null)i=!0;else if(typeof ImageBitmap!="undefined"&&e instanceof ImageBitmap)o=!0;else throw new Error(`pixels passed to tf.browser.fromPixels() must be either an HTMLVideoElement, HTMLImageElement, HTMLCanvasElement, ImageData in browser, or OffscreenCanvas, ImageData in webworker or {data: Uint32Array, width: number, height: number}, but was ${e.constructor.name}`);if(a){let d=2;if(a&&e.readyState element.")}if(ed(Qh,$.backendName)!=null){let d={pixels:e},p={numChannels:t};return $.runKernel(Qh,d,p)}let[l,c]=a?[e.videoWidth,e.videoHeight]:[e.width,e.height],u;i?u=e.getContext("2d").getImageData(0,0,l,c).data:r||n?u=e.data:(s||a||o)&&(al==null&&(al=document.createElement("canvas").getContext("2d")),al.canvas.width=l,al.canvas.height=c,al.drawImage(e,0,0,l,c),u=al.getImageData(0,0,l,c).data);let h;if(t===4)h=new Int32Array(u);else{let d=l*c;h=new Int32Array(d*t);for(let p=0;p4||s===2)throw new Error(`toPixels only supports depth of size 1, 3 or 4 but got ${s}`);if(n.dtype!=="float32"&&n.dtype!=="int32")throw new Error(`Unsupported type for toPixels: ${n.dtype}. Please use float32 or int32 tensors.`);let i=await n.data(),o=n.dtype==="float32"?255:1,l=new Uint8ClampedArray(a*r*4);for(let c=0;c1)throw new Error(`Tensor values for a float32 Tensor must be in the range [0 - 1] but encountered ${p}.`)}else if(n.dtype==="int32"&&(p<0||p>255))throw new Error(`Tensor values for a int32 Tensor must be in the range [0 - 255] but encountered ${p}.`);s===1?(u[0]=p*o,u[1]=p*o,u[2]=p*o):u[d]=p*o}let h=c*4;l[h+0]=Math.round(u[0]),l[h+1]=Math.round(u[1]),l[h+2]=Math.round(u[2]),l[h+3]=Math.round(u[3])}if(t!=null){t.width=a,t.height=r;let c=t.getContext("2d"),u=new ImageData(l,a,r);c.putImageData(u,0,0)}return n!==e&&n.dispose(),l}var j9=D({fromPixels_:R5}),Ef={};Oe(Ef,{prepareAndValidate:()=>M5});function M5(e,t){let n=e.shape.length,r=t.shape.length;if(n<1)throw new Error(`tf.gatherND() expects the input to be rank 1 or higher, but the rank was ${n}.`);if(r<1)throw new Error(`tf.gatherND() expects the indices to be rank 1 or higher, but the rank was ${r}.`);if(t.dtype!=="int32")throw new Error(`tf.gatherND() expects the indices to be int32 type, but the dtype was ${t.dtype}.`);if(t.shape[r-1]>n)throw new Error(`index innermost dimension length must be <= tensor rank; saw: ${t.shape[r-1]} vs. ${n}`);if(Ft(e.shape)===0)throw new Error(`Requested more than 0 entries, but input is empty. Input shape: ${e.shape}.`);let a=t.shape,s=a[a.length-1],i=1;for(let h=0;hh/c),1].slice(0,s);return[l,i,c,u]}var Rf={};Oe(Rf,{calculateShapes:()=>F5,validateInput:()=>Ff,validateUpdateShape:()=>Mf});function Mf(e,t,n){let r=t.rank>1?t.shape[t.rank-1]:1,a=t.rank>1?t.rank-1:1,s=`Must have updates.shape = indices.shape[:batchDim] + shape[sliceDim:], got updates.shape: ${n.shape}, indices.shape: ${t.shape}, shape: ${e}, sliceDim: ${r}, and batchDim: ${a}.`;if(n.rank1?t.shape[r-1]:1,s=n.length,i=1;for(let h=a;hK9,computeFlatOffset:()=>Y9,computeOutShape:()=>$5,getNormalizedAxes:()=>O5,isSliceContinous:()=>Z9,maskToAxes:()=>ld,parseSliceParams:()=>V5,sliceInfo:()=>J9,startForAxis:()=>W5,startIndicesWithElidedDims:()=>z5,stopForAxis:()=>B5,stopIndicesWithElidedDims:()=>P5,stridesForAxis:()=>L5,stridesWithElidedDims:()=>D5});function K9(e,t,n){let r=e.shape.length;M(r===t.length,()=>`Error in slice${r}D: Length of begin ${t} must match the rank of the array (${r}).`),M(r===n.length,()=>`Error in slice${r}D: Length of size ${n} must match the rank of the array (${r}).`);for(let a=0;a`Error in slice${r}D: begin[${a}] + size[${a}] (${t[a]+n[a]}) would overflow input.shape[${a}] (${e.shape[a]})`)}function ld(e){let t=[],n=0;for(;e>0;)e&1&&t.push(n),e/=2,n++;return t}function $5(e,t,n){let r=[];for(let a=0;a0){let p=t[0],f=n+1;u=z5(i,p,f,r,e),h=P5(o,p,f,a,e),d=D5(s,p,f,e)}else for(let p=0;p-1)s[o]=0;else{let l=U5(t,n,o),c=r[l];e&1<-1)s[o]=Number.MAX_SAFE_INTEGER;else{let l=U5(t,n,o),c=r[l];e&1<0?i=Number.MIN_SAFE_INTEGER:i=Number.MAX_SAFE_INTEGER);let l=r[a];return i<0&&(i+=l),i=ou(0,i,l-1),i}function B5(e,t,n,r,a,s){let i=t[a],o=n[a]||1;(e&1<0?i=Number.MAX_SAFE_INTEGER:i=Number.MIN_SAFE_INTEGER);let l=r[a];return i<0&&(i+=l),o>0?i=ou(0,i,l):i=ou(-1,i,l-1),i}function Z9(e,t,n){let r=n.length;for(let a=0;a1){r=a;break}for(let a=r+1;a0||n[a]!==e[a])return!1;return!0}function Y9(e,t){let n=e.length>0?e[e.length-1]:1;for(let r=0;r{M(i!==-1,()=>"slice() does not support negative begin indexing.")});let s;return n==null?s=new Array(a).fill(-1):typeof n=="number"?s=[n,...new Array(a-1).fill(-1)]:n.lengthi>=0?i:(M(i===-1,()=>`Negative size values should be exactly -1 but got ${i} for the slice() size at index ${o}.`),e.shape[o]-r[o])),[r,s]}function J9(e,t,n,r,a,s,i,o,l){let c=t.slice(),u=n.slice(),h=r;r==null&&(h=new Array(c.length));let d=ld(i);if(d.length>1)throw new Error("Multiple ellipses in slice is not allowed.");if(i!==0&&o!==0)throw new Error("Using both ellipsisMask and newAxisMask is not yet supported.");if(i!==0&&l!==0)throw new Error("Using both ellipsisMask and shrinkAxisMask is not yet supported.");let p=e.length-c.length,f=ld(o),m=e.slice();f.forEach(x=>{c[x]=0,u[x]=1,m.splice(x,0,1)});let{begin:A,end:y,strides:g}=O5(m,d,p,c,u,h,a,s,i);c=A,u=y,h=g;let w=ld(l);w.forEach(x=>{u[x]=c[x]+1,h[x]=1});let b=$5(c,u,h),_=b.filter((x,N)=>w.indexOf(N)===-1);return{nonStrided:h.every(x=>x===1),$begin:c,$end:u,$strides:h,size:b,newShape:m,outShape:_}}var re={};Oe(re,{Serializable:()=>H5,SerializationMap:()=>si,registerClass:()=>Ca});var H5=class{getClassName(){return this.constructor.className}static fromConfig(e,t){return new e(t)}},si=class{constructor(){this.classNameMap={}}static getMap(){return si.instance==null&&(si.instance=new si),si.instance}static register(e){si.getMap().classNameMap[e.className]=[e,e.fromConfig]}};function Ca(e){M(e.className!=null,()=>"Class being registered does not have the static className property defined."),M(typeof e.className=="string",()=>"className is required to be a string, but got type "+typeof e.className),M(e.className.length>0,()=>"Class being registered has an empty-string as its className, which is disallowed."),si.register(e)}var G5={};Oe(G5,{TEST_EPSILON_FLOAT16:()=>q5,encodeStrings:()=>X5,expectArrayBuffersEqual:()=>aI,expectArraysClose:()=>Q9,expectArraysEqual:()=>tI,expectNumbersClose:()=>nI,expectPromiseToFail:()=>eI,expectValuesInRange:()=>rI,testEpsilon:()=>$f});var sI=.001,q5=.1;function Q9(e,t,n){return n==null&&(n=$f()),Df(e,t,(r,a)=>Of(r,a,n))}function $f(){return $.backend.floatPrecision()===32?sI:q5}function Df(e,t,n){let r=!0;if((nn(e)||nn(t))&&(r=!1),nn(e)&&nn(t)&&(r=!0),r){let i=e.constructor.name,o=t.constructor.name;if(i!==o)throw new Error(`Arrays are of different type. Actual: ${i}. Expected: ${o}`)}if(Array.isArray(e)&&Array.isArray(t)){let i=Cr(e),o=Cr(t);if(!Jr(i,o))throw new Error(`Arrays have different shapes. Actual: [${i}]. Expected: [${o}]`)}let a=nn(e)?e:ss(e),s=nn(t)?t:ss(t);if(a.length!==s.length)throw new Error(`Arrays have different lengths actual: ${a.length} vs expected: ${s.length}. -Actual: ${a}. -Expected: ${s}.`);for(let i=0;it.fail(),()=>t())}function tI(e,t){let n=typeof t=="string"||typeof t=="number"||typeof t=="boolean"?[t]:t;return wa(e)||wa(e[0])||wa(t)||wa(t[0])?Df(e,n,(r,a)=>r==a):Df(e,t,(r,a)=>Of(r,a,0))}function nI(e,t,n){if(n==null&&(n=$f()),!Of(e,t,n))throw new Error(`Numbers differ: actual === ${e}, expected === ${t}`)}function Of(e,t,n){return!isFinite(e)&&!isFinite(t)?!0:!(isNaN(e)||isNaN(t)||Math.abs(e-t)>n)}function rI(e,t,n){for(let r=0;rn)throw new Error(`Value out of range:${e[r]} low: ${t}, high: ${n}`)}function aI(e,t){expect(new Float32Array(e)).toEqual(new Float32Array(t))}function X5(e){for(let t=0;tt.dispose())}function Ut(e){return $.keep(e)}function hI(e){return $.time(e)}function dI(e){return $.setBackend(e)}function pI(){return $.ready()}function fI(){return $.backendName}function mI(e){$.removeBackend(e)}function Pf(e){return $.findBackend(e)}function AI(e){return $.findBackendFactory(e)}function sl(e,t,n=1){return $.registerBackend(e,t,n)}function K5(){return $.backend}function yI(e,t){J().setPlatform(e,t)}function gI(e,t){let n=E(e,"a","add"),r=E(t,"b","add");[n,r]=bt(n,r);let a={a:n,b:r};return $.runKernel(_a,a)}var se=D({add_:gI});function xI(e,t){let n=E(e,"a","floorDiv"),r=E(t,"b","floorDiv");[n,r]=bt(n,r);let a={a:n,b:r};return $.runKernel(ws,a)}var cd=D({floorDiv_:xI});function wI(e,t){let n=E(e,"a","div"),r=E(t,"b","div");if([n,r]=bt(n,r),n.dtype==="int32"&&r.dtype==="int32")return cd(n,r);let a={a:n,b:r},s={};return $.runKernel(ys,a,s)}var ge=D({div_:wI});function bI(e,t){let n=E(e,"a","mul"),r=E(t,"b","mul");[n,r]=bt(n,r);let a={a:n,b:r};return $.runKernel(Ms,a)}var P=D({mul_:bI});function _I(e){let t=E(e,"x","abs");if(t.dtype==="complex64"){let n={x:t};return $.runKernel(du,n)}else{let n={x:t};return $.runKernel(Zi,n)}}var Dt=D({abs_:_I});function vI(e){let t={x:E(e,"x","acos")};return $.runKernel(Yi,t)}var Lf=D({acos_:vI});function kI(e){let t={x:E(e,"x","acosh")};return $.runKernel(Ji,t)}var Wf=D({acosh_:kI});function II(e){M(Array.isArray(e),()=>"The argument passed to tf.addN() must be a list of tensors"),M(e.length>=1,()=>`Must pass at least one tensor to tf.addN(), but got ${e.length}`);let t=e.map((a,s)=>E(a,`tensors${s}`,"addN")),n=t[0];t.forEach(a=>{if(a.dtype!==n.dtype)throw new Error("All tensors passed to tf.addN() must have the same dtype")}),t.forEach(a=>{if(!Jr(a.shape,n.shape))throw new Error("All tensors passed to tf.addN() must have the same shape")});let r=t;return $.runKernel(is,r)}var Ea=D({addN_:II});function NI(e,t=null,n=!1){let r={x:E(e,"x","all","bool")},a={axis:t,keepDims:n};return $.runKernel(_h,r,a)}var hd=D({all_:NI});function SI(e,t=null,n=!1){let r={x:E(e,"x","any","bool")},a={axis:t,keepDims:n};return $.runKernel(vh,r,a)}var zu=D({any_:SI});function TI(e,t=0){let n={x:E(e,"x","argMax")},r={axis:t};return $.runKernel(os,n,r)}var Pu=D({argMax_:TI});function CI(e,t=0){let n={x:E(e,"x","argMin")},r={axis:t};return $.runKernel(uu,n,r)}var Bf=D({argMin_:CI});function EI(e){let t={x:E(e,"x","asin")};return $.runKernel(Qi,t)}var Vf=D({asin_:EI});function RI(e){let t={x:E(e,"x","asinh")};return $.runKernel(eo,t)}var Uf=D({asinh_:RI});function MI(e){let t={x:E(e,"x","atan")};return $.runKernel(to,t)}var jf=D({atan_:MI});function FI(e,t){let n=E(e,"a","atan2"),r=E(t,"b","atan2");[n,r]=bt(n,r);let a={a:n,b:r};return $.runKernel(ro,a)}var Hf=D({atan2_:FI});function $I(e){let t={x:E(e,"x","atanh")};return $.runKernel(no,t)}var Gf=D({atanh_:$I});function DI(e,t,n,r,a="NHWC",s){let i=e[3],o=[...t,i],l=Z5(a);return Lu(e,o,n,s,r,null,null,l)}function Y5(e,t,n,r,a,s,i="channelsLast"){let[o,l]=dd(t),c;if(i==="channelsLast")c=[o,l,e[3],e[3]];else if(i==="channelsFirst")c=[o,l,e[1],e[1]];else throw new Error(`Unknown dataFormat ${i}`);return Lu(e,c,n,r,a,s,!1,i)}function OI(e,t,n,r,a,s,i="NDHWC"){let[o,l,c]=qf(t),u,h;if(i==="NDHWC")h="channelsLast",u=[o,l,c,e[4],e[4]];else if(i==="NCDHW")h="channelsFirst",u=[o,l,c,e[1],e[1]];else throw new Error(`Unknown dataFormat ${i}`);return J5(e,u,n,r,a,!1,h,s)}function Lu(e,t,n,r,a,s,i=!1,o="channelsLast"){let[l,c,u,h]=[-1,-1,-1,-1];if(o==="channelsLast")[l,c,u,h]=e;else if(o==="channelsFirst")[l,h,c,u]=e;else throw new Error(`Unknown dataFormat ${o}`);let[d,p,,f]=t,[m,A]=dd(n),[y,g]=dd(r),w=il(d,y),b=il(p,g),{padInfo:_,outHeight:x,outWidth:N}=zI(a,c,u,m,A,w,b,s,o),T=i?f*h:f,C;return o==="channelsFirst"?C=[l,T,x,N]:o==="channelsLast"&&(C=[l,x,N,T]),{batchSize:l,dataFormat:o,inHeight:c,inWidth:u,inChannels:h,outHeight:x,outWidth:N,outChannels:T,padInfo:_,strideHeight:m,strideWidth:A,filterHeight:d,filterWidth:p,effectiveFilterHeight:w,effectiveFilterWidth:b,dilationHeight:y,dilationWidth:g,inShape:e,outShape:C,filterShape:t}}function J5(e,t,n,r,a,s=!1,i="channelsLast",o){let[l,c,u,h,d]=[-1,-1,-1,-1,-1];if(i==="channelsLast")[l,c,u,h,d]=e;else if(i==="channelsFirst")[l,d,c,u,h]=e;else throw new Error(`Unknown dataFormat ${i}`);let[p,f,m,,A]=t,[y,g,w]=qf(n),[b,_,x]=qf(r),N=il(p,b),T=il(f,_),C=il(m,x),{padInfo:F,outDepth:O,outHeight:W,outWidth:V}=PI(a,c,u,h,y,g,w,N,T,C,o),U=s?A*d:A,j;return i==="channelsFirst"?j=[l,U,O,W,V]:i==="channelsLast"&&(j=[l,O,W,V,U]),{batchSize:l,dataFormat:i,inDepth:c,inHeight:u,inWidth:h,inChannels:d,outDepth:O,outHeight:W,outWidth:V,outChannels:U,padInfo:F,strideDepth:y,strideHeight:g,strideWidth:w,filterDepth:p,filterHeight:f,filterWidth:m,effectiveFilterDepth:N,effectiveFilterHeight:T,effectiveFilterWidth:C,dilationDepth:b,dilationHeight:_,dilationWidth:x,inShape:e,outShape:j,filterShape:t}}function LI(e,t,n,r,a){r==null&&(r=Xf(e,t,n));let s=e[0],i=e[1],o=ii((s-t+2*r)/n+1,a),l=ii((i-t+2*r)/n+1,a);return[o,l]}function WI(e,t,n,r,a,s){a==null&&(a=Xf(e,t,r));let i=e[0],o=e[1],l=e[2],c=ii((i-t+2*a)/r+1,s),u=ii((o-t+2*a)/r+1,s),h=ii((l-t+2*a)/r+1,s);return[c,u,h,n]}function Xf(e,t,n,r=1){let a=il(t,r);return Math.floor((e[0]*(n-1)-n+a)/2)}function dd(e){return typeof e=="number"?[e,e,e]:e.length===2?[e[0],e[1],1]:e}function qf(e){return typeof e=="number"?[e,e,e]:e}function il(e,t){return t<=1?e:e+(e-1)*(t-1)}function zI(e,t,n,r,a,s,i,o,l){let c,u,h;if(typeof e=="number"){c={top:e,bottom:e,left:e,right:e,type:e===0?"VALID":"NUMBER"};let d=LI([t,n],s,r,e,o);u=d[0],h=d[1]}else if(e==="same"){u=Math.ceil(t/r),h=Math.ceil(n/a);let d=Math.max(0,(u-1)*r+s-t),p=Math.max(0,(h-1)*a+i-n),f=Math.floor(d/2),m=d-f,A=Math.floor(p/2),y=p-A;c={top:f,bottom:m,left:A,right:y,type:"SAME"}}else if(e==="valid")c={top:0,bottom:0,left:0,right:0,type:"VALID"},u=Math.ceil((t-s+1)/r),h=Math.ceil((n-i+1)/a);else if(typeof e=="object"){let d=l==="channelsLast"?e[1][0]:e[2][0],p=l==="channelsLast"?e[1][1]:e[2][1],f=l==="channelsLast"?e[2][0]:e[3][0],m=l==="channelsLast"?e[2][1]:e[3][1];c={top:d,bottom:p,left:f,right:m,type:d===0&&p===0&&f===0&&m===0?"VALID":"EXPLICIT"},u=ii((t-s+d+p)/r+1,o),h=ii((n-i+f+m)/a+1,o)}else throw Error(`Unknown padding parameter: ${e}`);return{padInfo:c,outHeight:u,outWidth:h}}function PI(e,t,n,r,a,s,i,o,l,c,u){let h,d,p,f;if(typeof e=="number"){h={top:e,bottom:e,left:e,right:e,front:e,back:e,type:e===0?"VALID":"NUMBER"};let m=WI([t,n,r,1],o,1,a,e,u);d=m[0],p=m[1],f=m[2]}else if(e==="same"){d=Math.ceil(t/a),p=Math.ceil(n/s),f=Math.ceil(r/i);let m=(d-1)*a+o-t,A=(p-1)*s+l-n,y=(f-1)*i+c-r,g=Math.floor(m/2),w=m-g,b=Math.floor(A/2),_=A-b,x=Math.floor(y/2),N=y-x;h={top:b,bottom:_,left:x,right:N,front:g,back:w,type:"SAME"}}else if(e==="valid")h={top:0,bottom:0,left:0,right:0,front:0,back:0,type:"VALID"},d=Math.ceil((t-o+1)/a),p=Math.ceil((n-l+1)/s),f=Math.ceil((r-c+1)/i);else throw Error(`Unknown padding parameter: ${e}`);return{padInfo:h,outDepth:d,outHeight:p,outWidth:f}}function ii(e,t){if(!t)return Math.trunc(e);switch(t){case"round":return Math.round(e);case"ceil":return Math.ceil(e);case"floor":return Math.floor(e);default:throw new Error(`Unknown roundingMode ${t}`)}}function Ra(e){let[t,n,r]=dd(e);return t===1&&n===1&&r===1}function Mr(e,t){return Ra(e)||Ra(t)}function Z5(e){if(e==="NHWC")return"channelsLast";if(e==="NCHW")return"channelsFirst";throw new Error(`Unknown dataFormat ${e}`)}function BI(e,t){let n={x:E(e,"x","reshape","string_or_numeric")},r={shape:t};return $.runKernel(Do,n,r)}var H=D({reshape_:BI});function VI(e,t,n,r,a){let s=E(e,"x","avgPool","float32"),i=1;M(Mr(n,i),()=>`Error in avgPool: Either strides or dilations must be 1. Got strides ${n} and dilations '${i}'`);let o=s,l=!1;s.rank===3&&(l=!0,o=H(s,[1,s.shape[0],s.shape[1],s.shape[2]])),M(o.rank===4,()=>`Error in avgPool: x must be rank 4 but got rank ${o.rank}.`),a!=null&&M(Vt(r),()=>`Error in avgPool: pad must be an integer when using, dimRoundingMode ${a} but got pad ${r}.`);let c={x:o},u={filterSize:t,strides:n,pad:r,dimRoundingMode:a},h=$.runKernel(ls,c,u);return h=me(h,s.dtype),l?H(h,[h.shape[1],h.shape[2],h.shape[3]]):h}var Wu=D({avgPool_:VI});function UI(e,t,n,r,a,s="NDHWC"){let i=E(e,"x","avgPool3d","float32"),o=i,l=!1;i.rank===4&&(l=!0,o=H(i,[1,i.shape[0],i.shape[1],i.shape[2],i.shape[3]])),M(o.rank===5,()=>`Error in avgPool3d: x must be rank 5 but got rank ${o.rank}.`),M(s==="NDHWC",()=>`Error in avgPool3d: Only NDHWC is currently supported, but got dataFormat of ${s}`),a!=null&&M(Vt(r),()=>`Error in avgPool3d: pad must be an integer when using, dimRoundingMode ${a} but got pad ${r}.`);let c={x:o},u={filterSize:t,strides:n,pad:r,dimRoundingMode:a,dataFormat:s},h=$.runKernel(cu,c,u);return h=me(h,o.dtype),l?H(h,[h.shape[1],h.shape[2],h.shape[3],h.shape[4]]):h}var Kf=D({avgPool3d_:UI});function jI(e,t=0){M(e.length>=1,()=>"Pass at least one tensor to concat");let n=Du(e,"tensors","concat","string_or_numeric");if(n[0].dtype==="complex64"&&n.forEach(s=>{if(s.dtype!=="complex64")throw new Error(`Cannot concatenate complex64 tensors with a tensor - with dtype ${s.dtype}. `)}),n.length===1)return Er(n[0]);let r=n,a={axis:t};return $.runKernel(ao,r,a)}var rt=D({concat_:jI});function HI(e){let t={x:E(e,"x","sigmoid")};return $.runKernel(js,t)}var Cn=D({sigmoid_:HI});function GI(e,t,n){let r=E(e,"x","slice","string_or_numeric");if(r.rank===0)throw new Error("Slicing scalar is not possible");let a={x:r},s={begin:t,size:n};return $.runKernel(Lo,a,s)}var Ee=D({slice_:GI});function qI(e){let t={x:E(e,"x","tanh")};return $.runKernel(Zs,t)}var ol=D({tanh_:qI});function XI(e,t,n,r,a,s){let i=E(e,"forgetBias","basicLSTMCell"),o=E(t,"lstmKernel","basicLSTMCell"),l=E(n,"lstmBias","basicLSTMCell"),c=E(r,"data","basicLSTMCell"),u=E(a,"c","basicLSTMCell"),h=E(s,"h","basicLSTMCell"),d=rt([c,h],1),p=Ge(d,o),f=se(p,l),m=f.shape[0],A=f.shape[1]/4,y=[m,A],g=Ee(f,[0,0],y),w=Ee(f,[0,A],y),b=Ee(f,[0,A*2],y),_=Ee(f,[0,A*3],y),x=se(P(Cn(g),ol(w)),P(u,Cn(se(i,b)))),N=P(ol(x),Cn(_));return[x,N]}var KI=D({basicLSTMCell_:XI});function ZI(e,t,n){let r=E(e,"x","batchToSpaceND"),a=t.reduce((o,l)=>o*l);M(r.rank>=1+t.length,()=>`input rank is ${r.rank} but should be > than blockShape.length ${t.length}`),M(n.length===t.length,()=>`crops.length is ${n.length} but should be equal to blockShape.length ${t.length}`),M(r.shape[0]%a==0,()=>`input tensor batch is ${r.shape[0]} but is not divisible by the product of the elements of blockShape ${t.join(" * ")} === ${a}`);let s={x:r},i={blockShape:t,crops:n};return $.runKernel(hu,s,i)}var Bu=D({batchToSpaceND_:ZI});function YI(e){let t;return e.rank===0||e.rank===1?t=H(e,[1,1,1,e.size]):e.rank===2?t=H(e,[1,1,e.shape[0],e.shape[1]]):e.rank===3?t=H(e,[1,e.shape[0],e.shape[1],e.shape[2]]):t=e,t}function JI(e,t,n,r,a,s){s==null&&(s=.001);let i=E(e,"x","batchNorm"),o=E(t,"mean","batchNorm"),l=E(n,"variance","batchNorm"),c;a!=null&&(c=E(a,"scale","batchNorm"));let u;r!=null&&(u=E(r,"offset","batchNorm")),M(o.rank===l.rank,()=>"Batch normalization gradient requires mean and variance to have equal ranks."),M(u==null||o.rank===u.rank,()=>"Batch normalization gradient requires mean and offset to have equal ranks."),M(c==null||o.rank===c.rank,()=>"Batch normalization gradient requires mean and scale to have equal ranks.");let h={x:YI(i),scale:c,offset:u,mean:o,variance:l},d={varianceEpsilon:s},p=$.runKernel(bs,h,d);return H(p,i.shape)}var oi=D({batchNorm_:JI});function QI(e,t,n,r,a,s){let i=E(e,"x","batchNorm"),o=E(t,"mean","batchNorm"),l=E(n,"variance","batchNorm"),c;a!=null&&(c=E(a,"scale","batchNorm"));let u;return r!=null&&(u=E(r,"offset","batchNorm")),M(i.rank===2,()=>`Error in batchNorm2D: x must be rank 2 but got rank ${i.rank}.`),M(o.rank===2||o.rank===1,()=>`Error in batchNorm2D: mean must be rank 2 or rank 1 but got rank ${o.rank}.`),M(l.rank===2||l.rank===1,()=>`Error in batchNorm2D: variance must be rank 2 or rank 1 but got rank ${l.rank}.`),c!=null&&M(c.rank===2||c.rank===1,()=>`Error in batchNorm2D: scale must be rank 2 or rank 1 but got rank ${c.rank}.`),u!=null&&M(u.rank===2||u.rank===1,()=>`Error in batchNorm2D: offset must be rank 2 or rank 1 but got rank ${u.rank}.`),oi(i,o,l,u,c,s)}var Q5=D({batchNorm2d_:QI});function eN(e,t,n,r,a,s){let i=E(e,"x","batchNorm"),o=E(t,"mean","batchNorm"),l=E(n,"variance","batchNorm"),c;a!=null&&(c=E(a,"scale","batchNorm"));let u;return r!=null&&(u=E(r,"offset","batchNorm")),M(i.rank===3,()=>`Error in batchNorm3D: x must be rank 3 but got rank ${i.rank}.`),M(o.rank===3||o.rank===1,()=>`Error in batchNorm3D: mean must be rank 3 or rank 1 but got rank ${o.rank}.`),M(l.rank===3||l.rank===1,()=>`Error in batchNorm3D: variance must be rank 3 or rank 1 but got rank ${l.rank}.`),c!=null&&M(c.rank===3||c.rank===1,()=>`Error in batchNorm3D: scale must be rank 3 or rank 1 but got rank ${c.rank}.`),u!=null&&M(u.rank===3||u.rank===1,()=>`Error in batchNorm3D: offset must be rank 3 or rank 1 but got rank ${u.rank}.`),oi(i,o,l,u,c,s)}var ex=D({batchNorm3d_:eN});function tN(e,t,n,r,a,s){let i=E(e,"x","batchNorm"),o=E(t,"mean","batchNorm"),l=E(n,"variance","batchNorm"),c;a!=null&&(c=E(a,"scale","batchNorm"));let u;return r!=null&&(u=E(r,"offset","batchNorm")),M(i.rank===4,()=>`Error in batchNorm4D: x must be rank 4 but got rank ${i.rank}.`),M(o.rank===4||o.rank===1,()=>`Error in batchNorm4D: mean must be rank 4 or rank 1 but got rank ${o.rank}.`),M(l.rank===4||l.rank===1,()=>`Error in batchNorm4D: variance must be rank 4 or rank 1 but got rank ${l.rank}.`),c!=null&&M(c.rank===4||c.rank===1,()=>`Error in batchNorm4D: scale must be rank 4 or rank 1 but got rank ${c.rank}.`),u!=null&&M(u.rank===4||u.rank===1,()=>`Error in batchNorm4D: offset must be rank 4 or rank 1 but got rank ${u.rank}.`),oi(i,o,l,u,c,s)}var tx=D({batchNorm4d_:tN});function nN(e,t,n){let r=E(e,"x","bincount"),a=E(t,"weights","bincount");M(r.dtype==="int32",()=>`Error in bincount: input dtype must be int32, but got ${r.dtype}`),M(n>=0,()=>`size must be non-negative, but got ${n}.`),M(a.size===r.size||a.size===0,()=>`Error in bincount: weights must have the same size as input or0-length, but got input shape: ${r.shape}, weights shape: ${a.shape}.`);let s={x:r,weights:a},i={size:n};return $.runKernel(Nh,s,i)}var nx=D({bincount_:nN});function rN(e,t){let n=E(e,"broadcastTo","x"),r=n.shape;if(t.some(l=>!(l>0)||l%1!=0))throw new Error(`broadcastTo(): Invalid broadcast shape [${t}].`);if(t.lengthn.rank){let l=n.shape.slice();for(;l.length=0;l--)if(a[l]===t[l])s[l]=1;else if(n.shape[l]!==1)throw new Error(`broadcastTo(): [${r}] cannot be broadcast to [${t}].`);if(s.map((l,c)=>l>1?c:-1).filter(l=>l>=0).length===0)return Er(n);let i={x:n},o={reps:s};return $.runKernel(ka,i,o)}var Vu=D({broadcastTo_:rN});function aN(e){let t={x:E(e,"x","ceil")};return $.runKernel(hs,t)}var Zf=D({ceil_:aN});function sN(e,t,n){let r=E(e,"x","clipByValue");M(t<=n,()=>`Error in clip: min (${t}) must be less than or equal to max (${n}).`);let a={x:r},s={clipValueMin:t,clipValueMax:n};return $.runKernel(va,a,s)}var wn=D({clipByValue_:sN});function iN(e){return rt(e,0)}var rx=D({concat1d_:iN});function oN(e,t){return rt(e,t)}var ll=D({concat2d_:oN});function lN(e,t){return rt(e,t)}var ax=D({concat3d_:lN});function uN(e,t){return rt(e,t)}var sx=D({concat4d_:uN});function cN(e,t,n,r,a="NHWC",s=[1,1],i){let o=E(e,"x","conv2d"),l=E(t,"filter","conv2d"),c=o,u=!1;o.rank===3&&(u=!0,c=H(o,[1,o.shape[0],o.shape[1],o.shape[2]])),M(c.rank===4,()=>`Error in conv2d: input must be rank 4, but got rank ${c.rank}.`),M(l.rank===4,()=>`Error in conv2d: filter must be rank 4, but got rank ${l.rank}.`),i!=null&&M(Vt(r),()=>`Error in conv2d: pad must be an integer when using, dimRoundingMode ${i} but got pad ${r}.`);let h=a==="NHWC"?c.shape[3]:c.shape[1];M(h===l.shape[2],()=>`Error in conv2d: depth of input (${h}) must match input depth for filter ${l.shape[2]}.`),M(Mr(n,s),()=>`Error in conv2D: Either strides or dilations must be 1. Got strides ${n} and dilations '${s}'`);let d={x:c,filter:l},p={strides:n,pad:r,dataFormat:a,dilations:s,dimRoundingMode:i},f=$.runKernel(ds,d,p);return u?H(f,[f.shape[1],f.shape[2],f.shape[3]]):f}var ea=D({conv2d_:cN});function hN(e,t,n,r,a="NWC",s=1,i){let o=E(e,"x","conv1d"),l=E(t,"filter","conv1d"),c=o,u=!1;o.rank===2&&(u=!0,c=H(o,[1,o.shape[0],o.shape[1]])),M(c.rank===3,()=>`Error in conv1d: input must be rank 3, but got rank ${c.rank}.`),M(l.rank===3,()=>`Error in conv1d: filter must be rank 3, but got rank ${l.rank}.`),i!=null&&M(Vt(r),()=>`Error in conv1d: pad must be an integer when using, dimRoundingMode ${i} but got pad ${r}.`),M(c.shape[2]===l.shape[1],()=>`Error in conv1d: depth of input (${c.shape[2]}) must match input depth for filter ${l.shape[1]}.`),M(Mr(n,s),()=>`Error in conv1D: Either stride or dilation must be 1. Got stride ${n} and dilation '${s}'`),M(a==="NWC",()=>`Error in conv1d: got dataFormat of ${a} but only NWC is currently supported.`);let h=H(l,[1,l.shape[0],l.shape[1],l.shape[2]]),d=H(c,[c.shape[0],1,c.shape[1],c.shape[2]]),p=ea(d,h,[1,n],r,"NHWC",[1,s],i);return u?H(p,[p.shape[2],p.shape[3]]):H(p,[p.shape[0],p.shape[2],p.shape[3]])}var pd=D({conv1d_:hN});function dN(e,t,n,r,a,s="NHWC",i){M(e.length===t.rank,()=>`Length of inShape (${e.length}) and rank of dy (${t.rank}) must match`);let o=e,l=t,c=!1;t.rank===3&&(c=!0,l=H(t,[1,t.shape[0],t.shape[1],t.shape[2]]),o=[1,e[0],e[1],e[2]]),M(o.length===4,()=>`Error in conv2dDerInput: inShape must be length 4, but got length ${o.length}.`),M(l.rank===4,()=>`Error in conv2dDerInput: dy must be rank 4, but got rank ${l.rank}`),M(n.rank===4,()=>`Error in conv2dDerInput: filter must be rank 4, but got rank ${n.rank}`);let u=s==="NHWC"?o[3]:o[1],h=s==="NHWC"?l.shape[3]:l.shape[1];M(u===n.shape[2],()=>`Error in conv2dDerInput: depth of input (${u}) must match input depth for filter ${n.shape[2]}.`),M(h===n.shape[3],()=>`Error in conv2dDerInput: depth of output (${h}) must match output depth for filter ${n.shape[3]}.`),i!=null&&M(Vt(a),()=>`Error in conv2dDerInput: pad must be an integer when using, dimRoundingMode ${i} but got pad ${a}.`);let d={dy:l,filter:n},p={strides:r,pad:a,dataFormat:s,dimRoundingMode:i,inputShape:o},f=$.runKernel(ps,d,p);return c?H(f,[f.shape[1],f.shape[2],f.shape[3]]):f}var Yf=D({conv2DBackpropInput_:dN});function pN(e,t,n,r,a,s){let i=E(e,"x","conv2dTranspose"),o=E(t,"filter","conv2dTranspose");return Yf(n,i,o,r,a,"NHWC",s)}var fd=D({conv2dTranspose_:pN});function fN(e,t,n,r,a="NDHWC",s=[1,1,1]){let i=E(e,"x","conv3d"),o=E(t,"filter","conv3d"),l=i,c=!1;i.rank===4&&(c=!0,l=H(i,[1,i.shape[0],i.shape[1],i.shape[2],i.shape[3]])),M(l.rank===5,()=>`Error in conv3d: input must be rank 5, but got rank ${l.rank}.`),M(o.rank===5,()=>`Error in conv3d: filter must be rank 5, but got rank ${o.rank}.`),M(l.shape[4]===o.shape[3],()=>`Error in conv3d: depth of input (${l.shape[4]}) must match input depth for filter ${o.shape[3]}.`),M(Mr(n,s),()=>`Error in conv3D: Either strides or dilations must be 1. Got strides ${n} and dilations '${s}'`),M(a==="NDHWC",()=>`Error in conv3d: got dataFormat of ${a} but only NDHWC is currently supported.`);let u={x:l,filter:o},h={strides:n,pad:r,dataFormat:a,dilations:s},d=$.runKernel(pu,u,h);return c?H(d,[d.shape[1],d.shape[2],d.shape[3],d.shape[4]]):d}var Jf=D({conv3d_:fN});function mN(e,t,n,r,a){M(e.length===t.rank,()=>`Length of inShape (${e.length}) and rank of dy (${t.rank}) must match`);let s=e,i=t,o=!1;t.rank===4&&(o=!0,i=H(t,[1,t.shape[0],t.shape[1],t.shape[2],t.shape[3]]),s=[1,e[0],e[1],e[2],e[3]]);let l=s[4],c=i.shape[4];M(s.length===5,()=>`Error in conv3dDerInput: inShape must be length 5, but got length ${s.length}.`),M(i.rank===5,()=>`Error in conv3dDerInput: dy must be rank 5, but got rank ${i.rank}`),M(n.rank===5,()=>`Error in conv3dDerInput: filter must be rank 5, but got rank ${n.rank}`),M(l===n.shape[3],()=>`Error in conv3dDerInput: depth of input (${l}) must match input depth for filter ${n.shape[3]}.`),M(c===n.shape[4],()=>`Error in conv3dDerInput: depth of output (${c}) must match output depth for filter ${n.shape[4]}.`);let u={dy:i,filter:n},h={pad:a,strides:r,inputShape:s},d=$.runKernel(Eh,u,h);return o?H(d,[d.shape[1],d.shape[2],d.shape[3],d.shape[4]]):d}var ix=D({conv3DBackpropInput_:mN});function AN(e,t,n,r,a){let s=E(e,"x","conv3dTranspose"),i=E(t,"filter","conv3dTranspose");return ix(n,s,i,r,a)}var yN=D({conv3dTranspose_:AN});function gN(e){let t={x:E(e,"x","cos")};return $.runKernel(fs,t)}var Uu=D({cos_:gN});function xN(e){let t={x:E(e,"x","cosh")};return $.runKernel(so,t)}var md=D({cosh_:xN});function wN(e,t=0,n=!1,r=!1){let a={x:E(e,"x","cumsum")},s={axis:t,exclusive:n,reverse:r};return $.runKernel(ms,a,s)}var Ad=D({cumsum_:wN});function bN(e,t,n,r=!1){let a=E(e,"x","denseBincount"),s=E(t,"weights","denseBincount");M(a.dtype==="int32",()=>`Error in denseBincount: input dtype must be int32, but got ${a.dtype}`),M(a.rank<=2,()=>`Error in denseBincount: input must be at most rank 2, but got rank ${a.rank}.`),M(n>=0,()=>`size must be non-negative, but got ${n}.`),M(s.size===a.size||s.size===0,()=>`Error in denseBincount: weights must have the same shape as x or 0-length, but got x shape: ${a.shape}, weights shape: ${s.shape}.`);let i={x:a,weights:s},o={size:n,binaryOutput:r};return $.runKernel(Rh,i,o)}var ox=D({denseBincount_:bN});function _N(e,t,n="NHWC"){let r=E(e,"x","depthToSpace"),a=n==="NHWC"?r.shape[1]:r.shape[2],s=n==="NHWC"?r.shape[2]:r.shape[3],i=n==="NHWC"?r.shape[3]:r.shape[1];M(a*t>=0,()=>`Negative dimension size caused by overflow when multiplying - ${a} and ${t} for depthToSpace with input shape - ${r.shape}`),M(s*t>=0,()=>`Negative dimension size caused by overflow when multiplying - ${s} and ${t} for depthToSpace with input shape - ${r.shape}`),M(i%(t*t)==0,()=>`Dimension size must be evenly divisible by ${t*t} but is ${i} for depthToSpace with input shape ${r.shape}`);let o={x:r},l={blockSize:t,dataFormat:n};return $.runKernel(oo,o,l)}var Qf=D({depthToSpace_:_N});function vN(e,t,n,r,a="NHWC",s=[1,1],i){let o=E(e,"x","depthwiseConv2d"),l=E(t,"filter","depthwiseConv2d"),c=o,u=!1;o.rank===3&&(u=!0,c=H(o,[1,o.shape[0],o.shape[1],o.shape[2]])),M(c.rank===4,()=>`Error in depthwiseConv2d: input must be rank 4, but got rank ${c.rank}.`),M(l.rank===4,()=>`Error in depthwiseConv2d: filter must be rank 4, but got rank ${l.rank}.`),M(c.shape[3]===l.shape[2],()=>`Error in depthwiseConv2d: number of input channels (${c.shape[3]}) must match the inChannels dimension in filter ${l.shape[2]}.`),i!=null&&M(Vt(r),()=>`Error in depthwiseConv2d: pad must be an integer when using, dimRoundingMode ${i} but got pad ${r}.`);let h={x:c,filter:l},d={strides:n,pad:r,dataFormat:a,dilations:s,dimRoundingMode:i},p=$.runKernel(As,h,d);return u?H(p,[p.shape[1],p.shape[2],p.shape[3]]):p}var ul=D({depthwiseConv2d_:vN});function kN(e){let t={x:E(e,"x","diag")};return $.runKernel($h,t)}var IN=D({diag_:kN});function NN(e,t,n,r,a=[1,1],s="NHWC"){let i=E(e,"x","dilation2d"),o=E(t,"filter","dilation2d");M(i.rank===3||i.rank===4,()=>`Error in dilation2d: input must be rank 3 or 4, but got rank ${i.rank}.`),M(o.rank===3,()=>`Error in dilation2d: filter must be rank 3, but got rank ${o.rank}.`),M(s==="NHWC",()=>`Error in dilation2d: Only NHWC is currently supported, but got dataFormat of ${s}`);let l=i,c=!1;i.rank===3&&(l=H(i,[1,i.shape[0],i.shape[1],i.shape[2]]),c=!0);let u={x:l,filter:o},h={strides:n,pad:r,dilations:a},d=$.runKernel(fu,u,h);return c?H(d,[d.shape[1],d.shape[2],d.shape[3]]):d}var em=D({dilation2d_:NN});function SN(e,t){let n=e.length,r=[];for(let a=0;a1&&i===1&&r.unshift(s)}return r}function Ot(e,t){let n=[];for(let r=0;r1)&&n.unshift(s)}return n}function ft(e,t){let n=[],r=Math.max(e.length,t.length);for(let a=0;a"The first dimension of `a` must match the size of `condition`."),s.rank!==1&&tn(s.shape,l.shape,"Error in where: ");let c={condition:s,t:o,e:l};return $.runKernel(zo,c)}var bn=D({where_:CN});function EN(e){let t={x:E(e,"x","zerosLike")};return $.runKernel(Xo,t)}var je=D({zerosLike_:EN});function RN(e,t){let n=E(e,"a","div"),r=E(t,"b","div");[n,r]=bt(n,r);let a=ge(n,r),s=je(a),i=Ma(r,s);return bn(i,s,a)}var tm=D({divNoNan_:RN});function MN(e,t){let n=E(e,"t1","dot"),r=E(t,"t2","dot");M((n.rank===1||n.rank===2)&&(r.rank===1||r.rank===2),()=>`Error in dot: inputs must all be rank 1 or 2, but got ranks ${n.rank} and ${r.rank}.`);let a=n.rank===1?n.size:n.shape[1],s=r.rank===1?r.size:r.shape[0];if(M(a===s,()=>`Error in dot: inner dimensions of inputs must match, but got ${a} and ${s}.`),n.rank===1&&r.rank===1){let i=H(n,[1,-1]),o=H(r,[-1,1]),l=Ge(i,o);return H(l,[])}else if(n.rank===1&&r.rank===2){let i=H(n,[1,-1]),o=H(r,[r.shape[0],r.shape[1]]),l=Ge(i,o);return H(l,[l.size])}else if(n.rank===2&&r.rank===1){let i=H(r,[-1,1]),o=Ge(n,i);return H(o,[o.size])}else{let i=H(r,[r.shape[0],r.shape[1]]);return Ge(n,i)}}var lx=D({dot_:MN});function FN(e){let t={x:E(e,"x","elu")};return $.runKernel(lo,t)}var cl=D({elu_:FN});function $N(e){let t=E(e,"x","erf");M(t.dtype==="int32"||t.dtype==="float32",()=>"Input dtype must be `int32` or `float32`."),t.dtype==="int32"&&(t=me(t,"float32"));let n={x:t};return $.runKernel(uo,n)}var nm=D({erf_:$N});function DN(e){let t={x:E(e,"x","exp")};return $.runKernel(gs,t)}var Gn=D({exp_:DN});function ON(e,t=0){let n=E(e,"x","expandDims","string_or_numeric");M(t<=n.rank,()=>"Axis must be <= rank of the tensor");let r={input:n},a={dim:t};return $.runKernel(ho,r,a)}var on=D({expandDims_:ON});function zN(e){let t={x:E(e,"x","expm1")};return $.runKernel(po,t)}var rm=D({expm1_:zN});function PN(e,t){let n=E(e,"x","tile","string_or_numeric");M(n.rank===t.length,()=>`Error in transpose: rank of input ${n.rank} must match length of reps ${t}.`);let r={x:n},a={reps:t};return $.runKernel(ka,r,a)}var Fa=D({tile_:PN});function LN(e,t,n,r="float32"){t==null&&(t=e);let a=Le([e,t],r),s=e<=t?e:t;for(let o=0;o`Error in localResponseNormalization: x must be rank 3 or 4 but got - rank ${s.rank}.`),M(Vt(t),()=>`Error in localResponseNormalization: depthRadius must be an integer but got depthRadius ${t}.`);let i=s,o=!1;s.rank===3&&(o=!0,i=H(s,[1,s.shape[0],s.shape[1],s.shape[2]]));let l={x:i},c={depthRadius:t,bias:n,alpha:r,beta:a},u=$.runKernel(gu,l,c);return o?H(u,[u.shape[1],u.shape[2],u.shape[3]]):u}var sm=D({localResponseNormalization_:YN});function JN(e){let t={x:E(e,"x","log")};return $.runKernel(Is,t)}var En=D({log_:JN});function QN(e){let t={x:E(e,"x","log1p")};return $.runKernel(vo,t)}var xd=D({log1p_:QN});function eS(e){return M(ba(e),()=>"The f passed in grad(f) must be a function"),(t,n)=>{let r=E(t,"x","tf.grad","string_or_numeric"),a=n!=null?E(n,"dy","tf.grad"):null;return $.tidy(()=>{let{value:s,grads:i}=$.gradients(()=>e(r),[r],a);return a!=null&&tn(s.shape,a.shape,"The shape of dy passed in grad(f)(x, dy) must match the shape returned by f(x)"),wd(i),i[0]})}}function tS(e){return M(ba(e),()=>"The f passed in grads(f) must be a function"),(t,n)=>{M(Array.isArray(t),()=>"The args passed in grads(f)(args) must be an array of `Tensor`s or `TensorLike`s");let r=Du(t,"args","tf.grads","string_or_numeric"),a=n!=null?E(n,"dy","tf.grads"):null;return $.tidy(()=>{let{value:s,grads:i}=$.gradients(()=>e(...r),r,a);return a!=null&&tn(s.shape,a.shape,"The shape of dy passed in grads(f)([x1,...], dy) must match the shape returned by f([x1,...])"),wd(i),i})}}function nS(e){return M(ba(e),()=>"The f passed in valueAndGrad(f) must be a function"),(t,n)=>{M(t instanceof Ue,()=>"The x passed in valueAndGrad(f)(x) must be a tensor"),M(n==null||n instanceof Ue,()=>"The dy passed in valueAndGrad(f)(x, dy) must be a tensor");let{grads:r,value:a}=$.gradients(()=>e(t),[t],n);return wd(r),{grad:r[0],value:a}}}function rS(e){return M(ba(e),()=>"The f passed in valueAndGrads(f) must be a function"),(t,n)=>{M(Array.isArray(t)&&t.every(a=>a instanceof Ue),()=>"The args passed in valueAndGrads(f)(args) must be array of tensors"),M(n==null||n instanceof Ue,()=>"The dy passed in valueAndGrads(f)(args, dy) must be a tensor");let r=$.gradients(()=>e(...t),t,n);return n!=null&&tn(r.value.shape,n.shape,"The shape of dy passed in valueAndGrads(f)([x1,...], dy) must match the shape returned by f([x1,...])"),wd(r.grads),r}}function px(e,t){M(ba(e),()=>"The f passed in variableGrads(f) must be a function"),M(t==null||Array.isArray(t)&&t.every(c=>c instanceof Mu),()=>"The varList passed in variableGrads(f, varList) must be an array of variables");let n=t!=null;if(!n){t=[];for(let c in $.registeredVariables)t.push($.registeredVariables[c])}let r=n?t.filter(c=>!c.trainable):null,a=t.length;t=t.filter(c=>c.trainable),M(t.length>0,()=>`variableGrads() expects at least one of the input variables to be trainable, but none of the ${a} variables is trainable.`);let s=!0,{value:i,grads:o}=$.gradients(e,t,null,s);M(o.some(c=>c!=null),()=>"Cannot find a connection between any variable and the result of the loss function y=f(x). Please make sure the operations that use variables are inside the function f passed to minimize()."),M(i.rank===0,()=>`The f passed in variableGrads(f) must return a scalar, but it returned a rank-${i.rank} tensor`);let l={};return t.forEach((c,u)=>{o[u]!=null&&(l[c.name]=o[u])}),r!=null&&r.forEach(c=>l[c.name]=null),{value:i,grads:l}}function Fr(e){return $.customGrad(e)}function wd(e){if(e.filter(t=>t==null).length>0)throw new Error(`Cannot compute gradient of y=f(x) with respect to x. Make sure that - the f you passed encloses all operations that lead from x to y.`)}function aS(e){let t={x:E(e,"x","neg")};return $.runKernel(No,t)}var _t=D({neg_:aS});function sS(e){let t={x:E(e,"x","softplus")};return $.runKernel(Vo,t)}var dl=D({softplus_:sS});function iS(e){let t=E(e,"x","logSigmoid");return Fr(n=>({value:_t(dl(_t(n))),gradFunc:r=>P(r,Cn(_t(n)))}))(t)}var fx=D({logSigmoid_:iS});function oS(e,t=null,n=!1){let r={x:E(e,"x","max")},a={reductionIndices:t,keepDims:n};return $.runKernel(Ns,r,a)}var qn=D({max_:oS});function lS(e,t){let n=E(e,"a","sub"),r=E(t,"b","sub");[n,r]=bt(n,r);let a={a:n,b:r};return $.runKernel(Ks,a)}var ye=D({sub_:lS});function uS(e,t=null,n=!1){let r=E(e,"x","sum");r.dtype==="bool"&&(r=me(r,"int32"));let a={x:r},s={axis:t,keepDims:n};return $.runKernel(Gs,a,s)}var Ce=D({sum_:uS});function cS(e,t=-1){let n=E(e,"logits","logSoftmax");if(t===-1&&(t=n.rank-1),t!==n.rank-1)throw Error(`Log Softmax along a non-last dimension is not yet supported. Logits was rank ${n.rank} and axis was ${t}`);return Fr((r,a)=>{let s=!0,i=qn(r,t,!0),o=ye(r,i),l=ye(me(o,"float32"),En(Ce(Gn(o),t,s)));return a([l]),{value:l,gradFunc:(c,u)=>{let[h]=u,d=!0,p=Gn(h);return ye(c,P(Ce(c,t,d),p))}}})(n)}var bd=D({logSoftmax_:cS});function im(e,t){for(let n=0;ne[s]);return[n,a]}function ci(e,t){let n=t.map(r=>1);return mx(e,n,t)}function hS(e,t,n){M(im(t,n),()=>`${e} supports only inner-most axes for now. Got axes ${t} and rank-${n} input.`)}function yx(e,t){if(im(e,t))return null;let n=[];for(let r=0;rn.push(r)),n}function om(e){return e.map((t,n)=>[n,t]).sort((t,n)=>t[1]-n[1]).map(t=>t[0])}function dS(e,t){let n=[];for(let r=t-e;r`Error in maxPool: input must be rank 4 but got rank ${o.rank}.`),M(Mr(n,i),()=>`Error in maxPool: Either strides or dilations must be 1. Got strides ${n} and dilations '${i}'`),a!=null&&M(Vt(r),()=>`Error in maxPool: pad must be an integer when using, dimRoundingMode ${a} but got pad ${r}.`);let c={x:o},u={filterSize:t,strides:n,pad:r,dimRoundingMode:a},h=$.runKernel(Ts,c,u);return l?H(h,[h.shape[1],h.shape[2],h.shape[3]]):h}var qu=D({maxPool_:gS});function xS(e,t=[1,1,1],n,r,a,s="NDHWC"){let i=E(e,"x","maxPool3d"),o=i,l=!1;i.rank===4&&(l=!0,o=H(i,[1,i.shape[0],i.shape[1],i.shape[2],i.shape[3]])),M(o.rank===5,()=>`Error in maxPool3d: x must be rank 5 but got rank ${o.rank}.`),M(s==="NDHWC",()=>`Error in maxPool3d: Only NDHWC is currently supported, but got dataFormat of ${s}`),a!=null&&M(Vt(r),()=>`Error in maxPool3d: pad must be an integer when using, dimRoundingMode ${a} but got pad ${r}.`);let c={x:o},u={filterSize:t,strides:n,pad:r,dimRoundingMode:a,dataFormat:s},h=$.runKernel(xu,c,u);return l?H(h,[h.shape[1],h.shape[2],h.shape[3],h.shape[4]]):h}var um=D({maxPool3d_:xS});function wS(e,t,n,r,a=!1){let s={x:E(e,"x","maxPoolWithArgmax")},i={filterSize:t,strides:n,pad:r,includeBatchInIndex:a},o=$.runKernel(Hh,s,i);return{result:o[0],indexes:o[1]}}var xx=D({maxPoolWithArgmax_:wS});function bS(e,t){let n=E(e,"a","maximum"),r=E(t,"b","maximum");[n,r]=bt(n,r),n.dtype==="bool"&&(n=me(n,"int32"),r=me(r,"int32")),ft(n.shape,r.shape);let a={a:n,b:r};return $.runKernel(Ss,a)}var $r=D({maximum_:bS});function _S(e,t=null,n=!1){let r={x:E(e,"x","mean")},a={axis:t,keepDims:n};return $.runKernel(Cs,r,a)}var vt=D({mean_:_S});function vS(e,t=null,n=!1){let r={x:E(e,"x","min")},a={axis:t,keepDims:n};return $.runKernel(Es,r,a)}var pl=D({min_:vS});function kS(e,t){let n=E(e,"a","minimum"),r=E(t,"b","minimum");[n,r]=bt(n,r),n.dtype==="bool"&&(n=me(n,"int32"),r=me(r,"int32")),ft(n.shape,r.shape);let a={a:n,b:r};return $.runKernel(Rs,a)}var fl=D({minimum_:kS});function IS(e,t,n){M(n==="reflect"||n==="symmetric",()=>`Invalid mode. Mode must be either reflect or symmetric. Got ${n}.`);let r=E(e,"x","mirrorPad");if(r.rank===0)throw new Error("mirrorPad(scalar) is not defined. Pass non-scalar to mirrorPad");M(t.length===r.rank,()=>`Padding doesn't match input. Must be ${r.rank}. Got ${t.length}.`);let a=n==="reflect"?1:0;for(let o=0;o"Invalid number of paddings. Must be length of 2 each."),M(t[o][0]>=0&&t[o][0]<=r.shape[o]-a&&t[o][1]>=0&&t[o][1]<=r.shape[o]-a,()=>`Padding in dimension ${o} cannot be greater than or equal to ${r.shape[o]-a} or less than 0 for input of shape ${r.shape}`);let s={paddings:t,mode:n},i={x:r};return $.runKernel(wu,i,s)}var cm=D({mirrorPad_:IS});function NS(e,t){let n=E(e,"a","mod"),r=E(t,"b","mod");[n,r]=bt(n,r);let a={a:n,b:r};return $.runKernel(Io,a)}var hm=D({mod_:NS});function SS(e){let t=E(e,"x","square"),n={};return $.runKernel("Square",{x:t},n)}var it=D({square_:SS});function TS(e,t=null,n=!1){e=E(e,"x","moments");let r=tr(t,e.shape),a=vt(e,r,n),s=a.shape;n||(s=ci(a.shape,r));let i=it(ye(me(e,"float32"),H(a,s))),o=vt(i,r,n);return{mean:a,variance:o}}var vd=D({moments_:TS});function CS(e,t,n,r){let a=E(t,"data","multiRNNCell"),s=Du(n,"c","multiRNNCell"),i=Du(r,"h","multiRNNCell"),o=a,l=[];for(let h=0;h2)throw new Error(`Rank of probabilities must be 1 or 2, but is ${i}`);n=n||Math.random();let o={logits:i===1?H(a,[1,-1]):a},l={numSamples:t,seed:n,normalized:r},c=$.runKernel(Gh,o,l);return i===1?H(c,[c.size]):c}var wx=D({multinomial_:RS});function MS(e,t){let n=E(e,"a","notEqual"),r=E(t,"b","notEqual");[n,r]=bt(n,r),ft(n.shape,r.shape);let a={a:n,b:r};return $.runKernel(So,a)}var hi=D({notEqual_:MS});function Ct(e,t="float32"){if(t==="complex64"){let r=Ct(e,"float32"),a=Ct(e,"float32");return Na(r,a)}let n=bh(Ft(e),t);return $.makeTensor(n,e,t)}function Dr(e,t="float32"){if(t==="complex64"){let r=Dr(e,"float32"),a=Ct(e,"float32");return Na(r,a)}let n=rf(Ft(e),t);return $.makeTensor(n,e,t)}function FS(e){let t={x:E(e,"x","onesLike")};return $.runKernel(Ro,t)}var Rn=D({onesLike_:FS});function $S(e,t){let n=E(e,"v1","outerProduct"),r=E(t,"v2","outerProduct");M(n.rank===1&&r.rank===1,()=>`Error in outerProduct: inputs must be rank 1, but got ranks ${n.rank} and ${r.rank}.`);let a=H(n,[-1,1]),s=H(r,[1,-1]);return Ge(a,s)}var DS=D({outerProduct_:$S});function OS(e,t,n=0){let r=E(e,"x","pad");if(r.rank===0)throw new Error("pad(scalar) is not defined. Pass non-scalar to pad");let a={paddings:t,constantValue:n},s={x:r};return $.runKernel($s,s,a)}var ta=D({pad_:OS});function zS(e,t,n=0){return M(t.length===2,()=>"Invalid number of paddings. Must be length of 2."),ta(e,[t],n)}var PS=D({pad1d_:zS});function LS(e,t,n=0){return M(t.length===2&&t[0].length===2&&t[1].length===2,()=>"Invalid number of paddings. Must be length of 2 each."),ta(e,t,n)}var WS=D({pad2d_:LS});function BS(e,t,n=0){return M(t.length===3&&t[0].length===2&&t[1].length===2&&t[2].length===2,()=>"Invalid number of paddings. Must be length of 2 each."),ta(e,t,n)}var VS=D({pad3d_:BS});function US(e,t,n=0){return M(t.length===4&&t[0].length===2&&t[1].length===2&&t[2].length===2&&t[3].length===2,()=>"Invalid number of paddings. Must be length of 2 each."),ta(e,t,n)}var jS=D({pad4d_:US});function HS(e,t,n){let r=E(e,"x","spaceToBatchND");M(r.rank>=1+t.length,()=>`input rank ${r.rank} should be > than [blockShape] ${t.length}`),M(n.length===t.length,()=>`paddings.shape[0] ${n.length} must be equal to [blockShape] ${t.length}`),M(r.shape.reduce((i,o,l)=>l>0&&l<=t.length?i&&(o+n[l-1][0]+n[l-1][1])%t[l-1]==0:i,!0),()=>`input spatial dimensions ${r.shape.slice(1)} with paddings ${n.toString()} must be divisible by blockShapes ${t.toString()}`);let a={x:r},s={blockShape:t,paddings:n};return $.runKernel(vu,a,s)}var Xu=D({spaceToBatchND_:HS});function XS(e,t,n,r,a,s){a==null&&(a=[1,1]),s==null&&(s=1),r===0&&(r="valid");let i=E(e,"x","maxPool"),o=i,l=!1;i.rank===3&&(l=!0,o=H(i,[1,i.shape[0],i.shape[1],i.shape[2]])),M(Mr(s,a),()=>`Error in pool: Either strides or dilations must be 1. Got strides ${s} and dilations '${a}'`);let c=Y5(o.shape,t,s,a,r),u=[c.dilationHeight,c.dilationWidth],h;r==="same"?h=qS([c.filterHeight,c.filterWidth],u):h=[[0,0],[0,0]];let d=u[0]===1&&u[1]===1,[p,f]=GS([c.inHeight,c.inWidth],u,h),m=d?r:"valid",A=d?o:Xu(o,u,p),y=(n==="avg"?()=>Wu(A,t,s,m):()=>qu(A,t,s,m))(),g=d?y:Bu(y,u,f);return l?H(g,[g.shape[1],g.shape[2],g.shape[3]]):g}function GS(e,t,n){let r=n.map(u=>u[0]),a=n.map(u=>u[1]),s=e.concat(r,a),i=t.map((u,h)=>(u-s[h]%u)%u),o=a.map((u,h)=>u+i[h]),l=t.map((u,h)=>[r[h],o[h]]),c=t.map((u,h)=>[0,i[h]]);return[l,c]}function qS(e,t){let n=e.map((s,i)=>s+(s-1)*(t[i]-1)).map(s=>s-1),r=n.map(s=>Math.floor(s/2)),a=n.map((s,i)=>s-r[i]);return n.map((s,i)=>[r[i],a[i]])}var bx=D({pool_:XS});function KS(e,t){let n=E(e,"base","pow"),r=E(t,"exp","pow");[n,r]=bt(n,r);let a={a:n,b:r};return $.runKernel(Ds,a)}var na=D({pow_:KS});function ZS(e,t){let n=E(e,"x","prelu"),r=E(t,"alpha","prelu"),a={x:n,alpha:r};return $.runKernel(Os,a)}var Ku=D({prelu_:ZS});function YS(e,t=null,n=!1){let r=E(e,"x","prod");r.dtype==="bool"&&(r=me(r,"int32"));let a={x:r},s={axis:t,keepDims:n};return $.runKernel(Fo,a,s)}var kd=D({prod_:YS});function JS(e,t,n){let r=Ft(e),a=null;if(n==null||n==="float32")a=new Float32Array(r);else if(n==="int32")a=new Int32Array(r);else if(n==="bool")a=new Uint8Array(r);else throw new Error(`Unknown data type ${n}`);for(let s=0;s=1||s===0);let i=Math.sqrt(-2*Math.log(s)/s);e=this.mean+this.stdDev*r*i,t=this.mean+this.stdDev*a*i,(!this.truncated||this.isValidTruncated(e))&&(n=!0)}return(!this.truncated||this.isValidTruncated(t))&&(this.nextVal=this.convertValue(t)),this.convertValue(e)}convertValue(e){return this.dtype==null||this.dtype==="float32"?e:Math.round(e)}isValidTruncated(e){return e<=this.upper&&e>=this.lower}},eT=class{constructor(e,t,n,r){this.alpha=e,this.beta=1/t,this.dtype=n;let a=r||Math.random();this.randu=dm.alea(a.toString()),this.randn=new pm(0,1,n,!1,this.randu()),e<1?this.d=e+2/3:this.d=e-1/3,this.c=1/Math.sqrt(9*this.d)}nextValue(){let e,t,n,r,a,s;for(;;){do r=this.randn.nextValue(),s=1+this.c*r;while(s<=0);if(s*=s*s,e=r*r,t=1-.331*e*e,n=.5*e+this.d*(1-s+Math.log(s)),a=this.randu(),athis.dtype==null||this.dtype==="float32",this.min=e,this.range=t-e,this.dtype=n,r==null&&(r=Math.random()),typeof r=="number"&&(r=r.toString()),!this.canReturnFloat()&&this.range<=1)throw new Error(`The difference between ${e} - ${t} <= 1 and dtype is not float`);this.random=dm.alea(r)}convertValue(e){return this.canReturnFloat()?e:Math.round(e)}nextValue(){return this.convertValue(this.min+this.range*this.random())}};function nT(e,t,n=1,r="float32",a){if(n==null&&(n=1),r==null&&(r="float32"),r!=="float32"&&r!=="int32")throw new Error(`Unsupported data type ${r}`);let s=new eT(t,n,r,a),i=Le(e,r);for(let o=0;o`Error in reverse1D: x must be rank 1 but got rank ${t.rank}.`),Mn(t,0)}var dT=D({reverse1d_:hT});function pT(e,t){let n=E(e,"x","reverse");return M(n.rank===2,()=>`Error in reverse2D: x must be rank 2 but got rank ${n.rank}.`),Mn(n,t)}var fT=D({reverse2d_:pT});function mT(e,t){let n=E(e,"x","reverse");return M(n.rank===3,()=>`Error in reverse3D: x must be rank 3 but got rank ${n.rank}.`),Mn(n,t)}var AT=D({reverse3d_:mT});function yT(e,t){let n=E(e,"x","reverse");return M(n.rank===4,()=>`Error in reverse4D: x must be rank 4 but got rank ${n.rank}.`),Mn(n,t)}var gT=D({reverse4d_:yT});function xT(e){let t={x:E(e,"x","round")};return $.runKernel(Bs,t)}var mm=D({round_:xT});function wT(e){let t={x:E(e,"x","rsqrt")};return $.runKernel(Vs,t)}var Sd=D({rsqrt_:wT});function _e(e,t){if((nn(e)&&t!=="string"||Array.isArray(e))&&t!=="complex64")throw new Error("Error creating a new Scalar: value must be a primitive (number|boolean|string)");if(t==="string"&&nn(e)&&!(e instanceof Uint8Array))throw new Error("When making a scalar from encoded string, the value must be `Uint8Array`.");return Sa(e,[],[],t)}function bT(e){let t={x:E(e,"x","selu")};return $.runKernel(Po,t)}var Td=D({selu_:bT});function _T(e,t,n,r,a,s=[1,1],i="NHWC"){let o=E(e,"x","separableConv2d"),l=E(t,"depthwiseFilter","separableConv2d"),c=E(n,"pointwiseFilter","separableConv2d"),u=o,h=!1;if(o.rank===3&&(h=!0,u=H(o,[1,o.shape[0],o.shape[1],o.shape[2]])),i==="NCHW")throw new Error("separableConv2d currently does not support dataFormat NCHW; only NHWC is supported");M(u.rank===4,()=>`Error in separableConv2d: input must be rank 4, but got rank ${u.rank}.`),M(l.rank===4,()=>`Error in separableConv2d: depthwise filter must be rank 4, but got rank ${l.rank}.`),M(c.rank===4,()=>`Error in separableConv2d: pointwise filter must be rank 4, but got rank ${l.rank}.`),M(c.shape[0]===1,()=>`Error in separableConv2d: the first dimension of pointwise filter must be 1, but got ${c.shape[0]}.`),M(c.shape[1]===1,()=>`Error in separableConv2d: the second dimension of pointwise filter must be 1, but got ${c.shape[1]}.`);let d=l.shape[2],p=l.shape[3];M(c.shape[2]===d*p,()=>`Error in separableConv2d: the third dimension of pointwise filter must be ${d*p}, but got ${c.shape[2]}.`);let f=ul(u,l,r,a,i,s),m=ea(f,c,1,"valid",i);return h?H(m,[m.shape[1],m.shape[2],m.shape[3]]):m}var Am=D({separableConv2d_:_T});async function vT(e,t){let n=E(e,"x","setdiff1d"),r=E(t,"y","setdiff1d");M(n.dtype===r.dtype,()=>`x and y should have the same dtype, but got x (${n.dtype}) and y (${r.dtype}).`),M(n.rank===1,()=>`x should be 1D tensor, but got x (${n.shape}).`),M(r.rank===1,()=>`y should be 1D tensor, but got y (${r.shape}).`);let a=await n.data(),s=await r.data(),i=new Set(s),o=0;for(let u=0;u`slice1d expects a rank-1 tensor, but got a rank-${r.rank} tensor`),Ee(r,[t],[n])}var Rd=D({slice1d_:ST});function TT(e,t,n){let r=E(e,"x","slice2d");return M(r.rank===2,()=>`slice2d expects a rank-2 tensor, but got a rank-${r.rank} tensor`),Ee(r,t,n)}var gm=D({slice2d_:TT});function CT(e,t,n){let r=E(e,"x","slice3d");return M(r.rank===3,()=>`slice3d expects a rank-3 tensor, but got a rank-${r.rank} tensor`),Ee(r,t,n)}var Md=D({slice3d_:CT});function ET(e,t,n){let r=E(e,"x","slice4d");return M(r.rank===4,()=>`slice4d expects a rank-4 tensor, but got a rank-${r.rank} tensor`),Ee(r,t,n)}var Yu=D({slice4d_:ET});function RT(e,t=-1){let n=E(e,"logits","softmax","float32");if(t===-1&&(t=n.rank-1),t!==n.rank-1)throw Error(`Softmax along a non-last dimension is not yet supported. Logits was rank ${n.rank} and dim was ${t}`);let r={logits:n},a={dim:t};return $.runKernel(qs,r,a)}var Ju=D({softmax_:RT});function MT(e){M(e.dtype==="complex64",()=>`The dtype for tf.spectral.fft() must be complex64 but got ${e.dtype}.`);let t={input:e};return $.runKernel(Ph,t)}var Qu=D({fft_:MT});function FT(e){M(e.dtype==="complex64",()=>`The dtype for tf.spectral.ifft() must be complex64 but got ${e.dtype}.`);let t={input:e};return $.runKernel(Lh,t)}var Al=D({ifft_:FT});function $T(e){let t=e.shape[e.shape.length-1],n=e.size/t,r;if(t<=2){let a=H(e,[n,t]);r=Al(a)}else{let a=[n,2*(t-1)],s=H(Zu(e),[n,t]),i=H(yd(e),[n,t]),o=Mn(Ee(s,[0,1],[n,t-2]),1),l=P(Mn(Ee(i,[0,1],[n,t-2]),1),_e(-1)),c=rt([s,o],1),u=rt([i,l],1),h=H(Na(c,u),[a[0],a[1]]);r=Al(h)}if(r=Zu(r),e.rank===3&&e.shape[0]!==0){let a=r,s=e.shape[0];r=H(r,[s,r.shape[0]/s,r.shape[1]]),a.dispose()}return r}var Fd=D({irfft_:$T});function DT(e,t,n=0){let r={x:E(e,"x","split")},a={numOrSizeSplits:t,axis:n};return $.runKernel(Uo,r,a)}var zt=D({split_:DT});function OT(e,t){M(e.dtype==="float32",()=>`The dtype for rfft() must be real value but got ${e.dtype}`);let n=e.shape[e.shape.length-1],r=e.size/n,a;if(t!=null&&t0),m=e.shape.map(A=>A);m[e.shape.length-1]=t,a=Ee(e,f,m),n=t}else if(t!=null&&t>n){let f=e.shape.map(m=>m);f[e.shape.length-1]=t-n,a=rt([e,Ct(f)],e.shape.length-1),n=t}else a=e;let s=je(a),i=H(Na(a,s),[r,n]),o=Qu(i),l=Math.floor(n/2)+1,c=Zu(o),u=yd(o),h=zt(c,[l,n-l],c.shape.length-1),d=zt(u,[l,n-l],u.shape.length-1),p=a.shape.slice();return p[a.shape.length-1]=l,H(Na(h[0],d[0]),p)}var ec=D({rfft_:OT});function zT(e){let t={x:E(e,"x","sqrt")};return $.runKernel(Hs,t)}var Yt=D({sqrt_:zT});function PT(e,t){let n=E(e,"a","squaredDifference"),r=E(t,"b","squaredDifference");[n,r]=bt(n,r),ft(n.shape,r.shape);let a={a:n,b:r},s={};return $.runKernel(Xs,a,s)}var $d=D({squaredDifference_:PT});function LT(e,t){let n=E(e,"x","squeeze");return H(n,jg(n.shape,t).newShape)}var Da=D({squeeze_:LT});function WT(e,t=0){let n=Du(e,"tensors","stack","string_or_numeric");M(n.length>=1,()=>"Pass at least one tensor to tf.stack"),n.length>0&&M(t<=n[0].rank,()=>"Axis must be <= rank of the tensor");let r=n,a={axis:t};return $.runKernel(Mo,r,a)}var ln=D({stack_:WT});function BT(e,t=0){let n={x:E(e,"x","step")},r={alpha:t};return $.runKernel(Ia,n,r)}var yl=D({step_:BT});function VT(e,t,n,r,a=0,s=0,i=0,o=0,l=0){let c={x:E(e,"x","stridedSlice")},u={begin:t,end:n,strides:r,beginMask:a,endMask:s,ellipsisMask:i,newAxisMask:o,shrinkAxisMask:l};return $.runKernel(jo,c,u)}var xm=D({stridedSlice_:VT});function UT(e){let t={x:E(e,"x","tan")};return $.runKernel(Ho,t)}var wm=D({tan_:UT});function rn(e,t){as(e);let n=Cr(e,t);if(n.length!==1)throw new Error("tensor1d() requires values to be a flat/TypedArray");return Sa(e,null,n,t)}function _n(e,t,n){if(as(e),t!=null&&t.length!==2)throw new Error("tensor2d() requires shape to have two numbers");let r=Cr(e,n);if(r.length!==2&&r.length!==1)throw new Error("tensor2d() requires values to be number[][] or flat/TypedArray");if(r.length===1&&t==null)throw new Error("tensor2d() requires shape to be provided when `values` are a flat/TypedArray");return Sa(e,t,r,n)}function jT(e,t,n){if(as(e),t!=null&&t.length!==4)throw new Error("tensor4d() requires shape to have four numbers");let r=Cr(e,n);if(r.length!==4&&r.length!==1)throw new Error("tensor4d() requires values to be number[][][][] or flat/TypedArray");if(r.length===1&&t==null)throw new Error("tensor4d() requires shape to be provided when `values` are a flat array");return Sa(e,t,r,n)}function HT(e,t,n){if(as(e),t!=null&&t.length!==5)throw new Error("tensor5d() requires shape to have five numbers");let r=Cr(e,n);if(r.length!==5&&r.length!==1)throw new Error("tensor5d() requires values to be number[][][][][] or flat/TypedArray");if(r.length===1&&t==null)throw new Error("tensor5d() requires shape to be provided when `values` are a flat array");return Sa(e,t,r,n)}function GT(e,t,n){if(as(e),t!=null&&t.length!==6)throw new Error("tensor6d() requires shape to have six numbers");let r=Cr(e,n);if(r.length!==6&&r.length!==1)throw new Error("tensor6d() requires values to be number[][][][][][] or flat/TypedArray");if(r.length===1&&t==null)throw new Error("tensor6d() requires shape to be provided when `values` are a flat array");return t=t||r,Sa(e,t,r,n)}function qT(e,t=1,n=!0){let r=E(e,"x","topk");if(r.rank===0)throw new Error("topk() expects the input to be of rank 1 or higher");let a=r.shape[r.shape.length-1];if(t>a)throw new Error(`'k' passed to topk() must be <= the last dimension (${a}) but got ${t}`);let s={x:r},i={k:t,sorted:n},[o,l]=$.runKernel(Go,s,i);return{values:o,indices:l}}var bm=D({topk_:qT});function XT(e,t=0,n=1,r,a){if(r!=null&&r==="bool")throw new Error("Unsupported data type $ { dtype }");let s=new pm(t,n,r,!0,a),i=Le(e,r);for(let o=0;o0,()=>"The input tensor must be at least 1D");let r={x:n},a={axis:t},[s,i]=$.runKernel(Jh,r,a);return{values:s,indices:i}}var Od=D({unique_:KT});function ZT(e,t,n){let r=E(e,"x","unsortedSegmentSum"),a=E(t,"segmentIds","unsortedSegmentSum","int32");M(Vt(n),()=>"numSegments must be of dtype int");let s={x:r,segmentIds:a},i={numSegments:n};return $.runKernel(Iu,s,i)}var _m=D({unsortedSegmentSum_:ZT});function YT(e,t=0){let n=E(e,"x","unstack","string_or_numeric");M(t>=-n.shape.length&&t`Axis = ${t} is not in [-${n.shape.length}, ${n.shape.length})`);let r={value:n},a={axis:t};return $.runKernel(qo,r,a)}var sr=D({unstack_:YT});function kx(e,t=!0,n,r){return $.makeVariable(e,t,n,r)}function Ix(e,t){let n=[];for(let s=0;s0,()=>"mask cannot be scalar"),tn(o.slice(s,s+i),a.shape,"mask's shape must match the first K dimensions of tensor's shape,");let l=1;for(let m=s;m"Shape mismatch in v and x");let l=_e(1),c=ye(l,o),u=P(ye(i,s),c);if(a){M(r!=null,()=>"When using zeroDebias: true, step is required.");let h=E(r,"step","movingAverage");u=ge(u,ye(l,na(o,h)))}return se(s,u)}var rC=D({movingAverage_:nC});function aC(e,t,n){let r=E(e,"indices","scatterND","int32"),a=E(t,"updates","scatterND");Ff(a,r,n);let s={indices:r,updates:a},i={shape:n};return $.runKernel(Oo,s,i)}var Sx=D({scatterND_:aC});function sC(e,t,n,r){if(e.dtype!=="int32")throw new Error(`tf.sparseToDense() expects the indices to be int32 type, but the dtype was ${e.dtype}.`);if(e.rank>2)throw new Error(`sparseIndices should be a scalar, vector, or matrix, but got shape ${e.shape}.`);let a=e.rank>0?e.shape[0]:1,s=e.rank>1?e.shape[1]:1;if(n.length!==s)throw new Error(`outputShape has incorrect number of elements:, ${n.length}, should be: ${s}.`);let i=t.size;if(!(t.rank===0||t.rank===1&&i===a))throw new Error(`sparseValues has incorrect shape ${t.shape}, should be [] or [${a}]`);if(t.dtype!==r.dtype)throw new Error("sparseValues.dtype must match defaultValues.dtype")}function iC(e,t,n,r=0){let a=E(e,"sparseIndices","sparseToDense","int32"),s=E(t,"sparseValues","sparseToDense"),i=E(r,"defaultValue","sparseToDense",s.dtype);sC(a,s,n,i);let o={sparseIndices:a,sparseValues:s,defaultValue:i},l={outputShape:n};return $.runKernel(Zh,o,l)}var km=D({sparseToDense_:iC});function oC(e,t){let n=E(t,"indices","gatherND","int32"),r={params:E(e,"x","gatherND"),indices:n};return $.runKernel(Ao,r)}var Tx=D({gatherND_:oC});function lC(e,t){if(t==null)return e.shape.slice();if(Jr(e.shape,t))return t;if(e.shape.length===t.length){let n=[];for(let r=0;r`x has to be a floating point tensor since it's going to be scaled, but got a ${a.dtype} tensor instead.`),M(t>=0&&t<1,()=>`rate must be a float in the range [0, 1), but got ${t}.`),t===0)return e instanceof Ue?a.clone():a;let s=lC(a,n),i=1-t,o=ge(hl(se(ml(s,0,1,"float32",r),i)),i);return P(a,o)}var Cx=D({dropout_:uC});function Ex(e){return Math.floor(Math.pow(2,Math.ceil(Math.log(e)/Math.log(2))))}function Im(e,t,n){let r=1-e%2,a=new Float32Array(e);for(let s=0;s1,()=>`inTopK() expects the predictions to be of rank 2 or higher, but got ${r.rank}`),M(r.rank-1===a.rank,()=>`predictions rank should be 1 larger than targets rank, but got predictions rank ${r.rank} and targets rank ${a.rank}`),tn(r.shape.slice(0,r.shape.length-1),a.shape,"predictions's shape should be align with the targets' shape, except the last dimension.");let s=r.shape[r.shape.length-1];M(n>0&&n<=s,()=>`'k' passed to inTopK() must be > 0 && <= the predictions last dimension (${s}), but got ${n}`);let i=await r.data(),o=await a.data(),[l,c]=[i.length/s,s],u=Hg("bool",l);for(let h=0;hA.value-m.value),u[h]=0;for(let m=0;mdC,depthwiseConv2d:()=>pC,matMul:()=>fC});function mC(e,t,n,r,a,s="NHWC",i){let o=e;e.rank===3&&(o=H(e,[1,e.shape[0],e.shape[1],e.shape[2]]));let l=t;l.rank===3&&(l=H(t,[1,t.shape[0],t.shape[1],t.shape[2]])),M(o.rank===4,()=>`Error in conv2dDerFilter: input must be rank 4, but got shape ${o.shape}.`),M(l.rank===4,()=>`Error in conv2dDerFilter: dy must be rank 4, but got shape ${l.shape}.`),M(n.length===4,()=>`Error in conv2dDerFilter: filterShape must be length 4, but got ${n}.`);let c=s==="NHWC"?o.shape[3]:o.shape[1],u=s==="NHWC"?l.shape[3]:l.shape[1];M(c===n[2],()=>`Error in conv2dDerFilter: depth of input ${c}) must match input depth in filter (${n[2]}.`),M(u===n[3],()=>`Error in conv2dDerFilter: depth of dy (${u}) must match output depth for filter (${n[3]}).`),i!=null&&M(Vt(a),()=>`Error in conv2dDerFilter: pad must be an integer when using, dimRoundingMode ${i} but got pad ${a}.`);let h={x:o,dy:l},d={strides:r,pad:a,dataFormat:s,dimRoundingMode:i,filterShape:n};return $.runKernel(Th,h,d)}var Nm=D({conv2DBackpropFilter_:mC});function Pd(e,t,n){if(n==null||n==="linear")return e;if(n==="relu")return P(e,yl(t));throw new Error(`Cannot compute gradient for fused activation ${n}.`)}function Ld(e,t){let n=t,r=Ot(e.shape,t.shape);return r.length>0&&(n=Ce(n,r)),H(n,e.shape)}function Wd(e,t,n,r){if(t==="linear")return e;if(t==="relu")return Or(e);if(t==="elu")return cl(e);if(t==="relu6")return Nd(e);if(t==="prelu")return Ku(e,n);if(t==="leakyrelu")return Hu(e,r);throw new Error(`Unknown fused activation ${t}.`)}var Bd=(e,t)=>!(e>0)||t==="linear";function AC({x:e,filter:t,strides:n,pad:r,dataFormat:a="NHWC",dilations:s=[1,1],dimRoundingMode:i,bias:o,activation:l="linear",preluActivationWeights:c,leakyreluAlpha:u}){if(l=l||"linear",Bd($.state.gradientDepth,l)===!1){let _=ea(e,t,n,r,a,s,i);return o!=null&&(_=se(_,o)),Wd(_,l,c,u)}let h=E(e,"x","conv2d"),d=E(t,"filter","conv2d"),p=h,f=!1;h.rank===3&&(f=!0,p=H(h,[1,h.shape[0],h.shape[1],h.shape[2]])),M(p.rank===4,()=>`Error in fused conv2d: input must be rank 4, but got rank ${p.rank}.`),M(d.rank===4,()=>`Error in fused conv2d: filter must be rank 4, but got rank ${d.rank}.`),i!=null&&M(Vt(r),()=>`Error in fused conv2d: pad must be an integer when using, dimRoundingMode ${i} but got pad ${r}.`),M(p.shape[3]===d.shape[2],()=>`Error in conv2d: depth of input (${p.shape[3]}) must match input depth for filter ${d.shape[2]}.`),M(Mr(n,s),()=>`Error in conv2D: Either strides or dilations must be 1. Got strides ${n} and dilations '${s}'`),M(a==="NHWC",()=>`Error in conv2d: got dataFormat of ${a} but only NHWC is currently supported.`);let m=Lu(p.shape,d.shape,n,s,r,i),A;o!=null&&(A=E(o,"bias","fused conv2d"),[A]=bt(A,h),ft(m.outShape,A.shape));let y;c!=null&&(y=E(c,"prelu weights","fused conv2d"));let g=(_,x)=>{let[N,T,C,F]=x,O=Pd(_,C,l);M(Ra(s),()=>`Error in gradient of fused conv2D: dilation rates greater than 1 are not yet supported in gradients. Got dilations '${s}'`);let W=Yf(T.shape,O,N,n,r),V=Nm(T,O,N.shape,n,r),U=[W,V];if(F!=null){let j=Ld(F,O);U.push(j)}return U},w={x:p,filter:d,bias:A,preluActivationWeights:y},b={strides:n,pad:r,dataFormat:a,dilations:s,dimRoundingMode:i,activation:l,leakyreluAlpha:u};return o==null?Fr((_,x,N)=>{let T=$.runKernel(Qs,w,b);return N([x,_,T]),f&&(T=H(T,[T.shape[1],T.shape[2],T.shape[3]])),{value:T,gradFunc:g}})(p,d):Fr((_,x,N,T)=>{let C=$.runKernel(Qs,w,b);return T([x,_,C,N]),f&&(C=H(C,[C.shape[1],C.shape[2],C.shape[3]])),{value:C,gradFunc:g}})(p,d,A)}var dC=D({fusedConv2d_:AC});function yC(e,t,n,r,a,s=[1,1],i){let o=e;e.rank===3&&(o=H(e,[1,e.shape[0],e.shape[1],e.shape[2]]));let l=t;l.rank===3&&(l=H(t,[1,t.shape[0],t.shape[1],t.shape[2]]));let c={x:o,dy:l},u={strides:r,pad:a,dimRoundingMode:i,dilations:s,filterShape:n};return $.runKernel(Mh,c,u)}var Rx=D({depthwiseConv2dNativeBackpropFilter_:yC});function gC(e,t,n,r,a,s=[1,1],i){let o=t,l=!1;t.rank===3&&(l=!0,o=H(t,[1,t.shape[0],t.shape[1],t.shape[2]]));let c={dy:o,filter:n},u={strides:r,pad:a,dimRoundingMode:i,dilations:s,inputShape:e},h=$.runKernel(Fh,c,u);return l?H(h,[h.shape[1],h.shape[2],h.shape[3]]):h}var Mx=D({depthwiseConv2dNativeBackpropInput_:gC});function xC({x:e,filter:t,strides:n,pad:r,dataFormat:a="NHWC",dilations:s=[1,1],dimRoundingMode:i,bias:o,activation:l="linear",preluActivationWeights:c,leakyreluAlpha:u}){if(Bd($.state.gradientDepth,l)===!1){let _=ul(e,t,n,r,a,s,i);return o!=null&&(_=se(_,o)),Wd(_,l,c,u)}let h=E(e,"x","depthwiseConv2d"),d=E(t,"filter","depthwiseConv2d"),p=h,f=!1;h.rank===3&&(f=!0,p=H(h,[1,h.shape[0],h.shape[1],h.shape[2]])),M(p.rank===4,()=>`Error in fused depthwiseConv2d: input must be rank 4, but got rank ${p.rank}.`),M(d.rank===4,()=>`Error in fused depthwiseConv2d: filter must be rank 4, but got rank ${d.rank}.`),M(p.shape[3]===d.shape[2],()=>`Error in fused depthwiseConv2d: number of input channels (${p.shape[3]}) must match the inChannels dimension in filter ${d.shape[2]}.`),s==null&&(s=[1,1]),M(Mr(n,s),()=>`Error in fused depthwiseConv2d: Either strides or dilations must be 1. Got strides ${n} and dilations '${s}'`),i!=null&&M(Vt(r),()=>`Error in fused depthwiseConv2d: pad must be an integer when using dimRoundingMode ${i} but got pad ${r}.`);let m=Lu(p.shape,d.shape,n,s,r,i,!0),A;o!=null&&(A=E(o,"bias","fused conv2d"),[A]=bt(A,h),ft(m.outShape,A.shape));let y;c!=null&&(y=E(c,"prelu weights","fused depthwiseConv2d"));let g=(_,x)=>{M(Ra(s),()=>`Error in gradient of fused depthwiseConv2d: dilation rates greater than 1 are not yet supported. Got dilations '${s}'`);let[N,T,C,F]=x,O=Pd(_,C,l),W=Mx(T.shape,O,N,n,r,s,i),V=Rx(T,O,N.shape,n,r,s,i);if(F!=null){let U=Ld(A,O);return[W,V,U]}return[W,V]},w={x:p,filter:d,bias:A,preluActivationWeights:y},b={strides:n,pad:r,dataFormat:a,dilations:s,dimRoundingMode:i,activation:l,leakyreluAlpha:u};return o==null?Fr((_,x,N)=>{let T=$.runKernel(ei,w,b);return N([x,_,T]),f&&(T=H(T,[T.shape[1],T.shape[2],T.shape[3]])),{value:T,gradFunc:g}})(p,d):Fr((_,x,N,T)=>{let C=$.runKernel(ei,w,b);return T([x,_,C,N]),f&&(C=H(C,[C.shape[1],C.shape[2],C.shape[3]])),{value:C,gradFunc:g}})(p,d,A)}var pC=D({fusedDepthwiseConv2d_:xC});function wC({a:e,b:t,transposeA:n=!1,transposeB:r=!1,bias:a,activation:s="linear",preluActivationWeights:i,leakyreluAlpha:o}){if(Bd($.state.gradientDepth,s)===!1){let F=Ge(e,t,n,r);return a!=null&&(F=se(F,a)),Wd(F,s,i,o)}let l=E(e,"a","fused matMul"),c=E(t,"b","fused matMul");[l,c]=bt(l,c);let u=n?l.shape[l.rank-2]:l.shape[l.rank-1],h=r?c.shape[c.rank-1]:c.shape[c.rank-2],d=n?l.shape[l.rank-1]:l.shape[l.rank-2],p=r?c.shape[c.rank-2]:c.shape[c.rank-1],f=l.shape.slice(0,-2),m=c.shape.slice(0,-2),A=Ft(f),y=Ft(m);M(l.rank>=2&&c.rank>=2&&l.rank===c.rank,()=>`Error in fused matMul: inputs must have the same rank of at least 2, got ranks ${l.rank} and ${c.rank}.`),M(Jr(f,m),()=>`Error in fused matMul: outer dimensions (${f}) and (${m}) of Tensors with shapes ${l.shape} and ${c.shape} must match.`),M(u===h,()=>`Error in fused matMul: inner shapes (${u}) and (${h}) of Tensors with shapes ${l.shape} and ${c.shape} and transposeA=${n} and transposeB=${r} must match.`);let g=l.shape.slice(0,-2).concat([d,p]),w=n?H(l,[A,u,d]):H(l,[A,d,u]),b=r?H(c,[y,p,h]):H(c,[y,h,p]),_;a!=null&&(_=E(a,"bias","fused matMul"),[_]=bt(_,l),ft(g,_.shape));let x;i!=null&&(x=E(i,"prelu weights","fused matMul"));let N=(F,O)=>{let[W,V,U,j]=O,X=Pd(H(F,U.shape),U,s),G,ee;if(!n&&!r?(G=Ge(X,V,!1,!0),ee=Ge(W,X,!0,!1)):!n&&r?(G=Ge(X,V,!1,!1),ee=Ge(X,W,!0,!1)):n&&!r?(G=Ge(V,X,!1,!0),ee=Ge(W,X,!1,!1)):(G=Ge(V,X,!0,!0),ee=Ge(X,W,!0,!0)),a!=null){let Y=Ld(j,X);return[G,ee,Y]}else return[G,ee]},T={a:w,b,bias:_,preluActivationWeights:x},C={transposeA:n,transposeB:r,activation:s,leakyreluAlpha:o};return a==null?Fr((F,O,W)=>{let V=$.runKernel(Js,T,C);return W([F,O,V]),{value:H(V,g),gradFunc:N}})(w,b):Fr((F,O,W,V)=>{let U=$.runKernel(Js,T,C);return V([F,O,U,W]),{value:H(U,g),gradFunc:N}})(w,b,_)}var fC=D({fusedMatMul_:wC});function bC(e){return Im(e,.54,.46)}var _C=D({hammingWindow_:bC});function vC(e){return Im(e,.5,.5)}var Fx=D({hannWindow_:vC});function kC(e,t,n,r=!1,a=0){let s=0,i=[];for(;s+t<=e.size;)i.push(Ee(e,s,t)),s+=n;if(r)for(;s`Error in cropAndResize: image must be rank 4,but got rank ${i.rank}.`),M(o.rank===2&&o.shape[1]===4,()=>`Error in cropAndResize: boxes must be have size [${c},4] but had shape ${o.shape}.`),M(l.rank===1&&l.shape[0]===c,()=>`Error in cropAndResize: boxInd must be have size [${c}] but had shape ${o.shape}.`),M(r.length===2,()=>`Error in cropAndResize: cropSize must be of length 2, but got length ${r.length}.`),M(r[0]>=1&&r[1]>=1,()=>`cropSize must be atleast [1,1], but was ${r}`),M(a==="bilinear"||a==="nearest",()=>`method must be bilinear or nearest, but was ${a}`);let u={image:i,boxes:o,boxInd:l},h={method:a,extrapolationValue:s,cropSize:r};return $.runKernel(io,u,h)}var TC=D({cropAndResize_:SC});function CC(e){let t=E(e,"image","flipLeftRight","float32");M(t.rank===4,()=>`Error in flipLeftRight: image must be rank 4,but got rank ${t.rank}.`);let n={image:t};return $.runKernel(fo,n,{})}var EC=D({flipLeftRight_:CC});function RC(e,t,n=0,r=.5){let a=E(e,"image","rotateWithOffset","float32");M(a.rank===4,()=>`Error in rotateWithOffset: image must be rank 4,but got rank ${a.rank}.`);let s={image:a},i={radians:t,fillValue:n,center:r};return $.runKernel(Ko,s,i)}var MC=D({rotateWithOffset_:RC});function gl(e,t,n,r,a,s){r==null&&(r=.5),a==null&&(a=Number.NEGATIVE_INFINITY),s==null&&(s=0);let i=e.shape[0];return n=Math.min(n,i),M(0<=r&&r<=1,()=>`iouThreshold must be in [0, 1], but was '${r}'`),M(e.rank===2,()=>`boxes must be a 2D tensor, but was of rank '${e.rank}'`),M(e.shape[1]===4,()=>`boxes must have 4 columns, but 2nd dimension was ${e.shape[1]}`),M(t.rank===1,()=>"scores must be a 1D tensor"),M(t.shape[0]===i,()=>`scores has incompatible shape with boxes. Expected ${i}, but was ${t.shape[0]}`),M(0<=s&&s<=1,()=>`softNmsSigma must be in [0, 1], but was '${s}'`),{maxOutputSize:n,iouThreshold:r,scoreThreshold:a,softNmsSigma:s}}function FC(e,t,n,r=.5,a=Number.NEGATIVE_INFINITY){let s=E(e,"boxes","nonMaxSuppression"),i=E(t,"scores","nonMaxSuppression"),o=gl(s,i,n,r,a);n=o.maxOutputSize,r=o.iouThreshold,a=o.scoreThreshold;let l={maxOutputSize:n,iouThreshold:r,scoreThreshold:a};return $.runKernel(To,{boxes:s,scores:i},l)}var $C=D({nonMaxSuppression_:FC});function OC(e,t,n){let r=DC(e,t,n),a=r<0?-(r+1):r;e.splice(a,0,t)}function DC(e,t,n){return PC(e,t,n||zC)}function zC(e,t){return e>t?1:e>>1);let o=n(t,e[s]);o>0?r=s+1:(a=s,i=!o)}return i?r:-r-1}function Dx(e,t,n,r,a){return Sm(e,t,n,r,a,0)}function Ox(e,t,n,r,a,s){return Sm(e,t,n,r,a,0,!1,s,!0)}function zx(e,t,n,r,a,s){return Sm(e,t,n,r,a,s,!0)}function Sm(e,t,n,r,a,s,i=!1,o=!1,l=!1){let c=[];for(let A=0;Aa&&c.push({score:t[A],boxIndex:A,suppressBeginIndex:0});c.sort(Px);let u=s>0?-.5/s:0,h=[],d=[];for(;h.length0;){let A=c.pop(),{score:y,boxIndex:g,suppressBeginIndex:w}=A;if(y=w;--_){let x=LC(e,g,h[_]);if(x>=r){b=!0;break}if(A.score=A.score*WC(r,u,x),A.score<=a)break}A.suppressBeginIndex=h.length,b||(A.score===y?(h.push(g),d.push(A.score)):A.score>a&&OC(c,A,Px))}let p=h.length,f=n-p;o&&f>0&&(h.push(...new Array(f).fill(0)),d.push(...new Array(f).fill(0)));let m={selectedIndices:h};return i&&(m.selectedScores=d),l&&(m.validOutputs=p),m}function LC(e,t,n){let r=e.subarray(t*4,t*4+4),a=e.subarray(n*4,n*4+4),s=Math.min(r[0],r[2]),i=Math.min(r[1],r[3]),o=Math.max(r[0],r[2]),l=Math.max(r[1],r[3]),c=Math.min(a[0],a[2]),u=Math.min(a[1],a[3]),h=Math.max(a[0],a[2]),d=Math.max(a[1],a[3]),p=(o-s)*(l-i),f=(h-c)*(d-u);if(p<=0||f<=0)return 0;let m=Math.max(s,c),A=Math.max(i,u),y=Math.min(o,h),g=Math.min(l,d),w=Math.max(y-m,0)*Math.max(g-A,0);return w/(p+f-w)}function WC(e,t,n){let r=Math.exp(t*n*n);return n<=e?r:0}function Px(e,t){return e.score-t.score||e.score===t.score&&t.boxIndex-e.boxIndex}async function BC(e,t,n,r=.5,a=Number.NEGATIVE_INFINITY){let s=E(e,"boxes","nonMaxSuppressionAsync"),i=E(t,"scores","nonMaxSuppressionAsync"),o=gl(s,i,n,r,a);n=o.maxOutputSize,r=o.iouThreshold,a=o.scoreThreshold;let l=await Promise.all([s.data(),i.data()]),c=l[0],u=l[1],{selectedIndices:h}=Dx(c,u,n,r,a);return s!==e&&s.dispose(),i!==t&&i.dispose(),rn(h,"int32")}var VC=BC;function UC(e,t,n,r=.5,a=Number.NEGATIVE_INFINITY,s=0){let i=E(e,"boxes","nonMaxSuppression"),o=E(t,"scores","nonMaxSuppression"),l=gl(i,o,n,r,a,s);n=l.maxOutputSize,r=l.iouThreshold,a=l.scoreThreshold,s=l.softNmsSigma;let c={boxes:i,scores:o},u={maxOutputSize:n,iouThreshold:r,scoreThreshold:a,softNmsSigma:s},h=$.runKernel(Eo,c,u);return{selectedIndices:h[0],selectedScores:h[1]}}var jC=D({nonMaxSuppressionWithScore_:UC});async function HC(e,t,n,r=.5,a=Number.NEGATIVE_INFINITY,s=0){let i=E(e,"boxes","nonMaxSuppressionAsync"),o=E(t,"scores","nonMaxSuppressionAsync"),l=gl(i,o,n,r,a,s);n=l.maxOutputSize,r=l.iouThreshold,a=l.scoreThreshold,s=l.softNmsSigma;let c=await Promise.all([i.data(),o.data()]),u=c[0],h=c[1],{selectedIndices:d,selectedScores:p}=zx(u,h,n,r,a,s);return i!==e&&i.dispose(),o!==t&&o.dispose(),{selectedIndices:rn(d,"int32"),selectedScores:rn(p)}}var GC=HC;function qC(e,t,n,r=.5,a=Number.NEGATIVE_INFINITY,s=!1){let i=E(e,"boxes","nonMaxSuppression"),o=E(t,"scores","nonMaxSuppression"),l=gl(i,o,n,r,a,null),c=l.maxOutputSize,u=l.iouThreshold,h=l.scoreThreshold,d={boxes:i,scores:o},p={maxOutputSize:c,iouThreshold:u,scoreThreshold:h,padToMaxOutputSize:s},f=$.runKernel(Co,d,p);return{selectedIndices:f[0],validOutputs:f[1]}}var XC=D({nonMaxSuppressionPadded_:qC});async function KC(e,t,n,r=.5,a=Number.NEGATIVE_INFINITY,s=!1){let i=E(e,"boxes","nonMaxSuppressionAsync"),o=E(t,"scores","nonMaxSuppressionAsync"),l=gl(i,o,n,r,a,null),c=l.maxOutputSize,u=l.iouThreshold,h=l.scoreThreshold,[d,p]=await Promise.all([i.data(),o.data()]),{selectedIndices:f,validOutputs:m}=Ox(d,p,c,u,h,s);return i!==e&&i.dispose(),o!==t&&o.dispose(),{selectedIndices:rn(f,"int32"),validOutputs:_e(m,"int32")}}var ZC=KC;function YC(e,t,n=!1,r=!1){let a=E(e,"images","resizeBilinear");M(a.rank===3||a.rank===4,()=>`Error in resizeBilinear: x must be rank 3 or 4, but got rank ${a.rank}.`),M(t.length===2,()=>`Error in resizeBilinear: new shape must 2D, but got shape ${t}.`),M(r===!1||n===!1,()=>"Error in resizeBilinear: If halfPixelCenters is true, alignCorners must be false.");let s=a,i=!1;a.rank===3&&(i=!0,s=H(a,[1,a.shape[0],a.shape[1],a.shape[2]]));let[]=t,o={images:s},l={alignCorners:n,halfPixelCenters:r,size:t},c=$.runKernel(Ps,o,l);return i?H(c,[c.shape[1],c.shape[2],c.shape[3]]):c}var Lx=D({resizeBilinear_:YC});function JC(e,t,n=!1,r=!1){let a=E(e,"images","resizeNearestNeighbor");M(a.rank===3||a.rank===4,()=>`Error in resizeNearestNeighbor: x must be rank 3 or 4, but got rank ${a.rank}.`),M(t.length===2,()=>`Error in resizeNearestNeighbor: new shape must 2D, but got shape ${t}.`),M(a.dtype==="float32"||a.dtype==="int32",()=>"`images` must have `int32` or `float32` as dtype"),M(r===!1||n===!1,()=>"Error in resizeNearestNeighbor: If halfPixelCenters is true, alignCorners must be false.");let s=a,i=!1;a.rank===3&&(i=!0,s=H(a,[1,a.shape[0],a.shape[1],a.shape[2]]));let[]=t,o={images:s},l={alignCorners:n,halfPixelCenters:r,size:t},c=$.runKernel(_u,o,l);return i?H(c,[c.shape[1],c.shape[2],c.shape[3]]):c}var Wx=D({resizeNearestNeighbor_:JC});function QC(e,t,n="nearest",r="constant",a=0,s){let i=E(e,"image","transform","float32"),o=E(t,"transforms","transform","float32");M(i.rank===4,()=>`Error in transform: image must be rank 4,but got rank ${i.rank}.`),M(o.rank===2&&(o.shape[0]===i.shape[0]||o.shape[0]===1)&&o.shape[1]===8,()=>"Error in transform: Input transform should be batch x 8 or 1 x 8"),M(s==null||s.length===2,()=>`Error in transform: outputShape must be [height, width] or null, but got ${s}.`);let l={image:i,transforms:o},c={interpolation:n,fillMode:r,fillValue:a,outputShape:s};return $.runKernel(Yh,l,c)}var eE=D({transform_:QC});function tE(e,t,n){M(t%1==0,()=>`bandPart(): numLower must be an integer, got ${t}.`),M(n%1==0,()=>`bandPart(): numUpper must be an integer, got ${n}.`);let r=E(e,"a","bandPart");M(r.rank>=2,()=>`bandPart(): Rank must be at least 2, got ${r.rank}.`);let a=r.shape,[s,i]=r.shape.slice(-2);if(!(t<=s))throw new Error(`bandPart(): numLower (${t}) must not be greater than the number of rows (${s}).`);if(!(n<=i))throw new Error(`bandPart(): numUpper (${n}) must not be greater than the number of columns (${i}).`);t<0&&(t=s),n<0&&(n=i);let o=H(Id(0,s,1,"int32"),[-1,1]),l=Id(0,i,1,"int32"),c=ye(o,l),u=ar(ui(c,_e(+t,"int32")),$a(c,_e(-n,"int32"))),h=Ct([s,i],r.dtype);return H(ln(sr(H(r,[-1,s,i])).map(d=>bn(u,d,h))),a)}var nE=D({bandPart_:tE});function rE(e){let t;if(Array.isArray(e)){t=!1,M(e!=null&&e.length>0,()=>"Gram-Schmidt process: input must not be null, undefined, or empty");let a=e[0].shape[0];for(let s=1;s`Gram-Schmidt: Non-unique lengths found in the input vectors: (${e[s].shape[0]} vs. ${a})`)}else t=!0,e=zt(e,e.shape[0],0).map(a=>Da(a,[0]));M(e.length<=e[0].shape[0],()=>`Gram-Schmidt: Number of vectors (${e.length}) exceeds number of dimensions (${e[0].shape[0]}).`);let n=[],r=e;for(let a=0;a{let s=r[a];if(a>0)for(let i=0;i=2,()=>`qr() requires input tensor to have a rank >= 2, but got rank ${e.rank}`),e.rank===2)return Bx(e,t);{let n=e.shape.slice(0,e.shape.length-2).reduce((l,c)=>l*c),r=sr(H(e,[n,e.shape[e.shape.length-2],e.shape[e.shape.length-1]]),0),a=[],s=[];r.forEach(l=>{let[c,u]=Bx(l,t);a.push(c),s.push(u)});let i=H(ln(a,0),e.shape),o=H(ln(s,0),e.shape);return[i,o]}}function Bx(e,t=!1){return $.tidy(()=>{M(e.shape.length===2,()=>`qr2d() requires a 2D Tensor, but got a ${e.shape.length}D Tensor.`);let n=e.shape[0],r=e.shape[1],a=am(n),s=Er(e),i=_n([[1]],[1,1]),o=Er(i),l=n>=r?r:n;for(let c=0;c{let p=Ee(s,[c,c],[n-c,1]),f=zd(p),m=Ee(s,[c,c],[1,1]),A=bn(rr(m,0),_n([[-1]]),_n([[1]])),y=ye(m,P(A,f)),g=ge(p,y);g.shape[0]===1?o=Er(i):o=rt([i,Ee(g,[1,0],[g.shape[0]-1,g.shape[1]])],0);let w=_t(ge(Ge(A,y),f)),b=Ee(s,[c,0],[n-c,r]),_=P(w,o),x=nt(o);if(c===0)s=ye(b,Ge(_,Ge(x,b)));else{let C=ye(b,Ge(_,Ge(x,b)));s=rt([Ee(s,[0,0],[c,r]),C],0)}let N=nt(_),T=Ee(a,[0,c],[n,a.shape[1]-c]);if(c===0)a=ye(T,Ge(Ge(T,o),N));else{let C=ye(T,Ge(Ge(T,o),N));a=rt([Ee(a,[0,0],[n,c]),C],1)}return[o,s,a]}),Ie([u,h,d])}return!t&&n>r&&(a=Ee(a,[0,0],[n,r]),s=Ee(s,[0,0],[r,r])),[a,s]})}var iE=D({qr_:sE}),un;(function(e){e[e.NONE=0]="NONE",e[e.MEAN=1]="MEAN",e[e.SUM=2]="SUM",e[e.SUM_BY_NONZERO_WEIGHTS=3]="SUM_BY_NONZERO_WEIGHTS"})(un||(un={}));function oE(e,t,n=un.SUM_BY_NONZERO_WEIGHTS){let r=E(e,"losses","computeWeightedLoss"),a=null;t!=null&&(a=E(t,"weights","computeWeightedLoss"));let s=a==null?r:P(r,a);if(n===un.NONE)return s;if(n===un.SUM)return Ce(s);if(n===un.MEAN){if(a==null)return vt(s);{let i=r.size/a.size,o=ge(Ce(s),Ce(a));return i>1?ge(o,_e(i)):o}}if(n===un.SUM_BY_NONZERO_WEIGHTS){if(a==null)return ge(Ce(s),_e(r.size));{let i=P(a,Dr(r.shape)),o=me(Ce(hi(i,_e(0))),"float32");return ge(Ce(s),o)}}throw Error(`Unknown reduction: ${n}`)}var ra=D({computeWeightedLoss_:oE});function lE(e,t,n,r=un.SUM_BY_NONZERO_WEIGHTS){let a=E(e,"labels","absoluteDifference"),s=E(t,"predictions","absoluteDifference"),i=null;n!=null&&(i=E(n,"weights","absoluteDifference")),tn(a.shape,s.shape,"Error in absoluteDifference: ");let o=Dt(ye(a,s));return ra(o,i,r)}var uE=D({absoluteDifference_:lE});function cE(e,t,n,r,a=un.SUM_BY_NONZERO_WEIGHTS){let s=E(e,"labels","cosineDistance"),i=E(t,"predictions","cosineDistance"),o=null;r!=null&&(o=E(r,"weights","cosineDistance")),tn(s.shape,i.shape,"Error in cosineDistance: ");let l=_e(1),c=ye(l,Ce(P(s,i),n,!0));return ra(c,o,a)}var hE=D({cosineDistance_:cE});function dE(e,t,n,r=un.SUM_BY_NONZERO_WEIGHTS){let a=E(e,"labels","hingeLoss"),s=E(t,"predictions","hingeLoss"),i=null;n!=null&&(i=E(n,"weights","hingeLoss")),tn(a.shape,s.shape,"Error in hingeLoss: ");let o=_e(1);a=ye(P(_e(2),a),o);let l=Or(ye(o,P(a,s)));return ra(l,i,r)}var pE=D({hingeLoss_:dE});function fE(e,t,n,r=1,a=un.SUM_BY_NONZERO_WEIGHTS){let s=E(e,"labels","huberLoss"),i=E(t,"predictions","huberLoss"),o=null;n!=null&&(o=E(n,"weights","huberLoss")),tn(s.shape,i.shape,"Error in huberLoss: ");let l=_e(r),c=Dt(ye(i,s)),u=fl(c,l),h=ye(c,u),d=se(P(_e(.5),it(u)),P(l,h));return ra(d,o,a)}var mE=D({huberLoss_:fE});function AE(e,t,n,r=1e-7,a=un.SUM_BY_NONZERO_WEIGHTS){let s=E(e,"labels","logLoss"),i=E(t,"predictions","logLoss"),o=null;n!=null&&(o=E(n,"weights","logLoss")),tn(s.shape,i.shape,"Error in logLoss: ");let l=_e(1),c=_e(r),u=_t(P(s,En(se(i,c)))),h=P(ye(l,s),En(se(ye(l,i),c))),d=ye(u,h);return ra(d,o,a)}var yE=D({logLoss_:AE});function gE(e,t,n,r=un.SUM_BY_NONZERO_WEIGHTS){let a=E(e,"labels","meanSquaredError"),s=E(t,"predictions","meanSquaredError"),i=null;n!=null&&(i=E(n,"weights","meanSquaredError")),tn(a.shape,s.shape,"Error in meanSquaredError: ");let o=$d(a,s);return ra(o,i,r)}var xE=D({meanSquaredError_:gE});function wE(e,t){let n=E(e,"labels","sigmoidCrossEntropyWithLogits"),r=E(t,"logits","sigmoidCrossEntropyWithLogits");tn(n.shape,r.shape,"Error in sigmoidCrossEntropyWithLogits: ");let a=Or(r),s=P(r,n),i=xd(Gn(_t(Dt(r))));return se(ye(a,s),i)}function bE(e,t,n,r=0,a=un.SUM_BY_NONZERO_WEIGHTS){let s=E(e,"multiClassLabels","sigmoidCrossEntropy"),i=E(t,"logits","sigmoidCrossEntropy"),o=null;if(n!=null&&(o=E(n,"weights","sigmoidCrossEntropy")),tn(s.shape,i.shape,"Error in sigmoidCrossEntropy: "),r>0){let c=_e(r),u=_e(1),h=_e(.5);s=se(P(s,ye(u,c)),P(h,c))}let l=wE(s,i);return ra(l,o,a)}var _E=D({sigmoidCrossEntropy_:bE});function vE(e,t,n=-1){if(n===-1&&(n=t.rank-1),n!==t.rank-1)throw Error(`Softmax cross entropy along a non-last dimension is not yet supported. Labels / logits was rank ${t.rank} and dim was ${n}`);return Fr((r,a,s)=>{let i=lm(a,[n],!0),o=ye(me(a,"float32"),i);s([r,o]);let l=_t(P(o,r));return{value:Ce(l,[n]),gradFunc:(c,u)=>{let[h,d]=u,p=ci(c.shape,[n]);return[P(H(c,p),ye(me(h,"float32"),Gn(d))),P(H(c,p),ye(Gn(d),me(h,"float32")))]}}})(e,t)}function kE(e,t,n,r=0,a=un.SUM_BY_NONZERO_WEIGHTS){let s=E(e,"onehotLabels","softmaxCrossEntropy"),i=E(t,"logits","softmaxCrossEntropy"),o=null;if(n!=null&&(o=E(n,"weights","softmaxCrossEntropy")),tn(s.shape,i.shape,"Error in softmaxCrossEntropy: "),r>0){let c=_e(r),u=_e(1),h=_e(s.shape[1]);s=se(P(s,ye(u,c)),ge(c,h))}let l=vE(s,i);return ra(l,o,a)}var IE=D({softmaxCrossEntropy_:kE}),NE={fft:Qu,ifft:Al,rfft:ec,irfft:Fd},SE={hammingWindow:_C,hannWindow:Fx,frame:$x,stft:NC},Be={flipLeftRight:EC,resizeNearestNeighbor:Wx,resizeBilinear:Lx,rotateWithOffset:MC,cropAndResize:TC,nonMaxSuppression:$C,nonMaxSuppressionAsync:VC,nonMaxSuppressionWithScore:jC,nonMaxSuppressionWithScoreAsync:GC,nonMaxSuppressionPadded:XC,nonMaxSuppressionPaddedAsync:ZC,transform:eE},Vx={bandPart:nE,gramSchmidt:aE,qr:iE},TE={absoluteDifference:uE,computeWeightedLoss:ra,cosineDistance:hE,hingeLoss:pE,huberLoss:mE,logLoss:yE,meanSquaredError:xE,sigmoidCrossEntropy:_E,softmaxCrossEntropy:IE},aa=class extends H5{minimize(e,t=!1,n){let{value:r,grads:a}=this.computeGradients(e,n);if(n!=null){let s=n.map(i=>({name:i.name,tensor:a[i.name]}));this.applyGradients(s)}else this.applyGradients(a);return Ie(a),t?r:(r.dispose(),null)}get iterations(){return this.iterations_==null&&(this.iterations_=0),this.iterations_}incrementIterations(){this.iterations_=this.iterations+1}computeGradients(e,t){return px(e,t)}dispose(){this.iterations_!=null&&Ie(this.iterations_)}async saveIterations(){return this.iterations_==null&&(this.iterations_=0),{name:"iter",tensor:_e(this.iterations_,"int32")}}async getWeights(){throw new Error("getWeights() is not implemented for this optimizer yet.")}async setWeights(e){throw new Error(`setWeights() is not implemented for this optimizer class ${this.getClassName()}`)}async extractIterations(e){return this.iterations_=(await e[0].tensor.data())[0],e.slice(1)}};Object.defineProperty(aa,Symbol.hasInstance,{value:e=>e.minimize!=null&&e.computeGradients!=null&&e.applyGradients!=null});var Vd=class extends aa{constructor(e,t,n=null){super();this.learningRate=e,this.rho=t,this.epsilon=n,this.accumulatedGrads=[],this.accumulatedUpdates=[],n==null&&(this.epsilon=$.backend.epsilon())}applyGradients(e){(Array.isArray(e)?e.map(t=>t.name):Object.keys(e)).forEach((t,n)=>{let r=$.registeredVariables[t],a=!1;this.accumulatedGrads[n]==null&&(this.accumulatedGrads[n]={originalName:`${t}/accum_grad`,variable:z(()=>je(r).variable(a))}),this.accumulatedUpdates[n]==null&&(this.accumulatedUpdates[n]={originalName:`${t}/accum_var`,variable:z(()=>je(r).variable(a))});let s=Array.isArray(e)?e[n].tensor:e[t];if(s==null)return;let i=this.accumulatedGrads[n].variable,o=this.accumulatedUpdates[n].variable;z(()=>{let l=se(P(i,this.rho),P(it(s),1-this.rho)),c=P(ge(Yt(se(o,this.epsilon)),Yt(se(i,this.epsilon))),s),u=se(P(o,this.rho),P(it(c),1-this.rho));i.assign(l),o.assign(u);let h=se(P(c,-this.learningRate),r);r.assign(h)})}),this.incrementIterations()}dispose(){this.accumulatedUpdates!=null&&(Ie(this.accumulatedGrads.map(e=>e.variable)),Ie(this.accumulatedUpdates.map(e=>e.variable)))}async getWeights(){let e=[...this.accumulatedGrads,...this.accumulatedUpdates];return[await this.saveIterations()].concat(e.map(t=>({name:t.originalName,tensor:t.variable})))}async setWeights(e){e=await this.extractIterations(e);let t=e.length/2,n=!1;this.accumulatedGrads=e.slice(0,t).map(r=>({originalName:r.name,variable:r.tensor.variable(n)})),this.accumulatedUpdates=e.slice(t,t*2).map(r=>({originalName:r.name,variable:r.tensor.variable(n)}))}getConfig(){return{learningRate:this.learningRate,rho:this.rho,epsilon:this.epsilon}}static fromConfig(e,t){return new e(t.learningRate,t.rho,t.epsilon)}};Vd.className="Adadelta";Ca(Vd);var Ud=class extends aa{constructor(e,t=.1){super();this.learningRate=e,this.initialAccumulatorValue=t,this.accumulatedGrads=[]}applyGradients(e){(Array.isArray(e)?e.map(t=>t.name):Object.keys(e)).forEach((t,n)=>{let r=$.registeredVariables[t];if(this.accumulatedGrads[n]==null){let i=!1;this.accumulatedGrads[n]={originalName:`${t}/accumulator`,variable:z(()=>ju(r.shape,this.initialAccumulatorValue).variable(i))}}let a=Array.isArray(e)?e[n].tensor:e[t];if(a==null)return;let s=this.accumulatedGrads[n].variable;z(()=>{let i=se(s,it(a));s.assign(i);let o=se(P(ge(a,Yt(se(i,$.backend.epsilon()))),-this.learningRate),r);r.assign(o)})}),this.incrementIterations()}dispose(){this.accumulatedGrads!=null&&Ie(this.accumulatedGrads.map(e=>e.variable))}async getWeights(){return[await this.saveIterations()].concat(this.accumulatedGrads.map(e=>({name:e.originalName,tensor:e.variable})))}async setWeights(e){e=await this.extractIterations(e);let t=!1;this.accumulatedGrads=e.map(n=>({originalName:n.name,variable:n.tensor.variable(t)}))}getConfig(){return{learningRate:this.learningRate,initialAccumulatorValue:this.initialAccumulatorValue}}static fromConfig(e,t){return new e(t.learningRate,t.initialAccumulatorValue)}};Ud.className="Adagrad";Ca(Ud);var jd=class extends aa{constructor(e,t,n,r=null){super();this.learningRate=e,this.beta1=t,this.beta2=n,this.epsilon=r,this.accumulatedFirstMoment=[],this.accumulatedSecondMoment=[],z(()=>{this.accBeta1=_e(t).variable(),this.accBeta2=_e(n).variable()}),r==null&&(this.epsilon=$.backend.epsilon())}applyGradients(e){let t=Array.isArray(e)?e.map(n=>n.name):Object.keys(e);z(()=>{let n=ye(1,this.accBeta1),r=ye(1,this.accBeta2);t.forEach((a,s)=>{let i=$.registeredVariables[a],o=!1;this.accumulatedFirstMoment[s]==null&&(this.accumulatedFirstMoment[s]={originalName:`${a}/m`,variable:z(()=>je(i).variable(o))}),this.accumulatedSecondMoment[s]==null&&(this.accumulatedSecondMoment[s]={originalName:`${a}/v`,variable:z(()=>je(i).variable(o))});let l=Array.isArray(e)?e[s].tensor:e[a];if(l==null)return;let c=this.accumulatedFirstMoment[s].variable,u=this.accumulatedSecondMoment[s].variable,h=se(P(c,this.beta1),P(l,1-this.beta1)),d=se(P(u,this.beta2),P(it(l),1-this.beta2)),p=ge(h,n),f=ge(d,r);c.assign(h),u.assign(d);let m=se(P(ge(p,se(Yt(f),this.epsilon)),-this.learningRate),i);i.assign(m)}),this.accBeta1.assign(P(this.accBeta1,this.beta1)),this.accBeta2.assign(P(this.accBeta2,this.beta2))}),this.incrementIterations()}dispose(){this.accBeta1.dispose(),this.accBeta2.dispose(),this.accumulatedFirstMoment!=null&&Ie(this.accumulatedFirstMoment.map(e=>e.variable)),this.accumulatedSecondMoment!=null&&Ie(this.accumulatedSecondMoment.map(e=>e.variable))}async getWeights(){let e=[...this.accumulatedFirstMoment,...this.accumulatedSecondMoment];return[await this.saveIterations()].concat(e.map(t=>({name:t.originalName,tensor:t.variable})))}async setWeights(e){e=await this.extractIterations(e),z(()=>{this.accBeta1.assign(na(this.beta1,this.iterations_+1)),this.accBeta2.assign(na(this.beta2,this.iterations_+1))});let t=e.length/2,n=!1;this.accumulatedFirstMoment=e.slice(0,t).map(r=>({originalName:r.name,variable:r.tensor.variable(n)})),this.accumulatedSecondMoment=e.slice(t,t*2).map(r=>({originalName:r.name,variable:r.tensor.variable(n)}))}getConfig(){return{learningRate:this.learningRate,beta1:this.beta1,beta2:this.beta2,epsilon:this.epsilon}}static fromConfig(e,t){return new e(t.learningRate,t.beta1,t.beta2,t.epsilon)}};jd.className="Adam";Ca(jd);var Hd=class extends aa{constructor(e,t,n,r=null,a=0){super();this.learningRate=e,this.beta1=t,this.beta2=n,this.epsilon=r,this.decay=a,this.accumulatedFirstMoment=[],this.accumulatedWeightedInfNorm=[],z(()=>{this.iteration=_e(0).variable(),this.accBeta1=_e(t).variable()}),r==null&&(this.epsilon=$.backend.epsilon())}applyGradients(e){let t=Array.isArray(e)?e.map(n=>n.name):Object.keys(e);z(()=>{let n=ye(1,this.accBeta1),r=ge(-this.learningRate,se(P(this.iteration,this.decay),1));t.forEach((a,s)=>{let i=$.registeredVariables[a],o=!1;this.accumulatedFirstMoment[s]==null&&(this.accumulatedFirstMoment[s]={originalName:`${a}/m`,variable:je(i).variable(o)}),this.accumulatedWeightedInfNorm[s]==null&&(this.accumulatedWeightedInfNorm[s]={originalName:`${a}/v`,variable:je(i).variable(o)});let l=Array.isArray(e)?e[s].tensor:e[a];if(l==null)return;let c=this.accumulatedFirstMoment[s].variable,u=this.accumulatedWeightedInfNorm[s].variable,h=se(P(c,this.beta1),P(l,1-this.beta1)),d=P(u,this.beta2),p=Dt(l),f=$r(d,p);c.assign(h),u.assign(f);let m=se(P(ge(r,n),ge(h,se(f,this.epsilon))),i);i.assign(m)}),this.iteration.assign(se(this.iteration,1)),this.accBeta1.assign(P(this.accBeta1,this.beta1))}),this.incrementIterations()}dispose(){this.accBeta1.dispose(),this.iteration.dispose(),this.accumulatedFirstMoment!=null&&Ie(this.accumulatedFirstMoment.map(e=>e.variable)),this.accumulatedWeightedInfNorm!=null&&Ie(this.accumulatedWeightedInfNorm.map(e=>e.variable))}async getWeights(){throw new Error("getWeights() is not implemented for Adamax yet.")}async setWeights(e){throw new Error("setWeights() is not implemented for Adamax yet.")}getConfig(){return{learningRate:this.learningRate,beta1:this.beta1,beta2:this.beta2,epsilon:this.epsilon,decay:this.decay}}static fromConfig(e,t){return new e(t.learningRate,t.beta1,t.beta2,t.epsilon,t.decay)}};Hd.className="Adamax";Ca(Hd);var tc=class extends aa{constructor(e){super();this.learningRate=e,this.setLearningRate(e)}applyGradients(e){(Array.isArray(e)?e.map(t=>t.name):Object.keys(e)).forEach((t,n)=>{let r=Array.isArray(e)?e[n].tensor:e[t];if(r==null)return;let a=$.registeredVariables[t];z(()=>{let s=se(P(this.c,r),a);a.assign(s)})}),this.incrementIterations()}setLearningRate(e){this.learningRate=e,this.c!=null&&this.c.dispose(),this.c=Ut(_e(-e))}dispose(){this.c.dispose()}async getWeights(){return[await this.saveIterations()]}async setWeights(e){if(e=await this.extractIterations(e),e.length!==0)throw new Error("SGD optimizer does not have settable weights.")}getConfig(){return{learningRate:this.learningRate}}static fromConfig(e,t){return new e(t.learningRate)}};tc.className="SGD";Ca(tc);var Gd=class extends tc{constructor(e,t,n=!1){super(e);this.learningRate=e,this.momentum=t,this.useNesterov=n,this.accumulations=[],this.m=_e(this.momentum)}applyGradients(e){(Array.isArray(e)?e.map(t=>t.name):Object.keys(e)).forEach((t,n)=>{let r=$.registeredVariables[t];if(this.accumulations[n]==null){let i=!1;this.accumulations[n]={originalName:`${t}/momentum`,variable:z(()=>je(r).variable(i))}}let a=this.accumulations[n].variable,s=Array.isArray(e)?e[n].tensor:e[t];s!=null&&z(()=>{let i,o=se(P(this.m,a),s);this.useNesterov?i=se(P(this.c,se(s,P(o,this.m))),r):i=se(P(this.c,o),r),a.assign(o),r.assign(i)})}),this.incrementIterations()}dispose(){this.m.dispose(),this.accumulations!=null&&Ie(this.accumulations.map(e=>e.variable))}setMomentum(e){this.momentum=e}async getWeights(){return[await this.saveIterations()].concat(this.accumulations.map(e=>({name:e.originalName,tensor:e.variable})))}async setWeights(e){e=await this.extractIterations(e);let t=!1;this.accumulations=e.map(n=>({originalName:n.name,variable:n.tensor.variable(t)}))}getConfig(){return{learningRate:this.learningRate,momentum:this.momentum,useNesterov:this.useNesterov}}static fromConfig(e,t){return new e(t.learningRate,t.momentum,t.useNesterov)}};Gd.className="Momentum";Ca(Gd);var qd=class extends aa{constructor(e,t=.9,n=0,r=null,a=!1){super();if(this.learningRate=e,this.decay=t,this.momentum=n,this.epsilon=r,this.accumulatedMeanSquares=[],this.accumulatedMoments=[],this.accumulatedMeanGrads=[],this.centered=a,r==null&&(this.epsilon=$.backend.epsilon()),e==null)throw new Error("learningRate for RMSPropOptimizer must be defined.")}applyGradients(e){(Array.isArray(e)?e.map(t=>t.name):Object.keys(e)).forEach((t,n)=>{let r=$.registeredVariables[t],a=!1;this.accumulatedMeanSquares[n]==null&&(this.accumulatedMeanSquares[n]={originalName:`${t}/rms`,variable:z(()=>je(r).variable(a))}),this.accumulatedMoments[n]==null&&(this.accumulatedMoments[n]={originalName:`${t}/momentum`,variable:z(()=>je(r).variable(a))}),this.accumulatedMeanGrads[n]==null&&this.centered&&(this.accumulatedMeanGrads[n]={originalName:`${t}/mg`,variable:z(()=>je(r).variable(a))});let s=Array.isArray(e)?e[n].tensor:e[t];if(s==null)return;let i=this.accumulatedMeanSquares[n].variable,o=this.accumulatedMoments[n].variable;z(()=>{let l=se(P(i,this.decay),P(it(s),1-this.decay));if(this.centered){let c=this.accumulatedMeanGrads[n].variable,u=se(P(c,this.decay),P(s,1-this.decay)),h=ge(P(s,this.learningRate),Yt(ye(l,se(it(u),this.epsilon)))),d=se(P(o,this.momentum),h);i.assign(l),c.assign(u),o.assign(d);let p=ye(r,d);r.assign(p)}else{let c=se(P(i,this.decay),P(it(s),1-this.decay)),u=se(P(o,this.momentum),ge(P(s,this.learningRate),Yt(se(c,this.epsilon))));i.assign(c),o.assign(u);let h=ye(r,u);r.assign(h)}})}),this.incrementIterations()}dispose(){this.accumulatedMeanSquares!=null&&Ie(this.accumulatedMeanSquares.map(e=>e.variable)),this.accumulatedMeanGrads!=null&&this.centered&&Ie(this.accumulatedMeanGrads.map(e=>e.variable)),this.accumulatedMoments!=null&&Ie(this.accumulatedMoments.map(e=>e.variable))}async getWeights(){let e=[...this.accumulatedMeanSquares,...this.accumulatedMoments];return this.centered&&e.push(...this.accumulatedMeanGrads),[await this.saveIterations()].concat(e.map(t=>({name:t.originalName,tensor:t.variable})))}async setWeights(e){e=await this.extractIterations(e);let t=this.centered?e.length/3:e.length/2,n=!1;this.accumulatedMeanSquares=e.slice(0,t).map(r=>({originalName:r.name,variable:r.tensor.variable(n)})),this.accumulatedMoments=e.slice(t,t*2).map(r=>({originalName:r.name,variable:r.tensor.variable(n)})),this.centered&&(this.accumulatedMeanGrads=e.slice(t*2,t*3).map(r=>({originalName:r.name,variable:r.tensor.variable(n)})))}getConfig(){return{learningRate:this.learningRate,decay:this.decay,momentum:this.momentum,epsilon:this.epsilon,centered:this.centered}}static fromConfig(e,t){return new e(t.learningRate,t.decay,t.momentum,t.epsilon,t.centered)}};qd.className="RMSProp";Ca(qd);var di=class{static sgd(e){return new tc(e)}static momentum(e,t,n=!1){return new Gd(e,t,n)}static rmsprop(e,t=.9,n=0,r=null,a=!1){return new qd(e,t,n,r,a)}static adam(e=.001,t=.9,n=.999,r=null){return new jd(e,t,n,r)}static adadelta(e=.001,t=.95,n=null){return new Vd(e,t,n)}static adamax(e=.002,t=.9,n=.999,r=null,a=0){return new Hd(e,t,n,r,a)}static adagrad(e,t=.1){return new Ud(e,t)}},pi={sgd:di.sgd,momentum:di.momentum,adadelta:di.adadelta,adagrad:di.adagrad,rmsprop:di.rmsprop,adamax:di.adamax,adam:di.adam},CE=(()=>typeof requestAnimationFrame!="undefined"?requestAnimationFrame:typeof setImmediate!="undefined"?setImmediate:e=>e())();function Xd(){return new Promise(e=>CE(()=>e()))}var R={};Oe(R,{ERF_A1:()=>WE,ERF_A2:()=>BE,ERF_A3:()=>VE,ERF_A4:()=>UE,ERF_A5:()=>jE,ERF_P:()=>LE,PARALLELIZE_THRESHOLD:()=>Tm,SELU_SCALE:()=>jx,SELU_SCALEALPHA:()=>Ux,applyActivation:()=>Wd,assertAndGetBroadcastShape:()=>ft,assertAxesAreInnerMostDims:()=>hS,assertParamsConsistent:()=>EE,assignToTypedArray:()=>JE,axesAreInnerMostDims:()=>im,calculateShapes:()=>F5,combineLocations:()=>mx,complexWithEvenIndex:()=>KE,complexWithOddIndex:()=>ZE,computeConv2DInfo:()=>Lu,computeConv3DInfo:()=>J5,computeDefaultPad:()=>Xf,computeDilation2DInfo:()=>DI,computeOptimalWindowSize:()=>ME,computeOutAndReduceShapes:()=>Ax,computeOutShape:()=>RE,computePool2DInfo:()=>Y5,computePool3DInfo:()=>OI,convertConv2DDataFormat:()=>Z5,eitherStridesOrDilationsAreOne:()=>Mr,expandShapeToKeepDim:()=>ci,exponent:()=>eR,exponents:()=>QE,fromStringArrayToUint8:()=>rR,fromUint8ToStringArray:()=>nR,getAxesPermutation:()=>yx,getBroadcastDims:()=>SN,getComplexWithIndex:()=>YE,getFusedBiasGradient:()=>Ld,getFusedDyActivation:()=>Pd,getImageCenter:()=>FE,getInnerMostAxes:()=>dS,getPermuted:()=>DE,getReductionAxes:()=>Ot,getReshaped:()=>$E,getReshapedPermuted:()=>OE,getSliceBeginCoords:()=>zE,getSliceSize:()=>PE,getUndoAxesPermutation:()=>om,log:()=>GE,mergeRealAndImagArrays:()=>qE,prepareAndValidate:()=>M5,prepareSplitSize:()=>tR,segment_util:()=>Hx,shouldFuse:()=>Bd,slice_util:()=>sn,splitRealAndImagArrays:()=>XE,tupleValuesAreOne:()=>Ra,upcastType:()=>nr,validateInput:()=>Ff,validateUpdateShape:()=>Mf,warn:()=>HE});function EE(e,t){let n=e[0].length;e.forEach((a,s)=>{M(a.length===n,()=>`Error in concat${n}D: rank of tensors[${s}] must be the same as the rank of the rest (${n})`)}),M(t>=0&&t`Error in concat${n}D: axis must be between 0 and ${n-1}.`);let r=e[0];e.forEach((a,s)=>{for(let i=0;i`Error in concat${n}D: Shape of tensors[${s}] (${a}) does not match the shape of the rest (${r}) along the non-concatenated axis ${s}.`)})}function RE(e,t){let n=e[0].slice();for(let r=1;r=t*2+1||i%2==1?s.push(i):a.push(i);r.push(...a),r.push(0),r.push(...s)}return r}function OE(e,t,n,r=!0){let a=[];r?a.push(e[0]/n):a.push(e[0]*n);for(let s=1;s"Number of splits must evenly divide the axis."),r=new Array(t).fill(e.shape[n]/t);else{let a=t.reduce((i,o)=>(o===-1&&(i+=1),i),0);M(a<=1,()=>"There should be only one negative value in split array.");let s=t.indexOf(-1);if(s!==-1){let i=t.reduce((o,l)=>l>0?o+l:o);t[s]=e.shape[n]-i}M(e.shape[n]===t.reduce((i,o)=>i+o),()=>"The sum of sizes must match the size of the axis dimension."),r=t}return r}var Hx={};Oe(Hx,{collectGatherOpShapeInfo:()=>iR,computeOutShape:()=>sR,segOpComputeOptimalWindowSize:()=>aR});function aR(e,t){let n=!1,r;for(e<=Tm?(r=e,n=!0):r=wh(e,Math.floor(Math.sqrt(e)));!n;)r>t||r===e?n=!0:r=wh(e,r+1);return r}function sR(e,t,n){let r=[],a=e.length;for(let s=0;sa))throw new Error(`Expect batchDims in the range of [-${a}, ${a}], but got ${r}`);if(r<0&&(r+=a),r>s)throw new Error(`batchDims (${r}) must be less than rank(x) ( - ${s}).`);if(nnd(t))}catch(t){throw new Error(`Failed to decode encoded string bytes into utf-8, error: ${t}`)}}function rR(e){return e.map(t=>Tu(t))}var zr={};Oe(zr,{nonMaxSuppressionV3Impl:()=>Dx,nonMaxSuppressionV4Impl:()=>Ox,nonMaxSuppressionV5Impl:()=>zx,whereImpl:()=>Ix});function be(e,t){Array.isArray(e)||(e=[e]),e.forEach(n=>{n!=null&&v.assert(n.dtype!=="complex64",()=>`${t} does not support complex64 tensors in the CPU backend.`)})}var oR=zr.whereImpl,Kd=class extends iu{constructor(){super();this.blockSize=48,this.firstUse=!0,this.data=new gh(this,Rr())}nextDataId(){return Kd.nextDataId++}write(e,t,n){this.firstUse&&(this.firstUse=!1,J().get("IS_NODE")&&R.warn(` -============================ -Hi there \u{1F44B}. Looks like you are running TensorFlow.js in Node.js. To speed things up dramatically, install our node backend, which binds to TensorFlow C++, by running npm i @tensorflow/tfjs-node, or npm i @tensorflow/tfjs-node-gpu if you have CUDA. Then call require('@tensorflow/tfjs-node'); (-gpu suffix for CUDA) at the start of your program. Visit https://github.com/tensorflow/tfjs-node for more details. -============================`));let r={id:this.nextDataId()};return this.data.set(r,{values:e,dtype:n,refCount:1}),r}makeTensorInfo(e,t,n){let r;if(t==="string"&&n!=null&&n.length>0&&v.isString(n[0])){let a=n.map(s=>v.encodeString(s));r=this.write(a,e,t)}else r=this.write(n,e,t);return{dataId:r,shape:e,dtype:t}}refCount(e){return this.data.has(e)?this.data.get(e).refCount:0}incRef(e){let t=this.data.get(e);t.refCount++}decRef(e){if(this.data.has(e)){let t=this.data.get(e);t.refCount--}}move(e,t,n,r,a){this.data.set(e,{values:t,dtype:r,refCount:a})}numDataIds(){return this.data.numDataIds()}async read(e){return this.readSync(e)}readSync(e){let{dtype:t,complexTensorInfos:n}=this.data.get(e);if(t==="complex64"){let r=this.readSync(n.real.dataId),a=this.readSync(n.imag.dataId);return R.mergeRealAndImagArrays(r,a)}return this.data.get(e).values}bufferSync(e){let t=this.readSync(e.dataId),n=t;if(e.dtype==="string")try{n=t.map(r=>v.decodeString(r))}catch(r){throw new Error("Failed to decode encoded string bytes into utf-8")}return Le(e.shape,e.dtype,n)}makeOutput(e,t,n){let r=this.write(e,t,n);return Rr().makeTensorFromDataId(r,t,n,this)}disposeData(e,t=!1){if(this.data.has(e)){if(this.data.get(e).refCount--,!t&&this.data.get(e).refCount>0)return!1;let{complexTensorInfos:n}=this.data.get(e);n!=null&&(this.disposeData(n.real.dataId,!0),this.disposeData(n.imag.dataId,!0)),this.data.delete(e)}return!0}disposeIntermediateTensorInfo(e){this.disposeData(e.dataId)}async time(e){let t=v.now();return e(),{kernelMs:v.now()-t}}memory(){return{unreliable:!0,reasons:["The reported memory is an upper bound. Due to automatic garbage collection, the true allocated memory may be less."]}}where(e){be([e],"where");let t=this.readSync(e.dataId);return oR(e.shape,t)}dispose(){}floatPrecision(){return 32}epsilon(){return super.epsilon()}};Kd.nextDataId=0;var Cm={};Oe(Cm,{addImpl:()=>qx,bincountImpl:()=>Em,bincountReduceImpl:()=>Xx,ceilImpl:()=>Kx,concatImpl:()=>Rm,expImpl:()=>Zx,expm1Impl:()=>Yx,floorImpl:()=>Jx,gatherV2Impl:()=>Qx,greaterImpl:()=>ew,lessImpl:()=>tw,linSpaceImpl:()=>nw,logImpl:()=>rw,maxImpl:()=>aw,maximumImpl:()=>sw,minimumImpl:()=>iw,multiplyImpl:()=>Mm,negImpl:()=>ow,notEqualImpl:()=>lw,prodImpl:()=>uw,rangeImpl:()=>$m,rsqrtImpl:()=>cw,simpleAbsImpl:()=>Gx,sliceImpl:()=>Zd,squaredDifferenceImpl:()=>hw,stridedSliceImpl:()=>dw,subImpl:()=>pw,tileImpl:()=>fw,topKImpl:()=>mw,transposeImpl:()=>Fm,uniqueImpl:()=>Aw});function Gx(e){let t=new Float32Array(e.length);for(let n=0;n{let{x:t}=e.inputs,n=e.backend;be(t,"abs");let r=new Float32Array(v.sizeFromShape(t.shape)),a=n.data.get(t.dataId).values;return r=Gx(a),n.makeOutput(r,t.shape,"float32")},uR={kernelName:Zi,backendName:"cpu",kernelFunc:lR};function Et(e){return(t,n,r,a,s)=>{let i=R.assertAndGetBroadcastShape(t,n),o=i.length,l=v.computeStrides(i),c=v.sizeFromShape(i),u=v.getTypedArrayFromDType(s,c),h=t.length,d=n.length,p=v.computeStrides(t),f=v.computeStrides(n),m=R.getBroadcastDims(t,i),A=R.getBroadcastDims(n,i);if(m.length+A.length===0)for(let y=0;yw[N]=0);let b=v.locToIndex(w,h,p),_=g.slice(-d);A.forEach(N=>_[N]=0);let x=v.locToIndex(_,d,f);u[y]=e(r[b],a[x])}return[u,i]}}function Fn(e){let{inputs:t,backend:n}=e,{real:r,imag:a}=t,s=n.data.get(r.dataId).values,i=n.data.get(a.dataId).values,o=n.makeTensorInfo(r.shape,"complex64"),l=n.data.get(o.dataId);return l.complexTensorInfos={real:n.makeTensorInfo(r.shape,"float32",s),imag:n.makeTensorInfo(a.shape,"float32",i)},o}var cR={kernelName:Sh,backendName:"cpu",kernelFunc:Fn};function Yd(e,t,n="float32"){if(n==="complex64"){let a=Yd(e,t,"float32"),s=Yd(e,t,"float32");return Fn({inputs:{real:a,imag:s},backend:e})}let r=v.makeZerosTypedArray(v.sizeFromShape(t),n);return e.makeTensorInfo(t,n,r)}function Pr(e){let{inputs:t,backend:n}=e,{x:r}=t;return n.incRef(r.dataId),{dataId:r.dataId,shape:r.shape,dtype:r.dtype}}var hR={kernelName:vs,backendName:"cpu",kernelFunc:Pr};function fi(e){let{inputs:t,backend:n}=e,{input:r}=t,a=n.data.get(r.dataId).complexTensorInfos.real,s=n.data.get(a.dataId).values;return n.makeTensorInfo(a.shape,a.dtype,s)}var dR={kernelName:qh,backendName:"cpu",kernelFunc:fi};function za(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{dtype:s}=r;if(s==="complex64"){if(a.dtype==="complex64")return Pr({inputs:{x:a},backend:n});let i=Yd(n,a.shape,a.dtype),o=za({inputs:{x:a},backend:n,attrs:{dtype:"float32"}}),l=Fn({inputs:{real:o,imag:i},backend:n});return n.disposeIntermediateTensorInfo(i),n.disposeIntermediateTensorInfo(o),l}if(a.dtype==="complex64"){let i=fi({inputs:{input:a},backend:n}),o=za({inputs:{x:i},backend:n,attrs:{dtype:s}});return n.disposeIntermediateTensorInfo(i),o}if(!v.hasEncodingLoss(a.dtype,s)){let i=Pr({inputs:{x:a},backend:n});return{dataId:i.dataId,shape:i.shape,dtype:s}}if(s==="int32"){let i=n.data.get(a.dataId).values,o=Int32Array.from(i);return n.makeTensorInfo(a.shape,"int32",o)}if(s==="bool"){let i=n.data.get(a.dataId).values,o=v.toTypedArray([0],a.dtype),[l,c]=Et((u,h)=>u!==h?1:0)(a.shape,[],i,o,"bool");return n.makeTensorInfo(c,"bool",l)}throw new Error(`Error in Cast: failed to cast ${a.dtype} to ${s}`)}var pR={kernelName:cs,backendName:"cpu",kernelFunc:za};function jt(e,t,n,r){return n==null?({inputs:a,backend:s})=>{let{a:i,b:o}=a,l=s;be([i,o],e);let c=l.data.get(i.dataId).values,u=l.data.get(o.dataId).values,h=r||i.dtype,[d,p]=t(i.shape,o.shape,c,u,h);return l.makeTensorInfo(p,h,d)}:({inputs:a,backend:s})=>{let{a:i,b:o}=a,l=s;if(i.dtype==="complex64"||o.dtype==="complex64"){let c=za({inputs:{x:i},backend:l,attrs:{dtype:"complex64"}}),u=l.data.get(c.dataId),h=u.complexTensorInfos.real,d=u.complexTensorInfos.imag,p=l.data.get(h.dataId).values,f=l.data.get(d.dataId).values,m=za({inputs:{x:o},backend:l,attrs:{dtype:"complex64"}}),A=l.data.get(m.dataId),y=A.complexTensorInfos.real,g=A.complexTensorInfos.imag,w=l.data.get(y.dataId).values,b=l.data.get(g.dataId).values,[_,x,N]=n(i.shape,o.shape,p,f,w,b),T=l.makeTensorInfo(N,"float32",_),C=l.makeTensorInfo(N,"float32",x),F=Fn({inputs:{real:T,imag:C},backend:l});return l.disposeIntermediateTensorInfo(c),l.disposeIntermediateTensorInfo(m),l.disposeIntermediateTensorInfo(T),l.disposeIntermediateTensorInfo(C),F}else{let c=l.data.get(i.dataId).values,u=l.data.get(o.dataId).values,h=r||i.dtype,[d,p]=t(i.shape,o.shape,c,u,h);return l.makeTensorInfo(p,h,d)}}}function Dm(e){return(t,n,r,a,s,i)=>{let o=R.assertAndGetBroadcastShape(t,n),l=v.sizeFromShape(o),c=o.length,u=v.computeStrides(o),h=v.getTypedArrayFromDType("float32",l),d=v.getTypedArrayFromDType("float32",l),p=R.getBroadcastDims(t,o),f=R.getBroadcastDims(n,o),m=R.mergeRealAndImagArrays(r,a),A=R.mergeRealAndImagArrays(s,i),y=t.length,g=v.computeStrides(t),w=n.length,b=v.computeStrides(n);if(p.length+f.length===0)for(let _=0;_N[W]=0);let T=v.locToIndex(N,y,g),C=x.slice(-w);f.forEach(W=>C[W]=0);let F=v.locToIndex(C,w,b),O=e(m[T*2],m[T*2+1],A[F*2],A[F*2+1]);h[_]=O.real,d[_]=O.imag}return[h,d,o]}}var qx=Et((e,t)=>e+t),fR=Dm((e,t,n,r)=>({real:e+n,imag:t+r})),nc=jt(_a,qx,fR),mR={kernelName:_a,backendName:"cpu",kernelFunc:nc};function Em(e,t,n,r,a){let s=v.sizeFromShape(r),i=v.makeZerosTypedArray(a,n);for(let o=0;o=a||(s>0?i[l]+=t[o]:i[l]+=1)}return i}function Xx(e,t,n,r=!1){let a=e.shape[0],s=e.shape[1],i=Le([a,n],t.dtype);for(let o=0;o=n||(r?i.set(1,o,c):t.size>0?i.set(i.get(o,c)+t.get(o,l),o,c):i.set(i.get(o,c)+1,o,c))}return i}function xl(e){return(t,n,r)=>{let a=v.getTypedArrayFromDType(n,t.length);for(let s=0;s{let{x:i}=r;if(be(i,e),i.dtype==="string"||n==="string")throw new Error("unaryKernelFunc does not support string input/output");let o=s,l=o.data.get(i.dataId).values,c=v.sizeFromShape(i.shape),u=n||i.dtype,h=v.getArrayFromDType(u,c);for(let d=0;d{let{x:i}=r;if(be(i,e),i.dtype==="string"||n==="string")throw new Error("unaryKernelFunc does not support string input/output");let o=s,l=o.data.get(i.dataId).values,c=n||i.dtype,u=t(l,c,a);return o.makeTensorInfo(i.shape,c,u)}}var Kx=xl(e=>Math.ceil(e)),AR=wl(hs,Kx),yR={kernelName:hs,backendName:"cpu",kernelFunc:AR};function Rm(e,t,n,r){let a=v.getArrayFromDType(n,v.sizeFromShape(t));if(r&&n!=="string"){let s=0;e.forEach(i=>{let o=v.sizeFromShape(i.shape);a.set(i.vals,s),s+=o})}else{let s=0;e.forEach(i=>{let o=n==="string"?R.fromUint8ToStringArray(i.vals):i.vals,l=0;for(let c=0;cMath.exp(e)),yw=wl(gs,Zx),gR={kernelName:gs,backendName:"cpu",kernelFunc:yw},Yx=xl(e=>Math.expm1(e)),xR=wl(po,Yx),wR={kernelName:po,backendName:"cpu",kernelFunc:xR},Jx=xl(e=>Math.floor(e)),bR=wl(xs,Jx),_R={kernelName:xs,backendName:"cpu",kernelFunc:bR};function Qx(e,t,n){let r=Le(n,e.dtype);for(let a=0;ae>t?1:0),vR=jt(yo,ew,null,"bool"),kR={kernelName:yo,backendName:"cpu",kernelFunc:vR},tw=Et((e,t)=>eMath.log(e)),SR=wl(Is,rw),TR={kernelName:Is,backendName:"cpu",kernelFunc:SR};function aw(e,t,n,r){let a=v.getTypedArrayFromDType(r,v.sizeFromShape(n));for(let s=0;so&&(o=c)}a[s]=o}return a}var sw=Et((e,t)=>Math.max(e,t)),CR=jt(Ss,sw),ER={kernelName:Ss,backendName:"cpu",kernelFunc:CR},iw=Et((e,t)=>Math.min(e,t)),RR=jt(Rs,iw),MR={kernelName:Rs,backendName:"cpu",kernelFunc:RR},Mm=Et((e,t)=>e*t),FR=Dm((e,t,n,r)=>({real:e*n-t*r,imag:e*r+t*n})),Om=jt(Ms,Mm,FR),$R={kernelName:Ms,backendName:"cpu",kernelFunc:Om};function ow(e,t,n){let r=v.createScalarValue(-1,n);return Mm([],t,r,e,n)}function DR(e){let{inputs:t,backend:n}=e,{x:r}=t;be(r,"neg");let a=n.data.get(r.dataId).values,[s,i]=ow(a,r.shape,r.dtype);return n.makeTensorInfo(i,r.dtype,s)}var OR={kernelName:No,backendName:"cpu",kernelFunc:DR},lw=Et((e,t)=>e!==t?1:0),zR=jt(So,lw,null,"bool"),PR={kernelName:So,backendName:"cpu",kernelFunc:zR};function Fm(e,t,n,r,a){let s=t.length,i=v.sizeFromShape(t),o=v.computeStrides(t),l=v.computeStrides(a),c=v.getTypedArrayFromDType(n,v.sizeFromShape(a));for(let u=0;un.disposeIntermediateTensorInfo(g)),n.makeTensorInfo(y,A,f)}var BR={kernelName:Fo,backendName:"cpu",kernelFunc:WR};function $m(e,t,n,r){let a=e===t,s=e1;if(a||s||i)return v.makeZerosTypedArray(0,r);let o=Math.abs(Math.ceil((t-e)/n)),l=v.makeZerosTypedArray(o,r);t1/Math.sqrt(e)),VR=wl(Vs,cw),UR={kernelName:Vs,backendName:"cpu",kernelFunc:VR};function Zd(e,t,n,r,a){let s=sn.isSliceContinous(r,t,n),i=v.sizeFromShape(n),o=v.computeStrides(r);if(s){let h=sn.computeFlatOffset(t,o);return a==="string"?e.slice(h,h+i):e.subarray(h,h+i)}let l=a==="string"?R.fromUint8ToStringArray(e):e,c=Le(r,a,l),u=Le(n,a);for(let h=0;hf+t[m]);u.set(c.get(...p),...d)}return a==="string"?R.fromStringArrayToUint8(u.values):u.values}function mi(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{begin:s,size:i}=r;be(a,"slice");let[o,l]=sn.parseSliceParams(a,s,i);sn.assertParamsValid(a,o,l);let c=n.data.get(a.dataId).values,u=Zd(c,o,l,a.shape,a.dtype);return n.makeTensorInfo(l,a.dtype,u)}var jR={kernelName:Lo,backendName:"cpu",kernelFunc:mi},hw=Et((e,t)=>{let n=e-t;return n*n}),HR=jt(Xs,hw),GR={kernelName:Xs,backendName:"cpu",kernelFunc:HR};function dw(e,t,n,r){let a=Le(e,t.dtype);for(let s=0;se-t),qR=Dm((e,t,n,r)=>({real:e-n,imag:t-r})),zm=jt(Ks,pw,qR),XR={kernelName:Ks,backendName:"cpu",kernelFunc:zm};function fw(e,t){let n=new Array(e.rank);for(let a=0;aw.value-g.value);let m=h*r,A=l.subarray(m,m+r),y=c.subarray(m,m+r);for(let g=0;g{for(let A=0;Anew Kd,1);var xw=at(lo,e=>e>=0?e:Math.exp(e)-1),KR={kernelName:lo,backendName:"cpu",kernelFunc:xw};function ww(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{alpha:s}=r;be([a],"leakyRelu");let i=v.sizeFromShape(a.shape),o=n.data.get(a.dataId).values,l=v.getTypedArrayFromDType("float32",i);for(let c=0;ce<0?t*e:e);function bw(e){let{inputs:t,backend:n}=e,{x:r,alpha:a}=t;be([r,a],"prelu");let s=n.data.get(r.dataId).values,i=n.data.get(a.dataId).values,[o,l]=YR(r.shape,a.shape,s,i,r.dtype);return n.makeTensorInfo(l,r.dtype,o)}var JR={kernelName:Os,backendName:"cpu",kernelFunc:bw},_w=at(zs,e=>Math.max(0,e)),QR={kernelName:zs,backendName:"cpu",kernelFunc:_w},vw=at(Ls,e=>Math.min(Math.max(0,e),6)),eM={kernelName:Ls,backendName:"cpu",kernelFunc:vw};function Pm(e,t,n,r,a){if(n==="linear")return Pr({inputs:{x:t},backend:e});if(n==="relu")return _w({inputs:{x:t},backend:e});if(n==="elu")return xw({inputs:{x:t},backend:e});if(n==="relu6")return vw({inputs:{x:t},backend:e});if(n==="prelu")return bw({inputs:{x:t,alpha:r},backend:e});if(n==="leakyrelu")return ww({inputs:{x:t},backend:e,attrs:{alpha:a}});throw new Error(`Activation ${n} has not been implemented for the CPU backend.`)}function mt(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{shape:s}=r,i=v.sizeFromShape(a.shape),o=v.inferFromImplicitShape(s,i),l=v.sizeFromShape(o);v.assert(i===l,()=>`The new shape (${o}) has ${l} elements and the old shape (${a.shape}) has ${i} elements. The new shape and old shape must have the same number of elements.`),n.incRef(a.dataId);let c=n.data.get(a.dataId);if(c.complexTensorInfos!=null){let u=c.complexTensorInfos.real,h=c.complexTensorInfos.imag;u.shape=o,h.shape=o}return{dataId:a.dataId,shape:o,dtype:a.dtype}}var tM={kernelName:Do,backendName:"cpu",kernelFunc:mt};function kw(e){let{inputs:t,backend:n,attrs:r}=e,{a,b:s}=t,{transposeA:i,transposeB:o}=r;be([a,s],"matMul");let l=a.shape.length,c=s.shape.length,u=i?a.shape[l-2]:a.shape[l-1],h=o?s.shape[c-1]:s.shape[c-2],d=i?a.shape[l-1]:a.shape[l-2],p=o?s.shape[c-2]:s.shape[c-1],f=a.shape.slice(0,-2),m=s.shape.slice(0,-2),A=v.sizeFromShape(f),y=v.sizeFromShape(m),g=A===y||A===1||y===1;v.assert(l>=2&&c>=2&&g,()=>`Error in matMul: the input batch dimensions must either be the same or at least one input batch dimension must be 1. Got input batch dimensions of (${f}) and (${m}).`);let w=(A>y?a.shape.slice(0,-2):s.shape.slice(0,-2)).concat([d,p]);v.assert(u===h,()=>`Error in matMul: inner shapes (${u}) and (${h}) of Tensors with shapes ${a.shape} and ${s.shape} and transposeA=${i} and transposeB=${o} must match.`);let b=i?[A,u,d]:[A,d,u],_=o?[y,p,h]:[y,h,p],x=mt({inputs:{x:a},backend:n,attrs:{shape:b}}),N=mt({inputs:{x:s},backend:n,attrs:{shape:_}}),T=i?x.shape[1]:x.shape[2],C=i?x.shape[2]:x.shape[1],F=o?N.shape[1]:N.shape[2],O=Math.max(A,y),W=n.data.get(x.dataId).values,V=n.data.get(N.dataId).values,U=v.computeStrides(x.shape),j=v.computeStrides(N.shape),[X,G,ee]=i?[U[0],1,U[1]]:[U[0],U[1],1],[Y,ae,te]=o?[1,j[1],j[0]]:[j[1],1,j[0]],oe=C*F,Q=Le([O,C,F],x.dtype),he=Q.values,le=n.blockSize;for(let fe=0;feMath.acos(e)),iM={kernelName:Yi,backendName:"cpu",kernelFunc:sM},oM=at(Ji,e=>Math.acosh(e)),lM={kernelName:Ji,backendName:"cpu",kernelFunc:oM};function uM(e){let{inputs:t,backend:n}=e,r=t;be(t,"addN");let a=r.map(o=>n.data.get(o.dataId).values),s=Le(r[0].shape,r[0].dtype),i=s.values;for(let o=0;og&&(g=_,w=b)}p[A]=w}return c.forEach(A=>n.disposeIntermediateTensorInfo(A)),n.makeTensorInfo(u,"int32",p)}var AM={kernelName:os,backendName:"cpu",kernelFunc:mM};function yM(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{axis:s}=r;be(a,"argMin");let i=v.parseAxisParam(s,a.shape),o=R.getAxesPermutation(i,a.shape.length),l=a,c=[];o!=null&&(l=ir({inputs:{x:a},backend:n,attrs:{perm:o}}),c.push(l),i=R.getInnerMostAxes(i.length,l.shape.length)),i=[i[0]],R.assertAxesAreInnerMostDims("argMin",i,l.shape.length);let[u,h]=R.computeOutAndReduceShapes(l.shape,i),d=v.sizeFromShape(u),p=v.makeZerosTypedArray(d,"int32"),f=v.sizeFromShape(h),m=n.data.get(l.dataId).values;for(let A=0;An.disposeIntermediateTensorInfo(A)),n.makeTensorInfo(u,"int32",p)}var gM={kernelName:uu,backendName:"cpu",kernelFunc:yM},xM=at(Qi,e=>Math.asin(e)),wM={kernelName:Qi,backendName:"cpu",kernelFunc:xM},bM=at(eo,e=>Math.asinh(e)),_M={kernelName:eo,backendName:"cpu",kernelFunc:bM},vM=at(to,e=>Math.atan(e)),kM={kernelName:to,backendName:"cpu",kernelFunc:vM},IM=Et((e,t)=>Math.atan2(e,t)),NM=jt(ro,IM),SM={kernelName:ro,backendName:"cpu",kernelFunc:NM},TM=at(no,e=>Math.atanh(e)),CM={kernelName:no,backendName:"cpu",kernelFunc:TM};function Lm(e,t,n,r,a,s){let i=a.strideHeight,o=a.strideWidth,l=a.dilationHeight,c=a.dilationWidth,u=a.effectiveFilterHeight,h=a.effectiveFilterWidth,d=a.padInfo.top,p=a.padInfo.left,f=s==="max"?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY,m=Le(a.outShape,n),A=m.values,y=a.outShape[1]*a.outShape[2]*a.outShape[3],g=a.outShape[2]*a.outShape[3],w=a.outShape[3];for(let b=0;bG?G=le:s==="avg"&&(ee+=le,Y++)}if(isNaN(G))break}let ae=W+V*w+N;A[ae]=s==="avg"?ee/Y:G}}}return m}function Iw(e,t,n,r,a=!1,s=!1){let i=Le(r.outShape,"int32"),o=r.strideHeight,l=r.strideWidth,c=r.dilationHeight,u=r.dilationWidth,h=r.effectiveFilterHeight,d=r.effectiveFilterWidth,p=r.padInfo.top,f=r.padInfo.left,m=Le(t,n,e);for(let A=0;AF&&(F=X,a?O=s?((A*r.inHeight+W)*r.inWidth+U)*r.inChannels+y:(W*r.inWidth+U)*r.inChannels+y:O=V*d+j)}}i.set(O,A,g,x,y)}}return i}function Nw(e,t,n,r,a,s){let i=a.strideDepth,o=a.strideHeight,l=a.strideWidth,c=a.dilationDepth,u=a.dilationHeight,h=a.dilationWidth,d=a.effectiveFilterDepth,p=a.effectiveFilterHeight,f=a.effectiveFilterWidth,m=a.padInfo.front,A=a.padInfo.top,y=a.padInfo.left,g=s==="max"?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY,w=Le(a.outShape,n),b=w.values,_=a.outShape[1]*a.outShape[2]*a.outShape[3]*a.outShape[4],x=a.outShape[2]*a.outShape[3]*a.outShape[4],N=a.outShape[3]*a.outShape[4],T=a.outShape[4];for(let C=0;Cve?ve=We:s==="avg"&&(Se+=We,Me++),isNaN(ve))break}if(isNaN(ve))break}if(isNaN(ve))break}let De=pe+W;b[De]=s==="avg"?Se/Me:ve}}}}return w}function EM(e,t){let n=Le(t.outShape,"int32"),r=t.strideDepth,a=t.strideHeight,s=t.strideWidth,i=t.dilationDepth,o=t.dilationHeight,l=t.dilationWidth,c=t.effectiveFilterDepth,u=t.effectiveFilterHeight,h=t.effectiveFilterWidth,d=t.padInfo.front,p=t.padInfo.top,f=t.padInfo.left;for(let m=0;m=V&&(V=te,U=X*u*h+ee*u+ae)}}}n.set(U,m,y,_,C,A)}}}return n}function RM(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t;be(a,"avgPool");let{filterSize:s,strides:i,pad:o,dimRoundingMode:l}=r,c=1;v.assert(R.eitherStridesOrDilationsAreOne(i,c),()=>`Error in avgPool: Either strides or dilations must be 1. Got strides ${i} and dilations '${c}'`);let u=R.computePool2DInfo(a.shape,s,i,c,o,l),h;if(u.filterWidth===1&&u.filterHeight===1&&v.arraysEqual(u.inShape,u.outShape))h=Pr({inputs:{x:a},backend:n});else{let d=n.data.get(a.dataId).values,p=v.computeStrides(a.shape),f=Lm(d,a.shape,a.dtype,p,u,"avg");h=n.makeTensorInfo(u.outShape,a.dtype,f.values)}return h}var MM={kernelName:ls,backendName:"cpu",kernelFunc:RM};function FM(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{filterSize:s,strides:i,pad:o,dimRoundingMode:l,dataFormat:c}=r;be(a,"avgPool3d");let u=R.computePool3DInfo(a.shape,s,i,1,o,l,c),h=n.data.get(a.dataId).values,d=Nw(h,a.shape,a.dtype,v.computeStrides(a.shape),u,"avg");return n.makeTensorInfo(d.shape,"float32",d.values)}var $M={kernelName:cu,backendName:"cpu",kernelFunc:FM};function DM(e){let{inputs:t,backend:n,attrs:r}=e,{dy:a,input:s}=t,{filterSize:i,strides:o,pad:l,dimRoundingMode:c}=r;be([a,s],"avgPool3DGrad");let u=R.computePool3DInfo(s.shape,i,o,1,l,c),h=u.strideDepth,d=u.strideHeight,p=u.strideWidth,f=u.filterDepth,m=u.filterHeight,A=u.filterWidth,y=u.dilationDepth,g=u.dilationHeight,w=u.dilationWidth,b=u.effectiveFilterDepth,_=u.effectiveFilterHeight,x=u.effectiveFilterWidth,N=b-1-u.padInfo.front,T=x-1-u.padInfo.left,C=_-1-u.padInfo.top,F=Le(s.shape,"float32"),O=1/(f*m*A),W=n.bufferSync(a);for(let V=0;V=u.outDepth||Math.floor(Q)!==Q))for(let he=0;he<_;he+=g){let le=(Y+he)/d;if(!(le<0||le>=u.outHeight||Math.floor(le)!==le))for(let fe=0;fe=u.outWidth||Math.floor(pe)!==pe||(te+=W.get(V,Q,le,pe,U))}}}F.set(te*O,V,j,X,G,U)}return n.makeTensorInfo(F.shape,F.dtype,F.values)}var OM={kernelName:Ih,backendName:"cpu",kernelFunc:DM};function zM(e){let{inputs:t,backend:n,attrs:r}=e,{dy:a,input:s}=t,i=s;be([a,s],"avgPoolGrad");let{filterSize:o,strides:l,pad:c}=r,u=R.computePool2DInfo(i.shape,o,l,1,c),h=u.strideHeight,d=u.strideWidth,p=u.filterHeight,f=u.filterWidth,m=u.dilationHeight,A=u.dilationWidth,y=u.effectiveFilterHeight,g=u.effectiveFilterWidth,w=g-1-u.padInfo.left,b=y-1-u.padInfo.top,_=Le(i.shape,"float32"),x=1/(p*f),N=n.data.get(a.dataId).values,T=Le(a.shape,"float32",N);for(let C=0;C=u.outHeight||Math.floor(G)!==G))for(let ee=0;ee=u.outWidth||Math.floor(Y)!==Y||(j+=T.get(C,G,Y,F))}}_.set(j*x,C,O,W,F)}return n.makeTensorInfo(_.shape,_.dtype,_.values)}var PM={kernelName:kh,backendName:"cpu",kernelFunc:zM};function LM(e){let{inputs:t,backend:n,attrs:r}=e,{x:a,scale:s,offset:i,mean:o,variance:l}=t;v.assert(o.shape.length===l.shape.length,()=>"Batch normalization gradient requires mean and variance to have equal ranks."),v.assert(i==null||o.shape.length===i.shape.length,()=>"Batch normalization gradient requires mean and offset to have equal ranks."),v.assert(s==null||o.shape.length===s.shape.length,()=>"Batch normalization gradient requires mean and scale to have equal ranks."),be([a,o,l,s,i],"batchNorm");let{varianceEpsilon:c}=r;c==null&&(c=.001);let u=n.data.get(a.dataId).values,h=n.data.get(o.dataId).values,d=n.data.get(l.dataId).values,p=s?n.data.get(s.dataId).values:new Float32Array([1]),f=i?n.data.get(i.dataId).values:new Float32Array([0]),m=new Float32Array(u.length),A=f.length,y=p.length,g=d.length,w=h.length,b=0,_=0,x=0,N=0;for(let T=0;T=A&&(b=0),_>=w&&(_=0),x>=y&&(x=0),N>=g&&(N=0);return n.makeTensorInfo(a.shape,a.dtype,m)}var WM={kernelName:bs,backendName:"cpu",kernelFunc:LM};function BM(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{blockShape:s,crops:i}=r;be([a],"batchToSpaceND");let o=s.reduce((y,g)=>y*g),l=R.getReshaped(a.shape,s,o),c=R.getPermuted(l.length,s.length),u=R.getReshapedPermuted(a.shape,s,o),h=R.getSliceBeginCoords(i,s.length),d=R.getSliceSize(u,i,s.length),p=mt({inputs:{x:a},backend:n,attrs:{shape:l}}),f=ir({inputs:{x:p},backend:n,attrs:{perm:c}}),m=mt({inputs:{x:f},backend:n,attrs:{shape:u}}),A=mi({inputs:{x:m},backend:n,attrs:{begin:h,size:d}});return n.disposeIntermediateTensorInfo(p),n.disposeIntermediateTensorInfo(f),n.disposeIntermediateTensorInfo(m),A}var VM={kernelName:hu,backendName:"cpu",kernelFunc:BM};function UM(e){let{inputs:t,backend:n,attrs:r}=e,{x:a,weights:s}=t,{size:i}=r,o=n.data.get(a.dataId).values,l=n.data.get(s.dataId).values,c=Em(o,l,s.dtype,s.shape,i);return n.makeTensorInfo([i],s.dtype,c)}var jM={kernelName:Nh,backendName:"cpu",kernelFunc:UM},HM=at(va,(e,t)=>{let n=t;return e>n.clipValueMax?n.clipValueMax:e{let{x:t}=e.inputs,n=e.backend,r=new Float32Array(v.sizeFromShape(t.shape)),a=n.data.get(t.dataId),s=a.complexTensorInfos.real,i=a.complexTensorInfos.imag,o=n.data.get(s.dataId).values,l=n.data.get(i.dataId).values;for(let c=0;cm.shape),s);if(v.sizeFromShape(i)===0)return n.makeTensorInfo(i,t[0].dtype,[]);let o=t.filter(m=>v.sizeFromShape(m.shape)>0);if(o.length===1)return Pr({inputs:{x:o[0]},backend:n});let l=o.map(m=>m.shape);if(R.assertParamsConsistent(l,s),o[0].dtype==="complex64"){let m=o.map(b=>fi({inputs:{input:b},backend:n})),A=o.map(b=>bl({inputs:{input:b},backend:n})),y=_l({inputs:m,backend:n,attrs:{axis:s}}),g=_l({inputs:A,backend:n,attrs:{axis:s}}),w=Fn({inputs:{real:y,imag:g},backend:n});return m.forEach(b=>n.disposeIntermediateTensorInfo(b)),A.forEach(b=>n.disposeIntermediateTensorInfo(b)),n.disposeIntermediateTensorInfo(y),n.disposeIntermediateTensorInfo(g),w}let c=o.map(m=>{let A=v.sizeFromShape(m.shape.slice(s));return mt({inputs:{x:m},backend:n,attrs:{shape:[-1,A]}})}),u=c.map(m=>({vals:n.data.get(m.dataId).values,shape:m.shape}));i=R.computeOutShape(c.map(m=>m.shape),1);let h=c[0].shape[0]===1,d=Rm(u,i,t[0].dtype,h),p=R.computeOutShape(o.map(m=>m.shape),s),f=n.makeTensorInfo(p,t[0].dtype,d);return c.forEach(m=>n.disposeIntermediateTensorInfo(m)),f}var ZM={kernelName:ao,backendName:"cpu",kernelFunc:_l};function Sw(e){let{inputs:t,backend:n,attrs:r}=e,{x:a,filter:s}=t,{strides:i,pad:o,dataFormat:l,dilations:c,dimRoundingMode:u}=r;be([a,s],"conv2d");let h=R.convertConv2DDataFormat(l),d=R.computeConv2DInfo(a.shape,s.shape,i,c,o,u,!1,h),p=d.filterHeight,f=d.filterWidth,m=d.dilationHeight,A=d.dilationWidth,y=d.padInfo.left,g=d.padInfo.top,w=d.dataFormat==="channelsLast",b=new $t(d.outShape,a.dtype),_=v.computeStrides(a.shape),x=v.computeStrides(s.shape),N=_[0],T=w?_[1]:_[2],C=w?_[2]:1,F=w?1:_[1],O=b.strides[0],W=w?b.strides[1]:b.strides[2],V=w?b.strides[2]:1,U=w?1:b.strides[1],j=n.data.get(a.dataId).values,X=n.data.get(s.dataId).values,G=b.values;for(let ee=0;ee=d.inHeight)continue;let fe=he*x[0],pe=Y+le*T;for(let ve=0;ve=d.inWidth)continue;let Qe=fe+De*x[1],et=pe+Fe*C,st=Qe;for(let Ke=0;Ke=c.inDepth)continue;let ee=X*C[0],Y=O+G*T[1];for(let ae=0;ae=c.inHeight)continue;let le=ee+Q*C[1],fe=Y+he*T[2];for(let pe=0;pe=c.inWidth)continue;let Fe=le+Me*C[2],Qe=fe+De*c.inChannels,et=Fe;for(let st=0;stMath.cos(e)),uF={kernelName:fs,backendName:"cpu",kernelFunc:lF},cF=at(so,e=>Math.cosh(e)),hF={kernelName:so,backendName:"cpu",kernelFunc:cF};function dF(e){let{inputs:t,backend:n,attrs:r}=e,{image:a,boxes:s,boxInd:i}=t,{cropSize:o,method:l,extrapolationValue:c}=r,[u,h,d,p]=a.shape,f=s.shape[0],[m,A]=o,y=Le([f,m,A,p],"float32"),g=n.data.get(s.dataId).values,w=n.data.get(i.dataId).values,b=n.data.get(a.dataId).values,_=v.computeStrides(a.shape),x=v.computeStrides(y.shape);for(let N=0;N=u)continue;let U=m>1?(O-C)*(h-1)/(m-1):0,j=A>1?(W-F)*(d-1)/(A-1):0;for(let X=0;X1?C*(h-1)+X*U:.5*(C+O)*(h-1);if(G<0||G>h-1){for(let ee=0;ee1?F*(d-1)+te*j:.5*(F+W)*(d-1);if(oe<0||oe>d-1){for(let fe=0;fe1?F*(d-1)+ee*j:.5*(F+W)*(d-1);if(Y<0||Y>d-1){for(let oe=0;oey+f-g-1:(y,g)=>y+g;for(let y=0;y`Only NHWC dataFormat supported on CPU for depthToSpace. Got ${i}`),v.assert(s>1,()=>`blockSize should be > 1 for depthToSpace, but was: ${s}`);let o=a.shape[0],l=a.shape[1],c=a.shape[2],u=a.shape[3],h=l*s,d=c*s,p=u/(s*s),f=n.data.get(a.dataId).values,m=new Float32Array(o*h*d*p),A=0;for(let y=0;y`Error in depthwiseConv2d: Either strides or dilations must be 1. Got strides ${i} and dilations '${d}'`);let p=R.computeConv2DInfo(a.shape,s.shape,i,d,o,c,!0),{filterHeight:f,filterWidth:m,dilationHeight:A,dilationWidth:y,padInfo:g}=p,w=g.left,b=g.top,_=p.outChannels/p.inChannels,x=new $t(p.outShape,a.dtype),N=n.data.get(a.dataId).values,T=n.data.get(s.dataId).values,C=x.values;for(let F=0;F=p.inHeight)continue;let ee=X*h[0],Y=O+G*u[1];for(let ae=0;ae=p.inWidth)continue;let le=ee+Q*h[1],fe=Y+he*p.inChannels,pe=te,ve=le;for(let Se=0;Se{let{x:r,filter:a}=e,{strides:s,pad:i,dilations:o}=n,l=t,c=l.data.get(r.dataId).values,u=r.shape.length,h=l.data.get(a.dataId).values,d=a.shape.length,{batchSize:p,inHeight:f,inWidth:m,inChannels:A,outHeight:y,outWidth:g,padInfo:w,strideHeight:b,strideWidth:_,filterHeight:x,filterWidth:N,dilationHeight:T,dilationWidth:C,outShape:F}=R.computeDilation2DInfo(r.shape,a.shape,s,i,"NHWC",o),O=v.sizeFromShape(F),W=F.length,V=v.getArrayFromDType(r.dtype,O);for(let U=0;U=0&&Q=0&&leae&&(ae=ve)}}}let te=v.locToIndex([U,j,G,Y],W,v.computeStrides(F));V[te]=ae}}}return{dataId:l.write(v.toTypedArray(V,r.dtype),F,r.dtype),shape:F,dtype:r.dtype}}},TF={kernelName:Oh,backendName:"cpu",kernelFunc:({inputs:e,backend:t,attrs:n})=>{let{x:r,filter:a,dy:s}=e,{strides:i,pad:o,dilations:l}=n,c=t,u=v.toNestedArray(r.shape,c.data.get(r.dataId).values),h=v.toNestedArray(a.shape,c.data.get(a.dataId).values),{batchSize:d,inHeight:p,inWidth:f,inChannels:m,outHeight:A,outWidth:y,padInfo:g,strideHeight:w,strideWidth:b,filterHeight:_,filterWidth:x,dilationHeight:N,dilationWidth:T,outShape:C}=R.computeDilation2DInfo(r.shape,a.shape,i,o,"NHWC",l);v.assert(s.rank===C.length,()=>`Error in ${Oh}, dy must have the same rank as output ${C.length}, but got ${s.rank}`);let F=v.toNestedArray(C,c.data.get(s.dataId).values),O=v.makeZerosNestedTypedArray(a.shape,a.dtype);for(let W=0;W=0&&oe=0&&heee&&(ee=le,Y=te,ae=Q)}}}O[Y][ae][G]+=F[W][V][j][G]}}}return{dataId:c.write(v.toTypedArray(O,r.dtype),a.shape,a.dtype),shape:a.shape,dtype:a.dtype}}},CF={kernelName:Dh,backendName:"cpu",kernelFunc:({inputs:e,backend:t,attrs:n})=>{let{x:r,filter:a,dy:s}=e,{strides:i,pad:o,dilations:l}=n,c=t,u=v.toNestedArray(r.shape,c.data.get(r.dataId).values),h=v.toNestedArray(a.shape,c.data.get(a.dataId).values),{batchSize:d,inHeight:p,inWidth:f,inChannels:m,outHeight:A,outWidth:y,padInfo:g,strideHeight:w,strideWidth:b,filterHeight:_,filterWidth:x,dilationHeight:N,dilationWidth:T,outShape:C}=R.computeDilation2DInfo(r.shape,a.shape,i,o,"NHWC",l);v.assert(s.rank===C.length,()=>`Error in ${Dh}, dy must have the same rank as output ${C.length}, but got ${s.rank}`);let F=v.toNestedArray(C,c.data.get(s.dataId).values),O=v.makeZerosNestedTypedArray(r.shape,r.dtype);for(let W=0;W=0&&oe=0&&heee&&(ee=le,Y=oe,ae=he)}}}O[W][Y][ae][G]+=F[W][V][j][G]}}}return{dataId:c.write(v.toTypedArray(O,r.dtype),r.shape,r.dtype),shape:r.shape,dtype:r.dtype}}};function EF(e){let{inputs:t,backend:n}=e,{dy:r,y:a}=t;be([r,a],"eluGrad");let s=new Float32Array(v.sizeFromShape(a.shape)),i=n.data.get(a.dataId).values,o=n.data.get(r.dataId).values;for(let l=0;l=1?s[l]=o[l]:s[l]=o[l]*(c+1)}return n.makeTensorInfo(a.shape,"float32",s)}var RF={kernelName:zh,backendName:"cpu",kernelFunc:EF},MF=Et((e,t)=>e===t?1:0),Cw=jt(co,MF,null,"bool"),FF={kernelName:co,backendName:"cpu",kernelFunc:Cw},$F=R.ERF_P,DF=R.ERF_A1,OF=R.ERF_A2,zF=R.ERF_A3,PF=R.ERF_A4,LF=R.ERF_A5,WF=at(uo,e=>{let t=Math.sign(e),n=Math.abs(e),r=1/(1+$F*n);return t*(1-((((LF*r+PF)*r+zF)*r+OF)*r+DF)*r*Math.exp(-n*n))}),BF={kernelName:uo,backendName:"cpu",kernelFunc:WF};function Jd(e){let{inputs:t,backend:n,attrs:r}=e,{input:a}=t,{dim:s}=r,i=a.shape.length,o=a.shape.slice(),l=s;return s<0&&(v.assert(-(i+1)<=s,()=>`Axis must be in the interval [${-(i+1)}, ${i}]`),l=i+s+1),o.splice(l,0,1),mt({inputs:{x:a},backend:n,attrs:{shape:o}})}var VF={kernelName:ho,backendName:"cpu",kernelFunc:Jd},UF=Et((e,t)=>e/t),Wm=jt(ys,UF),Bm={kernelName:ys,backendName:"cpu",kernelFunc:Wm};function Ew(e,t,n){let r=e.shape,a=r[0],s=r[1],i=n.data.get(e.dataId),o=i.complexTensorInfos.real,l=i.complexTensorInfos.imag,c=[a,s],u=v.sizeFromShape(c),h=v.getTypedArrayFromDType("float32",u),d=v.getTypedArrayFromDType("float32",u);for(let A=0;A{let{image:r}=e,a=n,s=v.getTypedArrayFromDType(r.dtype,v.sizeFromShape(r.shape)),[i,o,l,c]=r.shape,u=a.data.get(r.dataId).values;for(let h=0;h=0&&wMath.floor(e/t)),QF=jt(ws,JF,null,"int32"),e$={kernelName:ws,backendName:"cpu",kernelFunc:QF};function t$(e){let{inputs:t,backend:n,attrs:r}=e,{x:a,filter:s,bias:i,preluActivationWeights:o}=t,{strides:l,pad:c,dataFormat:u,dilations:h,dimRoundingMode:d,activation:p,leakyreluAlpha:f}=r,m=Sw({inputs:{x:a,filter:s},backend:n,attrs:{strides:l,pad:c,dataFormat:u,dilations:h,dimRoundingMode:d}});if(i){let A=m;m=nc({inputs:{a:m,b:i},backend:n}),n.disposeIntermediateTensorInfo(A)}if(p){let A=m;m=Pm(n,m,p,o,f),n.disposeIntermediateTensorInfo(A)}return m}var n$={kernelName:Qs,backendName:"cpu",kernelFunc:t$};function r$(e){let{inputs:t,backend:n,attrs:r}=e,{x:a,filter:s,bias:i,preluActivationWeights:o}=t,{strides:l,pad:c,dataFormat:u,dilations:h,dimRoundingMode:d,activation:p,leakyreluAlpha:f}=r,m=Tw({inputs:{x:a,filter:s},backend:n,attrs:{strides:l,pad:c,dataFormat:u,dilations:h,dimRoundingMode:d}});if(i){let A=m;m=nc({inputs:{a:m,b:i},backend:n}),n.disposeIntermediateTensorInfo(A)}if(p){let A=m;m=Pm(n,m,p,o,f),n.disposeIntermediateTensorInfo(A)}return m}var a$={kernelName:ei,backendName:"cpu",kernelFunc:r$};function s$(e){let{inputs:t,backend:n}=e,{params:r,indices:a}=t,s=v.sizeFromShape(r.shape),i=a.shape,o=i[i.length-1],[l,c,u,h]=R.prepareAndValidate(r,a);if(c===0)return n.makeTensorInfo(l,r.dtype,[]);let d=Le([c,u],r.dtype),p=n.data.get(a.dataId).values,f=n.data.get(r.dataId).values;for(let m=0;m=s/u)throw new Error(`Invalid indices: ${A} does not index into ${r.shape}`);for(let g=0;ge>=t?1:0),c$=jt(_s,u$,null,"bool"),h$={kernelName:_s,backendName:"cpu",kernelFunc:c$};function d$(e){let{inputs:t,backend:n}=e,{input:r}=t,a=v.sizeFromShape(r.shape),s=r.shape[r.shape.length-1],i=a/s,o=mt({inputs:{x:r},backend:n,attrs:{shape:[i,s]}}),l=Ew(o,!0,n),c=mt({inputs:{x:l},backend:n,attrs:{shape:r.shape}});return n.disposeIntermediateTensorInfo(o),n.disposeIntermediateTensorInfo(l),c}var p$={kernelName:Lh,backendName:"cpu",kernelFunc:d$},f$=at(go,e=>Number.isFinite(e)?1:0,"bool"),m$={kernelName:go,backendName:"cpu",kernelFunc:f$},A$=at(xo,e=>Math.abs(e)===Infinity?1:0,"bool"),y$={kernelName:xo,backendName:"cpu",kernelFunc:A$},g$=at(wo,e=>Number.isNaN(e)?1:0,"bool"),x$={kernelName:wo,backendName:"cpu",kernelFunc:g$},w$=Et((e,t)=>e<=t?1:0),b$=jt(_o,w$,null,"bool"),_$={kernelName:_o,backendName:"cpu",kernelFunc:b$};function v$(e){let{backend:t,attrs:n}=e,{start:r,stop:a,num:s}=n,i=nw(r,a,s);return t.makeTensorInfo([i.length],"float32",i)}var k$={kernelName:Bh,backendName:"cpu",kernelFunc:v$},I$=at(vo,e=>Math.log1p(e)),N$={kernelName:vo,backendName:"cpu",kernelFunc:I$},S$=Et((e,t)=>e&&t),T$=jt(ko,S$,null,"bool"),C$={kernelName:ko,backendName:"cpu",kernelFunc:T$},E$=at(Au,e=>e?0:1,"bool"),R$={kernelName:Au,backendName:"cpu",kernelFunc:E$},M$=Et((e,t)=>e||t),F$=jt(yu,M$,null,"bool"),$$={kernelName:yu,backendName:"cpu",kernelFunc:F$};function D$(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{depthRadius:s,bias:i,alpha:o,beta:l}=r;be(a,"LRN");let c=a.shape[3],u=c-1,h=n.data.get(a.dataId).values,d=v.sizeFromShape(a.shape),p=new Float32Array(d);function f(m){let A=m%c,y=m-A+Math.max(0,A-s),g=m-A+Math.min(A+s,u),w=0;for(;y<=g;y++){let b=h[y];w+=b*b}return w}for(let m=0;m`Error in maxPool: Either strides or dilations must be 1. Got strides ${i} and dilations '${c}'`);let u=R.computePool2DInfo(a.shape,s,i,c,o,l),h;if(u.filterWidth===1&&u.filterHeight===1&&v.arraysEqual(u.inShape,u.outShape))h=Pr({inputs:{x:a},backend:n});else{let d=n.data.get(a.dataId).values,p=v.computeStrides(a.shape),f=Lm(d,a.shape,a.dtype,p,u,"max");h=n.makeTensorInfo(u.outShape,a.dtype,f.values)}return h}var B$={kernelName:Ts,backendName:"cpu",kernelFunc:W$};function V$(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{filterSize:s,strides:i,pad:o,dimRoundingMode:l,dataFormat:c}=r;be(a,"maxPool3d");let u=R.computePool3DInfo(a.shape,s,i,1,o,l,c),h=n.data.get(a.dataId).values,d=Nw(h,a.shape,a.dtype,v.computeStrides(a.shape),u,"max");return n.makeTensorInfo(d.shape,"float32",d.values)}var U$={kernelName:xu,backendName:"cpu",kernelFunc:V$};function j$(e){let{inputs:t,backend:n,attrs:r}=e,{dy:a,input:s}=t,{filterSize:i,strides:o,pad:l,dimRoundingMode:c}=r;be([a,s],"maxPool3DGrad");let u=R.computePool3DInfo(s.shape,i,o,1,l,c),h=n.bufferSync(s),d=EM(h,u),p=u.strideDepth,f=u.strideHeight,m=u.strideWidth,A=u.dilationDepth,y=u.dilationHeight,g=u.dilationWidth,w=u.effectiveFilterDepth,b=u.effectiveFilterHeight,_=u.effectiveFilterWidth,x=w-1-u.padInfo.front,N=_-1-u.padInfo.left,T=b-1-u.padInfo.top,C=Le(s.shape,"float32"),F=n.bufferSync(a);for(let O=0;O=u.outDepth||Math.floor(te)!==te))for(let oe=0;oe=u.outHeight||Math.floor(Q)!==Q))for(let he=0;he<_;he+=g){let le=(ee+he)/m;if(le<0||le>=u.outWidth||Math.floor(le)!==le)continue;let fe=w*b*_-1-d.get(O,te,Q,le,W),pe=ae*b*_+oe*_+he,ve=fe===pe?1:0;ve!==0&&(Y+=F.get(O,te,Q,le,W)*ve)}}}C.set(Y,O,V,U,j,W)}return n.makeTensorInfo(C.shape,C.dtype,C.values)}var H$={kernelName:jh,backendName:"cpu",kernelFunc:j$};function G$(e){let{inputs:t,backend:n,attrs:r}=e,{dy:a,input:s,output:i}=t,o=s;be([s,i],"maxPoolGrad");let{filterSize:l,strides:c,pad:u,dimRoundingMode:h}=r,d=R.computePool2DInfo(o.shape,l,c,1,u,h),p=n.data.get(o.dataId).values,f=Le(d.outShape,o.dtype,Iw(p,o.shape,o.dtype,d).values),m=d.strideHeight,A=d.strideWidth,y=d.dilationHeight,g=d.dilationWidth,w=d.effectiveFilterHeight,b=d.effectiveFilterWidth,_=b-1-d.padInfo.left,x=w-1-d.padInfo.top,N=Le(o.shape,"float32"),T=n.data.get(a.dataId).values,C=Le(a.shape,"float32",T);for(let F=0;F=d.outHeight||Math.floor(ee)!==ee))for(let Y=0;Y=d.outWidth||Math.floor(ae)!==ae)continue;let te=w*b-1-f.get(F,ee,ae,O),oe=G*b+Y,Q=te===oe?1:0;Q!==0&&(X+=C.get(F,ee,ae,O)*Q)}}N.set(X,F,W,V,O)}return n.makeTensorInfo(N.shape,N.dtype,N.values)}var q$={kernelName:Uh,backendName:"cpu",kernelFunc:G$};function X$(e,t,n,r,a){let s=v.computeStrides(t),i=Lm(e,t,n,s,a,"max"),o=Iw(e,t,n,a,!0,r);return[i.values,o.values]}var K$={kernelName:Hh,backendName:"cpu",kernelFunc:({inputs:e,attrs:t,backend:n})=>{let{x:r}=e,{filterSize:a,strides:s,pad:i,includeBatchInIndex:o}=t,l=n;be(r,"MaxPoolWithArgmax");let c=l.data.get(r.dataId).values,u=R.computePool2DInfo(r.shape,a,s,[1,1],i),[h,d]=X$(c,r.shape,r.dtype,o,u),p=l.write(h,u.outShape,r.dtype),f=l.write(d,u.outShape,r.dtype);return[{dataId:p,shape:u.outShape,dtype:r.dtype},{dataId:f,shape:u.outShape,dtype:"int32"}]}};function Qd(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{axis:s,keepDims:i}=r;be(a,"sum");let o;a.dtype==="bool"?o=za({inputs:{x:a},backend:n,attrs:{dtype:"int32"}}):o=Pr({inputs:{x:a},backend:n});let l=o.shape.length,c=v.parseAxisParam(s,o.shape),u=R.getAxesPermutation(c,l),h=c,d=o;u!=null&&(d=ir({inputs:{x:o},backend:n,attrs:{perm:u}}),h=R.getInnerMostAxes(h.length,l)),R.assertAxesAreInnerMostDims("sum",h,d.shape.length);let[p,f]=R.computeOutAndReduceShapes(d.shape,h),m=R.upcastType(d.dtype,"int32"),A=Yd(n,p,m),y=v.sizeFromShape(f),g=n.data.get(A.dataId).values,w=n.data.get(d.dataId).values;for(let b=0;bn.disposeIntermediateTensorInfo(m)),f}var J$={kernelName:Cs,backendName:"cpu",kernelFunc:Y$};function Q$(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{axis:s,keepDims:i}=r;be(a,"min");let o=v.parseAxisParam(s,a.shape),l=o,c=R.getAxesPermutation(l,a.shape.length),u=a;c!=null&&(u=ir({inputs:{x:a},backend:n,attrs:{perm:c}}),l=R.getInnerMostAxes(l.length,a.shape.length)),R.assertAxesAreInnerMostDims("min",l,u.shape.length);let[h,d]=R.computeOutAndReduceShapes(u.shape,l),p=v.sizeFromShape(d),f=v.makeZerosTypedArray(v.sizeFromShape(h),u.dtype),m=n.data.get(u.dataId).values;for(let y=0;yg[0]+a.shape[w]+g[1]),l=s.map(g=>g[0]),c=s.map((g,w)=>g[0]+a.shape[w]),u=i==="reflect"?0:1,h=n.data.get(a.dataId).values,d=a.shape.length,p=v.computeStrides(a.shape),f=v.sizeFromShape(o),m=o.length,A=v.computeStrides(o),y=v.getTypedArrayFromDType(a.dtype,f);for(let g=0;g=c[_]&&(w[_]=(c[_]-1)*2-w[_]+u);w=w.map((_,x)=>_-l[x]);let b=v.locToIndex(w,d,p);y[g]=h[b]}return{dataId:n.write(y,o,a.dtype),shape:o,dtype:a.dtype}}var nD={kernelName:wu,backendName:"cpu",kernelFunc:tD},rD=Et((e,t)=>{let n=e%t;return e<0&&t<0||e>=0&&t>=0?n:(n+t)%t}),aD=jt(Io,rD),sD={kernelName:Io,backendName:"cpu",kernelFunc:aD},iD=qi(Bg());function Mw(e){let{inputs:t,backend:n,attrs:r}=e,{logits:a}=t,{dim:s}=r,i=a.shape.length,o=s;if(o===-1&&(o=i-1),o!==i-1)throw Error(`Softmax along a non-last dimension is not yet supported. Logits was rank ${i} and dim was ${o}`);let l=v.parseAxisParam([o],a.shape),c=Rw({inputs:{x:a},backend:n,attrs:{reductionIndices:l,keepDims:!1}}),u=R.expandShapeToKeepDim(c.shape,l),h=mt({inputs:{x:c},backend:n,attrs:{shape:u}}),d=zm({inputs:{a,b:h},backend:n}),p=yw({inputs:{x:d},backend:n}),f=Qd({inputs:{x:p},backend:n,attrs:{axis:l,keepDims:!1}}),m=mt({inputs:{x:f},backend:n,attrs:{shape:u}}),A=Wm({inputs:{a:p,b:m},backend:n});return n.disposeIntermediateTensorInfo(c),n.disposeIntermediateTensorInfo(h),n.disposeIntermediateTensorInfo(d),n.disposeIntermediateTensorInfo(p),n.disposeIntermediateTensorInfo(f),n.disposeIntermediateTensorInfo(m),A}var oD={kernelName:qs,backendName:"cpu",kernelFunc:Mw};function lD(e){let{inputs:t,backend:n,attrs:r}=e,{logits:a}=t,{numSamples:s,seed:i,normalized:o}=r;be(a,"multinomial");let l=o?a:Mw({inputs:{logits:a},backend:n,attrs:{dim:-1}}),c=l.shape[0],u=l.shape[1],h=n.data.get(l.dataId).values,d=[c,s],p=v.makeZerosTypedArray(v.sizeFromShape(d),"int32");for(let f=0;f=0&&u[h]{v.assertShapesMatch(s,u.shape,"All tensors passed to stack must have matching shapes"),v.assert(i===u.dtype,()=>"All tensors passed to stack must have matching dtypes")});let o=[],l=t.map(u=>{let h=Jd({inputs:{input:u},backend:n,attrs:{dim:a}});return o.push(h),h}),c=_l({inputs:l,backend:n,attrs:{axis:a}});return o.forEach(u=>n.disposeIntermediateTensorInfo(u)),c}var vD={kernelName:Mo,backendName:"cpu",kernelFunc:$w};function kD(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{paddings:s,constantValue:i}=r;be(a,"pad");let o=s.map((y,g)=>y[0]+a.shape[g]+y[1]),l=s.map(y=>y[0]),c=n.data.get(a.dataId).values,u=v.sizeFromShape(a.shape),h=a.shape.length,d=v.computeStrides(a.shape),p=v.sizeFromShape(o),f=o.length,m=v.computeStrides(o),A=v.getTypedArrayFromDType(a.dtype,p);i!==0&&A.fill(i);for(let y=0;yb+l[_]),w=v.locToIndex(g,f,m);A[w]=c[y]}return{dataId:n.write(A,o,a.dtype),shape:o,dtype:a.dtype}}var Dw={kernelName:$s,backendName:"cpu",kernelFunc:kD},ID=Et((e,t)=>Math.pow(e,t)),ND=jt(Ds,ID),SD={kernelName:Ds,backendName:"cpu",kernelFunc:ND};function TD(e){let{backend:t,attrs:n}=e,{start:r,stop:a,dtype:s,step:i}=n,o=$m(r,a,i,s);return t.makeTensorInfo([o.length],s,o)}var CD={kernelName:bu,backendName:"cpu",kernelFunc:TD},ED=at($o,e=>1/e),RD={kernelName:$o,backendName:"cpu",kernelFunc:ED};function MD(e){let{inputs:t,backend:n,attrs:r}=e,{images:a}=t,{alignCorners:s,halfPixelCenters:i,size:o}=r;be(a,"resizeBilinear");let l=v.computeStrides(a.shape),[c,u]=o,[h,d,p,f]=a.shape,m=n.data.get(a.dataId).values,A=new Float32Array(v.sizeFromShape([h,c,u,f])),y=[s&&c>1?d-1:d,s&&u>1?p-1:p],g=[s&&c>1?c-1:c,s&&u>1?u-1:u],w=0,b=y[0]/g[0],_=y[1]/g[1];for(let x=0;x1?c-1:c,i&&p>1?u-1:u],A=[i&&d>1?d-1:d,i&&p>1?p-1:p],y=m[0]/A[0],g=m[1]/A[1],w=n.data.get(s.dataId).values,b=0;for(let _=0;_1?d-1:d,s&&u>1?p-1:p],g=[s&&c>1?c-1:c,s&&u>1?u-1:u],w=y[0]/g[0],b=y[1]/g[1],_=0;for(let x=0;x1?u-1:u,i&&f>1?h-1:h],g=[i&&p>1?p-1:p,i&&f>1?f-1:f],w=y[0]/g[0],b=y[1]/g[1],_=1/w,x=1/b,N=Math.ceil(_)*2+2,T=Math.ceil(x)*2+2;for(let C=0;C=p)continue;let Q=F+oe*l[1],he=oe*w,le=Math.min(u-1,i?Math.round(he):Math.floor(he));if(O===le)for(let fe=0;fe=f)continue;let ve=Q+pe*l[2],Se=pe*b,Me=Math.min(h-1,i?Math.round(Se):Math.floor(Se));j===Me&&(ae+=A[ve+Y])}}m[X+Y]=ae}}}}return n.makeTensorInfo(a.shape,a.dtype,m)}var LD={kernelName:Xh,backendName:"cpu",kernelFunc:PD};function WD(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{dims:s}=r;be(a,"reverse");let i=a.shape.length,o=v.parseAxisParam(s,a.shape);if(i===0)return Pr({inputs:{x:a},backend:n});let l=new $t(a.shape,a.dtype),c=n.bufferSync(a);for(let u=0;ud[p]=a.shape[p]-1-d[p]),l.set(c.get(...d),...h)}return n.makeTensorInfo(l.shape,l.dtype,l.values)}var BD={kernelName:Ws,backendName:"cpu",kernelFunc:WD},VD={kernelName:Ko,backendName:"cpu",kernelFunc:({inputs:e,attrs:t,backend:n})=>{let{image:r}=e,{radians:a,fillValue:s,center:i}=t,o=n,l=v.getTypedArrayFromDType(r.dtype,v.sizeFromShape(r.shape)),[c,u,h,d]=r.shape,[p,f]=R.getImageCenter(i,u,h),m=255,A=Math.sin(a),y=Math.cos(a),g=o.data.get(r.dataId).values;for(let w=0;w=0&&V=0&&U{let t=Math.floor(e);return e-t<.5?Math.floor(e):e-t>.5?Math.ceil(e):t%2==0?t:t+1}),jD={kernelName:Bs,backendName:"cpu",kernelFunc:UD};function Ow(e,t,n,r,a,s,i,o,l,c){let u=[r/a,a],h=e.values,d=t.values;if(r===0)return Le(n,t.dtype);let p=Le(u,t.dtype);p.values.fill(l);for(let f=0;f=r/a)throw new Error(`Invalid indices: ${m} does not index into ${n}`);for(let y=0;y1||a.shape.length===1?1:v.sizeFromShape(a.shape.slice(1));for(let f=0;fe>=0?ZD*e:KD*(Math.exp(e)-1)),JD={kernelName:Po,backendName:"cpu",kernelFunc:YD},QD=at(js,e=>1/(1+Math.exp(-e))),eO={kernelName:js,backendName:"cpu",kernelFunc:QD},tO=at(Bo,e=>e<0?-1:e>0?1:0),nO={kernelName:Bo,backendName:"cpu",kernelFunc:tO},rO=at(Us,e=>Math.sin(e)),aO={kernelName:Us,backendName:"cpu",kernelFunc:rO},sO=at(Wo,e=>Math.sinh(e)),iO={kernelName:Wo,backendName:"cpu",kernelFunc:sO},oO=11920928955078125e-23,zw=Math.log(oO)+2,lO=at(Vo,e=>{let t=e>-zw,n=e{let d=[...u];d[o]=h;let p=mi({inputs:{x:a},backend:n,attrs:{begin:c,size:d}});return c[o]+=h,p})}var mO={kernelName:Uo,backendName:"cpu",kernelFunc:fO},AO=at(Hs,e=>Math.sqrt(e)),yO={kernelName:Hs,backendName:"cpu",kernelFunc:AO},gO={kernelName:ku,backendName:"cpu",kernelFunc:({inputs:e,backend:t})=>{let{x:n}=e,r=t;be(n,"square");let a=r.data.get(n.dataId).values,s=new Float32Array(a.length);for(let i=0;i{let n=t;return isNaN(e)?NaN:e>0?1:n.alpha}),wO={kernelName:Ia,backendName:"cpu",kernelFunc:xO};function bO(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{begin:s,end:i,strides:o,beginMask:l,endMask:c,ellipsisMask:u,newAxisMask:h,shrinkAxisMask:d}=r;be(a,"stridedSlice");let{nonStrided:p,$begin:f,$strides:m,size:A,newShape:y,outShape:g}=sn.sliceInfo(a.shape,s,i,o,l,c,u,h,d),w=mt({inputs:{x:a},backend:n,attrs:{shape:y}}),b;if(p){let x=mi({inputs:{x:w},backend:n,attrs:{begin:f,size:A}});b=mt({inputs:{x},backend:n,attrs:{shape:g}}),n.disposeIntermediateTensorInfo(x)}else if(g.some(x=>x===0))b=n.makeTensorInfo(g,a.dtype,[]);else{let x=n.bufferSync(w),N=dw(g,x,m,f);b=n.makeTensorInfo(N.shape,N.dtype,N.values)}let _=mt({inputs:{x:b},backend:n,attrs:{shape:g}});return n.disposeIntermediateTensorInfo(w),n.disposeIntermediateTensorInfo(b),_}var _O={kernelName:jo,backendName:"cpu",kernelFunc:bO},vO=at(Ho,e=>Math.tan(e)),kO={kernelName:Ho,backendName:"cpu",kernelFunc:vO},IO=at(Zs,e=>Math.tanh(e)),NO={kernelName:Zs,backendName:"cpu",kernelFunc:IO};function SO(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{reps:s}=r;be(a,"tile");let i=fw(n.bufferSync(a),s);return n.makeTensorInfo(i.shape,i.dtype,i.values)}var TO={kernelName:ka,backendName:"cpu",kernelFunc:SO};function CO(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{k:s,sorted:i}=r;be(a,"topk");let o=n.data.get(a.dataId).values,[l,c]=mw(o,a.shape,a.dtype,s,i);return[n.makeTensorInfo(l.shape,l.dtype,l.values),n.makeTensorInfo(c.shape,c.dtype,c.values)]}var EO={kernelName:Go,backendName:"cpu",kernelFunc:CO};function FO(e){let{inputs:t,attrs:n,backend:r}=e,{image:a,transforms:s}=t,{interpolation:i,fillMode:o,fillValue:l,outputShape:c}=n,[u,h,d,p]=a.shape,[f,m]=c!=null?c:[h,d],A=[u,f,m,p],y=v.computeStrides(a.shape),g=y[0],w=y[1],b=y[2],_=v.getTypedArrayFromDType(a.dtype,v.sizeFromShape(A));_.fill(l);let x=r.data.get(a.dataId).values,N=r.data.get(s.dataId).values;for(let T=0;Tt-1)if(t<=1)n=0;else{let r=2*t;n-=r*Math.trunc(n/r),n>=t&&(n=r-n-1)}return v.clamp(0,n,t-1)}function OO(e,t){let n=e;if(n<0)if(t<=1)n=0;else{let r=t-1;n+=t*(Math.trunc(-n/r)+1)}else if(n>t-1)if(t<=1)n=0;else{let r=t-1;n-=t*Math.trunc(n/r)}return v.clamp(0,n,t-1)}function zO(e,t){return e}function PO(e,t){return v.clamp(0,e,t-1)}function rc(e,t,n,r,a,s,i,o,l,c,u){let h=i*r+o*a+l*s+c;return 0<=o&&on.disposeIntermediateTensorInfo(f)),p}var jO={kernelName:Iu,backendName:"cpu",kernelFunc:UO},HO=[aM,uR,iM,lM,mR,cM,dM,fM,AM,gM,wM,_M,kM,SM,CM,MM,$M,OM,PM,nM,WM,VM,jM,pR,yR,GM,cR,XM,ZM,QM,tF,YM,sF,oF,rF,uF,hF,pF,mF,yF,xF,wF,_F,kF,NF,SF,CF,TF,Bm,KR,RF,FF,BF,gR,VF,wR,XF,ZF,YF,_R,e$,n$,a$,i$,l$,kR,h$,hR,p$,KM,m$,y$,x$,ZR,NR,_$,k$,TR,N$,C$,R$,$$,O$,P$,ER,B$,U$,H$,q$,K$,L$,J$,eD,MR,nD,sD,uD,$R,OR,dD,mD,gD,PR,wD,_D,vD,Dw,SD,JR,BR,CD,dR,RD,QR,eM,tM,FD,DD,zD,LD,BD,VD,jD,UR,GD,XD,JD,eO,nO,aO,iO,jR,oD,uO,hO,pO,mO,yO,gO,GR,wO,_O,XR,Z$,kO,NO,TO,EO,LR,$O,WO,VO,jO,bD];for(let e of HO)ti(e);var Lw={};Oe(Lw,{assertNotComplex:()=>vl,bindCanvasToFramebuffer:()=>XO,bindColorTextureToFramebuffer:()=>np,bindTextureToProgramUniformSampler:()=>eb,bindTextureUnit:()=>Yw,bindVertexBufferToProgramAttribute:()=>jm,callAndCheck:()=>xe,canBeRepresented:()=>Ww,createFragmentShader:()=>Uw,createFramebuffer:()=>Zw,createProgram:()=>jw,createStaticIndexBuffer:()=>qw,createStaticVertexBuffer:()=>Gw,createTexture:()=>Xw,createVertexShader:()=>Vw,getBatchDim:()=>Ai,getExtensionOrThrow:()=>ac,getFramebufferErrorMessage:()=>tb,getMaxTexturesInShader:()=>ab,getNumChannels:()=>GO,getProgramUniformLocation:()=>Qw,getProgramUniformLocationOrThrow:()=>Jw,getRowsCols:()=>yi,getShapeAs3D:()=>rp,getTextureShapeFromLogicalShape:()=>nb,getWebGLDisjointQueryTimerVersion:()=>sb,getWebGLErrorMessage:()=>Bw,getWebGLMaxTextureSize:()=>rb,hasExtension:()=>Xn,isCapableOfRenderingToFloatTexture:()=>ib,isDownloadFloatTextureEnabled:()=>ob,isReshapeFree:()=>ic,isWebGLFenceEnabled:()=>lb,isWebGLVersionEnabled:()=>Gm,linkProgram:()=>Hw,resetMaxTextureSize:()=>KO,resetMaxTexturesInShader:()=>ZO,unbindColorTextureFromFramebuffer:()=>Hm,unbindTextureUnit:()=>qO,validateFramebuffer:()=>sc,validateProgram:()=>tp,validateTextureSize:()=>Kw});var gi={},qm={alpha:!1,antialias:!1,premultipliedAlpha:!1,preserveDrawingBuffer:!1,depth:!1,stencil:!1,failIfMajorPerformanceCaveat:!0};function ap(e,t){gi[e]=t}function Lr(e){if(!(e in gi)){let n=YO(e);if(n!==null)gi[e]=n;else return console.log("Could not get context for WebGL version",e),null}let t=gi[e];return t.isContextLost()?(delete gi[e],Lr(e)):(t.disable(t.DEPTH_TEST),t.disable(t.STENCIL_TEST),t.disable(t.BLEND),t.disable(t.DITHER),t.disable(t.POLYGON_OFFSET_FILL),t.disable(t.SAMPLE_COVERAGE),t.enable(t.SCISSOR_TEST),t.enable(t.CULL_FACE),t.cullFace(t.BACK),gi[e])}function JO(e){if(typeof OffscreenCanvas!="undefined"&&e===2)return new OffscreenCanvas(300,150);if(typeof document!="undefined")return document.createElement("canvas");throw new Error("Cannot create a canvas in this context")}function YO(e){if(e!==1&&e!==2)throw new Error("Cannot get WebGL rendering context, WebGL is disabled.");let t=JO(e);return t.addEventListener("webglcontextlost",n=>{n.preventDefault(),delete gi[e]},!1),e===1?t.getContext("webgl",qm)||t.getContext("experimental-webgl",qm):t.getContext("webgl2",qm)}var oc;(function(e){e[e.DENSE=0]="DENSE",e[e.SHARED_BATCH=1]="SHARED_BATCH"})(oc||(oc={}));var Kn;(function(e){e[e.RENDER=0]="RENDER",e[e.UPLOAD=1]="UPLOAD",e[e.PIXELS=2]="PIXELS",e[e.DOWNLOAD=3]="DOWNLOAD"})(Kn||(Kn={}));var Jt;(function(e){e[e.UNPACKED_FLOAT16=0]="UNPACKED_FLOAT16",e[e.UNPACKED_FLOAT32=1]="UNPACKED_FLOAT32",e[e.PACKED_4X1_UNSIGNED_BYTE=2]="PACKED_4X1_UNSIGNED_BYTE",e[e.PACKED_2X2_FLOAT32=3]="PACKED_2X2_FLOAT32",e[e.PACKED_2X2_FLOAT16=4]="PACKED_2X2_FLOAT16"})(Jt||(Jt={}));function lc(e,t){return[t,e]}function QO(e,t){return e*t}function uc(e){let t=v.sizeFromShape(e),n=Math.ceil(t/4);return v.sizeToSquarishShape(n)}function kl(e,t){return[Math.max(1,Math.ceil(t/2)),Math.max(1,Math.ceil(e/2))]}function ez(e,t){let[n,r]=kl(e,t);return n*r*4}function Xm(e,t){let n=e,r,a,s,i,o,l,c,u,h,d;return J().getNumber("WEBGL_VERSION")===2?(r=n.R32F,a=n.R16F,s=n.RGBA16F,i=n.RGBA32F,o=n.RED,c=4,u=1,h=n.HALF_FLOAT,d=n.FLOAT):(r=e.RGBA,a=e.RGBA,s=e.RGBA,i=n.RGBA,o=e.RGBA,c=4,u=4,h=t!=null?t.HALF_FLOAT_OES:null,d=e.FLOAT),l=e.RGBA,{internalFormatFloat:r,internalFormatHalfFloat:a,internalFormatPackedHalfFloat:s,internalFormatPackedFloat:i,textureFormatFloat:o,downloadTextureFormat:l,downloadUnpackNumChannels:c,defaultNumChannels:u,textureTypeHalfFloat:h,textureTypeFloat:d}}function xe(e,t){let n=t();return J().getBool("DEBUG")&&tz(e),n}function tz(e){let t=e.getError();if(t!==e.NO_ERROR)throw new Error("WebGL Error: "+Bw(e,t))}var nz=596e-10,rz=65504;function Ww(e){return!!(J().getBool("WEBGL_RENDER_FLOAT32_ENABLED")||e===0||nze.getExtension(t),'Extension "'+t+'" not supported on this browser.')}function Vw(e,t){let n=sa(e,()=>e.createShader(e.VERTEX_SHADER),"Unable to create vertex WebGLShader.");if(xe(e,()=>e.shaderSource(n,t)),xe(e,()=>e.compileShader(n)),e.getShaderParameter(n,e.COMPILE_STATUS)===!1)throw console.log(e.getShaderInfoLog(n)),new Error("Failed to compile vertex shader.");return n}function Uw(e,t){let n=sa(e,()=>e.createShader(e.FRAGMENT_SHADER),"Unable to create fragment WebGLShader.");if(xe(e,()=>e.shaderSource(n,t)),xe(e,()=>e.compileShader(n)),e.getShaderParameter(n,e.COMPILE_STATUS)===!1)throw az(t,e.getShaderInfoLog(n)),new Error("Failed to compile fragment shader.");return n}var sz=/ERROR: [0-9]+:([0-9]+):/g;function az(e,t){let n=sz.exec(t);if(n==null){console.log(`Couldn't parse line number in error: ${t}`),console.log(e);return}let r=+n[1],a=e.split(` -`),s=a.length.toString().length+2,i=a.map((h,d)=>v.rightPad((d+1).toString(),s)+h),o=0;for(let h=0;he.createProgram(),"Unable to create WebGLProgram.")}function Hw(e,t){if(xe(e,()=>e.linkProgram(t)),e.getProgramParameter(t,e.LINK_STATUS)===!1)throw console.log(e.getProgramInfoLog(t)),new Error("Failed to link vertex and fragment shaders.")}function tp(e,t){if(xe(e,()=>e.validateProgram(t)),e.getProgramParameter(t,e.VALIDATE_STATUS)===!1)throw console.log(e.getProgramInfoLog(t)),new Error("Shader program validation failed.")}function Gw(e,t){let n=sa(e,()=>e.createBuffer(),"Unable to create WebGLBuffer");return xe(e,()=>e.bindBuffer(e.ARRAY_BUFFER,n)),xe(e,()=>e.bufferData(e.ARRAY_BUFFER,t,e.STATIC_DRAW)),n}function qw(e,t){let n=sa(e,()=>e.createBuffer(),"Unable to create WebGLBuffer");return xe(e,()=>e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,n)),xe(e,()=>e.bufferData(e.ELEMENT_ARRAY_BUFFER,t,e.STATIC_DRAW)),n}function GO(){return J().getNumber("WEBGL_VERSION")===2?1:4}function Xw(e){return sa(e,()=>e.createTexture(),"Unable to create WebGLTexture.")}function Kw(e,t){let n=J().getNumber("WEBGL_MAX_TEXTURE_SIZE");if(e<=0||t<=0){let r=`[${e}x${t}]`;throw new Error("Requested texture size "+r+" is invalid.")}if(e>n||t>n){let r=`[${e}x${t}]`,a=`[${n}x${n}]`;throw new Error("Requested texture size "+r+" greater than WebGL maximum on this browser / GPU "+a+".")}}function Zw(e){return sa(e,()=>e.createFramebuffer(),"Unable to create WebGLFramebuffer.")}function jm(e,t,n,r,a,s,i){let o=e.getAttribLocation(t,n);return o===-1?!1:(xe(e,()=>e.bindBuffer(e.ARRAY_BUFFER,r)),xe(e,()=>e.vertexAttribPointer(o,a,e.FLOAT,!1,s,i)),xe(e,()=>e.enableVertexAttribArray(o)),!0)}function Yw(e,t,n){ub(e,n),xe(e,()=>e.activeTexture(e.TEXTURE0+n)),xe(e,()=>e.bindTexture(e.TEXTURE_2D,t))}function qO(e,t){ub(e,t),xe(e,()=>e.activeTexture(e.TEXTURE0+t)),xe(e,()=>e.bindTexture(e.TEXTURE_2D,null))}function Jw(e,t,n){return sa(e,()=>e.getUniformLocation(t,n),'uniform "'+n+'" not present in program.')}function Qw(e,t,n){return e.getUniformLocation(t,n)}function eb(e,t,n,r){xe(e,()=>Yw(e,t,r)),xe(e,()=>e.uniform1i(n,r))}function XO(e){xe(e,()=>e.bindFramebuffer(e.FRAMEBUFFER,null)),xe(e,()=>e.viewport(0,0,e.canvas.width,e.canvas.height)),xe(e,()=>e.scissor(0,0,e.canvas.width,e.canvas.height))}function np(e,t,n){xe(e,()=>e.bindFramebuffer(e.FRAMEBUFFER,n)),xe(e,()=>e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,t,0))}function Hm(e,t){xe(e,()=>e.bindFramebuffer(e.FRAMEBUFFER,t)),xe(e,()=>e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,null,0))}function sc(e){let t=e.checkFramebufferStatus(e.FRAMEBUFFER);if(t!==e.FRAMEBUFFER_COMPLETE)throw new Error("Error binding framebuffer: "+tb(e,t))}function tb(e,t){switch(t){case e.FRAMEBUFFER_INCOMPLETE_ATTACHMENT:return"FRAMEBUFFER_INCOMPLETE_ATTACHMENT";case e.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT:return"FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT";case e.FRAMEBUFFER_INCOMPLETE_DIMENSIONS:return"FRAMEBUFFER_INCOMPLETE_DIMENSIONS";case e.FRAMEBUFFER_UNSUPPORTED:return"FRAMEBUFFER_UNSUPPORTED";default:return`unknown error ${t}`}}function sa(e,t,n){let r=xe(e,()=>t());if(r==null)throw new Error(n);return r}function ub(e,t){let n=e.MAX_COMBINED_TEXTURE_IMAGE_UNITS-1,r=t+e.TEXTURE0;if(rn){let a=`[gl.TEXTURE0, gl.TEXTURE${n}]`;throw new Error(`textureUnit must be in ${a}.`)}}function Ai(e,t=2){return v.sizeFromShape(e.slice(0,e.length-t))}function yi(e){if(e.length===0)throw Error("Cannot get rows and columns of an empty shape array.");return[e.length>1?e[e.length-2]:1,e[e.length-1]]}function rp(e){let t=[1,1,1];return e.length===0||e.length===1&&e[0]===1||(t=[Ai(e),...yi(e)]),t}function nb(e,t=!1){let n=J().getNumber("WEBGL_MAX_TEXTURE_SIZE");t&&(n=n*2,e=e.map((a,s)=>s>=e.length-2?v.nearestLargerEven(e[s]):e[s]),e.length===1&&(e=[2,e[0]])),e.length!==2&&(e=v.squeezeShape(e).newShape);let r=v.sizeFromShape(e);if(e.length<=1&&r<=n)return[1,r];if(e.length===2&&e[0]<=n&&e[1]<=n)return e;if(e.length===3&&e[0]*e[1]<=n&&e[2]<=n)return[e[0]*e[1],e[2]];if(e.length===3&&e[0]<=n&&e[1]*e[2]<=n)return[e[0],e[1]*e[2]];if(e.length===4&&e[0]*e[1]*e[2]<=n&&e[3]<=n)return[e[0]*e[1]*e[2],e[3]];if(e.length===4&&e[0]<=n&&e[1]*e[2]*e[3]<=n)return[e[0],e[1]*e[2]*e[3]];if(t){let a=Ai(e),s=2,i=2;return e.length&&([s,i]=yi(e)),r=a*(s/2)*(i/2),v.sizeToSquarishShape(r).map(o=>o*2)}return v.sizeToSquarishShape(r)}function sp(e){return e%2==0}function ic(e,t){if(e=e.slice(-2),t=t.slice(-2),v.arraysEqual(e,t)||!e.length||!t.length||e[0]===0||e[1]===0||t[0]===0||t[1]===0)return!0;if(e.length!==t.length){let n=e.slice(-1)[0],r=t.slice(-1)[0];if(n===r||sp(n)&&sp(r)&&(e[0]===1||t[0]===1))return!0}return e[1]===t[1]&&sp(e[0])&&sp(t[0])}var ip,op;function rb(e){if(ip==null){let t=Lr(e);ip=t.getParameter(t.MAX_TEXTURE_SIZE)}return ip}function KO(){ip=null}function ZO(){op=null}function ab(e){if(op==null){let t=Lr(e);op=t.getParameter(t.MAX_TEXTURE_IMAGE_UNITS)}return Math.min(16,op)}function sb(e){if(e===0)return 0;let t,n=Lr(e);return Xn(n,"EXT_disjoint_timer_query_webgl2")&&e===2?t=2:Xn(n,"EXT_disjoint_timer_query")?t=1:t=0,t}function Xn(e,t){return e.getExtension(t)!=null}function Gm(e){try{if(Lr(e)!=null)return!0}catch(t){return console.log("Error when getting WebGL context: ",t),!1}return!1}function ib(e){if(e===0)return!1;let t=Lr(e);if(e===1){if(!Xn(t,"OES_texture_float"))return!1}else if(!Xn(t,"EXT_color_buffer_float"))return!1;return Km(t)}function ob(e){if(e===0)return!1;let t=Lr(e);if(e===1){if(!Xn(t,"OES_texture_float")||!Xn(t,"WEBGL_color_buffer_float"))return!1}else{if(Xn(t,"EXT_color_buffer_float"))return Km(t);let n="EXT_color_buffer_half_float";if(Xn(t,n)){let r=t.getExtension(n);return iz(t,r)}return!1}return Km(t)}function Km(e){let t=Xm(e),n=e.createTexture();e.bindTexture(e.TEXTURE_2D,n);let r=1,a=1;e.texImage2D(e.TEXTURE_2D,0,t.internalFormatFloat,r,a,0,t.textureFormatFloat,t.textureTypeFloat,null);let s=e.createFramebuffer();e.bindFramebuffer(e.FRAMEBUFFER,s),e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,n,0);let i=e.checkFramebufferStatus(e.FRAMEBUFFER)===e.FRAMEBUFFER_COMPLETE;return e.bindTexture(e.TEXTURE_2D,null),e.bindFramebuffer(e.FRAMEBUFFER,null),e.deleteTexture(n),e.deleteFramebuffer(s),i}function iz(e,t){let n=Xm(e,t),r=e.createTexture();e.bindTexture(e.TEXTURE_2D,r);let a=1,s=1;e.texImage2D(e.TEXTURE_2D,0,n.internalFormatHalfFloat,a,s,0,n.textureFormatFloat,n.textureTypeHalfFloat,null);let i=e.createFramebuffer();e.bindFramebuffer(e.FRAMEBUFFER,i),e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,r,0);let o=e.checkFramebufferStatus(e.FRAMEBUFFER)===e.FRAMEBUFFER_COMPLETE;return e.bindTexture(e.TEXTURE_2D,null),e.bindFramebuffer(e.FRAMEBUFFER,null),e.deleteTexture(r),e.deleteFramebuffer(i),o}function lb(e){return e!==2?!1:Lr(e).fenceSync!=null}function vl(e,t){Array.isArray(e)||(e=[e]),e.forEach(n=>{n!=null&&v.assert(n.dtype!=="complex64",()=>`${t} does not support complex64 tensors in the WebGL backend.`)})}var Re=J();Re.registerFlag("HAS_WEBGL",()=>Re.getNumber("WEBGL_VERSION")>0);Re.registerFlag("WEBGL_VERSION",()=>Gm(2)?2:Gm(1)?1:0);Re.registerFlag("WEBGL_CHECK_NUMERICAL_PROBLEMS",()=>!1);Re.registerFlag("WEBGL_BUFFER_SUPPORTED",()=>Re.get("WEBGL_VERSION")===2);Re.registerFlag("WEBGL_CPU_FORWARD",()=>!0);Re.registerFlag("WEBGL_FORCE_F16_TEXTURES",()=>!1);Re.registerFlag("WEBGL_PACK",()=>Re.getBool("HAS_WEBGL"));Re.registerFlag("WEBGL_PACK_NORMALIZATION",()=>Re.getBool("WEBGL_PACK"));Re.registerFlag("WEBGL_PACK_CLIP",()=>Re.getBool("WEBGL_PACK"));Re.registerFlag("WEBGL_PACK_DEPTHWISECONV",()=>!1);Re.registerFlag("WEBGL_PACK_BINARY_OPERATIONS",()=>Re.getBool("WEBGL_PACK"));Re.registerFlag("WEBGL_PACK_UNARY_OPERATIONS",()=>Re.getBool("WEBGL_PACK"));Re.registerFlag("WEBGL_PACK_ARRAY_OPERATIONS",()=>Re.getBool("WEBGL_PACK"));Re.registerFlag("WEBGL_PACK_IMAGE_OPERATIONS",()=>Re.getBool("WEBGL_PACK"));Re.registerFlag("WEBGL_PACK_REDUCE",()=>Re.getBool("WEBGL_PACK"));Re.registerFlag("WEBGL_LAZILY_UNPACK",()=>Re.getBool("WEBGL_PACK"));Re.registerFlag("WEBGL_CONV_IM2COL",()=>Re.getBool("WEBGL_PACK"));Re.registerFlag("WEBGL_MAX_TEXTURE_SIZE",()=>rb(Re.getNumber("WEBGL_VERSION")));Re.registerFlag("WEBGL_MAX_TEXTURES_IN_SHADER",()=>ab(Re.getNumber("WEBGL_VERSION")));Re.registerFlag("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION",()=>{let e=Re.getNumber("WEBGL_VERSION");return e===0?0:sb(e)});Re.registerFlag("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE",()=>Re.getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")>0&&!$u.isMobile());Re.registerFlag("WEBGL_RENDER_FLOAT32_CAPABLE",()=>ib(Re.getNumber("WEBGL_VERSION")));Re.registerFlag("WEBGL_RENDER_FLOAT32_ENABLED",()=>Re.getBool("WEBGL_FORCE_F16_TEXTURES")?!1:Re.getBool("WEBGL_RENDER_FLOAT32_CAPABLE"));Re.registerFlag("WEBGL_DOWNLOAD_FLOAT_ENABLED",()=>ob(Re.getNumber("WEBGL_VERSION")));Re.registerFlag("WEBGL_FENCE_API_ENABLED",()=>lb(Re.getNumber("WEBGL_VERSION")));Re.registerFlag("WEBGL_SIZE_UPLOAD_UNIFORM",()=>Re.getBool("WEBGL_RENDER_FLOAT32_ENABLED")?4:0);Re.registerFlag("WEBGL_DELETE_TEXTURE_THRESHOLD",()=>-1,e=>{if(e<0&&e!==-1)throw new Error(`WEBGL_DELETE_TEXTURE_THRESHOLD must be -1 (indicating never delete) or at least 0, but got ${e}.`)});Re.registerFlag("WEBGL_FLUSH_THRESHOLD",()=>$u.isMobile()&&Re.getBool("IS_CHROME")?1:-1,e=>{if(e<0&&e!==-1)throw new Error(`WEBGL_FLUSH_THRESHOLD must be -1 (indicating never manual flush) or at least 0, but got ${e}.`)});function cn(){let e,t,n,r,a,s,i,o,l,c;return J().getNumber("WEBGL_VERSION")===2?(e="#version 300 es",t="in",n="out",r="in",a="texture",s="outputColor",i="out vec4 outputColor;",o=` +var Human = (() => { + var __create = Object.create; + var __defProp = Object.defineProperty; + var __getProtoOf = Object.getPrototypeOf; + var __hasOwnProp = Object.prototype.hasOwnProperty; + var __getOwnPropNames = Object.getOwnPropertyNames; + var __getOwnPropDesc = Object.getOwnPropertyDescriptor; + var __markAsModule = (target) => __defProp(target, "__esModule", {value: true}); + var __commonJS = (callback, module) => () => { + if (!module) { + module = {exports: {}}; + callback(module.exports, module); + } + return module.exports; + }; + var __export = (target, all5) => { + for (var name in all5) + __defProp(target, name, {get: all5[name], enumerable: true}); + }; + var __exportStar = (target, module, desc) => { + if (module && typeof module === "object" || typeof module === "function") { + for (let key of __getOwnPropNames(module)) + if (!__hasOwnProp.call(target, key) && key !== "default") + __defProp(target, key, {get: () => module[key], enumerable: !(desc = __getOwnPropDesc(module, key)) || desc.enumerable}); + } + return target; + }; + var __toModule = (module) => { + return __exportStar(__markAsModule(__defProp(module != null ? __create(__getProtoOf(module)) : {}, "default", module && module.__esModule && "default" in module ? {get: () => module.default, enumerable: true} : {value: module, enumerable: true})), module); + }; + var __accessCheck = (obj, member, msg) => { + if (!member.has(obj)) + throw TypeError("Cannot " + msg); + }; + var __privateGet = (obj, member, getter) => { + __accessCheck(obj, member, "read from private field"); + return getter ? getter.call(obj) : member.get(obj); + }; + var __privateSet = (obj, member, value, setter) => { + __accessCheck(obj, member, "write to private field"); + setter ? setter.call(obj, value) : member.set(obj, value); + return value; + }; + + // src/blazeface/facemesh.ts + var require_facemesh = __commonJS((exports) => { + __markAsModule(exports); + __export(exports, { + MediaPipeFaceMesh: () => MediaPipeFaceMesh, + load: () => load11 + }); + var MediaPipeFaceMesh = class { + constructor(blazeFace, blazeMeshModel, irisModel, config3) { + this.facePipeline = new Pipeline(blazeFace, blazeMeshModel, irisModel); + this.config = config3; + } + async estimateFaces(input2, config3) { + const predictions = await this.facePipeline.predict(input2, config3); + const results = []; + for (const prediction of predictions || []) { + if (prediction.isDisposedInternal) + continue; + const mesh = prediction.coords ? prediction.coords.arraySync() : []; + const meshRaw = mesh.map((pt) => [ + pt[0] / input2.shape[2], + pt[1] / input2.shape[1], + pt[2] / this.facePipeline.meshSize + ]); + const annotations3 = {}; + if (mesh && mesh.length > 0) { + for (const key of Object.keys(MESH_ANNOTATIONS)) + annotations3[key] = MESH_ANNOTATIONS[key].map((index) => mesh[index]); + } + const box3 = prediction.box ? [ + Math.max(0, prediction.box.startPoint[0]), + Math.max(0, prediction.box.startPoint[1]), + Math.min(input2.shape[1], prediction.box.endPoint[0]) - Math.max(0, prediction.box.startPoint[0]), + Math.min(input2.shape[2], prediction.box.endPoint[1]) - Math.max(0, prediction.box.startPoint[1]) + ] : 0; + const boxRaw = prediction.box ? [ + prediction.box.startPoint[0] / input2.shape[2], + prediction.box.startPoint[1] / input2.shape[1], + (prediction.box.endPoint[0] - prediction.box.startPoint[0]) / input2.shape[2], + (prediction.box.endPoint[1] - prediction.box.startPoint[1]) / input2.shape[1] + ] : []; + results.push({ + confidence: prediction.faceConfidence || prediction.boxConfidence || 0, + boxConfidence: prediction.boxConfidence, + faceConfidence: prediction.faceConfidence, + box: box3, + boxRaw, + mesh, + meshRaw, + annotations: annotations3, + image: prediction.image ? prediction.image.clone() : null + }); + if (prediction.coords) + prediction.coords.dispose(); + if (prediction.image) + prediction.image.dispose(); + } + return results; + } + }; + var faceModels = [null, null, null]; + async function load11(config3) { + faceModels = await Promise.all([ + !faceModels[0] && config3.face.enabled ? load6(config3) : null, + !faceModels[1] && config3.face.mesh.enabled ? loadGraphModel(config3.face.mesh.modelPath, {fromTFHub: config3.face.mesh.modelPath.includes("tfhub.dev")}) : null, + !faceModels[2] && config3.face.iris.enabled ? loadGraphModel(config3.face.iris.modelPath, {fromTFHub: config3.face.iris.modelPath.includes("tfhub.dev")}) : null + ]); + const faceMesh = new MediaPipeFaceMesh(faceModels[0], faceModels[1], faceModels[2], config3); + if (config3.face.mesh.enabled && config3.debug) + log(`load model: ${config3.face.mesh.modelPath.match(/\/(.*)\./)[1]}`); + if (config3.face.iris.enabled && config3.debug) + log(`load model: ${config3.face.iris.modelPath.match(/\/(.*)\./)[1]}`); + return faceMesh; + } + exports.triangulation = TRI468; + }); + + // src/posenet/keypoints.ts + var require_keypoints = __commonJS((exports) => { + __markAsModule(exports); + __export(exports, { + NUM_KEYPOINTS: () => NUM_KEYPOINTS3, + connectedPartIndices: () => connectedPartIndices, + partChannels: () => partChannels, + partIds: () => partIds2, + partNames: () => partNames2, + poseChain: () => poseChain2 + }); + var partNames2 = [ + "nose", + "leftEye", + "rightEye", + "leftEar", + "rightEar", + "leftShoulder", + "rightShoulder", + "leftElbow", + "rightElbow", + "leftWrist", + "rightWrist", + "leftHip", + "rightHip", + "leftKnee", + "rightKnee", + "leftAnkle", + "rightAnkle" + ]; + var NUM_KEYPOINTS3 = exports.partNames.length; + var partIds2 = exports.partNames.reduce((result, jointName, i) => { + result[jointName] = i; + return result; + }, {}); + var connectedPartNames = [ + ["leftHip", "leftShoulder"], + ["leftElbow", "leftShoulder"], + ["leftElbow", "leftWrist"], + ["leftHip", "leftKnee"], + ["leftKnee", "leftAnkle"], + ["rightHip", "rightShoulder"], + ["rightElbow", "rightShoulder"], + ["rightElbow", "rightWrist"], + ["rightHip", "rightKnee"], + ["rightKnee", "rightAnkle"], + ["leftShoulder", "rightShoulder"], + ["leftHip", "rightHip"] + ]; + var connectedPartIndices = connectedPartNames.map(([jointNameA, jointNameB]) => [partIds2[jointNameA], partIds2[jointNameB]]); + var poseChain2 = [ + ["nose", "leftEye"], + ["leftEye", "leftEar"], + ["nose", "rightEye"], + ["rightEye", "rightEar"], + ["nose", "leftShoulder"], + ["leftShoulder", "leftElbow"], + ["leftElbow", "leftWrist"], + ["leftShoulder", "leftHip"], + ["leftHip", "leftKnee"], + ["leftKnee", "leftAnkle"], + ["nose", "rightShoulder"], + ["rightShoulder", "rightElbow"], + ["rightElbow", "rightWrist"], + ["rightShoulder", "rightHip"], + ["rightHip", "rightKnee"], + ["rightKnee", "rightAnkle"] + ]; + var partChannels = [ + "left_face", + "right_face", + "right_upper_leg_front", + "right_lower_leg_back", + "right_upper_leg_back", + "left_lower_leg_front", + "left_upper_leg_front", + "left_upper_leg_back", + "left_lower_leg_back", + "right_feet", + "right_lower_leg_front", + "left_feet", + "torso_front", + "torso_back", + "right_upper_arm_front", + "right_upper_arm_back", + "right_lower_arm_back", + "left_lower_arm_front", + "left_upper_arm_front", + "left_upper_arm_back", + "left_lower_arm_back", + "right_hand", + "right_lower_arm_front", + "left_hand" + ]; + }); + + // src/human.ts + var human_exports = {}; + __export(human_exports, { + Human: () => Human, + default: () => Human + }); + + // src/helpers.ts + function log(...msg) { + const dt = new Date(); + const ts = `${dt.getHours().toString().padStart(2, "0")}:${dt.getMinutes().toString().padStart(2, "0")}:${dt.getSeconds().toString().padStart(2, "0")}.${dt.getMilliseconds().toString().padStart(3, "0")}`; + if (msg) + console.log(ts, "Human:", ...msg); + } + var now = () => { + if (typeof performance !== "undefined") + return performance.now(); + return parseInt((Number(process.hrtime.bigint()) / 1e3 / 1e3).toString()); + }; + function mergeDeep(...objects) { + const isObject = (obj) => obj && typeof obj === "object"; + return objects.reduce((prev, obj) => { + Object.keys(obj || {}).forEach((key) => { + const pVal = prev[key]; + const oVal = obj[key]; + if (Array.isArray(pVal) && Array.isArray(oVal)) + prev[key] = pVal.concat(...oVal); + else if (isObject(pVal) && isObject(oVal)) + prev[key] = mergeDeep(pVal, oVal); + else + prev[key] = oVal; + }); + return prev; + }, {}); + } + + // src/sysinfo.ts + function info() { + let platform; + let agent; + if (typeof navigator !== "undefined") { + const raw = navigator.userAgent.match(/\(([^()]+)\)/g); + if (raw && raw[0]) { + platform = raw[0].match(/\(([^()]+)\)/g)[0].replace(/\(|\)/g, ""); + agent = navigator.userAgent.replace(raw[0], ""); + if (platform[1]) + agent = agent.replace(raw[1], ""); + agent = agent.replace(/ /g, " "); + } + } else if (typeof process !== "undefined") { + platform = `${process.platform} ${process.arch}`; + agent = `NodeJS ${process.version}`; + } + return {platform, agent}; + } + + // dist/tfjs.esm.js + var tfjs_esm_exports = {}; + __export(tfjs_esm_exports, { + Abs: () => Abs, + Acos: () => Acos, + Acosh: () => Acosh, + AdadeltaOptimizer: () => AdadeltaOptimizer, + AdagradOptimizer: () => AdagradOptimizer, + AdamOptimizer: () => AdamOptimizer, + AdamaxOptimizer: () => AdamaxOptimizer, + Add: () => Add, + AddN: () => AddN, + All: () => All, + Any: () => Any, + ArgMax: () => ArgMax, + ArgMin: () => ArgMin, + Asin: () => Asin, + Asinh: () => Asinh, + Atan: () => Atan, + Atan2: () => Atan2, + Atanh: () => Atanh, + AvgPool: () => AvgPool, + AvgPool3D: () => AvgPool3D, + AvgPool3DGrad: () => AvgPool3DGrad, + AvgPoolGrad: () => AvgPoolGrad, + BackendWasm: () => BackendWasm, + BatchMatMul: () => BatchMatMul, + BatchToSpaceND: () => BatchToSpaceND, + Bincount: () => Bincount, + BroadcastTo: () => BroadcastTo, + Callback: () => Callback, + CallbackList: () => CallbackList, + Cast: () => Cast, + Ceil: () => Ceil, + ClipByValue: () => ClipByValue, + Complex: () => Complex, + ComplexAbs: () => ComplexAbs, + Concat: () => Concat, + Conv2D: () => Conv2D, + Conv2DBackpropFilter: () => Conv2DBackpropFilter, + Conv2DBackpropInput: () => Conv2DBackpropInput, + Conv3D: () => Conv3D, + Conv3DBackpropFilterV2: () => Conv3DBackpropFilterV2, + Conv3DBackpropInputV2: () => Conv3DBackpropInputV2, + Cos: () => Cos, + Cosh: () => Cosh, + CropAndResize: () => CropAndResize, + Cumsum: () => Cumsum, + CustomCallback: () => CustomCallback, + DataStorage: () => DataStorage, + DenseBincount: () => DenseBincount, + DepthToSpace: () => DepthToSpace, + DepthwiseConv2dNative: () => DepthwiseConv2dNative, + DepthwiseConv2dNativeBackpropFilter: () => DepthwiseConv2dNativeBackpropFilter, + DepthwiseConv2dNativeBackpropInput: () => DepthwiseConv2dNativeBackpropInput, + Diag: () => Diag, + Dilation2D: () => Dilation2D, + Dilation2DBackpropFilter: () => Dilation2DBackpropFilter, + Dilation2DBackpropInput: () => Dilation2DBackpropInput, + ENV: () => ENV, + EarlyStopping: () => EarlyStopping, + Elu: () => Elu, + EluGrad: () => EluGrad, + Environment: () => Environment, + Equal: () => Equal, + Erf: () => Erf, + Exp: () => Exp, + ExpandDims: () => ExpandDims, + Expm1: () => Expm1, + FFT: () => FFT, + Fill: () => Fill, + FlipLeftRight: () => FlipLeftRight, + Floor: () => Floor, + FloorDiv: () => FloorDiv, + FromPixels: () => FromPixels, + FusedBatchNorm: () => FusedBatchNorm, + FusedConv2D: () => FusedConv2D, + FusedDepthwiseConv2D: () => FusedDepthwiseConv2D, + GPGPUContext: () => GPGPUContext, + GatherNd: () => GatherNd, + GatherV2: () => GatherV2, + GraphModel: () => GraphModel, + Greater: () => Greater, + GreaterEqual: () => GreaterEqual, + History: () => History, + IFFT: () => IFFT, + Identity: () => Identity, + Imag: () => Imag, + InputSpec: () => InputSpec, + IsFinite: () => IsFinite, + IsInf: () => IsInf, + IsNan: () => IsNan, + KernelBackend: () => KernelBackend, + LRN: () => LRN, + LRNGrad: () => LRNGrad, + LayerVariable: () => LayerVariable, + LayersModel: () => LayersModel, + LeakyRelu: () => LeakyRelu, + Less: () => Less, + LessEqual: () => LessEqual, + LinSpace: () => LinSpace, + Log: () => Log, + Log1p: () => Log1p, + LogSoftmax: () => LogSoftmax, + LogicalAnd: () => LogicalAnd, + LogicalNot: () => LogicalNot, + LogicalOr: () => LogicalOr, + MathBackendCPU: () => MathBackendCPU, + MathBackendWebGL: () => MathBackendWebGL, + Max: () => Max, + MaxPool: () => MaxPool, + MaxPool3D: () => MaxPool3D, + MaxPool3DGrad: () => MaxPool3DGrad, + MaxPoolGrad: () => MaxPoolGrad, + MaxPoolWithArgmax: () => MaxPoolWithArgmax, + Maximum: () => Maximum, + Mean: () => Mean, + Min: () => Min, + Minimum: () => Minimum, + MirrorPad: () => MirrorPad, + Mod: () => Mod, + MomentumOptimizer: () => MomentumOptimizer, + Multinomial: () => Multinomial, + Multiply: () => Multiply, + Neg: () => Neg, + NonMaxSuppressionV3: () => NonMaxSuppressionV3, + NonMaxSuppressionV4: () => NonMaxSuppressionV4, + NonMaxSuppressionV5: () => NonMaxSuppressionV5, + NotEqual: () => NotEqual, + OP_SCOPE_SUFFIX: () => OP_SCOPE_SUFFIX, + OneHot: () => OneHot, + OnesLike: () => OnesLike, + Optimizer: () => Optimizer, + Pack: () => Pack, + PadV2: () => PadV2, + Pool: () => Pool, + Pow: () => Pow, + Prelu: () => Prelu, + Prod: () => Prod, + RMSPropOptimizer: () => RMSPropOptimizer, + RNN: () => RNN, + Range: () => Range, + Rank: () => Rank, + Real: () => Real, + RealDiv: () => RealDiv, + Reciprocal: () => Reciprocal, + Reduction: () => Reduction, + Relu: () => Relu, + Relu6: () => Relu6, + Reshape: () => Reshape, + ResizeBilinear: () => ResizeBilinear, + ResizeBilinearGrad: () => ResizeBilinearGrad, + ResizeNearestNeighbor: () => ResizeNearestNeighbor, + ResizeNearestNeighborGrad: () => ResizeNearestNeighborGrad, + Reverse: () => Reverse, + RotateWithOffset: () => RotateWithOffset, + Round: () => Round, + Rsqrt: () => Rsqrt, + SGDOptimizer: () => SGDOptimizer, + ScatterNd: () => ScatterNd, + Select: () => Select, + Selu: () => Selu, + Sequential: () => Sequential, + Sigmoid: () => Sigmoid, + Sign: () => Sign, + Sin: () => Sin, + Sinh: () => Sinh, + Slice: () => Slice, + Softmax: () => Softmax, + Softplus: () => Softplus, + SpaceToBatchND: () => SpaceToBatchND, + SparseToDense: () => SparseToDense, + SplitV: () => SplitV, + Sqrt: () => Sqrt, + Square: () => Square, + SquaredDifference: () => SquaredDifference, + Step: () => Step, + StridedSlice: () => StridedSlice, + Sub: () => Sub, + Sum: () => Sum, + SymbolicTensor: () => SymbolicTensor, + Tan: () => Tan, + Tanh: () => Tanh, + Tensor: () => Tensor, + TensorBuffer: () => TensorBuffer, + Tile: () => Tile, + TopK: () => TopK, + Transform: () => Transform, + Transpose: () => Transpose, + Unique: () => Unique, + Unpack: () => Unpack, + UnsortedSegmentSum: () => UnsortedSegmentSum, + Variable: () => Variable, + ZerosLike: () => ZerosLike, + _FusedMatMul: () => _FusedMatMul, + abs: () => abs, + acos: () => acos, + acosh: () => acosh, + add: () => add2, + addN: () => addN, + all: () => all, + any: () => any, + argMax: () => argMax, + argMin: () => argMin, + asin: () => asin, + asinh: () => asinh, + atan: () => atan, + atan2: () => atan2, + atanh: () => atanh, + avgPool: () => avgPool, + avgPool3d: () => avgPool3d, + backend: () => backend, + backend_util: () => backend_util_exports, + basicLSTMCell: () => basicLSTMCell, + batchNorm: () => batchNorm, + batchNorm2d: () => batchNorm2d, + batchNorm3d: () => batchNorm3d, + batchNorm4d: () => batchNorm4d, + batchToSpaceND: () => batchToSpaceND, + bincount: () => bincount, + booleanMaskAsync: () => booleanMaskAsync, + broadcastTo: () => broadcastTo, + browser: () => browser_exports, + buffer: () => buffer, + callbacks: () => callbacks, + cast: () => cast, + ceil: () => ceil, + clipByValue: () => clipByValue, + clone: () => clone, + complex: () => complex, + concat: () => concat, + concat1d: () => concat1d, + concat2d: () => concat2d, + concat3d: () => concat3d, + concat4d: () => concat4d, + constraints: () => exports_constraints_exports, + conv1d: () => conv1d, + conv2d: () => conv2d, + conv2dTranspose: () => conv2dTranspose, + conv3d: () => conv3d, + conv3dTranspose: () => conv3dTranspose, + copyRegisteredKernels: () => copyRegisteredKernels, + cos: () => cos, + cosh: () => cosh, + cosineWindow: () => cosineWindow, + cumsum: () => cumsum, + customGrad: () => customGrad, + data: () => dist_exports, + denseBincount: () => denseBincount, + deprecationWarn: () => deprecationWarn, + depthToSpace: () => depthToSpace, + depthwiseConv2d: () => depthwiseConv2d, + deregisterOp: () => deregisterOp, + device_util: () => device_util_exports, + diag: () => diag, + dilation2d: () => dilation2d, + disableDeprecationWarnings: () => disableDeprecationWarnings, + dispose: () => dispose, + disposeVariables: () => disposeVariables, + div: () => div, + divNoNan: () => divNoNan, + dot: () => dot, + dropout: () => dropout, + elu: () => elu, + enableDebugMode: () => enableDebugMode, + enableProdMode: () => enableProdMode, + enclosingPowerOfTwo: () => enclosingPowerOfTwo, + engine: () => engine, + env: () => env, + equal: () => equal, + erf: () => erf, + exp: () => exp, + expandDims: () => expandDims, + expm1: () => expm1, + eye: () => eye, + fft: () => fft, + fill: () => fill, + findBackend: () => findBackend, + findBackendFactory: () => findBackendFactory, + floor: () => floor, + floorDiv: () => floorDiv, + forceHalfFloat: () => forceHalfFloat, + fused: () => fused_ops_exports, + gather: () => gather, + gatherND: () => gatherND, + gather_util: () => gather_nd_util_exports, + getBackend: () => getBackend, + getGradient: () => getGradient, + getKernel: () => getKernel, + getKernelsForBackend: () => getKernelsForBackend, + gpgpu_util: () => gpgpu_util_exports, + grad: () => grad, + grads: () => grads, + greater: () => greater, + greaterEqual: () => greaterEqual, + ifft: () => ifft, + imag: () => imag, + image: () => image, + inTopKAsync: () => inTopKAsync, + initializers: () => exports_initializers_exports, + input: () => input, + io: () => io_exports, + irfft: () => irfft, + isFinite: () => isFinite2, + isInf: () => isInf, + isNaN: () => isNaN2, + keep: () => keep, + kernel_impls: () => kernel_impls_exports, + layers: () => exports_layers_exports, + leakyRelu: () => leakyRelu, + less: () => less, + lessEqual: () => lessEqual, + linalg: () => linalg, + linspace: () => linspace, + loadGraphModel: () => loadGraphModel, + loadLayersModel: () => loadLayersModel, + localResponseNormalization: () => localResponseNormalization, + log: () => log2, + log1p: () => log1p, + logSigmoid: () => logSigmoid, + logSoftmax: () => logSoftmax, + logSumExp: () => logSumExp, + logicalAnd: () => logicalAnd, + logicalNot: () => logicalNot, + logicalOr: () => logicalOr, + logicalXor: () => logicalXor, + losses: () => losses, + matMul: () => matMul, + math: () => math_exports, + max: () => max, + maxPool: () => maxPool, + maxPool3d: () => maxPool3d, + maxPoolWithArgmax: () => maxPoolWithArgmax, + maximum: () => maximum, + mean: () => mean, + memory: () => memory, + metrics: () => exports_metrics_exports, + min: () => min, + minimum: () => minimum, + mirrorPad: () => mirrorPad, + mod: () => mod, + model: () => model, + models: () => exports_models_exports, + moments: () => moments, + movingAverage: () => movingAverage, + mul: () => mul, + multiRNNCell: () => multiRNNCell, + multinomial: () => multinomial, + neg: () => neg, + nextFrame: () => nextFrame, + norm: () => norm, + notEqual: () => notEqual, + oneHot: () => oneHot, + ones: () => ones2, + onesLike: () => onesLike, + op: () => op, + outerProduct: () => outerProduct, + pad: () => pad, + pad1d: () => pad1d, + pad2d: () => pad2d, + pad3d: () => pad3d, + pad4d: () => pad4d, + pool: () => pool, + pow: () => pow, + prelu: () => prelu, + print: () => print2, + prod: () => prod, + profile: () => profile, + rand: () => rand, + randomGamma: () => randomGamma, + randomNormal: () => randomNormal, + randomUniform: () => randomUniform, + range: () => range, + ready: () => ready, + real: () => real, + reciprocal: () => reciprocal, + registerBackend: () => registerBackend, + registerCallbackConstructor: () => registerCallbackConstructor, + registerGradient: () => registerGradient, + registerKernel: () => registerKernel, + registerOp: () => registerOp, + regularizers: () => exports_regularizers_exports, + relu: () => relu, + relu6: () => relu6, + removeBackend: () => removeBackend, + reshape: () => reshape, + reverse: () => reverse, + reverse1d: () => reverse1d, + reverse2d: () => reverse2d, + reverse3d: () => reverse3d, + reverse4d: () => reverse4d, + rfft: () => rfft, + round: () => round2, + rsqrt: () => rsqrt, + scalar: () => scalar, + scatterND: () => scatterND, + scatter_util: () => scatter_nd_util_exports, + selu: () => selu, + separableConv2d: () => separableConv2d, + sequential: () => sequential, + serialization: () => serialization_exports, + setBackend: () => setBackend, + setPlatform: () => setPlatform, + setWasmPath: () => setWasmPath, + setWasmPaths: () => setWasmPaths, + setWebGLContext: () => setWebGLContext, + setdiff1dAsync: () => setdiff1dAsync, + shared: () => shared_exports, + sigmoid: () => sigmoid, + sign: () => sign, + signal: () => signal, + sin: () => sin, + sinh: () => sinh, + slice: () => slice, + slice1d: () => slice1d, + slice2d: () => slice2d, + slice3d: () => slice3d, + slice4d: () => slice4d, + slice_util: () => slice_util_exports, + softmax: () => softmax, + softplus: () => softplus, + spaceToBatchND: () => spaceToBatchND, + sparseToDense: () => sparseToDense, + spectral: () => spectral, + split: () => split, + sqrt: () => sqrt, + square: () => square, + squaredDifference: () => squaredDifference, + squeeze: () => squeeze, + stack: () => stack, + step: () => step, + stridedSlice: () => stridedSlice, + sub: () => sub, + sum: () => sum2, + sumOutType: () => sumOutType, + tan: () => tan, + tanh: () => tanh2, + tensor: () => tensor, + tensor1d: () => tensor1d, + tensor2d: () => tensor2d, + tensor3d: () => tensor3d, + tensor4d: () => tensor4d, + tensor5d: () => tensor5d, + tensor6d: () => tensor6d, + tensor_util: () => tensor_util_exports, + test_util: () => test_util_exports, + tidy: () => tidy, + tile: () => tile, + time: () => time, + topk: () => topk, + train: () => train, + transpose: () => transpose, + truncatedNormal: () => truncatedNormal, + unique: () => unique, + unregisterGradient: () => unregisterGradient, + unregisterKernel: () => unregisterKernel, + unsortedSegmentSum: () => unsortedSegmentSum, + unstack: () => unstack, + upcastType: () => upcastType, + util: () => util_exports, + valueAndGrad: () => valueAndGrad, + valueAndGrads: () => valueAndGrads, + variable: () => variable, + variableGrads: () => variableGrads, + version: () => version13, + version_converter: () => version11, + version_core: () => version6, + version_cpu: () => version7, + version_layers: () => version10, + version_wasm: () => version9, + version_webgl: () => version8, + webgl: () => webgl, + webgl_util: () => webgl_util_exports, + where: () => where, + whereAsync: () => whereAsync, + zeros: () => zeros, + zerosLike: () => zerosLike + }); + var __create2 = Object.create; + var __defProp2 = Object.defineProperty; + var __getProtoOf2 = Object.getPrototypeOf; + var __hasOwnProp2 = Object.prototype.hasOwnProperty; + var __getOwnPropNames2 = Object.getOwnPropertyNames; + var __getOwnPropDesc2 = Object.getOwnPropertyDescriptor; + var __markAsModule2 = (target) => __defProp2(target, "__esModule", {value: true}); + var __commonJS2 = (callback, module) => () => { + if (!module) { + module = {exports: {}}; + callback(module.exports, module); + } + return module.exports; + }; + var __export2 = (target, all42) => { + for (var name in all42) + __defProp2(target, name, {get: all42[name], enumerable: true}); + }; + var __exportStar2 = (target, module, desc) => { + if (module && typeof module === "object" || typeof module === "function") { + for (let key of __getOwnPropNames2(module)) + if (!__hasOwnProp2.call(target, key) && key !== "default") + __defProp2(target, key, {get: () => module[key], enumerable: !(desc = __getOwnPropDesc2(module, key)) || desc.enumerable}); + } + return target; + }; + var __toModule2 = (module) => { + return __exportStar2(__markAsModule2(__defProp2(module != null ? __create2(__getProtoOf2(module)) : {}, "default", module && module.__esModule && "default" in module ? {get: () => module.default, enumerable: true} : {value: module, enumerable: true})), module); + }; + var require_browser = __commonJS2(() => { + }); + var require_alea = __commonJS2((exports, module) => { + (function(global2, module2, define2) { + function Alea(seed) { + var me = this, mash = Mash(); + me.next = function() { + var t = 2091639 * me.s0 + me.c * 23283064365386963e-26; + me.s0 = me.s1; + me.s1 = me.s2; + return me.s2 = t - (me.c = t | 0); + }; + me.c = 1; + me.s0 = mash(" "); + me.s1 = mash(" "); + me.s2 = mash(" "); + me.s0 -= mash(seed); + if (me.s0 < 0) { + me.s0 += 1; + } + me.s1 -= mash(seed); + if (me.s1 < 0) { + me.s1 += 1; + } + me.s2 -= mash(seed); + if (me.s2 < 0) { + me.s2 += 1; + } + mash = null; + } + function copy(f, t) { + t.c = f.c; + t.s0 = f.s0; + t.s1 = f.s1; + t.s2 = f.s2; + return t; + } + function impl(seed, opts) { + var xg = new Alea(seed), state = opts && opts.state, prng = xg.next; + prng.int32 = function() { + return xg.next() * 4294967296 | 0; + }; + prng.double = function() { + return prng() + (prng() * 2097152 | 0) * 11102230246251565e-32; + }; + prng.quick = prng; + if (state) { + if (typeof state == "object") + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + function Mash() { + var n = 4022871197; + var mash = function(data2) { + data2 = data2.toString(); + for (var i = 0; i < data2.length; i++) { + n += data2.charCodeAt(i); + var h = 0.02519603282416938 * n; + n = h >>> 0; + h -= n; + h *= n; + n = h >>> 0; + h -= n; + n += h * 4294967296; + } + return (n >>> 0) * 23283064365386963e-26; + }; + return mash; + } + if (module2 && module2.exports) { + module2.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.alea = impl; + } + })(exports, typeof module == "object" && module, typeof define == "function" && define); + }); + var require_xor128 = __commonJS2((exports, module) => { + (function(global2, module2, define2) { + function XorGen(seed) { + var me = this, strseed = ""; + me.x = 0; + me.y = 0; + me.z = 0; + me.w = 0; + me.next = function() { + var t = me.x ^ me.x << 11; + me.x = me.y; + me.y = me.z; + me.z = me.w; + return me.w ^= me.w >>> 19 ^ t ^ t >>> 8; + }; + if (seed === (seed | 0)) { + me.x = seed; + } else { + strseed += seed; + } + for (var k = 0; k < strseed.length + 64; k++) { + me.x ^= strseed.charCodeAt(k) | 0; + me.next(); + } + } + function copy(f, t) { + t.x = f.x; + t.y = f.y; + t.z = f.z; + t.w = f.w; + return t; + } + function impl(seed, opts) { + var xg = new XorGen(seed), state = opts && opts.state, prng = function() { + return (xg.next() >>> 0) / 4294967296; + }; + prng.double = function() { + do { + var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); + } while (result === 0); + return result; + }; + prng.int32 = xg.next; + prng.quick = prng; + if (state) { + if (typeof state == "object") + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + if (module2 && module2.exports) { + module2.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.xor128 = impl; + } + })(exports, typeof module == "object" && module, typeof define == "function" && define); + }); + var require_xorwow = __commonJS2((exports, module) => { + (function(global2, module2, define2) { + function XorGen(seed) { + var me = this, strseed = ""; + me.next = function() { + var t = me.x ^ me.x >>> 2; + me.x = me.y; + me.y = me.z; + me.z = me.w; + me.w = me.v; + return (me.d = me.d + 362437 | 0) + (me.v = me.v ^ me.v << 4 ^ (t ^ t << 1)) | 0; + }; + me.x = 0; + me.y = 0; + me.z = 0; + me.w = 0; + me.v = 0; + if (seed === (seed | 0)) { + me.x = seed; + } else { + strseed += seed; + } + for (var k = 0; k < strseed.length + 64; k++) { + me.x ^= strseed.charCodeAt(k) | 0; + if (k == strseed.length) { + me.d = me.x << 10 ^ me.x >>> 4; + } + me.next(); + } + } + function copy(f, t) { + t.x = f.x; + t.y = f.y; + t.z = f.z; + t.w = f.w; + t.v = f.v; + t.d = f.d; + return t; + } + function impl(seed, opts) { + var xg = new XorGen(seed), state = opts && opts.state, prng = function() { + return (xg.next() >>> 0) / 4294967296; + }; + prng.double = function() { + do { + var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); + } while (result === 0); + return result; + }; + prng.int32 = xg.next; + prng.quick = prng; + if (state) { + if (typeof state == "object") + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + if (module2 && module2.exports) { + module2.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.xorwow = impl; + } + })(exports, typeof module == "object" && module, typeof define == "function" && define); + }); + var require_xorshift7 = __commonJS2((exports, module) => { + (function(global2, module2, define2) { + function XorGen(seed) { + var me = this; + me.next = function() { + var X = me.x, i = me.i, t, v, w; + t = X[i]; + t ^= t >>> 7; + v = t ^ t << 24; + t = X[i + 1 & 7]; + v ^= t ^ t >>> 10; + t = X[i + 3 & 7]; + v ^= t ^ t >>> 3; + t = X[i + 4 & 7]; + v ^= t ^ t << 7; + t = X[i + 7 & 7]; + t = t ^ t << 13; + v ^= t ^ t << 9; + X[i] = v; + me.i = i + 1 & 7; + return v; + }; + function init2(me2, seed2) { + var j, w, X = []; + if (seed2 === (seed2 | 0)) { + w = X[0] = seed2; + } else { + seed2 = "" + seed2; + for (j = 0; j < seed2.length; ++j) { + X[j & 7] = X[j & 7] << 15 ^ seed2.charCodeAt(j) + X[j + 1 & 7] << 13; + } + } + while (X.length < 8) + X.push(0); + for (j = 0; j < 8 && X[j] === 0; ++j) + ; + if (j == 8) + w = X[7] = -1; + else + w = X[j]; + me2.x = X; + me2.i = 0; + for (j = 256; j > 0; --j) { + me2.next(); + } + } + init2(me, seed); + } + function copy(f, t) { + t.x = f.x.slice(); + t.i = f.i; + return t; + } + function impl(seed, opts) { + if (seed == null) + seed = +new Date(); + var xg = new XorGen(seed), state = opts && opts.state, prng = function() { + return (xg.next() >>> 0) / 4294967296; + }; + prng.double = function() { + do { + var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); + } while (result === 0); + return result; + }; + prng.int32 = xg.next; + prng.quick = prng; + if (state) { + if (state.x) + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + if (module2 && module2.exports) { + module2.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.xorshift7 = impl; + } + })(exports, typeof module == "object" && module, typeof define == "function" && define); + }); + var require_xor4096 = __commonJS2((exports, module) => { + (function(global2, module2, define2) { + function XorGen(seed) { + var me = this; + me.next = function() { + var w = me.w, X = me.X, i = me.i, t, v; + me.w = w = w + 1640531527 | 0; + v = X[i + 34 & 127]; + t = X[i = i + 1 & 127]; + v ^= v << 13; + t ^= t << 17; + v ^= v >>> 15; + t ^= t >>> 12; + v = X[i] = v ^ t; + me.i = i; + return v + (w ^ w >>> 16) | 0; + }; + function init2(me2, seed2) { + var t, v, i, j, w, X = [], limit = 128; + if (seed2 === (seed2 | 0)) { + v = seed2; + seed2 = null; + } else { + seed2 = seed2 + "\0"; + v = 0; + limit = Math.max(limit, seed2.length); + } + for (i = 0, j = -32; j < limit; ++j) { + if (seed2) + v ^= seed2.charCodeAt((j + 32) % seed2.length); + if (j === 0) + w = v; + v ^= v << 10; + v ^= v >>> 15; + v ^= v << 4; + v ^= v >>> 13; + if (j >= 0) { + w = w + 1640531527 | 0; + t = X[j & 127] ^= v + w; + i = t == 0 ? i + 1 : 0; + } + } + if (i >= 128) { + X[(seed2 && seed2.length || 0) & 127] = -1; + } + i = 127; + for (j = 4 * 128; j > 0; --j) { + v = X[i + 34 & 127]; + t = X[i = i + 1 & 127]; + v ^= v << 13; + t ^= t << 17; + v ^= v >>> 15; + t ^= t >>> 12; + X[i] = v ^ t; + } + me2.w = w; + me2.X = X; + me2.i = i; + } + init2(me, seed); + } + function copy(f, t) { + t.i = f.i; + t.w = f.w; + t.X = f.X.slice(); + return t; + } + ; + function impl(seed, opts) { + if (seed == null) + seed = +new Date(); + var xg = new XorGen(seed), state = opts && opts.state, prng = function() { + return (xg.next() >>> 0) / 4294967296; + }; + prng.double = function() { + do { + var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); + } while (result === 0); + return result; + }; + prng.int32 = xg.next; + prng.quick = prng; + if (state) { + if (state.X) + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + if (module2 && module2.exports) { + module2.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.xor4096 = impl; + } + })(exports, typeof module == "object" && module, typeof define == "function" && define); + }); + var require_tychei = __commonJS2((exports, module) => { + (function(global2, module2, define2) { + function XorGen(seed) { + var me = this, strseed = ""; + me.next = function() { + var b = me.b, c = me.c, d = me.d, a = me.a; + b = b << 25 ^ b >>> 7 ^ c; + c = c - d | 0; + d = d << 24 ^ d >>> 8 ^ a; + a = a - b | 0; + me.b = b = b << 20 ^ b >>> 12 ^ c; + me.c = c = c - d | 0; + me.d = d << 16 ^ c >>> 16 ^ a; + return me.a = a - b | 0; + }; + me.a = 0; + me.b = 0; + me.c = 2654435769 | 0; + me.d = 1367130551; + if (seed === Math.floor(seed)) { + me.a = seed / 4294967296 | 0; + me.b = seed | 0; + } else { + strseed += seed; + } + for (var k = 0; k < strseed.length + 20; k++) { + me.b ^= strseed.charCodeAt(k) | 0; + me.next(); + } + } + function copy(f, t) { + t.a = f.a; + t.b = f.b; + t.c = f.c; + t.d = f.d; + return t; + } + ; + function impl(seed, opts) { + var xg = new XorGen(seed), state = opts && opts.state, prng = function() { + return (xg.next() >>> 0) / 4294967296; + }; + prng.double = function() { + do { + var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); + } while (result === 0); + return result; + }; + prng.int32 = xg.next; + prng.quick = prng; + if (state) { + if (typeof state == "object") + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + if (module2 && module2.exports) { + module2.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.tychei = impl; + } + })(exports, typeof module == "object" && module, typeof define == "function" && define); + }); + var require_crypto = __commonJS2(() => { + }); + var require_seedrandom = __commonJS2((exports, module) => { + (function(pool3, math) { + var global2 = this, width = 256, chunks = 6, digits = 52, rngname = "random", startdenom = math.pow(width, chunks), significance = math.pow(2, digits), overflow = significance * 2, mask = width - 1, nodecrypto; + function seedrandom5(seed, options, callback) { + var key = []; + options = options == true ? {entropy: true} : options || {}; + var shortseed = mixkey(flatten4(options.entropy ? [seed, tostring(pool3)] : seed == null ? autoseed() : seed, 3), key); + var arc4 = new ARC4(key); + var prng = function() { + var n = arc4.g(chunks), d = startdenom, x = 0; + while (n < significance) { + n = (n + x) * width; + d *= width; + x = arc4.g(1); + } + while (n >= overflow) { + n /= 2; + d /= 2; + x >>>= 1; + } + return (n + x) / d; + }; + prng.int32 = function() { + return arc4.g(4) | 0; + }; + prng.quick = function() { + return arc4.g(4) / 4294967296; + }; + prng.double = prng; + mixkey(tostring(arc4.S), pool3); + return (options.pass || callback || function(prng2, seed2, is_math_call, state) { + if (state) { + if (state.S) { + copy(state, arc4); + } + prng2.state = function() { + return copy(arc4, {}); + }; + } + if (is_math_call) { + math[rngname] = prng2; + return seed2; + } else + return prng2; + })(prng, shortseed, "global" in options ? options.global : this == math, options.state); + } + math["seed" + rngname] = seedrandom5; + function ARC4(key) { + var t, keylen = key.length, me = this, i = 0, j = me.i = me.j = 0, s = me.S = []; + if (!keylen) { + key = [keylen++]; + } + while (i < width) { + s[i] = i++; + } + for (i = 0; i < width; i++) { + s[i] = s[j = mask & j + key[i % keylen] + (t = s[i])]; + s[j] = t; + } + (me.g = function(count2) { + var t2, r = 0, i2 = me.i, j2 = me.j, s2 = me.S; + while (count2--) { + t2 = s2[i2 = mask & i2 + 1]; + r = r * width + s2[mask & (s2[i2] = s2[j2 = mask & j2 + t2]) + (s2[j2] = t2)]; + } + me.i = i2; + me.j = j2; + return r; + })(width); + } + function copy(f, t) { + t.i = f.i; + t.j = f.j; + t.S = f.S.slice(); + return t; + } + ; + function flatten4(obj, depth) { + var result = [], typ = typeof obj, prop; + if (depth && typ == "object") { + for (prop in obj) { + try { + result.push(flatten4(obj[prop], depth - 1)); + } catch (e) { + } + } + } + return result.length ? result : typ == "string" ? obj : obj + "\0"; + } + function mixkey(seed, key) { + var stringseed = seed + "", smear, j = 0; + while (j < stringseed.length) { + key[mask & j] = mask & (smear ^= key[mask & j] * 19) + stringseed.charCodeAt(j++); + } + return tostring(key); + } + function autoseed() { + try { + var out; + if (nodecrypto && (out = nodecrypto.randomBytes)) { + out = out(width); + } else { + out = new Uint8Array(width); + (global2.crypto || global2.msCrypto).getRandomValues(out); + } + return tostring(out); + } catch (e) { + var browser = global2.navigator, plugins = browser && browser.plugins; + return [+new Date(), global2, plugins, global2.screen, tostring(pool3)]; + } + } + function tostring(a) { + return String.fromCharCode.apply(0, a); + } + mixkey(math.random(), pool3); + if (typeof module == "object" && module.exports) { + module.exports = seedrandom5; + try { + nodecrypto = require_crypto(); + } catch (ex) { + } + } else if (typeof define == "function" && define.amd) { + define(function() { + return seedrandom5; + }); + } + })([], Math); + }); + var require_seedrandom2 = __commonJS2((exports, module) => { + var alea5 = require_alea(); + var xor128 = require_xor128(); + var xorwow = require_xorwow(); + var xorshift7 = require_xorshift7(); + var xor4096 = require_xor4096(); + var tychei = require_tychei(); + var sr = require_seedrandom(); + sr.alea = alea5; + sr.xor128 = xor128; + sr.xorwow = xorwow; + sr.xorshift7 = xorshift7; + sr.xor4096 = xor4096; + sr.tychei = tychei; + module.exports = sr; + }); + var require_path = __commonJS2(() => { + }); + var require_worker_threads = __commonJS2(() => { + }); + var require_perf_hooks = __commonJS2(() => { + }); + var require_tfjs_backend_wasm_threaded_simd = __commonJS2((exports, module) => { + var WasmBackendModuleThreadedSimd = function() { + var _scriptDir = typeof document !== "undefined" && document.currentScript ? document.currentScript.src : void 0; + if (typeof __filename !== "undefined") + _scriptDir = _scriptDir || __filename; + return function(WasmBackendModuleThreadedSimd2) { + WasmBackendModuleThreadedSimd2 = WasmBackendModuleThreadedSimd2 || {}; + function GROWABLE_HEAP_I8() { + if (wasmMemory.buffer != buffer2) { + updateGlobalBufferAndViews(wasmMemory.buffer); + } + return HEAP8; + } + function GROWABLE_HEAP_U8() { + if (wasmMemory.buffer != buffer2) { + updateGlobalBufferAndViews(wasmMemory.buffer); + } + return HEAPU8; + } + function GROWABLE_HEAP_I32() { + if (wasmMemory.buffer != buffer2) { + updateGlobalBufferAndViews(wasmMemory.buffer); + } + return HEAP32; + } + function GROWABLE_HEAP_U32() { + if (wasmMemory.buffer != buffer2) { + updateGlobalBufferAndViews(wasmMemory.buffer); + } + return HEAPU32; + } + function GROWABLE_HEAP_F64() { + if (wasmMemory.buffer != buffer2) { + updateGlobalBufferAndViews(wasmMemory.buffer); + } + return HEAPF64; + } + var Module = typeof WasmBackendModuleThreadedSimd2 !== "undefined" ? WasmBackendModuleThreadedSimd2 : {}; + var readyPromiseResolve, readyPromiseReject; + Module["ready"] = new Promise(function(resolve, reject) { + readyPromiseResolve = resolve; + readyPromiseReject = reject; + }); + var moduleOverrides = {}; + var key; + for (key in Module) { + if (Module.hasOwnProperty(key)) { + moduleOverrides[key] = Module[key]; + } + } + var arguments_ = []; + var thisProgram = "./this.program"; + var quit_ = function(status, toThrow) { + throw toThrow; + }; + var ENVIRONMENT_IS_WEB = false; + var ENVIRONMENT_IS_WORKER = false; + var ENVIRONMENT_IS_NODE = false; + var ENVIRONMENT_IS_SHELL = false; + ENVIRONMENT_IS_WEB = typeof window === "object"; + ENVIRONMENT_IS_WORKER = typeof importScripts === "function"; + ENVIRONMENT_IS_NODE = typeof process === "object" && typeof process.versions === "object" && typeof process.versions.node === "string"; + ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER; + var ENVIRONMENT_IS_PTHREAD = Module["ENVIRONMENT_IS_PTHREAD"] || false; + if (ENVIRONMENT_IS_PTHREAD) { + buffer2 = Module["buffer"]; + } + var scriptDirectory = ""; + function locateFile(path) { + if (Module["locateFile"]) { + return Module["locateFile"](path, scriptDirectory); + } + return scriptDirectory + path; + } + var read_, readAsync, readBinary, setWindowTitle; + var nodeFS; + var nodePath; + if (ENVIRONMENT_IS_NODE) { + if (ENVIRONMENT_IS_WORKER) { + scriptDirectory = require_path().dirname(scriptDirectory) + "/"; + } else { + scriptDirectory = __dirname + "/"; + } + read_ = function shell_read(filename, binary) { + if (!nodeFS) + nodeFS = require("fs"); + if (!nodePath) + nodePath = require_path(); + filename = nodePath["normalize"](filename); + return nodeFS["readFileSync"](filename, binary ? null : "utf8"); + }; + readBinary = function readBinary2(filename) { + var ret = read_(filename, true); + if (!ret.buffer) { + ret = new Uint8Array(ret); + } + assert3(ret.buffer); + return ret; + }; + if (process["argv"].length > 1) { + thisProgram = process["argv"][1].replace(/\\/g, "/"); + } + arguments_ = process["argv"].slice(2); + process["on"]("uncaughtException", function(ex) { + if (!(ex instanceof ExitStatus)) { + throw ex; + } + }); + process["on"]("unhandledRejection", abort); + quit_ = function(status) { + process["exit"](status); + }; + Module["inspect"] = function() { + return "[Emscripten Module object]"; + }; + var nodeWorkerThreads; + try { + nodeWorkerThreads = require_worker_threads(); + } catch (e) { + console.error('The "worker_threads" module is not supported in this node.js build - perhaps a newer version is needed?'); + throw e; + } + global.Worker = nodeWorkerThreads.Worker; + } else if (ENVIRONMENT_IS_SHELL) { + if (typeof read != "undefined") { + read_ = function shell_read(f) { + return read(f); + }; + } + readBinary = function readBinary2(f) { + var data2; + if (typeof readbuffer === "function") { + return new Uint8Array(readbuffer(f)); + } + data2 = read(f, "binary"); + assert3(typeof data2 === "object"); + return data2; + }; + if (typeof scriptArgs != "undefined") { + arguments_ = scriptArgs; + } else if (typeof arguments != "undefined") { + arguments_ = arguments; + } + if (typeof quit === "function") { + quit_ = function(status) { + quit(status); + }; + } + if (typeof print !== "undefined") { + if (typeof console === "undefined") + console = {}; + console.log = print; + console.warn = console.error = typeof printErr !== "undefined" ? printErr : print; + } + } else if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) { + if (ENVIRONMENT_IS_WORKER) { + scriptDirectory = self.location.href; + } else if (typeof document !== "undefined" && document.currentScript) { + scriptDirectory = document.currentScript.src; + } + if (typeof _scriptDir !== "undefined" && _scriptDir) { + scriptDirectory = _scriptDir; + } + if (scriptDirectory.indexOf("blob:") !== 0) { + scriptDirectory = scriptDirectory.substr(0, scriptDirectory.lastIndexOf("/") + 1); + } else { + scriptDirectory = ""; + } + if (ENVIRONMENT_IS_NODE) { + read_ = function shell_read(filename, binary) { + if (!nodeFS) + nodeFS = require("fs"); + if (!nodePath) + nodePath = require_path(); + filename = nodePath["normalize"](filename); + return nodeFS["readFileSync"](filename, binary ? null : "utf8"); + }; + readBinary = function readBinary2(filename) { + var ret = read_(filename, true); + if (!ret.buffer) { + ret = new Uint8Array(ret); + } + assert3(ret.buffer); + return ret; + }; + } else { + read_ = function(url) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", url, false); + xhr.send(null); + return xhr.responseText; + }; + if (ENVIRONMENT_IS_WORKER) { + readBinary = function(url) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", url, false); + xhr.responseType = "arraybuffer"; + xhr.send(null); + return new Uint8Array(xhr.response); + }; + } + readAsync = function(url, onload, onerror) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", url, true); + xhr.responseType = "arraybuffer"; + xhr.onload = function() { + if (xhr.status == 200 || xhr.status == 0 && xhr.response) { + onload(xhr.response); + return; + } + onerror(); + }; + xhr.onerror = onerror; + xhr.send(null); + }; + } + setWindowTitle = function(title) { + document.title = title; + }; + } else { + } + if (ENVIRONMENT_IS_NODE) { + if (typeof performance === "undefined") { + global.performance = require_perf_hooks().performance; + } + } + var out = Module["print"] || console.log.bind(console); + var err = Module["printErr"] || console.warn.bind(console); + for (key in moduleOverrides) { + if (moduleOverrides.hasOwnProperty(key)) { + Module[key] = moduleOverrides[key]; + } + } + moduleOverrides = null; + if (Module["arguments"]) + arguments_ = Module["arguments"]; + if (Module["thisProgram"]) + thisProgram = Module["thisProgram"]; + if (Module["quit"]) + quit_ = Module["quit"]; + var Atomics_load = Atomics.load; + var Atomics_store = Atomics.store; + var Atomics_compareExchange = Atomics.compareExchange; + var wasmBinary; + if (Module["wasmBinary"]) + wasmBinary = Module["wasmBinary"]; + var noExitRuntime = Module["noExitRuntime"] || true; + if (typeof WebAssembly !== "object") { + abort("no native wasm support detected"); + } + var wasmMemory; + var wasmModule; + var ABORT = false; + var EXITSTATUS; + function assert3(condition, text) { + if (!condition) { + abort("Assertion failed: " + text); + } + } + function getCFunc(ident) { + var func2 = Module["_" + ident]; + assert3(func2, "Cannot call unknown function " + ident + ", make sure it is exported"); + return func2; + } + function ccall(ident, returnType, argTypes, args, opts) { + var toC = {string: function(str) { + var ret2 = 0; + if (str !== null && str !== void 0 && str !== 0) { + var len = (str.length << 2) + 1; + ret2 = stackAlloc(len); + stringToUTF8(str, ret2, len); + } + return ret2; + }, array: function(arr) { + var ret2 = stackAlloc(arr.length); + writeArrayToMemory(arr, ret2); + return ret2; + }}; + function convertReturnValue(ret2) { + if (returnType === "string") + return UTF8ToString(ret2); + if (returnType === "boolean") + return Boolean(ret2); + return ret2; + } + var func2 = getCFunc(ident); + var cArgs = []; + var stack2 = 0; + if (args) { + for (var i = 0; i < args.length; i++) { + var converter = toC[argTypes[i]]; + if (converter) { + if (stack2 === 0) + stack2 = stackSave(); + cArgs[i] = converter(args[i]); + } else { + cArgs[i] = args[i]; + } + } + } + var ret = func2.apply(null, cArgs); + ret = convertReturnValue(ret); + if (stack2 !== 0) + stackRestore(stack2); + return ret; + } + function cwrap(ident, returnType, argTypes, opts) { + argTypes = argTypes || []; + var numericArgs = argTypes.every(function(type) { + return type === "number"; + }); + var numericRet = returnType !== "string"; + if (numericRet && numericArgs && !opts) { + return getCFunc(ident); + } + return function() { + return ccall(ident, returnType, argTypes, arguments, opts); + }; + } + function UTF8ArrayToString(heap, idx, maxBytesToRead) { + var endIdx = idx + maxBytesToRead; + var str = ""; + while (!(idx >= endIdx)) { + var u0 = heap[idx++]; + if (!u0) + return str; + if (!(u0 & 128)) { + str += String.fromCharCode(u0); + continue; + } + var u1 = heap[idx++] & 63; + if ((u0 & 224) == 192) { + str += String.fromCharCode((u0 & 31) << 6 | u1); + continue; + } + var u2 = heap[idx++] & 63; + if ((u0 & 240) == 224) { + u0 = (u0 & 15) << 12 | u1 << 6 | u2; + } else { + u0 = (u0 & 7) << 18 | u1 << 12 | u2 << 6 | heap[idx++] & 63; + } + if (u0 < 65536) { + str += String.fromCharCode(u0); + } else { + var ch = u0 - 65536; + str += String.fromCharCode(55296 | ch >> 10, 56320 | ch & 1023); + } + } + return str; + } + function UTF8ToString(ptr, maxBytesToRead) { + return ptr ? UTF8ArrayToString(GROWABLE_HEAP_U8(), ptr, maxBytesToRead) : ""; + } + function stringToUTF8Array(str, heap, outIdx, maxBytesToWrite) { + if (!(maxBytesToWrite > 0)) + return 0; + var startIdx = outIdx; + var endIdx = outIdx + maxBytesToWrite - 1; + for (var i = 0; i < str.length; ++i) { + var u = str.charCodeAt(i); + if (u >= 55296 && u <= 57343) { + var u1 = str.charCodeAt(++i); + u = 65536 + ((u & 1023) << 10) | u1 & 1023; + } + if (u <= 127) { + if (outIdx >= endIdx) + break; + heap[outIdx++] = u; + } else if (u <= 2047) { + if (outIdx + 1 >= endIdx) + break; + heap[outIdx++] = 192 | u >> 6; + heap[outIdx++] = 128 | u & 63; + } else if (u <= 65535) { + if (outIdx + 2 >= endIdx) + break; + heap[outIdx++] = 224 | u >> 12; + heap[outIdx++] = 128 | u >> 6 & 63; + heap[outIdx++] = 128 | u & 63; + } else { + if (outIdx + 3 >= endIdx) + break; + heap[outIdx++] = 240 | u >> 18; + heap[outIdx++] = 128 | u >> 12 & 63; + heap[outIdx++] = 128 | u >> 6 & 63; + heap[outIdx++] = 128 | u & 63; + } + } + heap[outIdx] = 0; + return outIdx - startIdx; + } + function stringToUTF8(str, outPtr, maxBytesToWrite) { + return stringToUTF8Array(str, GROWABLE_HEAP_U8(), outPtr, maxBytesToWrite); + } + function lengthBytesUTF8(str) { + var len = 0; + for (var i = 0; i < str.length; ++i) { + var u = str.charCodeAt(i); + if (u >= 55296 && u <= 57343) + u = 65536 + ((u & 1023) << 10) | str.charCodeAt(++i) & 1023; + if (u <= 127) + ++len; + else if (u <= 2047) + len += 2; + else if (u <= 65535) + len += 3; + else + len += 4; + } + return len; + } + function writeArrayToMemory(array2, buffer3) { + GROWABLE_HEAP_I8().set(array2, buffer3); + } + function alignUp(x, multiple) { + if (x % multiple > 0) { + x += multiple - x % multiple; + } + return x; + } + var buffer2, HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64; + function updateGlobalBufferAndViews(buf) { + buffer2 = buf; + Module["HEAP8"] = HEAP8 = new Int8Array(buf); + Module["HEAP16"] = HEAP16 = new Int16Array(buf); + Module["HEAP32"] = HEAP32 = new Int32Array(buf); + Module["HEAPU8"] = HEAPU8 = new Uint8Array(buf); + Module["HEAPU16"] = HEAPU16 = new Uint16Array(buf); + Module["HEAPU32"] = HEAPU32 = new Uint32Array(buf); + Module["HEAPF32"] = HEAPF32 = new Float32Array(buf); + Module["HEAPF64"] = HEAPF64 = new Float64Array(buf); + } + var INITIAL_MEMORY = Module["INITIAL_MEMORY"] || 16777216; + if (ENVIRONMENT_IS_PTHREAD) { + wasmMemory = Module["wasmMemory"]; + buffer2 = Module["buffer"]; + } else { + if (Module["wasmMemory"]) { + wasmMemory = Module["wasmMemory"]; + } else { + wasmMemory = new WebAssembly.Memory({initial: INITIAL_MEMORY / 65536, maximum: 2147483648 / 65536, shared: true}); + if (!(wasmMemory.buffer instanceof SharedArrayBuffer)) { + err("requested a shared WebAssembly.Memory but the returned buffer is not a SharedArrayBuffer, indicating that while the browser has SharedArrayBuffer it does not have WebAssembly threads support - you may need to set a flag"); + if (ENVIRONMENT_IS_NODE) { + console.log("(on node you may need: --experimental-wasm-threads --experimental-wasm-bulk-memory and also use a recent version)"); + } + throw Error("bad memory"); + } + } + } + if (wasmMemory) { + buffer2 = wasmMemory.buffer; + } + INITIAL_MEMORY = buffer2.byteLength; + updateGlobalBufferAndViews(buffer2); + var wasmTable; + var __ATPRERUN__ = []; + var __ATINIT__ = []; + var __ATMAIN__ = []; + var __ATEXIT__ = []; + var __ATPOSTRUN__ = []; + var runtimeInitialized = false; + var runtimeExited = false; + if (!ENVIRONMENT_IS_PTHREAD) + __ATINIT__.push({func: function() { + ___wasm_call_ctors(); + }}); + if (ENVIRONMENT_IS_PTHREAD) + runtimeInitialized = true; + function preRun() { + if (ENVIRONMENT_IS_PTHREAD) + return; + if (Module["preRun"]) { + if (typeof Module["preRun"] == "function") + Module["preRun"] = [Module["preRun"]]; + while (Module["preRun"].length) { + addOnPreRun(Module["preRun"].shift()); + } + } + callRuntimeCallbacks(__ATPRERUN__); + } + function initRuntime() { + runtimeInitialized = true; + callRuntimeCallbacks(__ATINIT__); + } + function preMain() { + if (ENVIRONMENT_IS_PTHREAD) + return; + callRuntimeCallbacks(__ATMAIN__); + } + function exitRuntime() { + if (ENVIRONMENT_IS_PTHREAD) + return; + runtimeExited = true; + } + function postRun() { + if (ENVIRONMENT_IS_PTHREAD) + return; + if (Module["postRun"]) { + if (typeof Module["postRun"] == "function") + Module["postRun"] = [Module["postRun"]]; + while (Module["postRun"].length) { + addOnPostRun(Module["postRun"].shift()); + } + } + callRuntimeCallbacks(__ATPOSTRUN__); + } + function addOnPreRun(cb) { + __ATPRERUN__.unshift(cb); + } + function addOnPostRun(cb) { + __ATPOSTRUN__.unshift(cb); + } + var runDependencies = 0; + var runDependencyWatcher = null; + var dependenciesFulfilled = null; + function addRunDependency(id) { + assert3(!ENVIRONMENT_IS_PTHREAD, "addRunDependency cannot be used in a pthread worker"); + runDependencies++; + if (Module["monitorRunDependencies"]) { + Module["monitorRunDependencies"](runDependencies); + } + } + function removeRunDependency(id) { + runDependencies--; + if (Module["monitorRunDependencies"]) { + Module["monitorRunDependencies"](runDependencies); + } + if (runDependencies == 0) { + if (runDependencyWatcher !== null) { + clearInterval(runDependencyWatcher); + runDependencyWatcher = null; + } + if (dependenciesFulfilled) { + var callback = dependenciesFulfilled; + dependenciesFulfilled = null; + callback(); + } + } + } + Module["preloadedImages"] = {}; + Module["preloadedAudios"] = {}; + function abort(what) { + if (Module["onAbort"]) { + Module["onAbort"](what); + } + if (ENVIRONMENT_IS_PTHREAD) + console.error("Pthread aborting at " + new Error().stack); + what += ""; + err(what); + ABORT = true; + EXITSTATUS = 1; + what = "abort(" + what + "). Build with -s ASSERTIONS=1 for more info."; + var e = new WebAssembly.RuntimeError(what); + readyPromiseReject(e); + throw e; + } + function hasPrefix(str, prefix) { + return String.prototype.startsWith ? str.startsWith(prefix) : str.indexOf(prefix) === 0; + } + var dataURIPrefix = "data:application/octet-stream;base64,"; + function isDataURI(filename) { + return hasPrefix(filename, dataURIPrefix); + } + var fileURIPrefix = "file://"; + function isFileURI(filename) { + return hasPrefix(filename, fileURIPrefix); + } + var wasmBinaryFile = "tfjs-backend-wasm-threaded-simd.wasm"; + if (!isDataURI(wasmBinaryFile)) { + wasmBinaryFile = locateFile(wasmBinaryFile); + } + function getBinary(file) { + try { + if (file == wasmBinaryFile && wasmBinary) { + return new Uint8Array(wasmBinary); + } + if (readBinary) { + return readBinary(file); + } else { + throw "both async and sync fetching of the wasm failed"; + } + } catch (err2) { + abort(err2); + } + } + function getBinaryPromise() { + if (!wasmBinary && (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER)) { + if (typeof fetch === "function" && !isFileURI(wasmBinaryFile)) { + return fetch(wasmBinaryFile, {credentials: "same-origin"}).then(function(response) { + if (!response["ok"]) { + throw "failed to load wasm binary file at '" + wasmBinaryFile + "'"; + } + return response["arrayBuffer"](); + }).catch(function() { + return getBinary(wasmBinaryFile); + }); + } else { + if (readAsync) { + return new Promise(function(resolve, reject) { + readAsync(wasmBinaryFile, function(response) { + resolve(new Uint8Array(response)); + }, reject); + }); + } + } + } + return Promise.resolve().then(function() { + return getBinary(wasmBinaryFile); + }); + } + function createWasm() { + var info2 = {a: asmLibraryArg}; + function receiveInstance(instance, module2) { + var exports3 = instance.exports; + Module["asm"] = exports3; + wasmTable = Module["asm"]["F"]; + wasmModule = module2; + if (!ENVIRONMENT_IS_PTHREAD) { + var numWorkersToLoad = PThread.unusedWorkers.length; + PThread.unusedWorkers.forEach(function(w) { + PThread.loadWasmModuleToWorker(w, function() { + if (!--numWorkersToLoad) + removeRunDependency("wasm-instantiate"); + }); + }); + } + } + if (!ENVIRONMENT_IS_PTHREAD) { + addRunDependency("wasm-instantiate"); + } + function receiveInstantiatedSource(output) { + receiveInstance(output["instance"], output["module"]); + } + function instantiateArrayBuffer(receiver) { + return getBinaryPromise().then(function(binary) { + return WebAssembly.instantiate(binary, info2); + }).then(receiver, function(reason) { + err("failed to asynchronously prepare wasm: " + reason); + abort(reason); + }); + } + function instantiateAsync() { + if (!wasmBinary && typeof WebAssembly.instantiateStreaming === "function" && !isDataURI(wasmBinaryFile) && !isFileURI(wasmBinaryFile) && typeof fetch === "function") { + return fetch(wasmBinaryFile, {credentials: "same-origin"}).then(function(response) { + var result = WebAssembly.instantiateStreaming(response, info2); + return result.then(receiveInstantiatedSource, function(reason) { + err("wasm streaming compile failed: " + reason); + err("falling back to ArrayBuffer instantiation"); + return instantiateArrayBuffer(receiveInstantiatedSource); + }); + }); + } else { + return instantiateArrayBuffer(receiveInstantiatedSource); + } + } + if (Module["instantiateWasm"]) { + try { + var exports2 = Module["instantiateWasm"](info2, receiveInstance); + return exports2; + } catch (e) { + err("Module.instantiateWasm callback failed with error: " + e); + return false; + } + } + instantiateAsync().catch(readyPromiseReject); + return {}; + } + var ASM_CONSTS = {8991: function($0, $1) { + setTimeout(function() { + __emscripten_do_dispatch_to_thread($0, $1); + }, 0); + }}; + function initPthreadsJS() { + PThread.initRuntime(); + } + function callRuntimeCallbacks(callbacks2) { + while (callbacks2.length > 0) { + var callback = callbacks2.shift(); + if (typeof callback == "function") { + callback(Module); + continue; + } + var func2 = callback.func; + if (typeof func2 === "number") { + if (callback.arg === void 0) { + wasmTable.get(func2)(); + } else { + wasmTable.get(func2)(callback.arg); + } + } else { + func2(callback.arg === void 0 ? null : callback.arg); + } + } + } + function _emscripten_futex_wake(addr, count2) { + if (addr <= 0 || addr > GROWABLE_HEAP_I8().length || addr & true || count2 < 0) + return -28; + if (count2 == 0) + return 0; + if (count2 >= 2147483647) + count2 = Infinity; + var mainThreadWaitAddress = Atomics.load(GROWABLE_HEAP_I32(), __emscripten_main_thread_futex >> 2); + var mainThreadWoken = 0; + if (mainThreadWaitAddress == addr) { + var loadedAddr = Atomics.compareExchange(GROWABLE_HEAP_I32(), __emscripten_main_thread_futex >> 2, mainThreadWaitAddress, 0); + if (loadedAddr == mainThreadWaitAddress) { + --count2; + mainThreadWoken = 1; + if (count2 <= 0) + return 1; + } + } + var ret = Atomics.notify(GROWABLE_HEAP_I32(), addr >> 2, count2); + if (ret >= 0) + return ret + mainThreadWoken; + throw "Atomics.notify returned an unexpected value " + ret; + } + Module["_emscripten_futex_wake"] = _emscripten_futex_wake; + function killThread(pthread_ptr) { + if (ENVIRONMENT_IS_PTHREAD) + throw "Internal Error! killThread() can only ever be called from main application thread!"; + if (!pthread_ptr) + throw "Internal Error! Null pthread_ptr in killThread!"; + GROWABLE_HEAP_I32()[pthread_ptr + 12 >> 2] = 0; + var pthread = PThread.pthreads[pthread_ptr]; + pthread.worker.terminate(); + PThread.freeThreadData(pthread); + PThread.runningWorkers.splice(PThread.runningWorkers.indexOf(pthread.worker), 1); + pthread.worker.pthread = void 0; + } + function cancelThread(pthread_ptr) { + if (ENVIRONMENT_IS_PTHREAD) + throw "Internal Error! cancelThread() can only ever be called from main application thread!"; + if (!pthread_ptr) + throw "Internal Error! Null pthread_ptr in cancelThread!"; + var pthread = PThread.pthreads[pthread_ptr]; + pthread.worker.postMessage({cmd: "cancel"}); + } + function cleanupThread(pthread_ptr) { + if (ENVIRONMENT_IS_PTHREAD) + throw "Internal Error! cleanupThread() can only ever be called from main application thread!"; + if (!pthread_ptr) + throw "Internal Error! Null pthread_ptr in cleanupThread!"; + GROWABLE_HEAP_I32()[pthread_ptr + 12 >> 2] = 0; + var pthread = PThread.pthreads[pthread_ptr]; + if (pthread) { + var worker = pthread.worker; + PThread.returnWorkerToPool(worker); + } + } + var PThread = {unusedWorkers: [], runningWorkers: [], initMainThreadBlock: function() { + var pthreadPoolSize = 8; + for (var i = 0; i < pthreadPoolSize; ++i) { + PThread.allocateUnusedWorker(); + } + }, initRuntime: function() { + var tb = _malloc(228); + for (var i = 0; i < 228 / 4; ++i) + GROWABLE_HEAP_U32()[tb / 4 + i] = 0; + GROWABLE_HEAP_I32()[tb + 12 >> 2] = tb; + var headPtr = tb + 152; + GROWABLE_HEAP_I32()[headPtr >> 2] = headPtr; + var tlsMemory = _malloc(512); + for (var i = 0; i < 128; ++i) + GROWABLE_HEAP_U32()[tlsMemory / 4 + i] = 0; + Atomics.store(GROWABLE_HEAP_U32(), tb + 100 >> 2, tlsMemory); + Atomics.store(GROWABLE_HEAP_U32(), tb + 40 >> 2, tb); + __emscripten_thread_init(tb, !ENVIRONMENT_IS_WORKER, 1); + _emscripten_register_main_browser_thread_id(tb); + }, initWorker: function() { + }, pthreads: {}, threadExitHandlers: [], setThreadStatus: function() { + }, runExitHandlers: function() { + while (PThread.threadExitHandlers.length > 0) { + PThread.threadExitHandlers.pop()(); + } + if (ENVIRONMENT_IS_PTHREAD && _pthread_self()) + ___pthread_tsd_run_dtors(); + }, threadExit: function(exitCode) { + var tb = _pthread_self(); + if (tb) { + Atomics.store(GROWABLE_HEAP_U32(), tb + 4 >> 2, exitCode); + Atomics.store(GROWABLE_HEAP_U32(), tb + 0 >> 2, 1); + Atomics.store(GROWABLE_HEAP_U32(), tb + 56 >> 2, 1); + Atomics.store(GROWABLE_HEAP_U32(), tb + 60 >> 2, 0); + PThread.runExitHandlers(); + _emscripten_futex_wake(tb + 0, 2147483647); + __emscripten_thread_init(0, 0, 0); + if (ENVIRONMENT_IS_PTHREAD) { + postMessage({cmd: "exit"}); + } + } + }, threadCancel: function() { + PThread.runExitHandlers(); + var tb = _pthread_self(); + Atomics.store(GROWABLE_HEAP_U32(), tb + 4 >> 2, -1); + Atomics.store(GROWABLE_HEAP_U32(), tb + 0 >> 2, 1); + _emscripten_futex_wake(tb + 0, 2147483647); + __emscripten_thread_init(0, 0, 0); + postMessage({cmd: "cancelDone"}); + }, terminateAllThreads: function() { + for (var t in PThread.pthreads) { + var pthread = PThread.pthreads[t]; + if (pthread && pthread.worker) { + PThread.returnWorkerToPool(pthread.worker); + } + } + PThread.pthreads = {}; + for (var i = 0; i < PThread.unusedWorkers.length; ++i) { + var worker = PThread.unusedWorkers[i]; + worker.terminate(); + } + PThread.unusedWorkers = []; + for (var i = 0; i < PThread.runningWorkers.length; ++i) { + var worker = PThread.runningWorkers[i]; + var pthread = worker.pthread; + PThread.freeThreadData(pthread); + worker.terminate(); + } + PThread.runningWorkers = []; + }, freeThreadData: function(pthread) { + if (!pthread) + return; + if (pthread.threadInfoStruct) { + var tlsMemory = GROWABLE_HEAP_I32()[pthread.threadInfoStruct + 100 >> 2]; + GROWABLE_HEAP_I32()[pthread.threadInfoStruct + 100 >> 2] = 0; + _free(tlsMemory); + _free(pthread.threadInfoStruct); + } + pthread.threadInfoStruct = 0; + if (pthread.allocatedOwnStack && pthread.stackBase) + _free(pthread.stackBase); + pthread.stackBase = 0; + if (pthread.worker) + pthread.worker.pthread = null; + }, returnWorkerToPool: function(worker) { + PThread.runWithoutMainThreadQueuedCalls(function() { + delete PThread.pthreads[worker.pthread.threadInfoStruct]; + PThread.unusedWorkers.push(worker); + PThread.runningWorkers.splice(PThread.runningWorkers.indexOf(worker), 1); + PThread.freeThreadData(worker.pthread); + worker.pthread = void 0; + }); + }, runWithoutMainThreadQueuedCalls: function(func2) { + GROWABLE_HEAP_I32()[__emscripten_allow_main_runtime_queued_calls >> 2] = 0; + try { + func2(); + } finally { + GROWABLE_HEAP_I32()[__emscripten_allow_main_runtime_queued_calls >> 2] = 1; + } + }, receiveObjectTransfer: function(data2) { + }, loadWasmModuleToWorker: function(worker, onFinishedLoading) { + worker.onmessage = function(e) { + var d = e["data"]; + var cmd = d["cmd"]; + if (worker.pthread) + PThread.currentProxiedOperationCallerThread = worker.pthread.threadInfoStruct; + if (d["targetThread"] && d["targetThread"] != _pthread_self()) { + var thread = PThread.pthreads[d.targetThread]; + if (thread) { + thread.worker.postMessage(e.data, d["transferList"]); + } else { + console.error('Internal error! Worker sent a message "' + cmd + '" to target pthread ' + d["targetThread"] + ", but that thread no longer exists!"); + } + PThread.currentProxiedOperationCallerThread = void 0; + return; + } + if (cmd === "processQueuedMainThreadWork") { + _emscripten_main_thread_process_queued_calls(); + } else if (cmd === "spawnThread") { + spawnThread(e.data); + } else if (cmd === "cleanupThread") { + cleanupThread(d["thread"]); + } else if (cmd === "killThread") { + killThread(d["thread"]); + } else if (cmd === "cancelThread") { + cancelThread(d["thread"]); + } else if (cmd === "loaded") { + worker.loaded = true; + if (onFinishedLoading) + onFinishedLoading(worker); + if (worker.runPthread) { + worker.runPthread(); + delete worker.runPthread; + } + } else if (cmd === "print") { + out("Thread " + d["threadId"] + ": " + d["text"]); + } else if (cmd === "printErr") { + err("Thread " + d["threadId"] + ": " + d["text"]); + } else if (cmd === "alert") { + alert("Thread " + d["threadId"] + ": " + d["text"]); + } else if (cmd === "exit") { + var detached = worker.pthread && Atomics.load(GROWABLE_HEAP_U32(), worker.pthread.threadInfoStruct + 64 >> 2); + if (detached) { + PThread.returnWorkerToPool(worker); + } + } else if (cmd === "exitProcess") { + try { + exit(d["returnCode"]); + } catch (e2) { + if (e2 instanceof ExitStatus) + return; + throw e2; + } + } else if (cmd === "cancelDone") { + PThread.returnWorkerToPool(worker); + } else if (cmd === "objectTransfer") { + PThread.receiveObjectTransfer(e.data); + } else if (e.data.target === "setimmediate") { + worker.postMessage(e.data); + } else { + err("worker sent an unknown command " + cmd); + } + PThread.currentProxiedOperationCallerThread = void 0; + }; + worker.onerror = function(e) { + err("pthread sent an error! " + e.filename + ":" + e.lineno + ": " + e.message); + }; + if (ENVIRONMENT_IS_NODE) { + worker.on("message", function(data2) { + worker.onmessage({data: data2}); + }); + worker.on("error", function(data2) { + worker.onerror(data2); + }); + worker.on("exit", function(data2) { + }); + } + worker.postMessage({cmd: "load", urlOrBlob: Module["mainScriptUrlOrBlob"] || _scriptDir, wasmMemory, wasmModule}); + }, allocateUnusedWorker: function() { + var pthreadMainJs = locateFile("tfjs-backend-wasm-threaded-simd.worker.js"); + PThread.unusedWorkers.push(new Worker(pthreadMainJs)); + }, getNewWorker: function() { + if (PThread.unusedWorkers.length == 0) { + PThread.allocateUnusedWorker(); + PThread.loadWasmModuleToWorker(PThread.unusedWorkers[0]); + } + if (PThread.unusedWorkers.length > 0) + return PThread.unusedWorkers.pop(); + else + return null; + }, busySpinWait: function(msecs) { + var t = performance.now() + msecs; + while (performance.now() < t) { + } + }}; + function establishStackSpace(stackTop, stackMax) { + _emscripten_stack_set_limits(stackTop, stackMax); + stackRestore(stackTop); + } + Module["establishStackSpace"] = establishStackSpace; + function getNoExitRuntime() { + return noExitRuntime; + } + Module["getNoExitRuntime"] = getNoExitRuntime; + function invokeEntryPoint(ptr, arg) { + return wasmTable.get(ptr)(arg); + } + Module["invokeEntryPoint"] = invokeEntryPoint; + function ___assert_fail(condition, filename, line, func2) { + abort("Assertion failed: " + UTF8ToString(condition) + ", at: " + [filename ? UTF8ToString(filename) : "unknown filename", line, func2 ? UTF8ToString(func2) : "unknown function"]); + } + function ___call_main(argc, argv) { + var returnCode = _main(argc, argv); + } + var _emscripten_get_now; + if (ENVIRONMENT_IS_NODE) { + _emscripten_get_now = function() { + var t = process["hrtime"](); + return t[0] * 1e3 + t[1] / 1e6; + }; + } else if (ENVIRONMENT_IS_PTHREAD) { + _emscripten_get_now = function() { + return performance.now() - Module["__performance_now_clock_drift"]; + }; + } else if (typeof dateNow !== "undefined") { + _emscripten_get_now = dateNow; + } else + _emscripten_get_now = function() { + return performance.now(); + }; + function setErrNo(value) { + GROWABLE_HEAP_I32()[___errno_location() >> 2] = value; + return value; + } + function _atexit(func2, arg) { + if (ENVIRONMENT_IS_PTHREAD) + return _emscripten_proxy_to_main_thread_js(1, 1, func2, arg); + } + function __emscripten_notify_thread_queue(targetThreadId, mainThreadId) { + if (targetThreadId == mainThreadId) { + postMessage({cmd: "processQueuedMainThreadWork"}); + } else if (ENVIRONMENT_IS_PTHREAD) { + postMessage({targetThread: targetThreadId, cmd: "processThreadQueue"}); + } else { + var pthread = PThread.pthreads[targetThreadId]; + var worker = pthread && pthread.worker; + if (!worker) { + return; + } + worker.postMessage({cmd: "processThreadQueue"}); + } + return 1; + } + function _abort() { + abort(); + } + function _emscripten_asm_const_int(code, sigPtr, argbuf) { + var args = readAsmConstArgs(sigPtr, argbuf); + return ASM_CONSTS[code].apply(null, args); + } + function _emscripten_conditional_set_current_thread_status(expectedStatus, newStatus) { + } + function _emscripten_futex_wait(addr, val, timeout) { + if (addr <= 0 || addr > GROWABLE_HEAP_I8().length || addr & true) + return -28; + if (!ENVIRONMENT_IS_WEB) { + var ret = Atomics.wait(GROWABLE_HEAP_I32(), addr >> 2, val, timeout); + if (ret === "timed-out") + return -73; + if (ret === "not-equal") + return -6; + if (ret === "ok") + return 0; + throw "Atomics.wait returned an unexpected value " + ret; + } else { + if (Atomics.load(GROWABLE_HEAP_I32(), addr >> 2) != val) { + return -6; + } + var tNow = performance.now(); + var tEnd = tNow + timeout; + var lastAddr = Atomics.exchange(GROWABLE_HEAP_I32(), __emscripten_main_thread_futex >> 2, addr); + while (1) { + tNow = performance.now(); + if (tNow > tEnd) { + lastAddr = Atomics.exchange(GROWABLE_HEAP_I32(), __emscripten_main_thread_futex >> 2, 0); + return -73; + } + lastAddr = Atomics.exchange(GROWABLE_HEAP_I32(), __emscripten_main_thread_futex >> 2, 0); + if (lastAddr == 0) { + break; + } + _emscripten_main_thread_process_queued_calls(); + if (Atomics.load(GROWABLE_HEAP_I32(), addr >> 2) != val) { + return -6; + } + lastAddr = Atomics.exchange(GROWABLE_HEAP_I32(), __emscripten_main_thread_futex >> 2, addr); + } + return 0; + } + } + function _emscripten_memcpy_big(dest, src, num) { + GROWABLE_HEAP_U8().copyWithin(dest, src, src + num); + } + function _emscripten_num_logical_cores() { + if (ENVIRONMENT_IS_NODE) + return require("os").cpus().length; + return navigator["hardwareConcurrency"]; + } + function _emscripten_proxy_to_main_thread_js(index, sync) { + var numCallArgs = arguments.length - 2; + var stack2 = stackSave(); + var serializedNumCallArgs = numCallArgs; + var args = stackAlloc(serializedNumCallArgs * 8); + var b = args >> 3; + for (var i = 0; i < numCallArgs; i++) { + var arg = arguments[2 + i]; + GROWABLE_HEAP_F64()[b + i] = arg; + } + var ret = _emscripten_run_in_main_runtime_thread_js(index, serializedNumCallArgs, args, sync); + stackRestore(stack2); + return ret; + } + var _emscripten_receive_on_main_thread_js_callArgs = []; + var readAsmConstArgsArray = []; + function readAsmConstArgs(sigPtr, buf) { + readAsmConstArgsArray.length = 0; + var ch; + buf >>= 2; + while (ch = GROWABLE_HEAP_U8()[sigPtr++]) { + var double = ch < 105; + if (double && buf & 1) + buf++; + readAsmConstArgsArray.push(double ? GROWABLE_HEAP_F64()[buf++ >> 1] : GROWABLE_HEAP_I32()[buf]); + ++buf; + } + return readAsmConstArgsArray; + } + function _emscripten_receive_on_main_thread_js(index, numCallArgs, args) { + _emscripten_receive_on_main_thread_js_callArgs.length = numCallArgs; + var b = args >> 3; + for (var i = 0; i < numCallArgs; i++) { + _emscripten_receive_on_main_thread_js_callArgs[i] = GROWABLE_HEAP_F64()[b + i]; + } + var isEmAsmConst = index < 0; + var func2 = !isEmAsmConst ? proxiedFunctionTable[index] : ASM_CONSTS[-index - 1]; + return func2.apply(null, _emscripten_receive_on_main_thread_js_callArgs); + } + function _emscripten_get_heap_size() { + return GROWABLE_HEAP_U8().length; + } + function emscripten_realloc_buffer(size) { + try { + wasmMemory.grow(size - buffer2.byteLength + 65535 >>> 16); + updateGlobalBufferAndViews(wasmMemory.buffer); + return 1; + } catch (e) { + } + } + function _emscripten_resize_heap(requestedSize) { + var oldSize = _emscripten_get_heap_size(); + if (requestedSize <= oldSize) { + return false; + } + var maxHeapSize = 2147483648; + if (requestedSize > maxHeapSize) { + return false; + } + for (var cutDown = 1; cutDown <= 4; cutDown *= 2) { + var overGrownHeapSize = oldSize * (1 + 0.2 / cutDown); + overGrownHeapSize = Math.min(overGrownHeapSize, requestedSize + 100663296); + var newSize = Math.min(maxHeapSize, alignUp(Math.max(requestedSize, overGrownHeapSize), 65536)); + var replacement = emscripten_realloc_buffer(newSize); + if (replacement) { + return true; + } + } + return false; + } + var JSEvents = {inEventHandler: 0, removeAllEventListeners: function() { + for (var i = JSEvents.eventHandlers.length - 1; i >= 0; --i) { + JSEvents._removeHandler(i); + } + JSEvents.eventHandlers = []; + JSEvents.deferredCalls = []; + }, registerRemoveEventListeners: function() { + if (!JSEvents.removeEventListenersRegistered) { + __ATEXIT__.push(JSEvents.removeAllEventListeners); + JSEvents.removeEventListenersRegistered = true; + } + }, deferredCalls: [], deferCall: function(targetFunction, precedence, argsList) { + function arraysHaveEqualContent(arrA, arrB) { + if (arrA.length != arrB.length) + return false; + for (var i2 in arrA) { + if (arrA[i2] != arrB[i2]) + return false; + } + return true; + } + for (var i in JSEvents.deferredCalls) { + var call = JSEvents.deferredCalls[i]; + if (call.targetFunction == targetFunction && arraysHaveEqualContent(call.argsList, argsList)) { + return; + } + } + JSEvents.deferredCalls.push({targetFunction, precedence, argsList}); + JSEvents.deferredCalls.sort(function(x, y) { + return x.precedence < y.precedence; + }); + }, removeDeferredCalls: function(targetFunction) { + for (var i = 0; i < JSEvents.deferredCalls.length; ++i) { + if (JSEvents.deferredCalls[i].targetFunction == targetFunction) { + JSEvents.deferredCalls.splice(i, 1); + --i; + } + } + }, canPerformEventHandlerRequests: function() { + return JSEvents.inEventHandler && JSEvents.currentEventHandler.allowsDeferredCalls; + }, runDeferredCalls: function() { + if (!JSEvents.canPerformEventHandlerRequests()) { + return; + } + for (var i = 0; i < JSEvents.deferredCalls.length; ++i) { + var call = JSEvents.deferredCalls[i]; + JSEvents.deferredCalls.splice(i, 1); + --i; + call.targetFunction.apply(null, call.argsList); + } + }, eventHandlers: [], removeAllHandlersOnTarget: function(target, eventTypeString) { + for (var i = 0; i < JSEvents.eventHandlers.length; ++i) { + if (JSEvents.eventHandlers[i].target == target && (!eventTypeString || eventTypeString == JSEvents.eventHandlers[i].eventTypeString)) { + JSEvents._removeHandler(i--); + } + } + }, _removeHandler: function(i) { + var h = JSEvents.eventHandlers[i]; + h.target.removeEventListener(h.eventTypeString, h.eventListenerFunc, h.useCapture); + JSEvents.eventHandlers.splice(i, 1); + }, registerOrRemoveHandler: function(eventHandler) { + var jsEventHandler = function jsEventHandler2(event) { + ++JSEvents.inEventHandler; + JSEvents.currentEventHandler = eventHandler; + JSEvents.runDeferredCalls(); + eventHandler.handlerFunc(event); + JSEvents.runDeferredCalls(); + --JSEvents.inEventHandler; + }; + if (eventHandler.callbackfunc) { + eventHandler.eventListenerFunc = jsEventHandler; + eventHandler.target.addEventListener(eventHandler.eventTypeString, jsEventHandler, eventHandler.useCapture); + JSEvents.eventHandlers.push(eventHandler); + JSEvents.registerRemoveEventListeners(); + } else { + for (var i = 0; i < JSEvents.eventHandlers.length; ++i) { + if (JSEvents.eventHandlers[i].target == eventHandler.target && JSEvents.eventHandlers[i].eventTypeString == eventHandler.eventTypeString) { + JSEvents._removeHandler(i--); + } + } + } + }, queueEventHandlerOnThread_iiii: function(targetThread, eventHandlerFunc, eventTypeId, eventData, userData) { + var stackTop = stackSave(); + var varargs = stackAlloc(12); + GROWABLE_HEAP_I32()[varargs >> 2] = eventTypeId; + GROWABLE_HEAP_I32()[varargs + 4 >> 2] = eventData; + GROWABLE_HEAP_I32()[varargs + 8 >> 2] = userData; + __emscripten_call_on_thread(0, targetThread, 637534208, eventHandlerFunc, eventData, varargs); + stackRestore(stackTop); + }, getTargetThreadForEventCallback: function(targetThread) { + switch (targetThread) { + case 1: + return 0; + case 2: + return PThread.currentProxiedOperationCallerThread; + default: + return targetThread; + } + }, getNodeNameForTarget: function(target) { + if (!target) + return ""; + if (target == window) + return "#window"; + if (target == screen) + return "#screen"; + return target && target.nodeName ? target.nodeName : ""; + }, fullscreenEnabled: function() { + return document.fullscreenEnabled || document.webkitFullscreenEnabled; + }}; + function stringToNewUTF8(jsString) { + var length = lengthBytesUTF8(jsString) + 1; + var cString = _malloc(length); + stringToUTF8(jsString, cString, length); + return cString; + } + function _emscripten_set_offscreencanvas_size_on_target_thread_js(targetThread, targetCanvas, width, height) { + var stackTop = stackSave(); + var varargs = stackAlloc(12); + var targetCanvasPtr = 0; + if (targetCanvas) { + targetCanvasPtr = stringToNewUTF8(targetCanvas); + } + GROWABLE_HEAP_I32()[varargs >> 2] = targetCanvasPtr; + GROWABLE_HEAP_I32()[varargs + 4 >> 2] = width; + GROWABLE_HEAP_I32()[varargs + 8 >> 2] = height; + __emscripten_call_on_thread(0, targetThread, 657457152, 0, targetCanvasPtr, varargs); + stackRestore(stackTop); + } + function _emscripten_set_offscreencanvas_size_on_target_thread(targetThread, targetCanvas, width, height) { + targetCanvas = targetCanvas ? UTF8ToString(targetCanvas) : ""; + _emscripten_set_offscreencanvas_size_on_target_thread_js(targetThread, targetCanvas, width, height); + } + function maybeCStringToJsString(cString) { + return cString > 2 ? UTF8ToString(cString) : cString; + } + var specialHTMLTargets = [0, typeof document !== "undefined" ? document : 0, typeof window !== "undefined" ? window : 0]; + function findEventTarget(target) { + target = maybeCStringToJsString(target); + var domElement = specialHTMLTargets[target] || (typeof document !== "undefined" ? document.querySelector(target) : void 0); + return domElement; + } + function findCanvasEventTarget(target) { + return findEventTarget(target); + } + function _emscripten_set_canvas_element_size_calling_thread(target, width, height) { + var canvas2 = findCanvasEventTarget(target); + if (!canvas2) + return -4; + if (canvas2.canvasSharedPtr) { + GROWABLE_HEAP_I32()[canvas2.canvasSharedPtr >> 2] = width; + GROWABLE_HEAP_I32()[canvas2.canvasSharedPtr + 4 >> 2] = height; + } + if (canvas2.offscreenCanvas || !canvas2.controlTransferredOffscreen) { + if (canvas2.offscreenCanvas) + canvas2 = canvas2.offscreenCanvas; + var autoResizeViewport = false; + if (canvas2.GLctxObject && canvas2.GLctxObject.GLctx) { + var prevViewport = canvas2.GLctxObject.GLctx.getParameter(2978); + autoResizeViewport = prevViewport[0] === 0 && prevViewport[1] === 0 && prevViewport[2] === canvas2.width && prevViewport[3] === canvas2.height; + } + canvas2.width = width; + canvas2.height = height; + if (autoResizeViewport) { + canvas2.GLctxObject.GLctx.viewport(0, 0, width, height); + } + } else if (canvas2.canvasSharedPtr) { + var targetThread = GROWABLE_HEAP_I32()[canvas2.canvasSharedPtr + 8 >> 2]; + _emscripten_set_offscreencanvas_size_on_target_thread(targetThread, target, width, height); + return 1; + } else { + return -4; + } + return 0; + } + function _emscripten_set_canvas_element_size_main_thread(target, width, height) { + if (ENVIRONMENT_IS_PTHREAD) + return _emscripten_proxy_to_main_thread_js(2, 1, target, width, height); + return _emscripten_set_canvas_element_size_calling_thread(target, width, height); + } + function _emscripten_set_canvas_element_size(target, width, height) { + var canvas2 = findCanvasEventTarget(target); + if (canvas2) { + return _emscripten_set_canvas_element_size_calling_thread(target, width, height); + } else { + return _emscripten_set_canvas_element_size_main_thread(target, width, height); + } + } + function _emscripten_set_current_thread_status(newStatus) { + } + function _emscripten_set_thread_name(threadId, name) { + } + function __webgl_enable_ANGLE_instanced_arrays(ctx) { + var ext = ctx.getExtension("ANGLE_instanced_arrays"); + if (ext) { + ctx["vertexAttribDivisor"] = function(index, divisor) { + ext["vertexAttribDivisorANGLE"](index, divisor); + }; + ctx["drawArraysInstanced"] = function(mode, first, count2, primcount) { + ext["drawArraysInstancedANGLE"](mode, first, count2, primcount); + }; + ctx["drawElementsInstanced"] = function(mode, count2, type, indices, primcount) { + ext["drawElementsInstancedANGLE"](mode, count2, type, indices, primcount); + }; + return 1; + } + } + function __webgl_enable_OES_vertex_array_object(ctx) { + var ext = ctx.getExtension("OES_vertex_array_object"); + if (ext) { + ctx["createVertexArray"] = function() { + return ext["createVertexArrayOES"](); + }; + ctx["deleteVertexArray"] = function(vao) { + ext["deleteVertexArrayOES"](vao); + }; + ctx["bindVertexArray"] = function(vao) { + ext["bindVertexArrayOES"](vao); + }; + ctx["isVertexArray"] = function(vao) { + return ext["isVertexArrayOES"](vao); + }; + return 1; + } + } + function __webgl_enable_WEBGL_draw_buffers(ctx) { + var ext = ctx.getExtension("WEBGL_draw_buffers"); + if (ext) { + ctx["drawBuffers"] = function(n, bufs) { + ext["drawBuffersWEBGL"](n, bufs); + }; + return 1; + } + } + function __webgl_enable_WEBGL_multi_draw(ctx) { + return !!(ctx.multiDrawWebgl = ctx.getExtension("WEBGL_multi_draw")); + } + var GL = {counter: 1, buffers: [], programs: [], framebuffers: [], renderbuffers: [], textures: [], uniforms: [], shaders: [], vaos: [], contexts: {}, offscreenCanvases: {}, timerQueriesEXT: [], programInfos: {}, stringCache: {}, unpackAlignment: 4, recordError: function recordError(errorCode) { + if (!GL.lastError) { + GL.lastError = errorCode; + } + }, getNewId: function(table) { + var ret = GL.counter++; + for (var i = table.length; i < ret; i++) { + table[i] = null; + } + return ret; + }, getSource: function(shader, count2, string, length) { + var source = ""; + for (var i = 0; i < count2; ++i) { + var len = length ? GROWABLE_HEAP_I32()[length + i * 4 >> 2] : -1; + source += UTF8ToString(GROWABLE_HEAP_I32()[string + i * 4 >> 2], len < 0 ? void 0 : len); + } + return source; + }, createContext: function(canvas2, webGLContextAttributes) { + var ctx = canvas2.getContext("webgl", webGLContextAttributes); + if (!ctx) + return 0; + var handle = GL.registerContext(ctx, webGLContextAttributes); + return handle; + }, registerContext: function(ctx, webGLContextAttributes) { + var handle = _malloc(8); + GROWABLE_HEAP_I32()[handle + 4 >> 2] = _pthread_self(); + var context = {handle, attributes: webGLContextAttributes, version: webGLContextAttributes.majorVersion, GLctx: ctx}; + if (ctx.canvas) + ctx.canvas.GLctxObject = context; + GL.contexts[handle] = context; + if (typeof webGLContextAttributes.enableExtensionsByDefault === "undefined" || webGLContextAttributes.enableExtensionsByDefault) { + GL.initExtensions(context); + } + return handle; + }, makeContextCurrent: function(contextHandle) { + GL.currentContext = GL.contexts[contextHandle]; + Module.ctx = GLctx = GL.currentContext && GL.currentContext.GLctx; + return !(contextHandle && !GLctx); + }, getContext: function(contextHandle) { + return GL.contexts[contextHandle]; + }, deleteContext: function(contextHandle) { + if (GL.currentContext === GL.contexts[contextHandle]) + GL.currentContext = null; + if (typeof JSEvents === "object") + JSEvents.removeAllHandlersOnTarget(GL.contexts[contextHandle].GLctx.canvas); + if (GL.contexts[contextHandle] && GL.contexts[contextHandle].GLctx.canvas) + GL.contexts[contextHandle].GLctx.canvas.GLctxObject = void 0; + _free(GL.contexts[contextHandle].handle); + GL.contexts[contextHandle] = null; + }, initExtensions: function(context) { + if (!context) + context = GL.currentContext; + if (context.initExtensionsDone) + return; + context.initExtensionsDone = true; + var GLctx2 = context.GLctx; + __webgl_enable_ANGLE_instanced_arrays(GLctx2); + __webgl_enable_OES_vertex_array_object(GLctx2); + __webgl_enable_WEBGL_draw_buffers(GLctx2); + GLctx2.disjointTimerQueryExt = GLctx2.getExtension("EXT_disjoint_timer_query"); + __webgl_enable_WEBGL_multi_draw(GLctx2); + var exts = GLctx2.getSupportedExtensions() || []; + exts.forEach(function(ext) { + if (ext.indexOf("lose_context") < 0 && ext.indexOf("debug") < 0) { + GLctx2.getExtension(ext); + } + }); + }, populateUniformTable: function(program) { + var p2 = GL.programs[program]; + var ptable = GL.programInfos[program] = {uniforms: {}, maxUniformLength: 0, maxAttributeLength: -1, maxUniformBlockNameLength: -1}; + var utable = ptable.uniforms; + var numUniforms = GLctx.getProgramParameter(p2, 35718); + for (var i = 0; i < numUniforms; ++i) { + var u = GLctx.getActiveUniform(p2, i); + var name = u.name; + ptable.maxUniformLength = Math.max(ptable.maxUniformLength, name.length + 1); + if (name.slice(-1) == "]") { + name = name.slice(0, name.lastIndexOf("[")); + } + var loc = GLctx.getUniformLocation(p2, name); + if (loc) { + var id = GL.getNewId(GL.uniforms); + utable[name] = [u.size, id]; + GL.uniforms[id] = loc; + for (var j = 1; j < u.size; ++j) { + var n = name + "[" + j + "]"; + loc = GLctx.getUniformLocation(p2, n); + id = GL.getNewId(GL.uniforms); + GL.uniforms[id] = loc; + } + } + } + }}; + var __emscripten_webgl_power_preferences = ["default", "low-power", "high-performance"]; + function _emscripten_webgl_do_create_context(target, attributes) { + var a = attributes >> 2; + var powerPreference = GROWABLE_HEAP_I32()[a + (24 >> 2)]; + var contextAttributes = {alpha: !!GROWABLE_HEAP_I32()[a + (0 >> 2)], depth: !!GROWABLE_HEAP_I32()[a + (4 >> 2)], stencil: !!GROWABLE_HEAP_I32()[a + (8 >> 2)], antialias: !!GROWABLE_HEAP_I32()[a + (12 >> 2)], premultipliedAlpha: !!GROWABLE_HEAP_I32()[a + (16 >> 2)], preserveDrawingBuffer: !!GROWABLE_HEAP_I32()[a + (20 >> 2)], powerPreference: __emscripten_webgl_power_preferences[powerPreference], failIfMajorPerformanceCaveat: !!GROWABLE_HEAP_I32()[a + (28 >> 2)], majorVersion: GROWABLE_HEAP_I32()[a + (32 >> 2)], minorVersion: GROWABLE_HEAP_I32()[a + (36 >> 2)], enableExtensionsByDefault: GROWABLE_HEAP_I32()[a + (40 >> 2)], explicitSwapControl: GROWABLE_HEAP_I32()[a + (44 >> 2)], proxyContextToMainThread: GROWABLE_HEAP_I32()[a + (48 >> 2)], renderViaOffscreenBackBuffer: GROWABLE_HEAP_I32()[a + (52 >> 2)]}; + var canvas2 = findCanvasEventTarget(target); + if (!canvas2) { + return 0; + } + if (contextAttributes.explicitSwapControl) { + return 0; + } + var contextHandle = GL.createContext(canvas2, contextAttributes); + return contextHandle; + } + function _emscripten_webgl_create_context(a0, a12) { + return _emscripten_webgl_do_create_context(a0, a12); + } + var SYSCALLS = {mappings: {}, buffers: [null, [], []], printChar: function(stream, curr) { + var buffer3 = SYSCALLS.buffers[stream]; + if (curr === 0 || curr === 10) { + (stream === 1 ? out : err)(UTF8ArrayToString(buffer3, 0)); + buffer3.length = 0; + } else { + buffer3.push(curr); + } + }, varargs: void 0, get: function() { + SYSCALLS.varargs += 4; + var ret = GROWABLE_HEAP_I32()[SYSCALLS.varargs - 4 >> 2]; + return ret; + }, getStr: function(ptr) { + var ret = UTF8ToString(ptr); + return ret; + }, get64: function(low, high) { + return low; + }}; + function _fd_close(fd) { + if (ENVIRONMENT_IS_PTHREAD) + return _emscripten_proxy_to_main_thread_js(3, 1, fd); + return 0; + } + function _fd_seek(fd, offset_low, offset_high, whence, newOffset) { + if (ENVIRONMENT_IS_PTHREAD) + return _emscripten_proxy_to_main_thread_js(4, 1, fd, offset_low, offset_high, whence, newOffset); + } + function _fd_write(fd, iov, iovcnt, pnum) { + if (ENVIRONMENT_IS_PTHREAD) + return _emscripten_proxy_to_main_thread_js(5, 1, fd, iov, iovcnt, pnum); + var num = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = GROWABLE_HEAP_I32()[iov + i * 8 >> 2]; + var len = GROWABLE_HEAP_I32()[iov + (i * 8 + 4) >> 2]; + for (var j = 0; j < len; j++) { + SYSCALLS.printChar(fd, GROWABLE_HEAP_U8()[ptr + j]); + } + num += len; + } + GROWABLE_HEAP_I32()[pnum >> 2] = num; + return 0; + } + function _pthread_cleanup_pop(execute2) { + var routine = PThread.threadExitHandlers.pop(); + if (execute2) + routine(); + } + function _pthread_cleanup_push(routine, arg) { + PThread.threadExitHandlers.push(function() { + wasmTable.get(routine)(arg); + }); + } + function spawnThread(threadParams) { + if (ENVIRONMENT_IS_PTHREAD) + throw "Internal Error! spawnThread() can only ever be called from main application thread!"; + var worker = PThread.getNewWorker(); + if (worker.pthread !== void 0) + throw "Internal error!"; + if (!threadParams.pthread_ptr) + throw "Internal error, no pthread ptr!"; + PThread.runningWorkers.push(worker); + var tlsMemory = _malloc(128 * 4); + for (var i = 0; i < 128; ++i) { + GROWABLE_HEAP_I32()[tlsMemory + i * 4 >> 2] = 0; + } + var stackHigh = threadParams.stackBase + threadParams.stackSize; + var pthread = PThread.pthreads[threadParams.pthread_ptr] = {worker, stackBase: threadParams.stackBase, stackSize: threadParams.stackSize, allocatedOwnStack: threadParams.allocatedOwnStack, threadInfoStruct: threadParams.pthread_ptr}; + var tis = pthread.threadInfoStruct >> 2; + Atomics.store(GROWABLE_HEAP_U32(), tis + (64 >> 2), threadParams.detached); + Atomics.store(GROWABLE_HEAP_U32(), tis + (100 >> 2), tlsMemory); + Atomics.store(GROWABLE_HEAP_U32(), tis + (40 >> 2), pthread.threadInfoStruct); + Atomics.store(GROWABLE_HEAP_U32(), tis + (80 >> 2), threadParams.stackSize); + Atomics.store(GROWABLE_HEAP_U32(), tis + (76 >> 2), stackHigh); + Atomics.store(GROWABLE_HEAP_U32(), tis + (104 >> 2), threadParams.stackSize); + Atomics.store(GROWABLE_HEAP_U32(), tis + (104 + 8 >> 2), stackHigh); + Atomics.store(GROWABLE_HEAP_U32(), tis + (104 + 12 >> 2), threadParams.detached); + var global_libc = _emscripten_get_global_libc(); + var global_locale = global_libc + 40; + Atomics.store(GROWABLE_HEAP_U32(), tis + (172 >> 2), global_locale); + worker.pthread = pthread; + var msg = {cmd: "run", start_routine: threadParams.startRoutine, arg: threadParams.arg, threadInfoStruct: threadParams.pthread_ptr, stackBase: threadParams.stackBase, stackSize: threadParams.stackSize}; + worker.runPthread = function() { + msg.time = performance.now(); + worker.postMessage(msg, threadParams.transferList); + }; + if (worker.loaded) { + worker.runPthread(); + delete worker.runPthread; + } + } + function _pthread_create(pthread_ptr, attr, start_routine, arg) { + if (typeof SharedArrayBuffer === "undefined") { + err("Current environment does not support SharedArrayBuffer, pthreads are not available!"); + return 6; + } + if (!pthread_ptr) { + err("pthread_create called with a null thread pointer!"); + return 28; + } + var transferList = []; + var error = 0; + if (ENVIRONMENT_IS_PTHREAD && (transferList.length === 0 || error)) { + return _emscripten_sync_run_in_main_thread_4(687865856, pthread_ptr, attr, start_routine, arg); + } + if (error) + return error; + var stackSize = 0; + var stackBase = 0; + var detached = 0; + if (attr && attr != -1) { + stackSize = GROWABLE_HEAP_I32()[attr >> 2]; + stackSize += 81920; + stackBase = GROWABLE_HEAP_I32()[attr + 8 >> 2]; + detached = GROWABLE_HEAP_I32()[attr + 12 >> 2] !== 0; + } else { + stackSize = 2097152; + } + var allocatedOwnStack = stackBase == 0; + if (allocatedOwnStack) { + stackBase = _memalign(16, stackSize); + } else { + stackBase -= stackSize; + assert3(stackBase > 0); + } + var threadInfoStruct = _malloc(228); + for (var i = 0; i < 228 >> 2; ++i) + GROWABLE_HEAP_U32()[(threadInfoStruct >> 2) + i] = 0; + GROWABLE_HEAP_I32()[pthread_ptr >> 2] = threadInfoStruct; + GROWABLE_HEAP_I32()[threadInfoStruct + 12 >> 2] = threadInfoStruct; + var headPtr = threadInfoStruct + 152; + GROWABLE_HEAP_I32()[headPtr >> 2] = headPtr; + var threadParams = {stackBase, stackSize, allocatedOwnStack, detached, startRoutine: start_routine, pthread_ptr: threadInfoStruct, arg, transferList}; + if (ENVIRONMENT_IS_PTHREAD) { + threadParams.cmd = "spawnThread"; + postMessage(threadParams, transferList); + } else { + spawnThread(threadParams); + } + return 0; + } + function _sysconf(name) { + if (ENVIRONMENT_IS_PTHREAD) + return _emscripten_proxy_to_main_thread_js(6, 1, name); + switch (name) { + case 30: + return 16384; + case 85: + var maxHeapSize = 2147483648; + return maxHeapSize / 16384; + case 132: + case 133: + case 12: + case 137: + case 138: + case 15: + case 235: + case 16: + case 17: + case 18: + case 19: + case 20: + case 149: + case 13: + case 10: + case 236: + case 153: + case 9: + case 21: + case 22: + case 159: + case 154: + case 14: + case 77: + case 78: + case 139: + case 82: + case 68: + case 67: + case 164: + case 11: + case 29: + case 47: + case 48: + case 95: + case 52: + case 51: + case 46: + return 200809; + case 27: + case 246: + case 127: + case 128: + case 23: + case 24: + case 160: + case 161: + case 181: + case 182: + case 242: + case 183: + case 184: + case 243: + case 244: + case 245: + case 165: + case 178: + case 179: + case 49: + case 50: + case 168: + case 169: + case 175: + case 170: + case 171: + case 172: + case 97: + case 76: + case 32: + case 173: + case 35: + case 80: + case 81: + case 79: + return -1; + case 176: + case 177: + case 7: + case 155: + case 8: + case 157: + case 125: + case 126: + case 92: + case 93: + case 129: + case 130: + case 131: + case 94: + case 91: + return 1; + case 74: + case 60: + case 69: + case 70: + case 4: + return 1024; + case 31: + case 42: + case 72: + return 32; + case 87: + case 26: + case 33: + return 2147483647; + case 34: + case 1: + return 47839; + case 38: + case 36: + return 99; + case 43: + case 37: + return 2048; + case 0: + return 2097152; + case 3: + return 65536; + case 28: + return 32768; + case 44: + return 32767; + case 75: + return 16384; + case 39: + return 1e3; + case 89: + return 700; + case 71: + return 256; + case 40: + return 255; + case 2: + return 100; + case 180: + return 64; + case 25: + return 20; + case 5: + return 16; + case 6: + return 6; + case 73: + return 4; + case 84: { + if (typeof navigator === "object") + return navigator["hardwareConcurrency"] || 1; + return 1; + } + } + setErrNo(28); + return -1; + } + if (!ENVIRONMENT_IS_PTHREAD) + PThread.initMainThreadBlock(); + var GLctx; + var proxiedFunctionTable = [null, _atexit, _emscripten_set_canvas_element_size_main_thread, _fd_close, _fd_seek, _fd_write, _sysconf]; + var asmLibraryArg = {e: ___assert_fail, r: ___call_main, x: __emscripten_notify_thread_queue, b: _abort, y: _emscripten_asm_const_int, j: _emscripten_conditional_set_current_thread_status, c: _emscripten_futex_wait, d: _emscripten_futex_wake, f: _emscripten_get_now, p: _emscripten_memcpy_big, z: _emscripten_num_logical_cores, u: _emscripten_receive_on_main_thread_js, q: _emscripten_resize_heap, v: _emscripten_set_canvas_element_size, i: _emscripten_set_current_thread_status, t: _emscripten_set_thread_name, w: _emscripten_webgl_create_context, m: _fd_close, n: _fd_seek, g: _fd_write, o: initPthreadsJS, a: wasmMemory || Module["wasmMemory"], k: _pthread_cleanup_pop, l: _pthread_cleanup_push, h: _pthread_create, s: _sysconf}; + var asm = createWasm(); + var ___wasm_call_ctors = Module["___wasm_call_ctors"] = function() { + return (___wasm_call_ctors = Module["___wasm_call_ctors"] = Module["asm"]["A"]).apply(null, arguments); + }; + var _init = Module["_init"] = function() { + return (_init = Module["_init"] = Module["asm"]["B"]).apply(null, arguments); + }; + var _register_tensor = Module["_register_tensor"] = function() { + return (_register_tensor = Module["_register_tensor"] = Module["asm"]["C"]).apply(null, arguments); + }; + var _dispose_data = Module["_dispose_data"] = function() { + return (_dispose_data = Module["_dispose_data"] = Module["asm"]["D"]).apply(null, arguments); + }; + var _dispose = Module["_dispose"] = function() { + return (_dispose = Module["_dispose"] = Module["asm"]["E"]).apply(null, arguments); + }; + var _Abs = Module["_Abs"] = function() { + return (_Abs = Module["_Abs"] = Module["asm"]["G"]).apply(null, arguments); + }; + var _Add = Module["_Add"] = function() { + return (_Add = Module["_Add"] = Module["asm"]["H"]).apply(null, arguments); + }; + var _AddN = Module["_AddN"] = function() { + return (_AddN = Module["_AddN"] = Module["asm"]["I"]).apply(null, arguments); + }; + var _ArgMax = Module["_ArgMax"] = function() { + return (_ArgMax = Module["_ArgMax"] = Module["asm"]["J"]).apply(null, arguments); + }; + var _AvgPool = Module["_AvgPool"] = function() { + return (_AvgPool = Module["_AvgPool"] = Module["asm"]["K"]).apply(null, arguments); + }; + var _BatchMatMul = Module["_BatchMatMul"] = function() { + return (_BatchMatMul = Module["_BatchMatMul"] = Module["asm"]["L"]).apply(null, arguments); + }; + var _Ceil = Module["_Ceil"] = function() { + return (_Ceil = Module["_Ceil"] = Module["asm"]["M"]).apply(null, arguments); + }; + var _ClipByValue = Module["_ClipByValue"] = function() { + return (_ClipByValue = Module["_ClipByValue"] = Module["asm"]["N"]).apply(null, arguments); + }; + var _Conv2D = Module["_Conv2D"] = function() { + return (_Conv2D = Module["_Conv2D"] = Module["asm"]["O"]).apply(null, arguments); + }; + var _Conv2DBackpropInput = Module["_Conv2DBackpropInput"] = function() { + return (_Conv2DBackpropInput = Module["_Conv2DBackpropInput"] = Module["asm"]["P"]).apply(null, arguments); + }; + var _Cos = Module["_Cos"] = function() { + return (_Cos = Module["_Cos"] = Module["asm"]["Q"]).apply(null, arguments); + }; + var _CropAndResize = Module["_CropAndResize"] = function() { + return (_CropAndResize = Module["_CropAndResize"] = Module["asm"]["R"]).apply(null, arguments); + }; + var _Cumsum = Module["_Cumsum"] = function() { + return (_Cumsum = Module["_Cumsum"] = Module["asm"]["S"]).apply(null, arguments); + }; + var _DepthToSpace = Module["_DepthToSpace"] = function() { + return (_DepthToSpace = Module["_DepthToSpace"] = Module["asm"]["T"]).apply(null, arguments); + }; + var _DepthwiseConv2dNative = Module["_DepthwiseConv2dNative"] = function() { + return (_DepthwiseConv2dNative = Module["_DepthwiseConv2dNative"] = Module["asm"]["U"]).apply(null, arguments); + }; + var _Equal = Module["_Equal"] = function() { + return (_Equal = Module["_Equal"] = Module["asm"]["V"]).apply(null, arguments); + }; + var _Exp = Module["_Exp"] = function() { + return (_Exp = Module["_Exp"] = Module["asm"]["W"]).apply(null, arguments); + }; + var _FlipLeftRight = Module["_FlipLeftRight"] = function() { + return (_FlipLeftRight = Module["_FlipLeftRight"] = Module["asm"]["X"]).apply(null, arguments); + }; + var _Floor = Module["_Floor"] = function() { + return (_Floor = Module["_Floor"] = Module["asm"]["Y"]).apply(null, arguments); + }; + var _FloorDiv = Module["_FloorDiv"] = function() { + return (_FloorDiv = Module["_FloorDiv"] = Module["asm"]["Z"]).apply(null, arguments); + }; + var _FusedBatchNorm = Module["_FusedBatchNorm"] = function() { + return (_FusedBatchNorm = Module["_FusedBatchNorm"] = Module["asm"]["_"]).apply(null, arguments); + }; + var _FusedConv2D = Module["_FusedConv2D"] = function() { + return (_FusedConv2D = Module["_FusedConv2D"] = Module["asm"]["$"]).apply(null, arguments); + }; + var _FusedDepthwiseConv2D = Module["_FusedDepthwiseConv2D"] = function() { + return (_FusedDepthwiseConv2D = Module["_FusedDepthwiseConv2D"] = Module["asm"]["aa"]).apply(null, arguments); + }; + var _Gather = Module["_Gather"] = function() { + return (_Gather = Module["_Gather"] = Module["asm"]["ba"]).apply(null, arguments); + }; + var _GatherNd = Module["_GatherNd"] = function() { + return (_GatherNd = Module["_GatherNd"] = Module["asm"]["ca"]).apply(null, arguments); + }; + var _Greater = Module["_Greater"] = function() { + return (_Greater = Module["_Greater"] = Module["asm"]["da"]).apply(null, arguments); + }; + var _GreaterEqual = Module["_GreaterEqual"] = function() { + return (_GreaterEqual = Module["_GreaterEqual"] = Module["asm"]["ea"]).apply(null, arguments); + }; + var _LeakyRelu = Module["_LeakyRelu"] = function() { + return (_LeakyRelu = Module["_LeakyRelu"] = Module["asm"]["fa"]).apply(null, arguments); + }; + var _Less = Module["_Less"] = function() { + return (_Less = Module["_Less"] = Module["asm"]["ga"]).apply(null, arguments); + }; + var _LessEqual = Module["_LessEqual"] = function() { + return (_LessEqual = Module["_LessEqual"] = Module["asm"]["ha"]).apply(null, arguments); + }; + var _Log = Module["_Log"] = function() { + return (_Log = Module["_Log"] = Module["asm"]["ia"]).apply(null, arguments); + }; + var _LogicalAnd = Module["_LogicalAnd"] = function() { + return (_LogicalAnd = Module["_LogicalAnd"] = Module["asm"]["ja"]).apply(null, arguments); + }; + var _Max = Module["_Max"] = function() { + return (_Max = Module["_Max"] = Module["asm"]["ka"]).apply(null, arguments); + }; + var _MaxPool = Module["_MaxPool"] = function() { + return (_MaxPool = Module["_MaxPool"] = Module["asm"]["la"]).apply(null, arguments); + }; + var _Maximum = Module["_Maximum"] = function() { + return (_Maximum = Module["_Maximum"] = Module["asm"]["ma"]).apply(null, arguments); + }; + var _Mean = Module["_Mean"] = function() { + return (_Mean = Module["_Mean"] = Module["asm"]["na"]).apply(null, arguments); + }; + var _Min = Module["_Min"] = function() { + return (_Min = Module["_Min"] = Module["asm"]["oa"]).apply(null, arguments); + }; + var _Minimum = Module["_Minimum"] = function() { + return (_Minimum = Module["_Minimum"] = Module["asm"]["pa"]).apply(null, arguments); + }; + var _Multiply = Module["_Multiply"] = function() { + return (_Multiply = Module["_Multiply"] = Module["asm"]["qa"]).apply(null, arguments); + }; + var _Neg = Module["_Neg"] = function() { + return (_Neg = Module["_Neg"] = Module["asm"]["ra"]).apply(null, arguments); + }; + var _NonMaxSuppressionV3 = Module["_NonMaxSuppressionV3"] = function() { + return (_NonMaxSuppressionV3 = Module["_NonMaxSuppressionV3"] = Module["asm"]["sa"]).apply(null, arguments); + }; + var _NonMaxSuppressionV4 = Module["_NonMaxSuppressionV4"] = function() { + return (_NonMaxSuppressionV4 = Module["_NonMaxSuppressionV4"] = Module["asm"]["ta"]).apply(null, arguments); + }; + var _NonMaxSuppressionV5 = Module["_NonMaxSuppressionV5"] = function() { + return (_NonMaxSuppressionV5 = Module["_NonMaxSuppressionV5"] = Module["asm"]["ua"]).apply(null, arguments); + }; + var _NotEqual = Module["_NotEqual"] = function() { + return (_NotEqual = Module["_NotEqual"] = Module["asm"]["va"]).apply(null, arguments); + }; + var _OneHot = Module["_OneHot"] = function() { + return (_OneHot = Module["_OneHot"] = Module["asm"]["wa"]).apply(null, arguments); + }; + var _PadV2 = Module["_PadV2"] = function() { + return (_PadV2 = Module["_PadV2"] = Module["asm"]["xa"]).apply(null, arguments); + }; + var _Pow = Module["_Pow"] = function() { + return (_Pow = Module["_Pow"] = Module["asm"]["ya"]).apply(null, arguments); + }; + var _Prelu = Module["_Prelu"] = function() { + return (_Prelu = Module["_Prelu"] = Module["asm"]["za"]).apply(null, arguments); + }; + var _Prod = Module["_Prod"] = function() { + return (_Prod = Module["_Prod"] = Module["asm"]["Aa"]).apply(null, arguments); + }; + var _RealDiv = Module["_RealDiv"] = function() { + return (_RealDiv = Module["_RealDiv"] = Module["asm"]["Ba"]).apply(null, arguments); + }; + var _Relu = Module["_Relu"] = function() { + return (_Relu = Module["_Relu"] = Module["asm"]["Ca"]).apply(null, arguments); + }; + var _Relu6 = Module["_Relu6"] = function() { + return (_Relu6 = Module["_Relu6"] = Module["asm"]["Da"]).apply(null, arguments); + }; + var _ResizeBilinear = Module["_ResizeBilinear"] = function() { + return (_ResizeBilinear = Module["_ResizeBilinear"] = Module["asm"]["Ea"]).apply(null, arguments); + }; + var _Reverse = Module["_Reverse"] = function() { + return (_Reverse = Module["_Reverse"] = Module["asm"]["Fa"]).apply(null, arguments); + }; + var _RotateWithOffset = Module["_RotateWithOffset"] = function() { + return (_RotateWithOffset = Module["_RotateWithOffset"] = Module["asm"]["Ga"]).apply(null, arguments); + }; + var _Round = Module["_Round"] = function() { + return (_Round = Module["_Round"] = Module["asm"]["Ha"]).apply(null, arguments); + }; + var _Rsqrt = Module["_Rsqrt"] = function() { + return (_Rsqrt = Module["_Rsqrt"] = Module["asm"]["Ia"]).apply(null, arguments); + }; + var _ScatterNd = Module["_ScatterNd"] = function() { + return (_ScatterNd = Module["_ScatterNd"] = Module["asm"]["Ja"]).apply(null, arguments); + }; + var _SelectV2 = Module["_SelectV2"] = function() { + return (_SelectV2 = Module["_SelectV2"] = Module["asm"]["Ka"]).apply(null, arguments); + }; + var _Sigmoid = Module["_Sigmoid"] = function() { + return (_Sigmoid = Module["_Sigmoid"] = Module["asm"]["La"]).apply(null, arguments); + }; + var _Sin = Module["_Sin"] = function() { + return (_Sin = Module["_Sin"] = Module["asm"]["Ma"]).apply(null, arguments); + }; + var _Softmax = Module["_Softmax"] = function() { + return (_Softmax = Module["_Softmax"] = Module["asm"]["Na"]).apply(null, arguments); + }; + var _Sqrt = Module["_Sqrt"] = function() { + return (_Sqrt = Module["_Sqrt"] = Module["asm"]["Oa"]).apply(null, arguments); + }; + var _Square = Module["_Square"] = function() { + return (_Square = Module["_Square"] = Module["asm"]["Pa"]).apply(null, arguments); + }; + var _SquaredDifference = Module["_SquaredDifference"] = function() { + return (_SquaredDifference = Module["_SquaredDifference"] = Module["asm"]["Qa"]).apply(null, arguments); + }; + var _Step = Module["_Step"] = function() { + return (_Step = Module["_Step"] = Module["asm"]["Ra"]).apply(null, arguments); + }; + var _StridedSlice = Module["_StridedSlice"] = function() { + return (_StridedSlice = Module["_StridedSlice"] = Module["asm"]["Sa"]).apply(null, arguments); + }; + var _Sub = Module["_Sub"] = function() { + return (_Sub = Module["_Sub"] = Module["asm"]["Ta"]).apply(null, arguments); + }; + var _Sum = Module["_Sum"] = function() { + return (_Sum = Module["_Sum"] = Module["asm"]["Ua"]).apply(null, arguments); + }; + var _Tanh = Module["_Tanh"] = function() { + return (_Tanh = Module["_Tanh"] = Module["asm"]["Va"]).apply(null, arguments); + }; + var _Tile = Module["_Tile"] = function() { + return (_Tile = Module["_Tile"] = Module["asm"]["Wa"]).apply(null, arguments); + }; + var _TopK = Module["_TopK"] = function() { + return (_TopK = Module["_TopK"] = Module["asm"]["Xa"]).apply(null, arguments); + }; + var _Transpose = Module["_Transpose"] = function() { + return (_Transpose = Module["_Transpose"] = Module["asm"]["Ya"]).apply(null, arguments); + }; + var __FusedMatMul = Module["__FusedMatMul"] = function() { + return (__FusedMatMul = Module["__FusedMatMul"] = Module["asm"]["Za"]).apply(null, arguments); + }; + var _malloc = Module["_malloc"] = function() { + return (_malloc = Module["_malloc"] = Module["asm"]["_a"]).apply(null, arguments); + }; + var _free = Module["_free"] = function() { + return (_free = Module["_free"] = Module["asm"]["$a"]).apply(null, arguments); + }; + var ___errno_location = Module["___errno_location"] = function() { + return (___errno_location = Module["___errno_location"] = Module["asm"]["ab"]).apply(null, arguments); + }; + var _emscripten_get_global_libc = Module["_emscripten_get_global_libc"] = function() { + return (_emscripten_get_global_libc = Module["_emscripten_get_global_libc"] = Module["asm"]["bb"]).apply(null, arguments); + }; + var _pthread_self = Module["_pthread_self"] = function() { + return (_pthread_self = Module["_pthread_self"] = Module["asm"]["cb"]).apply(null, arguments); + }; + var ___pthread_tsd_run_dtors = Module["___pthread_tsd_run_dtors"] = function() { + return (___pthread_tsd_run_dtors = Module["___pthread_tsd_run_dtors"] = Module["asm"]["db"]).apply(null, arguments); + }; + var _emscripten_main_thread_process_queued_calls = Module["_emscripten_main_thread_process_queued_calls"] = function() { + return (_emscripten_main_thread_process_queued_calls = Module["_emscripten_main_thread_process_queued_calls"] = Module["asm"]["eb"]).apply(null, arguments); + }; + var _emscripten_current_thread_process_queued_calls = Module["_emscripten_current_thread_process_queued_calls"] = function() { + return (_emscripten_current_thread_process_queued_calls = Module["_emscripten_current_thread_process_queued_calls"] = Module["asm"]["fb"]).apply(null, arguments); + }; + var _emscripten_register_main_browser_thread_id = Module["_emscripten_register_main_browser_thread_id"] = function() { + return (_emscripten_register_main_browser_thread_id = Module["_emscripten_register_main_browser_thread_id"] = Module["asm"]["gb"]).apply(null, arguments); + }; + var __emscripten_do_dispatch_to_thread = Module["__emscripten_do_dispatch_to_thread"] = function() { + return (__emscripten_do_dispatch_to_thread = Module["__emscripten_do_dispatch_to_thread"] = Module["asm"]["hb"]).apply(null, arguments); + }; + var _emscripten_sync_run_in_main_thread_4 = Module["_emscripten_sync_run_in_main_thread_4"] = function() { + return (_emscripten_sync_run_in_main_thread_4 = Module["_emscripten_sync_run_in_main_thread_4"] = Module["asm"]["ib"]).apply(null, arguments); + }; + var _emscripten_run_in_main_runtime_thread_js = Module["_emscripten_run_in_main_runtime_thread_js"] = function() { + return (_emscripten_run_in_main_runtime_thread_js = Module["_emscripten_run_in_main_runtime_thread_js"] = Module["asm"]["jb"]).apply(null, arguments); + }; + var __emscripten_call_on_thread = Module["__emscripten_call_on_thread"] = function() { + return (__emscripten_call_on_thread = Module["__emscripten_call_on_thread"] = Module["asm"]["kb"]).apply(null, arguments); + }; + var _emscripten_tls_init = Module["_emscripten_tls_init"] = function() { + return (_emscripten_tls_init = Module["_emscripten_tls_init"] = Module["asm"]["lb"]).apply(null, arguments); + }; + var __emscripten_thread_init = Module["__emscripten_thread_init"] = function() { + return (__emscripten_thread_init = Module["__emscripten_thread_init"] = Module["asm"]["mb"]).apply(null, arguments); + }; + var stackSave = Module["stackSave"] = function() { + return (stackSave = Module["stackSave"] = Module["asm"]["nb"]).apply(null, arguments); + }; + var stackRestore = Module["stackRestore"] = function() { + return (stackRestore = Module["stackRestore"] = Module["asm"]["ob"]).apply(null, arguments); + }; + var stackAlloc = Module["stackAlloc"] = function() { + return (stackAlloc = Module["stackAlloc"] = Module["asm"]["pb"]).apply(null, arguments); + }; + var _emscripten_stack_set_limits = Module["_emscripten_stack_set_limits"] = function() { + return (_emscripten_stack_set_limits = Module["_emscripten_stack_set_limits"] = Module["asm"]["qb"]).apply(null, arguments); + }; + var _memalign = Module["_memalign"] = function() { + return (_memalign = Module["_memalign"] = Module["asm"]["rb"]).apply(null, arguments); + }; + var __emscripten_allow_main_runtime_queued_calls = Module["__emscripten_allow_main_runtime_queued_calls"] = 9880; + var __emscripten_main_thread_futex = Module["__emscripten_main_thread_futex"] = 11368; + Module["cwrap"] = cwrap; + Module["PThread"] = PThread; + Module["PThread"] = PThread; + Module["wasmMemory"] = wasmMemory; + Module["ExitStatus"] = ExitStatus; + var calledRun; + function ExitStatus(status) { + this.name = "ExitStatus"; + this.message = "Program terminated with exit(" + status + ")"; + this.status = status; + } + dependenciesFulfilled = function runCaller() { + if (!calledRun) + run2(); + if (!calledRun) + dependenciesFulfilled = runCaller; + }; + function run2(args) { + args = args || arguments_; + if (runDependencies > 0) { + return; + } + if (ENVIRONMENT_IS_PTHREAD) { + readyPromiseResolve(Module); + postMessage({cmd: "loaded"}); + return; + } + preRun(); + if (runDependencies > 0) { + return; + } + function doRun() { + if (calledRun) + return; + calledRun = true; + Module["calledRun"] = true; + if (ABORT) + return; + initRuntime(); + preMain(); + readyPromiseResolve(Module); + if (Module["onRuntimeInitialized"]) + Module["onRuntimeInitialized"](); + postRun(); + } + if (Module["setStatus"]) { + Module["setStatus"]("Running..."); + setTimeout(function() { + setTimeout(function() { + Module["setStatus"](""); + }, 1); + doRun(); + }, 1); + } else { + doRun(); + } + } + Module["run"] = run2; + function exit(status, implicit) { + if (implicit && noExitRuntime && status === 0) { + return; + } + if (!implicit) { + if (ENVIRONMENT_IS_PTHREAD) { + postMessage({cmd: "exitProcess", returnCode: status}); + throw new ExitStatus(status); + } else { + } + } + if (noExitRuntime) { + } else { + PThread.terminateAllThreads(); + EXITSTATUS = status; + exitRuntime(); + if (Module["onExit"]) + Module["onExit"](status); + ABORT = true; + } + quit_(status, new ExitStatus(status)); + } + if (Module["preInit"]) { + if (typeof Module["preInit"] == "function") + Module["preInit"] = [Module["preInit"]]; + while (Module["preInit"].length > 0) { + Module["preInit"].pop()(); + } + } + if (ENVIRONMENT_IS_PTHREAD) { + noExitRuntime = false; + PThread.initWorker(); + } + run2(); + return WasmBackendModuleThreadedSimd2.ready; + }; + }(); + if (typeof exports === "object" && typeof module === "object") + module.exports = WasmBackendModuleThreadedSimd; + else if (typeof define === "function" && define["amd"]) + define([], function() { + return WasmBackendModuleThreadedSimd; + }); + else if (typeof exports === "object") + exports["WasmBackendModuleThreadedSimd"] = WasmBackendModuleThreadedSimd; + }); + var require_tfjs_backend_wasm = __commonJS2((exports, module) => { + var WasmBackendModule = function() { + var _scriptDir = typeof document !== "undefined" && document.currentScript ? document.currentScript.src : void 0; + if (typeof __filename !== "undefined") + _scriptDir = _scriptDir || __filename; + return function(WasmBackendModule2) { + WasmBackendModule2 = WasmBackendModule2 || {}; + var Module = typeof WasmBackendModule2 !== "undefined" ? WasmBackendModule2 : {}; + var readyPromiseResolve, readyPromiseReject; + Module["ready"] = new Promise(function(resolve, reject) { + readyPromiseResolve = resolve; + readyPromiseReject = reject; + }); + var moduleOverrides = {}; + var key; + for (key in Module) { + if (Module.hasOwnProperty(key)) { + moduleOverrides[key] = Module[key]; + } + } + var arguments_ = []; + var thisProgram = "./this.program"; + var quit_ = function(status, toThrow) { + throw toThrow; + }; + var ENVIRONMENT_IS_WEB = false; + var ENVIRONMENT_IS_WORKER = false; + var ENVIRONMENT_IS_NODE = false; + var ENVIRONMENT_IS_SHELL = false; + ENVIRONMENT_IS_WEB = typeof window === "object"; + ENVIRONMENT_IS_WORKER = typeof importScripts === "function"; + ENVIRONMENT_IS_NODE = typeof process === "object" && typeof process.versions === "object" && typeof process.versions.node === "string"; + ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER; + var scriptDirectory = ""; + function locateFile(path) { + if (Module["locateFile"]) { + return Module["locateFile"](path, scriptDirectory); + } + return scriptDirectory + path; + } + var read_, readAsync, readBinary, setWindowTitle; + var nodeFS; + var nodePath; + if (ENVIRONMENT_IS_NODE) { + if (ENVIRONMENT_IS_WORKER) { + scriptDirectory = require_path().dirname(scriptDirectory) + "/"; + } else { + scriptDirectory = __dirname + "/"; + } + read_ = function shell_read(filename, binary) { + if (!nodeFS) + nodeFS = require("fs"); + if (!nodePath) + nodePath = require_path(); + filename = nodePath["normalize"](filename); + return nodeFS["readFileSync"](filename, binary ? null : "utf8"); + }; + readBinary = function readBinary2(filename) { + var ret = read_(filename, true); + if (!ret.buffer) { + ret = new Uint8Array(ret); + } + assert3(ret.buffer); + return ret; + }; + if (process["argv"].length > 1) { + thisProgram = process["argv"][1].replace(/\\/g, "/"); + } + arguments_ = process["argv"].slice(2); + process["on"]("uncaughtException", function(ex) { + if (!(ex instanceof ExitStatus)) { + throw ex; + } + }); + process["on"]("unhandledRejection", abort); + quit_ = function(status) { + process["exit"](status); + }; + Module["inspect"] = function() { + return "[Emscripten Module object]"; + }; + } else if (ENVIRONMENT_IS_SHELL) { + if (typeof read != "undefined") { + read_ = function shell_read(f) { + return read(f); + }; + } + readBinary = function readBinary2(f) { + var data2; + if (typeof readbuffer === "function") { + return new Uint8Array(readbuffer(f)); + } + data2 = read(f, "binary"); + assert3(typeof data2 === "object"); + return data2; + }; + if (typeof scriptArgs != "undefined") { + arguments_ = scriptArgs; + } else if (typeof arguments != "undefined") { + arguments_ = arguments; + } + if (typeof quit === "function") { + quit_ = function(status) { + quit(status); + }; + } + if (typeof print !== "undefined") { + if (typeof console === "undefined") + console = {}; + console.log = print; + console.warn = console.error = typeof printErr !== "undefined" ? printErr : print; + } + } else if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) { + if (ENVIRONMENT_IS_WORKER) { + scriptDirectory = self.location.href; + } else if (typeof document !== "undefined" && document.currentScript) { + scriptDirectory = document.currentScript.src; + } + if (_scriptDir) { + scriptDirectory = _scriptDir; + } + if (scriptDirectory.indexOf("blob:") !== 0) { + scriptDirectory = scriptDirectory.substr(0, scriptDirectory.lastIndexOf("/") + 1); + } else { + scriptDirectory = ""; + } + { + read_ = function(url) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", url, false); + xhr.send(null); + return xhr.responseText; + }; + if (ENVIRONMENT_IS_WORKER) { + readBinary = function(url) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", url, false); + xhr.responseType = "arraybuffer"; + xhr.send(null); + return new Uint8Array(xhr.response); + }; + } + readAsync = function(url, onload, onerror) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", url, true); + xhr.responseType = "arraybuffer"; + xhr.onload = function() { + if (xhr.status == 200 || xhr.status == 0 && xhr.response) { + onload(xhr.response); + return; + } + onerror(); + }; + xhr.onerror = onerror; + xhr.send(null); + }; + } + setWindowTitle = function(title) { + document.title = title; + }; + } else { + } + var out = Module["print"] || console.log.bind(console); + var err = Module["printErr"] || console.warn.bind(console); + for (key in moduleOverrides) { + if (moduleOverrides.hasOwnProperty(key)) { + Module[key] = moduleOverrides[key]; + } + } + moduleOverrides = null; + if (Module["arguments"]) + arguments_ = Module["arguments"]; + if (Module["thisProgram"]) + thisProgram = Module["thisProgram"]; + if (Module["quit"]) + quit_ = Module["quit"]; + var wasmBinary; + if (Module["wasmBinary"]) + wasmBinary = Module["wasmBinary"]; + var noExitRuntime = Module["noExitRuntime"] || true; + if (typeof WebAssembly !== "object") { + abort("no native wasm support detected"); + } + var wasmMemory; + var ABORT = false; + var EXITSTATUS; + function assert3(condition, text) { + if (!condition) { + abort("Assertion failed: " + text); + } + } + function getCFunc(ident) { + var func2 = Module["_" + ident]; + assert3(func2, "Cannot call unknown function " + ident + ", make sure it is exported"); + return func2; + } + function ccall(ident, returnType, argTypes, args, opts) { + var toC = {string: function(str) { + var ret2 = 0; + if (str !== null && str !== void 0 && str !== 0) { + var len = (str.length << 2) + 1; + ret2 = stackAlloc(len); + stringToUTF8(str, ret2, len); + } + return ret2; + }, array: function(arr) { + var ret2 = stackAlloc(arr.length); + writeArrayToMemory(arr, ret2); + return ret2; + }}; + function convertReturnValue(ret2) { + if (returnType === "string") + return UTF8ToString(ret2); + if (returnType === "boolean") + return Boolean(ret2); + return ret2; + } + var func2 = getCFunc(ident); + var cArgs = []; + var stack2 = 0; + if (args) { + for (var i = 0; i < args.length; i++) { + var converter = toC[argTypes[i]]; + if (converter) { + if (stack2 === 0) + stack2 = stackSave(); + cArgs[i] = converter(args[i]); + } else { + cArgs[i] = args[i]; + } + } + } + var ret = func2.apply(null, cArgs); + ret = convertReturnValue(ret); + if (stack2 !== 0) + stackRestore(stack2); + return ret; + } + function cwrap(ident, returnType, argTypes, opts) { + argTypes = argTypes || []; + var numericArgs = argTypes.every(function(type) { + return type === "number"; + }); + var numericRet = returnType !== "string"; + if (numericRet && numericArgs && !opts) { + return getCFunc(ident); + } + return function() { + return ccall(ident, returnType, argTypes, arguments, opts); + }; + } + var UTF8Decoder = typeof TextDecoder !== "undefined" ? new TextDecoder("utf8") : void 0; + function UTF8ArrayToString(heap, idx, maxBytesToRead) { + var endIdx = idx + maxBytesToRead; + var endPtr = idx; + while (heap[endPtr] && !(endPtr >= endIdx)) + ++endPtr; + if (endPtr - idx > 16 && heap.subarray && UTF8Decoder) { + return UTF8Decoder.decode(heap.subarray(idx, endPtr)); + } else { + var str = ""; + while (idx < endPtr) { + var u0 = heap[idx++]; + if (!(u0 & 128)) { + str += String.fromCharCode(u0); + continue; + } + var u1 = heap[idx++] & 63; + if ((u0 & 224) == 192) { + str += String.fromCharCode((u0 & 31) << 6 | u1); + continue; + } + var u2 = heap[idx++] & 63; + if ((u0 & 240) == 224) { + u0 = (u0 & 15) << 12 | u1 << 6 | u2; + } else { + u0 = (u0 & 7) << 18 | u1 << 12 | u2 << 6 | heap[idx++] & 63; + } + if (u0 < 65536) { + str += String.fromCharCode(u0); + } else { + var ch = u0 - 65536; + str += String.fromCharCode(55296 | ch >> 10, 56320 | ch & 1023); + } + } + } + return str; + } + function UTF8ToString(ptr, maxBytesToRead) { + return ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ""; + } + function stringToUTF8Array(str, heap, outIdx, maxBytesToWrite) { + if (!(maxBytesToWrite > 0)) + return 0; + var startIdx = outIdx; + var endIdx = outIdx + maxBytesToWrite - 1; + for (var i = 0; i < str.length; ++i) { + var u = str.charCodeAt(i); + if (u >= 55296 && u <= 57343) { + var u1 = str.charCodeAt(++i); + u = 65536 + ((u & 1023) << 10) | u1 & 1023; + } + if (u <= 127) { + if (outIdx >= endIdx) + break; + heap[outIdx++] = u; + } else if (u <= 2047) { + if (outIdx + 1 >= endIdx) + break; + heap[outIdx++] = 192 | u >> 6; + heap[outIdx++] = 128 | u & 63; + } else if (u <= 65535) { + if (outIdx + 2 >= endIdx) + break; + heap[outIdx++] = 224 | u >> 12; + heap[outIdx++] = 128 | u >> 6 & 63; + heap[outIdx++] = 128 | u & 63; + } else { + if (outIdx + 3 >= endIdx) + break; + heap[outIdx++] = 240 | u >> 18; + heap[outIdx++] = 128 | u >> 12 & 63; + heap[outIdx++] = 128 | u >> 6 & 63; + heap[outIdx++] = 128 | u & 63; + } + } + heap[outIdx] = 0; + return outIdx - startIdx; + } + function stringToUTF8(str, outPtr, maxBytesToWrite) { + return stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite); + } + function writeArrayToMemory(array2, buffer3) { + HEAP8.set(array2, buffer3); + } + function alignUp(x, multiple) { + if (x % multiple > 0) { + x += multiple - x % multiple; + } + return x; + } + var buffer2, HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64; + function updateGlobalBufferAndViews(buf) { + buffer2 = buf; + Module["HEAP8"] = HEAP8 = new Int8Array(buf); + Module["HEAP16"] = HEAP16 = new Int16Array(buf); + Module["HEAP32"] = HEAP32 = new Int32Array(buf); + Module["HEAPU8"] = HEAPU8 = new Uint8Array(buf); + Module["HEAPU16"] = HEAPU16 = new Uint16Array(buf); + Module["HEAPU32"] = HEAPU32 = new Uint32Array(buf); + Module["HEAPF32"] = HEAPF32 = new Float32Array(buf); + Module["HEAPF64"] = HEAPF64 = new Float64Array(buf); + } + var INITIAL_MEMORY = Module["INITIAL_MEMORY"] || 16777216; + var wasmTable; + var __ATPRERUN__ = []; + var __ATINIT__ = []; + var __ATMAIN__ = []; + var __ATPOSTRUN__ = []; + var runtimeInitialized = false; + __ATINIT__.push({func: function() { + ___wasm_call_ctors(); + }}); + function preRun() { + if (Module["preRun"]) { + if (typeof Module["preRun"] == "function") + Module["preRun"] = [Module["preRun"]]; + while (Module["preRun"].length) { + addOnPreRun(Module["preRun"].shift()); + } + } + callRuntimeCallbacks(__ATPRERUN__); + } + function initRuntime() { + runtimeInitialized = true; + callRuntimeCallbacks(__ATINIT__); + } + function preMain() { + callRuntimeCallbacks(__ATMAIN__); + } + function postRun() { + if (Module["postRun"]) { + if (typeof Module["postRun"] == "function") + Module["postRun"] = [Module["postRun"]]; + while (Module["postRun"].length) { + addOnPostRun(Module["postRun"].shift()); + } + } + callRuntimeCallbacks(__ATPOSTRUN__); + } + function addOnPreRun(cb) { + __ATPRERUN__.unshift(cb); + } + function addOnPostRun(cb) { + __ATPOSTRUN__.unshift(cb); + } + var runDependencies = 0; + var runDependencyWatcher = null; + var dependenciesFulfilled = null; + function addRunDependency(id) { + runDependencies++; + if (Module["monitorRunDependencies"]) { + Module["monitorRunDependencies"](runDependencies); + } + } + function removeRunDependency(id) { + runDependencies--; + if (Module["monitorRunDependencies"]) { + Module["monitorRunDependencies"](runDependencies); + } + if (runDependencies == 0) { + if (runDependencyWatcher !== null) { + clearInterval(runDependencyWatcher); + runDependencyWatcher = null; + } + if (dependenciesFulfilled) { + var callback = dependenciesFulfilled; + dependenciesFulfilled = null; + callback(); + } + } + } + Module["preloadedImages"] = {}; + Module["preloadedAudios"] = {}; + function abort(what) { + if (Module["onAbort"]) { + Module["onAbort"](what); + } + what += ""; + err(what); + ABORT = true; + EXITSTATUS = 1; + what = "abort(" + what + "). Build with -s ASSERTIONS=1 for more info."; + var e = new WebAssembly.RuntimeError(what); + readyPromiseReject(e); + throw e; + } + function hasPrefix(str, prefix) { + return String.prototype.startsWith ? str.startsWith(prefix) : str.indexOf(prefix) === 0; + } + var dataURIPrefix = "data:application/octet-stream;base64,"; + function isDataURI(filename) { + return hasPrefix(filename, dataURIPrefix); + } + var fileURIPrefix = "file://"; + function isFileURI(filename) { + return hasPrefix(filename, fileURIPrefix); + } + var wasmBinaryFile = "tfjs-backend-wasm.wasm"; + if (!isDataURI(wasmBinaryFile)) { + wasmBinaryFile = locateFile(wasmBinaryFile); + } + function getBinary(file) { + try { + if (file == wasmBinaryFile && wasmBinary) { + return new Uint8Array(wasmBinary); + } + if (readBinary) { + return readBinary(file); + } else { + throw "both async and sync fetching of the wasm failed"; + } + } catch (err2) { + abort(err2); + } + } + function getBinaryPromise() { + if (!wasmBinary && (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER)) { + if (typeof fetch === "function" && !isFileURI(wasmBinaryFile)) { + return fetch(wasmBinaryFile, {credentials: "same-origin"}).then(function(response) { + if (!response["ok"]) { + throw "failed to load wasm binary file at '" + wasmBinaryFile + "'"; + } + return response["arrayBuffer"](); + }).catch(function() { + return getBinary(wasmBinaryFile); + }); + } else { + if (readAsync) { + return new Promise(function(resolve, reject) { + readAsync(wasmBinaryFile, function(response) { + resolve(new Uint8Array(response)); + }, reject); + }); + } + } + } + return Promise.resolve().then(function() { + return getBinary(wasmBinaryFile); + }); + } + function createWasm() { + var info2 = {a: asmLibraryArg}; + function receiveInstance(instance, module2) { + var exports3 = instance.exports; + Module["asm"] = exports3; + wasmMemory = Module["asm"]["g"]; + updateGlobalBufferAndViews(wasmMemory.buffer); + wasmTable = Module["asm"]["m"]; + removeRunDependency("wasm-instantiate"); + } + addRunDependency("wasm-instantiate"); + function receiveInstantiatedSource(output) { + receiveInstance(output["instance"]); + } + function instantiateArrayBuffer(receiver) { + return getBinaryPromise().then(function(binary) { + return WebAssembly.instantiate(binary, info2); + }).then(receiver, function(reason) { + err("failed to asynchronously prepare wasm: " + reason); + abort(reason); + }); + } + function instantiateAsync() { + if (!wasmBinary && typeof WebAssembly.instantiateStreaming === "function" && !isDataURI(wasmBinaryFile) && !isFileURI(wasmBinaryFile) && typeof fetch === "function") { + return fetch(wasmBinaryFile, {credentials: "same-origin"}).then(function(response) { + var result = WebAssembly.instantiateStreaming(response, info2); + return result.then(receiveInstantiatedSource, function(reason) { + err("wasm streaming compile failed: " + reason); + err("falling back to ArrayBuffer instantiation"); + return instantiateArrayBuffer(receiveInstantiatedSource); + }); + }); + } else { + return instantiateArrayBuffer(receiveInstantiatedSource); + } + } + if (Module["instantiateWasm"]) { + try { + var exports2 = Module["instantiateWasm"](info2, receiveInstance); + return exports2; + } catch (e) { + err("Module.instantiateWasm callback failed with error: " + e); + return false; + } + } + instantiateAsync().catch(readyPromiseReject); + return {}; + } + function callRuntimeCallbacks(callbacks2) { + while (callbacks2.length > 0) { + var callback = callbacks2.shift(); + if (typeof callback == "function") { + callback(Module); + continue; + } + var func2 = callback.func; + if (typeof func2 === "number") { + if (callback.arg === void 0) { + wasmTable.get(func2)(); + } else { + wasmTable.get(func2)(callback.arg); + } + } else { + func2(callback.arg === void 0 ? null : callback.arg); + } + } + } + function _abort() { + abort(); + } + function _emscripten_memcpy_big(dest, src, num) { + HEAPU8.copyWithin(dest, src, src + num); + } + function _emscripten_get_heap_size() { + return HEAPU8.length; + } + function emscripten_realloc_buffer(size) { + try { + wasmMemory.grow(size - buffer2.byteLength + 65535 >>> 16); + updateGlobalBufferAndViews(wasmMemory.buffer); + return 1; + } catch (e) { + } + } + function _emscripten_resize_heap(requestedSize) { + var oldSize = _emscripten_get_heap_size(); + var maxHeapSize = 2147483648; + if (requestedSize > maxHeapSize) { + return false; + } + for (var cutDown = 1; cutDown <= 4; cutDown *= 2) { + var overGrownHeapSize = oldSize * (1 + 0.2 / cutDown); + overGrownHeapSize = Math.min(overGrownHeapSize, requestedSize + 100663296); + var newSize = Math.min(maxHeapSize, alignUp(Math.max(requestedSize, overGrownHeapSize), 65536)); + var replacement = emscripten_realloc_buffer(newSize); + if (replacement) { + return true; + } + } + return false; + } + var SYSCALLS = {mappings: {}, buffers: [null, [], []], printChar: function(stream, curr) { + var buffer3 = SYSCALLS.buffers[stream]; + if (curr === 0 || curr === 10) { + (stream === 1 ? out : err)(UTF8ArrayToString(buffer3, 0)); + buffer3.length = 0; + } else { + buffer3.push(curr); + } + }, varargs: void 0, get: function() { + SYSCALLS.varargs += 4; + var ret = HEAP32[SYSCALLS.varargs - 4 >> 2]; + return ret; + }, getStr: function(ptr) { + var ret = UTF8ToString(ptr); + return ret; + }, get64: function(low, high) { + return low; + }}; + function _fd_close(fd) { + return 0; + } + function _fd_seek(fd, offset_low, offset_high, whence, newOffset) { + } + function _fd_write(fd, iov, iovcnt, pnum) { + var num = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAP32[iov + i * 8 >> 2]; + var len = HEAP32[iov + (i * 8 + 4) >> 2]; + for (var j = 0; j < len; j++) { + SYSCALLS.printChar(fd, HEAPU8[ptr + j]); + } + num += len; + } + HEAP32[pnum >> 2] = num; + return 0; + } + var asmLibraryArg = {a: _abort, d: _emscripten_memcpy_big, e: _emscripten_resize_heap, f: _fd_close, c: _fd_seek, b: _fd_write}; + var asm = createWasm(); + var ___wasm_call_ctors = Module["___wasm_call_ctors"] = function() { + return (___wasm_call_ctors = Module["___wasm_call_ctors"] = Module["asm"]["h"]).apply(null, arguments); + }; + var _init = Module["_init"] = function() { + return (_init = Module["_init"] = Module["asm"]["i"]).apply(null, arguments); + }; + var _register_tensor = Module["_register_tensor"] = function() { + return (_register_tensor = Module["_register_tensor"] = Module["asm"]["j"]).apply(null, arguments); + }; + var _dispose_data = Module["_dispose_data"] = function() { + return (_dispose_data = Module["_dispose_data"] = Module["asm"]["k"]).apply(null, arguments); + }; + var _dispose = Module["_dispose"] = function() { + return (_dispose = Module["_dispose"] = Module["asm"]["l"]).apply(null, arguments); + }; + var _Abs = Module["_Abs"] = function() { + return (_Abs = Module["_Abs"] = Module["asm"]["n"]).apply(null, arguments); + }; + var _Add = Module["_Add"] = function() { + return (_Add = Module["_Add"] = Module["asm"]["o"]).apply(null, arguments); + }; + var _AddN = Module["_AddN"] = function() { + return (_AddN = Module["_AddN"] = Module["asm"]["p"]).apply(null, arguments); + }; + var _ArgMax = Module["_ArgMax"] = function() { + return (_ArgMax = Module["_ArgMax"] = Module["asm"]["q"]).apply(null, arguments); + }; + var _AvgPool = Module["_AvgPool"] = function() { + return (_AvgPool = Module["_AvgPool"] = Module["asm"]["r"]).apply(null, arguments); + }; + var _BatchMatMul = Module["_BatchMatMul"] = function() { + return (_BatchMatMul = Module["_BatchMatMul"] = Module["asm"]["s"]).apply(null, arguments); + }; + var _Ceil = Module["_Ceil"] = function() { + return (_Ceil = Module["_Ceil"] = Module["asm"]["t"]).apply(null, arguments); + }; + var _ClipByValue = Module["_ClipByValue"] = function() { + return (_ClipByValue = Module["_ClipByValue"] = Module["asm"]["u"]).apply(null, arguments); + }; + var _Conv2D = Module["_Conv2D"] = function() { + return (_Conv2D = Module["_Conv2D"] = Module["asm"]["v"]).apply(null, arguments); + }; + var _Conv2DBackpropInput = Module["_Conv2DBackpropInput"] = function() { + return (_Conv2DBackpropInput = Module["_Conv2DBackpropInput"] = Module["asm"]["w"]).apply(null, arguments); + }; + var _Cos = Module["_Cos"] = function() { + return (_Cos = Module["_Cos"] = Module["asm"]["x"]).apply(null, arguments); + }; + var _CropAndResize = Module["_CropAndResize"] = function() { + return (_CropAndResize = Module["_CropAndResize"] = Module["asm"]["y"]).apply(null, arguments); + }; + var _Cumsum = Module["_Cumsum"] = function() { + return (_Cumsum = Module["_Cumsum"] = Module["asm"]["z"]).apply(null, arguments); + }; + var _DepthToSpace = Module["_DepthToSpace"] = function() { + return (_DepthToSpace = Module["_DepthToSpace"] = Module["asm"]["A"]).apply(null, arguments); + }; + var _DepthwiseConv2dNative = Module["_DepthwiseConv2dNative"] = function() { + return (_DepthwiseConv2dNative = Module["_DepthwiseConv2dNative"] = Module["asm"]["B"]).apply(null, arguments); + }; + var _Equal = Module["_Equal"] = function() { + return (_Equal = Module["_Equal"] = Module["asm"]["C"]).apply(null, arguments); + }; + var _Exp = Module["_Exp"] = function() { + return (_Exp = Module["_Exp"] = Module["asm"]["D"]).apply(null, arguments); + }; + var _FlipLeftRight = Module["_FlipLeftRight"] = function() { + return (_FlipLeftRight = Module["_FlipLeftRight"] = Module["asm"]["E"]).apply(null, arguments); + }; + var _Floor = Module["_Floor"] = function() { + return (_Floor = Module["_Floor"] = Module["asm"]["F"]).apply(null, arguments); + }; + var _FloorDiv = Module["_FloorDiv"] = function() { + return (_FloorDiv = Module["_FloorDiv"] = Module["asm"]["G"]).apply(null, arguments); + }; + var _FusedBatchNorm = Module["_FusedBatchNorm"] = function() { + return (_FusedBatchNorm = Module["_FusedBatchNorm"] = Module["asm"]["H"]).apply(null, arguments); + }; + var _FusedConv2D = Module["_FusedConv2D"] = function() { + return (_FusedConv2D = Module["_FusedConv2D"] = Module["asm"]["I"]).apply(null, arguments); + }; + var _FusedDepthwiseConv2D = Module["_FusedDepthwiseConv2D"] = function() { + return (_FusedDepthwiseConv2D = Module["_FusedDepthwiseConv2D"] = Module["asm"]["J"]).apply(null, arguments); + }; + var _Gather = Module["_Gather"] = function() { + return (_Gather = Module["_Gather"] = Module["asm"]["K"]).apply(null, arguments); + }; + var _GatherNd = Module["_GatherNd"] = function() { + return (_GatherNd = Module["_GatherNd"] = Module["asm"]["L"]).apply(null, arguments); + }; + var _Greater = Module["_Greater"] = function() { + return (_Greater = Module["_Greater"] = Module["asm"]["M"]).apply(null, arguments); + }; + var _GreaterEqual = Module["_GreaterEqual"] = function() { + return (_GreaterEqual = Module["_GreaterEqual"] = Module["asm"]["N"]).apply(null, arguments); + }; + var _LeakyRelu = Module["_LeakyRelu"] = function() { + return (_LeakyRelu = Module["_LeakyRelu"] = Module["asm"]["O"]).apply(null, arguments); + }; + var _Less = Module["_Less"] = function() { + return (_Less = Module["_Less"] = Module["asm"]["P"]).apply(null, arguments); + }; + var _LessEqual = Module["_LessEqual"] = function() { + return (_LessEqual = Module["_LessEqual"] = Module["asm"]["Q"]).apply(null, arguments); + }; + var _Log = Module["_Log"] = function() { + return (_Log = Module["_Log"] = Module["asm"]["R"]).apply(null, arguments); + }; + var _LogicalAnd = Module["_LogicalAnd"] = function() { + return (_LogicalAnd = Module["_LogicalAnd"] = Module["asm"]["S"]).apply(null, arguments); + }; + var _Max = Module["_Max"] = function() { + return (_Max = Module["_Max"] = Module["asm"]["T"]).apply(null, arguments); + }; + var _MaxPool = Module["_MaxPool"] = function() { + return (_MaxPool = Module["_MaxPool"] = Module["asm"]["U"]).apply(null, arguments); + }; + var _Maximum = Module["_Maximum"] = function() { + return (_Maximum = Module["_Maximum"] = Module["asm"]["V"]).apply(null, arguments); + }; + var _Mean = Module["_Mean"] = function() { + return (_Mean = Module["_Mean"] = Module["asm"]["W"]).apply(null, arguments); + }; + var _Min = Module["_Min"] = function() { + return (_Min = Module["_Min"] = Module["asm"]["X"]).apply(null, arguments); + }; + var _Minimum = Module["_Minimum"] = function() { + return (_Minimum = Module["_Minimum"] = Module["asm"]["Y"]).apply(null, arguments); + }; + var _Multiply = Module["_Multiply"] = function() { + return (_Multiply = Module["_Multiply"] = Module["asm"]["Z"]).apply(null, arguments); + }; + var _Neg = Module["_Neg"] = function() { + return (_Neg = Module["_Neg"] = Module["asm"]["_"]).apply(null, arguments); + }; + var _NonMaxSuppressionV3 = Module["_NonMaxSuppressionV3"] = function() { + return (_NonMaxSuppressionV3 = Module["_NonMaxSuppressionV3"] = Module["asm"]["$"]).apply(null, arguments); + }; + var _NonMaxSuppressionV4 = Module["_NonMaxSuppressionV4"] = function() { + return (_NonMaxSuppressionV4 = Module["_NonMaxSuppressionV4"] = Module["asm"]["aa"]).apply(null, arguments); + }; + var _NonMaxSuppressionV5 = Module["_NonMaxSuppressionV5"] = function() { + return (_NonMaxSuppressionV5 = Module["_NonMaxSuppressionV5"] = Module["asm"]["ba"]).apply(null, arguments); + }; + var _NotEqual = Module["_NotEqual"] = function() { + return (_NotEqual = Module["_NotEqual"] = Module["asm"]["ca"]).apply(null, arguments); + }; + var _OneHot = Module["_OneHot"] = function() { + return (_OneHot = Module["_OneHot"] = Module["asm"]["da"]).apply(null, arguments); + }; + var _PadV2 = Module["_PadV2"] = function() { + return (_PadV2 = Module["_PadV2"] = Module["asm"]["ea"]).apply(null, arguments); + }; + var _Pow = Module["_Pow"] = function() { + return (_Pow = Module["_Pow"] = Module["asm"]["fa"]).apply(null, arguments); + }; + var _Prelu = Module["_Prelu"] = function() { + return (_Prelu = Module["_Prelu"] = Module["asm"]["ga"]).apply(null, arguments); + }; + var _Prod = Module["_Prod"] = function() { + return (_Prod = Module["_Prod"] = Module["asm"]["ha"]).apply(null, arguments); + }; + var _RealDiv = Module["_RealDiv"] = function() { + return (_RealDiv = Module["_RealDiv"] = Module["asm"]["ia"]).apply(null, arguments); + }; + var _Relu = Module["_Relu"] = function() { + return (_Relu = Module["_Relu"] = Module["asm"]["ja"]).apply(null, arguments); + }; + var _Relu6 = Module["_Relu6"] = function() { + return (_Relu6 = Module["_Relu6"] = Module["asm"]["ka"]).apply(null, arguments); + }; + var _ResizeBilinear = Module["_ResizeBilinear"] = function() { + return (_ResizeBilinear = Module["_ResizeBilinear"] = Module["asm"]["la"]).apply(null, arguments); + }; + var _Reverse = Module["_Reverse"] = function() { + return (_Reverse = Module["_Reverse"] = Module["asm"]["ma"]).apply(null, arguments); + }; + var _RotateWithOffset = Module["_RotateWithOffset"] = function() { + return (_RotateWithOffset = Module["_RotateWithOffset"] = Module["asm"]["na"]).apply(null, arguments); + }; + var _Round = Module["_Round"] = function() { + return (_Round = Module["_Round"] = Module["asm"]["oa"]).apply(null, arguments); + }; + var _Rsqrt = Module["_Rsqrt"] = function() { + return (_Rsqrt = Module["_Rsqrt"] = Module["asm"]["pa"]).apply(null, arguments); + }; + var _ScatterNd = Module["_ScatterNd"] = function() { + return (_ScatterNd = Module["_ScatterNd"] = Module["asm"]["qa"]).apply(null, arguments); + }; + var _SelectV2 = Module["_SelectV2"] = function() { + return (_SelectV2 = Module["_SelectV2"] = Module["asm"]["ra"]).apply(null, arguments); + }; + var _Sigmoid = Module["_Sigmoid"] = function() { + return (_Sigmoid = Module["_Sigmoid"] = Module["asm"]["sa"]).apply(null, arguments); + }; + var _Sin = Module["_Sin"] = function() { + return (_Sin = Module["_Sin"] = Module["asm"]["ta"]).apply(null, arguments); + }; + var _Softmax = Module["_Softmax"] = function() { + return (_Softmax = Module["_Softmax"] = Module["asm"]["ua"]).apply(null, arguments); + }; + var _Sqrt = Module["_Sqrt"] = function() { + return (_Sqrt = Module["_Sqrt"] = Module["asm"]["va"]).apply(null, arguments); + }; + var _Square = Module["_Square"] = function() { + return (_Square = Module["_Square"] = Module["asm"]["wa"]).apply(null, arguments); + }; + var _SquaredDifference = Module["_SquaredDifference"] = function() { + return (_SquaredDifference = Module["_SquaredDifference"] = Module["asm"]["xa"]).apply(null, arguments); + }; + var _Step = Module["_Step"] = function() { + return (_Step = Module["_Step"] = Module["asm"]["ya"]).apply(null, arguments); + }; + var _StridedSlice = Module["_StridedSlice"] = function() { + return (_StridedSlice = Module["_StridedSlice"] = Module["asm"]["za"]).apply(null, arguments); + }; + var _Sub = Module["_Sub"] = function() { + return (_Sub = Module["_Sub"] = Module["asm"]["Aa"]).apply(null, arguments); + }; + var _Sum = Module["_Sum"] = function() { + return (_Sum = Module["_Sum"] = Module["asm"]["Ba"]).apply(null, arguments); + }; + var _Tanh = Module["_Tanh"] = function() { + return (_Tanh = Module["_Tanh"] = Module["asm"]["Ca"]).apply(null, arguments); + }; + var _Tile = Module["_Tile"] = function() { + return (_Tile = Module["_Tile"] = Module["asm"]["Da"]).apply(null, arguments); + }; + var _TopK = Module["_TopK"] = function() { + return (_TopK = Module["_TopK"] = Module["asm"]["Ea"]).apply(null, arguments); + }; + var _Transpose = Module["_Transpose"] = function() { + return (_Transpose = Module["_Transpose"] = Module["asm"]["Fa"]).apply(null, arguments); + }; + var __FusedMatMul = Module["__FusedMatMul"] = function() { + return (__FusedMatMul = Module["__FusedMatMul"] = Module["asm"]["Ga"]).apply(null, arguments); + }; + var _malloc = Module["_malloc"] = function() { + return (_malloc = Module["_malloc"] = Module["asm"]["Ha"]).apply(null, arguments); + }; + var _free = Module["_free"] = function() { + return (_free = Module["_free"] = Module["asm"]["Ia"]).apply(null, arguments); + }; + var stackSave = Module["stackSave"] = function() { + return (stackSave = Module["stackSave"] = Module["asm"]["Ja"]).apply(null, arguments); + }; + var stackRestore = Module["stackRestore"] = function() { + return (stackRestore = Module["stackRestore"] = Module["asm"]["Ka"]).apply(null, arguments); + }; + var stackAlloc = Module["stackAlloc"] = function() { + return (stackAlloc = Module["stackAlloc"] = Module["asm"]["La"]).apply(null, arguments); + }; + Module["cwrap"] = cwrap; + var calledRun; + function ExitStatus(status) { + this.name = "ExitStatus"; + this.message = "Program terminated with exit(" + status + ")"; + this.status = status; + } + dependenciesFulfilled = function runCaller() { + if (!calledRun) + run2(); + if (!calledRun) + dependenciesFulfilled = runCaller; + }; + function run2(args) { + args = args || arguments_; + if (runDependencies > 0) { + return; + } + preRun(); + if (runDependencies > 0) { + return; + } + function doRun() { + if (calledRun) + return; + calledRun = true; + Module["calledRun"] = true; + if (ABORT) + return; + initRuntime(); + preMain(); + readyPromiseResolve(Module); + if (Module["onRuntimeInitialized"]) + Module["onRuntimeInitialized"](); + postRun(); + } + if (Module["setStatus"]) { + Module["setStatus"]("Running..."); + setTimeout(function() { + setTimeout(function() { + Module["setStatus"](""); + }, 1); + doRun(); + }, 1); + } else { + doRun(); + } + } + Module["run"] = run2; + if (Module["preInit"]) { + if (typeof Module["preInit"] == "function") + Module["preInit"] = [Module["preInit"]]; + while (Module["preInit"].length > 0) { + Module["preInit"].pop()(); + } + } + run2(); + return WasmBackendModule2.ready; + }; + }(); + if (typeof exports === "object" && typeof module === "object") + module.exports = WasmBackendModule; + else if (typeof define === "function" && define["amd"]) + define([], function() { + return WasmBackendModule; + }); + else if (typeof exports === "object") + exports["WasmBackendModule"] = WasmBackendModule; + }); + var require_alea2 = __commonJS2((exports, module) => { + (function(global2, module2, define2) { + function Alea(seed) { + var me = this, mash = Mash(); + me.next = function() { + var t = 2091639 * me.s0 + me.c * 23283064365386963e-26; + me.s0 = me.s1; + me.s1 = me.s2; + return me.s2 = t - (me.c = t | 0); + }; + me.c = 1; + me.s0 = mash(" "); + me.s1 = mash(" "); + me.s2 = mash(" "); + me.s0 -= mash(seed); + if (me.s0 < 0) { + me.s0 += 1; + } + me.s1 -= mash(seed); + if (me.s1 < 0) { + me.s1 += 1; + } + me.s2 -= mash(seed); + if (me.s2 < 0) { + me.s2 += 1; + } + mash = null; + } + function copy(f, t) { + t.c = f.c; + t.s0 = f.s0; + t.s1 = f.s1; + t.s2 = f.s2; + return t; + } + function impl(seed, opts) { + var xg = new Alea(seed), state = opts && opts.state, prng = xg.next; + prng.int32 = function() { + return xg.next() * 4294967296 | 0; + }; + prng.double = function() { + return prng() + (prng() * 2097152 | 0) * 11102230246251565e-32; + }; + prng.quick = prng; + if (state) { + if (typeof state == "object") + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + function Mash() { + var n = 4022871197; + var mash = function(data2) { + data2 = String(data2); + for (var i = 0; i < data2.length; i++) { + n += data2.charCodeAt(i); + var h = 0.02519603282416938 * n; + n = h >>> 0; + h -= n; + h *= n; + n = h >>> 0; + h -= n; + n += h * 4294967296; + } + return (n >>> 0) * 23283064365386963e-26; + }; + return mash; + } + if (module2 && module2.exports) { + module2.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.alea = impl; + } + })(exports, typeof module == "object" && module, typeof define == "function" && define); + }); + var require_xor1282 = __commonJS2((exports, module) => { + (function(global2, module2, define2) { + function XorGen(seed) { + var me = this, strseed = ""; + me.x = 0; + me.y = 0; + me.z = 0; + me.w = 0; + me.next = function() { + var t = me.x ^ me.x << 11; + me.x = me.y; + me.y = me.z; + me.z = me.w; + return me.w ^= me.w >>> 19 ^ t ^ t >>> 8; + }; + if (seed === (seed | 0)) { + me.x = seed; + } else { + strseed += seed; + } + for (var k = 0; k < strseed.length + 64; k++) { + me.x ^= strseed.charCodeAt(k) | 0; + me.next(); + } + } + function copy(f, t) { + t.x = f.x; + t.y = f.y; + t.z = f.z; + t.w = f.w; + return t; + } + function impl(seed, opts) { + var xg = new XorGen(seed), state = opts && opts.state, prng = function() { + return (xg.next() >>> 0) / 4294967296; + }; + prng.double = function() { + do { + var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); + } while (result === 0); + return result; + }; + prng.int32 = xg.next; + prng.quick = prng; + if (state) { + if (typeof state == "object") + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + if (module2 && module2.exports) { + module2.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.xor128 = impl; + } + })(exports, typeof module == "object" && module, typeof define == "function" && define); + }); + var require_xorwow2 = __commonJS2((exports, module) => { + (function(global2, module2, define2) { + function XorGen(seed) { + var me = this, strseed = ""; + me.next = function() { + var t = me.x ^ me.x >>> 2; + me.x = me.y; + me.y = me.z; + me.z = me.w; + me.w = me.v; + return (me.d = me.d + 362437 | 0) + (me.v = me.v ^ me.v << 4 ^ (t ^ t << 1)) | 0; + }; + me.x = 0; + me.y = 0; + me.z = 0; + me.w = 0; + me.v = 0; + if (seed === (seed | 0)) { + me.x = seed; + } else { + strseed += seed; + } + for (var k = 0; k < strseed.length + 64; k++) { + me.x ^= strseed.charCodeAt(k) | 0; + if (k == strseed.length) { + me.d = me.x << 10 ^ me.x >>> 4; + } + me.next(); + } + } + function copy(f, t) { + t.x = f.x; + t.y = f.y; + t.z = f.z; + t.w = f.w; + t.v = f.v; + t.d = f.d; + return t; + } + function impl(seed, opts) { + var xg = new XorGen(seed), state = opts && opts.state, prng = function() { + return (xg.next() >>> 0) / 4294967296; + }; + prng.double = function() { + do { + var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); + } while (result === 0); + return result; + }; + prng.int32 = xg.next; + prng.quick = prng; + if (state) { + if (typeof state == "object") + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + if (module2 && module2.exports) { + module2.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.xorwow = impl; + } + })(exports, typeof module == "object" && module, typeof define == "function" && define); + }); + var require_xorshift72 = __commonJS2((exports, module) => { + (function(global2, module2, define2) { + function XorGen(seed) { + var me = this; + me.next = function() { + var X = me.x, i = me.i, t, v, w; + t = X[i]; + t ^= t >>> 7; + v = t ^ t << 24; + t = X[i + 1 & 7]; + v ^= t ^ t >>> 10; + t = X[i + 3 & 7]; + v ^= t ^ t >>> 3; + t = X[i + 4 & 7]; + v ^= t ^ t << 7; + t = X[i + 7 & 7]; + t = t ^ t << 13; + v ^= t ^ t << 9; + X[i] = v; + me.i = i + 1 & 7; + return v; + }; + function init2(me2, seed2) { + var j, w, X = []; + if (seed2 === (seed2 | 0)) { + w = X[0] = seed2; + } else { + seed2 = "" + seed2; + for (j = 0; j < seed2.length; ++j) { + X[j & 7] = X[j & 7] << 15 ^ seed2.charCodeAt(j) + X[j + 1 & 7] << 13; + } + } + while (X.length < 8) + X.push(0); + for (j = 0; j < 8 && X[j] === 0; ++j) + ; + if (j == 8) + w = X[7] = -1; + else + w = X[j]; + me2.x = X; + me2.i = 0; + for (j = 256; j > 0; --j) { + me2.next(); + } + } + init2(me, seed); + } + function copy(f, t) { + t.x = f.x.slice(); + t.i = f.i; + return t; + } + function impl(seed, opts) { + if (seed == null) + seed = +new Date(); + var xg = new XorGen(seed), state = opts && opts.state, prng = function() { + return (xg.next() >>> 0) / 4294967296; + }; + prng.double = function() { + do { + var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); + } while (result === 0); + return result; + }; + prng.int32 = xg.next; + prng.quick = prng; + if (state) { + if (state.x) + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + if (module2 && module2.exports) { + module2.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.xorshift7 = impl; + } + })(exports, typeof module == "object" && module, typeof define == "function" && define); + }); + var require_xor40962 = __commonJS2((exports, module) => { + (function(global2, module2, define2) { + function XorGen(seed) { + var me = this; + me.next = function() { + var w = me.w, X = me.X, i = me.i, t, v; + me.w = w = w + 1640531527 | 0; + v = X[i + 34 & 127]; + t = X[i = i + 1 & 127]; + v ^= v << 13; + t ^= t << 17; + v ^= v >>> 15; + t ^= t >>> 12; + v = X[i] = v ^ t; + me.i = i; + return v + (w ^ w >>> 16) | 0; + }; + function init2(me2, seed2) { + var t, v, i, j, w, X = [], limit = 128; + if (seed2 === (seed2 | 0)) { + v = seed2; + seed2 = null; + } else { + seed2 = seed2 + "\0"; + v = 0; + limit = Math.max(limit, seed2.length); + } + for (i = 0, j = -32; j < limit; ++j) { + if (seed2) + v ^= seed2.charCodeAt((j + 32) % seed2.length); + if (j === 0) + w = v; + v ^= v << 10; + v ^= v >>> 15; + v ^= v << 4; + v ^= v >>> 13; + if (j >= 0) { + w = w + 1640531527 | 0; + t = X[j & 127] ^= v + w; + i = t == 0 ? i + 1 : 0; + } + } + if (i >= 128) { + X[(seed2 && seed2.length || 0) & 127] = -1; + } + i = 127; + for (j = 4 * 128; j > 0; --j) { + v = X[i + 34 & 127]; + t = X[i = i + 1 & 127]; + v ^= v << 13; + t ^= t << 17; + v ^= v >>> 15; + t ^= t >>> 12; + X[i] = v ^ t; + } + me2.w = w; + me2.X = X; + me2.i = i; + } + init2(me, seed); + } + function copy(f, t) { + t.i = f.i; + t.w = f.w; + t.X = f.X.slice(); + return t; + } + ; + function impl(seed, opts) { + if (seed == null) + seed = +new Date(); + var xg = new XorGen(seed), state = opts && opts.state, prng = function() { + return (xg.next() >>> 0) / 4294967296; + }; + prng.double = function() { + do { + var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); + } while (result === 0); + return result; + }; + prng.int32 = xg.next; + prng.quick = prng; + if (state) { + if (state.X) + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + if (module2 && module2.exports) { + module2.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.xor4096 = impl; + } + })(exports, typeof module == "object" && module, typeof define == "function" && define); + }); + var require_tychei2 = __commonJS2((exports, module) => { + (function(global2, module2, define2) { + function XorGen(seed) { + var me = this, strseed = ""; + me.next = function() { + var b = me.b, c = me.c, d = me.d, a = me.a; + b = b << 25 ^ b >>> 7 ^ c; + c = c - d | 0; + d = d << 24 ^ d >>> 8 ^ a; + a = a - b | 0; + me.b = b = b << 20 ^ b >>> 12 ^ c; + me.c = c = c - d | 0; + me.d = d << 16 ^ c >>> 16 ^ a; + return me.a = a - b | 0; + }; + me.a = 0; + me.b = 0; + me.c = 2654435769 | 0; + me.d = 1367130551; + if (seed === Math.floor(seed)) { + me.a = seed / 4294967296 | 0; + me.b = seed | 0; + } else { + strseed += seed; + } + for (var k = 0; k < strseed.length + 20; k++) { + me.b ^= strseed.charCodeAt(k) | 0; + me.next(); + } + } + function copy(f, t) { + t.a = f.a; + t.b = f.b; + t.c = f.c; + t.d = f.d; + return t; + } + ; + function impl(seed, opts) { + var xg = new XorGen(seed), state = opts && opts.state, prng = function() { + return (xg.next() >>> 0) / 4294967296; + }; + prng.double = function() { + do { + var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); + } while (result === 0); + return result; + }; + prng.int32 = xg.next; + prng.quick = prng; + if (state) { + if (typeof state == "object") + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + if (module2 && module2.exports) { + module2.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.tychei = impl; + } + })(exports, typeof module == "object" && module, typeof define == "function" && define); + }); + var require_seedrandom3 = __commonJS2((exports, module) => { + (function(global2, pool3, math) { + var width = 256, chunks = 6, digits = 52, rngname = "random", startdenom = math.pow(width, chunks), significance = math.pow(2, digits), overflow = significance * 2, mask = width - 1, nodecrypto; + function seedrandom5(seed, options, callback) { + var key = []; + options = options == true ? {entropy: true} : options || {}; + var shortseed = mixkey(flatten4(options.entropy ? [seed, tostring(pool3)] : seed == null ? autoseed() : seed, 3), key); + var arc4 = new ARC4(key); + var prng = function() { + var n = arc4.g(chunks), d = startdenom, x = 0; + while (n < significance) { + n = (n + x) * width; + d *= width; + x = arc4.g(1); + } + while (n >= overflow) { + n /= 2; + d /= 2; + x >>>= 1; + } + return (n + x) / d; + }; + prng.int32 = function() { + return arc4.g(4) | 0; + }; + prng.quick = function() { + return arc4.g(4) / 4294967296; + }; + prng.double = prng; + mixkey(tostring(arc4.S), pool3); + return (options.pass || callback || function(prng2, seed2, is_math_call, state) { + if (state) { + if (state.S) { + copy(state, arc4); + } + prng2.state = function() { + return copy(arc4, {}); + }; + } + if (is_math_call) { + math[rngname] = prng2; + return seed2; + } else + return prng2; + })(prng, shortseed, "global" in options ? options.global : this == math, options.state); + } + function ARC4(key) { + var t, keylen = key.length, me = this, i = 0, j = me.i = me.j = 0, s = me.S = []; + if (!keylen) { + key = [keylen++]; + } + while (i < width) { + s[i] = i++; + } + for (i = 0; i < width; i++) { + s[i] = s[j = mask & j + key[i % keylen] + (t = s[i])]; + s[j] = t; + } + (me.g = function(count2) { + var t2, r = 0, i2 = me.i, j2 = me.j, s2 = me.S; + while (count2--) { + t2 = s2[i2 = mask & i2 + 1]; + r = r * width + s2[mask & (s2[i2] = s2[j2 = mask & j2 + t2]) + (s2[j2] = t2)]; + } + me.i = i2; + me.j = j2; + return r; + })(width); + } + function copy(f, t) { + t.i = f.i; + t.j = f.j; + t.S = f.S.slice(); + return t; + } + ; + function flatten4(obj, depth) { + var result = [], typ = typeof obj, prop; + if (depth && typ == "object") { + for (prop in obj) { + try { + result.push(flatten4(obj[prop], depth - 1)); + } catch (e) { + } + } + } + return result.length ? result : typ == "string" ? obj : obj + "\0"; + } + function mixkey(seed, key) { + var stringseed = seed + "", smear, j = 0; + while (j < stringseed.length) { + key[mask & j] = mask & (smear ^= key[mask & j] * 19) + stringseed.charCodeAt(j++); + } + return tostring(key); + } + function autoseed() { + try { + var out; + if (nodecrypto && (out = nodecrypto.randomBytes)) { + out = out(width); + } else { + out = new Uint8Array(width); + (global2.crypto || global2.msCrypto).getRandomValues(out); + } + return tostring(out); + } catch (e) { + var browser = global2.navigator, plugins = browser && browser.plugins; + return [+new Date(), global2, plugins, global2.screen, tostring(pool3)]; + } + } + function tostring(a) { + return String.fromCharCode.apply(0, a); + } + mixkey(math.random(), pool3); + if (typeof module == "object" && module.exports) { + module.exports = seedrandom5; + try { + nodecrypto = require_crypto(); + } catch (ex) { + } + } else if (typeof define == "function" && define.amd) { + define(function() { + return seedrandom5; + }); + } else { + math["seed" + rngname] = seedrandom5; + } + })(typeof self !== "undefined" ? self : exports, [], Math); + }); + var require_seedrandom4 = __commonJS2((exports, module) => { + var alea5 = require_alea2(); + var xor128 = require_xor1282(); + var xorwow = require_xorwow2(); + var xorshift7 = require_xorshift72(); + var xor4096 = require_xor40962(); + var tychei = require_tychei2(); + var sr = require_seedrandom3(); + sr.alea = alea5; + sr.xor128 = xor128; + sr.xorwow = xorwow; + sr.xorshift7 = xorshift7; + sr.xor4096 = xor4096; + sr.tychei = tychei; + module.exports = sr; + }); + var require_string_decoder = __commonJS2(() => { + }); + var version = "3.3.0"; + var version2 = "3.3.0"; + var version3 = "3.3.0"; + var version4 = "3.3.0"; + var version5 = "3.3.0"; + /** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + var EPSILON_FLOAT32 = 1e-7; + var EPSILON_FLOAT16 = 1e-4; + var DataStorage = class { + constructor(backend22, dataMover) { + this.backend = backend22; + this.dataMover = dataMover; + this.data = new WeakMap(); + this.dataIdsCount = 0; + } + get(dataId) { + if (!this.data.has(dataId)) { + this.dataMover.moveData(this.backend, dataId); + } + return this.data.get(dataId); + } + set(dataId, value) { + this.dataIdsCount++; + this.data.set(dataId, value); + } + has(dataId) { + return this.data.has(dataId); + } + delete(dataId) { + this.dataIdsCount--; + return this.data.delete(dataId); + } + numDataIds() { + return this.dataIdsCount; + } + }; + var KernelBackend = class { + refCount(dataId) { + return notYetImplemented("refCount"); + } + incRef(dataId) { + return notYetImplemented("incRef"); + } + timerAvailable() { + return true; + } + time(f) { + return notYetImplemented("time"); + } + read(dataId) { + return notYetImplemented("read"); + } + readSync(dataId) { + return notYetImplemented("readSync"); + } + numDataIds() { + return notYetImplemented("numDataIds"); + } + disposeData(dataId, force) { + return notYetImplemented("disposeData"); + } + write(values, shape, dtype) { + return notYetImplemented("write"); + } + move(dataId, values, shape, dtype, refCount) { + return notYetImplemented("move"); + } + memory() { + return notYetImplemented("memory"); + } + floatPrecision() { + return notYetImplemented("floatPrecision"); + } + epsilon() { + return this.floatPrecision() === 32 ? EPSILON_FLOAT32 : EPSILON_FLOAT16; + } + dispose() { + return notYetImplemented("dispose"); + } + }; + function notYetImplemented(kernelName) { + throw new Error(`'${kernelName}' not yet implemented or not found in the registry. This kernel may not be supported by the tfjs backend you have chosen`); + } + /** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + function shuffle(array2) { + let counter = array2.length; + let temp = 0; + let index = 0; + while (counter > 0) { + index = Math.random() * counter | 0; + counter--; + temp = array2[counter]; + array2[counter] = array2[index]; + array2[index] = temp; + } + } + function shuffleCombo(array2, array22) { + if (array2.length !== array22.length) { + throw new Error(`Array sizes must match to be shuffled together First array length was ${array2.length}Second array length was ${array22.length}`); + } + let counter = array2.length; + let temp, temp2; + let index = 0; + while (counter > 0) { + index = Math.random() * counter | 0; + counter--; + temp = array2[counter]; + temp2 = array22[counter]; + array2[counter] = array2[index]; + array22[counter] = array22[index]; + array2[index] = temp; + array22[index] = temp2; + } + } + function clamp(min6, x, max6) { + return Math.max(min6, Math.min(x, max6)); + } + function nearestLargerEven(val) { + return val % 2 === 0 ? val : val + 1; + } + function sum(arr) { + let sum6 = 0; + for (let i = 0; i < arr.length; i++) { + sum6 += arr[i]; + } + return sum6; + } + function randUniform(a, b) { + const r = Math.random(); + return b * r + (1 - r) * a; + } + function distSquared(a, b) { + let result = 0; + for (let i = 0; i < a.length; i++) { + const diff = Number(a[i]) - Number(b[i]); + result += diff * diff; + } + return result; + } + function assert(expr, msg) { + if (!expr) { + throw new Error(typeof msg === "string" ? msg : msg()); + } + } + function assertShapesMatch(shapeA, shapeB, errorMessagePrefix = "") { + assert(arraysEqual(shapeA, shapeB), () => errorMessagePrefix + ` Shapes ${shapeA} and ${shapeB} must match`); + } + function assertNonNull(a) { + assert(a != null, () => `The input to the tensor constructor must be a non-null value.`); + } + function flatten(arr, result = [], skipTypedArray = false) { + if (result == null) { + result = []; + } + if (Array.isArray(arr) || isTypedArray(arr) && !skipTypedArray) { + for (let i = 0; i < arr.length; ++i) { + flatten(arr[i], result, skipTypedArray); + } + } else { + result.push(arr); + } + return result; + } + function sizeFromShape(shape) { + if (shape.length === 0) { + return 1; + } + let size = shape[0]; + for (let i = 1; i < shape.length; i++) { + size *= shape[i]; + } + return size; + } + function isScalarShape(shape) { + return shape.length === 0; + } + function arraysEqual(n1, n2) { + if (n1 === n2) { + return true; + } + if (n1 == null || n2 == null) { + return false; + } + if (n1.length !== n2.length) { + return false; + } + for (let i = 0; i < n1.length; i++) { + if (n1[i] !== n2[i]) { + return false; + } + } + return true; + } + function isInt(a) { + return a % 1 === 0; + } + function tanh(x) { + if (Math.tanh != null) { + return Math.tanh(x); + } + if (x === Infinity) { + return 1; + } else if (x === -Infinity) { + return -1; + } else { + const e2x = Math.exp(2 * x); + return (e2x - 1) / (e2x + 1); + } + } + function sizeToSquarishShape(size) { + const width = Math.ceil(Math.sqrt(size)); + return [width, Math.ceil(size / width)]; + } + function createShuffledIndices(n) { + const shuffledIndices = new Uint32Array(n); + for (let i = 0; i < n; ++i) { + shuffledIndices[i] = i; + } + shuffle(shuffledIndices); + return shuffledIndices; + } + function rightPad(a, size) { + if (size <= a.length) { + return a; + } + return a + " ".repeat(size - a.length); + } + function repeatedTry(checkFn, delayFn = (counter) => 0, maxCounter) { + return new Promise((resolve, reject) => { + let tryCount = 0; + const tryFn = () => { + if (checkFn()) { + resolve(); + return; + } + tryCount++; + const nextBackoff = delayFn(tryCount); + if (maxCounter != null && tryCount >= maxCounter) { + reject(); + return; + } + setTimeout(tryFn, nextBackoff); + }; + tryFn(); + }); + } + function inferFromImplicitShape(shape, size) { + let shapeProd = 1; + let implicitIdx = -1; + for (let i = 0; i < shape.length; ++i) { + if (shape[i] >= 0) { + shapeProd *= shape[i]; + } else if (shape[i] === -1) { + if (implicitIdx !== -1) { + throw Error(`Shapes can only have 1 implicit size. Found -1 at dim ${implicitIdx} and dim ${i}`); + } + implicitIdx = i; + } else if (shape[i] < 0) { + throw Error(`Shapes can not be < 0. Found ${shape[i]} at dim ${i}`); + } + } + if (implicitIdx === -1) { + if (size > 0 && size !== shapeProd) { + throw Error(`Size(${size}) must match the product of shape ${shape}`); + } + return shape; + } + if (shapeProd === 0) { + throw Error(`Cannot infer the missing size in [${shape}] when there are 0 elements`); + } + if (size % shapeProd !== 0) { + throw Error(`The implicit shape can't be a fractional number. Got ${size} / ${shapeProd}`); + } + const newShape = shape.slice(); + newShape[implicitIdx] = size / shapeProd; + return newShape; + } + function parseAxisParam(axis, shape) { + const rank = shape.length; + axis = axis == null ? shape.map((s, i) => i) : [].concat(axis); + assert(axis.every((ax) => ax >= -rank && ax < rank), () => `All values in axis param must be in range [-${rank}, ${rank}) but got axis ${axis}`); + assert(axis.every((ax) => isInt(ax)), () => `All values in axis param must be integers but got axis ${axis}`); + return axis.map((a) => a < 0 ? rank + a : a); + } + function squeezeShape(shape, axis) { + const newShape = []; + const keptDims = []; + const isEmptyArray = axis != null && Array.isArray(axis) && axis.length === 0; + const axes = axis == null || isEmptyArray ? null : parseAxisParam(axis, shape).sort(); + let j = 0; + for (let i = 0; i < shape.length; ++i) { + if (axes != null) { + if (axes[j] === i && shape[i] !== 1) { + throw new Error(`Can't squeeze axis ${i} since its dim '${shape[i]}' is not 1`); + } + if ((axes[j] == null || axes[j] > i) && shape[i] === 1) { + newShape.push(shape[i]); + keptDims.push(i); + } + if (axes[j] <= i) { + j++; + } + } + if (shape[i] !== 1) { + newShape.push(shape[i]); + keptDims.push(i); + } + } + return {newShape, keptDims}; + } + function getTypedArrayFromDType(dtype, size) { + let values = null; + if (dtype == null || dtype === "float32") { + values = new Float32Array(size); + } else if (dtype === "int32") { + values = new Int32Array(size); + } else if (dtype === "bool") { + values = new Uint8Array(size); + } else { + throw new Error(`Unknown data type ${dtype}`); + } + return values; + } + function getArrayFromDType(dtype, size) { + let values = null; + if (dtype == null || dtype === "float32") { + values = new Float32Array(size); + } else if (dtype === "int32") { + values = new Int32Array(size); + } else if (dtype === "bool") { + values = new Uint8Array(size); + } else if (dtype === "string") { + values = new Array(size); + } else { + throw new Error(`Unknown data type ${dtype}`); + } + return values; + } + function checkConversionForErrors(vals, dtype) { + for (let i = 0; i < vals.length; i++) { + const num = vals[i]; + if (isNaN(num) || !isFinite(num)) { + throw Error(`A tensor of type ${dtype} being uploaded contains ${num}.`); + } + } + } + function isValidDtype(dtype) { + return dtype === "bool" || dtype === "complex64" || dtype === "float32" || dtype === "int32" || dtype === "string"; + } + function hasEncodingLoss(oldType, newType) { + if (newType === "complex64") { + return false; + } + if (newType === "float32" && oldType !== "complex64") { + return false; + } + if (newType === "int32" && oldType !== "float32" && oldType !== "complex64") { + return false; + } + if (newType === "bool" && oldType === "bool") { + return false; + } + return true; + } + function isTypedArray(a) { + return a instanceof Float32Array || a instanceof Int32Array || a instanceof Uint8Array; + } + function bytesPerElement(dtype) { + if (dtype === "float32" || dtype === "int32") { + return 4; + } else if (dtype === "complex64") { + return 8; + } else if (dtype === "bool") { + return 1; + } else { + throw new Error(`Unknown dtype ${dtype}`); + } + } + function bytesFromStringArray(arr) { + if (arr == null) { + return 0; + } + let bytes = 0; + arr.forEach((x) => bytes += x.length); + return bytes; + } + function isString(value) { + return typeof value === "string" || value instanceof String; + } + function isBoolean(value) { + return typeof value === "boolean"; + } + function isNumber(value) { + return typeof value === "number"; + } + function inferDtype(values) { + if (Array.isArray(values)) { + return inferDtype(values[0]); + } + if (values instanceof Float32Array) { + return "float32"; + } else if (values instanceof Int32Array || values instanceof Uint8Array) { + return "int32"; + } else if (isNumber(values)) { + return "float32"; + } else if (isString(values)) { + return "string"; + } else if (isBoolean(values)) { + return "bool"; + } + return "float32"; + } + function isFunction(f) { + return !!(f && f.constructor && f.call && f.apply); + } + function nearestDivisor(size, start) { + for (let i = start; i < size; ++i) { + if (size % i === 0) { + return i; + } + } + return size; + } + function computeStrides(shape) { + const rank = shape.length; + if (rank < 2) { + return []; + } + const strides = new Array(rank - 1); + strides[rank - 2] = shape[rank - 1]; + for (let i = rank - 3; i >= 0; --i) { + strides[i] = strides[i + 1] * shape[i + 1]; + } + return strides; + } + function createNestedArray(offset, shape, a) { + const ret = new Array(); + if (shape.length === 1) { + const d = shape[0]; + for (let i = 0; i < d; i++) { + ret[i] = a[offset + i]; + } + } else { + const d = shape[0]; + const rest = shape.slice(1); + const len = rest.reduce((acc, c) => acc * c); + for (let i = 0; i < d; i++) { + ret[i] = createNestedArray(offset + i * len, rest, a); + } + } + return ret; + } + function toNestedArray(shape, a) { + if (shape.length === 0) { + return a[0]; + } + const size = shape.reduce((acc, c) => acc * c); + if (size === 0) { + return []; + } + if (size !== a.length) { + throw new Error(`[${shape}] does not match the input size ${a.length}.`); + } + return createNestedArray(0, shape, a); + } + function makeOnesTypedArray(size, dtype) { + const array2 = makeZerosTypedArray(size, dtype); + for (let i = 0; i < array2.length; i++) { + array2[i] = 1; + } + return array2; + } + function makeZerosTypedArray(size, dtype) { + if (dtype == null || dtype === "float32" || dtype === "complex64") { + return new Float32Array(size); + } else if (dtype === "int32") { + return new Int32Array(size); + } else if (dtype === "bool") { + return new Uint8Array(size); + } else { + throw new Error(`Unknown data type ${dtype}`); + } + } + function makeZerosNestedTypedArray(shape, dtype) { + const size = shape.reduce((prev, curr) => prev * curr, 1); + if (dtype == null || dtype === "float32") { + return toNestedArray(shape, new Float32Array(size)); + } else if (dtype === "int32") { + return toNestedArray(shape, new Int32Array(size)); + } else if (dtype === "bool") { + return toNestedArray(shape, new Uint8Array(size)); + } else { + throw new Error(`Unknown data type ${dtype}`); + } + } + function assertNonNegativeIntegerDimensions(shape) { + shape.forEach((dimSize) => { + assert(Number.isInteger(dimSize) && dimSize >= 0, () => `Tensor must have a shape comprised of positive integers but got shape [${shape}].`); + }); + } + function locToIndex(locs, rank, strides) { + if (rank === 0) { + return 0; + } else if (rank === 1) { + return locs[0]; + } + let index = locs[locs.length - 1]; + for (let i = 0; i < locs.length - 1; ++i) { + index += strides[i] * locs[i]; + } + return index; + } + function indexToLoc(index, rank, strides) { + if (rank === 0) { + return []; + } else if (rank === 1) { + return [index]; + } + const locs = new Array(rank); + for (let i = 0; i < locs.length - 1; ++i) { + locs[i] = Math.floor(index / strides[i]); + index -= locs[i] * strides[i]; + } + locs[locs.length - 1] = index; + return locs; + } + function isPromise(object2) { + return object2 && object2.then && typeof object2.then === "function"; + } + /** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + var TENSORFLOWJS_FLAGS_PREFIX = "tfjsflags"; + var Environment = class { + constructor(global2) { + this.global = global2; + this.flags = {}; + this.flagRegistry = {}; + this.urlFlags = {}; + this.populateURLFlags(); + } + setPlatform(platformName, platform) { + if (this.platform != null) { + console.warn(`Platform ${this.platformName} has already been set. Overwriting the platform with ${platform}.`); + } + this.platformName = platformName; + this.platform = platform; + } + registerFlag(flagName, evaluationFn, setHook) { + this.flagRegistry[flagName] = {evaluationFn, setHook}; + if (this.urlFlags[flagName] != null) { + const flagValue = this.urlFlags[flagName]; + console.warn(`Setting feature override from URL ${flagName}: ${flagValue}.`); + this.set(flagName, flagValue); + } + } + async getAsync(flagName) { + if (flagName in this.flags) { + return this.flags[flagName]; + } + this.flags[flagName] = await this.evaluateFlag(flagName); + return this.flags[flagName]; + } + get(flagName) { + if (flagName in this.flags) { + return this.flags[flagName]; + } + const flagValue = this.evaluateFlag(flagName); + if (isPromise(flagValue)) { + throw new Error(`Flag ${flagName} cannot be synchronously evaluated. Please use getAsync() instead.`); + } + this.flags[flagName] = flagValue; + return this.flags[flagName]; + } + getNumber(flagName) { + return this.get(flagName); + } + getBool(flagName) { + return this.get(flagName); + } + getFlags() { + return this.flags; + } + get features() { + return this.flags; + } + set(flagName, value) { + if (this.flagRegistry[flagName] == null) { + throw new Error(`Cannot set flag ${flagName} as it has not been registered.`); + } + this.flags[flagName] = value; + if (this.flagRegistry[flagName].setHook != null) { + this.flagRegistry[flagName].setHook(value); + } + } + evaluateFlag(flagName) { + if (this.flagRegistry[flagName] == null) { + throw new Error(`Cannot evaluate flag '${flagName}': no evaluation function found.`); + } + return this.flagRegistry[flagName].evaluationFn(); + } + setFlags(flags) { + this.flags = Object.assign({}, flags); + } + reset() { + this.flags = {}; + this.urlFlags = {}; + this.populateURLFlags(); + } + populateURLFlags() { + if (typeof this.global === "undefined" || typeof this.global.location === "undefined" || typeof this.global.location.search === "undefined") { + return; + } + const urlParams = getQueryParams(this.global.location.search); + if (TENSORFLOWJS_FLAGS_PREFIX in urlParams) { + const keyValues = urlParams[TENSORFLOWJS_FLAGS_PREFIX].split(","); + keyValues.forEach((keyValue) => { + const [key, value] = keyValue.split(":"); + this.urlFlags[key] = parseValue(key, value); + }); + } + } + }; + function getQueryParams(queryString) { + const params = {}; + queryString.replace(/[?&]([^=?&]+)(?:=([^&]*))?/g, (s, ...t) => { + decodeParam(params, t[0], t[1]); + return t.join("="); + }); + return params; + } + function decodeParam(params, name, value) { + params[decodeURIComponent(name)] = decodeURIComponent(value || ""); + } + function parseValue(flagName, value) { + value = value.toLowerCase(); + if (value === "true" || value === "false") { + return value === "true"; + } else if (`${+value}` === value) { + return +value; + } + throw new Error(`Could not parse value flag value ${value} for flag ${flagName}.`); + } + function env() { + return ENV; + } + var ENV = null; + function setEnvironmentGlobal(environment) { + ENV = environment; + } + /** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + var globalNameSpace; + function getGlobalNamespace() { + if (globalNameSpace == null) { + let ns; + if (typeof window !== "undefined") { + ns = window; + } else if (typeof global !== "undefined") { + ns = global; + } else if (typeof process !== "undefined") { + ns = process; + } else if (typeof self !== "undefined") { + ns = self; + } else { + throw new Error("Could not find a global object"); + } + globalNameSpace = ns; + } + return globalNameSpace; + } + function getGlobalMap() { + const ns = getGlobalNamespace(); + if (ns._tfGlobals == null) { + ns._tfGlobals = new Map(); + } + return ns._tfGlobals; + } + function getGlobal(key, init2) { + const globalMap = getGlobalMap(); + if (globalMap.has(key)) { + return globalMap.get(key); + } else { + const singleton = init2(); + globalMap.set(key, singleton); + return globalMap.get(key); + } + } + var Abs = "Abs"; + var Acos = "Acos"; + var Acosh = "Acosh"; + var Add = "Add"; + var AddN = "AddN"; + var All = "All"; + var Any = "Any"; + var ArgMax = "ArgMax"; + var ArgMin = "ArgMin"; + var Asin = "Asin"; + var Asinh = "Asinh"; + var Atan = "Atan"; + var Atanh = "Atanh"; + var Atan2 = "Atan2"; + var AvgPool = "AvgPool"; + var AvgPoolGrad = "AvgPoolGrad"; + var AvgPool3D = "AvgPool3D"; + var AvgPool3DGrad = "AvgPool3DGrad"; + var BatchMatMul = "BatchMatMul"; + var BatchToSpaceND = "BatchToSpaceND"; + var Bincount = "Bincount"; + var BroadcastTo = "BroadcastTo"; + var Cast = "Cast"; + var Ceil = "Ceil"; + var ClipByValue = "ClipByValue"; + var Complex = "Complex"; + var ComplexAbs = "ComplexAbs"; + var Concat = "Concat"; + var Conv2D = "Conv2D"; + var Conv2DBackpropFilter = "Conv2DBackpropFilter"; + var Conv2DBackpropInput = "Conv2DBackpropInput"; + var Conv3D = "Conv3D"; + var Conv3DBackpropFilterV2 = "Conv3DBackpropFilterV2"; + var Conv3DBackpropInputV2 = "Conv3DBackpropInputV2"; + var Cos = "Cos"; + var Cosh = "Cosh"; + var Cumsum = "Cumsum"; + var CropAndResize = "CropAndResize"; + var DenseBincount = "DenseBincount"; + var DepthToSpace = "DepthToSpace"; + var DepthwiseConv2dNative = "DepthwiseConv2dNative"; + var DepthwiseConv2dNativeBackpropFilter = "DepthwiseConv2dNativeBackpropFilter"; + var DepthwiseConv2dNativeBackpropInput = "DepthwiseConv2dNativeBackpropInput"; + var Diag = "Diag"; + var Dilation2D = "Dilation2D"; + var Dilation2DBackpropInput = "Dilation2DBackpropInput"; + var Dilation2DBackpropFilter = "Dilation2DBackpropFilter"; + var RealDiv = "RealDiv"; + var Elu = "Elu"; + var EluGrad = "EluGrad"; + var Erf = "Erf"; + var Equal = "Equal"; + var Exp = "Exp"; + var ExpandDims = "ExpandDims"; + var Expm1 = "Expm1"; + var FFT = "FFT"; + var Fill = "Fill"; + var FlipLeftRight = "FlipLeftRight"; + var Floor = "Floor"; + var FloorDiv = "FloorDiv"; + var FusedBatchNorm = "FusedBatchNorm"; + var GatherV2 = "GatherV2"; + var GatherNd = "GatherNd"; + var Greater = "Greater"; + var GreaterEqual = "GreaterEqual"; + var Identity = "Identity"; + var IFFT = "IFFT"; + var Imag = "Imag"; + var IsFinite = "IsFinite"; + var IsInf = "IsInf"; + var IsNan = "IsNan"; + var LeakyRelu = "LeakyRelu"; + var Less = "Less"; + var LessEqual = "LessEqual"; + var LinSpace = "LinSpace"; + var Log = "Log"; + var Log1p = "Log1p"; + var LogicalAnd = "LogicalAnd"; + var LogicalNot = "LogicalNot"; + var LogicalOr = "LogicalOr"; + var LogSoftmax = "LogSoftmax"; + var LRN = "LRN"; + var LRNGrad = "LRNGrad"; + var Max = "Max"; + var Maximum = "Maximum"; + var MaxPool = "MaxPool"; + var MaxPoolGrad = "MaxPoolGrad"; + var MaxPool3D = "MaxPool3D"; + var MaxPool3DGrad = "MaxPool3DGrad"; + var MaxPoolWithArgmax = "MaxPoolWithArgmax"; + var Mean = "Mean"; + var Min = "Min"; + var Minimum = "Minimum"; + var MirrorPad = "MirrorPad"; + var Mod = "Mod"; + var Multinomial = "Multinomial"; + var Multiply = "Multiply"; + var Neg = "Neg"; + var NotEqual = "NotEqual"; + var NonMaxSuppressionV3 = "NonMaxSuppressionV3"; + var NonMaxSuppressionV4 = "NonMaxSuppressionV4"; + var NonMaxSuppressionV5 = "NonMaxSuppressionV5"; + var OnesLike = "OnesLike"; + var OneHot = "OneHot"; + var Pack = "Pack"; + var PadV2 = "PadV2"; + var Pool = "Pool"; + var Pow = "Pow"; + var Prelu = "Prelu"; + var Prod = "Prod"; + var Range = "Range"; + var Real = "Real"; + var Reciprocal = "Reciprocal"; + var Relu = "Relu"; + var Reshape = "Reshape"; + var ResizeNearestNeighbor = "ResizeNearestNeighbor"; + var ResizeNearestNeighborGrad = "ResizeNearestNeighborGrad"; + var ResizeBilinear = "ResizeBilinear"; + var ResizeBilinearGrad = "ResizeBilinearGrad"; + var Relu6 = "Relu6"; + var Reverse = "Reverse"; + var Round = "Round"; + var Rsqrt = "Rsqrt"; + var ScatterNd = "ScatterNd"; + var Select = "Select"; + var Selu = "Selu"; + var Slice = "Slice"; + var Sin = "Sin"; + var Sinh = "Sinh"; + var Sign = "Sign"; + var Sigmoid = "Sigmoid"; + var Softplus = "Softplus"; + var Sqrt = "Sqrt"; + var Sum = "Sum"; + var SpaceToBatchND = "SpaceToBatchND"; + var SplitV = "SplitV"; + var Softmax = "Softmax"; + var SquaredDifference = "SquaredDifference"; + var Square = "Square"; + var Sub = "Sub"; + var SparseToDense = "SparseToDense"; + var StridedSlice = "StridedSlice"; + var Tan = "Tan"; + var Tanh = "Tanh"; + var Tile = "Tile"; + var TopK = "TopK"; + var Transform = "Transform"; + var Transpose = "Transpose"; + var Unique = "Unique"; + var Unpack = "Unpack"; + var UnsortedSegmentSum = "UnsortedSegmentSum"; + var ZerosLike = "ZerosLike"; + var Step = "Step"; + var FromPixels = "FromPixels"; + var RotateWithOffset = "RotateWithOffset"; + var _FusedMatMul = "_FusedMatMul"; + var FusedConv2D = "FusedConv2D"; + var FusedDepthwiseConv2D = "FusedDepthwiseConv2D"; + /** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + var kernelRegistry = getGlobal("kernelRegistry", () => new Map()); + var gradRegistry = getGlobal("gradRegistry", () => new Map()); + function getKernel(kernelName, backendName) { + const key = makeKey(kernelName, backendName); + return kernelRegistry.get(key); + } + function getGradient(kernelName) { + return gradRegistry.get(kernelName); + } + function getKernelsForBackend(backendName) { + const it = kernelRegistry.entries(); + const result = []; + while (true) { + const {done, value} = it.next(); + if (done) { + break; + } + const [key, config3] = value; + const [backend22] = key.split("_"); + if (backend22 === backendName) { + result.push(config3); + } + } + return result; + } + function registerKernel(config3) { + const {kernelName, backendName} = config3; + const key = makeKey(kernelName, backendName); + if (kernelRegistry.has(key)) { + console.warn(`The kernel '${kernelName}' for backend '${backendName}' is already registered`); + } + kernelRegistry.set(key, config3); + } + function registerGradient(config3) { + const {kernelName} = config3; + if (gradRegistry.has(kernelName)) { + if (env().getBool("DEBUG")) { + console.warn(`Overriding the gradient for '${kernelName}'`); + } + } + gradRegistry.set(kernelName, config3); + } + function unregisterKernel(kernelName, backendName) { + const key = makeKey(kernelName, backendName); + if (!kernelRegistry.has(key)) { + throw new Error(`The kernel '${kernelName}' for backend '${backendName}' is not registered`); + } + kernelRegistry.delete(key); + } + function unregisterGradient(kernelName) { + if (!gradRegistry.has(kernelName)) { + throw new Error(`The gradient '${kernelName}' for backend is not registered`); + } + gradRegistry.delete(kernelName); + } + function copyRegisteredKernels(registeredBackendName, newBackendName) { + const kernels = getKernelsForBackend(registeredBackendName); + kernels.forEach((kernelConfig) => { + const newKernelConfig = Object.assign({}, kernelConfig, {backendName: newBackendName}); + registerKernel(newKernelConfig); + }); + } + function makeKey(kernelName, backendName) { + return `${backendName}_${kernelName}`; + } + var util_exports = {}; + __export2(util_exports, { + arraysEqual: () => arraysEqual, + assert: () => assert, + assertNonNegativeIntegerDimensions: () => assertNonNegativeIntegerDimensions, + assertNonNull: () => assertNonNull, + assertShapesMatch: () => assertShapesMatch, + bytesFromStringArray: () => bytesFromStringArray, + bytesPerElement: () => bytesPerElement, + checkConversionForErrors: () => checkConversionForErrors, + clamp: () => clamp, + computeStrides: () => computeStrides, + createScalarValue: () => createScalarValue, + createShuffledIndices: () => createShuffledIndices, + decodeString: () => decodeString, + distSquared: () => distSquared, + encodeString: () => encodeString, + fetch: () => fetch2, + flatten: () => flatten, + getArrayFromDType: () => getArrayFromDType, + getTypedArrayFromDType: () => getTypedArrayFromDType, + hasEncodingLoss: () => hasEncodingLoss, + indexToLoc: () => indexToLoc, + inferDtype: () => inferDtype, + inferFromImplicitShape: () => inferFromImplicitShape, + isBoolean: () => isBoolean, + isFunction: () => isFunction, + isInt: () => isInt, + isNumber: () => isNumber, + isPromise: () => isPromise, + isScalarShape: () => isScalarShape, + isString: () => isString, + isTypedArray: () => isTypedArray, + isValidDtype: () => isValidDtype, + locToIndex: () => locToIndex, + makeOnesTypedArray: () => makeOnesTypedArray, + makeZerosNestedTypedArray: () => makeZerosNestedTypedArray, + makeZerosTypedArray: () => makeZerosTypedArray, + nearestDivisor: () => nearestDivisor, + nearestLargerEven: () => nearestLargerEven, + now: () => now2, + parseAxisParam: () => parseAxisParam, + randUniform: () => randUniform, + repeatedTry: () => repeatedTry, + rightPad: () => rightPad, + shuffle: () => shuffle, + shuffleCombo: () => shuffleCombo, + sizeFromShape: () => sizeFromShape, + sizeToSquarishShape: () => sizeToSquarishShape, + squeezeShape: () => squeezeShape, + sum: () => sum, + tanh: () => tanh, + toNestedArray: () => toNestedArray, + toTypedArray: () => toTypedArray + }); + /** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + function createScalarValue(value, dtype) { + if (dtype === "string") { + return encodeString(value); + } + return toTypedArray([value], dtype); + } + function noConversionNeeded(a, dtype) { + return a instanceof Float32Array && dtype === "float32" || a instanceof Int32Array && dtype === "int32" || a instanceof Uint8Array && dtype === "bool"; + } + function toTypedArray(a, dtype) { + if (dtype === "string") { + throw new Error("Cannot convert a string[] to a TypedArray"); + } + if (Array.isArray(a)) { + a = flatten(a); + } + if (env().getBool("DEBUG")) { + checkConversionForErrors(a, dtype); + } + if (noConversionNeeded(a, dtype)) { + return a; + } + if (dtype == null || dtype === "float32" || dtype === "complex64") { + return new Float32Array(a); + } else if (dtype === "int32") { + return new Int32Array(a); + } else if (dtype === "bool") { + const bool = new Uint8Array(a.length); + for (let i = 0; i < bool.length; ++i) { + if (Math.round(a[i]) !== 0) { + bool[i] = 1; + } + } + return bool; + } else { + throw new Error(`Unknown data type ${dtype}`); + } + } + function now2() { + return env().platform.now(); + } + function fetch2(path, requestInits) { + return env().platform.fetch(path, requestInits); + } + function encodeString(s, encoding = "utf-8") { + encoding = encoding || "utf-8"; + return env().platform.encode(s, encoding); + } + function decodeString(bytes, encoding = "utf-8") { + encoding = encoding || "utf-8"; + return env().platform.decode(bytes, encoding); + } + /** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + var Profiler = class { + constructor(backendTimer, logger) { + this.backendTimer = backendTimer; + this.logger = logger; + if (logger == null) { + this.logger = new Logger(); + } + } + profileKernel(kernelName, inputs, f) { + let outputs; + const holdResultWrapperFn = () => { + outputs = f(); + }; + let timer; + const start = now2(); + if (this.backendTimer.timerAvailable()) { + timer = this.backendTimer.time(holdResultWrapperFn); + } else { + holdResultWrapperFn(); + for (const output of outputs) { + output.dataSync(); + } + timer = Promise.resolve({kernelMs: now2() - start}); + } + if (env().getBool("CHECK_COMPUTATION_FOR_ERRORS")) { + for (let i = 0; i < outputs.length; i++) { + const output = outputs[i]; + output.data().then((tensorVals) => { + checkComputationForErrors(tensorVals, output.dtype, kernelName); + }); + } + } + const kernelProfile = { + kernelName, + outputs, + inputs, + timeMs: timer.then((timing) => timing.kernelMs), + extraInfo: timer.then((timing) => timing.getExtraProfileInfo != null ? timing.getExtraProfileInfo() : "") + }; + return kernelProfile; + } + logKernelProfile(kernelProfile) { + const {kernelName, outputs, timeMs, inputs, extraInfo} = kernelProfile; + outputs.forEach((result) => { + Promise.all([result.data(), timeMs, extraInfo]).then((valueContainer) => { + this.logger.logKernelProfile(kernelName, result, valueContainer[0], valueContainer[1], inputs, valueContainer[2]); + }); + }); + } + }; + function checkComputationForErrors(vals, dtype, kernelName) { + if (dtype !== "float32") { + return false; + } + for (let i = 0; i < vals.length; i++) { + const num = vals[i]; + if (isNaN(num) || !isFinite(num)) { + console.warn(`Found ${num} in the result of '${kernelName}'`); + return true; + } + } + return false; + } + var Logger = class { + logKernelProfile(name, result, vals, timeMs, inputs, extraInfo) { + const time2 = typeof timeMs === "number" ? rightPad(`${timeMs}ms`, 9) : timeMs["error"]; + const paddedName = rightPad(name, 25); + const rank = result.rank; + const size = result.size; + const shape = rightPad(result.shape.toString(), 14); + let inputShapesDescription = ""; + for (const name2 in inputs) { + const input2 = inputs[name2]; + if (input2 != null) { + const inputShape = input2.shape || result.shape; + const inputRank = inputShape.length; + inputShapesDescription += `${name2}: ${inputRank}D ${inputRank > 0 ? inputShape : ""} `; + } + } + console.log(`%c${paddedName} %c${time2} %c${rank}D ${shape} %c${size} %c${inputShapesDescription} %c${extraInfo}`, "font-weight:bold", "color:red", "color:blue", "color: orange", "color: green", "color: steelblue"); + } + }; + /** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + function getFilteredNodesXToY(tape, xs, y) { + const tensorsFromX = {}; + const nodesFromX = {}; + for (let i = 0; i < xs.length; i++) { + tensorsFromX[xs[i].id] = true; + } + for (let i = 0; i < tape.length; i++) { + const node = tape[i]; + const nodeInputs = node.inputs; + for (const inputName in nodeInputs) { + const input2 = nodeInputs[inputName]; + let anyInputFromX = false; + for (let j = 0; j < xs.length; j++) { + if (tensorsFromX[input2.id]) { + node.outputs.forEach((output) => tensorsFromX[output.id] = true); + anyInputFromX = true; + nodesFromX[node.id] = true; + break; + } + } + if (anyInputFromX) { + break; + } + } + } + const tensorsLeadToY = {}; + tensorsLeadToY[y.id] = true; + const nodesToY = {}; + for (let i = tape.length - 1; i >= 0; i--) { + const node = tape[i]; + const nodeInputs = node.inputs; + for (let j = 0; j < node.outputs.length; j++) { + if (tensorsLeadToY[node.outputs[j].id]) { + for (const inputName in nodeInputs) { + tensorsLeadToY[nodeInputs[inputName].id] = true; + nodesToY[node.id] = true; + } + break; + } + } + } + const filteredTape = []; + for (let i = 0; i < tape.length; i++) { + const node = tape[i]; + if (nodesFromX[node.id] && nodesToY[node.id]) { + const prunedInputs = {}; + for (const inputName in node.inputs) { + const nodeInput = node.inputs[inputName]; + if (tensorsFromX[nodeInput.id]) { + prunedInputs[inputName] = nodeInput; + } + } + const prunedNode = Object.assign({}, node); + prunedNode.inputs = prunedInputs; + prunedNode.outputs = node.outputs; + filteredTape.push(prunedNode); + } + } + return filteredTape; + } + function backpropagateGradients(tensorAccumulatedGradientMap, filteredTape, tidy2, add5) { + for (let i = filteredTape.length - 1; i >= 0; i--) { + const node = filteredTape[i]; + const dys = []; + node.outputs.forEach((o) => { + const gradTensor = tensorAccumulatedGradientMap[o.id]; + if (gradTensor != null) { + dys.push(gradTensor); + } else { + dys.push(null); + } + }); + if (node.gradient == null) { + throw new Error(`Cannot compute gradient: gradient function not found for ${node.kernelName}.`); + } + const inputGradients = node.gradient(dys); + for (const inputName in node.inputs) { + if (!(inputName in inputGradients)) { + throw new Error(`Cannot backprop through input ${inputName}. Available gradients found: ${Object.keys(inputGradients)}.`); + } + const dx = tidy2(() => inputGradients[inputName]()); + if (dx.dtype !== "float32") { + throw new Error(`Error in gradient for op ${node.kernelName}. The gradient of input ${inputName} must have 'float32' dtype, but has '${dx.dtype}'`); + } + const x = node.inputs[inputName]; + if (!arraysEqual(dx.shape, x.shape)) { + throw new Error(`Error in gradient for op ${node.kernelName}. The gradient of input '${inputName}' has shape '${dx.shape}', which does not match the shape of the input '${x.shape}'`); + } + if (tensorAccumulatedGradientMap[x.id] == null) { + tensorAccumulatedGradientMap[x.id] = dx; + } else { + const curGradient = tensorAccumulatedGradientMap[x.id]; + tensorAccumulatedGradientMap[x.id] = add5(curGradient, dx); + curGradient.dispose(); + } + } + } + } + /** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + var FORMAT_LIMIT_NUM_VALS = 20; + var FORMAT_NUM_FIRST_LAST_VALS = 3; + var FORMAT_NUM_SIG_DIGITS = 7; + function tensorToString(vals, shape, dtype, verbose) { + const strides = computeStrides(shape); + const padPerCol = computeMaxSizePerColumn(vals, shape, dtype, strides); + const rank = shape.length; + const valsLines = subTensorToString(vals, shape, dtype, strides, padPerCol); + const lines2 = ["Tensor"]; + if (verbose) { + lines2.push(` dtype: ${dtype}`); + lines2.push(` rank: ${rank}`); + lines2.push(` shape: [${shape}]`); + lines2.push(` values:`); + } + lines2.push(valsLines.map((l) => " " + l).join("\n")); + return lines2.join("\n"); + } + function computeMaxSizePerColumn(vals, shape, dtype, strides) { + const n = sizeFromShape(shape); + const numCols = strides[strides.length - 1]; + const padPerCol = new Array(numCols).fill(0); + const rank = shape.length; + const valuesOrTuples = dtype === "complex64" ? createComplexTuples(vals) : vals; + if (rank > 1) { + for (let row = 0; row < n / numCols; row++) { + const offset = row * numCols; + for (let j = 0; j < numCols; j++) { + padPerCol[j] = Math.max(padPerCol[j], valToString(valuesOrTuples[offset + j], 0, dtype).length); + } + } + } + return padPerCol; + } + function valToString(val, pad3, dtype) { + let valStr; + if (Array.isArray(val)) { + valStr = `${parseFloat(val[0].toFixed(FORMAT_NUM_SIG_DIGITS))} + ${parseFloat(val[1].toFixed(FORMAT_NUM_SIG_DIGITS))}j`; + } else if (isString(val)) { + valStr = `'${val}'`; + } else if (dtype === "bool") { + valStr = boolNumToString(val); + } else { + valStr = parseFloat(val.toFixed(FORMAT_NUM_SIG_DIGITS)).toString(); + } + return rightPad(valStr, pad3); + } + function boolNumToString(v) { + return v === 0 ? "false" : "true"; + } + function subTensorToString(vals, shape, dtype, strides, padPerCol, isLast = true) { + const storagePerElement = dtype === "complex64" ? 2 : 1; + const size = shape[0]; + const rank = shape.length; + if (rank === 0) { + if (dtype === "complex64") { + const complexTuple = createComplexTuples(vals); + return [valToString(complexTuple[0], 0, dtype)]; + } + if (dtype === "bool") { + return [boolNumToString(vals[0])]; + } + return [vals[0].toString()]; + } + if (rank === 1) { + if (size > FORMAT_LIMIT_NUM_VALS) { + const firstValsSize = FORMAT_NUM_FIRST_LAST_VALS * storagePerElement; + let firstVals = Array.from(vals.slice(0, firstValsSize)); + let lastVals = Array.from(vals.slice((size - FORMAT_NUM_FIRST_LAST_VALS) * storagePerElement, size * storagePerElement)); + if (dtype === "complex64") { + firstVals = createComplexTuples(firstVals); + lastVals = createComplexTuples(lastVals); + } + return [ + "[" + firstVals.map((x, i) => valToString(x, padPerCol[i], dtype)).join(", ") + ", ..., " + lastVals.map((x, i) => valToString(x, padPerCol[size - FORMAT_NUM_FIRST_LAST_VALS + i], dtype)).join(", ") + "]" + ]; + } + const displayVals = dtype === "complex64" ? createComplexTuples(vals) : Array.from(vals); + return [ + "[" + displayVals.map((x, i) => valToString(x, padPerCol[i], dtype)).join(", ") + "]" + ]; + } + const subshape = shape.slice(1); + const substrides = strides.slice(1); + const stride = strides[0] * storagePerElement; + const lines2 = []; + if (size > FORMAT_LIMIT_NUM_VALS) { + for (let i = 0; i < FORMAT_NUM_FIRST_LAST_VALS; i++) { + const start = i * stride; + const end = start + stride; + lines2.push(...subTensorToString(vals.slice(start, end), subshape, dtype, substrides, padPerCol, false)); + } + lines2.push("..."); + for (let i = size - FORMAT_NUM_FIRST_LAST_VALS; i < size; i++) { + const start = i * stride; + const end = start + stride; + lines2.push(...subTensorToString(vals.slice(start, end), subshape, dtype, substrides, padPerCol, i === size - 1)); + } + } else { + for (let i = 0; i < size; i++) { + const start = i * stride; + const end = start + stride; + lines2.push(...subTensorToString(vals.slice(start, end), subshape, dtype, substrides, padPerCol, i === size - 1)); + } + } + const sep = rank === 2 ? "," : ""; + lines2[0] = "[" + lines2[0] + sep; + for (let i = 1; i < lines2.length - 1; i++) { + lines2[i] = " " + lines2[i] + sep; + } + let newLineSep = ",\n"; + for (let i = 2; i < rank; i++) { + newLineSep += "\n"; + } + lines2[lines2.length - 1] = " " + lines2[lines2.length - 1] + "]" + (isLast ? "" : newLineSep); + return lines2; + } + function createComplexTuples(vals) { + const complexTuples = []; + for (let i = 0; i < vals.length; i += 2) { + complexTuples.push([vals[i], vals[i + 1]]); + } + return complexTuples; + } + /** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + var TensorBuffer = class { + constructor(shape, dtype, values) { + this.dtype = dtype; + this.shape = shape.slice(); + this.size = sizeFromShape(shape); + if (values != null) { + const n = values.length; + assert(n === this.size, () => `Length of values '${n}' does not match the size inferred by the shape '${this.size}'.`); + } + if (dtype === "complex64") { + throw new Error(`complex64 dtype TensorBuffers are not supported. Please create a TensorBuffer for the real and imaginary parts separately and call tf.complex(real, imag).`); + } + this.values = values || getArrayFromDType(dtype, this.size); + this.strides = computeStrides(shape); + } + set(value, ...locs) { + if (locs.length === 0) { + locs = [0]; + } + assert(locs.length === this.rank, () => `The number of provided coordinates (${locs.length}) must match the rank (${this.rank})`); + const index = this.locToIndex(locs); + this.values[index] = value; + } + get(...locs) { + if (locs.length === 0) { + locs = [0]; + } + let i = 0; + for (const loc of locs) { + if (loc < 0 || loc >= this.shape[i]) { + const msg = `Requested out of range element at ${locs}. Buffer shape=${this.shape}`; + throw new Error(msg); + } + i++; + } + let index = locs[locs.length - 1]; + for (let i2 = 0; i2 < locs.length - 1; ++i2) { + index += this.strides[i2] * locs[i2]; + } + return this.values[index]; + } + locToIndex(locs) { + if (this.rank === 0) { + return 0; + } else if (this.rank === 1) { + return locs[0]; + } + let index = locs[locs.length - 1]; + for (let i = 0; i < locs.length - 1; ++i) { + index += this.strides[i] * locs[i]; + } + return index; + } + indexToLoc(index) { + if (this.rank === 0) { + return []; + } else if (this.rank === 1) { + return [index]; + } + const locs = new Array(this.shape.length); + for (let i = 0; i < locs.length - 1; ++i) { + locs[i] = Math.floor(index / this.strides[i]); + index -= locs[i] * this.strides[i]; + } + locs[locs.length - 1] = index; + return locs; + } + get rank() { + return this.shape.length; + } + toTensor() { + return trackerFn().makeTensor(this.values, this.shape, this.dtype); + } + }; + var trackerFn = null; + var opHandler = null; + var deprecationWarningFn = null; + function setTensorTracker(fn) { + trackerFn = fn; + } + function setOpHandler(handler) { + opHandler = handler; + } + function setDeprecationWarningFn(fn) { + deprecationWarningFn = fn; + } + var Tensor = class { + constructor(shape, dtype, dataId, id) { + this.kept = false; + this.isDisposedInternal = false; + this.shape = shape.slice(); + this.dtype = dtype || "float32"; + this.size = sizeFromShape(shape); + this.strides = computeStrides(shape); + this.dataId = dataId; + this.id = id; + this.rankType = this.rank < 5 ? this.rank.toString() : "higher"; + } + get rank() { + return this.shape.length; + } + async buffer() { + const vals = await this.data(); + return opHandler.buffer(this.shape, this.dtype, vals); + } + bufferSync() { + return opHandler.buffer(this.shape, this.dtype, this.dataSync()); + } + async array() { + const vals = await this.data(); + return toNestedArray(this.shape, vals); + } + arraySync() { + return toNestedArray(this.shape, this.dataSync()); + } + async data() { + this.throwIfDisposed(); + const data2 = trackerFn().read(this.dataId); + if (this.dtype === "string") { + const bytes = await data2; + try { + return bytes.map((b) => decodeString(b)); + } catch (_a) { + throw new Error("Failed to decode the string bytes into utf-8. To get the original bytes, call tensor.bytes()."); + } + } + return data2; + } + dataSync() { + this.throwIfDisposed(); + const data2 = trackerFn().readSync(this.dataId); + if (this.dtype === "string") { + try { + return data2.map((b) => decodeString(b)); + } catch (_a) { + throw new Error("Failed to decode the string bytes into utf-8. To get the original bytes, call tensor.bytes()."); + } + } + return data2; + } + async bytes() { + this.throwIfDisposed(); + const data2 = await trackerFn().read(this.dataId); + if (this.dtype === "string") { + return data2; + } else { + return new Uint8Array(data2.buffer); + } + } + dispose() { + if (this.isDisposed) { + return; + } + trackerFn().disposeTensor(this); + this.isDisposedInternal = true; + } + get isDisposed() { + return this.isDisposedInternal; + } + throwIfDisposed() { + if (this.isDisposed) { + throw new Error(`Tensor is disposed.`); + } + } + print(verbose = false) { + return opHandler.print(this, verbose); + } + clone() { + this.throwIfDisposed(); + return opHandler.clone(this); + } + toString(verbose = false) { + const vals = this.dataSync(); + return tensorToString(vals, this.shape, this.dtype, verbose); + } + cast(dtype) { + this.throwIfDisposed(); + return opHandler.cast(this, dtype); + } + variable(trainable = true, name, dtype) { + this.throwIfDisposed(); + return trackerFn().makeVariable(this, trainable, name, dtype); + } + }; + Object.defineProperty(Tensor, Symbol.hasInstance, { + value: (instance) => { + return !!instance && instance.data != null && instance.dataSync != null && instance.throwIfDisposed != null; + } + }); + function getGlobalTensorClass() { + return getGlobal("Tensor", () => { + return Tensor; + }); + } + getGlobalTensorClass(); + var Variable = class extends Tensor { + constructor(initialValue, trainable, name, tensorId) { + super(initialValue.shape, initialValue.dtype, initialValue.dataId, tensorId); + this.trainable = trainable; + this.name = name; + } + assign(newValue) { + if (newValue.dtype !== this.dtype) { + throw new Error(`dtype of the new value (${newValue.dtype}) and previous value (${this.dtype}) must match`); + } + if (!arraysEqual(newValue.shape, this.shape)) { + throw new Error(`shape of the new value (${newValue.shape}) and previous value (${this.shape}) must match`); + } + trackerFn().disposeTensor(this); + this.dataId = newValue.dataId; + trackerFn().incRef(this, null); + } + dispose() { + trackerFn().disposeVariable(this); + this.isDisposedInternal = true; + } + }; + Object.defineProperty(Variable, Symbol.hasInstance, { + value: (instance) => { + return instance instanceof Tensor && instance.assign != null && instance.assign instanceof Function; + } + }); + var tensor_util_exports = {}; + __export2(tensor_util_exports, { + assertTypesMatch: () => assertTypesMatch, + getTensorsInContainer: () => getTensorsInContainer, + isTensorInList: () => isTensorInList, + makeTypesMatch: () => makeTypesMatch + }); + /** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + var Rank; + (function(Rank2) { + Rank2["R0"] = "R0"; + Rank2["R1"] = "R1"; + Rank2["R2"] = "R2"; + Rank2["R3"] = "R3"; + Rank2["R4"] = "R4"; + Rank2["R5"] = "R5"; + Rank2["R6"] = "R6"; + })(Rank || (Rank = {})); + var UpcastInt32AndMap; + (function(UpcastInt32AndMap2) { + UpcastInt32AndMap2["float32"] = "float32"; + UpcastInt32AndMap2["int32"] = "int32"; + UpcastInt32AndMap2["bool"] = "int32"; + UpcastInt32AndMap2["complex64"] = "complex64"; + })(UpcastInt32AndMap || (UpcastInt32AndMap = {})); + var UpcastBoolAndMap; + (function(UpcastBoolAndMap2) { + UpcastBoolAndMap2["float32"] = "float32"; + UpcastBoolAndMap2["int32"] = "int32"; + UpcastBoolAndMap2["bool"] = "bool"; + UpcastBoolAndMap2["complex64"] = "complex64"; + })(UpcastBoolAndMap || (UpcastBoolAndMap = {})); + var UpcastFloat32AndMap; + (function(UpcastFloat32AndMap2) { + UpcastFloat32AndMap2["float32"] = "float32"; + UpcastFloat32AndMap2["int32"] = "float32"; + UpcastFloat32AndMap2["bool"] = "float32"; + UpcastFloat32AndMap2["complex64"] = "complex64"; + })(UpcastFloat32AndMap || (UpcastFloat32AndMap = {})); + var UpcastComplex64AndMap; + (function(UpcastComplex64AndMap2) { + UpcastComplex64AndMap2["float32"] = "complex64"; + UpcastComplex64AndMap2["int32"] = "complex64"; + UpcastComplex64AndMap2["bool"] = "complex64"; + UpcastComplex64AndMap2["complex64"] = "complex64"; + })(UpcastComplex64AndMap || (UpcastComplex64AndMap = {})); + var upcastTypeMap = { + float32: UpcastFloat32AndMap, + int32: UpcastInt32AndMap, + bool: UpcastBoolAndMap, + complex64: UpcastComplex64AndMap + }; + function upcastType(typeA, typeB) { + if (typeA === "string" || typeB === "string") { + if (typeA === "string" && typeB === "string") { + return "string"; + } + throw new Error(`Can not upcast ${typeA} with ${typeB}`); + } + return upcastTypeMap[typeA][typeB]; + } + function sumOutType(type) { + return upcastType(type, "int32"); + } + /** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + function makeTypesMatch(a, b) { + if (a.dtype === b.dtype) { + return [a, b]; + } + const dtype = upcastType(a.dtype, b.dtype); + return [a.cast(dtype), b.cast(dtype)]; + } + function assertTypesMatch(a, b) { + assert(a.dtype === b.dtype, () => `The dtypes of the first(${a.dtype}) and second(${b.dtype}) input must match`); + } + function isTensorInList(tensor2, tensorList) { + return tensorList.some((x) => x.id === tensor2.id); + } + function getTensorsInContainer(result) { + const list = []; + const seen = new Set(); + walkTensorContainer(result, list, seen); + return list; + } + function walkTensorContainer(container, list, seen) { + if (container == null) { + return; + } + if (container instanceof Tensor) { + list.push(container); + return; + } + if (!isIterable(container)) { + return; + } + const iterable = container; + for (const k in iterable) { + const val = iterable[k]; + if (!seen.has(val)) { + seen.add(val); + walkTensorContainer(val, list, seen); + } + } + } + function isIterable(obj) { + return Array.isArray(obj) || typeof obj === "object"; + } + /** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + function isRegisteredKernelInvocation(kernelInvocation) { + return kernelInvocation.kernelName != null; + } + var EngineState = class { + constructor() { + this.registeredVariables = {}; + this.nextTapeNodeId = 0; + this.numBytes = 0; + this.numTensors = 0; + this.numStringTensors = 0; + this.numDataBuffers = 0; + this.gradientDepth = 0; + this.kernelDepth = 0; + this.scopeStack = []; + this.numDataMovesStack = []; + this.nextScopeId = 0; + this.tensorInfo = new WeakMap(); + this.profiling = false; + this.activeProfile = { + newBytes: 0, + newTensors: 0, + peakBytes: 0, + kernels: [], + result: null, + get kernelNames() { + return Array.from(new Set(this.kernels.map((k) => k.name))); + } + }; + } + dispose() { + for (const variableName in this.registeredVariables) { + this.registeredVariables[variableName].dispose(); + } + } + }; + var Engine = class { + constructor(ENV5) { + this.ENV = ENV5; + this.registry = {}; + this.registryFactory = {}; + this.pendingBackendInitId = 0; + this.state = new EngineState(); + } + async ready() { + if (this.pendingBackendInit != null) { + return this.pendingBackendInit.then(() => { + }); + } + if (this.backendInstance != null) { + return; + } + const sortedBackends = this.getSortedBackends(); + for (let i = 0; i < sortedBackends.length; i++) { + const backendName = sortedBackends[i]; + const success = await this.initializeBackend(backendName).success; + if (success) { + await this.setBackend(backendName); + return; + } + } + throw new Error(`Could not initialize any backends, all backend initializations failed.`); + } + get backend() { + if (this.pendingBackendInit != null) { + throw new Error(`Backend '${this.backendName}' has not yet been initialized. Make sure to await tf.ready() or await tf.setBackend() before calling other methods`); + } + if (this.backendInstance == null) { + const {name, asyncInit} = this.initializeBackendsAndReturnBest(); + if (asyncInit) { + throw new Error(`The highest priority backend '${name}' has not yet been initialized. Make sure to await tf.ready() or await tf.setBackend() before calling other methods`); + } + this.setBackend(name); + } + return this.backendInstance; + } + backendNames() { + return Object.keys(this.registryFactory); + } + findBackend(backendName) { + if (!(backendName in this.registry)) { + if (backendName in this.registryFactory) { + const {asyncInit} = this.initializeBackend(backendName); + if (asyncInit) { + return null; + } + } else { + return null; + } + } + return this.registry[backendName]; + } + findBackendFactory(backendName) { + if (!(backendName in this.registryFactory)) { + return null; + } + return this.registryFactory[backendName].factory; + } + registerBackend(backendName, factory, priority = 1) { + if (backendName in this.registryFactory) { + console.warn(`${backendName} backend was already registered. Reusing existing backend factory.`); + return false; + } + this.registryFactory[backendName] = {factory, priority}; + return true; + } + async setBackend(backendName) { + if (this.registryFactory[backendName] == null) { + throw new Error(`Backend name '${backendName}' not found in registry`); + } + this.backendName = backendName; + if (this.registry[backendName] == null) { + this.backendInstance = null; + const {success, asyncInit} = this.initializeBackend(backendName); + const result = asyncInit ? await success : success; + if (!result) { + return false; + } + } + this.backendInstance = this.registry[backendName]; + this.setupRegisteredKernels(); + this.profiler = new Profiler(this.backendInstance); + return true; + } + setupRegisteredKernels() { + const kernels = getKernelsForBackend(this.backendName); + kernels.forEach((kernel) => { + if (kernel.setupFunc != null) { + kernel.setupFunc(this.backendInstance); + } + }); + } + disposeRegisteredKernels(backendName) { + const kernels = getKernelsForBackend(backendName); + kernels.forEach((kernel) => { + if (kernel.disposeFunc != null) { + kernel.disposeFunc(this.registry[backendName]); + } + }); + } + initializeBackend(backendName) { + const registryFactoryEntry = this.registryFactory[backendName]; + if (registryFactoryEntry == null) { + throw new Error(`Cannot initialize backend ${backendName}, no registration found.`); + } + try { + const backend22 = registryFactoryEntry.factory(); + if (backend22 && !(backend22 instanceof KernelBackend) && typeof backend22.then === "function") { + const promiseId = ++this.pendingBackendInitId; + const success = backend22.then((backendInstance) => { + if (promiseId < this.pendingBackendInitId) { + return false; + } + this.registry[backendName] = backendInstance; + this.pendingBackendInit = null; + return true; + }).catch((err) => { + if (promiseId < this.pendingBackendInitId) { + return false; + } + this.pendingBackendInit = null; + console.warn(`Initialization of backend ${backendName} failed`); + console.warn(err.stack || err.message); + return false; + }); + this.pendingBackendInit = success; + return {success, asyncInit: true}; + } else { + this.registry[backendName] = backend22; + return {success: true, asyncInit: false}; + } + } catch (err) { + console.warn(`Initialization of backend ${backendName} failed`); + console.warn(err.stack || err.message); + return {success: false, asyncInit: false}; + } + } + removeBackend(backendName) { + if (!(backendName in this.registryFactory)) { + throw new Error(`${backendName} backend not found in registry`); + } + if (this.backendName === backendName && this.pendingBackendInit != null) { + this.pendingBackendInitId++; + } + if (backendName in this.registry) { + this.disposeRegisteredKernels(backendName); + this.registry[backendName].dispose(); + delete this.registry[backendName]; + } + delete this.registryFactory[backendName]; + if (this.backendName === backendName) { + this.pendingBackendInit = null; + this.backendName = null; + this.backendInstance = null; + } + } + getSortedBackends() { + if (Object.keys(this.registryFactory).length === 0) { + throw new Error("No backend found in registry."); + } + return Object.keys(this.registryFactory).sort((a, b) => { + return this.registryFactory[b].priority - this.registryFactory[a].priority; + }); + } + initializeBackendsAndReturnBest() { + const sortedBackends = this.getSortedBackends(); + for (let i = 0; i < sortedBackends.length; i++) { + const backendName = sortedBackends[i]; + const {success, asyncInit} = this.initializeBackend(backendName); + if (asyncInit || success) { + return {name: backendName, asyncInit}; + } + } + throw new Error(`Could not initialize any backends, all backend initializations failed.`); + } + moveData(backend22, dataId) { + const info2 = this.state.tensorInfo.get(dataId); + const srcBackend = info2.backend; + const values = this.readSync(dataId); + const refCount = srcBackend.refCount(dataId); + srcBackend.disposeData(dataId, true); + info2.backend = backend22; + backend22.move(dataId, values, info2.shape, info2.dtype, refCount); + if (this.shouldCheckForMemLeaks()) { + this.state.numDataMovesStack[this.state.numDataMovesStack.length - 1]++; + } + } + tidy(nameOrFn, fn) { + let name = null; + if (fn == null) { + if (typeof nameOrFn !== "function") { + throw new Error("Please provide a function to tidy()"); + } + fn = nameOrFn; + } else { + if (typeof nameOrFn !== "string" && !(nameOrFn instanceof String)) { + throw new Error("When calling with two arguments, the first argument to tidy() must be a string"); + } + if (typeof fn !== "function") { + throw new Error("When calling with two arguments, the 2nd argument to tidy() must be a function"); + } + name = nameOrFn; + } + let result; + return this.scopedRun(() => this.startScope(name), () => this.endScope(result), () => { + result = fn(); + if (result instanceof Promise) { + console.error("Cannot return a Promise inside of tidy."); + } + return result; + }); + } + scopedRun(start, end, f) { + start(); + try { + const res = f(); + end(); + return res; + } catch (ex) { + end(); + throw ex; + } + } + nextTensorId() { + return Engine.nextTensorId++; + } + nextVariableId() { + return Engine.nextVariableId++; + } + clone(x) { + const y = ENGINE.runKernel(Identity, {x}); + const inputs = {x}; + const grad2 = (dy) => ({ + x: () => { + const dtype = "float32"; + const gradInputs = {x: dy}; + const attrs = {dtype}; + return ENGINE.runKernel(Cast, gradInputs, attrs); + } + }); + const saved = []; + this.addTapeNode(this.state.activeScope.name, inputs, [y], grad2, saved, {}); + return y; + } + runKernel(kernelName, inputs, attrs) { + const hasKernel = getKernel(kernelName, this.backendName) != null; + if (!hasKernel) { + throw new Error(`Kernel '${kernelName}' not registered for backend '${this.backendName}'`); + } + return this.runKernelFunc({kernelName, inputs, attrs}); + } + shouldCheckForMemLeaks() { + return this.ENV.getBool("IS_TEST"); + } + checkKernelForMemLeak(kernelName, numDataIdsBefore, outInfos) { + const numDataIdsAfter = this.backend.numDataIds(); + let numOutputDataIds = 0; + outInfos.forEach((info2) => { + numOutputDataIds += info2.dtype === "complex64" ? 3 : 1; + }); + const numMoves = this.state.numDataMovesStack[this.state.numDataMovesStack.length - 1]; + const dataIdsLeaked = numDataIdsAfter - numDataIdsBefore - numOutputDataIds - numMoves; + if (dataIdsLeaked > 0) { + throw new Error(`Backend '${this.backendName}' has an internal memory leak (${dataIdsLeaked} data ids) after running '${kernelName}'`); + } + } + runKernelFunc(kernelParams) { + let outputs; + let saved = []; + const isTapeOn = this.isTapeOn(); + const startingBytecount = this.state.numBytes; + const startingNumTensors = this.state.numTensors; + if (this.shouldCheckForMemLeaks()) { + this.state.numDataMovesStack.push(0); + } + let kernelFunc3; + if (this.backendName == null) { + this.backend; + } + let out; + const kernelOrScopeName = isRegisteredKernelInvocation(kernelParams) ? kernelParams.kernelName : this.state.activeScope != null ? this.state.activeScope.name : ""; + if (isRegisteredKernelInvocation(kernelParams)) { + const {kernelName, inputs: inputs2, attrs: attrs2} = kernelParams; + if (this.backendName == null) { + this.backend; + } + const kernel = getKernel(kernelName, this.backendName); + assert(kernel != null, () => `Cannot find registered kernel '${kernelName}' for backend '${this.backendName}'`); + kernelFunc3 = () => { + const numDataIdsBefore = this.backend.numDataIds(); + out = kernel.kernelFunc({inputs: inputs2, attrs: attrs2, backend: this.backend}); + const outInfos = Array.isArray(out) ? out : [out]; + if (this.shouldCheckForMemLeaks()) { + this.checkKernelForMemLeak(kernelName, numDataIdsBefore, outInfos); + } + const outTensors = outInfos.map((outInfo) => { + if (outInfo.rank != null) { + return outInfo; + } + const {dataId, shape, dtype} = outInfo; + return this.makeTensorFromDataId(dataId, shape, dtype); + }); + if (isTapeOn) { + const tensorsToSave = this.getTensorsForGradient(kernelName, inputs2, outTensors); + saved = this.saveTensorsForBackwardMode(tensorsToSave); + } + return outTensors; + }; + } else { + const {forwardFunc} = kernelParams; + const saveFunc = (tensors) => { + if (!isTapeOn) { + return; + } + saved = tensors.map((tensor2) => this.keep(this.clone(tensor2))); + }; + kernelFunc3 = () => { + const numDataIdsBefore = this.backend.numDataIds(); + out = this.tidy(() => forwardFunc(this.backend, saveFunc)); + const outs = Array.isArray(out) ? out : [out]; + if (this.shouldCheckForMemLeaks()) { + this.checkKernelForMemLeak(kernelOrScopeName, numDataIdsBefore, outs); + } + return outs; + }; + } + const {inputs, attrs} = kernelParams; + const backwardsFunc = isRegisteredKernelInvocation(kernelParams) ? null : kernelParams.backwardsFunc; + let kernelProfile; + this.scopedRun(() => this.state.kernelDepth++, () => this.state.kernelDepth--, () => { + if (!this.ENV.getBool("DEBUG") && !this.state.profiling) { + outputs = kernelFunc3(); + } else { + kernelProfile = this.profiler.profileKernel(kernelOrScopeName, inputs, () => kernelFunc3()); + if (this.ENV.getBool("DEBUG")) { + this.profiler.logKernelProfile(kernelProfile); + } + outputs = kernelProfile.outputs; + } + }); + if (isTapeOn) { + this.addTapeNode(kernelOrScopeName, inputs, outputs, backwardsFunc, saved, attrs); + } + if (this.state.profiling) { + this.state.activeProfile.kernels.push({ + name: kernelOrScopeName, + bytesAdded: this.state.numBytes - startingBytecount, + totalBytesSnapshot: this.state.numBytes, + tensorsAdded: this.state.numTensors - startingNumTensors, + totalTensorsSnapshot: this.state.numTensors, + inputShapes: Object.keys(inputs).map((key) => inputs[key] != null ? inputs[key].shape : null), + outputShapes: outputs.map((item) => item.shape), + kernelTimeMs: kernelProfile.timeMs, + extraInfo: kernelProfile.extraInfo + }); + } + return Array.isArray(out) ? outputs : outputs[0]; + } + saveTensorsForBackwardMode(tensors) { + const saved = tensors.map((tensor2) => this.keep(this.clone(tensor2))); + return saved; + } + getTensorsForGradient(kernelName, inputs, outputs) { + const gradConfig = getGradient(kernelName); + if (gradConfig != null) { + const inputsToSave = gradConfig.inputsToSave || []; + const outputsToSave = gradConfig.outputsToSave || []; + let inputTensorsToSave; + if (gradConfig.saveAllInputs) { + assert(Array.isArray(inputs), () => "saveAllInputs is true, expected inputs to be an array."); + inputTensorsToSave = Object.keys(inputs).map((key) => inputs[key]); + } else { + inputTensorsToSave = inputsToSave.map((inputName) => inputs[inputName]); + } + const outputTensorsToSave = outputs.filter((_, i) => outputsToSave[i]); + return inputTensorsToSave.concat(outputTensorsToSave); + } + return []; + } + makeTensor(values, shape, dtype, backend22) { + if (values == null) { + throw new Error("Values passed to engine.makeTensor() are null"); + } + dtype = dtype || "float32"; + backend22 = backend22 || this.backend; + let backendVals = values; + if (dtype === "string" && isString(values[0])) { + backendVals = values.map((d) => encodeString(d)); + } + const dataId = backend22.write(backendVals, shape, dtype); + const t = new Tensor(shape, dtype, dataId, this.nextTensorId()); + this.trackTensor(t, backend22); + if (dtype === "string") { + const info2 = this.state.tensorInfo.get(dataId); + const newBytes = bytesFromStringArray(backendVals); + this.state.numBytes += newBytes - info2.bytes; + info2.bytes = newBytes; + } + return t; + } + makeTensorFromDataId(dataId, shape, dtype, backend22) { + dtype = dtype || "float32"; + const t = new Tensor(shape, dtype, dataId, this.nextTensorId()); + this.trackTensor(t, backend22); + return t; + } + makeVariable(initialValue, trainable = true, name, dtype) { + name = name || this.nextVariableId().toString(); + if (dtype != null && dtype !== initialValue.dtype) { + initialValue = initialValue.cast(dtype); + } + const v = new Variable(initialValue, trainable, name, this.nextTensorId()); + if (this.state.registeredVariables[v.name] != null) { + throw new Error(`Variable with name ${v.name} was already registered`); + } + this.state.registeredVariables[v.name] = v; + this.incRef(v, this.backend); + return v; + } + trackTensor(a, backend22) { + this.state.numTensors++; + if (a.dtype === "string") { + this.state.numStringTensors++; + } + let bytes = 0; + if (a.dtype !== "complex64" && a.dtype !== "string") { + bytes = a.size * bytesPerElement(a.dtype); + } + this.state.numBytes += bytes; + if (!this.state.tensorInfo.has(a.dataId)) { + this.state.numDataBuffers++; + this.state.tensorInfo.set(a.dataId, { + backend: backend22 || this.backend, + dtype: a.dtype, + shape: a.shape, + bytes + }); + } + if (!(a instanceof Variable)) { + this.track(a); + } + } + incRef(a, backend22) { + this.trackTensor(a, backend22); + this.backend.incRef(a.dataId); + } + removeDataId(dataId, backend22) { + if (this.state.tensorInfo.has(dataId) && this.state.tensorInfo.get(dataId).backend === backend22) { + this.state.tensorInfo.delete(dataId); + this.state.numDataBuffers--; + } + } + disposeTensor(a) { + if (!this.state.tensorInfo.has(a.dataId)) { + return; + } + const info2 = this.state.tensorInfo.get(a.dataId); + this.state.numTensors--; + if (a.dtype === "string") { + this.state.numStringTensors--; + this.state.numBytes -= info2.bytes; + } + if (a.dtype !== "complex64" && a.dtype !== "string") { + const bytes = a.size * bytesPerElement(a.dtype); + this.state.numBytes -= bytes; + } + if (info2.backend.disposeData(a.dataId)) { + this.removeDataId(a.dataId, info2.backend); + } + } + disposeVariables() { + for (const varName in this.state.registeredVariables) { + const v = this.state.registeredVariables[varName]; + this.disposeVariable(v); + } + } + disposeVariable(v) { + this.disposeTensor(v); + if (this.state.registeredVariables[v.name] != null) { + delete this.state.registeredVariables[v.name]; + } + } + memory() { + const info2 = this.backend.memory(); + info2.numTensors = this.state.numTensors; + info2.numDataBuffers = this.state.numDataBuffers; + info2.numBytes = this.state.numBytes; + if (this.state.numStringTensors > 0) { + info2.unreliable = true; + if (info2.reasons == null) { + info2.reasons = []; + } + info2.reasons.push("Memory usage by string tensors is approximate (2 bytes per character)"); + } + return info2; + } + async profile(query) { + this.state.profiling = true; + const startBytes = this.state.numBytes; + const startNumTensors = this.state.numTensors; + this.state.activeProfile.kernels = []; + this.state.activeProfile.result = await query(); + this.state.profiling = false; + this.state.activeProfile.peakBytes = Math.max(...this.state.activeProfile.kernels.map((d) => d.totalBytesSnapshot)); + this.state.activeProfile.newBytes = this.state.numBytes - startBytes; + this.state.activeProfile.newTensors = this.state.numTensors - startNumTensors; + for (const kernel of this.state.activeProfile.kernels) { + kernel.kernelTimeMs = await kernel.kernelTimeMs; + kernel.extraInfo = await kernel.extraInfo; + } + return this.state.activeProfile; + } + isTapeOn() { + return this.state.gradientDepth > 0 && this.state.kernelDepth === 0; + } + addTapeNode(kernelName, inputs, outputs, gradientsFunc, saved, attrs) { + const tapeNode = {id: this.state.nextTapeNodeId++, kernelName, inputs, outputs, saved}; + const gradConfig = getGradient(kernelName); + if (gradConfig != null) { + gradientsFunc = gradConfig.gradFunc; + } + if (gradientsFunc != null) { + tapeNode.gradient = (dys) => { + dys = dys.map((dy, i) => { + if (dy == null) { + const output = outputs[i]; + const vals = makeZerosTypedArray(output.size, output.dtype); + return this.makeTensor(vals, output.shape, output.dtype); + } + return dy; + }); + return gradientsFunc(dys.length > 1 ? dys : dys[0], saved, attrs); + }; + } + this.state.activeTape.push(tapeNode); + } + keep(result) { + result.kept = true; + return result; + } + startTape() { + if (this.state.gradientDepth === 0) { + this.state.activeTape = []; + } + this.state.gradientDepth++; + } + endTape() { + this.state.gradientDepth--; + } + startScope(name) { + const scopeInfo = { + track: [], + name: "unnamed scope", + id: this.state.nextScopeId++ + }; + if (name) { + scopeInfo.name = name; + } + this.state.scopeStack.push(scopeInfo); + this.state.activeScope = scopeInfo; + } + endScope(result) { + const tensorsToTrackInParent = getTensorsInContainer(result); + const tensorsToTrackInParentSet = new Set(tensorsToTrackInParent.map((t) => t.id)); + for (let i = 0; i < this.state.activeScope.track.length; i++) { + const tensor2 = this.state.activeScope.track[i]; + if (!tensor2.kept && !tensorsToTrackInParentSet.has(tensor2.id)) { + tensor2.dispose(); + } + } + const oldScope = this.state.scopeStack.pop(); + this.state.activeScope = this.state.scopeStack.length === 0 ? null : this.state.scopeStack[this.state.scopeStack.length - 1]; + tensorsToTrackInParent.forEach((tensor2) => { + if (!tensor2.kept && tensor2.scopeId === oldScope.id) { + this.track(tensor2); + } + }); + } + gradients(f, xs, dy, allowNoGradients = false) { + assert(xs.length > 0, () => "gradients() received an empty list of xs."); + if (dy != null && dy.dtype !== "float32") { + throw new Error(`dy must have 'float32' dtype, but has '${dy.dtype}'`); + } + const y = this.scopedRun(() => this.startTape(), () => this.endTape(), () => this.tidy("forward", f)); + assert(y instanceof Tensor, () => "The result y returned by f() must be a tensor."); + const filteredTape = getFilteredNodesXToY(this.state.activeTape, xs, y); + if (!allowNoGradients && filteredTape.length === 0 && xs.length > 0) { + throw new Error("Cannot compute gradient of y=f(x) with respect to x. Make sure that the f you passed encloses all operations that lead from x to y."); + } + return this.tidy("backward", () => { + const accumulatedGradientMap = {}; + accumulatedGradientMap[y.id] = dy == null ? ones(y.shape) : dy; + backpropagateGradients(accumulatedGradientMap, filteredTape, (f2) => this.tidy(f2), add); + const grads2 = xs.map((x) => accumulatedGradientMap[x.id]); + if (this.state.gradientDepth === 0) { + this.state.activeTape.forEach((node) => { + for (const tensor2 of node.saved) { + tensor2.dispose(); + } + }); + this.state.activeTape = null; + } + return {value: y, grads: grads2}; + }); + } + customGrad(f) { + assert(isFunction(f), () => "The f passed in customGrad(f) must be a function."); + return (...inputs) => { + assert(inputs.every((t) => t instanceof Tensor), () => "The args passed in customGrad(f)(x1, x2,...) must all be tensors"); + let res; + const inputMap = {}; + inputs.forEach((input2, i) => { + inputMap[i] = input2; + }); + const forwardFunc = (_, save) => { + res = f(...[...inputs, save]); + assert(res.value instanceof Tensor, () => "The function f passed in customGrad(f) must return an object where `obj.value` is a tensor"); + assert(isFunction(res.gradFunc), () => "The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function."); + return res.value; + }; + const backwardsFunc = (dy, saved) => { + const gradRes = res.gradFunc(dy, saved); + const grads2 = Array.isArray(gradRes) ? gradRes : [gradRes]; + assert(grads2.length === inputs.length, () => "The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function that returns the same number of tensors as inputs passed to f(...)."); + assert(grads2.every((t) => t instanceof Tensor), () => "The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function that returns a list of only tensors."); + const gradMap = {}; + grads2.forEach((grad2, i) => { + gradMap[i] = () => grad2; + }); + return gradMap; + }; + return this.runKernelFunc({ + forwardFunc, + backwardsFunc, + inputs: inputMap + }); + }; + } + readSync(dataId) { + const info2 = this.state.tensorInfo.get(dataId); + return info2.backend.readSync(dataId); + } + read(dataId) { + const info2 = this.state.tensorInfo.get(dataId); + return info2.backend.read(dataId); + } + async time(query) { + const start = now2(); + const timingInfo = await this.backend.time(query); + timingInfo.wallMs = now2() - start; + return timingInfo; + } + track(result) { + if (this.state.activeScope != null) { + result.scopeId = this.state.activeScope.id; + this.state.activeScope.track.push(result); + } + return result; + } + get registeredVariables() { + return this.state.registeredVariables; + } + reset() { + this.pendingBackendInitId++; + this.state.dispose(); + this.ENV.reset(); + this.state = new EngineState(); + for (const backendName in this.registry) { + this.disposeRegisteredKernels(backendName); + this.registry[backendName].dispose(); + delete this.registry[backendName]; + } + this.backendName = null; + this.backendInstance = null; + this.pendingBackendInit = null; + } + }; + Engine.nextTensorId = 0; + Engine.nextVariableId = 0; + function ones(shape) { + const values = makeOnesTypedArray(sizeFromShape(shape), "float32"); + return ENGINE.makeTensor(values, shape, "float32"); + } + function getOrMakeEngine() { + const ns = getGlobalNamespace(); + if (ns._tfengine == null) { + const environment = new Environment(ns); + ns._tfengine = new Engine(environment); + } + setEnvironmentGlobal(ns._tfengine.ENV); + setTensorTracker(() => ns._tfengine); + return ns._tfengine; + } + var ENGINE = getOrMakeEngine(); + function add(a, b) { + const inputs = {a, b}; + return ENGINE.runKernel(Add, inputs); + } + var device_util_exports = {}; + __export2(device_util_exports, { + isBrowser: () => isBrowser, + isMobile: () => isMobile + }); + /** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + function _isNavigatorDefined() { + return typeof navigator !== "undefined" && navigator != null; + } + function isMobile() { + if (_isNavigatorDefined()) { + const a = navigator.userAgent || navigator.vendor || window.opera; + return /(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0, 4)); + } + return false; + } + function isBrowser() { + return typeof window !== "undefined" && window.document != null || typeof WorkerGlobalScope !== "undefined"; + } + /** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + var ENV2 = env(); + ENV2.registerFlag("DEBUG", () => false, (debugValue) => { + if (debugValue) { + console.warn("Debugging mode is ON. The output of every math call will be downloaded to CPU and checked for NaNs. This significantly impacts performance."); + } + }); + ENV2.registerFlag("IS_BROWSER", () => isBrowser()); + ENV2.registerFlag("IS_NODE", () => typeof process !== "undefined" && typeof process.versions !== "undefined" && typeof process.versions.node !== "undefined"); + ENV2.registerFlag("IS_CHROME", () => typeof navigator !== "undefined" && navigator != null && navigator.userAgent != null && /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor)); + ENV2.registerFlag("PROD", () => false); + ENV2.registerFlag("TENSORLIKE_CHECK_SHAPE_CONSISTENCY", () => ENV2.getBool("DEBUG")); + ENV2.registerFlag("DEPRECATION_WARNINGS_ENABLED", () => true); + ENV2.registerFlag("IS_TEST", () => false); + ENV2.registerFlag("CHECK_COMPUTATION_FOR_ERRORS", () => true); + ENV2.registerFlag("WRAP_TO_IMAGEBITMAP", () => false); + /** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + function inferShape(val, dtype) { + let firstElem = val; + if (isTypedArray(val)) { + return dtype === "string" ? [] : [val.length]; + } + if (!Array.isArray(val)) { + return []; + } + const shape = []; + while (Array.isArray(firstElem) || isTypedArray(firstElem) && dtype !== "string") { + shape.push(firstElem.length); + firstElem = firstElem[0]; + } + if (Array.isArray(val) && env().getBool("TENSORLIKE_CHECK_SHAPE_CONSISTENCY")) { + deepAssertShapeConsistency(val, shape, []); + } + return shape; + } + function deepAssertShapeConsistency(val, shape, indices) { + indices = indices || []; + if (!Array.isArray(val) && !isTypedArray(val)) { + assert(shape.length === 0, () => `Element arr[${indices.join("][")}] is a primitive, but should be an array/TypedArray of ${shape[0]} elements`); + return; + } + assert(shape.length > 0, () => `Element arr[${indices.join("][")}] should be a primitive, but is an array of ${val.length} elements`); + assert(val.length === shape[0], () => `Element arr[${indices.join("][")}] should have ${shape[0]} elements, but has ${val.length} elements`); + const subShape = shape.slice(1); + for (let i = 0; i < val.length; ++i) { + deepAssertShapeConsistency(val[i], subShape, indices.concat(i)); + } + } + function assertDtype(expectedDtype, actualDType, argName, functionName) { + if (expectedDtype === "string_or_numeric") { + return; + } + if (expectedDtype == null) { + throw new Error(`Expected dtype cannot be null.`); + } + if (expectedDtype !== "numeric" && expectedDtype !== actualDType || expectedDtype === "numeric" && actualDType === "string") { + throw new Error(`Argument '${argName}' passed to '${functionName}' must be ${expectedDtype} tensor, but got ${actualDType} tensor`); + } + } + function convertToTensor(x, argName, functionName, parseAsDtype = "numeric") { + if (x instanceof Tensor) { + assertDtype(parseAsDtype, x.dtype, argName, functionName); + return x; + } + let inferredDtype = inferDtype(x); + if (inferredDtype !== "string" && ["bool", "int32", "float32"].indexOf(parseAsDtype) >= 0) { + inferredDtype = parseAsDtype; + } + assertDtype(parseAsDtype, inferredDtype, argName, functionName); + if (x == null || !isTypedArray(x) && !Array.isArray(x) && typeof x !== "number" && typeof x !== "boolean" && typeof x !== "string") { + const type = x == null ? "null" : x.constructor.name; + throw new Error(`Argument '${argName}' passed to '${functionName}' must be a Tensor or TensorLike, but got '${type}'`); + } + const inferredShape = inferShape(x, inferredDtype); + if (!isTypedArray(x) && !Array.isArray(x)) { + x = [x]; + } + const skipTypedArray = true; + const values = inferredDtype !== "string" ? toTypedArray(x, inferredDtype) : flatten(x, [], skipTypedArray); + return ENGINE.makeTensor(values, inferredShape, inferredDtype); + } + function convertToTensorArray(arg, argName, functionName, parseAsDtype = "numeric") { + if (!Array.isArray(arg)) { + throw new Error(`Argument ${argName} passed to ${functionName} must be a \`Tensor[]\` or \`TensorLike[]\``); + } + const tensors = arg; + return tensors.map((t, i) => convertToTensor(t, `${argName}[${i}]`, functionName, parseAsDtype)); + } + /** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + var OP_SCOPE_SUFFIX = "__op"; + function op(f) { + const keys = Object.keys(f); + if (keys.length !== 1) { + throw new Error(`Please provide an object with a single key (operation name) mapping to a function. Got an object with ${keys.length} keys.`); + } + let opName = keys[0]; + const fn = f[opName]; + if (opName.endsWith("_")) { + opName = opName.substring(0, opName.length - 1); + } + opName = opName + OP_SCOPE_SUFFIX; + const f2 = (...args) => { + ENGINE.startScope(opName); + try { + const result = fn(...args); + if (isPromise(result)) { + console.error("Cannot return a Promise inside of tidy."); + } + ENGINE.endScope(result); + return result; + } catch (ex) { + ENGINE.endScope(null); + throw ex; + } + }; + Object.defineProperty(f2, "name", {value: opName, configurable: true}); + return f2; + } + /** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + function complex_(real4, imag4) { + const $real = convertToTensor(real4, "real", "complex"); + const $imag = convertToTensor(imag4, "imag", "complex"); + assertShapesMatch($real.shape, $imag.shape, `real and imag shapes, ${$real.shape} and ${$imag.shape}, must match in call to tf.complex().`); + const inputs = {real: $real, imag: $imag}; + return ENGINE.runKernel(Complex, inputs); + } + var complex = op({complex_}); + /** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + function makeTensor(values, shape, inferredShape, dtype) { + if (dtype == null) { + dtype = inferDtype(values); + } + if (dtype === "complex64") { + throw new Error(`Cannot construct a complex64 tensor directly. Please use tf.complex(real, imag).`); + } + if (!isTypedArray(values) && !Array.isArray(values) && typeof values !== "number" && typeof values !== "boolean" && typeof values !== "string") { + throw new Error("values passed to tensor(values) must be a number/boolean/string or an array of numbers/booleans/strings, or a TypedArray"); + } + if (shape != null) { + assertNonNegativeIntegerDimensions(shape); + const providedSize = sizeFromShape(shape); + const inferredSize = sizeFromShape(inferredShape); + assert(providedSize === inferredSize, () => `Based on the provided shape, [${shape}], the tensor should have ${providedSize} values but has ${inferredSize}`); + for (let i = 0; i < inferredShape.length; ++i) { + const inferred = inferredShape[i]; + const flatDimsDontMatch = i === inferredShape.length - 1 ? inferred !== sizeFromShape(shape.slice(i)) : true; + assert(inferredShape[i] === shape[i] || !flatDimsDontMatch, () => `Error creating a new Tensor. Inferred shape (${inferredShape}) does not match the provided shape (${shape}). `); + } + } + if (!isTypedArray(values) && !Array.isArray(values)) { + values = [values]; + } + shape = shape || inferredShape; + values = dtype !== "string" ? toTypedArray(values, dtype) : flatten(values, [], true); + return ENGINE.makeTensor(values, shape, dtype); + } + /** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + function tensor(values, shape, dtype) { + const inferredShape = inferShape(values, dtype); + return makeTensor(values, shape, inferredShape, dtype); + } + /** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + var DTYPE_VALUE_SIZE_MAP = { + float32: 4, + float16: 2, + int32: 4, + uint16: 2, + uint8: 1, + bool: 1, + complex64: 8 + }; + /** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + var NUM_BYTES_STRING_LENGTH = 4; + async function encodeWeights(tensors, group) { + const specs = []; + const dataPromises = []; + const names = Array.isArray(tensors) ? tensors.map((tensor2) => tensor2.name) : Object.keys(tensors); + for (let i = 0; i < names.length; ++i) { + const name = names[i]; + const t = Array.isArray(tensors) ? tensors[i].tensor : tensors[name]; + if (t.dtype !== "float32" && t.dtype !== "int32" && t.dtype !== "bool" && t.dtype !== "string" && t.dtype !== "complex64") { + throw new Error(`Unsupported dtype in weight '${name}': ${t.dtype}`); + } + const spec = {name, shape: t.shape, dtype: t.dtype}; + if (t.dtype === "string") { + const utf8bytes = new Promise(async (resolve) => { + const vals = await t.bytes(); + const totalNumBytes = vals.reduce((p2, c) => p2 + c.length, 0) + NUM_BYTES_STRING_LENGTH * vals.length; + const bytes = new Uint8Array(totalNumBytes); + let offset = 0; + for (let i2 = 0; i2 < vals.length; i2++) { + const val = vals[i2]; + const bytesOfLength = new Uint8Array(new Uint32Array([val.length]).buffer); + bytes.set(bytesOfLength, offset); + offset += NUM_BYTES_STRING_LENGTH; + bytes.set(val, offset); + offset += val.length; + } + resolve(bytes); + }); + dataPromises.push(utf8bytes); + } else { + dataPromises.push(t.data()); + } + if (group != null) { + spec.group = group; + } + specs.push(spec); + } + const tensorValues = await Promise.all(dataPromises); + return {data: concatenateTypedArrays(tensorValues), specs}; + } + function decodeWeights(buffer2, specs) { + const out = {}; + let float16Decode; + let offset = 0; + for (const spec of specs) { + const name = spec.name; + const dtype = spec.dtype; + const shape = spec.shape; + const size = sizeFromShape(shape); + let values; + if ("quantization" in spec) { + const quantization = spec.quantization; + if (quantization.dtype === "uint8" || quantization.dtype === "uint16") { + if (!("min" in quantization && "scale" in quantization)) { + throw new Error(`Weight ${spec.name} with quantization ${quantization.dtype} doesn't have corresponding metadata min and scale.`); + } + } else if (quantization.dtype === "float16") { + if (dtype !== "float32") { + throw new Error(`Weight ${spec.name} is quantized with ${quantization.dtype} which only supports weights of type float32 not ${dtype}.`); + } + } else { + throw new Error(`Weight ${spec.name} has unknown quantization dtype ${quantization.dtype}. Supported quantization dtypes are: 'uint8', 'uint16', and 'float16'.`); + } + const quantizationSizeFactor = DTYPE_VALUE_SIZE_MAP[quantization.dtype]; + const byteBuffer = buffer2.slice(offset, offset + size * quantizationSizeFactor); + const quantizedArray = quantization.dtype === "uint8" ? new Uint8Array(byteBuffer) : new Uint16Array(byteBuffer); + if (dtype === "float32") { + if (quantization.dtype === "uint8" || quantization.dtype === "uint16") { + values = new Float32Array(quantizedArray.length); + for (let i = 0; i < quantizedArray.length; i++) { + const v = quantizedArray[i]; + values[i] = v * quantization.scale + quantization.min; + } + } else if (quantization.dtype === "float16") { + if (float16Decode === void 0) { + float16Decode = getFloat16Decoder(); + } + values = float16Decode(quantizedArray); + } else { + throw new Error(`Unsupported quantization type ${quantization.dtype} for weight type float32.`); + } + } else if (dtype === "int32") { + if (quantization.dtype !== "uint8" && quantization.dtype !== "uint16") { + throw new Error(`Unsupported quantization type ${quantization.dtype} for weight type int32.`); + } + values = new Int32Array(quantizedArray.length); + for (let i = 0; i < quantizedArray.length; i++) { + const v = quantizedArray[i]; + values[i] = Math.round(v * quantization.scale + quantization.min); + } + } else { + throw new Error(`Unsupported dtype in weight '${name}': ${dtype}`); + } + offset += size * quantizationSizeFactor; + } else if (dtype === "string") { + const size2 = sizeFromShape(spec.shape); + values = []; + for (let i = 0; i < size2; i++) { + const byteLength = new Uint32Array(buffer2.slice(offset, offset + NUM_BYTES_STRING_LENGTH))[0]; + offset += NUM_BYTES_STRING_LENGTH; + const bytes = new Uint8Array(buffer2.slice(offset, offset + byteLength)); + values.push(bytes); + offset += byteLength; + } + } else { + const dtypeFactor = DTYPE_VALUE_SIZE_MAP[dtype]; + const byteBuffer = buffer2.slice(offset, offset + size * dtypeFactor); + if (dtype === "float32") { + values = new Float32Array(byteBuffer); + } else if (dtype === "int32") { + values = new Int32Array(byteBuffer); + } else if (dtype === "bool") { + values = new Uint8Array(byteBuffer); + } else if (dtype === "complex64") { + values = new Float32Array(byteBuffer); + const real4 = new Float32Array(values.length / 2); + const image3 = new Float32Array(values.length / 2); + for (let i = 0; i < real4.length; i++) { + real4[i] = values[i * 2]; + image3[i] = values[i * 2 + 1]; + } + const realTensor = tensor(real4, shape, "float32"); + const imageTensor = tensor(image3, shape, "float32"); + out[name] = complex(realTensor, imageTensor); + realTensor.dispose(); + imageTensor.dispose(); + } else { + throw new Error(`Unsupported dtype in weight '${name}': ${dtype}`); + } + offset += size * dtypeFactor; + } + if (dtype !== "complex64") { + out[name] = tensor(values, shape, dtype); + } + } + return out; + } + function concatenateTypedArrays(xs) { + if (xs === null) { + throw new Error(`Invalid input value: ${JSON.stringify(xs)}`); + } + let totalByteLength = 0; + const normalizedXs = []; + xs.forEach((x) => { + totalByteLength += x.byteLength; + normalizedXs.push(x.byteLength === x.buffer.byteLength ? x : new x.constructor(x)); + if (!(x instanceof Float32Array || x instanceof Int32Array || x instanceof Uint8Array)) { + throw new Error(`Unsupported TypedArray subtype: ${x.constructor.name}`); + } + }); + const y = new Uint8Array(totalByteLength); + let offset = 0; + normalizedXs.forEach((x) => { + y.set(new Uint8Array(x.buffer), offset); + offset += x.byteLength; + }); + return y.buffer; + } + var useNodeBuffer = typeof Buffer !== "undefined" && (typeof Blob === "undefined" || typeof atob === "undefined" || typeof btoa === "undefined"); + function stringByteLength(str) { + if (useNodeBuffer) { + return Buffer.byteLength(str); + } + return new Blob([str]).size; + } + function arrayBufferToBase64String(buffer2) { + if (useNodeBuffer) { + return Buffer.from(buffer2).toString("base64"); + } + const buf = new Uint8Array(buffer2); + let s = ""; + for (let i = 0, l = buf.length; i < l; i++) { + s += String.fromCharCode(buf[i]); + } + return btoa(s); + } + function base64StringToArrayBuffer(str) { + if (useNodeBuffer) { + const buf = Buffer.from(str, "base64"); + return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength); + } + const s = atob(str); + const buffer2 = new Uint8Array(s.length); + for (let i = 0; i < s.length; ++i) { + buffer2.set([s.charCodeAt(i)], i); + } + return buffer2.buffer; + } + function concatenateArrayBuffers(buffers) { + if (buffers.length === 1) { + return buffers[0]; + } + let totalByteLength = 0; + buffers.forEach((buffer2) => { + totalByteLength += buffer2.byteLength; + }); + const temp = new Uint8Array(totalByteLength); + let offset = 0; + buffers.forEach((buffer2) => { + temp.set(new Uint8Array(buffer2), offset); + offset += buffer2.byteLength; + }); + return temp.buffer; + } + function basename(path) { + const SEPARATOR = "/"; + path = path.trim(); + while (path.endsWith(SEPARATOR)) { + path = path.slice(0, path.length - 1); + } + const items = path.split(SEPARATOR); + return items[items.length - 1]; + } + function getModelArtifactsInfoForJSON(modelArtifacts) { + if (modelArtifacts.modelTopology instanceof ArrayBuffer) { + throw new Error("Expected JSON model topology, received ArrayBuffer."); + } + return { + dateSaved: new Date(), + modelTopologyType: "JSON", + modelTopologyBytes: modelArtifacts.modelTopology == null ? 0 : stringByteLength(JSON.stringify(modelArtifacts.modelTopology)), + weightSpecsBytes: modelArtifacts.weightSpecs == null ? 0 : stringByteLength(JSON.stringify(modelArtifacts.weightSpecs)), + weightDataBytes: modelArtifacts.weightData == null ? 0 : modelArtifacts.weightData.byteLength + }; + } + function computeFloat16MantisaTable() { + const convertMantissa = (i) => { + let m = i << 13; + let e = 0; + while ((m & 8388608) === 0) { + e -= 8388608; + m <<= 1; + } + m &= ~8388608; + e += 947912704; + return m | e; + }; + const mantisaTable = new Uint32Array(2048); + mantisaTable[0] = 0; + for (let i = 1; i < 1024; i++) { + mantisaTable[i] = convertMantissa(i); + } + for (let i = 1024; i < 2048; i++) { + mantisaTable[i] = 939524096 + (i - 1024 << 13); + } + return mantisaTable; + } + function computeFloat16ExponentTable() { + const exponentTable = new Uint32Array(64); + exponentTable[0] = 0; + exponentTable[31] = 1199570944; + exponentTable[32] = 2147483648; + exponentTable[63] = 3347054592; + for (let i = 1; i < 31; i++) { + exponentTable[i] = i << 23; + } + for (let i = 33; i < 63; i++) { + exponentTable[i] = 2147483648 + (i - 32 << 23); + } + return exponentTable; + } + function computeFloat16OffsetTable() { + const offsetTable = new Uint32Array(64); + for (let i = 0; i < 64; i++) { + offsetTable[i] = 1024; + } + offsetTable[0] = offsetTable[32] = 0; + return offsetTable; + } + function getFloat16Decoder() { + const mantisaTable = computeFloat16MantisaTable(); + const exponentTable = computeFloat16ExponentTable(); + const offsetTable = computeFloat16OffsetTable(); + return (quantizedArray) => { + const buffer2 = new ArrayBuffer(4 * quantizedArray.length); + const bufferUint32View = new Uint32Array(buffer2); + for (let index = 0; index < quantizedArray.length; index++) { + const float16Bits = quantizedArray[index]; + const float32Bits = mantisaTable[offsetTable[float16Bits >> 10] + (float16Bits & 1023)] + exponentTable[float16Bits >> 10]; + bufferUint32View[index] = float32Bits; + } + return new Float32Array(buffer2); + }; + } + /** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + var IORouterRegistry = class { + constructor() { + this.saveRouters = []; + this.loadRouters = []; + } + static getInstance() { + if (IORouterRegistry.instance == null) { + IORouterRegistry.instance = new IORouterRegistry(); + } + return IORouterRegistry.instance; + } + static registerSaveRouter(saveRouter) { + IORouterRegistry.getInstance().saveRouters.push(saveRouter); + } + static registerLoadRouter(loadRouter) { + IORouterRegistry.getInstance().loadRouters.push(loadRouter); + } + static getSaveHandlers(url) { + return IORouterRegistry.getHandlers(url, "save"); + } + static getLoadHandlers(url, loadOptions) { + return IORouterRegistry.getHandlers(url, "load", loadOptions); + } + static getHandlers(url, handlerType, loadOptions) { + const validHandlers = []; + const routers = handlerType === "load" ? IORouterRegistry.getInstance().loadRouters : IORouterRegistry.getInstance().saveRouters; + routers.forEach((router) => { + const handler = router(url, loadOptions); + if (handler !== null) { + validHandlers.push(handler); + } + }); + return validHandlers; + } + }; + var registerSaveRouter = (loudRouter) => IORouterRegistry.registerSaveRouter(loudRouter); + var registerLoadRouter = (loudRouter) => IORouterRegistry.registerLoadRouter(loudRouter); + var getSaveHandlers = (url) => IORouterRegistry.getSaveHandlers(url); + var getLoadHandlers = (url, loadOptions) => IORouterRegistry.getLoadHandlers(url, loadOptions); + /** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + var DATABASE_NAME = "tensorflowjs"; + var DATABASE_VERSION = 1; + var MODEL_STORE_NAME = "models_store"; + var INFO_STORE_NAME = "model_info_store"; + function getIndexedDBFactory() { + if (!env().getBool("IS_BROWSER")) { + throw new Error("Failed to obtain IndexedDB factory because the current environmentis not a web browser."); + } + const theWindow = typeof window === "undefined" ? self : window; + const factory = theWindow.indexedDB || theWindow.mozIndexedDB || theWindow.webkitIndexedDB || theWindow.msIndexedDB || theWindow.shimIndexedDB; + if (factory == null) { + throw new Error("The current browser does not appear to support IndexedDB."); + } + return factory; + } + function setUpDatabase(openRequest) { + const db = openRequest.result; + db.createObjectStore(MODEL_STORE_NAME, {keyPath: "modelPath"}); + db.createObjectStore(INFO_STORE_NAME, {keyPath: "modelPath"}); + } + var BrowserIndexedDB = class { + constructor(modelPath) { + this.indexedDB = getIndexedDBFactory(); + if (modelPath == null || !modelPath) { + throw new Error("For IndexedDB, modelPath must not be null, undefined or empty."); + } + this.modelPath = modelPath; + } + async save(modelArtifacts) { + if (modelArtifacts.modelTopology instanceof ArrayBuffer) { + throw new Error("BrowserLocalStorage.save() does not support saving model topology in binary formats yet."); + } + return this.databaseAction(this.modelPath, modelArtifacts); + } + async load() { + return this.databaseAction(this.modelPath); + } + databaseAction(modelPath, modelArtifacts) { + return new Promise((resolve, reject) => { + const openRequest = this.indexedDB.open(DATABASE_NAME, DATABASE_VERSION); + openRequest.onupgradeneeded = () => setUpDatabase(openRequest); + openRequest.onsuccess = () => { + const db = openRequest.result; + if (modelArtifacts == null) { + const modelTx = db.transaction(MODEL_STORE_NAME, "readonly"); + const modelStore = modelTx.objectStore(MODEL_STORE_NAME); + const getRequest = modelStore.get(this.modelPath); + getRequest.onsuccess = () => { + if (getRequest.result == null) { + db.close(); + return reject(new Error(`Cannot find model with path '${this.modelPath}' in IndexedDB.`)); + } else { + resolve(getRequest.result.modelArtifacts); + } + }; + getRequest.onerror = (error) => { + db.close(); + return reject(getRequest.error); + }; + modelTx.oncomplete = () => db.close(); + } else { + const modelArtifactsInfo = getModelArtifactsInfoForJSON(modelArtifacts); + const infoTx = db.transaction(INFO_STORE_NAME, "readwrite"); + let infoStore = infoTx.objectStore(INFO_STORE_NAME); + const putInfoRequest = infoStore.put({modelPath: this.modelPath, modelArtifactsInfo}); + let modelTx; + putInfoRequest.onsuccess = () => { + modelTx = db.transaction(MODEL_STORE_NAME, "readwrite"); + const modelStore = modelTx.objectStore(MODEL_STORE_NAME); + const putModelRequest = modelStore.put({ + modelPath: this.modelPath, + modelArtifacts, + modelArtifactsInfo + }); + putModelRequest.onsuccess = () => resolve({modelArtifactsInfo}); + putModelRequest.onerror = (error) => { + infoStore = infoTx.objectStore(INFO_STORE_NAME); + const deleteInfoRequest = infoStore.delete(this.modelPath); + deleteInfoRequest.onsuccess = () => { + db.close(); + return reject(putModelRequest.error); + }; + deleteInfoRequest.onerror = (error2) => { + db.close(); + return reject(putModelRequest.error); + }; + }; + }; + putInfoRequest.onerror = (error) => { + db.close(); + return reject(putInfoRequest.error); + }; + infoTx.oncomplete = () => { + if (modelTx == null) { + db.close(); + } else { + modelTx.oncomplete = () => db.close(); + } + }; + } + }; + openRequest.onerror = (error) => reject(openRequest.error); + }); + } + }; + BrowserIndexedDB.URL_SCHEME = "indexeddb://"; + var indexedDBRouter = (url) => { + if (!env().getBool("IS_BROWSER")) { + return null; + } else { + if (!Array.isArray(url) && url.startsWith(BrowserIndexedDB.URL_SCHEME)) { + return browserIndexedDB(url.slice(BrowserIndexedDB.URL_SCHEME.length)); + } else { + return null; + } + } + }; + IORouterRegistry.registerSaveRouter(indexedDBRouter); + IORouterRegistry.registerLoadRouter(indexedDBRouter); + function browserIndexedDB(modelPath) { + return new BrowserIndexedDB(modelPath); + } + function maybeStripScheme(key) { + return key.startsWith(BrowserIndexedDB.URL_SCHEME) ? key.slice(BrowserIndexedDB.URL_SCHEME.length) : key; + } + var BrowserIndexedDBManager = class { + constructor() { + this.indexedDB = getIndexedDBFactory(); + } + async listModels() { + return new Promise((resolve, reject) => { + const openRequest = this.indexedDB.open(DATABASE_NAME, DATABASE_VERSION); + openRequest.onupgradeneeded = () => setUpDatabase(openRequest); + openRequest.onsuccess = () => { + const db = openRequest.result; + const tx = db.transaction(INFO_STORE_NAME, "readonly"); + const store = tx.objectStore(INFO_STORE_NAME); + const getAllInfoRequest = store.getAll(); + getAllInfoRequest.onsuccess = () => { + const out = {}; + for (const item of getAllInfoRequest.result) { + out[item.modelPath] = item.modelArtifactsInfo; + } + resolve(out); + }; + getAllInfoRequest.onerror = (error) => { + db.close(); + return reject(getAllInfoRequest.error); + }; + tx.oncomplete = () => db.close(); + }; + openRequest.onerror = (error) => reject(openRequest.error); + }); + } + async removeModel(path) { + path = maybeStripScheme(path); + return new Promise((resolve, reject) => { + const openRequest = this.indexedDB.open(DATABASE_NAME, DATABASE_VERSION); + openRequest.onupgradeneeded = () => setUpDatabase(openRequest); + openRequest.onsuccess = () => { + const db = openRequest.result; + const infoTx = db.transaction(INFO_STORE_NAME, "readwrite"); + const infoStore = infoTx.objectStore(INFO_STORE_NAME); + const getInfoRequest = infoStore.get(path); + let modelTx; + getInfoRequest.onsuccess = () => { + if (getInfoRequest.result == null) { + db.close(); + return reject(new Error(`Cannot find model with path '${path}' in IndexedDB.`)); + } else { + const deleteInfoRequest = infoStore.delete(path); + const deleteModelData = () => { + modelTx = db.transaction(MODEL_STORE_NAME, "readwrite"); + const modelStore = modelTx.objectStore(MODEL_STORE_NAME); + const deleteModelRequest = modelStore.delete(path); + deleteModelRequest.onsuccess = () => resolve(getInfoRequest.result.modelArtifactsInfo); + deleteModelRequest.onerror = (error) => reject(getInfoRequest.error); + }; + deleteInfoRequest.onsuccess = deleteModelData; + deleteInfoRequest.onerror = (error) => { + deleteModelData(); + db.close(); + return reject(getInfoRequest.error); + }; + } + }; + getInfoRequest.onerror = (error) => { + db.close(); + return reject(getInfoRequest.error); + }; + infoTx.oncomplete = () => { + if (modelTx == null) { + db.close(); + } else { + modelTx.oncomplete = () => db.close(); + } + }; + }; + openRequest.onerror = (error) => reject(openRequest.error); + }); + } + }; + /** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + var PATH_SEPARATOR = "/"; + var PATH_PREFIX = "tensorflowjs_models"; + var INFO_SUFFIX = "info"; + var MODEL_TOPOLOGY_SUFFIX = "model_topology"; + var WEIGHT_SPECS_SUFFIX = "weight_specs"; + var WEIGHT_DATA_SUFFIX = "weight_data"; + var MODEL_METADATA_SUFFIX = "model_metadata"; + function getModelKeys(path) { + return { + info: [PATH_PREFIX, path, INFO_SUFFIX].join(PATH_SEPARATOR), + topology: [PATH_PREFIX, path, MODEL_TOPOLOGY_SUFFIX].join(PATH_SEPARATOR), + weightSpecs: [PATH_PREFIX, path, WEIGHT_SPECS_SUFFIX].join(PATH_SEPARATOR), + weightData: [PATH_PREFIX, path, WEIGHT_DATA_SUFFIX].join(PATH_SEPARATOR), + modelMetadata: [PATH_PREFIX, path, MODEL_METADATA_SUFFIX].join(PATH_SEPARATOR) + }; + } + function getModelPathFromKey(key) { + const items = key.split(PATH_SEPARATOR); + if (items.length < 3) { + throw new Error(`Invalid key format: ${key}`); + } + return items.slice(1, items.length - 1).join(PATH_SEPARATOR); + } + function maybeStripScheme2(key) { + return key.startsWith(BrowserLocalStorage.URL_SCHEME) ? key.slice(BrowserLocalStorage.URL_SCHEME.length) : key; + } + var BrowserLocalStorage = class { + constructor(modelPath) { + if (!env().getBool("IS_BROWSER") || typeof window === "undefined" || typeof window.localStorage === "undefined") { + throw new Error("The current environment does not support local storage."); + } + this.LS = window.localStorage; + if (modelPath == null || !modelPath) { + throw new Error("For local storage, modelPath must not be null, undefined or empty."); + } + this.modelPath = modelPath; + this.keys = getModelKeys(this.modelPath); + } + async save(modelArtifacts) { + if (modelArtifacts.modelTopology instanceof ArrayBuffer) { + throw new Error("BrowserLocalStorage.save() does not support saving model topology in binary formats yet."); + } else { + const topology = JSON.stringify(modelArtifacts.modelTopology); + const weightSpecs = JSON.stringify(modelArtifacts.weightSpecs); + const modelArtifactsInfo = getModelArtifactsInfoForJSON(modelArtifacts); + try { + this.LS.setItem(this.keys.info, JSON.stringify(modelArtifactsInfo)); + this.LS.setItem(this.keys.topology, topology); + this.LS.setItem(this.keys.weightSpecs, weightSpecs); + this.LS.setItem(this.keys.weightData, arrayBufferToBase64String(modelArtifacts.weightData)); + const result = { + format: modelArtifacts.format, + generatedBy: modelArtifacts.generatedBy, + convertedBy: modelArtifacts.convertedBy + }; + if (modelArtifacts.signature != null) { + result.signature = modelArtifacts.signature; + } + if (modelArtifacts.userDefinedMetadata != null) { + result.userDefinedMetadata = modelArtifacts.userDefinedMetadata; + } + if (modelArtifacts.modelInitializer != null) { + result.modelInitializer = modelArtifacts.modelInitializer; + } + this.LS.setItem(this.keys.modelMetadata, JSON.stringify(result)); + return {modelArtifactsInfo}; + } catch (err) { + this.LS.removeItem(this.keys.info); + this.LS.removeItem(this.keys.topology); + this.LS.removeItem(this.keys.weightSpecs); + this.LS.removeItem(this.keys.weightData); + this.LS.removeItem(this.keys.modelMetadata); + throw new Error(`Failed to save model '${this.modelPath}' to local storage: size quota being exceeded is a possible cause of this failure: modelTopologyBytes=${modelArtifactsInfo.modelTopologyBytes}, weightSpecsBytes=${modelArtifactsInfo.weightSpecsBytes}, weightDataBytes=${modelArtifactsInfo.weightDataBytes}.`); + } + } + } + async load() { + const info2 = JSON.parse(this.LS.getItem(this.keys.info)); + if (info2 == null) { + throw new Error(`In local storage, there is no model with name '${this.modelPath}'`); + } + if (info2.modelTopologyType !== "JSON") { + throw new Error("BrowserLocalStorage does not support loading non-JSON model topology yet."); + } + const out = {}; + const topology = JSON.parse(this.LS.getItem(this.keys.topology)); + if (topology == null) { + throw new Error(`In local storage, the topology of model '${this.modelPath}' is missing.`); + } + out.modelTopology = topology; + const weightSpecs = JSON.parse(this.LS.getItem(this.keys.weightSpecs)); + if (weightSpecs == null) { + throw new Error(`In local storage, the weight specs of model '${this.modelPath}' are missing.`); + } + out.weightSpecs = weightSpecs; + const metadataString = this.LS.getItem(this.keys.modelMetadata); + if (metadataString != null) { + const metadata = JSON.parse(metadataString); + out.format = metadata["format"]; + out.generatedBy = metadata["generatedBy"]; + out.convertedBy = metadata["convertedBy"]; + if (metadata["signature"] != null) { + out.signature = metadata["signature"]; + } + if (metadata["userDefinedMetadata"] != null) { + out.userDefinedMetadata = metadata["userDefinedMetadata"]; + } + if (metadata["modelInitializer"] != null) { + out.modelInitializer = metadata["modelInitializer"]; + } + } + const weightDataBase64 = this.LS.getItem(this.keys.weightData); + if (weightDataBase64 == null) { + throw new Error(`In local storage, the binary weight values of model '${this.modelPath}' are missing.`); + } + out.weightData = base64StringToArrayBuffer(weightDataBase64); + return out; + } + }; + BrowserLocalStorage.URL_SCHEME = "localstorage://"; + var localStorageRouter = (url) => { + if (!env().getBool("IS_BROWSER")) { + return null; + } else { + if (!Array.isArray(url) && url.startsWith(BrowserLocalStorage.URL_SCHEME)) { + return browserLocalStorage(url.slice(BrowserLocalStorage.URL_SCHEME.length)); + } else { + return null; + } + } + }; + IORouterRegistry.registerSaveRouter(localStorageRouter); + IORouterRegistry.registerLoadRouter(localStorageRouter); + function browserLocalStorage(modelPath) { + return new BrowserLocalStorage(modelPath); + } + var BrowserLocalStorageManager = class { + constructor() { + assert(env().getBool("IS_BROWSER"), () => "Current environment is not a web browser"); + assert(typeof window === "undefined" || typeof window.localStorage !== "undefined", () => "Current browser does not appear to support localStorage"); + this.LS = window.localStorage; + } + async listModels() { + const out = {}; + const prefix = PATH_PREFIX + PATH_SEPARATOR; + const suffix = PATH_SEPARATOR + INFO_SUFFIX; + for (let i = 0; i < this.LS.length; ++i) { + const key = this.LS.key(i); + if (key.startsWith(prefix) && key.endsWith(suffix)) { + const modelPath = getModelPathFromKey(key); + out[modelPath] = JSON.parse(this.LS.getItem(key)); + } + } + return out; + } + async removeModel(path) { + path = maybeStripScheme2(path); + const keys = getModelKeys(path); + if (this.LS.getItem(keys.info) == null) { + throw new Error(`Cannot find model at path '${path}'`); + } + const info2 = JSON.parse(this.LS.getItem(keys.info)); + this.LS.removeItem(keys.info); + this.LS.removeItem(keys.topology); + this.LS.removeItem(keys.weightSpecs); + this.LS.removeItem(keys.weightData); + return info2; + } + }; + /** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + var URL_SCHEME_SUFFIX = "://"; + var ModelStoreManagerRegistry = class { + constructor() { + this.managers = {}; + } + static getInstance() { + if (ModelStoreManagerRegistry.instance == null) { + ModelStoreManagerRegistry.instance = new ModelStoreManagerRegistry(); + } + return ModelStoreManagerRegistry.instance; + } + static registerManager(scheme, manager) { + assert(scheme != null, () => "scheme must not be undefined or null."); + if (scheme.endsWith(URL_SCHEME_SUFFIX)) { + scheme = scheme.slice(0, scheme.indexOf(URL_SCHEME_SUFFIX)); + } + assert(scheme.length > 0, () => "scheme must not be an empty string."); + const registry = ModelStoreManagerRegistry.getInstance(); + assert(registry.managers[scheme] == null, () => `A model store manager is already registered for scheme '${scheme}'.`); + registry.managers[scheme] = manager; + } + static getManager(scheme) { + const manager = this.getInstance().managers[scheme]; + if (manager == null) { + throw new Error(`Cannot find model manager for scheme '${scheme}'`); + } + return manager; + } + static getSchemes() { + return Object.keys(this.getInstance().managers); + } + }; + function parseURL(url) { + if (url.indexOf(URL_SCHEME_SUFFIX) === -1) { + throw new Error(`The url string provided does not contain a scheme. Supported schemes are: ${ModelStoreManagerRegistry.getSchemes().join(",")}`); + } + return { + scheme: url.split(URL_SCHEME_SUFFIX)[0], + path: url.split(URL_SCHEME_SUFFIX)[1] + }; + } + async function cloneModelInternal(sourceURL, destURL, deleteSource = false) { + assert(sourceURL !== destURL, () => `Old path and new path are the same: '${sourceURL}'`); + const loadHandlers = IORouterRegistry.getLoadHandlers(sourceURL); + assert(loadHandlers.length > 0, () => `Copying failed because no load handler is found for source URL ${sourceURL}.`); + assert(loadHandlers.length < 2, () => `Copying failed because more than one (${loadHandlers.length}) load handlers for source URL ${sourceURL}.`); + const loadHandler = loadHandlers[0]; + const saveHandlers = IORouterRegistry.getSaveHandlers(destURL); + assert(saveHandlers.length > 0, () => `Copying failed because no save handler is found for destination URL ${destURL}.`); + assert(saveHandlers.length < 2, () => `Copying failed because more than one (${loadHandlers.length}) save handlers for destination URL ${destURL}.`); + const saveHandler = saveHandlers[0]; + const sourceScheme = parseURL(sourceURL).scheme; + const sourcePath = parseURL(sourceURL).path; + const sameMedium = sourceScheme === parseURL(sourceURL).scheme; + const modelArtifacts = await loadHandler.load(); + if (deleteSource && sameMedium) { + await ModelStoreManagerRegistry.getManager(sourceScheme).removeModel(sourcePath); + } + const saveResult = await saveHandler.save(modelArtifacts); + if (deleteSource && !sameMedium) { + await ModelStoreManagerRegistry.getManager(sourceScheme).removeModel(sourcePath); + } + return saveResult.modelArtifactsInfo; + } + async function listModels() { + const schemes = ModelStoreManagerRegistry.getSchemes(); + const out = {}; + for (const scheme of schemes) { + const schemeOut = await ModelStoreManagerRegistry.getManager(scheme).listModels(); + for (const path in schemeOut) { + const url = scheme + URL_SCHEME_SUFFIX + path; + out[url] = schemeOut[path]; + } + } + return out; + } + async function removeModel(url) { + const schemeAndPath = parseURL(url); + const manager = ModelStoreManagerRegistry.getManager(schemeAndPath.scheme); + return manager.removeModel(schemeAndPath.path); + } + async function copyModel(sourceURL, destURL) { + const deleteSource = false; + return cloneModelInternal(sourceURL, destURL, deleteSource); + } + async function moveModel(sourceURL, destURL) { + const deleteSource = true; + return cloneModelInternal(sourceURL, destURL, deleteSource); + } + /** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + var PlatformBrowser = class { + fetch(path, init2) { + return fetch(path, init2); + } + now() { + return performance.now(); + } + encode(text, encoding) { + if (encoding !== "utf-8" && encoding !== "utf8") { + throw new Error(`Browser's encoder only supports utf-8, but got ${encoding}`); + } + if (this.textEncoder == null) { + this.textEncoder = new TextEncoder(); + } + return this.textEncoder.encode(text); + } + decode(bytes, encoding) { + return new TextDecoder(encoding).decode(bytes); + } + }; + if (env().get("IS_BROWSER")) { + env().setPlatform("browser", new PlatformBrowser()); + try { + ModelStoreManagerRegistry.registerManager(BrowserLocalStorage.URL_SCHEME, new BrowserLocalStorageManager()); + } catch (err) { + } + try { + ModelStoreManagerRegistry.registerManager(BrowserIndexedDB.URL_SCHEME, new BrowserIndexedDBManager()); + } catch (err) { + } + } + /** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + var getNodeFetch = { + importFetch: () => require_browser() + }; + var systemFetch; + var PlatformNode = class { + constructor() { + this.util = require("util"); + this.textEncoder = new this.util.TextEncoder(); + } + fetch(path, requestInits) { + if (env().global.fetch != null) { + return env().global.fetch(path, requestInits); + } + if (systemFetch == null) { + systemFetch = getNodeFetch.importFetch(); + } + return systemFetch(path, requestInits); + } + now() { + const time2 = process.hrtime(); + return time2[0] * 1e3 + time2[1] / 1e6; + } + encode(text, encoding) { + if (encoding !== "utf-8" && encoding !== "utf8") { + throw new Error(`Node built-in encoder only supports utf-8, but got ${encoding}`); + } + return this.textEncoder.encode(text); + } + decode(bytes, encoding) { + if (bytes.length === 0) { + return ""; + } + return new this.util.TextDecoder(encoding).decode(bytes); + } + }; + if (env().get("IS_NODE")) { + env().setPlatform("node", new PlatformNode()); + } + /** + * @license + * Copyright 2020 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + function buffer(shape, dtype = "float32", values) { + dtype = dtype || "float32"; + assertNonNegativeIntegerDimensions(shape); + return new TensorBuffer(shape, dtype, values); + } + /** + * @license + * Copyright 2020 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + function cast_(x, dtype) { + const $x = convertToTensor(x, "x", "cast"); + if (!isValidDtype(dtype)) { + throw new Error(`Failed to cast to unknown dtype ${dtype}`); + } + if (dtype === "string" && $x.dtype !== "string" || dtype !== "string" && $x.dtype === "string") { + throw new Error("Only strings can be casted to strings"); + } + const inputs = {x: $x}; + const attrs = {dtype}; + return ENGINE.runKernel(Cast, inputs, attrs); + } + var cast = op({cast_}); + /** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + function clone_(x) { + const $x = convertToTensor(x, "x", "clone", "string_or_numeric"); + const inputs = {x: $x}; + return ENGINE.runKernel(Identity, inputs); + } + var clone = op({clone_}); + /** + * @license + * Copyright 2020 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + function print2(x, verbose = false) { + console.log(x.toString(verbose)); + } + /** + * @license + * Copyright 2020 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + getOrMakeEngine(); + var opHandler2 = { + buffer, + cast, + clone, + print: print2 + }; + setOpHandler(opHandler2); + var io_exports = {}; + __export2(io_exports, { + browserFiles: () => browserFiles, + browserHTTPRequest: () => browserHTTPRequest, + concatenateArrayBuffers: () => concatenateArrayBuffers, + copyModel: () => copyModel, + decodeWeights: () => decodeWeights, + encodeWeights: () => encodeWeights, + fromMemory: () => fromMemory, + getLoadHandlers: () => getLoadHandlers, + getModelArtifactsInfoForJSON: () => getModelArtifactsInfoForJSON, + getSaveHandlers: () => getSaveHandlers, + http: () => http, + isHTTPScheme: () => isHTTPScheme, + listModels: () => listModels, + loadWeights: () => loadWeights, + moveModel: () => moveModel, + registerLoadRouter: () => registerLoadRouter, + registerSaveRouter: () => registerSaveRouter, + removeModel: () => removeModel, + weightsLoaderFactory: () => weightsLoaderFactory, + withSaveHandler: () => withSaveHandler + }); + /** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + var DEFAULT_FILE_NAME_PREFIX = "model"; + var DEFAULT_JSON_EXTENSION_NAME = ".json"; + var DEFAULT_WEIGHT_DATA_EXTENSION_NAME = ".weights.bin"; + function defer(f) { + return new Promise((resolve) => setTimeout(resolve)).then(f); + } + var BrowserDownloads = class { + constructor(fileNamePrefix) { + if (!env().getBool("IS_BROWSER")) { + throw new Error("browserDownloads() cannot proceed because the current environment is not a browser."); + } + if (fileNamePrefix.startsWith(BrowserDownloads.URL_SCHEME)) { + fileNamePrefix = fileNamePrefix.slice(BrowserDownloads.URL_SCHEME.length); + } + if (fileNamePrefix == null || fileNamePrefix.length === 0) { + fileNamePrefix = DEFAULT_FILE_NAME_PREFIX; + } + this.modelTopologyFileName = fileNamePrefix + DEFAULT_JSON_EXTENSION_NAME; + this.weightDataFileName = fileNamePrefix + DEFAULT_WEIGHT_DATA_EXTENSION_NAME; + } + async save(modelArtifacts) { + if (typeof document === "undefined") { + throw new Error("Browser downloads are not supported in this environment since `document` is not present"); + } + const weightsURL = window.URL.createObjectURL(new Blob([modelArtifacts.weightData], {type: "application/octet-stream"})); + if (modelArtifacts.modelTopology instanceof ArrayBuffer) { + throw new Error("BrowserDownloads.save() does not support saving model topology in binary formats yet."); + } else { + const weightsManifest = [{ + paths: ["./" + this.weightDataFileName], + weights: modelArtifacts.weightSpecs + }]; + const modelTopologyAndWeightManifest = { + modelTopology: modelArtifacts.modelTopology, + format: modelArtifacts.format, + generatedBy: modelArtifacts.generatedBy, + convertedBy: modelArtifacts.convertedBy, + weightsManifest + }; + if (modelArtifacts.signature != null) { + modelTopologyAndWeightManifest.signature = modelArtifacts.signature; + } + if (modelArtifacts.userDefinedMetadata != null) { + modelTopologyAndWeightManifest.userDefinedMetadata = modelArtifacts.userDefinedMetadata; + } + if (modelArtifacts.modelInitializer != null) { + modelTopologyAndWeightManifest.modelInitializer = modelArtifacts.modelInitializer; + } + const modelTopologyAndWeightManifestURL = window.URL.createObjectURL(new Blob([JSON.stringify(modelTopologyAndWeightManifest)], {type: "application/json"})); + const jsonAnchor = this.jsonAnchor == null ? document.createElement("a") : this.jsonAnchor; + jsonAnchor.download = this.modelTopologyFileName; + jsonAnchor.href = modelTopologyAndWeightManifestURL; + await defer(() => jsonAnchor.dispatchEvent(new MouseEvent("click"))); + if (modelArtifacts.weightData != null) { + const weightDataAnchor = this.weightDataAnchor == null ? document.createElement("a") : this.weightDataAnchor; + weightDataAnchor.download = this.weightDataFileName; + weightDataAnchor.href = weightsURL; + await defer(() => weightDataAnchor.dispatchEvent(new MouseEvent("click"))); + } + return {modelArtifactsInfo: getModelArtifactsInfoForJSON(modelArtifacts)}; + } + } + }; + BrowserDownloads.URL_SCHEME = "downloads://"; + var BrowserFiles = class { + constructor(files) { + if (files == null || files.length < 1) { + throw new Error(`When calling browserFiles, at least 1 file is required, but received ${files}`); + } + this.files = files; + } + async load() { + const jsonFile = this.files[0]; + const weightFiles = this.files.slice(1); + return new Promise((resolve, reject) => { + const jsonReader = new FileReader(); + jsonReader.onload = (event) => { + const modelJSON = JSON.parse(event.target.result); + const modelTopology = modelJSON.modelTopology; + if (modelTopology == null) { + reject(new Error(`modelTopology field is missing from file ${jsonFile.name}`)); + return; + } + if (weightFiles.length === 0) { + resolve({modelTopology}); + } + const weightsManifest = modelJSON.weightsManifest; + if (weightsManifest == null) { + reject(new Error(`weightManifest field is missing from file ${jsonFile.name}`)); + return; + } + let pathToFile; + try { + pathToFile = this.checkManifestAndWeightFiles(weightsManifest, weightFiles); + } catch (err) { + reject(err); + return; + } + const weightSpecs = []; + const paths = []; + const perFileBuffers = []; + weightsManifest.forEach((weightsGroup) => { + weightsGroup.paths.forEach((path) => { + paths.push(path); + perFileBuffers.push(null); + }); + weightSpecs.push(...weightsGroup.weights); + }); + weightsManifest.forEach((weightsGroup) => { + weightsGroup.paths.forEach((path) => { + const weightFileReader = new FileReader(); + weightFileReader.onload = (event2) => { + const weightData = event2.target.result; + const index = paths.indexOf(path); + perFileBuffers[index] = weightData; + if (perFileBuffers.indexOf(null) === -1) { + const result = { + modelTopology, + weightSpecs, + weightData: concatenateArrayBuffers(perFileBuffers), + format: modelJSON.format, + generatedBy: modelJSON.generatedBy, + convertedBy: modelJSON.convertedBy + }; + if (modelJSON.signature != null) { + result.signature = modelJSON.signature; + } + if (modelJSON.userDefinedMetadata != null) { + result.userDefinedMetadata = modelJSON.userDefinedMetadata; + } + if (modelJSON.modelInitializer != null) { + result.modelInitializer = modelJSON.modelInitializer; + } + resolve(result); + } + }; + weightFileReader.onerror = (error) => reject(`Failed to weights data from file of path '${path}'.`); + weightFileReader.readAsArrayBuffer(pathToFile[path]); + }); + }); + }; + jsonReader.onerror = (error) => reject(`Failed to read model topology and weights manifest JSON from file '${jsonFile.name}'. BrowserFiles supports loading Keras-style tf.Model artifacts only.`); + jsonReader.readAsText(jsonFile); + }); + } + checkManifestAndWeightFiles(manifest, files) { + const basenames = []; + const fileNames = files.map((file) => basename(file.name)); + const pathToFile = {}; + for (const group of manifest) { + group.paths.forEach((path) => { + const pathBasename = basename(path); + if (basenames.indexOf(pathBasename) !== -1) { + throw new Error(`Duplicate file basename found in weights manifest: '${pathBasename}'`); + } + basenames.push(pathBasename); + if (fileNames.indexOf(pathBasename) === -1) { + throw new Error(`Weight file with basename '${pathBasename}' is not provided.`); + } else { + pathToFile[path] = files[fileNames.indexOf(pathBasename)]; + } + }); + } + if (basenames.length !== files.length) { + throw new Error(`Mismatch in the number of files in weights manifest (${basenames.length}) and the number of weight files provided (${files.length}).`); + } + return pathToFile; + } + }; + var browserDownloadsRouter = (url) => { + if (!env().getBool("IS_BROWSER")) { + return null; + } else { + if (!Array.isArray(url) && url.startsWith(BrowserDownloads.URL_SCHEME)) { + return browserDownloads(url.slice(BrowserDownloads.URL_SCHEME.length)); + } else { + return null; + } + } + }; + IORouterRegistry.registerSaveRouter(browserDownloadsRouter); + function browserDownloads(fileNamePrefix = "model") { + return new BrowserDownloads(fileNamePrefix); + } + function browserFiles(files) { + return new BrowserFiles(files); + } + /** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + function monitorPromisesProgress(promises, onProgress, startFraction, endFraction) { + checkPromises(promises); + startFraction = startFraction == null ? 0 : startFraction; + endFraction = endFraction == null ? 1 : endFraction; + checkFraction(startFraction, endFraction); + let resolvedPromise = 0; + const registerMonitor = (promise) => { + promise.then((value) => { + const fraction = startFraction + ++resolvedPromise / promises.length * (endFraction - startFraction); + onProgress(fraction); + return value; + }); + return promise; + }; + function checkPromises(promises2) { + assert(promises2 != null && Array.isArray(promises2) && promises2.length > 0, () => "promises must be a none empty array"); + } + function checkFraction(startFraction2, endFraction2) { + assert(startFraction2 >= 0 && startFraction2 <= 1, () => `Progress fraction must be in range [0, 1], but got startFraction ${startFraction2}`); + assert(endFraction2 >= 0 && endFraction2 <= 1, () => `Progress fraction must be in range [0, 1], but got endFraction ${endFraction2}`); + assert(endFraction2 >= startFraction2, () => `startFraction must be no more than endFraction, but got startFraction ${startFraction2} and endFraction ${endFraction2}`); + } + return Promise.all(promises.map(registerMonitor)); + } + /** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + async function loadWeightsAsArrayBuffer(fetchURLs, loadOptions) { + if (loadOptions == null) { + loadOptions = {}; + } + const fetchFunc = loadOptions.fetchFunc == null ? env().platform.fetch : loadOptions.fetchFunc; + const requests = fetchURLs.map((fetchURL) => fetchFunc(fetchURL, loadOptions.requestInit, {isBinary: true})); + const fetchStartFraction = 0; + const fetchEndFraction = 0.5; + const responses = loadOptions.onProgress == null ? await Promise.all(requests) : await monitorPromisesProgress(requests, loadOptions.onProgress, fetchStartFraction, fetchEndFraction); + const bufferPromises = responses.map((response) => response.arrayBuffer()); + const bufferStartFraction = 0.5; + const bufferEndFraction = 1; + const buffers = loadOptions.onProgress == null ? await Promise.all(bufferPromises) : await monitorPromisesProgress(bufferPromises, loadOptions.onProgress, bufferStartFraction, bufferEndFraction); + return buffers; + } + async function loadWeights(manifest, filePathPrefix = "", weightNames, requestInit) { + const fetchWeights = (fetchUrls) => loadWeightsAsArrayBuffer(fetchUrls, {requestInit}); + const loadWeights2 = weightsLoaderFactory(fetchWeights); + return loadWeights2(manifest, filePathPrefix, weightNames); + } + function weightsLoaderFactory(fetchWeightsFunction) { + return async (manifest, filePathPrefix = "", weightNames) => { + const groupIndicesToFetchMap = manifest.map(() => false); + const groupWeightsToFetch = {}; + const weightsFound = weightNames != null ? weightNames.map(() => false) : []; + const allManifestWeightNames = []; + manifest.forEach((manifestGroupConfig, groupIndex) => { + let groupOffset = 0; + manifestGroupConfig.weights.forEach((weightsEntry) => { + const rawDtype = "quantization" in weightsEntry ? weightsEntry.quantization.dtype : weightsEntry.dtype; + const weightsBytes = DTYPE_VALUE_SIZE_MAP[rawDtype] * sizeFromShape(weightsEntry.shape); + const enqueueWeightsForFetchingFn = () => { + groupIndicesToFetchMap[groupIndex] = true; + if (groupWeightsToFetch[groupIndex] == null) { + groupWeightsToFetch[groupIndex] = []; + } + groupWeightsToFetch[groupIndex].push({ + manifestEntry: weightsEntry, + groupOffset, + sizeBytes: weightsBytes + }); + }; + if (weightNames != null) { + weightNames.forEach((weightName, weightIndex) => { + if (weightName === weightsEntry.name) { + enqueueWeightsForFetchingFn(); + weightsFound[weightIndex] = true; + } + }); + } else { + enqueueWeightsForFetchingFn(); + } + allManifestWeightNames.push(weightsEntry.name); + groupOffset += weightsBytes; + }); + }); + if (!weightsFound.every((found) => found)) { + const weightsNotFound = weightNames.filter((_, i) => !weightsFound[i]); + throw new Error(`Could not find weights in manifest with names: ${weightsNotFound.join(", ")}. +Manifest JSON has weights with names: ${allManifestWeightNames.join(", ")}.`); + } + const groupIndicesToFetch = groupIndicesToFetchMap.reduce((accumulator, shouldFetch, i) => { + if (shouldFetch) { + accumulator.push(i); + } + return accumulator; + }, []); + const fetchUrls = []; + groupIndicesToFetch.forEach((i) => { + manifest[i].paths.forEach((filepath) => { + const fetchUrl = filePathPrefix + (!filePathPrefix.endsWith("/") ? "/" : "") + filepath; + fetchUrls.push(fetchUrl); + }); + }); + const buffers = await fetchWeightsFunction(fetchUrls); + const weightsTensorMap = {}; + let bufferIndexOffset = 0; + groupIndicesToFetch.forEach((i) => { + const numBuffers = manifest[i].paths.length; + let groupBytes = 0; + for (let i2 = 0; i2 < numBuffers; i2++) { + groupBytes += buffers[bufferIndexOffset + i2].byteLength; + } + const groupBuffer = new ArrayBuffer(groupBytes); + const groupByteBuffer = new Uint8Array(groupBuffer); + let groupBufferOffset = 0; + for (let i2 = 0; i2 < numBuffers; i2++) { + const buffer2 = new Uint8Array(buffers[bufferIndexOffset + i2]); + groupByteBuffer.set(buffer2, groupBufferOffset); + groupBufferOffset += buffer2.byteLength; + } + const weightsEntries = groupWeightsToFetch[i]; + weightsEntries.forEach((weightsEntry) => { + const byteBuffer = groupBuffer.slice(weightsEntry.groupOffset, weightsEntry.groupOffset + weightsEntry.sizeBytes); + const nameToTensorMap = decodeWeights(byteBuffer, [weightsEntry.manifestEntry]); + for (const name in nameToTensorMap) { + weightsTensorMap[name] = nameToTensorMap[name]; + } + }); + bufferIndexOffset += numBuffers; + }); + return weightsTensorMap; + }; + } + /** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + var OCTET_STREAM_MIME_TYPE = "application/octet-stream"; + var JSON_TYPE = "application/json"; + var HTTPRequest = class { + constructor(path, loadOptions) { + this.DEFAULT_METHOD = "POST"; + if (loadOptions == null) { + loadOptions = {}; + } + this.weightPathPrefix = loadOptions.weightPathPrefix; + this.onProgress = loadOptions.onProgress; + this.weightUrlConverter = loadOptions.weightUrlConverter; + if (loadOptions.fetchFunc != null) { + assert(typeof loadOptions.fetchFunc === "function", () => "Must pass a function that matches the signature of `fetch` (see https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API)"); + this.fetch = loadOptions.fetchFunc; + } else { + this.fetch = env().platform.fetch; + } + assert(path != null && path.length > 0, () => "URL path for http must not be null, undefined or empty."); + if (Array.isArray(path)) { + assert(path.length === 2, () => `URL paths for http must have a length of 2, (actual length is ${path.length}).`); + } + this.path = path; + if (loadOptions.requestInit != null && loadOptions.requestInit.body != null) { + throw new Error("requestInit is expected to have no pre-existing body, but has one."); + } + this.requestInit = loadOptions.requestInit || {}; + } + async save(modelArtifacts) { + if (modelArtifacts.modelTopology instanceof ArrayBuffer) { + throw new Error("BrowserHTTPRequest.save() does not support saving model topology in binary formats yet."); + } + const init2 = Object.assign({method: this.DEFAULT_METHOD}, this.requestInit); + init2.body = new FormData(); + const weightsManifest = [{ + paths: ["./model.weights.bin"], + weights: modelArtifacts.weightSpecs + }]; + const modelTopologyAndWeightManifest = { + modelTopology: modelArtifacts.modelTopology, + format: modelArtifacts.format, + generatedBy: modelArtifacts.generatedBy, + convertedBy: modelArtifacts.convertedBy, + weightsManifest + }; + if (modelArtifacts.signature != null) { + modelTopologyAndWeightManifest.signature = modelArtifacts.signature; + } + if (modelArtifacts.userDefinedMetadata != null) { + modelTopologyAndWeightManifest.userDefinedMetadata = modelArtifacts.userDefinedMetadata; + } + if (modelArtifacts.modelInitializer != null) { + modelTopologyAndWeightManifest.modelInitializer = modelArtifacts.modelInitializer; + } + init2.body.append("model.json", new Blob([JSON.stringify(modelTopologyAndWeightManifest)], {type: JSON_TYPE}), "model.json"); + if (modelArtifacts.weightData != null) { + init2.body.append("model.weights.bin", new Blob([modelArtifacts.weightData], {type: OCTET_STREAM_MIME_TYPE}), "model.weights.bin"); + } + const response = await this.fetch(this.path, init2); + if (response.ok) { + return { + modelArtifactsInfo: getModelArtifactsInfoForJSON(modelArtifacts), + responses: [response] + }; + } else { + throw new Error(`BrowserHTTPRequest.save() failed due to HTTP response status ${response.status}.`); + } + } + async load() { + const modelConfigRequest = await this.fetch(this.path, this.requestInit); + if (!modelConfigRequest.ok) { + throw new Error(`Request to ${this.path} failed with status code ${modelConfigRequest.status}. Please verify this URL points to the model JSON of the model to load.`); + } + let modelConfig; + try { + modelConfig = await modelConfigRequest.json(); + } catch (e) { + let message = `Failed to parse model JSON of response from ${this.path}.`; + if (this.path.endsWith(".pb")) { + message += " Your path contains a .pb file extension. Support for .pb models have been removed in TensorFlow.js 1.0 in favor of .json models. You can re-convert your Python TensorFlow model using the TensorFlow.js 1.0 conversion scripts or you can convert your.pb models with the 'pb2json'NPM script in the tensorflow/tfjs-converter repository."; + } else { + message += " Please make sure the server is serving valid JSON for this request."; + } + throw new Error(message); + } + const modelTopology = modelConfig.modelTopology; + const weightsManifest = modelConfig.weightsManifest; + const generatedBy = modelConfig.generatedBy; + const convertedBy = modelConfig.convertedBy; + const format = modelConfig.format; + const signature = modelConfig.signature; + const userDefinedMetadata = modelConfig.userDefinedMetadata; + if (modelTopology == null && weightsManifest == null) { + throw new Error(`The JSON from HTTP path ${this.path} contains neither model topology or manifest for weights.`); + } + let weightSpecs; + let weightData; + if (weightsManifest != null) { + const results = await this.loadWeights(weightsManifest); + [weightSpecs, weightData] = results; + } + const artifacts = { + modelTopology, + weightSpecs, + weightData, + generatedBy, + convertedBy, + format + }; + if (signature != null) { + artifacts.signature = signature; + } + if (userDefinedMetadata != null) { + artifacts.userDefinedMetadata = userDefinedMetadata; + } + const initializer = modelConfig.modelInitializer; + if (initializer) { + artifacts.modelInitializer = initializer; + } + return artifacts; + } + async loadWeights(weightsManifest) { + const weightPath = Array.isArray(this.path) ? this.path[1] : this.path; + const [prefix, suffix] = parseUrl(weightPath); + const pathPrefix = this.weightPathPrefix || prefix; + const weightSpecs = []; + for (const entry of weightsManifest) { + weightSpecs.push(...entry.weights); + } + const fetchURLs = []; + const urlPromises = []; + for (const weightsGroup of weightsManifest) { + for (const path of weightsGroup.paths) { + if (this.weightUrlConverter != null) { + urlPromises.push(this.weightUrlConverter(path)); + } else { + fetchURLs.push(pathPrefix + path + suffix); + } + } + } + if (this.weightUrlConverter) { + fetchURLs.push(...await Promise.all(urlPromises)); + } + const buffers = await loadWeightsAsArrayBuffer(fetchURLs, { + requestInit: this.requestInit, + fetchFunc: this.fetch, + onProgress: this.onProgress + }); + return [weightSpecs, concatenateArrayBuffers(buffers)]; + } + }; + HTTPRequest.URL_SCHEME_REGEX = /^https?:\/\//; + function parseUrl(url) { + const lastSlash = url.lastIndexOf("/"); + const lastSearchParam = url.lastIndexOf("?"); + const prefix = url.substring(0, lastSlash); + const suffix = lastSearchParam > lastSlash ? url.substring(lastSearchParam) : ""; + return [prefix + "/", suffix]; + } + function isHTTPScheme(url) { + return url.match(HTTPRequest.URL_SCHEME_REGEX) != null; + } + var httpRouter = (url, loadOptions) => { + if (typeof fetch === "undefined" && (loadOptions == null || loadOptions.fetchFunc == null)) { + return null; + } else { + let isHTTP = true; + if (Array.isArray(url)) { + isHTTP = url.every((urlItem) => isHTTPScheme(urlItem)); + } else { + isHTTP = isHTTPScheme(url); + } + if (isHTTP) { + return http(url, loadOptions); + } + } + return null; + }; + IORouterRegistry.registerSaveRouter(httpRouter); + IORouterRegistry.registerLoadRouter(httpRouter); + function http(path, loadOptions) { + return new HTTPRequest(path, loadOptions); + } + function browserHTTPRequest(path, loadOptions) { + return http(path, loadOptions); + } + /** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + var PassthroughLoader = class { + constructor(modelArtifacts) { + this.modelArtifacts = modelArtifacts; + } + async load() { + return this.modelArtifacts; + } + }; + var PassthroughSaver = class { + constructor(saveHandler) { + this.saveHandler = saveHandler; + } + async save(modelArtifacts) { + return this.saveHandler(modelArtifacts); + } + }; + function fromMemory(modelArtifacts, weightSpecs, weightData, trainingConfig) { + if (arguments.length === 1) { + const isModelArtifacts = modelArtifacts.modelTopology != null || modelArtifacts.weightSpecs != null; + if (isModelArtifacts) { + return new PassthroughLoader(modelArtifacts); + } else { + console.warn("Please call tf.io.fromMemory() with only one argument. The argument should be of type ModelArtifacts. The multi-argument signature of tf.io.fromMemory() has been deprecated and will be removed in a future release."); + return new PassthroughLoader({modelTopology: modelArtifacts}); + } + } else { + console.warn("Please call tf.io.fromMemory() with only one argument. The argument should be of type ModelArtifacts. The multi-argument signature of tf.io.fromMemory() has been deprecated and will be removed in a future release."); + return new PassthroughLoader({ + modelTopology: modelArtifacts, + weightSpecs, + weightData, + trainingConfig + }); + } + } + function withSaveHandler(saveHandler) { + return new PassthroughSaver(saveHandler); + } + /** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + var math_exports = {}; + __export2(math_exports, { + confusionMatrix: () => confusionMatrix + }); + /** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + function matMul_(a, b, transposeA = false, transposeB = false) { + let $a = convertToTensor(a, "a", "matMul"); + let $b = convertToTensor(b, "b", "matMul"); + [$a, $b] = makeTypesMatch($a, $b); + const inputs = {a: $a, b: $b}; + const attrs = {transposeA, transposeB}; + return ENGINE.runKernel(BatchMatMul, inputs, attrs); + } + var matMul = op({matMul_}); + /** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + function oneHot_(indices, depth, onValue = 1, offValue = 0) { + if (depth < 2) { + throw new Error(`Error in oneHot: depth must be >=2, but it is ${depth}`); + } + const $indices = convertToTensor(indices, "indices", "oneHot", "int32"); + const inputs = {indices: $indices}; + const attrs = {depth, onValue, offValue}; + return ENGINE.runKernel(OneHot, inputs, attrs); + } + var oneHot = op({oneHot_}); + /** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + function transpose_(x, perm) { + const $x = convertToTensor(x, "x", "transpose"); + if (perm == null) { + perm = $x.shape.map((s, i) => i).reverse(); + } + assert($x.rank === perm.length, () => `Error in transpose: rank of input ${$x.rank} must match length of perm ${perm}.`); + perm.forEach((axis) => { + assert(axis >= 0 && axis < $x.rank, () => `All entries in 'perm' must be between 0 and ${$x.rank - 1} but got ${perm}`); + }); + if ($x.rank <= 1) { + return $x.clone(); + } + const inputs = {x: $x}; + const attrs = {perm}; + return ENGINE.runKernel(Transpose, inputs, attrs); + } + var transpose = op({transpose_}); + /** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + function confusionMatrix_(labels2, predictions, numClasses) { + const $labels = convertToTensor(labels2, "labels", "confusionMatrix"); + const $predictions = convertToTensor(predictions, "predictions", "confusionMatrix"); + assert(numClasses == null || numClasses > 0 && Number.isInteger(numClasses), () => `If provided, numClasses must be a positive integer, but got ${numClasses}`); + assert($labels.rank === 1, () => `Expected the rank of labels to be 1, but got ${$labels.rank}`); + assert($predictions.rank === 1, () => `Expected the rank of predictions to be 1, but got ${$predictions.rank}`); + assert($labels.shape[0] === $predictions.shape[0], () => `Mismatch in the number of examples: ${$labels.shape[0]} vs. ${$predictions.shape[0]}. Labels and predictions should have the same number of elements.`); + assert(numClasses > 0 && Number.isInteger(numClasses), () => `numClasses is required to be a positive integer, but got ${numClasses}`); + const oneHotLabels = oneHot(cast($labels, "int32"), numClasses); + const oneHotPredictions = oneHot(cast($predictions, "int32"), numClasses); + const oneHotLabelsT = transpose(oneHotLabels); + const product = matMul(oneHotLabelsT, oneHotPredictions); + return cast(product, "int32"); + } + var confusionMatrix = op({confusionMatrix_}); + /** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + var browser_exports = {}; + __export2(browser_exports, { + fromPixels: () => fromPixels, + fromPixelsAsync: () => fromPixelsAsync, + toPixels: () => toPixels + }); + /** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + function tensor3d(values, shape, dtype) { + assertNonNull(values); + if (shape != null && shape.length !== 3) { + throw new Error("tensor3d() requires shape to have three numbers"); + } + const inferredShape = inferShape(values, dtype); + if (inferredShape.length !== 3 && inferredShape.length !== 1) { + throw new Error("tensor3d() requires values to be number[][][] or flat/TypedArray"); + } + if (inferredShape.length === 1 && shape == null) { + throw new Error("tensor3d() requires shape to be provided when `values` are a flat array"); + } + return makeTensor(values, shape, inferredShape, dtype); + } + /** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + var fromPixels2DContext; + function fromPixels_(pixels, numChannels = 3) { + if (numChannels > 4) { + throw new Error("Cannot construct Tensor with more than 4 channels from pixels."); + } + if (pixels == null) { + throw new Error("pixels passed to tf.browser.fromPixels() can not be null"); + } + let isPixelData2 = false; + let isImageData = false; + let isVideo = false; + let isImage = false; + let isCanvasLike = false; + let isImageBitmap = false; + if (pixels.data instanceof Uint8Array) { + isPixelData2 = true; + } else if (typeof ImageData !== "undefined" && pixels instanceof ImageData) { + isImageData = true; + } else if (typeof HTMLVideoElement !== "undefined" && pixels instanceof HTMLVideoElement) { + isVideo = true; + } else if (typeof HTMLImageElement !== "undefined" && pixels instanceof HTMLImageElement) { + isImage = true; + } else if (pixels.getContext != null) { + isCanvasLike = true; + } else if (typeof ImageBitmap !== "undefined" && pixels instanceof ImageBitmap) { + isImageBitmap = true; + } else { + throw new Error(`pixels passed to tf.browser.fromPixels() must be either an HTMLVideoElement, HTMLImageElement, HTMLCanvasElement, ImageData in browser, or OffscreenCanvas, ImageData in webworker or {data: Uint32Array, width: number, height: number}, but was ${pixels.constructor.name}`); + } + if (isVideo) { + const HAVE_CURRENT_DATA_READY_STATE = 2; + if (isVideo && pixels.readyState < HAVE_CURRENT_DATA_READY_STATE) { + throw new Error("The video element has not loaded data yet. Please wait for `loadeddata` event on the