diff --git a/.eslintrc.json b/.eslintrc.json index 98c719d..bccb07d 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -7,7 +7,7 @@ "es2020": true }, "parser": "@typescript-eslint/parser", - "parserOptions": { "ecmaVersion": 2020 }, + "parserOptions": { "ecmaVersion": "latest" }, "plugins": [ "@typescript-eslint" ], diff --git a/CHANGELOG.md b/CHANGELOG.md index 4066eee..0eb6513 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # @vladmandic/face-api - Version: **1.7.1** + Version: **1.7.2** Description: **FaceAPI: AI-powered Face Detection & Rotation Tracking, Face Description & Recognition, Age & Gender & Emotion Prediction for Browser and NodeJS using TensorFlow/JS** Author: **Vladimir Mandic ** @@ -9,7 +9,11 @@ ## Changelog -### **HEAD -> master** 2022/08/22 mandic00@live.com +### **1.7.2** 2022/08/23 mandic00@live.com + +- document and remove optional dependencies + +### **origin/master** 2022/08/22 mandic00@live.com ### **release: 1.7.1** 2022/07/25 mandic00@live.com diff --git a/dist/face-api.esm-nobundle.js b/dist/face-api.esm-nobundle.js index 192f52d..b4bb085 100644 --- a/dist/face-api.esm-nobundle.js +++ b/dist/face-api.esm-nobundle.js @@ -4,4 +4,4 @@ author: ' */ -var lr=Object.defineProperty;var ho=Object.getOwnPropertyDescriptor;var bo=Object.getOwnPropertyNames;var go=Object.prototype.hasOwnProperty;var xo=(o=>typeof require!="undefined"?require:typeof Proxy!="undefined"?new Proxy(o,{get:(t,e)=>(typeof require!="undefined"?require:t)[e]}):o)(function(o){if(typeof require!="undefined")return require.apply(this,arguments);throw new Error('Dynamic require of "'+o+'" is not supported')});var Ve=(o,t)=>{for(var e in t)lr(o,e,{get:t[e],enumerable:!0})},fr=(o,t,e,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of bo(t))!go.call(o,a)&&a!==e&&lr(o,a,{get:()=>t[a],enumerable:!(r=ho(t,a))||r.enumerable});return o},v=(o,t,e)=>(fr(o,t,"default"),e&&fr(e,t,"default"));var n={};Ve(n,{version:()=>Eo});v(n,fn);v(n,ln);v(n,dn);import*as fn from"@tensorflow/tfjs/dist/index.js";import*as ln from"@tensorflow/tfjs-backend-webgl/dist/index.js";import*as dn from"@tensorflow/tfjs-backend-wasm/dist/index.js";var vo="3.19.0",yo="3.19.0",_o="3.19.0",To="3.19.0",Po="3.19.0",wo="3.19.0",Fo="3.19.0",Do="3.19.0",Eo={tfjs:vo,"tfjs-core":yo,"tfjs-data":_o,"tfjs-layers":To,"tfjs-converter":Po,"tfjs-backend-cpu":wo,"tfjs-backend-webgl":Fo,"tfjs-backend-wasm":Do};var Ar={};Ve(Ar,{AnchorPosition:()=>Ke,DrawBox:()=>ee,DrawBoxOptions:()=>de,DrawFaceLandmarks:()=>De,DrawFaceLandmarksOptions:()=>Fe,DrawTextField:()=>et,DrawTextFieldOptions:()=>kt,drawContour:()=>Z,drawDetections:()=>Ao,drawFaceExpressions:()=>Wo,drawFaceLandmarks:()=>Bo});function Z(o,t,e=!1){if(o.beginPath(),t.slice(1).forEach(({x:r,y:a},s)=>{let i=t[s];o.moveTo(i.x,i.y),o.lineTo(r,a)}),e){let r=t[t.length-1],a=t[0];if(!r||!a)return;o.moveTo(r.x,r.y),o.lineTo(a.x,a.y)}o.stroke()}var dr={};Ve(dr,{computeReshapedDimensions:()=>je,getCenterPoint:()=>yt,isDimensions:()=>ue,isEven:()=>pe,isFloat:()=>Ge,isTensor:()=>xt,isTensor1D:()=>Mo,isTensor2D:()=>Ye,isTensor3D:()=>K,isTensor4D:()=>R,isValidNumber:()=>G,isValidProbablitiy:()=>It,range:()=>U,round:()=>vt});var S=class{constructor(t,e){if(!G(t)||!G(e))throw new Error(`Dimensions.constructor - expected width and height to be valid numbers, instead have ${JSON.stringify({width:t,height:e})}`);this._width=t,this._height=e}get width(){return this._width}get height(){return this._height}reverse(){return new S(1/this.width,1/this.height)}};function xt(o,t){return o instanceof n.Tensor&&o.shape.length===t}function Mo(o){return xt(o,1)}function Ye(o){return xt(o,2)}function K(o){return xt(o,3)}function R(o){return xt(o,4)}function Ge(o){return o%1!==0}function pe(o){return o%2===0}function vt(o,t=2){let e=10**t;return Math.floor(o*e)/e}function ue(o){return o&&o.width&&o.height}function je({width:o,height:t},e){let r=e/Math.max(t,o);return new S(Math.round(o*r),Math.round(t*r))}function yt(o){return o.reduce((t,e)=>t.add(e),new b(0,0)).div(new b(o.length,o.length))}function U(o,t,e){return Array(o).fill(0).map((r,a)=>t+a*e)}function G(o){return!!o&&o!==1/0&&o!==-1/0&&!Number.isNaN(o)||o===0}function It(o){return G(o)&&o>=0&&o<=1}var b=class{constructor(t,e){this._x=t,this._y=e}get x(){return this._x}get y(){return this._y}add(t){return new b(this.x+t.x,this.y+t.y)}sub(t){return new b(this.x-t.x,this.y-t.y)}mul(t){return new b(this.x*t.x,this.y*t.y)}div(t){return new b(this.x/t.x,this.y/t.y)}abs(){return new b(Math.abs(this.x),Math.abs(this.y))}magnitude(){return Math.sqrt(this.x**2+this.y**2)}floor(){return new b(Math.floor(this.x),Math.floor(this.y))}};var w=class{static isRect(t){return!!t&&[t.x,t.y,t.width,t.height].every(G)}static assertIsValidBox(t,e,r=!1){if(!w.isRect(t))throw new Error(`${e} - invalid box: ${JSON.stringify(t)}, expected object with properties x, y, width, height`);if(!r&&(t.width<0||t.height<0))throw new Error(`${e} - width (${t.width}) and height (${t.height}) must be positive numbers`)}constructor(t,e=!0){let r=t||{},a=[r.left,r.top,r.right,r.bottom].every(G),s=[r.x,r.y,r.width,r.height].every(G);if(!s&&!a)throw new Error(`Box.constructor - expected box to be IBoundingBox | IRect, instead have ${JSON.stringify(r)}`);let[i,c,m,p]=s?[r.x,r.y,r.width,r.height]:[r.left,r.top,r.right-r.left,r.bottom-r.top];w.assertIsValidBox({x:i,y:c,width:m,height:p},"Box.constructor",e),this._x=i,this._y=c,this._width=m,this._height=p}get x(){return this._x}get y(){return this._y}get width(){return this._width}get height(){return this._height}get left(){return this.x}get top(){return this.y}get right(){return this.x+this.width}get bottom(){return this.y+this.height}get area(){return this.width*this.height}get topLeft(){return new b(this.left,this.top)}get topRight(){return new b(this.right,this.top)}get bottomLeft(){return new b(this.left,this.bottom)}get bottomRight(){return new b(this.right,this.bottom)}round(){let[t,e,r,a]=[this.x,this.y,this.width,this.height].map(s=>Math.round(s));return new w({x:t,y:e,width:r,height:a})}floor(){let[t,e,r,a]=[this.x,this.y,this.width,this.height].map(s=>Math.floor(s));return new w({x:t,y:e,width:r,height:a})}toSquare(){let{x:t,y:e,width:r,height:a}=this,s=Math.abs(r-a);return re&&(c=-f+e+r,f=e),l>t&&(m=-l+t+a,l=t),p<1&&(m=2-p,p=1),u<1&&(m=2-u,u=1),{dy:i,edy:m,dx:s,edx:c,y:u,ey:l,x:p,ex:f,w:r,h:a}}calibrate(t){return new w({left:this.left+t.left*this.width,top:this.top+t.top*this.height,right:this.right+t.right*this.width,bottom:this.bottom+t.bottom*this.height}).toSquare().round()}};var Nt=class extends w{constructor(t,e,r,a,s=!1){super({left:t,top:e,right:r,bottom:a},s)}};var ct=class{constructor(t,e,r,a,s){this._imageDims=new S(s.width,s.height),this._score=t,this._classScore=e,this._className=r,this._box=new w(a).rescale(this._imageDims)}get score(){return this._score}get classScore(){return this._classScore}get className(){return this._className}get box(){return this._box}get imageDims(){return this._imageDims}get imageWidth(){return this.imageDims.width}get imageHeight(){return this.imageDims.height}get relativeBox(){return new w(this._box).rescale(this.imageDims.reverse())}forSize(t,e){return new ct(this.score,this.classScore,this.className,this.relativeBox,{width:t,height:e})}};var E=class extends ct{constructor(t,e,r){super(t,t,"",e,r)}forSize(t,e){let{score:r,relativeBox:a,imageDims:s}=super.forSize(t,e);return new E(r,a,s)}};function hr(o,t,e=!0){let r=Math.max(0,Math.min(o.right,t.right)-Math.max(o.left,t.left)),a=Math.max(0,Math.min(o.bottom,t.bottom)-Math.max(o.top,t.top)),s=r*a;return e?s/(o.area+t.area-s):s/Math.min(o.area,t.area)}function br(o){let t=o.map(c=>c.x),e=o.map(c=>c.y),r=t.reduce((c,m)=>mmcc({score:i,boxIndex:c})).sort((i,c)=>i.score-c.score).map(i=>i.boxIndex),s=[];for(;a.length>0;){let i=a.pop();s.push(i);let c=a,m=[];for(let p=0;pm[u]<=e)}return s}function X(o,t){return n.tidy(()=>{let[e,r,a]=t,s=n.fill([...o.shape.slice(0,3),1],e,"float32"),i=n.fill([...o.shape.slice(0,3),1],r,"float32"),c=n.fill([...o.shape.slice(0,3),1],a,"float32"),m=n.concat([s,i,c],3);return n.sub(o,m)})}function xr(o,t=!1){return n.tidy(()=>{let[e,r]=o.shape.slice(1);if(e===r)return o;let a=Math.abs(e-r),s=Math.round(a*(t?.5:1)),i=e>r?2:1,c=l=>{let d=o.shape.slice();return d[i]=l,n.fill(d,0,"float32")},m=c(s),p=a-m.shape[i],f=[t&&p?c(p):null,o,m].filter(l=>!!l).map(l=>n.cast(l,"float32"));return n.concat(f,i)})}function Hn(o){let t=o.slice();for(let e=t.length-1;e>0;e--){let r=Math.floor(Math.random()*(e+1)),a=t[e];t[e]=t[r],t[r]=a}return t}function fe(o){return 1/(1+Math.exp(-o))}function Vn(o){return Math.log(o/(1-o))}var St=class extends w{constructor(t,e,r,a,s=!1){super({x:t,y:e,width:r,height:a},s)}};var Co=.5,Io=.43,No=.45,$=class{constructor(t,e,r=new b(0,0)){let{width:a,height:s}=e;this._imgDims=new S(a,s),this._shift=r,this._positions=t.map(i=>i.mul(new b(a,s)).add(r))}get shift(){return new b(this._shift.x,this._shift.y)}get imageWidth(){return this._imgDims.width}get imageHeight(){return this._imgDims.height}get positions(){return this._positions}get relativePositions(){return this._positions.map(t=>t.sub(this._shift).div(new b(this.imageWidth,this.imageHeight)))}forSize(t,e){return new this.constructor(this.relativePositions,{width:t,height:e})}shiftBy(t,e){return new this.constructor(this.relativePositions,this._imgDims,new b(t,e))}shiftByPoint(t){return this.shiftBy(t.x,t.y)}align(t,e={}){if(t){let s=t instanceof E?t.box.floor():new w(t);return this.shiftBy(s.x,s.y).align(null,e)}let{useDlibAlignment:r,minBoxPadding:a}={useDlibAlignment:!1,minBoxPadding:.2,...e};return r?this.alignDlib():this.alignMinBbox(a)}alignDlib(){let t=this.getRefPointsForAlignment(),[e,r,a]=t,s=f=>a.sub(f).magnitude(),i=(s(e)+s(r))/2,c=Math.floor(i/No),m=yt(t),p=Math.floor(Math.max(0,m.x-Co*c)),u=Math.floor(Math.max(0,m.y-Io*c));return new St(p,u,Math.min(c,this.imageWidth+p),Math.min(c,this.imageHeight+u))}alignMinBbox(t){let e=br(this.positions);return e.pad(e.width*t,e.height*t)}getRefPointsForAlignment(){throw new Error("getRefPointsForAlignment not implemented by base class")}};var vr=class extends ${getRefPointsForAlignment(){let t=this.positions;return[t[0],t[1],yt([t[3],t[4]])]}};var Lt=class extends ${getJawOutline(){return this.positions.slice(0,17)}getLeftEyeBrow(){return this.positions.slice(17,22)}getRightEyeBrow(){return this.positions.slice(22,27)}getNose(){return this.positions.slice(27,36)}getLeftEye(){return this.positions.slice(36,42)}getRightEye(){return this.positions.slice(42,48)}getMouth(){return this.positions.slice(48,68)}getRefPointsForAlignment(){return[this.getLeftEye(),this.getRightEye(),this.getMouth()].map(yt)}};var Kt=class{constructor(t,e){this._label=t,this._distance=e}get label(){return this._label}get distance(){return this._distance}toString(t=!0){return`${this.label}${t?` (${vt(this.distance)})`:""}`}};var Qt=class extends w{constructor(e,r){super(e);this._label=r}static assertIsValidLabeledBox(e,r){if(w.assertIsValidBox(e,r),!G(e.label))throw new Error(`${r} - expected property label (${e.label}) to be a number`)}get label(){return this._label}};var Q=class{constructor(t,e){if(typeof t!="string")throw new Error("LabeledFaceDescriptors - constructor expected label to be a string");if(!Array.isArray(e)||e.some(r=>!(r instanceof Float32Array)))throw new Error("LabeledFaceDescriptors - constructor expected descriptors to be an array of Float32Array");this._label=t,this._descriptors=e}get label(){return this._label}get descriptors(){return this._descriptors}toJSON(){return{label:this.label,descriptors:this.descriptors.map(t=>Array.from(t))}}static fromJSON(t){let e=t.descriptors.map(r=>new Float32Array(r));return new Q(t.label,e)}};var yr=class extends Qt{constructor(e,r,a,s){super(e,r);this._score=a,this._classScore=s}static assertIsValidPredictedBox(e,r){if(Qt.assertIsValidLabeledBox(e,r),!It(e.score)||!It(e.classScore))throw new Error(`${r} - expected properties score (${e.score}) and (${e.classScore}) to be a number between [0, 1]`)}get score(){return this._score}get classScore(){return this._classScore}};function tt(o){return o.detection instanceof E}function At(o,t){return{...o,...{detection:t}}}function Ue(){let o=window.fetch;if(!o)throw new Error("fetch - missing fetch implementation for browser environment");return{Canvas:HTMLCanvasElement,CanvasRenderingContext2D,Image:HTMLImageElement,ImageData,Video:HTMLVideoElement,createCanvasElement:()=>document.createElement("canvas"),createImageElement:()=>document.createElement("img"),createVideoElement:()=>document.createElement("video"),fetch:o,readFile:()=>{throw new Error("readFile - filesystem not available for browser environment")}}}function te(){return typeof global=="object"&&typeof process!="undefined"&&process.versions!=null&&process.versions.node!=null}function le(o){let t="";if(!o&&te())try{o=xo("fs")}catch(r){t=r.toString()}return{readFile:o?r=>new Promise((a,s)=>{o.readFile(r,(i,c)=>i?s(i):a(c))}):()=>{throw new Error(`readFile - failed to require fs in nodejs environment with error: ${t}`)}}}function Xe(){let o=global.Canvas||global.HTMLCanvasElement,t=global.Image||global.HTMLImageElement,e=global.Video||global.HTMLVideoElement,r=()=>{if(o)return new o;throw new Error("createCanvasElement - missing Canvas implementation for nodejs environment")},a=()=>{if(t)return new t;throw new Error("createImageElement - missing Image implementation for nodejs environment")},s=()=>{if(e)return new e;throw new Error("createVideoElement - missing Video implementation for nodejs environment")},i=global.fetch,c=le();return{Canvas:o||class{},CanvasRenderingContext2D:global.CanvasRenderingContext2D||class{},Image:t||class{},ImageData:global.ImageData||class{},Video:global.HTMLVideoElement||class{},createCanvasElement:r,createImageElement:a,createVideoElement:s,fetch:i,...c}}function Je(){return typeof window=="object"&&typeof document!="undefined"&&typeof HTMLImageElement!="undefined"&&typeof HTMLCanvasElement!="undefined"&&typeof HTMLVideoElement!="undefined"&&typeof ImageData!="undefined"&&typeof CanvasRenderingContext2D!="undefined"}var C;function So(){if(!C)throw new Error("getEnv - environment is not defined, check isNodejs() and isBrowser()");return C}function qe(o){C=o}function Ze(){return Je()?qe(Ue()):te()?qe(Xe()):null}function Lo(o){if(C||Ze(),!C)throw new Error("monkeyPatch - environment is not defined, check isNodejs() and isBrowser()");let{Canvas:t=C.Canvas,Image:e=C.Image}=o;C.Canvas=t,C.Image=e,C.createCanvasElement=o.createCanvasElement||(()=>new t),C.createImageElement=o.createImageElement||(()=>new e),C.ImageData=o.ImageData||C.ImageData,C.Video=o.Video||C.Video,C.fetch=o.fetch||C.fetch,C.readFile=o.readFile||C.readFile}var T={getEnv:So,setEnv:qe,initialize:Ze,createBrowserEnv:Ue,createFileSystem:le,createNodejsEnv:Xe,monkeyPatch:Lo,isBrowser:Je,isNodejs:te};Ze();function Wt(o){return!T.isNodejs()&&typeof o=="string"?document.getElementById(o):o}function k(o){let{Canvas:t,CanvasRenderingContext2D:e}=T.getEnv();if(o instanceof e)return o;let r=Wt(o);if(!(r instanceof t))throw new Error("resolveContext2d - expected canvas to be of instance of Canvas");let a=r.getContext("2d");if(!a)throw new Error("resolveContext2d - canvas 2d context is null");return a}var Ke=(a=>(a.TOP_LEFT="TOP_LEFT",a.TOP_RIGHT="TOP_RIGHT",a.BOTTOM_LEFT="BOTTOM_LEFT",a.BOTTOM_RIGHT="BOTTOM_RIGHT",a))(Ke||{}),kt=class{constructor(t={}){let{anchorPosition:e,backgroundColor:r,fontColor:a,fontSize:s,fontStyle:i,padding:c}=t;this.anchorPosition=e||"TOP_LEFT",this.backgroundColor=r||"rgba(0, 0, 0, 0.5)",this.fontColor=a||"rgba(255, 255, 255, 1)",this.fontSize=s||14,this.fontStyle=i||"Georgia",this.padding=c||4}},et=class{constructor(t,e,r={}){this.text=typeof t=="string"?[t]:t instanceof et?t.text:t,this.anchor=e,this.options=new kt(r)}measureWidth(t){let{padding:e}=this.options;return this.text.map(r=>t.measureText(r).width).reduce((r,a)=>r{let g=m+f.x,_=m+f.y+(d+1)*i;r.fillText(l,g,_)})}};var de=class{constructor(t={}){let{boxColor:e,lineWidth:r,label:a,drawLabelOptions:s}=t;this.boxColor=e||"rgba(0, 0, 255, 1)",this.lineWidth=r||2,this.label=a;let i={anchorPosition:"BOTTOM_LEFT",backgroundColor:this.boxColor};this.drawLabelOptions=new kt({...i,...s})}},ee=class{constructor(t,e={}){this.box=new w(t),this.options=new de(e)}draw(t){let e=k(t),{boxColor:r,lineWidth:a}=this.options,{x:s,y:i,width:c,height:m}=this.box;e.strokeStyle=r,e.lineWidth=a,e.strokeRect(s,i,c,m);let{label:p}=this.options;p&&new et([p],{x:s-a/2,y:i},this.options.drawLabelOptions).draw(t)}};function Ao(o,t){(Array.isArray(t)?t:[t]).forEach(r=>{let a=r instanceof E?r.score:tt(r)?r.detection.score:void 0,s=r instanceof E?r.box:tt(r)?r.detection.box:new w(r),i=a?`${vt(a)}`:void 0;new ee(s,{label:i}).draw(o)})}function he(o){let{Image:t,Video:e}=T.getEnv();return o instanceof t&&o.complete||o instanceof e&&o.readyState>=3}function _r(o){return new Promise((t,e)=>{(o instanceof T.getEnv().Canvas||he(o))&&t(null);function r(s){!s.currentTarget||(s.currentTarget.removeEventListener("load",a),s.currentTarget.removeEventListener("error",r),e(s))}function a(s){!s.currentTarget||(s.currentTarget.removeEventListener("load",a),s.currentTarget.removeEventListener("error",r),t(s))}o.addEventListener("load",a),o.addEventListener("error",r)})}function Tr(o){return new Promise((t,e)=>{o instanceof Blob||e(new Error("bufferToImage - expected buf to be of type: Blob"));let r=new FileReader;r.onload=()=>{typeof r.result!="string"&&e(new Error("bufferToImage - expected reader.result to be a string, in onload"));let a=T.getEnv().createImageElement();a.onload=()=>t(a),a.onerror=e,a.src=r.result},r.onerror=e,r.readAsDataURL(o)})}function Bt(o){let{Image:t,Video:e}=T.getEnv();return o instanceof t?new S(o.naturalWidth,o.naturalHeight):o instanceof e?new S(o.videoWidth,o.videoHeight):new S(o.width,o.height)}function Rt({width:o,height:t}){let{createCanvasElement:e}=T.getEnv(),r=e();return r.width=o,r.height=t,r}function be(o,t){let{ImageData:e}=T.getEnv();if(!(o instanceof e)&&!he(o))throw new Error("createCanvasFromMedia - media has not finished loading yet");let{width:r,height:a}=t||Bt(o),s=Rt({width:r,height:a});return o instanceof e?k(s).putImageData(o,0,0):k(s).drawImage(o,0,0,r,a),s}async function Pr(o,t){let e=t||T.getEnv().createCanvasElement(),[r,a,s]=o.shape.slice(R(o)?1:0),i=n.tidy(()=>o.as3D(r,a,s).toInt());return await n.browser.toPixels(i,e),i.dispose(),e}function Qe(o){let{Image:t,Canvas:e,Video:r}=T.getEnv();return o instanceof t||o instanceof e||o instanceof r}function wr(o,t,e=!1){let{Image:r,Canvas:a}=T.getEnv();if(!(o instanceof r||o instanceof a))throw new Error("imageToSquare - expected arg0 to be HTMLImageElement | HTMLCanvasElement");if(t<=0)return Rt({width:1,height:1});let s=Bt(o),i=t/Math.max(s.height,s.width),c=i*s.width,m=i*s.height,p=Rt({width:t,height:t}),u=o instanceof a?o:be(o),f=Math.abs(c-m)/2,l=e&&c0&&u.height>0&&k(p).drawImage(u,l,d,c,m),p}var rt=class{constructor(t,e=!1){this._imageTensors=[];this._canvases=[];this._treatAsBatchInput=!1;this._inputDimensions=[];this._inputSize=0;if(!Array.isArray(t))throw new Error(`NetInput.constructor - expected inputs to be an Array of TResolvedNetInput or to be instanceof tf.Tensor4D, instead have ${t}`);this._treatAsBatchInput=e,this._batchSize=t.length,t.forEach((r,a)=>{if(K(r)){this._imageTensors[a]=r,this._inputDimensions[a]=r.shape;return}if(R(r)){let i=r.shape[0];if(i!==1)throw new Error(`NetInput - tf.Tensor4D with batchSize ${i} passed, but not supported in input array`);this._imageTensors[a]=r,this._inputDimensions[a]=r.shape.slice(1);return}let s=r instanceof T.getEnv().Canvas?r:be(r);this._canvases[a]=s,this._inputDimensions[a]=[s.height,s.width,3]})}get imageTensors(){return this._imageTensors}get canvases(){return this._canvases}get isBatchInput(){return this.batchSize>1||this._treatAsBatchInput}get batchSize(){return this._batchSize}get inputDimensions(){return this._inputDimensions}get inputSize(){return this._inputSize}get reshapedInputDimensions(){return U(this.batchSize,0,1).map((t,e)=>this.getReshapedInputDimensions(e))}getInput(t){return this.canvases[t]||this.imageTensors[t]}getInputDimensions(t){return this._inputDimensions[t]}getInputHeight(t){return this._inputDimensions[t][0]}getInputWidth(t){return this._inputDimensions[t][1]}getReshapedInputDimensions(t){if(typeof this.inputSize!="number")throw new Error("getReshapedInputDimensions - inputSize not set, toBatchTensor has not been called yet");let e=this.getInputWidth(t),r=this.getInputHeight(t);return je({width:e,height:r},this.inputSize)}toBatchTensor(t,e=!0){return this._inputSize=t,n.tidy(()=>{let r=U(this.batchSize,0,1).map(s=>{let i=this.getInput(s);if(i instanceof n.Tensor){let c=R(i)?i:n.expandDims(i);return c=xr(c,e),(c.shape[1]!==t||c.shape[2]!==t)&&(c=n.image.resizeBilinear(c,[t,t],!1,!1)),c.as3D(t,t,3)}if(i instanceof T.getEnv().Canvas)return n.browser.fromPixels(wr(i,t,e));throw new Error(`toBatchTensor - at batchIdx ${s}, expected input to be instanceof tf.Tensor or instanceof HTMLCanvasElement, instead have ${i}`)});return n.stack(r.map(s=>n.cast(s,"float32"))).as4D(this.batchSize,t,t,3)})}};async function M(o){if(o instanceof rt)return o;let t=Array.isArray(o)?o:[o];if(!t.length)throw new Error("toNetInput - empty array passed as input");let e=a=>Array.isArray(o)?` at input index ${a}:`:"",r=t.map(Wt);return r.forEach((a,s)=>{if(!Qe(a)&&!K(a)&&!R(a))throw typeof t[s]=="string"?new Error(`toNetInput -${e(s)} string passed, but could not resolve HTMLElement for element id ${t[s]}`):new Error(`toNetInput -${e(s)} expected media to be of type HTMLImageElement | HTMLVideoElement | HTMLCanvasElement | tf.Tensor3D, or to be an element id`);if(R(a)){let i=a.shape[0];if(i!==1)throw new Error(`toNetInput -${e(s)} tf.Tensor4D with batchSize ${i} passed, but not supported in input array`)}}),await Promise.all(r.map(a=>Qe(a)&&_r(a))),new rt(r,Array.isArray(o))}async function re(o,t){let{Canvas:e}=T.getEnv(),r=o;if(!(o instanceof e)){let i=await M(o);if(i.batchSize>1)throw new Error("extractFaces - batchSize > 1 not supported");let c=i.getInput(0);r=c instanceof e?c:await Pr(c)}let a=k(r);return t.map(i=>i instanceof E?i.forSize(r.width,r.height).box.floor():i).map(i=>i.clipAtImageBorders(r.width,r.height)).map(({x:i,y:c,width:m,height:p})=>{let u=Rt({width:m,height:p});return m>0&&p>0&&k(u).putImageData(a.getImageData(i,c,m,p),0,0),u})}async function oe(o,t){if(!K(o)&&!R(o))throw new Error("extractFaceTensors - expected image tensor to be 3D or 4D");if(R(o)&&o.shape[0]>1)throw new Error("extractFaceTensors - batchSize > 1 not supported");return n.tidy(()=>{let[e,r,a]=o.shape.slice(R(o)?1:0);return t.map(c=>c instanceof E?c.forSize(r,e).box:c).map(c=>c.clipAtImageBorders(r,e)).filter(c=>c.width>0&&c.height>0).map(({x:c,y:m,width:p,height:u})=>n.slice3d(o.as3D(e,r,a),[m,c,0],[u,p,a]))})}async function mt(o,t){let{fetch:e}=T.getEnv(),r=await e(o,t);if(!(r.status<400))throw new Error(`failed to fetch: (${r.status}) ${r.statusText}, from url: ${r.url}`);return r}async function Mi(o){let t=await mt(o),e=await t.blob();if(!e.type.startsWith("image/"))throw new Error(`fetchImage - expected blob type to be of type image/*, instead have: ${e.type}, for url: ${t.url}`);return Tr(e)}async function Fr(o){return(await mt(o)).json()}async function Li(o){return new Float32Array(await(await mt(o)).arrayBuffer())}function Dr(o){return new Promise((t,e)=>{o instanceof Blob||e(new Error("bufferToVideo - expected buf to be of type: Blob"));let r=T.getEnv().createVideoElement();r.oncanplay=()=>t(r),r.onerror=e,r.playsInline=!0,r.muted=!0,r.src=URL.createObjectURL(o),r.play()})}async function $i(o){let t=await mt(o),e=await t.blob();if(!e.type.startsWith("video/"))throw new Error(`fetchVideo - expected blob type to be of type video/*, instead have: ${e.type}, for url: ${t.url}`);return Dr(e)}function ge(o,t){let e=`${t}-weights_manifest.json`;if(!o)return{modelBaseUri:"",manifestUri:e};if(o==="/")return{modelBaseUri:"/",manifestUri:`/${e}`};let r=o.startsWith("http://")?"http://":o.startsWith("https://")?"https://":"";o=o.replace(r,"");let a=o.split("/").filter(c=>c),s=o.endsWith(".json")?a[a.length-1]:e,i=r+(o.endsWith(".json")?a.slice(0,a.length-1):a).join("/");return i=o.startsWith("/")?`/${i}`:i,{modelBaseUri:i,manifestUri:i==="/"?`/${s}`:`${i}/${s}`}}async function Er(o,t){let{manifestUri:e,modelBaseUri:r}=ge(o,t),a=await Fr(e);return n.io.loadWeights(a,r)}function ji(o,t,e=!1){let{width:r,height:a}=e?Bt(t):t;return o.width=r,o.height=a,{width:r,height:a}}var I=class{constructor(t){this._params=void 0;this._paramMappings=[];this._name=t}get params(){return this._params}get paramMappings(){return this._paramMappings}get isLoaded(){return!!this.params}getParamFromPath(t){let{obj:e,objProp:r}=this.traversePropertyPath(t);return e[r]}reassignParamFromPath(t,e){let{obj:r,objProp:a}=this.traversePropertyPath(t);r[a].dispose(),r[a]=e}getParamList(){return this._paramMappings.map(({paramPath:t})=>({path:t,tensor:this.getParamFromPath(t)}))}getTrainableParams(){return this.getParamList().filter(t=>t.tensor instanceof n.Variable)}getFrozenParams(){return this.getParamList().filter(t=>!(t.tensor instanceof n.Variable))}variable(){this.getFrozenParams().forEach(({path:t,tensor:e})=>{this.reassignParamFromPath(t,e.variable())})}freeze(){this.getTrainableParams().forEach(({path:t,tensor:e})=>{let r=n.tensor(e.dataSync());e.dispose(),this.reassignParamFromPath(t,r)})}dispose(t=!0){this.getParamList().forEach(e=>{if(t&&e.tensor.isDisposed)throw new Error(`param tensor has already been disposed for path ${e.path}`);e.tensor.dispose()}),this._params=void 0}serializeParams(){return new Float32Array(this.getParamList().map(({tensor:t})=>Array.from(t.dataSync())).reduce((t,e)=>t.concat(e)))}async load(t){if(t instanceof Float32Array){this.extractWeights(t);return}await this.loadFromUri(t)}async loadFromUri(t){if(t&&typeof t!="string")throw new Error(`${this._name}.loadFromUri - expected model uri`);let e=await Er(t,this.getDefaultModelName());this.loadFromWeightMap(e)}async loadFromDisk(t){if(t&&typeof t!="string")throw new Error(`${this._name}.loadFromDisk - expected model file path`);let{readFile:e}=T.getEnv(),{manifestUri:r,modelBaseUri:a}=ge(t,this.getDefaultModelName()),s=p=>Promise.all(p.map(u=>e(u).then(f=>f.buffer))),i=n.io.weightsLoaderFactory(s),c=JSON.parse((await e(r)).toString()),m=await i(c,a);this.loadFromWeightMap(m)}loadFromWeightMap(t){let{paramMappings:e,params:r}=this.extractParamsFromWeightMap(t);this._paramMappings=e,this._params=r}extractWeights(t){let{paramMappings:e,params:r}=this.extractParams(t);this._paramMappings=e,this._params=r}traversePropertyPath(t){if(!this.params)throw new Error("traversePropertyPath - model has no loaded params");let e=t.split("/").reduce((s,i)=>{if(!s.nextObj.hasOwnProperty(i))throw new Error(`traversePropertyPath - object does not have property ${i}, for path ${t}`);return{obj:s.nextObj,objProp:i,nextObj:s.nextObj[i]}},{nextObj:this.params}),{obj:r,objProp:a}=e;if(!r||!a||!(r[a]instanceof n.Tensor))throw new Error(`traversePropertyPath - parameter is not a tensor, for path ${t}`);return{obj:r,objProp:a}}};function W(o,t,e){return n.tidy(()=>{let r=n.separableConv2d(o,t.depthwise_filter,t.pointwise_filter,e,"same");return r=n.add(r,t.bias),r})}function xe(o,t,e=!1){return n.tidy(()=>{let r=n.relu(e?n.add(n.conv2d(o,t.conv0.filters,[2,2],"same"),t.conv0.bias):W(o,t.conv0,[2,2])),a=W(r,t.conv1,[1,1]),s=n.relu(n.add(r,a)),i=W(s,t.conv2,[1,1]);return n.relu(n.add(r,n.add(a,i)))})}function ne(o,t,e=!1,r=!0){return n.tidy(()=>{let a=n.relu(e?n.add(n.conv2d(o,t.conv0.filters,r?[2,2]:[1,1],"same"),t.conv0.bias):W(o,t.conv0,r?[2,2]:[1,1])),s=W(a,t.conv1,[1,1]),i=n.relu(n.add(a,s)),c=W(i,t.conv2,[1,1]),m=n.relu(n.add(a,n.add(s,c))),p=W(m,t.conv3,[1,1]);return n.relu(n.add(a,n.add(s,n.add(c,p))))})}function _t(o,t,e="same",r=!1){return n.tidy(()=>{let a=n.add(n.conv2d(o,t.filters,[1,1],e),t.bias);return r?n.relu(a):a})}function L(o,t){Object.keys(o).forEach(e=>{t.some(r=>r.originalPath===e)||o[e].dispose()})}function $t(o,t){return(e,r,a,s)=>{let i=n.tensor4d(o(e*r*a*a),[a,a,e,r]),c=n.tensor1d(o(r));return t.push({paramPath:`${s}/filters`},{paramPath:`${s}/bias`}),{filters:i,bias:c}}}function ve(o,t){return(e,r,a)=>{let s=n.tensor2d(o(e*r),[e,r]),i=n.tensor1d(o(r));return t.push({paramPath:`${a}/weights`},{paramPath:`${a}/bias`}),{weights:s,bias:i}}}var ae=class{constructor(t,e,r){this.depthwise_filter=t;this.pointwise_filter=e;this.bias=r}};function Ot(o,t){return(e,r,a)=>{let s=n.tensor4d(o(9*e),[3,3,e,1]),i=n.tensor4d(o(e*r),[1,1,e,r]),c=n.tensor1d(o(r));return t.push({paramPath:`${a}/depthwise_filter`},{paramPath:`${a}/pointwise_filter`},{paramPath:`${a}/bias`}),new ae(s,i,c)}}function Ht(o){return t=>{let e=o(`${t}/depthwise_filter`,4),r=o(`${t}/pointwise_filter`,4),a=o(`${t}/bias`,1);return new ae(e,r,a)}}function B(o,t){return(e,r,a)=>{let s=o[e];if(!xt(s,r))throw new Error(`expected weightMap[${e}] to be a Tensor${r}D, instead have ${s}`);return t.push({originalPath:e,paramPath:a||e}),s}}function A(o){let t=o;function e(a){let s=t.slice(0,a);return t=t.slice(a),s}function r(){return t}return{extractWeights:e,getRemainingWeights:r}}function ye(o,t){let e=$t(o,t),r=Ot(o,t);function a(i,c,m,p=!1){let u=p?e(i,c,3,`${m}/conv0`):r(i,c,`${m}/conv0`),f=r(c,c,`${m}/conv1`),l=r(c,c,`${m}/conv2`);return{conv0:u,conv1:f,conv2:l}}function s(i,c,m,p=!1){let{conv0:u,conv1:f,conv2:l}=a(i,c,m,p),d=r(c,c,`${m}/conv3`);return{conv0:u,conv1:f,conv2:l,conv3:d}}return{extractDenseBlock3Params:a,extractDenseBlock4Params:s}}function Mr(o){let t=[],{extractWeights:e,getRemainingWeights:r}=A(o),{extractDenseBlock4Params:a}=ye(e,t),s=a(3,32,"dense0",!0),i=a(32,64,"dense1"),c=a(64,128,"dense2"),m=a(128,256,"dense3");if(r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{paramMappings:t,params:{dense0:s,dense1:i,dense2:c,dense3:m}}}function _e(o){return t=>{let e=o(`${t}/filters`,4),r=o(`${t}/bias`,1);return{filters:e,bias:r}}}function Te(o,t){let e=B(o,t),r=_e(e),a=Ht(e);function s(c,m=!1){let p=m?r(`${c}/conv0`):a(`${c}/conv0`),u=a(`${c}/conv1`),f=a(`${c}/conv2`);return{conv0:p,conv1:u,conv2:f}}function i(c,m=!1){let p=m?r(`${c}/conv0`):a(`${c}/conv0`),u=a(`${c}/conv1`),f=a(`${c}/conv2`),l=a(`${c}/conv3`);return{conv0:p,conv1:u,conv2:f,conv3:l}}return{extractDenseBlock3Params:s,extractDenseBlock4Params:i}}function Cr(o){let t=[],{extractDenseBlock4Params:e}=Te(o,t),r={dense0:e("dense0",!0),dense1:e("dense1"),dense2:e("dense2"),dense3:e("dense3")};return L(o,t),{params:r,paramMappings:t}}var zt=class extends I{constructor(){super("FaceFeatureExtractor")}forwardInput(t){let{params:e}=this;if(!e)throw new Error("FaceFeatureExtractor - load model before inference");return n.tidy(()=>{let r=n.cast(t.toBatchTensor(112,!0),"float32"),s=X(r,[122.782,117.001,104.298]).div(255),i=ne(s,e.dense0,!0);return i=ne(i,e.dense1),i=ne(i,e.dense2),i=ne(i,e.dense3),i=n.avgPool(i,[7,7],[2,2],"valid"),i})}async forward(t){return this.forwardInput(await M(t))}getDefaultModelName(){return"face_feature_extractor_model"}extractParamsFromWeightMap(t){return Cr(t)}extractParams(t){return Mr(t)}};function se(o,t){return n.tidy(()=>n.add(n.matMul(o,t.weights),t.bias))}function Ir(o,t,e){let r=[],{extractWeights:a,getRemainingWeights:s}=A(o),c=ve(a,r)(t,e,"fc");if(s().length!==0)throw new Error(`weights remaing after extract: ${s().length}`);return{paramMappings:r,params:{fc:c}}}function Nr(o){let t=[],e=B(o,t);function r(s){let i=e(`${s}/weights`,2),c=e(`${s}/bias`,1);return{weights:i,bias:c}}let a={fc:r("fc")};return L(o,t),{params:a,paramMappings:t}}function Pe(o){let t={},e={};return Object.keys(o).forEach(r=>{let a=r.startsWith("fc")?e:t;a[r]=o[r]}),{featureExtractorMap:t,classifierMap:e}}var Vt=class extends I{constructor(e,r){super(e);this._faceFeatureExtractor=r}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(e){let{params:r}=this;if(!r)throw new Error(`${this._name} - load model before inference`);return n.tidy(()=>{let a=e instanceof rt?this.faceFeatureExtractor.forwardInput(e):e;return se(a.as2D(a.shape[0],-1),r.fc)})}dispose(e=!0){this.faceFeatureExtractor.dispose(e),super.dispose(e)}loadClassifierParams(e){let{params:r,paramMappings:a}=this.extractClassifierParams(e);this._params=r,this._paramMappings=a}extractClassifierParams(e){return Ir(e,this.getClassifierChannelsIn(),this.getClassifierChannelsOut())}extractParamsFromWeightMap(e){let{featureExtractorMap:r,classifierMap:a}=Pe(e);return this.faceFeatureExtractor.loadFromWeightMap(r),Nr(a)}extractParams(e){let r=this.getClassifierChannelsIn(),a=this.getClassifierChannelsOut(),s=a*r+a,i=e.slice(0,e.length-s),c=e.slice(e.length-s);return this.faceFeatureExtractor.extractWeights(i),this.extractClassifierParams(c)}};var Sr=["neutral","happy","sad","angry","fearful","disgusted","surprised"],pt=class{constructor(t){this.neutral=0;this.happy=0;this.sad=0;this.angry=0;this.fearful=0;this.disgusted=0;this.surprised=0;if(t.length!==7)throw new Error(`FaceExpressions.constructor - expected probabilities.length to be 7, have: ${t.length}`);Sr.forEach((e,r)=>{this[e]=t[r]})}asSortedArray(){return Sr.map(t=>({expression:t,probability:this[t]})).sort((t,e)=>e.probability-t.probability)}};var we=class extends Vt{constructor(t=new zt){super("FaceExpressionNet",t)}forwardInput(t){return n.tidy(()=>n.softmax(this.runNet(t)))}async forward(t){return this.forwardInput(await M(t))}async predictExpressions(t){let e=await M(t),r=await this.forwardInput(e),a=await Promise.all(n.unstack(r).map(async i=>{let c=i.dataSync();return i.dispose(),c}));r.dispose();let s=a.map(i=>new pt(i));return e.isBatchInput?s:s[0]}getDefaultModelName(){return"face_expression_model"}getClassifierChannelsIn(){return 256}getClassifierChannelsOut(){return 7}};function Lr(o){return o.expressions instanceof pt}function tr(o,t){return{...o,...{expressions:t}}}function Wo(o,t,e=.1,r){(Array.isArray(t)?t:[t]).forEach(s=>{let i=s instanceof pt?s:Lr(s)?s.expressions:void 0;if(!i)throw new Error("drawFaceExpressions - expected faceExpressions to be FaceExpressions | WithFaceExpressions<{}> or array thereof");let m=i.asSortedArray().filter(f=>f.probability>e),p=tt(s)?s.detection.box.bottomLeft:r||new b(0,0);new et(m.map(f=>`${f.expression} (${vt(f.probability)})`),p).draw(o)})}function Yt(o){return tt(o)&&o.landmarks instanceof $&&o.unshiftedLandmarks instanceof $&&o.alignedRect instanceof E}function ko(o){let t=(c,m,p,u)=>Math.atan2(u-m,p-c)%Math.PI,e=c=>c*180/Math.PI,r={roll:void 0,pitch:void 0,yaw:void 0};if(!o||!o._positions||o._positions.length!==68)return r;let a=o._positions;r.roll=-t(a[36]._x,a[36]._y,a[45]._x,a[45]._y),r.pitch=t(0,Math.abs(a[0]._x-a[30]._x)/a[30]._x,Math.PI,Math.abs(a[16]._x-a[30]._x)/a[30]._x);let s=a.reduce((c,m)=>cc>m._y?c:m._y,-1/0);return r.yaw=Math.PI*(o._imgDims._height/(i-s)/1.4-1),r}function ie(o,t){let{box:e}=o.detection,r=t.shiftBy(e.x,e.y),a=r.align(),{imageDims:s}=o.detection,i=new E(o.detection.score,a.rescale(s.reverse()),s),c=ko(t);return{...o,...{landmarks:r,unshiftedLandmarks:t,alignedRect:i,angle:c}}}var Fe=class{constructor(t={}){let{drawLines:e=!0,drawPoints:r=!0,lineWidth:a,lineColor:s,pointSize:i,pointColor:c}=t;this.drawLines=e,this.drawPoints=r,this.lineWidth=a||1,this.pointSize=i||2,this.lineColor=s||"rgba(0, 255, 255, 1)",this.pointColor=c||"rgba(255, 0, 255, 1)"}},De=class{constructor(t,e={}){this.faceLandmarks=t,this.options=new Fe(e)}draw(t){let e=k(t),{drawLines:r,drawPoints:a,lineWidth:s,lineColor:i,pointSize:c,pointColor:m}=this.options;if(r&&this.faceLandmarks instanceof Lt&&(e.strokeStyle=i,e.lineWidth=s,Z(e,this.faceLandmarks.getJawOutline()),Z(e,this.faceLandmarks.getLeftEyeBrow()),Z(e,this.faceLandmarks.getRightEyeBrow()),Z(e,this.faceLandmarks.getNose()),Z(e,this.faceLandmarks.getLeftEye(),!0),Z(e,this.faceLandmarks.getRightEye(),!0),Z(e,this.faceLandmarks.getMouth(),!0)),a){e.strokeStyle=m,e.fillStyle=m;let p=u=>{e.beginPath(),e.arc(u.x,u.y,c,0,2*Math.PI),e.fill()};this.faceLandmarks.positions.forEach(p)}}};function Bo(o,t){(Array.isArray(t)?t:[t]).forEach(r=>{let a=r instanceof $?r:Yt(r)?r.landmarks:void 0;if(!a)throw new Error("drawFaceLandmarks - expected faceExpressions to be FaceLandmarks | WithFaceLandmarks> or array thereof");new De(a).draw(o)})}var Wr="1.7.1";function Oo(o,t){let e=$t(o,t),r=Ot(o,t);function a(i,c,m){let p=r(i,c,`${m}/separable_conv0`),u=r(c,c,`${m}/separable_conv1`),f=e(i,c,1,`${m}/expansion_conv`);return{separable_conv0:p,separable_conv1:u,expansion_conv:f}}function s(i,c){let m=r(i,i,`${c}/separable_conv0`),p=r(i,i,`${c}/separable_conv1`),u=r(i,i,`${c}/separable_conv2`);return{separable_conv0:m,separable_conv1:p,separable_conv2:u}}return{extractConvParams:e,extractSeparableConvParams:r,extractReductionBlockParams:a,extractMainBlockParams:s}}function kr(o,t){let e=[],{extractWeights:r,getRemainingWeights:a}=A(o),{extractConvParams:s,extractSeparableConvParams:i,extractReductionBlockParams:c,extractMainBlockParams:m}=Oo(r,e),p=s(3,32,3,"entry_flow/conv_in"),u=c(32,64,"entry_flow/reduction_block_0"),f=c(64,128,"entry_flow/reduction_block_1"),l={conv_in:p,reduction_block_0:u,reduction_block_1:f},d={};U(t,0,1).forEach(h=>{d[`main_block_${h}`]=m(128,`middle_flow/main_block_${h}`)});let g=c(128,256,"exit_flow/reduction_block"),_=i(256,512,"exit_flow/separable_conv"),F={reduction_block:g,separable_conv:_};if(a().length!==0)throw new Error(`weights remaing after extract: ${a().length}`);return{paramMappings:e,params:{entry_flow:l,middle_flow:d,exit_flow:F}}}function Ho(o,t){let e=B(o,t),r=_e(e),a=Ht(e);function s(c){let m=a(`${c}/separable_conv0`),p=a(`${c}/separable_conv1`),u=r(`${c}/expansion_conv`);return{separable_conv0:m,separable_conv1:p,expansion_conv:u}}function i(c){let m=a(`${c}/separable_conv0`),p=a(`${c}/separable_conv1`),u=a(`${c}/separable_conv2`);return{separable_conv0:m,separable_conv1:p,separable_conv2:u}}return{extractConvParams:r,extractSeparableConvParams:a,extractReductionBlockParams:s,extractMainBlockParams:i}}function Br(o,t){let e=[],{extractConvParams:r,extractSeparableConvParams:a,extractReductionBlockParams:s,extractMainBlockParams:i}=Ho(o,e),c=r("entry_flow/conv_in"),m=s("entry_flow/reduction_block_0"),p=s("entry_flow/reduction_block_1"),u={conv_in:c,reduction_block_0:m,reduction_block_1:p},f={};U(t,0,1).forEach(_=>{f[`main_block_${_}`]=i(`middle_flow/main_block_${_}`)});let l=s("exit_flow/reduction_block"),d=a("exit_flow/separable_conv"),g={reduction_block:l,separable_conv:d};return L(o,e),{params:{entry_flow:u,middle_flow:f,exit_flow:g},paramMappings:e}}function Rr(o,t,e){return n.add(n.conv2d(o,t.filters,e,"same"),t.bias)}function er(o,t,e=!0){let r=e?n.relu(o):o;return r=W(r,t.separable_conv0,[1,1]),r=W(n.relu(r),t.separable_conv1,[1,1]),r=n.maxPool(r,[3,3],[2,2],"same"),r=n.add(r,Rr(o,t.expansion_conv,[2,2])),r}function zo(o,t){let e=W(n.relu(o),t.separable_conv0,[1,1]);return e=W(n.relu(e),t.separable_conv1,[1,1]),e=W(n.relu(e),t.separable_conv2,[1,1]),e=n.add(e,o),e}var Ee=class extends I{constructor(e){super("TinyXception");this._numMainBlocks=e}forwardInput(e){let{params:r}=this;if(!r)throw new Error("TinyXception - load model before inference");return n.tidy(()=>{let a=n.cast(e.toBatchTensor(112,!0),"float32"),i=X(a,[122.782,117.001,104.298]).div(255),c=n.relu(Rr(i,r.entry_flow.conv_in,[2,2]));return c=er(c,r.entry_flow.reduction_block_0,!1),c=er(c,r.entry_flow.reduction_block_1),U(this._numMainBlocks,0,1).forEach(m=>{c=zo(c,r.middle_flow[`main_block_${m}`])}),c=er(c,r.exit_flow.reduction_block),c=n.relu(W(c,r.exit_flow.separable_conv,[1,1])),c})}async forward(e){return this.forwardInput(await M(e))}getDefaultModelName(){return"tiny_xception_model"}extractParamsFromWeightMap(e){return Br(e,this._numMainBlocks)}extractParams(e){return kr(e,this._numMainBlocks)}};function $r(o){let t=[],{extractWeights:e,getRemainingWeights:r}=A(o),a=ve(e,t),s=a(512,1,"fc/age"),i=a(512,2,"fc/gender");if(r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{paramMappings:t,params:{fc:{age:s,gender:i}}}}function Or(o){let t=[],e=B(o,t);function r(s){let i=e(`${s}/weights`,2),c=e(`${s}/bias`,1);return{weights:i,bias:c}}let a={fc:{age:r("fc/age"),gender:r("fc/gender")}};return L(o,t),{params:a,paramMappings:t}}var rr=(e=>(e.FEMALE="female",e.MALE="male",e))(rr||{});var Me=class extends I{constructor(e=new Ee(2)){super("AgeGenderNet");this._faceFeatureExtractor=e}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(e){let{params:r}=this;if(!r)throw new Error(`${this._name} - load model before inference`);return n.tidy(()=>{let a=e instanceof rt?this.faceFeatureExtractor.forwardInput(e):e,s=n.avgPool(a,[7,7],[2,2],"valid").as2D(a.shape[0],-1),i=se(s,r.fc.age).as1D(),c=se(s,r.fc.gender);return{age:i,gender:c}})}forwardInput(e){return n.tidy(()=>{let{age:r,gender:a}=this.runNet(e);return{age:r,gender:n.softmax(a)}})}async forward(e){return this.forwardInput(await M(e))}async predictAgeAndGender(e){let r=await M(e),a=await this.forwardInput(r),s=n.unstack(a.age),i=n.unstack(a.gender),c=s.map((p,u)=>({ageTensor:p,genderTensor:i[u]})),m=await Promise.all(c.map(async({ageTensor:p,genderTensor:u})=>{let f=p.dataSync()[0],l=u.dataSync()[0],d=l>.5,g=d?"male":"female",_=d?l:1-l;return p.dispose(),u.dispose(),{age:f,gender:g,genderProbability:_}}));return a.age.dispose(),a.gender.dispose(),r.isBatchInput?m:m[0]}getDefaultModelName(){return"age_gender_model"}dispose(e=!0){this.faceFeatureExtractor.dispose(e),super.dispose(e)}loadClassifierParams(e){let{params:r,paramMappings:a}=this.extractClassifierParams(e);this._params=r,this._paramMappings=a}extractClassifierParams(e){return $r(e)}extractParamsFromWeightMap(e){let{featureExtractorMap:r,classifierMap:a}=Pe(e);return this.faceFeatureExtractor.loadFromWeightMap(r),Or(a)}extractParams(e){let a=e.slice(0,e.length-1539),s=e.slice(e.length-1539);return this.faceFeatureExtractor.extractWeights(a),this.extractClassifierParams(s)}};var Gt=class extends Vt{postProcess(t,e,r){let a=r.map(({width:i,height:c})=>{let m=e/Math.max(c,i);return{width:i*m,height:c*m}}),s=a.length;return n.tidy(()=>{let i=(f,l)=>n.stack([n.fill([68],f,"float32"),n.fill([68],l,"float32")],1).as2D(1,136).as1D(),c=(f,l)=>{let{width:d,height:g}=a[f];return l(d,g)?Math.abs(d-g)/2:0},m=f=>c(f,(l,d)=>lc(f,(l,d)=>di(m(l),p(l))))).div(n.stack(Array.from(Array(s),(f,l)=>i(a[l].width,a[l].height))))})}forwardInput(t){return n.tidy(()=>{let e=this.runNet(t);return this.postProcess(e,t.inputSize,t.inputDimensions.map(([r,a])=>({height:r,width:a})))})}async forward(t){return this.forwardInput(await M(t))}async detectLandmarks(t){let e=await M(t),r=n.tidy(()=>n.unstack(this.forwardInput(e))),a=await Promise.all(r.map(async(s,i)=>{let c=Array.from(s.dataSync()),m=c.filter((u,f)=>pe(f)),p=c.filter((u,f)=>!pe(f));return new Lt(Array(68).fill(0).map((u,f)=>new b(m[f],p[f])),{height:e.getInputHeight(i),width:e.getInputWidth(i)})}));return r.forEach(s=>s.dispose()),e.isBatchInput?a:a[0]}getClassifierChannelsOut(){return 136}};var jt=class extends Gt{constructor(t=new zt){super("FaceLandmark68Net",t)}getDefaultModelName(){return"face_landmark_68_model"}getClassifierChannelsIn(){return 256}};function Hr(o){let t=[],{extractDenseBlock3Params:e}=Te(o,t),r={dense0:e("dense0",!0),dense1:e("dense1"),dense2:e("dense2")};return L(o,t),{params:r,paramMappings:t}}function zr(o){let t=[],{extractWeights:e,getRemainingWeights:r}=A(o),{extractDenseBlock3Params:a}=ye(e,t),s=a(3,32,"dense0",!0),i=a(32,64,"dense1"),c=a(64,128,"dense2");if(r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{paramMappings:t,params:{dense0:s,dense1:i,dense2:c}}}var Ce=class extends I{constructor(){super("TinyFaceFeatureExtractor")}forwardInput(t){let{params:e}=this;if(!e)throw new Error("TinyFaceFeatureExtractor - load model before inference");return n.tidy(()=>{let r=n.cast(t.toBatchTensor(112,!0),"float32"),s=X(r,[122.782,117.001,104.298]).div(255),i=xe(s,e.dense0,!0);return i=xe(i,e.dense1),i=xe(i,e.dense2),i=n.avgPool(i,[14,14],[2,2],"valid"),i})}async forward(t){return this.forwardInput(await M(t))}getDefaultModelName(){return"face_feature_extractor_tiny_model"}extractParamsFromWeightMap(t){return Hr(t)}extractParams(t){return zr(t)}};var Ie=class extends Gt{constructor(t=new Ce){super("FaceLandmark68TinyNet",t)}getDefaultModelName(){return"face_landmark_68_tiny_model"}getClassifierChannelsIn(){return 128}};var Vr=class extends jt{};function Yr(o,t){return n.add(n.mul(o,t.weights),t.biases)}function or(o,t,e,r,a="same"){let{filters:s,bias:i}=t.conv,c=n.conv2d(o,s,e,a);return c=n.add(c,i),c=Yr(c,t.scale),r?n.relu(c):c}function Gr(o,t){return or(o,t,[1,1],!0)}function nr(o,t){return or(o,t,[1,1],!1)}function Ne(o,t){return or(o,t,[2,2],!0,"valid")}function Vo(o,t){function e(c,m,p){let u=o(c),f=u.length/(m*p*p);if(Ge(f))throw new Error(`depth has to be an integer: ${f}, weights.length: ${u.length}, numFilters: ${m}, filterSize: ${p}`);return n.tidy(()=>n.transpose(n.tensor4d(u,[m,f,p,p]),[2,3,1,0]))}function r(c,m,p,u){let f=e(c,m,p),l=n.tensor1d(o(m));return t.push({paramPath:`${u}/filters`},{paramPath:`${u}/bias`}),{filters:f,bias:l}}function a(c,m){let p=n.tensor1d(o(c)),u=n.tensor1d(o(c));return t.push({paramPath:`${m}/weights`},{paramPath:`${m}/biases`}),{weights:p,biases:u}}function s(c,m,p,u){let f=r(c,m,p,`${u}/conv`),l=a(m,`${u}/scale`);return{conv:f,scale:l}}function i(c,m,p,u,f=!1){let l=s((f?.5:1)*c,m,p,`${u}/conv1`),d=s(c,m,p,`${u}/conv2`);return{conv1:l,conv2:d}}return{extractConvLayerParams:s,extractResidualLayerParams:i}}function jr(o){let{extractWeights:t,getRemainingWeights:e}=A(o),r=[],{extractConvLayerParams:a,extractResidualLayerParams:s}=Vo(t,r),i=a(4704,32,7,"conv32_down"),c=s(9216,32,3,"conv32_1"),m=s(9216,32,3,"conv32_2"),p=s(9216,32,3,"conv32_3"),u=s(36864,64,3,"conv64_down",!0),f=s(36864,64,3,"conv64_1"),l=s(36864,64,3,"conv64_2"),d=s(36864,64,3,"conv64_3"),g=s(147456,128,3,"conv128_down",!0),_=s(147456,128,3,"conv128_1"),F=s(147456,128,3,"conv128_2"),h=s(589824,256,3,"conv256_down",!0),y=s(589824,256,3,"conv256_1"),x=s(589824,256,3,"conv256_2"),D=s(589824,256,3,"conv256_down_out"),N=n.tidy(()=>n.transpose(n.tensor2d(t(256*128),[128,256]),[1,0]));if(r.push({paramPath:"fc"}),e().length!==0)throw new Error(`weights remaing after extract: ${e().length}`);return{params:{conv32_down:i,conv32_1:c,conv32_2:m,conv32_3:p,conv64_down:u,conv64_1:f,conv64_2:l,conv64_3:d,conv128_down:g,conv128_1:_,conv128_2:F,conv256_down:h,conv256_1:y,conv256_2:x,conv256_down_out:D,fc:N},paramMappings:r}}function Yo(o,t){let e=B(o,t);function r(i){let c=e(`${i}/scale/weights`,1),m=e(`${i}/scale/biases`,1);return{weights:c,biases:m}}function a(i){let c=e(`${i}/conv/filters`,4),m=e(`${i}/conv/bias`,1),p=r(i);return{conv:{filters:c,bias:m},scale:p}}function s(i){return{conv1:a(`${i}/conv1`),conv2:a(`${i}/conv2`)}}return{extractConvLayerParams:a,extractResidualLayerParams:s}}function Ur(o){let t=[],{extractConvLayerParams:e,extractResidualLayerParams:r}=Yo(o,t),a=e("conv32_down"),s=r("conv32_1"),i=r("conv32_2"),c=r("conv32_3"),m=r("conv64_down"),p=r("conv64_1"),u=r("conv64_2"),f=r("conv64_3"),l=r("conv128_down"),d=r("conv128_1"),g=r("conv128_2"),_=r("conv256_down"),F=r("conv256_1"),h=r("conv256_2"),y=r("conv256_down_out"),{fc:x}=o;if(t.push({originalPath:"fc",paramPath:"fc"}),!Ye(x))throw new Error(`expected weightMap[fc] to be a Tensor2D, instead have ${x}`);let D={conv32_down:a,conv32_1:s,conv32_2:i,conv32_3:c,conv64_down:m,conv64_1:p,conv64_2:u,conv64_3:f,conv128_down:l,conv128_1:d,conv128_2:g,conv256_down:_,conv256_1:F,conv256_2:h,conv256_down_out:y,fc:x};return L(o,t),{params:D,paramMappings:t}}function j(o,t){let e=Gr(o,t.conv1);return e=nr(e,t.conv2),e=n.add(e,o),e=n.relu(e),e}function ce(o,t){let e=Ne(o,t.conv1);e=nr(e,t.conv2);let r=n.avgPool(o,2,2,"valid"),a=n.zeros(r.shape),s=r.shape[3]!==e.shape[3];if(r.shape[1]!==e.shape[1]||r.shape[2]!==e.shape[2]){let c=[...e.shape];c[1]=1;let m=n.zeros(c);e=n.concat([e,m],1);let p=[...e.shape];p[2]=1;let u=n.zeros(p);e=n.concat([e,u],2)}return r=s?n.concat([r,a],3):r,e=n.add(r,e),e=n.relu(e),e}var Ut=class extends I{constructor(){super("FaceRecognitionNet")}forwardInput(t){let{params:e}=this;if(!e)throw new Error("FaceRecognitionNet - load model before inference");return n.tidy(()=>{let r=n.cast(t.toBatchTensor(150,!0),"float32"),s=X(r,[122.782,117.001,104.298]).div(255),i=Ne(s,e.conv32_down);i=n.maxPool(i,3,2,"valid"),i=j(i,e.conv32_1),i=j(i,e.conv32_2),i=j(i,e.conv32_3),i=ce(i,e.conv64_down),i=j(i,e.conv64_1),i=j(i,e.conv64_2),i=j(i,e.conv64_3),i=ce(i,e.conv128_down),i=j(i,e.conv128_1),i=j(i,e.conv128_2),i=ce(i,e.conv256_down),i=j(i,e.conv256_1),i=j(i,e.conv256_2),i=ce(i,e.conv256_down_out);let c=i.mean([1,2]);return n.matMul(c,e.fc)})}async forward(t){return this.forwardInput(await M(t))}async computeFaceDescriptor(t){var s;if((s=t==null?void 0:t.shape)!=null&&s.some(i=>i<=0))return new Float32Array(128);let e=await M(t),r=n.tidy(()=>n.unstack(this.forwardInput(e))),a=await Promise.all(r.map(i=>i.data()));return r.forEach(i=>i.dispose()),e.isBatchInput?a:a[0]}getDefaultModelName(){return"face_recognition_model"}extractParamsFromWeightMap(t){return Ur(t)}extractParams(t){return jr(t)}};function vf(o){let t=new Ut;return t.extractWeights(o),t}function ar(o,t){return{...o,...{descriptor:t}}}function Pf(o){return typeof o.age=="number"}function sr(o,t){return{...o,...{age:t}}}function Ef(o){return(o.gender==="male"||o.gender==="female")&&It(o.genderProbability)}function ir(o,t,e){return{...o,...{gender:t,genderProbability:e}}}function Go(o,t){function e(m,p){let u=n.tensor4d(o(9*m),[3,3,m,1]),f=n.tensor1d(o(m)),l=n.tensor1d(o(m)),d=n.tensor1d(o(m)),g=n.tensor1d(o(m));return t.push({paramPath:`${p}/filters`},{paramPath:`${p}/batch_norm_scale`},{paramPath:`${p}/batch_norm_offset`},{paramPath:`${p}/batch_norm_mean`},{paramPath:`${p}/batch_norm_variance`}),{filters:u,batch_norm_scale:f,batch_norm_offset:l,batch_norm_mean:d,batch_norm_variance:g}}function r(m,p,u,f,l){let d=n.tensor4d(o(m*p*u*u),[u,u,m,p]),g=n.tensor1d(o(p));return t.push({paramPath:`${f}/filters`},{paramPath:`${f}/${l?"batch_norm_offset":"bias"}`}),{filters:d,bias:g}}function a(m,p,u,f){let{filters:l,bias:d}=r(m,p,u,f,!0);return{filters:l,batch_norm_offset:d}}function s(m,p,u){let f=e(m,`${u}/depthwise_conv`),l=a(m,p,1,`${u}/pointwise_conv`);return{depthwise_conv:f,pointwise_conv:l}}function i(){let m=a(3,32,3,"mobilenetv1/conv_0"),p=s(32,64,"mobilenetv1/conv_1"),u=s(64,128,"mobilenetv1/conv_2"),f=s(128,128,"mobilenetv1/conv_3"),l=s(128,256,"mobilenetv1/conv_4"),d=s(256,256,"mobilenetv1/conv_5"),g=s(256,512,"mobilenetv1/conv_6"),_=s(512,512,"mobilenetv1/conv_7"),F=s(512,512,"mobilenetv1/conv_8"),h=s(512,512,"mobilenetv1/conv_9"),y=s(512,512,"mobilenetv1/conv_10"),x=s(512,512,"mobilenetv1/conv_11"),D=s(512,1024,"mobilenetv1/conv_12"),N=s(1024,1024,"mobilenetv1/conv_13");return{conv_0:m,conv_1:p,conv_2:u,conv_3:f,conv_4:l,conv_5:d,conv_6:g,conv_7:_,conv_8:F,conv_9:h,conv_10:y,conv_11:x,conv_12:D,conv_13:N}}function c(){let m=a(1024,256,1,"prediction_layer/conv_0"),p=a(256,512,3,"prediction_layer/conv_1"),u=a(512,128,1,"prediction_layer/conv_2"),f=a(128,256,3,"prediction_layer/conv_3"),l=a(256,128,1,"prediction_layer/conv_4"),d=a(128,256,3,"prediction_layer/conv_5"),g=a(256,64,1,"prediction_layer/conv_6"),_=a(64,128,3,"prediction_layer/conv_7"),F=r(512,12,1,"prediction_layer/box_predictor_0/box_encoding_predictor"),h=r(512,9,1,"prediction_layer/box_predictor_0/class_predictor"),y=r(1024,24,1,"prediction_layer/box_predictor_1/box_encoding_predictor"),x=r(1024,18,1,"prediction_layer/box_predictor_1/class_predictor"),D=r(512,24,1,"prediction_layer/box_predictor_2/box_encoding_predictor"),N=r(512,18,1,"prediction_layer/box_predictor_2/class_predictor"),Y=r(256,24,1,"prediction_layer/box_predictor_3/box_encoding_predictor"),q=r(256,18,1,"prediction_layer/box_predictor_3/class_predictor"),O=r(256,24,1,"prediction_layer/box_predictor_4/box_encoding_predictor"),at=r(256,18,1,"prediction_layer/box_predictor_4/class_predictor"),st=r(128,24,1,"prediction_layer/box_predictor_5/box_encoding_predictor"),it=r(128,18,1,"prediction_layer/box_predictor_5/class_predictor");return{conv_0:m,conv_1:p,conv_2:u,conv_3:f,conv_4:l,conv_5:d,conv_6:g,conv_7:_,box_predictor_0:{box_encoding_predictor:F,class_predictor:h},box_predictor_1:{box_encoding_predictor:y,class_predictor:x},box_predictor_2:{box_encoding_predictor:D,class_predictor:N},box_predictor_3:{box_encoding_predictor:Y,class_predictor:q},box_predictor_4:{box_encoding_predictor:O,class_predictor:at},box_predictor_5:{box_encoding_predictor:st,class_predictor:it}}}return{extractMobilenetV1Params:i,extractPredictionLayerParams:c}}function Xr(o){let t=[],{extractWeights:e,getRemainingWeights:r}=A(o),{extractMobilenetV1Params:a,extractPredictionLayerParams:s}=Go(e,t),i=a(),c=s(),p={extra_dim:n.tensor3d(e(5118*4),[1,5118,4])};if(t.push({paramPath:"output_layer/extra_dim"}),r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{params:{mobilenetv1:i,prediction_layer:c,output_layer:p},paramMappings:t}}function jo(o,t){let e=B(o,t);function r(p,u,f){let l=e(`${p}/Conv2d_${u}_pointwise/weights`,4,`${f}/filters`),d=e(`${p}/Conv2d_${u}_pointwise/convolution_bn_offset`,1,`${f}/batch_norm_offset`);return{filters:l,batch_norm_offset:d}}function a(p){let u=`mobilenetv1/conv_${p}`,f=`MobilenetV1/Conv2d_${p}_depthwise`,l=`${u}/depthwise_conv`,d=`${u}/pointwise_conv`,g=e(`${f}/depthwise_weights`,4,`${l}/filters`),_=e(`${f}/BatchNorm/gamma`,1,`${l}/batch_norm_scale`),F=e(`${f}/BatchNorm/beta`,1,`${l}/batch_norm_offset`),h=e(`${f}/BatchNorm/moving_mean`,1,`${l}/batch_norm_mean`),y=e(`${f}/BatchNorm/moving_variance`,1,`${l}/batch_norm_variance`);return{depthwise_conv:{filters:g,batch_norm_scale:_,batch_norm_offset:F,batch_norm_mean:h,batch_norm_variance:y},pointwise_conv:r("MobilenetV1",p,d)}}function s(){return{conv_0:r("MobilenetV1",0,"mobilenetv1/conv_0"),conv_1:a(1),conv_2:a(2),conv_3:a(3),conv_4:a(4),conv_5:a(5),conv_6:a(6),conv_7:a(7),conv_8:a(8),conv_9:a(9),conv_10:a(10),conv_11:a(11),conv_12:a(12),conv_13:a(13)}}function i(p,u){let f=e(`${p}/weights`,4,`${u}/filters`),l=e(`${p}/biases`,1,`${u}/bias`);return{filters:f,bias:l}}function c(p){let u=i(`Prediction/BoxPredictor_${p}/BoxEncodingPredictor`,`prediction_layer/box_predictor_${p}/box_encoding_predictor`),f=i(`Prediction/BoxPredictor_${p}/ClassPredictor`,`prediction_layer/box_predictor_${p}/class_predictor`);return{box_encoding_predictor:u,class_predictor:f}}function m(){return{conv_0:r("Prediction",0,"prediction_layer/conv_0"),conv_1:r("Prediction",1,"prediction_layer/conv_1"),conv_2:r("Prediction",2,"prediction_layer/conv_2"),conv_3:r("Prediction",3,"prediction_layer/conv_3"),conv_4:r("Prediction",4,"prediction_layer/conv_4"),conv_5:r("Prediction",5,"prediction_layer/conv_5"),conv_6:r("Prediction",6,"prediction_layer/conv_6"),conv_7:r("Prediction",7,"prediction_layer/conv_7"),box_predictor_0:c(0),box_predictor_1:c(1),box_predictor_2:c(2),box_predictor_3:c(3),box_predictor_4:c(4),box_predictor_5:c(5)}}return{extractMobilenetV1Params:s,extractPredictionLayerParams:m}}function Jr(o){let t=[],{extractMobilenetV1Params:e,extractPredictionLayerParams:r}=jo(o,t),a=o["Output/extra_dim"];if(t.push({originalPath:"Output/extra_dim",paramPath:"output_layer/extra_dim"}),!K(a))throw new Error(`expected weightMap['Output/extra_dim'] to be a Tensor3D, instead have ${a}`);let s={mobilenetv1:e(),prediction_layer:r(),output_layer:{extra_dim:a}};return L(o,t),{params:s,paramMappings:t}}function H(o,t,e){return n.tidy(()=>{let r=n.conv2d(o,t.filters,e,"same");return r=n.add(r,t.batch_norm_offset),n.clipByValue(r,0,6)})}var Uo=.0010000000474974513;function Xo(o,t,e){return n.tidy(()=>{let r=n.depthwiseConv2d(o,t.filters,e,"same");return r=n.batchNorm(r,t.batch_norm_mean,t.batch_norm_variance,t.batch_norm_offset,t.batch_norm_scale,Uo),n.clipByValue(r,0,6)})}function Jo(o){return[2,4,6,12].some(t=>t===o)?[2,2]:[1,1]}function qr(o,t){return n.tidy(()=>{let e,r=H(o,t.conv_0,[2,2]);if([t.conv_1,t.conv_2,t.conv_3,t.conv_4,t.conv_5,t.conv_6,t.conv_7,t.conv_8,t.conv_9,t.conv_10,t.conv_11,t.conv_12,t.conv_13].forEach((s,i)=>{let c=i+1,m=Jo(c);r=Xo(r,s.depthwise_conv,m),r=H(r,s.pointwise_conv,[1,1]),c===11&&(e=r)}),e===null)throw new Error("mobileNetV1 - output of conv layer 11 is null");return{out:r,conv11:e}})}function qo(o,t,e){let r=o.arraySync(),a=Math.min(r[t][0],r[t][2]),s=Math.min(r[t][1],r[t][3]),i=Math.max(r[t][0],r[t][2]),c=Math.max(r[t][1],r[t][3]),m=Math.min(r[e][0],r[e][2]),p=Math.min(r[e][1],r[e][3]),u=Math.max(r[e][0],r[e][2]),f=Math.max(r[e][1],r[e][3]),l=(i-a)*(c-s),d=(u-m)*(f-p);if(l<=0||d<=0)return 0;let g=Math.max(a,m),_=Math.max(s,p),F=Math.min(i,u),h=Math.min(c,f),y=Math.max(F-g,0)*Math.max(h-_,0);return y/(l+d-y)}function Zr(o,t,e,r,a){let s=o.shape[0],i=Math.min(e,s),c=t.map((u,f)=>({score:u,boxIndex:f})).filter(u=>u.score>a).sort((u,f)=>f.score-u.score),m=u=>u<=r?1:0,p=[];return c.forEach(u=>{if(p.length>=i)return;let f=u.score;for(let l=p.length-1;l>=0;--l){let d=qo(o,u.boxIndex,p[l]);if(d!==0&&(u.score*=m(d),u.score<=a))break}f===u.score&&p.push(u.boxIndex)}),p}function Zo(o){let t=n.unstack(n.transpose(o,[1,0])),e=[n.sub(t[2],t[0]),n.sub(t[3],t[1])],r=[n.add(t[0],n.div(e[0],2)),n.add(t[1],n.div(e[1],2))];return{sizes:e,centers:r}}function Ko(o,t){let{sizes:e,centers:r}=Zo(o),a=n.unstack(n.transpose(t,[1,0])),s=n.div(n.mul(n.exp(n.div(a[2],5)),e[0]),2),i=n.add(n.mul(n.div(a[0],10),e[0]),r[0]),c=n.div(n.mul(n.exp(n.div(a[3],5)),e[1]),2),m=n.add(n.mul(n.div(a[1],10),e[1]),r[1]);return n.transpose(n.stack([n.sub(i,s),n.sub(m,c),n.add(i,s),n.add(m,c)]),[1,0])}function Kr(o,t,e){return n.tidy(()=>{let r=o.shape[0],a=Ko(n.reshape(n.tile(e.extra_dim,[r,1,1]),[-1,4]),n.reshape(o,[-1,4]));a=n.reshape(a,[r,a.shape[0]/r,4]);let s=n.sigmoid(n.slice(t,[0,0,1],[-1,-1,-1])),i=n.slice(s,[0,0,0],[-1,-1,1]);i=n.reshape(i,[r,i.shape[1]]);let c=n.unstack(a),m=n.unstack(i);return{boxes:c,scores:m}})}function Tt(o,t){return n.tidy(()=>{let e=o.shape[0],r=n.reshape(_t(o,t.box_encoding_predictor),[e,-1,1,4]),a=n.reshape(_t(o,t.class_predictor),[e,-1,3]);return{boxPredictionEncoding:r,classPrediction:a}})}function Qr(o,t,e){return n.tidy(()=>{let r=H(o,e.conv_0,[1,1]),a=H(r,e.conv_1,[2,2]),s=H(a,e.conv_2,[1,1]),i=H(s,e.conv_3,[2,2]),c=H(i,e.conv_4,[1,1]),m=H(c,e.conv_5,[2,2]),p=H(m,e.conv_6,[1,1]),u=H(p,e.conv_7,[2,2]),f=Tt(t,e.box_predictor_0),l=Tt(o,e.box_predictor_1),d=Tt(a,e.box_predictor_2),g=Tt(i,e.box_predictor_3),_=Tt(m,e.box_predictor_4),F=Tt(u,e.box_predictor_5),h=n.concat([f.boxPredictionEncoding,l.boxPredictionEncoding,d.boxPredictionEncoding,g.boxPredictionEncoding,_.boxPredictionEncoding,F.boxPredictionEncoding],1),y=n.concat([f.classPrediction,l.classPrediction,d.classPrediction,g.classPrediction,_.classPrediction,F.classPrediction],1);return{boxPredictions:h,classPredictions:y}})}var z=class{constructor({minConfidence:t,maxResults:e}={}){this._name="SsdMobilenetv1Options";if(this._minConfidence=t||.5,this._maxResults=e||100,typeof this._minConfidence!="number"||this._minConfidence<=0||this._minConfidence>=1)throw new Error(`${this._name} - expected minConfidence to be a number between 0 and 1`);if(typeof this._maxResults!="number")throw new Error(`${this._name} - expected maxResults to be a number`)}get minConfidence(){return this._minConfidence}get maxResults(){return this._maxResults}};var Pt=class extends I{constructor(){super("SsdMobilenetv1")}forwardInput(t){let{params:e}=this;if(!e)throw new Error("SsdMobilenetv1 - load model before inference");return n.tidy(()=>{let r=n.cast(t.toBatchTensor(512,!1),"float32"),a=n.sub(n.div(r,127.5),1),s=qr(a,e.mobilenetv1),{boxPredictions:i,classPredictions:c}=Qr(s.out,s.conv11,e.prediction_layer);return Kr(i,c,e.output_layer)})}async forward(t){return this.forwardInput(await M(t))}async locateFaces(t,e={}){let{maxResults:r,minConfidence:a}=new z(e),s=await M(t),{boxes:i,scores:c}=this.forwardInput(s),m=i[0],p=c[0];for(let x=1;x{let[D,N]=[Math.max(0,h[x][0]),Math.min(1,h[x][2])].map(O=>O*F),[Y,q]=[Math.max(0,h[x][1]),Math.min(1,h[x][3])].map(O=>O*_);return new E(u[x],new St(Y,D,q-Y,N-D),{height:s.getInputHeight(0),width:s.getInputWidth(0)})});return m.dispose(),p.dispose(),y}getDefaultModelName(){return"ssd_mobilenetv1_model"}extractParamsFromWeightMap(t){return Jr(t)}extractParams(t){return Xr(t)}};function Qo(o){let t=new Pt;return t.extractWeights(o),t}function vl(o){return Qo(o)}var to=class extends Pt{};var eo=.4,ro=[new b(.738768,.874946),new b(2.42204,2.65704),new b(4.30971,7.04493),new b(10.246,4.59428),new b(12.6868,11.8741)],oo=[new b(1.603231,2.094468),new b(6.041143,7.080126),new b(2.882459,3.518061),new b(4.266906,5.178857),new b(9.041765,10.66308)],no=[117.001,114.697,97.404],ao="tiny_yolov2_model",so="tiny_yolov2_separable_conv_model";var Se=o=>typeof o=="number";function io(o){if(!o)throw new Error(`invalid config: ${o}`);if(typeof o.withSeparableConvs!="boolean")throw new Error(`config.withSeparableConvs has to be a boolean, have: ${o.withSeparableConvs}`);if(!Se(o.iouThreshold)||o.iouThreshold<0||o.iouThreshold>1)throw new Error(`config.iouThreshold has to be a number between [0, 1], have: ${o.iouThreshold}`);if(!Array.isArray(o.classes)||!o.classes.length||!o.classes.every(t=>typeof t=="string"))throw new Error(`config.classes has to be an array class names: string[], have: ${JSON.stringify(o.classes)}`);if(!Array.isArray(o.anchors)||!o.anchors.length||!o.anchors.map(t=>t||{}).every(t=>Se(t.x)&&Se(t.y)))throw new Error(`config.anchors has to be an array of { x: number, y: number }, have: ${JSON.stringify(o.anchors)}`);if(o.meanRgb&&(!Array.isArray(o.meanRgb)||o.meanRgb.length!==3||!o.meanRgb.every(Se)))throw new Error(`config.meanRgb has to be an array of shape [number, number, number], have: ${JSON.stringify(o.meanRgb)}`)}function Xt(o){return n.tidy(()=>{let t=n.mul(o,n.scalar(.10000000149011612));return n.add(n.relu(n.sub(o,t)),t)})}function ot(o,t){return n.tidy(()=>{let e=n.pad(o,[[0,0],[1,1],[1,1],[0,0]]);return e=n.conv2d(e,t.conv.filters,[1,1],"valid"),e=n.sub(e,t.bn.sub),e=n.mul(e,t.bn.truediv),e=n.add(e,t.conv.bias),Xt(e)})}function nt(o,t){return n.tidy(()=>{let e=n.pad(o,[[0,0],[1,1],[1,1],[0,0]]);return e=n.separableConv2d(e,t.depthwise_filter,t.pointwise_filter,[1,1],"valid"),e=n.add(e,t.bias),Xt(e)})}function tn(o,t){let e=$t(o,t);function r(i,c){let m=n.tensor1d(o(i)),p=n.tensor1d(o(i));return t.push({paramPath:`${c}/sub`},{paramPath:`${c}/truediv`}),{sub:m,truediv:p}}function a(i,c,m){let p=e(i,c,3,`${m}/conv`),u=r(c,`${m}/bn`);return{conv:p,bn:u}}let s=Ot(o,t);return{extractConvParams:e,extractConvWithBatchNormParams:a,extractSeparableConvParams:s}}function co(o,t,e,r){let{extractWeights:a,getRemainingWeights:s}=A(o),i=[],{extractConvParams:c,extractConvWithBatchNormParams:m,extractSeparableConvParams:p}=tn(a,i),u;if(t.withSeparableConvs){let[f,l,d,g,_,F,h,y,x]=r,D=t.isFirstLayerConv2d?c(f,l,3,"conv0"):p(f,l,"conv0"),N=p(l,d,"conv1"),Y=p(d,g,"conv2"),q=p(g,_,"conv3"),O=p(_,F,"conv4"),at=p(F,h,"conv5"),st=y?p(h,y,"conv6"):void 0,it=x?p(y,x,"conv7"):void 0,gt=c(x||y||h,5*e,1,"conv8");u={conv0:D,conv1:N,conv2:Y,conv3:q,conv4:O,conv5:at,conv6:st,conv7:it,conv8:gt}}else{let[f,l,d,g,_,F,h,y,x]=r,D=m(f,l,"conv0"),N=m(l,d,"conv1"),Y=m(d,g,"conv2"),q=m(g,_,"conv3"),O=m(_,F,"conv4"),at=m(F,h,"conv5"),st=m(h,y,"conv6"),it=m(y,x,"conv7"),gt=c(x,5*e,1,"conv8");u={conv0:D,conv1:N,conv2:Y,conv3:q,conv4:O,conv5:at,conv6:st,conv7:it,conv8:gt}}if(s().length!==0)throw new Error(`weights remaing after extract: ${s().length}`);return{params:u,paramMappings:i}}function en(o,t){let e=B(o,t);function r(c){let m=e(`${c}/sub`,1),p=e(`${c}/truediv`,1);return{sub:m,truediv:p}}function a(c){let m=e(`${c}/filters`,4),p=e(`${c}/bias`,1);return{filters:m,bias:p}}function s(c){let m=a(`${c}/conv`),p=r(`${c}/bn`);return{conv:m,bn:p}}let i=Ht(e);return{extractConvParams:a,extractConvWithBatchNormParams:s,extractSeparableConvParams:i}}function mo(o,t){let e=[],{extractConvParams:r,extractConvWithBatchNormParams:a,extractSeparableConvParams:s}=en(o,e),i;if(t.withSeparableConvs){let c=t.filterSizes&&t.filterSizes.length||9;i={conv0:t.isFirstLayerConv2d?r("conv0"):s("conv0"),conv1:s("conv1"),conv2:s("conv2"),conv3:s("conv3"),conv4:s("conv4"),conv5:s("conv5"),conv6:c>7?s("conv6"):void 0,conv7:c>8?s("conv7"):void 0,conv8:r("conv8")}}else i={conv0:a("conv0"),conv1:a("conv1"),conv2:a("conv2"),conv3:a("conv3"),conv4:a("conv4"),conv5:a("conv5"),conv6:a("conv6"),conv7:a("conv7"),conv8:r("conv8")};return L(o,e),{params:i,paramMappings:e}}var J=class{constructor({inputSize:t,scoreThreshold:e}={}){this._name="TinyYolov2Options";if(this._inputSize=t||416,this._scoreThreshold=e||.5,typeof this._inputSize!="number"||this._inputSize%32!==0)throw new Error(`${this._name} - expected inputSize to be a number divisible by 32`);if(typeof this._scoreThreshold!="number"||this._scoreThreshold<=0||this._scoreThreshold>=1)throw new Error(`${this._name} - expected scoreThreshold to be a number between 0 and 1`)}get inputSize(){return this._inputSize}get scoreThreshold(){return this._scoreThreshold}};var cr=class extends I{constructor(e){super("TinyYolov2");io(e),this._config=e}get config(){return this._config}get withClassScores(){return this.config.withClassScores||this.config.classes.length>1}get boxEncodingSize(){return 5+(this.withClassScores?this.config.classes.length:0)}runTinyYolov2(e,r){let a=ot(e,r.conv0);return a=n.maxPool(a,[2,2],[2,2],"same"),a=ot(a,r.conv1),a=n.maxPool(a,[2,2],[2,2],"same"),a=ot(a,r.conv2),a=n.maxPool(a,[2,2],[2,2],"same"),a=ot(a,r.conv3),a=n.maxPool(a,[2,2],[2,2],"same"),a=ot(a,r.conv4),a=n.maxPool(a,[2,2],[2,2],"same"),a=ot(a,r.conv5),a=n.maxPool(a,[2,2],[1,1],"same"),a=ot(a,r.conv6),a=ot(a,r.conv7),_t(a,r.conv8,"valid",!1)}runMobilenet(e,r){let a=this.config.isFirstLayerConv2d?Xt(_t(e,r.conv0,"valid",!1)):nt(e,r.conv0);return a=n.maxPool(a,[2,2],[2,2],"same"),a=nt(a,r.conv1),a=n.maxPool(a,[2,2],[2,2],"same"),a=nt(a,r.conv2),a=n.maxPool(a,[2,2],[2,2],"same"),a=nt(a,r.conv3),a=n.maxPool(a,[2,2],[2,2],"same"),a=nt(a,r.conv4),a=n.maxPool(a,[2,2],[2,2],"same"),a=nt(a,r.conv5),a=n.maxPool(a,[2,2],[1,1],"same"),a=r.conv6?nt(a,r.conv6):a,a=r.conv7?nt(a,r.conv7):a,_t(a,r.conv8,"valid",!1)}forwardInput(e,r){let{params:a}=this;if(!a)throw new Error("TinyYolov2 - load model before inference");return n.tidy(()=>{let s=n.cast(e.toBatchTensor(r,!1),"float32");return s=this.config.meanRgb?X(s,this.config.meanRgb):s,s=s.div(255),this.config.withSeparableConvs?this.runMobilenet(s,a):this.runTinyYolov2(s,a)})}async forward(e,r){return this.forwardInput(await M(e),r)}async detect(e,r={}){let{inputSize:a,scoreThreshold:s}=new J(r),i=await M(e),c=await this.forwardInput(i,a),m=n.tidy(()=>n.unstack(c)[0].expandDims()),p={width:i.getInputWidth(0),height:i.getInputHeight(0)},u=await this.extractBoxes(m,i.getReshapedInputDimensions(0),s);c.dispose(),m.dispose();let f=u.map(h=>h.box),l=u.map(h=>h.score),d=u.map(h=>h.classScore),g=u.map(h=>this.config.classes[h.label]);return gr(f.map(h=>h.rescale(a)),l,this.config.iouThreshold,!0).map(h=>new ct(l[h],d[h],g[h],f[h],p))}getDefaultModelName(){return""}extractParamsFromWeightMap(e){return mo(e,this.config)}extractParams(e){let r=this.config.filterSizes||cr.DEFAULT_FILTER_SIZES,a=r?r.length:void 0;if(a!==7&&a!==8&&a!==9)throw new Error(`TinyYolov2 - expected 7 | 8 | 9 convolutional filters, but found ${a} filterSizes in config`);return co(e,this.config,this.boxEncodingSize,r)}async extractBoxes(e,r,a){let{width:s,height:i}=r,c=Math.max(s,i),m=c/s,p=c/i,u=e.shape[1],f=this.config.anchors.length,[l,d,g]=n.tidy(()=>{let y=e.reshape([u,u,f,this.boxEncodingSize]),x=y.slice([0,0,0,0],[u,u,f,4]),D=y.slice([0,0,0,4],[u,u,f,1]),N=this.withClassScores?n.softmax(y.slice([0,0,0,5],[u,u,f,this.config.classes.length]),3):n.scalar(0);return[x,D,N]}),_=[],F=await d.array(),h=await l.array();for(let y=0;ya){let Y=(x+fe(h[y][x][D][0]))/u*m,q=(y+fe(h[y][x][D][1]))/u*p,O=Math.exp(h[y][x][D][2])*this.config.anchors[D].x/u*m,at=Math.exp(h[y][x][D][3])*this.config.anchors[D].y/u*p,st=Y-O/2,it=q-at/2,gt={row:y,col:x,anchor:D},{classScore:pr,label:ur}=this.withClassScores?await this.extractPredictedClass(g,gt):{classScore:1,label:0};_.push({box:new Nt(st,it,st+O,it+at),score:N,classScore:N*pr,label:ur,...gt})}}return l.dispose(),d.dispose(),g.dispose(),_}async extractPredictedClass(e,r){let{row:a,col:s,anchor:i}=r,c=await e.array();return Array(this.config.classes.length).fill(0).map((m,p)=>c[a][s][i][p]).map((m,p)=>({classScore:m,label:p})).reduce((m,p)=>m.classScore>p.classScore?m:p)}},wt=cr;wt.DEFAULT_FILTER_SIZES=[3,16,32,64,128,256,512,1024,1024];var Jt=class extends wt{constructor(t=!0){let e={withSeparableConvs:t,iouThreshold:eo,classes:["face"],...t?{anchors:oo,meanRgb:no}:{anchors:ro,withClassScores:!0}};super(e)}get withSeparableConvs(){return this.config.withSeparableConvs}get anchors(){return this.config.anchors}async locateFaces(t,e){return(await this.detect(t,e)).map(a=>new E(a.score,a.relativeBox,{width:a.imageWidth,height:a.imageHeight}))}getDefaultModelName(){return this.withSeparableConvs?so:ao}extractParamsFromWeightMap(t){return super.extractParamsFromWeightMap(t)}};function pd(o,t=!0){let e=new Jt(t);return e.extractWeights(o),e}var Le=class extends J{constructor(){super(...arguments);this._name="TinyFaceDetectorOptions"}};var V=class{async then(t){return t(await this.run())}async run(){throw new Error("ComposableTask - run is not implemented")}};async function Ft(o,t,e,r,a=({alignedRect:s})=>s){let s=o.map(m=>Yt(m)?a(m):m.detection),i=r||(t instanceof n.Tensor?await oe(t,s):await re(t,s)),c=await e(i);return i.forEach(m=>m instanceof n.Tensor&&m.dispose()),c}async function qt(o,t,e,r,a){return Ft([o],t,async s=>e(s[0]),r,a)}var po=.4,uo=[new b(1.603231,2.094468),new b(6.041143,7.080126),new b(2.882459,3.518061),new b(4.266906,5.178857),new b(9.041765,10.66308)],fo=[117.001,114.697,97.404];var Zt=class extends wt{constructor(){let t={withSeparableConvs:!0,iouThreshold:po,classes:["face"],anchors:uo,meanRgb:fo,isFirstLayerConv2d:!0,filterSizes:[3,16,32,64,128,256,512]};super(t)}get anchors(){return this.config.anchors}async locateFaces(t,e){return(await this.detect(t,e)).map(a=>new E(a.score,a.relativeBox,{width:a.imageWidth,height:a.imageHeight}))}getDefaultModelName(){return"tiny_face_detector_model"}extractParamsFromWeightMap(t){return super.extractParamsFromWeightMap(t)}};var P={ssdMobilenetv1:new Pt,tinyFaceDetector:new Zt,tinyYolov2:new Jt,faceLandmark68Net:new jt,faceLandmark68TinyNet:new Ie,faceRecognitionNet:new Ut,faceExpressionNet:new we,ageGenderNet:new Me},rn=(o,t)=>P.ssdMobilenetv1.locateFaces(o,t),Od=(o,t)=>P.tinyFaceDetector.locateFaces(o,t),Hd=(o,t)=>P.tinyYolov2.locateFaces(o,t),on=o=>P.faceLandmark68Net.detectLandmarks(o),zd=o=>P.faceLandmark68TinyNet.detectLandmarks(o),Vd=o=>P.faceRecognitionNet.computeFaceDescriptor(o),Yd=o=>P.faceExpressionNet.predictExpressions(o),Gd=o=>P.ageGenderNet.predictAgeAndGender(o),nn=o=>P.ssdMobilenetv1.load(o),jd=o=>P.tinyFaceDetector.load(o),Ud=o=>P.tinyYolov2.load(o),Xd=o=>P.faceLandmark68Net.load(o),Jd=o=>P.faceLandmark68TinyNet.load(o),qd=o=>P.faceRecognitionNet.load(o),Zd=o=>P.faceExpressionNet.load(o),Kd=o=>P.ageGenderNet.load(o),Qd=nn,th=rn,eh=on;var Ae=class extends V{constructor(e,r,a){super();this.parentTask=e;this.input=r;this.extractedFaces=a}},Dt=class extends Ae{async run(){let t=await this.parentTask,e=await Ft(t,this.input,async r=>Promise.all(r.map(a=>P.faceExpressionNet.predictExpressions(a))),this.extractedFaces);return t.map((r,a)=>tr(r,e[a]))}withAgeAndGender(){return new Mt(this,this.input)}},Et=class extends Ae{async run(){let t=await this.parentTask;if(!t)return;let e=await qt(t,this.input,r=>P.faceExpressionNet.predictExpressions(r),this.extractedFaces);return tr(t,e)}withAgeAndGender(){return new Ct(this,this.input)}},ut=class extends Dt{withAgeAndGender(){return new lt(this,this.input)}withFaceDescriptors(){return new ht(this,this.input)}},ft=class extends Et{withAgeAndGender(){return new dt(this,this.input)}withFaceDescriptor(){return new bt(this,this.input)}};var We=class extends V{constructor(e,r,a){super();this.parentTask=e;this.input=r;this.extractedFaces=a}},Mt=class extends We{async run(){let t=await this.parentTask,e=await Ft(t,this.input,async r=>Promise.all(r.map(a=>P.ageGenderNet.predictAgeAndGender(a))),this.extractedFaces);return t.map((r,a)=>{let{age:s,gender:i,genderProbability:c}=e[a];return sr(ir(r,i,c),s)})}withFaceExpressions(){return new Dt(this,this.input)}},Ct=class extends We{async run(){let t=await this.parentTask;if(!t)return;let{age:e,gender:r,genderProbability:a}=await qt(t,this.input,s=>P.ageGenderNet.predictAgeAndGender(s),this.extractedFaces);return sr(ir(t,r,a),e)}withFaceExpressions(){return new Et(this,this.input)}},lt=class extends Mt{withFaceExpressions(){return new ut(this,this.input)}withFaceDescriptors(){return new ht(this,this.input)}},dt=class extends Ct{withFaceExpressions(){return new ft(this,this.input)}withFaceDescriptor(){return new bt(this,this.input)}};var ke=class extends V{constructor(e,r){super();this.parentTask=e;this.input=r}},ht=class extends ke{async run(){let t=await this.parentTask;return(await Ft(t,this.input,r=>Promise.all(r.map(a=>P.faceRecognitionNet.computeFaceDescriptor(a))),null,r=>r.landmarks.align(null,{useDlibAlignment:!0}))).map((r,a)=>ar(t[a],r))}withFaceExpressions(){return new ut(this,this.input)}withAgeAndGender(){return new lt(this,this.input)}},bt=class extends ke{async run(){let t=await this.parentTask;if(!t)return;let e=await qt(t,this.input,r=>P.faceRecognitionNet.computeFaceDescriptor(r),null,r=>r.landmarks.align(null,{useDlibAlignment:!0}));return ar(t,e)}withFaceExpressions(){return new ft(this,this.input)}withAgeAndGender(){return new dt(this,this.input)}};var Be=class extends V{constructor(e,r,a){super();this.parentTask=e;this.input=r;this.useTinyLandmarkNet=a}get landmarkNet(){return this.useTinyLandmarkNet?P.faceLandmark68TinyNet:P.faceLandmark68Net}},Re=class extends Be{async run(){let t=await this.parentTask,e=t.map(i=>i.detection),r=this.input instanceof n.Tensor?await oe(this.input,e):await re(this.input,e),a=await Promise.all(r.map(i=>this.landmarkNet.detectLandmarks(i)));return r.forEach(i=>i instanceof n.Tensor&&i.dispose()),t.filter((i,c)=>a[c]).map((i,c)=>ie(i,a[c]))}withFaceExpressions(){return new ut(this,this.input)}withAgeAndGender(){return new lt(this,this.input)}withFaceDescriptors(){return new ht(this,this.input)}},$e=class extends Be{async run(){let t=await this.parentTask;if(!t)return;let{detection:e}=t,r=this.input instanceof n.Tensor?await oe(this.input,[e]):await re(this.input,[e]),a=await this.landmarkNet.detectLandmarks(r[0]);return r.forEach(s=>s instanceof n.Tensor&&s.dispose()),ie(t,a)}withFaceExpressions(){return new ft(this,this.input)}withAgeAndGender(){return new dt(this,this.input)}withFaceDescriptor(){return new bt(this,this.input)}};var Oe=class extends V{constructor(e,r=new z){super();this.input=e;this.options=r}},me=class extends Oe{async run(){let{input:t,options:e}=this,r;if(e instanceof Le)r=P.tinyFaceDetector.locateFaces(t,e);else if(e instanceof z)r=P.ssdMobilenetv1.locateFaces(t,e);else if(e instanceof J)r=P.tinyYolov2.locateFaces(t,e);else throw new Error("detectFaces - expected options to be instance of TinyFaceDetectorOptions | SsdMobilenetv1Options | TinyYolov2Options");return r}runAndExtendWithFaceDetections(){return new Promise((t,e)=>{this.run().then(r=>t(r.map(a=>At({},a)))).catch(r=>e(r))})}withFaceLandmarks(t=!1){return new Re(this.runAndExtendWithFaceDetections(),this.input,t)}withFaceExpressions(){return new Dt(this.runAndExtendWithFaceDetections(),this.input)}withAgeAndGender(){return new Mt(this.runAndExtendWithFaceDetections(),this.input)}},He=class extends Oe{async run(){let t=await new me(this.input,this.options),e=t[0];return t.forEach(r=>{r.score>e.score&&(e=r)}),e}runAndExtendWithFaceDetection(){return new Promise(async t=>{let e=await this.run();t(e?At({},e):void 0)})}withFaceLandmarks(t=!1){return new $e(this.runAndExtendWithFaceDetection(),this.input,t)}withFaceExpressions(){return new Et(this.runAndExtendWithFaceDetection(),this.input)}withAgeAndGender(){return new Ct(this.runAndExtendWithFaceDetection(),this.input)}};function Kh(o,t=new z){return new He(o,t)}function mr(o,t=new z){return new me(o,t)}async function an(o,t){return mr(o,new z(t?{minConfidence:t}:{})).withFaceLandmarks().withFaceDescriptors()}async function nb(o,t={}){return mr(o,new J(t)).withFaceLandmarks().withFaceDescriptors()}var ab=an;function lo(o,t){if(o.length!==t.length)throw new Error("euclideanDistance: arr1.length !== arr2.length");let e=Array.from(o),r=Array.from(t);return Math.sqrt(e.map((a,s)=>a-r[s]).reduce((a,s)=>a+s**2,0))}var ze=class{constructor(t,e=.6){this._distanceThreshold=e;let r=Array.isArray(t)?t:[t];if(!r.length)throw new Error("FaceRecognizer.constructor - expected atleast one input");let a=1,s=()=>`person ${a++}`;this._labeledDescriptors=r.map(i=>{if(i instanceof Q)return i;if(i instanceof Float32Array)return new Q(s(),[i]);if(i.descriptor&&i.descriptor instanceof Float32Array)return new Q(s(),[i.descriptor]);throw new Error("FaceRecognizer.constructor - expected inputs to be of type LabeledFaceDescriptors | WithFaceDescriptor | Float32Array | Array | Float32Array>")})}get labeledDescriptors(){return this._labeledDescriptors}get distanceThreshold(){return this._distanceThreshold}computeMeanDistance(t,e){return e.map(r=>lo(r,t)).reduce((r,a)=>r+a,0)/(e.length||1)}matchDescriptor(t){return this.labeledDescriptors.map(({descriptors:e,label:r})=>new Kt(r,this.computeMeanDistance(t,e))).reduce((e,r)=>e.distancet.toJSON())}}static fromJSON(t){let e=t.labeledDescriptors.map(r=>Q.fromJSON(r));return new ze(e,t.distanceThreshold)}};function Pb(o){let t=new Zt;return t.extractWeights(o),t}function sn(o,t){let{width:e,height:r}=new S(t.width,t.height);if(e<=0||r<=0)throw new Error(`resizeResults - invalid dimensions: ${JSON.stringify({width:e,height:r})}`);if(Array.isArray(o))return o.map(a=>sn(a,{width:e,height:r}));if(Yt(o)){let a=o.detection.forSize(e,r),s=o.unshiftedLandmarks.forSize(a.box.width,a.box.height);return ie(At(o,a),s)}return tt(o)?At(o,o.detection.forSize(e,r)):o instanceof $||o instanceof E?o.forSize(e,r):o}var Ab=Wr;export{Me as AgeGenderNet,Nt as BoundingBox,w as Box,V as ComposableTask,ht as ComputeAllFaceDescriptorsTask,ke as ComputeFaceDescriptorsTaskBase,bt as ComputeSingleFaceDescriptorTask,Re as DetectAllFaceLandmarksTask,me as DetectAllFacesTask,Be as DetectFaceLandmarksTaskBase,Oe as DetectFacesTaskBase,$e as DetectSingleFaceLandmarksTask,He as DetectSingleFaceTask,S as Dimensions,Sr as FACE_EXPRESSION_LABELS,E as FaceDetection,to as FaceDetectionNet,we as FaceExpressionNet,pt as FaceExpressions,jt as FaceLandmark68Net,Ie as FaceLandmark68TinyNet,Vr as FaceLandmarkNet,$ as FaceLandmarks,vr as FaceLandmarks5,Lt as FaceLandmarks68,Kt as FaceMatch,ze as FaceMatcher,Ut as FaceRecognitionNet,rr as Gender,Qt as LabeledBox,Q as LabeledFaceDescriptors,rt as NetInput,I as NeuralNetwork,ct as ObjectDetection,b as Point,yr as PredictedBox,St as Rect,Pt as SsdMobilenetv1,z as SsdMobilenetv1Options,Zt as TinyFaceDetector,Le as TinyFaceDetectorOptions,Jt as TinyYolov2,J as TinyYolov2Options,ab as allFaces,an as allFacesSsdMobilenetv1,nb as allFacesTinyYolov2,_r as awaitMediaLoaded,Tr as bufferToImage,Vd as computeFaceDescriptor,Rt as createCanvas,be as createCanvasFromMedia,vl as createFaceDetectionNet,vf as createFaceRecognitionNet,Qo as createSsdMobilenetv1,Pb as createTinyFaceDetector,pd as createTinyYolov2,mr as detectAllFaces,on as detectFaceLandmarks,zd as detectFaceLandmarksTiny,eh as detectLandmarks,Kh as detectSingleFace,Ar as draw,T as env,lo as euclideanDistance,sr as extendWithAge,ar as extendWithFaceDescriptor,At as extendWithFaceDetection,tr as extendWithFaceExpressions,ie as extendWithFaceLandmarks,ir as extendWithGender,oe as extractFaceTensors,re as extractFaces,Mi as fetchImage,Fr as fetchJson,Li as fetchNetWeights,mt as fetchOrThrow,$i as fetchVideo,k as getContext2dOrThrow,Bt as getMediaDimensions,Pr as imageTensorToCanvas,wr as imageToSquare,Vn as inverseSigmoid,hr as iou,Qe as isMediaElement,he as isMediaLoaded,Pf as isWithAge,tt as isWithFaceDetection,Lr as isWithFaceExpressions,Yt as isWithFaceLandmarks,Ef as isWithGender,Kd as loadAgeGenderModel,Qd as loadFaceDetectionModel,Zd as loadFaceExpressionModel,Xd as loadFaceLandmarkModel,Jd as loadFaceLandmarkTinyModel,qd as loadFaceRecognitionModel,nn as loadSsdMobilenetv1Model,jd as loadTinyFaceDetectorModel,Ud as loadTinyYolov2Model,Er as loadWeightMap,th as locateFaces,ji as matchDimensions,br as minBbox,P as nets,gr as nonMaxSuppression,X as normalize,xr as padToSquare,Gd as predictAgeAndGender,Yd as recognizeFaceExpressions,sn as resizeResults,Wt as resolveInput,Hn as shuffleArray,fe as sigmoid,rn as ssdMobilenetv1,n as tf,Od as tinyFaceDetector,Hd as tinyYolov2,M as toNetInput,dr as utils,io as validateConfig,Ab as version}; +var lr=Object.defineProperty;var ho=Object.getOwnPropertyDescriptor;var bo=Object.getOwnPropertyNames;var go=Object.prototype.hasOwnProperty;var xo=(o=>typeof require!="undefined"?require:typeof Proxy!="undefined"?new Proxy(o,{get:(t,e)=>(typeof require!="undefined"?require:t)[e]}):o)(function(o){if(typeof require!="undefined")return require.apply(this,arguments);throw new Error('Dynamic require of "'+o+'" is not supported')});var Ve=(o,t)=>{for(var e in t)lr(o,e,{get:t[e],enumerable:!0})},fr=(o,t,e,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of bo(t))!go.call(o,a)&&a!==e&&lr(o,a,{get:()=>t[a],enumerable:!(r=ho(t,a))||r.enumerable});return o},v=(o,t,e)=>(fr(o,t,"default"),e&&fr(e,t,"default"));var n={};Ve(n,{version:()=>Eo});v(n,fn);v(n,ln);v(n,dn);import*as fn from"@tensorflow/tfjs/dist/index.js";import*as ln from"@tensorflow/tfjs-backend-webgl/dist/index.js";import*as dn from"@tensorflow/tfjs-backend-wasm/dist/index.js";var vo="3.19.0",yo="3.19.0",_o="3.19.0",To="3.19.0",Po="3.19.0",wo="3.19.0",Fo="3.19.0",Do="3.19.0",Eo={tfjs:vo,"tfjs-core":yo,"tfjs-data":_o,"tfjs-layers":To,"tfjs-converter":Po,"tfjs-backend-cpu":wo,"tfjs-backend-webgl":Fo,"tfjs-backend-wasm":Do};var Ar={};Ve(Ar,{AnchorPosition:()=>Ke,DrawBox:()=>ee,DrawBoxOptions:()=>de,DrawFaceLandmarks:()=>De,DrawFaceLandmarksOptions:()=>Fe,DrawTextField:()=>et,DrawTextFieldOptions:()=>kt,drawContour:()=>Z,drawDetections:()=>Ao,drawFaceExpressions:()=>Wo,drawFaceLandmarks:()=>Bo});function Z(o,t,e=!1){if(o.beginPath(),t.slice(1).forEach(({x:r,y:a},s)=>{let i=t[s];o.moveTo(i.x,i.y),o.lineTo(r,a)}),e){let r=t[t.length-1],a=t[0];if(!r||!a)return;o.moveTo(r.x,r.y),o.lineTo(a.x,a.y)}o.stroke()}var dr={};Ve(dr,{computeReshapedDimensions:()=>je,getCenterPoint:()=>yt,isDimensions:()=>ue,isEven:()=>pe,isFloat:()=>Ge,isTensor:()=>xt,isTensor1D:()=>Mo,isTensor2D:()=>Ye,isTensor3D:()=>K,isTensor4D:()=>R,isValidNumber:()=>G,isValidProbablitiy:()=>It,range:()=>U,round:()=>vt});var S=class{constructor(t,e){if(!G(t)||!G(e))throw new Error(`Dimensions.constructor - expected width and height to be valid numbers, instead have ${JSON.stringify({width:t,height:e})}`);this._width=t,this._height=e}get width(){return this._width}get height(){return this._height}reverse(){return new S(1/this.width,1/this.height)}};function xt(o,t){return o instanceof n.Tensor&&o.shape.length===t}function Mo(o){return xt(o,1)}function Ye(o){return xt(o,2)}function K(o){return xt(o,3)}function R(o){return xt(o,4)}function Ge(o){return o%1!==0}function pe(o){return o%2===0}function vt(o,t=2){let e=10**t;return Math.floor(o*e)/e}function ue(o){return o&&o.width&&o.height}function je({width:o,height:t},e){let r=e/Math.max(t,o);return new S(Math.round(o*r),Math.round(t*r))}function yt(o){return o.reduce((t,e)=>t.add(e),new b(0,0)).div(new b(o.length,o.length))}function U(o,t,e){return Array(o).fill(0).map((r,a)=>t+a*e)}function G(o){return!!o&&o!==1/0&&o!==-1/0&&!Number.isNaN(o)||o===0}function It(o){return G(o)&&o>=0&&o<=1}var b=class{constructor(t,e){this._x=t,this._y=e}get x(){return this._x}get y(){return this._y}add(t){return new b(this.x+t.x,this.y+t.y)}sub(t){return new b(this.x-t.x,this.y-t.y)}mul(t){return new b(this.x*t.x,this.y*t.y)}div(t){return new b(this.x/t.x,this.y/t.y)}abs(){return new b(Math.abs(this.x),Math.abs(this.y))}magnitude(){return Math.sqrt(this.x**2+this.y**2)}floor(){return new b(Math.floor(this.x),Math.floor(this.y))}};var w=class{static isRect(t){return!!t&&[t.x,t.y,t.width,t.height].every(G)}static assertIsValidBox(t,e,r=!1){if(!w.isRect(t))throw new Error(`${e} - invalid box: ${JSON.stringify(t)}, expected object with properties x, y, width, height`);if(!r&&(t.width<0||t.height<0))throw new Error(`${e} - width (${t.width}) and height (${t.height}) must be positive numbers`)}constructor(t,e=!0){let r=t||{},a=[r.left,r.top,r.right,r.bottom].every(G),s=[r.x,r.y,r.width,r.height].every(G);if(!s&&!a)throw new Error(`Box.constructor - expected box to be IBoundingBox | IRect, instead have ${JSON.stringify(r)}`);let[i,c,m,p]=s?[r.x,r.y,r.width,r.height]:[r.left,r.top,r.right-r.left,r.bottom-r.top];w.assertIsValidBox({x:i,y:c,width:m,height:p},"Box.constructor",e),this._x=i,this._y=c,this._width=m,this._height=p}get x(){return this._x}get y(){return this._y}get width(){return this._width}get height(){return this._height}get left(){return this.x}get top(){return this.y}get right(){return this.x+this.width}get bottom(){return this.y+this.height}get area(){return this.width*this.height}get topLeft(){return new b(this.left,this.top)}get topRight(){return new b(this.right,this.top)}get bottomLeft(){return new b(this.left,this.bottom)}get bottomRight(){return new b(this.right,this.bottom)}round(){let[t,e,r,a]=[this.x,this.y,this.width,this.height].map(s=>Math.round(s));return new w({x:t,y:e,width:r,height:a})}floor(){let[t,e,r,a]=[this.x,this.y,this.width,this.height].map(s=>Math.floor(s));return new w({x:t,y:e,width:r,height:a})}toSquare(){let{x:t,y:e,width:r,height:a}=this,s=Math.abs(r-a);return re&&(c=-f+e+r,f=e),l>t&&(m=-l+t+a,l=t),p<1&&(m=2-p,p=1),u<1&&(m=2-u,u=1),{dy:i,edy:m,dx:s,edx:c,y:u,ey:l,x:p,ex:f,w:r,h:a}}calibrate(t){return new w({left:this.left+t.left*this.width,top:this.top+t.top*this.height,right:this.right+t.right*this.width,bottom:this.bottom+t.bottom*this.height}).toSquare().round()}};var Nt=class extends w{constructor(t,e,r,a,s=!1){super({left:t,top:e,right:r,bottom:a},s)}};var ct=class{constructor(t,e,r,a,s){this._imageDims=new S(s.width,s.height),this._score=t,this._classScore=e,this._className=r,this._box=new w(a).rescale(this._imageDims)}get score(){return this._score}get classScore(){return this._classScore}get className(){return this._className}get box(){return this._box}get imageDims(){return this._imageDims}get imageWidth(){return this.imageDims.width}get imageHeight(){return this.imageDims.height}get relativeBox(){return new w(this._box).rescale(this.imageDims.reverse())}forSize(t,e){return new ct(this.score,this.classScore,this.className,this.relativeBox,{width:t,height:e})}};var E=class extends ct{constructor(t,e,r){super(t,t,"",e,r)}forSize(t,e){let{score:r,relativeBox:a,imageDims:s}=super.forSize(t,e);return new E(r,a,s)}};function hr(o,t,e=!0){let r=Math.max(0,Math.min(o.right,t.right)-Math.max(o.left,t.left)),a=Math.max(0,Math.min(o.bottom,t.bottom)-Math.max(o.top,t.top)),s=r*a;return e?s/(o.area+t.area-s):s/Math.min(o.area,t.area)}function br(o){let t=o.map(c=>c.x),e=o.map(c=>c.y),r=t.reduce((c,m)=>mmcc({score:i,boxIndex:c})).sort((i,c)=>i.score-c.score).map(i=>i.boxIndex),s=[];for(;a.length>0;){let i=a.pop();s.push(i);let c=a,m=[];for(let p=0;pm[u]<=e)}return s}function X(o,t){return n.tidy(()=>{let[e,r,a]=t,s=n.fill([...o.shape.slice(0,3),1],e,"float32"),i=n.fill([...o.shape.slice(0,3),1],r,"float32"),c=n.fill([...o.shape.slice(0,3),1],a,"float32"),m=n.concat([s,i,c],3);return n.sub(o,m)})}function xr(o,t=!1){return n.tidy(()=>{let[e,r]=o.shape.slice(1);if(e===r)return o;let a=Math.abs(e-r),s=Math.round(a*(t?.5:1)),i=e>r?2:1,c=l=>{let d=o.shape.slice();return d[i]=l,n.fill(d,0,"float32")},m=c(s),p=a-m.shape[i],f=[t&&p?c(p):null,o,m].filter(l=>!!l).map(l=>n.cast(l,"float32"));return n.concat(f,i)})}function Hn(o){let t=o.slice();for(let e=t.length-1;e>0;e--){let r=Math.floor(Math.random()*(e+1)),a=t[e];t[e]=t[r],t[r]=a}return t}function fe(o){return 1/(1+Math.exp(-o))}function Vn(o){return Math.log(o/(1-o))}var St=class extends w{constructor(t,e,r,a,s=!1){super({x:t,y:e,width:r,height:a},s)}};var Co=.5,Io=.43,No=.45,$=class{constructor(t,e,r=new b(0,0)){let{width:a,height:s}=e;this._imgDims=new S(a,s),this._shift=r,this._positions=t.map(i=>i.mul(new b(a,s)).add(r))}get shift(){return new b(this._shift.x,this._shift.y)}get imageWidth(){return this._imgDims.width}get imageHeight(){return this._imgDims.height}get positions(){return this._positions}get relativePositions(){return this._positions.map(t=>t.sub(this._shift).div(new b(this.imageWidth,this.imageHeight)))}forSize(t,e){return new this.constructor(this.relativePositions,{width:t,height:e})}shiftBy(t,e){return new this.constructor(this.relativePositions,this._imgDims,new b(t,e))}shiftByPoint(t){return this.shiftBy(t.x,t.y)}align(t,e={}){if(t){let s=t instanceof E?t.box.floor():new w(t);return this.shiftBy(s.x,s.y).align(null,e)}let{useDlibAlignment:r,minBoxPadding:a}={useDlibAlignment:!1,minBoxPadding:.2,...e};return r?this.alignDlib():this.alignMinBbox(a)}alignDlib(){let t=this.getRefPointsForAlignment(),[e,r,a]=t,s=f=>a.sub(f).magnitude(),i=(s(e)+s(r))/2,c=Math.floor(i/No),m=yt(t),p=Math.floor(Math.max(0,m.x-Co*c)),u=Math.floor(Math.max(0,m.y-Io*c));return new St(p,u,Math.min(c,this.imageWidth+p),Math.min(c,this.imageHeight+u))}alignMinBbox(t){let e=br(this.positions);return e.pad(e.width*t,e.height*t)}getRefPointsForAlignment(){throw new Error("getRefPointsForAlignment not implemented by base class")}};var vr=class extends ${getRefPointsForAlignment(){let t=this.positions;return[t[0],t[1],yt([t[3],t[4]])]}};var Lt=class extends ${getJawOutline(){return this.positions.slice(0,17)}getLeftEyeBrow(){return this.positions.slice(17,22)}getRightEyeBrow(){return this.positions.slice(22,27)}getNose(){return this.positions.slice(27,36)}getLeftEye(){return this.positions.slice(36,42)}getRightEye(){return this.positions.slice(42,48)}getMouth(){return this.positions.slice(48,68)}getRefPointsForAlignment(){return[this.getLeftEye(),this.getRightEye(),this.getMouth()].map(yt)}};var Kt=class{constructor(t,e){this._label=t,this._distance=e}get label(){return this._label}get distance(){return this._distance}toString(t=!0){return`${this.label}${t?` (${vt(this.distance)})`:""}`}};var Qt=class extends w{constructor(e,r){super(e);this._label=r}static assertIsValidLabeledBox(e,r){if(w.assertIsValidBox(e,r),!G(e.label))throw new Error(`${r} - expected property label (${e.label}) to be a number`)}get label(){return this._label}};var Q=class{constructor(t,e){if(typeof t!="string")throw new Error("LabeledFaceDescriptors - constructor expected label to be a string");if(!Array.isArray(e)||e.some(r=>!(r instanceof Float32Array)))throw new Error("LabeledFaceDescriptors - constructor expected descriptors to be an array of Float32Array");this._label=t,this._descriptors=e}get label(){return this._label}get descriptors(){return this._descriptors}toJSON(){return{label:this.label,descriptors:this.descriptors.map(t=>Array.from(t))}}static fromJSON(t){let e=t.descriptors.map(r=>new Float32Array(r));return new Q(t.label,e)}};var yr=class extends Qt{constructor(e,r,a,s){super(e,r);this._score=a,this._classScore=s}static assertIsValidPredictedBox(e,r){if(Qt.assertIsValidLabeledBox(e,r),!It(e.score)||!It(e.classScore))throw new Error(`${r} - expected properties score (${e.score}) and (${e.classScore}) to be a number between [0, 1]`)}get score(){return this._score}get classScore(){return this._classScore}};function tt(o){return o.detection instanceof E}function At(o,t){return{...o,...{detection:t}}}function Ue(){let o=window.fetch;if(!o)throw new Error("fetch - missing fetch implementation for browser environment");return{Canvas:HTMLCanvasElement,CanvasRenderingContext2D,Image:HTMLImageElement,ImageData,Video:HTMLVideoElement,createCanvasElement:()=>document.createElement("canvas"),createImageElement:()=>document.createElement("img"),createVideoElement:()=>document.createElement("video"),fetch:o,readFile:()=>{throw new Error("readFile - filesystem not available for browser environment")}}}function te(){return typeof global=="object"&&typeof process!="undefined"&&process.versions!=null&&process.versions.node!=null}function le(o){let t="";if(!o&&te())try{o=xo("fs")}catch(r){t=r.toString()}return{readFile:o?r=>new Promise((a,s)=>{o.readFile(r,(i,c)=>i?s(i):a(c))}):()=>{throw new Error(`readFile - failed to require fs in nodejs environment with error: ${t}`)}}}function Xe(){let o=global.Canvas||global.HTMLCanvasElement,t=global.Image||global.HTMLImageElement,e=global.Video||global.HTMLVideoElement,r=()=>{if(o)return new o;throw new Error("createCanvasElement - missing Canvas implementation for nodejs environment")},a=()=>{if(t)return new t;throw new Error("createImageElement - missing Image implementation for nodejs environment")},s=()=>{if(e)return new e;throw new Error("createVideoElement - missing Video implementation for nodejs environment")},i=global.fetch,c=le();return{Canvas:o||class{},CanvasRenderingContext2D:global.CanvasRenderingContext2D||class{},Image:t||class{},ImageData:global.ImageData||class{},Video:global.HTMLVideoElement||class{},createCanvasElement:r,createImageElement:a,createVideoElement:s,fetch:i,...c}}function Je(){return typeof window=="object"&&typeof document!="undefined"&&typeof HTMLImageElement!="undefined"&&typeof HTMLCanvasElement!="undefined"&&typeof HTMLVideoElement!="undefined"&&typeof ImageData!="undefined"&&typeof CanvasRenderingContext2D!="undefined"}var C;function So(){if(!C)throw new Error("getEnv - environment is not defined, check isNodejs() and isBrowser()");return C}function qe(o){C=o}function Ze(){return Je()?qe(Ue()):te()?qe(Xe()):null}function Lo(o){if(C||Ze(),!C)throw new Error("monkeyPatch - environment is not defined, check isNodejs() and isBrowser()");let{Canvas:t=C.Canvas,Image:e=C.Image}=o;C.Canvas=t,C.Image=e,C.createCanvasElement=o.createCanvasElement||(()=>new t),C.createImageElement=o.createImageElement||(()=>new e),C.ImageData=o.ImageData||C.ImageData,C.Video=o.Video||C.Video,C.fetch=o.fetch||C.fetch,C.readFile=o.readFile||C.readFile}var T={getEnv:So,setEnv:qe,initialize:Ze,createBrowserEnv:Ue,createFileSystem:le,createNodejsEnv:Xe,monkeyPatch:Lo,isBrowser:Je,isNodejs:te};Ze();function Wt(o){return!T.isNodejs()&&typeof o=="string"?document.getElementById(o):o}function k(o){let{Canvas:t,CanvasRenderingContext2D:e}=T.getEnv();if(o instanceof e)return o;let r=Wt(o);if(!(r instanceof t))throw new Error("resolveContext2d - expected canvas to be of instance of Canvas");let a=r.getContext("2d");if(!a)throw new Error("resolveContext2d - canvas 2d context is null");return a}var Ke=(a=>(a.TOP_LEFT="TOP_LEFT",a.TOP_RIGHT="TOP_RIGHT",a.BOTTOM_LEFT="BOTTOM_LEFT",a.BOTTOM_RIGHT="BOTTOM_RIGHT",a))(Ke||{}),kt=class{constructor(t={}){let{anchorPosition:e,backgroundColor:r,fontColor:a,fontSize:s,fontStyle:i,padding:c}=t;this.anchorPosition=e||"TOP_LEFT",this.backgroundColor=r||"rgba(0, 0, 0, 0.5)",this.fontColor=a||"rgba(255, 255, 255, 1)",this.fontSize=s||14,this.fontStyle=i||"Georgia",this.padding=c||4}},et=class{constructor(t,e,r={}){this.text=typeof t=="string"?[t]:t instanceof et?t.text:t,this.anchor=e,this.options=new kt(r)}measureWidth(t){let{padding:e}=this.options;return this.text.map(r=>t.measureText(r).width).reduce((r,a)=>r{let g=m+f.x,_=m+f.y+(d+1)*i;r.fillText(l,g,_)})}};var de=class{constructor(t={}){let{boxColor:e,lineWidth:r,label:a,drawLabelOptions:s}=t;this.boxColor=e||"rgba(0, 0, 255, 1)",this.lineWidth=r||2,this.label=a;let i={anchorPosition:"BOTTOM_LEFT",backgroundColor:this.boxColor};this.drawLabelOptions=new kt({...i,...s})}},ee=class{constructor(t,e={}){this.box=new w(t),this.options=new de(e)}draw(t){let e=k(t),{boxColor:r,lineWidth:a}=this.options,{x:s,y:i,width:c,height:m}=this.box;e.strokeStyle=r,e.lineWidth=a,e.strokeRect(s,i,c,m);let{label:p}=this.options;p&&new et([p],{x:s-a/2,y:i},this.options.drawLabelOptions).draw(t)}};function Ao(o,t){(Array.isArray(t)?t:[t]).forEach(r=>{let a=r instanceof E?r.score:tt(r)?r.detection.score:void 0,s=r instanceof E?r.box:tt(r)?r.detection.box:new w(r),i=a?`${vt(a)}`:void 0;new ee(s,{label:i}).draw(o)})}function he(o){let{Image:t,Video:e}=T.getEnv();return o instanceof t&&o.complete||o instanceof e&&o.readyState>=3}function _r(o){return new Promise((t,e)=>{(o instanceof T.getEnv().Canvas||he(o))&&t(null);function r(s){!s.currentTarget||(s.currentTarget.removeEventListener("load",a),s.currentTarget.removeEventListener("error",r),e(s))}function a(s){!s.currentTarget||(s.currentTarget.removeEventListener("load",a),s.currentTarget.removeEventListener("error",r),t(s))}o.addEventListener("load",a),o.addEventListener("error",r)})}function Tr(o){return new Promise((t,e)=>{o instanceof Blob||e(new Error("bufferToImage - expected buf to be of type: Blob"));let r=new FileReader;r.onload=()=>{typeof r.result!="string"&&e(new Error("bufferToImage - expected reader.result to be a string, in onload"));let a=T.getEnv().createImageElement();a.onload=()=>t(a),a.onerror=e,a.src=r.result},r.onerror=e,r.readAsDataURL(o)})}function Bt(o){let{Image:t,Video:e}=T.getEnv();return o instanceof t?new S(o.naturalWidth,o.naturalHeight):o instanceof e?new S(o.videoWidth,o.videoHeight):new S(o.width,o.height)}function Rt({width:o,height:t}){let{createCanvasElement:e}=T.getEnv(),r=e();return r.width=o,r.height=t,r}function be(o,t){let{ImageData:e}=T.getEnv();if(!(o instanceof e)&&!he(o))throw new Error("createCanvasFromMedia - media has not finished loading yet");let{width:r,height:a}=t||Bt(o),s=Rt({width:r,height:a});return o instanceof e?k(s).putImageData(o,0,0):k(s).drawImage(o,0,0,r,a),s}async function Pr(o,t){let e=t||T.getEnv().createCanvasElement(),[r,a,s]=o.shape.slice(R(o)?1:0),i=n.tidy(()=>o.as3D(r,a,s).toInt());return await n.browser.toPixels(i,e),i.dispose(),e}function Qe(o){let{Image:t,Canvas:e,Video:r}=T.getEnv();return o instanceof t||o instanceof e||o instanceof r}function wr(o,t,e=!1){let{Image:r,Canvas:a}=T.getEnv();if(!(o instanceof r||o instanceof a))throw new Error("imageToSquare - expected arg0 to be HTMLImageElement | HTMLCanvasElement");if(t<=0)return Rt({width:1,height:1});let s=Bt(o),i=t/Math.max(s.height,s.width),c=i*s.width,m=i*s.height,p=Rt({width:t,height:t}),u=o instanceof a?o:be(o),f=Math.abs(c-m)/2,l=e&&c0&&u.height>0&&k(p).drawImage(u,l,d,c,m),p}var rt=class{constructor(t,e=!1){this._imageTensors=[];this._canvases=[];this._treatAsBatchInput=!1;this._inputDimensions=[];this._inputSize=0;if(!Array.isArray(t))throw new Error(`NetInput.constructor - expected inputs to be an Array of TResolvedNetInput or to be instanceof tf.Tensor4D, instead have ${t}`);this._treatAsBatchInput=e,this._batchSize=t.length,t.forEach((r,a)=>{if(K(r)){this._imageTensors[a]=r,this._inputDimensions[a]=r.shape;return}if(R(r)){let i=r.shape[0];if(i!==1)throw new Error(`NetInput - tf.Tensor4D with batchSize ${i} passed, but not supported in input array`);this._imageTensors[a]=r,this._inputDimensions[a]=r.shape.slice(1);return}let s=r instanceof T.getEnv().Canvas?r:be(r);this._canvases[a]=s,this._inputDimensions[a]=[s.height,s.width,3]})}get imageTensors(){return this._imageTensors}get canvases(){return this._canvases}get isBatchInput(){return this.batchSize>1||this._treatAsBatchInput}get batchSize(){return this._batchSize}get inputDimensions(){return this._inputDimensions}get inputSize(){return this._inputSize}get reshapedInputDimensions(){return U(this.batchSize,0,1).map((t,e)=>this.getReshapedInputDimensions(e))}getInput(t){return this.canvases[t]||this.imageTensors[t]}getInputDimensions(t){return this._inputDimensions[t]}getInputHeight(t){return this._inputDimensions[t][0]}getInputWidth(t){return this._inputDimensions[t][1]}getReshapedInputDimensions(t){if(typeof this.inputSize!="number")throw new Error("getReshapedInputDimensions - inputSize not set, toBatchTensor has not been called yet");let e=this.getInputWidth(t),r=this.getInputHeight(t);return je({width:e,height:r},this.inputSize)}toBatchTensor(t,e=!0){return this._inputSize=t,n.tidy(()=>{let r=U(this.batchSize,0,1).map(s=>{let i=this.getInput(s);if(i instanceof n.Tensor){let c=R(i)?i:n.expandDims(i);return c=xr(c,e),(c.shape[1]!==t||c.shape[2]!==t)&&(c=n.image.resizeBilinear(c,[t,t],!1,!1)),c.as3D(t,t,3)}if(i instanceof T.getEnv().Canvas)return n.browser.fromPixels(wr(i,t,e));throw new Error(`toBatchTensor - at batchIdx ${s}, expected input to be instanceof tf.Tensor or instanceof HTMLCanvasElement, instead have ${i}`)});return n.stack(r.map(s=>n.cast(s,"float32"))).as4D(this.batchSize,t,t,3)})}};async function M(o){if(o instanceof rt)return o;let t=Array.isArray(o)?o:[o];if(!t.length)throw new Error("toNetInput - empty array passed as input");let e=a=>Array.isArray(o)?` at input index ${a}:`:"",r=t.map(Wt);return r.forEach((a,s)=>{if(!Qe(a)&&!K(a)&&!R(a))throw typeof t[s]=="string"?new Error(`toNetInput -${e(s)} string passed, but could not resolve HTMLElement for element id ${t[s]}`):new Error(`toNetInput -${e(s)} expected media to be of type HTMLImageElement | HTMLVideoElement | HTMLCanvasElement | tf.Tensor3D, or to be an element id`);if(R(a)){let i=a.shape[0];if(i!==1)throw new Error(`toNetInput -${e(s)} tf.Tensor4D with batchSize ${i} passed, but not supported in input array`)}}),await Promise.all(r.map(a=>Qe(a)&&_r(a))),new rt(r,Array.isArray(o))}async function re(o,t){let{Canvas:e}=T.getEnv(),r=o;if(!(o instanceof e)){let i=await M(o);if(i.batchSize>1)throw new Error("extractFaces - batchSize > 1 not supported");let c=i.getInput(0);r=c instanceof e?c:await Pr(c)}let a=k(r);return t.map(i=>i instanceof E?i.forSize(r.width,r.height).box.floor():i).map(i=>i.clipAtImageBorders(r.width,r.height)).map(({x:i,y:c,width:m,height:p})=>{let u=Rt({width:m,height:p});return m>0&&p>0&&k(u).putImageData(a.getImageData(i,c,m,p),0,0),u})}async function oe(o,t){if(!K(o)&&!R(o))throw new Error("extractFaceTensors - expected image tensor to be 3D or 4D");if(R(o)&&o.shape[0]>1)throw new Error("extractFaceTensors - batchSize > 1 not supported");return n.tidy(()=>{let[e,r,a]=o.shape.slice(R(o)?1:0);return t.map(c=>c instanceof E?c.forSize(r,e).box:c).map(c=>c.clipAtImageBorders(r,e)).filter(c=>c.width>0&&c.height>0).map(({x:c,y:m,width:p,height:u})=>n.slice3d(o.as3D(e,r,a),[m,c,0],[u,p,a]))})}async function mt(o,t){let{fetch:e}=T.getEnv(),r=await e(o,t);if(!(r.status<400))throw new Error(`failed to fetch: (${r.status}) ${r.statusText}, from url: ${r.url}`);return r}async function Mi(o){let t=await mt(o),e=await t.blob();if(!e.type.startsWith("image/"))throw new Error(`fetchImage - expected blob type to be of type image/*, instead have: ${e.type}, for url: ${t.url}`);return Tr(e)}async function Fr(o){return(await mt(o)).json()}async function Li(o){return new Float32Array(await(await mt(o)).arrayBuffer())}function Dr(o){return new Promise((t,e)=>{o instanceof Blob||e(new Error("bufferToVideo - expected buf to be of type: Blob"));let r=T.getEnv().createVideoElement();r.oncanplay=()=>t(r),r.onerror=e,r.playsInline=!0,r.muted=!0,r.src=URL.createObjectURL(o),r.play()})}async function $i(o){let t=await mt(o),e=await t.blob();if(!e.type.startsWith("video/"))throw new Error(`fetchVideo - expected blob type to be of type video/*, instead have: ${e.type}, for url: ${t.url}`);return Dr(e)}function ge(o,t){let e=`${t}-weights_manifest.json`;if(!o)return{modelBaseUri:"",manifestUri:e};if(o==="/")return{modelBaseUri:"/",manifestUri:`/${e}`};let r=o.startsWith("http://")?"http://":o.startsWith("https://")?"https://":"";o=o.replace(r,"");let a=o.split("/").filter(c=>c),s=o.endsWith(".json")?a[a.length-1]:e,i=r+(o.endsWith(".json")?a.slice(0,a.length-1):a).join("/");return i=o.startsWith("/")?`/${i}`:i,{modelBaseUri:i,manifestUri:i==="/"?`/${s}`:`${i}/${s}`}}async function Er(o,t){let{manifestUri:e,modelBaseUri:r}=ge(o,t),a=await Fr(e);return n.io.loadWeights(a,r)}function ji(o,t,e=!1){let{width:r,height:a}=e?Bt(t):t;return o.width=r,o.height=a,{width:r,height:a}}var I=class{constructor(t){this._params=void 0;this._paramMappings=[];this._name=t}get params(){return this._params}get paramMappings(){return this._paramMappings}get isLoaded(){return!!this.params}getParamFromPath(t){let{obj:e,objProp:r}=this.traversePropertyPath(t);return e[r]}reassignParamFromPath(t,e){let{obj:r,objProp:a}=this.traversePropertyPath(t);r[a].dispose(),r[a]=e}getParamList(){return this._paramMappings.map(({paramPath:t})=>({path:t,tensor:this.getParamFromPath(t)}))}getTrainableParams(){return this.getParamList().filter(t=>t.tensor instanceof n.Variable)}getFrozenParams(){return this.getParamList().filter(t=>!(t.tensor instanceof n.Variable))}variable(){this.getFrozenParams().forEach(({path:t,tensor:e})=>{this.reassignParamFromPath(t,e.variable())})}freeze(){this.getTrainableParams().forEach(({path:t,tensor:e})=>{let r=n.tensor(e.dataSync());e.dispose(),this.reassignParamFromPath(t,r)})}dispose(t=!0){this.getParamList().forEach(e=>{if(t&&e.tensor.isDisposed)throw new Error(`param tensor has already been disposed for path ${e.path}`);e.tensor.dispose()}),this._params=void 0}serializeParams(){return new Float32Array(this.getParamList().map(({tensor:t})=>Array.from(t.dataSync())).reduce((t,e)=>t.concat(e)))}async load(t){if(t instanceof Float32Array){this.extractWeights(t);return}await this.loadFromUri(t)}async loadFromUri(t){if(t&&typeof t!="string")throw new Error(`${this._name}.loadFromUri - expected model uri`);let e=await Er(t,this.getDefaultModelName());this.loadFromWeightMap(e)}async loadFromDisk(t){if(t&&typeof t!="string")throw new Error(`${this._name}.loadFromDisk - expected model file path`);let{readFile:e}=T.getEnv(),{manifestUri:r,modelBaseUri:a}=ge(t,this.getDefaultModelName()),s=p=>Promise.all(p.map(u=>e(u).then(f=>f.buffer))),i=n.io.weightsLoaderFactory(s),c=JSON.parse((await e(r)).toString()),m=await i(c,a);this.loadFromWeightMap(m)}loadFromWeightMap(t){let{paramMappings:e,params:r}=this.extractParamsFromWeightMap(t);this._paramMappings=e,this._params=r}extractWeights(t){let{paramMappings:e,params:r}=this.extractParams(t);this._paramMappings=e,this._params=r}traversePropertyPath(t){if(!this.params)throw new Error("traversePropertyPath - model has no loaded params");let e=t.split("/").reduce((s,i)=>{if(!s.nextObj.hasOwnProperty(i))throw new Error(`traversePropertyPath - object does not have property ${i}, for path ${t}`);return{obj:s.nextObj,objProp:i,nextObj:s.nextObj[i]}},{nextObj:this.params}),{obj:r,objProp:a}=e;if(!r||!a||!(r[a]instanceof n.Tensor))throw new Error(`traversePropertyPath - parameter is not a tensor, for path ${t}`);return{obj:r,objProp:a}}};function W(o,t,e){return n.tidy(()=>{let r=n.separableConv2d(o,t.depthwise_filter,t.pointwise_filter,e,"same");return r=n.add(r,t.bias),r})}function xe(o,t,e=!1){return n.tidy(()=>{let r=n.relu(e?n.add(n.conv2d(o,t.conv0.filters,[2,2],"same"),t.conv0.bias):W(o,t.conv0,[2,2])),a=W(r,t.conv1,[1,1]),s=n.relu(n.add(r,a)),i=W(s,t.conv2,[1,1]);return n.relu(n.add(r,n.add(a,i)))})}function ne(o,t,e=!1,r=!0){return n.tidy(()=>{let a=n.relu(e?n.add(n.conv2d(o,t.conv0.filters,r?[2,2]:[1,1],"same"),t.conv0.bias):W(o,t.conv0,r?[2,2]:[1,1])),s=W(a,t.conv1,[1,1]),i=n.relu(n.add(a,s)),c=W(i,t.conv2,[1,1]),m=n.relu(n.add(a,n.add(s,c))),p=W(m,t.conv3,[1,1]);return n.relu(n.add(a,n.add(s,n.add(c,p))))})}function _t(o,t,e="same",r=!1){return n.tidy(()=>{let a=n.add(n.conv2d(o,t.filters,[1,1],e),t.bias);return r?n.relu(a):a})}function L(o,t){Object.keys(o).forEach(e=>{t.some(r=>r.originalPath===e)||o[e].dispose()})}function $t(o,t){return(e,r,a,s)=>{let i=n.tensor4d(o(e*r*a*a),[a,a,e,r]),c=n.tensor1d(o(r));return t.push({paramPath:`${s}/filters`},{paramPath:`${s}/bias`}),{filters:i,bias:c}}}function ve(o,t){return(e,r,a)=>{let s=n.tensor2d(o(e*r),[e,r]),i=n.tensor1d(o(r));return t.push({paramPath:`${a}/weights`},{paramPath:`${a}/bias`}),{weights:s,bias:i}}}var ae=class{constructor(t,e,r){this.depthwise_filter=t;this.pointwise_filter=e;this.bias=r}};function Ot(o,t){return(e,r,a)=>{let s=n.tensor4d(o(9*e),[3,3,e,1]),i=n.tensor4d(o(e*r),[1,1,e,r]),c=n.tensor1d(o(r));return t.push({paramPath:`${a}/depthwise_filter`},{paramPath:`${a}/pointwise_filter`},{paramPath:`${a}/bias`}),new ae(s,i,c)}}function Ht(o){return t=>{let e=o(`${t}/depthwise_filter`,4),r=o(`${t}/pointwise_filter`,4),a=o(`${t}/bias`,1);return new ae(e,r,a)}}function B(o,t){return(e,r,a)=>{let s=o[e];if(!xt(s,r))throw new Error(`expected weightMap[${e}] to be a Tensor${r}D, instead have ${s}`);return t.push({originalPath:e,paramPath:a||e}),s}}function A(o){let t=o;function e(a){let s=t.slice(0,a);return t=t.slice(a),s}function r(){return t}return{extractWeights:e,getRemainingWeights:r}}function ye(o,t){let e=$t(o,t),r=Ot(o,t);function a(i,c,m,p=!1){let u=p?e(i,c,3,`${m}/conv0`):r(i,c,`${m}/conv0`),f=r(c,c,`${m}/conv1`),l=r(c,c,`${m}/conv2`);return{conv0:u,conv1:f,conv2:l}}function s(i,c,m,p=!1){let{conv0:u,conv1:f,conv2:l}=a(i,c,m,p),d=r(c,c,`${m}/conv3`);return{conv0:u,conv1:f,conv2:l,conv3:d}}return{extractDenseBlock3Params:a,extractDenseBlock4Params:s}}function Mr(o){let t=[],{extractWeights:e,getRemainingWeights:r}=A(o),{extractDenseBlock4Params:a}=ye(e,t),s=a(3,32,"dense0",!0),i=a(32,64,"dense1"),c=a(64,128,"dense2"),m=a(128,256,"dense3");if(r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{paramMappings:t,params:{dense0:s,dense1:i,dense2:c,dense3:m}}}function _e(o){return t=>{let e=o(`${t}/filters`,4),r=o(`${t}/bias`,1);return{filters:e,bias:r}}}function Te(o,t){let e=B(o,t),r=_e(e),a=Ht(e);function s(c,m=!1){let p=m?r(`${c}/conv0`):a(`${c}/conv0`),u=a(`${c}/conv1`),f=a(`${c}/conv2`);return{conv0:p,conv1:u,conv2:f}}function i(c,m=!1){let p=m?r(`${c}/conv0`):a(`${c}/conv0`),u=a(`${c}/conv1`),f=a(`${c}/conv2`),l=a(`${c}/conv3`);return{conv0:p,conv1:u,conv2:f,conv3:l}}return{extractDenseBlock3Params:s,extractDenseBlock4Params:i}}function Cr(o){let t=[],{extractDenseBlock4Params:e}=Te(o,t),r={dense0:e("dense0",!0),dense1:e("dense1"),dense2:e("dense2"),dense3:e("dense3")};return L(o,t),{params:r,paramMappings:t}}var zt=class extends I{constructor(){super("FaceFeatureExtractor")}forwardInput(t){let{params:e}=this;if(!e)throw new Error("FaceFeatureExtractor - load model before inference");return n.tidy(()=>{let r=n.cast(t.toBatchTensor(112,!0),"float32"),s=X(r,[122.782,117.001,104.298]).div(255),i=ne(s,e.dense0,!0);return i=ne(i,e.dense1),i=ne(i,e.dense2),i=ne(i,e.dense3),i=n.avgPool(i,[7,7],[2,2],"valid"),i})}async forward(t){return this.forwardInput(await M(t))}getDefaultModelName(){return"face_feature_extractor_model"}extractParamsFromWeightMap(t){return Cr(t)}extractParams(t){return Mr(t)}};function se(o,t){return n.tidy(()=>n.add(n.matMul(o,t.weights),t.bias))}function Ir(o,t,e){let r=[],{extractWeights:a,getRemainingWeights:s}=A(o),c=ve(a,r)(t,e,"fc");if(s().length!==0)throw new Error(`weights remaing after extract: ${s().length}`);return{paramMappings:r,params:{fc:c}}}function Nr(o){let t=[],e=B(o,t);function r(s){let i=e(`${s}/weights`,2),c=e(`${s}/bias`,1);return{weights:i,bias:c}}let a={fc:r("fc")};return L(o,t),{params:a,paramMappings:t}}function Pe(o){let t={},e={};return Object.keys(o).forEach(r=>{let a=r.startsWith("fc")?e:t;a[r]=o[r]}),{featureExtractorMap:t,classifierMap:e}}var Vt=class extends I{constructor(e,r){super(e);this._faceFeatureExtractor=r}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(e){let{params:r}=this;if(!r)throw new Error(`${this._name} - load model before inference`);return n.tidy(()=>{let a=e instanceof rt?this.faceFeatureExtractor.forwardInput(e):e;return se(a.as2D(a.shape[0],-1),r.fc)})}dispose(e=!0){this.faceFeatureExtractor.dispose(e),super.dispose(e)}loadClassifierParams(e){let{params:r,paramMappings:a}=this.extractClassifierParams(e);this._params=r,this._paramMappings=a}extractClassifierParams(e){return Ir(e,this.getClassifierChannelsIn(),this.getClassifierChannelsOut())}extractParamsFromWeightMap(e){let{featureExtractorMap:r,classifierMap:a}=Pe(e);return this.faceFeatureExtractor.loadFromWeightMap(r),Nr(a)}extractParams(e){let r=this.getClassifierChannelsIn(),a=this.getClassifierChannelsOut(),s=a*r+a,i=e.slice(0,e.length-s),c=e.slice(e.length-s);return this.faceFeatureExtractor.extractWeights(i),this.extractClassifierParams(c)}};var Sr=["neutral","happy","sad","angry","fearful","disgusted","surprised"],pt=class{constructor(t){this.neutral=0;this.happy=0;this.sad=0;this.angry=0;this.fearful=0;this.disgusted=0;this.surprised=0;if(t.length!==7)throw new Error(`FaceExpressions.constructor - expected probabilities.length to be 7, have: ${t.length}`);Sr.forEach((e,r)=>{this[e]=t[r]})}asSortedArray(){return Sr.map(t=>({expression:t,probability:this[t]})).sort((t,e)=>e.probability-t.probability)}};var we=class extends Vt{constructor(t=new zt){super("FaceExpressionNet",t)}forwardInput(t){return n.tidy(()=>n.softmax(this.runNet(t)))}async forward(t){return this.forwardInput(await M(t))}async predictExpressions(t){let e=await M(t),r=await this.forwardInput(e),a=await Promise.all(n.unstack(r).map(async i=>{let c=i.dataSync();return i.dispose(),c}));r.dispose();let s=a.map(i=>new pt(i));return e.isBatchInput?s:s[0]}getDefaultModelName(){return"face_expression_model"}getClassifierChannelsIn(){return 256}getClassifierChannelsOut(){return 7}};function Lr(o){return o.expressions instanceof pt}function tr(o,t){return{...o,...{expressions:t}}}function Wo(o,t,e=.1,r){(Array.isArray(t)?t:[t]).forEach(s=>{let i=s instanceof pt?s:Lr(s)?s.expressions:void 0;if(!i)throw new Error("drawFaceExpressions - expected faceExpressions to be FaceExpressions | WithFaceExpressions<{}> or array thereof");let m=i.asSortedArray().filter(f=>f.probability>e),p=tt(s)?s.detection.box.bottomLeft:r||new b(0,0);new et(m.map(f=>`${f.expression} (${vt(f.probability)})`),p).draw(o)})}function Yt(o){return tt(o)&&o.landmarks instanceof $&&o.unshiftedLandmarks instanceof $&&o.alignedRect instanceof E}function ko(o){let t=(c,m,p,u)=>Math.atan2(u-m,p-c)%Math.PI,e=c=>c*180/Math.PI,r={roll:void 0,pitch:void 0,yaw:void 0};if(!o||!o._positions||o._positions.length!==68)return r;let a=o._positions;r.roll=-t(a[36]._x,a[36]._y,a[45]._x,a[45]._y),r.pitch=t(0,Math.abs(a[0]._x-a[30]._x)/a[30]._x,Math.PI,Math.abs(a[16]._x-a[30]._x)/a[30]._x);let s=a.reduce((c,m)=>cc>m._y?c:m._y,-1/0);return r.yaw=Math.PI*(o._imgDims._height/(i-s)/1.4-1),r}function ie(o,t){let{box:e}=o.detection,r=t.shiftBy(e.x,e.y),a=r.align(),{imageDims:s}=o.detection,i=new E(o.detection.score,a.rescale(s.reverse()),s),c=ko(t);return{...o,...{landmarks:r,unshiftedLandmarks:t,alignedRect:i,angle:c}}}var Fe=class{constructor(t={}){let{drawLines:e=!0,drawPoints:r=!0,lineWidth:a,lineColor:s,pointSize:i,pointColor:c}=t;this.drawLines=e,this.drawPoints=r,this.lineWidth=a||1,this.pointSize=i||2,this.lineColor=s||"rgba(0, 255, 255, 1)",this.pointColor=c||"rgba(255, 0, 255, 1)"}},De=class{constructor(t,e={}){this.faceLandmarks=t,this.options=new Fe(e)}draw(t){let e=k(t),{drawLines:r,drawPoints:a,lineWidth:s,lineColor:i,pointSize:c,pointColor:m}=this.options;if(r&&this.faceLandmarks instanceof Lt&&(e.strokeStyle=i,e.lineWidth=s,Z(e,this.faceLandmarks.getJawOutline()),Z(e,this.faceLandmarks.getLeftEyeBrow()),Z(e,this.faceLandmarks.getRightEyeBrow()),Z(e,this.faceLandmarks.getNose()),Z(e,this.faceLandmarks.getLeftEye(),!0),Z(e,this.faceLandmarks.getRightEye(),!0),Z(e,this.faceLandmarks.getMouth(),!0)),a){e.strokeStyle=m,e.fillStyle=m;let p=u=>{e.beginPath(),e.arc(u.x,u.y,c,0,2*Math.PI),e.fill()};this.faceLandmarks.positions.forEach(p)}}};function Bo(o,t){(Array.isArray(t)?t:[t]).forEach(r=>{let a=r instanceof $?r:Yt(r)?r.landmarks:void 0;if(!a)throw new Error("drawFaceLandmarks - expected faceExpressions to be FaceLandmarks | WithFaceLandmarks> or array thereof");new De(a).draw(o)})}var Wr="1.7.2";function Oo(o,t){let e=$t(o,t),r=Ot(o,t);function a(i,c,m){let p=r(i,c,`${m}/separable_conv0`),u=r(c,c,`${m}/separable_conv1`),f=e(i,c,1,`${m}/expansion_conv`);return{separable_conv0:p,separable_conv1:u,expansion_conv:f}}function s(i,c){let m=r(i,i,`${c}/separable_conv0`),p=r(i,i,`${c}/separable_conv1`),u=r(i,i,`${c}/separable_conv2`);return{separable_conv0:m,separable_conv1:p,separable_conv2:u}}return{extractConvParams:e,extractSeparableConvParams:r,extractReductionBlockParams:a,extractMainBlockParams:s}}function kr(o,t){let e=[],{extractWeights:r,getRemainingWeights:a}=A(o),{extractConvParams:s,extractSeparableConvParams:i,extractReductionBlockParams:c,extractMainBlockParams:m}=Oo(r,e),p=s(3,32,3,"entry_flow/conv_in"),u=c(32,64,"entry_flow/reduction_block_0"),f=c(64,128,"entry_flow/reduction_block_1"),l={conv_in:p,reduction_block_0:u,reduction_block_1:f},d={};U(t,0,1).forEach(h=>{d[`main_block_${h}`]=m(128,`middle_flow/main_block_${h}`)});let g=c(128,256,"exit_flow/reduction_block"),_=i(256,512,"exit_flow/separable_conv"),F={reduction_block:g,separable_conv:_};if(a().length!==0)throw new Error(`weights remaing after extract: ${a().length}`);return{paramMappings:e,params:{entry_flow:l,middle_flow:d,exit_flow:F}}}function Ho(o,t){let e=B(o,t),r=_e(e),a=Ht(e);function s(c){let m=a(`${c}/separable_conv0`),p=a(`${c}/separable_conv1`),u=r(`${c}/expansion_conv`);return{separable_conv0:m,separable_conv1:p,expansion_conv:u}}function i(c){let m=a(`${c}/separable_conv0`),p=a(`${c}/separable_conv1`),u=a(`${c}/separable_conv2`);return{separable_conv0:m,separable_conv1:p,separable_conv2:u}}return{extractConvParams:r,extractSeparableConvParams:a,extractReductionBlockParams:s,extractMainBlockParams:i}}function Br(o,t){let e=[],{extractConvParams:r,extractSeparableConvParams:a,extractReductionBlockParams:s,extractMainBlockParams:i}=Ho(o,e),c=r("entry_flow/conv_in"),m=s("entry_flow/reduction_block_0"),p=s("entry_flow/reduction_block_1"),u={conv_in:c,reduction_block_0:m,reduction_block_1:p},f={};U(t,0,1).forEach(_=>{f[`main_block_${_}`]=i(`middle_flow/main_block_${_}`)});let l=s("exit_flow/reduction_block"),d=a("exit_flow/separable_conv"),g={reduction_block:l,separable_conv:d};return L(o,e),{params:{entry_flow:u,middle_flow:f,exit_flow:g},paramMappings:e}}function Rr(o,t,e){return n.add(n.conv2d(o,t.filters,e,"same"),t.bias)}function er(o,t,e=!0){let r=e?n.relu(o):o;return r=W(r,t.separable_conv0,[1,1]),r=W(n.relu(r),t.separable_conv1,[1,1]),r=n.maxPool(r,[3,3],[2,2],"same"),r=n.add(r,Rr(o,t.expansion_conv,[2,2])),r}function zo(o,t){let e=W(n.relu(o),t.separable_conv0,[1,1]);return e=W(n.relu(e),t.separable_conv1,[1,1]),e=W(n.relu(e),t.separable_conv2,[1,1]),e=n.add(e,o),e}var Ee=class extends I{constructor(e){super("TinyXception");this._numMainBlocks=e}forwardInput(e){let{params:r}=this;if(!r)throw new Error("TinyXception - load model before inference");return n.tidy(()=>{let a=n.cast(e.toBatchTensor(112,!0),"float32"),i=X(a,[122.782,117.001,104.298]).div(255),c=n.relu(Rr(i,r.entry_flow.conv_in,[2,2]));return c=er(c,r.entry_flow.reduction_block_0,!1),c=er(c,r.entry_flow.reduction_block_1),U(this._numMainBlocks,0,1).forEach(m=>{c=zo(c,r.middle_flow[`main_block_${m}`])}),c=er(c,r.exit_flow.reduction_block),c=n.relu(W(c,r.exit_flow.separable_conv,[1,1])),c})}async forward(e){return this.forwardInput(await M(e))}getDefaultModelName(){return"tiny_xception_model"}extractParamsFromWeightMap(e){return Br(e,this._numMainBlocks)}extractParams(e){return kr(e,this._numMainBlocks)}};function $r(o){let t=[],{extractWeights:e,getRemainingWeights:r}=A(o),a=ve(e,t),s=a(512,1,"fc/age"),i=a(512,2,"fc/gender");if(r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{paramMappings:t,params:{fc:{age:s,gender:i}}}}function Or(o){let t=[],e=B(o,t);function r(s){let i=e(`${s}/weights`,2),c=e(`${s}/bias`,1);return{weights:i,bias:c}}let a={fc:{age:r("fc/age"),gender:r("fc/gender")}};return L(o,t),{params:a,paramMappings:t}}var rr=(e=>(e.FEMALE="female",e.MALE="male",e))(rr||{});var Me=class extends I{constructor(e=new Ee(2)){super("AgeGenderNet");this._faceFeatureExtractor=e}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(e){let{params:r}=this;if(!r)throw new Error(`${this._name} - load model before inference`);return n.tidy(()=>{let a=e instanceof rt?this.faceFeatureExtractor.forwardInput(e):e,s=n.avgPool(a,[7,7],[2,2],"valid").as2D(a.shape[0],-1),i=se(s,r.fc.age).as1D(),c=se(s,r.fc.gender);return{age:i,gender:c}})}forwardInput(e){return n.tidy(()=>{let{age:r,gender:a}=this.runNet(e);return{age:r,gender:n.softmax(a)}})}async forward(e){return this.forwardInput(await M(e))}async predictAgeAndGender(e){let r=await M(e),a=await this.forwardInput(r),s=n.unstack(a.age),i=n.unstack(a.gender),c=s.map((p,u)=>({ageTensor:p,genderTensor:i[u]})),m=await Promise.all(c.map(async({ageTensor:p,genderTensor:u})=>{let f=p.dataSync()[0],l=u.dataSync()[0],d=l>.5,g=d?"male":"female",_=d?l:1-l;return p.dispose(),u.dispose(),{age:f,gender:g,genderProbability:_}}));return a.age.dispose(),a.gender.dispose(),r.isBatchInput?m:m[0]}getDefaultModelName(){return"age_gender_model"}dispose(e=!0){this.faceFeatureExtractor.dispose(e),super.dispose(e)}loadClassifierParams(e){let{params:r,paramMappings:a}=this.extractClassifierParams(e);this._params=r,this._paramMappings=a}extractClassifierParams(e){return $r(e)}extractParamsFromWeightMap(e){let{featureExtractorMap:r,classifierMap:a}=Pe(e);return this.faceFeatureExtractor.loadFromWeightMap(r),Or(a)}extractParams(e){let a=e.slice(0,e.length-1539),s=e.slice(e.length-1539);return this.faceFeatureExtractor.extractWeights(a),this.extractClassifierParams(s)}};var Gt=class extends Vt{postProcess(t,e,r){let a=r.map(({width:i,height:c})=>{let m=e/Math.max(c,i);return{width:i*m,height:c*m}}),s=a.length;return n.tidy(()=>{let i=(f,l)=>n.stack([n.fill([68],f,"float32"),n.fill([68],l,"float32")],1).as2D(1,136).as1D(),c=(f,l)=>{let{width:d,height:g}=a[f];return l(d,g)?Math.abs(d-g)/2:0},m=f=>c(f,(l,d)=>lc(f,(l,d)=>di(m(l),p(l))))).div(n.stack(Array.from(Array(s),(f,l)=>i(a[l].width,a[l].height))))})}forwardInput(t){return n.tidy(()=>{let e=this.runNet(t);return this.postProcess(e,t.inputSize,t.inputDimensions.map(([r,a])=>({height:r,width:a})))})}async forward(t){return this.forwardInput(await M(t))}async detectLandmarks(t){let e=await M(t),r=n.tidy(()=>n.unstack(this.forwardInput(e))),a=await Promise.all(r.map(async(s,i)=>{let c=Array.from(s.dataSync()),m=c.filter((u,f)=>pe(f)),p=c.filter((u,f)=>!pe(f));return new Lt(Array(68).fill(0).map((u,f)=>new b(m[f],p[f])),{height:e.getInputHeight(i),width:e.getInputWidth(i)})}));return r.forEach(s=>s.dispose()),e.isBatchInput?a:a[0]}getClassifierChannelsOut(){return 136}};var jt=class extends Gt{constructor(t=new zt){super("FaceLandmark68Net",t)}getDefaultModelName(){return"face_landmark_68_model"}getClassifierChannelsIn(){return 256}};function Hr(o){let t=[],{extractDenseBlock3Params:e}=Te(o,t),r={dense0:e("dense0",!0),dense1:e("dense1"),dense2:e("dense2")};return L(o,t),{params:r,paramMappings:t}}function zr(o){let t=[],{extractWeights:e,getRemainingWeights:r}=A(o),{extractDenseBlock3Params:a}=ye(e,t),s=a(3,32,"dense0",!0),i=a(32,64,"dense1"),c=a(64,128,"dense2");if(r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{paramMappings:t,params:{dense0:s,dense1:i,dense2:c}}}var Ce=class extends I{constructor(){super("TinyFaceFeatureExtractor")}forwardInput(t){let{params:e}=this;if(!e)throw new Error("TinyFaceFeatureExtractor - load model before inference");return n.tidy(()=>{let r=n.cast(t.toBatchTensor(112,!0),"float32"),s=X(r,[122.782,117.001,104.298]).div(255),i=xe(s,e.dense0,!0);return i=xe(i,e.dense1),i=xe(i,e.dense2),i=n.avgPool(i,[14,14],[2,2],"valid"),i})}async forward(t){return this.forwardInput(await M(t))}getDefaultModelName(){return"face_feature_extractor_tiny_model"}extractParamsFromWeightMap(t){return Hr(t)}extractParams(t){return zr(t)}};var Ie=class extends Gt{constructor(t=new Ce){super("FaceLandmark68TinyNet",t)}getDefaultModelName(){return"face_landmark_68_tiny_model"}getClassifierChannelsIn(){return 128}};var Vr=class extends jt{};function Yr(o,t){return n.add(n.mul(o,t.weights),t.biases)}function or(o,t,e,r,a="same"){let{filters:s,bias:i}=t.conv,c=n.conv2d(o,s,e,a);return c=n.add(c,i),c=Yr(c,t.scale),r?n.relu(c):c}function Gr(o,t){return or(o,t,[1,1],!0)}function nr(o,t){return or(o,t,[1,1],!1)}function Ne(o,t){return or(o,t,[2,2],!0,"valid")}function Vo(o,t){function e(c,m,p){let u=o(c),f=u.length/(m*p*p);if(Ge(f))throw new Error(`depth has to be an integer: ${f}, weights.length: ${u.length}, numFilters: ${m}, filterSize: ${p}`);return n.tidy(()=>n.transpose(n.tensor4d(u,[m,f,p,p]),[2,3,1,0]))}function r(c,m,p,u){let f=e(c,m,p),l=n.tensor1d(o(m));return t.push({paramPath:`${u}/filters`},{paramPath:`${u}/bias`}),{filters:f,bias:l}}function a(c,m){let p=n.tensor1d(o(c)),u=n.tensor1d(o(c));return t.push({paramPath:`${m}/weights`},{paramPath:`${m}/biases`}),{weights:p,biases:u}}function s(c,m,p,u){let f=r(c,m,p,`${u}/conv`),l=a(m,`${u}/scale`);return{conv:f,scale:l}}function i(c,m,p,u,f=!1){let l=s((f?.5:1)*c,m,p,`${u}/conv1`),d=s(c,m,p,`${u}/conv2`);return{conv1:l,conv2:d}}return{extractConvLayerParams:s,extractResidualLayerParams:i}}function jr(o){let{extractWeights:t,getRemainingWeights:e}=A(o),r=[],{extractConvLayerParams:a,extractResidualLayerParams:s}=Vo(t,r),i=a(4704,32,7,"conv32_down"),c=s(9216,32,3,"conv32_1"),m=s(9216,32,3,"conv32_2"),p=s(9216,32,3,"conv32_3"),u=s(36864,64,3,"conv64_down",!0),f=s(36864,64,3,"conv64_1"),l=s(36864,64,3,"conv64_2"),d=s(36864,64,3,"conv64_3"),g=s(147456,128,3,"conv128_down",!0),_=s(147456,128,3,"conv128_1"),F=s(147456,128,3,"conv128_2"),h=s(589824,256,3,"conv256_down",!0),y=s(589824,256,3,"conv256_1"),x=s(589824,256,3,"conv256_2"),D=s(589824,256,3,"conv256_down_out"),N=n.tidy(()=>n.transpose(n.tensor2d(t(256*128),[128,256]),[1,0]));if(r.push({paramPath:"fc"}),e().length!==0)throw new Error(`weights remaing after extract: ${e().length}`);return{params:{conv32_down:i,conv32_1:c,conv32_2:m,conv32_3:p,conv64_down:u,conv64_1:f,conv64_2:l,conv64_3:d,conv128_down:g,conv128_1:_,conv128_2:F,conv256_down:h,conv256_1:y,conv256_2:x,conv256_down_out:D,fc:N},paramMappings:r}}function Yo(o,t){let e=B(o,t);function r(i){let c=e(`${i}/scale/weights`,1),m=e(`${i}/scale/biases`,1);return{weights:c,biases:m}}function a(i){let c=e(`${i}/conv/filters`,4),m=e(`${i}/conv/bias`,1),p=r(i);return{conv:{filters:c,bias:m},scale:p}}function s(i){return{conv1:a(`${i}/conv1`),conv2:a(`${i}/conv2`)}}return{extractConvLayerParams:a,extractResidualLayerParams:s}}function Ur(o){let t=[],{extractConvLayerParams:e,extractResidualLayerParams:r}=Yo(o,t),a=e("conv32_down"),s=r("conv32_1"),i=r("conv32_2"),c=r("conv32_3"),m=r("conv64_down"),p=r("conv64_1"),u=r("conv64_2"),f=r("conv64_3"),l=r("conv128_down"),d=r("conv128_1"),g=r("conv128_2"),_=r("conv256_down"),F=r("conv256_1"),h=r("conv256_2"),y=r("conv256_down_out"),{fc:x}=o;if(t.push({originalPath:"fc",paramPath:"fc"}),!Ye(x))throw new Error(`expected weightMap[fc] to be a Tensor2D, instead have ${x}`);let D={conv32_down:a,conv32_1:s,conv32_2:i,conv32_3:c,conv64_down:m,conv64_1:p,conv64_2:u,conv64_3:f,conv128_down:l,conv128_1:d,conv128_2:g,conv256_down:_,conv256_1:F,conv256_2:h,conv256_down_out:y,fc:x};return L(o,t),{params:D,paramMappings:t}}function j(o,t){let e=Gr(o,t.conv1);return e=nr(e,t.conv2),e=n.add(e,o),e=n.relu(e),e}function ce(o,t){let e=Ne(o,t.conv1);e=nr(e,t.conv2);let r=n.avgPool(o,2,2,"valid"),a=n.zeros(r.shape),s=r.shape[3]!==e.shape[3];if(r.shape[1]!==e.shape[1]||r.shape[2]!==e.shape[2]){let c=[...e.shape];c[1]=1;let m=n.zeros(c);e=n.concat([e,m],1);let p=[...e.shape];p[2]=1;let u=n.zeros(p);e=n.concat([e,u],2)}return r=s?n.concat([r,a],3):r,e=n.add(r,e),e=n.relu(e),e}var Ut=class extends I{constructor(){super("FaceRecognitionNet")}forwardInput(t){let{params:e}=this;if(!e)throw new Error("FaceRecognitionNet - load model before inference");return n.tidy(()=>{let r=n.cast(t.toBatchTensor(150,!0),"float32"),s=X(r,[122.782,117.001,104.298]).div(255),i=Ne(s,e.conv32_down);i=n.maxPool(i,3,2,"valid"),i=j(i,e.conv32_1),i=j(i,e.conv32_2),i=j(i,e.conv32_3),i=ce(i,e.conv64_down),i=j(i,e.conv64_1),i=j(i,e.conv64_2),i=j(i,e.conv64_3),i=ce(i,e.conv128_down),i=j(i,e.conv128_1),i=j(i,e.conv128_2),i=ce(i,e.conv256_down),i=j(i,e.conv256_1),i=j(i,e.conv256_2),i=ce(i,e.conv256_down_out);let c=i.mean([1,2]);return n.matMul(c,e.fc)})}async forward(t){return this.forwardInput(await M(t))}async computeFaceDescriptor(t){var s;if((s=t==null?void 0:t.shape)!=null&&s.some(i=>i<=0))return new Float32Array(128);let e=await M(t),r=n.tidy(()=>n.unstack(this.forwardInput(e))),a=await Promise.all(r.map(i=>i.data()));return r.forEach(i=>i.dispose()),e.isBatchInput?a:a[0]}getDefaultModelName(){return"face_recognition_model"}extractParamsFromWeightMap(t){return Ur(t)}extractParams(t){return jr(t)}};function vf(o){let t=new Ut;return t.extractWeights(o),t}function ar(o,t){return{...o,...{descriptor:t}}}function Pf(o){return typeof o.age=="number"}function sr(o,t){return{...o,...{age:t}}}function Ef(o){return(o.gender==="male"||o.gender==="female")&&It(o.genderProbability)}function ir(o,t,e){return{...o,...{gender:t,genderProbability:e}}}function Go(o,t){function e(m,p){let u=n.tensor4d(o(9*m),[3,3,m,1]),f=n.tensor1d(o(m)),l=n.tensor1d(o(m)),d=n.tensor1d(o(m)),g=n.tensor1d(o(m));return t.push({paramPath:`${p}/filters`},{paramPath:`${p}/batch_norm_scale`},{paramPath:`${p}/batch_norm_offset`},{paramPath:`${p}/batch_norm_mean`},{paramPath:`${p}/batch_norm_variance`}),{filters:u,batch_norm_scale:f,batch_norm_offset:l,batch_norm_mean:d,batch_norm_variance:g}}function r(m,p,u,f,l){let d=n.tensor4d(o(m*p*u*u),[u,u,m,p]),g=n.tensor1d(o(p));return t.push({paramPath:`${f}/filters`},{paramPath:`${f}/${l?"batch_norm_offset":"bias"}`}),{filters:d,bias:g}}function a(m,p,u,f){let{filters:l,bias:d}=r(m,p,u,f,!0);return{filters:l,batch_norm_offset:d}}function s(m,p,u){let f=e(m,`${u}/depthwise_conv`),l=a(m,p,1,`${u}/pointwise_conv`);return{depthwise_conv:f,pointwise_conv:l}}function i(){let m=a(3,32,3,"mobilenetv1/conv_0"),p=s(32,64,"mobilenetv1/conv_1"),u=s(64,128,"mobilenetv1/conv_2"),f=s(128,128,"mobilenetv1/conv_3"),l=s(128,256,"mobilenetv1/conv_4"),d=s(256,256,"mobilenetv1/conv_5"),g=s(256,512,"mobilenetv1/conv_6"),_=s(512,512,"mobilenetv1/conv_7"),F=s(512,512,"mobilenetv1/conv_8"),h=s(512,512,"mobilenetv1/conv_9"),y=s(512,512,"mobilenetv1/conv_10"),x=s(512,512,"mobilenetv1/conv_11"),D=s(512,1024,"mobilenetv1/conv_12"),N=s(1024,1024,"mobilenetv1/conv_13");return{conv_0:m,conv_1:p,conv_2:u,conv_3:f,conv_4:l,conv_5:d,conv_6:g,conv_7:_,conv_8:F,conv_9:h,conv_10:y,conv_11:x,conv_12:D,conv_13:N}}function c(){let m=a(1024,256,1,"prediction_layer/conv_0"),p=a(256,512,3,"prediction_layer/conv_1"),u=a(512,128,1,"prediction_layer/conv_2"),f=a(128,256,3,"prediction_layer/conv_3"),l=a(256,128,1,"prediction_layer/conv_4"),d=a(128,256,3,"prediction_layer/conv_5"),g=a(256,64,1,"prediction_layer/conv_6"),_=a(64,128,3,"prediction_layer/conv_7"),F=r(512,12,1,"prediction_layer/box_predictor_0/box_encoding_predictor"),h=r(512,9,1,"prediction_layer/box_predictor_0/class_predictor"),y=r(1024,24,1,"prediction_layer/box_predictor_1/box_encoding_predictor"),x=r(1024,18,1,"prediction_layer/box_predictor_1/class_predictor"),D=r(512,24,1,"prediction_layer/box_predictor_2/box_encoding_predictor"),N=r(512,18,1,"prediction_layer/box_predictor_2/class_predictor"),Y=r(256,24,1,"prediction_layer/box_predictor_3/box_encoding_predictor"),q=r(256,18,1,"prediction_layer/box_predictor_3/class_predictor"),O=r(256,24,1,"prediction_layer/box_predictor_4/box_encoding_predictor"),at=r(256,18,1,"prediction_layer/box_predictor_4/class_predictor"),st=r(128,24,1,"prediction_layer/box_predictor_5/box_encoding_predictor"),it=r(128,18,1,"prediction_layer/box_predictor_5/class_predictor");return{conv_0:m,conv_1:p,conv_2:u,conv_3:f,conv_4:l,conv_5:d,conv_6:g,conv_7:_,box_predictor_0:{box_encoding_predictor:F,class_predictor:h},box_predictor_1:{box_encoding_predictor:y,class_predictor:x},box_predictor_2:{box_encoding_predictor:D,class_predictor:N},box_predictor_3:{box_encoding_predictor:Y,class_predictor:q},box_predictor_4:{box_encoding_predictor:O,class_predictor:at},box_predictor_5:{box_encoding_predictor:st,class_predictor:it}}}return{extractMobilenetV1Params:i,extractPredictionLayerParams:c}}function Xr(o){let t=[],{extractWeights:e,getRemainingWeights:r}=A(o),{extractMobilenetV1Params:a,extractPredictionLayerParams:s}=Go(e,t),i=a(),c=s(),p={extra_dim:n.tensor3d(e(5118*4),[1,5118,4])};if(t.push({paramPath:"output_layer/extra_dim"}),r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{params:{mobilenetv1:i,prediction_layer:c,output_layer:p},paramMappings:t}}function jo(o,t){let e=B(o,t);function r(p,u,f){let l=e(`${p}/Conv2d_${u}_pointwise/weights`,4,`${f}/filters`),d=e(`${p}/Conv2d_${u}_pointwise/convolution_bn_offset`,1,`${f}/batch_norm_offset`);return{filters:l,batch_norm_offset:d}}function a(p){let u=`mobilenetv1/conv_${p}`,f=`MobilenetV1/Conv2d_${p}_depthwise`,l=`${u}/depthwise_conv`,d=`${u}/pointwise_conv`,g=e(`${f}/depthwise_weights`,4,`${l}/filters`),_=e(`${f}/BatchNorm/gamma`,1,`${l}/batch_norm_scale`),F=e(`${f}/BatchNorm/beta`,1,`${l}/batch_norm_offset`),h=e(`${f}/BatchNorm/moving_mean`,1,`${l}/batch_norm_mean`),y=e(`${f}/BatchNorm/moving_variance`,1,`${l}/batch_norm_variance`);return{depthwise_conv:{filters:g,batch_norm_scale:_,batch_norm_offset:F,batch_norm_mean:h,batch_norm_variance:y},pointwise_conv:r("MobilenetV1",p,d)}}function s(){return{conv_0:r("MobilenetV1",0,"mobilenetv1/conv_0"),conv_1:a(1),conv_2:a(2),conv_3:a(3),conv_4:a(4),conv_5:a(5),conv_6:a(6),conv_7:a(7),conv_8:a(8),conv_9:a(9),conv_10:a(10),conv_11:a(11),conv_12:a(12),conv_13:a(13)}}function i(p,u){let f=e(`${p}/weights`,4,`${u}/filters`),l=e(`${p}/biases`,1,`${u}/bias`);return{filters:f,bias:l}}function c(p){let u=i(`Prediction/BoxPredictor_${p}/BoxEncodingPredictor`,`prediction_layer/box_predictor_${p}/box_encoding_predictor`),f=i(`Prediction/BoxPredictor_${p}/ClassPredictor`,`prediction_layer/box_predictor_${p}/class_predictor`);return{box_encoding_predictor:u,class_predictor:f}}function m(){return{conv_0:r("Prediction",0,"prediction_layer/conv_0"),conv_1:r("Prediction",1,"prediction_layer/conv_1"),conv_2:r("Prediction",2,"prediction_layer/conv_2"),conv_3:r("Prediction",3,"prediction_layer/conv_3"),conv_4:r("Prediction",4,"prediction_layer/conv_4"),conv_5:r("Prediction",5,"prediction_layer/conv_5"),conv_6:r("Prediction",6,"prediction_layer/conv_6"),conv_7:r("Prediction",7,"prediction_layer/conv_7"),box_predictor_0:c(0),box_predictor_1:c(1),box_predictor_2:c(2),box_predictor_3:c(3),box_predictor_4:c(4),box_predictor_5:c(5)}}return{extractMobilenetV1Params:s,extractPredictionLayerParams:m}}function Jr(o){let t=[],{extractMobilenetV1Params:e,extractPredictionLayerParams:r}=jo(o,t),a=o["Output/extra_dim"];if(t.push({originalPath:"Output/extra_dim",paramPath:"output_layer/extra_dim"}),!K(a))throw new Error(`expected weightMap['Output/extra_dim'] to be a Tensor3D, instead have ${a}`);let s={mobilenetv1:e(),prediction_layer:r(),output_layer:{extra_dim:a}};return L(o,t),{params:s,paramMappings:t}}function H(o,t,e){return n.tidy(()=>{let r=n.conv2d(o,t.filters,e,"same");return r=n.add(r,t.batch_norm_offset),n.clipByValue(r,0,6)})}var Uo=.0010000000474974513;function Xo(o,t,e){return n.tidy(()=>{let r=n.depthwiseConv2d(o,t.filters,e,"same");return r=n.batchNorm(r,t.batch_norm_mean,t.batch_norm_variance,t.batch_norm_offset,t.batch_norm_scale,Uo),n.clipByValue(r,0,6)})}function Jo(o){return[2,4,6,12].some(t=>t===o)?[2,2]:[1,1]}function qr(o,t){return n.tidy(()=>{let e,r=H(o,t.conv_0,[2,2]);if([t.conv_1,t.conv_2,t.conv_3,t.conv_4,t.conv_5,t.conv_6,t.conv_7,t.conv_8,t.conv_9,t.conv_10,t.conv_11,t.conv_12,t.conv_13].forEach((s,i)=>{let c=i+1,m=Jo(c);r=Xo(r,s.depthwise_conv,m),r=H(r,s.pointwise_conv,[1,1]),c===11&&(e=r)}),e===null)throw new Error("mobileNetV1 - output of conv layer 11 is null");return{out:r,conv11:e}})}function qo(o,t,e){let r=o.arraySync(),a=Math.min(r[t][0],r[t][2]),s=Math.min(r[t][1],r[t][3]),i=Math.max(r[t][0],r[t][2]),c=Math.max(r[t][1],r[t][3]),m=Math.min(r[e][0],r[e][2]),p=Math.min(r[e][1],r[e][3]),u=Math.max(r[e][0],r[e][2]),f=Math.max(r[e][1],r[e][3]),l=(i-a)*(c-s),d=(u-m)*(f-p);if(l<=0||d<=0)return 0;let g=Math.max(a,m),_=Math.max(s,p),F=Math.min(i,u),h=Math.min(c,f),y=Math.max(F-g,0)*Math.max(h-_,0);return y/(l+d-y)}function Zr(o,t,e,r,a){let s=o.shape[0],i=Math.min(e,s),c=t.map((u,f)=>({score:u,boxIndex:f})).filter(u=>u.score>a).sort((u,f)=>f.score-u.score),m=u=>u<=r?1:0,p=[];return c.forEach(u=>{if(p.length>=i)return;let f=u.score;for(let l=p.length-1;l>=0;--l){let d=qo(o,u.boxIndex,p[l]);if(d!==0&&(u.score*=m(d),u.score<=a))break}f===u.score&&p.push(u.boxIndex)}),p}function Zo(o){let t=n.unstack(n.transpose(o,[1,0])),e=[n.sub(t[2],t[0]),n.sub(t[3],t[1])],r=[n.add(t[0],n.div(e[0],2)),n.add(t[1],n.div(e[1],2))];return{sizes:e,centers:r}}function Ko(o,t){let{sizes:e,centers:r}=Zo(o),a=n.unstack(n.transpose(t,[1,0])),s=n.div(n.mul(n.exp(n.div(a[2],5)),e[0]),2),i=n.add(n.mul(n.div(a[0],10),e[0]),r[0]),c=n.div(n.mul(n.exp(n.div(a[3],5)),e[1]),2),m=n.add(n.mul(n.div(a[1],10),e[1]),r[1]);return n.transpose(n.stack([n.sub(i,s),n.sub(m,c),n.add(i,s),n.add(m,c)]),[1,0])}function Kr(o,t,e){return n.tidy(()=>{let r=o.shape[0],a=Ko(n.reshape(n.tile(e.extra_dim,[r,1,1]),[-1,4]),n.reshape(o,[-1,4]));a=n.reshape(a,[r,a.shape[0]/r,4]);let s=n.sigmoid(n.slice(t,[0,0,1],[-1,-1,-1])),i=n.slice(s,[0,0,0],[-1,-1,1]);i=n.reshape(i,[r,i.shape[1]]);let c=n.unstack(a),m=n.unstack(i);return{boxes:c,scores:m}})}function Tt(o,t){return n.tidy(()=>{let e=o.shape[0],r=n.reshape(_t(o,t.box_encoding_predictor),[e,-1,1,4]),a=n.reshape(_t(o,t.class_predictor),[e,-1,3]);return{boxPredictionEncoding:r,classPrediction:a}})}function Qr(o,t,e){return n.tidy(()=>{let r=H(o,e.conv_0,[1,1]),a=H(r,e.conv_1,[2,2]),s=H(a,e.conv_2,[1,1]),i=H(s,e.conv_3,[2,2]),c=H(i,e.conv_4,[1,1]),m=H(c,e.conv_5,[2,2]),p=H(m,e.conv_6,[1,1]),u=H(p,e.conv_7,[2,2]),f=Tt(t,e.box_predictor_0),l=Tt(o,e.box_predictor_1),d=Tt(a,e.box_predictor_2),g=Tt(i,e.box_predictor_3),_=Tt(m,e.box_predictor_4),F=Tt(u,e.box_predictor_5),h=n.concat([f.boxPredictionEncoding,l.boxPredictionEncoding,d.boxPredictionEncoding,g.boxPredictionEncoding,_.boxPredictionEncoding,F.boxPredictionEncoding],1),y=n.concat([f.classPrediction,l.classPrediction,d.classPrediction,g.classPrediction,_.classPrediction,F.classPrediction],1);return{boxPredictions:h,classPredictions:y}})}var z=class{constructor({minConfidence:t,maxResults:e}={}){this._name="SsdMobilenetv1Options";if(this._minConfidence=t||.5,this._maxResults=e||100,typeof this._minConfidence!="number"||this._minConfidence<=0||this._minConfidence>=1)throw new Error(`${this._name} - expected minConfidence to be a number between 0 and 1`);if(typeof this._maxResults!="number")throw new Error(`${this._name} - expected maxResults to be a number`)}get minConfidence(){return this._minConfidence}get maxResults(){return this._maxResults}};var Pt=class extends I{constructor(){super("SsdMobilenetv1")}forwardInput(t){let{params:e}=this;if(!e)throw new Error("SsdMobilenetv1 - load model before inference");return n.tidy(()=>{let r=n.cast(t.toBatchTensor(512,!1),"float32"),a=n.sub(n.div(r,127.5),1),s=qr(a,e.mobilenetv1),{boxPredictions:i,classPredictions:c}=Qr(s.out,s.conv11,e.prediction_layer);return Kr(i,c,e.output_layer)})}async forward(t){return this.forwardInput(await M(t))}async locateFaces(t,e={}){let{maxResults:r,minConfidence:a}=new z(e),s=await M(t),{boxes:i,scores:c}=this.forwardInput(s),m=i[0],p=c[0];for(let x=1;x{let[D,N]=[Math.max(0,h[x][0]),Math.min(1,h[x][2])].map(O=>O*F),[Y,q]=[Math.max(0,h[x][1]),Math.min(1,h[x][3])].map(O=>O*_);return new E(u[x],new St(Y,D,q-Y,N-D),{height:s.getInputHeight(0),width:s.getInputWidth(0)})});return m.dispose(),p.dispose(),y}getDefaultModelName(){return"ssd_mobilenetv1_model"}extractParamsFromWeightMap(t){return Jr(t)}extractParams(t){return Xr(t)}};function Qo(o){let t=new Pt;return t.extractWeights(o),t}function vl(o){return Qo(o)}var to=class extends Pt{};var eo=.4,ro=[new b(.738768,.874946),new b(2.42204,2.65704),new b(4.30971,7.04493),new b(10.246,4.59428),new b(12.6868,11.8741)],oo=[new b(1.603231,2.094468),new b(6.041143,7.080126),new b(2.882459,3.518061),new b(4.266906,5.178857),new b(9.041765,10.66308)],no=[117.001,114.697,97.404],ao="tiny_yolov2_model",so="tiny_yolov2_separable_conv_model";var Se=o=>typeof o=="number";function io(o){if(!o)throw new Error(`invalid config: ${o}`);if(typeof o.withSeparableConvs!="boolean")throw new Error(`config.withSeparableConvs has to be a boolean, have: ${o.withSeparableConvs}`);if(!Se(o.iouThreshold)||o.iouThreshold<0||o.iouThreshold>1)throw new Error(`config.iouThreshold has to be a number between [0, 1], have: ${o.iouThreshold}`);if(!Array.isArray(o.classes)||!o.classes.length||!o.classes.every(t=>typeof t=="string"))throw new Error(`config.classes has to be an array class names: string[], have: ${JSON.stringify(o.classes)}`);if(!Array.isArray(o.anchors)||!o.anchors.length||!o.anchors.map(t=>t||{}).every(t=>Se(t.x)&&Se(t.y)))throw new Error(`config.anchors has to be an array of { x: number, y: number }, have: ${JSON.stringify(o.anchors)}`);if(o.meanRgb&&(!Array.isArray(o.meanRgb)||o.meanRgb.length!==3||!o.meanRgb.every(Se)))throw new Error(`config.meanRgb has to be an array of shape [number, number, number], have: ${JSON.stringify(o.meanRgb)}`)}function Xt(o){return n.tidy(()=>{let t=n.mul(o,n.scalar(.10000000149011612));return n.add(n.relu(n.sub(o,t)),t)})}function ot(o,t){return n.tidy(()=>{let e=n.pad(o,[[0,0],[1,1],[1,1],[0,0]]);return e=n.conv2d(e,t.conv.filters,[1,1],"valid"),e=n.sub(e,t.bn.sub),e=n.mul(e,t.bn.truediv),e=n.add(e,t.conv.bias),Xt(e)})}function nt(o,t){return n.tidy(()=>{let e=n.pad(o,[[0,0],[1,1],[1,1],[0,0]]);return e=n.separableConv2d(e,t.depthwise_filter,t.pointwise_filter,[1,1],"valid"),e=n.add(e,t.bias),Xt(e)})}function tn(o,t){let e=$t(o,t);function r(i,c){let m=n.tensor1d(o(i)),p=n.tensor1d(o(i));return t.push({paramPath:`${c}/sub`},{paramPath:`${c}/truediv`}),{sub:m,truediv:p}}function a(i,c,m){let p=e(i,c,3,`${m}/conv`),u=r(c,`${m}/bn`);return{conv:p,bn:u}}let s=Ot(o,t);return{extractConvParams:e,extractConvWithBatchNormParams:a,extractSeparableConvParams:s}}function co(o,t,e,r){let{extractWeights:a,getRemainingWeights:s}=A(o),i=[],{extractConvParams:c,extractConvWithBatchNormParams:m,extractSeparableConvParams:p}=tn(a,i),u;if(t.withSeparableConvs){let[f,l,d,g,_,F,h,y,x]=r,D=t.isFirstLayerConv2d?c(f,l,3,"conv0"):p(f,l,"conv0"),N=p(l,d,"conv1"),Y=p(d,g,"conv2"),q=p(g,_,"conv3"),O=p(_,F,"conv4"),at=p(F,h,"conv5"),st=y?p(h,y,"conv6"):void 0,it=x?p(y,x,"conv7"):void 0,gt=c(x||y||h,5*e,1,"conv8");u={conv0:D,conv1:N,conv2:Y,conv3:q,conv4:O,conv5:at,conv6:st,conv7:it,conv8:gt}}else{let[f,l,d,g,_,F,h,y,x]=r,D=m(f,l,"conv0"),N=m(l,d,"conv1"),Y=m(d,g,"conv2"),q=m(g,_,"conv3"),O=m(_,F,"conv4"),at=m(F,h,"conv5"),st=m(h,y,"conv6"),it=m(y,x,"conv7"),gt=c(x,5*e,1,"conv8");u={conv0:D,conv1:N,conv2:Y,conv3:q,conv4:O,conv5:at,conv6:st,conv7:it,conv8:gt}}if(s().length!==0)throw new Error(`weights remaing after extract: ${s().length}`);return{params:u,paramMappings:i}}function en(o,t){let e=B(o,t);function r(c){let m=e(`${c}/sub`,1),p=e(`${c}/truediv`,1);return{sub:m,truediv:p}}function a(c){let m=e(`${c}/filters`,4),p=e(`${c}/bias`,1);return{filters:m,bias:p}}function s(c){let m=a(`${c}/conv`),p=r(`${c}/bn`);return{conv:m,bn:p}}let i=Ht(e);return{extractConvParams:a,extractConvWithBatchNormParams:s,extractSeparableConvParams:i}}function mo(o,t){let e=[],{extractConvParams:r,extractConvWithBatchNormParams:a,extractSeparableConvParams:s}=en(o,e),i;if(t.withSeparableConvs){let c=t.filterSizes&&t.filterSizes.length||9;i={conv0:t.isFirstLayerConv2d?r("conv0"):s("conv0"),conv1:s("conv1"),conv2:s("conv2"),conv3:s("conv3"),conv4:s("conv4"),conv5:s("conv5"),conv6:c>7?s("conv6"):void 0,conv7:c>8?s("conv7"):void 0,conv8:r("conv8")}}else i={conv0:a("conv0"),conv1:a("conv1"),conv2:a("conv2"),conv3:a("conv3"),conv4:a("conv4"),conv5:a("conv5"),conv6:a("conv6"),conv7:a("conv7"),conv8:r("conv8")};return L(o,e),{params:i,paramMappings:e}}var J=class{constructor({inputSize:t,scoreThreshold:e}={}){this._name="TinyYolov2Options";if(this._inputSize=t||416,this._scoreThreshold=e||.5,typeof this._inputSize!="number"||this._inputSize%32!==0)throw new Error(`${this._name} - expected inputSize to be a number divisible by 32`);if(typeof this._scoreThreshold!="number"||this._scoreThreshold<=0||this._scoreThreshold>=1)throw new Error(`${this._name} - expected scoreThreshold to be a number between 0 and 1`)}get inputSize(){return this._inputSize}get scoreThreshold(){return this._scoreThreshold}};var cr=class extends I{constructor(e){super("TinyYolov2");io(e),this._config=e}get config(){return this._config}get withClassScores(){return this.config.withClassScores||this.config.classes.length>1}get boxEncodingSize(){return 5+(this.withClassScores?this.config.classes.length:0)}runTinyYolov2(e,r){let a=ot(e,r.conv0);return a=n.maxPool(a,[2,2],[2,2],"same"),a=ot(a,r.conv1),a=n.maxPool(a,[2,2],[2,2],"same"),a=ot(a,r.conv2),a=n.maxPool(a,[2,2],[2,2],"same"),a=ot(a,r.conv3),a=n.maxPool(a,[2,2],[2,2],"same"),a=ot(a,r.conv4),a=n.maxPool(a,[2,2],[2,2],"same"),a=ot(a,r.conv5),a=n.maxPool(a,[2,2],[1,1],"same"),a=ot(a,r.conv6),a=ot(a,r.conv7),_t(a,r.conv8,"valid",!1)}runMobilenet(e,r){let a=this.config.isFirstLayerConv2d?Xt(_t(e,r.conv0,"valid",!1)):nt(e,r.conv0);return a=n.maxPool(a,[2,2],[2,2],"same"),a=nt(a,r.conv1),a=n.maxPool(a,[2,2],[2,2],"same"),a=nt(a,r.conv2),a=n.maxPool(a,[2,2],[2,2],"same"),a=nt(a,r.conv3),a=n.maxPool(a,[2,2],[2,2],"same"),a=nt(a,r.conv4),a=n.maxPool(a,[2,2],[2,2],"same"),a=nt(a,r.conv5),a=n.maxPool(a,[2,2],[1,1],"same"),a=r.conv6?nt(a,r.conv6):a,a=r.conv7?nt(a,r.conv7):a,_t(a,r.conv8,"valid",!1)}forwardInput(e,r){let{params:a}=this;if(!a)throw new Error("TinyYolov2 - load model before inference");return n.tidy(()=>{let s=n.cast(e.toBatchTensor(r,!1),"float32");return s=this.config.meanRgb?X(s,this.config.meanRgb):s,s=s.div(255),this.config.withSeparableConvs?this.runMobilenet(s,a):this.runTinyYolov2(s,a)})}async forward(e,r){return this.forwardInput(await M(e),r)}async detect(e,r={}){let{inputSize:a,scoreThreshold:s}=new J(r),i=await M(e),c=await this.forwardInput(i,a),m=n.tidy(()=>n.unstack(c)[0].expandDims()),p={width:i.getInputWidth(0),height:i.getInputHeight(0)},u=await this.extractBoxes(m,i.getReshapedInputDimensions(0),s);c.dispose(),m.dispose();let f=u.map(h=>h.box),l=u.map(h=>h.score),d=u.map(h=>h.classScore),g=u.map(h=>this.config.classes[h.label]);return gr(f.map(h=>h.rescale(a)),l,this.config.iouThreshold,!0).map(h=>new ct(l[h],d[h],g[h],f[h],p))}getDefaultModelName(){return""}extractParamsFromWeightMap(e){return mo(e,this.config)}extractParams(e){let r=this.config.filterSizes||cr.DEFAULT_FILTER_SIZES,a=r?r.length:void 0;if(a!==7&&a!==8&&a!==9)throw new Error(`TinyYolov2 - expected 7 | 8 | 9 convolutional filters, but found ${a} filterSizes in config`);return co(e,this.config,this.boxEncodingSize,r)}async extractBoxes(e,r,a){let{width:s,height:i}=r,c=Math.max(s,i),m=c/s,p=c/i,u=e.shape[1],f=this.config.anchors.length,[l,d,g]=n.tidy(()=>{let y=e.reshape([u,u,f,this.boxEncodingSize]),x=y.slice([0,0,0,0],[u,u,f,4]),D=y.slice([0,0,0,4],[u,u,f,1]),N=this.withClassScores?n.softmax(y.slice([0,0,0,5],[u,u,f,this.config.classes.length]),3):n.scalar(0);return[x,D,N]}),_=[],F=await d.array(),h=await l.array();for(let y=0;ya){let Y=(x+fe(h[y][x][D][0]))/u*m,q=(y+fe(h[y][x][D][1]))/u*p,O=Math.exp(h[y][x][D][2])*this.config.anchors[D].x/u*m,at=Math.exp(h[y][x][D][3])*this.config.anchors[D].y/u*p,st=Y-O/2,it=q-at/2,gt={row:y,col:x,anchor:D},{classScore:pr,label:ur}=this.withClassScores?await this.extractPredictedClass(g,gt):{classScore:1,label:0};_.push({box:new Nt(st,it,st+O,it+at),score:N,classScore:N*pr,label:ur,...gt})}}return l.dispose(),d.dispose(),g.dispose(),_}async extractPredictedClass(e,r){let{row:a,col:s,anchor:i}=r,c=await e.array();return Array(this.config.classes.length).fill(0).map((m,p)=>c[a][s][i][p]).map((m,p)=>({classScore:m,label:p})).reduce((m,p)=>m.classScore>p.classScore?m:p)}},wt=cr;wt.DEFAULT_FILTER_SIZES=[3,16,32,64,128,256,512,1024,1024];var Jt=class extends wt{constructor(t=!0){let e={withSeparableConvs:t,iouThreshold:eo,classes:["face"],...t?{anchors:oo,meanRgb:no}:{anchors:ro,withClassScores:!0}};super(e)}get withSeparableConvs(){return this.config.withSeparableConvs}get anchors(){return this.config.anchors}async locateFaces(t,e){return(await this.detect(t,e)).map(a=>new E(a.score,a.relativeBox,{width:a.imageWidth,height:a.imageHeight}))}getDefaultModelName(){return this.withSeparableConvs?so:ao}extractParamsFromWeightMap(t){return super.extractParamsFromWeightMap(t)}};function pd(o,t=!0){let e=new Jt(t);return e.extractWeights(o),e}var Le=class extends J{constructor(){super(...arguments);this._name="TinyFaceDetectorOptions"}};var V=class{async then(t){return t(await this.run())}async run(){throw new Error("ComposableTask - run is not implemented")}};async function Ft(o,t,e,r,a=({alignedRect:s})=>s){let s=o.map(m=>Yt(m)?a(m):m.detection),i=r||(t instanceof n.Tensor?await oe(t,s):await re(t,s)),c=await e(i);return i.forEach(m=>m instanceof n.Tensor&&m.dispose()),c}async function qt(o,t,e,r,a){return Ft([o],t,async s=>e(s[0]),r,a)}var po=.4,uo=[new b(1.603231,2.094468),new b(6.041143,7.080126),new b(2.882459,3.518061),new b(4.266906,5.178857),new b(9.041765,10.66308)],fo=[117.001,114.697,97.404];var Zt=class extends wt{constructor(){let t={withSeparableConvs:!0,iouThreshold:po,classes:["face"],anchors:uo,meanRgb:fo,isFirstLayerConv2d:!0,filterSizes:[3,16,32,64,128,256,512]};super(t)}get anchors(){return this.config.anchors}async locateFaces(t,e){return(await this.detect(t,e)).map(a=>new E(a.score,a.relativeBox,{width:a.imageWidth,height:a.imageHeight}))}getDefaultModelName(){return"tiny_face_detector_model"}extractParamsFromWeightMap(t){return super.extractParamsFromWeightMap(t)}};var P={ssdMobilenetv1:new Pt,tinyFaceDetector:new Zt,tinyYolov2:new Jt,faceLandmark68Net:new jt,faceLandmark68TinyNet:new Ie,faceRecognitionNet:new Ut,faceExpressionNet:new we,ageGenderNet:new Me},rn=(o,t)=>P.ssdMobilenetv1.locateFaces(o,t),Od=(o,t)=>P.tinyFaceDetector.locateFaces(o,t),Hd=(o,t)=>P.tinyYolov2.locateFaces(o,t),on=o=>P.faceLandmark68Net.detectLandmarks(o),zd=o=>P.faceLandmark68TinyNet.detectLandmarks(o),Vd=o=>P.faceRecognitionNet.computeFaceDescriptor(o),Yd=o=>P.faceExpressionNet.predictExpressions(o),Gd=o=>P.ageGenderNet.predictAgeAndGender(o),nn=o=>P.ssdMobilenetv1.load(o),jd=o=>P.tinyFaceDetector.load(o),Ud=o=>P.tinyYolov2.load(o),Xd=o=>P.faceLandmark68Net.load(o),Jd=o=>P.faceLandmark68TinyNet.load(o),qd=o=>P.faceRecognitionNet.load(o),Zd=o=>P.faceExpressionNet.load(o),Kd=o=>P.ageGenderNet.load(o),Qd=nn,th=rn,eh=on;var Ae=class extends V{constructor(e,r,a){super();this.parentTask=e;this.input=r;this.extractedFaces=a}},Dt=class extends Ae{async run(){let t=await this.parentTask,e=await Ft(t,this.input,async r=>Promise.all(r.map(a=>P.faceExpressionNet.predictExpressions(a))),this.extractedFaces);return t.map((r,a)=>tr(r,e[a]))}withAgeAndGender(){return new Mt(this,this.input)}},Et=class extends Ae{async run(){let t=await this.parentTask;if(!t)return;let e=await qt(t,this.input,r=>P.faceExpressionNet.predictExpressions(r),this.extractedFaces);return tr(t,e)}withAgeAndGender(){return new Ct(this,this.input)}},ut=class extends Dt{withAgeAndGender(){return new lt(this,this.input)}withFaceDescriptors(){return new ht(this,this.input)}},ft=class extends Et{withAgeAndGender(){return new dt(this,this.input)}withFaceDescriptor(){return new bt(this,this.input)}};var We=class extends V{constructor(e,r,a){super();this.parentTask=e;this.input=r;this.extractedFaces=a}},Mt=class extends We{async run(){let t=await this.parentTask,e=await Ft(t,this.input,async r=>Promise.all(r.map(a=>P.ageGenderNet.predictAgeAndGender(a))),this.extractedFaces);return t.map((r,a)=>{let{age:s,gender:i,genderProbability:c}=e[a];return sr(ir(r,i,c),s)})}withFaceExpressions(){return new Dt(this,this.input)}},Ct=class extends We{async run(){let t=await this.parentTask;if(!t)return;let{age:e,gender:r,genderProbability:a}=await qt(t,this.input,s=>P.ageGenderNet.predictAgeAndGender(s),this.extractedFaces);return sr(ir(t,r,a),e)}withFaceExpressions(){return new Et(this,this.input)}},lt=class extends Mt{withFaceExpressions(){return new ut(this,this.input)}withFaceDescriptors(){return new ht(this,this.input)}},dt=class extends Ct{withFaceExpressions(){return new ft(this,this.input)}withFaceDescriptor(){return new bt(this,this.input)}};var ke=class extends V{constructor(e,r){super();this.parentTask=e;this.input=r}},ht=class extends ke{async run(){let t=await this.parentTask;return(await Ft(t,this.input,r=>Promise.all(r.map(a=>P.faceRecognitionNet.computeFaceDescriptor(a))),null,r=>r.landmarks.align(null,{useDlibAlignment:!0}))).map((r,a)=>ar(t[a],r))}withFaceExpressions(){return new ut(this,this.input)}withAgeAndGender(){return new lt(this,this.input)}},bt=class extends ke{async run(){let t=await this.parentTask;if(!t)return;let e=await qt(t,this.input,r=>P.faceRecognitionNet.computeFaceDescriptor(r),null,r=>r.landmarks.align(null,{useDlibAlignment:!0}));return ar(t,e)}withFaceExpressions(){return new ft(this,this.input)}withAgeAndGender(){return new dt(this,this.input)}};var Be=class extends V{constructor(e,r,a){super();this.parentTask=e;this.input=r;this.useTinyLandmarkNet=a}get landmarkNet(){return this.useTinyLandmarkNet?P.faceLandmark68TinyNet:P.faceLandmark68Net}},Re=class extends Be{async run(){let t=await this.parentTask,e=t.map(i=>i.detection),r=this.input instanceof n.Tensor?await oe(this.input,e):await re(this.input,e),a=await Promise.all(r.map(i=>this.landmarkNet.detectLandmarks(i)));return r.forEach(i=>i instanceof n.Tensor&&i.dispose()),t.filter((i,c)=>a[c]).map((i,c)=>ie(i,a[c]))}withFaceExpressions(){return new ut(this,this.input)}withAgeAndGender(){return new lt(this,this.input)}withFaceDescriptors(){return new ht(this,this.input)}},$e=class extends Be{async run(){let t=await this.parentTask;if(!t)return;let{detection:e}=t,r=this.input instanceof n.Tensor?await oe(this.input,[e]):await re(this.input,[e]),a=await this.landmarkNet.detectLandmarks(r[0]);return r.forEach(s=>s instanceof n.Tensor&&s.dispose()),ie(t,a)}withFaceExpressions(){return new ft(this,this.input)}withAgeAndGender(){return new dt(this,this.input)}withFaceDescriptor(){return new bt(this,this.input)}};var Oe=class extends V{constructor(e,r=new z){super();this.input=e;this.options=r}},me=class extends Oe{async run(){let{input:t,options:e}=this,r;if(e instanceof Le)r=P.tinyFaceDetector.locateFaces(t,e);else if(e instanceof z)r=P.ssdMobilenetv1.locateFaces(t,e);else if(e instanceof J)r=P.tinyYolov2.locateFaces(t,e);else throw new Error("detectFaces - expected options to be instance of TinyFaceDetectorOptions | SsdMobilenetv1Options | TinyYolov2Options");return r}runAndExtendWithFaceDetections(){return new Promise((t,e)=>{this.run().then(r=>t(r.map(a=>At({},a)))).catch(r=>e(r))})}withFaceLandmarks(t=!1){return new Re(this.runAndExtendWithFaceDetections(),this.input,t)}withFaceExpressions(){return new Dt(this.runAndExtendWithFaceDetections(),this.input)}withAgeAndGender(){return new Mt(this.runAndExtendWithFaceDetections(),this.input)}},He=class extends Oe{async run(){let t=await new me(this.input,this.options),e=t[0];return t.forEach(r=>{r.score>e.score&&(e=r)}),e}runAndExtendWithFaceDetection(){return new Promise(async t=>{let e=await this.run();t(e?At({},e):void 0)})}withFaceLandmarks(t=!1){return new $e(this.runAndExtendWithFaceDetection(),this.input,t)}withFaceExpressions(){return new Et(this.runAndExtendWithFaceDetection(),this.input)}withAgeAndGender(){return new Ct(this.runAndExtendWithFaceDetection(),this.input)}};function Kh(o,t=new z){return new He(o,t)}function mr(o,t=new z){return new me(o,t)}async function an(o,t){return mr(o,new z(t?{minConfidence:t}:{})).withFaceLandmarks().withFaceDescriptors()}async function nb(o,t={}){return mr(o,new J(t)).withFaceLandmarks().withFaceDescriptors()}var ab=an;function lo(o,t){if(o.length!==t.length)throw new Error("euclideanDistance: arr1.length !== arr2.length");let e=Array.from(o),r=Array.from(t);return Math.sqrt(e.map((a,s)=>a-r[s]).reduce((a,s)=>a+s**2,0))}var ze=class{constructor(t,e=.6){this._distanceThreshold=e;let r=Array.isArray(t)?t:[t];if(!r.length)throw new Error("FaceRecognizer.constructor - expected atleast one input");let a=1,s=()=>`person ${a++}`;this._labeledDescriptors=r.map(i=>{if(i instanceof Q)return i;if(i instanceof Float32Array)return new Q(s(),[i]);if(i.descriptor&&i.descriptor instanceof Float32Array)return new Q(s(),[i.descriptor]);throw new Error("FaceRecognizer.constructor - expected inputs to be of type LabeledFaceDescriptors | WithFaceDescriptor | Float32Array | Array | Float32Array>")})}get labeledDescriptors(){return this._labeledDescriptors}get distanceThreshold(){return this._distanceThreshold}computeMeanDistance(t,e){return e.map(r=>lo(r,t)).reduce((r,a)=>r+a,0)/(e.length||1)}matchDescriptor(t){return this.labeledDescriptors.map(({descriptors:e,label:r})=>new Kt(r,this.computeMeanDistance(t,e))).reduce((e,r)=>e.distancet.toJSON())}}static fromJSON(t){let e=t.labeledDescriptors.map(r=>Q.fromJSON(r));return new ze(e,t.distanceThreshold)}};function Pb(o){let t=new Zt;return t.extractWeights(o),t}function sn(o,t){let{width:e,height:r}=new S(t.width,t.height);if(e<=0||r<=0)throw new Error(`resizeResults - invalid dimensions: ${JSON.stringify({width:e,height:r})}`);if(Array.isArray(o))return o.map(a=>sn(a,{width:e,height:r}));if(Yt(o)){let a=o.detection.forSize(e,r),s=o.unshiftedLandmarks.forSize(a.box.width,a.box.height);return ie(At(o,a),s)}return tt(o)?At(o,o.detection.forSize(e,r)):o instanceof $||o instanceof E?o.forSize(e,r):o}var Ab=Wr;export{Me as AgeGenderNet,Nt as BoundingBox,w as Box,V as ComposableTask,ht as ComputeAllFaceDescriptorsTask,ke as ComputeFaceDescriptorsTaskBase,bt as ComputeSingleFaceDescriptorTask,Re as DetectAllFaceLandmarksTask,me as DetectAllFacesTask,Be as DetectFaceLandmarksTaskBase,Oe as DetectFacesTaskBase,$e as DetectSingleFaceLandmarksTask,He as DetectSingleFaceTask,S as Dimensions,Sr as FACE_EXPRESSION_LABELS,E as FaceDetection,to as FaceDetectionNet,we as FaceExpressionNet,pt as FaceExpressions,jt as FaceLandmark68Net,Ie as FaceLandmark68TinyNet,Vr as FaceLandmarkNet,$ as FaceLandmarks,vr as FaceLandmarks5,Lt as FaceLandmarks68,Kt as FaceMatch,ze as FaceMatcher,Ut as FaceRecognitionNet,rr as Gender,Qt as LabeledBox,Q as LabeledFaceDescriptors,rt as NetInput,I as NeuralNetwork,ct as ObjectDetection,b as Point,yr as PredictedBox,St as Rect,Pt as SsdMobilenetv1,z as SsdMobilenetv1Options,Zt as TinyFaceDetector,Le as TinyFaceDetectorOptions,Jt as TinyYolov2,J as TinyYolov2Options,ab as allFaces,an as allFacesSsdMobilenetv1,nb as allFacesTinyYolov2,_r as awaitMediaLoaded,Tr as bufferToImage,Vd as computeFaceDescriptor,Rt as createCanvas,be as createCanvasFromMedia,vl as createFaceDetectionNet,vf as createFaceRecognitionNet,Qo as createSsdMobilenetv1,Pb as createTinyFaceDetector,pd as createTinyYolov2,mr as detectAllFaces,on as detectFaceLandmarks,zd as detectFaceLandmarksTiny,eh as detectLandmarks,Kh as detectSingleFace,Ar as draw,T as env,lo as euclideanDistance,sr as extendWithAge,ar as extendWithFaceDescriptor,At as extendWithFaceDetection,tr as extendWithFaceExpressions,ie as extendWithFaceLandmarks,ir as extendWithGender,oe as extractFaceTensors,re as extractFaces,Mi as fetchImage,Fr as fetchJson,Li as fetchNetWeights,mt as fetchOrThrow,$i as fetchVideo,k as getContext2dOrThrow,Bt as getMediaDimensions,Pr as imageTensorToCanvas,wr as imageToSquare,Vn as inverseSigmoid,hr as iou,Qe as isMediaElement,he as isMediaLoaded,Pf as isWithAge,tt as isWithFaceDetection,Lr as isWithFaceExpressions,Yt as isWithFaceLandmarks,Ef as isWithGender,Kd as loadAgeGenderModel,Qd as loadFaceDetectionModel,Zd as loadFaceExpressionModel,Xd as loadFaceLandmarkModel,Jd as loadFaceLandmarkTinyModel,qd as loadFaceRecognitionModel,nn as loadSsdMobilenetv1Model,jd as loadTinyFaceDetectorModel,Ud as loadTinyYolov2Model,Er as loadWeightMap,th as locateFaces,ji as matchDimensions,br as minBbox,P as nets,gr as nonMaxSuppression,X as normalize,xr as padToSquare,Gd as predictAgeAndGender,Yd as recognizeFaceExpressions,sn as resizeResults,Wt as resolveInput,Hn as shuffleArray,fe as sigmoid,rn as ssdMobilenetv1,n as tf,Od as tinyFaceDetector,Hd as tinyYolov2,M as toNetInput,dr as utils,io as validateConfig,Ab as version}; diff --git a/dist/face-api.esm.js b/dist/face-api.esm.js index b7bb2df..5ac2717 100644 --- a/dist/face-api.esm.js +++ b/dist/face-api.esm.js @@ -4686,5 +4686,5 @@ return a / b;`,fne=` } `}};function ise(e){let{inputs:t,backend:n,attrs:a}=e,{x:r,segmentIds:s}=t,{numSegments:i}=a,o=r.shape.length,l=[],u=0,p=C.getAxesPermutation([u],o),d=r;p!=null&&(d=Tn({inputs:{x:r},backend:n,attrs:{perm:p}}),l.push(d),u=C.getInnerMostAxes(1,o)[0]);let c=C.segment_util.computeOutShape(d.shape,u,i),h=w.sizeFromShape([d.shape[u]]),m=he({inputs:{x:d},backend:n,attrs:{shape:[-1,h]}});l.push(m);let f=Um(r.dtype),g=(v,I,T,_,A)=>{let F=v.shape[0],P=v.shape[1],$=C.segment_util.segOpComputeOptimalWindowSize(P,A),S={windowSize:$,inSize:P,batchSize:F,numSegments:A},M=new sse(S,I),U=n.compileAndRun(M,[v,T],_);if(l.push(U),U.shape[1]===A)return U;let j=hE({backend:n,attrs:{start:0,stop:A,step:1,dtype:"float32"}}),q=fE({inputs:{x:j},backend:n,attrs:{reps:[P/$]}});return l.push(j),l.push(q),g(U,I,q,_,A)},y=g(m,"unsortedSegmentSum",s,f,i),b=he({inputs:{x:y},backend:n,attrs:{shape:c}}),x=b;if(p!=null){l.push(b);let v=C.getUndoAxesPermutation(p);x=Tn({inputs:{x},backend:n,attrs:{perm:v}})}return l.forEach(v=>n.disposeIntermediateTensorInfo(v)),x}var ose={kernelName:Fc,backendName:"webgl",kernelFunc:ise},lse=[u9,c9,m9,y9,x9,k9,S9,T9,A9,F9,M9,L9,W9,H9,K9,Y9,Z9,nZ,rZ,iZ,pZ,yZ,xZ,wZ,CZ,EZ,DZ,GJ,PZ,WZ,HZ,JZ,QZ,tQ,aQ,sQ,lQ,cQ,mQ,gQ,bQ,vQ,IQ,NQ,EQ,$Q,RQ,OQ,zQ,UQ,qQ,JQ,eee,aee,ree,iee,lee,pee,dee,mee,bee,wee,See,Tee,Eee,Fee,Pee,Bee,UJ,Vee,zZ,Hee,Kee,Jee,jJ,tte,ste,ote,cte,mte,bte,wte,Nte,Ete,Fte,Rte,Lte,Bte,Vte,jte,Kte,Yte,Zte,ene,rne,lne,dne,vne,JJ,Sne,Cne,Ane,Dne,IZ,Pne,Lne,Bne,Une,qne,KJ,Xne,Yne,SZ,gne,Qne,aae,oae,QJ,cae,mae,bae,wae,Nae,Cae,Aae,Dae,Mae,Lae,Wae,Gae,Kae,Jae,ere,are,fZ,bne,ire,lre,pre,dre,mre,gre,bre,vre,kre,Nre,Cre,Ere,Fre,Rre,Pre,Lre,yne,i9,Wre,Gre,qre,Jre,ese,o9,nse,rse,ose,One];for(let e of lse)Dc(e);var $t;(function(e){e[e.float32=0]="float32",e[e.int32=1]="int32",e[e.bool=2]="bool",e[e.string=3]="string",e[e.complex64=4]="complex64"})($t||($t={}));var mc;(function(e){e[e.linear=0]="linear",e[e.relu=1]="relu",e[e.relu6=2]="relu6",e[e.prelu=3]="prelu",e[e.leakyrelu=4]="leakyrelu",e[e.sigmoid=5]="sigmoid",e[e.elu=6]="elu"})(mc||(mc={}));var gE;function use(e){gE=e.wasm.cwrap(ri,null,["number","array","number","number","array","number","number","number","number","number","number","number","number"])}function pse(e){let{inputs:t,backend:n,attrs:a}=e,{a:r,b:s,bias:i,preluActivationWeights:o}=t;if(r.dtype!=="float32"||s.dtype!=="float32")throw new Error("_FusedMatMul for non non-float32 tensors not yet supported.");let{transposeA:l,transposeB:u,activation:p,leakyreluAlpha:d}=a,c=n.dataIdMap.get(r.dataId).id,h=n.dataIdMap.get(s.dataId).id,m=0;if(i!=null){let A=n.dataIdMap.get(i.dataId);if(A.shape.length!==1)throw new Error(`_FusedMatMul only supports rank-1 bias but got rank ${A.shape.length}.`);m=A.id}let f=o==null?0:n.dataIdMap.get(o.dataId).id,g=mc[p];if(g==null)throw new Error(`${p} activation not yet supported for FusedConv2D in the wasm backend.`);let y=l?r.shape[2]:r.shape[1],b=u?s.shape[1]:s.shape[2],x=Du.assertAndGetBroadcastShape(r.shape.slice(0,-2),s.shape.slice(0,-2)),v=n.makeOutput([...x,y,b],r.dtype),I=n.dataIdMap.get(v.dataId).id,T=new Uint8Array(new Int32Array(r.shape).buffer),_=new Uint8Array(new Int32Array(s.shape).buffer);return gE(c,T,r.shape.length,h,_,s.shape.length,l,u,g,m,f,d||0,I),v}var cse={kernelName:ri,backendName:"wasm",setupFunc:use,kernelFunc:pse};function rn(e,t){let n;function a(s){n=s.wasm.cwrap(e,null,["number","number","number"])}function r(s){let{backend:i,inputs:{x:o}}=s,l=i.dataIdMap.get(o.dataId).id,u=i.makeOutput(o.shape,t||o.dtype),p=i.dataIdMap.get(u.dataId).id;return w.sizeFromShape(u.shape)===0||n(l,$t[o.dtype],p),u}return{kernelName:e,backendName:"wasm",setupFunc:a,kernelFunc:r}}var dse=rn(El);function cn(e,t,n){let a;function r(i){a=i.wasm.cwrap(e,null,["number","array","number","number","array","number","number","number"])}function s(i){let{backend:o,inputs:l}=i,{a:u,b:p}=l,d=o.dataIdMap.get(u.dataId).id,c=o.dataIdMap.get(p.dataId).id,h=n!=null?n:u.dtype,m=C.assertAndGetBroadcastShape(u.shape,p.shape),f=o.makeOutput(m,h);if(w.sizeFromShape(m)===0)return f;let g=new Uint8Array(new Int32Array(u.shape).buffer),y=new Uint8Array(new Int32Array(p.shape).buffer),b=o.dataIdMap.get(f.dataId).id;return a(d,g,u.shape.length,c,y,p.shape.length,$t[u.dtype],b),f}return{kernelName:e,backendName:"wasm",setupFunc:r,kernelFunc:s}}var hse=!0,mse=cn(ds,hse),yE;function fse(e){yE=e.wasm.cwrap(vi,null,["array","number","number","number"])}function gse(e){let{inputs:t,backend:n}=e,a=n.makeOutput(t[0].shape,t[0].dtype);if(w.sizeFromShape(a.shape)===0)return a;let r=t.map(o=>n.dataIdMap.get(o.dataId).id),s=new Uint8Array(new Int32Array(r).buffer),i=n.dataIdMap.get(a.dataId).id;return yE(s,r.length,$t[a.dtype],i),a}var yse={kernelName:vi,backendName:"wasm",setupFunc:fse,kernelFunc:gse};function ng(e){let{inputs:{x:t},backend:n}=e,a=n.makeOutput(t.shape,t.dtype),r=n.typedArrayFromHeap(t);return n.typedArrayFromHeap(a).set(r),a}var bse={kernelName:zi,backendName:"wasm",kernelFunc:ng},bE;function xse(e){bE=e.wasm.cwrap(Tr,null,["number","array","number","number","number","array","number"])}function us(e){let{inputs:t,backend:n,attrs:a}=e,[r,s]=wse(t.x.shape,a.perm),i=!0;for(let m=0;m=r&&(s===-1||a[s]>a[i])&&(s=i);a[s]=r}return[n,a]}var kse={kernelName:Tr,backendName:"wasm",kernelFunc:us,setupFunc:xse};function Ts(e,t,n){let a=e.shape,r=e.shape.length,s=w.parseAxisParam(t,a),i=s,o=C.getAxesPermutation(i,r),l=null,u=!1;if(o!=null){let p=new Array(r);for(let c=0;c`new shape: ${i}, old shape: ${a.shape}. New shape and old shape must have the same number of elements.`),e.backend.incRef(a.dataId),{dataId:a.dataId,shape:i,dtype:a.dtype}}var Mse={kernelName:gu,backendName:"wasm",kernelFunc:Vn},IE;function Pse(e){IE=e.wasm.cwrap(Ii,null,["number","array","number","number","array","number","number","number","number"])}function Ose(e){let{inputs:t,backend:n,attrs:a}=e,{a:r,b:s}=t,{transposeA:i,transposeB:o}=a;if(r.dtype!=="float32"||s.dtype!=="float32")throw new Error("BatchMatMul for non non-float32 tensors not yet supported.");let l=r.shape.length,u=s.shape.length,p=i?r.shape[l-2]:r.shape[l-1],d=o?s.shape[u-1]:s.shape[u-2],c=i?r.shape[l-1]:r.shape[l-2],h=o?s.shape[u-2]:s.shape[u-1],m=r.shape.slice(0,-2),f=s.shape.slice(0,-2),g=w.sizeFromShape(m),y=w.sizeFromShape(f),b=Du.assertAndGetBroadcastShape(r.shape.slice(0,-2),s.shape.slice(0,-2)).concat([c,h]);w.assert(p===d,()=>`Error in matMul: inner shapes (${p}) and (${d}) of Tensors with shapes ${r.shape} and ${s.shape} and transposeA=${i} and transposeB=${o} must match.`);let x=i?[g,p,c]:[g,c,p],v=o?[y,h,d]:[y,d,h],I=Vn({inputs:{x:r},backend:n,attrs:{shape:x}}),T=Vn({inputs:{x:s},backend:n,attrs:{shape:v}}),_=n.dataIdMap.get(I.dataId).id,A=n.dataIdMap.get(T.dataId).id,F=i?I.shape[2]:I.shape[1],P=o?T.shape[1]:T.shape[2],$=Math.max(g,y),S=n.makeOutput([$,F,P],I.dtype),M=n.dataIdMap.get(S.dataId).id,U=new Uint8Array(new Int32Array(I.shape).buffer),j=new Uint8Array(new Int32Array(T.shape).buffer);return IE(_,U,I.shape.length,A,j,T.shape.length,i,o,M),n.disposeData(I.dataId),n.disposeData(T.dataId),S.shape=b,S}var Lse={kernelName:Ii,backendName:"wasm",setupFunc:Pse,kernelFunc:Ose};function bi(e){let{inputs:{x:t},attrs:{begin:n,size:a},backend:r}=e,[s,i]=qt.parseSliceParams(t,n,a),o=qt.isSliceContinous(t.shape,s,i),l=r.readSync(t.dataId),u=r.makeOutput(i,t.dtype),p=w.computeStrides(t.shape),d=r.dataIdMap.get(u.dataId);if(o){let m=qt.computeFlatOffset(s,p);return t.dtype==="string"?d.stringBytes=l.slice(m,m+w.sizeFromShape(i)):r.typedArrayFromHeap(u).set(l.subarray(m,m+w.sizeFromShape(i))),u}if(t.dtype==="string"){let m=tm(l,s,i,t.shape,t.dtype);return d.stringBytes=m,u}let c=r.typedArrayFromHeap(u),h=t.shape.length;if(h===2)zse(l,p[0],c,s,i);else if(h===3)Bse(l,p[0],p[1],c,s,i);else if(h===4)Wse(l,p[0],p[1],p[2],c,s,i);else{let m=tm(l,s,i,t.shape,t.dtype);c.set(m)}return u}function zse(e,t,n,a,r){let s=0,i=a[0],o=a[1],l=i+r[0];for(let u=i;uy*b),l=C.getReshaped(r.shape,s,o),u=C.getPermuted(l.length,s.length),p=C.getReshapedPermuted(r.shape,s,o),d=C.getSliceBeginCoords(i,s.length),c=C.getSliceSize(p,i,s.length),h=Vn({inputs:{x:r},backend:n,attrs:{shape:l}}),m=us({inputs:{x:h},backend:n,attrs:{perm:u}}),f=Vn({inputs:{x:m},backend:n,attrs:{shape:p}}),g=bi({inputs:{x:f},backend:n,attrs:{begin:d,size:c}});return n.disposeData(h.dataId),n.disposeData(m.dataId),n.disposeData(h.dataId),g}var Gse={kernelName:zl,backendName:"wasm",kernelFunc:Use};function Qu(e){let{inputs:{x:t},attrs:{dtype:n},backend:a}=e,r=a.makeOutput(t.shape,n),s=a.typedArrayFromHeap(t);return a.typedArrayFromHeap(r).set(s),r}var Hse={kernelName:Si,backendName:"wasm",kernelFunc:Qu},jse=rn(Ni),SE;function qse(e){SE=e.wasm.cwrap(hs,null,["number","number","number","number"])}function Kse(e){let{inputs:t,backend:n,attrs:a}=e,{x:r}=t,{clipValueMin:s,clipValueMax:i}=a,o=n.dataIdMap.get(r.dataId).id,l=n.makeOutput(r.shape,r.dtype),u=n.dataIdMap.get(l.dataId).id;return SE(o,s,i,u),l}var Xse={kernelName:hs,backendName:"wasm",setupFunc:qse,kernelFunc:Kse};function NE(e){let{inputs:t,backend:n}=e,a=w.parseAxisParam(e.attrs.axis,t[0].shape)[0],r=C.computeOutShape(t.map(h=>h.shape),a),s=t.filter(h=>w.sizeFromShape(h.shape)>0);if(s.length===1)return ng({inputs:{x:s[0]},backend:n});let i=n.makeOutput(r,t[0].dtype);if(w.sizeFromShape(r)===0)return i;let o=s.map(h=>h.shape);if(C.assertParamsConsistent(o,a),s[0].dtype==="string"){let h=s.map(x=>{let v=w.sizeFromShape(x.shape.slice(a));return Vn({inputs:{x},backend:n,attrs:{shape:[-1,v]}})}),m=h.map(x=>({vals:n.readSync(x.dataId),shape:x.shape}));r=C.computeOutShape(h.map(x=>x.shape),1);let f=h[0].shape[0]===1,g=z0(m,r,t[0].dtype,f),y=C.computeOutShape(s.map(x=>x.shape),a);i.shape=y;let b=n.dataIdMap.get(i.dataId);return b.stringBytes=C.fromStringArrayToUint8(g),h.forEach(x=>n.disposeData(x.dataId)),i}let l=w.sizeFromShape(s[0].shape.slice(0,a)),u=0,p=s.map(h=>{let m=w.sizeFromShape(h.shape.slice(a));return u+=m,m}),d=s.map(h=>n.typedArrayFromHeap(h)),c=n.typedArrayFromHeap(i);for(let h=0;h`cumprod does not support ${r.dtype} tensors in the WASM backend`);let u=C.getAxesPermutation([s],l),p=r;u!==null&&(p=us({inputs:{x:r},attrs:{perm:u},backend:n}));let d=C.getInnerMostAxes(1,l)[0];C.assertAxesAreInnerMostDims("cumprod",[d],l);let c=n.makeOutput(p.shape,p.dtype),h=p.shape[d],m=n.dataIdMap.get(p.dataId).id,f=n.dataIdMap.get(c.dataId).id;EE(m,i?1:0,o?1:0,h,f,$t[r.dtype]);let g=c;if(u!==null){let y=C.getUndoAxesPermutation(u);g=us({inputs:{x:c},attrs:{perm:y},backend:n}),n.disposeData(p.dataId),n.disposeData(c.dataId)}return g}var pie={kernelName:Wl,backendName:"wasm",setupFunc:lie,kernelFunc:uie},AE;function cie(e){AE=e.wasm.cwrap(Ai,null,["number","number","number","number","number","number"])}function die(e){let{inputs:t,backend:n,attrs:a}=e,{x:r}=t,{axis:s,exclusive:i,reverse:o}=a,l=r.shape.length;w.assert(r.dtype==="float32"||r.dtype==="int32",()=>`cumsum does not support ${r.dtype} tensors in the WASM backend`);let u=C.getAxesPermutation([s],l),p=r;u!==null&&(p=us({inputs:{x:r},attrs:{perm:u},backend:n}));let d=C.getInnerMostAxes(1,l)[0];C.assertAxesAreInnerMostDims("cumsum",[d],l);let c=n.makeOutput(p.shape,p.dtype),h=p.shape[d],m=n.dataIdMap.get(p.dataId).id,f=n.dataIdMap.get(c.dataId).id;AE(m,i?1:0,o?1:0,h,f,$t[r.dtype]);let g=c;if(u!==null){let y=C.getUndoAxesPermutation(u);g=us({inputs:{x:c},attrs:{perm:y},backend:n}),n.disposeData(p.dataId),n.disposeData(c.dataId)}return g}var hie={kernelName:Ai,backendName:"wasm",setupFunc:cie,kernelFunc:die},$E;function mie(e){$E=e.wasm.cwrap(Ul,null,["number","number","number","array","number","array","array","number","number"])}function fie(e){let{backend:t,inputs:n,attrs:a}=e,{x:r}=n,{blockSize:s,dataFormat:i}=a,o=r.shape[0],l=i==="NHWC"?r.shape[1]:r.shape[2],u=i==="NHWC"?r.shape[2]:r.shape[3],p=i==="NHWC"?r.shape[3]:r.shape[1],d=l*s,c=u*s,h=p/(s*s),m=i==="NHWC"?[o,d,c,h]:[o,h,d,c],f=t.makeOutput(m,"float32"),g=t.dataIdMap.get(r.dataId).id,y=new Uint8Array(new Int32Array(w.computeStrides(r.shape)).buffer),b=new Uint8Array(new Int32Array(m).buffer),x=new Uint8Array(new Int32Array(w.computeStrides(m)).buffer),v=t.dataIdMap.get(f.dataId).id;return $E(g,s,i==="NHWC"?1:0,y,r.shape.length-1,b,x,m.length,v),f}var gie={kernelName:Ul,backendName:"wasm",setupFunc:mie,kernelFunc:fie},FE;function yie(e){FE=e.wasm.cwrap($i,null,["number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number"])}function bie(e){let{inputs:t,attrs:n,backend:a}=e,{x:r,filter:s}=t,i=a.dataIdMap.get(r.dataId).id,o=a.dataIdMap.get(s.dataId).id,{strides:l,dilations:u,pad:p,dimRoundingMode:d}=n,c=u==null?[1,1]:u,h=C.computeConv2DInfo(r.shape,s.shape,l,c,p,d,!0),m=h.filterHeight,f=h.filterWidth,g=h.padInfo.top,y=h.padInfo.right,b=h.padInfo.bottom,x=h.padInfo.left,v=h.dilationHeight,I=h.dilationWidth,T=h.strideHeight,_=h.strideWidth,A=h.inChannels,F=h.outChannels,P=h.padInfo.type==="SAME"?1:0;if(h.dataFormat!=="channelsLast")throw new Error(`wasm backend DepthwiseConv2dNative does not support dataFormat:'${h.dataFormat}'. Please use 'channelsLast'.`);let $=a.makeOutput(h.outShape,"float32"),S=a.dataIdMap.get($.dataId).id;return FE(i,r.shape[0],r.shape[1],r.shape[2],o,m,f,g,y,b,x,P,v,I,T,_,A,F,S),$}var xie={kernelName:$i,backendName:"wasm",setupFunc:yie,kernelFunc:bie},vie=rn(Di),wie=!1,kie=cn(Hl,wie,"bool"),Iie=rn(Ri,"float32");function Cx(e){let{inputs:t,attrs:n,backend:a}=e,{input:r}=t,{dim:s}=n,i=r.shape.length,o=r.shape.slice(),l=s;return s<0&&(w.assert(-(i+1)<=s,()=>`Axis must be in the interval [${-(i+1)}, ${i}]`),l=i+s+1),o.splice(l,0,1),Vn({inputs:{x:r},backend:a,attrs:{shape:o}})}var Sie={kernelName:jl,backendName:"wasm",kernelFunc:Cx};function DE(e){let{attrs:{shape:t,value:n,dtype:a},backend:r}=e,s=r.makeOutput(t,a);return r.typedArrayFromHeap(s).fill(n),s}var Nie={kernelName:wc,backendName:"wasm",kernelFunc:DE},RE;function Tie(e){RE=e.wasm.cwrap(Kl,null,["number","number","number","number","number","number"])}function Cie(e){let{inputs:t,backend:n}=e,{image:a}=t,r=n.makeOutput(a.shape,a.dtype),s=n.dataIdMap.get(a.dataId).id,i=n.dataIdMap.get(r.dataId).id,[o,l,u,p]=a.shape;return RE(s,o,l,u,p,i),r}var _ie={kernelName:Kl,backendName:"wasm",kernelFunc:Cie,setupFunc:Tie},Eie=rn(Mi),Aie=!1,$ie=cn(Pi,Aie),ME;function Fie(e){ME=e.wasm.cwrap(Oi,null,["number","number","number","number","number","number","number"])}function Die(e){let{backend:t,inputs:n,attrs:a}=e,{varianceEpsilon:r}=a,{x:s,mean:i,variance:o,offset:l,scale:u}=n,p=t.dataIdMap.get(s.dataId).id,d=t.dataIdMap.get(i.dataId).id,c=t.dataIdMap.get(o.dataId).id,h=l!=null?t.dataIdMap.get(l.dataId).id:0,m=u!=null?t.dataIdMap.get(u.dataId).id:0,f=t.makeOutput(s.shape,s.dtype);if(w.sizeFromShape(s.shape)===0)return f;let g=t.dataIdMap.get(f.dataId).id;return ME(p,d,c,h,m,r,g),f}var Rie={kernelName:Oi,backendName:"wasm",setupFunc:Fie,kernelFunc:Die},PE;function Mie(e){PE=e.wasm.cwrap(si,null,["number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number"])}function Pie(e){let{inputs:t,attrs:n,backend:a}=e,{x:r,filter:s,bias:i,preluActivationWeights:o}=t,{strides:l,pad:u,dilations:p,dataFormat:d,dimRoundingMode:c,activation:h,leakyreluAlpha:m}=n,f=C.computeConv2DInfo(r.shape,s.shape,l,p,u,c),g=mc[h];if(g==null)throw new Error(`${h} activation not yet supported for FusedConv2D in the wasm backend.`);let y=a.dataIdMap.get(r.dataId).id,b=a.dataIdMap.get(s.dataId).id,x=f.outChannels,v=0;if(i!=null){let ae=a.dataIdMap.get(i.dataId);if(ae.shape.length!==1)throw new Error(`FusedConv2D only supports rank-1 bias but got rank ${ae.shape.length}.`);if(ae.shape[0]!==x)throw new Error(`FusedConv2D bias shape (${ae.shape}) does not match the number of output channels (${x})`);v=ae.id}let I=f.filterHeight,T=f.filterWidth,_=f.padInfo.top,A=f.padInfo.right,F=f.padInfo.bottom,P=f.padInfo.left,$=f.dilationHeight,S=f.dilationWidth,M=f.strideHeight,U=f.strideWidth,j=f.inChannels,q=f.padInfo.type==="SAME"?1:0,K=f.batchSize,Y=f.inHeight,te=f.inWidth;if(d!=="NHWC")throw new Error(`wasm backend FusedConv2D does not support dataFormat:'${d}'. Please use 'NHWC'.`);let re=a.makeOutput(f.outShape,"float32"),Q=a.dataIdMap.get(re.dataId).id,ie=o==null?0:a.dataIdMap.get(o.dataId).id;return PE(y,K,Y,te,b,I,T,v,_,A,F,P,q,$,S,M,U,j,x,g,ie,m||0,Q),re}var Oie={kernelName:si,backendName:"wasm",setupFunc:Mie,kernelFunc:Pie},OE;function Lie(e){OE=e.wasm.cwrap(ii,null,["number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number"])}function zie(e){let{inputs:t,attrs:n,backend:a}=e,{x:r,filter:s,bias:i,preluActivationWeights:o}=t,{strides:l,pad:u,dilations:p,dataFormat:d,dimRoundingMode:c,activation:h,leakyreluAlpha:m}=n,f=C.computeConv2DInfo(r.shape,s.shape,l,p,u,c,!0),g=mc[h];if(g==null)throw new Error(`${h} activation not yet supported for FusedDepthwiseConv2D in the wasm backend.`);let y=a.dataIdMap.get(r.dataId).id,b=a.dataIdMap.get(s.dataId).id,x=f.outChannels,v=0;if(i!=null){let ae=a.dataIdMap.get(i.dataId);if(ae.shape.length!==1)throw new Error(`FusedDepthwiseConv2D only supports rank-1 bias but got rank ${ae.shape.length}.`);if(ae.shape[0]!==x)throw new Error(`FusedDepthwiseConv2D bias shape (${ae.shape}) does not match the number of output channels (${x})`);v=ae.id}let I=f.filterHeight,T=f.filterWidth,_=f.padInfo.top,A=f.padInfo.right,F=f.padInfo.bottom,P=f.padInfo.left,$=f.dilationHeight,S=f.dilationWidth,M=f.strideHeight,U=f.strideWidth,j=f.inChannels,q=f.padInfo.type==="SAME"?1:0,K=f.batchSize,Y=f.inHeight,te=f.inWidth;if(d!=="NHWC")throw new Error(`wasm backend FusedDepthwiseConv2D does not support dataFormat:'${d}'. Please use 'NHWC'.`);let re=a.makeOutput(f.outShape,"float32"),Q=a.dataIdMap.get(re.dataId).id,ie=o==null?0:a.dataIdMap.get(o.dataId).id;return OE(y,K,Y,te,b,I,T,v,_,A,F,P,q,$,S,M,U,j,x,g,ie,m||0,Q),re}var Bie={kernelName:ii,backendName:"wasm",setupFunc:Lie,kernelFunc:zie},LE;function Wie(e){LE=e.wasm.cwrap(Yl,null,["number","number","number","number","number","number","array","number"])}function Vie(e){let{backend:t,inputs:n}=e,{params:a,indices:r}=n,[s,i,o,l]=Kx.prepareAndValidate(a,r),u=t.makeOutput(s,a.dtype);if(i===0)return u;let p=r.shape,d=p[p.length-1],c=t.dataIdMap.get(a.dataId).id,h=t.dataIdMap.get(r.dataId).id,m=new Uint8Array(new Int32Array(l).buffer),f=t.dataIdMap.get(u.dataId).id;return LE(c,$t[a.dtype],h,i,d,o,m,f),u}var Uie={kernelName:Yl,backendName:"wasm",setupFunc:Wie,kernelFunc:Vie},zE;function Gie(e){zE=e.wasm.cwrap("Gather",null,["number","number","array","number","number","number","array","number"])}function Hie(e){let{backend:t,inputs:n,attrs:a}=e,{x:r,indices:s}=n,{axis:i,batchDims:o}=a,l=w.parseAxisParam(i,r.shape)[0],u=t.readSync(s.dataId),p=r.shape[l];for(let _=0;_=0,()=>`GatherV2: the index value ${A} is not in [0, ${p-1}]`)}let d=C.segment_util.collectGatherOpShapeInfo(r,s,l,o),c=Vn({inputs:{x:r},attrs:{shape:[d.batchSize,d.outerSize,d.dimSize,d.sliceSize]},backend:t}),h=w.sizeFromShape(s.shape),m=Vn({inputs:{x:s},attrs:{shape:[d.batchSize,h/d.batchSize]},backend:t}),f=[d.batchSize,d.outerSize,h/d.batchSize,d.sliceSize],g=t.makeOutput(f,r.dtype);if(w.sizeFromShape(r.shape)===0)return g;let y=c.shape.length-1,b=t.dataIdMap.get(c.dataId).id,x=t.dataIdMap.get(m.dataId).id,v=t.dataIdMap.get(g.dataId).id,I=new Uint8Array(new Int32Array(w.computeStrides(c.shape)).buffer),T=new Uint8Array(new Int32Array(w.computeStrides(f)).buffer);return zE(b,$t[r.dtype],I,y,x,d.batchSize,T,v),t.disposeData(c.dataId),t.disposeData(m.dataId),g.shape=d.outputShape,g}var jie={kernelName:Xl,backendName:"wasm",setupFunc:Gie,kernelFunc:Hie},qie=!1,Kie=cn(Jl,qie,"bool"),Xie=!1,Yie=cn(Li,Xie,"bool"),BE;function Jie(e){BE=e.wasm.cwrap(Bi,null,["number","number","number","number"])}function Zie(e){let{inputs:{x:t},attrs:{alpha:n},backend:a}=e,r=a.dataIdMap.get(t.dataId).id,s=a.makeOutput(t.shape,"float32");if(w.sizeFromShape(t.shape)!==0){let i=a.dataIdMap.get(s.dataId).id;BE(r,$t[t.dtype],n,i)}return s}var Qie={kernelName:Bi,backendName:"wasm",setupFunc:Jie,kernelFunc:Zie},eoe=!1,toe=cn(tu,eoe,"bool"),noe=!1,aoe=cn(nu,noe,"bool"),roe=rn(Wi),soe=!1,ioe=cn(ru,soe,"bool"),ooe=rn(su),loe=!1,uoe=cn(iu,loe,"bool"),poe=!1,coe=cn(BI,poe,"bool"),WE;function doe(e){WE=e.wasm.cwrap(Vi,null,["number","number","number","number"])}function hoe(e){let{backend:t,inputs:n,attrs:a}=e,{reductionIndices:r,keepDims:s}=a,{x:i}=n,o=t.dataIdMap.get(i.dataId).id,l=i,{transposed:u,axes:p,originalAxes:d,inputWasTransposed:c}=Ts(i,r,t);if(c){let b=t.dataIdMap.get(u.dataId).id;l=u,o=b}let h=l.shape.length;C.assertAxesAreInnerMostDims("max",p,h);let[m,f]=C.computeOutAndReduceShapes(l.shape,p),g=w.sizeFromShape(f),y=t.makeOutput(m,i.dtype);if(w.sizeFromShape(l.shape)!==0){let b=t.dataIdMap.get(y.dataId).id;WE(o,$t[i.dtype],g,b)}if(c&&t.disposeData(u.dataId),s){let b=C.expandShapeToKeepDim(y.shape,d);y.shape=b}return y}var moe={kernelName:Vi,backendName:"wasm",setupFunc:doe,kernelFunc:hoe},foe=!1,goe=cn(Ui,foe),VE;function yoe(e){VE=e.wasm.cwrap(Gi,null,["number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number"])}function boe(e){let{inputs:t,attrs:n,backend:a}=e,r=t.x,s=a.dataIdMap.get(r.dataId).id;w.assert(r.dtype==="float32",()=>`Error in MaxPool: only float32 input is supported. Got ${r.dtype}.`);let{filterSize:i,strides:o,pad:l,dimRoundingMode:u}=n,p=C.computePool2DInfo(r.shape,i,o,1,l,u),d=p.filterHeight,c=p.filterWidth,h=p.padInfo.top,m=p.padInfo.right,f=p.padInfo.bottom,g=p.padInfo.left,y=p.dilationHeight,b=p.dilationWidth,x=p.strideHeight,v=p.strideWidth,I=p.inChannels,T=p.outChannels;if(p.dataFormat!=="channelsLast")throw new Error(`wasm backend does not support dataFormat:'${p.dataFormat}'. Please use 'channelsLast'.`);let _=a.makeOutput(p.outShape,"float32"),A=a.dataIdMap.get(_.dataId).id;return VE(s,r.shape[0],r.shape[1],r.shape[2],d,c,h,m,f,g,y,b,x,v,I,T,A),_}var xoe={kernelName:Gi,backendName:"wasm",setupFunc:yoe,kernelFunc:boe},UE;function voe(e){UE=e.wasm.cwrap(Hi,null,["number, number, number"])}function woe(e){let{backend:t,inputs:n,attrs:a}=e,{axis:r,keepDims:s}=a,{x:i}=n,o=t.dataIdMap.get(i.dataId).id,l=o,u=i,{transposed:p,axes:d,originalAxes:c,inputWasTransposed:h}=Ts(i,r,t),m=d;if(h){let v=t.dataIdMap.get(p.dataId).id;v!==o&&(u=p,l=v,m=C.getInnerMostAxes(m.length,u.shape.length))}C.assertAxesAreInnerMostDims("mean",m,u.shape.length);let[f,g]=C.computeOutAndReduceShapes(u.shape,m),y=w.sizeFromShape(g),b=u;u.dtype!=="float32"&&(b=Qu({backend:t,inputs:{x:u},attrs:{dtype:"float32"}}),l=t.dataIdMap.get(b.dataId).id);let x=t.makeOutput(f,"float32");if(w.sizeFromShape(u.shape)!==0){let v=t.dataIdMap.get(x.dataId).id;UE(l,y,v)}if(h&&t.disposeData(p.dataId),s){let v=C.expandShapeToKeepDim(x.shape,c);x.shape=v}return u.dtype!=="float32"&&t.disposeData(b.dataId),x}var koe={kernelName:Hi,backendName:"wasm",setupFunc:voe,kernelFunc:woe},GE;function Ioe(e){GE=e.wasm.cwrap(ji,null,["number","number","number","number"])}function Soe(e){let{backend:t,inputs:n,attrs:a}=e,{axis:r,keepDims:s}=a,{x:i}=n,o=t.dataIdMap.get(i.dataId).id,l=o,u=i,{transposed:p,axes:d,originalAxes:c,inputWasTransposed:h}=Ts(i,r,t);if(h){let x=t.dataIdMap.get(p.dataId).id;x!==o&&(u=p,l=x)}let m=u.shape.length;C.assertAxesAreInnerMostDims("min",d,m);let[f,g]=C.computeOutAndReduceShapes(u.shape,d),y=w.sizeFromShape(g),b=t.makeOutput(f,u.dtype);if(w.sizeFromShape(u.shape)!==0){let x=t.dataIdMap.get(b.dataId).id;GE(l,$t[i.dtype],y,x)}if(h&&t.disposeData(p.dataId),s){let x=C.expandShapeToKeepDim(b.shape,c);b.shape=x}return b}var Noe={kernelName:ji,backendName:"wasm",setupFunc:Ioe,kernelFunc:Soe},Toe=!1,Coe=cn(qi,Toe),_x;(function(e){e[e.reflect=0]="reflect",e[e.symmetric=1]="symmetric"})(_x||(_x={}));var HE;function _oe(e){HE=e.wasm.cwrap(Ki,null,["number","array","number","number","array","array","number","number"])}function Eoe(e){let{inputs:{x:t},backend:n,attrs:{paddings:a,mode:r}}=e,s=a.map((m,f)=>m[0]+t.shape[f]+m[1]),i=n.dataIdMap.get(t.dataId).id,o=n.makeOutput(s,t.dtype),l=n.dataIdMap.get(o.dataId).id,u=new Uint8Array(new Int32Array(t.shape).buffer),p=a.map(m=>m[0]),d=a.map(m=>m[1]),c=new Uint8Array(new Int32Array(p).buffer),h=new Uint8Array(new Int32Array(d).buffer);return HE(i,u,t.shape.length,$t[t.dtype],c,h,_x[r],l),o}var Aoe={kernelName:Ki,backendName:"wasm",kernelFunc:Eoe,setupFunc:_oe},$oe=!0,Foe=cn(Xi,$oe),Doe=rn(lu);function p1(e,t){let n=new Int32Array(e.wasm.HEAPU8.buffer,t,4),a=n[0],r=n[1],s=n[2],i=n[3];return e.wasm._free(t),{pSelectedIndices:a,selectedSize:r,pSelectedScores:s,pValidOutputs:i}}var jE;function Roe(e){jE=e.wasm.cwrap(pu,"number",["number","number","number","number","number"])}function Moe(e){let{backend:t,inputs:n,attrs:a}=e,{iouThreshold:r,maxOutputSize:s,scoreThreshold:i}=a,{boxes:o,scores:l}=n,u=t.dataIdMap.get(o.dataId).id,p=t.dataIdMap.get(l.dataId).id,d=jE(u,p,s,r,i),{pSelectedIndices:c,selectedSize:h,pSelectedScores:m,pValidOutputs:f}=p1(t,d);return t.wasm._free(m),t.wasm._free(f),t.makeOutput([h],"int32",c)}var Poe={kernelName:pu,backendName:"wasm",setupFunc:Roe,kernelFunc:Moe},qE;function Ooe(e){qE=e.wasm.cwrap(cu,"number",["number","number","number","number","number","bool"])}function Loe(e){let{backend:t,inputs:n,attrs:a}=e,{iouThreshold:r,maxOutputSize:s,scoreThreshold:i,padToMaxOutputSize:o}=a,{boxes:l,scores:u}=n,p=t.dataIdMap.get(l.dataId).id,d=t.dataIdMap.get(u.dataId).id,c=qE(p,d,s,r,i,o),{pSelectedIndices:h,selectedSize:m,pSelectedScores:f,pValidOutputs:g}=p1(t,c);t.wasm._free(f);let y=t.makeOutput([m],"int32",h),b=t.makeOutput([],"int32",g);return[y,b]}var zoe={kernelName:cu,backendName:"wasm",setupFunc:Ooe,kernelFunc:Loe},KE;function Boe(e){KE=e.wasm.cwrap(du,"number",["number","number","number","number","number","number"])}function Woe(e){let{backend:t,inputs:n,attrs:a}=e,{iouThreshold:r,maxOutputSize:s,scoreThreshold:i,softNmsSigma:o}=a,{boxes:l,scores:u}=n,p=t.dataIdMap.get(l.dataId).id,d=t.dataIdMap.get(u.dataId).id,c=KE(p,d,s,r,i,o),{pSelectedIndices:h,selectedSize:m,pSelectedScores:f,pValidOutputs:g}=p1(t,c);t.wasm._free(g);let y=t.makeOutput([m],"int32",h),b=t.makeOutput([m],"float32",f);return[y,b]}var Voe={kernelName:du,backendName:"wasm",setupFunc:Boe,kernelFunc:Woe},Uoe=!1,Goe=cn(uu,Uoe,"bool"),XE;function Hoe(e){XE=e.wasm.cwrap(Yi,null,["number","number","number","number","number"])}function joe(e){let{inputs:t,backend:n,attrs:a}=e,{indices:r}=t,{depth:s,onValue:i,offValue:o}=a,l=n.makeOutput([...r.shape,s],"int32"),u=n.dataIdMap.get(l.dataId).id,p=n.dataIdMap.get(r.dataId).id;return XE(p,s,i,o,u),l}var qoe={kernelName:Yi,backendName:"wasm",setupFunc:Hoe,kernelFunc:joe};function Koe(e){let{inputs:{x:t},backend:n}=e,a=n.makeOutput(t.shape,t.dtype);return n.typedArrayFromHeap(a).fill(1),a}var Xoe={kernelName:hu,backendName:"wasm",kernelFunc:Koe};function Yoe(e){let{inputs:t,backend:n,attrs:a}=e,{axis:r}=a;if(t.length===1)return Cx({inputs:{input:t[0]},backend:n,attrs:{dim:r}});let s=t[0].shape,i=t[0].dtype;t.forEach(p=>{w.assertShapesMatch(s,p.shape,"All tensors passed to stack must have matching shapes"),w.assert(i===p.dtype,()=>"All tensors passed to stack must have matching dtypes")});let o=[],l=t.map(p=>{let d=Cx({inputs:{input:p},backend:n,attrs:{dim:r}});return o.push(d),d}),u=NE({inputs:l,backend:n,attrs:{axis:r}});return o.forEach(p=>n.disposeData(p.dataId)),u}var Joe={kernelName:mu,backendName:"wasm",kernelFunc:Yoe},YE;function Zoe(e){YE=e.wasm.cwrap(Ji,null,["number","array","number","number","array","array","number","number"])}function Qoe(e){let{inputs:{x:t},backend:n,attrs:{paddings:a,constantValue:r}}=e,s=a.map((m,f)=>m[0]+t.shape[f]+m[1]);if(w.sizeFromShape(t.shape)===0)return DE({backend:n,attrs:{shape:s,value:r,dtype:t.dtype}});let i=n.dataIdMap.get(t.dataId).id,o=n.makeOutput(s,t.dtype),l=n.dataIdMap.get(o.dataId).id,u=new Uint8Array(new Int32Array(t.shape).buffer),p=a.map(m=>m[0]),d=a.map(m=>m[1]),c=new Uint8Array(new Int32Array(p).buffer),h=new Uint8Array(new Int32Array(d).buffer);return YE(i,u,t.shape.length,$t[t.dtype],c,h,r,l),o}var JE={kernelName:Ji,backendName:"wasm",kernelFunc:Qoe,setupFunc:Zoe},ele=!1,tle=cn(Zi,ele),ZE;function nle(e){ZE=e.wasm.cwrap(Qi,null,["number","number","number"])}function ale(e){let{inputs:t,backend:n}=e,{x:a,alpha:r}=t,s=n.dataIdMap.get(a.dataId).id,i=n.dataIdMap.get(r.dataId).id,o=s,l=a,u=l;l.dtype!=="float32"&&(u=Qu({backend:n,inputs:{x:a},attrs:{dtype:"float32"}}),o=n.dataIdMap.get(u.dataId).id);let p=n.makeOutput(a.shape,"float32"),d=n.dataIdMap.get(p.dataId).id;return ZE(o,i,d),l.dtype!=="float32"&&n.disposeData(u.dataId),p}var rle={kernelName:Qi,backendName:"wasm",setupFunc:nle,kernelFunc:ale},QE;function sle(e){QE=e.wasm.cwrap(eo,null,["number","number","number","number"])}function ile(e){let{backend:t,inputs:n,attrs:a}=e,{axis:r,keepDims:s}=a,{x:i}=n,o=t.dataIdMap.get(i.dataId).id,l=o,u=i,{transposed:p,axes:d,originalAxes:c,inputWasTransposed:h}=Ts(i,r,t),m=d;if(h){let x=t.dataIdMap.get(p.dataId).id;x!==o&&(u=p,l=x,m=C.getInnerMostAxes(m.length,u.shape.length))}C.assertAxesAreInnerMostDims("prod",m,u.shape.length);let[f,g]=C.computeOutAndReduceShapes(u.shape,m),y=w.sizeFromShape(g),b=t.makeOutput(f,u.dtype);if(w.sizeFromShape(u.shape)!==0){let x=t.dataIdMap.get(b.dataId).id;QE(l,y,$t[b.dtype],x)}if(h&&t.disposeData(p.dataId),s){let x=C.expandShapeToKeepDim(b.shape,c);b.shape=x}return b}var ole={kernelName:eo,backendName:"wasm",setupFunc:sle,kernelFunc:ile},lle=e=>{let{backend:t,attrs:n}=e,{start:a,stop:r,step:s,dtype:i}=n,o=V0(a,r,s,i),l=t.makeOutput([o.length],i);return t.typedArrayFromHeap(l).set(o),l},ule={kernelName:Sc,backendName:"wasm",kernelFunc:lle},ple=!0,cle=cn(Fi,ple),dle=rn(to),hle=rn(ro),eA;function mle(e){eA=e.wasm.cwrap(ao,null,["number","number","number","number","number","number","number","number","number","number"])}function fle(e){let{backend:t,inputs:n,attrs:a}=e,{images:r}=n,{alignCorners:s,halfPixelCenters:i,size:o}=a,[l,u]=o,[p,d,c,h]=r.shape,m=[p,l,u,h],f=t.dataIdMap.get(r.dataId),g;f.dtype!=="float32"&&(g=Qu({backend:t,inputs:{x:r},attrs:{dtype:"float32"}}),f=t.dataIdMap.get(g.dataId));let y=f.id,b=t.makeOutput(m,"float32");if(w.sizeFromShape(r.shape)===0)return b;let x=t.dataIdMap.get(b.dataId).id;return eA(y,p,d,c,h,l,u,s?1:0,i?1:0,x),g!=null&&t.disposeData(g.dataId),b}var gle={kernelName:ao,backendName:"wasm",setupFunc:mle,kernelFunc:fle},tA;function yle(e){tA=e.wasm.cwrap(no,null,["number","number","number","number","number","number","number","number","number","number"])}function ble(e){let{backend:t,inputs:n,attrs:a}=e,{images:r}=n,{alignCorners:s,halfPixelCenters:i,size:o}=a,[l,u]=o,[p,d,c,h]=r.shape,m=[p,l,u,h],f=t.makeOutput(m,"float32");if(w.sizeFromShape(r.shape)===0)return f;let g=t.dataIdMap.get(r.dataId),y;g.dtype!=="float32"&&(y=Qu({backend:t,inputs:{x:r},attrs:{dtype:"float32"}}),g=t.dataIdMap.get(y.dataId));let b=g.id,x=t.dataIdMap.get(f.dataId).id;return tA(b,p,d,c,h,l,u,s?1:0,i?1:0,x),y!=null&&t.disposeData(y.dataId),f}var xle={kernelName:no,backendName:"wasm",setupFunc:yle,kernelFunc:ble},nA;function vle(e){nA=e.wasm.cwrap(so,null,["number","array","number","array","number","number"])}function wle(e){let{inputs:t,backend:n,attrs:a}=e,{x:r}=t,{dims:s}=a,i=w.parseAxisParam(s,r.shape);if(r.shape.length===0)return ng({inputs:{x:r},backend:n});let o=n.makeOutput(r.shape,r.dtype),l=n.dataIdMap.get(r.dataId).id,u=n.dataIdMap.get(o.dataId).id,p=new Uint8Array(new Int32Array(i).buffer),d=new Uint8Array(new Int32Array(r.shape).buffer);nA(l,p,i.length,d,r.shape.length,u);let c=Vn({inputs:{x:o},attrs:{shape:r.shape},backend:n});return n.disposeData(o.dataId),c}var kle={kernelName:so,backendName:"wasm",kernelFunc:wle,setupFunc:vle},aA;function Ile(e){aA=e.wasm.cwrap(Fu,null,["number","number","number","number","number","number","number","number","array","number","number"])}function Sle(e){let{inputs:t,backend:n,attrs:a}=e,{image:r}=t,{radians:s,fillValue:i,center:o}=a,l=n.makeOutput(r.shape,r.dtype),u=n.dataIdMap.get(r.dataId).id,p=n.dataIdMap.get(l.dataId).id,[d,c,h,m]=r.shape,[f,g]=C.getImageCenter(o,c,h),y=i===0,b=255,x=typeof i=="number"?[i,i,i,y?0:b]:[...i,b],v=new Uint8Array(new Int32Array(x).buffer);return aA(u,d,c,h,m,s,f,g,v,x.length,p),l}var Nle={kernelName:Fu,backendName:"wasm",kernelFunc:Sle,setupFunc:Ile},Tle=rn(io),Cle=rn(oo),rA;function _le(e){rA=e.wasm.cwrap(yu,null,["number","number","number","number","number","number","array","number","number"])}function Ele(e){let{backend:t,inputs:n,attrs:a}=e,{indices:r,updates:s}=n,{shape:i}=a,o=t.makeOutput(i,s.dtype);if(w.sizeFromShape(i)===0)return o;let{sliceRank:l,numUpdates:u,sliceSize:p,strides:d,outputSize:c}=Xx.calculateShapes(s,r,i),h=t.dataIdMap.get(r.dataId).id,m=t.dataIdMap.get(s.dataId).id,f=new Uint8Array(new Int32Array(d).buffer),g=t.dataIdMap.get(o.dataId).id;return rA(h,m,$t[s.dtype],l,u,p,f,c,g),o}var Ale={kernelName:yu,backendName:"wasm",setupFunc:_le,kernelFunc:Ele},sA;function $le(e){sA=e.wasm.cwrap("SelectV2",null,["number","number","number","number","number"])}function Fle(e){let{inputs:t,backend:n}=e,{condition:a,t:r,e:s}=t,i=n.dataIdMap.get(a.dataId).id,o=n.dataIdMap.get(r.dataId).id,l=n.dataIdMap.get(s.dataId).id,u=n.makeOutput(r.shape,r.dtype),p=n.dataIdMap.get(u.dataId).id,d=a.shape.length,c=r.shape.length,h=d===0||d>1||c===1?1:w.sizeFromShape(r.shape.slice(1));return sA(i,o,l,h,p),u}var Dle={kernelName:bu,backendName:"wasm",kernelFunc:Fle,setupFunc:$le},iA;function Rle(e){iA=e.wasm.cwrap(uo,null,["number","number"])}function Mle(e){let{backend:t,inputs:{x:n}}=e,a=t.dataIdMap.get(n.dataId).id,r=t.makeOutput(n.shape,n.dtype),s=t.dataIdMap.get(r.dataId).id;return w.sizeFromShape(r.shape)===0||iA(a,s),r}var Ple={kernelName:"Sigmoid",backendName:"wasm",setupFunc:Rle,kernelFunc:Mle},Ole=rn(lo),oA;function Lle(e){oA=e.wasm.cwrap(ho,null,["number","number","number","number"])}function zle(e){let{backend:t,inputs:{logits:n},attrs:{dim:a}}=e,r=t.dataIdMap.get(n.dataId).id,s=t.makeOutput(n.shape,n.dtype),i=t.dataIdMap.get(s.dataId).id,o=n.shape[a],l=w.sizeFromShape(n.shape)/o;return w.sizeFromShape(s.shape)===0||oA(r,i,o,l),s}var Ble={kernelName:ho,backendName:"wasm",setupFunc:Lle,kernelFunc:zle};function Wle(e){let{inputs:t,backend:n,attrs:a}=e,{x:r}=t,{blockShape:s,paddings:i}=a,o=w.sizeFromShape(s),l=[[0,0]];l.push(...i);for(let g=1+s.length;g0?l+1:0;if(u<0)throw new Error(C.getSparseSegmentReductionNegativeSegmentIdsErrorMessage());let p=r.shape.slice();p[0]=u;let d=n.dataIdMap.get(r.dataId).id,c=n.dataIdMap.get(s.dataId).id,h=n.dataIdMap.get(i.dataId).id,m=n.makeOutput(p,r.dtype),f=n.dataIdMap.get(m.dataId).id,g=n.makeOutput([4],"int32"),y=n.dataIdMap.get(g.dataId).id;pA(d,$t[r.dtype],r.shape[0],c,h,f,y,t,0);let b=n.readSync(g.dataId),x;switch(b[0]){case 0:{x=C.getSparseSegmentReductionNegativeSegmentIdsErrorMessage();break}case 1:{x=C.getSparseSegmentReductionNonIncreasingSegmentIdsErrorMessage();break}case 2:x=C.getSparseSegmentReductionSegmentIdOutOfRangeErrorMessage(b[1],b[2]);break;case 3:x=C.getSparseSegmentReductionIndicesOutOfRangeErrorMessage(b[1],b[2],b[3]);break;default:x=""}if(n.disposeData(g.dataId),x)throw n.disposeData(m.dataId),new Error(x);return m}function Xle(e){return dA(e,!0)}var Yle={kernelName:Tc,backendName:"wasm",setupFunc:cA,kernelFunc:Xle};function Jle(e){return dA(e,!1)}var Zle={kernelName:Cc,backendName:"wasm",setupFunc:cA,kernelFunc:Jle};function Qle(e){let{inputs:t,attrs:n,backend:a}=e,{x:r}=t,{numOrSizeSplits:s,axis:i}=n,o=w.parseAxisParam(i,r.shape)[0],l=C.prepareSplitSize(r,s,o),u=new Array(r.shape.length).fill(0),p=r.shape.slice();return l.map(d=>{let c=[...p];c[o]=d;let h=bi({inputs:{x:r},attrs:{begin:u,size:c},backend:a});return u[o]+=d,h})}var eue={kernelName:Nu,backendName:"wasm",kernelFunc:Qle},tue=rn(po),nue=rn(_c),aue=!0,rue=cn(mo,aue),hA;function sue(e){hA=e.wasm.cwrap(fs,null,["number","number","number","number"])}function iue(e){let{backend:t,inputs:n,attrs:a}=e,{alpha:r}=a,{x:s}=n,i=t.dataIdMap.get(s.dataId).id,o=t.makeOutput(s.shape,s.dtype),l=t.dataIdMap.get(o.dataId).id;return hA(i,r,$t[s.dtype],l),o}var oue={kernelName:fs,backendName:"wasm",setupFunc:sue,kernelFunc:iue},mA;function lue(e){mA=e.wasm.cwrap(Cu,null,["number","array","number","array","array","array","array","array","number","number"])}function uue(e){let{backend:t,inputs:n,attrs:a}=e,{x:r}=n,{begin:s,end:i,strides:o,beginMask:l,endMask:u,ellipsisMask:p,newAxisMask:d,shrinkAxisMask:c}=a,{finalShapeSparse:h,finalShape:m,isIdentity:f,sliceDim0:g,isSimpleSlice:y,begin:b,end:x,strides:v}=qt.sliceInfo(r.shape,s,i,o,l,u,p,d,c),I;if(f)I=Vn({inputs:{x:r},backend:t,attrs:{shape:m}});else if(g||y){w.assert(r.shape.length>=1,()=>`Input must have rank at least 1, got: ${r.shape.length}`);let T=qt.computeOutShape(b,x,v),_=bi({inputs:{x:r},backend:t,attrs:{begin:b,size:T}});I=Vn({inputs:{x:_},backend:t,attrs:{shape:m}}),t.disposeData(_.dataId)}else{let T=t.makeOutput(h,"float32"),_=t.dataIdMap.get(r.dataId).id,A=new Uint8Array(new Int32Array(w.computeStrides(r.shape)).buffer),F=new Uint8Array(new Int32Array(b).buffer),P=new Uint8Array(new Int32Array(x).buffer),$=new Uint8Array(new Int32Array(v).buffer),S=new Uint8Array(new Int32Array(h).buffer),M=new Uint8Array(new Int32Array(w.computeStrides(h)).buffer),U=t.dataIdMap.get(T.dataId).id;mA(_,A,r.shape.length,F,P,$,S,M,h.length,U),I=Vn({inputs:{x:T},backend:t,attrs:{shape:m}}),t.disposeData(T.dataId)}return I}var pue={kernelName:Cu,backendName:"wasm",setupFunc:lue,kernelFunc:uue};function cue(e){let{backend:t,inputs:n,attrs:a}=e,{data:r,dataSplits:s}=n,{separator:i,nGramWidths:o,leftPad:l,rightPad:u,padWidth:p,preserveShortSequences:d}=a,c=t.readSync(r.dataId),h=t.readSync(s.dataId),[m,f]=G0(c,h,i,o,l,u,p,d),g=t.makeOutput([m.length],"string"),y=t.dataIdMap.get(g.dataId);y.stringBytes=m;let b=t.makeOutput(s.shape,"int32");return t.typedArrayFromHeap(b).set(f),[g,b]}var due={kernelName:Ec,backendName:"wasm",kernelFunc:cue};function hue(e){let{backend:t,inputs:n,attrs:a}=e,{input:r,delimiter:s}=n,{skipEmpty:i}=a,o=t.readSync(r.dataId),l=t.readSync(s.dataId),[u,p,d]=H0(o,l[0],i),c=p.length,h=t.makeOutput([c,2],"int32");t.typedArrayFromHeap(h).set(u);let m=t.makeOutput([c],"string"),f=t.dataIdMap.get(m.dataId);f.stringBytes=p;let g=t.makeOutput([2],"int32");return t.typedArrayFromHeap(g).set(d),[h,m,g]}var mue={kernelName:Ac,backendName:"wasm",kernelFunc:hue};function fue(e){let{backend:t,inputs:n,attrs:a}=e,{input:r}=n,{numBuckets:s}=a,i=t.readSync(r.dataId),o=j0(i,s),l=t.makeOutput(r.shape,"int32");return t.typedArrayFromHeap(l).set(o),l}var gue={kernelName:$c,backendName:"wasm",kernelFunc:fue},yue=!0,bue=cn(fo,yue),fA;function xue(e){fA=e.wasm.cwrap(co,null,["number","number","number","number"])}function vue(e){let{backend:t,inputs:n,attrs:a}=e,{axis:r,keepDims:s}=a,{x:i}=n,o=t.dataIdMap.get(i.dataId).id,l=o,u=i,{transposed:p,axes:d,originalAxes:c,inputWasTransposed:h}=Ts(i,r,t),m=d;if(h){let x=t.dataIdMap.get(p.dataId).id;x!==o&&(u=p,l=x,m=C.getInnerMostAxes(m.length,u.shape.length))}C.assertAxesAreInnerMostDims("sum",m,u.shape.length);let[f,g]=C.computeOutAndReduceShapes(u.shape,m),y=w.sizeFromShape(g),b=t.makeOutput(f,u.dtype);if(w.sizeFromShape(u.shape)!==0){let x=t.dataIdMap.get(b.dataId).id;fA(l,y,$t[b.dtype],x)}if(h&&t.disposeData(p.dataId),s){let x=C.expandShapeToKeepDim(b.shape,c);b.shape=x}return b}var wue={kernelName:co,backendName:"wasm",setupFunc:xue,kernelFunc:vue},kue=rn(go),Iue=rn(yo),gA;function Sue(e){gA=e.wasm.cwrap(ms,null,["number","array","number","array","number","number"])}function Nue(e){let{inputs:t,backend:n,attrs:a}=e,{x:r}=t,s=n.dataIdMap.get(r.dataId).id,{reps:i}=a,o=new Array(r.shape.length);for(let c=0;c{let{x:a}=e,{k:r,sorted:s}=n,i=t.dataIdMap.get(a.dataId).id,o=new Uint8Array(new Int32Array(a.shape).buffer),l=a.shape.slice();l[l.length-1]=r;let u=t.makeOutput(l,a.dtype),p=t.dataIdMap.get(u.dataId).id,d=t.makeOutput(l,"int32"),c=t.dataIdMap.get(d.dataId).id;return yA(i,o,a.shape.length,$t[a.dtype],r,s,p,c),[u,d]},Eue={kernelName:_u,backendName:"wasm",setupFunc:Cue,kernelFunc:_ue},bA;function Aue(e){bA=e.wasm.cwrap(Eu,null,["number","number","bool","number","number","number","number","number","number","array","number","number","number","number","number"])}function $ue(e){let{backend:t,inputs:n,attrs:a}=e,{image:r,transforms:s}=n,{interpolation:i,fillMode:o,fillValue:l,outputShape:u}=a,[p,d,c,h]=r.shape,[m,f]=u!=null?u:[d,c],g=[p,m,f,h],y=new Uint8Array(new Int32Array(w.computeStrides(r.shape)).buffer),b=t.makeOutput(g,r.dtype),x=t.dataIdMap.get(b.dataId).id,v=t.dataIdMap.get(r.dataId).id,I=t.dataIdMap.get(s.dataId).id,T=i==="nearest"?1:2,_;switch(o){case"constant":_=1;break;case"reflect":_=2;break;case"wrap":_=3;break;case"nearest":_=4;break;default:_=1;break}return bA(v,I,s.shape[0]>1,p,m,f,h,c,d,y,r.shape.length-1,T,_,l,x),b}var Fue={kernelName:Eu,backendName:"wasm",setupFunc:Aue,kernelFunc:$ue};function Due(e){let{inputs:t,backend:n,attrs:a}=e,{value:r}=t,{axis:s}=a;s<0&&(s+=r.shape.length);let i=r.shape[s],o=r.shape.length,l=new Array(o-1),u=0;for(let h=0;h({dataId:h,dtype:m,shape:l}))}var Rue={kernelName:Au,backendName:"wasm",kernelFunc:Due};function Mue(e){let{inputs:{x:t},backend:n}=e,a=n.makeOutput(t.shape,t.dtype);return n.typedArrayFromHeap(a).fill(0),a}var Pue={kernelName:$u,backendName:"wasm",kernelFunc:Mue},Oue=[cse,dse,mse,yse,Nse,_se,$se,Rse,Lse,Gse,Hse,jse,Xse,Yse,Qse,nie,aie,rie,oie,pie,hie,gie,xie,vie,kie,Iie,Sie,Nie,_ie,Eie,$ie,Rie,Oie,Bie,Uie,jie,Kie,Yie,bse,Qie,toe,aoe,roe,ioe,ooe,uoe,coe,moe,goe,xoe,koe,Noe,Coe,Aoe,Foe,Doe,Poe,zoe,Voe,Goe,qoe,Xoe,Joe,JE,tle,rle,ole,ule,cle,dle,hle,Mse,gle,xle,kle,Nle,Tle,Cle,Ale,Dle,Ple,Ole,Vse,Ble,Vle,Hle,Kle,Yle,Zle,eue,tue,nue,rue,oue,pue,due,mue,gue,bue,wue,kue,Iue,Tue,Eue,Fue,kse,Rue,Pue];for(let e of Oue)Dc(e);var Ex=X();Ex.registerFlag("WASM_HAS_SIMD_SUPPORT",async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,9,1,7,0,65,0,253,15,26,11])));Ex.registerFlag("WASM_HAS_MULTITHREAD_SUPPORT",async()=>{if(Ex.get("IS_NODE"))return!1;try{return new MessageChannel().port1.postMessage(new SharedArrayBuffer(1)),WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,5,4,1,3,1,1,10,11,1,9,0,65,0,254,16,2,0,26,11]))}catch(e){return!1}});var kI=ps(PF()),Lue=ps(OF()),II=ps(LF()),SI=kI.default||kI,zue=II.default||II,xA=class extends fc{constructor(e){super(),this.wasm=e,this.dataIdNextNumber=1,this.wasm.tfjs.initWithThreadsCount(vA),Ax=this.wasm.tfjs.getThreadsCount(),this.dataIdMap=new pm(this,ar())}write(e,t,n){let a={id:this.dataIdNextNumber++};return this.move(a,e,t,n,1),a}numDataIds(){return this.dataIdMap.numDataIds()}async time(e){let t=w.now();return e(),{kernelMs:w.now()-t}}move(e,t,n,a,r){let s=this.dataIdNextNumber++;if(a==="string"){let u=t;this.dataIdMap.set(e,{id:s,stringBytes:u,shape:n,dtype:a,memoryOffset:null,refCount:r});return}let i=w.sizeFromShape(n),o=i*w.bytesPerElement(a),l=this.wasm._malloc(o);this.dataIdMap.set(e,{id:s,memoryOffset:l,shape:n,dtype:a,refCount:r}),this.wasm.tfjs.registerTensor(s,i,l),t!=null&&this.wasm.HEAPU8.set(new Uint8Array(t.buffer,t.byteOffset,o),l)}async read(e){return this.readSync(e)}readSync(e,t,n){let{memoryOffset:a,dtype:r,shape:s,stringBytes:i}=this.dataIdMap.get(e);if(r==="string")return(t==null||t===0)&&(n==null||n>=i.length)?i:i.slice(t,n);t=t||0,n=n||w.sizeFromShape(s);let o=w.bytesPerElement(r),l=this.wasm.HEAPU8.slice(a+t*o,a+n*o);return Vue(l.buffer,r)}disposeData(e,t=!1){if(this.dataIdMap.has(e)){let n=this.dataIdMap.get(e);if(n.refCount--,!t&&n.refCount>0)return!1;this.wasm._free(n.memoryOffset),this.wasm.tfjs.disposeData(n.id),this.dataIdMap.delete(e)}return!0}refCount(e){return this.dataIdMap.has(e)?this.dataIdMap.get(e).refCount:0}incRef(e){let t=this.dataIdMap.get(e);t!=null&&t.refCount++}floatPrecision(){return 32}getMemoryOffset(e){return this.dataIdMap.get(e).memoryOffset}dispose(){this.wasm.tfjs.dispose(),"PThread"in this.wasm&&this.wasm.PThread.terminateAllThreads(),this.wasm=null}memory(){return{unreliable:!1}}makeOutput(e,t,n){let a;if(n==null)a=this.write(null,e,t);else{let r=this.dataIdNextNumber++;a={id:r},this.dataIdMap.set(a,{id:r,memoryOffset:n,shape:e,dtype:t,refCount:1});let s=w.sizeFromShape(e);this.wasm.tfjs.registerTensor(r,s,n)}return{dataId:a,shape:e,dtype:t}}typedArrayFromHeap({shape:e,dtype:t,dataId:n}){let a=this.wasm.HEAPU8.buffer,{memoryOffset:r}=this.dataIdMap.get(n),s=w.sizeFromShape(e);switch(t){case"float32":return new Float32Array(a,r,s);case"int32":return new Int32Array(a,r,s);case"bool":return new Uint8Array(a,r,s);default:throw new Error(`Unknown dtype ${t}`)}}};function Bue(e){return(t,n)=>(w.fetch(e,{credentials:"same-origin"}).then(a=>{a.ok||t.env.a(`failed to load wasm binary file at '${e}'`),a.arrayBuffer().then(r=>{WebAssembly.instantiate(r,t).then(s=>{n(s.instance,s.module)})})}),{})}function NI(e,t,n){if(lm!=null)return lm;let a="tfjs-backend-wasm.wasm";return e&&t?a="tfjs-backend-wasm-threaded-simd.wasm":e&&(a="tfjs-backend-wasm-simd.wasm"),Jp!=null&&Jp[a]!=null?Jp[a]:n+a}async function Wue(){let[e,t]=await Promise.all([X().getAsync("WASM_HAS_SIMD_SUPPORT"),X().getAsync("WASM_HAS_MULTITHREAD_SUPPORT")]);return new Promise((n,a)=>{let r={};r.locateFile=(o,l)=>{if(o.endsWith(".worker.js")){let u=Lue.wasmWorkerContents.replace(/\n/g,"\\n"),p=new Blob([u],{type:"application/javascript"});return URL.createObjectURL(p)}return o.endsWith(".wasm")?NI(e,t,Kp!=null?Kp:l):l+o},c1&&(r.instantiateWasm=Bue(NI(e,t,Kp!=null?Kp:"")));let s=!1;r.onAbort=()=>{s||Zp||(Zp=!0,a({message:"Make sure the server can serve the `.wasm` file relative to the bundled js file. For more details see https://github.com/tensorflow/tfjs/blob/master/tfjs-backend-wasm/README.md#using-bundlers"}))};let i;t&&e&&lm==null?(r.mainScriptUrlOrBlob=new Blob(["var WasmBackendModuleThreadedSimd = "+SI.toString()],{type:"text/javascript"}),i=SI(r)):i=zue(r),i.then(o=>{s=!0,Zp=!1;let l=null;o.tfjs={init:o.cwrap("init",null,[]),initWithThreadsCount:o.cwrap("init_with_threads_count",null,["number"]),getThreadsCount:o.cwrap("get_threads_count","number",[]),registerTensor:o.cwrap("register_tensor",null,["number","number","number"]),disposeData:o.cwrap("dispose_data",l,["number"]),dispose:o.cwrap("dispose",l,[])},n({wasm:o})}).catch(a)})}function Vue(e,t){switch(t){case"float32":return new Float32Array(e);case"int32":return new Int32Array(e);case"bool":return new Uint8Array(e);default:throw new Error(`Unknown dtype ${t}`)}}var Uue=["tfjs-backend-wasm.wasm","tfjs-backend-wasm-simd.wasm","tfjs-backend-wasm-threaded-simd.wasm"],lm=null,Kp=null,Jp={},Zp=!1,c1=!1;function Gue(e,t=!1){if(qx("setWasmPath has been deprecated in favor of setWasmPaths and will be removed in a future release."),Zp)throw new Error("The WASM backend was already initialized. Make sure you call `setWasmPath()` before you call `tf.setBackend()` or `tf.ready()`");lm=e,c1=t}function Hue(e,t=!1){if(Zp)throw new Error("The WASM backend was already initialized. Make sure you call `setWasmPaths()` before you call `tf.setBackend()` or `tf.ready()`");if(typeof e=="string")Kp=e;else{Jp=e;let n=Uue.filter(a=>Jp[a]==null);if(n.length>0)throw new Error(`There were no entries found for the following binaries: ${n.join(",")}. Please either call setWasmPaths with a map providing a path for each binary, or with a string indicating the directory where all the binaries can be found.`)}c1=t}var vA=-1,Ax=-1;function jue(e){vA=e}function que(){if(Ax===-1)throw new Error("WASM backend not initialized.");return Ax}var Kue="3.19.0",Xue=2;Gm("wasm",async()=>{let{wasm:e}=await Wue();return new xA(e)},Xue);var Yue="3.19.0",Jue="3.19.0",Zue="3.19.0",Que="3.19.0",epe="3.19.0",tpe="3.19.0",npe="3.19.0",ape="3.19.0",rpe={tfjs:Yue,"tfjs-core":Jue,"tfjs-data":Zue,"tfjs-layers":Que,"tfjs-converter":epe,"tfjs-backend-cpu":tpe,"tfjs-backend-webgl":npe,"tfjs-backend-wasm":ape};var WA={};yb(WA,{AnchorPosition:()=>v1,DrawBox:()=>xd,DrawBoxOptions:()=>og,DrawFaceLandmarks:()=>xg,DrawFaceLandmarksOptions:()=>bg,DrawTextField:()=>Or,DrawTextFieldOptions:()=>ip,drawContour:()=>Dr,drawDetections:()=>cpe,drawFaceExpressions:()=>dpe,drawFaceLandmarks:()=>mpe});function Dr(e,t,n=!1){if(e.beginPath(),t.slice(1).forEach(({x:a,y:r},s)=>{let i=t[s];e.moveTo(i.x,i.y),e.lineTo(a,r)}),n){let a=t[t.length-1],r=t[0];if(!a||!r)return;e.moveTo(a.x,a.y),e.lineTo(r.x,r.y)}e.stroke()}var wA={};yb(wA,{computeReshapedDimensions:()=>m1,getCenterPoint:()=>Ao,isDimensions:()=>rg,isEven:()=>ag,isFloat:()=>h1,isTensor:()=>_o,isTensor1D:()=>spe,isTensor2D:()=>d1,isTensor3D:()=>Rr,isTensor4D:()=>ba,isValidNumber:()=>er,isValidProbablitiy:()=>ep,range:()=>gr,round:()=>Eo});var $n=class{constructor(t,n){if(!er(t)||!er(n))throw new Error(`Dimensions.constructor - expected width and height to be valid numbers, instead have ${JSON.stringify({width:t,height:n})}`);this._width=t,this._height=n}get width(){return this._width}get height(){return this._height}reverse(){return new $n(1/this.width,1/this.height)}};function _o(e,t){return e instanceof Ae&&e.shape.length===t}function spe(e){return _o(e,1)}function d1(e){return _o(e,2)}function Rr(e){return _o(e,3)}function ba(e){return _o(e,4)}function h1(e){return e%1!==0}function ag(e){return e%2===0}function Eo(e,t=2){let n=10**t;return Math.floor(e*n)/n}function rg(e){return e&&e.width&&e.height}function m1({width:e,height:t},n){let a=n/Math.max(t,e);return new $n(Math.round(e*a),Math.round(t*a))}function Ao(e){return e.reduce((t,n)=>t.add(n),new Oe(0,0)).div(new Oe(e.length,e.length))}function gr(e,t,n){return Array(e).fill(0).map((a,r)=>t+r*n)}function er(e){return!!e&&e!==1/0&&e!==-1/0&&!Number.isNaN(e)||e===0}function ep(e){return er(e)&&e>=0&&e<=1}var Oe=class{constructor(t,n){this._x=t,this._y=n}get x(){return this._x}get y(){return this._y}add(t){return new Oe(this.x+t.x,this.y+t.y)}sub(t){return new Oe(this.x-t.x,this.y-t.y)}mul(t){return new Oe(this.x*t.x,this.y*t.y)}div(t){return new Oe(this.x/t.x,this.y/t.y)}abs(){return new Oe(Math.abs(this.x),Math.abs(this.y))}magnitude(){return Math.sqrt(this.x**2+this.y**2)}floor(){return new Oe(Math.floor(this.x),Math.floor(this.y))}};var ct=class{static isRect(t){return!!t&&[t.x,t.y,t.width,t.height].every(er)}static assertIsValidBox(t,n,a=!1){if(!ct.isRect(t))throw new Error(`${n} - invalid box: ${JSON.stringify(t)}, expected object with properties x, y, width, height`);if(!a&&(t.width<0||t.height<0))throw new Error(`${n} - width (${t.width}) and height (${t.height}) must be positive numbers`)}constructor(t,n=!0){let a=t||{},r=[a.left,a.top,a.right,a.bottom].every(er),s=[a.x,a.y,a.width,a.height].every(er);if(!s&&!r)throw new Error(`Box.constructor - expected box to be IBoundingBox | IRect, instead have ${JSON.stringify(a)}`);let[i,o,l,u]=s?[a.x,a.y,a.width,a.height]:[a.left,a.top,a.right-a.left,a.bottom-a.top];ct.assertIsValidBox({x:i,y:o,width:l,height:u},"Box.constructor",n),this._x=i,this._y=o,this._width=l,this._height=u}get x(){return this._x}get y(){return this._y}get width(){return this._width}get height(){return this._height}get left(){return this.x}get top(){return this.y}get right(){return this.x+this.width}get bottom(){return this.y+this.height}get area(){return this.width*this.height}get topLeft(){return new Oe(this.left,this.top)}get topRight(){return new Oe(this.right,this.top)}get bottomLeft(){return new Oe(this.left,this.bottom)}get bottomRight(){return new Oe(this.right,this.bottom)}round(){let[t,n,a,r]=[this.x,this.y,this.width,this.height].map(s=>Math.round(s));return new ct({x:t,y:n,width:a,height:r})}floor(){let[t,n,a,r]=[this.x,this.y,this.width,this.height].map(s=>Math.floor(s));return new ct({x:t,y:n,width:a,height:r})}toSquare(){let{x:t,y:n,width:a,height:r}=this,s=Math.abs(a-r);return an&&(o=-d+n+a,d=n),c>t&&(l=-c+t+r,c=t),u<1&&(l=2-u,u=1),p<1&&(l=2-p,p=1),{dy:i,edy:l,dx:s,edx:o,y:p,ey:c,x:u,ex:d,w:a,h:r}}calibrate(t){return new ct({left:this.left+t.left*this.width,top:this.top+t.top*this.height,right:this.right+t.right*this.width,bottom:this.bottom+t.bottom*this.height}).toSquare().round()}};var tp=class extends ct{constructor(t,n,a,r,s=!1){super({left:t,top:n,right:a,bottom:r},s)}};var Cs=class{constructor(t,n,a,r,s){this._imageDims=new $n(s.width,s.height),this._score=t,this._classScore=n,this._className=a,this._box=new ct(r).rescale(this._imageDims)}get score(){return this._score}get classScore(){return this._classScore}get className(){return this._className}get box(){return this._box}get imageDims(){return this._imageDims}get imageWidth(){return this.imageDims.width}get imageHeight(){return this.imageDims.height}get relativeBox(){return new ct(this._box).rescale(this.imageDims.reverse())}forSize(t,n){return new Cs(this.score,this.classScore,this.className,this.relativeBox,{width:t,height:n})}};var wt=class extends Cs{constructor(t,n,a){super(t,t,"",n,a)}forSize(t,n){let{score:a,relativeBox:r,imageDims:s}=super.forSize(t,n);return new wt(a,r,s)}};function kA(e,t,n=!0){let a=Math.max(0,Math.min(e.right,t.right)-Math.max(e.left,t.left)),r=Math.max(0,Math.min(e.bottom,t.bottom)-Math.max(e.top,t.top)),s=a*r;return n?s/(e.area+t.area-s):s/Math.min(e.area,t.area)}function IA(e){let t=e.map(o=>o.x),n=e.map(o=>o.y),a=t.reduce((o,l)=>lloo({score:i,boxIndex:o})).sort((i,o)=>i.score-o.score).map(i=>i.boxIndex),s=[];for(;r.length>0;){let i=r.pop();s.push(i);let o=r,l=[];for(let u=0;ul[p]<=n)}return s}function yr(e,t){return O(()=>{let[n,a,r]=t,s=En([...e.shape.slice(0,3),1],n,"float32"),i=En([...e.shape.slice(0,3),1],a,"float32"),o=En([...e.shape.slice(0,3),1],r,"float32"),l=Qe([s,i,o],3);return ce(e,l)})}function NA(e,t=!1){return O(()=>{let[n,a]=e.shape.slice(1);if(n===a)return e;let r=Math.abs(n-a),s=Math.round(r*(t?.5:1)),i=n>a?2:1,o=c=>{let h=e.shape.slice();return h[i]=c,En(h,0,"float32")},l=o(s),u=r-l.shape[i],d=[t&&u?o(u):null,e,l].filter(c=>!!c).map(c=>le(c,"float32"));return Qe(d,i)})}function eye(e){let t=e.slice();for(let n=t.length-1;n>0;n--){let a=Math.floor(Math.random()*(n+1)),r=t[n];t[n]=t[a],t[a]=r}return t}function sg(e){return 1/(1+Math.exp(-e))}function nye(e){return Math.log(e/(1-e))}var np=class extends ct{constructor(t,n,a,r,s=!1){super({x:t,y:n,width:a,height:r},s)}};var ipe=.5,ope=.43,lpe=.45,xa=class{constructor(t,n,a=new Oe(0,0)){let{width:r,height:s}=n;this._imgDims=new $n(r,s),this._shift=a,this._positions=t.map(i=>i.mul(new Oe(r,s)).add(a))}get shift(){return new Oe(this._shift.x,this._shift.y)}get imageWidth(){return this._imgDims.width}get imageHeight(){return this._imgDims.height}get positions(){return this._positions}get relativePositions(){return this._positions.map(t=>t.sub(this._shift).div(new Oe(this.imageWidth,this.imageHeight)))}forSize(t,n){return new this.constructor(this.relativePositions,{width:t,height:n})}shiftBy(t,n){return new this.constructor(this.relativePositions,this._imgDims,new Oe(t,n))}shiftByPoint(t){return this.shiftBy(t.x,t.y)}align(t,n={}){if(t){let s=t instanceof wt?t.box.floor():new ct(t);return this.shiftBy(s.x,s.y).align(null,n)}let{useDlibAlignment:a,minBoxPadding:r}={useDlibAlignment:!1,minBoxPadding:.2,...n};return a?this.alignDlib():this.alignMinBbox(r)}alignDlib(){let t=this.getRefPointsForAlignment(),[n,a,r]=t,s=d=>r.sub(d).magnitude(),i=(s(n)+s(a))/2,o=Math.floor(i/lpe),l=Ao(t),u=Math.floor(Math.max(0,l.x-ipe*o)),p=Math.floor(Math.max(0,l.y-ope*o));return new np(u,p,Math.min(o,this.imageWidth+u),Math.min(o,this.imageHeight+p))}alignMinBbox(t){let n=IA(this.positions);return n.pad(n.width*t,n.height*t)}getRefPointsForAlignment(){throw new Error("getRefPointsForAlignment not implemented by base class")}};var TA=class extends xa{getRefPointsForAlignment(){let t=this.positions;return[t[0],t[1],Ao([t[3],t[4]])]}};var ap=class extends xa{getJawOutline(){return this.positions.slice(0,17)}getLeftEyeBrow(){return this.positions.slice(17,22)}getRightEyeBrow(){return this.positions.slice(22,27)}getNose(){return this.positions.slice(27,36)}getLeftEye(){return this.positions.slice(36,42)}getRightEye(){return this.positions.slice(42,48)}getMouth(){return this.positions.slice(48,68)}getRefPointsForAlignment(){return[this.getLeftEye(),this.getRightEye(),this.getMouth()].map(Ao)}};var gd=class{constructor(t,n){this._label=t,this._distance=n}get label(){return this._label}get distance(){return this._distance}toString(t=!0){return`${this.label}${t?` (${Eo(this.distance)})`:""}`}};var yd=class extends ct{constructor(n,a){super(n);this._label=a}static assertIsValidLabeledBox(n,a){if(ct.assertIsValidBox(n,a),!er(n.label))throw new Error(`${a} - expected property label (${n.label}) to be a number`)}get label(){return this._label}};var Mr=class{constructor(t,n){if(typeof t!="string")throw new Error("LabeledFaceDescriptors - constructor expected label to be a string");if(!Array.isArray(n)||n.some(a=>!(a instanceof Float32Array)))throw new Error("LabeledFaceDescriptors - constructor expected descriptors to be an array of Float32Array");this._label=t,this._descriptors=n}get label(){return this._label}get descriptors(){return this._descriptors}toJSON(){return{label:this.label,descriptors:this.descriptors.map(t=>Array.from(t))}}static fromJSON(t){let n=t.descriptors.map(a=>new Float32Array(a));return new Mr(t.label,n)}};var CA=class extends yd{constructor(n,a,r,s){super(n,a);this._score=r,this._classScore=s}static assertIsValidPredictedBox(n,a){if(yd.assertIsValidLabeledBox(n,a),!ep(n.score)||!ep(n.classScore))throw new Error(`${a} - expected properties score (${n.score}) and (${n.classScore}) to be a number between [0, 1]`)}get score(){return this._score}get classScore(){return this._classScore}};function Pr(e){return e.detection instanceof wt}function rp(e,t){return{...e,...{detection:t}}}function f1(){let e=window.fetch;if(!e)throw new Error("fetch - missing fetch implementation for browser environment");return{Canvas:HTMLCanvasElement,CanvasRenderingContext2D,Image:HTMLImageElement,ImageData,Video:HTMLVideoElement,createCanvasElement:()=>document.createElement("canvas"),createImageElement:()=>document.createElement("img"),createVideoElement:()=>document.createElement("video"),fetch:e,readFile:()=>{throw new Error("readFile - filesystem not available for browser environment")}}}function bd(){return typeof global=="object"&&typeof process!="undefined"&&process.versions!=null&&process.versions.node!=null}function ig(e){let t="";if(!e&&bd())try{e=fF("fs")}catch(a){t=a.toString()}return{readFile:e?a=>new Promise((r,s)=>{e.readFile(a,(i,o)=>i?s(i):r(o))}):()=>{throw new Error(`readFile - failed to require fs in nodejs environment with error: ${t}`)}}}function g1(){let e=global.Canvas||global.HTMLCanvasElement,t=global.Image||global.HTMLImageElement,n=global.Video||global.HTMLVideoElement,a=()=>{if(e)return new e;throw new Error("createCanvasElement - missing Canvas implementation for nodejs environment")},r=()=>{if(t)return new t;throw new Error("createImageElement - missing Image implementation for nodejs environment")},s=()=>{if(n)return new n;throw new Error("createVideoElement - missing Video implementation for nodejs environment")},i=global.fetch,o=ig();return{Canvas:e||class{},CanvasRenderingContext2D:global.CanvasRenderingContext2D||class{},Image:t||class{},ImageData:global.ImageData||class{},Video:global.HTMLVideoElement||class{},createCanvasElement:a,createImageElement:r,createVideoElement:s,fetch:i,...o}}function y1(){return typeof window=="object"&&typeof document!="undefined"&&typeof HTMLImageElement!="undefined"&&typeof HTMLCanvasElement!="undefined"&&typeof HTMLVideoElement!="undefined"&&typeof ImageData!="undefined"&&typeof CanvasRenderingContext2D!="undefined"}var sn;function upe(){if(!sn)throw new Error("getEnv - environment is not defined, check isNodejs() and isBrowser()");return sn}function b1(e){sn=e}function x1(){return y1()?b1(f1()):bd()?b1(g1()):null}function ppe(e){if(sn||x1(),!sn)throw new Error("monkeyPatch - environment is not defined, check isNodejs() and isBrowser()");let{Canvas:t=sn.Canvas,Image:n=sn.Image}=e;sn.Canvas=t,sn.Image=n,sn.createCanvasElement=e.createCanvasElement||(()=>new t),sn.createImageElement=e.createImageElement||(()=>new n),sn.ImageData=e.ImageData||sn.ImageData,sn.Video=e.Video||sn.Video,sn.fetch=e.fetch||sn.fetch,sn.readFile=e.readFile||sn.readFile}var at={getEnv:upe,setEnv:b1,initialize:x1,createBrowserEnv:f1,createFileSystem:ig,createNodejsEnv:g1,monkeyPatch:ppe,isBrowser:y1,isNodejs:bd};x1();function sp(e){return!at.isNodejs()&&typeof e=="string"?document.getElementById(e):e}function aa(e){let{Canvas:t,CanvasRenderingContext2D:n}=at.getEnv();if(e instanceof n)return e;let a=sp(e);if(!(a instanceof t))throw new Error("resolveContext2d - expected canvas to be of instance of Canvas");let r=a.getContext("2d");if(!r)throw new Error("resolveContext2d - canvas 2d context is null");return r}var v1=(r=>(r.TOP_LEFT="TOP_LEFT",r.TOP_RIGHT="TOP_RIGHT",r.BOTTOM_LEFT="BOTTOM_LEFT",r.BOTTOM_RIGHT="BOTTOM_RIGHT",r))(v1||{}),ip=class{constructor(t={}){let{anchorPosition:n,backgroundColor:a,fontColor:r,fontSize:s,fontStyle:i,padding:o}=t;this.anchorPosition=n||"TOP_LEFT",this.backgroundColor=a||"rgba(0, 0, 0, 0.5)",this.fontColor=r||"rgba(255, 255, 255, 1)",this.fontSize=s||14,this.fontStyle=i||"Georgia",this.padding=o||4}},Or=class{constructor(t,n,a={}){this.text=typeof t=="string"?[t]:t instanceof Or?t.text:t,this.anchor=n,this.options=new ip(a)}measureWidth(t){let{padding:n}=this.options;return this.text.map(a=>t.measureText(a).width).reduce((a,r)=>a{let m=l+d.x,f=l+d.y+(h+1)*i;a.fillText(c,m,f)})}};var og=class{constructor(t={}){let{boxColor:n,lineWidth:a,label:r,drawLabelOptions:s}=t;this.boxColor=n||"rgba(0, 0, 255, 1)",this.lineWidth=a||2,this.label=r;let i={anchorPosition:"BOTTOM_LEFT",backgroundColor:this.boxColor};this.drawLabelOptions=new ip({...i,...s})}},xd=class{constructor(t,n={}){this.box=new ct(t),this.options=new og(n)}draw(t){let n=aa(t),{boxColor:a,lineWidth:r}=this.options,{x:s,y:i,width:o,height:l}=this.box;n.strokeStyle=a,n.lineWidth=r,n.strokeRect(s,i,o,l);let{label:u}=this.options;u&&new Or([u],{x:s-r/2,y:i},this.options.drawLabelOptions).draw(t)}};function cpe(e,t){(Array.isArray(t)?t:[t]).forEach(a=>{let r=a instanceof wt?a.score:Pr(a)?a.detection.score:void 0,s=a instanceof wt?a.box:Pr(a)?a.detection.box:new ct(a),i=r?`${Eo(r)}`:void 0;new xd(s,{label:i}).draw(e)})}function lg(e){let{Image:t,Video:n}=at.getEnv();return e instanceof t&&e.complete||e instanceof n&&e.readyState>=3}function _A(e){return new Promise((t,n)=>{(e instanceof at.getEnv().Canvas||lg(e))&&t(null);function a(s){!s.currentTarget||(s.currentTarget.removeEventListener("load",r),s.currentTarget.removeEventListener("error",a),n(s))}function r(s){!s.currentTarget||(s.currentTarget.removeEventListener("load",r),s.currentTarget.removeEventListener("error",a),t(s))}e.addEventListener("load",r),e.addEventListener("error",a)})}function EA(e){return new Promise((t,n)=>{e instanceof Blob||n(new Error("bufferToImage - expected buf to be of type: Blob"));let a=new FileReader;a.onload=()=>{typeof a.result!="string"&&n(new Error("bufferToImage - expected reader.result to be a string, in onload"));let r=at.getEnv().createImageElement();r.onload=()=>t(r),r.onerror=n,r.src=a.result},a.onerror=n,a.readAsDataURL(e)})}function op(e){let{Image:t,Video:n}=at.getEnv();return e instanceof t?new $n(e.naturalWidth,e.naturalHeight):e instanceof n?new $n(e.videoWidth,e.videoHeight):new $n(e.width,e.height)}function lp({width:e,height:t}){let{createCanvasElement:n}=at.getEnv(),a=n();return a.width=e,a.height=t,a}function ug(e,t){let{ImageData:n}=at.getEnv();if(!(e instanceof n)&&!lg(e))throw new Error("createCanvasFromMedia - media has not finished loading yet");let{width:a,height:r}=t||op(e),s=lp({width:a,height:r});return e instanceof n?aa(s).putImageData(e,0,0):aa(s).drawImage(e,0,0,a,r),s}async function AA(e,t){let n=t||at.getEnv().createCanvasElement(),[a,r,s]=e.shape.slice(ba(e)?1:0),i=O(()=>e.as3D(a,r,s).toInt());return await bo.toPixels(i,n),i.dispose(),n}function w1(e){let{Image:t,Canvas:n,Video:a}=at.getEnv();return e instanceof t||e instanceof n||e instanceof a}function $A(e,t,n=!1){let{Image:a,Canvas:r}=at.getEnv();if(!(e instanceof a||e instanceof r))throw new Error("imageToSquare - expected arg0 to be HTMLImageElement | HTMLCanvasElement");if(t<=0)return lp({width:1,height:1});let s=op(e),i=t/Math.max(s.height,s.width),o=i*s.width,l=i*s.height,u=lp({width:t,height:t}),p=e instanceof r?e:ug(e),d=Math.abs(o-l)/2,c=n&&o0&&p.height>0&&aa(u).drawImage(p,c,h,o,l),u}var Lr=class{constructor(t,n=!1){this._imageTensors=[];this._canvases=[];this._treatAsBatchInput=!1;this._inputDimensions=[];this._inputSize=0;if(!Array.isArray(t))throw new Error(`NetInput.constructor - expected inputs to be an Array of TResolvedNetInput or to be instanceof tf.Tensor4D, instead have ${t}`);this._treatAsBatchInput=n,this._batchSize=t.length,t.forEach((a,r)=>{if(Rr(a)){this._imageTensors[r]=a,this._inputDimensions[r]=a.shape;return}if(ba(a)){let i=a.shape[0];if(i!==1)throw new Error(`NetInput - tf.Tensor4D with batchSize ${i} passed, but not supported in input array`);this._imageTensors[r]=a,this._inputDimensions[r]=a.shape.slice(1);return}let s=a instanceof at.getEnv().Canvas?a:ug(a);this._canvases[r]=s,this._inputDimensions[r]=[s.height,s.width,3]})}get imageTensors(){return this._imageTensors}get canvases(){return this._canvases}get isBatchInput(){return this.batchSize>1||this._treatAsBatchInput}get batchSize(){return this._batchSize}get inputDimensions(){return this._inputDimensions}get inputSize(){return this._inputSize}get reshapedInputDimensions(){return gr(this.batchSize,0,1).map((t,n)=>this.getReshapedInputDimensions(n))}getInput(t){return this.canvases[t]||this.imageTensors[t]}getInputDimensions(t){return this._inputDimensions[t]}getInputHeight(t){return this._inputDimensions[t][0]}getInputWidth(t){return this._inputDimensions[t][1]}getReshapedInputDimensions(t){if(typeof this.inputSize!="number")throw new Error("getReshapedInputDimensions - inputSize not set, toBatchTensor has not been called yet");let n=this.getInputWidth(t),a=this.getInputHeight(t);return m1({width:n,height:a},this.inputSize)}toBatchTensor(t,n=!0){return this._inputSize=t,O(()=>{let a=gr(this.batchSize,0,1).map(s=>{let i=this.getInput(s);if(i instanceof Ae){let o=ba(i)?i:mn(i);return o=NA(o,n),(o.shape[1]!==t||o.shape[2]!==t)&&(o=Sr.resizeBilinear(o,[t,t],!1,!1)),o.as3D(t,t,3)}if(i instanceof at.getEnv().Canvas)return bo.fromPixels($A(i,t,n));throw new Error(`toBatchTensor - at batchIdx ${s}, expected input to be instanceof tf.Tensor or instanceof HTMLCanvasElement, instead have ${i}`)});return Rt(a.map(s=>le(s,"float32"))).as4D(this.batchSize,t,t,3)})}};async function kt(e){if(e instanceof Lr)return e;let t=Array.isArray(e)?e:[e];if(!t.length)throw new Error("toNetInput - empty array passed as input");let n=r=>Array.isArray(e)?` at input index ${r}:`:"",a=t.map(sp);return a.forEach((r,s)=>{if(!w1(r)&&!Rr(r)&&!ba(r))throw typeof t[s]=="string"?new Error(`toNetInput -${n(s)} string passed, but could not resolve HTMLElement for element id ${t[s]}`):new Error(`toNetInput -${n(s)} expected media to be of type HTMLImageElement | HTMLVideoElement | HTMLCanvasElement | tf.Tensor3D, or to be an element id`);if(ba(r)){let i=r.shape[0];if(i!==1)throw new Error(`toNetInput -${n(s)} tf.Tensor4D with batchSize ${i} passed, but not supported in input array`)}}),await Promise.all(a.map(r=>w1(r)&&_A(r))),new Lr(a,Array.isArray(e))}async function vd(e,t){let{Canvas:n}=at.getEnv(),a=e;if(!(e instanceof n)){let i=await kt(e);if(i.batchSize>1)throw new Error("extractFaces - batchSize > 1 not supported");let o=i.getInput(0);a=o instanceof n?o:await AA(o)}let r=aa(a);return t.map(i=>i instanceof wt?i.forSize(a.width,a.height).box.floor():i).map(i=>i.clipAtImageBorders(a.width,a.height)).map(({x:i,y:o,width:l,height:u})=>{let p=lp({width:l,height:u});return l>0&&u>0&&aa(p).putImageData(r.getImageData(i,o,l,u),0,0),p})}async function wd(e,t){if(!Rr(e)&&!ba(e))throw new Error("extractFaceTensors - expected image tensor to be 3D or 4D");if(ba(e)&&e.shape[0]>1)throw new Error("extractFaceTensors - batchSize > 1 not supported");return O(()=>{let[n,a,r]=e.shape.slice(ba(e)?1:0);return t.map(o=>o instanceof wt?o.forSize(a,n).box:o).map(o=>o.clipAtImageBorders(a,n)).filter(o=>o.width>0&&o.height>0).map(({x:o,y:l,width:u,height:p})=>vo(e.as3D(n,a,r),[l,o,0],[p,u,r]))})}async function _s(e,t){let{fetch:n}=at.getEnv(),a=await n(e,t);if(!(a.status<400))throw new Error(`failed to fetch: (${a.status}) ${a.statusText}, from url: ${a.url}`);return a}async function Wxe(e){let t=await _s(e),n=await t.blob();if(!n.type.startsWith("image/"))throw new Error(`fetchImage - expected blob type to be of type image/*, instead have: ${n.type}, for url: ${t.url}`);return EA(n)}async function FA(e){return(await _s(e)).json()}async function jxe(e){return new Float32Array(await(await _s(e)).arrayBuffer())}function DA(e){return new Promise((t,n)=>{e instanceof Blob||n(new Error("bufferToVideo - expected buf to be of type: Blob"));let a=at.getEnv().createVideoElement();a.oncanplay=()=>t(a),a.onerror=n,a.playsInline=!0,a.muted=!0,a.src=URL.createObjectURL(e),a.play()})}async function Zxe(e){let t=await _s(e),n=await t.blob();if(!n.type.startsWith("video/"))throw new Error(`fetchVideo - expected blob type to be of type video/*, instead have: ${n.type}, for url: ${t.url}`);return DA(n)}function pg(e,t){let n=`${t}-weights_manifest.json`;if(!e)return{modelBaseUri:"",manifestUri:n};if(e==="/")return{modelBaseUri:"/",manifestUri:`/${n}`};let a=e.startsWith("http://")?"http://":e.startsWith("https://")?"https://":"";e=e.replace(a,"");let r=e.split("/").filter(o=>o),s=e.endsWith(".json")?r[r.length-1]:n,i=a+(e.endsWith(".json")?r.slice(0,r.length-1):r).join("/");return i=e.startsWith("/")?`/${i}`:i,{modelBaseUri:i,manifestUri:i==="/"?`/${s}`:`${i}/${s}`}}async function RA(e,t){let{manifestUri:n,modelBaseUri:a}=pg(e,t),r=await FA(n);return Nn.loadWeights(r,a)}function sve(e,t,n=!1){let{width:a,height:r}=n?op(t):t;return e.width=a,e.height=r,{width:a,height:r}}var dn=class{constructor(t){this._params=void 0;this._paramMappings=[];this._name=t}get params(){return this._params}get paramMappings(){return this._paramMappings}get isLoaded(){return!!this.params}getParamFromPath(t){let{obj:n,objProp:a}=this.traversePropertyPath(t);return n[a]}reassignParamFromPath(t,n){let{obj:a,objProp:r}=this.traversePropertyPath(t);a[r].dispose(),a[r]=n}getParamList(){return this._paramMappings.map(({paramPath:t})=>({path:t,tensor:this.getParamFromPath(t)}))}getTrainableParams(){return this.getParamList().filter(t=>t.tensor instanceof ns)}getFrozenParams(){return this.getParamList().filter(t=>!(t.tensor instanceof ns))}variable(){this.getFrozenParams().forEach(({path:t,tensor:n})=>{this.reassignParamFromPath(t,n.variable())})}freeze(){this.getTrainableParams().forEach(({path:t,tensor:n})=>{let a=Bn(n.dataSync());n.dispose(),this.reassignParamFromPath(t,a)})}dispose(t=!0){this.getParamList().forEach(n=>{if(t&&n.tensor.isDisposed)throw new Error(`param tensor has already been disposed for path ${n.path}`);n.tensor.dispose()}),this._params=void 0}serializeParams(){return new Float32Array(this.getParamList().map(({tensor:t})=>Array.from(t.dataSync())).reduce((t,n)=>t.concat(n)))}async load(t){if(t instanceof Float32Array){this.extractWeights(t);return}await this.loadFromUri(t)}async loadFromUri(t){if(t&&typeof t!="string")throw new Error(`${this._name}.loadFromUri - expected model uri`);let n=await RA(t,this.getDefaultModelName());this.loadFromWeightMap(n)}async loadFromDisk(t){if(t&&typeof t!="string")throw new Error(`${this._name}.loadFromDisk - expected model file path`);let{readFile:n}=at.getEnv(),{manifestUri:a,modelBaseUri:r}=pg(t,this.getDefaultModelName()),s=u=>Promise.all(u.map(p=>n(p).then(d=>d.buffer))),i=Nn.weightsLoaderFactory(s),o=JSON.parse((await n(a)).toString()),l=await i(o,r);this.loadFromWeightMap(l)}loadFromWeightMap(t){let{paramMappings:n,params:a}=this.extractParamsFromWeightMap(t);this._paramMappings=n,this._params=a}extractWeights(t){let{paramMappings:n,params:a}=this.extractParams(t);this._paramMappings=n,this._params=a}traversePropertyPath(t){if(!this.params)throw new Error("traversePropertyPath - model has no loaded params");let n=t.split("/").reduce((s,i)=>{if(!s.nextObj.hasOwnProperty(i))throw new Error(`traversePropertyPath - object does not have property ${i}, for path ${t}`);return{obj:s.nextObj,objProp:i,nextObj:s.nextObj[i]}},{nextObj:this.params}),{obj:a,objProp:r}=n;if(!a||!r||!(a[r]instanceof Ae))throw new Error(`traversePropertyPath - parameter is not a tensor, for path ${t}`);return{obj:a,objProp:r}}};function Kn(e,t,n){return O(()=>{let a=ks(e,t.depthwise_filter,t.pointwise_filter,n,"same");return a=Z(a,t.bias),a})}function cg(e,t,n=!1){return O(()=>{let a=Xe(n?Z(Dt(e,t.conv0.filters,[2,2],"same"),t.conv0.bias):Kn(e,t.conv0,[2,2])),r=Kn(a,t.conv1,[1,1]),s=Xe(Z(a,r)),i=Kn(s,t.conv2,[1,1]);return Xe(Z(a,Z(r,i)))})}function kd(e,t,n=!1,a=!0){return O(()=>{let r=Xe(n?Z(Dt(e,t.conv0.filters,a?[2,2]:[1,1],"same"),t.conv0.bias):Kn(e,t.conv0,a?[2,2]:[1,1])),s=Kn(r,t.conv1,[1,1]),i=Xe(Z(r,s)),o=Kn(i,t.conv2,[1,1]),l=Xe(Z(r,Z(s,o))),u=Kn(l,t.conv3,[1,1]);return Xe(Z(r,Z(s,Z(o,u))))})}function $o(e,t,n="same",a=!1){return O(()=>{let r=Z(Dt(e,t.filters,[1,1],n),t.bias);return a?Xe(r):r})}function Fn(e,t){Object.keys(e).forEach(n=>{t.some(a=>a.originalPath===n)||e[n].dispose()})}function up(e,t){return(n,a,r,s)=>{let i=Ea(e(n*a*r*r),[r,r,n,a]),o=Ke(e(a));return t.push({paramPath:`${s}/filters`},{paramPath:`${s}/bias`}),{filters:i,bias:o}}}function dg(e,t){return(n,a,r)=>{let s=Na(e(n*a),[n,a]),i=Ke(e(a));return t.push({paramPath:`${r}/weights`},{paramPath:`${r}/bias`}),{weights:s,bias:i}}}var Id=class{constructor(t,n,a){this.depthwise_filter=t;this.pointwise_filter=n;this.bias=a}};function pp(e,t){return(n,a,r)=>{let s=Ea(e(9*n),[3,3,n,1]),i=Ea(e(n*a),[1,1,n,a]),o=Ke(e(a));return t.push({paramPath:`${r}/depthwise_filter`},{paramPath:`${r}/pointwise_filter`},{paramPath:`${r}/bias`}),new Id(s,i,o)}}function cp(e){return t=>{let n=e(`${t}/depthwise_filter`,4),a=e(`${t}/pointwise_filter`,4),r=e(`${t}/bias`,1);return new Id(n,a,r)}}function ra(e,t){return(n,a,r)=>{let s=e[n];if(!_o(s,a))throw new Error(`expected weightMap[${n}] to be a Tensor${a}D, instead have ${s}`);return t.push({originalPath:n,paramPath:r||n}),s}}function Dn(e){let t=e;function n(r){let s=t.slice(0,r);return t=t.slice(r),s}function a(){return t}return{extractWeights:n,getRemainingWeights:a}}function hg(e,t){let n=up(e,t),a=pp(e,t);function r(i,o,l,u=!1){let p=u?n(i,o,3,`${l}/conv0`):a(i,o,`${l}/conv0`),d=a(o,o,`${l}/conv1`),c=a(o,o,`${l}/conv2`);return{conv0:p,conv1:d,conv2:c}}function s(i,o,l,u=!1){let{conv0:p,conv1:d,conv2:c}=r(i,o,l,u),h=a(o,o,`${l}/conv3`);return{conv0:p,conv1:d,conv2:c,conv3:h}}return{extractDenseBlock3Params:r,extractDenseBlock4Params:s}}function MA(e){let t=[],{extractWeights:n,getRemainingWeights:a}=Dn(e),{extractDenseBlock4Params:r}=hg(n,t),s=r(3,32,"dense0",!0),i=r(32,64,"dense1"),o=r(64,128,"dense2"),l=r(128,256,"dense3");if(a().length!==0)throw new Error(`weights remaing after extract: ${a().length}`);return{paramMappings:t,params:{dense0:s,dense1:i,dense2:o,dense3:l}}}function mg(e){return t=>{let n=e(`${t}/filters`,4),a=e(`${t}/bias`,1);return{filters:n,bias:a}}}function fg(e,t){let n=ra(e,t),a=mg(n),r=cp(n);function s(o,l=!1){let u=l?a(`${o}/conv0`):r(`${o}/conv0`),p=r(`${o}/conv1`),d=r(`${o}/conv2`);return{conv0:u,conv1:p,conv2:d}}function i(o,l=!1){let u=l?a(`${o}/conv0`):r(`${o}/conv0`),p=r(`${o}/conv1`),d=r(`${o}/conv2`),c=r(`${o}/conv3`);return{conv0:u,conv1:p,conv2:d,conv3:c}}return{extractDenseBlock3Params:s,extractDenseBlock4Params:i}}function PA(e){let t=[],{extractDenseBlock4Params:n}=fg(e,t),a={dense0:n("dense0",!0),dense1:n("dense1"),dense2:n("dense2"),dense3:n("dense3")};return Fn(e,t),{params:a,paramMappings:t}}var dp=class extends dn{constructor(){super("FaceFeatureExtractor")}forwardInput(t){let{params:n}=this;if(!n)throw new Error("FaceFeatureExtractor - load model before inference");return O(()=>{let a=le(t.toBatchTensor(112,!0),"float32"),s=yr(a,[122.782,117.001,104.298]).div(255),i=kd(s,n.dense0,!0);return i=kd(i,n.dense1),i=kd(i,n.dense2),i=kd(i,n.dense3),i=fa(i,[7,7],[2,2],"valid"),i})}async forward(t){return this.forwardInput(await kt(t))}getDefaultModelName(){return"face_feature_extractor_model"}extractParamsFromWeightMap(t){return PA(t)}extractParams(t){return MA(t)}};function Sd(e,t){return O(()=>Z(Re(e,t.weights),t.bias))}function OA(e,t,n){let a=[],{extractWeights:r,getRemainingWeights:s}=Dn(e),o=dg(r,a)(t,n,"fc");if(s().length!==0)throw new Error(`weights remaing after extract: ${s().length}`);return{paramMappings:a,params:{fc:o}}}function LA(e){let t=[],n=ra(e,t);function a(s){let i=n(`${s}/weights`,2),o=n(`${s}/bias`,1);return{weights:i,bias:o}}let r={fc:a("fc")};return Fn(e,t),{params:r,paramMappings:t}}function gg(e){let t={},n={};return Object.keys(e).forEach(a=>{let r=a.startsWith("fc")?n:t;r[a]=e[a]}),{featureExtractorMap:t,classifierMap:n}}var hp=class extends dn{constructor(n,a){super(n);this._faceFeatureExtractor=a}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(n){let{params:a}=this;if(!a)throw new Error(`${this._name} - load model before inference`);return O(()=>{let r=n instanceof Lr?this.faceFeatureExtractor.forwardInput(n):n;return Sd(r.as2D(r.shape[0],-1),a.fc)})}dispose(n=!0){this.faceFeatureExtractor.dispose(n),super.dispose(n)}loadClassifierParams(n){let{params:a,paramMappings:r}=this.extractClassifierParams(n);this._params=a,this._paramMappings=r}extractClassifierParams(n){return OA(n,this.getClassifierChannelsIn(),this.getClassifierChannelsOut())}extractParamsFromWeightMap(n){let{featureExtractorMap:a,classifierMap:r}=gg(n);return this.faceFeatureExtractor.loadFromWeightMap(a),LA(r)}extractParams(n){let a=this.getClassifierChannelsIn(),r=this.getClassifierChannelsOut(),s=r*a+r,i=n.slice(0,n.length-s),o=n.slice(n.length-s);return this.faceFeatureExtractor.extractWeights(i),this.extractClassifierParams(o)}};var zA=["neutral","happy","sad","angry","fearful","disgusted","surprised"],Es=class{constructor(t){this.neutral=0;this.happy=0;this.sad=0;this.angry=0;this.fearful=0;this.disgusted=0;this.surprised=0;if(t.length!==7)throw new Error(`FaceExpressions.constructor - expected probabilities.length to be 7, have: ${t.length}`);zA.forEach((n,a)=>{this[n]=t[a]})}asSortedArray(){return zA.map(t=>({expression:t,probability:this[t]})).sort((t,n)=>n.probability-t.probability)}};var yg=class extends hp{constructor(t=new dp){super("FaceExpressionNet",t)}forwardInput(t){return O(()=>Za(this.runNet(t)))}async forward(t){return this.forwardInput(await kt(t))}async predictExpressions(t){let n=await kt(t),a=await this.forwardInput(n),r=await Promise.all(mt(a).map(async i=>{let o=i.dataSync();return i.dispose(),o}));a.dispose();let s=r.map(i=>new Es(i));return n.isBatchInput?s:s[0]}getDefaultModelName(){return"face_expression_model"}getClassifierChannelsIn(){return 256}getClassifierChannelsOut(){return 7}};function BA(e){return e.expressions instanceof Es}function k1(e,t){return{...e,...{expressions:t}}}function dpe(e,t,n=.1,a){(Array.isArray(t)?t:[t]).forEach(s=>{let i=s instanceof Es?s:BA(s)?s.expressions:void 0;if(!i)throw new Error("drawFaceExpressions - expected faceExpressions to be FaceExpressions | WithFaceExpressions<{}> or array thereof");let l=i.asSortedArray().filter(d=>d.probability>n),u=Pr(s)?s.detection.box.bottomLeft:a||new Oe(0,0);new Or(l.map(d=>`${d.expression} (${Eo(d.probability)})`),u).draw(e)})}function mp(e){return Pr(e)&&e.landmarks instanceof xa&&e.unshiftedLandmarks instanceof xa&&e.alignedRect instanceof wt}function hpe(e){let t=(o,l,u,p)=>Math.atan2(p-l,u-o)%Math.PI,n=o=>o*180/Math.PI,a={roll:void 0,pitch:void 0,yaw:void 0};if(!e||!e._positions||e._positions.length!==68)return a;let r=e._positions;a.roll=-t(r[36]._x,r[36]._y,r[45]._x,r[45]._y),a.pitch=t(0,Math.abs(r[0]._x-r[30]._x)/r[30]._x,Math.PI,Math.abs(r[16]._x-r[30]._x)/r[30]._x);let s=r.reduce((o,l)=>oo>l._y?o:l._y,-1/0);return a.yaw=Math.PI*(e._imgDims._height/(i-s)/1.4-1),a}function Nd(e,t){let{box:n}=e.detection,a=t.shiftBy(n.x,n.y),r=a.align(),{imageDims:s}=e.detection,i=new wt(e.detection.score,r.rescale(s.reverse()),s),o=hpe(t);return{...e,...{landmarks:a,unshiftedLandmarks:t,alignedRect:i,angle:o}}}var bg=class{constructor(t={}){let{drawLines:n=!0,drawPoints:a=!0,lineWidth:r,lineColor:s,pointSize:i,pointColor:o}=t;this.drawLines=n,this.drawPoints=a,this.lineWidth=r||1,this.pointSize=i||2,this.lineColor=s||"rgba(0, 255, 255, 1)",this.pointColor=o||"rgba(255, 0, 255, 1)"}},xg=class{constructor(t,n={}){this.faceLandmarks=t,this.options=new bg(n)}draw(t){let n=aa(t),{drawLines:a,drawPoints:r,lineWidth:s,lineColor:i,pointSize:o,pointColor:l}=this.options;if(a&&this.faceLandmarks instanceof ap&&(n.strokeStyle=i,n.lineWidth=s,Dr(n,this.faceLandmarks.getJawOutline()),Dr(n,this.faceLandmarks.getLeftEyeBrow()),Dr(n,this.faceLandmarks.getRightEyeBrow()),Dr(n,this.faceLandmarks.getNose()),Dr(n,this.faceLandmarks.getLeftEye(),!0),Dr(n,this.faceLandmarks.getRightEye(),!0),Dr(n,this.faceLandmarks.getMouth(),!0)),r){n.strokeStyle=l,n.fillStyle=l;let u=p=>{n.beginPath(),n.arc(p.x,p.y,o,0,2*Math.PI),n.fill()};this.faceLandmarks.positions.forEach(u)}}};function mpe(e,t){(Array.isArray(t)?t:[t]).forEach(a=>{let r=a instanceof xa?a:mp(a)?a.landmarks:void 0;if(!r)throw new Error("drawFaceLandmarks - expected faceExpressions to be FaceLandmarks | WithFaceLandmarks> or array thereof");new xg(r).draw(e)})}var VA="1.7.1";function ype(e,t){let n=up(e,t),a=pp(e,t);function r(i,o,l){let u=a(i,o,`${l}/separable_conv0`),p=a(o,o,`${l}/separable_conv1`),d=n(i,o,1,`${l}/expansion_conv`);return{separable_conv0:u,separable_conv1:p,expansion_conv:d}}function s(i,o){let l=a(i,i,`${o}/separable_conv0`),u=a(i,i,`${o}/separable_conv1`),p=a(i,i,`${o}/separable_conv2`);return{separable_conv0:l,separable_conv1:u,separable_conv2:p}}return{extractConvParams:n,extractSeparableConvParams:a,extractReductionBlockParams:r,extractMainBlockParams:s}}function UA(e,t){let n=[],{extractWeights:a,getRemainingWeights:r}=Dn(e),{extractConvParams:s,extractSeparableConvParams:i,extractReductionBlockParams:o,extractMainBlockParams:l}=ype(a,n),u=s(3,32,3,"entry_flow/conv_in"),p=o(32,64,"entry_flow/reduction_block_0"),d=o(64,128,"entry_flow/reduction_block_1"),c={conv_in:u,reduction_block_0:p,reduction_block_1:d},h={};gr(t,0,1).forEach(y=>{h[`main_block_${y}`]=l(128,`middle_flow/main_block_${y}`)});let m=o(128,256,"exit_flow/reduction_block"),f=i(256,512,"exit_flow/separable_conv"),g={reduction_block:m,separable_conv:f};if(r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{paramMappings:n,params:{entry_flow:c,middle_flow:h,exit_flow:g}}}function bpe(e,t){let n=ra(e,t),a=mg(n),r=cp(n);function s(o){let l=r(`${o}/separable_conv0`),u=r(`${o}/separable_conv1`),p=a(`${o}/expansion_conv`);return{separable_conv0:l,separable_conv1:u,expansion_conv:p}}function i(o){let l=r(`${o}/separable_conv0`),u=r(`${o}/separable_conv1`),p=r(`${o}/separable_conv2`);return{separable_conv0:l,separable_conv1:u,separable_conv2:p}}return{extractConvParams:a,extractSeparableConvParams:r,extractReductionBlockParams:s,extractMainBlockParams:i}}function GA(e,t){let n=[],{extractConvParams:a,extractSeparableConvParams:r,extractReductionBlockParams:s,extractMainBlockParams:i}=bpe(e,n),o=a("entry_flow/conv_in"),l=s("entry_flow/reduction_block_0"),u=s("entry_flow/reduction_block_1"),p={conv_in:o,reduction_block_0:l,reduction_block_1:u},d={};gr(t,0,1).forEach(f=>{d[`main_block_${f}`]=i(`middle_flow/main_block_${f}`)});let c=s("exit_flow/reduction_block"),h=r("exit_flow/separable_conv"),m={reduction_block:c,separable_conv:h};return Fn(e,n),{params:{entry_flow:p,middle_flow:d,exit_flow:m},paramMappings:n}}function HA(e,t,n){return Z(Dt(e,t.filters,n,"same"),t.bias)}function I1(e,t,n=!0){let a=n?Xe(e):e;return a=Kn(a,t.separable_conv0,[1,1]),a=Kn(Xe(a),t.separable_conv1,[1,1]),a=Mt(a,[3,3],[2,2],"same"),a=Z(a,HA(e,t.expansion_conv,[2,2])),a}function xpe(e,t){let n=Kn(Xe(e),t.separable_conv0,[1,1]);return n=Kn(Xe(n),t.separable_conv1,[1,1]),n=Kn(Xe(n),t.separable_conv2,[1,1]),n=Z(n,e),n}var vg=class extends dn{constructor(n){super("TinyXception");this._numMainBlocks=n}forwardInput(n){let{params:a}=this;if(!a)throw new Error("TinyXception - load model before inference");return O(()=>{let r=le(n.toBatchTensor(112,!0),"float32"),i=yr(r,[122.782,117.001,104.298]).div(255),o=Xe(HA(i,a.entry_flow.conv_in,[2,2]));return o=I1(o,a.entry_flow.reduction_block_0,!1),o=I1(o,a.entry_flow.reduction_block_1),gr(this._numMainBlocks,0,1).forEach(l=>{o=xpe(o,a.middle_flow[`main_block_${l}`])}),o=I1(o,a.exit_flow.reduction_block),o=Xe(Kn(o,a.exit_flow.separable_conv,[1,1])),o})}async forward(n){return this.forwardInput(await kt(n))}getDefaultModelName(){return"tiny_xception_model"}extractParamsFromWeightMap(n){return GA(n,this._numMainBlocks)}extractParams(n){return UA(n,this._numMainBlocks)}};function jA(e){let t=[],{extractWeights:n,getRemainingWeights:a}=Dn(e),r=dg(n,t),s=r(512,1,"fc/age"),i=r(512,2,"fc/gender");if(a().length!==0)throw new Error(`weights remaing after extract: ${a().length}`);return{paramMappings:t,params:{fc:{age:s,gender:i}}}}function qA(e){let t=[],n=ra(e,t);function a(s){let i=n(`${s}/weights`,2),o=n(`${s}/bias`,1);return{weights:i,bias:o}}let r={fc:{age:a("fc/age"),gender:a("fc/gender")}};return Fn(e,t),{params:r,paramMappings:t}}var S1=(n=>(n.FEMALE="female",n.MALE="male",n))(S1||{});var wg=class extends dn{constructor(n=new vg(2)){super("AgeGenderNet");this._faceFeatureExtractor=n}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(n){let{params:a}=this;if(!a)throw new Error(`${this._name} - load model before inference`);return O(()=>{let r=n instanceof Lr?this.faceFeatureExtractor.forwardInput(n):n,s=fa(r,[7,7],[2,2],"valid").as2D(r.shape[0],-1),i=Sd(s,a.fc.age).as1D(),o=Sd(s,a.fc.gender);return{age:i,gender:o}})}forwardInput(n){return O(()=>{let{age:a,gender:r}=this.runNet(n);return{age:a,gender:Za(r)}})}async forward(n){return this.forwardInput(await kt(n))}async predictAgeAndGender(n){let a=await kt(n),r=await this.forwardInput(a),s=mt(r.age),i=mt(r.gender),o=s.map((u,p)=>({ageTensor:u,genderTensor:i[p]})),l=await Promise.all(o.map(async({ageTensor:u,genderTensor:p})=>{let d=u.dataSync()[0],c=p.dataSync()[0],h=c>.5,m=h?"male":"female",f=h?c:1-c;return u.dispose(),p.dispose(),{age:d,gender:m,genderProbability:f}}));return r.age.dispose(),r.gender.dispose(),a.isBatchInput?l:l[0]}getDefaultModelName(){return"age_gender_model"}dispose(n=!0){this.faceFeatureExtractor.dispose(n),super.dispose(n)}loadClassifierParams(n){let{params:a,paramMappings:r}=this.extractClassifierParams(n);this._params=a,this._paramMappings=r}extractClassifierParams(n){return jA(n)}extractParamsFromWeightMap(n){let{featureExtractorMap:a,classifierMap:r}=gg(n);return this.faceFeatureExtractor.loadFromWeightMap(a),qA(r)}extractParams(n){let r=n.slice(0,n.length-1539),s=n.slice(n.length-1539);return this.faceFeatureExtractor.extractWeights(r),this.extractClassifierParams(s)}};var fp=class extends hp{postProcess(t,n,a){let r=a.map(({width:i,height:o})=>{let l=n/Math.max(o,i);return{width:i*l,height:o*l}}),s=r.length;return O(()=>{let i=(d,c)=>Rt([En([68],d,"float32"),En([68],c,"float32")],1).as2D(1,136).as1D(),o=(d,c)=>{let{width:h,height:m}=r[d];return c(h,m)?Math.abs(h-m)/2:0},l=d=>o(d,(c,h)=>co(d,(c,h)=>hi(l(c),u(c))))).div(Rt(Array.from(Array(s),(d,c)=>i(r[c].width,r[c].height))))})}forwardInput(t){return O(()=>{let n=this.runNet(t);return this.postProcess(n,t.inputSize,t.inputDimensions.map(([a,r])=>({height:a,width:r})))})}async forward(t){return this.forwardInput(await kt(t))}async detectLandmarks(t){let n=await kt(t),a=O(()=>mt(this.forwardInput(n))),r=await Promise.all(a.map(async(s,i)=>{let o=Array.from(s.dataSync()),l=o.filter((p,d)=>ag(d)),u=o.filter((p,d)=>!ag(d));return new ap(Array(68).fill(0).map((p,d)=>new Oe(l[d],u[d])),{height:n.getInputHeight(i),width:n.getInputWidth(i)})}));return a.forEach(s=>s.dispose()),n.isBatchInput?r:r[0]}getClassifierChannelsOut(){return 136}};var gp=class extends fp{constructor(t=new dp){super("FaceLandmark68Net",t)}getDefaultModelName(){return"face_landmark_68_model"}getClassifierChannelsIn(){return 256}};function KA(e){let t=[],{extractDenseBlock3Params:n}=fg(e,t),a={dense0:n("dense0",!0),dense1:n("dense1"),dense2:n("dense2")};return Fn(e,t),{params:a,paramMappings:t}}function XA(e){let t=[],{extractWeights:n,getRemainingWeights:a}=Dn(e),{extractDenseBlock3Params:r}=hg(n,t),s=r(3,32,"dense0",!0),i=r(32,64,"dense1"),o=r(64,128,"dense2");if(a().length!==0)throw new Error(`weights remaing after extract: ${a().length}`);return{paramMappings:t,params:{dense0:s,dense1:i,dense2:o}}}var kg=class extends dn{constructor(){super("TinyFaceFeatureExtractor")}forwardInput(t){let{params:n}=this;if(!n)throw new Error("TinyFaceFeatureExtractor - load model before inference");return O(()=>{let a=le(t.toBatchTensor(112,!0),"float32"),s=yr(a,[122.782,117.001,104.298]).div(255),i=cg(s,n.dense0,!0);return i=cg(i,n.dense1),i=cg(i,n.dense2),i=fa(i,[14,14],[2,2],"valid"),i})}async forward(t){return this.forwardInput(await kt(t))}getDefaultModelName(){return"face_feature_extractor_tiny_model"}extractParamsFromWeightMap(t){return KA(t)}extractParams(t){return XA(t)}};var Ig=class extends fp{constructor(t=new kg){super("FaceLandmark68TinyNet",t)}getDefaultModelName(){return"face_landmark_68_tiny_model"}getClassifierChannelsIn(){return 128}};var YA=class extends gp{};function JA(e,t){return Z(B(e,t.weights),t.biases)}function N1(e,t,n,a,r="same"){let{filters:s,bias:i}=t.conv,o=Dt(e,s,n,r);return o=Z(o,i),o=JA(o,t.scale),a?Xe(o):o}function ZA(e,t){return N1(e,t,[1,1],!0)}function T1(e,t){return N1(e,t,[1,1],!1)}function Sg(e,t){return N1(e,t,[2,2],!0,"valid")}function vpe(e,t){function n(o,l,u){let p=e(o),d=p.length/(l*u*u);if(h1(d))throw new Error(`depth has to be an integer: ${d}, weights.length: ${p.length}, numFilters: ${l}, filterSize: ${u}`);return O(()=>$e(Ea(p,[l,d,u,u]),[2,3,1,0]))}function a(o,l,u,p){let d=n(o,l,u),c=Ke(e(l));return t.push({paramPath:`${p}/filters`},{paramPath:`${p}/bias`}),{filters:d,bias:c}}function r(o,l){let u=Ke(e(o)),p=Ke(e(o));return t.push({paramPath:`${l}/weights`},{paramPath:`${l}/biases`}),{weights:u,biases:p}}function s(o,l,u,p){let d=a(o,l,u,`${p}/conv`),c=r(l,`${p}/scale`);return{conv:d,scale:c}}function i(o,l,u,p,d=!1){let c=s((d?.5:1)*o,l,u,`${p}/conv1`),h=s(o,l,u,`${p}/conv2`);return{conv1:c,conv2:h}}return{extractConvLayerParams:s,extractResidualLayerParams:i}}function QA(e){let{extractWeights:t,getRemainingWeights:n}=Dn(e),a=[],{extractConvLayerParams:r,extractResidualLayerParams:s}=vpe(t,a),i=r(4704,32,7,"conv32_down"),o=s(9216,32,3,"conv32_1"),l=s(9216,32,3,"conv32_2"),u=s(9216,32,3,"conv32_3"),p=s(36864,64,3,"conv64_down",!0),d=s(36864,64,3,"conv64_1"),c=s(36864,64,3,"conv64_2"),h=s(36864,64,3,"conv64_3"),m=s(147456,128,3,"conv128_down",!0),f=s(147456,128,3,"conv128_1"),g=s(147456,128,3,"conv128_2"),y=s(589824,256,3,"conv256_down",!0),b=s(589824,256,3,"conv256_1"),x=s(589824,256,3,"conv256_2"),v=s(589824,256,3,"conv256_down_out"),I=O(()=>$e(Na(t(256*128),[128,256]),[1,0]));if(a.push({paramPath:"fc"}),n().length!==0)throw new Error(`weights remaing after extract: ${n().length}`);return{params:{conv32_down:i,conv32_1:o,conv32_2:l,conv32_3:u,conv64_down:p,conv64_1:d,conv64_2:c,conv64_3:h,conv128_down:m,conv128_1:f,conv128_2:g,conv256_down:y,conv256_1:b,conv256_2:x,conv256_down_out:v,fc:I},paramMappings:a}}function wpe(e,t){let n=ra(e,t);function a(i){let o=n(`${i}/scale/weights`,1),l=n(`${i}/scale/biases`,1);return{weights:o,biases:l}}function r(i){let o=n(`${i}/conv/filters`,4),l=n(`${i}/conv/bias`,1),u=a(i);return{conv:{filters:o,bias:l},scale:u}}function s(i){return{conv1:r(`${i}/conv1`),conv2:r(`${i}/conv2`)}}return{extractConvLayerParams:r,extractResidualLayerParams:s}}function e$(e){let t=[],{extractConvLayerParams:n,extractResidualLayerParams:a}=wpe(e,t),r=n("conv32_down"),s=a("conv32_1"),i=a("conv32_2"),o=a("conv32_3"),l=a("conv64_down"),u=a("conv64_1"),p=a("conv64_2"),d=a("conv64_3"),c=a("conv128_down"),h=a("conv128_1"),m=a("conv128_2"),f=a("conv256_down"),g=a("conv256_1"),y=a("conv256_2"),b=a("conv256_down_out"),{fc:x}=e;if(t.push({originalPath:"fc",paramPath:"fc"}),!d1(x))throw new Error(`expected weightMap[fc] to be a Tensor2D, instead have ${x}`);let v={conv32_down:r,conv32_1:s,conv32_2:i,conv32_3:o,conv64_down:l,conv64_1:u,conv64_2:p,conv64_3:d,conv128_down:c,conv128_1:h,conv128_2:m,conv256_down:f,conv256_1:g,conv256_2:y,conv256_down_out:b,fc:x};return Fn(e,t),{params:v,paramMappings:t}}function tr(e,t){let n=ZA(e,t.conv1);return n=T1(n,t.conv2),n=Z(n,e),n=Xe(n),n}function Td(e,t){let n=Sg(e,t.conv1);n=T1(n,t.conv2);let a=fa(e,2,2,"valid"),r=It(a.shape),s=a.shape[3]!==n.shape[3];if(a.shape[1]!==n.shape[1]||a.shape[2]!==n.shape[2]){let o=[...n.shape];o[1]=1;let l=It(o);n=Qe([n,l],1);let u=[...n.shape];u[2]=1;let p=It(u);n=Qe([n,p],2)}return a=s?Qe([a,r],3):a,n=Z(a,n),n=Xe(n),n}var yp=class extends dn{constructor(){super("FaceRecognitionNet")}forwardInput(t){let{params:n}=this;if(!n)throw new Error("FaceRecognitionNet - load model before inference");return O(()=>{let a=le(t.toBatchTensor(150,!0),"float32"),s=yr(a,[122.782,117.001,104.298]).div(255),i=Sg(s,n.conv32_down);i=Mt(i,3,2,"valid"),i=tr(i,n.conv32_1),i=tr(i,n.conv32_2),i=tr(i,n.conv32_3),i=Td(i,n.conv64_down),i=tr(i,n.conv64_1),i=tr(i,n.conv64_2),i=tr(i,n.conv64_3),i=Td(i,n.conv128_down),i=tr(i,n.conv128_1),i=tr(i,n.conv128_2),i=Td(i,n.conv256_down),i=tr(i,n.conv256_1),i=tr(i,n.conv256_2),i=Td(i,n.conv256_down_out);let o=i.mean([1,2]);return Re(o,n.fc)})}async forward(t){return this.forwardInput(await kt(t))}async computeFaceDescriptor(t){var s;if((s=t==null?void 0:t.shape)!=null&&s.some(i=>i<=0))return new Float32Array(128);let n=await kt(t),a=O(()=>mt(this.forwardInput(n))),r=await Promise.all(a.map(i=>i.data()));return a.forEach(i=>i.dispose()),n.isBatchInput?r:r[0]}getDefaultModelName(){return"face_recognition_model"}extractParamsFromWeightMap(t){return e$(t)}extractParams(t){return QA(t)}};function $ke(e){let t=new yp;return t.extractWeights(e),t}function C1(e,t){return{...e,...{descriptor:t}}}function Mke(e){return typeof e.age=="number"}function _1(e,t){return{...e,...{age:t}}}function zke(e){return(e.gender==="male"||e.gender==="female")&&ep(e.genderProbability)}function E1(e,t,n){return{...e,...{gender:t,genderProbability:n}}}function kpe(e,t){function n(l,u){let p=Ea(e(9*l),[3,3,l,1]),d=Ke(e(l)),c=Ke(e(l)),h=Ke(e(l)),m=Ke(e(l));return t.push({paramPath:`${u}/filters`},{paramPath:`${u}/batch_norm_scale`},{paramPath:`${u}/batch_norm_offset`},{paramPath:`${u}/batch_norm_mean`},{paramPath:`${u}/batch_norm_variance`}),{filters:p,batch_norm_scale:d,batch_norm_offset:c,batch_norm_mean:h,batch_norm_variance:m}}function a(l,u,p,d,c){let h=Ea(e(l*u*p*p),[p,p,l,u]),m=Ke(e(u));return t.push({paramPath:`${d}/filters`},{paramPath:`${d}/${c?"batch_norm_offset":"bias"}`}),{filters:h,bias:m}}function r(l,u,p,d){let{filters:c,bias:h}=a(l,u,p,d,!0);return{filters:c,batch_norm_offset:h}}function s(l,u,p){let d=n(l,`${p}/depthwise_conv`),c=r(l,u,1,`${p}/pointwise_conv`);return{depthwise_conv:d,pointwise_conv:c}}function i(){let l=r(3,32,3,"mobilenetv1/conv_0"),u=s(32,64,"mobilenetv1/conv_1"),p=s(64,128,"mobilenetv1/conv_2"),d=s(128,128,"mobilenetv1/conv_3"),c=s(128,256,"mobilenetv1/conv_4"),h=s(256,256,"mobilenetv1/conv_5"),m=s(256,512,"mobilenetv1/conv_6"),f=s(512,512,"mobilenetv1/conv_7"),g=s(512,512,"mobilenetv1/conv_8"),y=s(512,512,"mobilenetv1/conv_9"),b=s(512,512,"mobilenetv1/conv_10"),x=s(512,512,"mobilenetv1/conv_11"),v=s(512,1024,"mobilenetv1/conv_12"),I=s(1024,1024,"mobilenetv1/conv_13");return{conv_0:l,conv_1:u,conv_2:p,conv_3:d,conv_4:c,conv_5:h,conv_6:m,conv_7:f,conv_8:g,conv_9:y,conv_10:b,conv_11:x,conv_12:v,conv_13:I}}function o(){let l=r(1024,256,1,"prediction_layer/conv_0"),u=r(256,512,3,"prediction_layer/conv_1"),p=r(512,128,1,"prediction_layer/conv_2"),d=r(128,256,3,"prediction_layer/conv_3"),c=r(256,128,1,"prediction_layer/conv_4"),h=r(128,256,3,"prediction_layer/conv_5"),m=r(256,64,1,"prediction_layer/conv_6"),f=r(64,128,3,"prediction_layer/conv_7"),g=a(512,12,1,"prediction_layer/box_predictor_0/box_encoding_predictor"),y=a(512,9,1,"prediction_layer/box_predictor_0/class_predictor"),b=a(1024,24,1,"prediction_layer/box_predictor_1/box_encoding_predictor"),x=a(1024,18,1,"prediction_layer/box_predictor_1/class_predictor"),v=a(512,24,1,"prediction_layer/box_predictor_2/box_encoding_predictor"),I=a(512,18,1,"prediction_layer/box_predictor_2/class_predictor"),T=a(256,24,1,"prediction_layer/box_predictor_3/box_encoding_predictor"),_=a(256,18,1,"prediction_layer/box_predictor_3/class_predictor"),A=a(256,24,1,"prediction_layer/box_predictor_4/box_encoding_predictor"),F=a(256,18,1,"prediction_layer/box_predictor_4/class_predictor"),P=a(128,24,1,"prediction_layer/box_predictor_5/box_encoding_predictor"),$=a(128,18,1,"prediction_layer/box_predictor_5/class_predictor");return{conv_0:l,conv_1:u,conv_2:p,conv_3:d,conv_4:c,conv_5:h,conv_6:m,conv_7:f,box_predictor_0:{box_encoding_predictor:g,class_predictor:y},box_predictor_1:{box_encoding_predictor:b,class_predictor:x},box_predictor_2:{box_encoding_predictor:v,class_predictor:I},box_predictor_3:{box_encoding_predictor:T,class_predictor:_},box_predictor_4:{box_encoding_predictor:A,class_predictor:F},box_predictor_5:{box_encoding_predictor:P,class_predictor:$}}}return{extractMobilenetV1Params:i,extractPredictionLayerParams:o}}function t$(e){let t=[],{extractWeights:n,getRemainingWeights:a}=Dn(e),{extractMobilenetV1Params:r,extractPredictionLayerParams:s}=kpe(n,t),i=r(),o=s(),u={extra_dim:zc(n(5118*4),[1,5118,4])};if(t.push({paramPath:"output_layer/extra_dim"}),a().length!==0)throw new Error(`weights remaing after extract: ${a().length}`);return{params:{mobilenetv1:i,prediction_layer:o,output_layer:u},paramMappings:t}}function Ipe(e,t){let n=ra(e,t);function a(u,p,d){let c=n(`${u}/Conv2d_${p}_pointwise/weights`,4,`${d}/filters`),h=n(`${u}/Conv2d_${p}_pointwise/convolution_bn_offset`,1,`${d}/batch_norm_offset`);return{filters:c,batch_norm_offset:h}}function r(u){let p=`mobilenetv1/conv_${u}`,d=`MobilenetV1/Conv2d_${u}_depthwise`,c=`${p}/depthwise_conv`,h=`${p}/pointwise_conv`,m=n(`${d}/depthwise_weights`,4,`${c}/filters`),f=n(`${d}/BatchNorm/gamma`,1,`${c}/batch_norm_scale`),g=n(`${d}/BatchNorm/beta`,1,`${c}/batch_norm_offset`),y=n(`${d}/BatchNorm/moving_mean`,1,`${c}/batch_norm_mean`),b=n(`${d}/BatchNorm/moving_variance`,1,`${c}/batch_norm_variance`);return{depthwise_conv:{filters:m,batch_norm_scale:f,batch_norm_offset:g,batch_norm_mean:y,batch_norm_variance:b},pointwise_conv:a("MobilenetV1",u,h)}}function s(){return{conv_0:a("MobilenetV1",0,"mobilenetv1/conv_0"),conv_1:r(1),conv_2:r(2),conv_3:r(3),conv_4:r(4),conv_5:r(5),conv_6:r(6),conv_7:r(7),conv_8:r(8),conv_9:r(9),conv_10:r(10),conv_11:r(11),conv_12:r(12),conv_13:r(13)}}function i(u,p){let d=n(`${u}/weights`,4,`${p}/filters`),c=n(`${u}/biases`,1,`${p}/bias`);return{filters:d,bias:c}}function o(u){let p=i(`Prediction/BoxPredictor_${u}/BoxEncodingPredictor`,`prediction_layer/box_predictor_${u}/box_encoding_predictor`),d=i(`Prediction/BoxPredictor_${u}/ClassPredictor`,`prediction_layer/box_predictor_${u}/class_predictor`);return{box_encoding_predictor:p,class_predictor:d}}function l(){return{conv_0:a("Prediction",0,"prediction_layer/conv_0"),conv_1:a("Prediction",1,"prediction_layer/conv_1"),conv_2:a("Prediction",2,"prediction_layer/conv_2"),conv_3:a("Prediction",3,"prediction_layer/conv_3"),conv_4:a("Prediction",4,"prediction_layer/conv_4"),conv_5:a("Prediction",5,"prediction_layer/conv_5"),conv_6:a("Prediction",6,"prediction_layer/conv_6"),conv_7:a("Prediction",7,"prediction_layer/conv_7"),box_predictor_0:o(0),box_predictor_1:o(1),box_predictor_2:o(2),box_predictor_3:o(3),box_predictor_4:o(4),box_predictor_5:o(5)}}return{extractMobilenetV1Params:s,extractPredictionLayerParams:l}}function n$(e){let t=[],{extractMobilenetV1Params:n,extractPredictionLayerParams:a}=Ipe(e,t),r=e["Output/extra_dim"];if(t.push({originalPath:"Output/extra_dim",paramPath:"output_layer/extra_dim"}),!Rr(r))throw new Error(`expected weightMap['Output/extra_dim'] to be a Tensor3D, instead have ${r}`);let s={mobilenetv1:n(),prediction_layer:a(),output_layer:{extra_dim:r}};return Fn(e,t),{params:s,paramMappings:t}}function Fa(e,t,n){return O(()=>{let a=Dt(e,t.filters,n,"same");return a=Z(a,t.batch_norm_offset),tn(a,0,6)})}var Spe=.0010000000474974513;function Npe(e,t,n){return O(()=>{let a=xs(e,t.filters,n,"same");return a=bs(a,t.batch_norm_mean,t.batch_norm_variance,t.batch_norm_offset,t.batch_norm_scale,Spe),tn(a,0,6)})}function Tpe(e){return[2,4,6,12].some(t=>t===e)?[2,2]:[1,1]}function a$(e,t){return O(()=>{let n,a=Fa(e,t.conv_0,[2,2]);if([t.conv_1,t.conv_2,t.conv_3,t.conv_4,t.conv_5,t.conv_6,t.conv_7,t.conv_8,t.conv_9,t.conv_10,t.conv_11,t.conv_12,t.conv_13].forEach((s,i)=>{let o=i+1,l=Tpe(o);a=Npe(a,s.depthwise_conv,l),a=Fa(a,s.pointwise_conv,[1,1]),o===11&&(n=a)}),n===null)throw new Error("mobileNetV1 - output of conv layer 11 is null");return{out:a,conv11:n}})}function Cpe(e,t,n){let a=e.arraySync(),r=Math.min(a[t][0],a[t][2]),s=Math.min(a[t][1],a[t][3]),i=Math.max(a[t][0],a[t][2]),o=Math.max(a[t][1],a[t][3]),l=Math.min(a[n][0],a[n][2]),u=Math.min(a[n][1],a[n][3]),p=Math.max(a[n][0],a[n][2]),d=Math.max(a[n][1],a[n][3]),c=(i-r)*(o-s),h=(p-l)*(d-u);if(c<=0||h<=0)return 0;let m=Math.max(r,l),f=Math.max(s,u),g=Math.min(i,p),y=Math.min(o,d),b=Math.max(g-m,0)*Math.max(y-f,0);return b/(c+h-b)}function r$(e,t,n,a,r){let s=e.shape[0],i=Math.min(n,s),o=t.map((p,d)=>({score:p,boxIndex:d})).filter(p=>p.score>r).sort((p,d)=>d.score-p.score),l=p=>p<=a?1:0,u=[];return o.forEach(p=>{if(u.length>=i)return;let d=p.score;for(let c=u.length-1;c>=0;--c){let h=Cpe(e,p.boxIndex,u[c]);if(h!==0&&(p.score*=l(h),p.score<=r))break}d===p.score&&u.push(p.boxIndex)}),u}function _pe(e){let t=mt($e(e,[1,0])),n=[ce(t[2],t[0]),ce(t[3],t[1])],a=[Z(t[0],fe(n[0],2)),Z(t[1],fe(n[1],2))];return{sizes:n,centers:a}}function Epe(e,t){let{sizes:n,centers:a}=_pe(e),r=mt($e(t,[1,0])),s=fe(B(gn(fe(r[2],5)),n[0]),2),i=Z(B(fe(r[0],10),n[0]),a[0]),o=fe(B(gn(fe(r[3],5)),n[1]),2),l=Z(B(fe(r[1],10),n[1]),a[1]);return $e(Rt([ce(i,s),ce(l,o),Z(i,s),Z(l,o)]),[1,0])}function s$(e,t,n){return O(()=>{let a=e.shape[0],r=Epe(W(zn(n.extra_dim,[a,1,1]),[-1,4]),W(e,[-1,4]));r=W(r,[a,r.shape[0]/a,4]);let s=da(He(t,[0,0,1],[-1,-1,-1])),i=He(s,[0,0,0],[-1,-1,1]);i=W(i,[a,i.shape[1]]);let o=mt(r),l=mt(i);return{boxes:o,scores:l}})}function Fo(e,t){return O(()=>{let n=e.shape[0],a=W($o(e,t.box_encoding_predictor),[n,-1,1,4]),r=W($o(e,t.class_predictor),[n,-1,3]);return{boxPredictionEncoding:a,classPrediction:r}})}function i$(e,t,n){return O(()=>{let a=Fa(e,n.conv_0,[1,1]),r=Fa(a,n.conv_1,[2,2]),s=Fa(r,n.conv_2,[1,1]),i=Fa(s,n.conv_3,[2,2]),o=Fa(i,n.conv_4,[1,1]),l=Fa(o,n.conv_5,[2,2]),u=Fa(l,n.conv_6,[1,1]),p=Fa(u,n.conv_7,[2,2]),d=Fo(t,n.box_predictor_0),c=Fo(e,n.box_predictor_1),h=Fo(r,n.box_predictor_2),m=Fo(i,n.box_predictor_3),f=Fo(l,n.box_predictor_4),g=Fo(p,n.box_predictor_5),y=Qe([d.boxPredictionEncoding,c.boxPredictionEncoding,h.boxPredictionEncoding,m.boxPredictionEncoding,f.boxPredictionEncoding,g.boxPredictionEncoding],1),b=Qe([d.classPrediction,c.classPrediction,h.classPrediction,m.classPrediction,f.classPrediction,g.classPrediction],1);return{boxPredictions:y,classPredictions:b}})}var Da=class{constructor({minConfidence:t,maxResults:n}={}){this._name="SsdMobilenetv1Options";if(this._minConfidence=t||.5,this._maxResults=n||100,typeof this._minConfidence!="number"||this._minConfidence<=0||this._minConfidence>=1)throw new Error(`${this._name} - expected minConfidence to be a number between 0 and 1`);if(typeof this._maxResults!="number")throw new Error(`${this._name} - expected maxResults to be a number`)}get minConfidence(){return this._minConfidence}get maxResults(){return this._maxResults}};var Do=class extends dn{constructor(){super("SsdMobilenetv1")}forwardInput(t){let{params:n}=this;if(!n)throw new Error("SsdMobilenetv1 - load model before inference");return O(()=>{let a=le(t.toBatchTensor(512,!1),"float32"),r=ce(fe(a,127.5),1),s=a$(r,n.mobilenetv1),{boxPredictions:i,classPredictions:o}=i$(s.out,s.conv11,n.prediction_layer);return s$(i,o,n.output_layer)})}async forward(t){return this.forwardInput(await kt(t))}async locateFaces(t,n={}){let{maxResults:a,minConfidence:r}=new Da(n),s=await kt(t),{boxes:i,scores:o}=this.forwardInput(s),l=i[0],u=o[0];for(let x=1;x{let[v,I]=[Math.max(0,y[x][0]),Math.min(1,y[x][2])].map(A=>A*g),[T,_]=[Math.max(0,y[x][1]),Math.min(1,y[x][3])].map(A=>A*f);return new wt(p[x],new np(T,v,_-T,I-v),{height:s.getInputHeight(0),width:s.getInputWidth(0)})});return l.dispose(),u.dispose(),b}getDefaultModelName(){return"ssd_mobilenetv1_model"}extractParamsFromWeightMap(t){return n$(t)}extractParams(t){return t$(t)}};function Ape(e){let t=new Do;return t.extractWeights(e),t}function $Ie(e){return Ape(e)}var o$=class extends Do{};var l$=.4,u$=[new Oe(.738768,.874946),new Oe(2.42204,2.65704),new Oe(4.30971,7.04493),new Oe(10.246,4.59428),new Oe(12.6868,11.8741)],p$=[new Oe(1.603231,2.094468),new Oe(6.041143,7.080126),new Oe(2.882459,3.518061),new Oe(4.266906,5.178857),new Oe(9.041765,10.66308)],c$=[117.001,114.697,97.404],d$="tiny_yolov2_model",h$="tiny_yolov2_separable_conv_model";var Ng=e=>typeof e=="number";function m$(e){if(!e)throw new Error(`invalid config: ${e}`);if(typeof e.withSeparableConvs!="boolean")throw new Error(`config.withSeparableConvs has to be a boolean, have: ${e.withSeparableConvs}`);if(!Ng(e.iouThreshold)||e.iouThreshold<0||e.iouThreshold>1)throw new Error(`config.iouThreshold has to be a number between [0, 1], have: ${e.iouThreshold}`);if(!Array.isArray(e.classes)||!e.classes.length||!e.classes.every(t=>typeof t=="string"))throw new Error(`config.classes has to be an array class names: string[], have: ${JSON.stringify(e.classes)}`);if(!Array.isArray(e.anchors)||!e.anchors.length||!e.anchors.map(t=>t||{}).every(t=>Ng(t.x)&&Ng(t.y)))throw new Error(`config.anchors has to be an array of { x: number, y: number }, have: ${JSON.stringify(e.anchors)}`);if(e.meanRgb&&(!Array.isArray(e.meanRgb)||e.meanRgb.length!==3||!e.meanRgb.every(Ng)))throw new Error(`config.meanRgb has to be an array of shape [number, number, number], have: ${JSON.stringify(e.meanRgb)}`)}function bp(e){return O(()=>{let t=B(e,ke(.10000000149011612));return Z(Xe(ce(e,t)),t)})}function zr(e,t){return O(()=>{let n=ga(e,[[0,0],[1,1],[1,1],[0,0]]);return n=Dt(n,t.conv.filters,[1,1],"valid"),n=ce(n,t.bn.sub),n=B(n,t.bn.truediv),n=Z(n,t.conv.bias),bp(n)})}function Br(e,t){return O(()=>{let n=ga(e,[[0,0],[1,1],[1,1],[0,0]]);return n=ks(n,t.depthwise_filter,t.pointwise_filter,[1,1],"valid"),n=Z(n,t.bias),bp(n)})}function $pe(e,t){let n=up(e,t);function a(i,o){let l=Ke(e(i)),u=Ke(e(i));return t.push({paramPath:`${o}/sub`},{paramPath:`${o}/truediv`}),{sub:l,truediv:u}}function r(i,o,l){let u=n(i,o,3,`${l}/conv`),p=a(o,`${l}/bn`);return{conv:u,bn:p}}let s=pp(e,t);return{extractConvParams:n,extractConvWithBatchNormParams:r,extractSeparableConvParams:s}}function f$(e,t,n,a){let{extractWeights:r,getRemainingWeights:s}=Dn(e),i=[],{extractConvParams:o,extractConvWithBatchNormParams:l,extractSeparableConvParams:u}=$pe(r,i),p;if(t.withSeparableConvs){let[d,c,h,m,f,g,y,b,x]=a,v=t.isFirstLayerConv2d?o(d,c,3,"conv0"):u(d,c,"conv0"),I=u(c,h,"conv1"),T=u(h,m,"conv2"),_=u(m,f,"conv3"),A=u(f,g,"conv4"),F=u(g,y,"conv5"),P=b?u(y,b,"conv6"):void 0,$=x?u(b,x,"conv7"):void 0,S=o(x||b||y,5*n,1,"conv8");p={conv0:v,conv1:I,conv2:T,conv3:_,conv4:A,conv5:F,conv6:P,conv7:$,conv8:S}}else{let[d,c,h,m,f,g,y,b,x]=a,v=l(d,c,"conv0"),I=l(c,h,"conv1"),T=l(h,m,"conv2"),_=l(m,f,"conv3"),A=l(f,g,"conv4"),F=l(g,y,"conv5"),P=l(y,b,"conv6"),$=l(b,x,"conv7"),S=o(x,5*n,1,"conv8");p={conv0:v,conv1:I,conv2:T,conv3:_,conv4:A,conv5:F,conv6:P,conv7:$,conv8:S}}if(s().length!==0)throw new Error(`weights remaing after extract: ${s().length}`);return{params:p,paramMappings:i}}function Fpe(e,t){let n=ra(e,t);function a(o){let l=n(`${o}/sub`,1),u=n(`${o}/truediv`,1);return{sub:l,truediv:u}}function r(o){let l=n(`${o}/filters`,4),u=n(`${o}/bias`,1);return{filters:l,bias:u}}function s(o){let l=r(`${o}/conv`),u=a(`${o}/bn`);return{conv:l,bn:u}}let i=cp(n);return{extractConvParams:r,extractConvWithBatchNormParams:s,extractSeparableConvParams:i}}function g$(e,t){let n=[],{extractConvParams:a,extractConvWithBatchNormParams:r,extractSeparableConvParams:s}=Fpe(e,n),i;if(t.withSeparableConvs){let o=t.filterSizes&&t.filterSizes.length||9;i={conv0:t.isFirstLayerConv2d?a("conv0"):s("conv0"),conv1:s("conv1"),conv2:s("conv2"),conv3:s("conv3"),conv4:s("conv4"),conv5:s("conv5"),conv6:o>7?s("conv6"):void 0,conv7:o>8?s("conv7"):void 0,conv8:a("conv8")}}else i={conv0:r("conv0"),conv1:r("conv1"),conv2:r("conv2"),conv3:r("conv3"),conv4:r("conv4"),conv5:r("conv5"),conv6:r("conv6"),conv7:r("conv7"),conv8:a("conv8")};return Fn(e,n),{params:i,paramMappings:n}}var br=class{constructor({inputSize:t,scoreThreshold:n}={}){this._name="TinyYolov2Options";if(this._inputSize=t||416,this._scoreThreshold=n||.5,typeof this._inputSize!="number"||this._inputSize%32!==0)throw new Error(`${this._name} - expected inputSize to be a number divisible by 32`);if(typeof this._scoreThreshold!="number"||this._scoreThreshold<=0||this._scoreThreshold>=1)throw new Error(`${this._name} - expected scoreThreshold to be a number between 0 and 1`)}get inputSize(){return this._inputSize}get scoreThreshold(){return this._scoreThreshold}};var A1=class extends dn{constructor(n){super("TinyYolov2");m$(n),this._config=n}get config(){return this._config}get withClassScores(){return this.config.withClassScores||this.config.classes.length>1}get boxEncodingSize(){return 5+(this.withClassScores?this.config.classes.length:0)}runTinyYolov2(n,a){let r=zr(n,a.conv0);return r=Mt(r,[2,2],[2,2],"same"),r=zr(r,a.conv1),r=Mt(r,[2,2],[2,2],"same"),r=zr(r,a.conv2),r=Mt(r,[2,2],[2,2],"same"),r=zr(r,a.conv3),r=Mt(r,[2,2],[2,2],"same"),r=zr(r,a.conv4),r=Mt(r,[2,2],[2,2],"same"),r=zr(r,a.conv5),r=Mt(r,[2,2],[1,1],"same"),r=zr(r,a.conv6),r=zr(r,a.conv7),$o(r,a.conv8,"valid",!1)}runMobilenet(n,a){let r=this.config.isFirstLayerConv2d?bp($o(n,a.conv0,"valid",!1)):Br(n,a.conv0);return r=Mt(r,[2,2],[2,2],"same"),r=Br(r,a.conv1),r=Mt(r,[2,2],[2,2],"same"),r=Br(r,a.conv2),r=Mt(r,[2,2],[2,2],"same"),r=Br(r,a.conv3),r=Mt(r,[2,2],[2,2],"same"),r=Br(r,a.conv4),r=Mt(r,[2,2],[2,2],"same"),r=Br(r,a.conv5),r=Mt(r,[2,2],[1,1],"same"),r=a.conv6?Br(r,a.conv6):r,r=a.conv7?Br(r,a.conv7):r,$o(r,a.conv8,"valid",!1)}forwardInput(n,a){let{params:r}=this;if(!r)throw new Error("TinyYolov2 - load model before inference");return O(()=>{let s=le(n.toBatchTensor(a,!1),"float32");return s=this.config.meanRgb?yr(s,this.config.meanRgb):s,s=s.div(255),this.config.withSeparableConvs?this.runMobilenet(s,r):this.runTinyYolov2(s,r)})}async forward(n,a){return this.forwardInput(await kt(n),a)}async detect(n,a={}){let{inputSize:r,scoreThreshold:s}=new br(a),i=await kt(n),o=await this.forwardInput(i,r),l=O(()=>mt(o)[0].expandDims()),u={width:i.getInputWidth(0),height:i.getInputHeight(0)},p=await this.extractBoxes(l,i.getReshapedInputDimensions(0),s);o.dispose(),l.dispose();let d=p.map(y=>y.box),c=p.map(y=>y.score),h=p.map(y=>y.classScore),m=p.map(y=>this.config.classes[y.label]);return SA(d.map(y=>y.rescale(r)),c,this.config.iouThreshold,!0).map(y=>new Cs(c[y],h[y],m[y],d[y],u))}getDefaultModelName(){return""}extractParamsFromWeightMap(n){return g$(n,this.config)}extractParams(n){let a=this.config.filterSizes||A1.DEFAULT_FILTER_SIZES,r=a?a.length:void 0;if(r!==7&&r!==8&&r!==9)throw new Error(`TinyYolov2 - expected 7 | 8 | 9 convolutional filters, but found ${r} filterSizes in config`);return f$(n,this.config,this.boxEncodingSize,a)}async extractBoxes(n,a,r){let{width:s,height:i}=a,o=Math.max(s,i),l=o/s,u=o/i,p=n.shape[1],d=this.config.anchors.length,[c,h,m]=O(()=>{let b=n.reshape([p,p,d,this.boxEncodingSize]),x=b.slice([0,0,0,0],[p,p,d,4]),v=b.slice([0,0,0,4],[p,p,d,1]),I=this.withClassScores?Za(b.slice([0,0,0,5],[p,p,d,this.config.classes.length]),3):ke(0);return[x,v,I]}),f=[],g=await h.array(),y=await c.array();for(let b=0;br){let T=(x+sg(y[b][x][v][0]))/p*l,_=(b+sg(y[b][x][v][1]))/p*u,A=Math.exp(y[b][x][v][2])*this.config.anchors[v].x/p*l,F=Math.exp(y[b][x][v][3])*this.config.anchors[v].y/p*u,P=T-A/2,$=_-F/2,S={row:b,col:x,anchor:v},{classScore:M,label:U}=this.withClassScores?await this.extractPredictedClass(m,S):{classScore:1,label:0};f.push({box:new tp(P,$,P+A,$+F),score:I,classScore:I*M,label:U,...S})}}return c.dispose(),h.dispose(),m.dispose(),f}async extractPredictedClass(n,a){let{row:r,col:s,anchor:i}=a,o=await n.array();return Array(this.config.classes.length).fill(0).map((l,u)=>o[r][s][i][u]).map((l,u)=>({classScore:l,label:u})).reduce((l,u)=>l.classScore>u.classScore?l:u)}},Ro=A1;Ro.DEFAULT_FILTER_SIZES=[3,16,32,64,128,256,512,1024,1024];var xp=class extends Ro{constructor(t=!0){let n={withSeparableConvs:t,iouThreshold:l$,classes:["face"],...t?{anchors:p$,meanRgb:c$}:{anchors:u$,withClassScores:!0}};super(n)}get withSeparableConvs(){return this.config.withSeparableConvs}get anchors(){return this.config.anchors}async locateFaces(t,n){return(await this.detect(t,n)).map(r=>new wt(r.score,r.relativeBox,{width:r.imageWidth,height:r.imageHeight}))}getDefaultModelName(){return this.withSeparableConvs?h$:d$}extractParamsFromWeightMap(t){return super.extractParamsFromWeightMap(t)}};function kSe(e,t=!0){let n=new xp(t);return n.extractWeights(e),n}var Tg=class extends br{constructor(){super(...arguments);this._name="TinyFaceDetectorOptions"}};var Ra=class{async then(t){return t(await this.run())}async run(){throw new Error("ComposableTask - run is not implemented")}};async function Mo(e,t,n,a,r=({alignedRect:s})=>s){let s=e.map(l=>mp(l)?r(l):l.detection),i=a||(t instanceof Ae?await wd(t,s):await vd(t,s)),o=await n(i);return i.forEach(l=>l instanceof Ae&&l.dispose()),o}async function vp(e,t,n,a,r){return Mo([e],t,async s=>n(s[0]),a,r)}var y$=.4,b$=[new Oe(1.603231,2.094468),new Oe(6.041143,7.080126),new Oe(2.882459,3.518061),new Oe(4.266906,5.178857),new Oe(9.041765,10.66308)],x$=[117.001,114.697,97.404];var wp=class extends Ro{constructor(){let t={withSeparableConvs:!0,iouThreshold:y$,classes:["face"],anchors:b$,meanRgb:x$,isFirstLayerConv2d:!0,filterSizes:[3,16,32,64,128,256,512]};super(t)}get anchors(){return this.config.anchors}async locateFaces(t,n){return(await this.detect(t,n)).map(r=>new wt(r.score,r.relativeBox,{width:r.imageWidth,height:r.imageHeight}))}getDefaultModelName(){return"tiny_face_detector_model"}extractParamsFromWeightMap(t){return super.extractParamsFromWeightMap(t)}};var rt={ssdMobilenetv1:new Do,tinyFaceDetector:new wp,tinyYolov2:new xp,faceLandmark68Net:new gp,faceLandmark68TinyNet:new Ig,faceRecognitionNet:new yp,faceExpressionNet:new yg,ageGenderNet:new wg},Dpe=(e,t)=>rt.ssdMobilenetv1.locateFaces(e,t),ZSe=(e,t)=>rt.tinyFaceDetector.locateFaces(e,t),QSe=(e,t)=>rt.tinyYolov2.locateFaces(e,t),Rpe=e=>rt.faceLandmark68Net.detectLandmarks(e),eNe=e=>rt.faceLandmark68TinyNet.detectLandmarks(e),tNe=e=>rt.faceRecognitionNet.computeFaceDescriptor(e),nNe=e=>rt.faceExpressionNet.predictExpressions(e),aNe=e=>rt.ageGenderNet.predictAgeAndGender(e),Mpe=e=>rt.ssdMobilenetv1.load(e),rNe=e=>rt.tinyFaceDetector.load(e),sNe=e=>rt.tinyYolov2.load(e),iNe=e=>rt.faceLandmark68Net.load(e),oNe=e=>rt.faceLandmark68TinyNet.load(e),lNe=e=>rt.faceRecognitionNet.load(e),uNe=e=>rt.faceExpressionNet.load(e),pNe=e=>rt.ageGenderNet.load(e),cNe=Mpe,dNe=Dpe,hNe=Rpe;var Cg=class extends Ra{constructor(n,a,r){super();this.parentTask=n;this.input=a;this.extractedFaces=r}},Po=class extends Cg{async run(){let t=await this.parentTask,n=await Mo(t,this.input,async a=>Promise.all(a.map(r=>rt.faceExpressionNet.predictExpressions(r))),this.extractedFaces);return t.map((a,r)=>k1(a,n[r]))}withAgeAndGender(){return new Lo(this,this.input)}},Oo=class extends Cg{async run(){let t=await this.parentTask;if(!t)return;let n=await vp(t,this.input,a=>rt.faceExpressionNet.predictExpressions(a),this.extractedFaces);return k1(t,n)}withAgeAndGender(){return new zo(this,this.input)}},As=class extends Po{withAgeAndGender(){return new Fs(this,this.input)}withFaceDescriptors(){return new Rs(this,this.input)}},$s=class extends Oo{withAgeAndGender(){return new Ds(this,this.input)}withFaceDescriptor(){return new Ms(this,this.input)}};var _g=class extends Ra{constructor(n,a,r){super();this.parentTask=n;this.input=a;this.extractedFaces=r}},Lo=class extends _g{async run(){let t=await this.parentTask,n=await Mo(t,this.input,async a=>Promise.all(a.map(r=>rt.ageGenderNet.predictAgeAndGender(r))),this.extractedFaces);return t.map((a,r)=>{let{age:s,gender:i,genderProbability:o}=n[r];return _1(E1(a,i,o),s)})}withFaceExpressions(){return new Po(this,this.input)}},zo=class extends _g{async run(){let t=await this.parentTask;if(!t)return;let{age:n,gender:a,genderProbability:r}=await vp(t,this.input,s=>rt.ageGenderNet.predictAgeAndGender(s),this.extractedFaces);return _1(E1(t,a,r),n)}withFaceExpressions(){return new Oo(this,this.input)}},Fs=class extends Lo{withFaceExpressions(){return new As(this,this.input)}withFaceDescriptors(){return new Rs(this,this.input)}},Ds=class extends zo{withFaceExpressions(){return new $s(this,this.input)}withFaceDescriptor(){return new Ms(this,this.input)}};var Eg=class extends Ra{constructor(n,a){super();this.parentTask=n;this.input=a}},Rs=class extends Eg{async run(){let t=await this.parentTask;return(await Mo(t,this.input,a=>Promise.all(a.map(r=>rt.faceRecognitionNet.computeFaceDescriptor(r))),null,a=>a.landmarks.align(null,{useDlibAlignment:!0}))).map((a,r)=>C1(t[r],a))}withFaceExpressions(){return new As(this,this.input)}withAgeAndGender(){return new Fs(this,this.input)}},Ms=class extends Eg{async run(){let t=await this.parentTask;if(!t)return;let n=await vp(t,this.input,a=>rt.faceRecognitionNet.computeFaceDescriptor(a),null,a=>a.landmarks.align(null,{useDlibAlignment:!0}));return C1(t,n)}withFaceExpressions(){return new $s(this,this.input)}withAgeAndGender(){return new Ds(this,this.input)}};var Ag=class extends Ra{constructor(n,a,r){super();this.parentTask=n;this.input=a;this.useTinyLandmarkNet=r}get landmarkNet(){return this.useTinyLandmarkNet?rt.faceLandmark68TinyNet:rt.faceLandmark68Net}},$g=class extends Ag{async run(){let t=await this.parentTask,n=t.map(i=>i.detection),a=this.input instanceof Ae?await wd(this.input,n):await vd(this.input,n),r=await Promise.all(a.map(i=>this.landmarkNet.detectLandmarks(i)));return a.forEach(i=>i instanceof Ae&&i.dispose()),t.filter((i,o)=>r[o]).map((i,o)=>Nd(i,r[o]))}withFaceExpressions(){return new As(this,this.input)}withAgeAndGender(){return new Fs(this,this.input)}withFaceDescriptors(){return new Rs(this,this.input)}},Fg=class extends Ag{async run(){let t=await this.parentTask;if(!t)return;let{detection:n}=t,a=this.input instanceof Ae?await wd(this.input,[n]):await vd(this.input,[n]),r=await this.landmarkNet.detectLandmarks(a[0]);return a.forEach(s=>s instanceof Ae&&s.dispose()),Nd(t,r)}withFaceExpressions(){return new $s(this,this.input)}withAgeAndGender(){return new Ds(this,this.input)}withFaceDescriptor(){return new Ms(this,this.input)}};var Dg=class extends Ra{constructor(n,a=new Da){super();this.input=n;this.options=a}},Cd=class extends Dg{async run(){let{input:t,options:n}=this,a;if(n instanceof Tg)a=rt.tinyFaceDetector.locateFaces(t,n);else if(n instanceof Da)a=rt.ssdMobilenetv1.locateFaces(t,n);else if(n instanceof br)a=rt.tinyYolov2.locateFaces(t,n);else throw new Error("detectFaces - expected options to be instance of TinyFaceDetectorOptions | SsdMobilenetv1Options | TinyYolov2Options");return a}runAndExtendWithFaceDetections(){return new Promise((t,n)=>{this.run().then(a=>t(a.map(r=>rp({},r)))).catch(a=>n(a))})}withFaceLandmarks(t=!1){return new $g(this.runAndExtendWithFaceDetections(),this.input,t)}withFaceExpressions(){return new Po(this.runAndExtendWithFaceDetections(),this.input)}withAgeAndGender(){return new Lo(this.runAndExtendWithFaceDetections(),this.input)}},Rg=class extends Dg{async run(){let t=await new Cd(this.input,this.options),n=t[0];return t.forEach(a=>{a.score>n.score&&(n=a)}),n}runAndExtendWithFaceDetection(){return new Promise(async t=>{let n=await this.run();t(n?rp({},n):void 0)})}withFaceLandmarks(t=!1){return new Fg(this.runAndExtendWithFaceDetection(),this.input,t)}withFaceExpressions(){return new Oo(this.runAndExtendWithFaceDetection(),this.input)}withAgeAndGender(){return new zo(this.runAndExtendWithFaceDetection(),this.input)}};function p2e(e,t=new Da){return new Rg(e,t)}function $1(e,t=new Da){return new Cd(e,t)}async function Ppe(e,t){return $1(e,new Da(t?{minConfidence:t}:{})).withFaceLandmarks().withFaceDescriptors()}async function g2e(e,t={}){return $1(e,new br(t)).withFaceLandmarks().withFaceDescriptors()}var y2e=Ppe;function v$(e,t){if(e.length!==t.length)throw new Error("euclideanDistance: arr1.length !== arr2.length");let n=Array.from(e),a=Array.from(t);return Math.sqrt(n.map((r,s)=>r-a[s]).reduce((r,s)=>r+s**2,0))}var Mg=class{constructor(t,n=.6){this._distanceThreshold=n;let a=Array.isArray(t)?t:[t];if(!a.length)throw new Error("FaceRecognizer.constructor - expected atleast one input");let r=1,s=()=>`person ${r++}`;this._labeledDescriptors=a.map(i=>{if(i instanceof Mr)return i;if(i instanceof Float32Array)return new Mr(s(),[i]);if(i.descriptor&&i.descriptor instanceof Float32Array)return new Mr(s(),[i.descriptor]);throw new Error("FaceRecognizer.constructor - expected inputs to be of type LabeledFaceDescriptors | WithFaceDescriptor | Float32Array | Array | Float32Array>")})}get labeledDescriptors(){return this._labeledDescriptors}get distanceThreshold(){return this._distanceThreshold}computeMeanDistance(t,n){return n.map(a=>v$(a,t)).reduce((a,r)=>a+r,0)/(n.length||1)}matchDescriptor(t){return this.labeledDescriptors.map(({descriptors:n,label:a})=>new gd(a,this.computeMeanDistance(t,n))).reduce((n,a)=>n.distancet.toJSON())}}static fromJSON(t){let n=t.labeledDescriptors.map(a=>Mr.fromJSON(a));return new Mg(n,t.distanceThreshold)}};function M2e(e){let t=new wp;return t.extractWeights(e),t}function Ope(e,t){let{width:n,height:a}=new $n(t.width,t.height);if(n<=0||a<=0)throw new Error(`resizeResults - invalid dimensions: ${JSON.stringify({width:n,height:a})}`);if(Array.isArray(e))return e.map(r=>Ope(r,{width:n,height:a}));if(mp(e)){let r=e.detection.forSize(n,a),s=e.unshiftedLandmarks.forSize(r.box.width,r.box.height);return Nd(rp(e,r),s)}return Pr(e)?rp(e,e.detection.forSize(n,a)):e instanceof xa||e instanceof wt?e.forSize(n,a):e}var j2e=VA;export{wg as AgeGenderNet,tp as BoundingBox,ct as Box,Ra as ComposableTask,Rs as ComputeAllFaceDescriptorsTask,Eg as ComputeFaceDescriptorsTaskBase,Ms as ComputeSingleFaceDescriptorTask,$g as DetectAllFaceLandmarksTask,Cd as DetectAllFacesTask,Ag as DetectFaceLandmarksTaskBase,Dg as DetectFacesTaskBase,Fg as DetectSingleFaceLandmarksTask,Rg as DetectSingleFaceTask,$n as Dimensions,zA as FACE_EXPRESSION_LABELS,wt as FaceDetection,o$ as FaceDetectionNet,yg as FaceExpressionNet,Es as FaceExpressions,gp as FaceLandmark68Net,Ig as FaceLandmark68TinyNet,YA as FaceLandmarkNet,xa as FaceLandmarks,TA as FaceLandmarks5,ap as FaceLandmarks68,gd as FaceMatch,Mg as FaceMatcher,yp as FaceRecognitionNet,S1 as Gender,yd as LabeledBox,Mr as LabeledFaceDescriptors,Lr as NetInput,dn as NeuralNetwork,Cs as ObjectDetection,Oe as Point,CA as PredictedBox,np as Rect,Do as SsdMobilenetv1,Da as SsdMobilenetv1Options,wp as TinyFaceDetector,Tg as TinyFaceDetectorOptions,xp as TinyYolov2,br as TinyYolov2Options,y2e as allFaces,Ppe as allFacesSsdMobilenetv1,g2e as allFacesTinyYolov2,_A as awaitMediaLoaded,EA as bufferToImage,tNe as computeFaceDescriptor,lp as createCanvas,ug as createCanvasFromMedia,$Ie as createFaceDetectionNet,$ke as createFaceRecognitionNet,Ape as createSsdMobilenetv1,M2e as createTinyFaceDetector,kSe as createTinyYolov2,$1 as detectAllFaces,Rpe as detectFaceLandmarks,eNe as detectFaceLandmarksTiny,hNe as detectLandmarks,p2e as detectSingleFace,WA as draw,at as env,v$ as euclideanDistance,_1 as extendWithAge,C1 as extendWithFaceDescriptor,rp as extendWithFaceDetection,k1 as extendWithFaceExpressions,Nd as extendWithFaceLandmarks,E1 as extendWithGender,wd as extractFaceTensors,vd as extractFaces,Wxe as fetchImage,FA as fetchJson,jxe as fetchNetWeights,_s as fetchOrThrow,Zxe as fetchVideo,aa as getContext2dOrThrow,op as getMediaDimensions,AA as imageTensorToCanvas,$A as imageToSquare,nye as inverseSigmoid,kA as iou,w1 as isMediaElement,lg as isMediaLoaded,Mke as isWithAge,Pr as isWithFaceDetection,BA as isWithFaceExpressions,mp as isWithFaceLandmarks,zke as isWithGender,pNe as loadAgeGenderModel,cNe as loadFaceDetectionModel,uNe as loadFaceExpressionModel,iNe as loadFaceLandmarkModel,oNe as loadFaceLandmarkTinyModel,lNe as loadFaceRecognitionModel,Mpe as loadSsdMobilenetv1Model,rNe as loadTinyFaceDetectorModel,sNe as loadTinyYolov2Model,RA as loadWeightMap,dNe as locateFaces,sve as matchDimensions,IA as minBbox,rt as nets,SA as nonMaxSuppression,yr as normalize,NA as padToSquare,aNe as predictAgeAndGender,nNe as recognizeFaceExpressions,Ope as resizeResults,sp as resolveInput,eye as shuffleArray,sg as sigmoid,Dpe as ssdMobilenetv1,Be as tf,ZSe as tinyFaceDetector,QSe as tinyYolov2,kt as toNetInput,wA as utils,m$ as validateConfig,j2e as version}; + ${r.shape}`);if(s.shape.length!==1)throw new Error(`Target shape should be a vector but received shape ${s.shape}`);let i=t.dataIdMap.get(a.dataId).id,o=t.dataIdMap.get(r.dataId).id,l=t.dataIdMap.get(s.dataId).id,u=a.shape[0],p=w.sizeFromShape(s.shape),d=t.makeOutput([u,p],a.dtype),c=t.dataIdMap.get(d.dataId).id,h=t.makeOutput([p],s.dtype),m=t.dataIdMap.get(h.dataId).id,f=t.makeOutput([3],"int32"),g=t.dataIdMap.get(f.dataId).id;uA(i,o,l,u,c,m,g);let y=t.readSync(f.dataId),b;switch(y[0]){case 0:{b=C.getSparseReshapeMultipleNegativeOneOutputDimErrorMessage(y[1],y[2]);break}case 1:{b=C.getSparseReshapeNegativeOutputDimErrorMessage(y[1],y[2]);break}case 2:b=C.getSparseReshapeEmptyTensorZeroOutputDimErrorMessage();break;case 3:{let x=Array.from(t.readSync(r.dataId)),v=Array.from(t.readSync(h.dataId));b=C.getSparseReshapeInputOutputMultipleErrorMessage(x,v);break}case 4:{let x=Array.from(t.readSync(r.dataId)),v=Array.from(t.readSync(h.dataId));b=C.getSparseReshapeInputOutputMismatchErrorMessage(x,v);break}default:b=""}if(t.disposeData(f.dataId),b)throw t.disposeData(d.dataId),t.disposeData(h.dataId),new Error(b);return[d,h]}var Kle={kernelName:Tu,backendName:"wasm",setupFunc:jle,kernelFunc:qle},pA;function cA(e){pA=e.wasm.cwrap("SparseSegmentReduction",null,["number","number","number","number","number","number","number","number","number"])}function dA(e,t){let{backend:n,inputs:a}=e,{data:r,indices:s,segmentIds:i}=a,o=s.shape[0],l=n.readSync(i.dataId,o-1,o)[0],u=o>0?l+1:0;if(u<0)throw new Error(C.getSparseSegmentReductionNegativeSegmentIdsErrorMessage());let p=r.shape.slice();p[0]=u;let d=n.dataIdMap.get(r.dataId).id,c=n.dataIdMap.get(s.dataId).id,h=n.dataIdMap.get(i.dataId).id,m=n.makeOutput(p,r.dtype),f=n.dataIdMap.get(m.dataId).id,g=n.makeOutput([4],"int32"),y=n.dataIdMap.get(g.dataId).id;pA(d,$t[r.dtype],r.shape[0],c,h,f,y,t,0);let b=n.readSync(g.dataId),x;switch(b[0]){case 0:{x=C.getSparseSegmentReductionNegativeSegmentIdsErrorMessage();break}case 1:{x=C.getSparseSegmentReductionNonIncreasingSegmentIdsErrorMessage();break}case 2:x=C.getSparseSegmentReductionSegmentIdOutOfRangeErrorMessage(b[1],b[2]);break;case 3:x=C.getSparseSegmentReductionIndicesOutOfRangeErrorMessage(b[1],b[2],b[3]);break;default:x=""}if(n.disposeData(g.dataId),x)throw n.disposeData(m.dataId),new Error(x);return m}function Xle(e){return dA(e,!0)}var Yle={kernelName:Tc,backendName:"wasm",setupFunc:cA,kernelFunc:Xle};function Jle(e){return dA(e,!1)}var Zle={kernelName:Cc,backendName:"wasm",setupFunc:cA,kernelFunc:Jle};function Qle(e){let{inputs:t,attrs:n,backend:a}=e,{x:r}=t,{numOrSizeSplits:s,axis:i}=n,o=w.parseAxisParam(i,r.shape)[0],l=C.prepareSplitSize(r,s,o),u=new Array(r.shape.length).fill(0),p=r.shape.slice();return l.map(d=>{let c=[...p];c[o]=d;let h=bi({inputs:{x:r},attrs:{begin:u,size:c},backend:a});return u[o]+=d,h})}var eue={kernelName:Nu,backendName:"wasm",kernelFunc:Qle},tue=rn(po),nue=rn(_c),aue=!0,rue=cn(mo,aue),hA;function sue(e){hA=e.wasm.cwrap(fs,null,["number","number","number","number"])}function iue(e){let{backend:t,inputs:n,attrs:a}=e,{alpha:r}=a,{x:s}=n,i=t.dataIdMap.get(s.dataId).id,o=t.makeOutput(s.shape,s.dtype),l=t.dataIdMap.get(o.dataId).id;return hA(i,r,$t[s.dtype],l),o}var oue={kernelName:fs,backendName:"wasm",setupFunc:sue,kernelFunc:iue},mA;function lue(e){mA=e.wasm.cwrap(Cu,null,["number","array","number","array","array","array","array","array","number","number"])}function uue(e){let{backend:t,inputs:n,attrs:a}=e,{x:r}=n,{begin:s,end:i,strides:o,beginMask:l,endMask:u,ellipsisMask:p,newAxisMask:d,shrinkAxisMask:c}=a,{finalShapeSparse:h,finalShape:m,isIdentity:f,sliceDim0:g,isSimpleSlice:y,begin:b,end:x,strides:v}=qt.sliceInfo(r.shape,s,i,o,l,u,p,d,c),I;if(f)I=Vn({inputs:{x:r},backend:t,attrs:{shape:m}});else if(g||y){w.assert(r.shape.length>=1,()=>`Input must have rank at least 1, got: ${r.shape.length}`);let T=qt.computeOutShape(b,x,v),_=bi({inputs:{x:r},backend:t,attrs:{begin:b,size:T}});I=Vn({inputs:{x:_},backend:t,attrs:{shape:m}}),t.disposeData(_.dataId)}else{let T=t.makeOutput(h,"float32"),_=t.dataIdMap.get(r.dataId).id,A=new Uint8Array(new Int32Array(w.computeStrides(r.shape)).buffer),F=new Uint8Array(new Int32Array(b).buffer),P=new Uint8Array(new Int32Array(x).buffer),$=new Uint8Array(new Int32Array(v).buffer),S=new Uint8Array(new Int32Array(h).buffer),M=new Uint8Array(new Int32Array(w.computeStrides(h)).buffer),U=t.dataIdMap.get(T.dataId).id;mA(_,A,r.shape.length,F,P,$,S,M,h.length,U),I=Vn({inputs:{x:T},backend:t,attrs:{shape:m}}),t.disposeData(T.dataId)}return I}var pue={kernelName:Cu,backendName:"wasm",setupFunc:lue,kernelFunc:uue};function cue(e){let{backend:t,inputs:n,attrs:a}=e,{data:r,dataSplits:s}=n,{separator:i,nGramWidths:o,leftPad:l,rightPad:u,padWidth:p,preserveShortSequences:d}=a,c=t.readSync(r.dataId),h=t.readSync(s.dataId),[m,f]=G0(c,h,i,o,l,u,p,d),g=t.makeOutput([m.length],"string"),y=t.dataIdMap.get(g.dataId);y.stringBytes=m;let b=t.makeOutput(s.shape,"int32");return t.typedArrayFromHeap(b).set(f),[g,b]}var due={kernelName:Ec,backendName:"wasm",kernelFunc:cue};function hue(e){let{backend:t,inputs:n,attrs:a}=e,{input:r,delimiter:s}=n,{skipEmpty:i}=a,o=t.readSync(r.dataId),l=t.readSync(s.dataId),[u,p,d]=H0(o,l[0],i),c=p.length,h=t.makeOutput([c,2],"int32");t.typedArrayFromHeap(h).set(u);let m=t.makeOutput([c],"string"),f=t.dataIdMap.get(m.dataId);f.stringBytes=p;let g=t.makeOutput([2],"int32");return t.typedArrayFromHeap(g).set(d),[h,m,g]}var mue={kernelName:Ac,backendName:"wasm",kernelFunc:hue};function fue(e){let{backend:t,inputs:n,attrs:a}=e,{input:r}=n,{numBuckets:s}=a,i=t.readSync(r.dataId),o=j0(i,s),l=t.makeOutput(r.shape,"int32");return t.typedArrayFromHeap(l).set(o),l}var gue={kernelName:$c,backendName:"wasm",kernelFunc:fue},yue=!0,bue=cn(fo,yue),fA;function xue(e){fA=e.wasm.cwrap(co,null,["number","number","number","number"])}function vue(e){let{backend:t,inputs:n,attrs:a}=e,{axis:r,keepDims:s}=a,{x:i}=n,o=t.dataIdMap.get(i.dataId).id,l=o,u=i,{transposed:p,axes:d,originalAxes:c,inputWasTransposed:h}=Ts(i,r,t),m=d;if(h){let x=t.dataIdMap.get(p.dataId).id;x!==o&&(u=p,l=x,m=C.getInnerMostAxes(m.length,u.shape.length))}C.assertAxesAreInnerMostDims("sum",m,u.shape.length);let[f,g]=C.computeOutAndReduceShapes(u.shape,m),y=w.sizeFromShape(g),b=t.makeOutput(f,u.dtype);if(w.sizeFromShape(u.shape)!==0){let x=t.dataIdMap.get(b.dataId).id;fA(l,y,$t[b.dtype],x)}if(h&&t.disposeData(p.dataId),s){let x=C.expandShapeToKeepDim(b.shape,c);b.shape=x}return b}var wue={kernelName:co,backendName:"wasm",setupFunc:xue,kernelFunc:vue},kue=rn(go),Iue=rn(yo),gA;function Sue(e){gA=e.wasm.cwrap(ms,null,["number","array","number","array","number","number"])}function Nue(e){let{inputs:t,backend:n,attrs:a}=e,{x:r}=t,s=n.dataIdMap.get(r.dataId).id,{reps:i}=a,o=new Array(r.shape.length);for(let c=0;c{let{x:a}=e,{k:r,sorted:s}=n,i=t.dataIdMap.get(a.dataId).id,o=new Uint8Array(new Int32Array(a.shape).buffer),l=a.shape.slice();l[l.length-1]=r;let u=t.makeOutput(l,a.dtype),p=t.dataIdMap.get(u.dataId).id,d=t.makeOutput(l,"int32"),c=t.dataIdMap.get(d.dataId).id;return yA(i,o,a.shape.length,$t[a.dtype],r,s,p,c),[u,d]},Eue={kernelName:_u,backendName:"wasm",setupFunc:Cue,kernelFunc:_ue},bA;function Aue(e){bA=e.wasm.cwrap(Eu,null,["number","number","bool","number","number","number","number","number","number","array","number","number","number","number","number"])}function $ue(e){let{backend:t,inputs:n,attrs:a}=e,{image:r,transforms:s}=n,{interpolation:i,fillMode:o,fillValue:l,outputShape:u}=a,[p,d,c,h]=r.shape,[m,f]=u!=null?u:[d,c],g=[p,m,f,h],y=new Uint8Array(new Int32Array(w.computeStrides(r.shape)).buffer),b=t.makeOutput(g,r.dtype),x=t.dataIdMap.get(b.dataId).id,v=t.dataIdMap.get(r.dataId).id,I=t.dataIdMap.get(s.dataId).id,T=i==="nearest"?1:2,_;switch(o){case"constant":_=1;break;case"reflect":_=2;break;case"wrap":_=3;break;case"nearest":_=4;break;default:_=1;break}return bA(v,I,s.shape[0]>1,p,m,f,h,c,d,y,r.shape.length-1,T,_,l,x),b}var Fue={kernelName:Eu,backendName:"wasm",setupFunc:Aue,kernelFunc:$ue};function Due(e){let{inputs:t,backend:n,attrs:a}=e,{value:r}=t,{axis:s}=a;s<0&&(s+=r.shape.length);let i=r.shape[s],o=r.shape.length,l=new Array(o-1),u=0;for(let h=0;h({dataId:h,dtype:m,shape:l}))}var Rue={kernelName:Au,backendName:"wasm",kernelFunc:Due};function Mue(e){let{inputs:{x:t},backend:n}=e,a=n.makeOutput(t.shape,t.dtype);return n.typedArrayFromHeap(a).fill(0),a}var Pue={kernelName:$u,backendName:"wasm",kernelFunc:Mue},Oue=[cse,dse,mse,yse,Nse,_se,$se,Rse,Lse,Gse,Hse,jse,Xse,Yse,Qse,nie,aie,rie,oie,pie,hie,gie,xie,vie,kie,Iie,Sie,Nie,_ie,Eie,$ie,Rie,Oie,Bie,Uie,jie,Kie,Yie,bse,Qie,toe,aoe,roe,ioe,ooe,uoe,coe,moe,goe,xoe,koe,Noe,Coe,Aoe,Foe,Doe,Poe,zoe,Voe,Goe,qoe,Xoe,Joe,JE,tle,rle,ole,ule,cle,dle,hle,Mse,gle,xle,kle,Nle,Tle,Cle,Ale,Dle,Ple,Ole,Vse,Ble,Vle,Hle,Kle,Yle,Zle,eue,tue,nue,rue,oue,pue,due,mue,gue,bue,wue,kue,Iue,Tue,Eue,Fue,kse,Rue,Pue];for(let e of Oue)Dc(e);var Ex=X();Ex.registerFlag("WASM_HAS_SIMD_SUPPORT",async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,9,1,7,0,65,0,253,15,26,11])));Ex.registerFlag("WASM_HAS_MULTITHREAD_SUPPORT",async()=>{if(Ex.get("IS_NODE"))return!1;try{return new MessageChannel().port1.postMessage(new SharedArrayBuffer(1)),WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,5,4,1,3,1,1,10,11,1,9,0,65,0,254,16,2,0,26,11]))}catch(e){return!1}});var kI=ps(PF()),Lue=ps(OF()),II=ps(LF()),SI=kI.default||kI,zue=II.default||II,xA=class extends fc{constructor(e){super(),this.wasm=e,this.dataIdNextNumber=1,this.wasm.tfjs.initWithThreadsCount(vA),Ax=this.wasm.tfjs.getThreadsCount(),this.dataIdMap=new pm(this,ar())}write(e,t,n){let a={id:this.dataIdNextNumber++};return this.move(a,e,t,n,1),a}numDataIds(){return this.dataIdMap.numDataIds()}async time(e){let t=w.now();return e(),{kernelMs:w.now()-t}}move(e,t,n,a,r){let s=this.dataIdNextNumber++;if(a==="string"){let u=t;this.dataIdMap.set(e,{id:s,stringBytes:u,shape:n,dtype:a,memoryOffset:null,refCount:r});return}let i=w.sizeFromShape(n),o=i*w.bytesPerElement(a),l=this.wasm._malloc(o);this.dataIdMap.set(e,{id:s,memoryOffset:l,shape:n,dtype:a,refCount:r}),this.wasm.tfjs.registerTensor(s,i,l),t!=null&&this.wasm.HEAPU8.set(new Uint8Array(t.buffer,t.byteOffset,o),l)}async read(e){return this.readSync(e)}readSync(e,t,n){let{memoryOffset:a,dtype:r,shape:s,stringBytes:i}=this.dataIdMap.get(e);if(r==="string")return(t==null||t===0)&&(n==null||n>=i.length)?i:i.slice(t,n);t=t||0,n=n||w.sizeFromShape(s);let o=w.bytesPerElement(r),l=this.wasm.HEAPU8.slice(a+t*o,a+n*o);return Vue(l.buffer,r)}disposeData(e,t=!1){if(this.dataIdMap.has(e)){let n=this.dataIdMap.get(e);if(n.refCount--,!t&&n.refCount>0)return!1;this.wasm._free(n.memoryOffset),this.wasm.tfjs.disposeData(n.id),this.dataIdMap.delete(e)}return!0}refCount(e){return this.dataIdMap.has(e)?this.dataIdMap.get(e).refCount:0}incRef(e){let t=this.dataIdMap.get(e);t!=null&&t.refCount++}floatPrecision(){return 32}getMemoryOffset(e){return this.dataIdMap.get(e).memoryOffset}dispose(){this.wasm.tfjs.dispose(),"PThread"in this.wasm&&this.wasm.PThread.terminateAllThreads(),this.wasm=null}memory(){return{unreliable:!1}}makeOutput(e,t,n){let a;if(n==null)a=this.write(null,e,t);else{let r=this.dataIdNextNumber++;a={id:r},this.dataIdMap.set(a,{id:r,memoryOffset:n,shape:e,dtype:t,refCount:1});let s=w.sizeFromShape(e);this.wasm.tfjs.registerTensor(r,s,n)}return{dataId:a,shape:e,dtype:t}}typedArrayFromHeap({shape:e,dtype:t,dataId:n}){let a=this.wasm.HEAPU8.buffer,{memoryOffset:r}=this.dataIdMap.get(n),s=w.sizeFromShape(e);switch(t){case"float32":return new Float32Array(a,r,s);case"int32":return new Int32Array(a,r,s);case"bool":return new Uint8Array(a,r,s);default:throw new Error(`Unknown dtype ${t}`)}}};function Bue(e){return(t,n)=>(w.fetch(e,{credentials:"same-origin"}).then(a=>{a.ok||t.env.a(`failed to load wasm binary file at '${e}'`),a.arrayBuffer().then(r=>{WebAssembly.instantiate(r,t).then(s=>{n(s.instance,s.module)})})}),{})}function NI(e,t,n){if(lm!=null)return lm;let a="tfjs-backend-wasm.wasm";return e&&t?a="tfjs-backend-wasm-threaded-simd.wasm":e&&(a="tfjs-backend-wasm-simd.wasm"),Jp!=null&&Jp[a]!=null?Jp[a]:n+a}async function Wue(){let[e,t]=await Promise.all([X().getAsync("WASM_HAS_SIMD_SUPPORT"),X().getAsync("WASM_HAS_MULTITHREAD_SUPPORT")]);return new Promise((n,a)=>{let r={};r.locateFile=(o,l)=>{if(o.endsWith(".worker.js")){let u=Lue.wasmWorkerContents.replace(/\n/g,"\\n"),p=new Blob([u],{type:"application/javascript"});return URL.createObjectURL(p)}return o.endsWith(".wasm")?NI(e,t,Kp!=null?Kp:l):l+o},c1&&(r.instantiateWasm=Bue(NI(e,t,Kp!=null?Kp:"")));let s=!1;r.onAbort=()=>{s||Zp||(Zp=!0,a({message:"Make sure the server can serve the `.wasm` file relative to the bundled js file. For more details see https://github.com/tensorflow/tfjs/blob/master/tfjs-backend-wasm/README.md#using-bundlers"}))};let i;t&&e&&lm==null?(r.mainScriptUrlOrBlob=new Blob(["var WasmBackendModuleThreadedSimd = "+SI.toString()],{type:"text/javascript"}),i=SI(r)):i=zue(r),i.then(o=>{s=!0,Zp=!1;let l=null;o.tfjs={init:o.cwrap("init",null,[]),initWithThreadsCount:o.cwrap("init_with_threads_count",null,["number"]),getThreadsCount:o.cwrap("get_threads_count","number",[]),registerTensor:o.cwrap("register_tensor",null,["number","number","number"]),disposeData:o.cwrap("dispose_data",l,["number"]),dispose:o.cwrap("dispose",l,[])},n({wasm:o})}).catch(a)})}function Vue(e,t){switch(t){case"float32":return new Float32Array(e);case"int32":return new Int32Array(e);case"bool":return new Uint8Array(e);default:throw new Error(`Unknown dtype ${t}`)}}var Uue=["tfjs-backend-wasm.wasm","tfjs-backend-wasm-simd.wasm","tfjs-backend-wasm-threaded-simd.wasm"],lm=null,Kp=null,Jp={},Zp=!1,c1=!1;function Gue(e,t=!1){if(qx("setWasmPath has been deprecated in favor of setWasmPaths and will be removed in a future release."),Zp)throw new Error("The WASM backend was already initialized. Make sure you call `setWasmPath()` before you call `tf.setBackend()` or `tf.ready()`");lm=e,c1=t}function Hue(e,t=!1){if(Zp)throw new Error("The WASM backend was already initialized. Make sure you call `setWasmPaths()` before you call `tf.setBackend()` or `tf.ready()`");if(typeof e=="string")Kp=e;else{Jp=e;let n=Uue.filter(a=>Jp[a]==null);if(n.length>0)throw new Error(`There were no entries found for the following binaries: ${n.join(",")}. Please either call setWasmPaths with a map providing a path for each binary, or with a string indicating the directory where all the binaries can be found.`)}c1=t}var vA=-1,Ax=-1;function jue(e){vA=e}function que(){if(Ax===-1)throw new Error("WASM backend not initialized.");return Ax}var Kue="3.19.0",Xue=2;Gm("wasm",async()=>{let{wasm:e}=await Wue();return new xA(e)},Xue);var Yue="3.19.0",Jue="3.19.0",Zue="3.19.0",Que="3.19.0",epe="3.19.0",tpe="3.19.0",npe="3.19.0",ape="3.19.0",rpe={tfjs:Yue,"tfjs-core":Jue,"tfjs-data":Zue,"tfjs-layers":Que,"tfjs-converter":epe,"tfjs-backend-cpu":tpe,"tfjs-backend-webgl":npe,"tfjs-backend-wasm":ape};var WA={};yb(WA,{AnchorPosition:()=>v1,DrawBox:()=>xd,DrawBoxOptions:()=>og,DrawFaceLandmarks:()=>xg,DrawFaceLandmarksOptions:()=>bg,DrawTextField:()=>Or,DrawTextFieldOptions:()=>ip,drawContour:()=>Dr,drawDetections:()=>cpe,drawFaceExpressions:()=>dpe,drawFaceLandmarks:()=>mpe});function Dr(e,t,n=!1){if(e.beginPath(),t.slice(1).forEach(({x:a,y:r},s)=>{let i=t[s];e.moveTo(i.x,i.y),e.lineTo(a,r)}),n){let a=t[t.length-1],r=t[0];if(!a||!r)return;e.moveTo(a.x,a.y),e.lineTo(r.x,r.y)}e.stroke()}var wA={};yb(wA,{computeReshapedDimensions:()=>m1,getCenterPoint:()=>Ao,isDimensions:()=>rg,isEven:()=>ag,isFloat:()=>h1,isTensor:()=>_o,isTensor1D:()=>spe,isTensor2D:()=>d1,isTensor3D:()=>Rr,isTensor4D:()=>ba,isValidNumber:()=>er,isValidProbablitiy:()=>ep,range:()=>gr,round:()=>Eo});var $n=class{constructor(t,n){if(!er(t)||!er(n))throw new Error(`Dimensions.constructor - expected width and height to be valid numbers, instead have ${JSON.stringify({width:t,height:n})}`);this._width=t,this._height=n}get width(){return this._width}get height(){return this._height}reverse(){return new $n(1/this.width,1/this.height)}};function _o(e,t){return e instanceof Ae&&e.shape.length===t}function spe(e){return _o(e,1)}function d1(e){return _o(e,2)}function Rr(e){return _o(e,3)}function ba(e){return _o(e,4)}function h1(e){return e%1!==0}function ag(e){return e%2===0}function Eo(e,t=2){let n=10**t;return Math.floor(e*n)/n}function rg(e){return e&&e.width&&e.height}function m1({width:e,height:t},n){let a=n/Math.max(t,e);return new $n(Math.round(e*a),Math.round(t*a))}function Ao(e){return e.reduce((t,n)=>t.add(n),new Oe(0,0)).div(new Oe(e.length,e.length))}function gr(e,t,n){return Array(e).fill(0).map((a,r)=>t+r*n)}function er(e){return!!e&&e!==1/0&&e!==-1/0&&!Number.isNaN(e)||e===0}function ep(e){return er(e)&&e>=0&&e<=1}var Oe=class{constructor(t,n){this._x=t,this._y=n}get x(){return this._x}get y(){return this._y}add(t){return new Oe(this.x+t.x,this.y+t.y)}sub(t){return new Oe(this.x-t.x,this.y-t.y)}mul(t){return new Oe(this.x*t.x,this.y*t.y)}div(t){return new Oe(this.x/t.x,this.y/t.y)}abs(){return new Oe(Math.abs(this.x),Math.abs(this.y))}magnitude(){return Math.sqrt(this.x**2+this.y**2)}floor(){return new Oe(Math.floor(this.x),Math.floor(this.y))}};var ct=class{static isRect(t){return!!t&&[t.x,t.y,t.width,t.height].every(er)}static assertIsValidBox(t,n,a=!1){if(!ct.isRect(t))throw new Error(`${n} - invalid box: ${JSON.stringify(t)}, expected object with properties x, y, width, height`);if(!a&&(t.width<0||t.height<0))throw new Error(`${n} - width (${t.width}) and height (${t.height}) must be positive numbers`)}constructor(t,n=!0){let a=t||{},r=[a.left,a.top,a.right,a.bottom].every(er),s=[a.x,a.y,a.width,a.height].every(er);if(!s&&!r)throw new Error(`Box.constructor - expected box to be IBoundingBox | IRect, instead have ${JSON.stringify(a)}`);let[i,o,l,u]=s?[a.x,a.y,a.width,a.height]:[a.left,a.top,a.right-a.left,a.bottom-a.top];ct.assertIsValidBox({x:i,y:o,width:l,height:u},"Box.constructor",n),this._x=i,this._y=o,this._width=l,this._height=u}get x(){return this._x}get y(){return this._y}get width(){return this._width}get height(){return this._height}get left(){return this.x}get top(){return this.y}get right(){return this.x+this.width}get bottom(){return this.y+this.height}get area(){return this.width*this.height}get topLeft(){return new Oe(this.left,this.top)}get topRight(){return new Oe(this.right,this.top)}get bottomLeft(){return new Oe(this.left,this.bottom)}get bottomRight(){return new Oe(this.right,this.bottom)}round(){let[t,n,a,r]=[this.x,this.y,this.width,this.height].map(s=>Math.round(s));return new ct({x:t,y:n,width:a,height:r})}floor(){let[t,n,a,r]=[this.x,this.y,this.width,this.height].map(s=>Math.floor(s));return new ct({x:t,y:n,width:a,height:r})}toSquare(){let{x:t,y:n,width:a,height:r}=this,s=Math.abs(a-r);return an&&(o=-d+n+a,d=n),c>t&&(l=-c+t+r,c=t),u<1&&(l=2-u,u=1),p<1&&(l=2-p,p=1),{dy:i,edy:l,dx:s,edx:o,y:p,ey:c,x:u,ex:d,w:a,h:r}}calibrate(t){return new ct({left:this.left+t.left*this.width,top:this.top+t.top*this.height,right:this.right+t.right*this.width,bottom:this.bottom+t.bottom*this.height}).toSquare().round()}};var tp=class extends ct{constructor(t,n,a,r,s=!1){super({left:t,top:n,right:a,bottom:r},s)}};var Cs=class{constructor(t,n,a,r,s){this._imageDims=new $n(s.width,s.height),this._score=t,this._classScore=n,this._className=a,this._box=new ct(r).rescale(this._imageDims)}get score(){return this._score}get classScore(){return this._classScore}get className(){return this._className}get box(){return this._box}get imageDims(){return this._imageDims}get imageWidth(){return this.imageDims.width}get imageHeight(){return this.imageDims.height}get relativeBox(){return new ct(this._box).rescale(this.imageDims.reverse())}forSize(t,n){return new Cs(this.score,this.classScore,this.className,this.relativeBox,{width:t,height:n})}};var wt=class extends Cs{constructor(t,n,a){super(t,t,"",n,a)}forSize(t,n){let{score:a,relativeBox:r,imageDims:s}=super.forSize(t,n);return new wt(a,r,s)}};function kA(e,t,n=!0){let a=Math.max(0,Math.min(e.right,t.right)-Math.max(e.left,t.left)),r=Math.max(0,Math.min(e.bottom,t.bottom)-Math.max(e.top,t.top)),s=a*r;return n?s/(e.area+t.area-s):s/Math.min(e.area,t.area)}function IA(e){let t=e.map(o=>o.x),n=e.map(o=>o.y),a=t.reduce((o,l)=>lloo({score:i,boxIndex:o})).sort((i,o)=>i.score-o.score).map(i=>i.boxIndex),s=[];for(;r.length>0;){let i=r.pop();s.push(i);let o=r,l=[];for(let u=0;ul[p]<=n)}return s}function yr(e,t){return O(()=>{let[n,a,r]=t,s=En([...e.shape.slice(0,3),1],n,"float32"),i=En([...e.shape.slice(0,3),1],a,"float32"),o=En([...e.shape.slice(0,3),1],r,"float32"),l=Qe([s,i,o],3);return ce(e,l)})}function NA(e,t=!1){return O(()=>{let[n,a]=e.shape.slice(1);if(n===a)return e;let r=Math.abs(n-a),s=Math.round(r*(t?.5:1)),i=n>a?2:1,o=c=>{let h=e.shape.slice();return h[i]=c,En(h,0,"float32")},l=o(s),u=r-l.shape[i],d=[t&&u?o(u):null,e,l].filter(c=>!!c).map(c=>le(c,"float32"));return Qe(d,i)})}function eye(e){let t=e.slice();for(let n=t.length-1;n>0;n--){let a=Math.floor(Math.random()*(n+1)),r=t[n];t[n]=t[a],t[a]=r}return t}function sg(e){return 1/(1+Math.exp(-e))}function nye(e){return Math.log(e/(1-e))}var np=class extends ct{constructor(t,n,a,r,s=!1){super({x:t,y:n,width:a,height:r},s)}};var ipe=.5,ope=.43,lpe=.45,xa=class{constructor(t,n,a=new Oe(0,0)){let{width:r,height:s}=n;this._imgDims=new $n(r,s),this._shift=a,this._positions=t.map(i=>i.mul(new Oe(r,s)).add(a))}get shift(){return new Oe(this._shift.x,this._shift.y)}get imageWidth(){return this._imgDims.width}get imageHeight(){return this._imgDims.height}get positions(){return this._positions}get relativePositions(){return this._positions.map(t=>t.sub(this._shift).div(new Oe(this.imageWidth,this.imageHeight)))}forSize(t,n){return new this.constructor(this.relativePositions,{width:t,height:n})}shiftBy(t,n){return new this.constructor(this.relativePositions,this._imgDims,new Oe(t,n))}shiftByPoint(t){return this.shiftBy(t.x,t.y)}align(t,n={}){if(t){let s=t instanceof wt?t.box.floor():new ct(t);return this.shiftBy(s.x,s.y).align(null,n)}let{useDlibAlignment:a,minBoxPadding:r}={useDlibAlignment:!1,minBoxPadding:.2,...n};return a?this.alignDlib():this.alignMinBbox(r)}alignDlib(){let t=this.getRefPointsForAlignment(),[n,a,r]=t,s=d=>r.sub(d).magnitude(),i=(s(n)+s(a))/2,o=Math.floor(i/lpe),l=Ao(t),u=Math.floor(Math.max(0,l.x-ipe*o)),p=Math.floor(Math.max(0,l.y-ope*o));return new np(u,p,Math.min(o,this.imageWidth+u),Math.min(o,this.imageHeight+p))}alignMinBbox(t){let n=IA(this.positions);return n.pad(n.width*t,n.height*t)}getRefPointsForAlignment(){throw new Error("getRefPointsForAlignment not implemented by base class")}};var TA=class extends xa{getRefPointsForAlignment(){let t=this.positions;return[t[0],t[1],Ao([t[3],t[4]])]}};var ap=class extends xa{getJawOutline(){return this.positions.slice(0,17)}getLeftEyeBrow(){return this.positions.slice(17,22)}getRightEyeBrow(){return this.positions.slice(22,27)}getNose(){return this.positions.slice(27,36)}getLeftEye(){return this.positions.slice(36,42)}getRightEye(){return this.positions.slice(42,48)}getMouth(){return this.positions.slice(48,68)}getRefPointsForAlignment(){return[this.getLeftEye(),this.getRightEye(),this.getMouth()].map(Ao)}};var gd=class{constructor(t,n){this._label=t,this._distance=n}get label(){return this._label}get distance(){return this._distance}toString(t=!0){return`${this.label}${t?` (${Eo(this.distance)})`:""}`}};var yd=class extends ct{constructor(n,a){super(n);this._label=a}static assertIsValidLabeledBox(n,a){if(ct.assertIsValidBox(n,a),!er(n.label))throw new Error(`${a} - expected property label (${n.label}) to be a number`)}get label(){return this._label}};var Mr=class{constructor(t,n){if(typeof t!="string")throw new Error("LabeledFaceDescriptors - constructor expected label to be a string");if(!Array.isArray(n)||n.some(a=>!(a instanceof Float32Array)))throw new Error("LabeledFaceDescriptors - constructor expected descriptors to be an array of Float32Array");this._label=t,this._descriptors=n}get label(){return this._label}get descriptors(){return this._descriptors}toJSON(){return{label:this.label,descriptors:this.descriptors.map(t=>Array.from(t))}}static fromJSON(t){let n=t.descriptors.map(a=>new Float32Array(a));return new Mr(t.label,n)}};var CA=class extends yd{constructor(n,a,r,s){super(n,a);this._score=r,this._classScore=s}static assertIsValidPredictedBox(n,a){if(yd.assertIsValidLabeledBox(n,a),!ep(n.score)||!ep(n.classScore))throw new Error(`${a} - expected properties score (${n.score}) and (${n.classScore}) to be a number between [0, 1]`)}get score(){return this._score}get classScore(){return this._classScore}};function Pr(e){return e.detection instanceof wt}function rp(e,t){return{...e,...{detection:t}}}function f1(){let e=window.fetch;if(!e)throw new Error("fetch - missing fetch implementation for browser environment");return{Canvas:HTMLCanvasElement,CanvasRenderingContext2D,Image:HTMLImageElement,ImageData,Video:HTMLVideoElement,createCanvasElement:()=>document.createElement("canvas"),createImageElement:()=>document.createElement("img"),createVideoElement:()=>document.createElement("video"),fetch:e,readFile:()=>{throw new Error("readFile - filesystem not available for browser environment")}}}function bd(){return typeof global=="object"&&typeof process!="undefined"&&process.versions!=null&&process.versions.node!=null}function ig(e){let t="";if(!e&&bd())try{e=fF("fs")}catch(a){t=a.toString()}return{readFile:e?a=>new Promise((r,s)=>{e.readFile(a,(i,o)=>i?s(i):r(o))}):()=>{throw new Error(`readFile - failed to require fs in nodejs environment with error: ${t}`)}}}function g1(){let e=global.Canvas||global.HTMLCanvasElement,t=global.Image||global.HTMLImageElement,n=global.Video||global.HTMLVideoElement,a=()=>{if(e)return new e;throw new Error("createCanvasElement - missing Canvas implementation for nodejs environment")},r=()=>{if(t)return new t;throw new Error("createImageElement - missing Image implementation for nodejs environment")},s=()=>{if(n)return new n;throw new Error("createVideoElement - missing Video implementation for nodejs environment")},i=global.fetch,o=ig();return{Canvas:e||class{},CanvasRenderingContext2D:global.CanvasRenderingContext2D||class{},Image:t||class{},ImageData:global.ImageData||class{},Video:global.HTMLVideoElement||class{},createCanvasElement:a,createImageElement:r,createVideoElement:s,fetch:i,...o}}function y1(){return typeof window=="object"&&typeof document!="undefined"&&typeof HTMLImageElement!="undefined"&&typeof HTMLCanvasElement!="undefined"&&typeof HTMLVideoElement!="undefined"&&typeof ImageData!="undefined"&&typeof CanvasRenderingContext2D!="undefined"}var sn;function upe(){if(!sn)throw new Error("getEnv - environment is not defined, check isNodejs() and isBrowser()");return sn}function b1(e){sn=e}function x1(){return y1()?b1(f1()):bd()?b1(g1()):null}function ppe(e){if(sn||x1(),!sn)throw new Error("monkeyPatch - environment is not defined, check isNodejs() and isBrowser()");let{Canvas:t=sn.Canvas,Image:n=sn.Image}=e;sn.Canvas=t,sn.Image=n,sn.createCanvasElement=e.createCanvasElement||(()=>new t),sn.createImageElement=e.createImageElement||(()=>new n),sn.ImageData=e.ImageData||sn.ImageData,sn.Video=e.Video||sn.Video,sn.fetch=e.fetch||sn.fetch,sn.readFile=e.readFile||sn.readFile}var at={getEnv:upe,setEnv:b1,initialize:x1,createBrowserEnv:f1,createFileSystem:ig,createNodejsEnv:g1,monkeyPatch:ppe,isBrowser:y1,isNodejs:bd};x1();function sp(e){return!at.isNodejs()&&typeof e=="string"?document.getElementById(e):e}function aa(e){let{Canvas:t,CanvasRenderingContext2D:n}=at.getEnv();if(e instanceof n)return e;let a=sp(e);if(!(a instanceof t))throw new Error("resolveContext2d - expected canvas to be of instance of Canvas");let r=a.getContext("2d");if(!r)throw new Error("resolveContext2d - canvas 2d context is null");return r}var v1=(r=>(r.TOP_LEFT="TOP_LEFT",r.TOP_RIGHT="TOP_RIGHT",r.BOTTOM_LEFT="BOTTOM_LEFT",r.BOTTOM_RIGHT="BOTTOM_RIGHT",r))(v1||{}),ip=class{constructor(t={}){let{anchorPosition:n,backgroundColor:a,fontColor:r,fontSize:s,fontStyle:i,padding:o}=t;this.anchorPosition=n||"TOP_LEFT",this.backgroundColor=a||"rgba(0, 0, 0, 0.5)",this.fontColor=r||"rgba(255, 255, 255, 1)",this.fontSize=s||14,this.fontStyle=i||"Georgia",this.padding=o||4}},Or=class{constructor(t,n,a={}){this.text=typeof t=="string"?[t]:t instanceof Or?t.text:t,this.anchor=n,this.options=new ip(a)}measureWidth(t){let{padding:n}=this.options;return this.text.map(a=>t.measureText(a).width).reduce((a,r)=>a{let m=l+d.x,f=l+d.y+(h+1)*i;a.fillText(c,m,f)})}};var og=class{constructor(t={}){let{boxColor:n,lineWidth:a,label:r,drawLabelOptions:s}=t;this.boxColor=n||"rgba(0, 0, 255, 1)",this.lineWidth=a||2,this.label=r;let i={anchorPosition:"BOTTOM_LEFT",backgroundColor:this.boxColor};this.drawLabelOptions=new ip({...i,...s})}},xd=class{constructor(t,n={}){this.box=new ct(t),this.options=new og(n)}draw(t){let n=aa(t),{boxColor:a,lineWidth:r}=this.options,{x:s,y:i,width:o,height:l}=this.box;n.strokeStyle=a,n.lineWidth=r,n.strokeRect(s,i,o,l);let{label:u}=this.options;u&&new Or([u],{x:s-r/2,y:i},this.options.drawLabelOptions).draw(t)}};function cpe(e,t){(Array.isArray(t)?t:[t]).forEach(a=>{let r=a instanceof wt?a.score:Pr(a)?a.detection.score:void 0,s=a instanceof wt?a.box:Pr(a)?a.detection.box:new ct(a),i=r?`${Eo(r)}`:void 0;new xd(s,{label:i}).draw(e)})}function lg(e){let{Image:t,Video:n}=at.getEnv();return e instanceof t&&e.complete||e instanceof n&&e.readyState>=3}function _A(e){return new Promise((t,n)=>{(e instanceof at.getEnv().Canvas||lg(e))&&t(null);function a(s){!s.currentTarget||(s.currentTarget.removeEventListener("load",r),s.currentTarget.removeEventListener("error",a),n(s))}function r(s){!s.currentTarget||(s.currentTarget.removeEventListener("load",r),s.currentTarget.removeEventListener("error",a),t(s))}e.addEventListener("load",r),e.addEventListener("error",a)})}function EA(e){return new Promise((t,n)=>{e instanceof Blob||n(new Error("bufferToImage - expected buf to be of type: Blob"));let a=new FileReader;a.onload=()=>{typeof a.result!="string"&&n(new Error("bufferToImage - expected reader.result to be a string, in onload"));let r=at.getEnv().createImageElement();r.onload=()=>t(r),r.onerror=n,r.src=a.result},a.onerror=n,a.readAsDataURL(e)})}function op(e){let{Image:t,Video:n}=at.getEnv();return e instanceof t?new $n(e.naturalWidth,e.naturalHeight):e instanceof n?new $n(e.videoWidth,e.videoHeight):new $n(e.width,e.height)}function lp({width:e,height:t}){let{createCanvasElement:n}=at.getEnv(),a=n();return a.width=e,a.height=t,a}function ug(e,t){let{ImageData:n}=at.getEnv();if(!(e instanceof n)&&!lg(e))throw new Error("createCanvasFromMedia - media has not finished loading yet");let{width:a,height:r}=t||op(e),s=lp({width:a,height:r});return e instanceof n?aa(s).putImageData(e,0,0):aa(s).drawImage(e,0,0,a,r),s}async function AA(e,t){let n=t||at.getEnv().createCanvasElement(),[a,r,s]=e.shape.slice(ba(e)?1:0),i=O(()=>e.as3D(a,r,s).toInt());return await bo.toPixels(i,n),i.dispose(),n}function w1(e){let{Image:t,Canvas:n,Video:a}=at.getEnv();return e instanceof t||e instanceof n||e instanceof a}function $A(e,t,n=!1){let{Image:a,Canvas:r}=at.getEnv();if(!(e instanceof a||e instanceof r))throw new Error("imageToSquare - expected arg0 to be HTMLImageElement | HTMLCanvasElement");if(t<=0)return lp({width:1,height:1});let s=op(e),i=t/Math.max(s.height,s.width),o=i*s.width,l=i*s.height,u=lp({width:t,height:t}),p=e instanceof r?e:ug(e),d=Math.abs(o-l)/2,c=n&&o0&&p.height>0&&aa(u).drawImage(p,c,h,o,l),u}var Lr=class{constructor(t,n=!1){this._imageTensors=[];this._canvases=[];this._treatAsBatchInput=!1;this._inputDimensions=[];this._inputSize=0;if(!Array.isArray(t))throw new Error(`NetInput.constructor - expected inputs to be an Array of TResolvedNetInput or to be instanceof tf.Tensor4D, instead have ${t}`);this._treatAsBatchInput=n,this._batchSize=t.length,t.forEach((a,r)=>{if(Rr(a)){this._imageTensors[r]=a,this._inputDimensions[r]=a.shape;return}if(ba(a)){let i=a.shape[0];if(i!==1)throw new Error(`NetInput - tf.Tensor4D with batchSize ${i} passed, but not supported in input array`);this._imageTensors[r]=a,this._inputDimensions[r]=a.shape.slice(1);return}let s=a instanceof at.getEnv().Canvas?a:ug(a);this._canvases[r]=s,this._inputDimensions[r]=[s.height,s.width,3]})}get imageTensors(){return this._imageTensors}get canvases(){return this._canvases}get isBatchInput(){return this.batchSize>1||this._treatAsBatchInput}get batchSize(){return this._batchSize}get inputDimensions(){return this._inputDimensions}get inputSize(){return this._inputSize}get reshapedInputDimensions(){return gr(this.batchSize,0,1).map((t,n)=>this.getReshapedInputDimensions(n))}getInput(t){return this.canvases[t]||this.imageTensors[t]}getInputDimensions(t){return this._inputDimensions[t]}getInputHeight(t){return this._inputDimensions[t][0]}getInputWidth(t){return this._inputDimensions[t][1]}getReshapedInputDimensions(t){if(typeof this.inputSize!="number")throw new Error("getReshapedInputDimensions - inputSize not set, toBatchTensor has not been called yet");let n=this.getInputWidth(t),a=this.getInputHeight(t);return m1({width:n,height:a},this.inputSize)}toBatchTensor(t,n=!0){return this._inputSize=t,O(()=>{let a=gr(this.batchSize,0,1).map(s=>{let i=this.getInput(s);if(i instanceof Ae){let o=ba(i)?i:mn(i);return o=NA(o,n),(o.shape[1]!==t||o.shape[2]!==t)&&(o=Sr.resizeBilinear(o,[t,t],!1,!1)),o.as3D(t,t,3)}if(i instanceof at.getEnv().Canvas)return bo.fromPixels($A(i,t,n));throw new Error(`toBatchTensor - at batchIdx ${s}, expected input to be instanceof tf.Tensor or instanceof HTMLCanvasElement, instead have ${i}`)});return Rt(a.map(s=>le(s,"float32"))).as4D(this.batchSize,t,t,3)})}};async function kt(e){if(e instanceof Lr)return e;let t=Array.isArray(e)?e:[e];if(!t.length)throw new Error("toNetInput - empty array passed as input");let n=r=>Array.isArray(e)?` at input index ${r}:`:"",a=t.map(sp);return a.forEach((r,s)=>{if(!w1(r)&&!Rr(r)&&!ba(r))throw typeof t[s]=="string"?new Error(`toNetInput -${n(s)} string passed, but could not resolve HTMLElement for element id ${t[s]}`):new Error(`toNetInput -${n(s)} expected media to be of type HTMLImageElement | HTMLVideoElement | HTMLCanvasElement | tf.Tensor3D, or to be an element id`);if(ba(r)){let i=r.shape[0];if(i!==1)throw new Error(`toNetInput -${n(s)} tf.Tensor4D with batchSize ${i} passed, but not supported in input array`)}}),await Promise.all(a.map(r=>w1(r)&&_A(r))),new Lr(a,Array.isArray(e))}async function vd(e,t){let{Canvas:n}=at.getEnv(),a=e;if(!(e instanceof n)){let i=await kt(e);if(i.batchSize>1)throw new Error("extractFaces - batchSize > 1 not supported");let o=i.getInput(0);a=o instanceof n?o:await AA(o)}let r=aa(a);return t.map(i=>i instanceof wt?i.forSize(a.width,a.height).box.floor():i).map(i=>i.clipAtImageBorders(a.width,a.height)).map(({x:i,y:o,width:l,height:u})=>{let p=lp({width:l,height:u});return l>0&&u>0&&aa(p).putImageData(r.getImageData(i,o,l,u),0,0),p})}async function wd(e,t){if(!Rr(e)&&!ba(e))throw new Error("extractFaceTensors - expected image tensor to be 3D or 4D");if(ba(e)&&e.shape[0]>1)throw new Error("extractFaceTensors - batchSize > 1 not supported");return O(()=>{let[n,a,r]=e.shape.slice(ba(e)?1:0);return t.map(o=>o instanceof wt?o.forSize(a,n).box:o).map(o=>o.clipAtImageBorders(a,n)).filter(o=>o.width>0&&o.height>0).map(({x:o,y:l,width:u,height:p})=>vo(e.as3D(n,a,r),[l,o,0],[p,u,r]))})}async function _s(e,t){let{fetch:n}=at.getEnv(),a=await n(e,t);if(!(a.status<400))throw new Error(`failed to fetch: (${a.status}) ${a.statusText}, from url: ${a.url}`);return a}async function Wxe(e){let t=await _s(e),n=await t.blob();if(!n.type.startsWith("image/"))throw new Error(`fetchImage - expected blob type to be of type image/*, instead have: ${n.type}, for url: ${t.url}`);return EA(n)}async function FA(e){return(await _s(e)).json()}async function jxe(e){return new Float32Array(await(await _s(e)).arrayBuffer())}function DA(e){return new Promise((t,n)=>{e instanceof Blob||n(new Error("bufferToVideo - expected buf to be of type: Blob"));let a=at.getEnv().createVideoElement();a.oncanplay=()=>t(a),a.onerror=n,a.playsInline=!0,a.muted=!0,a.src=URL.createObjectURL(e),a.play()})}async function Zxe(e){let t=await _s(e),n=await t.blob();if(!n.type.startsWith("video/"))throw new Error(`fetchVideo - expected blob type to be of type video/*, instead have: ${n.type}, for url: ${t.url}`);return DA(n)}function pg(e,t){let n=`${t}-weights_manifest.json`;if(!e)return{modelBaseUri:"",manifestUri:n};if(e==="/")return{modelBaseUri:"/",manifestUri:`/${n}`};let a=e.startsWith("http://")?"http://":e.startsWith("https://")?"https://":"";e=e.replace(a,"");let r=e.split("/").filter(o=>o),s=e.endsWith(".json")?r[r.length-1]:n,i=a+(e.endsWith(".json")?r.slice(0,r.length-1):r).join("/");return i=e.startsWith("/")?`/${i}`:i,{modelBaseUri:i,manifestUri:i==="/"?`/${s}`:`${i}/${s}`}}async function RA(e,t){let{manifestUri:n,modelBaseUri:a}=pg(e,t),r=await FA(n);return Nn.loadWeights(r,a)}function sve(e,t,n=!1){let{width:a,height:r}=n?op(t):t;return e.width=a,e.height=r,{width:a,height:r}}var dn=class{constructor(t){this._params=void 0;this._paramMappings=[];this._name=t}get params(){return this._params}get paramMappings(){return this._paramMappings}get isLoaded(){return!!this.params}getParamFromPath(t){let{obj:n,objProp:a}=this.traversePropertyPath(t);return n[a]}reassignParamFromPath(t,n){let{obj:a,objProp:r}=this.traversePropertyPath(t);a[r].dispose(),a[r]=n}getParamList(){return this._paramMappings.map(({paramPath:t})=>({path:t,tensor:this.getParamFromPath(t)}))}getTrainableParams(){return this.getParamList().filter(t=>t.tensor instanceof ns)}getFrozenParams(){return this.getParamList().filter(t=>!(t.tensor instanceof ns))}variable(){this.getFrozenParams().forEach(({path:t,tensor:n})=>{this.reassignParamFromPath(t,n.variable())})}freeze(){this.getTrainableParams().forEach(({path:t,tensor:n})=>{let a=Bn(n.dataSync());n.dispose(),this.reassignParamFromPath(t,a)})}dispose(t=!0){this.getParamList().forEach(n=>{if(t&&n.tensor.isDisposed)throw new Error(`param tensor has already been disposed for path ${n.path}`);n.tensor.dispose()}),this._params=void 0}serializeParams(){return new Float32Array(this.getParamList().map(({tensor:t})=>Array.from(t.dataSync())).reduce((t,n)=>t.concat(n)))}async load(t){if(t instanceof Float32Array){this.extractWeights(t);return}await this.loadFromUri(t)}async loadFromUri(t){if(t&&typeof t!="string")throw new Error(`${this._name}.loadFromUri - expected model uri`);let n=await RA(t,this.getDefaultModelName());this.loadFromWeightMap(n)}async loadFromDisk(t){if(t&&typeof t!="string")throw new Error(`${this._name}.loadFromDisk - expected model file path`);let{readFile:n}=at.getEnv(),{manifestUri:a,modelBaseUri:r}=pg(t,this.getDefaultModelName()),s=u=>Promise.all(u.map(p=>n(p).then(d=>d.buffer))),i=Nn.weightsLoaderFactory(s),o=JSON.parse((await n(a)).toString()),l=await i(o,r);this.loadFromWeightMap(l)}loadFromWeightMap(t){let{paramMappings:n,params:a}=this.extractParamsFromWeightMap(t);this._paramMappings=n,this._params=a}extractWeights(t){let{paramMappings:n,params:a}=this.extractParams(t);this._paramMappings=n,this._params=a}traversePropertyPath(t){if(!this.params)throw new Error("traversePropertyPath - model has no loaded params");let n=t.split("/").reduce((s,i)=>{if(!s.nextObj.hasOwnProperty(i))throw new Error(`traversePropertyPath - object does not have property ${i}, for path ${t}`);return{obj:s.nextObj,objProp:i,nextObj:s.nextObj[i]}},{nextObj:this.params}),{obj:a,objProp:r}=n;if(!a||!r||!(a[r]instanceof Ae))throw new Error(`traversePropertyPath - parameter is not a tensor, for path ${t}`);return{obj:a,objProp:r}}};function Kn(e,t,n){return O(()=>{let a=ks(e,t.depthwise_filter,t.pointwise_filter,n,"same");return a=Z(a,t.bias),a})}function cg(e,t,n=!1){return O(()=>{let a=Xe(n?Z(Dt(e,t.conv0.filters,[2,2],"same"),t.conv0.bias):Kn(e,t.conv0,[2,2])),r=Kn(a,t.conv1,[1,1]),s=Xe(Z(a,r)),i=Kn(s,t.conv2,[1,1]);return Xe(Z(a,Z(r,i)))})}function kd(e,t,n=!1,a=!0){return O(()=>{let r=Xe(n?Z(Dt(e,t.conv0.filters,a?[2,2]:[1,1],"same"),t.conv0.bias):Kn(e,t.conv0,a?[2,2]:[1,1])),s=Kn(r,t.conv1,[1,1]),i=Xe(Z(r,s)),o=Kn(i,t.conv2,[1,1]),l=Xe(Z(r,Z(s,o))),u=Kn(l,t.conv3,[1,1]);return Xe(Z(r,Z(s,Z(o,u))))})}function $o(e,t,n="same",a=!1){return O(()=>{let r=Z(Dt(e,t.filters,[1,1],n),t.bias);return a?Xe(r):r})}function Fn(e,t){Object.keys(e).forEach(n=>{t.some(a=>a.originalPath===n)||e[n].dispose()})}function up(e,t){return(n,a,r,s)=>{let i=Ea(e(n*a*r*r),[r,r,n,a]),o=Ke(e(a));return t.push({paramPath:`${s}/filters`},{paramPath:`${s}/bias`}),{filters:i,bias:o}}}function dg(e,t){return(n,a,r)=>{let s=Na(e(n*a),[n,a]),i=Ke(e(a));return t.push({paramPath:`${r}/weights`},{paramPath:`${r}/bias`}),{weights:s,bias:i}}}var Id=class{constructor(t,n,a){this.depthwise_filter=t;this.pointwise_filter=n;this.bias=a}};function pp(e,t){return(n,a,r)=>{let s=Ea(e(9*n),[3,3,n,1]),i=Ea(e(n*a),[1,1,n,a]),o=Ke(e(a));return t.push({paramPath:`${r}/depthwise_filter`},{paramPath:`${r}/pointwise_filter`},{paramPath:`${r}/bias`}),new Id(s,i,o)}}function cp(e){return t=>{let n=e(`${t}/depthwise_filter`,4),a=e(`${t}/pointwise_filter`,4),r=e(`${t}/bias`,1);return new Id(n,a,r)}}function ra(e,t){return(n,a,r)=>{let s=e[n];if(!_o(s,a))throw new Error(`expected weightMap[${n}] to be a Tensor${a}D, instead have ${s}`);return t.push({originalPath:n,paramPath:r||n}),s}}function Dn(e){let t=e;function n(r){let s=t.slice(0,r);return t=t.slice(r),s}function a(){return t}return{extractWeights:n,getRemainingWeights:a}}function hg(e,t){let n=up(e,t),a=pp(e,t);function r(i,o,l,u=!1){let p=u?n(i,o,3,`${l}/conv0`):a(i,o,`${l}/conv0`),d=a(o,o,`${l}/conv1`),c=a(o,o,`${l}/conv2`);return{conv0:p,conv1:d,conv2:c}}function s(i,o,l,u=!1){let{conv0:p,conv1:d,conv2:c}=r(i,o,l,u),h=a(o,o,`${l}/conv3`);return{conv0:p,conv1:d,conv2:c,conv3:h}}return{extractDenseBlock3Params:r,extractDenseBlock4Params:s}}function MA(e){let t=[],{extractWeights:n,getRemainingWeights:a}=Dn(e),{extractDenseBlock4Params:r}=hg(n,t),s=r(3,32,"dense0",!0),i=r(32,64,"dense1"),o=r(64,128,"dense2"),l=r(128,256,"dense3");if(a().length!==0)throw new Error(`weights remaing after extract: ${a().length}`);return{paramMappings:t,params:{dense0:s,dense1:i,dense2:o,dense3:l}}}function mg(e){return t=>{let n=e(`${t}/filters`,4),a=e(`${t}/bias`,1);return{filters:n,bias:a}}}function fg(e,t){let n=ra(e,t),a=mg(n),r=cp(n);function s(o,l=!1){let u=l?a(`${o}/conv0`):r(`${o}/conv0`),p=r(`${o}/conv1`),d=r(`${o}/conv2`);return{conv0:u,conv1:p,conv2:d}}function i(o,l=!1){let u=l?a(`${o}/conv0`):r(`${o}/conv0`),p=r(`${o}/conv1`),d=r(`${o}/conv2`),c=r(`${o}/conv3`);return{conv0:u,conv1:p,conv2:d,conv3:c}}return{extractDenseBlock3Params:s,extractDenseBlock4Params:i}}function PA(e){let t=[],{extractDenseBlock4Params:n}=fg(e,t),a={dense0:n("dense0",!0),dense1:n("dense1"),dense2:n("dense2"),dense3:n("dense3")};return Fn(e,t),{params:a,paramMappings:t}}var dp=class extends dn{constructor(){super("FaceFeatureExtractor")}forwardInput(t){let{params:n}=this;if(!n)throw new Error("FaceFeatureExtractor - load model before inference");return O(()=>{let a=le(t.toBatchTensor(112,!0),"float32"),s=yr(a,[122.782,117.001,104.298]).div(255),i=kd(s,n.dense0,!0);return i=kd(i,n.dense1),i=kd(i,n.dense2),i=kd(i,n.dense3),i=fa(i,[7,7],[2,2],"valid"),i})}async forward(t){return this.forwardInput(await kt(t))}getDefaultModelName(){return"face_feature_extractor_model"}extractParamsFromWeightMap(t){return PA(t)}extractParams(t){return MA(t)}};function Sd(e,t){return O(()=>Z(Re(e,t.weights),t.bias))}function OA(e,t,n){let a=[],{extractWeights:r,getRemainingWeights:s}=Dn(e),o=dg(r,a)(t,n,"fc");if(s().length!==0)throw new Error(`weights remaing after extract: ${s().length}`);return{paramMappings:a,params:{fc:o}}}function LA(e){let t=[],n=ra(e,t);function a(s){let i=n(`${s}/weights`,2),o=n(`${s}/bias`,1);return{weights:i,bias:o}}let r={fc:a("fc")};return Fn(e,t),{params:r,paramMappings:t}}function gg(e){let t={},n={};return Object.keys(e).forEach(a=>{let r=a.startsWith("fc")?n:t;r[a]=e[a]}),{featureExtractorMap:t,classifierMap:n}}var hp=class extends dn{constructor(n,a){super(n);this._faceFeatureExtractor=a}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(n){let{params:a}=this;if(!a)throw new Error(`${this._name} - load model before inference`);return O(()=>{let r=n instanceof Lr?this.faceFeatureExtractor.forwardInput(n):n;return Sd(r.as2D(r.shape[0],-1),a.fc)})}dispose(n=!0){this.faceFeatureExtractor.dispose(n),super.dispose(n)}loadClassifierParams(n){let{params:a,paramMappings:r}=this.extractClassifierParams(n);this._params=a,this._paramMappings=r}extractClassifierParams(n){return OA(n,this.getClassifierChannelsIn(),this.getClassifierChannelsOut())}extractParamsFromWeightMap(n){let{featureExtractorMap:a,classifierMap:r}=gg(n);return this.faceFeatureExtractor.loadFromWeightMap(a),LA(r)}extractParams(n){let a=this.getClassifierChannelsIn(),r=this.getClassifierChannelsOut(),s=r*a+r,i=n.slice(0,n.length-s),o=n.slice(n.length-s);return this.faceFeatureExtractor.extractWeights(i),this.extractClassifierParams(o)}};var zA=["neutral","happy","sad","angry","fearful","disgusted","surprised"],Es=class{constructor(t){this.neutral=0;this.happy=0;this.sad=0;this.angry=0;this.fearful=0;this.disgusted=0;this.surprised=0;if(t.length!==7)throw new Error(`FaceExpressions.constructor - expected probabilities.length to be 7, have: ${t.length}`);zA.forEach((n,a)=>{this[n]=t[a]})}asSortedArray(){return zA.map(t=>({expression:t,probability:this[t]})).sort((t,n)=>n.probability-t.probability)}};var yg=class extends hp{constructor(t=new dp){super("FaceExpressionNet",t)}forwardInput(t){return O(()=>Za(this.runNet(t)))}async forward(t){return this.forwardInput(await kt(t))}async predictExpressions(t){let n=await kt(t),a=await this.forwardInput(n),r=await Promise.all(mt(a).map(async i=>{let o=i.dataSync();return i.dispose(),o}));a.dispose();let s=r.map(i=>new Es(i));return n.isBatchInput?s:s[0]}getDefaultModelName(){return"face_expression_model"}getClassifierChannelsIn(){return 256}getClassifierChannelsOut(){return 7}};function BA(e){return e.expressions instanceof Es}function k1(e,t){return{...e,...{expressions:t}}}function dpe(e,t,n=.1,a){(Array.isArray(t)?t:[t]).forEach(s=>{let i=s instanceof Es?s:BA(s)?s.expressions:void 0;if(!i)throw new Error("drawFaceExpressions - expected faceExpressions to be FaceExpressions | WithFaceExpressions<{}> or array thereof");let l=i.asSortedArray().filter(d=>d.probability>n),u=Pr(s)?s.detection.box.bottomLeft:a||new Oe(0,0);new Or(l.map(d=>`${d.expression} (${Eo(d.probability)})`),u).draw(e)})}function mp(e){return Pr(e)&&e.landmarks instanceof xa&&e.unshiftedLandmarks instanceof xa&&e.alignedRect instanceof wt}function hpe(e){let t=(o,l,u,p)=>Math.atan2(p-l,u-o)%Math.PI,n=o=>o*180/Math.PI,a={roll:void 0,pitch:void 0,yaw:void 0};if(!e||!e._positions||e._positions.length!==68)return a;let r=e._positions;a.roll=-t(r[36]._x,r[36]._y,r[45]._x,r[45]._y),a.pitch=t(0,Math.abs(r[0]._x-r[30]._x)/r[30]._x,Math.PI,Math.abs(r[16]._x-r[30]._x)/r[30]._x);let s=r.reduce((o,l)=>oo>l._y?o:l._y,-1/0);return a.yaw=Math.PI*(e._imgDims._height/(i-s)/1.4-1),a}function Nd(e,t){let{box:n}=e.detection,a=t.shiftBy(n.x,n.y),r=a.align(),{imageDims:s}=e.detection,i=new wt(e.detection.score,r.rescale(s.reverse()),s),o=hpe(t);return{...e,...{landmarks:a,unshiftedLandmarks:t,alignedRect:i,angle:o}}}var bg=class{constructor(t={}){let{drawLines:n=!0,drawPoints:a=!0,lineWidth:r,lineColor:s,pointSize:i,pointColor:o}=t;this.drawLines=n,this.drawPoints=a,this.lineWidth=r||1,this.pointSize=i||2,this.lineColor=s||"rgba(0, 255, 255, 1)",this.pointColor=o||"rgba(255, 0, 255, 1)"}},xg=class{constructor(t,n={}){this.faceLandmarks=t,this.options=new bg(n)}draw(t){let n=aa(t),{drawLines:a,drawPoints:r,lineWidth:s,lineColor:i,pointSize:o,pointColor:l}=this.options;if(a&&this.faceLandmarks instanceof ap&&(n.strokeStyle=i,n.lineWidth=s,Dr(n,this.faceLandmarks.getJawOutline()),Dr(n,this.faceLandmarks.getLeftEyeBrow()),Dr(n,this.faceLandmarks.getRightEyeBrow()),Dr(n,this.faceLandmarks.getNose()),Dr(n,this.faceLandmarks.getLeftEye(),!0),Dr(n,this.faceLandmarks.getRightEye(),!0),Dr(n,this.faceLandmarks.getMouth(),!0)),r){n.strokeStyle=l,n.fillStyle=l;let u=p=>{n.beginPath(),n.arc(p.x,p.y,o,0,2*Math.PI),n.fill()};this.faceLandmarks.positions.forEach(u)}}};function mpe(e,t){(Array.isArray(t)?t:[t]).forEach(a=>{let r=a instanceof xa?a:mp(a)?a.landmarks:void 0;if(!r)throw new Error("drawFaceLandmarks - expected faceExpressions to be FaceLandmarks | WithFaceLandmarks> or array thereof");new xg(r).draw(e)})}var VA="1.7.2";function ype(e,t){let n=up(e,t),a=pp(e,t);function r(i,o,l){let u=a(i,o,`${l}/separable_conv0`),p=a(o,o,`${l}/separable_conv1`),d=n(i,o,1,`${l}/expansion_conv`);return{separable_conv0:u,separable_conv1:p,expansion_conv:d}}function s(i,o){let l=a(i,i,`${o}/separable_conv0`),u=a(i,i,`${o}/separable_conv1`),p=a(i,i,`${o}/separable_conv2`);return{separable_conv0:l,separable_conv1:u,separable_conv2:p}}return{extractConvParams:n,extractSeparableConvParams:a,extractReductionBlockParams:r,extractMainBlockParams:s}}function UA(e,t){let n=[],{extractWeights:a,getRemainingWeights:r}=Dn(e),{extractConvParams:s,extractSeparableConvParams:i,extractReductionBlockParams:o,extractMainBlockParams:l}=ype(a,n),u=s(3,32,3,"entry_flow/conv_in"),p=o(32,64,"entry_flow/reduction_block_0"),d=o(64,128,"entry_flow/reduction_block_1"),c={conv_in:u,reduction_block_0:p,reduction_block_1:d},h={};gr(t,0,1).forEach(y=>{h[`main_block_${y}`]=l(128,`middle_flow/main_block_${y}`)});let m=o(128,256,"exit_flow/reduction_block"),f=i(256,512,"exit_flow/separable_conv"),g={reduction_block:m,separable_conv:f};if(r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{paramMappings:n,params:{entry_flow:c,middle_flow:h,exit_flow:g}}}function bpe(e,t){let n=ra(e,t),a=mg(n),r=cp(n);function s(o){let l=r(`${o}/separable_conv0`),u=r(`${o}/separable_conv1`),p=a(`${o}/expansion_conv`);return{separable_conv0:l,separable_conv1:u,expansion_conv:p}}function i(o){let l=r(`${o}/separable_conv0`),u=r(`${o}/separable_conv1`),p=r(`${o}/separable_conv2`);return{separable_conv0:l,separable_conv1:u,separable_conv2:p}}return{extractConvParams:a,extractSeparableConvParams:r,extractReductionBlockParams:s,extractMainBlockParams:i}}function GA(e,t){let n=[],{extractConvParams:a,extractSeparableConvParams:r,extractReductionBlockParams:s,extractMainBlockParams:i}=bpe(e,n),o=a("entry_flow/conv_in"),l=s("entry_flow/reduction_block_0"),u=s("entry_flow/reduction_block_1"),p={conv_in:o,reduction_block_0:l,reduction_block_1:u},d={};gr(t,0,1).forEach(f=>{d[`main_block_${f}`]=i(`middle_flow/main_block_${f}`)});let c=s("exit_flow/reduction_block"),h=r("exit_flow/separable_conv"),m={reduction_block:c,separable_conv:h};return Fn(e,n),{params:{entry_flow:p,middle_flow:d,exit_flow:m},paramMappings:n}}function HA(e,t,n){return Z(Dt(e,t.filters,n,"same"),t.bias)}function I1(e,t,n=!0){let a=n?Xe(e):e;return a=Kn(a,t.separable_conv0,[1,1]),a=Kn(Xe(a),t.separable_conv1,[1,1]),a=Mt(a,[3,3],[2,2],"same"),a=Z(a,HA(e,t.expansion_conv,[2,2])),a}function xpe(e,t){let n=Kn(Xe(e),t.separable_conv0,[1,1]);return n=Kn(Xe(n),t.separable_conv1,[1,1]),n=Kn(Xe(n),t.separable_conv2,[1,1]),n=Z(n,e),n}var vg=class extends dn{constructor(n){super("TinyXception");this._numMainBlocks=n}forwardInput(n){let{params:a}=this;if(!a)throw new Error("TinyXception - load model before inference");return O(()=>{let r=le(n.toBatchTensor(112,!0),"float32"),i=yr(r,[122.782,117.001,104.298]).div(255),o=Xe(HA(i,a.entry_flow.conv_in,[2,2]));return o=I1(o,a.entry_flow.reduction_block_0,!1),o=I1(o,a.entry_flow.reduction_block_1),gr(this._numMainBlocks,0,1).forEach(l=>{o=xpe(o,a.middle_flow[`main_block_${l}`])}),o=I1(o,a.exit_flow.reduction_block),o=Xe(Kn(o,a.exit_flow.separable_conv,[1,1])),o})}async forward(n){return this.forwardInput(await kt(n))}getDefaultModelName(){return"tiny_xception_model"}extractParamsFromWeightMap(n){return GA(n,this._numMainBlocks)}extractParams(n){return UA(n,this._numMainBlocks)}};function jA(e){let t=[],{extractWeights:n,getRemainingWeights:a}=Dn(e),r=dg(n,t),s=r(512,1,"fc/age"),i=r(512,2,"fc/gender");if(a().length!==0)throw new Error(`weights remaing after extract: ${a().length}`);return{paramMappings:t,params:{fc:{age:s,gender:i}}}}function qA(e){let t=[],n=ra(e,t);function a(s){let i=n(`${s}/weights`,2),o=n(`${s}/bias`,1);return{weights:i,bias:o}}let r={fc:{age:a("fc/age"),gender:a("fc/gender")}};return Fn(e,t),{params:r,paramMappings:t}}var S1=(n=>(n.FEMALE="female",n.MALE="male",n))(S1||{});var wg=class extends dn{constructor(n=new vg(2)){super("AgeGenderNet");this._faceFeatureExtractor=n}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(n){let{params:a}=this;if(!a)throw new Error(`${this._name} - load model before inference`);return O(()=>{let r=n instanceof Lr?this.faceFeatureExtractor.forwardInput(n):n,s=fa(r,[7,7],[2,2],"valid").as2D(r.shape[0],-1),i=Sd(s,a.fc.age).as1D(),o=Sd(s,a.fc.gender);return{age:i,gender:o}})}forwardInput(n){return O(()=>{let{age:a,gender:r}=this.runNet(n);return{age:a,gender:Za(r)}})}async forward(n){return this.forwardInput(await kt(n))}async predictAgeAndGender(n){let a=await kt(n),r=await this.forwardInput(a),s=mt(r.age),i=mt(r.gender),o=s.map((u,p)=>({ageTensor:u,genderTensor:i[p]})),l=await Promise.all(o.map(async({ageTensor:u,genderTensor:p})=>{let d=u.dataSync()[0],c=p.dataSync()[0],h=c>.5,m=h?"male":"female",f=h?c:1-c;return u.dispose(),p.dispose(),{age:d,gender:m,genderProbability:f}}));return r.age.dispose(),r.gender.dispose(),a.isBatchInput?l:l[0]}getDefaultModelName(){return"age_gender_model"}dispose(n=!0){this.faceFeatureExtractor.dispose(n),super.dispose(n)}loadClassifierParams(n){let{params:a,paramMappings:r}=this.extractClassifierParams(n);this._params=a,this._paramMappings=r}extractClassifierParams(n){return jA(n)}extractParamsFromWeightMap(n){let{featureExtractorMap:a,classifierMap:r}=gg(n);return this.faceFeatureExtractor.loadFromWeightMap(a),qA(r)}extractParams(n){let r=n.slice(0,n.length-1539),s=n.slice(n.length-1539);return this.faceFeatureExtractor.extractWeights(r),this.extractClassifierParams(s)}};var fp=class extends hp{postProcess(t,n,a){let r=a.map(({width:i,height:o})=>{let l=n/Math.max(o,i);return{width:i*l,height:o*l}}),s=r.length;return O(()=>{let i=(d,c)=>Rt([En([68],d,"float32"),En([68],c,"float32")],1).as2D(1,136).as1D(),o=(d,c)=>{let{width:h,height:m}=r[d];return c(h,m)?Math.abs(h-m)/2:0},l=d=>o(d,(c,h)=>co(d,(c,h)=>hi(l(c),u(c))))).div(Rt(Array.from(Array(s),(d,c)=>i(r[c].width,r[c].height))))})}forwardInput(t){return O(()=>{let n=this.runNet(t);return this.postProcess(n,t.inputSize,t.inputDimensions.map(([a,r])=>({height:a,width:r})))})}async forward(t){return this.forwardInput(await kt(t))}async detectLandmarks(t){let n=await kt(t),a=O(()=>mt(this.forwardInput(n))),r=await Promise.all(a.map(async(s,i)=>{let o=Array.from(s.dataSync()),l=o.filter((p,d)=>ag(d)),u=o.filter((p,d)=>!ag(d));return new ap(Array(68).fill(0).map((p,d)=>new Oe(l[d],u[d])),{height:n.getInputHeight(i),width:n.getInputWidth(i)})}));return a.forEach(s=>s.dispose()),n.isBatchInput?r:r[0]}getClassifierChannelsOut(){return 136}};var gp=class extends fp{constructor(t=new dp){super("FaceLandmark68Net",t)}getDefaultModelName(){return"face_landmark_68_model"}getClassifierChannelsIn(){return 256}};function KA(e){let t=[],{extractDenseBlock3Params:n}=fg(e,t),a={dense0:n("dense0",!0),dense1:n("dense1"),dense2:n("dense2")};return Fn(e,t),{params:a,paramMappings:t}}function XA(e){let t=[],{extractWeights:n,getRemainingWeights:a}=Dn(e),{extractDenseBlock3Params:r}=hg(n,t),s=r(3,32,"dense0",!0),i=r(32,64,"dense1"),o=r(64,128,"dense2");if(a().length!==0)throw new Error(`weights remaing after extract: ${a().length}`);return{paramMappings:t,params:{dense0:s,dense1:i,dense2:o}}}var kg=class extends dn{constructor(){super("TinyFaceFeatureExtractor")}forwardInput(t){let{params:n}=this;if(!n)throw new Error("TinyFaceFeatureExtractor - load model before inference");return O(()=>{let a=le(t.toBatchTensor(112,!0),"float32"),s=yr(a,[122.782,117.001,104.298]).div(255),i=cg(s,n.dense0,!0);return i=cg(i,n.dense1),i=cg(i,n.dense2),i=fa(i,[14,14],[2,2],"valid"),i})}async forward(t){return this.forwardInput(await kt(t))}getDefaultModelName(){return"face_feature_extractor_tiny_model"}extractParamsFromWeightMap(t){return KA(t)}extractParams(t){return XA(t)}};var Ig=class extends fp{constructor(t=new kg){super("FaceLandmark68TinyNet",t)}getDefaultModelName(){return"face_landmark_68_tiny_model"}getClassifierChannelsIn(){return 128}};var YA=class extends gp{};function JA(e,t){return Z(B(e,t.weights),t.biases)}function N1(e,t,n,a,r="same"){let{filters:s,bias:i}=t.conv,o=Dt(e,s,n,r);return o=Z(o,i),o=JA(o,t.scale),a?Xe(o):o}function ZA(e,t){return N1(e,t,[1,1],!0)}function T1(e,t){return N1(e,t,[1,1],!1)}function Sg(e,t){return N1(e,t,[2,2],!0,"valid")}function vpe(e,t){function n(o,l,u){let p=e(o),d=p.length/(l*u*u);if(h1(d))throw new Error(`depth has to be an integer: ${d}, weights.length: ${p.length}, numFilters: ${l}, filterSize: ${u}`);return O(()=>$e(Ea(p,[l,d,u,u]),[2,3,1,0]))}function a(o,l,u,p){let d=n(o,l,u),c=Ke(e(l));return t.push({paramPath:`${p}/filters`},{paramPath:`${p}/bias`}),{filters:d,bias:c}}function r(o,l){let u=Ke(e(o)),p=Ke(e(o));return t.push({paramPath:`${l}/weights`},{paramPath:`${l}/biases`}),{weights:u,biases:p}}function s(o,l,u,p){let d=a(o,l,u,`${p}/conv`),c=r(l,`${p}/scale`);return{conv:d,scale:c}}function i(o,l,u,p,d=!1){let c=s((d?.5:1)*o,l,u,`${p}/conv1`),h=s(o,l,u,`${p}/conv2`);return{conv1:c,conv2:h}}return{extractConvLayerParams:s,extractResidualLayerParams:i}}function QA(e){let{extractWeights:t,getRemainingWeights:n}=Dn(e),a=[],{extractConvLayerParams:r,extractResidualLayerParams:s}=vpe(t,a),i=r(4704,32,7,"conv32_down"),o=s(9216,32,3,"conv32_1"),l=s(9216,32,3,"conv32_2"),u=s(9216,32,3,"conv32_3"),p=s(36864,64,3,"conv64_down",!0),d=s(36864,64,3,"conv64_1"),c=s(36864,64,3,"conv64_2"),h=s(36864,64,3,"conv64_3"),m=s(147456,128,3,"conv128_down",!0),f=s(147456,128,3,"conv128_1"),g=s(147456,128,3,"conv128_2"),y=s(589824,256,3,"conv256_down",!0),b=s(589824,256,3,"conv256_1"),x=s(589824,256,3,"conv256_2"),v=s(589824,256,3,"conv256_down_out"),I=O(()=>$e(Na(t(256*128),[128,256]),[1,0]));if(a.push({paramPath:"fc"}),n().length!==0)throw new Error(`weights remaing after extract: ${n().length}`);return{params:{conv32_down:i,conv32_1:o,conv32_2:l,conv32_3:u,conv64_down:p,conv64_1:d,conv64_2:c,conv64_3:h,conv128_down:m,conv128_1:f,conv128_2:g,conv256_down:y,conv256_1:b,conv256_2:x,conv256_down_out:v,fc:I},paramMappings:a}}function wpe(e,t){let n=ra(e,t);function a(i){let o=n(`${i}/scale/weights`,1),l=n(`${i}/scale/biases`,1);return{weights:o,biases:l}}function r(i){let o=n(`${i}/conv/filters`,4),l=n(`${i}/conv/bias`,1),u=a(i);return{conv:{filters:o,bias:l},scale:u}}function s(i){return{conv1:r(`${i}/conv1`),conv2:r(`${i}/conv2`)}}return{extractConvLayerParams:r,extractResidualLayerParams:s}}function e$(e){let t=[],{extractConvLayerParams:n,extractResidualLayerParams:a}=wpe(e,t),r=n("conv32_down"),s=a("conv32_1"),i=a("conv32_2"),o=a("conv32_3"),l=a("conv64_down"),u=a("conv64_1"),p=a("conv64_2"),d=a("conv64_3"),c=a("conv128_down"),h=a("conv128_1"),m=a("conv128_2"),f=a("conv256_down"),g=a("conv256_1"),y=a("conv256_2"),b=a("conv256_down_out"),{fc:x}=e;if(t.push({originalPath:"fc",paramPath:"fc"}),!d1(x))throw new Error(`expected weightMap[fc] to be a Tensor2D, instead have ${x}`);let v={conv32_down:r,conv32_1:s,conv32_2:i,conv32_3:o,conv64_down:l,conv64_1:u,conv64_2:p,conv64_3:d,conv128_down:c,conv128_1:h,conv128_2:m,conv256_down:f,conv256_1:g,conv256_2:y,conv256_down_out:b,fc:x};return Fn(e,t),{params:v,paramMappings:t}}function tr(e,t){let n=ZA(e,t.conv1);return n=T1(n,t.conv2),n=Z(n,e),n=Xe(n),n}function Td(e,t){let n=Sg(e,t.conv1);n=T1(n,t.conv2);let a=fa(e,2,2,"valid"),r=It(a.shape),s=a.shape[3]!==n.shape[3];if(a.shape[1]!==n.shape[1]||a.shape[2]!==n.shape[2]){let o=[...n.shape];o[1]=1;let l=It(o);n=Qe([n,l],1);let u=[...n.shape];u[2]=1;let p=It(u);n=Qe([n,p],2)}return a=s?Qe([a,r],3):a,n=Z(a,n),n=Xe(n),n}var yp=class extends dn{constructor(){super("FaceRecognitionNet")}forwardInput(t){let{params:n}=this;if(!n)throw new Error("FaceRecognitionNet - load model before inference");return O(()=>{let a=le(t.toBatchTensor(150,!0),"float32"),s=yr(a,[122.782,117.001,104.298]).div(255),i=Sg(s,n.conv32_down);i=Mt(i,3,2,"valid"),i=tr(i,n.conv32_1),i=tr(i,n.conv32_2),i=tr(i,n.conv32_3),i=Td(i,n.conv64_down),i=tr(i,n.conv64_1),i=tr(i,n.conv64_2),i=tr(i,n.conv64_3),i=Td(i,n.conv128_down),i=tr(i,n.conv128_1),i=tr(i,n.conv128_2),i=Td(i,n.conv256_down),i=tr(i,n.conv256_1),i=tr(i,n.conv256_2),i=Td(i,n.conv256_down_out);let o=i.mean([1,2]);return Re(o,n.fc)})}async forward(t){return this.forwardInput(await kt(t))}async computeFaceDescriptor(t){var s;if((s=t==null?void 0:t.shape)!=null&&s.some(i=>i<=0))return new Float32Array(128);let n=await kt(t),a=O(()=>mt(this.forwardInput(n))),r=await Promise.all(a.map(i=>i.data()));return a.forEach(i=>i.dispose()),n.isBatchInput?r:r[0]}getDefaultModelName(){return"face_recognition_model"}extractParamsFromWeightMap(t){return e$(t)}extractParams(t){return QA(t)}};function $ke(e){let t=new yp;return t.extractWeights(e),t}function C1(e,t){return{...e,...{descriptor:t}}}function Mke(e){return typeof e.age=="number"}function _1(e,t){return{...e,...{age:t}}}function zke(e){return(e.gender==="male"||e.gender==="female")&&ep(e.genderProbability)}function E1(e,t,n){return{...e,...{gender:t,genderProbability:n}}}function kpe(e,t){function n(l,u){let p=Ea(e(9*l),[3,3,l,1]),d=Ke(e(l)),c=Ke(e(l)),h=Ke(e(l)),m=Ke(e(l));return t.push({paramPath:`${u}/filters`},{paramPath:`${u}/batch_norm_scale`},{paramPath:`${u}/batch_norm_offset`},{paramPath:`${u}/batch_norm_mean`},{paramPath:`${u}/batch_norm_variance`}),{filters:p,batch_norm_scale:d,batch_norm_offset:c,batch_norm_mean:h,batch_norm_variance:m}}function a(l,u,p,d,c){let h=Ea(e(l*u*p*p),[p,p,l,u]),m=Ke(e(u));return t.push({paramPath:`${d}/filters`},{paramPath:`${d}/${c?"batch_norm_offset":"bias"}`}),{filters:h,bias:m}}function r(l,u,p,d){let{filters:c,bias:h}=a(l,u,p,d,!0);return{filters:c,batch_norm_offset:h}}function s(l,u,p){let d=n(l,`${p}/depthwise_conv`),c=r(l,u,1,`${p}/pointwise_conv`);return{depthwise_conv:d,pointwise_conv:c}}function i(){let l=r(3,32,3,"mobilenetv1/conv_0"),u=s(32,64,"mobilenetv1/conv_1"),p=s(64,128,"mobilenetv1/conv_2"),d=s(128,128,"mobilenetv1/conv_3"),c=s(128,256,"mobilenetv1/conv_4"),h=s(256,256,"mobilenetv1/conv_5"),m=s(256,512,"mobilenetv1/conv_6"),f=s(512,512,"mobilenetv1/conv_7"),g=s(512,512,"mobilenetv1/conv_8"),y=s(512,512,"mobilenetv1/conv_9"),b=s(512,512,"mobilenetv1/conv_10"),x=s(512,512,"mobilenetv1/conv_11"),v=s(512,1024,"mobilenetv1/conv_12"),I=s(1024,1024,"mobilenetv1/conv_13");return{conv_0:l,conv_1:u,conv_2:p,conv_3:d,conv_4:c,conv_5:h,conv_6:m,conv_7:f,conv_8:g,conv_9:y,conv_10:b,conv_11:x,conv_12:v,conv_13:I}}function o(){let l=r(1024,256,1,"prediction_layer/conv_0"),u=r(256,512,3,"prediction_layer/conv_1"),p=r(512,128,1,"prediction_layer/conv_2"),d=r(128,256,3,"prediction_layer/conv_3"),c=r(256,128,1,"prediction_layer/conv_4"),h=r(128,256,3,"prediction_layer/conv_5"),m=r(256,64,1,"prediction_layer/conv_6"),f=r(64,128,3,"prediction_layer/conv_7"),g=a(512,12,1,"prediction_layer/box_predictor_0/box_encoding_predictor"),y=a(512,9,1,"prediction_layer/box_predictor_0/class_predictor"),b=a(1024,24,1,"prediction_layer/box_predictor_1/box_encoding_predictor"),x=a(1024,18,1,"prediction_layer/box_predictor_1/class_predictor"),v=a(512,24,1,"prediction_layer/box_predictor_2/box_encoding_predictor"),I=a(512,18,1,"prediction_layer/box_predictor_2/class_predictor"),T=a(256,24,1,"prediction_layer/box_predictor_3/box_encoding_predictor"),_=a(256,18,1,"prediction_layer/box_predictor_3/class_predictor"),A=a(256,24,1,"prediction_layer/box_predictor_4/box_encoding_predictor"),F=a(256,18,1,"prediction_layer/box_predictor_4/class_predictor"),P=a(128,24,1,"prediction_layer/box_predictor_5/box_encoding_predictor"),$=a(128,18,1,"prediction_layer/box_predictor_5/class_predictor");return{conv_0:l,conv_1:u,conv_2:p,conv_3:d,conv_4:c,conv_5:h,conv_6:m,conv_7:f,box_predictor_0:{box_encoding_predictor:g,class_predictor:y},box_predictor_1:{box_encoding_predictor:b,class_predictor:x},box_predictor_2:{box_encoding_predictor:v,class_predictor:I},box_predictor_3:{box_encoding_predictor:T,class_predictor:_},box_predictor_4:{box_encoding_predictor:A,class_predictor:F},box_predictor_5:{box_encoding_predictor:P,class_predictor:$}}}return{extractMobilenetV1Params:i,extractPredictionLayerParams:o}}function t$(e){let t=[],{extractWeights:n,getRemainingWeights:a}=Dn(e),{extractMobilenetV1Params:r,extractPredictionLayerParams:s}=kpe(n,t),i=r(),o=s(),u={extra_dim:zc(n(5118*4),[1,5118,4])};if(t.push({paramPath:"output_layer/extra_dim"}),a().length!==0)throw new Error(`weights remaing after extract: ${a().length}`);return{params:{mobilenetv1:i,prediction_layer:o,output_layer:u},paramMappings:t}}function Ipe(e,t){let n=ra(e,t);function a(u,p,d){let c=n(`${u}/Conv2d_${p}_pointwise/weights`,4,`${d}/filters`),h=n(`${u}/Conv2d_${p}_pointwise/convolution_bn_offset`,1,`${d}/batch_norm_offset`);return{filters:c,batch_norm_offset:h}}function r(u){let p=`mobilenetv1/conv_${u}`,d=`MobilenetV1/Conv2d_${u}_depthwise`,c=`${p}/depthwise_conv`,h=`${p}/pointwise_conv`,m=n(`${d}/depthwise_weights`,4,`${c}/filters`),f=n(`${d}/BatchNorm/gamma`,1,`${c}/batch_norm_scale`),g=n(`${d}/BatchNorm/beta`,1,`${c}/batch_norm_offset`),y=n(`${d}/BatchNorm/moving_mean`,1,`${c}/batch_norm_mean`),b=n(`${d}/BatchNorm/moving_variance`,1,`${c}/batch_norm_variance`);return{depthwise_conv:{filters:m,batch_norm_scale:f,batch_norm_offset:g,batch_norm_mean:y,batch_norm_variance:b},pointwise_conv:a("MobilenetV1",u,h)}}function s(){return{conv_0:a("MobilenetV1",0,"mobilenetv1/conv_0"),conv_1:r(1),conv_2:r(2),conv_3:r(3),conv_4:r(4),conv_5:r(5),conv_6:r(6),conv_7:r(7),conv_8:r(8),conv_9:r(9),conv_10:r(10),conv_11:r(11),conv_12:r(12),conv_13:r(13)}}function i(u,p){let d=n(`${u}/weights`,4,`${p}/filters`),c=n(`${u}/biases`,1,`${p}/bias`);return{filters:d,bias:c}}function o(u){let p=i(`Prediction/BoxPredictor_${u}/BoxEncodingPredictor`,`prediction_layer/box_predictor_${u}/box_encoding_predictor`),d=i(`Prediction/BoxPredictor_${u}/ClassPredictor`,`prediction_layer/box_predictor_${u}/class_predictor`);return{box_encoding_predictor:p,class_predictor:d}}function l(){return{conv_0:a("Prediction",0,"prediction_layer/conv_0"),conv_1:a("Prediction",1,"prediction_layer/conv_1"),conv_2:a("Prediction",2,"prediction_layer/conv_2"),conv_3:a("Prediction",3,"prediction_layer/conv_3"),conv_4:a("Prediction",4,"prediction_layer/conv_4"),conv_5:a("Prediction",5,"prediction_layer/conv_5"),conv_6:a("Prediction",6,"prediction_layer/conv_6"),conv_7:a("Prediction",7,"prediction_layer/conv_7"),box_predictor_0:o(0),box_predictor_1:o(1),box_predictor_2:o(2),box_predictor_3:o(3),box_predictor_4:o(4),box_predictor_5:o(5)}}return{extractMobilenetV1Params:s,extractPredictionLayerParams:l}}function n$(e){let t=[],{extractMobilenetV1Params:n,extractPredictionLayerParams:a}=Ipe(e,t),r=e["Output/extra_dim"];if(t.push({originalPath:"Output/extra_dim",paramPath:"output_layer/extra_dim"}),!Rr(r))throw new Error(`expected weightMap['Output/extra_dim'] to be a Tensor3D, instead have ${r}`);let s={mobilenetv1:n(),prediction_layer:a(),output_layer:{extra_dim:r}};return Fn(e,t),{params:s,paramMappings:t}}function Fa(e,t,n){return O(()=>{let a=Dt(e,t.filters,n,"same");return a=Z(a,t.batch_norm_offset),tn(a,0,6)})}var Spe=.0010000000474974513;function Npe(e,t,n){return O(()=>{let a=xs(e,t.filters,n,"same");return a=bs(a,t.batch_norm_mean,t.batch_norm_variance,t.batch_norm_offset,t.batch_norm_scale,Spe),tn(a,0,6)})}function Tpe(e){return[2,4,6,12].some(t=>t===e)?[2,2]:[1,1]}function a$(e,t){return O(()=>{let n,a=Fa(e,t.conv_0,[2,2]);if([t.conv_1,t.conv_2,t.conv_3,t.conv_4,t.conv_5,t.conv_6,t.conv_7,t.conv_8,t.conv_9,t.conv_10,t.conv_11,t.conv_12,t.conv_13].forEach((s,i)=>{let o=i+1,l=Tpe(o);a=Npe(a,s.depthwise_conv,l),a=Fa(a,s.pointwise_conv,[1,1]),o===11&&(n=a)}),n===null)throw new Error("mobileNetV1 - output of conv layer 11 is null");return{out:a,conv11:n}})}function Cpe(e,t,n){let a=e.arraySync(),r=Math.min(a[t][0],a[t][2]),s=Math.min(a[t][1],a[t][3]),i=Math.max(a[t][0],a[t][2]),o=Math.max(a[t][1],a[t][3]),l=Math.min(a[n][0],a[n][2]),u=Math.min(a[n][1],a[n][3]),p=Math.max(a[n][0],a[n][2]),d=Math.max(a[n][1],a[n][3]),c=(i-r)*(o-s),h=(p-l)*(d-u);if(c<=0||h<=0)return 0;let m=Math.max(r,l),f=Math.max(s,u),g=Math.min(i,p),y=Math.min(o,d),b=Math.max(g-m,0)*Math.max(y-f,0);return b/(c+h-b)}function r$(e,t,n,a,r){let s=e.shape[0],i=Math.min(n,s),o=t.map((p,d)=>({score:p,boxIndex:d})).filter(p=>p.score>r).sort((p,d)=>d.score-p.score),l=p=>p<=a?1:0,u=[];return o.forEach(p=>{if(u.length>=i)return;let d=p.score;for(let c=u.length-1;c>=0;--c){let h=Cpe(e,p.boxIndex,u[c]);if(h!==0&&(p.score*=l(h),p.score<=r))break}d===p.score&&u.push(p.boxIndex)}),u}function _pe(e){let t=mt($e(e,[1,0])),n=[ce(t[2],t[0]),ce(t[3],t[1])],a=[Z(t[0],fe(n[0],2)),Z(t[1],fe(n[1],2))];return{sizes:n,centers:a}}function Epe(e,t){let{sizes:n,centers:a}=_pe(e),r=mt($e(t,[1,0])),s=fe(B(gn(fe(r[2],5)),n[0]),2),i=Z(B(fe(r[0],10),n[0]),a[0]),o=fe(B(gn(fe(r[3],5)),n[1]),2),l=Z(B(fe(r[1],10),n[1]),a[1]);return $e(Rt([ce(i,s),ce(l,o),Z(i,s),Z(l,o)]),[1,0])}function s$(e,t,n){return O(()=>{let a=e.shape[0],r=Epe(W(zn(n.extra_dim,[a,1,1]),[-1,4]),W(e,[-1,4]));r=W(r,[a,r.shape[0]/a,4]);let s=da(He(t,[0,0,1],[-1,-1,-1])),i=He(s,[0,0,0],[-1,-1,1]);i=W(i,[a,i.shape[1]]);let o=mt(r),l=mt(i);return{boxes:o,scores:l}})}function Fo(e,t){return O(()=>{let n=e.shape[0],a=W($o(e,t.box_encoding_predictor),[n,-1,1,4]),r=W($o(e,t.class_predictor),[n,-1,3]);return{boxPredictionEncoding:a,classPrediction:r}})}function i$(e,t,n){return O(()=>{let a=Fa(e,n.conv_0,[1,1]),r=Fa(a,n.conv_1,[2,2]),s=Fa(r,n.conv_2,[1,1]),i=Fa(s,n.conv_3,[2,2]),o=Fa(i,n.conv_4,[1,1]),l=Fa(o,n.conv_5,[2,2]),u=Fa(l,n.conv_6,[1,1]),p=Fa(u,n.conv_7,[2,2]),d=Fo(t,n.box_predictor_0),c=Fo(e,n.box_predictor_1),h=Fo(r,n.box_predictor_2),m=Fo(i,n.box_predictor_3),f=Fo(l,n.box_predictor_4),g=Fo(p,n.box_predictor_5),y=Qe([d.boxPredictionEncoding,c.boxPredictionEncoding,h.boxPredictionEncoding,m.boxPredictionEncoding,f.boxPredictionEncoding,g.boxPredictionEncoding],1),b=Qe([d.classPrediction,c.classPrediction,h.classPrediction,m.classPrediction,f.classPrediction,g.classPrediction],1);return{boxPredictions:y,classPredictions:b}})}var Da=class{constructor({minConfidence:t,maxResults:n}={}){this._name="SsdMobilenetv1Options";if(this._minConfidence=t||.5,this._maxResults=n||100,typeof this._minConfidence!="number"||this._minConfidence<=0||this._minConfidence>=1)throw new Error(`${this._name} - expected minConfidence to be a number between 0 and 1`);if(typeof this._maxResults!="number")throw new Error(`${this._name} - expected maxResults to be a number`)}get minConfidence(){return this._minConfidence}get maxResults(){return this._maxResults}};var Do=class extends dn{constructor(){super("SsdMobilenetv1")}forwardInput(t){let{params:n}=this;if(!n)throw new Error("SsdMobilenetv1 - load model before inference");return O(()=>{let a=le(t.toBatchTensor(512,!1),"float32"),r=ce(fe(a,127.5),1),s=a$(r,n.mobilenetv1),{boxPredictions:i,classPredictions:o}=i$(s.out,s.conv11,n.prediction_layer);return s$(i,o,n.output_layer)})}async forward(t){return this.forwardInput(await kt(t))}async locateFaces(t,n={}){let{maxResults:a,minConfidence:r}=new Da(n),s=await kt(t),{boxes:i,scores:o}=this.forwardInput(s),l=i[0],u=o[0];for(let x=1;x{let[v,I]=[Math.max(0,y[x][0]),Math.min(1,y[x][2])].map(A=>A*g),[T,_]=[Math.max(0,y[x][1]),Math.min(1,y[x][3])].map(A=>A*f);return new wt(p[x],new np(T,v,_-T,I-v),{height:s.getInputHeight(0),width:s.getInputWidth(0)})});return l.dispose(),u.dispose(),b}getDefaultModelName(){return"ssd_mobilenetv1_model"}extractParamsFromWeightMap(t){return n$(t)}extractParams(t){return t$(t)}};function Ape(e){let t=new Do;return t.extractWeights(e),t}function $Ie(e){return Ape(e)}var o$=class extends Do{};var l$=.4,u$=[new Oe(.738768,.874946),new Oe(2.42204,2.65704),new Oe(4.30971,7.04493),new Oe(10.246,4.59428),new Oe(12.6868,11.8741)],p$=[new Oe(1.603231,2.094468),new Oe(6.041143,7.080126),new Oe(2.882459,3.518061),new Oe(4.266906,5.178857),new Oe(9.041765,10.66308)],c$=[117.001,114.697,97.404],d$="tiny_yolov2_model",h$="tiny_yolov2_separable_conv_model";var Ng=e=>typeof e=="number";function m$(e){if(!e)throw new Error(`invalid config: ${e}`);if(typeof e.withSeparableConvs!="boolean")throw new Error(`config.withSeparableConvs has to be a boolean, have: ${e.withSeparableConvs}`);if(!Ng(e.iouThreshold)||e.iouThreshold<0||e.iouThreshold>1)throw new Error(`config.iouThreshold has to be a number between [0, 1], have: ${e.iouThreshold}`);if(!Array.isArray(e.classes)||!e.classes.length||!e.classes.every(t=>typeof t=="string"))throw new Error(`config.classes has to be an array class names: string[], have: ${JSON.stringify(e.classes)}`);if(!Array.isArray(e.anchors)||!e.anchors.length||!e.anchors.map(t=>t||{}).every(t=>Ng(t.x)&&Ng(t.y)))throw new Error(`config.anchors has to be an array of { x: number, y: number }, have: ${JSON.stringify(e.anchors)}`);if(e.meanRgb&&(!Array.isArray(e.meanRgb)||e.meanRgb.length!==3||!e.meanRgb.every(Ng)))throw new Error(`config.meanRgb has to be an array of shape [number, number, number], have: ${JSON.stringify(e.meanRgb)}`)}function bp(e){return O(()=>{let t=B(e,ke(.10000000149011612));return Z(Xe(ce(e,t)),t)})}function zr(e,t){return O(()=>{let n=ga(e,[[0,0],[1,1],[1,1],[0,0]]);return n=Dt(n,t.conv.filters,[1,1],"valid"),n=ce(n,t.bn.sub),n=B(n,t.bn.truediv),n=Z(n,t.conv.bias),bp(n)})}function Br(e,t){return O(()=>{let n=ga(e,[[0,0],[1,1],[1,1],[0,0]]);return n=ks(n,t.depthwise_filter,t.pointwise_filter,[1,1],"valid"),n=Z(n,t.bias),bp(n)})}function $pe(e,t){let n=up(e,t);function a(i,o){let l=Ke(e(i)),u=Ke(e(i));return t.push({paramPath:`${o}/sub`},{paramPath:`${o}/truediv`}),{sub:l,truediv:u}}function r(i,o,l){let u=n(i,o,3,`${l}/conv`),p=a(o,`${l}/bn`);return{conv:u,bn:p}}let s=pp(e,t);return{extractConvParams:n,extractConvWithBatchNormParams:r,extractSeparableConvParams:s}}function f$(e,t,n,a){let{extractWeights:r,getRemainingWeights:s}=Dn(e),i=[],{extractConvParams:o,extractConvWithBatchNormParams:l,extractSeparableConvParams:u}=$pe(r,i),p;if(t.withSeparableConvs){let[d,c,h,m,f,g,y,b,x]=a,v=t.isFirstLayerConv2d?o(d,c,3,"conv0"):u(d,c,"conv0"),I=u(c,h,"conv1"),T=u(h,m,"conv2"),_=u(m,f,"conv3"),A=u(f,g,"conv4"),F=u(g,y,"conv5"),P=b?u(y,b,"conv6"):void 0,$=x?u(b,x,"conv7"):void 0,S=o(x||b||y,5*n,1,"conv8");p={conv0:v,conv1:I,conv2:T,conv3:_,conv4:A,conv5:F,conv6:P,conv7:$,conv8:S}}else{let[d,c,h,m,f,g,y,b,x]=a,v=l(d,c,"conv0"),I=l(c,h,"conv1"),T=l(h,m,"conv2"),_=l(m,f,"conv3"),A=l(f,g,"conv4"),F=l(g,y,"conv5"),P=l(y,b,"conv6"),$=l(b,x,"conv7"),S=o(x,5*n,1,"conv8");p={conv0:v,conv1:I,conv2:T,conv3:_,conv4:A,conv5:F,conv6:P,conv7:$,conv8:S}}if(s().length!==0)throw new Error(`weights remaing after extract: ${s().length}`);return{params:p,paramMappings:i}}function Fpe(e,t){let n=ra(e,t);function a(o){let l=n(`${o}/sub`,1),u=n(`${o}/truediv`,1);return{sub:l,truediv:u}}function r(o){let l=n(`${o}/filters`,4),u=n(`${o}/bias`,1);return{filters:l,bias:u}}function s(o){let l=r(`${o}/conv`),u=a(`${o}/bn`);return{conv:l,bn:u}}let i=cp(n);return{extractConvParams:r,extractConvWithBatchNormParams:s,extractSeparableConvParams:i}}function g$(e,t){let n=[],{extractConvParams:a,extractConvWithBatchNormParams:r,extractSeparableConvParams:s}=Fpe(e,n),i;if(t.withSeparableConvs){let o=t.filterSizes&&t.filterSizes.length||9;i={conv0:t.isFirstLayerConv2d?a("conv0"):s("conv0"),conv1:s("conv1"),conv2:s("conv2"),conv3:s("conv3"),conv4:s("conv4"),conv5:s("conv5"),conv6:o>7?s("conv6"):void 0,conv7:o>8?s("conv7"):void 0,conv8:a("conv8")}}else i={conv0:r("conv0"),conv1:r("conv1"),conv2:r("conv2"),conv3:r("conv3"),conv4:r("conv4"),conv5:r("conv5"),conv6:r("conv6"),conv7:r("conv7"),conv8:a("conv8")};return Fn(e,n),{params:i,paramMappings:n}}var br=class{constructor({inputSize:t,scoreThreshold:n}={}){this._name="TinyYolov2Options";if(this._inputSize=t||416,this._scoreThreshold=n||.5,typeof this._inputSize!="number"||this._inputSize%32!==0)throw new Error(`${this._name} - expected inputSize to be a number divisible by 32`);if(typeof this._scoreThreshold!="number"||this._scoreThreshold<=0||this._scoreThreshold>=1)throw new Error(`${this._name} - expected scoreThreshold to be a number between 0 and 1`)}get inputSize(){return this._inputSize}get scoreThreshold(){return this._scoreThreshold}};var A1=class extends dn{constructor(n){super("TinyYolov2");m$(n),this._config=n}get config(){return this._config}get withClassScores(){return this.config.withClassScores||this.config.classes.length>1}get boxEncodingSize(){return 5+(this.withClassScores?this.config.classes.length:0)}runTinyYolov2(n,a){let r=zr(n,a.conv0);return r=Mt(r,[2,2],[2,2],"same"),r=zr(r,a.conv1),r=Mt(r,[2,2],[2,2],"same"),r=zr(r,a.conv2),r=Mt(r,[2,2],[2,2],"same"),r=zr(r,a.conv3),r=Mt(r,[2,2],[2,2],"same"),r=zr(r,a.conv4),r=Mt(r,[2,2],[2,2],"same"),r=zr(r,a.conv5),r=Mt(r,[2,2],[1,1],"same"),r=zr(r,a.conv6),r=zr(r,a.conv7),$o(r,a.conv8,"valid",!1)}runMobilenet(n,a){let r=this.config.isFirstLayerConv2d?bp($o(n,a.conv0,"valid",!1)):Br(n,a.conv0);return r=Mt(r,[2,2],[2,2],"same"),r=Br(r,a.conv1),r=Mt(r,[2,2],[2,2],"same"),r=Br(r,a.conv2),r=Mt(r,[2,2],[2,2],"same"),r=Br(r,a.conv3),r=Mt(r,[2,2],[2,2],"same"),r=Br(r,a.conv4),r=Mt(r,[2,2],[2,2],"same"),r=Br(r,a.conv5),r=Mt(r,[2,2],[1,1],"same"),r=a.conv6?Br(r,a.conv6):r,r=a.conv7?Br(r,a.conv7):r,$o(r,a.conv8,"valid",!1)}forwardInput(n,a){let{params:r}=this;if(!r)throw new Error("TinyYolov2 - load model before inference");return O(()=>{let s=le(n.toBatchTensor(a,!1),"float32");return s=this.config.meanRgb?yr(s,this.config.meanRgb):s,s=s.div(255),this.config.withSeparableConvs?this.runMobilenet(s,r):this.runTinyYolov2(s,r)})}async forward(n,a){return this.forwardInput(await kt(n),a)}async detect(n,a={}){let{inputSize:r,scoreThreshold:s}=new br(a),i=await kt(n),o=await this.forwardInput(i,r),l=O(()=>mt(o)[0].expandDims()),u={width:i.getInputWidth(0),height:i.getInputHeight(0)},p=await this.extractBoxes(l,i.getReshapedInputDimensions(0),s);o.dispose(),l.dispose();let d=p.map(y=>y.box),c=p.map(y=>y.score),h=p.map(y=>y.classScore),m=p.map(y=>this.config.classes[y.label]);return SA(d.map(y=>y.rescale(r)),c,this.config.iouThreshold,!0).map(y=>new Cs(c[y],h[y],m[y],d[y],u))}getDefaultModelName(){return""}extractParamsFromWeightMap(n){return g$(n,this.config)}extractParams(n){let a=this.config.filterSizes||A1.DEFAULT_FILTER_SIZES,r=a?a.length:void 0;if(r!==7&&r!==8&&r!==9)throw new Error(`TinyYolov2 - expected 7 | 8 | 9 convolutional filters, but found ${r} filterSizes in config`);return f$(n,this.config,this.boxEncodingSize,a)}async extractBoxes(n,a,r){let{width:s,height:i}=a,o=Math.max(s,i),l=o/s,u=o/i,p=n.shape[1],d=this.config.anchors.length,[c,h,m]=O(()=>{let b=n.reshape([p,p,d,this.boxEncodingSize]),x=b.slice([0,0,0,0],[p,p,d,4]),v=b.slice([0,0,0,4],[p,p,d,1]),I=this.withClassScores?Za(b.slice([0,0,0,5],[p,p,d,this.config.classes.length]),3):ke(0);return[x,v,I]}),f=[],g=await h.array(),y=await c.array();for(let b=0;br){let T=(x+sg(y[b][x][v][0]))/p*l,_=(b+sg(y[b][x][v][1]))/p*u,A=Math.exp(y[b][x][v][2])*this.config.anchors[v].x/p*l,F=Math.exp(y[b][x][v][3])*this.config.anchors[v].y/p*u,P=T-A/2,$=_-F/2,S={row:b,col:x,anchor:v},{classScore:M,label:U}=this.withClassScores?await this.extractPredictedClass(m,S):{classScore:1,label:0};f.push({box:new tp(P,$,P+A,$+F),score:I,classScore:I*M,label:U,...S})}}return c.dispose(),h.dispose(),m.dispose(),f}async extractPredictedClass(n,a){let{row:r,col:s,anchor:i}=a,o=await n.array();return Array(this.config.classes.length).fill(0).map((l,u)=>o[r][s][i][u]).map((l,u)=>({classScore:l,label:u})).reduce((l,u)=>l.classScore>u.classScore?l:u)}},Ro=A1;Ro.DEFAULT_FILTER_SIZES=[3,16,32,64,128,256,512,1024,1024];var xp=class extends Ro{constructor(t=!0){let n={withSeparableConvs:t,iouThreshold:l$,classes:["face"],...t?{anchors:p$,meanRgb:c$}:{anchors:u$,withClassScores:!0}};super(n)}get withSeparableConvs(){return this.config.withSeparableConvs}get anchors(){return this.config.anchors}async locateFaces(t,n){return(await this.detect(t,n)).map(r=>new wt(r.score,r.relativeBox,{width:r.imageWidth,height:r.imageHeight}))}getDefaultModelName(){return this.withSeparableConvs?h$:d$}extractParamsFromWeightMap(t){return super.extractParamsFromWeightMap(t)}};function kSe(e,t=!0){let n=new xp(t);return n.extractWeights(e),n}var Tg=class extends br{constructor(){super(...arguments);this._name="TinyFaceDetectorOptions"}};var Ra=class{async then(t){return t(await this.run())}async run(){throw new Error("ComposableTask - run is not implemented")}};async function Mo(e,t,n,a,r=({alignedRect:s})=>s){let s=e.map(l=>mp(l)?r(l):l.detection),i=a||(t instanceof Ae?await wd(t,s):await vd(t,s)),o=await n(i);return i.forEach(l=>l instanceof Ae&&l.dispose()),o}async function vp(e,t,n,a,r){return Mo([e],t,async s=>n(s[0]),a,r)}var y$=.4,b$=[new Oe(1.603231,2.094468),new Oe(6.041143,7.080126),new Oe(2.882459,3.518061),new Oe(4.266906,5.178857),new Oe(9.041765,10.66308)],x$=[117.001,114.697,97.404];var wp=class extends Ro{constructor(){let t={withSeparableConvs:!0,iouThreshold:y$,classes:["face"],anchors:b$,meanRgb:x$,isFirstLayerConv2d:!0,filterSizes:[3,16,32,64,128,256,512]};super(t)}get anchors(){return this.config.anchors}async locateFaces(t,n){return(await this.detect(t,n)).map(r=>new wt(r.score,r.relativeBox,{width:r.imageWidth,height:r.imageHeight}))}getDefaultModelName(){return"tiny_face_detector_model"}extractParamsFromWeightMap(t){return super.extractParamsFromWeightMap(t)}};var rt={ssdMobilenetv1:new Do,tinyFaceDetector:new wp,tinyYolov2:new xp,faceLandmark68Net:new gp,faceLandmark68TinyNet:new Ig,faceRecognitionNet:new yp,faceExpressionNet:new yg,ageGenderNet:new wg},Dpe=(e,t)=>rt.ssdMobilenetv1.locateFaces(e,t),ZSe=(e,t)=>rt.tinyFaceDetector.locateFaces(e,t),QSe=(e,t)=>rt.tinyYolov2.locateFaces(e,t),Rpe=e=>rt.faceLandmark68Net.detectLandmarks(e),eNe=e=>rt.faceLandmark68TinyNet.detectLandmarks(e),tNe=e=>rt.faceRecognitionNet.computeFaceDescriptor(e),nNe=e=>rt.faceExpressionNet.predictExpressions(e),aNe=e=>rt.ageGenderNet.predictAgeAndGender(e),Mpe=e=>rt.ssdMobilenetv1.load(e),rNe=e=>rt.tinyFaceDetector.load(e),sNe=e=>rt.tinyYolov2.load(e),iNe=e=>rt.faceLandmark68Net.load(e),oNe=e=>rt.faceLandmark68TinyNet.load(e),lNe=e=>rt.faceRecognitionNet.load(e),uNe=e=>rt.faceExpressionNet.load(e),pNe=e=>rt.ageGenderNet.load(e),cNe=Mpe,dNe=Dpe,hNe=Rpe;var Cg=class extends Ra{constructor(n,a,r){super();this.parentTask=n;this.input=a;this.extractedFaces=r}},Po=class extends Cg{async run(){let t=await this.parentTask,n=await Mo(t,this.input,async a=>Promise.all(a.map(r=>rt.faceExpressionNet.predictExpressions(r))),this.extractedFaces);return t.map((a,r)=>k1(a,n[r]))}withAgeAndGender(){return new Lo(this,this.input)}},Oo=class extends Cg{async run(){let t=await this.parentTask;if(!t)return;let n=await vp(t,this.input,a=>rt.faceExpressionNet.predictExpressions(a),this.extractedFaces);return k1(t,n)}withAgeAndGender(){return new zo(this,this.input)}},As=class extends Po{withAgeAndGender(){return new Fs(this,this.input)}withFaceDescriptors(){return new Rs(this,this.input)}},$s=class extends Oo{withAgeAndGender(){return new Ds(this,this.input)}withFaceDescriptor(){return new Ms(this,this.input)}};var _g=class extends Ra{constructor(n,a,r){super();this.parentTask=n;this.input=a;this.extractedFaces=r}},Lo=class extends _g{async run(){let t=await this.parentTask,n=await Mo(t,this.input,async a=>Promise.all(a.map(r=>rt.ageGenderNet.predictAgeAndGender(r))),this.extractedFaces);return t.map((a,r)=>{let{age:s,gender:i,genderProbability:o}=n[r];return _1(E1(a,i,o),s)})}withFaceExpressions(){return new Po(this,this.input)}},zo=class extends _g{async run(){let t=await this.parentTask;if(!t)return;let{age:n,gender:a,genderProbability:r}=await vp(t,this.input,s=>rt.ageGenderNet.predictAgeAndGender(s),this.extractedFaces);return _1(E1(t,a,r),n)}withFaceExpressions(){return new Oo(this,this.input)}},Fs=class extends Lo{withFaceExpressions(){return new As(this,this.input)}withFaceDescriptors(){return new Rs(this,this.input)}},Ds=class extends zo{withFaceExpressions(){return new $s(this,this.input)}withFaceDescriptor(){return new Ms(this,this.input)}};var Eg=class extends Ra{constructor(n,a){super();this.parentTask=n;this.input=a}},Rs=class extends Eg{async run(){let t=await this.parentTask;return(await Mo(t,this.input,a=>Promise.all(a.map(r=>rt.faceRecognitionNet.computeFaceDescriptor(r))),null,a=>a.landmarks.align(null,{useDlibAlignment:!0}))).map((a,r)=>C1(t[r],a))}withFaceExpressions(){return new As(this,this.input)}withAgeAndGender(){return new Fs(this,this.input)}},Ms=class extends Eg{async run(){let t=await this.parentTask;if(!t)return;let n=await vp(t,this.input,a=>rt.faceRecognitionNet.computeFaceDescriptor(a),null,a=>a.landmarks.align(null,{useDlibAlignment:!0}));return C1(t,n)}withFaceExpressions(){return new $s(this,this.input)}withAgeAndGender(){return new Ds(this,this.input)}};var Ag=class extends Ra{constructor(n,a,r){super();this.parentTask=n;this.input=a;this.useTinyLandmarkNet=r}get landmarkNet(){return this.useTinyLandmarkNet?rt.faceLandmark68TinyNet:rt.faceLandmark68Net}},$g=class extends Ag{async run(){let t=await this.parentTask,n=t.map(i=>i.detection),a=this.input instanceof Ae?await wd(this.input,n):await vd(this.input,n),r=await Promise.all(a.map(i=>this.landmarkNet.detectLandmarks(i)));return a.forEach(i=>i instanceof Ae&&i.dispose()),t.filter((i,o)=>r[o]).map((i,o)=>Nd(i,r[o]))}withFaceExpressions(){return new As(this,this.input)}withAgeAndGender(){return new Fs(this,this.input)}withFaceDescriptors(){return new Rs(this,this.input)}},Fg=class extends Ag{async run(){let t=await this.parentTask;if(!t)return;let{detection:n}=t,a=this.input instanceof Ae?await wd(this.input,[n]):await vd(this.input,[n]),r=await this.landmarkNet.detectLandmarks(a[0]);return a.forEach(s=>s instanceof Ae&&s.dispose()),Nd(t,r)}withFaceExpressions(){return new $s(this,this.input)}withAgeAndGender(){return new Ds(this,this.input)}withFaceDescriptor(){return new Ms(this,this.input)}};var Dg=class extends Ra{constructor(n,a=new Da){super();this.input=n;this.options=a}},Cd=class extends Dg{async run(){let{input:t,options:n}=this,a;if(n instanceof Tg)a=rt.tinyFaceDetector.locateFaces(t,n);else if(n instanceof Da)a=rt.ssdMobilenetv1.locateFaces(t,n);else if(n instanceof br)a=rt.tinyYolov2.locateFaces(t,n);else throw new Error("detectFaces - expected options to be instance of TinyFaceDetectorOptions | SsdMobilenetv1Options | TinyYolov2Options");return a}runAndExtendWithFaceDetections(){return new Promise((t,n)=>{this.run().then(a=>t(a.map(r=>rp({},r)))).catch(a=>n(a))})}withFaceLandmarks(t=!1){return new $g(this.runAndExtendWithFaceDetections(),this.input,t)}withFaceExpressions(){return new Po(this.runAndExtendWithFaceDetections(),this.input)}withAgeAndGender(){return new Lo(this.runAndExtendWithFaceDetections(),this.input)}},Rg=class extends Dg{async run(){let t=await new Cd(this.input,this.options),n=t[0];return t.forEach(a=>{a.score>n.score&&(n=a)}),n}runAndExtendWithFaceDetection(){return new Promise(async t=>{let n=await this.run();t(n?rp({},n):void 0)})}withFaceLandmarks(t=!1){return new Fg(this.runAndExtendWithFaceDetection(),this.input,t)}withFaceExpressions(){return new Oo(this.runAndExtendWithFaceDetection(),this.input)}withAgeAndGender(){return new zo(this.runAndExtendWithFaceDetection(),this.input)}};function p2e(e,t=new Da){return new Rg(e,t)}function $1(e,t=new Da){return new Cd(e,t)}async function Ppe(e,t){return $1(e,new Da(t?{minConfidence:t}:{})).withFaceLandmarks().withFaceDescriptors()}async function g2e(e,t={}){return $1(e,new br(t)).withFaceLandmarks().withFaceDescriptors()}var y2e=Ppe;function v$(e,t){if(e.length!==t.length)throw new Error("euclideanDistance: arr1.length !== arr2.length");let n=Array.from(e),a=Array.from(t);return Math.sqrt(n.map((r,s)=>r-a[s]).reduce((r,s)=>r+s**2,0))}var Mg=class{constructor(t,n=.6){this._distanceThreshold=n;let a=Array.isArray(t)?t:[t];if(!a.length)throw new Error("FaceRecognizer.constructor - expected atleast one input");let r=1,s=()=>`person ${r++}`;this._labeledDescriptors=a.map(i=>{if(i instanceof Mr)return i;if(i instanceof Float32Array)return new Mr(s(),[i]);if(i.descriptor&&i.descriptor instanceof Float32Array)return new Mr(s(),[i.descriptor]);throw new Error("FaceRecognizer.constructor - expected inputs to be of type LabeledFaceDescriptors | WithFaceDescriptor | Float32Array | Array | Float32Array>")})}get labeledDescriptors(){return this._labeledDescriptors}get distanceThreshold(){return this._distanceThreshold}computeMeanDistance(t,n){return n.map(a=>v$(a,t)).reduce((a,r)=>a+r,0)/(n.length||1)}matchDescriptor(t){return this.labeledDescriptors.map(({descriptors:n,label:a})=>new gd(a,this.computeMeanDistance(t,n))).reduce((n,a)=>n.distancet.toJSON())}}static fromJSON(t){let n=t.labeledDescriptors.map(a=>Mr.fromJSON(a));return new Mg(n,t.distanceThreshold)}};function M2e(e){let t=new wp;return t.extractWeights(e),t}function Ope(e,t){let{width:n,height:a}=new $n(t.width,t.height);if(n<=0||a<=0)throw new Error(`resizeResults - invalid dimensions: ${JSON.stringify({width:n,height:a})}`);if(Array.isArray(e))return e.map(r=>Ope(r,{width:n,height:a}));if(mp(e)){let r=e.detection.forSize(n,a),s=e.unshiftedLandmarks.forSize(r.box.width,r.box.height);return Nd(rp(e,r),s)}return Pr(e)?rp(e,e.detection.forSize(n,a)):e instanceof xa||e instanceof wt?e.forSize(n,a):e}var j2e=VA;export{wg as AgeGenderNet,tp as BoundingBox,ct as Box,Ra as ComposableTask,Rs as ComputeAllFaceDescriptorsTask,Eg as ComputeFaceDescriptorsTaskBase,Ms as ComputeSingleFaceDescriptorTask,$g as DetectAllFaceLandmarksTask,Cd as DetectAllFacesTask,Ag as DetectFaceLandmarksTaskBase,Dg as DetectFacesTaskBase,Fg as DetectSingleFaceLandmarksTask,Rg as DetectSingleFaceTask,$n as Dimensions,zA as FACE_EXPRESSION_LABELS,wt as FaceDetection,o$ as FaceDetectionNet,yg as FaceExpressionNet,Es as FaceExpressions,gp as FaceLandmark68Net,Ig as FaceLandmark68TinyNet,YA as FaceLandmarkNet,xa as FaceLandmarks,TA as FaceLandmarks5,ap as FaceLandmarks68,gd as FaceMatch,Mg as FaceMatcher,yp as FaceRecognitionNet,S1 as Gender,yd as LabeledBox,Mr as LabeledFaceDescriptors,Lr as NetInput,dn as NeuralNetwork,Cs as ObjectDetection,Oe as Point,CA as PredictedBox,np as Rect,Do as SsdMobilenetv1,Da as SsdMobilenetv1Options,wp as TinyFaceDetector,Tg as TinyFaceDetectorOptions,xp as TinyYolov2,br as TinyYolov2Options,y2e as allFaces,Ppe as allFacesSsdMobilenetv1,g2e as allFacesTinyYolov2,_A as awaitMediaLoaded,EA as bufferToImage,tNe as computeFaceDescriptor,lp as createCanvas,ug as createCanvasFromMedia,$Ie as createFaceDetectionNet,$ke as createFaceRecognitionNet,Ape as createSsdMobilenetv1,M2e as createTinyFaceDetector,kSe as createTinyYolov2,$1 as detectAllFaces,Rpe as detectFaceLandmarks,eNe as detectFaceLandmarksTiny,hNe as detectLandmarks,p2e as detectSingleFace,WA as draw,at as env,v$ as euclideanDistance,_1 as extendWithAge,C1 as extendWithFaceDescriptor,rp as extendWithFaceDetection,k1 as extendWithFaceExpressions,Nd as extendWithFaceLandmarks,E1 as extendWithGender,wd as extractFaceTensors,vd as extractFaces,Wxe as fetchImage,FA as fetchJson,jxe as fetchNetWeights,_s as fetchOrThrow,Zxe as fetchVideo,aa as getContext2dOrThrow,op as getMediaDimensions,AA as imageTensorToCanvas,$A as imageToSquare,nye as inverseSigmoid,kA as iou,w1 as isMediaElement,lg as isMediaLoaded,Mke as isWithAge,Pr as isWithFaceDetection,BA as isWithFaceExpressions,mp as isWithFaceLandmarks,zke as isWithGender,pNe as loadAgeGenderModel,cNe as loadFaceDetectionModel,uNe as loadFaceExpressionModel,iNe as loadFaceLandmarkModel,oNe as loadFaceLandmarkTinyModel,lNe as loadFaceRecognitionModel,Mpe as loadSsdMobilenetv1Model,rNe as loadTinyFaceDetectorModel,sNe as loadTinyYolov2Model,RA as loadWeightMap,dNe as locateFaces,sve as matchDimensions,IA as minBbox,rt as nets,SA as nonMaxSuppression,yr as normalize,NA as padToSquare,aNe as predictAgeAndGender,nNe as recognizeFaceExpressions,Ope as resizeResults,sp as resolveInput,eye as shuffleArray,sg as sigmoid,Dpe as ssdMobilenetv1,Be as tf,ZSe as tinyFaceDetector,QSe as tinyYolov2,kt as toNetInput,wA as utils,m$ as validateConfig,j2e as version}; //# sourceMappingURL=face-api.esm.js.map diff --git a/dist/face-api.js b/dist/face-api.js index b568252..692f361 100644 --- a/dist/face-api.js +++ b/dist/face-api.js @@ -4686,4 +4686,4 @@ return a / b;`,Tne=` } `}};function yse(e){let{inputs:t,backend:n,attrs:a}=e,{x:r,segmentIds:s}=t,{numSegments:i}=a,o=r.shape.length,l=[],u=0,p=C.getAxesPermutation([u],o),d=r;p!=null&&(d=Cn({inputs:{x:r},backend:n,attrs:{perm:p}}),l.push(d),u=C.getInnerMostAxes(1,o)[0]);let c=C.segment_util.computeOutShape(d.shape,u,i),h=w.sizeFromShape([d.shape[u]]),m=he({inputs:{x:d},backend:n,attrs:{shape:[-1,h]}});l.push(m);let f=rf(r.dtype),g=(v,I,T,_,A)=>{let F=v.shape[0],P=v.shape[1],$=C.segment_util.segOpComputeOptimalWindowSize(P,A),S={windowSize:$,inSize:P,batchSize:F,numSegments:A},M=new gse(S,I),U=n.compileAndRun(M,[v,T],_);if(l.push(U),U.shape[1]===A)return U;let j=RE({backend:n,attrs:{start:0,stop:A,step:1,dtype:"float32"}}),q=PE({inputs:{x:j},backend:n,attrs:{reps:[P/$]}});return l.push(j),l.push(q),g(U,I,q,_,A)},y=g(m,"unsortedSegmentSum",s,f,i),b=he({inputs:{x:y},backend:n,attrs:{shape:c}}),x=b;if(p!=null){l.push(b);let v=C.getUndoAxesPermutation(p);x=Cn({inputs:{x},backend:n,attrs:{perm:v}})}return l.forEach(v=>n.disposeIntermediateTensorInfo(v)),x}var bse={kernelName:Lc,backendName:"webgl",kernelFunc:yse},xse=[v9,k9,N9,_9,A9,D9,M9,O9,W9,U9,j9,X9,Z9,nZ,sZ,oZ,uZ,hZ,fZ,yZ,wZ,_Z,AZ,FZ,LZ,BZ,GZ,t9,qZ,ZZ,nQ,lQ,pQ,dQ,mQ,gQ,xQ,kQ,NQ,CQ,EQ,$Q,RQ,PQ,BQ,VQ,HQ,KQ,YQ,eee,ree,lee,cee,mee,fee,yee,xee,wee,Iee,Nee,Eee,Fee,Mee,Oee,Bee,Uee,qee,Jee,e9,Qee,YZ,nte,ste,lte,a9,dte,gte,bte,kte,Nte,Ete,Fte,Pte,Bte,Ute,Hte,Xte,Jte,Qte,ane,sne,one,une,cne,fne,xne,Ine,$ne,l9,Mne,Lne,Wne,Gne,RZ,qne,Xne,Jne,eae,rae,s9,iae,oae,MZ,Cne,pae,mae,bae,p9,kae,Nae,Eae,Fae,Pae,Lae,Wae,Gae,jae,Xae,Zae,tre,sre,lre,cre,mre,TZ,Ene,yre,xre,wre,Ire,Nre,Cre,Ere,$re,Dre,Pre,Lre,Bre,Ure,Hre,qre,Xre,_ne,y9,Zre,tse,rse,lse,cse,b9,hse,fse,bse,Kne];for(let e of xse)zc(e);var $t;(function(e){e[e.float32=0]="float32",e[e.int32=1]="int32",e[e.bool=2]="bool",e[e.string=3]="string",e[e.complex64=4]="complex64"})($t||($t={}));var vc;(function(e){e[e.linear=0]="linear",e[e.relu=1]="relu",e[e.relu6=2]="relu6",e[e.prelu=3]="prelu",e[e.leakyrelu=4]="leakyrelu",e[e.sigmoid=5]="sigmoid",e[e.elu=6]="elu"})(vc||(vc={}));var OE;function vse(e){OE=e.wasm.cwrap(si,null,["number","array","number","number","array","number","number","number","number","number","number","number","number"])}function wse(e){let{inputs:t,backend:n,attrs:a}=e,{a:r,b:s,bias:i,preluActivationWeights:o}=t;if(r.dtype!=="float32"||s.dtype!=="float32")throw new Error("_FusedMatMul for non non-float32 tensors not yet supported.");let{transposeA:l,transposeB:u,activation:p,leakyreluAlpha:d}=a,c=n.dataIdMap.get(r.dataId).id,h=n.dataIdMap.get(s.dataId).id,m=0;if(i!=null){let A=n.dataIdMap.get(i.dataId);if(A.shape.length!==1)throw new Error(`_FusedMatMul only supports rank-1 bias but got rank ${A.shape.length}.`);m=A.id}let f=o==null?0:n.dataIdMap.get(o.dataId).id,g=vc[p];if(g==null)throw new Error(`${p} activation not yet supported for FusedConv2D in the wasm backend.`);let y=l?r.shape[2]:r.shape[1],b=u?s.shape[1]:s.shape[2],x=Hu.assertAndGetBroadcastShape(r.shape.slice(0,-2),s.shape.slice(0,-2)),v=n.makeOutput([...x,y,b],r.dtype),I=n.dataIdMap.get(v.dataId).id,T=new Uint8Array(new Int32Array(r.shape).buffer),_=new Uint8Array(new Int32Array(s.shape).buffer);return OE(c,T,r.shape.length,h,_,s.shape.length,l,u,g,m,f,d||0,I),v}var kse={kernelName:si,backendName:"wasm",setupFunc:vse,kernelFunc:wse};function rn(e,t){let n;function a(s){n=s.wasm.cwrap(e,null,["number","number","number"])}function r(s){let{backend:i,inputs:{x:o}}=s,l=i.dataIdMap.get(o.dataId).id,u=i.makeOutput(o.shape,t||o.dtype),p=i.dataIdMap.get(u.dataId).id;return w.sizeFromShape(u.shape)===0||n(l,$t[o.dtype],p),u}return{kernelName:e,backendName:"wasm",setupFunc:a,kernelFunc:r}}var Ise=rn(Wl);function dn(e,t,n){let a;function r(i){a=i.wasm.cwrap(e,null,["number","array","number","number","array","number","number","number"])}function s(i){let{backend:o,inputs:l}=i,{a:u,b:p}=l,d=o.dataIdMap.get(u.dataId).id,c=o.dataIdMap.get(p.dataId).id,h=n!=null?n:u.dtype,m=C.assertAndGetBroadcastShape(u.shape,p.shape),f=o.makeOutput(m,h);if(w.sizeFromShape(m)===0)return f;let g=new Uint8Array(new Int32Array(u.shape).buffer),y=new Uint8Array(new Int32Array(p.shape).buffer),b=o.dataIdMap.get(f.dataId).id;return a(d,g,u.shape.length,c,y,p.shape.length,$t[u.dtype],b),f}return{kernelName:e,backendName:"wasm",setupFunc:r,kernelFunc:s}}var Sse=!0,Nse=dn(ys,Sse),LE;function Tse(e){LE=e.wasm.cwrap(wi,null,["array","number","number","number"])}function Cse(e){let{inputs:t,backend:n}=e,a=n.makeOutput(t[0].shape,t[0].dtype);if(w.sizeFromShape(a.shape)===0)return a;let r=t.map(o=>n.dataIdMap.get(o.dataId).id),s=new Uint8Array(new Int32Array(r).buffer),i=n.dataIdMap.get(a.dataId).id;return LE(s,r.length,$t[a.dtype],i),a}var _se={kernelName:wi,backendName:"wasm",setupFunc:Tse,kernelFunc:Cse};function yg(e){let{inputs:{x:t},backend:n}=e,a=n.makeOutput(t.shape,t.dtype),r=n.typedArrayFromHeap(t);return n.typedArrayFromHeap(a).set(r),a}var Ese={kernelName:Bi,backendName:"wasm",kernelFunc:yg},zE;function Ase(e){zE=e.wasm.cwrap(Er,null,["number","array","number","number","number","array","number"])}function ms(e){let{inputs:t,backend:n,attrs:a}=e,[r,s]=Fse(t.x.shape,a.perm),i=!0;for(let m=0;m=r&&(s===-1||a[s]>a[i])&&(s=i);a[s]=r}return[n,a]}var Dse={kernelName:Er,backendName:"wasm",kernelFunc:ms,setupFunc:Ase};function $s(e,t,n){let a=e.shape,r=e.shape.length,s=w.parseAxisParam(t,a),i=s,o=C.getAxesPermutation(i,r),l=null,u=!1;if(o!=null){let p=new Array(r);for(let c=0;c`new shape: ${i}, old shape: ${a.shape}. New shape and old shape must have the same number of elements.`),e.backend.incRef(a.dataId),{dataId:a.dataId,shape:i,dtype:a.dtype}}var jse={kernelName:_u,backendName:"wasm",kernelFunc:Vn},GE;function qse(e){GE=e.wasm.cwrap(Si,null,["number","array","number","number","array","number","number","number","number"])}function Kse(e){let{inputs:t,backend:n,attrs:a}=e,{a:r,b:s}=t,{transposeA:i,transposeB:o}=a;if(r.dtype!=="float32"||s.dtype!=="float32")throw new Error("BatchMatMul for non non-float32 tensors not yet supported.");let l=r.shape.length,u=s.shape.length,p=i?r.shape[l-2]:r.shape[l-1],d=o?s.shape[u-1]:s.shape[u-2],c=i?r.shape[l-1]:r.shape[l-2],h=o?s.shape[u-2]:s.shape[u-1],m=r.shape.slice(0,-2),f=s.shape.slice(0,-2),g=w.sizeFromShape(m),y=w.sizeFromShape(f),b=Hu.assertAndGetBroadcastShape(r.shape.slice(0,-2),s.shape.slice(0,-2)).concat([c,h]);w.assert(p===d,()=>`Error in matMul: inner shapes (${p}) and (${d}) of Tensors with shapes ${r.shape} and ${s.shape} and transposeA=${i} and transposeB=${o} must match.`);let x=i?[g,p,c]:[g,c,p],v=o?[y,h,d]:[y,d,h],I=Vn({inputs:{x:r},backend:n,attrs:{shape:x}}),T=Vn({inputs:{x:s},backend:n,attrs:{shape:v}}),_=n.dataIdMap.get(I.dataId).id,A=n.dataIdMap.get(T.dataId).id,F=i?I.shape[2]:I.shape[1],P=o?T.shape[1]:T.shape[2],$=Math.max(g,y),S=n.makeOutput([$,F,P],I.dtype),M=n.dataIdMap.get(S.dataId).id,U=new Uint8Array(new Int32Array(I.shape).buffer),j=new Uint8Array(new Int32Array(T.shape).buffer);return GE(_,U,I.shape.length,A,j,T.shape.length,i,o,M),n.disposeData(I.dataId),n.disposeData(T.dataId),S.shape=b,S}var Xse={kernelName:Si,backendName:"wasm",setupFunc:qse,kernelFunc:Kse};function xi(e){let{inputs:{x:t},attrs:{begin:n,size:a},backend:r}=e,[s,i]=qt.parseSliceParams(t,n,a),o=qt.isSliceContinous(t.shape,s,i),l=r.readSync(t.dataId),u=r.makeOutput(i,t.dtype),p=w.computeStrides(t.shape),d=r.dataIdMap.get(u.dataId);if(o){let m=qt.computeFlatOffset(s,p);return t.dtype==="string"?d.stringBytes=l.slice(m,m+w.sizeFromShape(i)):r.typedArrayFromHeap(u).set(l.subarray(m,m+w.sizeFromShape(i))),u}if(t.dtype==="string"){let m=gm(l,s,i,t.shape,t.dtype);return d.stringBytes=m,u}let c=r.typedArrayFromHeap(u),h=t.shape.length;if(h===2)Yse(l,p[0],c,s,i);else if(h===3)Jse(l,p[0],p[1],c,s,i);else if(h===4)Zse(l,p[0],p[1],p[2],c,s,i);else{let m=gm(l,s,i,t.shape,t.dtype);c.set(m)}return u}function Yse(e,t,n,a,r){let s=0,i=a[0],o=a[1],l=i+r[0];for(let u=i;uy*b),l=C.getReshaped(r.shape,s,o),u=C.getPermuted(l.length,s.length),p=C.getReshapedPermuted(r.shape,s,o),d=C.getSliceBeginCoords(i,s.length),c=C.getSliceSize(p,i,s.length),h=Vn({inputs:{x:r},backend:n,attrs:{shape:l}}),m=ms({inputs:{x:h},backend:n,attrs:{perm:u}}),f=Vn({inputs:{x:m},backend:n,attrs:{shape:p}}),g=xi({inputs:{x:f},backend:n,attrs:{begin:d,size:c}});return n.disposeData(h.dataId),n.disposeData(m.dataId),n.disposeData(h.dataId),g}var tie={kernelName:Jl,backendName:"wasm",kernelFunc:eie};function cp(e){let{inputs:{x:t},attrs:{dtype:n},backend:a}=e,r=a.makeOutput(t.shape,n),s=a.typedArrayFromHeap(t);return a.typedArrayFromHeap(r).set(s),r}var nie={kernelName:Ni,backendName:"wasm",kernelFunc:cp},aie=rn(Ti),HE;function rie(e){HE=e.wasm.cwrap(bs,null,["number","number","number","number"])}function sie(e){let{inputs:t,backend:n,attrs:a}=e,{x:r}=t,{clipValueMin:s,clipValueMax:i}=a,o=n.dataIdMap.get(r.dataId).id,l=n.makeOutput(r.shape,r.dtype),u=n.dataIdMap.get(l.dataId).id;return HE(o,s,i,u),l}var iie={kernelName:bs,backendName:"wasm",setupFunc:rie,kernelFunc:sie};function jE(e){let{inputs:t,backend:n}=e,a=w.parseAxisParam(e.attrs.axis,t[0].shape)[0],r=C.computeOutShape(t.map(h=>h.shape),a),s=t.filter(h=>w.sizeFromShape(h.shape)>0);if(s.length===1)return yg({inputs:{x:s[0]},backend:n});let i=n.makeOutput(r,t[0].dtype);if(w.sizeFromShape(r)===0)return i;let o=s.map(h=>h.shape);if(C.assertParamsConsistent(o,a),s[0].dtype==="string"){let h=s.map(x=>{let v=w.sizeFromShape(x.shape.slice(a));return Vn({inputs:{x},backend:n,attrs:{shape:[-1,v]}})}),m=h.map(x=>({vals:n.readSync(x.dataId),shape:x.shape}));r=C.computeOutShape(h.map(x=>x.shape),1);let f=h[0].shape[0]===1,g=q0(m,r,t[0].dtype,f),y=C.computeOutShape(s.map(x=>x.shape),a);i.shape=y;let b=n.dataIdMap.get(i.dataId);return b.stringBytes=C.fromStringArrayToUint8(g),h.forEach(x=>n.disposeData(x.dataId)),i}let l=w.sizeFromShape(s[0].shape.slice(0,a)),u=0,p=s.map(h=>{let m=w.sizeFromShape(h.shape.slice(a));return u+=m,m}),d=s.map(h=>n.typedArrayFromHeap(h)),c=n.typedArrayFromHeap(i);for(let h=0;h`cumprod does not support ${r.dtype} tensors in the WASM backend`);let u=C.getAxesPermutation([s],l),p=r;u!==null&&(p=ms({inputs:{x:r},attrs:{perm:u},backend:n}));let d=C.getInnerMostAxes(1,l)[0];C.assertAxesAreInnerMostDims("cumprod",[d],l);let c=n.makeOutput(p.shape,p.dtype),h=p.shape[d],m=n.dataIdMap.get(p.dataId).id,f=n.dataIdMap.get(c.dataId).id;YE(m,i?1:0,o?1:0,h,f,$t[r.dtype]);let g=c;if(u!==null){let y=C.getUndoAxesPermutation(u);g=ms({inputs:{x:c},attrs:{perm:y},backend:n}),n.disposeData(p.dataId),n.disposeData(c.dataId)}return g}var wie={kernelName:Ql,backendName:"wasm",setupFunc:xie,kernelFunc:vie},JE;function kie(e){JE=e.wasm.cwrap($i,null,["number","number","number","number","number","number"])}function Iie(e){let{inputs:t,backend:n,attrs:a}=e,{x:r}=t,{axis:s,exclusive:i,reverse:o}=a,l=r.shape.length;w.assert(r.dtype==="float32"||r.dtype==="int32",()=>`cumsum does not support ${r.dtype} tensors in the WASM backend`);let u=C.getAxesPermutation([s],l),p=r;u!==null&&(p=ms({inputs:{x:r},attrs:{perm:u},backend:n}));let d=C.getInnerMostAxes(1,l)[0];C.assertAxesAreInnerMostDims("cumsum",[d],l);let c=n.makeOutput(p.shape,p.dtype),h=p.shape[d],m=n.dataIdMap.get(p.dataId).id,f=n.dataIdMap.get(c.dataId).id;JE(m,i?1:0,o?1:0,h,f,$t[r.dtype]);let g=c;if(u!==null){let y=C.getUndoAxesPermutation(u);g=ms({inputs:{x:c},attrs:{perm:y},backend:n}),n.disposeData(p.dataId),n.disposeData(c.dataId)}return g}var Sie={kernelName:$i,backendName:"wasm",setupFunc:kie,kernelFunc:Iie},ZE;function Nie(e){ZE=e.wasm.cwrap(tu,null,["number","number","number","array","number","array","array","number","number"])}function Tie(e){let{backend:t,inputs:n,attrs:a}=e,{x:r}=n,{blockSize:s,dataFormat:i}=a,o=r.shape[0],l=i==="NHWC"?r.shape[1]:r.shape[2],u=i==="NHWC"?r.shape[2]:r.shape[3],p=i==="NHWC"?r.shape[3]:r.shape[1],d=l*s,c=u*s,h=p/(s*s),m=i==="NHWC"?[o,d,c,h]:[o,h,d,c],f=t.makeOutput(m,"float32"),g=t.dataIdMap.get(r.dataId).id,y=new Uint8Array(new Int32Array(w.computeStrides(r.shape)).buffer),b=new Uint8Array(new Int32Array(m).buffer),x=new Uint8Array(new Int32Array(w.computeStrides(m)).buffer),v=t.dataIdMap.get(f.dataId).id;return ZE(g,s,i==="NHWC"?1:0,y,r.shape.length-1,b,x,m.length,v),f}var Cie={kernelName:tu,backendName:"wasm",setupFunc:Nie,kernelFunc:Tie},QE;function _ie(e){QE=e.wasm.cwrap(Fi,null,["number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number"])}function Eie(e){let{inputs:t,attrs:n,backend:a}=e,{x:r,filter:s}=t,i=a.dataIdMap.get(r.dataId).id,o=a.dataIdMap.get(s.dataId).id,{strides:l,dilations:u,pad:p,dimRoundingMode:d}=n,c=u==null?[1,1]:u,h=C.computeConv2DInfo(r.shape,s.shape,l,c,p,d,!0),m=h.filterHeight,f=h.filterWidth,g=h.padInfo.top,y=h.padInfo.right,b=h.padInfo.bottom,x=h.padInfo.left,v=h.dilationHeight,I=h.dilationWidth,T=h.strideHeight,_=h.strideWidth,A=h.inChannels,F=h.outChannels,P=h.padInfo.type==="SAME"?1:0;if(h.dataFormat!=="channelsLast")throw new Error(`wasm backend DepthwiseConv2dNative does not support dataFormat:'${h.dataFormat}'. Please use 'channelsLast'.`);let $=a.makeOutput(h.outShape,"float32"),S=a.dataIdMap.get($.dataId).id;return QE(i,r.shape[0],r.shape[1],r.shape[2],o,m,f,g,y,b,x,P,v,I,T,_,A,F,S),$}var Aie={kernelName:Fi,backendName:"wasm",setupFunc:_ie,kernelFunc:Eie},$ie=rn(Ri),Fie=!1,Die=dn(au,Fie,"bool"),Rie=rn(Mi,"float32");function Mx(e){let{inputs:t,attrs:n,backend:a}=e,{input:r}=t,{dim:s}=n,i=r.shape.length,o=r.shape.slice(),l=s;return s<0&&(w.assert(-(i+1)<=s,()=>`Axis must be in the interval [${-(i+1)}, ${i}]`),l=i+s+1),o.splice(l,0,1),Vn({inputs:{x:r},backend:a,attrs:{shape:o}})}var Mie={kernelName:ru,backendName:"wasm",kernelFunc:Mx};function eA(e){let{attrs:{shape:t,value:n,dtype:a},backend:r}=e,s=r.makeOutput(t,a);return r.typedArrayFromHeap(s).fill(n),s}var Pie={kernelName:Cc,backendName:"wasm",kernelFunc:eA},tA;function Oie(e){tA=e.wasm.cwrap(iu,null,["number","number","number","number","number","number"])}function Lie(e){let{inputs:t,backend:n}=e,{image:a}=t,r=n.makeOutput(a.shape,a.dtype),s=n.dataIdMap.get(a.dataId).id,i=n.dataIdMap.get(r.dataId).id,[o,l,u,p]=a.shape;return tA(s,o,l,u,p,i),r}var zie={kernelName:iu,backendName:"wasm",kernelFunc:Lie,setupFunc:Oie},Bie=rn(Pi),Wie=!1,Vie=dn(Oi,Wie),nA;function Uie(e){nA=e.wasm.cwrap(Li,null,["number","number","number","number","number","number","number"])}function Gie(e){let{backend:t,inputs:n,attrs:a}=e,{varianceEpsilon:r}=a,{x:s,mean:i,variance:o,offset:l,scale:u}=n,p=t.dataIdMap.get(s.dataId).id,d=t.dataIdMap.get(i.dataId).id,c=t.dataIdMap.get(o.dataId).id,h=l!=null?t.dataIdMap.get(l.dataId).id:0,m=u!=null?t.dataIdMap.get(u.dataId).id:0,f=t.makeOutput(s.shape,s.dtype);if(w.sizeFromShape(s.shape)===0)return f;let g=t.dataIdMap.get(f.dataId).id;return nA(p,d,c,h,m,r,g),f}var Hie={kernelName:Li,backendName:"wasm",setupFunc:Uie,kernelFunc:Gie},aA;function jie(e){aA=e.wasm.cwrap(ii,null,["number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number"])}function qie(e){let{inputs:t,attrs:n,backend:a}=e,{x:r,filter:s,bias:i,preluActivationWeights:o}=t,{strides:l,pad:u,dilations:p,dataFormat:d,dimRoundingMode:c,activation:h,leakyreluAlpha:m}=n,f=C.computeConv2DInfo(r.shape,s.shape,l,p,u,c),g=vc[h];if(g==null)throw new Error(`${h} activation not yet supported for FusedConv2D in the wasm backend.`);let y=a.dataIdMap.get(r.dataId).id,b=a.dataIdMap.get(s.dataId).id,x=f.outChannels,v=0;if(i!=null){let ae=a.dataIdMap.get(i.dataId);if(ae.shape.length!==1)throw new Error(`FusedConv2D only supports rank-1 bias but got rank ${ae.shape.length}.`);if(ae.shape[0]!==x)throw new Error(`FusedConv2D bias shape (${ae.shape}) does not match the number of output channels (${x})`);v=ae.id}let I=f.filterHeight,T=f.filterWidth,_=f.padInfo.top,A=f.padInfo.right,F=f.padInfo.bottom,P=f.padInfo.left,$=f.dilationHeight,S=f.dilationWidth,M=f.strideHeight,U=f.strideWidth,j=f.inChannels,q=f.padInfo.type==="SAME"?1:0,K=f.batchSize,Y=f.inHeight,te=f.inWidth;if(d!=="NHWC")throw new Error(`wasm backend FusedConv2D does not support dataFormat:'${d}'. Please use 'NHWC'.`);let re=a.makeOutput(f.outShape,"float32"),Q=a.dataIdMap.get(re.dataId).id,ie=o==null?0:a.dataIdMap.get(o.dataId).id;return aA(y,K,Y,te,b,I,T,v,_,A,F,P,q,$,S,M,U,j,x,g,ie,m||0,Q),re}var Kie={kernelName:ii,backendName:"wasm",setupFunc:jie,kernelFunc:qie},rA;function Xie(e){rA=e.wasm.cwrap(oi,null,["number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number"])}function Yie(e){let{inputs:t,attrs:n,backend:a}=e,{x:r,filter:s,bias:i,preluActivationWeights:o}=t,{strides:l,pad:u,dilations:p,dataFormat:d,dimRoundingMode:c,activation:h,leakyreluAlpha:m}=n,f=C.computeConv2DInfo(r.shape,s.shape,l,p,u,c,!0),g=vc[h];if(g==null)throw new Error(`${h} activation not yet supported for FusedDepthwiseConv2D in the wasm backend.`);let y=a.dataIdMap.get(r.dataId).id,b=a.dataIdMap.get(s.dataId).id,x=f.outChannels,v=0;if(i!=null){let ae=a.dataIdMap.get(i.dataId);if(ae.shape.length!==1)throw new Error(`FusedDepthwiseConv2D only supports rank-1 bias but got rank ${ae.shape.length}.`);if(ae.shape[0]!==x)throw new Error(`FusedDepthwiseConv2D bias shape (${ae.shape}) does not match the number of output channels (${x})`);v=ae.id}let I=f.filterHeight,T=f.filterWidth,_=f.padInfo.top,A=f.padInfo.right,F=f.padInfo.bottom,P=f.padInfo.left,$=f.dilationHeight,S=f.dilationWidth,M=f.strideHeight,U=f.strideWidth,j=f.inChannels,q=f.padInfo.type==="SAME"?1:0,K=f.batchSize,Y=f.inHeight,te=f.inWidth;if(d!=="NHWC")throw new Error(`wasm backend FusedDepthwiseConv2D does not support dataFormat:'${d}'. Please use 'NHWC'.`);let re=a.makeOutput(f.outShape,"float32"),Q=a.dataIdMap.get(re.dataId).id,ie=o==null?0:a.dataIdMap.get(o.dataId).id;return rA(y,K,Y,te,b,I,T,v,_,A,F,P,q,$,S,M,U,j,x,g,ie,m||0,Q),re}var Jie={kernelName:oi,backendName:"wasm",setupFunc:Xie,kernelFunc:Yie},sA;function Zie(e){sA=e.wasm.cwrap(lu,null,["number","number","number","number","number","number","array","number"])}function Qie(e){let{backend:t,inputs:n}=e,{params:a,indices:r}=n,[s,i,o,l]=nv.prepareAndValidate(a,r),u=t.makeOutput(s,a.dtype);if(i===0)return u;let p=r.shape,d=p[p.length-1],c=t.dataIdMap.get(a.dataId).id,h=t.dataIdMap.get(r.dataId).id,m=new Uint8Array(new Int32Array(l).buffer),f=t.dataIdMap.get(u.dataId).id;return sA(c,$t[a.dtype],h,i,d,o,m,f),u}var eoe={kernelName:lu,backendName:"wasm",setupFunc:Zie,kernelFunc:Qie},iA;function toe(e){iA=e.wasm.cwrap("Gather",null,["number","number","array","number","number","number","array","number"])}function noe(e){let{backend:t,inputs:n,attrs:a}=e,{x:r,indices:s}=n,{axis:i,batchDims:o}=a,l=w.parseAxisParam(i,r.shape)[0],u=t.readSync(s.dataId),p=r.shape[l];for(let _=0;_=0,()=>`GatherV2: the index value ${A} is not in [0, ${p-1}]`)}let d=C.segment_util.collectGatherOpShapeInfo(r,s,l,o),c=Vn({inputs:{x:r},attrs:{shape:[d.batchSize,d.outerSize,d.dimSize,d.sliceSize]},backend:t}),h=w.sizeFromShape(s.shape),m=Vn({inputs:{x:s},attrs:{shape:[d.batchSize,h/d.batchSize]},backend:t}),f=[d.batchSize,d.outerSize,h/d.batchSize,d.sliceSize],g=t.makeOutput(f,r.dtype);if(w.sizeFromShape(r.shape)===0)return g;let y=c.shape.length-1,b=t.dataIdMap.get(c.dataId).id,x=t.dataIdMap.get(m.dataId).id,v=t.dataIdMap.get(g.dataId).id,I=new Uint8Array(new Int32Array(w.computeStrides(c.shape)).buffer),T=new Uint8Array(new Int32Array(w.computeStrides(f)).buffer);return iA(b,$t[r.dtype],I,y,x,d.batchSize,T,v),t.disposeData(c.dataId),t.disposeData(m.dataId),g.shape=d.outputShape,g}var aoe={kernelName:ou,backendName:"wasm",setupFunc:toe,kernelFunc:noe},roe=!1,soe=dn(uu,roe,"bool"),ioe=!1,ooe=dn(zi,ioe,"bool"),oA;function loe(e){oA=e.wasm.cwrap(Wi,null,["number","number","number","number"])}function uoe(e){let{inputs:{x:t},attrs:{alpha:n},backend:a}=e,r=a.dataIdMap.get(t.dataId).id,s=a.makeOutput(t.shape,"float32");if(w.sizeFromShape(t.shape)!==0){let i=a.dataIdMap.get(s.dataId).id;oA(r,$t[t.dtype],n,i)}return s}var poe={kernelName:Wi,backendName:"wasm",setupFunc:loe,kernelFunc:uoe},coe=!1,doe=dn(hu,coe,"bool"),hoe=!1,moe=dn(mu,hoe,"bool"),foe=rn(Vi),goe=!1,yoe=dn(gu,goe,"bool"),boe=rn(yu),xoe=!1,voe=dn(bu,xoe,"bool"),woe=!1,koe=dn(oS,woe,"bool"),lA;function Ioe(e){lA=e.wasm.cwrap(Ui,null,["number","number","number","number"])}function Soe(e){let{backend:t,inputs:n,attrs:a}=e,{reductionIndices:r,keepDims:s}=a,{x:i}=n,o=t.dataIdMap.get(i.dataId).id,l=i,{transposed:u,axes:p,originalAxes:d,inputWasTransposed:c}=$s(i,r,t);if(c){let b=t.dataIdMap.get(u.dataId).id;l=u,o=b}let h=l.shape.length;C.assertAxesAreInnerMostDims("max",p,h);let[m,f]=C.computeOutAndReduceShapes(l.shape,p),g=w.sizeFromShape(f),y=t.makeOutput(m,i.dtype);if(w.sizeFromShape(l.shape)!==0){let b=t.dataIdMap.get(y.dataId).id;lA(o,$t[i.dtype],g,b)}if(c&&t.disposeData(u.dataId),s){let b=C.expandShapeToKeepDim(y.shape,d);y.shape=b}return y}var Noe={kernelName:Ui,backendName:"wasm",setupFunc:Ioe,kernelFunc:Soe},Toe=!1,Coe=dn(Gi,Toe),uA;function _oe(e){uA=e.wasm.cwrap(Hi,null,["number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number"])}function Eoe(e){let{inputs:t,attrs:n,backend:a}=e,r=t.x,s=a.dataIdMap.get(r.dataId).id;w.assert(r.dtype==="float32",()=>`Error in MaxPool: only float32 input is supported. Got ${r.dtype}.`);let{filterSize:i,strides:o,pad:l,dimRoundingMode:u}=n,p=C.computePool2DInfo(r.shape,i,o,1,l,u),d=p.filterHeight,c=p.filterWidth,h=p.padInfo.top,m=p.padInfo.right,f=p.padInfo.bottom,g=p.padInfo.left,y=p.dilationHeight,b=p.dilationWidth,x=p.strideHeight,v=p.strideWidth,I=p.inChannels,T=p.outChannels;if(p.dataFormat!=="channelsLast")throw new Error(`wasm backend does not support dataFormat:'${p.dataFormat}'. Please use 'channelsLast'.`);let _=a.makeOutput(p.outShape,"float32"),A=a.dataIdMap.get(_.dataId).id;return uA(s,r.shape[0],r.shape[1],r.shape[2],d,c,h,m,f,g,y,b,x,v,I,T,A),_}var Aoe={kernelName:Hi,backendName:"wasm",setupFunc:_oe,kernelFunc:Eoe},pA;function $oe(e){pA=e.wasm.cwrap(ji,null,["number, number, number"])}function Foe(e){let{backend:t,inputs:n,attrs:a}=e,{axis:r,keepDims:s}=a,{x:i}=n,o=t.dataIdMap.get(i.dataId).id,l=o,u=i,{transposed:p,axes:d,originalAxes:c,inputWasTransposed:h}=$s(i,r,t),m=d;if(h){let v=t.dataIdMap.get(p.dataId).id;v!==o&&(u=p,l=v,m=C.getInnerMostAxes(m.length,u.shape.length))}C.assertAxesAreInnerMostDims("mean",m,u.shape.length);let[f,g]=C.computeOutAndReduceShapes(u.shape,m),y=w.sizeFromShape(g),b=u;u.dtype!=="float32"&&(b=cp({backend:t,inputs:{x:u},attrs:{dtype:"float32"}}),l=t.dataIdMap.get(b.dataId).id);let x=t.makeOutput(f,"float32");if(w.sizeFromShape(u.shape)!==0){let v=t.dataIdMap.get(x.dataId).id;pA(l,y,v)}if(h&&t.disposeData(p.dataId),s){let v=C.expandShapeToKeepDim(x.shape,c);x.shape=v}return u.dtype!=="float32"&&t.disposeData(b.dataId),x}var Doe={kernelName:ji,backendName:"wasm",setupFunc:$oe,kernelFunc:Foe},cA;function Roe(e){cA=e.wasm.cwrap(qi,null,["number","number","number","number"])}function Moe(e){let{backend:t,inputs:n,attrs:a}=e,{axis:r,keepDims:s}=a,{x:i}=n,o=t.dataIdMap.get(i.dataId).id,l=o,u=i,{transposed:p,axes:d,originalAxes:c,inputWasTransposed:h}=$s(i,r,t);if(h){let x=t.dataIdMap.get(p.dataId).id;x!==o&&(u=p,l=x)}let m=u.shape.length;C.assertAxesAreInnerMostDims("min",d,m);let[f,g]=C.computeOutAndReduceShapes(u.shape,d),y=w.sizeFromShape(g),b=t.makeOutput(f,u.dtype);if(w.sizeFromShape(u.shape)!==0){let x=t.dataIdMap.get(b.dataId).id;cA(l,$t[i.dtype],y,x)}if(h&&t.disposeData(p.dataId),s){let x=C.expandShapeToKeepDim(b.shape,c);b.shape=x}return b}var Poe={kernelName:qi,backendName:"wasm",setupFunc:Roe,kernelFunc:Moe},Ooe=!1,Loe=dn(Ki,Ooe),Px;(function(e){e[e.reflect=0]="reflect",e[e.symmetric=1]="symmetric"})(Px||(Px={}));var dA;function zoe(e){dA=e.wasm.cwrap(Xi,null,["number","array","number","number","array","array","number","number"])}function Boe(e){let{inputs:{x:t},backend:n,attrs:{paddings:a,mode:r}}=e,s=a.map((m,f)=>m[0]+t.shape[f]+m[1]),i=n.dataIdMap.get(t.dataId).id,o=n.makeOutput(s,t.dtype),l=n.dataIdMap.get(o.dataId).id,u=new Uint8Array(new Int32Array(t.shape).buffer),p=a.map(m=>m[0]),d=a.map(m=>m[1]),c=new Uint8Array(new Int32Array(p).buffer),h=new Uint8Array(new Int32Array(d).buffer);return dA(i,u,t.shape.length,$t[t.dtype],c,h,Px[r],l),o}var Woe={kernelName:Xi,backendName:"wasm",kernelFunc:Boe,setupFunc:zoe},Voe=!0,Uoe=dn(Yi,Voe),Goe=rn(vu);function b1(e,t){let n=new Int32Array(e.wasm.HEAPU8.buffer,t,4),a=n[0],r=n[1],s=n[2],i=n[3];return e.wasm._free(t),{pSelectedIndices:a,selectedSize:r,pSelectedScores:s,pValidOutputs:i}}var hA;function Hoe(e){hA=e.wasm.cwrap(ku,"number",["number","number","number","number","number"])}function joe(e){let{backend:t,inputs:n,attrs:a}=e,{iouThreshold:r,maxOutputSize:s,scoreThreshold:i}=a,{boxes:o,scores:l}=n,u=t.dataIdMap.get(o.dataId).id,p=t.dataIdMap.get(l.dataId).id,d=hA(u,p,s,r,i),{pSelectedIndices:c,selectedSize:h,pSelectedScores:m,pValidOutputs:f}=b1(t,d);return t.wasm._free(m),t.wasm._free(f),t.makeOutput([h],"int32",c)}var qoe={kernelName:ku,backendName:"wasm",setupFunc:Hoe,kernelFunc:joe},mA;function Koe(e){mA=e.wasm.cwrap(Iu,"number",["number","number","number","number","number","bool"])}function Xoe(e){let{backend:t,inputs:n,attrs:a}=e,{iouThreshold:r,maxOutputSize:s,scoreThreshold:i,padToMaxOutputSize:o}=a,{boxes:l,scores:u}=n,p=t.dataIdMap.get(l.dataId).id,d=t.dataIdMap.get(u.dataId).id,c=mA(p,d,s,r,i,o),{pSelectedIndices:h,selectedSize:m,pSelectedScores:f,pValidOutputs:g}=b1(t,c);t.wasm._free(f);let y=t.makeOutput([m],"int32",h),b=t.makeOutput([],"int32",g);return[y,b]}var Yoe={kernelName:Iu,backendName:"wasm",setupFunc:Koe,kernelFunc:Xoe},fA;function Joe(e){fA=e.wasm.cwrap(Su,"number",["number","number","number","number","number","number"])}function Zoe(e){let{backend:t,inputs:n,attrs:a}=e,{iouThreshold:r,maxOutputSize:s,scoreThreshold:i,softNmsSigma:o}=a,{boxes:l,scores:u}=n,p=t.dataIdMap.get(l.dataId).id,d=t.dataIdMap.get(u.dataId).id,c=fA(p,d,s,r,i,o),{pSelectedIndices:h,selectedSize:m,pSelectedScores:f,pValidOutputs:g}=b1(t,c);t.wasm._free(g);let y=t.makeOutput([m],"int32",h),b=t.makeOutput([m],"float32",f);return[y,b]}var Qoe={kernelName:Su,backendName:"wasm",setupFunc:Joe,kernelFunc:Zoe},ele=!1,tle=dn(wu,ele,"bool"),gA;function nle(e){gA=e.wasm.cwrap(Ji,null,["number","number","number","number","number"])}function ale(e){let{inputs:t,backend:n,attrs:a}=e,{indices:r}=t,{depth:s,onValue:i,offValue:o}=a,l=n.makeOutput([...r.shape,s],"int32"),u=n.dataIdMap.get(l.dataId).id,p=n.dataIdMap.get(r.dataId).id;return gA(p,s,i,o,u),l}var rle={kernelName:Ji,backendName:"wasm",setupFunc:nle,kernelFunc:ale};function sle(e){let{inputs:{x:t},backend:n}=e,a=n.makeOutput(t.shape,t.dtype);return n.typedArrayFromHeap(a).fill(1),a}var ile={kernelName:Nu,backendName:"wasm",kernelFunc:sle};function ole(e){let{inputs:t,backend:n,attrs:a}=e,{axis:r}=a;if(t.length===1)return Mx({inputs:{input:t[0]},backend:n,attrs:{dim:r}});let s=t[0].shape,i=t[0].dtype;t.forEach(p=>{w.assertShapesMatch(s,p.shape,"All tensors passed to stack must have matching shapes"),w.assert(i===p.dtype,()=>"All tensors passed to stack must have matching dtypes")});let o=[],l=t.map(p=>{let d=Mx({inputs:{input:p},backend:n,attrs:{dim:r}});return o.push(d),d}),u=jE({inputs:l,backend:n,attrs:{axis:r}});return o.forEach(p=>n.disposeData(p.dataId)),u}var lle={kernelName:Tu,backendName:"wasm",kernelFunc:ole},yA;function ule(e){yA=e.wasm.cwrap(Zi,null,["number","array","number","number","array","array","number","number"])}function ple(e){let{inputs:{x:t},backend:n,attrs:{paddings:a,constantValue:r}}=e,s=a.map((m,f)=>m[0]+t.shape[f]+m[1]);if(w.sizeFromShape(t.shape)===0)return eA({backend:n,attrs:{shape:s,value:r,dtype:t.dtype}});let i=n.dataIdMap.get(t.dataId).id,o=n.makeOutput(s,t.dtype),l=n.dataIdMap.get(o.dataId).id,u=new Uint8Array(new Int32Array(t.shape).buffer),p=a.map(m=>m[0]),d=a.map(m=>m[1]),c=new Uint8Array(new Int32Array(p).buffer),h=new Uint8Array(new Int32Array(d).buffer);return yA(i,u,t.shape.length,$t[t.dtype],c,h,r,l),o}var bA={kernelName:Zi,backendName:"wasm",kernelFunc:ple,setupFunc:ule},cle=!1,dle=dn(Qi,cle),xA;function hle(e){xA=e.wasm.cwrap(eo,null,["number","number","number"])}function mle(e){let{inputs:t,backend:n}=e,{x:a,alpha:r}=t,s=n.dataIdMap.get(a.dataId).id,i=n.dataIdMap.get(r.dataId).id,o=s,l=a,u=l;l.dtype!=="float32"&&(u=cp({backend:n,inputs:{x:a},attrs:{dtype:"float32"}}),o=n.dataIdMap.get(u.dataId).id);let p=n.makeOutput(a.shape,"float32"),d=n.dataIdMap.get(p.dataId).id;return xA(o,i,d),l.dtype!=="float32"&&n.disposeData(u.dataId),p}var fle={kernelName:eo,backendName:"wasm",setupFunc:hle,kernelFunc:mle},vA;function gle(e){vA=e.wasm.cwrap(to,null,["number","number","number","number"])}function yle(e){let{backend:t,inputs:n,attrs:a}=e,{axis:r,keepDims:s}=a,{x:i}=n,o=t.dataIdMap.get(i.dataId).id,l=o,u=i,{transposed:p,axes:d,originalAxes:c,inputWasTransposed:h}=$s(i,r,t),m=d;if(h){let x=t.dataIdMap.get(p.dataId).id;x!==o&&(u=p,l=x,m=C.getInnerMostAxes(m.length,u.shape.length))}C.assertAxesAreInnerMostDims("prod",m,u.shape.length);let[f,g]=C.computeOutAndReduceShapes(u.shape,m),y=w.sizeFromShape(g),b=t.makeOutput(f,u.dtype);if(w.sizeFromShape(u.shape)!==0){let x=t.dataIdMap.get(b.dataId).id;vA(l,y,$t[b.dtype],x)}if(h&&t.disposeData(p.dataId),s){let x=C.expandShapeToKeepDim(b.shape,c);b.shape=x}return b}var ble={kernelName:to,backendName:"wasm",setupFunc:gle,kernelFunc:yle},xle=e=>{let{backend:t,attrs:n}=e,{start:a,stop:r,step:s,dtype:i}=n,o=Y0(a,r,s,i),l=t.makeOutput([o.length],i);return t.typedArrayFromHeap(l).set(o),l},vle={kernelName:Ac,backendName:"wasm",kernelFunc:xle},wle=!0,kle=dn(Di,wle),Ile=rn(no),Sle=rn(so),wA;function Nle(e){wA=e.wasm.cwrap(ro,null,["number","number","number","number","number","number","number","number","number","number"])}function Tle(e){let{backend:t,inputs:n,attrs:a}=e,{images:r}=n,{alignCorners:s,halfPixelCenters:i,size:o}=a,[l,u]=o,[p,d,c,h]=r.shape,m=[p,l,u,h],f=t.dataIdMap.get(r.dataId),g;f.dtype!=="float32"&&(g=cp({backend:t,inputs:{x:r},attrs:{dtype:"float32"}}),f=t.dataIdMap.get(g.dataId));let y=f.id,b=t.makeOutput(m,"float32");if(w.sizeFromShape(r.shape)===0)return b;let x=t.dataIdMap.get(b.dataId).id;return wA(y,p,d,c,h,l,u,s?1:0,i?1:0,x),g!=null&&t.disposeData(g.dataId),b}var Cle={kernelName:ro,backendName:"wasm",setupFunc:Nle,kernelFunc:Tle},kA;function _le(e){kA=e.wasm.cwrap(ao,null,["number","number","number","number","number","number","number","number","number","number"])}function Ele(e){let{backend:t,inputs:n,attrs:a}=e,{images:r}=n,{alignCorners:s,halfPixelCenters:i,size:o}=a,[l,u]=o,[p,d,c,h]=r.shape,m=[p,l,u,h],f=t.makeOutput(m,"float32");if(w.sizeFromShape(r.shape)===0)return f;let g=t.dataIdMap.get(r.dataId),y;g.dtype!=="float32"&&(y=cp({backend:t,inputs:{x:r},attrs:{dtype:"float32"}}),g=t.dataIdMap.get(y.dataId));let b=g.id,x=t.dataIdMap.get(f.dataId).id;return kA(b,p,d,c,h,l,u,s?1:0,i?1:0,x),y!=null&&t.disposeData(y.dataId),f}var Ale={kernelName:ao,backendName:"wasm",setupFunc:_le,kernelFunc:Ele},IA;function $le(e){IA=e.wasm.cwrap(io,null,["number","array","number","array","number","number"])}function Fle(e){let{inputs:t,backend:n,attrs:a}=e,{x:r}=t,{dims:s}=a,i=w.parseAxisParam(s,r.shape);if(r.shape.length===0)return yg({inputs:{x:r},backend:n});let o=n.makeOutput(r.shape,r.dtype),l=n.dataIdMap.get(r.dataId).id,u=n.dataIdMap.get(o.dataId).id,p=new Uint8Array(new Int32Array(i).buffer),d=new Uint8Array(new Int32Array(r.shape).buffer);IA(l,p,i.length,d,r.shape.length,u);let c=Vn({inputs:{x:o},attrs:{shape:r.shape},backend:n});return n.disposeData(o.dataId),c}var Dle={kernelName:io,backendName:"wasm",kernelFunc:Fle,setupFunc:$le},SA;function Rle(e){SA=e.wasm.cwrap(Gu,null,["number","number","number","number","number","number","number","number","array","number","number"])}function Mle(e){let{inputs:t,backend:n,attrs:a}=e,{image:r}=t,{radians:s,fillValue:i,center:o}=a,l=n.makeOutput(r.shape,r.dtype),u=n.dataIdMap.get(r.dataId).id,p=n.dataIdMap.get(l.dataId).id,[d,c,h,m]=r.shape,[f,g]=C.getImageCenter(o,c,h),y=i===0,b=255,x=typeof i=="number"?[i,i,i,y?0:b]:[...i,b],v=new Uint8Array(new Int32Array(x).buffer);return SA(u,d,c,h,m,s,f,g,v,x.length,p),l}var Ple={kernelName:Gu,backendName:"wasm",kernelFunc:Mle,setupFunc:Rle},Ole=rn(oo),Lle=rn(lo),NA;function zle(e){NA=e.wasm.cwrap(Eu,null,["number","number","number","number","number","number","array","number","number"])}function Ble(e){let{backend:t,inputs:n,attrs:a}=e,{indices:r,updates:s}=n,{shape:i}=a,o=t.makeOutput(i,s.dtype);if(w.sizeFromShape(i)===0)return o;let{sliceRank:l,numUpdates:u,sliceSize:p,strides:d,outputSize:c}=av.calculateShapes(s,r,i),h=t.dataIdMap.get(r.dataId).id,m=t.dataIdMap.get(s.dataId).id,f=new Uint8Array(new Int32Array(d).buffer),g=t.dataIdMap.get(o.dataId).id;return NA(h,m,$t[s.dtype],l,u,p,f,c,g),o}var Wle={kernelName:Eu,backendName:"wasm",setupFunc:zle,kernelFunc:Ble},TA;function Vle(e){TA=e.wasm.cwrap("SelectV2",null,["number","number","number","number","number"])}function Ule(e){let{inputs:t,backend:n}=e,{condition:a,t:r,e:s}=t,i=n.dataIdMap.get(a.dataId).id,o=n.dataIdMap.get(r.dataId).id,l=n.dataIdMap.get(s.dataId).id,u=n.makeOutput(r.shape,r.dtype),p=n.dataIdMap.get(u.dataId).id,d=a.shape.length,c=r.shape.length,h=d===0||d>1||c===1?1:w.sizeFromShape(r.shape.slice(1));return TA(i,o,l,h,p),u}var Gle={kernelName:Au,backendName:"wasm",kernelFunc:Ule,setupFunc:Vle},CA;function Hle(e){CA=e.wasm.cwrap(po,null,["number","number"])}function jle(e){let{backend:t,inputs:{x:n}}=e,a=t.dataIdMap.get(n.dataId).id,r=t.makeOutput(n.shape,n.dtype),s=t.dataIdMap.get(r.dataId).id;return w.sizeFromShape(r.shape)===0||CA(a,s),r}var qle={kernelName:"Sigmoid",backendName:"wasm",setupFunc:Hle,kernelFunc:jle},Kle=rn(uo),_A;function Xle(e){_A=e.wasm.cwrap(mo,null,["number","number","number","number"])}function Yle(e){let{backend:t,inputs:{logits:n},attrs:{dim:a}}=e,r=t.dataIdMap.get(n.dataId).id,s=t.makeOutput(n.shape,n.dtype),i=t.dataIdMap.get(s.dataId).id,o=n.shape[a],l=w.sizeFromShape(n.shape)/o;return w.sizeFromShape(s.shape)===0||_A(r,i,o,l),s}var Jle={kernelName:mo,backendName:"wasm",setupFunc:Xle,kernelFunc:Yle};function Zle(e){let{inputs:t,backend:n,attrs:a}=e,{x:r}=t,{blockShape:s,paddings:i}=a,o=w.sizeFromShape(s),l=[[0,0]];l.push(...i);for(let g=1+s.length;g0?l+1:0;if(u<0)throw new Error(C.getSparseSegmentReductionNegativeSegmentIdsErrorMessage());let p=r.shape.slice();p[0]=u;let d=n.dataIdMap.get(r.dataId).id,c=n.dataIdMap.get(s.dataId).id,h=n.dataIdMap.get(i.dataId).id,m=n.makeOutput(p,r.dtype),f=n.dataIdMap.get(m.dataId).id,g=n.makeOutput([4],"int32"),y=n.dataIdMap.get(g.dataId).id;$A(d,$t[r.dtype],r.shape[0],c,h,f,y,t,0);let b=n.readSync(g.dataId),x;switch(b[0]){case 0:{x=C.getSparseSegmentReductionNegativeSegmentIdsErrorMessage();break}case 1:{x=C.getSparseSegmentReductionNonIncreasingSegmentIdsErrorMessage();break}case 2:x=C.getSparseSegmentReductionSegmentIdOutOfRangeErrorMessage(b[1],b[2]);break;case 3:x=C.getSparseSegmentReductionIndicesOutOfRangeErrorMessage(b[1],b[2],b[3]);break;default:x=""}if(n.disposeData(g.dataId),x)throw n.disposeData(m.dataId),new Error(x);return m}function iue(e){return DA(e,!0)}var oue={kernelName:Fc,backendName:"wasm",setupFunc:FA,kernelFunc:iue};function lue(e){return DA(e,!1)}var uue={kernelName:Dc,backendName:"wasm",setupFunc:FA,kernelFunc:lue};function pue(e){let{inputs:t,attrs:n,backend:a}=e,{x:r}=t,{numOrSizeSplits:s,axis:i}=n,o=w.parseAxisParam(i,r.shape)[0],l=C.prepareSplitSize(r,s,o),u=new Array(r.shape.length).fill(0),p=r.shape.slice();return l.map(d=>{let c=[...p];c[o]=d;let h=xi({inputs:{x:r},attrs:{begin:u,size:c},backend:a});return u[o]+=d,h})}var cue={kernelName:Ou,backendName:"wasm",kernelFunc:pue},due=rn(co),hue=rn(Rc),mue=!0,fue=dn(fo,mue),RA;function gue(e){RA=e.wasm.cwrap(vs,null,["number","number","number","number"])}function yue(e){let{backend:t,inputs:n,attrs:a}=e,{alpha:r}=a,{x:s}=n,i=t.dataIdMap.get(s.dataId).id,o=t.makeOutput(s.shape,s.dtype),l=t.dataIdMap.get(o.dataId).id;return RA(i,r,$t[s.dtype],l),o}var bue={kernelName:vs,backendName:"wasm",setupFunc:gue,kernelFunc:yue},MA;function xue(e){MA=e.wasm.cwrap(zu,null,["number","array","number","array","array","array","array","array","number","number"])}function vue(e){let{backend:t,inputs:n,attrs:a}=e,{x:r}=n,{begin:s,end:i,strides:o,beginMask:l,endMask:u,ellipsisMask:p,newAxisMask:d,shrinkAxisMask:c}=a,{finalShapeSparse:h,finalShape:m,isIdentity:f,sliceDim0:g,isSimpleSlice:y,begin:b,end:x,strides:v}=qt.sliceInfo(r.shape,s,i,o,l,u,p,d,c),I;if(f)I=Vn({inputs:{x:r},backend:t,attrs:{shape:m}});else if(g||y){w.assert(r.shape.length>=1,()=>`Input must have rank at least 1, got: ${r.shape.length}`);let T=qt.computeOutShape(b,x,v),_=xi({inputs:{x:r},backend:t,attrs:{begin:b,size:T}});I=Vn({inputs:{x:_},backend:t,attrs:{shape:m}}),t.disposeData(_.dataId)}else{let T=t.makeOutput(h,"float32"),_=t.dataIdMap.get(r.dataId).id,A=new Uint8Array(new Int32Array(w.computeStrides(r.shape)).buffer),F=new Uint8Array(new Int32Array(b).buffer),P=new Uint8Array(new Int32Array(x).buffer),$=new Uint8Array(new Int32Array(v).buffer),S=new Uint8Array(new Int32Array(h).buffer),M=new Uint8Array(new Int32Array(w.computeStrides(h)).buffer),U=t.dataIdMap.get(T.dataId).id;MA(_,A,r.shape.length,F,P,$,S,M,h.length,U),I=Vn({inputs:{x:T},backend:t,attrs:{shape:m}}),t.disposeData(T.dataId)}return I}var wue={kernelName:zu,backendName:"wasm",setupFunc:xue,kernelFunc:vue};function kue(e){let{backend:t,inputs:n,attrs:a}=e,{data:r,dataSplits:s}=n,{separator:i,nGramWidths:o,leftPad:l,rightPad:u,padWidth:p,preserveShortSequences:d}=a,c=t.readSync(r.dataId),h=t.readSync(s.dataId),[m,f]=Z0(c,h,i,o,l,u,p,d),g=t.makeOutput([m.length],"string"),y=t.dataIdMap.get(g.dataId);y.stringBytes=m;let b=t.makeOutput(s.shape,"int32");return t.typedArrayFromHeap(b).set(f),[g,b]}var Iue={kernelName:Mc,backendName:"wasm",kernelFunc:kue};function Sue(e){let{backend:t,inputs:n,attrs:a}=e,{input:r,delimiter:s}=n,{skipEmpty:i}=a,o=t.readSync(r.dataId),l=t.readSync(s.dataId),[u,p,d]=Q0(o,l[0],i),c=p.length,h=t.makeOutput([c,2],"int32");t.typedArrayFromHeap(h).set(u);let m=t.makeOutput([c],"string"),f=t.dataIdMap.get(m.dataId);f.stringBytes=p;let g=t.makeOutput([2],"int32");return t.typedArrayFromHeap(g).set(d),[h,m,g]}var Nue={kernelName:Pc,backendName:"wasm",kernelFunc:Sue};function Tue(e){let{backend:t,inputs:n,attrs:a}=e,{input:r}=n,{numBuckets:s}=a,i=t.readSync(r.dataId),o=e1(i,s),l=t.makeOutput(r.shape,"int32");return t.typedArrayFromHeap(l).set(o),l}var Cue={kernelName:Oc,backendName:"wasm",kernelFunc:Tue},_ue=!0,Eue=dn(go,_ue),PA;function Aue(e){PA=e.wasm.cwrap(ho,null,["number","number","number","number"])}function $ue(e){let{backend:t,inputs:n,attrs:a}=e,{axis:r,keepDims:s}=a,{x:i}=n,o=t.dataIdMap.get(i.dataId).id,l=o,u=i,{transposed:p,axes:d,originalAxes:c,inputWasTransposed:h}=$s(i,r,t),m=d;if(h){let x=t.dataIdMap.get(p.dataId).id;x!==o&&(u=p,l=x,m=C.getInnerMostAxes(m.length,u.shape.length))}C.assertAxesAreInnerMostDims("sum",m,u.shape.length);let[f,g]=C.computeOutAndReduceShapes(u.shape,m),y=w.sizeFromShape(g),b=t.makeOutput(f,u.dtype);if(w.sizeFromShape(u.shape)!==0){let x=t.dataIdMap.get(b.dataId).id;PA(l,y,$t[b.dtype],x)}if(h&&t.disposeData(p.dataId),s){let x=C.expandShapeToKeepDim(b.shape,c);b.shape=x}return b}var Fue={kernelName:ho,backendName:"wasm",setupFunc:Aue,kernelFunc:$ue},Due=rn(yo),Rue=rn(bo),OA;function Mue(e){OA=e.wasm.cwrap(xs,null,["number","array","number","array","number","number"])}function Pue(e){let{inputs:t,backend:n,attrs:a}=e,{x:r}=t,s=n.dataIdMap.get(r.dataId).id,{reps:i}=a,o=new Array(r.shape.length);for(let c=0;c{let{x:a}=e,{k:r,sorted:s}=n,i=t.dataIdMap.get(a.dataId).id,o=new Uint8Array(new Int32Array(a.shape).buffer),l=a.shape.slice();l[l.length-1]=r;let u=t.makeOutput(l,a.dtype),p=t.dataIdMap.get(u.dataId).id,d=t.makeOutput(l,"int32"),c=t.dataIdMap.get(d.dataId).id;return LA(i,o,a.shape.length,$t[a.dtype],r,s,p,c),[u,d]},Bue={kernelName:Bu,backendName:"wasm",setupFunc:Lue,kernelFunc:zue},zA;function Wue(e){zA=e.wasm.cwrap(Wu,null,["number","number","bool","number","number","number","number","number","number","array","number","number","number","number","number"])}function Vue(e){let{backend:t,inputs:n,attrs:a}=e,{image:r,transforms:s}=n,{interpolation:i,fillMode:o,fillValue:l,outputShape:u}=a,[p,d,c,h]=r.shape,[m,f]=u!=null?u:[d,c],g=[p,m,f,h],y=new Uint8Array(new Int32Array(w.computeStrides(r.shape)).buffer),b=t.makeOutput(g,r.dtype),x=t.dataIdMap.get(b.dataId).id,v=t.dataIdMap.get(r.dataId).id,I=t.dataIdMap.get(s.dataId).id,T=i==="nearest"?1:2,_;switch(o){case"constant":_=1;break;case"reflect":_=2;break;case"wrap":_=3;break;case"nearest":_=4;break;default:_=1;break}return zA(v,I,s.shape[0]>1,p,m,f,h,c,d,y,r.shape.length-1,T,_,l,x),b}var Uue={kernelName:Wu,backendName:"wasm",setupFunc:Wue,kernelFunc:Vue};function Gue(e){let{inputs:t,backend:n,attrs:a}=e,{value:r}=t,{axis:s}=a;s<0&&(s+=r.shape.length);let i=r.shape[s],o=r.shape.length,l=new Array(o-1),u=0;for(let h=0;h({dataId:h,dtype:m,shape:l}))}var Hue={kernelName:Vu,backendName:"wasm",kernelFunc:Gue};function jue(e){let{inputs:{x:t},backend:n}=e,a=n.makeOutput(t.shape,t.dtype);return n.typedArrayFromHeap(a).fill(0),a}var que={kernelName:Uu,backendName:"wasm",kernelFunc:jue},Kue=[kse,Ise,Nse,_se,Pse,zse,Vse,Hse,Xse,tie,nie,aie,iie,oie,pie,hie,mie,fie,bie,wie,Sie,Cie,Aie,$ie,Die,Rie,Mie,Pie,zie,Bie,Vie,Hie,Kie,Jie,eoe,aoe,soe,ooe,Ese,poe,doe,moe,foe,yoe,boe,voe,koe,Noe,Coe,Aoe,Doe,Poe,Loe,Woe,Uoe,Goe,qoe,Yoe,Qoe,tle,rle,ile,lle,bA,dle,fle,ble,vle,kle,Ile,Sle,jse,Cle,Ale,Dle,Ple,Ole,Lle,Wle,Gle,qle,Kle,Qse,Jle,Qle,nue,sue,oue,uue,cue,due,hue,fue,bue,wue,Iue,Nue,Cue,Eue,Fue,Due,Rue,Oue,Bue,Uue,Dse,Hue,que];for(let e of Kue)zc(e);var Ox=X();Ox.registerFlag("WASM_HAS_SIMD_SUPPORT",async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,9,1,7,0,65,0,253,15,26,11])));Ox.registerFlag("WASM_HAS_MULTITHREAD_SUPPORT",async()=>{if(Ox.get("IS_NODE"))return!1;try{return new MessageChannel().port1.postMessage(new SharedArrayBuffer(1)),WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,5,4,1,3,1,1,10,11,1,9,0,65,0,254,16,2,0,26,11]))}catch(e){return!1}});var UI=fs(qF()),Xue=fs(KF()),GI=fs(XF()),HI=UI.default||UI,Yue=GI.default||GI,BA=class extends wc{constructor(e){super(),this.wasm=e,this.dataIdNextNumber=1,this.wasm.tfjs.initWithThreadsCount(WA),Lx=this.wasm.tfjs.getThreadsCount(),this.dataIdMap=new Nm(this,sr())}write(e,t,n){let a={id:this.dataIdNextNumber++};return this.move(a,e,t,n,1),a}numDataIds(){return this.dataIdMap.numDataIds()}async time(e){let t=w.now();return e(),{kernelMs:w.now()-t}}move(e,t,n,a,r){let s=this.dataIdNextNumber++;if(a==="string"){let u=t;this.dataIdMap.set(e,{id:s,stringBytes:u,shape:n,dtype:a,memoryOffset:null,refCount:r});return}let i=w.sizeFromShape(n),o=i*w.bytesPerElement(a),l=this.wasm._malloc(o);this.dataIdMap.set(e,{id:s,memoryOffset:l,shape:n,dtype:a,refCount:r}),this.wasm.tfjs.registerTensor(s,i,l),t!=null&&this.wasm.HEAPU8.set(new Uint8Array(t.buffer,t.byteOffset,o),l)}async read(e){return this.readSync(e)}readSync(e,t,n){let{memoryOffset:a,dtype:r,shape:s,stringBytes:i}=this.dataIdMap.get(e);if(r==="string")return(t==null||t===0)&&(n==null||n>=i.length)?i:i.slice(t,n);t=t||0,n=n||w.sizeFromShape(s);let o=w.bytesPerElement(r),l=this.wasm.HEAPU8.slice(a+t*o,a+n*o);return Que(l.buffer,r)}disposeData(e,t=!1){if(this.dataIdMap.has(e)){let n=this.dataIdMap.get(e);if(n.refCount--,!t&&n.refCount>0)return!1;this.wasm._free(n.memoryOffset),this.wasm.tfjs.disposeData(n.id),this.dataIdMap.delete(e)}return!0}refCount(e){return this.dataIdMap.has(e)?this.dataIdMap.get(e).refCount:0}incRef(e){let t=this.dataIdMap.get(e);t!=null&&t.refCount++}floatPrecision(){return 32}getMemoryOffset(e){return this.dataIdMap.get(e).memoryOffset}dispose(){this.wasm.tfjs.dispose(),"PThread"in this.wasm&&this.wasm.PThread.terminateAllThreads(),this.wasm=null}memory(){return{unreliable:!1}}makeOutput(e,t,n){let a;if(n==null)a=this.write(null,e,t);else{let r=this.dataIdNextNumber++;a={id:r},this.dataIdMap.set(a,{id:r,memoryOffset:n,shape:e,dtype:t,refCount:1});let s=w.sizeFromShape(e);this.wasm.tfjs.registerTensor(r,s,n)}return{dataId:a,shape:e,dtype:t}}typedArrayFromHeap({shape:e,dtype:t,dataId:n}){let a=this.wasm.HEAPU8.buffer,{memoryOffset:r}=this.dataIdMap.get(n),s=w.sizeFromShape(e);switch(t){case"float32":return new Float32Array(a,r,s);case"int32":return new Int32Array(a,r,s);case"bool":return new Uint8Array(a,r,s);default:throw new Error(`Unknown dtype ${t}`)}}};function Jue(e){return(t,n)=>(w.fetch(e,{credentials:"same-origin"}).then(a=>{a.ok||t.env.a(`failed to load wasm binary file at '${e}'`),a.arrayBuffer().then(r=>{WebAssembly.instantiate(r,t).then(s=>{n(s.instance,s.module)})})}),{})}function jI(e,t,n){if(Im!=null)return Im;let a="tfjs-backend-wasm.wasm";return e&&t?a="tfjs-backend-wasm-threaded-simd.wasm":e&&(a="tfjs-backend-wasm-simd.wasm"),ac!=null&&ac[a]!=null?ac[a]:n+a}async function Zue(){let[e,t]=await Promise.all([X().getAsync("WASM_HAS_SIMD_SUPPORT"),X().getAsync("WASM_HAS_MULTITHREAD_SUPPORT")]);return new Promise((n,a)=>{let r={};r.locateFile=(o,l)=>{if(o.endsWith(".worker.js")){let u=Xue.wasmWorkerContents.replace(/\n/g,"\\n"),p=new Blob([u],{type:"application/javascript"});return URL.createObjectURL(p)}return o.endsWith(".wasm")?jI(e,t,ec!=null?ec:l):l+o},x1&&(r.instantiateWasm=Jue(jI(e,t,ec!=null?ec:"")));let s=!1;r.onAbort=()=>{s||rc||(rc=!0,a({message:"Make sure the server can serve the `.wasm` file relative to the bundled js file. For more details see https://github.com/tensorflow/tfjs/blob/master/tfjs-backend-wasm/README.md#using-bundlers"}))};let i;t&&e&&Im==null?(r.mainScriptUrlOrBlob=new Blob(["var WasmBackendModuleThreadedSimd = "+HI.toString()],{type:"text/javascript"}),i=HI(r)):i=Yue(r),i.then(o=>{s=!0,rc=!1;let l=null;o.tfjs={init:o.cwrap("init",null,[]),initWithThreadsCount:o.cwrap("init_with_threads_count",null,["number"]),getThreadsCount:o.cwrap("get_threads_count","number",[]),registerTensor:o.cwrap("register_tensor",null,["number","number","number"]),disposeData:o.cwrap("dispose_data",l,["number"]),dispose:o.cwrap("dispose",l,[])},n({wasm:o})}).catch(a)})}function Que(e,t){switch(t){case"float32":return new Float32Array(e);case"int32":return new Int32Array(e);case"bool":return new Uint8Array(e);default:throw new Error(`Unknown dtype ${t}`)}}var epe=["tfjs-backend-wasm.wasm","tfjs-backend-wasm-simd.wasm","tfjs-backend-wasm-threaded-simd.wasm"],Im=null,ec=null,ac={},rc=!1,x1=!1;function tpe(e,t=!1){if(tv("setWasmPath has been deprecated in favor of setWasmPaths and will be removed in a future release."),rc)throw new Error("The WASM backend was already initialized. Make sure you call `setWasmPath()` before you call `tf.setBackend()` or `tf.ready()`");Im=e,x1=t}function npe(e,t=!1){if(rc)throw new Error("The WASM backend was already initialized. Make sure you call `setWasmPaths()` before you call `tf.setBackend()` or `tf.ready()`");if(typeof e=="string")ec=e;else{ac=e;let n=epe.filter(a=>ac[a]==null);if(n.length>0)throw new Error(`There were no entries found for the following binaries: ${n.join(",")}. Please either call setWasmPaths with a map providing a path for each binary, or with a string indicating the directory where all the binaries can be found.`)}x1=t}var WA=-1,Lx=-1;function ape(e){WA=e}function rpe(){if(Lx===-1)throw new Error("WASM backend not initialized.");return Lx}var spe="3.19.0",ipe=2;sf("wasm",async()=>{let{wasm:e}=await Zue();return new BA(e)},ipe);var ope="3.19.0",lpe="3.19.0",upe="3.19.0",ppe="3.19.0",cpe="3.19.0",dpe="3.19.0",hpe="3.19.0",mpe="3.19.0",fpe={tfjs:ope,"tfjs-core":lpe,"tfjs-data":upe,"tfjs-layers":ppe,"tfjs-converter":cpe,"tfjs-backend-cpu":dpe,"tfjs-backend-webgl":hpe,"tfjs-backend-wasm":mpe};var G1={};Ih(G1,{AnchorPosition:()=>M1,DrawBox:()=>Sd,DrawBoxOptions:()=>wg,DrawFaceLandmarks:()=>Fg,DrawFaceLandmarksOptions:()=>$g,DrawTextField:()=>zr,DrawTextFieldOptions:()=>fp,drawContour:()=>Pr,drawDetections:()=>Spe,drawFaceExpressions:()=>Epe,drawFaceLandmarks:()=>$pe});function Pr(e,t,n=!1){if(e.beginPath(),t.slice(1).forEach(({x:a,y:r},s)=>{let i=t[s];e.moveTo(i.x,i.y),e.lineTo(a,r)}),n){let a=t[t.length-1],r=t[0];if(!a||!r)return;e.moveTo(a.x,a.y),e.lineTo(r.x,r.y)}e.stroke()}var I1={};Ih(I1,{computeReshapedDimensions:()=>k1,getCenterPoint:()=>$o,isDimensions:()=>xg,isEven:()=>bg,isFloat:()=>w1,isTensor:()=>Eo,isTensor1D:()=>gpe,isTensor2D:()=>v1,isTensor3D:()=>Or,isTensor4D:()=>xa,isValidNumber:()=>er,isValidProbablitiy:()=>dp,range:()=>br,round:()=>Ao});var yn=class{constructor(t,n){if(!er(t)||!er(n))throw new Error(`Dimensions.constructor - expected width and height to be valid numbers, instead have ${JSON.stringify({width:t,height:n})}`);this._width=t,this._height=n}get width(){return this._width}get height(){return this._height}reverse(){return new yn(1/this.width,1/this.height)}};function Eo(e,t){return e instanceof Ae&&e.shape.length===t}function gpe(e){return Eo(e,1)}function v1(e){return Eo(e,2)}function Or(e){return Eo(e,3)}function xa(e){return Eo(e,4)}function w1(e){return e%1!==0}function bg(e){return e%2===0}function Ao(e,t=2){let n=10**t;return Math.floor(e*n)/n}function xg(e){return e&&e.width&&e.height}function k1({width:e,height:t},n){let a=n/Math.max(t,e);return new yn(Math.round(e*a),Math.round(t*a))}function $o(e){return e.reduce((t,n)=>t.add(n),new Pe(0,0)).div(new Pe(e.length,e.length))}function br(e,t,n){return Array(e).fill(0).map((a,r)=>t+r*n)}function er(e){return!!e&&e!==1/0&&e!==-1/0&&!Number.isNaN(e)||e===0}function dp(e){return er(e)&&e>=0&&e<=1}var Pe=class{constructor(t,n){this._x=t,this._y=n}get x(){return this._x}get y(){return this._y}add(t){return new Pe(this.x+t.x,this.y+t.y)}sub(t){return new Pe(this.x-t.x,this.y-t.y)}mul(t){return new Pe(this.x*t.x,this.y*t.y)}div(t){return new Pe(this.x/t.x,this.y/t.y)}abs(){return new Pe(Math.abs(this.x),Math.abs(this.y))}magnitude(){return Math.sqrt(this.x**2+this.y**2)}floor(){return new Pe(Math.floor(this.x),Math.floor(this.y))}};var lt=class{static isRect(t){return!!t&&[t.x,t.y,t.width,t.height].every(er)}static assertIsValidBox(t,n,a=!1){if(!lt.isRect(t))throw new Error(`${n} - invalid box: ${JSON.stringify(t)}, expected object with properties x, y, width, height`);if(!a&&(t.width<0||t.height<0))throw new Error(`${n} - width (${t.width}) and height (${t.height}) must be positive numbers`)}constructor(t,n=!0){let a=t||{},r=[a.left,a.top,a.right,a.bottom].every(er),s=[a.x,a.y,a.width,a.height].every(er);if(!s&&!r)throw new Error(`Box.constructor - expected box to be IBoundingBox | IRect, instead have ${JSON.stringify(a)}`);let[i,o,l,u]=s?[a.x,a.y,a.width,a.height]:[a.left,a.top,a.right-a.left,a.bottom-a.top];lt.assertIsValidBox({x:i,y:o,width:l,height:u},"Box.constructor",n),this._x=i,this._y=o,this._width=l,this._height=u}get x(){return this._x}get y(){return this._y}get width(){return this._width}get height(){return this._height}get left(){return this.x}get top(){return this.y}get right(){return this.x+this.width}get bottom(){return this.y+this.height}get area(){return this.width*this.height}get topLeft(){return new Pe(this.left,this.top)}get topRight(){return new Pe(this.right,this.top)}get bottomLeft(){return new Pe(this.left,this.bottom)}get bottomRight(){return new Pe(this.right,this.bottom)}round(){let[t,n,a,r]=[this.x,this.y,this.width,this.height].map(s=>Math.round(s));return new lt({x:t,y:n,width:a,height:r})}floor(){let[t,n,a,r]=[this.x,this.y,this.width,this.height].map(s=>Math.floor(s));return new lt({x:t,y:n,width:a,height:r})}toSquare(){let{x:t,y:n,width:a,height:r}=this,s=Math.abs(a-r);return an&&(o=-d+n+a,d=n),c>t&&(l=-c+t+r,c=t),u<1&&(l=2-u,u=1),p<1&&(l=2-p,p=1),{dy:i,edy:l,dx:s,edx:o,y:p,ey:c,x:u,ex:d,w:a,h:r}}calibrate(t){return new lt({left:this.left+t.left*this.width,top:this.top+t.top*this.height,right:this.right+t.right*this.width,bottom:this.bottom+t.bottom*this.height}).toSquare().round()}};var Fo=class extends lt{constructor(t,n,a,r,s=!1){super({left:t,top:n,right:a,bottom:r},s)}};var Lr=class{constructor(t,n,a,r,s){this._imageDims=new yn(s.width,s.height),this._score=t,this._classScore=n,this._className=a,this._box=new lt(r).rescale(this._imageDims)}get score(){return this._score}get classScore(){return this._classScore}get className(){return this._className}get box(){return this._box}get imageDims(){return this._imageDims}get imageWidth(){return this.imageDims.width}get imageHeight(){return this.imageDims.height}get relativeBox(){return new lt(this._box).rescale(this.imageDims.reverse())}forSize(t,n){return new Lr(this.score,this.classScore,this.className,this.relativeBox,{width:t,height:n})}};var xt=class extends Lr{constructor(t,n,a){super(t,t,"",n,a)}forSize(t,n){let{score:a,relativeBox:r,imageDims:s}=super.forSize(t,n);return new xt(a,r,s)}};function S1(e,t,n=!0){let a=Math.max(0,Math.min(e.right,t.right)-Math.max(e.left,t.left)),r=Math.max(0,Math.min(e.bottom,t.bottom)-Math.max(e.top,t.top)),s=a*r;return n?s/(e.area+t.area-s):s/Math.min(e.area,t.area)}function N1(e){let t=e.map(o=>o.x),n=e.map(o=>o.y),a=t.reduce((o,l)=>lloo({score:i,boxIndex:o})).sort((i,o)=>i.score-o.score).map(i=>i.boxIndex),s=[];for(;r.length>0;){let i=r.pop();s.push(i);let o=r,l=[];for(let u=0;ul[p]<=n)}return s}function tr(e,t){return O(()=>{let[n,a,r]=t,s=An([...e.shape.slice(0,3),1],n,"float32"),i=An([...e.shape.slice(0,3),1],a,"float32"),o=An([...e.shape.slice(0,3),1],r,"float32"),l=Qe([s,i,o],3);return ce(e,l)})}function C1(e,t=!1){return O(()=>{let[n,a]=e.shape.slice(1);if(n===a)return e;let r=Math.abs(n-a),s=Math.round(r*(t?.5:1)),i=n>a?2:1,o=c=>{let h=e.shape.slice();return h[i]=c,An(h,0,"float32")},l=o(s),u=r-l.shape[i],d=[t&&u?o(u):null,e,l].filter(c=>!!c).map(c=>le(c,"float32"));return Qe(d,i)})}function ype(e){let t=e.slice();for(let n=t.length-1;n>0;n--){let a=Math.floor(Math.random()*(n+1)),r=t[n];t[n]=t[a],t[a]=r}return t}function kd(e){return 1/(1+Math.exp(-e))}function bpe(e){return Math.log(e/(1-e))}var Do=class extends lt{constructor(t,n,a,r,s=!1){super({x:t,y:n,width:a,height:r},s)}};var xpe=.5,vpe=.43,wpe=.45,ra=class{constructor(t,n,a=new Pe(0,0)){let{width:r,height:s}=n;this._imgDims=new yn(r,s),this._shift=a,this._positions=t.map(i=>i.mul(new Pe(r,s)).add(a))}get shift(){return new Pe(this._shift.x,this._shift.y)}get imageWidth(){return this._imgDims.width}get imageHeight(){return this._imgDims.height}get positions(){return this._positions}get relativePositions(){return this._positions.map(t=>t.sub(this._shift).div(new Pe(this.imageWidth,this.imageHeight)))}forSize(t,n){return new this.constructor(this.relativePositions,{width:t,height:n})}shiftBy(t,n){return new this.constructor(this.relativePositions,this._imgDims,new Pe(t,n))}shiftByPoint(t){return this.shiftBy(t.x,t.y)}align(t,n={}){if(t){let s=t instanceof xt?t.box.floor():new lt(t);return this.shiftBy(s.x,s.y).align(null,n)}let{useDlibAlignment:a,minBoxPadding:r}={useDlibAlignment:!1,minBoxPadding:.2,...n};return a?this.alignDlib():this.alignMinBbox(r)}alignDlib(){let t=this.getRefPointsForAlignment(),[n,a,r]=t,s=d=>r.sub(d).magnitude(),i=(s(n)+s(a))/2,o=Math.floor(i/wpe),l=$o(t),u=Math.floor(Math.max(0,l.x-xpe*o)),p=Math.floor(Math.max(0,l.y-vpe*o));return new Do(u,p,Math.min(o,this.imageWidth+u),Math.min(o,this.imageHeight+p))}alignMinBbox(t){let n=N1(this.positions);return n.pad(n.width*t,n.height*t)}getRefPointsForAlignment(){throw new Error("getRefPointsForAlignment not implemented by base class")}};var _1=class extends ra{getRefPointsForAlignment(){let t=this.positions;return[t[0],t[1],$o([t[3],t[4]])]}};var Ro=class extends ra{getJawOutline(){return this.positions.slice(0,17)}getLeftEyeBrow(){return this.positions.slice(17,22)}getRightEyeBrow(){return this.positions.slice(22,27)}getNose(){return this.positions.slice(27,36)}getLeftEye(){return this.positions.slice(36,42)}getRightEye(){return this.positions.slice(42,48)}getMouth(){return this.positions.slice(48,68)}getRefPointsForAlignment(){return[this.getLeftEye(),this.getRightEye(),this.getMouth()].map($o)}};var hp=class{constructor(t,n){this._label=t,this._distance=n}get label(){return this._label}get distance(){return this._distance}toString(t=!0){return`${this.label}${t?` (${Ao(this.distance)})`:""}`}};var mp=class extends lt{constructor(n,a){super(n);this._label=a}static assertIsValidLabeledBox(n,a){if(lt.assertIsValidBox(n,a),!er(n.label))throw new Error(`${a} - expected property label (${n.label}) to be a number`)}get label(){return this._label}};var xr=class{constructor(t,n){if(typeof t!="string")throw new Error("LabeledFaceDescriptors - constructor expected label to be a string");if(!Array.isArray(n)||n.some(a=>!(a instanceof Float32Array)))throw new Error("LabeledFaceDescriptors - constructor expected descriptors to be an array of Float32Array");this._label=t,this._descriptors=n}get label(){return this._label}get descriptors(){return this._descriptors}toJSON(){return{label:this.label,descriptors:this.descriptors.map(t=>Array.from(t))}}static fromJSON(t){let n=t.descriptors.map(a=>new Float32Array(a));return new xr(t.label,n)}};var E1=class extends mp{constructor(n,a,r,s){super(n,a);this._score=r,this._classScore=s}static assertIsValidPredictedBox(n,a){if(mp.assertIsValidLabeledBox(n,a),!dp(n.score)||!dp(n.classScore))throw new Error(`${a} - expected properties score (${n.score}) and (${n.classScore}) to be a number between [0, 1]`)}get score(){return this._score}get classScore(){return this._classScore}};function vr(e){return e.detection instanceof xt}function Mo(e,t){return{...e,...{detection:t}}}function A1(){let e=window.fetch;if(!e)throw new Error("fetch - missing fetch implementation for browser environment");return{Canvas:HTMLCanvasElement,CanvasRenderingContext2D,Image:HTMLImageElement,ImageData,Video:HTMLVideoElement,createCanvasElement:()=>document.createElement("canvas"),createImageElement:()=>document.createElement("img"),createVideoElement:()=>document.createElement("video"),fetch:e,readFile:()=>{throw new Error("readFile - filesystem not available for browser environment")}}}function Id(){return typeof global=="object"&&typeof process!="undefined"&&process.versions!=null&&process.versions.node!=null}function vg(e){let t="";if(!e&&Id())try{e=SF("fs")}catch(a){t=a.toString()}return{readFile:e?a=>new Promise((r,s)=>{e.readFile(a,(i,o)=>i?s(i):r(o))}):()=>{throw new Error(`readFile - failed to require fs in nodejs environment with error: ${t}`)}}}function $1(){let e=global.Canvas||global.HTMLCanvasElement,t=global.Image||global.HTMLImageElement,n=global.Video||global.HTMLVideoElement,a=()=>{if(e)return new e;throw new Error("createCanvasElement - missing Canvas implementation for nodejs environment")},r=()=>{if(t)return new t;throw new Error("createImageElement - missing Image implementation for nodejs environment")},s=()=>{if(n)return new n;throw new Error("createVideoElement - missing Video implementation for nodejs environment")},i=global.fetch,o=vg();return{Canvas:e||class{},CanvasRenderingContext2D:global.CanvasRenderingContext2D||class{},Image:t||class{},ImageData:global.ImageData||class{},Video:global.HTMLVideoElement||class{},createCanvasElement:a,createImageElement:r,createVideoElement:s,fetch:i,...o}}function F1(){return typeof window=="object"&&typeof document!="undefined"&&typeof HTMLImageElement!="undefined"&&typeof HTMLCanvasElement!="undefined"&&typeof HTMLVideoElement!="undefined"&&typeof ImageData!="undefined"&&typeof CanvasRenderingContext2D!="undefined"}var sn;function kpe(){if(!sn)throw new Error("getEnv - environment is not defined, check isNodejs() and isBrowser()");return sn}function D1(e){sn=e}function R1(){return F1()?D1(A1()):Id()?D1($1()):null}function Ipe(e){if(sn||R1(),!sn)throw new Error("monkeyPatch - environment is not defined, check isNodejs() and isBrowser()");let{Canvas:t=sn.Canvas,Image:n=sn.Image}=e;sn.Canvas=t,sn.Image=n,sn.createCanvasElement=e.createCanvasElement||(()=>new t),sn.createImageElement=e.createImageElement||(()=>new n),sn.ImageData=e.ImageData||sn.ImageData,sn.Video=e.Video||sn.Video,sn.fetch=e.fetch||sn.fetch,sn.readFile=e.readFile||sn.readFile}var et={getEnv:kpe,setEnv:D1,initialize:R1,createBrowserEnv:A1,createFileSystem:vg,createNodejsEnv:$1,monkeyPatch:Ipe,isBrowser:F1,isNodejs:Id};R1();function Po(e){return!et.isNodejs()&&typeof e=="string"?document.getElementById(e):e}function Kn(e){let{Canvas:t,CanvasRenderingContext2D:n}=et.getEnv();if(e instanceof n)return e;let a=Po(e);if(!(a instanceof t))throw new Error("resolveContext2d - expected canvas to be of instance of Canvas");let r=a.getContext("2d");if(!r)throw new Error("resolveContext2d - canvas 2d context is null");return r}var M1=(r=>(r.TOP_LEFT="TOP_LEFT",r.TOP_RIGHT="TOP_RIGHT",r.BOTTOM_LEFT="BOTTOM_LEFT",r.BOTTOM_RIGHT="BOTTOM_RIGHT",r))(M1||{}),fp=class{constructor(t={}){let{anchorPosition:n,backgroundColor:a,fontColor:r,fontSize:s,fontStyle:i,padding:o}=t;this.anchorPosition=n||"TOP_LEFT",this.backgroundColor=a||"rgba(0, 0, 0, 0.5)",this.fontColor=r||"rgba(255, 255, 255, 1)",this.fontSize=s||14,this.fontStyle=i||"Georgia",this.padding=o||4}},zr=class{constructor(t,n,a={}){this.text=typeof t=="string"?[t]:t instanceof zr?t.text:t,this.anchor=n,this.options=new fp(a)}measureWidth(t){let{padding:n}=this.options;return this.text.map(a=>t.measureText(a).width).reduce((a,r)=>a{let m=l+d.x,f=l+d.y+(h+1)*i;a.fillText(c,m,f)})}};var wg=class{constructor(t={}){let{boxColor:n,lineWidth:a,label:r,drawLabelOptions:s}=t;this.boxColor=n||"rgba(0, 0, 255, 1)",this.lineWidth=a||2,this.label=r;let i={anchorPosition:"BOTTOM_LEFT",backgroundColor:this.boxColor};this.drawLabelOptions=new fp({...i,...s})}},Sd=class{constructor(t,n={}){this.box=new lt(t),this.options=new wg(n)}draw(t){let n=Kn(t),{boxColor:a,lineWidth:r}=this.options,{x:s,y:i,width:o,height:l}=this.box;n.strokeStyle=a,n.lineWidth=r,n.strokeRect(s,i,o,l);let{label:u}=this.options;u&&new zr([u],{x:s-r/2,y:i},this.options.drawLabelOptions).draw(t)}};function Spe(e,t){(Array.isArray(t)?t:[t]).forEach(a=>{let r=a instanceof xt?a.score:vr(a)?a.detection.score:void 0,s=a instanceof xt?a.box:vr(a)?a.detection.box:new lt(a),i=r?`${Ao(r)}`:void 0;new Sd(s,{label:i}).draw(e)})}function Nd(e){let{Image:t,Video:n}=et.getEnv();return e instanceof t&&e.complete||e instanceof n&&e.readyState>=3}function P1(e){return new Promise((t,n)=>{(e instanceof et.getEnv().Canvas||Nd(e))&&t(null);function a(s){!s.currentTarget||(s.currentTarget.removeEventListener("load",r),s.currentTarget.removeEventListener("error",a),n(s))}function r(s){!s.currentTarget||(s.currentTarget.removeEventListener("load",r),s.currentTarget.removeEventListener("error",a),t(s))}e.addEventListener("load",r),e.addEventListener("error",a)})}function O1(e){return new Promise((t,n)=>{e instanceof Blob||n(new Error("bufferToImage - expected buf to be of type: Blob"));let a=new FileReader;a.onload=()=>{typeof a.result!="string"&&n(new Error("bufferToImage - expected reader.result to be a string, in onload"));let r=et.getEnv().createImageElement();r.onload=()=>t(r),r.onerror=n,r.src=a.result},a.onerror=n,a.readAsDataURL(e)})}function Oo(e){let{Image:t,Video:n}=et.getEnv();return e instanceof t?new yn(e.naturalWidth,e.naturalHeight):e instanceof n?new yn(e.videoWidth,e.videoHeight):new yn(e.width,e.height)}function Lo({width:e,height:t}){let{createCanvasElement:n}=et.getEnv(),a=n();return a.width=e,a.height=t,a}function Td(e,t){let{ImageData:n}=et.getEnv();if(!(e instanceof n)&&!Nd(e))throw new Error("createCanvasFromMedia - media has not finished loading yet");let{width:a,height:r}=t||Oo(e),s=Lo({width:a,height:r});return e instanceof n?Kn(s).putImageData(e,0,0):Kn(s).drawImage(e,0,0,a,r),s}async function L1(e,t){let n=t||et.getEnv().createCanvasElement(),[a,r,s]=e.shape.slice(xa(e)?1:0),i=O(()=>e.as3D(a,r,s).toInt());return await xo.toPixels(i,n),i.dispose(),n}function kg(e){let{Image:t,Canvas:n,Video:a}=et.getEnv();return e instanceof t||e instanceof n||e instanceof a}function z1(e,t,n=!1){let{Image:a,Canvas:r}=et.getEnv();if(!(e instanceof a||e instanceof r))throw new Error("imageToSquare - expected arg0 to be HTMLImageElement | HTMLCanvasElement");if(t<=0)return Lo({width:1,height:1});let s=Oo(e),i=t/Math.max(s.height,s.width),o=i*s.width,l=i*s.height,u=Lo({width:t,height:t}),p=e instanceof r?e:Td(e),d=Math.abs(o-l)/2,c=n&&o0&&p.height>0&&Kn(u).drawImage(p,c,h,o,l),u}var wr=class{constructor(t,n=!1){this._imageTensors=[];this._canvases=[];this._treatAsBatchInput=!1;this._inputDimensions=[];this._inputSize=0;if(!Array.isArray(t))throw new Error(`NetInput.constructor - expected inputs to be an Array of TResolvedNetInput or to be instanceof tf.Tensor4D, instead have ${t}`);this._treatAsBatchInput=n,this._batchSize=t.length,t.forEach((a,r)=>{if(Or(a)){this._imageTensors[r]=a,this._inputDimensions[r]=a.shape;return}if(xa(a)){let i=a.shape[0];if(i!==1)throw new Error(`NetInput - tf.Tensor4D with batchSize ${i} passed, but not supported in input array`);this._imageTensors[r]=a,this._inputDimensions[r]=a.shape.slice(1);return}let s=a instanceof et.getEnv().Canvas?a:Td(a);this._canvases[r]=s,this._inputDimensions[r]=[s.height,s.width,3]})}get imageTensors(){return this._imageTensors}get canvases(){return this._canvases}get isBatchInput(){return this.batchSize>1||this._treatAsBatchInput}get batchSize(){return this._batchSize}get inputDimensions(){return this._inputDimensions}get inputSize(){return this._inputSize}get reshapedInputDimensions(){return br(this.batchSize,0,1).map((t,n)=>this.getReshapedInputDimensions(n))}getInput(t){return this.canvases[t]||this.imageTensors[t]}getInputDimensions(t){return this._inputDimensions[t]}getInputHeight(t){return this._inputDimensions[t][0]}getInputWidth(t){return this._inputDimensions[t][1]}getReshapedInputDimensions(t){if(typeof this.inputSize!="number")throw new Error("getReshapedInputDimensions - inputSize not set, toBatchTensor has not been called yet");let n=this.getInputWidth(t),a=this.getInputHeight(t);return k1({width:n,height:a},this.inputSize)}toBatchTensor(t,n=!0){return this._inputSize=t,O(()=>{let a=br(this.batchSize,0,1).map(s=>{let i=this.getInput(s);if(i instanceof Ae){let o=xa(i)?i:mn(i);return o=C1(o,n),(o.shape[1]!==t||o.shape[2]!==t)&&(o=Cr.resizeBilinear(o,[t,t],!1,!1)),o.as3D(t,t,3)}if(i instanceof et.getEnv().Canvas)return xo.fromPixels(z1(i,t,n));throw new Error(`toBatchTensor - at batchIdx ${s}, expected input to be instanceof tf.Tensor or instanceof HTMLCanvasElement, instead have ${i}`)});return Rt(a.map(s=>le(s,"float32"))).as4D(this.batchSize,t,t,3)})}};async function vt(e){if(e instanceof wr)return e;let t=Array.isArray(e)?e:[e];if(!t.length)throw new Error("toNetInput - empty array passed as input");let n=r=>Array.isArray(e)?` at input index ${r}:`:"",a=t.map(Po);return a.forEach((r,s)=>{if(!kg(r)&&!Or(r)&&!xa(r))throw typeof t[s]=="string"?new Error(`toNetInput -${n(s)} string passed, but could not resolve HTMLElement for element id ${t[s]}`):new Error(`toNetInput -${n(s)} expected media to be of type HTMLImageElement | HTMLVideoElement | HTMLCanvasElement | tf.Tensor3D, or to be an element id`);if(xa(r)){let i=r.shape[0];if(i!==1)throw new Error(`toNetInput -${n(s)} tf.Tensor4D with batchSize ${i} passed, but not supported in input array`)}}),await Promise.all(a.map(r=>kg(r)&&P1(r))),new wr(a,Array.isArray(e))}async function gp(e,t){let{Canvas:n}=et.getEnv(),a=e;if(!(e instanceof n)){let i=await vt(e);if(i.batchSize>1)throw new Error("extractFaces - batchSize > 1 not supported");let o=i.getInput(0);a=o instanceof n?o:await L1(o)}let r=Kn(a);return t.map(i=>i instanceof xt?i.forSize(a.width,a.height).box.floor():i).map(i=>i.clipAtImageBorders(a.width,a.height)).map(({x:i,y:o,width:l,height:u})=>{let p=Lo({width:l,height:u});return l>0&&u>0&&Kn(p).putImageData(r.getImageData(i,o,l,u),0,0),p})}async function yp(e,t){if(!Or(e)&&!xa(e))throw new Error("extractFaceTensors - expected image tensor to be 3D or 4D");if(xa(e)&&e.shape[0]>1)throw new Error("extractFaceTensors - batchSize > 1 not supported");return O(()=>{let[n,a,r]=e.shape.slice(xa(e)?1:0);return t.map(o=>o instanceof xt?o.forSize(a,n).box:o).map(o=>o.clipAtImageBorders(a,n)).filter(o=>o.width>0&&o.height>0).map(({x:o,y:l,width:u,height:p})=>wo(e.as3D(n,a,r),[l,o,0],[p,u,r]))})}async function Br(e,t){let{fetch:n}=et.getEnv(),a=await n(e,t);if(!(a.status<400))throw new Error(`failed to fetch: (${a.status}) ${a.statusText}, from url: ${a.url}`);return a}async function Npe(e){let t=await Br(e),n=await t.blob();if(!n.type.startsWith("image/"))throw new Error(`fetchImage - expected blob type to be of type image/*, instead have: ${n.type}, for url: ${t.url}`);return O1(n)}async function B1(e){return(await Br(e)).json()}async function Tpe(e){return new Float32Array(await(await Br(e)).arrayBuffer())}function VA(e){return new Promise((t,n)=>{e instanceof Blob||n(new Error("bufferToVideo - expected buf to be of type: Blob"));let a=et.getEnv().createVideoElement();a.oncanplay=()=>t(a),a.onerror=n,a.playsInline=!0,a.muted=!0,a.src=URL.createObjectURL(e),a.play()})}async function Cpe(e){let t=await Br(e),n=await t.blob();if(!n.type.startsWith("video/"))throw new Error(`fetchVideo - expected blob type to be of type video/*, instead have: ${n.type}, for url: ${t.url}`);return VA(n)}function Ig(e,t){let n=`${t}-weights_manifest.json`;if(!e)return{modelBaseUri:"",manifestUri:n};if(e==="/")return{modelBaseUri:"/",manifestUri:`/${n}`};let a=e.startsWith("http://")?"http://":e.startsWith("https://")?"https://":"";e=e.replace(a,"");let r=e.split("/").filter(o=>o),s=e.endsWith(".json")?r[r.length-1]:n,i=a+(e.endsWith(".json")?r.slice(0,r.length-1):r).join("/");return i=e.startsWith("/")?`/${i}`:i,{modelBaseUri:i,manifestUri:i==="/"?`/${s}`:`${i}/${s}`}}async function W1(e,t){let{manifestUri:n,modelBaseUri:a}=Ig(e,t),r=await B1(n);return Tn.loadWeights(r,a)}function _pe(e,t,n=!1){let{width:a,height:r}=n?Oo(t):t;return e.width=a,e.height=r,{width:a,height:r}}var on=class{constructor(t){this._params=void 0;this._paramMappings=[];this._name=t}get params(){return this._params}get paramMappings(){return this._paramMappings}get isLoaded(){return!!this.params}getParamFromPath(t){let{obj:n,objProp:a}=this.traversePropertyPath(t);return n[a]}reassignParamFromPath(t,n){let{obj:a,objProp:r}=this.traversePropertyPath(t);a[r].dispose(),a[r]=n}getParamList(){return this._paramMappings.map(({paramPath:t})=>({path:t,tensor:this.getParamFromPath(t)}))}getTrainableParams(){return this.getParamList().filter(t=>t.tensor instanceof os)}getFrozenParams(){return this.getParamList().filter(t=>!(t.tensor instanceof os))}variable(){this.getFrozenParams().forEach(({path:t,tensor:n})=>{this.reassignParamFromPath(t,n.variable())})}freeze(){this.getTrainableParams().forEach(({path:t,tensor:n})=>{let a=Bn(n.dataSync());n.dispose(),this.reassignParamFromPath(t,a)})}dispose(t=!0){this.getParamList().forEach(n=>{if(t&&n.tensor.isDisposed)throw new Error(`param tensor has already been disposed for path ${n.path}`);n.tensor.dispose()}),this._params=void 0}serializeParams(){return new Float32Array(this.getParamList().map(({tensor:t})=>Array.from(t.dataSync())).reduce((t,n)=>t.concat(n)))}async load(t){if(t instanceof Float32Array){this.extractWeights(t);return}await this.loadFromUri(t)}async loadFromUri(t){if(t&&typeof t!="string")throw new Error(`${this._name}.loadFromUri - expected model uri`);let n=await W1(t,this.getDefaultModelName());this.loadFromWeightMap(n)}async loadFromDisk(t){if(t&&typeof t!="string")throw new Error(`${this._name}.loadFromDisk - expected model file path`);let{readFile:n}=et.getEnv(),{manifestUri:a,modelBaseUri:r}=Ig(t,this.getDefaultModelName()),s=u=>Promise.all(u.map(p=>n(p).then(d=>d.buffer))),i=Tn.weightsLoaderFactory(s),o=JSON.parse((await n(a)).toString()),l=await i(o,r);this.loadFromWeightMap(l)}loadFromWeightMap(t){let{paramMappings:n,params:a}=this.extractParamsFromWeightMap(t);this._paramMappings=n,this._params=a}extractWeights(t){let{paramMappings:n,params:a}=this.extractParams(t);this._paramMappings=n,this._params=a}traversePropertyPath(t){if(!this.params)throw new Error("traversePropertyPath - model has no loaded params");let n=t.split("/").reduce((s,i)=>{if(!s.nextObj.hasOwnProperty(i))throw new Error(`traversePropertyPath - object does not have property ${i}, for path ${t}`);return{obj:s.nextObj,objProp:i,nextObj:s.nextObj[i]}},{nextObj:this.params}),{obj:a,objProp:r}=n;if(!a||!r||!(a[r]instanceof Ae))throw new Error(`traversePropertyPath - parameter is not a tensor, for path ${t}`);return{obj:a,objProp:r}}};function Xn(e,t,n){return O(()=>{let a=Cs(e,t.depthwise_filter,t.pointwise_filter,n,"same");return a=Z(a,t.bias),a})}function Sg(e,t,n=!1){return O(()=>{let a=Xe(n?Z(Dt(e,t.conv0.filters,[2,2],"same"),t.conv0.bias):Xn(e,t.conv0,[2,2])),r=Xn(a,t.conv1,[1,1]),s=Xe(Z(a,r)),i=Xn(s,t.conv2,[1,1]);return Xe(Z(a,Z(r,i)))})}function Cd(e,t,n=!1,a=!0){return O(()=>{let r=Xe(n?Z(Dt(e,t.conv0.filters,a?[2,2]:[1,1],"same"),t.conv0.bias):Xn(e,t.conv0,a?[2,2]:[1,1])),s=Xn(r,t.conv1,[1,1]),i=Xe(Z(r,s)),o=Xn(i,t.conv2,[1,1]),l=Xe(Z(r,Z(s,o))),u=Xn(l,t.conv3,[1,1]);return Xe(Z(r,Z(s,Z(o,u))))})}function zo(e,t,n="same",a=!1){return O(()=>{let r=Z(Dt(e,t.filters,[1,1],n),t.bias);return a?Xe(r):r})}function Fn(e,t){Object.keys(e).forEach(n=>{t.some(a=>a.originalPath===n)||e[n].dispose()})}function bp(e,t){return(n,a,r,s)=>{let i=$a(e(n*a*r*r),[r,r,n,a]),o=Ke(e(a));return t.push({paramPath:`${s}/filters`},{paramPath:`${s}/bias`}),{filters:i,bias:o}}}function Ng(e,t){return(n,a,r)=>{let s=Ca(e(n*a),[n,a]),i=Ke(e(a));return t.push({paramPath:`${r}/weights`},{paramPath:`${r}/bias`}),{weights:s,bias:i}}}var _d=class{constructor(t,n,a){this.depthwise_filter=t;this.pointwise_filter=n;this.bias=a}};function xp(e,t){return(n,a,r)=>{let s=$a(e(9*n),[3,3,n,1]),i=$a(e(n*a),[1,1,n,a]),o=Ke(e(a));return t.push({paramPath:`${r}/depthwise_filter`},{paramPath:`${r}/pointwise_filter`},{paramPath:`${r}/bias`}),new _d(s,i,o)}}function vp(e){return t=>{let n=e(`${t}/depthwise_filter`,4),a=e(`${t}/pointwise_filter`,4),r=e(`${t}/bias`,1);return new _d(n,a,r)}}function sa(e,t){return(n,a,r)=>{let s=e[n];if(!Eo(s,a))throw new Error(`expected weightMap[${n}] to be a Tensor${a}D, instead have ${s}`);return t.push({originalPath:n,paramPath:r||n}),s}}function Dn(e){let t=e;function n(r){let s=t.slice(0,r);return t=t.slice(r),s}function a(){return t}return{extractWeights:n,getRemainingWeights:a}}function Tg(e,t){let n=bp(e,t),a=xp(e,t);function r(i,o,l,u=!1){let p=u?n(i,o,3,`${l}/conv0`):a(i,o,`${l}/conv0`),d=a(o,o,`${l}/conv1`),c=a(o,o,`${l}/conv2`);return{conv0:p,conv1:d,conv2:c}}function s(i,o,l,u=!1){let{conv0:p,conv1:d,conv2:c}=r(i,o,l,u),h=a(o,o,`${l}/conv3`);return{conv0:p,conv1:d,conv2:c,conv3:h}}return{extractDenseBlock3Params:r,extractDenseBlock4Params:s}}function UA(e){let t=[],{extractWeights:n,getRemainingWeights:a}=Dn(e),{extractDenseBlock4Params:r}=Tg(n,t),s=r(3,32,"dense0",!0),i=r(32,64,"dense1"),o=r(64,128,"dense2"),l=r(128,256,"dense3");if(a().length!==0)throw new Error(`weights remaing after extract: ${a().length}`);return{paramMappings:t,params:{dense0:s,dense1:i,dense2:o,dense3:l}}}function Cg(e){return t=>{let n=e(`${t}/filters`,4),a=e(`${t}/bias`,1);return{filters:n,bias:a}}}function _g(e,t){let n=sa(e,t),a=Cg(n),r=vp(n);function s(o,l=!1){let u=l?a(`${o}/conv0`):r(`${o}/conv0`),p=r(`${o}/conv1`),d=r(`${o}/conv2`);return{conv0:u,conv1:p,conv2:d}}function i(o,l=!1){let u=l?a(`${o}/conv0`):r(`${o}/conv0`),p=r(`${o}/conv1`),d=r(`${o}/conv2`),c=r(`${o}/conv3`);return{conv0:u,conv1:p,conv2:d,conv3:c}}return{extractDenseBlock3Params:s,extractDenseBlock4Params:i}}function GA(e){let t=[],{extractDenseBlock4Params:n}=_g(e,t),a={dense0:n("dense0",!0),dense1:n("dense1"),dense2:n("dense2"),dense3:n("dense3")};return Fn(e,t),{params:a,paramMappings:t}}var wp=class extends on{constructor(){super("FaceFeatureExtractor")}forwardInput(t){let{params:n}=this;if(!n)throw new Error("FaceFeatureExtractor - load model before inference");return O(()=>{let a=le(t.toBatchTensor(112,!0),"float32"),s=tr(a,[122.782,117.001,104.298]).div(255),i=Cd(s,n.dense0,!0);return i=Cd(i,n.dense1),i=Cd(i,n.dense2),i=Cd(i,n.dense3),i=ga(i,[7,7],[2,2],"valid"),i})}async forward(t){return this.forwardInput(await vt(t))}getDefaultModelName(){return"face_feature_extractor_model"}extractParamsFromWeightMap(t){return GA(t)}extractParams(t){return UA(t)}};function Ed(e,t){return O(()=>Z(Re(e,t.weights),t.bias))}function HA(e,t,n){let a=[],{extractWeights:r,getRemainingWeights:s}=Dn(e),o=Ng(r,a)(t,n,"fc");if(s().length!==0)throw new Error(`weights remaing after extract: ${s().length}`);return{paramMappings:a,params:{fc:o}}}function jA(e){let t=[],n=sa(e,t);function a(s){let i=n(`${s}/weights`,2),o=n(`${s}/bias`,1);return{weights:i,bias:o}}let r={fc:a("fc")};return Fn(e,t),{params:r,paramMappings:t}}function Eg(e){let t={},n={};return Object.keys(e).forEach(a=>{let r=a.startsWith("fc")?n:t;r[a]=e[a]}),{featureExtractorMap:t,classifierMap:n}}var kp=class extends on{constructor(n,a){super(n);this._faceFeatureExtractor=a}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(n){let{params:a}=this;if(!a)throw new Error(`${this._name} - load model before inference`);return O(()=>{let r=n instanceof wr?this.faceFeatureExtractor.forwardInput(n):n;return Ed(r.as2D(r.shape[0],-1),a.fc)})}dispose(n=!0){this.faceFeatureExtractor.dispose(n),super.dispose(n)}loadClassifierParams(n){let{params:a,paramMappings:r}=this.extractClassifierParams(n);this._params=a,this._paramMappings=r}extractClassifierParams(n){return HA(n,this.getClassifierChannelsIn(),this.getClassifierChannelsOut())}extractParamsFromWeightMap(n){let{featureExtractorMap:a,classifierMap:r}=Eg(n);return this.faceFeatureExtractor.loadFromWeightMap(a),jA(r)}extractParams(n){let a=this.getClassifierChannelsIn(),r=this.getClassifierChannelsOut(),s=r*a+r,i=n.slice(0,n.length-s),o=n.slice(n.length-s);return this.faceFeatureExtractor.extractWeights(i),this.extractClassifierParams(o)}};var V1=["neutral","happy","sad","angry","fearful","disgusted","surprised"],Wr=class{constructor(t){this.neutral=0;this.happy=0;this.sad=0;this.angry=0;this.fearful=0;this.disgusted=0;this.surprised=0;if(t.length!==7)throw new Error(`FaceExpressions.constructor - expected probabilities.length to be 7, have: ${t.length}`);V1.forEach((n,a)=>{this[n]=t[a]})}asSortedArray(){return V1.map(t=>({expression:t,probability:this[t]})).sort((t,n)=>n.probability-t.probability)}};var Ad=class extends kp{constructor(t=new wp){super("FaceExpressionNet",t)}forwardInput(t){return O(()=>Za(this.runNet(t)))}async forward(t){return this.forwardInput(await vt(t))}async predictExpressions(t){let n=await vt(t),a=await this.forwardInput(n),r=await Promise.all(mt(a).map(async i=>{let o=i.dataSync();return i.dispose(),o}));a.dispose();let s=r.map(i=>new Wr(i));return n.isBatchInput?s:s[0]}getDefaultModelName(){return"face_expression_model"}getClassifierChannelsIn(){return 256}getClassifierChannelsOut(){return 7}};function U1(e){return e.expressions instanceof Wr}function Ag(e,t){return{...e,...{expressions:t}}}function Epe(e,t,n=.1,a){(Array.isArray(t)?t:[t]).forEach(s=>{let i=s instanceof Wr?s:U1(s)?s.expressions:void 0;if(!i)throw new Error("drawFaceExpressions - expected faceExpressions to be FaceExpressions | WithFaceExpressions<{}> or array thereof");let l=i.asSortedArray().filter(d=>d.probability>n),u=vr(s)?s.detection.box.bottomLeft:a||new Pe(0,0);new zr(l.map(d=>`${d.expression} (${Ao(d.probability)})`),u).draw(e)})}function Bo(e){return vr(e)&&e.landmarks instanceof ra&&e.unshiftedLandmarks instanceof ra&&e.alignedRect instanceof xt}function Ape(e){let t=(o,l,u,p)=>Math.atan2(p-l,u-o)%Math.PI,n=o=>o*180/Math.PI,a={roll:void 0,pitch:void 0,yaw:void 0};if(!e||!e._positions||e._positions.length!==68)return a;let r=e._positions;a.roll=-t(r[36]._x,r[36]._y,r[45]._x,r[45]._y),a.pitch=t(0,Math.abs(r[0]._x-r[30]._x)/r[30]._x,Math.PI,Math.abs(r[16]._x-r[30]._x)/r[30]._x);let s=r.reduce((o,l)=>oo>l._y?o:l._y,-1/0);return a.yaw=Math.PI*(e._imgDims._height/(i-s)/1.4-1),a}function Ip(e,t){let{box:n}=e.detection,a=t.shiftBy(n.x,n.y),r=a.align(),{imageDims:s}=e.detection,i=new xt(e.detection.score,r.rescale(s.reverse()),s),o=Ape(t);return{...e,...{landmarks:a,unshiftedLandmarks:t,alignedRect:i,angle:o}}}var $g=class{constructor(t={}){let{drawLines:n=!0,drawPoints:a=!0,lineWidth:r,lineColor:s,pointSize:i,pointColor:o}=t;this.drawLines=n,this.drawPoints=a,this.lineWidth=r||1,this.pointSize=i||2,this.lineColor=s||"rgba(0, 255, 255, 1)",this.pointColor=o||"rgba(255, 0, 255, 1)"}},Fg=class{constructor(t,n={}){this.faceLandmarks=t,this.options=new $g(n)}draw(t){let n=Kn(t),{drawLines:a,drawPoints:r,lineWidth:s,lineColor:i,pointSize:o,pointColor:l}=this.options;if(a&&this.faceLandmarks instanceof Ro&&(n.strokeStyle=i,n.lineWidth=s,Pr(n,this.faceLandmarks.getJawOutline()),Pr(n,this.faceLandmarks.getLeftEyeBrow()),Pr(n,this.faceLandmarks.getRightEyeBrow()),Pr(n,this.faceLandmarks.getNose()),Pr(n,this.faceLandmarks.getLeftEye(),!0),Pr(n,this.faceLandmarks.getRightEye(),!0),Pr(n,this.faceLandmarks.getMouth(),!0)),r){n.strokeStyle=l,n.fillStyle=l;let u=p=>{n.beginPath(),n.arc(p.x,p.y,o,0,2*Math.PI),n.fill()};this.faceLandmarks.positions.forEach(u)}}};function $pe(e,t){(Array.isArray(t)?t:[t]).forEach(a=>{let r=a instanceof ra?a:Bo(a)?a.landmarks:void 0;if(!r)throw new Error("drawFaceLandmarks - expected faceExpressions to be FaceLandmarks | WithFaceLandmarks> or array thereof");new Fg(r).draw(e)})}var qA="1.7.1";function Rpe(e,t){let n=bp(e,t),a=xp(e,t);function r(i,o,l){let u=a(i,o,`${l}/separable_conv0`),p=a(o,o,`${l}/separable_conv1`),d=n(i,o,1,`${l}/expansion_conv`);return{separable_conv0:u,separable_conv1:p,expansion_conv:d}}function s(i,o){let l=a(i,i,`${o}/separable_conv0`),u=a(i,i,`${o}/separable_conv1`),p=a(i,i,`${o}/separable_conv2`);return{separable_conv0:l,separable_conv1:u,separable_conv2:p}}return{extractConvParams:n,extractSeparableConvParams:a,extractReductionBlockParams:r,extractMainBlockParams:s}}function KA(e,t){let n=[],{extractWeights:a,getRemainingWeights:r}=Dn(e),{extractConvParams:s,extractSeparableConvParams:i,extractReductionBlockParams:o,extractMainBlockParams:l}=Rpe(a,n),u=s(3,32,3,"entry_flow/conv_in"),p=o(32,64,"entry_flow/reduction_block_0"),d=o(64,128,"entry_flow/reduction_block_1"),c={conv_in:u,reduction_block_0:p,reduction_block_1:d},h={};br(t,0,1).forEach(y=>{h[`main_block_${y}`]=l(128,`middle_flow/main_block_${y}`)});let m=o(128,256,"exit_flow/reduction_block"),f=i(256,512,"exit_flow/separable_conv"),g={reduction_block:m,separable_conv:f};if(r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{paramMappings:n,params:{entry_flow:c,middle_flow:h,exit_flow:g}}}function Mpe(e,t){let n=sa(e,t),a=Cg(n),r=vp(n);function s(o){let l=r(`${o}/separable_conv0`),u=r(`${o}/separable_conv1`),p=a(`${o}/expansion_conv`);return{separable_conv0:l,separable_conv1:u,expansion_conv:p}}function i(o){let l=r(`${o}/separable_conv0`),u=r(`${o}/separable_conv1`),p=r(`${o}/separable_conv2`);return{separable_conv0:l,separable_conv1:u,separable_conv2:p}}return{extractConvParams:a,extractSeparableConvParams:r,extractReductionBlockParams:s,extractMainBlockParams:i}}function XA(e,t){let n=[],{extractConvParams:a,extractSeparableConvParams:r,extractReductionBlockParams:s,extractMainBlockParams:i}=Mpe(e,n),o=a("entry_flow/conv_in"),l=s("entry_flow/reduction_block_0"),u=s("entry_flow/reduction_block_1"),p={conv_in:o,reduction_block_0:l,reduction_block_1:u},d={};br(t,0,1).forEach(f=>{d[`main_block_${f}`]=i(`middle_flow/main_block_${f}`)});let c=s("exit_flow/reduction_block"),h=r("exit_flow/separable_conv"),m={reduction_block:c,separable_conv:h};return Fn(e,n),{params:{entry_flow:p,middle_flow:d,exit_flow:m},paramMappings:n}}function YA(e,t,n){return Z(Dt(e,t.filters,n,"same"),t.bias)}function H1(e,t,n=!0){let a=n?Xe(e):e;return a=Xn(a,t.separable_conv0,[1,1]),a=Xn(Xe(a),t.separable_conv1,[1,1]),a=Mt(a,[3,3],[2,2],"same"),a=Z(a,YA(e,t.expansion_conv,[2,2])),a}function Ppe(e,t){let n=Xn(Xe(e),t.separable_conv0,[1,1]);return n=Xn(Xe(n),t.separable_conv1,[1,1]),n=Xn(Xe(n),t.separable_conv2,[1,1]),n=Z(n,e),n}var Dg=class extends on{constructor(n){super("TinyXception");this._numMainBlocks=n}forwardInput(n){let{params:a}=this;if(!a)throw new Error("TinyXception - load model before inference");return O(()=>{let r=le(n.toBatchTensor(112,!0),"float32"),i=tr(r,[122.782,117.001,104.298]).div(255),o=Xe(YA(i,a.entry_flow.conv_in,[2,2]));return o=H1(o,a.entry_flow.reduction_block_0,!1),o=H1(o,a.entry_flow.reduction_block_1),br(this._numMainBlocks,0,1).forEach(l=>{o=Ppe(o,a.middle_flow[`main_block_${l}`])}),o=H1(o,a.exit_flow.reduction_block),o=Xe(Xn(o,a.exit_flow.separable_conv,[1,1])),o})}async forward(n){return this.forwardInput(await vt(n))}getDefaultModelName(){return"tiny_xception_model"}extractParamsFromWeightMap(n){return XA(n,this._numMainBlocks)}extractParams(n){return KA(n,this._numMainBlocks)}};function JA(e){let t=[],{extractWeights:n,getRemainingWeights:a}=Dn(e),r=Ng(n,t),s=r(512,1,"fc/age"),i=r(512,2,"fc/gender");if(a().length!==0)throw new Error(`weights remaing after extract: ${a().length}`);return{paramMappings:t,params:{fc:{age:s,gender:i}}}}function ZA(e){let t=[],n=sa(e,t);function a(s){let i=n(`${s}/weights`,2),o=n(`${s}/bias`,1);return{weights:i,bias:o}}let r={fc:{age:a("fc/age"),gender:a("fc/gender")}};return Fn(e,t),{params:r,paramMappings:t}}var Rg=(n=>(n.FEMALE="female",n.MALE="male",n))(Rg||{});var $d=class extends on{constructor(n=new Dg(2)){super("AgeGenderNet");this._faceFeatureExtractor=n}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(n){let{params:a}=this;if(!a)throw new Error(`${this._name} - load model before inference`);return O(()=>{let r=n instanceof wr?this.faceFeatureExtractor.forwardInput(n):n,s=ga(r,[7,7],[2,2],"valid").as2D(r.shape[0],-1),i=Ed(s,a.fc.age).as1D(),o=Ed(s,a.fc.gender);return{age:i,gender:o}})}forwardInput(n){return O(()=>{let{age:a,gender:r}=this.runNet(n);return{age:a,gender:Za(r)}})}async forward(n){return this.forwardInput(await vt(n))}async predictAgeAndGender(n){let a=await vt(n),r=await this.forwardInput(a),s=mt(r.age),i=mt(r.gender),o=s.map((u,p)=>({ageTensor:u,genderTensor:i[p]})),l=await Promise.all(o.map(async({ageTensor:u,genderTensor:p})=>{let d=u.dataSync()[0],c=p.dataSync()[0],h=c>.5,m=h?"male":"female",f=h?c:1-c;return u.dispose(),p.dispose(),{age:d,gender:m,genderProbability:f}}));return r.age.dispose(),r.gender.dispose(),a.isBatchInput?l:l[0]}getDefaultModelName(){return"age_gender_model"}dispose(n=!0){this.faceFeatureExtractor.dispose(n),super.dispose(n)}loadClassifierParams(n){let{params:a,paramMappings:r}=this.extractClassifierParams(n);this._params=a,this._paramMappings=r}extractClassifierParams(n){return JA(n)}extractParamsFromWeightMap(n){let{featureExtractorMap:a,classifierMap:r}=Eg(n);return this.faceFeatureExtractor.loadFromWeightMap(a),ZA(r)}extractParams(n){let r=n.slice(0,n.length-1539),s=n.slice(n.length-1539);return this.faceFeatureExtractor.extractWeights(r),this.extractClassifierParams(s)}};var Sp=class extends kp{postProcess(t,n,a){let r=a.map(({width:i,height:o})=>{let l=n/Math.max(o,i);return{width:i*l,height:o*l}}),s=r.length;return O(()=>{let i=(d,c)=>Rt([An([68],d,"float32"),An([68],c,"float32")],1).as2D(1,136).as1D(),o=(d,c)=>{let{width:h,height:m}=r[d];return c(h,m)?Math.abs(h-m)/2:0},l=d=>o(d,(c,h)=>co(d,(c,h)=>hi(l(c),u(c))))).div(Rt(Array.from(Array(s),(d,c)=>i(r[c].width,r[c].height))))})}forwardInput(t){return O(()=>{let n=this.runNet(t);return this.postProcess(n,t.inputSize,t.inputDimensions.map(([a,r])=>({height:a,width:r})))})}async forward(t){return this.forwardInput(await vt(t))}async detectLandmarks(t){let n=await vt(t),a=O(()=>mt(this.forwardInput(n))),r=await Promise.all(a.map(async(s,i)=>{let o=Array.from(s.dataSync()),l=o.filter((p,d)=>bg(d)),u=o.filter((p,d)=>!bg(d));return new Ro(Array(68).fill(0).map((p,d)=>new Pe(l[d],u[d])),{height:n.getInputHeight(i),width:n.getInputWidth(i)})}));return a.forEach(s=>s.dispose()),n.isBatchInput?r:r[0]}getClassifierChannelsOut(){return 136}};var Wo=class extends Sp{constructor(t=new wp){super("FaceLandmark68Net",t)}getDefaultModelName(){return"face_landmark_68_model"}getClassifierChannelsIn(){return 256}};function QA(e){let t=[],{extractDenseBlock3Params:n}=_g(e,t),a={dense0:n("dense0",!0),dense1:n("dense1"),dense2:n("dense2")};return Fn(e,t),{params:a,paramMappings:t}}function e$(e){let t=[],{extractWeights:n,getRemainingWeights:a}=Dn(e),{extractDenseBlock3Params:r}=Tg(n,t),s=r(3,32,"dense0",!0),i=r(32,64,"dense1"),o=r(64,128,"dense2");if(a().length!==0)throw new Error(`weights remaing after extract: ${a().length}`);return{paramMappings:t,params:{dense0:s,dense1:i,dense2:o}}}var Mg=class extends on{constructor(){super("TinyFaceFeatureExtractor")}forwardInput(t){let{params:n}=this;if(!n)throw new Error("TinyFaceFeatureExtractor - load model before inference");return O(()=>{let a=le(t.toBatchTensor(112,!0),"float32"),s=tr(a,[122.782,117.001,104.298]).div(255),i=Sg(s,n.dense0,!0);return i=Sg(i,n.dense1),i=Sg(i,n.dense2),i=ga(i,[14,14],[2,2],"valid"),i})}async forward(t){return this.forwardInput(await vt(t))}getDefaultModelName(){return"face_feature_extractor_tiny_model"}extractParamsFromWeightMap(t){return QA(t)}extractParams(t){return e$(t)}};var Fd=class extends Sp{constructor(t=new Mg){super("FaceLandmark68TinyNet",t)}getDefaultModelName(){return"face_landmark_68_tiny_model"}getClassifierChannelsIn(){return 128}};var j1=class extends Wo{};function t$(e,t){return Z(B(e,t.weights),t.biases)}function q1(e,t,n,a,r="same"){let{filters:s,bias:i}=t.conv,o=Dt(e,s,n,r);return o=Z(o,i),o=t$(o,t.scale),a?Xe(o):o}function n$(e,t){return q1(e,t,[1,1],!0)}function K1(e,t){return q1(e,t,[1,1],!1)}function Pg(e,t){return q1(e,t,[2,2],!0,"valid")}function Ope(e,t){function n(o,l,u){let p=e(o),d=p.length/(l*u*u);if(w1(d))throw new Error(`depth has to be an integer: ${d}, weights.length: ${p.length}, numFilters: ${l}, filterSize: ${u}`);return O(()=>$e($a(p,[l,d,u,u]),[2,3,1,0]))}function a(o,l,u,p){let d=n(o,l,u),c=Ke(e(l));return t.push({paramPath:`${p}/filters`},{paramPath:`${p}/bias`}),{filters:d,bias:c}}function r(o,l){let u=Ke(e(o)),p=Ke(e(o));return t.push({paramPath:`${l}/weights`},{paramPath:`${l}/biases`}),{weights:u,biases:p}}function s(o,l,u,p){let d=a(o,l,u,`${p}/conv`),c=r(l,`${p}/scale`);return{conv:d,scale:c}}function i(o,l,u,p,d=!1){let c=s((d?.5:1)*o,l,u,`${p}/conv1`),h=s(o,l,u,`${p}/conv2`);return{conv1:c,conv2:h}}return{extractConvLayerParams:s,extractResidualLayerParams:i}}function a$(e){let{extractWeights:t,getRemainingWeights:n}=Dn(e),a=[],{extractConvLayerParams:r,extractResidualLayerParams:s}=Ope(t,a),i=r(4704,32,7,"conv32_down"),o=s(9216,32,3,"conv32_1"),l=s(9216,32,3,"conv32_2"),u=s(9216,32,3,"conv32_3"),p=s(36864,64,3,"conv64_down",!0),d=s(36864,64,3,"conv64_1"),c=s(36864,64,3,"conv64_2"),h=s(36864,64,3,"conv64_3"),m=s(147456,128,3,"conv128_down",!0),f=s(147456,128,3,"conv128_1"),g=s(147456,128,3,"conv128_2"),y=s(589824,256,3,"conv256_down",!0),b=s(589824,256,3,"conv256_1"),x=s(589824,256,3,"conv256_2"),v=s(589824,256,3,"conv256_down_out"),I=O(()=>$e(Ca(t(256*128),[128,256]),[1,0]));if(a.push({paramPath:"fc"}),n().length!==0)throw new Error(`weights remaing after extract: ${n().length}`);return{params:{conv32_down:i,conv32_1:o,conv32_2:l,conv32_3:u,conv64_down:p,conv64_1:d,conv64_2:c,conv64_3:h,conv128_down:m,conv128_1:f,conv128_2:g,conv256_down:y,conv256_1:b,conv256_2:x,conv256_down_out:v,fc:I},paramMappings:a}}function Lpe(e,t){let n=sa(e,t);function a(i){let o=n(`${i}/scale/weights`,1),l=n(`${i}/scale/biases`,1);return{weights:o,biases:l}}function r(i){let o=n(`${i}/conv/filters`,4),l=n(`${i}/conv/bias`,1),u=a(i);return{conv:{filters:o,bias:l},scale:u}}function s(i){return{conv1:r(`${i}/conv1`),conv2:r(`${i}/conv2`)}}return{extractConvLayerParams:r,extractResidualLayerParams:s}}function r$(e){let t=[],{extractConvLayerParams:n,extractResidualLayerParams:a}=Lpe(e,t),r=n("conv32_down"),s=a("conv32_1"),i=a("conv32_2"),o=a("conv32_3"),l=a("conv64_down"),u=a("conv64_1"),p=a("conv64_2"),d=a("conv64_3"),c=a("conv128_down"),h=a("conv128_1"),m=a("conv128_2"),f=a("conv256_down"),g=a("conv256_1"),y=a("conv256_2"),b=a("conv256_down_out"),{fc:x}=e;if(t.push({originalPath:"fc",paramPath:"fc"}),!v1(x))throw new Error(`expected weightMap[fc] to be a Tensor2D, instead have ${x}`);let v={conv32_down:r,conv32_1:s,conv32_2:i,conv32_3:o,conv64_down:l,conv64_1:u,conv64_2:p,conv64_3:d,conv128_down:c,conv128_1:h,conv128_2:m,conv256_down:f,conv256_1:g,conv256_2:y,conv256_down_out:b,fc:x};return Fn(e,t),{params:v,paramMappings:t}}function nr(e,t){let n=n$(e,t.conv1);return n=K1(n,t.conv2),n=Z(n,e),n=Xe(n),n}function Dd(e,t){let n=Pg(e,t.conv1);n=K1(n,t.conv2);let a=ga(e,2,2,"valid"),r=It(a.shape),s=a.shape[3]!==n.shape[3];if(a.shape[1]!==n.shape[1]||a.shape[2]!==n.shape[2]){let o=[...n.shape];o[1]=1;let l=It(o);n=Qe([n,l],1);let u=[...n.shape];u[2]=1;let p=It(u);n=Qe([n,p],2)}return a=s?Qe([a,r],3):a,n=Z(a,n),n=Xe(n),n}var Vo=class extends on{constructor(){super("FaceRecognitionNet")}forwardInput(t){let{params:n}=this;if(!n)throw new Error("FaceRecognitionNet - load model before inference");return O(()=>{let a=le(t.toBatchTensor(150,!0),"float32"),s=tr(a,[122.782,117.001,104.298]).div(255),i=Pg(s,n.conv32_down);i=Mt(i,3,2,"valid"),i=nr(i,n.conv32_1),i=nr(i,n.conv32_2),i=nr(i,n.conv32_3),i=Dd(i,n.conv64_down),i=nr(i,n.conv64_1),i=nr(i,n.conv64_2),i=nr(i,n.conv64_3),i=Dd(i,n.conv128_down),i=nr(i,n.conv128_1),i=nr(i,n.conv128_2),i=Dd(i,n.conv256_down),i=nr(i,n.conv256_1),i=nr(i,n.conv256_2),i=Dd(i,n.conv256_down_out);let o=i.mean([1,2]);return Re(o,n.fc)})}async forward(t){return this.forwardInput(await vt(t))}async computeFaceDescriptor(t){var s;if((s=t==null?void 0:t.shape)!=null&&s.some(i=>i<=0))return new Float32Array(128);let n=await vt(t),a=O(()=>mt(this.forwardInput(n))),r=await Promise.all(a.map(i=>i.data()));return a.forEach(i=>i.dispose()),n.isBatchInput?r:r[0]}getDefaultModelName(){return"face_recognition_model"}extractParamsFromWeightMap(t){return r$(t)}extractParams(t){return a$(t)}};function zpe(e){let t=new Vo;return t.extractWeights(e),t}function Og(e,t){return{...e,...{descriptor:t}}}function Bpe(e){return typeof e.age=="number"}function Lg(e,t){return{...e,...{age:t}}}function Wpe(e){return(e.gender==="male"||e.gender==="female")&&dp(e.genderProbability)}function zg(e,t,n){return{...e,...{gender:t,genderProbability:n}}}function Vpe(e,t){function n(l,u){let p=$a(e(9*l),[3,3,l,1]),d=Ke(e(l)),c=Ke(e(l)),h=Ke(e(l)),m=Ke(e(l));return t.push({paramPath:`${u}/filters`},{paramPath:`${u}/batch_norm_scale`},{paramPath:`${u}/batch_norm_offset`},{paramPath:`${u}/batch_norm_mean`},{paramPath:`${u}/batch_norm_variance`}),{filters:p,batch_norm_scale:d,batch_norm_offset:c,batch_norm_mean:h,batch_norm_variance:m}}function a(l,u,p,d,c){let h=$a(e(l*u*p*p),[p,p,l,u]),m=Ke(e(u));return t.push({paramPath:`${d}/filters`},{paramPath:`${d}/${c?"batch_norm_offset":"bias"}`}),{filters:h,bias:m}}function r(l,u,p,d){let{filters:c,bias:h}=a(l,u,p,d,!0);return{filters:c,batch_norm_offset:h}}function s(l,u,p){let d=n(l,`${p}/depthwise_conv`),c=r(l,u,1,`${p}/pointwise_conv`);return{depthwise_conv:d,pointwise_conv:c}}function i(){let l=r(3,32,3,"mobilenetv1/conv_0"),u=s(32,64,"mobilenetv1/conv_1"),p=s(64,128,"mobilenetv1/conv_2"),d=s(128,128,"mobilenetv1/conv_3"),c=s(128,256,"mobilenetv1/conv_4"),h=s(256,256,"mobilenetv1/conv_5"),m=s(256,512,"mobilenetv1/conv_6"),f=s(512,512,"mobilenetv1/conv_7"),g=s(512,512,"mobilenetv1/conv_8"),y=s(512,512,"mobilenetv1/conv_9"),b=s(512,512,"mobilenetv1/conv_10"),x=s(512,512,"mobilenetv1/conv_11"),v=s(512,1024,"mobilenetv1/conv_12"),I=s(1024,1024,"mobilenetv1/conv_13");return{conv_0:l,conv_1:u,conv_2:p,conv_3:d,conv_4:c,conv_5:h,conv_6:m,conv_7:f,conv_8:g,conv_9:y,conv_10:b,conv_11:x,conv_12:v,conv_13:I}}function o(){let l=r(1024,256,1,"prediction_layer/conv_0"),u=r(256,512,3,"prediction_layer/conv_1"),p=r(512,128,1,"prediction_layer/conv_2"),d=r(128,256,3,"prediction_layer/conv_3"),c=r(256,128,1,"prediction_layer/conv_4"),h=r(128,256,3,"prediction_layer/conv_5"),m=r(256,64,1,"prediction_layer/conv_6"),f=r(64,128,3,"prediction_layer/conv_7"),g=a(512,12,1,"prediction_layer/box_predictor_0/box_encoding_predictor"),y=a(512,9,1,"prediction_layer/box_predictor_0/class_predictor"),b=a(1024,24,1,"prediction_layer/box_predictor_1/box_encoding_predictor"),x=a(1024,18,1,"prediction_layer/box_predictor_1/class_predictor"),v=a(512,24,1,"prediction_layer/box_predictor_2/box_encoding_predictor"),I=a(512,18,1,"prediction_layer/box_predictor_2/class_predictor"),T=a(256,24,1,"prediction_layer/box_predictor_3/box_encoding_predictor"),_=a(256,18,1,"prediction_layer/box_predictor_3/class_predictor"),A=a(256,24,1,"prediction_layer/box_predictor_4/box_encoding_predictor"),F=a(256,18,1,"prediction_layer/box_predictor_4/class_predictor"),P=a(128,24,1,"prediction_layer/box_predictor_5/box_encoding_predictor"),$=a(128,18,1,"prediction_layer/box_predictor_5/class_predictor");return{conv_0:l,conv_1:u,conv_2:p,conv_3:d,conv_4:c,conv_5:h,conv_6:m,conv_7:f,box_predictor_0:{box_encoding_predictor:g,class_predictor:y},box_predictor_1:{box_encoding_predictor:b,class_predictor:x},box_predictor_2:{box_encoding_predictor:v,class_predictor:I},box_predictor_3:{box_encoding_predictor:T,class_predictor:_},box_predictor_4:{box_encoding_predictor:A,class_predictor:F},box_predictor_5:{box_encoding_predictor:P,class_predictor:$}}}return{extractMobilenetV1Params:i,extractPredictionLayerParams:o}}function s$(e){let t=[],{extractWeights:n,getRemainingWeights:a}=Dn(e),{extractMobilenetV1Params:r,extractPredictionLayerParams:s}=Vpe(n,t),i=r(),o=s(),u={extra_dim:Hc(n(5118*4),[1,5118,4])};if(t.push({paramPath:"output_layer/extra_dim"}),a().length!==0)throw new Error(`weights remaing after extract: ${a().length}`);return{params:{mobilenetv1:i,prediction_layer:o,output_layer:u},paramMappings:t}}function Upe(e,t){let n=sa(e,t);function a(u,p,d){let c=n(`${u}/Conv2d_${p}_pointwise/weights`,4,`${d}/filters`),h=n(`${u}/Conv2d_${p}_pointwise/convolution_bn_offset`,1,`${d}/batch_norm_offset`);return{filters:c,batch_norm_offset:h}}function r(u){let p=`mobilenetv1/conv_${u}`,d=`MobilenetV1/Conv2d_${u}_depthwise`,c=`${p}/depthwise_conv`,h=`${p}/pointwise_conv`,m=n(`${d}/depthwise_weights`,4,`${c}/filters`),f=n(`${d}/BatchNorm/gamma`,1,`${c}/batch_norm_scale`),g=n(`${d}/BatchNorm/beta`,1,`${c}/batch_norm_offset`),y=n(`${d}/BatchNorm/moving_mean`,1,`${c}/batch_norm_mean`),b=n(`${d}/BatchNorm/moving_variance`,1,`${c}/batch_norm_variance`);return{depthwise_conv:{filters:m,batch_norm_scale:f,batch_norm_offset:g,batch_norm_mean:y,batch_norm_variance:b},pointwise_conv:a("MobilenetV1",u,h)}}function s(){return{conv_0:a("MobilenetV1",0,"mobilenetv1/conv_0"),conv_1:r(1),conv_2:r(2),conv_3:r(3),conv_4:r(4),conv_5:r(5),conv_6:r(6),conv_7:r(7),conv_8:r(8),conv_9:r(9),conv_10:r(10),conv_11:r(11),conv_12:r(12),conv_13:r(13)}}function i(u,p){let d=n(`${u}/weights`,4,`${p}/filters`),c=n(`${u}/biases`,1,`${p}/bias`);return{filters:d,bias:c}}function o(u){let p=i(`Prediction/BoxPredictor_${u}/BoxEncodingPredictor`,`prediction_layer/box_predictor_${u}/box_encoding_predictor`),d=i(`Prediction/BoxPredictor_${u}/ClassPredictor`,`prediction_layer/box_predictor_${u}/class_predictor`);return{box_encoding_predictor:p,class_predictor:d}}function l(){return{conv_0:a("Prediction",0,"prediction_layer/conv_0"),conv_1:a("Prediction",1,"prediction_layer/conv_1"),conv_2:a("Prediction",2,"prediction_layer/conv_2"),conv_3:a("Prediction",3,"prediction_layer/conv_3"),conv_4:a("Prediction",4,"prediction_layer/conv_4"),conv_5:a("Prediction",5,"prediction_layer/conv_5"),conv_6:a("Prediction",6,"prediction_layer/conv_6"),conv_7:a("Prediction",7,"prediction_layer/conv_7"),box_predictor_0:o(0),box_predictor_1:o(1),box_predictor_2:o(2),box_predictor_3:o(3),box_predictor_4:o(4),box_predictor_5:o(5)}}return{extractMobilenetV1Params:s,extractPredictionLayerParams:l}}function i$(e){let t=[],{extractMobilenetV1Params:n,extractPredictionLayerParams:a}=Upe(e,t),r=e["Output/extra_dim"];if(t.push({originalPath:"Output/extra_dim",paramPath:"output_layer/extra_dim"}),!Or(r))throw new Error(`expected weightMap['Output/extra_dim'] to be a Tensor3D, instead have ${r}`);let s={mobilenetv1:n(),prediction_layer:a(),output_layer:{extra_dim:r}};return Fn(e,t),{params:s,paramMappings:t}}function Ra(e,t,n){return O(()=>{let a=Dt(e,t.filters,n,"same");return a=Z(a,t.batch_norm_offset),tn(a,0,6)})}var Gpe=.0010000000474974513;function Hpe(e,t,n){return O(()=>{let a=Ss(e,t.filters,n,"same");return a=Is(a,t.batch_norm_mean,t.batch_norm_variance,t.batch_norm_offset,t.batch_norm_scale,Gpe),tn(a,0,6)})}function jpe(e){return[2,4,6,12].some(t=>t===e)?[2,2]:[1,1]}function o$(e,t){return O(()=>{let n,a=Ra(e,t.conv_0,[2,2]);if([t.conv_1,t.conv_2,t.conv_3,t.conv_4,t.conv_5,t.conv_6,t.conv_7,t.conv_8,t.conv_9,t.conv_10,t.conv_11,t.conv_12,t.conv_13].forEach((s,i)=>{let o=i+1,l=jpe(o);a=Hpe(a,s.depthwise_conv,l),a=Ra(a,s.pointwise_conv,[1,1]),o===11&&(n=a)}),n===null)throw new Error("mobileNetV1 - output of conv layer 11 is null");return{out:a,conv11:n}})}function qpe(e,t,n){let a=e.arraySync(),r=Math.min(a[t][0],a[t][2]),s=Math.min(a[t][1],a[t][3]),i=Math.max(a[t][0],a[t][2]),o=Math.max(a[t][1],a[t][3]),l=Math.min(a[n][0],a[n][2]),u=Math.min(a[n][1],a[n][3]),p=Math.max(a[n][0],a[n][2]),d=Math.max(a[n][1],a[n][3]),c=(i-r)*(o-s),h=(p-l)*(d-u);if(c<=0||h<=0)return 0;let m=Math.max(r,l),f=Math.max(s,u),g=Math.min(i,p),y=Math.min(o,d),b=Math.max(g-m,0)*Math.max(y-f,0);return b/(c+h-b)}function l$(e,t,n,a,r){let s=e.shape[0],i=Math.min(n,s),o=t.map((p,d)=>({score:p,boxIndex:d})).filter(p=>p.score>r).sort((p,d)=>d.score-p.score),l=p=>p<=a?1:0,u=[];return o.forEach(p=>{if(u.length>=i)return;let d=p.score;for(let c=u.length-1;c>=0;--c){let h=qpe(e,p.boxIndex,u[c]);if(h!==0&&(p.score*=l(h),p.score<=r))break}d===p.score&&u.push(p.boxIndex)}),u}function Kpe(e){let t=mt($e(e,[1,0])),n=[ce(t[2],t[0]),ce(t[3],t[1])],a=[Z(t[0],fe(n[0],2)),Z(t[1],fe(n[1],2))];return{sizes:n,centers:a}}function Xpe(e,t){let{sizes:n,centers:a}=Kpe(e),r=mt($e(t,[1,0])),s=fe(B(gn(fe(r[2],5)),n[0]),2),i=Z(B(fe(r[0],10),n[0]),a[0]),o=fe(B(gn(fe(r[3],5)),n[1]),2),l=Z(B(fe(r[1],10),n[1]),a[1]);return $e(Rt([ce(i,s),ce(l,o),Z(i,s),Z(l,o)]),[1,0])}function u$(e,t,n){return O(()=>{let a=e.shape[0],r=Xpe(W(zn(n.extra_dim,[a,1,1]),[-1,4]),W(e,[-1,4]));r=W(r,[a,r.shape[0]/a,4]);let s=ha(He(t,[0,0,1],[-1,-1,-1])),i=He(s,[0,0,0],[-1,-1,1]);i=W(i,[a,i.shape[1]]);let o=mt(r),l=mt(i);return{boxes:o,scores:l}})}function Uo(e,t){return O(()=>{let n=e.shape[0],a=W(zo(e,t.box_encoding_predictor),[n,-1,1,4]),r=W(zo(e,t.class_predictor),[n,-1,3]);return{boxPredictionEncoding:a,classPrediction:r}})}function p$(e,t,n){return O(()=>{let a=Ra(e,n.conv_0,[1,1]),r=Ra(a,n.conv_1,[2,2]),s=Ra(r,n.conv_2,[1,1]),i=Ra(s,n.conv_3,[2,2]),o=Ra(i,n.conv_4,[1,1]),l=Ra(o,n.conv_5,[2,2]),u=Ra(l,n.conv_6,[1,1]),p=Ra(u,n.conv_7,[2,2]),d=Uo(t,n.box_predictor_0),c=Uo(e,n.box_predictor_1),h=Uo(r,n.box_predictor_2),m=Uo(i,n.box_predictor_3),f=Uo(l,n.box_predictor_4),g=Uo(p,n.box_predictor_5),y=Qe([d.boxPredictionEncoding,c.boxPredictionEncoding,h.boxPredictionEncoding,m.boxPredictionEncoding,f.boxPredictionEncoding,g.boxPredictionEncoding],1),b=Qe([d.classPrediction,c.classPrediction,h.classPrediction,m.classPrediction,f.classPrediction,g.classPrediction],1);return{boxPredictions:y,classPredictions:b}})}var va=class{constructor({minConfidence:t,maxResults:n}={}){this._name="SsdMobilenetv1Options";if(this._minConfidence=t||.5,this._maxResults=n||100,typeof this._minConfidence!="number"||this._minConfidence<=0||this._minConfidence>=1)throw new Error(`${this._name} - expected minConfidence to be a number between 0 and 1`);if(typeof this._maxResults!="number")throw new Error(`${this._name} - expected maxResults to be a number`)}get minConfidence(){return this._minConfidence}get maxResults(){return this._maxResults}};var Fs=class extends on{constructor(){super("SsdMobilenetv1")}forwardInput(t){let{params:n}=this;if(!n)throw new Error("SsdMobilenetv1 - load model before inference");return O(()=>{let a=le(t.toBatchTensor(512,!1),"float32"),r=ce(fe(a,127.5),1),s=o$(r,n.mobilenetv1),{boxPredictions:i,classPredictions:o}=p$(s.out,s.conv11,n.prediction_layer);return u$(i,o,n.output_layer)})}async forward(t){return this.forwardInput(await vt(t))}async locateFaces(t,n={}){let{maxResults:a,minConfidence:r}=new va(n),s=await vt(t),{boxes:i,scores:o}=this.forwardInput(s),l=i[0],u=o[0];for(let x=1;x{let[v,I]=[Math.max(0,y[x][0]),Math.min(1,y[x][2])].map(A=>A*g),[T,_]=[Math.max(0,y[x][1]),Math.min(1,y[x][3])].map(A=>A*f);return new xt(p[x],new Do(T,v,_-T,I-v),{height:s.getInputHeight(0),width:s.getInputWidth(0)})});return l.dispose(),u.dispose(),b}getDefaultModelName(){return"ssd_mobilenetv1_model"}extractParamsFromWeightMap(t){return i$(t)}extractParams(t){return s$(t)}};function c$(e){let t=new Fs;return t.extractWeights(e),t}function Ype(e){return c$(e)}var X1=class extends Fs{};var d$=.4,h$=[new Pe(.738768,.874946),new Pe(2.42204,2.65704),new Pe(4.30971,7.04493),new Pe(10.246,4.59428),new Pe(12.6868,11.8741)],m$=[new Pe(1.603231,2.094468),new Pe(6.041143,7.080126),new Pe(2.882459,3.518061),new Pe(4.266906,5.178857),new Pe(9.041765,10.66308)],f$=[117.001,114.697,97.404],g$="tiny_yolov2_model",y$="tiny_yolov2_separable_conv_model";var Bg=e=>typeof e=="number";function Y1(e){if(!e)throw new Error(`invalid config: ${e}`);if(typeof e.withSeparableConvs!="boolean")throw new Error(`config.withSeparableConvs has to be a boolean, have: ${e.withSeparableConvs}`);if(!Bg(e.iouThreshold)||e.iouThreshold<0||e.iouThreshold>1)throw new Error(`config.iouThreshold has to be a number between [0, 1], have: ${e.iouThreshold}`);if(!Array.isArray(e.classes)||!e.classes.length||!e.classes.every(t=>typeof t=="string"))throw new Error(`config.classes has to be an array class names: string[], have: ${JSON.stringify(e.classes)}`);if(!Array.isArray(e.anchors)||!e.anchors.length||!e.anchors.map(t=>t||{}).every(t=>Bg(t.x)&&Bg(t.y)))throw new Error(`config.anchors has to be an array of { x: number, y: number }, have: ${JSON.stringify(e.anchors)}`);if(e.meanRgb&&(!Array.isArray(e.meanRgb)||e.meanRgb.length!==3||!e.meanRgb.every(Bg)))throw new Error(`config.meanRgb has to be an array of shape [number, number, number], have: ${JSON.stringify(e.meanRgb)}`)}function Np(e){return O(()=>{let t=B(e,ke(.10000000149011612));return Z(Xe(ce(e,t)),t)})}function Vr(e,t){return O(()=>{let n=ya(e,[[0,0],[1,1],[1,1],[0,0]]);return n=Dt(n,t.conv.filters,[1,1],"valid"),n=ce(n,t.bn.sub),n=B(n,t.bn.truediv),n=Z(n,t.conv.bias),Np(n)})}function Ur(e,t){return O(()=>{let n=ya(e,[[0,0],[1,1],[1,1],[0,0]]);return n=Cs(n,t.depthwise_filter,t.pointwise_filter,[1,1],"valid"),n=Z(n,t.bias),Np(n)})}function Jpe(e,t){let n=bp(e,t);function a(i,o){let l=Ke(e(i)),u=Ke(e(i));return t.push({paramPath:`${o}/sub`},{paramPath:`${o}/truediv`}),{sub:l,truediv:u}}function r(i,o,l){let u=n(i,o,3,`${l}/conv`),p=a(o,`${l}/bn`);return{conv:u,bn:p}}let s=xp(e,t);return{extractConvParams:n,extractConvWithBatchNormParams:r,extractSeparableConvParams:s}}function b$(e,t,n,a){let{extractWeights:r,getRemainingWeights:s}=Dn(e),i=[],{extractConvParams:o,extractConvWithBatchNormParams:l,extractSeparableConvParams:u}=Jpe(r,i),p;if(t.withSeparableConvs){let[d,c,h,m,f,g,y,b,x]=a,v=t.isFirstLayerConv2d?o(d,c,3,"conv0"):u(d,c,"conv0"),I=u(c,h,"conv1"),T=u(h,m,"conv2"),_=u(m,f,"conv3"),A=u(f,g,"conv4"),F=u(g,y,"conv5"),P=b?u(y,b,"conv6"):void 0,$=x?u(b,x,"conv7"):void 0,S=o(x||b||y,5*n,1,"conv8");p={conv0:v,conv1:I,conv2:T,conv3:_,conv4:A,conv5:F,conv6:P,conv7:$,conv8:S}}else{let[d,c,h,m,f,g,y,b,x]=a,v=l(d,c,"conv0"),I=l(c,h,"conv1"),T=l(h,m,"conv2"),_=l(m,f,"conv3"),A=l(f,g,"conv4"),F=l(g,y,"conv5"),P=l(y,b,"conv6"),$=l(b,x,"conv7"),S=o(x,5*n,1,"conv8");p={conv0:v,conv1:I,conv2:T,conv3:_,conv4:A,conv5:F,conv6:P,conv7:$,conv8:S}}if(s().length!==0)throw new Error(`weights remaing after extract: ${s().length}`);return{params:p,paramMappings:i}}function Zpe(e,t){let n=sa(e,t);function a(o){let l=n(`${o}/sub`,1),u=n(`${o}/truediv`,1);return{sub:l,truediv:u}}function r(o){let l=n(`${o}/filters`,4),u=n(`${o}/bias`,1);return{filters:l,bias:u}}function s(o){let l=r(`${o}/conv`),u=a(`${o}/bn`);return{conv:l,bn:u}}let i=vp(n);return{extractConvParams:r,extractConvWithBatchNormParams:s,extractSeparableConvParams:i}}function x$(e,t){let n=[],{extractConvParams:a,extractConvWithBatchNormParams:r,extractSeparableConvParams:s}=Zpe(e,n),i;if(t.withSeparableConvs){let o=t.filterSizes&&t.filterSizes.length||9;i={conv0:t.isFirstLayerConv2d?a("conv0"):s("conv0"),conv1:s("conv1"),conv2:s("conv2"),conv3:s("conv3"),conv4:s("conv4"),conv5:s("conv5"),conv6:o>7?s("conv6"):void 0,conv7:o>8?s("conv7"):void 0,conv8:a("conv8")}}else i={conv0:r("conv0"),conv1:r("conv1"),conv2:r("conv2"),conv3:r("conv3"),conv4:r("conv4"),conv5:r("conv5"),conv6:r("conv6"),conv7:r("conv7"),conv8:a("conv8")};return Fn(e,n),{params:i,paramMappings:n}}var ar=class{constructor({inputSize:t,scoreThreshold:n}={}){this._name="TinyYolov2Options";if(this._inputSize=t||416,this._scoreThreshold=n||.5,typeof this._inputSize!="number"||this._inputSize%32!==0)throw new Error(`${this._name} - expected inputSize to be a number divisible by 32`);if(typeof this._scoreThreshold!="number"||this._scoreThreshold<=0||this._scoreThreshold>=1)throw new Error(`${this._name} - expected scoreThreshold to be a number between 0 and 1`)}get inputSize(){return this._inputSize}get scoreThreshold(){return this._scoreThreshold}};var J1=class extends on{constructor(n){super("TinyYolov2");Y1(n),this._config=n}get config(){return this._config}get withClassScores(){return this.config.withClassScores||this.config.classes.length>1}get boxEncodingSize(){return 5+(this.withClassScores?this.config.classes.length:0)}runTinyYolov2(n,a){let r=Vr(n,a.conv0);return r=Mt(r,[2,2],[2,2],"same"),r=Vr(r,a.conv1),r=Mt(r,[2,2],[2,2],"same"),r=Vr(r,a.conv2),r=Mt(r,[2,2],[2,2],"same"),r=Vr(r,a.conv3),r=Mt(r,[2,2],[2,2],"same"),r=Vr(r,a.conv4),r=Mt(r,[2,2],[2,2],"same"),r=Vr(r,a.conv5),r=Mt(r,[2,2],[1,1],"same"),r=Vr(r,a.conv6),r=Vr(r,a.conv7),zo(r,a.conv8,"valid",!1)}runMobilenet(n,a){let r=this.config.isFirstLayerConv2d?Np(zo(n,a.conv0,"valid",!1)):Ur(n,a.conv0);return r=Mt(r,[2,2],[2,2],"same"),r=Ur(r,a.conv1),r=Mt(r,[2,2],[2,2],"same"),r=Ur(r,a.conv2),r=Mt(r,[2,2],[2,2],"same"),r=Ur(r,a.conv3),r=Mt(r,[2,2],[2,2],"same"),r=Ur(r,a.conv4),r=Mt(r,[2,2],[2,2],"same"),r=Ur(r,a.conv5),r=Mt(r,[2,2],[1,1],"same"),r=a.conv6?Ur(r,a.conv6):r,r=a.conv7?Ur(r,a.conv7):r,zo(r,a.conv8,"valid",!1)}forwardInput(n,a){let{params:r}=this;if(!r)throw new Error("TinyYolov2 - load model before inference");return O(()=>{let s=le(n.toBatchTensor(a,!1),"float32");return s=this.config.meanRgb?tr(s,this.config.meanRgb):s,s=s.div(255),this.config.withSeparableConvs?this.runMobilenet(s,r):this.runTinyYolov2(s,r)})}async forward(n,a){return this.forwardInput(await vt(n),a)}async detect(n,a={}){let{inputSize:r,scoreThreshold:s}=new ar(a),i=await vt(n),o=await this.forwardInput(i,r),l=O(()=>mt(o)[0].expandDims()),u={width:i.getInputWidth(0),height:i.getInputHeight(0)},p=await this.extractBoxes(l,i.getReshapedInputDimensions(0),s);o.dispose(),l.dispose();let d=p.map(y=>y.box),c=p.map(y=>y.score),h=p.map(y=>y.classScore),m=p.map(y=>this.config.classes[y.label]);return T1(d.map(y=>y.rescale(r)),c,this.config.iouThreshold,!0).map(y=>new Lr(c[y],h[y],m[y],d[y],u))}getDefaultModelName(){return""}extractParamsFromWeightMap(n){return x$(n,this.config)}extractParams(n){let a=this.config.filterSizes||J1.DEFAULT_FILTER_SIZES,r=a?a.length:void 0;if(r!==7&&r!==8&&r!==9)throw new Error(`TinyYolov2 - expected 7 | 8 | 9 convolutional filters, but found ${r} filterSizes in config`);return b$(n,this.config,this.boxEncodingSize,a)}async extractBoxes(n,a,r){let{width:s,height:i}=a,o=Math.max(s,i),l=o/s,u=o/i,p=n.shape[1],d=this.config.anchors.length,[c,h,m]=O(()=>{let b=n.reshape([p,p,d,this.boxEncodingSize]),x=b.slice([0,0,0,0],[p,p,d,4]),v=b.slice([0,0,0,4],[p,p,d,1]),I=this.withClassScores?Za(b.slice([0,0,0,5],[p,p,d,this.config.classes.length]),3):ke(0);return[x,v,I]}),f=[],g=await h.array(),y=await c.array();for(let b=0;br){let T=(x+kd(y[b][x][v][0]))/p*l,_=(b+kd(y[b][x][v][1]))/p*u,A=Math.exp(y[b][x][v][2])*this.config.anchors[v].x/p*l,F=Math.exp(y[b][x][v][3])*this.config.anchors[v].y/p*u,P=T-A/2,$=_-F/2,S={row:b,col:x,anchor:v},{classScore:M,label:U}=this.withClassScores?await this.extractPredictedClass(m,S):{classScore:1,label:0};f.push({box:new Fo(P,$,P+A,$+F),score:I,classScore:I*M,label:U,...S})}}return c.dispose(),h.dispose(),m.dispose(),f}async extractPredictedClass(n,a){let{row:r,col:s,anchor:i}=a,o=await n.array();return Array(this.config.classes.length).fill(0).map((l,u)=>o[r][s][i][u]).map((l,u)=>({classScore:l,label:u})).reduce((l,u)=>l.classScore>u.classScore?l:u)}},Go=J1;Go.DEFAULT_FILTER_SIZES=[3,16,32,64,128,256,512,1024,1024];var Ho=class extends Go{constructor(t=!0){let n={withSeparableConvs:t,iouThreshold:d$,classes:["face"],...t?{anchors:m$,meanRgb:f$}:{anchors:h$,withClassScores:!0}};super(n)}get withSeparableConvs(){return this.config.withSeparableConvs}get anchors(){return this.config.anchors}async locateFaces(t,n){return(await this.detect(t,n)).map(r=>new xt(r.score,r.relativeBox,{width:r.imageWidth,height:r.imageHeight}))}getDefaultModelName(){return this.withSeparableConvs?y$:g$}extractParamsFromWeightMap(t){return super.extractParamsFromWeightMap(t)}};function Qpe(e,t=!0){let n=new Ho(t);return n.extractWeights(e),n}var Rd=class extends ar{constructor(){super(...arguments);this._name="TinyFaceDetectorOptions"}};var wa=class{async then(t){return t(await this.run())}async run(){throw new Error("ComposableTask - run is not implemented")}};async function jo(e,t,n,a,r=({alignedRect:s})=>s){let s=e.map(l=>Bo(l)?r(l):l.detection),i=a||(t instanceof Ae?await yp(t,s):await gp(t,s)),o=await n(i);return i.forEach(l=>l instanceof Ae&&l.dispose()),o}async function Tp(e,t,n,a,r){return jo([e],t,async s=>n(s[0]),a,r)}var v$=.4,w$=[new Pe(1.603231,2.094468),new Pe(6.041143,7.080126),new Pe(2.882459,3.518061),new Pe(4.266906,5.178857),new Pe(9.041765,10.66308)],k$=[117.001,114.697,97.404];var qo=class extends Go{constructor(){let t={withSeparableConvs:!0,iouThreshold:v$,classes:["face"],anchors:w$,meanRgb:k$,isFirstLayerConv2d:!0,filterSizes:[3,16,32,64,128,256,512]};super(t)}get anchors(){return this.config.anchors}async locateFaces(t,n){return(await this.detect(t,n)).map(r=>new xt(r.score,r.relativeBox,{width:r.imageWidth,height:r.imageHeight}))}getDefaultModelName(){return"tiny_face_detector_model"}extractParamsFromWeightMap(t){return super.extractParamsFromWeightMap(t)}};var tt={ssdMobilenetv1:new Fs,tinyFaceDetector:new qo,tinyYolov2:new Ho,faceLandmark68Net:new Wo,faceLandmark68TinyNet:new Fd,faceRecognitionNet:new Vo,faceExpressionNet:new Ad,ageGenderNet:new $d},I$=(e,t)=>tt.ssdMobilenetv1.locateFaces(e,t),ece=(e,t)=>tt.tinyFaceDetector.locateFaces(e,t),tce=(e,t)=>tt.tinyYolov2.locateFaces(e,t),S$=e=>tt.faceLandmark68Net.detectLandmarks(e),nce=e=>tt.faceLandmark68TinyNet.detectLandmarks(e),ace=e=>tt.faceRecognitionNet.computeFaceDescriptor(e),rce=e=>tt.faceExpressionNet.predictExpressions(e),sce=e=>tt.ageGenderNet.predictAgeAndGender(e),N$=e=>tt.ssdMobilenetv1.load(e),ice=e=>tt.tinyFaceDetector.load(e),oce=e=>tt.tinyYolov2.load(e),lce=e=>tt.faceLandmark68Net.load(e),uce=e=>tt.faceLandmark68TinyNet.load(e),pce=e=>tt.faceRecognitionNet.load(e),cce=e=>tt.faceExpressionNet.load(e),dce=e=>tt.ageGenderNet.load(e),hce=N$,mce=I$,fce=S$;var Wg=class extends wa{constructor(n,a,r){super();this.parentTask=n;this.input=a;this.extractedFaces=r}},Ko=class extends Wg{async run(){let t=await this.parentTask,n=await jo(t,this.input,async a=>Promise.all(a.map(r=>tt.faceExpressionNet.predictExpressions(r))),this.extractedFaces);return t.map((a,r)=>Ag(a,n[r]))}withAgeAndGender(){return new Yo(this,this.input)}},Xo=class extends Wg{async run(){let t=await this.parentTask;if(!t)return;let n=await Tp(t,this.input,a=>tt.faceExpressionNet.predictExpressions(a),this.extractedFaces);return Ag(t,n)}withAgeAndGender(){return new Jo(this,this.input)}},Ds=class extends Ko{withAgeAndGender(){return new Ms(this,this.input)}withFaceDescriptors(){return new Gr(this,this.input)}},Rs=class extends Xo{withAgeAndGender(){return new Ps(this,this.input)}withFaceDescriptor(){return new Hr(this,this.input)}};var Vg=class extends wa{constructor(n,a,r){super();this.parentTask=n;this.input=a;this.extractedFaces=r}},Yo=class extends Vg{async run(){let t=await this.parentTask,n=await jo(t,this.input,async a=>Promise.all(a.map(r=>tt.ageGenderNet.predictAgeAndGender(r))),this.extractedFaces);return t.map((a,r)=>{let{age:s,gender:i,genderProbability:o}=n[r];return Lg(zg(a,i,o),s)})}withFaceExpressions(){return new Ko(this,this.input)}},Jo=class extends Vg{async run(){let t=await this.parentTask;if(!t)return;let{age:n,gender:a,genderProbability:r}=await Tp(t,this.input,s=>tt.ageGenderNet.predictAgeAndGender(s),this.extractedFaces);return Lg(zg(t,a,r),n)}withFaceExpressions(){return new Xo(this,this.input)}},Ms=class extends Yo{withFaceExpressions(){return new Ds(this,this.input)}withFaceDescriptors(){return new Gr(this,this.input)}},Ps=class extends Jo{withFaceExpressions(){return new Rs(this,this.input)}withFaceDescriptor(){return new Hr(this,this.input)}};var Md=class extends wa{constructor(n,a){super();this.parentTask=n;this.input=a}},Gr=class extends Md{async run(){let t=await this.parentTask;return(await jo(t,this.input,a=>Promise.all(a.map(r=>tt.faceRecognitionNet.computeFaceDescriptor(r))),null,a=>a.landmarks.align(null,{useDlibAlignment:!0}))).map((a,r)=>Og(t[r],a))}withFaceExpressions(){return new Ds(this,this.input)}withAgeAndGender(){return new Ms(this,this.input)}},Hr=class extends Md{async run(){let t=await this.parentTask;if(!t)return;let n=await Tp(t,this.input,a=>tt.faceRecognitionNet.computeFaceDescriptor(a),null,a=>a.landmarks.align(null,{useDlibAlignment:!0}));return Og(t,n)}withFaceExpressions(){return new Rs(this,this.input)}withAgeAndGender(){return new Ps(this,this.input)}};var Pd=class extends wa{constructor(n,a,r){super();this.parentTask=n;this.input=a;this.useTinyLandmarkNet=r}get landmarkNet(){return this.useTinyLandmarkNet?tt.faceLandmark68TinyNet:tt.faceLandmark68Net}},Od=class extends Pd{async run(){let t=await this.parentTask,n=t.map(i=>i.detection),a=this.input instanceof Ae?await yp(this.input,n):await gp(this.input,n),r=await Promise.all(a.map(i=>this.landmarkNet.detectLandmarks(i)));return a.forEach(i=>i instanceof Ae&&i.dispose()),t.filter((i,o)=>r[o]).map((i,o)=>Ip(i,r[o]))}withFaceExpressions(){return new Ds(this,this.input)}withAgeAndGender(){return new Ms(this,this.input)}withFaceDescriptors(){return new Gr(this,this.input)}},Ld=class extends Pd{async run(){let t=await this.parentTask;if(!t)return;let{detection:n}=t,a=this.input instanceof Ae?await yp(this.input,[n]):await gp(this.input,[n]),r=await this.landmarkNet.detectLandmarks(a[0]);return a.forEach(s=>s instanceof Ae&&s.dispose()),Ip(t,r)}withFaceExpressions(){return new Rs(this,this.input)}withAgeAndGender(){return new Ps(this,this.input)}withFaceDescriptor(){return new Hr(this,this.input)}};var zd=class extends wa{constructor(n,a=new va){super();this.input=n;this.options=a}},Cp=class extends zd{async run(){let{input:t,options:n}=this,a;if(n instanceof Rd)a=tt.tinyFaceDetector.locateFaces(t,n);else if(n instanceof va)a=tt.ssdMobilenetv1.locateFaces(t,n);else if(n instanceof ar)a=tt.tinyYolov2.locateFaces(t,n);else throw new Error("detectFaces - expected options to be instance of TinyFaceDetectorOptions | SsdMobilenetv1Options | TinyYolov2Options");return a}runAndExtendWithFaceDetections(){return new Promise((t,n)=>{this.run().then(a=>t(a.map(r=>Mo({},r)))).catch(a=>n(a))})}withFaceLandmarks(t=!1){return new Od(this.runAndExtendWithFaceDetections(),this.input,t)}withFaceExpressions(){return new Ko(this.runAndExtendWithFaceDetections(),this.input)}withAgeAndGender(){return new Yo(this.runAndExtendWithFaceDetections(),this.input)}},Bd=class extends zd{async run(){let t=await new Cp(this.input,this.options),n=t[0];return t.forEach(a=>{a.score>n.score&&(n=a)}),n}runAndExtendWithFaceDetection(){return new Promise(async t=>{let n=await this.run();t(n?Mo({},n):void 0)})}withFaceLandmarks(t=!1){return new Ld(this.runAndExtendWithFaceDetection(),this.input,t)}withFaceExpressions(){return new Xo(this.runAndExtendWithFaceDetection(),this.input)}withAgeAndGender(){return new Jo(this.runAndExtendWithFaceDetection(),this.input)}};function gce(e,t=new va){return new Bd(e,t)}function Ug(e,t=new va){return new Cp(e,t)}async function T$(e,t){return Ug(e,new va(t?{minConfidence:t}:{})).withFaceLandmarks().withFaceDescriptors()}async function yce(e,t={}){return Ug(e,new ar(t)).withFaceLandmarks().withFaceDescriptors()}var bce=T$;function Z1(e,t){if(e.length!==t.length)throw new Error("euclideanDistance: arr1.length !== arr2.length");let n=Array.from(e),a=Array.from(t);return Math.sqrt(n.map((r,s)=>r-a[s]).reduce((r,s)=>r+s**2,0))}var Wd=class{constructor(t,n=.6){this._distanceThreshold=n;let a=Array.isArray(t)?t:[t];if(!a.length)throw new Error("FaceRecognizer.constructor - expected atleast one input");let r=1,s=()=>`person ${r++}`;this._labeledDescriptors=a.map(i=>{if(i instanceof xr)return i;if(i instanceof Float32Array)return new xr(s(),[i]);if(i.descriptor&&i.descriptor instanceof Float32Array)return new xr(s(),[i.descriptor]);throw new Error("FaceRecognizer.constructor - expected inputs to be of type LabeledFaceDescriptors | WithFaceDescriptor | Float32Array | Array | Float32Array>")})}get labeledDescriptors(){return this._labeledDescriptors}get distanceThreshold(){return this._distanceThreshold}computeMeanDistance(t,n){return n.map(a=>Z1(a,t)).reduce((a,r)=>a+r,0)/(n.length||1)}matchDescriptor(t){return this.labeledDescriptors.map(({descriptors:n,label:a})=>new hp(a,this.computeMeanDistance(t,n))).reduce((n,a)=>n.distancet.toJSON())}}static fromJSON(t){let n=t.labeledDescriptors.map(a=>xr.fromJSON(a));return new Wd(n,t.distanceThreshold)}};function xce(e){let t=new qo;return t.extractWeights(e),t}function C$(e,t){let{width:n,height:a}=new yn(t.width,t.height);if(n<=0||a<=0)throw new Error(`resizeResults - invalid dimensions: ${JSON.stringify({width:n,height:a})}`);if(Array.isArray(e))return e.map(r=>C$(r,{width:n,height:a}));if(Bo(e)){let r=e.detection.forSize(n,a),s=e.unshiftedLandmarks.forSize(r.box.width,r.box.height);return Ip(Mo(e,r),s)}return vr(e)?Mo(e,e.detection.forSize(n,a)):e instanceof ra||e instanceof xt?e.forSize(n,a):e}var vce=qA;return TF(wce);})(); + ${r.shape}`);if(s.shape.length!==1)throw new Error(`Target shape should be a vector but received shape ${s.shape}`);let i=t.dataIdMap.get(a.dataId).id,o=t.dataIdMap.get(r.dataId).id,l=t.dataIdMap.get(s.dataId).id,u=a.shape[0],p=w.sizeFromShape(s.shape),d=t.makeOutput([u,p],a.dtype),c=t.dataIdMap.get(d.dataId).id,h=t.makeOutput([p],s.dtype),m=t.dataIdMap.get(h.dataId).id,f=t.makeOutput([3],"int32"),g=t.dataIdMap.get(f.dataId).id;AA(i,o,l,u,c,m,g);let y=t.readSync(f.dataId),b;switch(y[0]){case 0:{b=C.getSparseReshapeMultipleNegativeOneOutputDimErrorMessage(y[1],y[2]);break}case 1:{b=C.getSparseReshapeNegativeOutputDimErrorMessage(y[1],y[2]);break}case 2:b=C.getSparseReshapeEmptyTensorZeroOutputDimErrorMessage();break;case 3:{let x=Array.from(t.readSync(r.dataId)),v=Array.from(t.readSync(h.dataId));b=C.getSparseReshapeInputOutputMultipleErrorMessage(x,v);break}case 4:{let x=Array.from(t.readSync(r.dataId)),v=Array.from(t.readSync(h.dataId));b=C.getSparseReshapeInputOutputMismatchErrorMessage(x,v);break}default:b=""}if(t.disposeData(f.dataId),b)throw t.disposeData(d.dataId),t.disposeData(h.dataId),new Error(b);return[d,h]}var sue={kernelName:Lu,backendName:"wasm",setupFunc:aue,kernelFunc:rue},$A;function FA(e){$A=e.wasm.cwrap("SparseSegmentReduction",null,["number","number","number","number","number","number","number","number","number"])}function DA(e,t){let{backend:n,inputs:a}=e,{data:r,indices:s,segmentIds:i}=a,o=s.shape[0],l=n.readSync(i.dataId,o-1,o)[0],u=o>0?l+1:0;if(u<0)throw new Error(C.getSparseSegmentReductionNegativeSegmentIdsErrorMessage());let p=r.shape.slice();p[0]=u;let d=n.dataIdMap.get(r.dataId).id,c=n.dataIdMap.get(s.dataId).id,h=n.dataIdMap.get(i.dataId).id,m=n.makeOutput(p,r.dtype),f=n.dataIdMap.get(m.dataId).id,g=n.makeOutput([4],"int32"),y=n.dataIdMap.get(g.dataId).id;$A(d,$t[r.dtype],r.shape[0],c,h,f,y,t,0);let b=n.readSync(g.dataId),x;switch(b[0]){case 0:{x=C.getSparseSegmentReductionNegativeSegmentIdsErrorMessage();break}case 1:{x=C.getSparseSegmentReductionNonIncreasingSegmentIdsErrorMessage();break}case 2:x=C.getSparseSegmentReductionSegmentIdOutOfRangeErrorMessage(b[1],b[2]);break;case 3:x=C.getSparseSegmentReductionIndicesOutOfRangeErrorMessage(b[1],b[2],b[3]);break;default:x=""}if(n.disposeData(g.dataId),x)throw n.disposeData(m.dataId),new Error(x);return m}function iue(e){return DA(e,!0)}var oue={kernelName:Fc,backendName:"wasm",setupFunc:FA,kernelFunc:iue};function lue(e){return DA(e,!1)}var uue={kernelName:Dc,backendName:"wasm",setupFunc:FA,kernelFunc:lue};function pue(e){let{inputs:t,attrs:n,backend:a}=e,{x:r}=t,{numOrSizeSplits:s,axis:i}=n,o=w.parseAxisParam(i,r.shape)[0],l=C.prepareSplitSize(r,s,o),u=new Array(r.shape.length).fill(0),p=r.shape.slice();return l.map(d=>{let c=[...p];c[o]=d;let h=xi({inputs:{x:r},attrs:{begin:u,size:c},backend:a});return u[o]+=d,h})}var cue={kernelName:Ou,backendName:"wasm",kernelFunc:pue},due=rn(co),hue=rn(Rc),mue=!0,fue=dn(fo,mue),RA;function gue(e){RA=e.wasm.cwrap(vs,null,["number","number","number","number"])}function yue(e){let{backend:t,inputs:n,attrs:a}=e,{alpha:r}=a,{x:s}=n,i=t.dataIdMap.get(s.dataId).id,o=t.makeOutput(s.shape,s.dtype),l=t.dataIdMap.get(o.dataId).id;return RA(i,r,$t[s.dtype],l),o}var bue={kernelName:vs,backendName:"wasm",setupFunc:gue,kernelFunc:yue},MA;function xue(e){MA=e.wasm.cwrap(zu,null,["number","array","number","array","array","array","array","array","number","number"])}function vue(e){let{backend:t,inputs:n,attrs:a}=e,{x:r}=n,{begin:s,end:i,strides:o,beginMask:l,endMask:u,ellipsisMask:p,newAxisMask:d,shrinkAxisMask:c}=a,{finalShapeSparse:h,finalShape:m,isIdentity:f,sliceDim0:g,isSimpleSlice:y,begin:b,end:x,strides:v}=qt.sliceInfo(r.shape,s,i,o,l,u,p,d,c),I;if(f)I=Vn({inputs:{x:r},backend:t,attrs:{shape:m}});else if(g||y){w.assert(r.shape.length>=1,()=>`Input must have rank at least 1, got: ${r.shape.length}`);let T=qt.computeOutShape(b,x,v),_=xi({inputs:{x:r},backend:t,attrs:{begin:b,size:T}});I=Vn({inputs:{x:_},backend:t,attrs:{shape:m}}),t.disposeData(_.dataId)}else{let T=t.makeOutput(h,"float32"),_=t.dataIdMap.get(r.dataId).id,A=new Uint8Array(new Int32Array(w.computeStrides(r.shape)).buffer),F=new Uint8Array(new Int32Array(b).buffer),P=new Uint8Array(new Int32Array(x).buffer),$=new Uint8Array(new Int32Array(v).buffer),S=new Uint8Array(new Int32Array(h).buffer),M=new Uint8Array(new Int32Array(w.computeStrides(h)).buffer),U=t.dataIdMap.get(T.dataId).id;MA(_,A,r.shape.length,F,P,$,S,M,h.length,U),I=Vn({inputs:{x:T},backend:t,attrs:{shape:m}}),t.disposeData(T.dataId)}return I}var wue={kernelName:zu,backendName:"wasm",setupFunc:xue,kernelFunc:vue};function kue(e){let{backend:t,inputs:n,attrs:a}=e,{data:r,dataSplits:s}=n,{separator:i,nGramWidths:o,leftPad:l,rightPad:u,padWidth:p,preserveShortSequences:d}=a,c=t.readSync(r.dataId),h=t.readSync(s.dataId),[m,f]=Z0(c,h,i,o,l,u,p,d),g=t.makeOutput([m.length],"string"),y=t.dataIdMap.get(g.dataId);y.stringBytes=m;let b=t.makeOutput(s.shape,"int32");return t.typedArrayFromHeap(b).set(f),[g,b]}var Iue={kernelName:Mc,backendName:"wasm",kernelFunc:kue};function Sue(e){let{backend:t,inputs:n,attrs:a}=e,{input:r,delimiter:s}=n,{skipEmpty:i}=a,o=t.readSync(r.dataId),l=t.readSync(s.dataId),[u,p,d]=Q0(o,l[0],i),c=p.length,h=t.makeOutput([c,2],"int32");t.typedArrayFromHeap(h).set(u);let m=t.makeOutput([c],"string"),f=t.dataIdMap.get(m.dataId);f.stringBytes=p;let g=t.makeOutput([2],"int32");return t.typedArrayFromHeap(g).set(d),[h,m,g]}var Nue={kernelName:Pc,backendName:"wasm",kernelFunc:Sue};function Tue(e){let{backend:t,inputs:n,attrs:a}=e,{input:r}=n,{numBuckets:s}=a,i=t.readSync(r.dataId),o=e1(i,s),l=t.makeOutput(r.shape,"int32");return t.typedArrayFromHeap(l).set(o),l}var Cue={kernelName:Oc,backendName:"wasm",kernelFunc:Tue},_ue=!0,Eue=dn(go,_ue),PA;function Aue(e){PA=e.wasm.cwrap(ho,null,["number","number","number","number"])}function $ue(e){let{backend:t,inputs:n,attrs:a}=e,{axis:r,keepDims:s}=a,{x:i}=n,o=t.dataIdMap.get(i.dataId).id,l=o,u=i,{transposed:p,axes:d,originalAxes:c,inputWasTransposed:h}=$s(i,r,t),m=d;if(h){let x=t.dataIdMap.get(p.dataId).id;x!==o&&(u=p,l=x,m=C.getInnerMostAxes(m.length,u.shape.length))}C.assertAxesAreInnerMostDims("sum",m,u.shape.length);let[f,g]=C.computeOutAndReduceShapes(u.shape,m),y=w.sizeFromShape(g),b=t.makeOutput(f,u.dtype);if(w.sizeFromShape(u.shape)!==0){let x=t.dataIdMap.get(b.dataId).id;PA(l,y,$t[b.dtype],x)}if(h&&t.disposeData(p.dataId),s){let x=C.expandShapeToKeepDim(b.shape,c);b.shape=x}return b}var Fue={kernelName:ho,backendName:"wasm",setupFunc:Aue,kernelFunc:$ue},Due=rn(yo),Rue=rn(bo),OA;function Mue(e){OA=e.wasm.cwrap(xs,null,["number","array","number","array","number","number"])}function Pue(e){let{inputs:t,backend:n,attrs:a}=e,{x:r}=t,s=n.dataIdMap.get(r.dataId).id,{reps:i}=a,o=new Array(r.shape.length);for(let c=0;c{let{x:a}=e,{k:r,sorted:s}=n,i=t.dataIdMap.get(a.dataId).id,o=new Uint8Array(new Int32Array(a.shape).buffer),l=a.shape.slice();l[l.length-1]=r;let u=t.makeOutput(l,a.dtype),p=t.dataIdMap.get(u.dataId).id,d=t.makeOutput(l,"int32"),c=t.dataIdMap.get(d.dataId).id;return LA(i,o,a.shape.length,$t[a.dtype],r,s,p,c),[u,d]},Bue={kernelName:Bu,backendName:"wasm",setupFunc:Lue,kernelFunc:zue},zA;function Wue(e){zA=e.wasm.cwrap(Wu,null,["number","number","bool","number","number","number","number","number","number","array","number","number","number","number","number"])}function Vue(e){let{backend:t,inputs:n,attrs:a}=e,{image:r,transforms:s}=n,{interpolation:i,fillMode:o,fillValue:l,outputShape:u}=a,[p,d,c,h]=r.shape,[m,f]=u!=null?u:[d,c],g=[p,m,f,h],y=new Uint8Array(new Int32Array(w.computeStrides(r.shape)).buffer),b=t.makeOutput(g,r.dtype),x=t.dataIdMap.get(b.dataId).id,v=t.dataIdMap.get(r.dataId).id,I=t.dataIdMap.get(s.dataId).id,T=i==="nearest"?1:2,_;switch(o){case"constant":_=1;break;case"reflect":_=2;break;case"wrap":_=3;break;case"nearest":_=4;break;default:_=1;break}return zA(v,I,s.shape[0]>1,p,m,f,h,c,d,y,r.shape.length-1,T,_,l,x),b}var Uue={kernelName:Wu,backendName:"wasm",setupFunc:Wue,kernelFunc:Vue};function Gue(e){let{inputs:t,backend:n,attrs:a}=e,{value:r}=t,{axis:s}=a;s<0&&(s+=r.shape.length);let i=r.shape[s],o=r.shape.length,l=new Array(o-1),u=0;for(let h=0;h({dataId:h,dtype:m,shape:l}))}var Hue={kernelName:Vu,backendName:"wasm",kernelFunc:Gue};function jue(e){let{inputs:{x:t},backend:n}=e,a=n.makeOutput(t.shape,t.dtype);return n.typedArrayFromHeap(a).fill(0),a}var que={kernelName:Uu,backendName:"wasm",kernelFunc:jue},Kue=[kse,Ise,Nse,_se,Pse,zse,Vse,Hse,Xse,tie,nie,aie,iie,oie,pie,hie,mie,fie,bie,wie,Sie,Cie,Aie,$ie,Die,Rie,Mie,Pie,zie,Bie,Vie,Hie,Kie,Jie,eoe,aoe,soe,ooe,Ese,poe,doe,moe,foe,yoe,boe,voe,koe,Noe,Coe,Aoe,Doe,Poe,Loe,Woe,Uoe,Goe,qoe,Yoe,Qoe,tle,rle,ile,lle,bA,dle,fle,ble,vle,kle,Ile,Sle,jse,Cle,Ale,Dle,Ple,Ole,Lle,Wle,Gle,qle,Kle,Qse,Jle,Qle,nue,sue,oue,uue,cue,due,hue,fue,bue,wue,Iue,Nue,Cue,Eue,Fue,Due,Rue,Oue,Bue,Uue,Dse,Hue,que];for(let e of Kue)zc(e);var Ox=X();Ox.registerFlag("WASM_HAS_SIMD_SUPPORT",async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,9,1,7,0,65,0,253,15,26,11])));Ox.registerFlag("WASM_HAS_MULTITHREAD_SUPPORT",async()=>{if(Ox.get("IS_NODE"))return!1;try{return new MessageChannel().port1.postMessage(new SharedArrayBuffer(1)),WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,5,4,1,3,1,1,10,11,1,9,0,65,0,254,16,2,0,26,11]))}catch(e){return!1}});var UI=fs(qF()),Xue=fs(KF()),GI=fs(XF()),HI=UI.default||UI,Yue=GI.default||GI,BA=class extends wc{constructor(e){super(),this.wasm=e,this.dataIdNextNumber=1,this.wasm.tfjs.initWithThreadsCount(WA),Lx=this.wasm.tfjs.getThreadsCount(),this.dataIdMap=new Nm(this,sr())}write(e,t,n){let a={id:this.dataIdNextNumber++};return this.move(a,e,t,n,1),a}numDataIds(){return this.dataIdMap.numDataIds()}async time(e){let t=w.now();return e(),{kernelMs:w.now()-t}}move(e,t,n,a,r){let s=this.dataIdNextNumber++;if(a==="string"){let u=t;this.dataIdMap.set(e,{id:s,stringBytes:u,shape:n,dtype:a,memoryOffset:null,refCount:r});return}let i=w.sizeFromShape(n),o=i*w.bytesPerElement(a),l=this.wasm._malloc(o);this.dataIdMap.set(e,{id:s,memoryOffset:l,shape:n,dtype:a,refCount:r}),this.wasm.tfjs.registerTensor(s,i,l),t!=null&&this.wasm.HEAPU8.set(new Uint8Array(t.buffer,t.byteOffset,o),l)}async read(e){return this.readSync(e)}readSync(e,t,n){let{memoryOffset:a,dtype:r,shape:s,stringBytes:i}=this.dataIdMap.get(e);if(r==="string")return(t==null||t===0)&&(n==null||n>=i.length)?i:i.slice(t,n);t=t||0,n=n||w.sizeFromShape(s);let o=w.bytesPerElement(r),l=this.wasm.HEAPU8.slice(a+t*o,a+n*o);return Que(l.buffer,r)}disposeData(e,t=!1){if(this.dataIdMap.has(e)){let n=this.dataIdMap.get(e);if(n.refCount--,!t&&n.refCount>0)return!1;this.wasm._free(n.memoryOffset),this.wasm.tfjs.disposeData(n.id),this.dataIdMap.delete(e)}return!0}refCount(e){return this.dataIdMap.has(e)?this.dataIdMap.get(e).refCount:0}incRef(e){let t=this.dataIdMap.get(e);t!=null&&t.refCount++}floatPrecision(){return 32}getMemoryOffset(e){return this.dataIdMap.get(e).memoryOffset}dispose(){this.wasm.tfjs.dispose(),"PThread"in this.wasm&&this.wasm.PThread.terminateAllThreads(),this.wasm=null}memory(){return{unreliable:!1}}makeOutput(e,t,n){let a;if(n==null)a=this.write(null,e,t);else{let r=this.dataIdNextNumber++;a={id:r},this.dataIdMap.set(a,{id:r,memoryOffset:n,shape:e,dtype:t,refCount:1});let s=w.sizeFromShape(e);this.wasm.tfjs.registerTensor(r,s,n)}return{dataId:a,shape:e,dtype:t}}typedArrayFromHeap({shape:e,dtype:t,dataId:n}){let a=this.wasm.HEAPU8.buffer,{memoryOffset:r}=this.dataIdMap.get(n),s=w.sizeFromShape(e);switch(t){case"float32":return new Float32Array(a,r,s);case"int32":return new Int32Array(a,r,s);case"bool":return new Uint8Array(a,r,s);default:throw new Error(`Unknown dtype ${t}`)}}};function Jue(e){return(t,n)=>(w.fetch(e,{credentials:"same-origin"}).then(a=>{a.ok||t.env.a(`failed to load wasm binary file at '${e}'`),a.arrayBuffer().then(r=>{WebAssembly.instantiate(r,t).then(s=>{n(s.instance,s.module)})})}),{})}function jI(e,t,n){if(Im!=null)return Im;let a="tfjs-backend-wasm.wasm";return e&&t?a="tfjs-backend-wasm-threaded-simd.wasm":e&&(a="tfjs-backend-wasm-simd.wasm"),ac!=null&&ac[a]!=null?ac[a]:n+a}async function Zue(){let[e,t]=await Promise.all([X().getAsync("WASM_HAS_SIMD_SUPPORT"),X().getAsync("WASM_HAS_MULTITHREAD_SUPPORT")]);return new Promise((n,a)=>{let r={};r.locateFile=(o,l)=>{if(o.endsWith(".worker.js")){let u=Xue.wasmWorkerContents.replace(/\n/g,"\\n"),p=new Blob([u],{type:"application/javascript"});return URL.createObjectURL(p)}return o.endsWith(".wasm")?jI(e,t,ec!=null?ec:l):l+o},x1&&(r.instantiateWasm=Jue(jI(e,t,ec!=null?ec:"")));let s=!1;r.onAbort=()=>{s||rc||(rc=!0,a({message:"Make sure the server can serve the `.wasm` file relative to the bundled js file. For more details see https://github.com/tensorflow/tfjs/blob/master/tfjs-backend-wasm/README.md#using-bundlers"}))};let i;t&&e&&Im==null?(r.mainScriptUrlOrBlob=new Blob(["var WasmBackendModuleThreadedSimd = "+HI.toString()],{type:"text/javascript"}),i=HI(r)):i=Yue(r),i.then(o=>{s=!0,rc=!1;let l=null;o.tfjs={init:o.cwrap("init",null,[]),initWithThreadsCount:o.cwrap("init_with_threads_count",null,["number"]),getThreadsCount:o.cwrap("get_threads_count","number",[]),registerTensor:o.cwrap("register_tensor",null,["number","number","number"]),disposeData:o.cwrap("dispose_data",l,["number"]),dispose:o.cwrap("dispose",l,[])},n({wasm:o})}).catch(a)})}function Que(e,t){switch(t){case"float32":return new Float32Array(e);case"int32":return new Int32Array(e);case"bool":return new Uint8Array(e);default:throw new Error(`Unknown dtype ${t}`)}}var epe=["tfjs-backend-wasm.wasm","tfjs-backend-wasm-simd.wasm","tfjs-backend-wasm-threaded-simd.wasm"],Im=null,ec=null,ac={},rc=!1,x1=!1;function tpe(e,t=!1){if(tv("setWasmPath has been deprecated in favor of setWasmPaths and will be removed in a future release."),rc)throw new Error("The WASM backend was already initialized. Make sure you call `setWasmPath()` before you call `tf.setBackend()` or `tf.ready()`");Im=e,x1=t}function npe(e,t=!1){if(rc)throw new Error("The WASM backend was already initialized. Make sure you call `setWasmPaths()` before you call `tf.setBackend()` or `tf.ready()`");if(typeof e=="string")ec=e;else{ac=e;let n=epe.filter(a=>ac[a]==null);if(n.length>0)throw new Error(`There were no entries found for the following binaries: ${n.join(",")}. Please either call setWasmPaths with a map providing a path for each binary, or with a string indicating the directory where all the binaries can be found.`)}x1=t}var WA=-1,Lx=-1;function ape(e){WA=e}function rpe(){if(Lx===-1)throw new Error("WASM backend not initialized.");return Lx}var spe="3.19.0",ipe=2;sf("wasm",async()=>{let{wasm:e}=await Zue();return new BA(e)},ipe);var ope="3.19.0",lpe="3.19.0",upe="3.19.0",ppe="3.19.0",cpe="3.19.0",dpe="3.19.0",hpe="3.19.0",mpe="3.19.0",fpe={tfjs:ope,"tfjs-core":lpe,"tfjs-data":upe,"tfjs-layers":ppe,"tfjs-converter":cpe,"tfjs-backend-cpu":dpe,"tfjs-backend-webgl":hpe,"tfjs-backend-wasm":mpe};var G1={};Ih(G1,{AnchorPosition:()=>M1,DrawBox:()=>Sd,DrawBoxOptions:()=>wg,DrawFaceLandmarks:()=>Fg,DrawFaceLandmarksOptions:()=>$g,DrawTextField:()=>zr,DrawTextFieldOptions:()=>fp,drawContour:()=>Pr,drawDetections:()=>Spe,drawFaceExpressions:()=>Epe,drawFaceLandmarks:()=>$pe});function Pr(e,t,n=!1){if(e.beginPath(),t.slice(1).forEach(({x:a,y:r},s)=>{let i=t[s];e.moveTo(i.x,i.y),e.lineTo(a,r)}),n){let a=t[t.length-1],r=t[0];if(!a||!r)return;e.moveTo(a.x,a.y),e.lineTo(r.x,r.y)}e.stroke()}var I1={};Ih(I1,{computeReshapedDimensions:()=>k1,getCenterPoint:()=>$o,isDimensions:()=>xg,isEven:()=>bg,isFloat:()=>w1,isTensor:()=>Eo,isTensor1D:()=>gpe,isTensor2D:()=>v1,isTensor3D:()=>Or,isTensor4D:()=>xa,isValidNumber:()=>er,isValidProbablitiy:()=>dp,range:()=>br,round:()=>Ao});var yn=class{constructor(t,n){if(!er(t)||!er(n))throw new Error(`Dimensions.constructor - expected width and height to be valid numbers, instead have ${JSON.stringify({width:t,height:n})}`);this._width=t,this._height=n}get width(){return this._width}get height(){return this._height}reverse(){return new yn(1/this.width,1/this.height)}};function Eo(e,t){return e instanceof Ae&&e.shape.length===t}function gpe(e){return Eo(e,1)}function v1(e){return Eo(e,2)}function Or(e){return Eo(e,3)}function xa(e){return Eo(e,4)}function w1(e){return e%1!==0}function bg(e){return e%2===0}function Ao(e,t=2){let n=10**t;return Math.floor(e*n)/n}function xg(e){return e&&e.width&&e.height}function k1({width:e,height:t},n){let a=n/Math.max(t,e);return new yn(Math.round(e*a),Math.round(t*a))}function $o(e){return e.reduce((t,n)=>t.add(n),new Pe(0,0)).div(new Pe(e.length,e.length))}function br(e,t,n){return Array(e).fill(0).map((a,r)=>t+r*n)}function er(e){return!!e&&e!==1/0&&e!==-1/0&&!Number.isNaN(e)||e===0}function dp(e){return er(e)&&e>=0&&e<=1}var Pe=class{constructor(t,n){this._x=t,this._y=n}get x(){return this._x}get y(){return this._y}add(t){return new Pe(this.x+t.x,this.y+t.y)}sub(t){return new Pe(this.x-t.x,this.y-t.y)}mul(t){return new Pe(this.x*t.x,this.y*t.y)}div(t){return new Pe(this.x/t.x,this.y/t.y)}abs(){return new Pe(Math.abs(this.x),Math.abs(this.y))}magnitude(){return Math.sqrt(this.x**2+this.y**2)}floor(){return new Pe(Math.floor(this.x),Math.floor(this.y))}};var lt=class{static isRect(t){return!!t&&[t.x,t.y,t.width,t.height].every(er)}static assertIsValidBox(t,n,a=!1){if(!lt.isRect(t))throw new Error(`${n} - invalid box: ${JSON.stringify(t)}, expected object with properties x, y, width, height`);if(!a&&(t.width<0||t.height<0))throw new Error(`${n} - width (${t.width}) and height (${t.height}) must be positive numbers`)}constructor(t,n=!0){let a=t||{},r=[a.left,a.top,a.right,a.bottom].every(er),s=[a.x,a.y,a.width,a.height].every(er);if(!s&&!r)throw new Error(`Box.constructor - expected box to be IBoundingBox | IRect, instead have ${JSON.stringify(a)}`);let[i,o,l,u]=s?[a.x,a.y,a.width,a.height]:[a.left,a.top,a.right-a.left,a.bottom-a.top];lt.assertIsValidBox({x:i,y:o,width:l,height:u},"Box.constructor",n),this._x=i,this._y=o,this._width=l,this._height=u}get x(){return this._x}get y(){return this._y}get width(){return this._width}get height(){return this._height}get left(){return this.x}get top(){return this.y}get right(){return this.x+this.width}get bottom(){return this.y+this.height}get area(){return this.width*this.height}get topLeft(){return new Pe(this.left,this.top)}get topRight(){return new Pe(this.right,this.top)}get bottomLeft(){return new Pe(this.left,this.bottom)}get bottomRight(){return new Pe(this.right,this.bottom)}round(){let[t,n,a,r]=[this.x,this.y,this.width,this.height].map(s=>Math.round(s));return new lt({x:t,y:n,width:a,height:r})}floor(){let[t,n,a,r]=[this.x,this.y,this.width,this.height].map(s=>Math.floor(s));return new lt({x:t,y:n,width:a,height:r})}toSquare(){let{x:t,y:n,width:a,height:r}=this,s=Math.abs(a-r);return an&&(o=-d+n+a,d=n),c>t&&(l=-c+t+r,c=t),u<1&&(l=2-u,u=1),p<1&&(l=2-p,p=1),{dy:i,edy:l,dx:s,edx:o,y:p,ey:c,x:u,ex:d,w:a,h:r}}calibrate(t){return new lt({left:this.left+t.left*this.width,top:this.top+t.top*this.height,right:this.right+t.right*this.width,bottom:this.bottom+t.bottom*this.height}).toSquare().round()}};var Fo=class extends lt{constructor(t,n,a,r,s=!1){super({left:t,top:n,right:a,bottom:r},s)}};var Lr=class{constructor(t,n,a,r,s){this._imageDims=new yn(s.width,s.height),this._score=t,this._classScore=n,this._className=a,this._box=new lt(r).rescale(this._imageDims)}get score(){return this._score}get classScore(){return this._classScore}get className(){return this._className}get box(){return this._box}get imageDims(){return this._imageDims}get imageWidth(){return this.imageDims.width}get imageHeight(){return this.imageDims.height}get relativeBox(){return new lt(this._box).rescale(this.imageDims.reverse())}forSize(t,n){return new Lr(this.score,this.classScore,this.className,this.relativeBox,{width:t,height:n})}};var xt=class extends Lr{constructor(t,n,a){super(t,t,"",n,a)}forSize(t,n){let{score:a,relativeBox:r,imageDims:s}=super.forSize(t,n);return new xt(a,r,s)}};function S1(e,t,n=!0){let a=Math.max(0,Math.min(e.right,t.right)-Math.max(e.left,t.left)),r=Math.max(0,Math.min(e.bottom,t.bottom)-Math.max(e.top,t.top)),s=a*r;return n?s/(e.area+t.area-s):s/Math.min(e.area,t.area)}function N1(e){let t=e.map(o=>o.x),n=e.map(o=>o.y),a=t.reduce((o,l)=>lloo({score:i,boxIndex:o})).sort((i,o)=>i.score-o.score).map(i=>i.boxIndex),s=[];for(;r.length>0;){let i=r.pop();s.push(i);let o=r,l=[];for(let u=0;ul[p]<=n)}return s}function tr(e,t){return O(()=>{let[n,a,r]=t,s=An([...e.shape.slice(0,3),1],n,"float32"),i=An([...e.shape.slice(0,3),1],a,"float32"),o=An([...e.shape.slice(0,3),1],r,"float32"),l=Qe([s,i,o],3);return ce(e,l)})}function C1(e,t=!1){return O(()=>{let[n,a]=e.shape.slice(1);if(n===a)return e;let r=Math.abs(n-a),s=Math.round(r*(t?.5:1)),i=n>a?2:1,o=c=>{let h=e.shape.slice();return h[i]=c,An(h,0,"float32")},l=o(s),u=r-l.shape[i],d=[t&&u?o(u):null,e,l].filter(c=>!!c).map(c=>le(c,"float32"));return Qe(d,i)})}function ype(e){let t=e.slice();for(let n=t.length-1;n>0;n--){let a=Math.floor(Math.random()*(n+1)),r=t[n];t[n]=t[a],t[a]=r}return t}function kd(e){return 1/(1+Math.exp(-e))}function bpe(e){return Math.log(e/(1-e))}var Do=class extends lt{constructor(t,n,a,r,s=!1){super({x:t,y:n,width:a,height:r},s)}};var xpe=.5,vpe=.43,wpe=.45,ra=class{constructor(t,n,a=new Pe(0,0)){let{width:r,height:s}=n;this._imgDims=new yn(r,s),this._shift=a,this._positions=t.map(i=>i.mul(new Pe(r,s)).add(a))}get shift(){return new Pe(this._shift.x,this._shift.y)}get imageWidth(){return this._imgDims.width}get imageHeight(){return this._imgDims.height}get positions(){return this._positions}get relativePositions(){return this._positions.map(t=>t.sub(this._shift).div(new Pe(this.imageWidth,this.imageHeight)))}forSize(t,n){return new this.constructor(this.relativePositions,{width:t,height:n})}shiftBy(t,n){return new this.constructor(this.relativePositions,this._imgDims,new Pe(t,n))}shiftByPoint(t){return this.shiftBy(t.x,t.y)}align(t,n={}){if(t){let s=t instanceof xt?t.box.floor():new lt(t);return this.shiftBy(s.x,s.y).align(null,n)}let{useDlibAlignment:a,minBoxPadding:r}={useDlibAlignment:!1,minBoxPadding:.2,...n};return a?this.alignDlib():this.alignMinBbox(r)}alignDlib(){let t=this.getRefPointsForAlignment(),[n,a,r]=t,s=d=>r.sub(d).magnitude(),i=(s(n)+s(a))/2,o=Math.floor(i/wpe),l=$o(t),u=Math.floor(Math.max(0,l.x-xpe*o)),p=Math.floor(Math.max(0,l.y-vpe*o));return new Do(u,p,Math.min(o,this.imageWidth+u),Math.min(o,this.imageHeight+p))}alignMinBbox(t){let n=N1(this.positions);return n.pad(n.width*t,n.height*t)}getRefPointsForAlignment(){throw new Error("getRefPointsForAlignment not implemented by base class")}};var _1=class extends ra{getRefPointsForAlignment(){let t=this.positions;return[t[0],t[1],$o([t[3],t[4]])]}};var Ro=class extends ra{getJawOutline(){return this.positions.slice(0,17)}getLeftEyeBrow(){return this.positions.slice(17,22)}getRightEyeBrow(){return this.positions.slice(22,27)}getNose(){return this.positions.slice(27,36)}getLeftEye(){return this.positions.slice(36,42)}getRightEye(){return this.positions.slice(42,48)}getMouth(){return this.positions.slice(48,68)}getRefPointsForAlignment(){return[this.getLeftEye(),this.getRightEye(),this.getMouth()].map($o)}};var hp=class{constructor(t,n){this._label=t,this._distance=n}get label(){return this._label}get distance(){return this._distance}toString(t=!0){return`${this.label}${t?` (${Ao(this.distance)})`:""}`}};var mp=class extends lt{constructor(n,a){super(n);this._label=a}static assertIsValidLabeledBox(n,a){if(lt.assertIsValidBox(n,a),!er(n.label))throw new Error(`${a} - expected property label (${n.label}) to be a number`)}get label(){return this._label}};var xr=class{constructor(t,n){if(typeof t!="string")throw new Error("LabeledFaceDescriptors - constructor expected label to be a string");if(!Array.isArray(n)||n.some(a=>!(a instanceof Float32Array)))throw new Error("LabeledFaceDescriptors - constructor expected descriptors to be an array of Float32Array");this._label=t,this._descriptors=n}get label(){return this._label}get descriptors(){return this._descriptors}toJSON(){return{label:this.label,descriptors:this.descriptors.map(t=>Array.from(t))}}static fromJSON(t){let n=t.descriptors.map(a=>new Float32Array(a));return new xr(t.label,n)}};var E1=class extends mp{constructor(n,a,r,s){super(n,a);this._score=r,this._classScore=s}static assertIsValidPredictedBox(n,a){if(mp.assertIsValidLabeledBox(n,a),!dp(n.score)||!dp(n.classScore))throw new Error(`${a} - expected properties score (${n.score}) and (${n.classScore}) to be a number between [0, 1]`)}get score(){return this._score}get classScore(){return this._classScore}};function vr(e){return e.detection instanceof xt}function Mo(e,t){return{...e,...{detection:t}}}function A1(){let e=window.fetch;if(!e)throw new Error("fetch - missing fetch implementation for browser environment");return{Canvas:HTMLCanvasElement,CanvasRenderingContext2D,Image:HTMLImageElement,ImageData,Video:HTMLVideoElement,createCanvasElement:()=>document.createElement("canvas"),createImageElement:()=>document.createElement("img"),createVideoElement:()=>document.createElement("video"),fetch:e,readFile:()=>{throw new Error("readFile - filesystem not available for browser environment")}}}function Id(){return typeof global=="object"&&typeof process!="undefined"&&process.versions!=null&&process.versions.node!=null}function vg(e){let t="";if(!e&&Id())try{e=SF("fs")}catch(a){t=a.toString()}return{readFile:e?a=>new Promise((r,s)=>{e.readFile(a,(i,o)=>i?s(i):r(o))}):()=>{throw new Error(`readFile - failed to require fs in nodejs environment with error: ${t}`)}}}function $1(){let e=global.Canvas||global.HTMLCanvasElement,t=global.Image||global.HTMLImageElement,n=global.Video||global.HTMLVideoElement,a=()=>{if(e)return new e;throw new Error("createCanvasElement - missing Canvas implementation for nodejs environment")},r=()=>{if(t)return new t;throw new Error("createImageElement - missing Image implementation for nodejs environment")},s=()=>{if(n)return new n;throw new Error("createVideoElement - missing Video implementation for nodejs environment")},i=global.fetch,o=vg();return{Canvas:e||class{},CanvasRenderingContext2D:global.CanvasRenderingContext2D||class{},Image:t||class{},ImageData:global.ImageData||class{},Video:global.HTMLVideoElement||class{},createCanvasElement:a,createImageElement:r,createVideoElement:s,fetch:i,...o}}function F1(){return typeof window=="object"&&typeof document!="undefined"&&typeof HTMLImageElement!="undefined"&&typeof HTMLCanvasElement!="undefined"&&typeof HTMLVideoElement!="undefined"&&typeof ImageData!="undefined"&&typeof CanvasRenderingContext2D!="undefined"}var sn;function kpe(){if(!sn)throw new Error("getEnv - environment is not defined, check isNodejs() and isBrowser()");return sn}function D1(e){sn=e}function R1(){return F1()?D1(A1()):Id()?D1($1()):null}function Ipe(e){if(sn||R1(),!sn)throw new Error("monkeyPatch - environment is not defined, check isNodejs() and isBrowser()");let{Canvas:t=sn.Canvas,Image:n=sn.Image}=e;sn.Canvas=t,sn.Image=n,sn.createCanvasElement=e.createCanvasElement||(()=>new t),sn.createImageElement=e.createImageElement||(()=>new n),sn.ImageData=e.ImageData||sn.ImageData,sn.Video=e.Video||sn.Video,sn.fetch=e.fetch||sn.fetch,sn.readFile=e.readFile||sn.readFile}var et={getEnv:kpe,setEnv:D1,initialize:R1,createBrowserEnv:A1,createFileSystem:vg,createNodejsEnv:$1,monkeyPatch:Ipe,isBrowser:F1,isNodejs:Id};R1();function Po(e){return!et.isNodejs()&&typeof e=="string"?document.getElementById(e):e}function Kn(e){let{Canvas:t,CanvasRenderingContext2D:n}=et.getEnv();if(e instanceof n)return e;let a=Po(e);if(!(a instanceof t))throw new Error("resolveContext2d - expected canvas to be of instance of Canvas");let r=a.getContext("2d");if(!r)throw new Error("resolveContext2d - canvas 2d context is null");return r}var M1=(r=>(r.TOP_LEFT="TOP_LEFT",r.TOP_RIGHT="TOP_RIGHT",r.BOTTOM_LEFT="BOTTOM_LEFT",r.BOTTOM_RIGHT="BOTTOM_RIGHT",r))(M1||{}),fp=class{constructor(t={}){let{anchorPosition:n,backgroundColor:a,fontColor:r,fontSize:s,fontStyle:i,padding:o}=t;this.anchorPosition=n||"TOP_LEFT",this.backgroundColor=a||"rgba(0, 0, 0, 0.5)",this.fontColor=r||"rgba(255, 255, 255, 1)",this.fontSize=s||14,this.fontStyle=i||"Georgia",this.padding=o||4}},zr=class{constructor(t,n,a={}){this.text=typeof t=="string"?[t]:t instanceof zr?t.text:t,this.anchor=n,this.options=new fp(a)}measureWidth(t){let{padding:n}=this.options;return this.text.map(a=>t.measureText(a).width).reduce((a,r)=>a{let m=l+d.x,f=l+d.y+(h+1)*i;a.fillText(c,m,f)})}};var wg=class{constructor(t={}){let{boxColor:n,lineWidth:a,label:r,drawLabelOptions:s}=t;this.boxColor=n||"rgba(0, 0, 255, 1)",this.lineWidth=a||2,this.label=r;let i={anchorPosition:"BOTTOM_LEFT",backgroundColor:this.boxColor};this.drawLabelOptions=new fp({...i,...s})}},Sd=class{constructor(t,n={}){this.box=new lt(t),this.options=new wg(n)}draw(t){let n=Kn(t),{boxColor:a,lineWidth:r}=this.options,{x:s,y:i,width:o,height:l}=this.box;n.strokeStyle=a,n.lineWidth=r,n.strokeRect(s,i,o,l);let{label:u}=this.options;u&&new zr([u],{x:s-r/2,y:i},this.options.drawLabelOptions).draw(t)}};function Spe(e,t){(Array.isArray(t)?t:[t]).forEach(a=>{let r=a instanceof xt?a.score:vr(a)?a.detection.score:void 0,s=a instanceof xt?a.box:vr(a)?a.detection.box:new lt(a),i=r?`${Ao(r)}`:void 0;new Sd(s,{label:i}).draw(e)})}function Nd(e){let{Image:t,Video:n}=et.getEnv();return e instanceof t&&e.complete||e instanceof n&&e.readyState>=3}function P1(e){return new Promise((t,n)=>{(e instanceof et.getEnv().Canvas||Nd(e))&&t(null);function a(s){!s.currentTarget||(s.currentTarget.removeEventListener("load",r),s.currentTarget.removeEventListener("error",a),n(s))}function r(s){!s.currentTarget||(s.currentTarget.removeEventListener("load",r),s.currentTarget.removeEventListener("error",a),t(s))}e.addEventListener("load",r),e.addEventListener("error",a)})}function O1(e){return new Promise((t,n)=>{e instanceof Blob||n(new Error("bufferToImage - expected buf to be of type: Blob"));let a=new FileReader;a.onload=()=>{typeof a.result!="string"&&n(new Error("bufferToImage - expected reader.result to be a string, in onload"));let r=et.getEnv().createImageElement();r.onload=()=>t(r),r.onerror=n,r.src=a.result},a.onerror=n,a.readAsDataURL(e)})}function Oo(e){let{Image:t,Video:n}=et.getEnv();return e instanceof t?new yn(e.naturalWidth,e.naturalHeight):e instanceof n?new yn(e.videoWidth,e.videoHeight):new yn(e.width,e.height)}function Lo({width:e,height:t}){let{createCanvasElement:n}=et.getEnv(),a=n();return a.width=e,a.height=t,a}function Td(e,t){let{ImageData:n}=et.getEnv();if(!(e instanceof n)&&!Nd(e))throw new Error("createCanvasFromMedia - media has not finished loading yet");let{width:a,height:r}=t||Oo(e),s=Lo({width:a,height:r});return e instanceof n?Kn(s).putImageData(e,0,0):Kn(s).drawImage(e,0,0,a,r),s}async function L1(e,t){let n=t||et.getEnv().createCanvasElement(),[a,r,s]=e.shape.slice(xa(e)?1:0),i=O(()=>e.as3D(a,r,s).toInt());return await xo.toPixels(i,n),i.dispose(),n}function kg(e){let{Image:t,Canvas:n,Video:a}=et.getEnv();return e instanceof t||e instanceof n||e instanceof a}function z1(e,t,n=!1){let{Image:a,Canvas:r}=et.getEnv();if(!(e instanceof a||e instanceof r))throw new Error("imageToSquare - expected arg0 to be HTMLImageElement | HTMLCanvasElement");if(t<=0)return Lo({width:1,height:1});let s=Oo(e),i=t/Math.max(s.height,s.width),o=i*s.width,l=i*s.height,u=Lo({width:t,height:t}),p=e instanceof r?e:Td(e),d=Math.abs(o-l)/2,c=n&&o0&&p.height>0&&Kn(u).drawImage(p,c,h,o,l),u}var wr=class{constructor(t,n=!1){this._imageTensors=[];this._canvases=[];this._treatAsBatchInput=!1;this._inputDimensions=[];this._inputSize=0;if(!Array.isArray(t))throw new Error(`NetInput.constructor - expected inputs to be an Array of TResolvedNetInput or to be instanceof tf.Tensor4D, instead have ${t}`);this._treatAsBatchInput=n,this._batchSize=t.length,t.forEach((a,r)=>{if(Or(a)){this._imageTensors[r]=a,this._inputDimensions[r]=a.shape;return}if(xa(a)){let i=a.shape[0];if(i!==1)throw new Error(`NetInput - tf.Tensor4D with batchSize ${i} passed, but not supported in input array`);this._imageTensors[r]=a,this._inputDimensions[r]=a.shape.slice(1);return}let s=a instanceof et.getEnv().Canvas?a:Td(a);this._canvases[r]=s,this._inputDimensions[r]=[s.height,s.width,3]})}get imageTensors(){return this._imageTensors}get canvases(){return this._canvases}get isBatchInput(){return this.batchSize>1||this._treatAsBatchInput}get batchSize(){return this._batchSize}get inputDimensions(){return this._inputDimensions}get inputSize(){return this._inputSize}get reshapedInputDimensions(){return br(this.batchSize,0,1).map((t,n)=>this.getReshapedInputDimensions(n))}getInput(t){return this.canvases[t]||this.imageTensors[t]}getInputDimensions(t){return this._inputDimensions[t]}getInputHeight(t){return this._inputDimensions[t][0]}getInputWidth(t){return this._inputDimensions[t][1]}getReshapedInputDimensions(t){if(typeof this.inputSize!="number")throw new Error("getReshapedInputDimensions - inputSize not set, toBatchTensor has not been called yet");let n=this.getInputWidth(t),a=this.getInputHeight(t);return k1({width:n,height:a},this.inputSize)}toBatchTensor(t,n=!0){return this._inputSize=t,O(()=>{let a=br(this.batchSize,0,1).map(s=>{let i=this.getInput(s);if(i instanceof Ae){let o=xa(i)?i:mn(i);return o=C1(o,n),(o.shape[1]!==t||o.shape[2]!==t)&&(o=Cr.resizeBilinear(o,[t,t],!1,!1)),o.as3D(t,t,3)}if(i instanceof et.getEnv().Canvas)return xo.fromPixels(z1(i,t,n));throw new Error(`toBatchTensor - at batchIdx ${s}, expected input to be instanceof tf.Tensor or instanceof HTMLCanvasElement, instead have ${i}`)});return Rt(a.map(s=>le(s,"float32"))).as4D(this.batchSize,t,t,3)})}};async function vt(e){if(e instanceof wr)return e;let t=Array.isArray(e)?e:[e];if(!t.length)throw new Error("toNetInput - empty array passed as input");let n=r=>Array.isArray(e)?` at input index ${r}:`:"",a=t.map(Po);return a.forEach((r,s)=>{if(!kg(r)&&!Or(r)&&!xa(r))throw typeof t[s]=="string"?new Error(`toNetInput -${n(s)} string passed, but could not resolve HTMLElement for element id ${t[s]}`):new Error(`toNetInput -${n(s)} expected media to be of type HTMLImageElement | HTMLVideoElement | HTMLCanvasElement | tf.Tensor3D, or to be an element id`);if(xa(r)){let i=r.shape[0];if(i!==1)throw new Error(`toNetInput -${n(s)} tf.Tensor4D with batchSize ${i} passed, but not supported in input array`)}}),await Promise.all(a.map(r=>kg(r)&&P1(r))),new wr(a,Array.isArray(e))}async function gp(e,t){let{Canvas:n}=et.getEnv(),a=e;if(!(e instanceof n)){let i=await vt(e);if(i.batchSize>1)throw new Error("extractFaces - batchSize > 1 not supported");let o=i.getInput(0);a=o instanceof n?o:await L1(o)}let r=Kn(a);return t.map(i=>i instanceof xt?i.forSize(a.width,a.height).box.floor():i).map(i=>i.clipAtImageBorders(a.width,a.height)).map(({x:i,y:o,width:l,height:u})=>{let p=Lo({width:l,height:u});return l>0&&u>0&&Kn(p).putImageData(r.getImageData(i,o,l,u),0,0),p})}async function yp(e,t){if(!Or(e)&&!xa(e))throw new Error("extractFaceTensors - expected image tensor to be 3D or 4D");if(xa(e)&&e.shape[0]>1)throw new Error("extractFaceTensors - batchSize > 1 not supported");return O(()=>{let[n,a,r]=e.shape.slice(xa(e)?1:0);return t.map(o=>o instanceof xt?o.forSize(a,n).box:o).map(o=>o.clipAtImageBorders(a,n)).filter(o=>o.width>0&&o.height>0).map(({x:o,y:l,width:u,height:p})=>wo(e.as3D(n,a,r),[l,o,0],[p,u,r]))})}async function Br(e,t){let{fetch:n}=et.getEnv(),a=await n(e,t);if(!(a.status<400))throw new Error(`failed to fetch: (${a.status}) ${a.statusText}, from url: ${a.url}`);return a}async function Npe(e){let t=await Br(e),n=await t.blob();if(!n.type.startsWith("image/"))throw new Error(`fetchImage - expected blob type to be of type image/*, instead have: ${n.type}, for url: ${t.url}`);return O1(n)}async function B1(e){return(await Br(e)).json()}async function Tpe(e){return new Float32Array(await(await Br(e)).arrayBuffer())}function VA(e){return new Promise((t,n)=>{e instanceof Blob||n(new Error("bufferToVideo - expected buf to be of type: Blob"));let a=et.getEnv().createVideoElement();a.oncanplay=()=>t(a),a.onerror=n,a.playsInline=!0,a.muted=!0,a.src=URL.createObjectURL(e),a.play()})}async function Cpe(e){let t=await Br(e),n=await t.blob();if(!n.type.startsWith("video/"))throw new Error(`fetchVideo - expected blob type to be of type video/*, instead have: ${n.type}, for url: ${t.url}`);return VA(n)}function Ig(e,t){let n=`${t}-weights_manifest.json`;if(!e)return{modelBaseUri:"",manifestUri:n};if(e==="/")return{modelBaseUri:"/",manifestUri:`/${n}`};let a=e.startsWith("http://")?"http://":e.startsWith("https://")?"https://":"";e=e.replace(a,"");let r=e.split("/").filter(o=>o),s=e.endsWith(".json")?r[r.length-1]:n,i=a+(e.endsWith(".json")?r.slice(0,r.length-1):r).join("/");return i=e.startsWith("/")?`/${i}`:i,{modelBaseUri:i,manifestUri:i==="/"?`/${s}`:`${i}/${s}`}}async function W1(e,t){let{manifestUri:n,modelBaseUri:a}=Ig(e,t),r=await B1(n);return Tn.loadWeights(r,a)}function _pe(e,t,n=!1){let{width:a,height:r}=n?Oo(t):t;return e.width=a,e.height=r,{width:a,height:r}}var on=class{constructor(t){this._params=void 0;this._paramMappings=[];this._name=t}get params(){return this._params}get paramMappings(){return this._paramMappings}get isLoaded(){return!!this.params}getParamFromPath(t){let{obj:n,objProp:a}=this.traversePropertyPath(t);return n[a]}reassignParamFromPath(t,n){let{obj:a,objProp:r}=this.traversePropertyPath(t);a[r].dispose(),a[r]=n}getParamList(){return this._paramMappings.map(({paramPath:t})=>({path:t,tensor:this.getParamFromPath(t)}))}getTrainableParams(){return this.getParamList().filter(t=>t.tensor instanceof os)}getFrozenParams(){return this.getParamList().filter(t=>!(t.tensor instanceof os))}variable(){this.getFrozenParams().forEach(({path:t,tensor:n})=>{this.reassignParamFromPath(t,n.variable())})}freeze(){this.getTrainableParams().forEach(({path:t,tensor:n})=>{let a=Bn(n.dataSync());n.dispose(),this.reassignParamFromPath(t,a)})}dispose(t=!0){this.getParamList().forEach(n=>{if(t&&n.tensor.isDisposed)throw new Error(`param tensor has already been disposed for path ${n.path}`);n.tensor.dispose()}),this._params=void 0}serializeParams(){return new Float32Array(this.getParamList().map(({tensor:t})=>Array.from(t.dataSync())).reduce((t,n)=>t.concat(n)))}async load(t){if(t instanceof Float32Array){this.extractWeights(t);return}await this.loadFromUri(t)}async loadFromUri(t){if(t&&typeof t!="string")throw new Error(`${this._name}.loadFromUri - expected model uri`);let n=await W1(t,this.getDefaultModelName());this.loadFromWeightMap(n)}async loadFromDisk(t){if(t&&typeof t!="string")throw new Error(`${this._name}.loadFromDisk - expected model file path`);let{readFile:n}=et.getEnv(),{manifestUri:a,modelBaseUri:r}=Ig(t,this.getDefaultModelName()),s=u=>Promise.all(u.map(p=>n(p).then(d=>d.buffer))),i=Tn.weightsLoaderFactory(s),o=JSON.parse((await n(a)).toString()),l=await i(o,r);this.loadFromWeightMap(l)}loadFromWeightMap(t){let{paramMappings:n,params:a}=this.extractParamsFromWeightMap(t);this._paramMappings=n,this._params=a}extractWeights(t){let{paramMappings:n,params:a}=this.extractParams(t);this._paramMappings=n,this._params=a}traversePropertyPath(t){if(!this.params)throw new Error("traversePropertyPath - model has no loaded params");let n=t.split("/").reduce((s,i)=>{if(!s.nextObj.hasOwnProperty(i))throw new Error(`traversePropertyPath - object does not have property ${i}, for path ${t}`);return{obj:s.nextObj,objProp:i,nextObj:s.nextObj[i]}},{nextObj:this.params}),{obj:a,objProp:r}=n;if(!a||!r||!(a[r]instanceof Ae))throw new Error(`traversePropertyPath - parameter is not a tensor, for path ${t}`);return{obj:a,objProp:r}}};function Xn(e,t,n){return O(()=>{let a=Cs(e,t.depthwise_filter,t.pointwise_filter,n,"same");return a=Z(a,t.bias),a})}function Sg(e,t,n=!1){return O(()=>{let a=Xe(n?Z(Dt(e,t.conv0.filters,[2,2],"same"),t.conv0.bias):Xn(e,t.conv0,[2,2])),r=Xn(a,t.conv1,[1,1]),s=Xe(Z(a,r)),i=Xn(s,t.conv2,[1,1]);return Xe(Z(a,Z(r,i)))})}function Cd(e,t,n=!1,a=!0){return O(()=>{let r=Xe(n?Z(Dt(e,t.conv0.filters,a?[2,2]:[1,1],"same"),t.conv0.bias):Xn(e,t.conv0,a?[2,2]:[1,1])),s=Xn(r,t.conv1,[1,1]),i=Xe(Z(r,s)),o=Xn(i,t.conv2,[1,1]),l=Xe(Z(r,Z(s,o))),u=Xn(l,t.conv3,[1,1]);return Xe(Z(r,Z(s,Z(o,u))))})}function zo(e,t,n="same",a=!1){return O(()=>{let r=Z(Dt(e,t.filters,[1,1],n),t.bias);return a?Xe(r):r})}function Fn(e,t){Object.keys(e).forEach(n=>{t.some(a=>a.originalPath===n)||e[n].dispose()})}function bp(e,t){return(n,a,r,s)=>{let i=$a(e(n*a*r*r),[r,r,n,a]),o=Ke(e(a));return t.push({paramPath:`${s}/filters`},{paramPath:`${s}/bias`}),{filters:i,bias:o}}}function Ng(e,t){return(n,a,r)=>{let s=Ca(e(n*a),[n,a]),i=Ke(e(a));return t.push({paramPath:`${r}/weights`},{paramPath:`${r}/bias`}),{weights:s,bias:i}}}var _d=class{constructor(t,n,a){this.depthwise_filter=t;this.pointwise_filter=n;this.bias=a}};function xp(e,t){return(n,a,r)=>{let s=$a(e(9*n),[3,3,n,1]),i=$a(e(n*a),[1,1,n,a]),o=Ke(e(a));return t.push({paramPath:`${r}/depthwise_filter`},{paramPath:`${r}/pointwise_filter`},{paramPath:`${r}/bias`}),new _d(s,i,o)}}function vp(e){return t=>{let n=e(`${t}/depthwise_filter`,4),a=e(`${t}/pointwise_filter`,4),r=e(`${t}/bias`,1);return new _d(n,a,r)}}function sa(e,t){return(n,a,r)=>{let s=e[n];if(!Eo(s,a))throw new Error(`expected weightMap[${n}] to be a Tensor${a}D, instead have ${s}`);return t.push({originalPath:n,paramPath:r||n}),s}}function Dn(e){let t=e;function n(r){let s=t.slice(0,r);return t=t.slice(r),s}function a(){return t}return{extractWeights:n,getRemainingWeights:a}}function Tg(e,t){let n=bp(e,t),a=xp(e,t);function r(i,o,l,u=!1){let p=u?n(i,o,3,`${l}/conv0`):a(i,o,`${l}/conv0`),d=a(o,o,`${l}/conv1`),c=a(o,o,`${l}/conv2`);return{conv0:p,conv1:d,conv2:c}}function s(i,o,l,u=!1){let{conv0:p,conv1:d,conv2:c}=r(i,o,l,u),h=a(o,o,`${l}/conv3`);return{conv0:p,conv1:d,conv2:c,conv3:h}}return{extractDenseBlock3Params:r,extractDenseBlock4Params:s}}function UA(e){let t=[],{extractWeights:n,getRemainingWeights:a}=Dn(e),{extractDenseBlock4Params:r}=Tg(n,t),s=r(3,32,"dense0",!0),i=r(32,64,"dense1"),o=r(64,128,"dense2"),l=r(128,256,"dense3");if(a().length!==0)throw new Error(`weights remaing after extract: ${a().length}`);return{paramMappings:t,params:{dense0:s,dense1:i,dense2:o,dense3:l}}}function Cg(e){return t=>{let n=e(`${t}/filters`,4),a=e(`${t}/bias`,1);return{filters:n,bias:a}}}function _g(e,t){let n=sa(e,t),a=Cg(n),r=vp(n);function s(o,l=!1){let u=l?a(`${o}/conv0`):r(`${o}/conv0`),p=r(`${o}/conv1`),d=r(`${o}/conv2`);return{conv0:u,conv1:p,conv2:d}}function i(o,l=!1){let u=l?a(`${o}/conv0`):r(`${o}/conv0`),p=r(`${o}/conv1`),d=r(`${o}/conv2`),c=r(`${o}/conv3`);return{conv0:u,conv1:p,conv2:d,conv3:c}}return{extractDenseBlock3Params:s,extractDenseBlock4Params:i}}function GA(e){let t=[],{extractDenseBlock4Params:n}=_g(e,t),a={dense0:n("dense0",!0),dense1:n("dense1"),dense2:n("dense2"),dense3:n("dense3")};return Fn(e,t),{params:a,paramMappings:t}}var wp=class extends on{constructor(){super("FaceFeatureExtractor")}forwardInput(t){let{params:n}=this;if(!n)throw new Error("FaceFeatureExtractor - load model before inference");return O(()=>{let a=le(t.toBatchTensor(112,!0),"float32"),s=tr(a,[122.782,117.001,104.298]).div(255),i=Cd(s,n.dense0,!0);return i=Cd(i,n.dense1),i=Cd(i,n.dense2),i=Cd(i,n.dense3),i=ga(i,[7,7],[2,2],"valid"),i})}async forward(t){return this.forwardInput(await vt(t))}getDefaultModelName(){return"face_feature_extractor_model"}extractParamsFromWeightMap(t){return GA(t)}extractParams(t){return UA(t)}};function Ed(e,t){return O(()=>Z(Re(e,t.weights),t.bias))}function HA(e,t,n){let a=[],{extractWeights:r,getRemainingWeights:s}=Dn(e),o=Ng(r,a)(t,n,"fc");if(s().length!==0)throw new Error(`weights remaing after extract: ${s().length}`);return{paramMappings:a,params:{fc:o}}}function jA(e){let t=[],n=sa(e,t);function a(s){let i=n(`${s}/weights`,2),o=n(`${s}/bias`,1);return{weights:i,bias:o}}let r={fc:a("fc")};return Fn(e,t),{params:r,paramMappings:t}}function Eg(e){let t={},n={};return Object.keys(e).forEach(a=>{let r=a.startsWith("fc")?n:t;r[a]=e[a]}),{featureExtractorMap:t,classifierMap:n}}var kp=class extends on{constructor(n,a){super(n);this._faceFeatureExtractor=a}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(n){let{params:a}=this;if(!a)throw new Error(`${this._name} - load model before inference`);return O(()=>{let r=n instanceof wr?this.faceFeatureExtractor.forwardInput(n):n;return Ed(r.as2D(r.shape[0],-1),a.fc)})}dispose(n=!0){this.faceFeatureExtractor.dispose(n),super.dispose(n)}loadClassifierParams(n){let{params:a,paramMappings:r}=this.extractClassifierParams(n);this._params=a,this._paramMappings=r}extractClassifierParams(n){return HA(n,this.getClassifierChannelsIn(),this.getClassifierChannelsOut())}extractParamsFromWeightMap(n){let{featureExtractorMap:a,classifierMap:r}=Eg(n);return this.faceFeatureExtractor.loadFromWeightMap(a),jA(r)}extractParams(n){let a=this.getClassifierChannelsIn(),r=this.getClassifierChannelsOut(),s=r*a+r,i=n.slice(0,n.length-s),o=n.slice(n.length-s);return this.faceFeatureExtractor.extractWeights(i),this.extractClassifierParams(o)}};var V1=["neutral","happy","sad","angry","fearful","disgusted","surprised"],Wr=class{constructor(t){this.neutral=0;this.happy=0;this.sad=0;this.angry=0;this.fearful=0;this.disgusted=0;this.surprised=0;if(t.length!==7)throw new Error(`FaceExpressions.constructor - expected probabilities.length to be 7, have: ${t.length}`);V1.forEach((n,a)=>{this[n]=t[a]})}asSortedArray(){return V1.map(t=>({expression:t,probability:this[t]})).sort((t,n)=>n.probability-t.probability)}};var Ad=class extends kp{constructor(t=new wp){super("FaceExpressionNet",t)}forwardInput(t){return O(()=>Za(this.runNet(t)))}async forward(t){return this.forwardInput(await vt(t))}async predictExpressions(t){let n=await vt(t),a=await this.forwardInput(n),r=await Promise.all(mt(a).map(async i=>{let o=i.dataSync();return i.dispose(),o}));a.dispose();let s=r.map(i=>new Wr(i));return n.isBatchInput?s:s[0]}getDefaultModelName(){return"face_expression_model"}getClassifierChannelsIn(){return 256}getClassifierChannelsOut(){return 7}};function U1(e){return e.expressions instanceof Wr}function Ag(e,t){return{...e,...{expressions:t}}}function Epe(e,t,n=.1,a){(Array.isArray(t)?t:[t]).forEach(s=>{let i=s instanceof Wr?s:U1(s)?s.expressions:void 0;if(!i)throw new Error("drawFaceExpressions - expected faceExpressions to be FaceExpressions | WithFaceExpressions<{}> or array thereof");let l=i.asSortedArray().filter(d=>d.probability>n),u=vr(s)?s.detection.box.bottomLeft:a||new Pe(0,0);new zr(l.map(d=>`${d.expression} (${Ao(d.probability)})`),u).draw(e)})}function Bo(e){return vr(e)&&e.landmarks instanceof ra&&e.unshiftedLandmarks instanceof ra&&e.alignedRect instanceof xt}function Ape(e){let t=(o,l,u,p)=>Math.atan2(p-l,u-o)%Math.PI,n=o=>o*180/Math.PI,a={roll:void 0,pitch:void 0,yaw:void 0};if(!e||!e._positions||e._positions.length!==68)return a;let r=e._positions;a.roll=-t(r[36]._x,r[36]._y,r[45]._x,r[45]._y),a.pitch=t(0,Math.abs(r[0]._x-r[30]._x)/r[30]._x,Math.PI,Math.abs(r[16]._x-r[30]._x)/r[30]._x);let s=r.reduce((o,l)=>oo>l._y?o:l._y,-1/0);return a.yaw=Math.PI*(e._imgDims._height/(i-s)/1.4-1),a}function Ip(e,t){let{box:n}=e.detection,a=t.shiftBy(n.x,n.y),r=a.align(),{imageDims:s}=e.detection,i=new xt(e.detection.score,r.rescale(s.reverse()),s),o=Ape(t);return{...e,...{landmarks:a,unshiftedLandmarks:t,alignedRect:i,angle:o}}}var $g=class{constructor(t={}){let{drawLines:n=!0,drawPoints:a=!0,lineWidth:r,lineColor:s,pointSize:i,pointColor:o}=t;this.drawLines=n,this.drawPoints=a,this.lineWidth=r||1,this.pointSize=i||2,this.lineColor=s||"rgba(0, 255, 255, 1)",this.pointColor=o||"rgba(255, 0, 255, 1)"}},Fg=class{constructor(t,n={}){this.faceLandmarks=t,this.options=new $g(n)}draw(t){let n=Kn(t),{drawLines:a,drawPoints:r,lineWidth:s,lineColor:i,pointSize:o,pointColor:l}=this.options;if(a&&this.faceLandmarks instanceof Ro&&(n.strokeStyle=i,n.lineWidth=s,Pr(n,this.faceLandmarks.getJawOutline()),Pr(n,this.faceLandmarks.getLeftEyeBrow()),Pr(n,this.faceLandmarks.getRightEyeBrow()),Pr(n,this.faceLandmarks.getNose()),Pr(n,this.faceLandmarks.getLeftEye(),!0),Pr(n,this.faceLandmarks.getRightEye(),!0),Pr(n,this.faceLandmarks.getMouth(),!0)),r){n.strokeStyle=l,n.fillStyle=l;let u=p=>{n.beginPath(),n.arc(p.x,p.y,o,0,2*Math.PI),n.fill()};this.faceLandmarks.positions.forEach(u)}}};function $pe(e,t){(Array.isArray(t)?t:[t]).forEach(a=>{let r=a instanceof ra?a:Bo(a)?a.landmarks:void 0;if(!r)throw new Error("drawFaceLandmarks - expected faceExpressions to be FaceLandmarks | WithFaceLandmarks> or array thereof");new Fg(r).draw(e)})}var qA="1.7.2";function Rpe(e,t){let n=bp(e,t),a=xp(e,t);function r(i,o,l){let u=a(i,o,`${l}/separable_conv0`),p=a(o,o,`${l}/separable_conv1`),d=n(i,o,1,`${l}/expansion_conv`);return{separable_conv0:u,separable_conv1:p,expansion_conv:d}}function s(i,o){let l=a(i,i,`${o}/separable_conv0`),u=a(i,i,`${o}/separable_conv1`),p=a(i,i,`${o}/separable_conv2`);return{separable_conv0:l,separable_conv1:u,separable_conv2:p}}return{extractConvParams:n,extractSeparableConvParams:a,extractReductionBlockParams:r,extractMainBlockParams:s}}function KA(e,t){let n=[],{extractWeights:a,getRemainingWeights:r}=Dn(e),{extractConvParams:s,extractSeparableConvParams:i,extractReductionBlockParams:o,extractMainBlockParams:l}=Rpe(a,n),u=s(3,32,3,"entry_flow/conv_in"),p=o(32,64,"entry_flow/reduction_block_0"),d=o(64,128,"entry_flow/reduction_block_1"),c={conv_in:u,reduction_block_0:p,reduction_block_1:d},h={};br(t,0,1).forEach(y=>{h[`main_block_${y}`]=l(128,`middle_flow/main_block_${y}`)});let m=o(128,256,"exit_flow/reduction_block"),f=i(256,512,"exit_flow/separable_conv"),g={reduction_block:m,separable_conv:f};if(r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{paramMappings:n,params:{entry_flow:c,middle_flow:h,exit_flow:g}}}function Mpe(e,t){let n=sa(e,t),a=Cg(n),r=vp(n);function s(o){let l=r(`${o}/separable_conv0`),u=r(`${o}/separable_conv1`),p=a(`${o}/expansion_conv`);return{separable_conv0:l,separable_conv1:u,expansion_conv:p}}function i(o){let l=r(`${o}/separable_conv0`),u=r(`${o}/separable_conv1`),p=r(`${o}/separable_conv2`);return{separable_conv0:l,separable_conv1:u,separable_conv2:p}}return{extractConvParams:a,extractSeparableConvParams:r,extractReductionBlockParams:s,extractMainBlockParams:i}}function XA(e,t){let n=[],{extractConvParams:a,extractSeparableConvParams:r,extractReductionBlockParams:s,extractMainBlockParams:i}=Mpe(e,n),o=a("entry_flow/conv_in"),l=s("entry_flow/reduction_block_0"),u=s("entry_flow/reduction_block_1"),p={conv_in:o,reduction_block_0:l,reduction_block_1:u},d={};br(t,0,1).forEach(f=>{d[`main_block_${f}`]=i(`middle_flow/main_block_${f}`)});let c=s("exit_flow/reduction_block"),h=r("exit_flow/separable_conv"),m={reduction_block:c,separable_conv:h};return Fn(e,n),{params:{entry_flow:p,middle_flow:d,exit_flow:m},paramMappings:n}}function YA(e,t,n){return Z(Dt(e,t.filters,n,"same"),t.bias)}function H1(e,t,n=!0){let a=n?Xe(e):e;return a=Xn(a,t.separable_conv0,[1,1]),a=Xn(Xe(a),t.separable_conv1,[1,1]),a=Mt(a,[3,3],[2,2],"same"),a=Z(a,YA(e,t.expansion_conv,[2,2])),a}function Ppe(e,t){let n=Xn(Xe(e),t.separable_conv0,[1,1]);return n=Xn(Xe(n),t.separable_conv1,[1,1]),n=Xn(Xe(n),t.separable_conv2,[1,1]),n=Z(n,e),n}var Dg=class extends on{constructor(n){super("TinyXception");this._numMainBlocks=n}forwardInput(n){let{params:a}=this;if(!a)throw new Error("TinyXception - load model before inference");return O(()=>{let r=le(n.toBatchTensor(112,!0),"float32"),i=tr(r,[122.782,117.001,104.298]).div(255),o=Xe(YA(i,a.entry_flow.conv_in,[2,2]));return o=H1(o,a.entry_flow.reduction_block_0,!1),o=H1(o,a.entry_flow.reduction_block_1),br(this._numMainBlocks,0,1).forEach(l=>{o=Ppe(o,a.middle_flow[`main_block_${l}`])}),o=H1(o,a.exit_flow.reduction_block),o=Xe(Xn(o,a.exit_flow.separable_conv,[1,1])),o})}async forward(n){return this.forwardInput(await vt(n))}getDefaultModelName(){return"tiny_xception_model"}extractParamsFromWeightMap(n){return XA(n,this._numMainBlocks)}extractParams(n){return KA(n,this._numMainBlocks)}};function JA(e){let t=[],{extractWeights:n,getRemainingWeights:a}=Dn(e),r=Ng(n,t),s=r(512,1,"fc/age"),i=r(512,2,"fc/gender");if(a().length!==0)throw new Error(`weights remaing after extract: ${a().length}`);return{paramMappings:t,params:{fc:{age:s,gender:i}}}}function ZA(e){let t=[],n=sa(e,t);function a(s){let i=n(`${s}/weights`,2),o=n(`${s}/bias`,1);return{weights:i,bias:o}}let r={fc:{age:a("fc/age"),gender:a("fc/gender")}};return Fn(e,t),{params:r,paramMappings:t}}var Rg=(n=>(n.FEMALE="female",n.MALE="male",n))(Rg||{});var $d=class extends on{constructor(n=new Dg(2)){super("AgeGenderNet");this._faceFeatureExtractor=n}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(n){let{params:a}=this;if(!a)throw new Error(`${this._name} - load model before inference`);return O(()=>{let r=n instanceof wr?this.faceFeatureExtractor.forwardInput(n):n,s=ga(r,[7,7],[2,2],"valid").as2D(r.shape[0],-1),i=Ed(s,a.fc.age).as1D(),o=Ed(s,a.fc.gender);return{age:i,gender:o}})}forwardInput(n){return O(()=>{let{age:a,gender:r}=this.runNet(n);return{age:a,gender:Za(r)}})}async forward(n){return this.forwardInput(await vt(n))}async predictAgeAndGender(n){let a=await vt(n),r=await this.forwardInput(a),s=mt(r.age),i=mt(r.gender),o=s.map((u,p)=>({ageTensor:u,genderTensor:i[p]})),l=await Promise.all(o.map(async({ageTensor:u,genderTensor:p})=>{let d=u.dataSync()[0],c=p.dataSync()[0],h=c>.5,m=h?"male":"female",f=h?c:1-c;return u.dispose(),p.dispose(),{age:d,gender:m,genderProbability:f}}));return r.age.dispose(),r.gender.dispose(),a.isBatchInput?l:l[0]}getDefaultModelName(){return"age_gender_model"}dispose(n=!0){this.faceFeatureExtractor.dispose(n),super.dispose(n)}loadClassifierParams(n){let{params:a,paramMappings:r}=this.extractClassifierParams(n);this._params=a,this._paramMappings=r}extractClassifierParams(n){return JA(n)}extractParamsFromWeightMap(n){let{featureExtractorMap:a,classifierMap:r}=Eg(n);return this.faceFeatureExtractor.loadFromWeightMap(a),ZA(r)}extractParams(n){let r=n.slice(0,n.length-1539),s=n.slice(n.length-1539);return this.faceFeatureExtractor.extractWeights(r),this.extractClassifierParams(s)}};var Sp=class extends kp{postProcess(t,n,a){let r=a.map(({width:i,height:o})=>{let l=n/Math.max(o,i);return{width:i*l,height:o*l}}),s=r.length;return O(()=>{let i=(d,c)=>Rt([An([68],d,"float32"),An([68],c,"float32")],1).as2D(1,136).as1D(),o=(d,c)=>{let{width:h,height:m}=r[d];return c(h,m)?Math.abs(h-m)/2:0},l=d=>o(d,(c,h)=>co(d,(c,h)=>hi(l(c),u(c))))).div(Rt(Array.from(Array(s),(d,c)=>i(r[c].width,r[c].height))))})}forwardInput(t){return O(()=>{let n=this.runNet(t);return this.postProcess(n,t.inputSize,t.inputDimensions.map(([a,r])=>({height:a,width:r})))})}async forward(t){return this.forwardInput(await vt(t))}async detectLandmarks(t){let n=await vt(t),a=O(()=>mt(this.forwardInput(n))),r=await Promise.all(a.map(async(s,i)=>{let o=Array.from(s.dataSync()),l=o.filter((p,d)=>bg(d)),u=o.filter((p,d)=>!bg(d));return new Ro(Array(68).fill(0).map((p,d)=>new Pe(l[d],u[d])),{height:n.getInputHeight(i),width:n.getInputWidth(i)})}));return a.forEach(s=>s.dispose()),n.isBatchInput?r:r[0]}getClassifierChannelsOut(){return 136}};var Wo=class extends Sp{constructor(t=new wp){super("FaceLandmark68Net",t)}getDefaultModelName(){return"face_landmark_68_model"}getClassifierChannelsIn(){return 256}};function QA(e){let t=[],{extractDenseBlock3Params:n}=_g(e,t),a={dense0:n("dense0",!0),dense1:n("dense1"),dense2:n("dense2")};return Fn(e,t),{params:a,paramMappings:t}}function e$(e){let t=[],{extractWeights:n,getRemainingWeights:a}=Dn(e),{extractDenseBlock3Params:r}=Tg(n,t),s=r(3,32,"dense0",!0),i=r(32,64,"dense1"),o=r(64,128,"dense2");if(a().length!==0)throw new Error(`weights remaing after extract: ${a().length}`);return{paramMappings:t,params:{dense0:s,dense1:i,dense2:o}}}var Mg=class extends on{constructor(){super("TinyFaceFeatureExtractor")}forwardInput(t){let{params:n}=this;if(!n)throw new Error("TinyFaceFeatureExtractor - load model before inference");return O(()=>{let a=le(t.toBatchTensor(112,!0),"float32"),s=tr(a,[122.782,117.001,104.298]).div(255),i=Sg(s,n.dense0,!0);return i=Sg(i,n.dense1),i=Sg(i,n.dense2),i=ga(i,[14,14],[2,2],"valid"),i})}async forward(t){return this.forwardInput(await vt(t))}getDefaultModelName(){return"face_feature_extractor_tiny_model"}extractParamsFromWeightMap(t){return QA(t)}extractParams(t){return e$(t)}};var Fd=class extends Sp{constructor(t=new Mg){super("FaceLandmark68TinyNet",t)}getDefaultModelName(){return"face_landmark_68_tiny_model"}getClassifierChannelsIn(){return 128}};var j1=class extends Wo{};function t$(e,t){return Z(B(e,t.weights),t.biases)}function q1(e,t,n,a,r="same"){let{filters:s,bias:i}=t.conv,o=Dt(e,s,n,r);return o=Z(o,i),o=t$(o,t.scale),a?Xe(o):o}function n$(e,t){return q1(e,t,[1,1],!0)}function K1(e,t){return q1(e,t,[1,1],!1)}function Pg(e,t){return q1(e,t,[2,2],!0,"valid")}function Ope(e,t){function n(o,l,u){let p=e(o),d=p.length/(l*u*u);if(w1(d))throw new Error(`depth has to be an integer: ${d}, weights.length: ${p.length}, numFilters: ${l}, filterSize: ${u}`);return O(()=>$e($a(p,[l,d,u,u]),[2,3,1,0]))}function a(o,l,u,p){let d=n(o,l,u),c=Ke(e(l));return t.push({paramPath:`${p}/filters`},{paramPath:`${p}/bias`}),{filters:d,bias:c}}function r(o,l){let u=Ke(e(o)),p=Ke(e(o));return t.push({paramPath:`${l}/weights`},{paramPath:`${l}/biases`}),{weights:u,biases:p}}function s(o,l,u,p){let d=a(o,l,u,`${p}/conv`),c=r(l,`${p}/scale`);return{conv:d,scale:c}}function i(o,l,u,p,d=!1){let c=s((d?.5:1)*o,l,u,`${p}/conv1`),h=s(o,l,u,`${p}/conv2`);return{conv1:c,conv2:h}}return{extractConvLayerParams:s,extractResidualLayerParams:i}}function a$(e){let{extractWeights:t,getRemainingWeights:n}=Dn(e),a=[],{extractConvLayerParams:r,extractResidualLayerParams:s}=Ope(t,a),i=r(4704,32,7,"conv32_down"),o=s(9216,32,3,"conv32_1"),l=s(9216,32,3,"conv32_2"),u=s(9216,32,3,"conv32_3"),p=s(36864,64,3,"conv64_down",!0),d=s(36864,64,3,"conv64_1"),c=s(36864,64,3,"conv64_2"),h=s(36864,64,3,"conv64_3"),m=s(147456,128,3,"conv128_down",!0),f=s(147456,128,3,"conv128_1"),g=s(147456,128,3,"conv128_2"),y=s(589824,256,3,"conv256_down",!0),b=s(589824,256,3,"conv256_1"),x=s(589824,256,3,"conv256_2"),v=s(589824,256,3,"conv256_down_out"),I=O(()=>$e(Ca(t(256*128),[128,256]),[1,0]));if(a.push({paramPath:"fc"}),n().length!==0)throw new Error(`weights remaing after extract: ${n().length}`);return{params:{conv32_down:i,conv32_1:o,conv32_2:l,conv32_3:u,conv64_down:p,conv64_1:d,conv64_2:c,conv64_3:h,conv128_down:m,conv128_1:f,conv128_2:g,conv256_down:y,conv256_1:b,conv256_2:x,conv256_down_out:v,fc:I},paramMappings:a}}function Lpe(e,t){let n=sa(e,t);function a(i){let o=n(`${i}/scale/weights`,1),l=n(`${i}/scale/biases`,1);return{weights:o,biases:l}}function r(i){let o=n(`${i}/conv/filters`,4),l=n(`${i}/conv/bias`,1),u=a(i);return{conv:{filters:o,bias:l},scale:u}}function s(i){return{conv1:r(`${i}/conv1`),conv2:r(`${i}/conv2`)}}return{extractConvLayerParams:r,extractResidualLayerParams:s}}function r$(e){let t=[],{extractConvLayerParams:n,extractResidualLayerParams:a}=Lpe(e,t),r=n("conv32_down"),s=a("conv32_1"),i=a("conv32_2"),o=a("conv32_3"),l=a("conv64_down"),u=a("conv64_1"),p=a("conv64_2"),d=a("conv64_3"),c=a("conv128_down"),h=a("conv128_1"),m=a("conv128_2"),f=a("conv256_down"),g=a("conv256_1"),y=a("conv256_2"),b=a("conv256_down_out"),{fc:x}=e;if(t.push({originalPath:"fc",paramPath:"fc"}),!v1(x))throw new Error(`expected weightMap[fc] to be a Tensor2D, instead have ${x}`);let v={conv32_down:r,conv32_1:s,conv32_2:i,conv32_3:o,conv64_down:l,conv64_1:u,conv64_2:p,conv64_3:d,conv128_down:c,conv128_1:h,conv128_2:m,conv256_down:f,conv256_1:g,conv256_2:y,conv256_down_out:b,fc:x};return Fn(e,t),{params:v,paramMappings:t}}function nr(e,t){let n=n$(e,t.conv1);return n=K1(n,t.conv2),n=Z(n,e),n=Xe(n),n}function Dd(e,t){let n=Pg(e,t.conv1);n=K1(n,t.conv2);let a=ga(e,2,2,"valid"),r=It(a.shape),s=a.shape[3]!==n.shape[3];if(a.shape[1]!==n.shape[1]||a.shape[2]!==n.shape[2]){let o=[...n.shape];o[1]=1;let l=It(o);n=Qe([n,l],1);let u=[...n.shape];u[2]=1;let p=It(u);n=Qe([n,p],2)}return a=s?Qe([a,r],3):a,n=Z(a,n),n=Xe(n),n}var Vo=class extends on{constructor(){super("FaceRecognitionNet")}forwardInput(t){let{params:n}=this;if(!n)throw new Error("FaceRecognitionNet - load model before inference");return O(()=>{let a=le(t.toBatchTensor(150,!0),"float32"),s=tr(a,[122.782,117.001,104.298]).div(255),i=Pg(s,n.conv32_down);i=Mt(i,3,2,"valid"),i=nr(i,n.conv32_1),i=nr(i,n.conv32_2),i=nr(i,n.conv32_3),i=Dd(i,n.conv64_down),i=nr(i,n.conv64_1),i=nr(i,n.conv64_2),i=nr(i,n.conv64_3),i=Dd(i,n.conv128_down),i=nr(i,n.conv128_1),i=nr(i,n.conv128_2),i=Dd(i,n.conv256_down),i=nr(i,n.conv256_1),i=nr(i,n.conv256_2),i=Dd(i,n.conv256_down_out);let o=i.mean([1,2]);return Re(o,n.fc)})}async forward(t){return this.forwardInput(await vt(t))}async computeFaceDescriptor(t){var s;if((s=t==null?void 0:t.shape)!=null&&s.some(i=>i<=0))return new Float32Array(128);let n=await vt(t),a=O(()=>mt(this.forwardInput(n))),r=await Promise.all(a.map(i=>i.data()));return a.forEach(i=>i.dispose()),n.isBatchInput?r:r[0]}getDefaultModelName(){return"face_recognition_model"}extractParamsFromWeightMap(t){return r$(t)}extractParams(t){return a$(t)}};function zpe(e){let t=new Vo;return t.extractWeights(e),t}function Og(e,t){return{...e,...{descriptor:t}}}function Bpe(e){return typeof e.age=="number"}function Lg(e,t){return{...e,...{age:t}}}function Wpe(e){return(e.gender==="male"||e.gender==="female")&&dp(e.genderProbability)}function zg(e,t,n){return{...e,...{gender:t,genderProbability:n}}}function Vpe(e,t){function n(l,u){let p=$a(e(9*l),[3,3,l,1]),d=Ke(e(l)),c=Ke(e(l)),h=Ke(e(l)),m=Ke(e(l));return t.push({paramPath:`${u}/filters`},{paramPath:`${u}/batch_norm_scale`},{paramPath:`${u}/batch_norm_offset`},{paramPath:`${u}/batch_norm_mean`},{paramPath:`${u}/batch_norm_variance`}),{filters:p,batch_norm_scale:d,batch_norm_offset:c,batch_norm_mean:h,batch_norm_variance:m}}function a(l,u,p,d,c){let h=$a(e(l*u*p*p),[p,p,l,u]),m=Ke(e(u));return t.push({paramPath:`${d}/filters`},{paramPath:`${d}/${c?"batch_norm_offset":"bias"}`}),{filters:h,bias:m}}function r(l,u,p,d){let{filters:c,bias:h}=a(l,u,p,d,!0);return{filters:c,batch_norm_offset:h}}function s(l,u,p){let d=n(l,`${p}/depthwise_conv`),c=r(l,u,1,`${p}/pointwise_conv`);return{depthwise_conv:d,pointwise_conv:c}}function i(){let l=r(3,32,3,"mobilenetv1/conv_0"),u=s(32,64,"mobilenetv1/conv_1"),p=s(64,128,"mobilenetv1/conv_2"),d=s(128,128,"mobilenetv1/conv_3"),c=s(128,256,"mobilenetv1/conv_4"),h=s(256,256,"mobilenetv1/conv_5"),m=s(256,512,"mobilenetv1/conv_6"),f=s(512,512,"mobilenetv1/conv_7"),g=s(512,512,"mobilenetv1/conv_8"),y=s(512,512,"mobilenetv1/conv_9"),b=s(512,512,"mobilenetv1/conv_10"),x=s(512,512,"mobilenetv1/conv_11"),v=s(512,1024,"mobilenetv1/conv_12"),I=s(1024,1024,"mobilenetv1/conv_13");return{conv_0:l,conv_1:u,conv_2:p,conv_3:d,conv_4:c,conv_5:h,conv_6:m,conv_7:f,conv_8:g,conv_9:y,conv_10:b,conv_11:x,conv_12:v,conv_13:I}}function o(){let l=r(1024,256,1,"prediction_layer/conv_0"),u=r(256,512,3,"prediction_layer/conv_1"),p=r(512,128,1,"prediction_layer/conv_2"),d=r(128,256,3,"prediction_layer/conv_3"),c=r(256,128,1,"prediction_layer/conv_4"),h=r(128,256,3,"prediction_layer/conv_5"),m=r(256,64,1,"prediction_layer/conv_6"),f=r(64,128,3,"prediction_layer/conv_7"),g=a(512,12,1,"prediction_layer/box_predictor_0/box_encoding_predictor"),y=a(512,9,1,"prediction_layer/box_predictor_0/class_predictor"),b=a(1024,24,1,"prediction_layer/box_predictor_1/box_encoding_predictor"),x=a(1024,18,1,"prediction_layer/box_predictor_1/class_predictor"),v=a(512,24,1,"prediction_layer/box_predictor_2/box_encoding_predictor"),I=a(512,18,1,"prediction_layer/box_predictor_2/class_predictor"),T=a(256,24,1,"prediction_layer/box_predictor_3/box_encoding_predictor"),_=a(256,18,1,"prediction_layer/box_predictor_3/class_predictor"),A=a(256,24,1,"prediction_layer/box_predictor_4/box_encoding_predictor"),F=a(256,18,1,"prediction_layer/box_predictor_4/class_predictor"),P=a(128,24,1,"prediction_layer/box_predictor_5/box_encoding_predictor"),$=a(128,18,1,"prediction_layer/box_predictor_5/class_predictor");return{conv_0:l,conv_1:u,conv_2:p,conv_3:d,conv_4:c,conv_5:h,conv_6:m,conv_7:f,box_predictor_0:{box_encoding_predictor:g,class_predictor:y},box_predictor_1:{box_encoding_predictor:b,class_predictor:x},box_predictor_2:{box_encoding_predictor:v,class_predictor:I},box_predictor_3:{box_encoding_predictor:T,class_predictor:_},box_predictor_4:{box_encoding_predictor:A,class_predictor:F},box_predictor_5:{box_encoding_predictor:P,class_predictor:$}}}return{extractMobilenetV1Params:i,extractPredictionLayerParams:o}}function s$(e){let t=[],{extractWeights:n,getRemainingWeights:a}=Dn(e),{extractMobilenetV1Params:r,extractPredictionLayerParams:s}=Vpe(n,t),i=r(),o=s(),u={extra_dim:Hc(n(5118*4),[1,5118,4])};if(t.push({paramPath:"output_layer/extra_dim"}),a().length!==0)throw new Error(`weights remaing after extract: ${a().length}`);return{params:{mobilenetv1:i,prediction_layer:o,output_layer:u},paramMappings:t}}function Upe(e,t){let n=sa(e,t);function a(u,p,d){let c=n(`${u}/Conv2d_${p}_pointwise/weights`,4,`${d}/filters`),h=n(`${u}/Conv2d_${p}_pointwise/convolution_bn_offset`,1,`${d}/batch_norm_offset`);return{filters:c,batch_norm_offset:h}}function r(u){let p=`mobilenetv1/conv_${u}`,d=`MobilenetV1/Conv2d_${u}_depthwise`,c=`${p}/depthwise_conv`,h=`${p}/pointwise_conv`,m=n(`${d}/depthwise_weights`,4,`${c}/filters`),f=n(`${d}/BatchNorm/gamma`,1,`${c}/batch_norm_scale`),g=n(`${d}/BatchNorm/beta`,1,`${c}/batch_norm_offset`),y=n(`${d}/BatchNorm/moving_mean`,1,`${c}/batch_norm_mean`),b=n(`${d}/BatchNorm/moving_variance`,1,`${c}/batch_norm_variance`);return{depthwise_conv:{filters:m,batch_norm_scale:f,batch_norm_offset:g,batch_norm_mean:y,batch_norm_variance:b},pointwise_conv:a("MobilenetV1",u,h)}}function s(){return{conv_0:a("MobilenetV1",0,"mobilenetv1/conv_0"),conv_1:r(1),conv_2:r(2),conv_3:r(3),conv_4:r(4),conv_5:r(5),conv_6:r(6),conv_7:r(7),conv_8:r(8),conv_9:r(9),conv_10:r(10),conv_11:r(11),conv_12:r(12),conv_13:r(13)}}function i(u,p){let d=n(`${u}/weights`,4,`${p}/filters`),c=n(`${u}/biases`,1,`${p}/bias`);return{filters:d,bias:c}}function o(u){let p=i(`Prediction/BoxPredictor_${u}/BoxEncodingPredictor`,`prediction_layer/box_predictor_${u}/box_encoding_predictor`),d=i(`Prediction/BoxPredictor_${u}/ClassPredictor`,`prediction_layer/box_predictor_${u}/class_predictor`);return{box_encoding_predictor:p,class_predictor:d}}function l(){return{conv_0:a("Prediction",0,"prediction_layer/conv_0"),conv_1:a("Prediction",1,"prediction_layer/conv_1"),conv_2:a("Prediction",2,"prediction_layer/conv_2"),conv_3:a("Prediction",3,"prediction_layer/conv_3"),conv_4:a("Prediction",4,"prediction_layer/conv_4"),conv_5:a("Prediction",5,"prediction_layer/conv_5"),conv_6:a("Prediction",6,"prediction_layer/conv_6"),conv_7:a("Prediction",7,"prediction_layer/conv_7"),box_predictor_0:o(0),box_predictor_1:o(1),box_predictor_2:o(2),box_predictor_3:o(3),box_predictor_4:o(4),box_predictor_5:o(5)}}return{extractMobilenetV1Params:s,extractPredictionLayerParams:l}}function i$(e){let t=[],{extractMobilenetV1Params:n,extractPredictionLayerParams:a}=Upe(e,t),r=e["Output/extra_dim"];if(t.push({originalPath:"Output/extra_dim",paramPath:"output_layer/extra_dim"}),!Or(r))throw new Error(`expected weightMap['Output/extra_dim'] to be a Tensor3D, instead have ${r}`);let s={mobilenetv1:n(),prediction_layer:a(),output_layer:{extra_dim:r}};return Fn(e,t),{params:s,paramMappings:t}}function Ra(e,t,n){return O(()=>{let a=Dt(e,t.filters,n,"same");return a=Z(a,t.batch_norm_offset),tn(a,0,6)})}var Gpe=.0010000000474974513;function Hpe(e,t,n){return O(()=>{let a=Ss(e,t.filters,n,"same");return a=Is(a,t.batch_norm_mean,t.batch_norm_variance,t.batch_norm_offset,t.batch_norm_scale,Gpe),tn(a,0,6)})}function jpe(e){return[2,4,6,12].some(t=>t===e)?[2,2]:[1,1]}function o$(e,t){return O(()=>{let n,a=Ra(e,t.conv_0,[2,2]);if([t.conv_1,t.conv_2,t.conv_3,t.conv_4,t.conv_5,t.conv_6,t.conv_7,t.conv_8,t.conv_9,t.conv_10,t.conv_11,t.conv_12,t.conv_13].forEach((s,i)=>{let o=i+1,l=jpe(o);a=Hpe(a,s.depthwise_conv,l),a=Ra(a,s.pointwise_conv,[1,1]),o===11&&(n=a)}),n===null)throw new Error("mobileNetV1 - output of conv layer 11 is null");return{out:a,conv11:n}})}function qpe(e,t,n){let a=e.arraySync(),r=Math.min(a[t][0],a[t][2]),s=Math.min(a[t][1],a[t][3]),i=Math.max(a[t][0],a[t][2]),o=Math.max(a[t][1],a[t][3]),l=Math.min(a[n][0],a[n][2]),u=Math.min(a[n][1],a[n][3]),p=Math.max(a[n][0],a[n][2]),d=Math.max(a[n][1],a[n][3]),c=(i-r)*(o-s),h=(p-l)*(d-u);if(c<=0||h<=0)return 0;let m=Math.max(r,l),f=Math.max(s,u),g=Math.min(i,p),y=Math.min(o,d),b=Math.max(g-m,0)*Math.max(y-f,0);return b/(c+h-b)}function l$(e,t,n,a,r){let s=e.shape[0],i=Math.min(n,s),o=t.map((p,d)=>({score:p,boxIndex:d})).filter(p=>p.score>r).sort((p,d)=>d.score-p.score),l=p=>p<=a?1:0,u=[];return o.forEach(p=>{if(u.length>=i)return;let d=p.score;for(let c=u.length-1;c>=0;--c){let h=qpe(e,p.boxIndex,u[c]);if(h!==0&&(p.score*=l(h),p.score<=r))break}d===p.score&&u.push(p.boxIndex)}),u}function Kpe(e){let t=mt($e(e,[1,0])),n=[ce(t[2],t[0]),ce(t[3],t[1])],a=[Z(t[0],fe(n[0],2)),Z(t[1],fe(n[1],2))];return{sizes:n,centers:a}}function Xpe(e,t){let{sizes:n,centers:a}=Kpe(e),r=mt($e(t,[1,0])),s=fe(B(gn(fe(r[2],5)),n[0]),2),i=Z(B(fe(r[0],10),n[0]),a[0]),o=fe(B(gn(fe(r[3],5)),n[1]),2),l=Z(B(fe(r[1],10),n[1]),a[1]);return $e(Rt([ce(i,s),ce(l,o),Z(i,s),Z(l,o)]),[1,0])}function u$(e,t,n){return O(()=>{let a=e.shape[0],r=Xpe(W(zn(n.extra_dim,[a,1,1]),[-1,4]),W(e,[-1,4]));r=W(r,[a,r.shape[0]/a,4]);let s=ha(He(t,[0,0,1],[-1,-1,-1])),i=He(s,[0,0,0],[-1,-1,1]);i=W(i,[a,i.shape[1]]);let o=mt(r),l=mt(i);return{boxes:o,scores:l}})}function Uo(e,t){return O(()=>{let n=e.shape[0],a=W(zo(e,t.box_encoding_predictor),[n,-1,1,4]),r=W(zo(e,t.class_predictor),[n,-1,3]);return{boxPredictionEncoding:a,classPrediction:r}})}function p$(e,t,n){return O(()=>{let a=Ra(e,n.conv_0,[1,1]),r=Ra(a,n.conv_1,[2,2]),s=Ra(r,n.conv_2,[1,1]),i=Ra(s,n.conv_3,[2,2]),o=Ra(i,n.conv_4,[1,1]),l=Ra(o,n.conv_5,[2,2]),u=Ra(l,n.conv_6,[1,1]),p=Ra(u,n.conv_7,[2,2]),d=Uo(t,n.box_predictor_0),c=Uo(e,n.box_predictor_1),h=Uo(r,n.box_predictor_2),m=Uo(i,n.box_predictor_3),f=Uo(l,n.box_predictor_4),g=Uo(p,n.box_predictor_5),y=Qe([d.boxPredictionEncoding,c.boxPredictionEncoding,h.boxPredictionEncoding,m.boxPredictionEncoding,f.boxPredictionEncoding,g.boxPredictionEncoding],1),b=Qe([d.classPrediction,c.classPrediction,h.classPrediction,m.classPrediction,f.classPrediction,g.classPrediction],1);return{boxPredictions:y,classPredictions:b}})}var va=class{constructor({minConfidence:t,maxResults:n}={}){this._name="SsdMobilenetv1Options";if(this._minConfidence=t||.5,this._maxResults=n||100,typeof this._minConfidence!="number"||this._minConfidence<=0||this._minConfidence>=1)throw new Error(`${this._name} - expected minConfidence to be a number between 0 and 1`);if(typeof this._maxResults!="number")throw new Error(`${this._name} - expected maxResults to be a number`)}get minConfidence(){return this._minConfidence}get maxResults(){return this._maxResults}};var Fs=class extends on{constructor(){super("SsdMobilenetv1")}forwardInput(t){let{params:n}=this;if(!n)throw new Error("SsdMobilenetv1 - load model before inference");return O(()=>{let a=le(t.toBatchTensor(512,!1),"float32"),r=ce(fe(a,127.5),1),s=o$(r,n.mobilenetv1),{boxPredictions:i,classPredictions:o}=p$(s.out,s.conv11,n.prediction_layer);return u$(i,o,n.output_layer)})}async forward(t){return this.forwardInput(await vt(t))}async locateFaces(t,n={}){let{maxResults:a,minConfidence:r}=new va(n),s=await vt(t),{boxes:i,scores:o}=this.forwardInput(s),l=i[0],u=o[0];for(let x=1;x{let[v,I]=[Math.max(0,y[x][0]),Math.min(1,y[x][2])].map(A=>A*g),[T,_]=[Math.max(0,y[x][1]),Math.min(1,y[x][3])].map(A=>A*f);return new xt(p[x],new Do(T,v,_-T,I-v),{height:s.getInputHeight(0),width:s.getInputWidth(0)})});return l.dispose(),u.dispose(),b}getDefaultModelName(){return"ssd_mobilenetv1_model"}extractParamsFromWeightMap(t){return i$(t)}extractParams(t){return s$(t)}};function c$(e){let t=new Fs;return t.extractWeights(e),t}function Ype(e){return c$(e)}var X1=class extends Fs{};var d$=.4,h$=[new Pe(.738768,.874946),new Pe(2.42204,2.65704),new Pe(4.30971,7.04493),new Pe(10.246,4.59428),new Pe(12.6868,11.8741)],m$=[new Pe(1.603231,2.094468),new Pe(6.041143,7.080126),new Pe(2.882459,3.518061),new Pe(4.266906,5.178857),new Pe(9.041765,10.66308)],f$=[117.001,114.697,97.404],g$="tiny_yolov2_model",y$="tiny_yolov2_separable_conv_model";var Bg=e=>typeof e=="number";function Y1(e){if(!e)throw new Error(`invalid config: ${e}`);if(typeof e.withSeparableConvs!="boolean")throw new Error(`config.withSeparableConvs has to be a boolean, have: ${e.withSeparableConvs}`);if(!Bg(e.iouThreshold)||e.iouThreshold<0||e.iouThreshold>1)throw new Error(`config.iouThreshold has to be a number between [0, 1], have: ${e.iouThreshold}`);if(!Array.isArray(e.classes)||!e.classes.length||!e.classes.every(t=>typeof t=="string"))throw new Error(`config.classes has to be an array class names: string[], have: ${JSON.stringify(e.classes)}`);if(!Array.isArray(e.anchors)||!e.anchors.length||!e.anchors.map(t=>t||{}).every(t=>Bg(t.x)&&Bg(t.y)))throw new Error(`config.anchors has to be an array of { x: number, y: number }, have: ${JSON.stringify(e.anchors)}`);if(e.meanRgb&&(!Array.isArray(e.meanRgb)||e.meanRgb.length!==3||!e.meanRgb.every(Bg)))throw new Error(`config.meanRgb has to be an array of shape [number, number, number], have: ${JSON.stringify(e.meanRgb)}`)}function Np(e){return O(()=>{let t=B(e,ke(.10000000149011612));return Z(Xe(ce(e,t)),t)})}function Vr(e,t){return O(()=>{let n=ya(e,[[0,0],[1,1],[1,1],[0,0]]);return n=Dt(n,t.conv.filters,[1,1],"valid"),n=ce(n,t.bn.sub),n=B(n,t.bn.truediv),n=Z(n,t.conv.bias),Np(n)})}function Ur(e,t){return O(()=>{let n=ya(e,[[0,0],[1,1],[1,1],[0,0]]);return n=Cs(n,t.depthwise_filter,t.pointwise_filter,[1,1],"valid"),n=Z(n,t.bias),Np(n)})}function Jpe(e,t){let n=bp(e,t);function a(i,o){let l=Ke(e(i)),u=Ke(e(i));return t.push({paramPath:`${o}/sub`},{paramPath:`${o}/truediv`}),{sub:l,truediv:u}}function r(i,o,l){let u=n(i,o,3,`${l}/conv`),p=a(o,`${l}/bn`);return{conv:u,bn:p}}let s=xp(e,t);return{extractConvParams:n,extractConvWithBatchNormParams:r,extractSeparableConvParams:s}}function b$(e,t,n,a){let{extractWeights:r,getRemainingWeights:s}=Dn(e),i=[],{extractConvParams:o,extractConvWithBatchNormParams:l,extractSeparableConvParams:u}=Jpe(r,i),p;if(t.withSeparableConvs){let[d,c,h,m,f,g,y,b,x]=a,v=t.isFirstLayerConv2d?o(d,c,3,"conv0"):u(d,c,"conv0"),I=u(c,h,"conv1"),T=u(h,m,"conv2"),_=u(m,f,"conv3"),A=u(f,g,"conv4"),F=u(g,y,"conv5"),P=b?u(y,b,"conv6"):void 0,$=x?u(b,x,"conv7"):void 0,S=o(x||b||y,5*n,1,"conv8");p={conv0:v,conv1:I,conv2:T,conv3:_,conv4:A,conv5:F,conv6:P,conv7:$,conv8:S}}else{let[d,c,h,m,f,g,y,b,x]=a,v=l(d,c,"conv0"),I=l(c,h,"conv1"),T=l(h,m,"conv2"),_=l(m,f,"conv3"),A=l(f,g,"conv4"),F=l(g,y,"conv5"),P=l(y,b,"conv6"),$=l(b,x,"conv7"),S=o(x,5*n,1,"conv8");p={conv0:v,conv1:I,conv2:T,conv3:_,conv4:A,conv5:F,conv6:P,conv7:$,conv8:S}}if(s().length!==0)throw new Error(`weights remaing after extract: ${s().length}`);return{params:p,paramMappings:i}}function Zpe(e,t){let n=sa(e,t);function a(o){let l=n(`${o}/sub`,1),u=n(`${o}/truediv`,1);return{sub:l,truediv:u}}function r(o){let l=n(`${o}/filters`,4),u=n(`${o}/bias`,1);return{filters:l,bias:u}}function s(o){let l=r(`${o}/conv`),u=a(`${o}/bn`);return{conv:l,bn:u}}let i=vp(n);return{extractConvParams:r,extractConvWithBatchNormParams:s,extractSeparableConvParams:i}}function x$(e,t){let n=[],{extractConvParams:a,extractConvWithBatchNormParams:r,extractSeparableConvParams:s}=Zpe(e,n),i;if(t.withSeparableConvs){let o=t.filterSizes&&t.filterSizes.length||9;i={conv0:t.isFirstLayerConv2d?a("conv0"):s("conv0"),conv1:s("conv1"),conv2:s("conv2"),conv3:s("conv3"),conv4:s("conv4"),conv5:s("conv5"),conv6:o>7?s("conv6"):void 0,conv7:o>8?s("conv7"):void 0,conv8:a("conv8")}}else i={conv0:r("conv0"),conv1:r("conv1"),conv2:r("conv2"),conv3:r("conv3"),conv4:r("conv4"),conv5:r("conv5"),conv6:r("conv6"),conv7:r("conv7"),conv8:a("conv8")};return Fn(e,n),{params:i,paramMappings:n}}var ar=class{constructor({inputSize:t,scoreThreshold:n}={}){this._name="TinyYolov2Options";if(this._inputSize=t||416,this._scoreThreshold=n||.5,typeof this._inputSize!="number"||this._inputSize%32!==0)throw new Error(`${this._name} - expected inputSize to be a number divisible by 32`);if(typeof this._scoreThreshold!="number"||this._scoreThreshold<=0||this._scoreThreshold>=1)throw new Error(`${this._name} - expected scoreThreshold to be a number between 0 and 1`)}get inputSize(){return this._inputSize}get scoreThreshold(){return this._scoreThreshold}};var J1=class extends on{constructor(n){super("TinyYolov2");Y1(n),this._config=n}get config(){return this._config}get withClassScores(){return this.config.withClassScores||this.config.classes.length>1}get boxEncodingSize(){return 5+(this.withClassScores?this.config.classes.length:0)}runTinyYolov2(n,a){let r=Vr(n,a.conv0);return r=Mt(r,[2,2],[2,2],"same"),r=Vr(r,a.conv1),r=Mt(r,[2,2],[2,2],"same"),r=Vr(r,a.conv2),r=Mt(r,[2,2],[2,2],"same"),r=Vr(r,a.conv3),r=Mt(r,[2,2],[2,2],"same"),r=Vr(r,a.conv4),r=Mt(r,[2,2],[2,2],"same"),r=Vr(r,a.conv5),r=Mt(r,[2,2],[1,1],"same"),r=Vr(r,a.conv6),r=Vr(r,a.conv7),zo(r,a.conv8,"valid",!1)}runMobilenet(n,a){let r=this.config.isFirstLayerConv2d?Np(zo(n,a.conv0,"valid",!1)):Ur(n,a.conv0);return r=Mt(r,[2,2],[2,2],"same"),r=Ur(r,a.conv1),r=Mt(r,[2,2],[2,2],"same"),r=Ur(r,a.conv2),r=Mt(r,[2,2],[2,2],"same"),r=Ur(r,a.conv3),r=Mt(r,[2,2],[2,2],"same"),r=Ur(r,a.conv4),r=Mt(r,[2,2],[2,2],"same"),r=Ur(r,a.conv5),r=Mt(r,[2,2],[1,1],"same"),r=a.conv6?Ur(r,a.conv6):r,r=a.conv7?Ur(r,a.conv7):r,zo(r,a.conv8,"valid",!1)}forwardInput(n,a){let{params:r}=this;if(!r)throw new Error("TinyYolov2 - load model before inference");return O(()=>{let s=le(n.toBatchTensor(a,!1),"float32");return s=this.config.meanRgb?tr(s,this.config.meanRgb):s,s=s.div(255),this.config.withSeparableConvs?this.runMobilenet(s,r):this.runTinyYolov2(s,r)})}async forward(n,a){return this.forwardInput(await vt(n),a)}async detect(n,a={}){let{inputSize:r,scoreThreshold:s}=new ar(a),i=await vt(n),o=await this.forwardInput(i,r),l=O(()=>mt(o)[0].expandDims()),u={width:i.getInputWidth(0),height:i.getInputHeight(0)},p=await this.extractBoxes(l,i.getReshapedInputDimensions(0),s);o.dispose(),l.dispose();let d=p.map(y=>y.box),c=p.map(y=>y.score),h=p.map(y=>y.classScore),m=p.map(y=>this.config.classes[y.label]);return T1(d.map(y=>y.rescale(r)),c,this.config.iouThreshold,!0).map(y=>new Lr(c[y],h[y],m[y],d[y],u))}getDefaultModelName(){return""}extractParamsFromWeightMap(n){return x$(n,this.config)}extractParams(n){let a=this.config.filterSizes||J1.DEFAULT_FILTER_SIZES,r=a?a.length:void 0;if(r!==7&&r!==8&&r!==9)throw new Error(`TinyYolov2 - expected 7 | 8 | 9 convolutional filters, but found ${r} filterSizes in config`);return b$(n,this.config,this.boxEncodingSize,a)}async extractBoxes(n,a,r){let{width:s,height:i}=a,o=Math.max(s,i),l=o/s,u=o/i,p=n.shape[1],d=this.config.anchors.length,[c,h,m]=O(()=>{let b=n.reshape([p,p,d,this.boxEncodingSize]),x=b.slice([0,0,0,0],[p,p,d,4]),v=b.slice([0,0,0,4],[p,p,d,1]),I=this.withClassScores?Za(b.slice([0,0,0,5],[p,p,d,this.config.classes.length]),3):ke(0);return[x,v,I]}),f=[],g=await h.array(),y=await c.array();for(let b=0;br){let T=(x+kd(y[b][x][v][0]))/p*l,_=(b+kd(y[b][x][v][1]))/p*u,A=Math.exp(y[b][x][v][2])*this.config.anchors[v].x/p*l,F=Math.exp(y[b][x][v][3])*this.config.anchors[v].y/p*u,P=T-A/2,$=_-F/2,S={row:b,col:x,anchor:v},{classScore:M,label:U}=this.withClassScores?await this.extractPredictedClass(m,S):{classScore:1,label:0};f.push({box:new Fo(P,$,P+A,$+F),score:I,classScore:I*M,label:U,...S})}}return c.dispose(),h.dispose(),m.dispose(),f}async extractPredictedClass(n,a){let{row:r,col:s,anchor:i}=a,o=await n.array();return Array(this.config.classes.length).fill(0).map((l,u)=>o[r][s][i][u]).map((l,u)=>({classScore:l,label:u})).reduce((l,u)=>l.classScore>u.classScore?l:u)}},Go=J1;Go.DEFAULT_FILTER_SIZES=[3,16,32,64,128,256,512,1024,1024];var Ho=class extends Go{constructor(t=!0){let n={withSeparableConvs:t,iouThreshold:d$,classes:["face"],...t?{anchors:m$,meanRgb:f$}:{anchors:h$,withClassScores:!0}};super(n)}get withSeparableConvs(){return this.config.withSeparableConvs}get anchors(){return this.config.anchors}async locateFaces(t,n){return(await this.detect(t,n)).map(r=>new xt(r.score,r.relativeBox,{width:r.imageWidth,height:r.imageHeight}))}getDefaultModelName(){return this.withSeparableConvs?y$:g$}extractParamsFromWeightMap(t){return super.extractParamsFromWeightMap(t)}};function Qpe(e,t=!0){let n=new Ho(t);return n.extractWeights(e),n}var Rd=class extends ar{constructor(){super(...arguments);this._name="TinyFaceDetectorOptions"}};var wa=class{async then(t){return t(await this.run())}async run(){throw new Error("ComposableTask - run is not implemented")}};async function jo(e,t,n,a,r=({alignedRect:s})=>s){let s=e.map(l=>Bo(l)?r(l):l.detection),i=a||(t instanceof Ae?await yp(t,s):await gp(t,s)),o=await n(i);return i.forEach(l=>l instanceof Ae&&l.dispose()),o}async function Tp(e,t,n,a,r){return jo([e],t,async s=>n(s[0]),a,r)}var v$=.4,w$=[new Pe(1.603231,2.094468),new Pe(6.041143,7.080126),new Pe(2.882459,3.518061),new Pe(4.266906,5.178857),new Pe(9.041765,10.66308)],k$=[117.001,114.697,97.404];var qo=class extends Go{constructor(){let t={withSeparableConvs:!0,iouThreshold:v$,classes:["face"],anchors:w$,meanRgb:k$,isFirstLayerConv2d:!0,filterSizes:[3,16,32,64,128,256,512]};super(t)}get anchors(){return this.config.anchors}async locateFaces(t,n){return(await this.detect(t,n)).map(r=>new xt(r.score,r.relativeBox,{width:r.imageWidth,height:r.imageHeight}))}getDefaultModelName(){return"tiny_face_detector_model"}extractParamsFromWeightMap(t){return super.extractParamsFromWeightMap(t)}};var tt={ssdMobilenetv1:new Fs,tinyFaceDetector:new qo,tinyYolov2:new Ho,faceLandmark68Net:new Wo,faceLandmark68TinyNet:new Fd,faceRecognitionNet:new Vo,faceExpressionNet:new Ad,ageGenderNet:new $d},I$=(e,t)=>tt.ssdMobilenetv1.locateFaces(e,t),ece=(e,t)=>tt.tinyFaceDetector.locateFaces(e,t),tce=(e,t)=>tt.tinyYolov2.locateFaces(e,t),S$=e=>tt.faceLandmark68Net.detectLandmarks(e),nce=e=>tt.faceLandmark68TinyNet.detectLandmarks(e),ace=e=>tt.faceRecognitionNet.computeFaceDescriptor(e),rce=e=>tt.faceExpressionNet.predictExpressions(e),sce=e=>tt.ageGenderNet.predictAgeAndGender(e),N$=e=>tt.ssdMobilenetv1.load(e),ice=e=>tt.tinyFaceDetector.load(e),oce=e=>tt.tinyYolov2.load(e),lce=e=>tt.faceLandmark68Net.load(e),uce=e=>tt.faceLandmark68TinyNet.load(e),pce=e=>tt.faceRecognitionNet.load(e),cce=e=>tt.faceExpressionNet.load(e),dce=e=>tt.ageGenderNet.load(e),hce=N$,mce=I$,fce=S$;var Wg=class extends wa{constructor(n,a,r){super();this.parentTask=n;this.input=a;this.extractedFaces=r}},Ko=class extends Wg{async run(){let t=await this.parentTask,n=await jo(t,this.input,async a=>Promise.all(a.map(r=>tt.faceExpressionNet.predictExpressions(r))),this.extractedFaces);return t.map((a,r)=>Ag(a,n[r]))}withAgeAndGender(){return new Yo(this,this.input)}},Xo=class extends Wg{async run(){let t=await this.parentTask;if(!t)return;let n=await Tp(t,this.input,a=>tt.faceExpressionNet.predictExpressions(a),this.extractedFaces);return Ag(t,n)}withAgeAndGender(){return new Jo(this,this.input)}},Ds=class extends Ko{withAgeAndGender(){return new Ms(this,this.input)}withFaceDescriptors(){return new Gr(this,this.input)}},Rs=class extends Xo{withAgeAndGender(){return new Ps(this,this.input)}withFaceDescriptor(){return new Hr(this,this.input)}};var Vg=class extends wa{constructor(n,a,r){super();this.parentTask=n;this.input=a;this.extractedFaces=r}},Yo=class extends Vg{async run(){let t=await this.parentTask,n=await jo(t,this.input,async a=>Promise.all(a.map(r=>tt.ageGenderNet.predictAgeAndGender(r))),this.extractedFaces);return t.map((a,r)=>{let{age:s,gender:i,genderProbability:o}=n[r];return Lg(zg(a,i,o),s)})}withFaceExpressions(){return new Ko(this,this.input)}},Jo=class extends Vg{async run(){let t=await this.parentTask;if(!t)return;let{age:n,gender:a,genderProbability:r}=await Tp(t,this.input,s=>tt.ageGenderNet.predictAgeAndGender(s),this.extractedFaces);return Lg(zg(t,a,r),n)}withFaceExpressions(){return new Xo(this,this.input)}},Ms=class extends Yo{withFaceExpressions(){return new Ds(this,this.input)}withFaceDescriptors(){return new Gr(this,this.input)}},Ps=class extends Jo{withFaceExpressions(){return new Rs(this,this.input)}withFaceDescriptor(){return new Hr(this,this.input)}};var Md=class extends wa{constructor(n,a){super();this.parentTask=n;this.input=a}},Gr=class extends Md{async run(){let t=await this.parentTask;return(await jo(t,this.input,a=>Promise.all(a.map(r=>tt.faceRecognitionNet.computeFaceDescriptor(r))),null,a=>a.landmarks.align(null,{useDlibAlignment:!0}))).map((a,r)=>Og(t[r],a))}withFaceExpressions(){return new Ds(this,this.input)}withAgeAndGender(){return new Ms(this,this.input)}},Hr=class extends Md{async run(){let t=await this.parentTask;if(!t)return;let n=await Tp(t,this.input,a=>tt.faceRecognitionNet.computeFaceDescriptor(a),null,a=>a.landmarks.align(null,{useDlibAlignment:!0}));return Og(t,n)}withFaceExpressions(){return new Rs(this,this.input)}withAgeAndGender(){return new Ps(this,this.input)}};var Pd=class extends wa{constructor(n,a,r){super();this.parentTask=n;this.input=a;this.useTinyLandmarkNet=r}get landmarkNet(){return this.useTinyLandmarkNet?tt.faceLandmark68TinyNet:tt.faceLandmark68Net}},Od=class extends Pd{async run(){let t=await this.parentTask,n=t.map(i=>i.detection),a=this.input instanceof Ae?await yp(this.input,n):await gp(this.input,n),r=await Promise.all(a.map(i=>this.landmarkNet.detectLandmarks(i)));return a.forEach(i=>i instanceof Ae&&i.dispose()),t.filter((i,o)=>r[o]).map((i,o)=>Ip(i,r[o]))}withFaceExpressions(){return new Ds(this,this.input)}withAgeAndGender(){return new Ms(this,this.input)}withFaceDescriptors(){return new Gr(this,this.input)}},Ld=class extends Pd{async run(){let t=await this.parentTask;if(!t)return;let{detection:n}=t,a=this.input instanceof Ae?await yp(this.input,[n]):await gp(this.input,[n]),r=await this.landmarkNet.detectLandmarks(a[0]);return a.forEach(s=>s instanceof Ae&&s.dispose()),Ip(t,r)}withFaceExpressions(){return new Rs(this,this.input)}withAgeAndGender(){return new Ps(this,this.input)}withFaceDescriptor(){return new Hr(this,this.input)}};var zd=class extends wa{constructor(n,a=new va){super();this.input=n;this.options=a}},Cp=class extends zd{async run(){let{input:t,options:n}=this,a;if(n instanceof Rd)a=tt.tinyFaceDetector.locateFaces(t,n);else if(n instanceof va)a=tt.ssdMobilenetv1.locateFaces(t,n);else if(n instanceof ar)a=tt.tinyYolov2.locateFaces(t,n);else throw new Error("detectFaces - expected options to be instance of TinyFaceDetectorOptions | SsdMobilenetv1Options | TinyYolov2Options");return a}runAndExtendWithFaceDetections(){return new Promise((t,n)=>{this.run().then(a=>t(a.map(r=>Mo({},r)))).catch(a=>n(a))})}withFaceLandmarks(t=!1){return new Od(this.runAndExtendWithFaceDetections(),this.input,t)}withFaceExpressions(){return new Ko(this.runAndExtendWithFaceDetections(),this.input)}withAgeAndGender(){return new Yo(this.runAndExtendWithFaceDetections(),this.input)}},Bd=class extends zd{async run(){let t=await new Cp(this.input,this.options),n=t[0];return t.forEach(a=>{a.score>n.score&&(n=a)}),n}runAndExtendWithFaceDetection(){return new Promise(async t=>{let n=await this.run();t(n?Mo({},n):void 0)})}withFaceLandmarks(t=!1){return new Ld(this.runAndExtendWithFaceDetection(),this.input,t)}withFaceExpressions(){return new Xo(this.runAndExtendWithFaceDetection(),this.input)}withAgeAndGender(){return new Jo(this.runAndExtendWithFaceDetection(),this.input)}};function gce(e,t=new va){return new Bd(e,t)}function Ug(e,t=new va){return new Cp(e,t)}async function T$(e,t){return Ug(e,new va(t?{minConfidence:t}:{})).withFaceLandmarks().withFaceDescriptors()}async function yce(e,t={}){return Ug(e,new ar(t)).withFaceLandmarks().withFaceDescriptors()}var bce=T$;function Z1(e,t){if(e.length!==t.length)throw new Error("euclideanDistance: arr1.length !== arr2.length");let n=Array.from(e),a=Array.from(t);return Math.sqrt(n.map((r,s)=>r-a[s]).reduce((r,s)=>r+s**2,0))}var Wd=class{constructor(t,n=.6){this._distanceThreshold=n;let a=Array.isArray(t)?t:[t];if(!a.length)throw new Error("FaceRecognizer.constructor - expected atleast one input");let r=1,s=()=>`person ${r++}`;this._labeledDescriptors=a.map(i=>{if(i instanceof xr)return i;if(i instanceof Float32Array)return new xr(s(),[i]);if(i.descriptor&&i.descriptor instanceof Float32Array)return new xr(s(),[i.descriptor]);throw new Error("FaceRecognizer.constructor - expected inputs to be of type LabeledFaceDescriptors | WithFaceDescriptor | Float32Array | Array | Float32Array>")})}get labeledDescriptors(){return this._labeledDescriptors}get distanceThreshold(){return this._distanceThreshold}computeMeanDistance(t,n){return n.map(a=>Z1(a,t)).reduce((a,r)=>a+r,0)/(n.length||1)}matchDescriptor(t){return this.labeledDescriptors.map(({descriptors:n,label:a})=>new hp(a,this.computeMeanDistance(t,n))).reduce((n,a)=>n.distancet.toJSON())}}static fromJSON(t){let n=t.labeledDescriptors.map(a=>xr.fromJSON(a));return new Wd(n,t.distanceThreshold)}};function xce(e){let t=new qo;return t.extractWeights(e),t}function C$(e,t){let{width:n,height:a}=new yn(t.width,t.height);if(n<=0||a<=0)throw new Error(`resizeResults - invalid dimensions: ${JSON.stringify({width:n,height:a})}`);if(Array.isArray(e))return e.map(r=>C$(r,{width:n,height:a}));if(Bo(e)){let r=e.detection.forSize(n,a),s=e.unshiftedLandmarks.forSize(r.box.width,r.box.height);return Ip(Mo(e,r),s)}return vr(e)?Mo(e,e.detection.forSize(n,a)):e instanceof ra||e instanceof xt?e.forSize(n,a):e}var vce=qA;return TF(wce);})(); diff --git a/dist/face-api.node-gpu.js b/dist/face-api.node-gpu.js index cf9150c..532e040 100644 --- a/dist/face-api.node-gpu.js +++ b/dist/face-api.node-gpu.js @@ -4,4 +4,4 @@ author: ' */ -"use strict";var ln=Object.create;var er=Object.defineProperty;var dn=Object.getOwnPropertyDescriptor;var hn=Object.getOwnPropertyNames;var bn=Object.getPrototypeOf,gn=Object.prototype.hasOwnProperty;var xn=(o,t)=>()=>(t||o((t={exports:{}}).exports,t),t.exports),Lr=(o,t)=>{for(var e in t)er(o,e,{get:t[e],enumerable:!0})},yo=(o,t,e,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of hn(t))!gn.call(o,n)&&n!==e&&er(o,n,{get:()=>t[n],enumerable:!(r=dn(t,n))||r.enumerable});return o};var v=(o,t,e)=>(e=o!=null?ln(bn(o)):{},yo(t||!o||!o.__esModule?er(e,"default",{value:o,enumerable:!0}):e,o)),vn=o=>yo(er({},"__esModule",{value:!0}),o);var x=xn((ka,Wr)=>{"use strict";var _o=Object.defineProperty,yn=Object.getOwnPropertyDescriptor,_n=Object.getOwnPropertyNames,Tn=Object.prototype.hasOwnProperty,Ar=(o,t,e,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of _n(t))!Tn.call(o,n)&&n!==e&&_o(o,n,{get:()=>t[n],enumerable:!(r=yn(t,n))||r.enumerable});return o},Pn=(o,t,e)=>(Ar(o,t,"default"),e&&Ar(e,t,"default")),wn=o=>Ar(_o({},"__esModule",{value:!0}),o),To={};Wr.exports=wn(To);Pn(To,require("@tensorflow/tfjs-node-gpu"),Wr.exports)});var Na={};Lr(Na,{AgeGenderNet:()=>He,BoundingBox:()=>Vt,Box:()=>F,ComposableTask:()=>J,ComputeAllFaceDescriptorsTask:()=>wt,ComputeFaceDescriptorsTaskBase:()=>Ue,ComputeSingleFaceDescriptorTask:()=>Ft,DetectAllFaceLandmarksTask:()=>qe,DetectAllFacesTask:()=>Ie,DetectFaceLandmarksTaskBase:()=>Je,DetectFacesTaskBase:()=>Ke,DetectSingleFaceLandmarksTask:()=>Ze,DetectSingleFaceTask:()=>Qe,Dimensions:()=>k,FACE_EXPRESSION_LABELS:()=>no,FaceDetection:()=>M,FaceDetectionNet:()=>uo,FaceExpressionNet:()=>Oe,FaceExpressions:()=>yt,FaceLandmark68Net:()=>Kt,FaceLandmark68TinyNet:()=>ze,FaceLandmarkNet:()=>co,FaceLandmarks:()=>z,FaceLandmarks5:()=>Yr,FaceLandmarks68:()=>Gt,FaceMatch:()=>pe,FaceMatcher:()=>tr,FaceRecognitionNet:()=>Qt,Gender:()=>Tr,LabeledBox:()=>ue,LabeledFaceDescriptors:()=>mt,NetInput:()=>ut,NeuralNetwork:()=>A,ObjectDetection:()=>bt,Point:()=>b,PredictedBox:()=>Gr,Rect:()=>Yt,SsdMobilenetv1:()=>St,SsdMobilenetv1Options:()=>X,TinyFaceDetector:()=>ne,TinyFaceDetectorOptions:()=>je,TinyYolov2:()=>re,TinyYolov2Options:()=>st,allFaces:()=>Ea,allFacesSsdMobilenetv1:()=>un,allFacesTinyYolov2:()=>Da,awaitMediaLoaded:()=>Kr,bufferToImage:()=>Qr,computeFaceDescriptor:()=>fa,createCanvas:()=>Jt,createCanvasFromMedia:()=>We,createFaceDetectionNet:()=>aa,createFaceRecognitionNet:()=>Xn,createSsdMobilenetv1:()=>Jo,createTinyFaceDetector:()=>Ma,createTinyYolov2:()=>ca,detectAllFaces:()=>Sr,detectFaceLandmarks:()=>mn,detectFaceLandmarksTiny:()=>ua,detectLandmarks:()=>wa,detectSingleFace:()=>Fa,draw:()=>so,env:()=>P,euclideanDistance:()=>go,extendWithAge:()=>Er,extendWithFaceDescriptor:()=>Dr,extendWithFaceDetection:()=>jt,extendWithFaceExpressions:()=>xr,extendWithFaceLandmarks:()=>we,extendWithGender:()=>Mr,extractFaceTensors:()=>de,extractFaces:()=>le,fetchImage:()=>An,fetchJson:()=>ro,fetchNetWeights:()=>Wn,fetchOrThrow:()=>xt,fetchVideo:()=>kn,getContext2dOrThrow:()=>O,getMediaDimensions:()=>Xt,imageTensorToCanvas:()=>to,imageToSquare:()=>eo,inverseSigmoid:()=>En,iou:()=>Or,isMediaElement:()=>ir,isMediaLoaded:()=>Ae,isWithAge:()=>Jn,isWithFaceDetection:()=>pt,isWithFaceExpressions:()=>ao,isWithFaceLandmarks:()=>Zt,isWithGender:()=>qn,loadAgeGenderModel:()=>_a,loadFaceDetectionModel:()=>Ta,loadFaceExpressionModel:()=>ya,loadFaceLandmarkModel:()=>ga,loadFaceLandmarkTinyModel:()=>xa,loadFaceRecognitionModel:()=>va,loadSsdMobilenetv1Model:()=>pn,loadTinyFaceDetectorModel:()=>ha,loadTinyYolov2Model:()=>ba,loadWeightMap:()=>oo,locateFaces:()=>Pa,matchDimensions:()=>Bn,minBbox:()=>Hr,nets:()=>w,nonMaxSuppression:()=>zr,normalize:()=>rt,padToSquare:()=>Vr,predictAgeAndGender:()=>da,recognizeFaceExpressions:()=>la,resizeResults:()=>fn,resolveInput:()=>Ut,shuffleArray:()=>Dn,sigmoid:()=>Ne,ssdMobilenetv1:()=>cn,tf:()=>Ca,tinyFaceDetector:()=>ma,tinyYolov2:()=>pa,toNetInput:()=>C,utils:()=>$r,validateConfig:()=>fo,version:()=>Ia});module.exports=vn(Na);var Ca=v(x());var so={};Lr(so,{AnchorPosition:()=>Zr,DrawBox:()=>Le,DrawBoxOptions:()=>ar,DrawFaceLandmarks:()=>yr,DrawFaceLandmarksOptions:()=>vr,DrawTextField:()=>gt,DrawTextFieldOptions:()=>fe,drawContour:()=>dt,drawDetections:()=>Ln,drawFaceExpressions:()=>Rn,drawFaceLandmarks:()=>On});function dt(o,t,e=!1){if(o.beginPath(),t.slice(1).forEach(({x:r,y:n},a)=>{let s=t[a];o.moveTo(s.x,s.y),o.lineTo(r,n)}),e){let r=t[t.length-1],n=t[0];if(!r||!n)return;o.moveTo(r.x,r.y),o.lineTo(n.x,n.y)}o.stroke()}var $r={};Lr($r,{computeReshapedDimensions:()=>Rr,getCenterPoint:()=>zt,isDimensions:()=>or,isEven:()=>rr,isFloat:()=>Br,isTensor:()=>Ot,isTensor1D:()=>Fn,isTensor2D:()=>kr,isTensor3D:()=>ht,isTensor4D:()=>U,isValidNumber:()=>et,isValidProbablitiy:()=>me,range:()=>it,round:()=>Ht});var Po=v(x());var k=class{constructor(t,e){if(!et(t)||!et(e))throw new Error(`Dimensions.constructor - expected width and height to be valid numbers, instead have ${JSON.stringify({width:t,height:e})}`);this._width=t,this._height=e}get width(){return this._width}get height(){return this._height}reverse(){return new k(1/this.width,1/this.height)}};function Ot(o,t){return o instanceof Po.Tensor&&o.shape.length===t}function Fn(o){return Ot(o,1)}function kr(o){return Ot(o,2)}function ht(o){return Ot(o,3)}function U(o){return Ot(o,4)}function Br(o){return o%1!==0}function rr(o){return o%2===0}function Ht(o,t=2){let e=10**t;return Math.floor(o*e)/e}function or(o){return o&&o.width&&o.height}function Rr({width:o,height:t},e){let r=e/Math.max(t,o);return new k(Math.round(o*r),Math.round(t*r))}function zt(o){return o.reduce((t,e)=>t.add(e),new b(0,0)).div(new b(o.length,o.length))}function it(o,t,e){return Array(o).fill(0).map((r,n)=>t+n*e)}function et(o){return!!o&&o!==1/0&&o!==-1/0&&!Number.isNaN(o)||o===0}function me(o){return et(o)&&o>=0&&o<=1}var b=class{constructor(t,e){this._x=t,this._y=e}get x(){return this._x}get y(){return this._y}add(t){return new b(this.x+t.x,this.y+t.y)}sub(t){return new b(this.x-t.x,this.y-t.y)}mul(t){return new b(this.x*t.x,this.y*t.y)}div(t){return new b(this.x/t.x,this.y/t.y)}abs(){return new b(Math.abs(this.x),Math.abs(this.y))}magnitude(){return Math.sqrt(this.x**2+this.y**2)}floor(){return new b(Math.floor(this.x),Math.floor(this.y))}};var F=class{static isRect(t){return!!t&&[t.x,t.y,t.width,t.height].every(et)}static assertIsValidBox(t,e,r=!1){if(!F.isRect(t))throw new Error(`${e} - invalid box: ${JSON.stringify(t)}, expected object with properties x, y, width, height`);if(!r&&(t.width<0||t.height<0))throw new Error(`${e} - width (${t.width}) and height (${t.height}) must be positive numbers`)}constructor(t,e=!0){let r=t||{},n=[r.left,r.top,r.right,r.bottom].every(et),a=[r.x,r.y,r.width,r.height].every(et);if(!a&&!n)throw new Error(`Box.constructor - expected box to be IBoundingBox | IRect, instead have ${JSON.stringify(r)}`);let[s,i,c,m]=a?[r.x,r.y,r.width,r.height]:[r.left,r.top,r.right-r.left,r.bottom-r.top];F.assertIsValidBox({x:s,y:i,width:c,height:m},"Box.constructor",e),this._x=s,this._y=i,this._width=c,this._height=m}get x(){return this._x}get y(){return this._y}get width(){return this._width}get height(){return this._height}get left(){return this.x}get top(){return this.y}get right(){return this.x+this.width}get bottom(){return this.y+this.height}get area(){return this.width*this.height}get topLeft(){return new b(this.left,this.top)}get topRight(){return new b(this.right,this.top)}get bottomLeft(){return new b(this.left,this.bottom)}get bottomRight(){return new b(this.right,this.bottom)}round(){let[t,e,r,n]=[this.x,this.y,this.width,this.height].map(a=>Math.round(a));return new F({x:t,y:e,width:r,height:n})}floor(){let[t,e,r,n]=[this.x,this.y,this.width,this.height].map(a=>Math.floor(a));return new F({x:t,y:e,width:r,height:n})}toSquare(){let{x:t,y:e,width:r,height:n}=this,a=Math.abs(r-n);return re&&(i=-u+e+r,u=e),f>t&&(c=-f+t+n,f=t),m<1&&(c=2-m,m=1),p<1&&(c=2-p,p=1),{dy:s,edy:c,dx:a,edx:i,y:p,ey:f,x:m,ex:u,w:r,h:n}}calibrate(t){return new F({left:this.left+t.left*this.width,top:this.top+t.top*this.height,right:this.right+t.right*this.width,bottom:this.bottom+t.bottom*this.height}).toSquare().round()}};var Vt=class extends F{constructor(t,e,r,n,a=!1){super({left:t,top:e,right:r,bottom:n},a)}};var bt=class{constructor(t,e,r,n,a){this._imageDims=new k(a.width,a.height),this._score=t,this._classScore=e,this._className=r,this._box=new F(n).rescale(this._imageDims)}get score(){return this._score}get classScore(){return this._classScore}get className(){return this._className}get box(){return this._box}get imageDims(){return this._imageDims}get imageWidth(){return this.imageDims.width}get imageHeight(){return this.imageDims.height}get relativeBox(){return new F(this._box).rescale(this.imageDims.reverse())}forSize(t,e){return new bt(this.score,this.classScore,this.className,this.relativeBox,{width:t,height:e})}};var M=class extends bt{constructor(t,e,r){super(t,t,"",e,r)}forSize(t,e){let{score:r,relativeBox:n,imageDims:a}=super.forSize(t,e);return new M(r,n,a)}};function Or(o,t,e=!0){let r=Math.max(0,Math.min(o.right,t.right)-Math.max(o.left,t.left)),n=Math.max(0,Math.min(o.bottom,t.bottom)-Math.max(o.top,t.top)),a=r*n;return e?a/(o.area+t.area-a):a/Math.min(o.area,t.area)}function Hr(o){let t=o.map(i=>i.x),e=o.map(i=>i.y),r=t.reduce((i,c)=>ccii({score:s,boxIndex:i})).sort((s,i)=>s.score-i.score).map(s=>s.boxIndex),a=[];for(;n.length>0;){let s=n.pop();a.push(s);let i=n,c=[];for(let m=0;mc[p]<=e)}return a}var ct=v(x());function rt(o,t){return ct.tidy(()=>{let[e,r,n]=t,a=ct.fill([...o.shape.slice(0,3),1],e,"float32"),s=ct.fill([...o.shape.slice(0,3),1],r,"float32"),i=ct.fill([...o.shape.slice(0,3),1],n,"float32"),c=ct.concat([a,s,i],3);return ct.sub(o,c)})}var Ct=v(x());function Vr(o,t=!1){return Ct.tidy(()=>{let[e,r]=o.shape.slice(1);if(e===r)return o;let n=Math.abs(e-r),a=Math.round(n*(t?.5:1)),s=e>r?2:1,i=f=>{let l=o.shape.slice();return l[s]=f,Ct.fill(l,0,"float32")},c=i(a),m=n-c.shape[s],u=[t&&m?i(m):null,o,c].filter(f=>!!f).map(f=>Ct.cast(f,"float32"));return Ct.concat(u,s)})}function Dn(o){let t=o.slice();for(let e=t.length-1;e>0;e--){let r=Math.floor(Math.random()*(e+1)),n=t[e];t[e]=t[r],t[r]=n}return t}function Ne(o){return 1/(1+Math.exp(-o))}function En(o){return Math.log(o/(1-o))}var Yt=class extends F{constructor(t,e,r,n,a=!1){super({x:t,y:e,width:r,height:n},a)}};var Mn=.5,Cn=.43,In=.45,z=class{constructor(t,e,r=new b(0,0)){let{width:n,height:a}=e;this._imgDims=new k(n,a),this._shift=r,this._positions=t.map(s=>s.mul(new b(n,a)).add(r))}get shift(){return new b(this._shift.x,this._shift.y)}get imageWidth(){return this._imgDims.width}get imageHeight(){return this._imgDims.height}get positions(){return this._positions}get relativePositions(){return this._positions.map(t=>t.sub(this._shift).div(new b(this.imageWidth,this.imageHeight)))}forSize(t,e){return new this.constructor(this.relativePositions,{width:t,height:e})}shiftBy(t,e){return new this.constructor(this.relativePositions,this._imgDims,new b(t,e))}shiftByPoint(t){return this.shiftBy(t.x,t.y)}align(t,e={}){if(t){let a=t instanceof M?t.box.floor():new F(t);return this.shiftBy(a.x,a.y).align(null,e)}let{useDlibAlignment:r,minBoxPadding:n}={useDlibAlignment:!1,minBoxPadding:.2,...e};return r?this.alignDlib():this.alignMinBbox(n)}alignDlib(){let t=this.getRefPointsForAlignment(),[e,r,n]=t,a=u=>n.sub(u).magnitude(),s=(a(e)+a(r))/2,i=Math.floor(s/In),c=zt(t),m=Math.floor(Math.max(0,c.x-Mn*i)),p=Math.floor(Math.max(0,c.y-Cn*i));return new Yt(m,p,Math.min(i,this.imageWidth+m),Math.min(i,this.imageHeight+p))}alignMinBbox(t){let e=Hr(this.positions);return e.pad(e.width*t,e.height*t)}getRefPointsForAlignment(){throw new Error("getRefPointsForAlignment not implemented by base class")}};var Yr=class extends z{getRefPointsForAlignment(){let t=this.positions;return[t[0],t[1],zt([t[3],t[4]])]}};var Gt=class extends z{getJawOutline(){return this.positions.slice(0,17)}getLeftEyeBrow(){return this.positions.slice(17,22)}getRightEyeBrow(){return this.positions.slice(22,27)}getNose(){return this.positions.slice(27,36)}getLeftEye(){return this.positions.slice(36,42)}getRightEye(){return this.positions.slice(42,48)}getMouth(){return this.positions.slice(48,68)}getRefPointsForAlignment(){return[this.getLeftEye(),this.getRightEye(),this.getMouth()].map(zt)}};var pe=class{constructor(t,e){this._label=t,this._distance=e}get label(){return this._label}get distance(){return this._distance}toString(t=!0){return`${this.label}${t?` (${Ht(this.distance)})`:""}`}};var ue=class extends F{constructor(e,r){super(e);this._label=r}static assertIsValidLabeledBox(e,r){if(F.assertIsValidBox(e,r),!et(e.label))throw new Error(`${r} - expected property label (${e.label}) to be a number`)}get label(){return this._label}};var mt=class{constructor(t,e){if(typeof t!="string")throw new Error("LabeledFaceDescriptors - constructor expected label to be a string");if(!Array.isArray(e)||e.some(r=>!(r instanceof Float32Array)))throw new Error("LabeledFaceDescriptors - constructor expected descriptors to be an array of Float32Array");this._label=t,this._descriptors=e}get label(){return this._label}get descriptors(){return this._descriptors}toJSON(){return{label:this.label,descriptors:this.descriptors.map(t=>Array.from(t))}}static fromJSON(t){let e=t.descriptors.map(r=>new Float32Array(r));return new mt(t.label,e)}};var Gr=class extends ue{constructor(e,r,n,a){super(e,r);this._score=n,this._classScore=a}static assertIsValidPredictedBox(e,r){if(ue.assertIsValidLabeledBox(e,r),!me(e.score)||!me(e.classScore))throw new Error(`${r} - expected properties score (${e.score}) and (${e.classScore}) to be a number between [0, 1]`)}get score(){return this._score}get classScore(){return this._classScore}};function pt(o){return o.detection instanceof M}function jt(o,t){return{...o,...{detection:t}}}function jr(){let o=window.fetch;if(!o)throw new Error("fetch - missing fetch implementation for browser environment");return{Canvas:HTMLCanvasElement,CanvasRenderingContext2D,Image:HTMLImageElement,ImageData,Video:HTMLVideoElement,createCanvasElement:()=>document.createElement("canvas"),createImageElement:()=>document.createElement("img"),createVideoElement:()=>document.createElement("video"),fetch:o,readFile:()=>{throw new Error("readFile - filesystem not available for browser environment")}}}function Se(){return typeof global=="object"&&typeof process!="undefined"&&process.versions!=null&&process.versions.node!=null}function nr(o){let t="";if(!o&&Se())try{o=require("fs")}catch(r){t=r.toString()}return{readFile:o?r=>new Promise((n,a)=>{o.readFile(r,(s,i)=>s?a(s):n(i))}):()=>{throw new Error(`readFile - failed to require fs in nodejs environment with error: ${t}`)}}}function Ur(){let o=global.Canvas||global.HTMLCanvasElement,t=global.Image||global.HTMLImageElement,e=global.Video||global.HTMLVideoElement,r=()=>{if(o)return new o;throw new Error("createCanvasElement - missing Canvas implementation for nodejs environment")},n=()=>{if(t)return new t;throw new Error("createImageElement - missing Image implementation for nodejs environment")},a=()=>{if(e)return new e;throw new Error("createVideoElement - missing Video implementation for nodejs environment")},s=global.fetch,i=nr();return{Canvas:o||class{},CanvasRenderingContext2D:global.CanvasRenderingContext2D||class{},Image:t||class{},ImageData:global.ImageData||class{},Video:global.HTMLVideoElement||class{},createCanvasElement:r,createImageElement:n,createVideoElement:a,fetch:s,...i}}function Xr(){return typeof window=="object"&&typeof document!="undefined"&&typeof HTMLImageElement!="undefined"&&typeof HTMLCanvasElement!="undefined"&&typeof HTMLVideoElement!="undefined"&&typeof ImageData!="undefined"&&typeof CanvasRenderingContext2D!="undefined"}var L;function Nn(){if(!L)throw new Error("getEnv - environment is not defined, check isNodejs() and isBrowser()");return L}function Jr(o){L=o}function qr(){return Xr()?Jr(jr()):Se()?Jr(Ur()):null}function Sn(o){if(L||qr(),!L)throw new Error("monkeyPatch - environment is not defined, check isNodejs() and isBrowser()");let{Canvas:t=L.Canvas,Image:e=L.Image}=o;L.Canvas=t,L.Image=e,L.createCanvasElement=o.createCanvasElement||(()=>new t),L.createImageElement=o.createImageElement||(()=>new e),L.ImageData=o.ImageData||L.ImageData,L.Video=o.Video||L.Video,L.fetch=o.fetch||L.fetch,L.readFile=o.readFile||L.readFile}var P={getEnv:Nn,setEnv:Jr,initialize:qr,createBrowserEnv:jr,createFileSystem:nr,createNodejsEnv:Ur,monkeyPatch:Sn,isBrowser:Xr,isNodejs:Se};qr();function Ut(o){return!P.isNodejs()&&typeof o=="string"?document.getElementById(o):o}function O(o){let{Canvas:t,CanvasRenderingContext2D:e}=P.getEnv();if(o instanceof e)return o;let r=Ut(o);if(!(r instanceof t))throw new Error("resolveContext2d - expected canvas to be of instance of Canvas");let n=r.getContext("2d");if(!n)throw new Error("resolveContext2d - canvas 2d context is null");return n}var Zr=(n=>(n.TOP_LEFT="TOP_LEFT",n.TOP_RIGHT="TOP_RIGHT",n.BOTTOM_LEFT="BOTTOM_LEFT",n.BOTTOM_RIGHT="BOTTOM_RIGHT",n))(Zr||{}),fe=class{constructor(t={}){let{anchorPosition:e,backgroundColor:r,fontColor:n,fontSize:a,fontStyle:s,padding:i}=t;this.anchorPosition=e||"TOP_LEFT",this.backgroundColor=r||"rgba(0, 0, 0, 0.5)",this.fontColor=n||"rgba(255, 255, 255, 1)",this.fontSize=a||14,this.fontStyle=s||"Georgia",this.padding=i||4}},gt=class{constructor(t,e,r={}){this.text=typeof t=="string"?[t]:t instanceof gt?t.text:t,this.anchor=e,this.options=new fe(r)}measureWidth(t){let{padding:e}=this.options;return this.text.map(r=>t.measureText(r).width).reduce((r,n)=>r{let g=c+u.x,T=c+u.y+(l+1)*s;r.fillText(f,g,T)})}};var ar=class{constructor(t={}){let{boxColor:e,lineWidth:r,label:n,drawLabelOptions:a}=t;this.boxColor=e||"rgba(0, 0, 255, 1)",this.lineWidth=r||2,this.label=n;let s={anchorPosition:"BOTTOM_LEFT",backgroundColor:this.boxColor};this.drawLabelOptions=new fe({...s,...a})}},Le=class{constructor(t,e={}){this.box=new F(t),this.options=new ar(e)}draw(t){let e=O(t),{boxColor:r,lineWidth:n}=this.options,{x:a,y:s,width:i,height:c}=this.box;e.strokeStyle=r,e.lineWidth=n,e.strokeRect(a,s,i,c);let{label:m}=this.options;m&&new gt([m],{x:a-n/2,y:s},this.options.drawLabelOptions).draw(t)}};function Ln(o,t){(Array.isArray(t)?t:[t]).forEach(r=>{let n=r instanceof M?r.score:pt(r)?r.detection.score:void 0,a=r instanceof M?r.box:pt(r)?r.detection.box:new F(r),s=n?`${Ht(n)}`:void 0;new Le(a,{label:s}).draw(o)})}var Pe=v(x());function Ae(o){let{Image:t,Video:e}=P.getEnv();return o instanceof t&&o.complete||o instanceof e&&o.readyState>=3}function Kr(o){return new Promise((t,e)=>{(o instanceof P.getEnv().Canvas||Ae(o))&&t(null);function r(a){!a.currentTarget||(a.currentTarget.removeEventListener("load",n),a.currentTarget.removeEventListener("error",r),e(a))}function n(a){!a.currentTarget||(a.currentTarget.removeEventListener("load",n),a.currentTarget.removeEventListener("error",r),t(a))}o.addEventListener("load",n),o.addEventListener("error",r)})}function Qr(o){return new Promise((t,e)=>{o instanceof Blob||e(new Error("bufferToImage - expected buf to be of type: Blob"));let r=new FileReader;r.onload=()=>{typeof r.result!="string"&&e(new Error("bufferToImage - expected reader.result to be a string, in onload"));let n=P.getEnv().createImageElement();n.onload=()=>t(n),n.onerror=e,n.src=r.result},r.onerror=e,r.readAsDataURL(o)})}function Xt(o){let{Image:t,Video:e}=P.getEnv();return o instanceof t?new k(o.naturalWidth,o.naturalHeight):o instanceof e?new k(o.videoWidth,o.videoHeight):new k(o.width,o.height)}function Jt({width:o,height:t}){let{createCanvasElement:e}=P.getEnv(),r=e();return r.width=o,r.height=t,r}function We(o,t){let{ImageData:e}=P.getEnv();if(!(o instanceof e)&&!Ae(o))throw new Error("createCanvasFromMedia - media has not finished loading yet");let{width:r,height:n}=t||Xt(o),a=Jt({width:r,height:n});return o instanceof e?O(a).putImageData(o,0,0):O(a).drawImage(o,0,0,r,n),a}var sr=v(x());async function to(o,t){let e=t||P.getEnv().createCanvasElement(),[r,n,a]=o.shape.slice(U(o)?1:0),s=sr.tidy(()=>o.as3D(r,n,a).toInt());return await sr.browser.toPixels(s,e),s.dispose(),e}function ir(o){let{Image:t,Canvas:e,Video:r}=P.getEnv();return o instanceof t||o instanceof e||o instanceof r}var V=v(x());function eo(o,t,e=!1){let{Image:r,Canvas:n}=P.getEnv();if(!(o instanceof r||o instanceof n))throw new Error("imageToSquare - expected arg0 to be HTMLImageElement | HTMLCanvasElement");if(t<=0)return Jt({width:1,height:1});let a=Xt(o),s=t/Math.max(a.height,a.width),i=s*a.width,c=s*a.height,m=Jt({width:t,height:t}),p=o instanceof n?o:We(o),u=Math.abs(i-c)/2,f=e&&i0&&p.height>0&&O(m).drawImage(p,f,l,i,c),m}var ut=class{constructor(t,e=!1){this._imageTensors=[];this._canvases=[];this._treatAsBatchInput=!1;this._inputDimensions=[];this._inputSize=0;if(!Array.isArray(t))throw new Error(`NetInput.constructor - expected inputs to be an Array of TResolvedNetInput or to be instanceof tf.Tensor4D, instead have ${t}`);this._treatAsBatchInput=e,this._batchSize=t.length,t.forEach((r,n)=>{if(ht(r)){this._imageTensors[n]=r,this._inputDimensions[n]=r.shape;return}if(U(r)){let s=r.shape[0];if(s!==1)throw new Error(`NetInput - tf.Tensor4D with batchSize ${s} passed, but not supported in input array`);this._imageTensors[n]=r,this._inputDimensions[n]=r.shape.slice(1);return}let a=r instanceof P.getEnv().Canvas?r:We(r);this._canvases[n]=a,this._inputDimensions[n]=[a.height,a.width,3]})}get imageTensors(){return this._imageTensors}get canvases(){return this._canvases}get isBatchInput(){return this.batchSize>1||this._treatAsBatchInput}get batchSize(){return this._batchSize}get inputDimensions(){return this._inputDimensions}get inputSize(){return this._inputSize}get reshapedInputDimensions(){return it(this.batchSize,0,1).map((t,e)=>this.getReshapedInputDimensions(e))}getInput(t){return this.canvases[t]||this.imageTensors[t]}getInputDimensions(t){return this._inputDimensions[t]}getInputHeight(t){return this._inputDimensions[t][0]}getInputWidth(t){return this._inputDimensions[t][1]}getReshapedInputDimensions(t){if(typeof this.inputSize!="number")throw new Error("getReshapedInputDimensions - inputSize not set, toBatchTensor has not been called yet");let e=this.getInputWidth(t),r=this.getInputHeight(t);return Rr({width:e,height:r},this.inputSize)}toBatchTensor(t,e=!0){return this._inputSize=t,V.tidy(()=>{let r=it(this.batchSize,0,1).map(a=>{let s=this.getInput(a);if(s instanceof V.Tensor){let i=U(s)?s:V.expandDims(s);return i=Vr(i,e),(i.shape[1]!==t||i.shape[2]!==t)&&(i=V.image.resizeBilinear(i,[t,t],!1,!1)),i.as3D(t,t,3)}if(s instanceof P.getEnv().Canvas)return V.browser.fromPixels(eo(s,t,e));throw new Error(`toBatchTensor - at batchIdx ${a}, expected input to be instanceof tf.Tensor or instanceof HTMLCanvasElement, instead have ${s}`)});return V.stack(r.map(a=>V.cast(a,"float32"))).as4D(this.batchSize,t,t,3)})}};async function C(o){if(o instanceof ut)return o;let t=Array.isArray(o)?o:[o];if(!t.length)throw new Error("toNetInput - empty array passed as input");let e=n=>Array.isArray(o)?` at input index ${n}:`:"",r=t.map(Ut);return r.forEach((n,a)=>{if(!ir(n)&&!ht(n)&&!U(n))throw typeof t[a]=="string"?new Error(`toNetInput -${e(a)} string passed, but could not resolve HTMLElement for element id ${t[a]}`):new Error(`toNetInput -${e(a)} expected media to be of type HTMLImageElement | HTMLVideoElement | HTMLCanvasElement | tf.Tensor3D, or to be an element id`);if(U(n)){let s=n.shape[0];if(s!==1)throw new Error(`toNetInput -${e(a)} tf.Tensor4D with batchSize ${s} passed, but not supported in input array`)}}),await Promise.all(r.map(n=>ir(n)&&Kr(n))),new ut(r,Array.isArray(o))}async function le(o,t){let{Canvas:e}=P.getEnv(),r=o;if(!(o instanceof e)){let s=await C(o);if(s.batchSize>1)throw new Error("extractFaces - batchSize > 1 not supported");let i=s.getInput(0);r=i instanceof e?i:await to(i)}let n=O(r);return t.map(s=>s instanceof M?s.forSize(r.width,r.height).box.floor():s).map(s=>s.clipAtImageBorders(r.width,r.height)).map(({x:s,y:i,width:c,height:m})=>{let p=Jt({width:c,height:m});return c>0&&m>0&&O(p).putImageData(n.getImageData(s,i,c,m),0,0),p})}var cr=v(x());async function de(o,t){if(!ht(o)&&!U(o))throw new Error("extractFaceTensors - expected image tensor to be 3D or 4D");if(U(o)&&o.shape[0]>1)throw new Error("extractFaceTensors - batchSize > 1 not supported");return cr.tidy(()=>{let[e,r,n]=o.shape.slice(U(o)?1:0);return t.map(i=>i instanceof M?i.forSize(r,e).box:i).map(i=>i.clipAtImageBorders(r,e)).filter(i=>i.width>0&&i.height>0).map(({x:i,y:c,width:m,height:p})=>cr.slice3d(o.as3D(e,r,n),[c,i,0],[p,m,n]))})}async function xt(o,t){let{fetch:e}=P.getEnv(),r=await e(o,t);if(!(r.status<400))throw new Error(`failed to fetch: (${r.status}) ${r.statusText}, from url: ${r.url}`);return r}async function An(o){let t=await xt(o),e=await t.blob();if(!e.type.startsWith("image/"))throw new Error(`fetchImage - expected blob type to be of type image/*, instead have: ${e.type}, for url: ${t.url}`);return Qr(e)}async function ro(o){return(await xt(o)).json()}async function Wn(o){return new Float32Array(await(await xt(o)).arrayBuffer())}function wo(o){return new Promise((t,e)=>{o instanceof Blob||e(new Error("bufferToVideo - expected buf to be of type: Blob"));let r=P.getEnv().createVideoElement();r.oncanplay=()=>t(r),r.onerror=e,r.playsInline=!0,r.muted=!0,r.src=URL.createObjectURL(o),r.play()})}async function kn(o){let t=await xt(o),e=await t.blob();if(!e.type.startsWith("video/"))throw new Error(`fetchVideo - expected blob type to be of type video/*, instead have: ${e.type}, for url: ${t.url}`);return wo(e)}var Fo=v(x());function mr(o,t){let e=`${t}-weights_manifest.json`;if(!o)return{modelBaseUri:"",manifestUri:e};if(o==="/")return{modelBaseUri:"/",manifestUri:`/${e}`};let r=o.startsWith("http://")?"http://":o.startsWith("https://")?"https://":"";o=o.replace(r,"");let n=o.split("/").filter(i=>i),a=o.endsWith(".json")?n[n.length-1]:e,s=r+(o.endsWith(".json")?n.slice(0,n.length-1):n).join("/");return s=o.startsWith("/")?`/${s}`:s,{modelBaseUri:s,manifestUri:s==="/"?`/${a}`:`${s}/${a}`}}async function oo(o,t){let{manifestUri:e,modelBaseUri:r}=mr(o,t),n=await ro(e);return Fo.io.loadWeights(n,r)}function Bn(o,t,e=!1){let{width:r,height:n}=e?Xt(t):t;return o.width=r,o.height=n,{width:r,height:n}}var ye=v(x());var vt=v(x());var A=class{constructor(t){this._params=void 0;this._paramMappings=[];this._name=t}get params(){return this._params}get paramMappings(){return this._paramMappings}get isLoaded(){return!!this.params}getParamFromPath(t){let{obj:e,objProp:r}=this.traversePropertyPath(t);return e[r]}reassignParamFromPath(t,e){let{obj:r,objProp:n}=this.traversePropertyPath(t);r[n].dispose(),r[n]=e}getParamList(){return this._paramMappings.map(({paramPath:t})=>({path:t,tensor:this.getParamFromPath(t)}))}getTrainableParams(){return this.getParamList().filter(t=>t.tensor instanceof vt.Variable)}getFrozenParams(){return this.getParamList().filter(t=>!(t.tensor instanceof vt.Variable))}variable(){this.getFrozenParams().forEach(({path:t,tensor:e})=>{this.reassignParamFromPath(t,e.variable())})}freeze(){this.getTrainableParams().forEach(({path:t,tensor:e})=>{let r=vt.tensor(e.dataSync());e.dispose(),this.reassignParamFromPath(t,r)})}dispose(t=!0){this.getParamList().forEach(e=>{if(t&&e.tensor.isDisposed)throw new Error(`param tensor has already been disposed for path ${e.path}`);e.tensor.dispose()}),this._params=void 0}serializeParams(){return new Float32Array(this.getParamList().map(({tensor:t})=>Array.from(t.dataSync())).reduce((t,e)=>t.concat(e)))}async load(t){if(t instanceof Float32Array){this.extractWeights(t);return}await this.loadFromUri(t)}async loadFromUri(t){if(t&&typeof t!="string")throw new Error(`${this._name}.loadFromUri - expected model uri`);let e=await oo(t,this.getDefaultModelName());this.loadFromWeightMap(e)}async loadFromDisk(t){if(t&&typeof t!="string")throw new Error(`${this._name}.loadFromDisk - expected model file path`);let{readFile:e}=P.getEnv(),{manifestUri:r,modelBaseUri:n}=mr(t,this.getDefaultModelName()),a=m=>Promise.all(m.map(p=>e(p).then(u=>u.buffer))),s=vt.io.weightsLoaderFactory(a),i=JSON.parse((await e(r)).toString()),c=await s(i,n);this.loadFromWeightMap(c)}loadFromWeightMap(t){let{paramMappings:e,params:r}=this.extractParamsFromWeightMap(t);this._paramMappings=e,this._params=r}extractWeights(t){let{paramMappings:e,params:r}=this.extractParams(t);this._paramMappings=e,this._params=r}traversePropertyPath(t){if(!this.params)throw new Error("traversePropertyPath - model has no loaded params");let e=t.split("/").reduce((a,s)=>{if(!a.nextObj.hasOwnProperty(s))throw new Error(`traversePropertyPath - object does not have property ${s}, for path ${t}`);return{obj:a.nextObj,objProp:s,nextObj:a.nextObj[s]}},{nextObj:this.params}),{obj:r,objProp:n}=e;if(!r||!n||!(r[n]instanceof vt.Tensor))throw new Error(`traversePropertyPath - parameter is not a tensor, for path ${t}`);return{obj:r,objProp:n}}};var I=v(x());var he=v(x());function H(o,t,e){return he.tidy(()=>{let r=he.separableConv2d(o,t.depthwise_filter,t.pointwise_filter,e,"same");return r=he.add(r,t.bias),r})}function pr(o,t,e=!1){return I.tidy(()=>{let r=I.relu(e?I.add(I.conv2d(o,t.conv0.filters,[2,2],"same"),t.conv0.bias):H(o,t.conv0,[2,2])),n=H(r,t.conv1,[1,1]),a=I.relu(I.add(r,n)),s=H(a,t.conv2,[1,1]);return I.relu(I.add(r,I.add(n,s)))})}function ke(o,t,e=!1,r=!0){return I.tidy(()=>{let n=I.relu(e?I.add(I.conv2d(o,t.conv0.filters,r?[2,2]:[1,1],"same"),t.conv0.bias):H(o,t.conv0,r?[2,2]:[1,1])),a=H(n,t.conv1,[1,1]),s=I.relu(I.add(n,a)),i=H(s,t.conv2,[1,1]),c=I.relu(I.add(n,I.add(a,i))),m=H(c,t.conv3,[1,1]);return I.relu(I.add(n,I.add(a,I.add(i,m))))})}var It=v(x());function qt(o,t,e="same",r=!1){return It.tidy(()=>{let n=It.add(It.conv2d(o,t.filters,[1,1],e),t.bias);return r?It.relu(n):n})}function B(o,t){Object.keys(o).forEach(e=>{t.some(r=>r.originalPath===e)||o[e].dispose()})}var ur=v(x());function be(o,t){return(e,r,n,a)=>{let s=ur.tensor4d(o(e*r*n*n),[n,n,e,r]),i=ur.tensor1d(o(r));return t.push({paramPath:`${a}/filters`},{paramPath:`${a}/bias`}),{filters:s,bias:i}}}var fr=v(x());function lr(o,t){return(e,r,n)=>{let a=fr.tensor2d(o(e*r),[e,r]),s=fr.tensor1d(o(r));return t.push({paramPath:`${n}/weights`},{paramPath:`${n}/bias`}),{weights:a,bias:s}}}var Re=v(x());var Be=class{constructor(t,e,r){this.depthwise_filter=t;this.pointwise_filter=e;this.bias=r}};function ge(o,t){return(e,r,n)=>{let a=Re.tensor4d(o(9*e),[3,3,e,1]),s=Re.tensor4d(o(e*r),[1,1,e,r]),i=Re.tensor1d(o(r));return t.push({paramPath:`${n}/depthwise_filter`},{paramPath:`${n}/pointwise_filter`},{paramPath:`${n}/bias`}),new Be(a,s,i)}}function xe(o){return t=>{let e=o(`${t}/depthwise_filter`,4),r=o(`${t}/pointwise_filter`,4),n=o(`${t}/bias`,1);return new Be(e,r,n)}}function Y(o,t){return(e,r,n)=>{let a=o[e];if(!Ot(a,r))throw new Error(`expected weightMap[${e}] to be a Tensor${r}D, instead have ${a}`);return t.push({originalPath:e,paramPath:n||e}),a}}function R(o){let t=o;function e(n){let a=t.slice(0,n);return t=t.slice(n),a}function r(){return t}return{extractWeights:e,getRemainingWeights:r}}function dr(o,t){let e=be(o,t),r=ge(o,t);function n(s,i,c,m=!1){let p=m?e(s,i,3,`${c}/conv0`):r(s,i,`${c}/conv0`),u=r(i,i,`${c}/conv1`),f=r(i,i,`${c}/conv2`);return{conv0:p,conv1:u,conv2:f}}function a(s,i,c,m=!1){let{conv0:p,conv1:u,conv2:f}=n(s,i,c,m),l=r(i,i,`${c}/conv3`);return{conv0:p,conv1:u,conv2:f,conv3:l}}return{extractDenseBlock3Params:n,extractDenseBlock4Params:a}}function Do(o){let t=[],{extractWeights:e,getRemainingWeights:r}=R(o),{extractDenseBlock4Params:n}=dr(e,t),a=n(3,32,"dense0",!0),s=n(32,64,"dense1"),i=n(64,128,"dense2"),c=n(128,256,"dense3");if(r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{paramMappings:t,params:{dense0:a,dense1:s,dense2:i,dense3:c}}}function hr(o){return t=>{let e=o(`${t}/filters`,4),r=o(`${t}/bias`,1);return{filters:e,bias:r}}}function br(o,t){let e=Y(o,t),r=hr(e),n=xe(e);function a(i,c=!1){let m=c?r(`${i}/conv0`):n(`${i}/conv0`),p=n(`${i}/conv1`),u=n(`${i}/conv2`);return{conv0:m,conv1:p,conv2:u}}function s(i,c=!1){let m=c?r(`${i}/conv0`):n(`${i}/conv0`),p=n(`${i}/conv1`),u=n(`${i}/conv2`),f=n(`${i}/conv3`);return{conv0:m,conv1:p,conv2:u,conv3:f}}return{extractDenseBlock3Params:a,extractDenseBlock4Params:s}}function Eo(o){let t=[],{extractDenseBlock4Params:e}=br(o,t),r={dense0:e("dense0",!0),dense1:e("dense1"),dense2:e("dense2"),dense3:e("dense3")};return B(o,t),{params:r,paramMappings:t}}var ve=class extends A{constructor(){super("FaceFeatureExtractor")}forwardInput(t){let{params:e}=this;if(!e)throw new Error("FaceFeatureExtractor - load model before inference");return ye.tidy(()=>{let r=ye.cast(t.toBatchTensor(112,!0),"float32"),a=rt(r,[122.782,117.001,104.298]).div(255),s=ke(a,e.dense0,!0);return s=ke(s,e.dense1),s=ke(s,e.dense2),s=ke(s,e.dense3),s=ye.avgPool(s,[7,7],[2,2],"valid"),s})}async forward(t){return this.forwardInput(await C(t))}getDefaultModelName(){return"face_feature_extractor_model"}extractParamsFromWeightMap(t){return Eo(t)}extractParams(t){return Do(t)}};var Io=v(x());var _e=v(x());function $e(o,t){return _e.tidy(()=>_e.add(_e.matMul(o,t.weights),t.bias))}function Mo(o,t,e){let r=[],{extractWeights:n,getRemainingWeights:a}=R(o),i=lr(n,r)(t,e,"fc");if(a().length!==0)throw new Error(`weights remaing after extract: ${a().length}`);return{paramMappings:r,params:{fc:i}}}function Co(o){let t=[],e=Y(o,t);function r(a){let s=e(`${a}/weights`,2),i=e(`${a}/bias`,1);return{weights:s,bias:i}}let n={fc:r("fc")};return B(o,t),{params:n,paramMappings:t}}function gr(o){let t={},e={};return Object.keys(o).forEach(r=>{let n=r.startsWith("fc")?e:t;n[r]=o[r]}),{featureExtractorMap:t,classifierMap:e}}var Te=class extends A{constructor(e,r){super(e);this._faceFeatureExtractor=r}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(e){let{params:r}=this;if(!r)throw new Error(`${this._name} - load model before inference`);return Io.tidy(()=>{let n=e instanceof ut?this.faceFeatureExtractor.forwardInput(e):e;return $e(n.as2D(n.shape[0],-1),r.fc)})}dispose(e=!0){this.faceFeatureExtractor.dispose(e),super.dispose(e)}loadClassifierParams(e){let{params:r,paramMappings:n}=this.extractClassifierParams(e);this._params=r,this._paramMappings=n}extractClassifierParams(e){return Mo(e,this.getClassifierChannelsIn(),this.getClassifierChannelsOut())}extractParamsFromWeightMap(e){let{featureExtractorMap:r,classifierMap:n}=gr(e);return this.faceFeatureExtractor.loadFromWeightMap(r),Co(n)}extractParams(e){let r=this.getClassifierChannelsIn(),n=this.getClassifierChannelsOut(),a=n*r+n,s=e.slice(0,e.length-a),i=e.slice(e.length-a);return this.faceFeatureExtractor.extractWeights(s),this.extractClassifierParams(i)}};var no=["neutral","happy","sad","angry","fearful","disgusted","surprised"],yt=class{constructor(t){this.neutral=0;this.happy=0;this.sad=0;this.angry=0;this.fearful=0;this.disgusted=0;this.surprised=0;if(t.length!==7)throw new Error(`FaceExpressions.constructor - expected probabilities.length to be 7, have: ${t.length}`);no.forEach((e,r)=>{this[e]=t[r]})}asSortedArray(){return no.map(t=>({expression:t,probability:this[t]})).sort((t,e)=>e.probability-t.probability)}};var Oe=class extends Te{constructor(t=new ve){super("FaceExpressionNet",t)}forwardInput(t){return Pe.tidy(()=>Pe.softmax(this.runNet(t)))}async forward(t){return this.forwardInput(await C(t))}async predictExpressions(t){let e=await C(t),r=await this.forwardInput(e),n=await Promise.all(Pe.unstack(r).map(async s=>{let i=s.dataSync();return s.dispose(),i}));r.dispose();let a=n.map(s=>new yt(s));return e.isBatchInput?a:a[0]}getDefaultModelName(){return"face_expression_model"}getClassifierChannelsIn(){return 256}getClassifierChannelsOut(){return 7}};function ao(o){return o.expressions instanceof yt}function xr(o,t){return{...o,...{expressions:t}}}function Rn(o,t,e=.1,r){(Array.isArray(t)?t:[t]).forEach(a=>{let s=a instanceof yt?a:ao(a)?a.expressions:void 0;if(!s)throw new Error("drawFaceExpressions - expected faceExpressions to be FaceExpressions | WithFaceExpressions<{}> or array thereof");let c=s.asSortedArray().filter(u=>u.probability>e),m=pt(a)?a.detection.box.bottomLeft:r||new b(0,0);new gt(c.map(u=>`${u.expression} (${Ht(u.probability)})`),m).draw(o)})}function Zt(o){return pt(o)&&o.landmarks instanceof z&&o.unshiftedLandmarks instanceof z&&o.alignedRect instanceof M}function $n(o){let t=(i,c,m,p)=>Math.atan2(p-c,m-i)%Math.PI,e=i=>i*180/Math.PI,r={roll:void 0,pitch:void 0,yaw:void 0};if(!o||!o._positions||o._positions.length!==68)return r;let n=o._positions;r.roll=-t(n[36]._x,n[36]._y,n[45]._x,n[45]._y),r.pitch=t(0,Math.abs(n[0]._x-n[30]._x)/n[30]._x,Math.PI,Math.abs(n[16]._x-n[30]._x)/n[30]._x);let a=n.reduce((i,c)=>ii>c._y?i:c._y,-1/0);return r.yaw=Math.PI*(o._imgDims._height/(s-a)/1.4-1),r}function we(o,t){let{box:e}=o.detection,r=t.shiftBy(e.x,e.y),n=r.align(),{imageDims:a}=o.detection,s=new M(o.detection.score,n.rescale(a.reverse()),a),i=$n(t);return{...o,...{landmarks:r,unshiftedLandmarks:t,alignedRect:s,angle:i}}}var vr=class{constructor(t={}){let{drawLines:e=!0,drawPoints:r=!0,lineWidth:n,lineColor:a,pointSize:s,pointColor:i}=t;this.drawLines=e,this.drawPoints=r,this.lineWidth=n||1,this.pointSize=s||2,this.lineColor=a||"rgba(0, 255, 255, 1)",this.pointColor=i||"rgba(255, 0, 255, 1)"}},yr=class{constructor(t,e={}){this.faceLandmarks=t,this.options=new vr(e)}draw(t){let e=O(t),{drawLines:r,drawPoints:n,lineWidth:a,lineColor:s,pointSize:i,pointColor:c}=this.options;if(r&&this.faceLandmarks instanceof Gt&&(e.strokeStyle=s,e.lineWidth=a,dt(e,this.faceLandmarks.getJawOutline()),dt(e,this.faceLandmarks.getLeftEyeBrow()),dt(e,this.faceLandmarks.getRightEyeBrow()),dt(e,this.faceLandmarks.getNose()),dt(e,this.faceLandmarks.getLeftEye(),!0),dt(e,this.faceLandmarks.getRightEye(),!0),dt(e,this.faceLandmarks.getMouth(),!0)),n){e.strokeStyle=c,e.fillStyle=c;let m=p=>{e.beginPath(),e.arc(p.x,p.y,i,0,2*Math.PI),e.fill()};this.faceLandmarks.positions.forEach(m)}}};function On(o,t){(Array.isArray(t)?t:[t]).forEach(r=>{let n=r instanceof z?r:Zt(r)?r.landmarks:void 0;if(!n)throw new Error("drawFaceLandmarks - expected faceExpressions to be FaceLandmarks | WithFaceLandmarks> or array thereof");new yr(n).draw(o)})}var No="1.7.1";var ft=v(x());var S=v(x());function Vn(o,t){let e=be(o,t),r=ge(o,t);function n(s,i,c){let m=r(s,i,`${c}/separable_conv0`),p=r(i,i,`${c}/separable_conv1`),u=e(s,i,1,`${c}/expansion_conv`);return{separable_conv0:m,separable_conv1:p,expansion_conv:u}}function a(s,i){let c=r(s,s,`${i}/separable_conv0`),m=r(s,s,`${i}/separable_conv1`),p=r(s,s,`${i}/separable_conv2`);return{separable_conv0:c,separable_conv1:m,separable_conv2:p}}return{extractConvParams:e,extractSeparableConvParams:r,extractReductionBlockParams:n,extractMainBlockParams:a}}function So(o,t){let e=[],{extractWeights:r,getRemainingWeights:n}=R(o),{extractConvParams:a,extractSeparableConvParams:s,extractReductionBlockParams:i,extractMainBlockParams:c}=Vn(r,e),m=a(3,32,3,"entry_flow/conv_in"),p=i(32,64,"entry_flow/reduction_block_0"),u=i(64,128,"entry_flow/reduction_block_1"),f={conv_in:m,reduction_block_0:p,reduction_block_1:u},l={};it(t,0,1).forEach(h=>{l[`main_block_${h}`]=c(128,`middle_flow/main_block_${h}`)});let g=i(128,256,"exit_flow/reduction_block"),T=s(256,512,"exit_flow/separable_conv"),D={reduction_block:g,separable_conv:T};if(n().length!==0)throw new Error(`weights remaing after extract: ${n().length}`);return{paramMappings:e,params:{entry_flow:f,middle_flow:l,exit_flow:D}}}function Yn(o,t){let e=Y(o,t),r=hr(e),n=xe(e);function a(i){let c=n(`${i}/separable_conv0`),m=n(`${i}/separable_conv1`),p=r(`${i}/expansion_conv`);return{separable_conv0:c,separable_conv1:m,expansion_conv:p}}function s(i){let c=n(`${i}/separable_conv0`),m=n(`${i}/separable_conv1`),p=n(`${i}/separable_conv2`);return{separable_conv0:c,separable_conv1:m,separable_conv2:p}}return{extractConvParams:r,extractSeparableConvParams:n,extractReductionBlockParams:a,extractMainBlockParams:s}}function Lo(o,t){let e=[],{extractConvParams:r,extractSeparableConvParams:n,extractReductionBlockParams:a,extractMainBlockParams:s}=Yn(o,e),i=r("entry_flow/conv_in"),c=a("entry_flow/reduction_block_0"),m=a("entry_flow/reduction_block_1"),p={conv_in:i,reduction_block_0:c,reduction_block_1:m},u={};it(t,0,1).forEach(T=>{u[`main_block_${T}`]=s(`middle_flow/main_block_${T}`)});let f=a("exit_flow/reduction_block"),l=n("exit_flow/separable_conv"),g={reduction_block:f,separable_conv:l};return B(o,e),{params:{entry_flow:p,middle_flow:u,exit_flow:g},paramMappings:e}}function Ao(o,t,e){return S.add(S.conv2d(o,t.filters,e,"same"),t.bias)}function io(o,t,e=!0){let r=e?S.relu(o):o;return r=H(r,t.separable_conv0,[1,1]),r=H(S.relu(r),t.separable_conv1,[1,1]),r=S.maxPool(r,[3,3],[2,2],"same"),r=S.add(r,Ao(o,t.expansion_conv,[2,2])),r}function Gn(o,t){let e=H(S.relu(o),t.separable_conv0,[1,1]);return e=H(S.relu(e),t.separable_conv1,[1,1]),e=H(S.relu(e),t.separable_conv2,[1,1]),e=S.add(e,o),e}var _r=class extends A{constructor(e){super("TinyXception");this._numMainBlocks=e}forwardInput(e){let{params:r}=this;if(!r)throw new Error("TinyXception - load model before inference");return S.tidy(()=>{let n=S.cast(e.toBatchTensor(112,!0),"float32"),s=rt(n,[122.782,117.001,104.298]).div(255),i=S.relu(Ao(s,r.entry_flow.conv_in,[2,2]));return i=io(i,r.entry_flow.reduction_block_0,!1),i=io(i,r.entry_flow.reduction_block_1),it(this._numMainBlocks,0,1).forEach(c=>{i=Gn(i,r.middle_flow[`main_block_${c}`])}),i=io(i,r.exit_flow.reduction_block),i=S.relu(H(i,r.exit_flow.separable_conv,[1,1])),i})}async forward(e){return this.forwardInput(await C(e))}getDefaultModelName(){return"tiny_xception_model"}extractParamsFromWeightMap(e){return Lo(e,this._numMainBlocks)}extractParams(e){return So(e,this._numMainBlocks)}};function Wo(o){let t=[],{extractWeights:e,getRemainingWeights:r}=R(o),n=lr(e,t),a=n(512,1,"fc/age"),s=n(512,2,"fc/gender");if(r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{paramMappings:t,params:{fc:{age:a,gender:s}}}}function ko(o){let t=[],e=Y(o,t);function r(a){let s=e(`${a}/weights`,2),i=e(`${a}/bias`,1);return{weights:s,bias:i}}let n={fc:{age:r("fc/age"),gender:r("fc/gender")}};return B(o,t),{params:n,paramMappings:t}}var Tr=(e=>(e.FEMALE="female",e.MALE="male",e))(Tr||{});var He=class extends A{constructor(e=new _r(2)){super("AgeGenderNet");this._faceFeatureExtractor=e}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(e){let{params:r}=this;if(!r)throw new Error(`${this._name} - load model before inference`);return ft.tidy(()=>{let n=e instanceof ut?this.faceFeatureExtractor.forwardInput(e):e,a=ft.avgPool(n,[7,7],[2,2],"valid").as2D(n.shape[0],-1),s=$e(a,r.fc.age).as1D(),i=$e(a,r.fc.gender);return{age:s,gender:i}})}forwardInput(e){return ft.tidy(()=>{let{age:r,gender:n}=this.runNet(e);return{age:r,gender:ft.softmax(n)}})}async forward(e){return this.forwardInput(await C(e))}async predictAgeAndGender(e){let r=await C(e),n=await this.forwardInput(r),a=ft.unstack(n.age),s=ft.unstack(n.gender),i=a.map((m,p)=>({ageTensor:m,genderTensor:s[p]})),c=await Promise.all(i.map(async({ageTensor:m,genderTensor:p})=>{let u=m.dataSync()[0],f=p.dataSync()[0],l=f>.5,g=l?"male":"female",T=l?f:1-f;return m.dispose(),p.dispose(),{age:u,gender:g,genderProbability:T}}));return n.age.dispose(),n.gender.dispose(),r.isBatchInput?c:c[0]}getDefaultModelName(){return"age_gender_model"}dispose(e=!0){this.faceFeatureExtractor.dispose(e),super.dispose(e)}loadClassifierParams(e){let{params:r,paramMappings:n}=this.extractClassifierParams(e);this._params=r,this._paramMappings=n}extractClassifierParams(e){return Wo(e)}extractParamsFromWeightMap(e){let{featureExtractorMap:r,classifierMap:n}=gr(e);return this.faceFeatureExtractor.loadFromWeightMap(r),ko(n)}extractParams(e){let n=e.slice(0,e.length-1539),a=e.slice(e.length-1539);return this.faceFeatureExtractor.extractWeights(n),this.extractClassifierParams(a)}};var G=v(x());var Fe=class extends Te{postProcess(t,e,r){let n=r.map(({width:s,height:i})=>{let c=e/Math.max(i,s);return{width:s*c,height:i*c}}),a=n.length;return G.tidy(()=>{let s=(u,f)=>G.stack([G.fill([68],u,"float32"),G.fill([68],f,"float32")],1).as2D(1,136).as1D(),i=(u,f)=>{let{width:l,height:g}=n[u];return f(l,g)?Math.abs(l-g)/2:0},c=u=>i(u,(f,l)=>fi(u,(f,l)=>ls(c(f),m(f))))).div(G.stack(Array.from(Array(a),(u,f)=>s(n[f].width,n[f].height))))})}forwardInput(t){return G.tidy(()=>{let e=this.runNet(t);return this.postProcess(e,t.inputSize,t.inputDimensions.map(([r,n])=>({height:r,width:n})))})}async forward(t){return this.forwardInput(await C(t))}async detectLandmarks(t){let e=await C(t),r=G.tidy(()=>G.unstack(this.forwardInput(e))),n=await Promise.all(r.map(async(a,s)=>{let i=Array.from(a.dataSync()),c=i.filter((p,u)=>rr(u)),m=i.filter((p,u)=>!rr(u));return new Gt(Array(68).fill(0).map((p,u)=>new b(c[u],m[u])),{height:e.getInputHeight(s),width:e.getInputWidth(s)})}));return r.forEach(a=>a.dispose()),e.isBatchInput?n:n[0]}getClassifierChannelsOut(){return 136}};var Kt=class extends Fe{constructor(t=new ve){super("FaceLandmark68Net",t)}getDefaultModelName(){return"face_landmark_68_model"}getClassifierChannelsIn(){return 256}};var De=v(x());function Bo(o){let t=[],{extractDenseBlock3Params:e}=br(o,t),r={dense0:e("dense0",!0),dense1:e("dense1"),dense2:e("dense2")};return B(o,t),{params:r,paramMappings:t}}function Ro(o){let t=[],{extractWeights:e,getRemainingWeights:r}=R(o),{extractDenseBlock3Params:n}=dr(e,t),a=n(3,32,"dense0",!0),s=n(32,64,"dense1"),i=n(64,128,"dense2");if(r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{paramMappings:t,params:{dense0:a,dense1:s,dense2:i}}}var Pr=class extends A{constructor(){super("TinyFaceFeatureExtractor")}forwardInput(t){let{params:e}=this;if(!e)throw new Error("TinyFaceFeatureExtractor - load model before inference");return De.tidy(()=>{let r=De.cast(t.toBatchTensor(112,!0),"float32"),a=rt(r,[122.782,117.001,104.298]).div(255),s=pr(a,e.dense0,!0);return s=pr(s,e.dense1),s=pr(s,e.dense2),s=De.avgPool(s,[14,14],[2,2],"valid"),s})}async forward(t){return this.forwardInput(await C(t))}getDefaultModelName(){return"face_feature_extractor_tiny_model"}extractParamsFromWeightMap(t){return Bo(t)}extractParams(t){return Ro(t)}};var ze=class extends Fe{constructor(t=new Pr){super("FaceLandmark68TinyNet",t)}getDefaultModelName(){return"face_landmark_68_tiny_model"}getClassifierChannelsIn(){return 128}};var co=class extends Kt{};var nt=v(x());var Ee=v(x());var wr=v(x());function $o(o,t){return wr.add(wr.mul(o,t.weights),t.biases)}function mo(o,t,e,r,n="same"){let{filters:a,bias:s}=t.conv,i=Ee.conv2d(o,a,e,n);return i=Ee.add(i,s),i=$o(i,t.scale),r?Ee.relu(i):i}function Oo(o,t){return mo(o,t,[1,1],!0)}function po(o,t){return mo(o,t,[1,1],!1)}function Fr(o,t){return mo(o,t,[2,2],!0,"valid")}var j=v(x());function jn(o,t){function e(i,c,m){let p=o(i),u=p.length/(c*m*m);if(Br(u))throw new Error(`depth has to be an integer: ${u}, weights.length: ${p.length}, numFilters: ${c}, filterSize: ${m}`);return j.tidy(()=>j.transpose(j.tensor4d(p,[c,u,m,m]),[2,3,1,0]))}function r(i,c,m,p){let u=e(i,c,m),f=j.tensor1d(o(c));return t.push({paramPath:`${p}/filters`},{paramPath:`${p}/bias`}),{filters:u,bias:f}}function n(i,c){let m=j.tensor1d(o(i)),p=j.tensor1d(o(i));return t.push({paramPath:`${c}/weights`},{paramPath:`${c}/biases`}),{weights:m,biases:p}}function a(i,c,m,p){let u=r(i,c,m,`${p}/conv`),f=n(c,`${p}/scale`);return{conv:u,scale:f}}function s(i,c,m,p,u=!1){let f=a((u?.5:1)*i,c,m,`${p}/conv1`),l=a(i,c,m,`${p}/conv2`);return{conv1:f,conv2:l}}return{extractConvLayerParams:a,extractResidualLayerParams:s}}function Ho(o){let{extractWeights:t,getRemainingWeights:e}=R(o),r=[],{extractConvLayerParams:n,extractResidualLayerParams:a}=jn(t,r),s=n(4704,32,7,"conv32_down"),i=a(9216,32,3,"conv32_1"),c=a(9216,32,3,"conv32_2"),m=a(9216,32,3,"conv32_3"),p=a(36864,64,3,"conv64_down",!0),u=a(36864,64,3,"conv64_1"),f=a(36864,64,3,"conv64_2"),l=a(36864,64,3,"conv64_3"),g=a(147456,128,3,"conv128_down",!0),T=a(147456,128,3,"conv128_1"),D=a(147456,128,3,"conv128_2"),h=a(589824,256,3,"conv256_down",!0),_=a(589824,256,3,"conv256_1"),y=a(589824,256,3,"conv256_2"),E=a(589824,256,3,"conv256_down_out"),W=j.tidy(()=>j.transpose(j.tensor2d(t(256*128),[128,256]),[1,0]));if(r.push({paramPath:"fc"}),e().length!==0)throw new Error(`weights remaing after extract: ${e().length}`);return{params:{conv32_down:s,conv32_1:i,conv32_2:c,conv32_3:m,conv64_down:p,conv64_1:u,conv64_2:f,conv64_3:l,conv128_down:g,conv128_1:T,conv128_2:D,conv256_down:h,conv256_1:_,conv256_2:y,conv256_down_out:E,fc:W},paramMappings:r}}function Un(o,t){let e=Y(o,t);function r(s){let i=e(`${s}/scale/weights`,1),c=e(`${s}/scale/biases`,1);return{weights:i,biases:c}}function n(s){let i=e(`${s}/conv/filters`,4),c=e(`${s}/conv/bias`,1),m=r(s);return{conv:{filters:i,bias:c},scale:m}}function a(s){return{conv1:n(`${s}/conv1`),conv2:n(`${s}/conv2`)}}return{extractConvLayerParams:n,extractResidualLayerParams:a}}function zo(o){let t=[],{extractConvLayerParams:e,extractResidualLayerParams:r}=Un(o,t),n=e("conv32_down"),a=r("conv32_1"),s=r("conv32_2"),i=r("conv32_3"),c=r("conv64_down"),m=r("conv64_1"),p=r("conv64_2"),u=r("conv64_3"),f=r("conv128_down"),l=r("conv128_1"),g=r("conv128_2"),T=r("conv256_down"),D=r("conv256_1"),h=r("conv256_2"),_=r("conv256_down_out"),{fc:y}=o;if(t.push({originalPath:"fc",paramPath:"fc"}),!kr(y))throw new Error(`expected weightMap[fc] to be a Tensor2D, instead have ${y}`);let E={conv32_down:n,conv32_1:a,conv32_2:s,conv32_3:i,conv64_down:c,conv64_1:m,conv64_2:p,conv64_3:u,conv128_down:f,conv128_1:l,conv128_2:g,conv256_down:T,conv256_1:D,conv256_2:h,conv256_down_out:_,fc:y};return B(o,t),{params:E,paramMappings:t}}var $=v(x());function ot(o,t){let e=Oo(o,t.conv1);return e=po(e,t.conv2),e=$.add(e,o),e=$.relu(e),e}function Ve(o,t){let e=Fr(o,t.conv1);e=po(e,t.conv2);let r=$.avgPool(o,2,2,"valid"),n=$.zeros(r.shape),a=r.shape[3]!==e.shape[3];if(r.shape[1]!==e.shape[1]||r.shape[2]!==e.shape[2]){let i=[...e.shape];i[1]=1;let c=$.zeros(i);e=$.concat([e,c],1);let m=[...e.shape];m[2]=1;let p=$.zeros(m);e=$.concat([e,p],2)}return r=a?$.concat([r,n],3):r,e=$.add(r,e),e=$.relu(e),e}var Qt=class extends A{constructor(){super("FaceRecognitionNet")}forwardInput(t){let{params:e}=this;if(!e)throw new Error("FaceRecognitionNet - load model before inference");return nt.tidy(()=>{let r=nt.cast(t.toBatchTensor(150,!0),"float32"),a=rt(r,[122.782,117.001,104.298]).div(255),s=Fr(a,e.conv32_down);s=nt.maxPool(s,3,2,"valid"),s=ot(s,e.conv32_1),s=ot(s,e.conv32_2),s=ot(s,e.conv32_3),s=Ve(s,e.conv64_down),s=ot(s,e.conv64_1),s=ot(s,e.conv64_2),s=ot(s,e.conv64_3),s=Ve(s,e.conv128_down),s=ot(s,e.conv128_1),s=ot(s,e.conv128_2),s=Ve(s,e.conv256_down),s=ot(s,e.conv256_1),s=ot(s,e.conv256_2),s=Ve(s,e.conv256_down_out);let i=s.mean([1,2]);return nt.matMul(i,e.fc)})}async forward(t){return this.forwardInput(await C(t))}async computeFaceDescriptor(t){var a;if((a=t==null?void 0:t.shape)!=null&&a.some(s=>s<=0))return new Float32Array(128);let e=await C(t),r=nt.tidy(()=>nt.unstack(this.forwardInput(e))),n=await Promise.all(r.map(s=>s.data()));return r.forEach(s=>s.dispose()),e.isBatchInput?n:n[0]}getDefaultModelName(){return"face_recognition_model"}extractParamsFromWeightMap(t){return zo(t)}extractParams(t){return Ho(t)}};function Xn(o){let t=new Qt;return t.extractWeights(o),t}function Dr(o,t){return{...o,...{descriptor:t}}}function Jn(o){return typeof o.age=="number"}function Er(o,t){return{...o,...{age:t}}}function qn(o){return(o.gender==="male"||o.gender==="female")&&me(o.genderProbability)}function Mr(o,t,e){return{...o,...{gender:t,genderProbability:e}}}var Lt=v(x());var at=v(x());function Zn(o,t){function e(c,m){let p=at.tensor4d(o(9*c),[3,3,c,1]),u=at.tensor1d(o(c)),f=at.tensor1d(o(c)),l=at.tensor1d(o(c)),g=at.tensor1d(o(c));return t.push({paramPath:`${m}/filters`},{paramPath:`${m}/batch_norm_scale`},{paramPath:`${m}/batch_norm_offset`},{paramPath:`${m}/batch_norm_mean`},{paramPath:`${m}/batch_norm_variance`}),{filters:p,batch_norm_scale:u,batch_norm_offset:f,batch_norm_mean:l,batch_norm_variance:g}}function r(c,m,p,u,f){let l=at.tensor4d(o(c*m*p*p),[p,p,c,m]),g=at.tensor1d(o(m));return t.push({paramPath:`${u}/filters`},{paramPath:`${u}/${f?"batch_norm_offset":"bias"}`}),{filters:l,bias:g}}function n(c,m,p,u){let{filters:f,bias:l}=r(c,m,p,u,!0);return{filters:f,batch_norm_offset:l}}function a(c,m,p){let u=e(c,`${p}/depthwise_conv`),f=n(c,m,1,`${p}/pointwise_conv`);return{depthwise_conv:u,pointwise_conv:f}}function s(){let c=n(3,32,3,"mobilenetv1/conv_0"),m=a(32,64,"mobilenetv1/conv_1"),p=a(64,128,"mobilenetv1/conv_2"),u=a(128,128,"mobilenetv1/conv_3"),f=a(128,256,"mobilenetv1/conv_4"),l=a(256,256,"mobilenetv1/conv_5"),g=a(256,512,"mobilenetv1/conv_6"),T=a(512,512,"mobilenetv1/conv_7"),D=a(512,512,"mobilenetv1/conv_8"),h=a(512,512,"mobilenetv1/conv_9"),_=a(512,512,"mobilenetv1/conv_10"),y=a(512,512,"mobilenetv1/conv_11"),E=a(512,1024,"mobilenetv1/conv_12"),W=a(1024,1024,"mobilenetv1/conv_13");return{conv_0:c,conv_1:m,conv_2:p,conv_3:u,conv_4:f,conv_5:l,conv_6:g,conv_7:T,conv_8:D,conv_9:h,conv_10:_,conv_11:y,conv_12:E,conv_13:W}}function i(){let c=n(1024,256,1,"prediction_layer/conv_0"),m=n(256,512,3,"prediction_layer/conv_1"),p=n(512,128,1,"prediction_layer/conv_2"),u=n(128,256,3,"prediction_layer/conv_3"),f=n(256,128,1,"prediction_layer/conv_4"),l=n(128,256,3,"prediction_layer/conv_5"),g=n(256,64,1,"prediction_layer/conv_6"),T=n(64,128,3,"prediction_layer/conv_7"),D=r(512,12,1,"prediction_layer/box_predictor_0/box_encoding_predictor"),h=r(512,9,1,"prediction_layer/box_predictor_0/class_predictor"),_=r(1024,24,1,"prediction_layer/box_predictor_1/box_encoding_predictor"),y=r(1024,18,1,"prediction_layer/box_predictor_1/class_predictor"),E=r(512,24,1,"prediction_layer/box_predictor_2/box_encoding_predictor"),W=r(512,18,1,"prediction_layer/box_predictor_2/class_predictor"),tt=r(256,24,1,"prediction_layer/box_predictor_3/box_encoding_predictor"),lt=r(256,18,1,"prediction_layer/box_predictor_3/class_predictor"),q=r(256,24,1,"prediction_layer/box_predictor_4/box_encoding_predictor"),Dt=r(256,18,1,"prediction_layer/box_predictor_4/class_predictor"),Et=r(128,24,1,"prediction_layer/box_predictor_5/box_encoding_predictor"),Mt=r(128,18,1,"prediction_layer/box_predictor_5/class_predictor");return{conv_0:c,conv_1:m,conv_2:p,conv_3:u,conv_4:f,conv_5:l,conv_6:g,conv_7:T,box_predictor_0:{box_encoding_predictor:D,class_predictor:h},box_predictor_1:{box_encoding_predictor:_,class_predictor:y},box_predictor_2:{box_encoding_predictor:E,class_predictor:W},box_predictor_3:{box_encoding_predictor:tt,class_predictor:lt},box_predictor_4:{box_encoding_predictor:q,class_predictor:Dt},box_predictor_5:{box_encoding_predictor:Et,class_predictor:Mt}}}return{extractMobilenetV1Params:s,extractPredictionLayerParams:i}}function Vo(o){let t=[],{extractWeights:e,getRemainingWeights:r}=R(o),{extractMobilenetV1Params:n,extractPredictionLayerParams:a}=Zn(e,t),s=n(),i=a(),m={extra_dim:at.tensor3d(e(5118*4),[1,5118,4])};if(t.push({paramPath:"output_layer/extra_dim"}),r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{params:{mobilenetv1:s,prediction_layer:i,output_layer:m},paramMappings:t}}function Kn(o,t){let e=Y(o,t);function r(m,p,u){let f=e(`${m}/Conv2d_${p}_pointwise/weights`,4,`${u}/filters`),l=e(`${m}/Conv2d_${p}_pointwise/convolution_bn_offset`,1,`${u}/batch_norm_offset`);return{filters:f,batch_norm_offset:l}}function n(m){let p=`mobilenetv1/conv_${m}`,u=`MobilenetV1/Conv2d_${m}_depthwise`,f=`${p}/depthwise_conv`,l=`${p}/pointwise_conv`,g=e(`${u}/depthwise_weights`,4,`${f}/filters`),T=e(`${u}/BatchNorm/gamma`,1,`${f}/batch_norm_scale`),D=e(`${u}/BatchNorm/beta`,1,`${f}/batch_norm_offset`),h=e(`${u}/BatchNorm/moving_mean`,1,`${f}/batch_norm_mean`),_=e(`${u}/BatchNorm/moving_variance`,1,`${f}/batch_norm_variance`);return{depthwise_conv:{filters:g,batch_norm_scale:T,batch_norm_offset:D,batch_norm_mean:h,batch_norm_variance:_},pointwise_conv:r("MobilenetV1",m,l)}}function a(){return{conv_0:r("MobilenetV1",0,"mobilenetv1/conv_0"),conv_1:n(1),conv_2:n(2),conv_3:n(3),conv_4:n(4),conv_5:n(5),conv_6:n(6),conv_7:n(7),conv_8:n(8),conv_9:n(9),conv_10:n(10),conv_11:n(11),conv_12:n(12),conv_13:n(13)}}function s(m,p){let u=e(`${m}/weights`,4,`${p}/filters`),f=e(`${m}/biases`,1,`${p}/bias`);return{filters:u,bias:f}}function i(m){let p=s(`Prediction/BoxPredictor_${m}/BoxEncodingPredictor`,`prediction_layer/box_predictor_${m}/box_encoding_predictor`),u=s(`Prediction/BoxPredictor_${m}/ClassPredictor`,`prediction_layer/box_predictor_${m}/class_predictor`);return{box_encoding_predictor:p,class_predictor:u}}function c(){return{conv_0:r("Prediction",0,"prediction_layer/conv_0"),conv_1:r("Prediction",1,"prediction_layer/conv_1"),conv_2:r("Prediction",2,"prediction_layer/conv_2"),conv_3:r("Prediction",3,"prediction_layer/conv_3"),conv_4:r("Prediction",4,"prediction_layer/conv_4"),conv_5:r("Prediction",5,"prediction_layer/conv_5"),conv_6:r("Prediction",6,"prediction_layer/conv_6"),conv_7:r("Prediction",7,"prediction_layer/conv_7"),box_predictor_0:i(0),box_predictor_1:i(1),box_predictor_2:i(2),box_predictor_3:i(3),box_predictor_4:i(4),box_predictor_5:i(5)}}return{extractMobilenetV1Params:a,extractPredictionLayerParams:c}}function Yo(o){let t=[],{extractMobilenetV1Params:e,extractPredictionLayerParams:r}=Kn(o,t),n=o["Output/extra_dim"];if(t.push({originalPath:"Output/extra_dim",paramPath:"output_layer/extra_dim"}),!ht(n))throw new Error(`expected weightMap['Output/extra_dim'] to be a Tensor3D, instead have ${n}`);let a={mobilenetv1:e(),prediction_layer:r(),output_layer:{extra_dim:n}};return B(o,t),{params:a,paramMappings:t}}var _t=v(x());var Nt=v(x());function Z(o,t,e){return Nt.tidy(()=>{let r=Nt.conv2d(o,t.filters,e,"same");return r=Nt.add(r,t.batch_norm_offset),Nt.clipByValue(r,0,6)})}var Qn=.0010000000474974513;function ta(o,t,e){return _t.tidy(()=>{let r=_t.depthwiseConv2d(o,t.filters,e,"same");return r=_t.batchNorm(r,t.batch_norm_mean,t.batch_norm_variance,t.batch_norm_offset,t.batch_norm_scale,Qn),_t.clipByValue(r,0,6)})}function ea(o){return[2,4,6,12].some(t=>t===o)?[2,2]:[1,1]}function Go(o,t){return _t.tidy(()=>{let e,r=Z(o,t.conv_0,[2,2]);if([t.conv_1,t.conv_2,t.conv_3,t.conv_4,t.conv_5,t.conv_6,t.conv_7,t.conv_8,t.conv_9,t.conv_10,t.conv_11,t.conv_12,t.conv_13].forEach((a,s)=>{let i=s+1,c=ea(i);r=ta(r,a.depthwise_conv,c),r=Z(r,a.pointwise_conv,[1,1]),i===11&&(e=r)}),e===null)throw new Error("mobileNetV1 - output of conv layer 11 is null");return{out:r,conv11:e}})}function ra(o,t,e){let r=o.arraySync(),n=Math.min(r[t][0],r[t][2]),a=Math.min(r[t][1],r[t][3]),s=Math.max(r[t][0],r[t][2]),i=Math.max(r[t][1],r[t][3]),c=Math.min(r[e][0],r[e][2]),m=Math.min(r[e][1],r[e][3]),p=Math.max(r[e][0],r[e][2]),u=Math.max(r[e][1],r[e][3]),f=(s-n)*(i-a),l=(p-c)*(u-m);if(f<=0||l<=0)return 0;let g=Math.max(n,c),T=Math.max(a,m),D=Math.min(s,p),h=Math.min(i,u),_=Math.max(D-g,0)*Math.max(h-T,0);return _/(f+l-_)}function jo(o,t,e,r,n){let a=o.shape[0],s=Math.min(e,a),i=t.map((p,u)=>({score:p,boxIndex:u})).filter(p=>p.score>n).sort((p,u)=>u.score-p.score),c=p=>p<=r?1:0,m=[];return i.forEach(p=>{if(m.length>=s)return;let u=p.score;for(let f=m.length-1;f>=0;--f){let l=ra(o,p.boxIndex,m[f]);if(l!==0&&(p.score*=c(l),p.score<=n))break}u===p.score&&m.push(p.boxIndex)}),m}var d=v(x());function oa(o){let t=d.unstack(d.transpose(o,[1,0])),e=[d.sub(t[2],t[0]),d.sub(t[3],t[1])],r=[d.add(t[0],d.div(e[0],2)),d.add(t[1],d.div(e[1],2))];return{sizes:e,centers:r}}function na(o,t){let{sizes:e,centers:r}=oa(o),n=d.unstack(d.transpose(t,[1,0])),a=d.div(d.mul(d.exp(d.div(n[2],5)),e[0]),2),s=d.add(d.mul(d.div(n[0],10),e[0]),r[0]),i=d.div(d.mul(d.exp(d.div(n[3],5)),e[1]),2),c=d.add(d.mul(d.div(n[1],10),e[1]),r[1]);return d.transpose(d.stack([d.sub(s,a),d.sub(c,i),d.add(s,a),d.add(c,i)]),[1,0])}function Uo(o,t,e){return d.tidy(()=>{let r=o.shape[0],n=na(d.reshape(d.tile(e.extra_dim,[r,1,1]),[-1,4]),d.reshape(o,[-1,4]));n=d.reshape(n,[r,n.shape[0]/r,4]);let a=d.sigmoid(d.slice(t,[0,0,1],[-1,-1,-1])),s=d.slice(a,[0,0,0],[-1,-1,1]);s=d.reshape(s,[r,s.shape[1]]);let i=d.unstack(n),c=d.unstack(s);return{boxes:i,scores:c}})}var Ge=v(x());var Ye=v(x());function te(o,t){return Ye.tidy(()=>{let e=o.shape[0],r=Ye.reshape(qt(o,t.box_encoding_predictor),[e,-1,1,4]),n=Ye.reshape(qt(o,t.class_predictor),[e,-1,3]);return{boxPredictionEncoding:r,classPrediction:n}})}function Xo(o,t,e){return Ge.tidy(()=>{let r=Z(o,e.conv_0,[1,1]),n=Z(r,e.conv_1,[2,2]),a=Z(n,e.conv_2,[1,1]),s=Z(a,e.conv_3,[2,2]),i=Z(s,e.conv_4,[1,1]),c=Z(i,e.conv_5,[2,2]),m=Z(c,e.conv_6,[1,1]),p=Z(m,e.conv_7,[2,2]),u=te(t,e.box_predictor_0),f=te(o,e.box_predictor_1),l=te(n,e.box_predictor_2),g=te(s,e.box_predictor_3),T=te(c,e.box_predictor_4),D=te(p,e.box_predictor_5),h=Ge.concat([u.boxPredictionEncoding,f.boxPredictionEncoding,l.boxPredictionEncoding,g.boxPredictionEncoding,T.boxPredictionEncoding,D.boxPredictionEncoding],1),_=Ge.concat([u.classPrediction,f.classPrediction,l.classPrediction,g.classPrediction,T.classPrediction,D.classPrediction],1);return{boxPredictions:h,classPredictions:_}})}var X=class{constructor({minConfidence:t,maxResults:e}={}){this._name="SsdMobilenetv1Options";if(this._minConfidence=t||.5,this._maxResults=e||100,typeof this._minConfidence!="number"||this._minConfidence<=0||this._minConfidence>=1)throw new Error(`${this._name} - expected minConfidence to be a number between 0 and 1`);if(typeof this._maxResults!="number")throw new Error(`${this._name} - expected maxResults to be a number`)}get minConfidence(){return this._minConfidence}get maxResults(){return this._maxResults}};var St=class extends A{constructor(){super("SsdMobilenetv1")}forwardInput(t){let{params:e}=this;if(!e)throw new Error("SsdMobilenetv1 - load model before inference");return Lt.tidy(()=>{let r=Lt.cast(t.toBatchTensor(512,!1),"float32"),n=Lt.sub(Lt.div(r,127.5),1),a=Go(n,e.mobilenetv1),{boxPredictions:s,classPredictions:i}=Xo(a.out,a.conv11,e.prediction_layer);return Uo(s,i,e.output_layer)})}async forward(t){return this.forwardInput(await C(t))}async locateFaces(t,e={}){let{maxResults:r,minConfidence:n}=new X(e),a=await C(t),{boxes:s,scores:i}=this.forwardInput(a),c=s[0],m=i[0];for(let y=1;y{let[E,W]=[Math.max(0,h[y][0]),Math.min(1,h[y][2])].map(q=>q*D),[tt,lt]=[Math.max(0,h[y][1]),Math.min(1,h[y][3])].map(q=>q*T);return new M(p[y],new Yt(tt,E,lt-tt,W-E),{height:a.getInputHeight(0),width:a.getInputWidth(0)})});return c.dispose(),m.dispose(),_}getDefaultModelName(){return"ssd_mobilenetv1_model"}extractParamsFromWeightMap(t){return Yo(t)}extractParams(t){return Vo(t)}};function Jo(o){let t=new St;return t.extractWeights(o),t}function aa(o){return Jo(o)}var uo=class extends St{};var qo=.4,Zo=[new b(.738768,.874946),new b(2.42204,2.65704),new b(4.30971,7.04493),new b(10.246,4.59428),new b(12.6868,11.8741)],Ko=[new b(1.603231,2.094468),new b(6.041143,7.080126),new b(2.882459,3.518061),new b(4.266906,5.178857),new b(9.041765,10.66308)],Qo=[117.001,114.697,97.404],tn="tiny_yolov2_model",en="tiny_yolov2_separable_conv_model";var N=v(x());var Cr=o=>typeof o=="number";function fo(o){if(!o)throw new Error(`invalid config: ${o}`);if(typeof o.withSeparableConvs!="boolean")throw new Error(`config.withSeparableConvs has to be a boolean, have: ${o.withSeparableConvs}`);if(!Cr(o.iouThreshold)||o.iouThreshold<0||o.iouThreshold>1)throw new Error(`config.iouThreshold has to be a number between [0, 1], have: ${o.iouThreshold}`);if(!Array.isArray(o.classes)||!o.classes.length||!o.classes.every(t=>typeof t=="string"))throw new Error(`config.classes has to be an array class names: string[], have: ${JSON.stringify(o.classes)}`);if(!Array.isArray(o.anchors)||!o.anchors.length||!o.anchors.map(t=>t||{}).every(t=>Cr(t.x)&&Cr(t.y)))throw new Error(`config.anchors has to be an array of { x: number, y: number }, have: ${JSON.stringify(o.anchors)}`);if(o.meanRgb&&(!Array.isArray(o.meanRgb)||o.meanRgb.length!==3||!o.meanRgb.every(Cr)))throw new Error(`config.meanRgb has to be an array of shape [number, number, number], have: ${JSON.stringify(o.meanRgb)}`)}var Q=v(x());var K=v(x());function Me(o){return K.tidy(()=>{let t=K.mul(o,K.scalar(.10000000149011612));return K.add(K.relu(K.sub(o,t)),t)})}function Tt(o,t){return Q.tidy(()=>{let e=Q.pad(o,[[0,0],[1,1],[1,1],[0,0]]);return e=Q.conv2d(e,t.conv.filters,[1,1],"valid"),e=Q.sub(e,t.bn.sub),e=Q.mul(e,t.bn.truediv),e=Q.add(e,t.conv.bias),Me(e)})}var At=v(x());function Pt(o,t){return At.tidy(()=>{let e=At.pad(o,[[0,0],[1,1],[1,1],[0,0]]);return e=At.separableConv2d(e,t.depthwise_filter,t.pointwise_filter,[1,1],"valid"),e=At.add(e,t.bias),Me(e)})}var lo=v(x());function sa(o,t){let e=be(o,t);function r(s,i){let c=lo.tensor1d(o(s)),m=lo.tensor1d(o(s));return t.push({paramPath:`${i}/sub`},{paramPath:`${i}/truediv`}),{sub:c,truediv:m}}function n(s,i,c){let m=e(s,i,3,`${c}/conv`),p=r(i,`${c}/bn`);return{conv:m,bn:p}}let a=ge(o,t);return{extractConvParams:e,extractConvWithBatchNormParams:n,extractSeparableConvParams:a}}function rn(o,t,e,r){let{extractWeights:n,getRemainingWeights:a}=R(o),s=[],{extractConvParams:i,extractConvWithBatchNormParams:c,extractSeparableConvParams:m}=sa(n,s),p;if(t.withSeparableConvs){let[u,f,l,g,T,D,h,_,y]=r,E=t.isFirstLayerConv2d?i(u,f,3,"conv0"):m(u,f,"conv0"),W=m(f,l,"conv1"),tt=m(l,g,"conv2"),lt=m(g,T,"conv3"),q=m(T,D,"conv4"),Dt=m(D,h,"conv5"),Et=_?m(h,_,"conv6"):void 0,Mt=y?m(_,y,"conv7"):void 0,$t=i(y||_||h,5*e,1,"conv8");p={conv0:E,conv1:W,conv2:tt,conv3:lt,conv4:q,conv5:Dt,conv6:Et,conv7:Mt,conv8:$t}}else{let[u,f,l,g,T,D,h,_,y]=r,E=c(u,f,"conv0"),W=c(f,l,"conv1"),tt=c(l,g,"conv2"),lt=c(g,T,"conv3"),q=c(T,D,"conv4"),Dt=c(D,h,"conv5"),Et=c(h,_,"conv6"),Mt=c(_,y,"conv7"),$t=i(y,5*e,1,"conv8");p={conv0:E,conv1:W,conv2:tt,conv3:lt,conv4:q,conv5:Dt,conv6:Et,conv7:Mt,conv8:$t}}if(a().length!==0)throw new Error(`weights remaing after extract: ${a().length}`);return{params:p,paramMappings:s}}function ia(o,t){let e=Y(o,t);function r(i){let c=e(`${i}/sub`,1),m=e(`${i}/truediv`,1);return{sub:c,truediv:m}}function n(i){let c=e(`${i}/filters`,4),m=e(`${i}/bias`,1);return{filters:c,bias:m}}function a(i){let c=n(`${i}/conv`),m=r(`${i}/bn`);return{conv:c,bn:m}}let s=xe(e);return{extractConvParams:n,extractConvWithBatchNormParams:a,extractSeparableConvParams:s}}function on(o,t){let e=[],{extractConvParams:r,extractConvWithBatchNormParams:n,extractSeparableConvParams:a}=ia(o,e),s;if(t.withSeparableConvs){let i=t.filterSizes&&t.filterSizes.length||9;s={conv0:t.isFirstLayerConv2d?r("conv0"):a("conv0"),conv1:a("conv1"),conv2:a("conv2"),conv3:a("conv3"),conv4:a("conv4"),conv5:a("conv5"),conv6:i>7?a("conv6"):void 0,conv7:i>8?a("conv7"):void 0,conv8:r("conv8")}}else s={conv0:n("conv0"),conv1:n("conv1"),conv2:n("conv2"),conv3:n("conv3"),conv4:n("conv4"),conv5:n("conv5"),conv6:n("conv6"),conv7:n("conv7"),conv8:r("conv8")};return B(o,e),{params:s,paramMappings:e}}var st=class{constructor({inputSize:t,scoreThreshold:e}={}){this._name="TinyYolov2Options";if(this._inputSize=t||416,this._scoreThreshold=e||.5,typeof this._inputSize!="number"||this._inputSize%32!==0)throw new Error(`${this._name} - expected inputSize to be a number divisible by 32`);if(typeof this._scoreThreshold!="number"||this._scoreThreshold<=0||this._scoreThreshold>=1)throw new Error(`${this._name} - expected scoreThreshold to be a number between 0 and 1`)}get inputSize(){return this._inputSize}get scoreThreshold(){return this._scoreThreshold}};var ho=class extends A{constructor(e){super("TinyYolov2");fo(e),this._config=e}get config(){return this._config}get withClassScores(){return this.config.withClassScores||this.config.classes.length>1}get boxEncodingSize(){return 5+(this.withClassScores?this.config.classes.length:0)}runTinyYolov2(e,r){let n=Tt(e,r.conv0);return n=N.maxPool(n,[2,2],[2,2],"same"),n=Tt(n,r.conv1),n=N.maxPool(n,[2,2],[2,2],"same"),n=Tt(n,r.conv2),n=N.maxPool(n,[2,2],[2,2],"same"),n=Tt(n,r.conv3),n=N.maxPool(n,[2,2],[2,2],"same"),n=Tt(n,r.conv4),n=N.maxPool(n,[2,2],[2,2],"same"),n=Tt(n,r.conv5),n=N.maxPool(n,[2,2],[1,1],"same"),n=Tt(n,r.conv6),n=Tt(n,r.conv7),qt(n,r.conv8,"valid",!1)}runMobilenet(e,r){let n=this.config.isFirstLayerConv2d?Me(qt(e,r.conv0,"valid",!1)):Pt(e,r.conv0);return n=N.maxPool(n,[2,2],[2,2],"same"),n=Pt(n,r.conv1),n=N.maxPool(n,[2,2],[2,2],"same"),n=Pt(n,r.conv2),n=N.maxPool(n,[2,2],[2,2],"same"),n=Pt(n,r.conv3),n=N.maxPool(n,[2,2],[2,2],"same"),n=Pt(n,r.conv4),n=N.maxPool(n,[2,2],[2,2],"same"),n=Pt(n,r.conv5),n=N.maxPool(n,[2,2],[1,1],"same"),n=r.conv6?Pt(n,r.conv6):n,n=r.conv7?Pt(n,r.conv7):n,qt(n,r.conv8,"valid",!1)}forwardInput(e,r){let{params:n}=this;if(!n)throw new Error("TinyYolov2 - load model before inference");return N.tidy(()=>{let a=N.cast(e.toBatchTensor(r,!1),"float32");return a=this.config.meanRgb?rt(a,this.config.meanRgb):a,a=a.div(255),this.config.withSeparableConvs?this.runMobilenet(a,n):this.runTinyYolov2(a,n)})}async forward(e,r){return this.forwardInput(await C(e),r)}async detect(e,r={}){let{inputSize:n,scoreThreshold:a}=new st(r),s=await C(e),i=await this.forwardInput(s,n),c=N.tidy(()=>N.unstack(i)[0].expandDims()),m={width:s.getInputWidth(0),height:s.getInputHeight(0)},p=await this.extractBoxes(c,s.getReshapedInputDimensions(0),a);i.dispose(),c.dispose();let u=p.map(h=>h.box),f=p.map(h=>h.score),l=p.map(h=>h.classScore),g=p.map(h=>this.config.classes[h.label]);return zr(u.map(h=>h.rescale(n)),f,this.config.iouThreshold,!0).map(h=>new bt(f[h],l[h],g[h],u[h],m))}getDefaultModelName(){return""}extractParamsFromWeightMap(e){return on(e,this.config)}extractParams(e){let r=this.config.filterSizes||ho.DEFAULT_FILTER_SIZES,n=r?r.length:void 0;if(n!==7&&n!==8&&n!==9)throw new Error(`TinyYolov2 - expected 7 | 8 | 9 convolutional filters, but found ${n} filterSizes in config`);return rn(e,this.config,this.boxEncodingSize,r)}async extractBoxes(e,r,n){let{width:a,height:s}=r,i=Math.max(a,s),c=i/a,m=i/s,p=e.shape[1],u=this.config.anchors.length,[f,l,g]=N.tidy(()=>{let _=e.reshape([p,p,u,this.boxEncodingSize]),y=_.slice([0,0,0,0],[p,p,u,4]),E=_.slice([0,0,0,4],[p,p,u,1]),W=this.withClassScores?N.softmax(_.slice([0,0,0,5],[p,p,u,this.config.classes.length]),3):N.scalar(0);return[y,E,W]}),T=[],D=await l.array(),h=await f.array();for(let _=0;_n){let tt=(y+Ne(h[_][y][E][0]))/p*c,lt=(_+Ne(h[_][y][E][1]))/p*m,q=Math.exp(h[_][y][E][2])*this.config.anchors[E].x/p*c,Dt=Math.exp(h[_][y][E][3])*this.config.anchors[E].y/p*m,Et=tt-q/2,Mt=lt-Dt/2,$t={row:_,col:y,anchor:E},{classScore:xo,label:vo}=this.withClassScores?await this.extractPredictedClass(g,$t):{classScore:1,label:0};T.push({box:new Vt(Et,Mt,Et+q,Mt+Dt),score:W,classScore:W*xo,label:vo,...$t})}}return f.dispose(),l.dispose(),g.dispose(),T}async extractPredictedClass(e,r){let{row:n,col:a,anchor:s}=r,i=await e.array();return Array(this.config.classes.length).fill(0).map((c,m)=>i[n][a][s][m]).map((c,m)=>({classScore:c,label:m})).reduce((c,m)=>c.classScore>m.classScore?c:m)}},ee=ho;ee.DEFAULT_FILTER_SIZES=[3,16,32,64,128,256,512,1024,1024];var re=class extends ee{constructor(t=!0){let e={withSeparableConvs:t,iouThreshold:qo,classes:["face"],...t?{anchors:Ko,meanRgb:Qo}:{anchors:Zo,withClassScores:!0}};super(e)}get withSeparableConvs(){return this.config.withSeparableConvs}get anchors(){return this.config.anchors}async locateFaces(t,e){return(await this.detect(t,e)).map(n=>new M(n.score,n.relativeBox,{width:n.imageWidth,height:n.imageHeight}))}getDefaultModelName(){return this.withSeparableConvs?en:tn}extractParamsFromWeightMap(t){return super.extractParamsFromWeightMap(t)}};function ca(o,t=!0){let e=new re(t);return e.extractWeights(o),e}var je=class extends st{constructor(){super(...arguments);this._name="TinyFaceDetectorOptions"}};var J=class{async then(t){return t(await this.run())}async run(){throw new Error("ComposableTask - run is not implemented")}};var Xe=v(x());var bo=v(x());async function oe(o,t,e,r,n=({alignedRect:a})=>a){let a=o.map(c=>Zt(c)?n(c):c.detection),s=r||(t instanceof bo.Tensor?await de(t,a):await le(t,a)),i=await e(s);return s.forEach(c=>c instanceof bo.Tensor&&c.dispose()),i}async function Ce(o,t,e,r,n){return oe([o],t,async a=>e(a[0]),r,n)}var nn=.4,an=[new b(1.603231,2.094468),new b(6.041143,7.080126),new b(2.882459,3.518061),new b(4.266906,5.178857),new b(9.041765,10.66308)],sn=[117.001,114.697,97.404];var ne=class extends ee{constructor(){let t={withSeparableConvs:!0,iouThreshold:nn,classes:["face"],anchors:an,meanRgb:sn,isFirstLayerConv2d:!0,filterSizes:[3,16,32,64,128,256,512]};super(t)}get anchors(){return this.config.anchors}async locateFaces(t,e){return(await this.detect(t,e)).map(n=>new M(n.score,n.relativeBox,{width:n.imageWidth,height:n.imageHeight}))}getDefaultModelName(){return"tiny_face_detector_model"}extractParamsFromWeightMap(t){return super.extractParamsFromWeightMap(t)}};var w={ssdMobilenetv1:new St,tinyFaceDetector:new ne,tinyYolov2:new re,faceLandmark68Net:new Kt,faceLandmark68TinyNet:new ze,faceRecognitionNet:new Qt,faceExpressionNet:new Oe,ageGenderNet:new He},cn=(o,t)=>w.ssdMobilenetv1.locateFaces(o,t),ma=(o,t)=>w.tinyFaceDetector.locateFaces(o,t),pa=(o,t)=>w.tinyYolov2.locateFaces(o,t),mn=o=>w.faceLandmark68Net.detectLandmarks(o),ua=o=>w.faceLandmark68TinyNet.detectLandmarks(o),fa=o=>w.faceRecognitionNet.computeFaceDescriptor(o),la=o=>w.faceExpressionNet.predictExpressions(o),da=o=>w.ageGenderNet.predictAgeAndGender(o),pn=o=>w.ssdMobilenetv1.load(o),ha=o=>w.tinyFaceDetector.load(o),ba=o=>w.tinyYolov2.load(o),ga=o=>w.faceLandmark68Net.load(o),xa=o=>w.faceLandmark68TinyNet.load(o),va=o=>w.faceRecognitionNet.load(o),ya=o=>w.faceExpressionNet.load(o),_a=o=>w.ageGenderNet.load(o),Ta=pn,Pa=cn,wa=mn;var Ir=class extends J{constructor(e,r,n){super();this.parentTask=e;this.input=r;this.extractedFaces=n}},ae=class extends Ir{async run(){let t=await this.parentTask,e=await oe(t,this.input,async r=>Promise.all(r.map(n=>w.faceExpressionNet.predictExpressions(n))),this.extractedFaces);return t.map((r,n)=>xr(r,e[n]))}withAgeAndGender(){return new ie(this,this.input)}},se=class extends Ir{async run(){let t=await this.parentTask;if(!t)return;let e=await Ce(t,this.input,r=>w.faceExpressionNet.predictExpressions(r),this.extractedFaces);return xr(t,e)}withAgeAndGender(){return new ce(this,this.input)}},Wt=class extends ae{withAgeAndGender(){return new Bt(this,this.input)}withFaceDescriptors(){return new wt(this,this.input)}},kt=class extends se{withAgeAndGender(){return new Rt(this,this.input)}withFaceDescriptor(){return new Ft(this,this.input)}};var Nr=class extends J{constructor(e,r,n){super();this.parentTask=e;this.input=r;this.extractedFaces=n}},ie=class extends Nr{async run(){let t=await this.parentTask,e=await oe(t,this.input,async r=>Promise.all(r.map(n=>w.ageGenderNet.predictAgeAndGender(n))),this.extractedFaces);return t.map((r,n)=>{let{age:a,gender:s,genderProbability:i}=e[n];return Er(Mr(r,s,i),a)})}withFaceExpressions(){return new ae(this,this.input)}},ce=class extends Nr{async run(){let t=await this.parentTask;if(!t)return;let{age:e,gender:r,genderProbability:n}=await Ce(t,this.input,a=>w.ageGenderNet.predictAgeAndGender(a),this.extractedFaces);return Er(Mr(t,r,n),e)}withFaceExpressions(){return new se(this,this.input)}},Bt=class extends ie{withFaceExpressions(){return new Wt(this,this.input)}withFaceDescriptors(){return new wt(this,this.input)}},Rt=class extends ce{withFaceExpressions(){return new kt(this,this.input)}withFaceDescriptor(){return new Ft(this,this.input)}};var Ue=class extends J{constructor(e,r){super();this.parentTask=e;this.input=r}},wt=class extends Ue{async run(){let t=await this.parentTask;return(await oe(t,this.input,r=>Promise.all(r.map(n=>w.faceRecognitionNet.computeFaceDescriptor(n))),null,r=>r.landmarks.align(null,{useDlibAlignment:!0}))).map((r,n)=>Dr(t[n],r))}withFaceExpressions(){return new Wt(this,this.input)}withAgeAndGender(){return new Bt(this,this.input)}},Ft=class extends Ue{async run(){let t=await this.parentTask;if(!t)return;let e=await Ce(t,this.input,r=>w.faceRecognitionNet.computeFaceDescriptor(r),null,r=>r.landmarks.align(null,{useDlibAlignment:!0}));return Dr(t,e)}withFaceExpressions(){return new kt(this,this.input)}withAgeAndGender(){return new Rt(this,this.input)}};var Je=class extends J{constructor(e,r,n){super();this.parentTask=e;this.input=r;this.useTinyLandmarkNet=n}get landmarkNet(){return this.useTinyLandmarkNet?w.faceLandmark68TinyNet:w.faceLandmark68Net}},qe=class extends Je{async run(){let t=await this.parentTask,e=t.map(s=>s.detection),r=this.input instanceof Xe.Tensor?await de(this.input,e):await le(this.input,e),n=await Promise.all(r.map(s=>this.landmarkNet.detectLandmarks(s)));return r.forEach(s=>s instanceof Xe.Tensor&&s.dispose()),t.filter((s,i)=>n[i]).map((s,i)=>we(s,n[i]))}withFaceExpressions(){return new Wt(this,this.input)}withAgeAndGender(){return new Bt(this,this.input)}withFaceDescriptors(){return new wt(this,this.input)}},Ze=class extends Je{async run(){let t=await this.parentTask;if(!t)return;let{detection:e}=t,r=this.input instanceof Xe.Tensor?await de(this.input,[e]):await le(this.input,[e]),n=await this.landmarkNet.detectLandmarks(r[0]);return r.forEach(a=>a instanceof Xe.Tensor&&a.dispose()),we(t,n)}withFaceExpressions(){return new kt(this,this.input)}withAgeAndGender(){return new Rt(this,this.input)}withFaceDescriptor(){return new Ft(this,this.input)}};var Ke=class extends J{constructor(e,r=new X){super();this.input=e;this.options=r}},Ie=class extends Ke{async run(){let{input:t,options:e}=this,r;if(e instanceof je)r=w.tinyFaceDetector.locateFaces(t,e);else if(e instanceof X)r=w.ssdMobilenetv1.locateFaces(t,e);else if(e instanceof st)r=w.tinyYolov2.locateFaces(t,e);else throw new Error("detectFaces - expected options to be instance of TinyFaceDetectorOptions | SsdMobilenetv1Options | TinyYolov2Options");return r}runAndExtendWithFaceDetections(){return new Promise((t,e)=>{this.run().then(r=>t(r.map(n=>jt({},n)))).catch(r=>e(r))})}withFaceLandmarks(t=!1){return new qe(this.runAndExtendWithFaceDetections(),this.input,t)}withFaceExpressions(){return new ae(this.runAndExtendWithFaceDetections(),this.input)}withAgeAndGender(){return new ie(this.runAndExtendWithFaceDetections(),this.input)}},Qe=class extends Ke{async run(){let t=await new Ie(this.input,this.options),e=t[0];return t.forEach(r=>{r.score>e.score&&(e=r)}),e}runAndExtendWithFaceDetection(){return new Promise(async t=>{let e=await this.run();t(e?jt({},e):void 0)})}withFaceLandmarks(t=!1){return new Ze(this.runAndExtendWithFaceDetection(),this.input,t)}withFaceExpressions(){return new se(this.runAndExtendWithFaceDetection(),this.input)}withAgeAndGender(){return new ce(this.runAndExtendWithFaceDetection(),this.input)}};function Fa(o,t=new X){return new Qe(o,t)}function Sr(o,t=new X){return new Ie(o,t)}async function un(o,t){return Sr(o,new X(t?{minConfidence:t}:{})).withFaceLandmarks().withFaceDescriptors()}async function Da(o,t={}){return Sr(o,new st(t)).withFaceLandmarks().withFaceDescriptors()}var Ea=un;function go(o,t){if(o.length!==t.length)throw new Error("euclideanDistance: arr1.length !== arr2.length");let e=Array.from(o),r=Array.from(t);return Math.sqrt(e.map((n,a)=>n-r[a]).reduce((n,a)=>n+a**2,0))}var tr=class{constructor(t,e=.6){this._distanceThreshold=e;let r=Array.isArray(t)?t:[t];if(!r.length)throw new Error("FaceRecognizer.constructor - expected atleast one input");let n=1,a=()=>`person ${n++}`;this._labeledDescriptors=r.map(s=>{if(s instanceof mt)return s;if(s instanceof Float32Array)return new mt(a(),[s]);if(s.descriptor&&s.descriptor instanceof Float32Array)return new mt(a(),[s.descriptor]);throw new Error("FaceRecognizer.constructor - expected inputs to be of type LabeledFaceDescriptors | WithFaceDescriptor | Float32Array | Array | Float32Array>")})}get labeledDescriptors(){return this._labeledDescriptors}get distanceThreshold(){return this._distanceThreshold}computeMeanDistance(t,e){return e.map(r=>go(r,t)).reduce((r,n)=>r+n,0)/(e.length||1)}matchDescriptor(t){return this.labeledDescriptors.map(({descriptors:e,label:r})=>new pe(r,this.computeMeanDistance(t,e))).reduce((e,r)=>e.distancet.toJSON())}}static fromJSON(t){let e=t.labeledDescriptors.map(r=>mt.fromJSON(r));return new tr(e,t.distanceThreshold)}};function Ma(o){let t=new ne;return t.extractWeights(o),t}function fn(o,t){let{width:e,height:r}=new k(t.width,t.height);if(e<=0||r<=0)throw new Error(`resizeResults - invalid dimensions: ${JSON.stringify({width:e,height:r})}`);if(Array.isArray(o))return o.map(n=>fn(n,{width:e,height:r}));if(Zt(o)){let n=o.detection.forSize(e,r),a=o.unshiftedLandmarks.forSize(n.box.width,n.box.height);return we(jt(o,n),a)}return pt(o)?jt(o,o.detection.forSize(e,r)):o instanceof z||o instanceof M?o.forSize(e,r):o}var Ia=No;0&&(module.exports={AgeGenderNet,BoundingBox,Box,ComposableTask,ComputeAllFaceDescriptorsTask,ComputeFaceDescriptorsTaskBase,ComputeSingleFaceDescriptorTask,DetectAllFaceLandmarksTask,DetectAllFacesTask,DetectFaceLandmarksTaskBase,DetectFacesTaskBase,DetectSingleFaceLandmarksTask,DetectSingleFaceTask,Dimensions,FACE_EXPRESSION_LABELS,FaceDetection,FaceDetectionNet,FaceExpressionNet,FaceExpressions,FaceLandmark68Net,FaceLandmark68TinyNet,FaceLandmarkNet,FaceLandmarks,FaceLandmarks5,FaceLandmarks68,FaceMatch,FaceMatcher,FaceRecognitionNet,Gender,LabeledBox,LabeledFaceDescriptors,NetInput,NeuralNetwork,ObjectDetection,Point,PredictedBox,Rect,SsdMobilenetv1,SsdMobilenetv1Options,TinyFaceDetector,TinyFaceDetectorOptions,TinyYolov2,TinyYolov2Options,allFaces,allFacesSsdMobilenetv1,allFacesTinyYolov2,awaitMediaLoaded,bufferToImage,computeFaceDescriptor,createCanvas,createCanvasFromMedia,createFaceDetectionNet,createFaceRecognitionNet,createSsdMobilenetv1,createTinyFaceDetector,createTinyYolov2,detectAllFaces,detectFaceLandmarks,detectFaceLandmarksTiny,detectLandmarks,detectSingleFace,draw,env,euclideanDistance,extendWithAge,extendWithFaceDescriptor,extendWithFaceDetection,extendWithFaceExpressions,extendWithFaceLandmarks,extendWithGender,extractFaceTensors,extractFaces,fetchImage,fetchJson,fetchNetWeights,fetchOrThrow,fetchVideo,getContext2dOrThrow,getMediaDimensions,imageTensorToCanvas,imageToSquare,inverseSigmoid,iou,isMediaElement,isMediaLoaded,isWithAge,isWithFaceDetection,isWithFaceExpressions,isWithFaceLandmarks,isWithGender,loadAgeGenderModel,loadFaceDetectionModel,loadFaceExpressionModel,loadFaceLandmarkModel,loadFaceLandmarkTinyModel,loadFaceRecognitionModel,loadSsdMobilenetv1Model,loadTinyFaceDetectorModel,loadTinyYolov2Model,loadWeightMap,locateFaces,matchDimensions,minBbox,nets,nonMaxSuppression,normalize,padToSquare,predictAgeAndGender,recognizeFaceExpressions,resizeResults,resolveInput,shuffleArray,sigmoid,ssdMobilenetv1,tf,tinyFaceDetector,tinyYolov2,toNetInput,utils,validateConfig,version}); +"use strict";var ln=Object.create;var er=Object.defineProperty;var dn=Object.getOwnPropertyDescriptor;var hn=Object.getOwnPropertyNames;var bn=Object.getPrototypeOf,gn=Object.prototype.hasOwnProperty;var xn=(o,t)=>()=>(t||o((t={exports:{}}).exports,t),t.exports),Lr=(o,t)=>{for(var e in t)er(o,e,{get:t[e],enumerable:!0})},yo=(o,t,e,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of hn(t))!gn.call(o,n)&&n!==e&&er(o,n,{get:()=>t[n],enumerable:!(r=dn(t,n))||r.enumerable});return o};var v=(o,t,e)=>(e=o!=null?ln(bn(o)):{},yo(t||!o||!o.__esModule?er(e,"default",{value:o,enumerable:!0}):e,o)),vn=o=>yo(er({},"__esModule",{value:!0}),o);var x=xn((ka,Wr)=>{"use strict";var _o=Object.defineProperty,yn=Object.getOwnPropertyDescriptor,_n=Object.getOwnPropertyNames,Tn=Object.prototype.hasOwnProperty,Ar=(o,t,e,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of _n(t))!Tn.call(o,n)&&n!==e&&_o(o,n,{get:()=>t[n],enumerable:!(r=yn(t,n))||r.enumerable});return o},Pn=(o,t,e)=>(Ar(o,t,"default"),e&&Ar(e,t,"default")),wn=o=>Ar(_o({},"__esModule",{value:!0}),o),To={};Wr.exports=wn(To);Pn(To,require("@tensorflow/tfjs-node-gpu"),Wr.exports)});var Na={};Lr(Na,{AgeGenderNet:()=>He,BoundingBox:()=>Vt,Box:()=>F,ComposableTask:()=>J,ComputeAllFaceDescriptorsTask:()=>wt,ComputeFaceDescriptorsTaskBase:()=>Ue,ComputeSingleFaceDescriptorTask:()=>Ft,DetectAllFaceLandmarksTask:()=>qe,DetectAllFacesTask:()=>Ie,DetectFaceLandmarksTaskBase:()=>Je,DetectFacesTaskBase:()=>Ke,DetectSingleFaceLandmarksTask:()=>Ze,DetectSingleFaceTask:()=>Qe,Dimensions:()=>k,FACE_EXPRESSION_LABELS:()=>no,FaceDetection:()=>M,FaceDetectionNet:()=>uo,FaceExpressionNet:()=>Oe,FaceExpressions:()=>yt,FaceLandmark68Net:()=>Kt,FaceLandmark68TinyNet:()=>ze,FaceLandmarkNet:()=>co,FaceLandmarks:()=>z,FaceLandmarks5:()=>Yr,FaceLandmarks68:()=>Gt,FaceMatch:()=>pe,FaceMatcher:()=>tr,FaceRecognitionNet:()=>Qt,Gender:()=>Tr,LabeledBox:()=>ue,LabeledFaceDescriptors:()=>mt,NetInput:()=>ut,NeuralNetwork:()=>A,ObjectDetection:()=>bt,Point:()=>b,PredictedBox:()=>Gr,Rect:()=>Yt,SsdMobilenetv1:()=>St,SsdMobilenetv1Options:()=>X,TinyFaceDetector:()=>ne,TinyFaceDetectorOptions:()=>je,TinyYolov2:()=>re,TinyYolov2Options:()=>st,allFaces:()=>Ea,allFacesSsdMobilenetv1:()=>un,allFacesTinyYolov2:()=>Da,awaitMediaLoaded:()=>Kr,bufferToImage:()=>Qr,computeFaceDescriptor:()=>fa,createCanvas:()=>Jt,createCanvasFromMedia:()=>We,createFaceDetectionNet:()=>aa,createFaceRecognitionNet:()=>Xn,createSsdMobilenetv1:()=>Jo,createTinyFaceDetector:()=>Ma,createTinyYolov2:()=>ca,detectAllFaces:()=>Sr,detectFaceLandmarks:()=>mn,detectFaceLandmarksTiny:()=>ua,detectLandmarks:()=>wa,detectSingleFace:()=>Fa,draw:()=>so,env:()=>P,euclideanDistance:()=>go,extendWithAge:()=>Er,extendWithFaceDescriptor:()=>Dr,extendWithFaceDetection:()=>jt,extendWithFaceExpressions:()=>xr,extendWithFaceLandmarks:()=>we,extendWithGender:()=>Mr,extractFaceTensors:()=>de,extractFaces:()=>le,fetchImage:()=>An,fetchJson:()=>ro,fetchNetWeights:()=>Wn,fetchOrThrow:()=>xt,fetchVideo:()=>kn,getContext2dOrThrow:()=>O,getMediaDimensions:()=>Xt,imageTensorToCanvas:()=>to,imageToSquare:()=>eo,inverseSigmoid:()=>En,iou:()=>Or,isMediaElement:()=>ir,isMediaLoaded:()=>Ae,isWithAge:()=>Jn,isWithFaceDetection:()=>pt,isWithFaceExpressions:()=>ao,isWithFaceLandmarks:()=>Zt,isWithGender:()=>qn,loadAgeGenderModel:()=>_a,loadFaceDetectionModel:()=>Ta,loadFaceExpressionModel:()=>ya,loadFaceLandmarkModel:()=>ga,loadFaceLandmarkTinyModel:()=>xa,loadFaceRecognitionModel:()=>va,loadSsdMobilenetv1Model:()=>pn,loadTinyFaceDetectorModel:()=>ha,loadTinyYolov2Model:()=>ba,loadWeightMap:()=>oo,locateFaces:()=>Pa,matchDimensions:()=>Bn,minBbox:()=>Hr,nets:()=>w,nonMaxSuppression:()=>zr,normalize:()=>rt,padToSquare:()=>Vr,predictAgeAndGender:()=>da,recognizeFaceExpressions:()=>la,resizeResults:()=>fn,resolveInput:()=>Ut,shuffleArray:()=>Dn,sigmoid:()=>Ne,ssdMobilenetv1:()=>cn,tf:()=>Ca,tinyFaceDetector:()=>ma,tinyYolov2:()=>pa,toNetInput:()=>C,utils:()=>$r,validateConfig:()=>fo,version:()=>Ia});module.exports=vn(Na);var Ca=v(x());var so={};Lr(so,{AnchorPosition:()=>Zr,DrawBox:()=>Le,DrawBoxOptions:()=>ar,DrawFaceLandmarks:()=>yr,DrawFaceLandmarksOptions:()=>vr,DrawTextField:()=>gt,DrawTextFieldOptions:()=>fe,drawContour:()=>dt,drawDetections:()=>Ln,drawFaceExpressions:()=>Rn,drawFaceLandmarks:()=>On});function dt(o,t,e=!1){if(o.beginPath(),t.slice(1).forEach(({x:r,y:n},a)=>{let s=t[a];o.moveTo(s.x,s.y),o.lineTo(r,n)}),e){let r=t[t.length-1],n=t[0];if(!r||!n)return;o.moveTo(r.x,r.y),o.lineTo(n.x,n.y)}o.stroke()}var $r={};Lr($r,{computeReshapedDimensions:()=>Rr,getCenterPoint:()=>zt,isDimensions:()=>or,isEven:()=>rr,isFloat:()=>Br,isTensor:()=>Ot,isTensor1D:()=>Fn,isTensor2D:()=>kr,isTensor3D:()=>ht,isTensor4D:()=>U,isValidNumber:()=>et,isValidProbablitiy:()=>me,range:()=>it,round:()=>Ht});var Po=v(x());var k=class{constructor(t,e){if(!et(t)||!et(e))throw new Error(`Dimensions.constructor - expected width and height to be valid numbers, instead have ${JSON.stringify({width:t,height:e})}`);this._width=t,this._height=e}get width(){return this._width}get height(){return this._height}reverse(){return new k(1/this.width,1/this.height)}};function Ot(o,t){return o instanceof Po.Tensor&&o.shape.length===t}function Fn(o){return Ot(o,1)}function kr(o){return Ot(o,2)}function ht(o){return Ot(o,3)}function U(o){return Ot(o,4)}function Br(o){return o%1!==0}function rr(o){return o%2===0}function Ht(o,t=2){let e=10**t;return Math.floor(o*e)/e}function or(o){return o&&o.width&&o.height}function Rr({width:o,height:t},e){let r=e/Math.max(t,o);return new k(Math.round(o*r),Math.round(t*r))}function zt(o){return o.reduce((t,e)=>t.add(e),new b(0,0)).div(new b(o.length,o.length))}function it(o,t,e){return Array(o).fill(0).map((r,n)=>t+n*e)}function et(o){return!!o&&o!==1/0&&o!==-1/0&&!Number.isNaN(o)||o===0}function me(o){return et(o)&&o>=0&&o<=1}var b=class{constructor(t,e){this._x=t,this._y=e}get x(){return this._x}get y(){return this._y}add(t){return new b(this.x+t.x,this.y+t.y)}sub(t){return new b(this.x-t.x,this.y-t.y)}mul(t){return new b(this.x*t.x,this.y*t.y)}div(t){return new b(this.x/t.x,this.y/t.y)}abs(){return new b(Math.abs(this.x),Math.abs(this.y))}magnitude(){return Math.sqrt(this.x**2+this.y**2)}floor(){return new b(Math.floor(this.x),Math.floor(this.y))}};var F=class{static isRect(t){return!!t&&[t.x,t.y,t.width,t.height].every(et)}static assertIsValidBox(t,e,r=!1){if(!F.isRect(t))throw new Error(`${e} - invalid box: ${JSON.stringify(t)}, expected object with properties x, y, width, height`);if(!r&&(t.width<0||t.height<0))throw new Error(`${e} - width (${t.width}) and height (${t.height}) must be positive numbers`)}constructor(t,e=!0){let r=t||{},n=[r.left,r.top,r.right,r.bottom].every(et),a=[r.x,r.y,r.width,r.height].every(et);if(!a&&!n)throw new Error(`Box.constructor - expected box to be IBoundingBox | IRect, instead have ${JSON.stringify(r)}`);let[s,i,c,m]=a?[r.x,r.y,r.width,r.height]:[r.left,r.top,r.right-r.left,r.bottom-r.top];F.assertIsValidBox({x:s,y:i,width:c,height:m},"Box.constructor",e),this._x=s,this._y=i,this._width=c,this._height=m}get x(){return this._x}get y(){return this._y}get width(){return this._width}get height(){return this._height}get left(){return this.x}get top(){return this.y}get right(){return this.x+this.width}get bottom(){return this.y+this.height}get area(){return this.width*this.height}get topLeft(){return new b(this.left,this.top)}get topRight(){return new b(this.right,this.top)}get bottomLeft(){return new b(this.left,this.bottom)}get bottomRight(){return new b(this.right,this.bottom)}round(){let[t,e,r,n]=[this.x,this.y,this.width,this.height].map(a=>Math.round(a));return new F({x:t,y:e,width:r,height:n})}floor(){let[t,e,r,n]=[this.x,this.y,this.width,this.height].map(a=>Math.floor(a));return new F({x:t,y:e,width:r,height:n})}toSquare(){let{x:t,y:e,width:r,height:n}=this,a=Math.abs(r-n);return re&&(i=-u+e+r,u=e),f>t&&(c=-f+t+n,f=t),m<1&&(c=2-m,m=1),p<1&&(c=2-p,p=1),{dy:s,edy:c,dx:a,edx:i,y:p,ey:f,x:m,ex:u,w:r,h:n}}calibrate(t){return new F({left:this.left+t.left*this.width,top:this.top+t.top*this.height,right:this.right+t.right*this.width,bottom:this.bottom+t.bottom*this.height}).toSquare().round()}};var Vt=class extends F{constructor(t,e,r,n,a=!1){super({left:t,top:e,right:r,bottom:n},a)}};var bt=class{constructor(t,e,r,n,a){this._imageDims=new k(a.width,a.height),this._score=t,this._classScore=e,this._className=r,this._box=new F(n).rescale(this._imageDims)}get score(){return this._score}get classScore(){return this._classScore}get className(){return this._className}get box(){return this._box}get imageDims(){return this._imageDims}get imageWidth(){return this.imageDims.width}get imageHeight(){return this.imageDims.height}get relativeBox(){return new F(this._box).rescale(this.imageDims.reverse())}forSize(t,e){return new bt(this.score,this.classScore,this.className,this.relativeBox,{width:t,height:e})}};var M=class extends bt{constructor(t,e,r){super(t,t,"",e,r)}forSize(t,e){let{score:r,relativeBox:n,imageDims:a}=super.forSize(t,e);return new M(r,n,a)}};function Or(o,t,e=!0){let r=Math.max(0,Math.min(o.right,t.right)-Math.max(o.left,t.left)),n=Math.max(0,Math.min(o.bottom,t.bottom)-Math.max(o.top,t.top)),a=r*n;return e?a/(o.area+t.area-a):a/Math.min(o.area,t.area)}function Hr(o){let t=o.map(i=>i.x),e=o.map(i=>i.y),r=t.reduce((i,c)=>ccii({score:s,boxIndex:i})).sort((s,i)=>s.score-i.score).map(s=>s.boxIndex),a=[];for(;n.length>0;){let s=n.pop();a.push(s);let i=n,c=[];for(let m=0;mc[p]<=e)}return a}var ct=v(x());function rt(o,t){return ct.tidy(()=>{let[e,r,n]=t,a=ct.fill([...o.shape.slice(0,3),1],e,"float32"),s=ct.fill([...o.shape.slice(0,3),1],r,"float32"),i=ct.fill([...o.shape.slice(0,3),1],n,"float32"),c=ct.concat([a,s,i],3);return ct.sub(o,c)})}var Ct=v(x());function Vr(o,t=!1){return Ct.tidy(()=>{let[e,r]=o.shape.slice(1);if(e===r)return o;let n=Math.abs(e-r),a=Math.round(n*(t?.5:1)),s=e>r?2:1,i=f=>{let l=o.shape.slice();return l[s]=f,Ct.fill(l,0,"float32")},c=i(a),m=n-c.shape[s],u=[t&&m?i(m):null,o,c].filter(f=>!!f).map(f=>Ct.cast(f,"float32"));return Ct.concat(u,s)})}function Dn(o){let t=o.slice();for(let e=t.length-1;e>0;e--){let r=Math.floor(Math.random()*(e+1)),n=t[e];t[e]=t[r],t[r]=n}return t}function Ne(o){return 1/(1+Math.exp(-o))}function En(o){return Math.log(o/(1-o))}var Yt=class extends F{constructor(t,e,r,n,a=!1){super({x:t,y:e,width:r,height:n},a)}};var Mn=.5,Cn=.43,In=.45,z=class{constructor(t,e,r=new b(0,0)){let{width:n,height:a}=e;this._imgDims=new k(n,a),this._shift=r,this._positions=t.map(s=>s.mul(new b(n,a)).add(r))}get shift(){return new b(this._shift.x,this._shift.y)}get imageWidth(){return this._imgDims.width}get imageHeight(){return this._imgDims.height}get positions(){return this._positions}get relativePositions(){return this._positions.map(t=>t.sub(this._shift).div(new b(this.imageWidth,this.imageHeight)))}forSize(t,e){return new this.constructor(this.relativePositions,{width:t,height:e})}shiftBy(t,e){return new this.constructor(this.relativePositions,this._imgDims,new b(t,e))}shiftByPoint(t){return this.shiftBy(t.x,t.y)}align(t,e={}){if(t){let a=t instanceof M?t.box.floor():new F(t);return this.shiftBy(a.x,a.y).align(null,e)}let{useDlibAlignment:r,minBoxPadding:n}={useDlibAlignment:!1,minBoxPadding:.2,...e};return r?this.alignDlib():this.alignMinBbox(n)}alignDlib(){let t=this.getRefPointsForAlignment(),[e,r,n]=t,a=u=>n.sub(u).magnitude(),s=(a(e)+a(r))/2,i=Math.floor(s/In),c=zt(t),m=Math.floor(Math.max(0,c.x-Mn*i)),p=Math.floor(Math.max(0,c.y-Cn*i));return new Yt(m,p,Math.min(i,this.imageWidth+m),Math.min(i,this.imageHeight+p))}alignMinBbox(t){let e=Hr(this.positions);return e.pad(e.width*t,e.height*t)}getRefPointsForAlignment(){throw new Error("getRefPointsForAlignment not implemented by base class")}};var Yr=class extends z{getRefPointsForAlignment(){let t=this.positions;return[t[0],t[1],zt([t[3],t[4]])]}};var Gt=class extends z{getJawOutline(){return this.positions.slice(0,17)}getLeftEyeBrow(){return this.positions.slice(17,22)}getRightEyeBrow(){return this.positions.slice(22,27)}getNose(){return this.positions.slice(27,36)}getLeftEye(){return this.positions.slice(36,42)}getRightEye(){return this.positions.slice(42,48)}getMouth(){return this.positions.slice(48,68)}getRefPointsForAlignment(){return[this.getLeftEye(),this.getRightEye(),this.getMouth()].map(zt)}};var pe=class{constructor(t,e){this._label=t,this._distance=e}get label(){return this._label}get distance(){return this._distance}toString(t=!0){return`${this.label}${t?` (${Ht(this.distance)})`:""}`}};var ue=class extends F{constructor(e,r){super(e);this._label=r}static assertIsValidLabeledBox(e,r){if(F.assertIsValidBox(e,r),!et(e.label))throw new Error(`${r} - expected property label (${e.label}) to be a number`)}get label(){return this._label}};var mt=class{constructor(t,e){if(typeof t!="string")throw new Error("LabeledFaceDescriptors - constructor expected label to be a string");if(!Array.isArray(e)||e.some(r=>!(r instanceof Float32Array)))throw new Error("LabeledFaceDescriptors - constructor expected descriptors to be an array of Float32Array");this._label=t,this._descriptors=e}get label(){return this._label}get descriptors(){return this._descriptors}toJSON(){return{label:this.label,descriptors:this.descriptors.map(t=>Array.from(t))}}static fromJSON(t){let e=t.descriptors.map(r=>new Float32Array(r));return new mt(t.label,e)}};var Gr=class extends ue{constructor(e,r,n,a){super(e,r);this._score=n,this._classScore=a}static assertIsValidPredictedBox(e,r){if(ue.assertIsValidLabeledBox(e,r),!me(e.score)||!me(e.classScore))throw new Error(`${r} - expected properties score (${e.score}) and (${e.classScore}) to be a number between [0, 1]`)}get score(){return this._score}get classScore(){return this._classScore}};function pt(o){return o.detection instanceof M}function jt(o,t){return{...o,...{detection:t}}}function jr(){let o=window.fetch;if(!o)throw new Error("fetch - missing fetch implementation for browser environment");return{Canvas:HTMLCanvasElement,CanvasRenderingContext2D,Image:HTMLImageElement,ImageData,Video:HTMLVideoElement,createCanvasElement:()=>document.createElement("canvas"),createImageElement:()=>document.createElement("img"),createVideoElement:()=>document.createElement("video"),fetch:o,readFile:()=>{throw new Error("readFile - filesystem not available for browser environment")}}}function Se(){return typeof global=="object"&&typeof process!="undefined"&&process.versions!=null&&process.versions.node!=null}function nr(o){let t="";if(!o&&Se())try{o=require("fs")}catch(r){t=r.toString()}return{readFile:o?r=>new Promise((n,a)=>{o.readFile(r,(s,i)=>s?a(s):n(i))}):()=>{throw new Error(`readFile - failed to require fs in nodejs environment with error: ${t}`)}}}function Ur(){let o=global.Canvas||global.HTMLCanvasElement,t=global.Image||global.HTMLImageElement,e=global.Video||global.HTMLVideoElement,r=()=>{if(o)return new o;throw new Error("createCanvasElement - missing Canvas implementation for nodejs environment")},n=()=>{if(t)return new t;throw new Error("createImageElement - missing Image implementation for nodejs environment")},a=()=>{if(e)return new e;throw new Error("createVideoElement - missing Video implementation for nodejs environment")},s=global.fetch,i=nr();return{Canvas:o||class{},CanvasRenderingContext2D:global.CanvasRenderingContext2D||class{},Image:t||class{},ImageData:global.ImageData||class{},Video:global.HTMLVideoElement||class{},createCanvasElement:r,createImageElement:n,createVideoElement:a,fetch:s,...i}}function Xr(){return typeof window=="object"&&typeof document!="undefined"&&typeof HTMLImageElement!="undefined"&&typeof HTMLCanvasElement!="undefined"&&typeof HTMLVideoElement!="undefined"&&typeof ImageData!="undefined"&&typeof CanvasRenderingContext2D!="undefined"}var L;function Nn(){if(!L)throw new Error("getEnv - environment is not defined, check isNodejs() and isBrowser()");return L}function Jr(o){L=o}function qr(){return Xr()?Jr(jr()):Se()?Jr(Ur()):null}function Sn(o){if(L||qr(),!L)throw new Error("monkeyPatch - environment is not defined, check isNodejs() and isBrowser()");let{Canvas:t=L.Canvas,Image:e=L.Image}=o;L.Canvas=t,L.Image=e,L.createCanvasElement=o.createCanvasElement||(()=>new t),L.createImageElement=o.createImageElement||(()=>new e),L.ImageData=o.ImageData||L.ImageData,L.Video=o.Video||L.Video,L.fetch=o.fetch||L.fetch,L.readFile=o.readFile||L.readFile}var P={getEnv:Nn,setEnv:Jr,initialize:qr,createBrowserEnv:jr,createFileSystem:nr,createNodejsEnv:Ur,monkeyPatch:Sn,isBrowser:Xr,isNodejs:Se};qr();function Ut(o){return!P.isNodejs()&&typeof o=="string"?document.getElementById(o):o}function O(o){let{Canvas:t,CanvasRenderingContext2D:e}=P.getEnv();if(o instanceof e)return o;let r=Ut(o);if(!(r instanceof t))throw new Error("resolveContext2d - expected canvas to be of instance of Canvas");let n=r.getContext("2d");if(!n)throw new Error("resolveContext2d - canvas 2d context is null");return n}var Zr=(n=>(n.TOP_LEFT="TOP_LEFT",n.TOP_RIGHT="TOP_RIGHT",n.BOTTOM_LEFT="BOTTOM_LEFT",n.BOTTOM_RIGHT="BOTTOM_RIGHT",n))(Zr||{}),fe=class{constructor(t={}){let{anchorPosition:e,backgroundColor:r,fontColor:n,fontSize:a,fontStyle:s,padding:i}=t;this.anchorPosition=e||"TOP_LEFT",this.backgroundColor=r||"rgba(0, 0, 0, 0.5)",this.fontColor=n||"rgba(255, 255, 255, 1)",this.fontSize=a||14,this.fontStyle=s||"Georgia",this.padding=i||4}},gt=class{constructor(t,e,r={}){this.text=typeof t=="string"?[t]:t instanceof gt?t.text:t,this.anchor=e,this.options=new fe(r)}measureWidth(t){let{padding:e}=this.options;return this.text.map(r=>t.measureText(r).width).reduce((r,n)=>r{let g=c+u.x,T=c+u.y+(l+1)*s;r.fillText(f,g,T)})}};var ar=class{constructor(t={}){let{boxColor:e,lineWidth:r,label:n,drawLabelOptions:a}=t;this.boxColor=e||"rgba(0, 0, 255, 1)",this.lineWidth=r||2,this.label=n;let s={anchorPosition:"BOTTOM_LEFT",backgroundColor:this.boxColor};this.drawLabelOptions=new fe({...s,...a})}},Le=class{constructor(t,e={}){this.box=new F(t),this.options=new ar(e)}draw(t){let e=O(t),{boxColor:r,lineWidth:n}=this.options,{x:a,y:s,width:i,height:c}=this.box;e.strokeStyle=r,e.lineWidth=n,e.strokeRect(a,s,i,c);let{label:m}=this.options;m&&new gt([m],{x:a-n/2,y:s},this.options.drawLabelOptions).draw(t)}};function Ln(o,t){(Array.isArray(t)?t:[t]).forEach(r=>{let n=r instanceof M?r.score:pt(r)?r.detection.score:void 0,a=r instanceof M?r.box:pt(r)?r.detection.box:new F(r),s=n?`${Ht(n)}`:void 0;new Le(a,{label:s}).draw(o)})}var Pe=v(x());function Ae(o){let{Image:t,Video:e}=P.getEnv();return o instanceof t&&o.complete||o instanceof e&&o.readyState>=3}function Kr(o){return new Promise((t,e)=>{(o instanceof P.getEnv().Canvas||Ae(o))&&t(null);function r(a){!a.currentTarget||(a.currentTarget.removeEventListener("load",n),a.currentTarget.removeEventListener("error",r),e(a))}function n(a){!a.currentTarget||(a.currentTarget.removeEventListener("load",n),a.currentTarget.removeEventListener("error",r),t(a))}o.addEventListener("load",n),o.addEventListener("error",r)})}function Qr(o){return new Promise((t,e)=>{o instanceof Blob||e(new Error("bufferToImage - expected buf to be of type: Blob"));let r=new FileReader;r.onload=()=>{typeof r.result!="string"&&e(new Error("bufferToImage - expected reader.result to be a string, in onload"));let n=P.getEnv().createImageElement();n.onload=()=>t(n),n.onerror=e,n.src=r.result},r.onerror=e,r.readAsDataURL(o)})}function Xt(o){let{Image:t,Video:e}=P.getEnv();return o instanceof t?new k(o.naturalWidth,o.naturalHeight):o instanceof e?new k(o.videoWidth,o.videoHeight):new k(o.width,o.height)}function Jt({width:o,height:t}){let{createCanvasElement:e}=P.getEnv(),r=e();return r.width=o,r.height=t,r}function We(o,t){let{ImageData:e}=P.getEnv();if(!(o instanceof e)&&!Ae(o))throw new Error("createCanvasFromMedia - media has not finished loading yet");let{width:r,height:n}=t||Xt(o),a=Jt({width:r,height:n});return o instanceof e?O(a).putImageData(o,0,0):O(a).drawImage(o,0,0,r,n),a}var sr=v(x());async function to(o,t){let e=t||P.getEnv().createCanvasElement(),[r,n,a]=o.shape.slice(U(o)?1:0),s=sr.tidy(()=>o.as3D(r,n,a).toInt());return await sr.browser.toPixels(s,e),s.dispose(),e}function ir(o){let{Image:t,Canvas:e,Video:r}=P.getEnv();return o instanceof t||o instanceof e||o instanceof r}var V=v(x());function eo(o,t,e=!1){let{Image:r,Canvas:n}=P.getEnv();if(!(o instanceof r||o instanceof n))throw new Error("imageToSquare - expected arg0 to be HTMLImageElement | HTMLCanvasElement");if(t<=0)return Jt({width:1,height:1});let a=Xt(o),s=t/Math.max(a.height,a.width),i=s*a.width,c=s*a.height,m=Jt({width:t,height:t}),p=o instanceof n?o:We(o),u=Math.abs(i-c)/2,f=e&&i0&&p.height>0&&O(m).drawImage(p,f,l,i,c),m}var ut=class{constructor(t,e=!1){this._imageTensors=[];this._canvases=[];this._treatAsBatchInput=!1;this._inputDimensions=[];this._inputSize=0;if(!Array.isArray(t))throw new Error(`NetInput.constructor - expected inputs to be an Array of TResolvedNetInput or to be instanceof tf.Tensor4D, instead have ${t}`);this._treatAsBatchInput=e,this._batchSize=t.length,t.forEach((r,n)=>{if(ht(r)){this._imageTensors[n]=r,this._inputDimensions[n]=r.shape;return}if(U(r)){let s=r.shape[0];if(s!==1)throw new Error(`NetInput - tf.Tensor4D with batchSize ${s} passed, but not supported in input array`);this._imageTensors[n]=r,this._inputDimensions[n]=r.shape.slice(1);return}let a=r instanceof P.getEnv().Canvas?r:We(r);this._canvases[n]=a,this._inputDimensions[n]=[a.height,a.width,3]})}get imageTensors(){return this._imageTensors}get canvases(){return this._canvases}get isBatchInput(){return this.batchSize>1||this._treatAsBatchInput}get batchSize(){return this._batchSize}get inputDimensions(){return this._inputDimensions}get inputSize(){return this._inputSize}get reshapedInputDimensions(){return it(this.batchSize,0,1).map((t,e)=>this.getReshapedInputDimensions(e))}getInput(t){return this.canvases[t]||this.imageTensors[t]}getInputDimensions(t){return this._inputDimensions[t]}getInputHeight(t){return this._inputDimensions[t][0]}getInputWidth(t){return this._inputDimensions[t][1]}getReshapedInputDimensions(t){if(typeof this.inputSize!="number")throw new Error("getReshapedInputDimensions - inputSize not set, toBatchTensor has not been called yet");let e=this.getInputWidth(t),r=this.getInputHeight(t);return Rr({width:e,height:r},this.inputSize)}toBatchTensor(t,e=!0){return this._inputSize=t,V.tidy(()=>{let r=it(this.batchSize,0,1).map(a=>{let s=this.getInput(a);if(s instanceof V.Tensor){let i=U(s)?s:V.expandDims(s);return i=Vr(i,e),(i.shape[1]!==t||i.shape[2]!==t)&&(i=V.image.resizeBilinear(i,[t,t],!1,!1)),i.as3D(t,t,3)}if(s instanceof P.getEnv().Canvas)return V.browser.fromPixels(eo(s,t,e));throw new Error(`toBatchTensor - at batchIdx ${a}, expected input to be instanceof tf.Tensor or instanceof HTMLCanvasElement, instead have ${s}`)});return V.stack(r.map(a=>V.cast(a,"float32"))).as4D(this.batchSize,t,t,3)})}};async function C(o){if(o instanceof ut)return o;let t=Array.isArray(o)?o:[o];if(!t.length)throw new Error("toNetInput - empty array passed as input");let e=n=>Array.isArray(o)?` at input index ${n}:`:"",r=t.map(Ut);return r.forEach((n,a)=>{if(!ir(n)&&!ht(n)&&!U(n))throw typeof t[a]=="string"?new Error(`toNetInput -${e(a)} string passed, but could not resolve HTMLElement for element id ${t[a]}`):new Error(`toNetInput -${e(a)} expected media to be of type HTMLImageElement | HTMLVideoElement | HTMLCanvasElement | tf.Tensor3D, or to be an element id`);if(U(n)){let s=n.shape[0];if(s!==1)throw new Error(`toNetInput -${e(a)} tf.Tensor4D with batchSize ${s} passed, but not supported in input array`)}}),await Promise.all(r.map(n=>ir(n)&&Kr(n))),new ut(r,Array.isArray(o))}async function le(o,t){let{Canvas:e}=P.getEnv(),r=o;if(!(o instanceof e)){let s=await C(o);if(s.batchSize>1)throw new Error("extractFaces - batchSize > 1 not supported");let i=s.getInput(0);r=i instanceof e?i:await to(i)}let n=O(r);return t.map(s=>s instanceof M?s.forSize(r.width,r.height).box.floor():s).map(s=>s.clipAtImageBorders(r.width,r.height)).map(({x:s,y:i,width:c,height:m})=>{let p=Jt({width:c,height:m});return c>0&&m>0&&O(p).putImageData(n.getImageData(s,i,c,m),0,0),p})}var cr=v(x());async function de(o,t){if(!ht(o)&&!U(o))throw new Error("extractFaceTensors - expected image tensor to be 3D or 4D");if(U(o)&&o.shape[0]>1)throw new Error("extractFaceTensors - batchSize > 1 not supported");return cr.tidy(()=>{let[e,r,n]=o.shape.slice(U(o)?1:0);return t.map(i=>i instanceof M?i.forSize(r,e).box:i).map(i=>i.clipAtImageBorders(r,e)).filter(i=>i.width>0&&i.height>0).map(({x:i,y:c,width:m,height:p})=>cr.slice3d(o.as3D(e,r,n),[c,i,0],[p,m,n]))})}async function xt(o,t){let{fetch:e}=P.getEnv(),r=await e(o,t);if(!(r.status<400))throw new Error(`failed to fetch: (${r.status}) ${r.statusText}, from url: ${r.url}`);return r}async function An(o){let t=await xt(o),e=await t.blob();if(!e.type.startsWith("image/"))throw new Error(`fetchImage - expected blob type to be of type image/*, instead have: ${e.type}, for url: ${t.url}`);return Qr(e)}async function ro(o){return(await xt(o)).json()}async function Wn(o){return new Float32Array(await(await xt(o)).arrayBuffer())}function wo(o){return new Promise((t,e)=>{o instanceof Blob||e(new Error("bufferToVideo - expected buf to be of type: Blob"));let r=P.getEnv().createVideoElement();r.oncanplay=()=>t(r),r.onerror=e,r.playsInline=!0,r.muted=!0,r.src=URL.createObjectURL(o),r.play()})}async function kn(o){let t=await xt(o),e=await t.blob();if(!e.type.startsWith("video/"))throw new Error(`fetchVideo - expected blob type to be of type video/*, instead have: ${e.type}, for url: ${t.url}`);return wo(e)}var Fo=v(x());function mr(o,t){let e=`${t}-weights_manifest.json`;if(!o)return{modelBaseUri:"",manifestUri:e};if(o==="/")return{modelBaseUri:"/",manifestUri:`/${e}`};let r=o.startsWith("http://")?"http://":o.startsWith("https://")?"https://":"";o=o.replace(r,"");let n=o.split("/").filter(i=>i),a=o.endsWith(".json")?n[n.length-1]:e,s=r+(o.endsWith(".json")?n.slice(0,n.length-1):n).join("/");return s=o.startsWith("/")?`/${s}`:s,{modelBaseUri:s,manifestUri:s==="/"?`/${a}`:`${s}/${a}`}}async function oo(o,t){let{manifestUri:e,modelBaseUri:r}=mr(o,t),n=await ro(e);return Fo.io.loadWeights(n,r)}function Bn(o,t,e=!1){let{width:r,height:n}=e?Xt(t):t;return o.width=r,o.height=n,{width:r,height:n}}var ye=v(x());var vt=v(x());var A=class{constructor(t){this._params=void 0;this._paramMappings=[];this._name=t}get params(){return this._params}get paramMappings(){return this._paramMappings}get isLoaded(){return!!this.params}getParamFromPath(t){let{obj:e,objProp:r}=this.traversePropertyPath(t);return e[r]}reassignParamFromPath(t,e){let{obj:r,objProp:n}=this.traversePropertyPath(t);r[n].dispose(),r[n]=e}getParamList(){return this._paramMappings.map(({paramPath:t})=>({path:t,tensor:this.getParamFromPath(t)}))}getTrainableParams(){return this.getParamList().filter(t=>t.tensor instanceof vt.Variable)}getFrozenParams(){return this.getParamList().filter(t=>!(t.tensor instanceof vt.Variable))}variable(){this.getFrozenParams().forEach(({path:t,tensor:e})=>{this.reassignParamFromPath(t,e.variable())})}freeze(){this.getTrainableParams().forEach(({path:t,tensor:e})=>{let r=vt.tensor(e.dataSync());e.dispose(),this.reassignParamFromPath(t,r)})}dispose(t=!0){this.getParamList().forEach(e=>{if(t&&e.tensor.isDisposed)throw new Error(`param tensor has already been disposed for path ${e.path}`);e.tensor.dispose()}),this._params=void 0}serializeParams(){return new Float32Array(this.getParamList().map(({tensor:t})=>Array.from(t.dataSync())).reduce((t,e)=>t.concat(e)))}async load(t){if(t instanceof Float32Array){this.extractWeights(t);return}await this.loadFromUri(t)}async loadFromUri(t){if(t&&typeof t!="string")throw new Error(`${this._name}.loadFromUri - expected model uri`);let e=await oo(t,this.getDefaultModelName());this.loadFromWeightMap(e)}async loadFromDisk(t){if(t&&typeof t!="string")throw new Error(`${this._name}.loadFromDisk - expected model file path`);let{readFile:e}=P.getEnv(),{manifestUri:r,modelBaseUri:n}=mr(t,this.getDefaultModelName()),a=m=>Promise.all(m.map(p=>e(p).then(u=>u.buffer))),s=vt.io.weightsLoaderFactory(a),i=JSON.parse((await e(r)).toString()),c=await s(i,n);this.loadFromWeightMap(c)}loadFromWeightMap(t){let{paramMappings:e,params:r}=this.extractParamsFromWeightMap(t);this._paramMappings=e,this._params=r}extractWeights(t){let{paramMappings:e,params:r}=this.extractParams(t);this._paramMappings=e,this._params=r}traversePropertyPath(t){if(!this.params)throw new Error("traversePropertyPath - model has no loaded params");let e=t.split("/").reduce((a,s)=>{if(!a.nextObj.hasOwnProperty(s))throw new Error(`traversePropertyPath - object does not have property ${s}, for path ${t}`);return{obj:a.nextObj,objProp:s,nextObj:a.nextObj[s]}},{nextObj:this.params}),{obj:r,objProp:n}=e;if(!r||!n||!(r[n]instanceof vt.Tensor))throw new Error(`traversePropertyPath - parameter is not a tensor, for path ${t}`);return{obj:r,objProp:n}}};var I=v(x());var he=v(x());function H(o,t,e){return he.tidy(()=>{let r=he.separableConv2d(o,t.depthwise_filter,t.pointwise_filter,e,"same");return r=he.add(r,t.bias),r})}function pr(o,t,e=!1){return I.tidy(()=>{let r=I.relu(e?I.add(I.conv2d(o,t.conv0.filters,[2,2],"same"),t.conv0.bias):H(o,t.conv0,[2,2])),n=H(r,t.conv1,[1,1]),a=I.relu(I.add(r,n)),s=H(a,t.conv2,[1,1]);return I.relu(I.add(r,I.add(n,s)))})}function ke(o,t,e=!1,r=!0){return I.tidy(()=>{let n=I.relu(e?I.add(I.conv2d(o,t.conv0.filters,r?[2,2]:[1,1],"same"),t.conv0.bias):H(o,t.conv0,r?[2,2]:[1,1])),a=H(n,t.conv1,[1,1]),s=I.relu(I.add(n,a)),i=H(s,t.conv2,[1,1]),c=I.relu(I.add(n,I.add(a,i))),m=H(c,t.conv3,[1,1]);return I.relu(I.add(n,I.add(a,I.add(i,m))))})}var It=v(x());function qt(o,t,e="same",r=!1){return It.tidy(()=>{let n=It.add(It.conv2d(o,t.filters,[1,1],e),t.bias);return r?It.relu(n):n})}function B(o,t){Object.keys(o).forEach(e=>{t.some(r=>r.originalPath===e)||o[e].dispose()})}var ur=v(x());function be(o,t){return(e,r,n,a)=>{let s=ur.tensor4d(o(e*r*n*n),[n,n,e,r]),i=ur.tensor1d(o(r));return t.push({paramPath:`${a}/filters`},{paramPath:`${a}/bias`}),{filters:s,bias:i}}}var fr=v(x());function lr(o,t){return(e,r,n)=>{let a=fr.tensor2d(o(e*r),[e,r]),s=fr.tensor1d(o(r));return t.push({paramPath:`${n}/weights`},{paramPath:`${n}/bias`}),{weights:a,bias:s}}}var Re=v(x());var Be=class{constructor(t,e,r){this.depthwise_filter=t;this.pointwise_filter=e;this.bias=r}};function ge(o,t){return(e,r,n)=>{let a=Re.tensor4d(o(9*e),[3,3,e,1]),s=Re.tensor4d(o(e*r),[1,1,e,r]),i=Re.tensor1d(o(r));return t.push({paramPath:`${n}/depthwise_filter`},{paramPath:`${n}/pointwise_filter`},{paramPath:`${n}/bias`}),new Be(a,s,i)}}function xe(o){return t=>{let e=o(`${t}/depthwise_filter`,4),r=o(`${t}/pointwise_filter`,4),n=o(`${t}/bias`,1);return new Be(e,r,n)}}function Y(o,t){return(e,r,n)=>{let a=o[e];if(!Ot(a,r))throw new Error(`expected weightMap[${e}] to be a Tensor${r}D, instead have ${a}`);return t.push({originalPath:e,paramPath:n||e}),a}}function R(o){let t=o;function e(n){let a=t.slice(0,n);return t=t.slice(n),a}function r(){return t}return{extractWeights:e,getRemainingWeights:r}}function dr(o,t){let e=be(o,t),r=ge(o,t);function n(s,i,c,m=!1){let p=m?e(s,i,3,`${c}/conv0`):r(s,i,`${c}/conv0`),u=r(i,i,`${c}/conv1`),f=r(i,i,`${c}/conv2`);return{conv0:p,conv1:u,conv2:f}}function a(s,i,c,m=!1){let{conv0:p,conv1:u,conv2:f}=n(s,i,c,m),l=r(i,i,`${c}/conv3`);return{conv0:p,conv1:u,conv2:f,conv3:l}}return{extractDenseBlock3Params:n,extractDenseBlock4Params:a}}function Do(o){let t=[],{extractWeights:e,getRemainingWeights:r}=R(o),{extractDenseBlock4Params:n}=dr(e,t),a=n(3,32,"dense0",!0),s=n(32,64,"dense1"),i=n(64,128,"dense2"),c=n(128,256,"dense3");if(r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{paramMappings:t,params:{dense0:a,dense1:s,dense2:i,dense3:c}}}function hr(o){return t=>{let e=o(`${t}/filters`,4),r=o(`${t}/bias`,1);return{filters:e,bias:r}}}function br(o,t){let e=Y(o,t),r=hr(e),n=xe(e);function a(i,c=!1){let m=c?r(`${i}/conv0`):n(`${i}/conv0`),p=n(`${i}/conv1`),u=n(`${i}/conv2`);return{conv0:m,conv1:p,conv2:u}}function s(i,c=!1){let m=c?r(`${i}/conv0`):n(`${i}/conv0`),p=n(`${i}/conv1`),u=n(`${i}/conv2`),f=n(`${i}/conv3`);return{conv0:m,conv1:p,conv2:u,conv3:f}}return{extractDenseBlock3Params:a,extractDenseBlock4Params:s}}function Eo(o){let t=[],{extractDenseBlock4Params:e}=br(o,t),r={dense0:e("dense0",!0),dense1:e("dense1"),dense2:e("dense2"),dense3:e("dense3")};return B(o,t),{params:r,paramMappings:t}}var ve=class extends A{constructor(){super("FaceFeatureExtractor")}forwardInput(t){let{params:e}=this;if(!e)throw new Error("FaceFeatureExtractor - load model before inference");return ye.tidy(()=>{let r=ye.cast(t.toBatchTensor(112,!0),"float32"),a=rt(r,[122.782,117.001,104.298]).div(255),s=ke(a,e.dense0,!0);return s=ke(s,e.dense1),s=ke(s,e.dense2),s=ke(s,e.dense3),s=ye.avgPool(s,[7,7],[2,2],"valid"),s})}async forward(t){return this.forwardInput(await C(t))}getDefaultModelName(){return"face_feature_extractor_model"}extractParamsFromWeightMap(t){return Eo(t)}extractParams(t){return Do(t)}};var Io=v(x());var _e=v(x());function $e(o,t){return _e.tidy(()=>_e.add(_e.matMul(o,t.weights),t.bias))}function Mo(o,t,e){let r=[],{extractWeights:n,getRemainingWeights:a}=R(o),i=lr(n,r)(t,e,"fc");if(a().length!==0)throw new Error(`weights remaing after extract: ${a().length}`);return{paramMappings:r,params:{fc:i}}}function Co(o){let t=[],e=Y(o,t);function r(a){let s=e(`${a}/weights`,2),i=e(`${a}/bias`,1);return{weights:s,bias:i}}let n={fc:r("fc")};return B(o,t),{params:n,paramMappings:t}}function gr(o){let t={},e={};return Object.keys(o).forEach(r=>{let n=r.startsWith("fc")?e:t;n[r]=o[r]}),{featureExtractorMap:t,classifierMap:e}}var Te=class extends A{constructor(e,r){super(e);this._faceFeatureExtractor=r}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(e){let{params:r}=this;if(!r)throw new Error(`${this._name} - load model before inference`);return Io.tidy(()=>{let n=e instanceof ut?this.faceFeatureExtractor.forwardInput(e):e;return $e(n.as2D(n.shape[0],-1),r.fc)})}dispose(e=!0){this.faceFeatureExtractor.dispose(e),super.dispose(e)}loadClassifierParams(e){let{params:r,paramMappings:n}=this.extractClassifierParams(e);this._params=r,this._paramMappings=n}extractClassifierParams(e){return Mo(e,this.getClassifierChannelsIn(),this.getClassifierChannelsOut())}extractParamsFromWeightMap(e){let{featureExtractorMap:r,classifierMap:n}=gr(e);return this.faceFeatureExtractor.loadFromWeightMap(r),Co(n)}extractParams(e){let r=this.getClassifierChannelsIn(),n=this.getClassifierChannelsOut(),a=n*r+n,s=e.slice(0,e.length-a),i=e.slice(e.length-a);return this.faceFeatureExtractor.extractWeights(s),this.extractClassifierParams(i)}};var no=["neutral","happy","sad","angry","fearful","disgusted","surprised"],yt=class{constructor(t){this.neutral=0;this.happy=0;this.sad=0;this.angry=0;this.fearful=0;this.disgusted=0;this.surprised=0;if(t.length!==7)throw new Error(`FaceExpressions.constructor - expected probabilities.length to be 7, have: ${t.length}`);no.forEach((e,r)=>{this[e]=t[r]})}asSortedArray(){return no.map(t=>({expression:t,probability:this[t]})).sort((t,e)=>e.probability-t.probability)}};var Oe=class extends Te{constructor(t=new ve){super("FaceExpressionNet",t)}forwardInput(t){return Pe.tidy(()=>Pe.softmax(this.runNet(t)))}async forward(t){return this.forwardInput(await C(t))}async predictExpressions(t){let e=await C(t),r=await this.forwardInput(e),n=await Promise.all(Pe.unstack(r).map(async s=>{let i=s.dataSync();return s.dispose(),i}));r.dispose();let a=n.map(s=>new yt(s));return e.isBatchInput?a:a[0]}getDefaultModelName(){return"face_expression_model"}getClassifierChannelsIn(){return 256}getClassifierChannelsOut(){return 7}};function ao(o){return o.expressions instanceof yt}function xr(o,t){return{...o,...{expressions:t}}}function Rn(o,t,e=.1,r){(Array.isArray(t)?t:[t]).forEach(a=>{let s=a instanceof yt?a:ao(a)?a.expressions:void 0;if(!s)throw new Error("drawFaceExpressions - expected faceExpressions to be FaceExpressions | WithFaceExpressions<{}> or array thereof");let c=s.asSortedArray().filter(u=>u.probability>e),m=pt(a)?a.detection.box.bottomLeft:r||new b(0,0);new gt(c.map(u=>`${u.expression} (${Ht(u.probability)})`),m).draw(o)})}function Zt(o){return pt(o)&&o.landmarks instanceof z&&o.unshiftedLandmarks instanceof z&&o.alignedRect instanceof M}function $n(o){let t=(i,c,m,p)=>Math.atan2(p-c,m-i)%Math.PI,e=i=>i*180/Math.PI,r={roll:void 0,pitch:void 0,yaw:void 0};if(!o||!o._positions||o._positions.length!==68)return r;let n=o._positions;r.roll=-t(n[36]._x,n[36]._y,n[45]._x,n[45]._y),r.pitch=t(0,Math.abs(n[0]._x-n[30]._x)/n[30]._x,Math.PI,Math.abs(n[16]._x-n[30]._x)/n[30]._x);let a=n.reduce((i,c)=>ii>c._y?i:c._y,-1/0);return r.yaw=Math.PI*(o._imgDims._height/(s-a)/1.4-1),r}function we(o,t){let{box:e}=o.detection,r=t.shiftBy(e.x,e.y),n=r.align(),{imageDims:a}=o.detection,s=new M(o.detection.score,n.rescale(a.reverse()),a),i=$n(t);return{...o,...{landmarks:r,unshiftedLandmarks:t,alignedRect:s,angle:i}}}var vr=class{constructor(t={}){let{drawLines:e=!0,drawPoints:r=!0,lineWidth:n,lineColor:a,pointSize:s,pointColor:i}=t;this.drawLines=e,this.drawPoints=r,this.lineWidth=n||1,this.pointSize=s||2,this.lineColor=a||"rgba(0, 255, 255, 1)",this.pointColor=i||"rgba(255, 0, 255, 1)"}},yr=class{constructor(t,e={}){this.faceLandmarks=t,this.options=new vr(e)}draw(t){let e=O(t),{drawLines:r,drawPoints:n,lineWidth:a,lineColor:s,pointSize:i,pointColor:c}=this.options;if(r&&this.faceLandmarks instanceof Gt&&(e.strokeStyle=s,e.lineWidth=a,dt(e,this.faceLandmarks.getJawOutline()),dt(e,this.faceLandmarks.getLeftEyeBrow()),dt(e,this.faceLandmarks.getRightEyeBrow()),dt(e,this.faceLandmarks.getNose()),dt(e,this.faceLandmarks.getLeftEye(),!0),dt(e,this.faceLandmarks.getRightEye(),!0),dt(e,this.faceLandmarks.getMouth(),!0)),n){e.strokeStyle=c,e.fillStyle=c;let m=p=>{e.beginPath(),e.arc(p.x,p.y,i,0,2*Math.PI),e.fill()};this.faceLandmarks.positions.forEach(m)}}};function On(o,t){(Array.isArray(t)?t:[t]).forEach(r=>{let n=r instanceof z?r:Zt(r)?r.landmarks:void 0;if(!n)throw new Error("drawFaceLandmarks - expected faceExpressions to be FaceLandmarks | WithFaceLandmarks> or array thereof");new yr(n).draw(o)})}var No="1.7.2";var ft=v(x());var S=v(x());function Vn(o,t){let e=be(o,t),r=ge(o,t);function n(s,i,c){let m=r(s,i,`${c}/separable_conv0`),p=r(i,i,`${c}/separable_conv1`),u=e(s,i,1,`${c}/expansion_conv`);return{separable_conv0:m,separable_conv1:p,expansion_conv:u}}function a(s,i){let c=r(s,s,`${i}/separable_conv0`),m=r(s,s,`${i}/separable_conv1`),p=r(s,s,`${i}/separable_conv2`);return{separable_conv0:c,separable_conv1:m,separable_conv2:p}}return{extractConvParams:e,extractSeparableConvParams:r,extractReductionBlockParams:n,extractMainBlockParams:a}}function So(o,t){let e=[],{extractWeights:r,getRemainingWeights:n}=R(o),{extractConvParams:a,extractSeparableConvParams:s,extractReductionBlockParams:i,extractMainBlockParams:c}=Vn(r,e),m=a(3,32,3,"entry_flow/conv_in"),p=i(32,64,"entry_flow/reduction_block_0"),u=i(64,128,"entry_flow/reduction_block_1"),f={conv_in:m,reduction_block_0:p,reduction_block_1:u},l={};it(t,0,1).forEach(h=>{l[`main_block_${h}`]=c(128,`middle_flow/main_block_${h}`)});let g=i(128,256,"exit_flow/reduction_block"),T=s(256,512,"exit_flow/separable_conv"),D={reduction_block:g,separable_conv:T};if(n().length!==0)throw new Error(`weights remaing after extract: ${n().length}`);return{paramMappings:e,params:{entry_flow:f,middle_flow:l,exit_flow:D}}}function Yn(o,t){let e=Y(o,t),r=hr(e),n=xe(e);function a(i){let c=n(`${i}/separable_conv0`),m=n(`${i}/separable_conv1`),p=r(`${i}/expansion_conv`);return{separable_conv0:c,separable_conv1:m,expansion_conv:p}}function s(i){let c=n(`${i}/separable_conv0`),m=n(`${i}/separable_conv1`),p=n(`${i}/separable_conv2`);return{separable_conv0:c,separable_conv1:m,separable_conv2:p}}return{extractConvParams:r,extractSeparableConvParams:n,extractReductionBlockParams:a,extractMainBlockParams:s}}function Lo(o,t){let e=[],{extractConvParams:r,extractSeparableConvParams:n,extractReductionBlockParams:a,extractMainBlockParams:s}=Yn(o,e),i=r("entry_flow/conv_in"),c=a("entry_flow/reduction_block_0"),m=a("entry_flow/reduction_block_1"),p={conv_in:i,reduction_block_0:c,reduction_block_1:m},u={};it(t,0,1).forEach(T=>{u[`main_block_${T}`]=s(`middle_flow/main_block_${T}`)});let f=a("exit_flow/reduction_block"),l=n("exit_flow/separable_conv"),g={reduction_block:f,separable_conv:l};return B(o,e),{params:{entry_flow:p,middle_flow:u,exit_flow:g},paramMappings:e}}function Ao(o,t,e){return S.add(S.conv2d(o,t.filters,e,"same"),t.bias)}function io(o,t,e=!0){let r=e?S.relu(o):o;return r=H(r,t.separable_conv0,[1,1]),r=H(S.relu(r),t.separable_conv1,[1,1]),r=S.maxPool(r,[3,3],[2,2],"same"),r=S.add(r,Ao(o,t.expansion_conv,[2,2])),r}function Gn(o,t){let e=H(S.relu(o),t.separable_conv0,[1,1]);return e=H(S.relu(e),t.separable_conv1,[1,1]),e=H(S.relu(e),t.separable_conv2,[1,1]),e=S.add(e,o),e}var _r=class extends A{constructor(e){super("TinyXception");this._numMainBlocks=e}forwardInput(e){let{params:r}=this;if(!r)throw new Error("TinyXception - load model before inference");return S.tidy(()=>{let n=S.cast(e.toBatchTensor(112,!0),"float32"),s=rt(n,[122.782,117.001,104.298]).div(255),i=S.relu(Ao(s,r.entry_flow.conv_in,[2,2]));return i=io(i,r.entry_flow.reduction_block_0,!1),i=io(i,r.entry_flow.reduction_block_1),it(this._numMainBlocks,0,1).forEach(c=>{i=Gn(i,r.middle_flow[`main_block_${c}`])}),i=io(i,r.exit_flow.reduction_block),i=S.relu(H(i,r.exit_flow.separable_conv,[1,1])),i})}async forward(e){return this.forwardInput(await C(e))}getDefaultModelName(){return"tiny_xception_model"}extractParamsFromWeightMap(e){return Lo(e,this._numMainBlocks)}extractParams(e){return So(e,this._numMainBlocks)}};function Wo(o){let t=[],{extractWeights:e,getRemainingWeights:r}=R(o),n=lr(e,t),a=n(512,1,"fc/age"),s=n(512,2,"fc/gender");if(r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{paramMappings:t,params:{fc:{age:a,gender:s}}}}function ko(o){let t=[],e=Y(o,t);function r(a){let s=e(`${a}/weights`,2),i=e(`${a}/bias`,1);return{weights:s,bias:i}}let n={fc:{age:r("fc/age"),gender:r("fc/gender")}};return B(o,t),{params:n,paramMappings:t}}var Tr=(e=>(e.FEMALE="female",e.MALE="male",e))(Tr||{});var He=class extends A{constructor(e=new _r(2)){super("AgeGenderNet");this._faceFeatureExtractor=e}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(e){let{params:r}=this;if(!r)throw new Error(`${this._name} - load model before inference`);return ft.tidy(()=>{let n=e instanceof ut?this.faceFeatureExtractor.forwardInput(e):e,a=ft.avgPool(n,[7,7],[2,2],"valid").as2D(n.shape[0],-1),s=$e(a,r.fc.age).as1D(),i=$e(a,r.fc.gender);return{age:s,gender:i}})}forwardInput(e){return ft.tidy(()=>{let{age:r,gender:n}=this.runNet(e);return{age:r,gender:ft.softmax(n)}})}async forward(e){return this.forwardInput(await C(e))}async predictAgeAndGender(e){let r=await C(e),n=await this.forwardInput(r),a=ft.unstack(n.age),s=ft.unstack(n.gender),i=a.map((m,p)=>({ageTensor:m,genderTensor:s[p]})),c=await Promise.all(i.map(async({ageTensor:m,genderTensor:p})=>{let u=m.dataSync()[0],f=p.dataSync()[0],l=f>.5,g=l?"male":"female",T=l?f:1-f;return m.dispose(),p.dispose(),{age:u,gender:g,genderProbability:T}}));return n.age.dispose(),n.gender.dispose(),r.isBatchInput?c:c[0]}getDefaultModelName(){return"age_gender_model"}dispose(e=!0){this.faceFeatureExtractor.dispose(e),super.dispose(e)}loadClassifierParams(e){let{params:r,paramMappings:n}=this.extractClassifierParams(e);this._params=r,this._paramMappings=n}extractClassifierParams(e){return Wo(e)}extractParamsFromWeightMap(e){let{featureExtractorMap:r,classifierMap:n}=gr(e);return this.faceFeatureExtractor.loadFromWeightMap(r),ko(n)}extractParams(e){let n=e.slice(0,e.length-1539),a=e.slice(e.length-1539);return this.faceFeatureExtractor.extractWeights(n),this.extractClassifierParams(a)}};var G=v(x());var Fe=class extends Te{postProcess(t,e,r){let n=r.map(({width:s,height:i})=>{let c=e/Math.max(i,s);return{width:s*c,height:i*c}}),a=n.length;return G.tidy(()=>{let s=(u,f)=>G.stack([G.fill([68],u,"float32"),G.fill([68],f,"float32")],1).as2D(1,136).as1D(),i=(u,f)=>{let{width:l,height:g}=n[u];return f(l,g)?Math.abs(l-g)/2:0},c=u=>i(u,(f,l)=>fi(u,(f,l)=>ls(c(f),m(f))))).div(G.stack(Array.from(Array(a),(u,f)=>s(n[f].width,n[f].height))))})}forwardInput(t){return G.tidy(()=>{let e=this.runNet(t);return this.postProcess(e,t.inputSize,t.inputDimensions.map(([r,n])=>({height:r,width:n})))})}async forward(t){return this.forwardInput(await C(t))}async detectLandmarks(t){let e=await C(t),r=G.tidy(()=>G.unstack(this.forwardInput(e))),n=await Promise.all(r.map(async(a,s)=>{let i=Array.from(a.dataSync()),c=i.filter((p,u)=>rr(u)),m=i.filter((p,u)=>!rr(u));return new Gt(Array(68).fill(0).map((p,u)=>new b(c[u],m[u])),{height:e.getInputHeight(s),width:e.getInputWidth(s)})}));return r.forEach(a=>a.dispose()),e.isBatchInput?n:n[0]}getClassifierChannelsOut(){return 136}};var Kt=class extends Fe{constructor(t=new ve){super("FaceLandmark68Net",t)}getDefaultModelName(){return"face_landmark_68_model"}getClassifierChannelsIn(){return 256}};var De=v(x());function Bo(o){let t=[],{extractDenseBlock3Params:e}=br(o,t),r={dense0:e("dense0",!0),dense1:e("dense1"),dense2:e("dense2")};return B(o,t),{params:r,paramMappings:t}}function Ro(o){let t=[],{extractWeights:e,getRemainingWeights:r}=R(o),{extractDenseBlock3Params:n}=dr(e,t),a=n(3,32,"dense0",!0),s=n(32,64,"dense1"),i=n(64,128,"dense2");if(r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{paramMappings:t,params:{dense0:a,dense1:s,dense2:i}}}var Pr=class extends A{constructor(){super("TinyFaceFeatureExtractor")}forwardInput(t){let{params:e}=this;if(!e)throw new Error("TinyFaceFeatureExtractor - load model before inference");return De.tidy(()=>{let r=De.cast(t.toBatchTensor(112,!0),"float32"),a=rt(r,[122.782,117.001,104.298]).div(255),s=pr(a,e.dense0,!0);return s=pr(s,e.dense1),s=pr(s,e.dense2),s=De.avgPool(s,[14,14],[2,2],"valid"),s})}async forward(t){return this.forwardInput(await C(t))}getDefaultModelName(){return"face_feature_extractor_tiny_model"}extractParamsFromWeightMap(t){return Bo(t)}extractParams(t){return Ro(t)}};var ze=class extends Fe{constructor(t=new Pr){super("FaceLandmark68TinyNet",t)}getDefaultModelName(){return"face_landmark_68_tiny_model"}getClassifierChannelsIn(){return 128}};var co=class extends Kt{};var nt=v(x());var Ee=v(x());var wr=v(x());function $o(o,t){return wr.add(wr.mul(o,t.weights),t.biases)}function mo(o,t,e,r,n="same"){let{filters:a,bias:s}=t.conv,i=Ee.conv2d(o,a,e,n);return i=Ee.add(i,s),i=$o(i,t.scale),r?Ee.relu(i):i}function Oo(o,t){return mo(o,t,[1,1],!0)}function po(o,t){return mo(o,t,[1,1],!1)}function Fr(o,t){return mo(o,t,[2,2],!0,"valid")}var j=v(x());function jn(o,t){function e(i,c,m){let p=o(i),u=p.length/(c*m*m);if(Br(u))throw new Error(`depth has to be an integer: ${u}, weights.length: ${p.length}, numFilters: ${c}, filterSize: ${m}`);return j.tidy(()=>j.transpose(j.tensor4d(p,[c,u,m,m]),[2,3,1,0]))}function r(i,c,m,p){let u=e(i,c,m),f=j.tensor1d(o(c));return t.push({paramPath:`${p}/filters`},{paramPath:`${p}/bias`}),{filters:u,bias:f}}function n(i,c){let m=j.tensor1d(o(i)),p=j.tensor1d(o(i));return t.push({paramPath:`${c}/weights`},{paramPath:`${c}/biases`}),{weights:m,biases:p}}function a(i,c,m,p){let u=r(i,c,m,`${p}/conv`),f=n(c,`${p}/scale`);return{conv:u,scale:f}}function s(i,c,m,p,u=!1){let f=a((u?.5:1)*i,c,m,`${p}/conv1`),l=a(i,c,m,`${p}/conv2`);return{conv1:f,conv2:l}}return{extractConvLayerParams:a,extractResidualLayerParams:s}}function Ho(o){let{extractWeights:t,getRemainingWeights:e}=R(o),r=[],{extractConvLayerParams:n,extractResidualLayerParams:a}=jn(t,r),s=n(4704,32,7,"conv32_down"),i=a(9216,32,3,"conv32_1"),c=a(9216,32,3,"conv32_2"),m=a(9216,32,3,"conv32_3"),p=a(36864,64,3,"conv64_down",!0),u=a(36864,64,3,"conv64_1"),f=a(36864,64,3,"conv64_2"),l=a(36864,64,3,"conv64_3"),g=a(147456,128,3,"conv128_down",!0),T=a(147456,128,3,"conv128_1"),D=a(147456,128,3,"conv128_2"),h=a(589824,256,3,"conv256_down",!0),_=a(589824,256,3,"conv256_1"),y=a(589824,256,3,"conv256_2"),E=a(589824,256,3,"conv256_down_out"),W=j.tidy(()=>j.transpose(j.tensor2d(t(256*128),[128,256]),[1,0]));if(r.push({paramPath:"fc"}),e().length!==0)throw new Error(`weights remaing after extract: ${e().length}`);return{params:{conv32_down:s,conv32_1:i,conv32_2:c,conv32_3:m,conv64_down:p,conv64_1:u,conv64_2:f,conv64_3:l,conv128_down:g,conv128_1:T,conv128_2:D,conv256_down:h,conv256_1:_,conv256_2:y,conv256_down_out:E,fc:W},paramMappings:r}}function Un(o,t){let e=Y(o,t);function r(s){let i=e(`${s}/scale/weights`,1),c=e(`${s}/scale/biases`,1);return{weights:i,biases:c}}function n(s){let i=e(`${s}/conv/filters`,4),c=e(`${s}/conv/bias`,1),m=r(s);return{conv:{filters:i,bias:c},scale:m}}function a(s){return{conv1:n(`${s}/conv1`),conv2:n(`${s}/conv2`)}}return{extractConvLayerParams:n,extractResidualLayerParams:a}}function zo(o){let t=[],{extractConvLayerParams:e,extractResidualLayerParams:r}=Un(o,t),n=e("conv32_down"),a=r("conv32_1"),s=r("conv32_2"),i=r("conv32_3"),c=r("conv64_down"),m=r("conv64_1"),p=r("conv64_2"),u=r("conv64_3"),f=r("conv128_down"),l=r("conv128_1"),g=r("conv128_2"),T=r("conv256_down"),D=r("conv256_1"),h=r("conv256_2"),_=r("conv256_down_out"),{fc:y}=o;if(t.push({originalPath:"fc",paramPath:"fc"}),!kr(y))throw new Error(`expected weightMap[fc] to be a Tensor2D, instead have ${y}`);let E={conv32_down:n,conv32_1:a,conv32_2:s,conv32_3:i,conv64_down:c,conv64_1:m,conv64_2:p,conv64_3:u,conv128_down:f,conv128_1:l,conv128_2:g,conv256_down:T,conv256_1:D,conv256_2:h,conv256_down_out:_,fc:y};return B(o,t),{params:E,paramMappings:t}}var $=v(x());function ot(o,t){let e=Oo(o,t.conv1);return e=po(e,t.conv2),e=$.add(e,o),e=$.relu(e),e}function Ve(o,t){let e=Fr(o,t.conv1);e=po(e,t.conv2);let r=$.avgPool(o,2,2,"valid"),n=$.zeros(r.shape),a=r.shape[3]!==e.shape[3];if(r.shape[1]!==e.shape[1]||r.shape[2]!==e.shape[2]){let i=[...e.shape];i[1]=1;let c=$.zeros(i);e=$.concat([e,c],1);let m=[...e.shape];m[2]=1;let p=$.zeros(m);e=$.concat([e,p],2)}return r=a?$.concat([r,n],3):r,e=$.add(r,e),e=$.relu(e),e}var Qt=class extends A{constructor(){super("FaceRecognitionNet")}forwardInput(t){let{params:e}=this;if(!e)throw new Error("FaceRecognitionNet - load model before inference");return nt.tidy(()=>{let r=nt.cast(t.toBatchTensor(150,!0),"float32"),a=rt(r,[122.782,117.001,104.298]).div(255),s=Fr(a,e.conv32_down);s=nt.maxPool(s,3,2,"valid"),s=ot(s,e.conv32_1),s=ot(s,e.conv32_2),s=ot(s,e.conv32_3),s=Ve(s,e.conv64_down),s=ot(s,e.conv64_1),s=ot(s,e.conv64_2),s=ot(s,e.conv64_3),s=Ve(s,e.conv128_down),s=ot(s,e.conv128_1),s=ot(s,e.conv128_2),s=Ve(s,e.conv256_down),s=ot(s,e.conv256_1),s=ot(s,e.conv256_2),s=Ve(s,e.conv256_down_out);let i=s.mean([1,2]);return nt.matMul(i,e.fc)})}async forward(t){return this.forwardInput(await C(t))}async computeFaceDescriptor(t){var a;if((a=t==null?void 0:t.shape)!=null&&a.some(s=>s<=0))return new Float32Array(128);let e=await C(t),r=nt.tidy(()=>nt.unstack(this.forwardInput(e))),n=await Promise.all(r.map(s=>s.data()));return r.forEach(s=>s.dispose()),e.isBatchInput?n:n[0]}getDefaultModelName(){return"face_recognition_model"}extractParamsFromWeightMap(t){return zo(t)}extractParams(t){return Ho(t)}};function Xn(o){let t=new Qt;return t.extractWeights(o),t}function Dr(o,t){return{...o,...{descriptor:t}}}function Jn(o){return typeof o.age=="number"}function Er(o,t){return{...o,...{age:t}}}function qn(o){return(o.gender==="male"||o.gender==="female")&&me(o.genderProbability)}function Mr(o,t,e){return{...o,...{gender:t,genderProbability:e}}}var Lt=v(x());var at=v(x());function Zn(o,t){function e(c,m){let p=at.tensor4d(o(9*c),[3,3,c,1]),u=at.tensor1d(o(c)),f=at.tensor1d(o(c)),l=at.tensor1d(o(c)),g=at.tensor1d(o(c));return t.push({paramPath:`${m}/filters`},{paramPath:`${m}/batch_norm_scale`},{paramPath:`${m}/batch_norm_offset`},{paramPath:`${m}/batch_norm_mean`},{paramPath:`${m}/batch_norm_variance`}),{filters:p,batch_norm_scale:u,batch_norm_offset:f,batch_norm_mean:l,batch_norm_variance:g}}function r(c,m,p,u,f){let l=at.tensor4d(o(c*m*p*p),[p,p,c,m]),g=at.tensor1d(o(m));return t.push({paramPath:`${u}/filters`},{paramPath:`${u}/${f?"batch_norm_offset":"bias"}`}),{filters:l,bias:g}}function n(c,m,p,u){let{filters:f,bias:l}=r(c,m,p,u,!0);return{filters:f,batch_norm_offset:l}}function a(c,m,p){let u=e(c,`${p}/depthwise_conv`),f=n(c,m,1,`${p}/pointwise_conv`);return{depthwise_conv:u,pointwise_conv:f}}function s(){let c=n(3,32,3,"mobilenetv1/conv_0"),m=a(32,64,"mobilenetv1/conv_1"),p=a(64,128,"mobilenetv1/conv_2"),u=a(128,128,"mobilenetv1/conv_3"),f=a(128,256,"mobilenetv1/conv_4"),l=a(256,256,"mobilenetv1/conv_5"),g=a(256,512,"mobilenetv1/conv_6"),T=a(512,512,"mobilenetv1/conv_7"),D=a(512,512,"mobilenetv1/conv_8"),h=a(512,512,"mobilenetv1/conv_9"),_=a(512,512,"mobilenetv1/conv_10"),y=a(512,512,"mobilenetv1/conv_11"),E=a(512,1024,"mobilenetv1/conv_12"),W=a(1024,1024,"mobilenetv1/conv_13");return{conv_0:c,conv_1:m,conv_2:p,conv_3:u,conv_4:f,conv_5:l,conv_6:g,conv_7:T,conv_8:D,conv_9:h,conv_10:_,conv_11:y,conv_12:E,conv_13:W}}function i(){let c=n(1024,256,1,"prediction_layer/conv_0"),m=n(256,512,3,"prediction_layer/conv_1"),p=n(512,128,1,"prediction_layer/conv_2"),u=n(128,256,3,"prediction_layer/conv_3"),f=n(256,128,1,"prediction_layer/conv_4"),l=n(128,256,3,"prediction_layer/conv_5"),g=n(256,64,1,"prediction_layer/conv_6"),T=n(64,128,3,"prediction_layer/conv_7"),D=r(512,12,1,"prediction_layer/box_predictor_0/box_encoding_predictor"),h=r(512,9,1,"prediction_layer/box_predictor_0/class_predictor"),_=r(1024,24,1,"prediction_layer/box_predictor_1/box_encoding_predictor"),y=r(1024,18,1,"prediction_layer/box_predictor_1/class_predictor"),E=r(512,24,1,"prediction_layer/box_predictor_2/box_encoding_predictor"),W=r(512,18,1,"prediction_layer/box_predictor_2/class_predictor"),tt=r(256,24,1,"prediction_layer/box_predictor_3/box_encoding_predictor"),lt=r(256,18,1,"prediction_layer/box_predictor_3/class_predictor"),q=r(256,24,1,"prediction_layer/box_predictor_4/box_encoding_predictor"),Dt=r(256,18,1,"prediction_layer/box_predictor_4/class_predictor"),Et=r(128,24,1,"prediction_layer/box_predictor_5/box_encoding_predictor"),Mt=r(128,18,1,"prediction_layer/box_predictor_5/class_predictor");return{conv_0:c,conv_1:m,conv_2:p,conv_3:u,conv_4:f,conv_5:l,conv_6:g,conv_7:T,box_predictor_0:{box_encoding_predictor:D,class_predictor:h},box_predictor_1:{box_encoding_predictor:_,class_predictor:y},box_predictor_2:{box_encoding_predictor:E,class_predictor:W},box_predictor_3:{box_encoding_predictor:tt,class_predictor:lt},box_predictor_4:{box_encoding_predictor:q,class_predictor:Dt},box_predictor_5:{box_encoding_predictor:Et,class_predictor:Mt}}}return{extractMobilenetV1Params:s,extractPredictionLayerParams:i}}function Vo(o){let t=[],{extractWeights:e,getRemainingWeights:r}=R(o),{extractMobilenetV1Params:n,extractPredictionLayerParams:a}=Zn(e,t),s=n(),i=a(),m={extra_dim:at.tensor3d(e(5118*4),[1,5118,4])};if(t.push({paramPath:"output_layer/extra_dim"}),r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{params:{mobilenetv1:s,prediction_layer:i,output_layer:m},paramMappings:t}}function Kn(o,t){let e=Y(o,t);function r(m,p,u){let f=e(`${m}/Conv2d_${p}_pointwise/weights`,4,`${u}/filters`),l=e(`${m}/Conv2d_${p}_pointwise/convolution_bn_offset`,1,`${u}/batch_norm_offset`);return{filters:f,batch_norm_offset:l}}function n(m){let p=`mobilenetv1/conv_${m}`,u=`MobilenetV1/Conv2d_${m}_depthwise`,f=`${p}/depthwise_conv`,l=`${p}/pointwise_conv`,g=e(`${u}/depthwise_weights`,4,`${f}/filters`),T=e(`${u}/BatchNorm/gamma`,1,`${f}/batch_norm_scale`),D=e(`${u}/BatchNorm/beta`,1,`${f}/batch_norm_offset`),h=e(`${u}/BatchNorm/moving_mean`,1,`${f}/batch_norm_mean`),_=e(`${u}/BatchNorm/moving_variance`,1,`${f}/batch_norm_variance`);return{depthwise_conv:{filters:g,batch_norm_scale:T,batch_norm_offset:D,batch_norm_mean:h,batch_norm_variance:_},pointwise_conv:r("MobilenetV1",m,l)}}function a(){return{conv_0:r("MobilenetV1",0,"mobilenetv1/conv_0"),conv_1:n(1),conv_2:n(2),conv_3:n(3),conv_4:n(4),conv_5:n(5),conv_6:n(6),conv_7:n(7),conv_8:n(8),conv_9:n(9),conv_10:n(10),conv_11:n(11),conv_12:n(12),conv_13:n(13)}}function s(m,p){let u=e(`${m}/weights`,4,`${p}/filters`),f=e(`${m}/biases`,1,`${p}/bias`);return{filters:u,bias:f}}function i(m){let p=s(`Prediction/BoxPredictor_${m}/BoxEncodingPredictor`,`prediction_layer/box_predictor_${m}/box_encoding_predictor`),u=s(`Prediction/BoxPredictor_${m}/ClassPredictor`,`prediction_layer/box_predictor_${m}/class_predictor`);return{box_encoding_predictor:p,class_predictor:u}}function c(){return{conv_0:r("Prediction",0,"prediction_layer/conv_0"),conv_1:r("Prediction",1,"prediction_layer/conv_1"),conv_2:r("Prediction",2,"prediction_layer/conv_2"),conv_3:r("Prediction",3,"prediction_layer/conv_3"),conv_4:r("Prediction",4,"prediction_layer/conv_4"),conv_5:r("Prediction",5,"prediction_layer/conv_5"),conv_6:r("Prediction",6,"prediction_layer/conv_6"),conv_7:r("Prediction",7,"prediction_layer/conv_7"),box_predictor_0:i(0),box_predictor_1:i(1),box_predictor_2:i(2),box_predictor_3:i(3),box_predictor_4:i(4),box_predictor_5:i(5)}}return{extractMobilenetV1Params:a,extractPredictionLayerParams:c}}function Yo(o){let t=[],{extractMobilenetV1Params:e,extractPredictionLayerParams:r}=Kn(o,t),n=o["Output/extra_dim"];if(t.push({originalPath:"Output/extra_dim",paramPath:"output_layer/extra_dim"}),!ht(n))throw new Error(`expected weightMap['Output/extra_dim'] to be a Tensor3D, instead have ${n}`);let a={mobilenetv1:e(),prediction_layer:r(),output_layer:{extra_dim:n}};return B(o,t),{params:a,paramMappings:t}}var _t=v(x());var Nt=v(x());function Z(o,t,e){return Nt.tidy(()=>{let r=Nt.conv2d(o,t.filters,e,"same");return r=Nt.add(r,t.batch_norm_offset),Nt.clipByValue(r,0,6)})}var Qn=.0010000000474974513;function ta(o,t,e){return _t.tidy(()=>{let r=_t.depthwiseConv2d(o,t.filters,e,"same");return r=_t.batchNorm(r,t.batch_norm_mean,t.batch_norm_variance,t.batch_norm_offset,t.batch_norm_scale,Qn),_t.clipByValue(r,0,6)})}function ea(o){return[2,4,6,12].some(t=>t===o)?[2,2]:[1,1]}function Go(o,t){return _t.tidy(()=>{let e,r=Z(o,t.conv_0,[2,2]);if([t.conv_1,t.conv_2,t.conv_3,t.conv_4,t.conv_5,t.conv_6,t.conv_7,t.conv_8,t.conv_9,t.conv_10,t.conv_11,t.conv_12,t.conv_13].forEach((a,s)=>{let i=s+1,c=ea(i);r=ta(r,a.depthwise_conv,c),r=Z(r,a.pointwise_conv,[1,1]),i===11&&(e=r)}),e===null)throw new Error("mobileNetV1 - output of conv layer 11 is null");return{out:r,conv11:e}})}function ra(o,t,e){let r=o.arraySync(),n=Math.min(r[t][0],r[t][2]),a=Math.min(r[t][1],r[t][3]),s=Math.max(r[t][0],r[t][2]),i=Math.max(r[t][1],r[t][3]),c=Math.min(r[e][0],r[e][2]),m=Math.min(r[e][1],r[e][3]),p=Math.max(r[e][0],r[e][2]),u=Math.max(r[e][1],r[e][3]),f=(s-n)*(i-a),l=(p-c)*(u-m);if(f<=0||l<=0)return 0;let g=Math.max(n,c),T=Math.max(a,m),D=Math.min(s,p),h=Math.min(i,u),_=Math.max(D-g,0)*Math.max(h-T,0);return _/(f+l-_)}function jo(o,t,e,r,n){let a=o.shape[0],s=Math.min(e,a),i=t.map((p,u)=>({score:p,boxIndex:u})).filter(p=>p.score>n).sort((p,u)=>u.score-p.score),c=p=>p<=r?1:0,m=[];return i.forEach(p=>{if(m.length>=s)return;let u=p.score;for(let f=m.length-1;f>=0;--f){let l=ra(o,p.boxIndex,m[f]);if(l!==0&&(p.score*=c(l),p.score<=n))break}u===p.score&&m.push(p.boxIndex)}),m}var d=v(x());function oa(o){let t=d.unstack(d.transpose(o,[1,0])),e=[d.sub(t[2],t[0]),d.sub(t[3],t[1])],r=[d.add(t[0],d.div(e[0],2)),d.add(t[1],d.div(e[1],2))];return{sizes:e,centers:r}}function na(o,t){let{sizes:e,centers:r}=oa(o),n=d.unstack(d.transpose(t,[1,0])),a=d.div(d.mul(d.exp(d.div(n[2],5)),e[0]),2),s=d.add(d.mul(d.div(n[0],10),e[0]),r[0]),i=d.div(d.mul(d.exp(d.div(n[3],5)),e[1]),2),c=d.add(d.mul(d.div(n[1],10),e[1]),r[1]);return d.transpose(d.stack([d.sub(s,a),d.sub(c,i),d.add(s,a),d.add(c,i)]),[1,0])}function Uo(o,t,e){return d.tidy(()=>{let r=o.shape[0],n=na(d.reshape(d.tile(e.extra_dim,[r,1,1]),[-1,4]),d.reshape(o,[-1,4]));n=d.reshape(n,[r,n.shape[0]/r,4]);let a=d.sigmoid(d.slice(t,[0,0,1],[-1,-1,-1])),s=d.slice(a,[0,0,0],[-1,-1,1]);s=d.reshape(s,[r,s.shape[1]]);let i=d.unstack(n),c=d.unstack(s);return{boxes:i,scores:c}})}var Ge=v(x());var Ye=v(x());function te(o,t){return Ye.tidy(()=>{let e=o.shape[0],r=Ye.reshape(qt(o,t.box_encoding_predictor),[e,-1,1,4]),n=Ye.reshape(qt(o,t.class_predictor),[e,-1,3]);return{boxPredictionEncoding:r,classPrediction:n}})}function Xo(o,t,e){return Ge.tidy(()=>{let r=Z(o,e.conv_0,[1,1]),n=Z(r,e.conv_1,[2,2]),a=Z(n,e.conv_2,[1,1]),s=Z(a,e.conv_3,[2,2]),i=Z(s,e.conv_4,[1,1]),c=Z(i,e.conv_5,[2,2]),m=Z(c,e.conv_6,[1,1]),p=Z(m,e.conv_7,[2,2]),u=te(t,e.box_predictor_0),f=te(o,e.box_predictor_1),l=te(n,e.box_predictor_2),g=te(s,e.box_predictor_3),T=te(c,e.box_predictor_4),D=te(p,e.box_predictor_5),h=Ge.concat([u.boxPredictionEncoding,f.boxPredictionEncoding,l.boxPredictionEncoding,g.boxPredictionEncoding,T.boxPredictionEncoding,D.boxPredictionEncoding],1),_=Ge.concat([u.classPrediction,f.classPrediction,l.classPrediction,g.classPrediction,T.classPrediction,D.classPrediction],1);return{boxPredictions:h,classPredictions:_}})}var X=class{constructor({minConfidence:t,maxResults:e}={}){this._name="SsdMobilenetv1Options";if(this._minConfidence=t||.5,this._maxResults=e||100,typeof this._minConfidence!="number"||this._minConfidence<=0||this._minConfidence>=1)throw new Error(`${this._name} - expected minConfidence to be a number between 0 and 1`);if(typeof this._maxResults!="number")throw new Error(`${this._name} - expected maxResults to be a number`)}get minConfidence(){return this._minConfidence}get maxResults(){return this._maxResults}};var St=class extends A{constructor(){super("SsdMobilenetv1")}forwardInput(t){let{params:e}=this;if(!e)throw new Error("SsdMobilenetv1 - load model before inference");return Lt.tidy(()=>{let r=Lt.cast(t.toBatchTensor(512,!1),"float32"),n=Lt.sub(Lt.div(r,127.5),1),a=Go(n,e.mobilenetv1),{boxPredictions:s,classPredictions:i}=Xo(a.out,a.conv11,e.prediction_layer);return Uo(s,i,e.output_layer)})}async forward(t){return this.forwardInput(await C(t))}async locateFaces(t,e={}){let{maxResults:r,minConfidence:n}=new X(e),a=await C(t),{boxes:s,scores:i}=this.forwardInput(a),c=s[0],m=i[0];for(let y=1;y{let[E,W]=[Math.max(0,h[y][0]),Math.min(1,h[y][2])].map(q=>q*D),[tt,lt]=[Math.max(0,h[y][1]),Math.min(1,h[y][3])].map(q=>q*T);return new M(p[y],new Yt(tt,E,lt-tt,W-E),{height:a.getInputHeight(0),width:a.getInputWidth(0)})});return c.dispose(),m.dispose(),_}getDefaultModelName(){return"ssd_mobilenetv1_model"}extractParamsFromWeightMap(t){return Yo(t)}extractParams(t){return Vo(t)}};function Jo(o){let t=new St;return t.extractWeights(o),t}function aa(o){return Jo(o)}var uo=class extends St{};var qo=.4,Zo=[new b(.738768,.874946),new b(2.42204,2.65704),new b(4.30971,7.04493),new b(10.246,4.59428),new b(12.6868,11.8741)],Ko=[new b(1.603231,2.094468),new b(6.041143,7.080126),new b(2.882459,3.518061),new b(4.266906,5.178857),new b(9.041765,10.66308)],Qo=[117.001,114.697,97.404],tn="tiny_yolov2_model",en="tiny_yolov2_separable_conv_model";var N=v(x());var Cr=o=>typeof o=="number";function fo(o){if(!o)throw new Error(`invalid config: ${o}`);if(typeof o.withSeparableConvs!="boolean")throw new Error(`config.withSeparableConvs has to be a boolean, have: ${o.withSeparableConvs}`);if(!Cr(o.iouThreshold)||o.iouThreshold<0||o.iouThreshold>1)throw new Error(`config.iouThreshold has to be a number between [0, 1], have: ${o.iouThreshold}`);if(!Array.isArray(o.classes)||!o.classes.length||!o.classes.every(t=>typeof t=="string"))throw new Error(`config.classes has to be an array class names: string[], have: ${JSON.stringify(o.classes)}`);if(!Array.isArray(o.anchors)||!o.anchors.length||!o.anchors.map(t=>t||{}).every(t=>Cr(t.x)&&Cr(t.y)))throw new Error(`config.anchors has to be an array of { x: number, y: number }, have: ${JSON.stringify(o.anchors)}`);if(o.meanRgb&&(!Array.isArray(o.meanRgb)||o.meanRgb.length!==3||!o.meanRgb.every(Cr)))throw new Error(`config.meanRgb has to be an array of shape [number, number, number], have: ${JSON.stringify(o.meanRgb)}`)}var Q=v(x());var K=v(x());function Me(o){return K.tidy(()=>{let t=K.mul(o,K.scalar(.10000000149011612));return K.add(K.relu(K.sub(o,t)),t)})}function Tt(o,t){return Q.tidy(()=>{let e=Q.pad(o,[[0,0],[1,1],[1,1],[0,0]]);return e=Q.conv2d(e,t.conv.filters,[1,1],"valid"),e=Q.sub(e,t.bn.sub),e=Q.mul(e,t.bn.truediv),e=Q.add(e,t.conv.bias),Me(e)})}var At=v(x());function Pt(o,t){return At.tidy(()=>{let e=At.pad(o,[[0,0],[1,1],[1,1],[0,0]]);return e=At.separableConv2d(e,t.depthwise_filter,t.pointwise_filter,[1,1],"valid"),e=At.add(e,t.bias),Me(e)})}var lo=v(x());function sa(o,t){let e=be(o,t);function r(s,i){let c=lo.tensor1d(o(s)),m=lo.tensor1d(o(s));return t.push({paramPath:`${i}/sub`},{paramPath:`${i}/truediv`}),{sub:c,truediv:m}}function n(s,i,c){let m=e(s,i,3,`${c}/conv`),p=r(i,`${c}/bn`);return{conv:m,bn:p}}let a=ge(o,t);return{extractConvParams:e,extractConvWithBatchNormParams:n,extractSeparableConvParams:a}}function rn(o,t,e,r){let{extractWeights:n,getRemainingWeights:a}=R(o),s=[],{extractConvParams:i,extractConvWithBatchNormParams:c,extractSeparableConvParams:m}=sa(n,s),p;if(t.withSeparableConvs){let[u,f,l,g,T,D,h,_,y]=r,E=t.isFirstLayerConv2d?i(u,f,3,"conv0"):m(u,f,"conv0"),W=m(f,l,"conv1"),tt=m(l,g,"conv2"),lt=m(g,T,"conv3"),q=m(T,D,"conv4"),Dt=m(D,h,"conv5"),Et=_?m(h,_,"conv6"):void 0,Mt=y?m(_,y,"conv7"):void 0,$t=i(y||_||h,5*e,1,"conv8");p={conv0:E,conv1:W,conv2:tt,conv3:lt,conv4:q,conv5:Dt,conv6:Et,conv7:Mt,conv8:$t}}else{let[u,f,l,g,T,D,h,_,y]=r,E=c(u,f,"conv0"),W=c(f,l,"conv1"),tt=c(l,g,"conv2"),lt=c(g,T,"conv3"),q=c(T,D,"conv4"),Dt=c(D,h,"conv5"),Et=c(h,_,"conv6"),Mt=c(_,y,"conv7"),$t=i(y,5*e,1,"conv8");p={conv0:E,conv1:W,conv2:tt,conv3:lt,conv4:q,conv5:Dt,conv6:Et,conv7:Mt,conv8:$t}}if(a().length!==0)throw new Error(`weights remaing after extract: ${a().length}`);return{params:p,paramMappings:s}}function ia(o,t){let e=Y(o,t);function r(i){let c=e(`${i}/sub`,1),m=e(`${i}/truediv`,1);return{sub:c,truediv:m}}function n(i){let c=e(`${i}/filters`,4),m=e(`${i}/bias`,1);return{filters:c,bias:m}}function a(i){let c=n(`${i}/conv`),m=r(`${i}/bn`);return{conv:c,bn:m}}let s=xe(e);return{extractConvParams:n,extractConvWithBatchNormParams:a,extractSeparableConvParams:s}}function on(o,t){let e=[],{extractConvParams:r,extractConvWithBatchNormParams:n,extractSeparableConvParams:a}=ia(o,e),s;if(t.withSeparableConvs){let i=t.filterSizes&&t.filterSizes.length||9;s={conv0:t.isFirstLayerConv2d?r("conv0"):a("conv0"),conv1:a("conv1"),conv2:a("conv2"),conv3:a("conv3"),conv4:a("conv4"),conv5:a("conv5"),conv6:i>7?a("conv6"):void 0,conv7:i>8?a("conv7"):void 0,conv8:r("conv8")}}else s={conv0:n("conv0"),conv1:n("conv1"),conv2:n("conv2"),conv3:n("conv3"),conv4:n("conv4"),conv5:n("conv5"),conv6:n("conv6"),conv7:n("conv7"),conv8:r("conv8")};return B(o,e),{params:s,paramMappings:e}}var st=class{constructor({inputSize:t,scoreThreshold:e}={}){this._name="TinyYolov2Options";if(this._inputSize=t||416,this._scoreThreshold=e||.5,typeof this._inputSize!="number"||this._inputSize%32!==0)throw new Error(`${this._name} - expected inputSize to be a number divisible by 32`);if(typeof this._scoreThreshold!="number"||this._scoreThreshold<=0||this._scoreThreshold>=1)throw new Error(`${this._name} - expected scoreThreshold to be a number between 0 and 1`)}get inputSize(){return this._inputSize}get scoreThreshold(){return this._scoreThreshold}};var ho=class extends A{constructor(e){super("TinyYolov2");fo(e),this._config=e}get config(){return this._config}get withClassScores(){return this.config.withClassScores||this.config.classes.length>1}get boxEncodingSize(){return 5+(this.withClassScores?this.config.classes.length:0)}runTinyYolov2(e,r){let n=Tt(e,r.conv0);return n=N.maxPool(n,[2,2],[2,2],"same"),n=Tt(n,r.conv1),n=N.maxPool(n,[2,2],[2,2],"same"),n=Tt(n,r.conv2),n=N.maxPool(n,[2,2],[2,2],"same"),n=Tt(n,r.conv3),n=N.maxPool(n,[2,2],[2,2],"same"),n=Tt(n,r.conv4),n=N.maxPool(n,[2,2],[2,2],"same"),n=Tt(n,r.conv5),n=N.maxPool(n,[2,2],[1,1],"same"),n=Tt(n,r.conv6),n=Tt(n,r.conv7),qt(n,r.conv8,"valid",!1)}runMobilenet(e,r){let n=this.config.isFirstLayerConv2d?Me(qt(e,r.conv0,"valid",!1)):Pt(e,r.conv0);return n=N.maxPool(n,[2,2],[2,2],"same"),n=Pt(n,r.conv1),n=N.maxPool(n,[2,2],[2,2],"same"),n=Pt(n,r.conv2),n=N.maxPool(n,[2,2],[2,2],"same"),n=Pt(n,r.conv3),n=N.maxPool(n,[2,2],[2,2],"same"),n=Pt(n,r.conv4),n=N.maxPool(n,[2,2],[2,2],"same"),n=Pt(n,r.conv5),n=N.maxPool(n,[2,2],[1,1],"same"),n=r.conv6?Pt(n,r.conv6):n,n=r.conv7?Pt(n,r.conv7):n,qt(n,r.conv8,"valid",!1)}forwardInput(e,r){let{params:n}=this;if(!n)throw new Error("TinyYolov2 - load model before inference");return N.tidy(()=>{let a=N.cast(e.toBatchTensor(r,!1),"float32");return a=this.config.meanRgb?rt(a,this.config.meanRgb):a,a=a.div(255),this.config.withSeparableConvs?this.runMobilenet(a,n):this.runTinyYolov2(a,n)})}async forward(e,r){return this.forwardInput(await C(e),r)}async detect(e,r={}){let{inputSize:n,scoreThreshold:a}=new st(r),s=await C(e),i=await this.forwardInput(s,n),c=N.tidy(()=>N.unstack(i)[0].expandDims()),m={width:s.getInputWidth(0),height:s.getInputHeight(0)},p=await this.extractBoxes(c,s.getReshapedInputDimensions(0),a);i.dispose(),c.dispose();let u=p.map(h=>h.box),f=p.map(h=>h.score),l=p.map(h=>h.classScore),g=p.map(h=>this.config.classes[h.label]);return zr(u.map(h=>h.rescale(n)),f,this.config.iouThreshold,!0).map(h=>new bt(f[h],l[h],g[h],u[h],m))}getDefaultModelName(){return""}extractParamsFromWeightMap(e){return on(e,this.config)}extractParams(e){let r=this.config.filterSizes||ho.DEFAULT_FILTER_SIZES,n=r?r.length:void 0;if(n!==7&&n!==8&&n!==9)throw new Error(`TinyYolov2 - expected 7 | 8 | 9 convolutional filters, but found ${n} filterSizes in config`);return rn(e,this.config,this.boxEncodingSize,r)}async extractBoxes(e,r,n){let{width:a,height:s}=r,i=Math.max(a,s),c=i/a,m=i/s,p=e.shape[1],u=this.config.anchors.length,[f,l,g]=N.tidy(()=>{let _=e.reshape([p,p,u,this.boxEncodingSize]),y=_.slice([0,0,0,0],[p,p,u,4]),E=_.slice([0,0,0,4],[p,p,u,1]),W=this.withClassScores?N.softmax(_.slice([0,0,0,5],[p,p,u,this.config.classes.length]),3):N.scalar(0);return[y,E,W]}),T=[],D=await l.array(),h=await f.array();for(let _=0;_n){let tt=(y+Ne(h[_][y][E][0]))/p*c,lt=(_+Ne(h[_][y][E][1]))/p*m,q=Math.exp(h[_][y][E][2])*this.config.anchors[E].x/p*c,Dt=Math.exp(h[_][y][E][3])*this.config.anchors[E].y/p*m,Et=tt-q/2,Mt=lt-Dt/2,$t={row:_,col:y,anchor:E},{classScore:xo,label:vo}=this.withClassScores?await this.extractPredictedClass(g,$t):{classScore:1,label:0};T.push({box:new Vt(Et,Mt,Et+q,Mt+Dt),score:W,classScore:W*xo,label:vo,...$t})}}return f.dispose(),l.dispose(),g.dispose(),T}async extractPredictedClass(e,r){let{row:n,col:a,anchor:s}=r,i=await e.array();return Array(this.config.classes.length).fill(0).map((c,m)=>i[n][a][s][m]).map((c,m)=>({classScore:c,label:m})).reduce((c,m)=>c.classScore>m.classScore?c:m)}},ee=ho;ee.DEFAULT_FILTER_SIZES=[3,16,32,64,128,256,512,1024,1024];var re=class extends ee{constructor(t=!0){let e={withSeparableConvs:t,iouThreshold:qo,classes:["face"],...t?{anchors:Ko,meanRgb:Qo}:{anchors:Zo,withClassScores:!0}};super(e)}get withSeparableConvs(){return this.config.withSeparableConvs}get anchors(){return this.config.anchors}async locateFaces(t,e){return(await this.detect(t,e)).map(n=>new M(n.score,n.relativeBox,{width:n.imageWidth,height:n.imageHeight}))}getDefaultModelName(){return this.withSeparableConvs?en:tn}extractParamsFromWeightMap(t){return super.extractParamsFromWeightMap(t)}};function ca(o,t=!0){let e=new re(t);return e.extractWeights(o),e}var je=class extends st{constructor(){super(...arguments);this._name="TinyFaceDetectorOptions"}};var J=class{async then(t){return t(await this.run())}async run(){throw new Error("ComposableTask - run is not implemented")}};var Xe=v(x());var bo=v(x());async function oe(o,t,e,r,n=({alignedRect:a})=>a){let a=o.map(c=>Zt(c)?n(c):c.detection),s=r||(t instanceof bo.Tensor?await de(t,a):await le(t,a)),i=await e(s);return s.forEach(c=>c instanceof bo.Tensor&&c.dispose()),i}async function Ce(o,t,e,r,n){return oe([o],t,async a=>e(a[0]),r,n)}var nn=.4,an=[new b(1.603231,2.094468),new b(6.041143,7.080126),new b(2.882459,3.518061),new b(4.266906,5.178857),new b(9.041765,10.66308)],sn=[117.001,114.697,97.404];var ne=class extends ee{constructor(){let t={withSeparableConvs:!0,iouThreshold:nn,classes:["face"],anchors:an,meanRgb:sn,isFirstLayerConv2d:!0,filterSizes:[3,16,32,64,128,256,512]};super(t)}get anchors(){return this.config.anchors}async locateFaces(t,e){return(await this.detect(t,e)).map(n=>new M(n.score,n.relativeBox,{width:n.imageWidth,height:n.imageHeight}))}getDefaultModelName(){return"tiny_face_detector_model"}extractParamsFromWeightMap(t){return super.extractParamsFromWeightMap(t)}};var w={ssdMobilenetv1:new St,tinyFaceDetector:new ne,tinyYolov2:new re,faceLandmark68Net:new Kt,faceLandmark68TinyNet:new ze,faceRecognitionNet:new Qt,faceExpressionNet:new Oe,ageGenderNet:new He},cn=(o,t)=>w.ssdMobilenetv1.locateFaces(o,t),ma=(o,t)=>w.tinyFaceDetector.locateFaces(o,t),pa=(o,t)=>w.tinyYolov2.locateFaces(o,t),mn=o=>w.faceLandmark68Net.detectLandmarks(o),ua=o=>w.faceLandmark68TinyNet.detectLandmarks(o),fa=o=>w.faceRecognitionNet.computeFaceDescriptor(o),la=o=>w.faceExpressionNet.predictExpressions(o),da=o=>w.ageGenderNet.predictAgeAndGender(o),pn=o=>w.ssdMobilenetv1.load(o),ha=o=>w.tinyFaceDetector.load(o),ba=o=>w.tinyYolov2.load(o),ga=o=>w.faceLandmark68Net.load(o),xa=o=>w.faceLandmark68TinyNet.load(o),va=o=>w.faceRecognitionNet.load(o),ya=o=>w.faceExpressionNet.load(o),_a=o=>w.ageGenderNet.load(o),Ta=pn,Pa=cn,wa=mn;var Ir=class extends J{constructor(e,r,n){super();this.parentTask=e;this.input=r;this.extractedFaces=n}},ae=class extends Ir{async run(){let t=await this.parentTask,e=await oe(t,this.input,async r=>Promise.all(r.map(n=>w.faceExpressionNet.predictExpressions(n))),this.extractedFaces);return t.map((r,n)=>xr(r,e[n]))}withAgeAndGender(){return new ie(this,this.input)}},se=class extends Ir{async run(){let t=await this.parentTask;if(!t)return;let e=await Ce(t,this.input,r=>w.faceExpressionNet.predictExpressions(r),this.extractedFaces);return xr(t,e)}withAgeAndGender(){return new ce(this,this.input)}},Wt=class extends ae{withAgeAndGender(){return new Bt(this,this.input)}withFaceDescriptors(){return new wt(this,this.input)}},kt=class extends se{withAgeAndGender(){return new Rt(this,this.input)}withFaceDescriptor(){return new Ft(this,this.input)}};var Nr=class extends J{constructor(e,r,n){super();this.parentTask=e;this.input=r;this.extractedFaces=n}},ie=class extends Nr{async run(){let t=await this.parentTask,e=await oe(t,this.input,async r=>Promise.all(r.map(n=>w.ageGenderNet.predictAgeAndGender(n))),this.extractedFaces);return t.map((r,n)=>{let{age:a,gender:s,genderProbability:i}=e[n];return Er(Mr(r,s,i),a)})}withFaceExpressions(){return new ae(this,this.input)}},ce=class extends Nr{async run(){let t=await this.parentTask;if(!t)return;let{age:e,gender:r,genderProbability:n}=await Ce(t,this.input,a=>w.ageGenderNet.predictAgeAndGender(a),this.extractedFaces);return Er(Mr(t,r,n),e)}withFaceExpressions(){return new se(this,this.input)}},Bt=class extends ie{withFaceExpressions(){return new Wt(this,this.input)}withFaceDescriptors(){return new wt(this,this.input)}},Rt=class extends ce{withFaceExpressions(){return new kt(this,this.input)}withFaceDescriptor(){return new Ft(this,this.input)}};var Ue=class extends J{constructor(e,r){super();this.parentTask=e;this.input=r}},wt=class extends Ue{async run(){let t=await this.parentTask;return(await oe(t,this.input,r=>Promise.all(r.map(n=>w.faceRecognitionNet.computeFaceDescriptor(n))),null,r=>r.landmarks.align(null,{useDlibAlignment:!0}))).map((r,n)=>Dr(t[n],r))}withFaceExpressions(){return new Wt(this,this.input)}withAgeAndGender(){return new Bt(this,this.input)}},Ft=class extends Ue{async run(){let t=await this.parentTask;if(!t)return;let e=await Ce(t,this.input,r=>w.faceRecognitionNet.computeFaceDescriptor(r),null,r=>r.landmarks.align(null,{useDlibAlignment:!0}));return Dr(t,e)}withFaceExpressions(){return new kt(this,this.input)}withAgeAndGender(){return new Rt(this,this.input)}};var Je=class extends J{constructor(e,r,n){super();this.parentTask=e;this.input=r;this.useTinyLandmarkNet=n}get landmarkNet(){return this.useTinyLandmarkNet?w.faceLandmark68TinyNet:w.faceLandmark68Net}},qe=class extends Je{async run(){let t=await this.parentTask,e=t.map(s=>s.detection),r=this.input instanceof Xe.Tensor?await de(this.input,e):await le(this.input,e),n=await Promise.all(r.map(s=>this.landmarkNet.detectLandmarks(s)));return r.forEach(s=>s instanceof Xe.Tensor&&s.dispose()),t.filter((s,i)=>n[i]).map((s,i)=>we(s,n[i]))}withFaceExpressions(){return new Wt(this,this.input)}withAgeAndGender(){return new Bt(this,this.input)}withFaceDescriptors(){return new wt(this,this.input)}},Ze=class extends Je{async run(){let t=await this.parentTask;if(!t)return;let{detection:e}=t,r=this.input instanceof Xe.Tensor?await de(this.input,[e]):await le(this.input,[e]),n=await this.landmarkNet.detectLandmarks(r[0]);return r.forEach(a=>a instanceof Xe.Tensor&&a.dispose()),we(t,n)}withFaceExpressions(){return new kt(this,this.input)}withAgeAndGender(){return new Rt(this,this.input)}withFaceDescriptor(){return new Ft(this,this.input)}};var Ke=class extends J{constructor(e,r=new X){super();this.input=e;this.options=r}},Ie=class extends Ke{async run(){let{input:t,options:e}=this,r;if(e instanceof je)r=w.tinyFaceDetector.locateFaces(t,e);else if(e instanceof X)r=w.ssdMobilenetv1.locateFaces(t,e);else if(e instanceof st)r=w.tinyYolov2.locateFaces(t,e);else throw new Error("detectFaces - expected options to be instance of TinyFaceDetectorOptions | SsdMobilenetv1Options | TinyYolov2Options");return r}runAndExtendWithFaceDetections(){return new Promise((t,e)=>{this.run().then(r=>t(r.map(n=>jt({},n)))).catch(r=>e(r))})}withFaceLandmarks(t=!1){return new qe(this.runAndExtendWithFaceDetections(),this.input,t)}withFaceExpressions(){return new ae(this.runAndExtendWithFaceDetections(),this.input)}withAgeAndGender(){return new ie(this.runAndExtendWithFaceDetections(),this.input)}},Qe=class extends Ke{async run(){let t=await new Ie(this.input,this.options),e=t[0];return t.forEach(r=>{r.score>e.score&&(e=r)}),e}runAndExtendWithFaceDetection(){return new Promise(async t=>{let e=await this.run();t(e?jt({},e):void 0)})}withFaceLandmarks(t=!1){return new Ze(this.runAndExtendWithFaceDetection(),this.input,t)}withFaceExpressions(){return new se(this.runAndExtendWithFaceDetection(),this.input)}withAgeAndGender(){return new ce(this.runAndExtendWithFaceDetection(),this.input)}};function Fa(o,t=new X){return new Qe(o,t)}function Sr(o,t=new X){return new Ie(o,t)}async function un(o,t){return Sr(o,new X(t?{minConfidence:t}:{})).withFaceLandmarks().withFaceDescriptors()}async function Da(o,t={}){return Sr(o,new st(t)).withFaceLandmarks().withFaceDescriptors()}var Ea=un;function go(o,t){if(o.length!==t.length)throw new Error("euclideanDistance: arr1.length !== arr2.length");let e=Array.from(o),r=Array.from(t);return Math.sqrt(e.map((n,a)=>n-r[a]).reduce((n,a)=>n+a**2,0))}var tr=class{constructor(t,e=.6){this._distanceThreshold=e;let r=Array.isArray(t)?t:[t];if(!r.length)throw new Error("FaceRecognizer.constructor - expected atleast one input");let n=1,a=()=>`person ${n++}`;this._labeledDescriptors=r.map(s=>{if(s instanceof mt)return s;if(s instanceof Float32Array)return new mt(a(),[s]);if(s.descriptor&&s.descriptor instanceof Float32Array)return new mt(a(),[s.descriptor]);throw new Error("FaceRecognizer.constructor - expected inputs to be of type LabeledFaceDescriptors | WithFaceDescriptor | Float32Array | Array | Float32Array>")})}get labeledDescriptors(){return this._labeledDescriptors}get distanceThreshold(){return this._distanceThreshold}computeMeanDistance(t,e){return e.map(r=>go(r,t)).reduce((r,n)=>r+n,0)/(e.length||1)}matchDescriptor(t){return this.labeledDescriptors.map(({descriptors:e,label:r})=>new pe(r,this.computeMeanDistance(t,e))).reduce((e,r)=>e.distancet.toJSON())}}static fromJSON(t){let e=t.labeledDescriptors.map(r=>mt.fromJSON(r));return new tr(e,t.distanceThreshold)}};function Ma(o){let t=new ne;return t.extractWeights(o),t}function fn(o,t){let{width:e,height:r}=new k(t.width,t.height);if(e<=0||r<=0)throw new Error(`resizeResults - invalid dimensions: ${JSON.stringify({width:e,height:r})}`);if(Array.isArray(o))return o.map(n=>fn(n,{width:e,height:r}));if(Zt(o)){let n=o.detection.forSize(e,r),a=o.unshiftedLandmarks.forSize(n.box.width,n.box.height);return we(jt(o,n),a)}return pt(o)?jt(o,o.detection.forSize(e,r)):o instanceof z||o instanceof M?o.forSize(e,r):o}var Ia=No;0&&(module.exports={AgeGenderNet,BoundingBox,Box,ComposableTask,ComputeAllFaceDescriptorsTask,ComputeFaceDescriptorsTaskBase,ComputeSingleFaceDescriptorTask,DetectAllFaceLandmarksTask,DetectAllFacesTask,DetectFaceLandmarksTaskBase,DetectFacesTaskBase,DetectSingleFaceLandmarksTask,DetectSingleFaceTask,Dimensions,FACE_EXPRESSION_LABELS,FaceDetection,FaceDetectionNet,FaceExpressionNet,FaceExpressions,FaceLandmark68Net,FaceLandmark68TinyNet,FaceLandmarkNet,FaceLandmarks,FaceLandmarks5,FaceLandmarks68,FaceMatch,FaceMatcher,FaceRecognitionNet,Gender,LabeledBox,LabeledFaceDescriptors,NetInput,NeuralNetwork,ObjectDetection,Point,PredictedBox,Rect,SsdMobilenetv1,SsdMobilenetv1Options,TinyFaceDetector,TinyFaceDetectorOptions,TinyYolov2,TinyYolov2Options,allFaces,allFacesSsdMobilenetv1,allFacesTinyYolov2,awaitMediaLoaded,bufferToImage,computeFaceDescriptor,createCanvas,createCanvasFromMedia,createFaceDetectionNet,createFaceRecognitionNet,createSsdMobilenetv1,createTinyFaceDetector,createTinyYolov2,detectAllFaces,detectFaceLandmarks,detectFaceLandmarksTiny,detectLandmarks,detectSingleFace,draw,env,euclideanDistance,extendWithAge,extendWithFaceDescriptor,extendWithFaceDetection,extendWithFaceExpressions,extendWithFaceLandmarks,extendWithGender,extractFaceTensors,extractFaces,fetchImage,fetchJson,fetchNetWeights,fetchOrThrow,fetchVideo,getContext2dOrThrow,getMediaDimensions,imageTensorToCanvas,imageToSquare,inverseSigmoid,iou,isMediaElement,isMediaLoaded,isWithAge,isWithFaceDetection,isWithFaceExpressions,isWithFaceLandmarks,isWithGender,loadAgeGenderModel,loadFaceDetectionModel,loadFaceExpressionModel,loadFaceLandmarkModel,loadFaceLandmarkTinyModel,loadFaceRecognitionModel,loadSsdMobilenetv1Model,loadTinyFaceDetectorModel,loadTinyYolov2Model,loadWeightMap,locateFaces,matchDimensions,minBbox,nets,nonMaxSuppression,normalize,padToSquare,predictAgeAndGender,recognizeFaceExpressions,resizeResults,resolveInput,shuffleArray,sigmoid,ssdMobilenetv1,tf,tinyFaceDetector,tinyYolov2,toNetInput,utils,validateConfig,version}); diff --git a/dist/face-api.node-wasm.js b/dist/face-api.node-wasm.js index de274cd..0d6f665 100644 --- a/dist/face-api.node-wasm.js +++ b/dist/face-api.node-wasm.js @@ -4,4 +4,4 @@ author: ' */ -"use strict";var dn=Object.create;var er=Object.defineProperty;var hn=Object.getOwnPropertyDescriptor;var bn=Object.getOwnPropertyNames;var gn=Object.getPrototypeOf,xn=Object.prototype.hasOwnProperty;var vn=(o,t)=>()=>(t||o((t={exports:{}}).exports,t),t.exports),Ar=(o,t)=>{for(var e in t)er(o,e,{get:t[e],enumerable:!0})},_o=(o,t,e,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of bn(t))!xn.call(o,n)&&n!==e&&er(o,n,{get:()=>t[n],enumerable:!(r=hn(t,n))||r.enumerable});return o};var v=(o,t,e)=>(e=o!=null?dn(gn(o)):{},_o(t||!o||!o.__esModule?er(e,"default",{value:o,enumerable:!0}):e,o)),yn=o=>_o(er({},"__esModule",{value:!0}),o);var x=vn((ka,rr)=>{"use strict";var To=Object.defineProperty,_n=Object.getOwnPropertyDescriptor,Tn=Object.getOwnPropertyNames,Pn=Object.prototype.hasOwnProperty,Wr=(o,t,e,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Tn(t))!Pn.call(o,n)&&n!==e&&To(o,n,{get:()=>t[n],enumerable:!(r=_n(t,n))||r.enumerable});return o},Po=(o,t,e)=>(Wr(o,t,"default"),e&&Wr(e,t,"default")),wn=o=>Wr(To({},"__esModule",{value:!0}),o),kr={};rr.exports=wn(kr);Po(kr,require("@tensorflow/tfjs"),rr.exports);Po(kr,require("@tensorflow/tfjs-backend-wasm"),rr.exports)});var Na={};Ar(Na,{AgeGenderNet:()=>He,BoundingBox:()=>Vt,Box:()=>F,ComposableTask:()=>J,ComputeAllFaceDescriptorsTask:()=>wt,ComputeFaceDescriptorsTaskBase:()=>Ue,ComputeSingleFaceDescriptorTask:()=>Ft,DetectAllFaceLandmarksTask:()=>qe,DetectAllFacesTask:()=>Ie,DetectFaceLandmarksTaskBase:()=>Je,DetectFacesTaskBase:()=>Ke,DetectSingleFaceLandmarksTask:()=>Ze,DetectSingleFaceTask:()=>Qe,Dimensions:()=>k,FACE_EXPRESSION_LABELS:()=>ao,FaceDetection:()=>M,FaceDetectionNet:()=>fo,FaceExpressionNet:()=>Oe,FaceExpressions:()=>yt,FaceLandmark68Net:()=>Kt,FaceLandmark68TinyNet:()=>ze,FaceLandmarkNet:()=>mo,FaceLandmarks:()=>z,FaceLandmarks5:()=>Gr,FaceLandmarks68:()=>Gt,FaceMatch:()=>pe,FaceMatcher:()=>tr,FaceRecognitionNet:()=>Qt,Gender:()=>Pr,LabeledBox:()=>ue,LabeledFaceDescriptors:()=>mt,NetInput:()=>ut,NeuralNetwork:()=>A,ObjectDetection:()=>bt,Point:()=>b,PredictedBox:()=>jr,Rect:()=>Yt,SsdMobilenetv1:()=>St,SsdMobilenetv1Options:()=>X,TinyFaceDetector:()=>ne,TinyFaceDetectorOptions:()=>je,TinyYolov2:()=>re,TinyYolov2Options:()=>st,allFaces:()=>Ea,allFacesSsdMobilenetv1:()=>fn,allFacesTinyYolov2:()=>Da,awaitMediaLoaded:()=>Qr,bufferToImage:()=>to,computeFaceDescriptor:()=>fa,createCanvas:()=>Jt,createCanvasFromMedia:()=>We,createFaceDetectionNet:()=>aa,createFaceRecognitionNet:()=>Xn,createSsdMobilenetv1:()=>qo,createTinyFaceDetector:()=>Ma,createTinyYolov2:()=>ca,detectAllFaces:()=>Lr,detectFaceLandmarks:()=>pn,detectFaceLandmarksTiny:()=>ua,detectLandmarks:()=>wa,detectSingleFace:()=>Fa,draw:()=>io,env:()=>P,euclideanDistance:()=>xo,extendWithAge:()=>Mr,extendWithFaceDescriptor:()=>Er,extendWithFaceDetection:()=>jt,extendWithFaceExpressions:()=>vr,extendWithFaceLandmarks:()=>we,extendWithGender:()=>Cr,extractFaceTensors:()=>de,extractFaces:()=>le,fetchImage:()=>An,fetchJson:()=>oo,fetchNetWeights:()=>Wn,fetchOrThrow:()=>xt,fetchVideo:()=>kn,getContext2dOrThrow:()=>O,getMediaDimensions:()=>Xt,imageTensorToCanvas:()=>eo,imageToSquare:()=>ro,inverseSigmoid:()=>En,iou:()=>Hr,isMediaElement:()=>cr,isMediaLoaded:()=>Ae,isWithAge:()=>Jn,isWithFaceDetection:()=>pt,isWithFaceExpressions:()=>so,isWithFaceLandmarks:()=>Zt,isWithGender:()=>qn,loadAgeGenderModel:()=>_a,loadFaceDetectionModel:()=>Ta,loadFaceExpressionModel:()=>ya,loadFaceLandmarkModel:()=>ga,loadFaceLandmarkTinyModel:()=>xa,loadFaceRecognitionModel:()=>va,loadSsdMobilenetv1Model:()=>un,loadTinyFaceDetectorModel:()=>ha,loadTinyYolov2Model:()=>ba,loadWeightMap:()=>no,locateFaces:()=>Pa,matchDimensions:()=>Bn,minBbox:()=>zr,nets:()=>w,nonMaxSuppression:()=>Vr,normalize:()=>rt,padToSquare:()=>Yr,predictAgeAndGender:()=>da,recognizeFaceExpressions:()=>la,resizeResults:()=>ln,resolveInput:()=>Ut,shuffleArray:()=>Dn,sigmoid:()=>Ne,ssdMobilenetv1:()=>mn,tf:()=>Ca,tinyFaceDetector:()=>ma,tinyYolov2:()=>pa,toNetInput:()=>C,utils:()=>Or,validateConfig:()=>lo,version:()=>Ia});module.exports=yn(Na);var Ca=v(x());var io={};Ar(io,{AnchorPosition:()=>Kr,DrawBox:()=>Le,DrawBoxOptions:()=>sr,DrawFaceLandmarks:()=>_r,DrawFaceLandmarksOptions:()=>yr,DrawTextField:()=>gt,DrawTextFieldOptions:()=>fe,drawContour:()=>dt,drawDetections:()=>Ln,drawFaceExpressions:()=>Rn,drawFaceLandmarks:()=>On});function dt(o,t,e=!1){if(o.beginPath(),t.slice(1).forEach(({x:r,y:n},a)=>{let s=t[a];o.moveTo(s.x,s.y),o.lineTo(r,n)}),e){let r=t[t.length-1],n=t[0];if(!r||!n)return;o.moveTo(r.x,r.y),o.lineTo(n.x,n.y)}o.stroke()}var Or={};Ar(Or,{computeReshapedDimensions:()=>$r,getCenterPoint:()=>zt,isDimensions:()=>nr,isEven:()=>or,isFloat:()=>Rr,isTensor:()=>Ot,isTensor1D:()=>Fn,isTensor2D:()=>Br,isTensor3D:()=>ht,isTensor4D:()=>U,isValidNumber:()=>et,isValidProbablitiy:()=>me,range:()=>it,round:()=>Ht});var wo=v(x());var k=class{constructor(t,e){if(!et(t)||!et(e))throw new Error(`Dimensions.constructor - expected width and height to be valid numbers, instead have ${JSON.stringify({width:t,height:e})}`);this._width=t,this._height=e}get width(){return this._width}get height(){return this._height}reverse(){return new k(1/this.width,1/this.height)}};function Ot(o,t){return o instanceof wo.Tensor&&o.shape.length===t}function Fn(o){return Ot(o,1)}function Br(o){return Ot(o,2)}function ht(o){return Ot(o,3)}function U(o){return Ot(o,4)}function Rr(o){return o%1!==0}function or(o){return o%2===0}function Ht(o,t=2){let e=10**t;return Math.floor(o*e)/e}function nr(o){return o&&o.width&&o.height}function $r({width:o,height:t},e){let r=e/Math.max(t,o);return new k(Math.round(o*r),Math.round(t*r))}function zt(o){return o.reduce((t,e)=>t.add(e),new b(0,0)).div(new b(o.length,o.length))}function it(o,t,e){return Array(o).fill(0).map((r,n)=>t+n*e)}function et(o){return!!o&&o!==1/0&&o!==-1/0&&!Number.isNaN(o)||o===0}function me(o){return et(o)&&o>=0&&o<=1}var b=class{constructor(t,e){this._x=t,this._y=e}get x(){return this._x}get y(){return this._y}add(t){return new b(this.x+t.x,this.y+t.y)}sub(t){return new b(this.x-t.x,this.y-t.y)}mul(t){return new b(this.x*t.x,this.y*t.y)}div(t){return new b(this.x/t.x,this.y/t.y)}abs(){return new b(Math.abs(this.x),Math.abs(this.y))}magnitude(){return Math.sqrt(this.x**2+this.y**2)}floor(){return new b(Math.floor(this.x),Math.floor(this.y))}};var F=class{static isRect(t){return!!t&&[t.x,t.y,t.width,t.height].every(et)}static assertIsValidBox(t,e,r=!1){if(!F.isRect(t))throw new Error(`${e} - invalid box: ${JSON.stringify(t)}, expected object with properties x, y, width, height`);if(!r&&(t.width<0||t.height<0))throw new Error(`${e} - width (${t.width}) and height (${t.height}) must be positive numbers`)}constructor(t,e=!0){let r=t||{},n=[r.left,r.top,r.right,r.bottom].every(et),a=[r.x,r.y,r.width,r.height].every(et);if(!a&&!n)throw new Error(`Box.constructor - expected box to be IBoundingBox | IRect, instead have ${JSON.stringify(r)}`);let[s,i,c,m]=a?[r.x,r.y,r.width,r.height]:[r.left,r.top,r.right-r.left,r.bottom-r.top];F.assertIsValidBox({x:s,y:i,width:c,height:m},"Box.constructor",e),this._x=s,this._y=i,this._width=c,this._height=m}get x(){return this._x}get y(){return this._y}get width(){return this._width}get height(){return this._height}get left(){return this.x}get top(){return this.y}get right(){return this.x+this.width}get bottom(){return this.y+this.height}get area(){return this.width*this.height}get topLeft(){return new b(this.left,this.top)}get topRight(){return new b(this.right,this.top)}get bottomLeft(){return new b(this.left,this.bottom)}get bottomRight(){return new b(this.right,this.bottom)}round(){let[t,e,r,n]=[this.x,this.y,this.width,this.height].map(a=>Math.round(a));return new F({x:t,y:e,width:r,height:n})}floor(){let[t,e,r,n]=[this.x,this.y,this.width,this.height].map(a=>Math.floor(a));return new F({x:t,y:e,width:r,height:n})}toSquare(){let{x:t,y:e,width:r,height:n}=this,a=Math.abs(r-n);return re&&(i=-u+e+r,u=e),f>t&&(c=-f+t+n,f=t),m<1&&(c=2-m,m=1),p<1&&(c=2-p,p=1),{dy:s,edy:c,dx:a,edx:i,y:p,ey:f,x:m,ex:u,w:r,h:n}}calibrate(t){return new F({left:this.left+t.left*this.width,top:this.top+t.top*this.height,right:this.right+t.right*this.width,bottom:this.bottom+t.bottom*this.height}).toSquare().round()}};var Vt=class extends F{constructor(t,e,r,n,a=!1){super({left:t,top:e,right:r,bottom:n},a)}};var bt=class{constructor(t,e,r,n,a){this._imageDims=new k(a.width,a.height),this._score=t,this._classScore=e,this._className=r,this._box=new F(n).rescale(this._imageDims)}get score(){return this._score}get classScore(){return this._classScore}get className(){return this._className}get box(){return this._box}get imageDims(){return this._imageDims}get imageWidth(){return this.imageDims.width}get imageHeight(){return this.imageDims.height}get relativeBox(){return new F(this._box).rescale(this.imageDims.reverse())}forSize(t,e){return new bt(this.score,this.classScore,this.className,this.relativeBox,{width:t,height:e})}};var M=class extends bt{constructor(t,e,r){super(t,t,"",e,r)}forSize(t,e){let{score:r,relativeBox:n,imageDims:a}=super.forSize(t,e);return new M(r,n,a)}};function Hr(o,t,e=!0){let r=Math.max(0,Math.min(o.right,t.right)-Math.max(o.left,t.left)),n=Math.max(0,Math.min(o.bottom,t.bottom)-Math.max(o.top,t.top)),a=r*n;return e?a/(o.area+t.area-a):a/Math.min(o.area,t.area)}function zr(o){let t=o.map(i=>i.x),e=o.map(i=>i.y),r=t.reduce((i,c)=>ccii({score:s,boxIndex:i})).sort((s,i)=>s.score-i.score).map(s=>s.boxIndex),a=[];for(;n.length>0;){let s=n.pop();a.push(s);let i=n,c=[];for(let m=0;mc[p]<=e)}return a}var ct=v(x());function rt(o,t){return ct.tidy(()=>{let[e,r,n]=t,a=ct.fill([...o.shape.slice(0,3),1],e,"float32"),s=ct.fill([...o.shape.slice(0,3),1],r,"float32"),i=ct.fill([...o.shape.slice(0,3),1],n,"float32"),c=ct.concat([a,s,i],3);return ct.sub(o,c)})}var Ct=v(x());function Yr(o,t=!1){return Ct.tidy(()=>{let[e,r]=o.shape.slice(1);if(e===r)return o;let n=Math.abs(e-r),a=Math.round(n*(t?.5:1)),s=e>r?2:1,i=f=>{let l=o.shape.slice();return l[s]=f,Ct.fill(l,0,"float32")},c=i(a),m=n-c.shape[s],u=[t&&m?i(m):null,o,c].filter(f=>!!f).map(f=>Ct.cast(f,"float32"));return Ct.concat(u,s)})}function Dn(o){let t=o.slice();for(let e=t.length-1;e>0;e--){let r=Math.floor(Math.random()*(e+1)),n=t[e];t[e]=t[r],t[r]=n}return t}function Ne(o){return 1/(1+Math.exp(-o))}function En(o){return Math.log(o/(1-o))}var Yt=class extends F{constructor(t,e,r,n,a=!1){super({x:t,y:e,width:r,height:n},a)}};var Mn=.5,Cn=.43,In=.45,z=class{constructor(t,e,r=new b(0,0)){let{width:n,height:a}=e;this._imgDims=new k(n,a),this._shift=r,this._positions=t.map(s=>s.mul(new b(n,a)).add(r))}get shift(){return new b(this._shift.x,this._shift.y)}get imageWidth(){return this._imgDims.width}get imageHeight(){return this._imgDims.height}get positions(){return this._positions}get relativePositions(){return this._positions.map(t=>t.sub(this._shift).div(new b(this.imageWidth,this.imageHeight)))}forSize(t,e){return new this.constructor(this.relativePositions,{width:t,height:e})}shiftBy(t,e){return new this.constructor(this.relativePositions,this._imgDims,new b(t,e))}shiftByPoint(t){return this.shiftBy(t.x,t.y)}align(t,e={}){if(t){let a=t instanceof M?t.box.floor():new F(t);return this.shiftBy(a.x,a.y).align(null,e)}let{useDlibAlignment:r,minBoxPadding:n}={useDlibAlignment:!1,minBoxPadding:.2,...e};return r?this.alignDlib():this.alignMinBbox(n)}alignDlib(){let t=this.getRefPointsForAlignment(),[e,r,n]=t,a=u=>n.sub(u).magnitude(),s=(a(e)+a(r))/2,i=Math.floor(s/In),c=zt(t),m=Math.floor(Math.max(0,c.x-Mn*i)),p=Math.floor(Math.max(0,c.y-Cn*i));return new Yt(m,p,Math.min(i,this.imageWidth+m),Math.min(i,this.imageHeight+p))}alignMinBbox(t){let e=zr(this.positions);return e.pad(e.width*t,e.height*t)}getRefPointsForAlignment(){throw new Error("getRefPointsForAlignment not implemented by base class")}};var Gr=class extends z{getRefPointsForAlignment(){let t=this.positions;return[t[0],t[1],zt([t[3],t[4]])]}};var Gt=class extends z{getJawOutline(){return this.positions.slice(0,17)}getLeftEyeBrow(){return this.positions.slice(17,22)}getRightEyeBrow(){return this.positions.slice(22,27)}getNose(){return this.positions.slice(27,36)}getLeftEye(){return this.positions.slice(36,42)}getRightEye(){return this.positions.slice(42,48)}getMouth(){return this.positions.slice(48,68)}getRefPointsForAlignment(){return[this.getLeftEye(),this.getRightEye(),this.getMouth()].map(zt)}};var pe=class{constructor(t,e){this._label=t,this._distance=e}get label(){return this._label}get distance(){return this._distance}toString(t=!0){return`${this.label}${t?` (${Ht(this.distance)})`:""}`}};var ue=class extends F{constructor(e,r){super(e);this._label=r}static assertIsValidLabeledBox(e,r){if(F.assertIsValidBox(e,r),!et(e.label))throw new Error(`${r} - expected property label (${e.label}) to be a number`)}get label(){return this._label}};var mt=class{constructor(t,e){if(typeof t!="string")throw new Error("LabeledFaceDescriptors - constructor expected label to be a string");if(!Array.isArray(e)||e.some(r=>!(r instanceof Float32Array)))throw new Error("LabeledFaceDescriptors - constructor expected descriptors to be an array of Float32Array");this._label=t,this._descriptors=e}get label(){return this._label}get descriptors(){return this._descriptors}toJSON(){return{label:this.label,descriptors:this.descriptors.map(t=>Array.from(t))}}static fromJSON(t){let e=t.descriptors.map(r=>new Float32Array(r));return new mt(t.label,e)}};var jr=class extends ue{constructor(e,r,n,a){super(e,r);this._score=n,this._classScore=a}static assertIsValidPredictedBox(e,r){if(ue.assertIsValidLabeledBox(e,r),!me(e.score)||!me(e.classScore))throw new Error(`${r} - expected properties score (${e.score}) and (${e.classScore}) to be a number between [0, 1]`)}get score(){return this._score}get classScore(){return this._classScore}};function pt(o){return o.detection instanceof M}function jt(o,t){return{...o,...{detection:t}}}function Ur(){let o=window.fetch;if(!o)throw new Error("fetch - missing fetch implementation for browser environment");return{Canvas:HTMLCanvasElement,CanvasRenderingContext2D,Image:HTMLImageElement,ImageData,Video:HTMLVideoElement,createCanvasElement:()=>document.createElement("canvas"),createImageElement:()=>document.createElement("img"),createVideoElement:()=>document.createElement("video"),fetch:o,readFile:()=>{throw new Error("readFile - filesystem not available for browser environment")}}}function Se(){return typeof global=="object"&&typeof process!="undefined"&&process.versions!=null&&process.versions.node!=null}function ar(o){let t="";if(!o&&Se())try{o=require("fs")}catch(r){t=r.toString()}return{readFile:o?r=>new Promise((n,a)=>{o.readFile(r,(s,i)=>s?a(s):n(i))}):()=>{throw new Error(`readFile - failed to require fs in nodejs environment with error: ${t}`)}}}function Xr(){let o=global.Canvas||global.HTMLCanvasElement,t=global.Image||global.HTMLImageElement,e=global.Video||global.HTMLVideoElement,r=()=>{if(o)return new o;throw new Error("createCanvasElement - missing Canvas implementation for nodejs environment")},n=()=>{if(t)return new t;throw new Error("createImageElement - missing Image implementation for nodejs environment")},a=()=>{if(e)return new e;throw new Error("createVideoElement - missing Video implementation for nodejs environment")},s=global.fetch,i=ar();return{Canvas:o||class{},CanvasRenderingContext2D:global.CanvasRenderingContext2D||class{},Image:t||class{},ImageData:global.ImageData||class{},Video:global.HTMLVideoElement||class{},createCanvasElement:r,createImageElement:n,createVideoElement:a,fetch:s,...i}}function Jr(){return typeof window=="object"&&typeof document!="undefined"&&typeof HTMLImageElement!="undefined"&&typeof HTMLCanvasElement!="undefined"&&typeof HTMLVideoElement!="undefined"&&typeof ImageData!="undefined"&&typeof CanvasRenderingContext2D!="undefined"}var L;function Nn(){if(!L)throw new Error("getEnv - environment is not defined, check isNodejs() and isBrowser()");return L}function qr(o){L=o}function Zr(){return Jr()?qr(Ur()):Se()?qr(Xr()):null}function Sn(o){if(L||Zr(),!L)throw new Error("monkeyPatch - environment is not defined, check isNodejs() and isBrowser()");let{Canvas:t=L.Canvas,Image:e=L.Image}=o;L.Canvas=t,L.Image=e,L.createCanvasElement=o.createCanvasElement||(()=>new t),L.createImageElement=o.createImageElement||(()=>new e),L.ImageData=o.ImageData||L.ImageData,L.Video=o.Video||L.Video,L.fetch=o.fetch||L.fetch,L.readFile=o.readFile||L.readFile}var P={getEnv:Nn,setEnv:qr,initialize:Zr,createBrowserEnv:Ur,createFileSystem:ar,createNodejsEnv:Xr,monkeyPatch:Sn,isBrowser:Jr,isNodejs:Se};Zr();function Ut(o){return!P.isNodejs()&&typeof o=="string"?document.getElementById(o):o}function O(o){let{Canvas:t,CanvasRenderingContext2D:e}=P.getEnv();if(o instanceof e)return o;let r=Ut(o);if(!(r instanceof t))throw new Error("resolveContext2d - expected canvas to be of instance of Canvas");let n=r.getContext("2d");if(!n)throw new Error("resolveContext2d - canvas 2d context is null");return n}var Kr=(n=>(n.TOP_LEFT="TOP_LEFT",n.TOP_RIGHT="TOP_RIGHT",n.BOTTOM_LEFT="BOTTOM_LEFT",n.BOTTOM_RIGHT="BOTTOM_RIGHT",n))(Kr||{}),fe=class{constructor(t={}){let{anchorPosition:e,backgroundColor:r,fontColor:n,fontSize:a,fontStyle:s,padding:i}=t;this.anchorPosition=e||"TOP_LEFT",this.backgroundColor=r||"rgba(0, 0, 0, 0.5)",this.fontColor=n||"rgba(255, 255, 255, 1)",this.fontSize=a||14,this.fontStyle=s||"Georgia",this.padding=i||4}},gt=class{constructor(t,e,r={}){this.text=typeof t=="string"?[t]:t instanceof gt?t.text:t,this.anchor=e,this.options=new fe(r)}measureWidth(t){let{padding:e}=this.options;return this.text.map(r=>t.measureText(r).width).reduce((r,n)=>r{let g=c+u.x,T=c+u.y+(l+1)*s;r.fillText(f,g,T)})}};var sr=class{constructor(t={}){let{boxColor:e,lineWidth:r,label:n,drawLabelOptions:a}=t;this.boxColor=e||"rgba(0, 0, 255, 1)",this.lineWidth=r||2,this.label=n;let s={anchorPosition:"BOTTOM_LEFT",backgroundColor:this.boxColor};this.drawLabelOptions=new fe({...s,...a})}},Le=class{constructor(t,e={}){this.box=new F(t),this.options=new sr(e)}draw(t){let e=O(t),{boxColor:r,lineWidth:n}=this.options,{x:a,y:s,width:i,height:c}=this.box;e.strokeStyle=r,e.lineWidth=n,e.strokeRect(a,s,i,c);let{label:m}=this.options;m&&new gt([m],{x:a-n/2,y:s},this.options.drawLabelOptions).draw(t)}};function Ln(o,t){(Array.isArray(t)?t:[t]).forEach(r=>{let n=r instanceof M?r.score:pt(r)?r.detection.score:void 0,a=r instanceof M?r.box:pt(r)?r.detection.box:new F(r),s=n?`${Ht(n)}`:void 0;new Le(a,{label:s}).draw(o)})}var Pe=v(x());function Ae(o){let{Image:t,Video:e}=P.getEnv();return o instanceof t&&o.complete||o instanceof e&&o.readyState>=3}function Qr(o){return new Promise((t,e)=>{(o instanceof P.getEnv().Canvas||Ae(o))&&t(null);function r(a){!a.currentTarget||(a.currentTarget.removeEventListener("load",n),a.currentTarget.removeEventListener("error",r),e(a))}function n(a){!a.currentTarget||(a.currentTarget.removeEventListener("load",n),a.currentTarget.removeEventListener("error",r),t(a))}o.addEventListener("load",n),o.addEventListener("error",r)})}function to(o){return new Promise((t,e)=>{o instanceof Blob||e(new Error("bufferToImage - expected buf to be of type: Blob"));let r=new FileReader;r.onload=()=>{typeof r.result!="string"&&e(new Error("bufferToImage - expected reader.result to be a string, in onload"));let n=P.getEnv().createImageElement();n.onload=()=>t(n),n.onerror=e,n.src=r.result},r.onerror=e,r.readAsDataURL(o)})}function Xt(o){let{Image:t,Video:e}=P.getEnv();return o instanceof t?new k(o.naturalWidth,o.naturalHeight):o instanceof e?new k(o.videoWidth,o.videoHeight):new k(o.width,o.height)}function Jt({width:o,height:t}){let{createCanvasElement:e}=P.getEnv(),r=e();return r.width=o,r.height=t,r}function We(o,t){let{ImageData:e}=P.getEnv();if(!(o instanceof e)&&!Ae(o))throw new Error("createCanvasFromMedia - media has not finished loading yet");let{width:r,height:n}=t||Xt(o),a=Jt({width:r,height:n});return o instanceof e?O(a).putImageData(o,0,0):O(a).drawImage(o,0,0,r,n),a}var ir=v(x());async function eo(o,t){let e=t||P.getEnv().createCanvasElement(),[r,n,a]=o.shape.slice(U(o)?1:0),s=ir.tidy(()=>o.as3D(r,n,a).toInt());return await ir.browser.toPixels(s,e),s.dispose(),e}function cr(o){let{Image:t,Canvas:e,Video:r}=P.getEnv();return o instanceof t||o instanceof e||o instanceof r}var V=v(x());function ro(o,t,e=!1){let{Image:r,Canvas:n}=P.getEnv();if(!(o instanceof r||o instanceof n))throw new Error("imageToSquare - expected arg0 to be HTMLImageElement | HTMLCanvasElement");if(t<=0)return Jt({width:1,height:1});let a=Xt(o),s=t/Math.max(a.height,a.width),i=s*a.width,c=s*a.height,m=Jt({width:t,height:t}),p=o instanceof n?o:We(o),u=Math.abs(i-c)/2,f=e&&i0&&p.height>0&&O(m).drawImage(p,f,l,i,c),m}var ut=class{constructor(t,e=!1){this._imageTensors=[];this._canvases=[];this._treatAsBatchInput=!1;this._inputDimensions=[];this._inputSize=0;if(!Array.isArray(t))throw new Error(`NetInput.constructor - expected inputs to be an Array of TResolvedNetInput or to be instanceof tf.Tensor4D, instead have ${t}`);this._treatAsBatchInput=e,this._batchSize=t.length,t.forEach((r,n)=>{if(ht(r)){this._imageTensors[n]=r,this._inputDimensions[n]=r.shape;return}if(U(r)){let s=r.shape[0];if(s!==1)throw new Error(`NetInput - tf.Tensor4D with batchSize ${s} passed, but not supported in input array`);this._imageTensors[n]=r,this._inputDimensions[n]=r.shape.slice(1);return}let a=r instanceof P.getEnv().Canvas?r:We(r);this._canvases[n]=a,this._inputDimensions[n]=[a.height,a.width,3]})}get imageTensors(){return this._imageTensors}get canvases(){return this._canvases}get isBatchInput(){return this.batchSize>1||this._treatAsBatchInput}get batchSize(){return this._batchSize}get inputDimensions(){return this._inputDimensions}get inputSize(){return this._inputSize}get reshapedInputDimensions(){return it(this.batchSize,0,1).map((t,e)=>this.getReshapedInputDimensions(e))}getInput(t){return this.canvases[t]||this.imageTensors[t]}getInputDimensions(t){return this._inputDimensions[t]}getInputHeight(t){return this._inputDimensions[t][0]}getInputWidth(t){return this._inputDimensions[t][1]}getReshapedInputDimensions(t){if(typeof this.inputSize!="number")throw new Error("getReshapedInputDimensions - inputSize not set, toBatchTensor has not been called yet");let e=this.getInputWidth(t),r=this.getInputHeight(t);return $r({width:e,height:r},this.inputSize)}toBatchTensor(t,e=!0){return this._inputSize=t,V.tidy(()=>{let r=it(this.batchSize,0,1).map(a=>{let s=this.getInput(a);if(s instanceof V.Tensor){let i=U(s)?s:V.expandDims(s);return i=Yr(i,e),(i.shape[1]!==t||i.shape[2]!==t)&&(i=V.image.resizeBilinear(i,[t,t],!1,!1)),i.as3D(t,t,3)}if(s instanceof P.getEnv().Canvas)return V.browser.fromPixels(ro(s,t,e));throw new Error(`toBatchTensor - at batchIdx ${a}, expected input to be instanceof tf.Tensor or instanceof HTMLCanvasElement, instead have ${s}`)});return V.stack(r.map(a=>V.cast(a,"float32"))).as4D(this.batchSize,t,t,3)})}};async function C(o){if(o instanceof ut)return o;let t=Array.isArray(o)?o:[o];if(!t.length)throw new Error("toNetInput - empty array passed as input");let e=n=>Array.isArray(o)?` at input index ${n}:`:"",r=t.map(Ut);return r.forEach((n,a)=>{if(!cr(n)&&!ht(n)&&!U(n))throw typeof t[a]=="string"?new Error(`toNetInput -${e(a)} string passed, but could not resolve HTMLElement for element id ${t[a]}`):new Error(`toNetInput -${e(a)} expected media to be of type HTMLImageElement | HTMLVideoElement | HTMLCanvasElement | tf.Tensor3D, or to be an element id`);if(U(n)){let s=n.shape[0];if(s!==1)throw new Error(`toNetInput -${e(a)} tf.Tensor4D with batchSize ${s} passed, but not supported in input array`)}}),await Promise.all(r.map(n=>cr(n)&&Qr(n))),new ut(r,Array.isArray(o))}async function le(o,t){let{Canvas:e}=P.getEnv(),r=o;if(!(o instanceof e)){let s=await C(o);if(s.batchSize>1)throw new Error("extractFaces - batchSize > 1 not supported");let i=s.getInput(0);r=i instanceof e?i:await eo(i)}let n=O(r);return t.map(s=>s instanceof M?s.forSize(r.width,r.height).box.floor():s).map(s=>s.clipAtImageBorders(r.width,r.height)).map(({x:s,y:i,width:c,height:m})=>{let p=Jt({width:c,height:m});return c>0&&m>0&&O(p).putImageData(n.getImageData(s,i,c,m),0,0),p})}var mr=v(x());async function de(o,t){if(!ht(o)&&!U(o))throw new Error("extractFaceTensors - expected image tensor to be 3D or 4D");if(U(o)&&o.shape[0]>1)throw new Error("extractFaceTensors - batchSize > 1 not supported");return mr.tidy(()=>{let[e,r,n]=o.shape.slice(U(o)?1:0);return t.map(i=>i instanceof M?i.forSize(r,e).box:i).map(i=>i.clipAtImageBorders(r,e)).filter(i=>i.width>0&&i.height>0).map(({x:i,y:c,width:m,height:p})=>mr.slice3d(o.as3D(e,r,n),[c,i,0],[p,m,n]))})}async function xt(o,t){let{fetch:e}=P.getEnv(),r=await e(o,t);if(!(r.status<400))throw new Error(`failed to fetch: (${r.status}) ${r.statusText}, from url: ${r.url}`);return r}async function An(o){let t=await xt(o),e=await t.blob();if(!e.type.startsWith("image/"))throw new Error(`fetchImage - expected blob type to be of type image/*, instead have: ${e.type}, for url: ${t.url}`);return to(e)}async function oo(o){return(await xt(o)).json()}async function Wn(o){return new Float32Array(await(await xt(o)).arrayBuffer())}function Fo(o){return new Promise((t,e)=>{o instanceof Blob||e(new Error("bufferToVideo - expected buf to be of type: Blob"));let r=P.getEnv().createVideoElement();r.oncanplay=()=>t(r),r.onerror=e,r.playsInline=!0,r.muted=!0,r.src=URL.createObjectURL(o),r.play()})}async function kn(o){let t=await xt(o),e=await t.blob();if(!e.type.startsWith("video/"))throw new Error(`fetchVideo - expected blob type to be of type video/*, instead have: ${e.type}, for url: ${t.url}`);return Fo(e)}var Do=v(x());function pr(o,t){let e=`${t}-weights_manifest.json`;if(!o)return{modelBaseUri:"",manifestUri:e};if(o==="/")return{modelBaseUri:"/",manifestUri:`/${e}`};let r=o.startsWith("http://")?"http://":o.startsWith("https://")?"https://":"";o=o.replace(r,"");let n=o.split("/").filter(i=>i),a=o.endsWith(".json")?n[n.length-1]:e,s=r+(o.endsWith(".json")?n.slice(0,n.length-1):n).join("/");return s=o.startsWith("/")?`/${s}`:s,{modelBaseUri:s,manifestUri:s==="/"?`/${a}`:`${s}/${a}`}}async function no(o,t){let{manifestUri:e,modelBaseUri:r}=pr(o,t),n=await oo(e);return Do.io.loadWeights(n,r)}function Bn(o,t,e=!1){let{width:r,height:n}=e?Xt(t):t;return o.width=r,o.height=n,{width:r,height:n}}var ye=v(x());var vt=v(x());var A=class{constructor(t){this._params=void 0;this._paramMappings=[];this._name=t}get params(){return this._params}get paramMappings(){return this._paramMappings}get isLoaded(){return!!this.params}getParamFromPath(t){let{obj:e,objProp:r}=this.traversePropertyPath(t);return e[r]}reassignParamFromPath(t,e){let{obj:r,objProp:n}=this.traversePropertyPath(t);r[n].dispose(),r[n]=e}getParamList(){return this._paramMappings.map(({paramPath:t})=>({path:t,tensor:this.getParamFromPath(t)}))}getTrainableParams(){return this.getParamList().filter(t=>t.tensor instanceof vt.Variable)}getFrozenParams(){return this.getParamList().filter(t=>!(t.tensor instanceof vt.Variable))}variable(){this.getFrozenParams().forEach(({path:t,tensor:e})=>{this.reassignParamFromPath(t,e.variable())})}freeze(){this.getTrainableParams().forEach(({path:t,tensor:e})=>{let r=vt.tensor(e.dataSync());e.dispose(),this.reassignParamFromPath(t,r)})}dispose(t=!0){this.getParamList().forEach(e=>{if(t&&e.tensor.isDisposed)throw new Error(`param tensor has already been disposed for path ${e.path}`);e.tensor.dispose()}),this._params=void 0}serializeParams(){return new Float32Array(this.getParamList().map(({tensor:t})=>Array.from(t.dataSync())).reduce((t,e)=>t.concat(e)))}async load(t){if(t instanceof Float32Array){this.extractWeights(t);return}await this.loadFromUri(t)}async loadFromUri(t){if(t&&typeof t!="string")throw new Error(`${this._name}.loadFromUri - expected model uri`);let e=await no(t,this.getDefaultModelName());this.loadFromWeightMap(e)}async loadFromDisk(t){if(t&&typeof t!="string")throw new Error(`${this._name}.loadFromDisk - expected model file path`);let{readFile:e}=P.getEnv(),{manifestUri:r,modelBaseUri:n}=pr(t,this.getDefaultModelName()),a=m=>Promise.all(m.map(p=>e(p).then(u=>u.buffer))),s=vt.io.weightsLoaderFactory(a),i=JSON.parse((await e(r)).toString()),c=await s(i,n);this.loadFromWeightMap(c)}loadFromWeightMap(t){let{paramMappings:e,params:r}=this.extractParamsFromWeightMap(t);this._paramMappings=e,this._params=r}extractWeights(t){let{paramMappings:e,params:r}=this.extractParams(t);this._paramMappings=e,this._params=r}traversePropertyPath(t){if(!this.params)throw new Error("traversePropertyPath - model has no loaded params");let e=t.split("/").reduce((a,s)=>{if(!a.nextObj.hasOwnProperty(s))throw new Error(`traversePropertyPath - object does not have property ${s}, for path ${t}`);return{obj:a.nextObj,objProp:s,nextObj:a.nextObj[s]}},{nextObj:this.params}),{obj:r,objProp:n}=e;if(!r||!n||!(r[n]instanceof vt.Tensor))throw new Error(`traversePropertyPath - parameter is not a tensor, for path ${t}`);return{obj:r,objProp:n}}};var I=v(x());var he=v(x());function H(o,t,e){return he.tidy(()=>{let r=he.separableConv2d(o,t.depthwise_filter,t.pointwise_filter,e,"same");return r=he.add(r,t.bias),r})}function ur(o,t,e=!1){return I.tidy(()=>{let r=I.relu(e?I.add(I.conv2d(o,t.conv0.filters,[2,2],"same"),t.conv0.bias):H(o,t.conv0,[2,2])),n=H(r,t.conv1,[1,1]),a=I.relu(I.add(r,n)),s=H(a,t.conv2,[1,1]);return I.relu(I.add(r,I.add(n,s)))})}function ke(o,t,e=!1,r=!0){return I.tidy(()=>{let n=I.relu(e?I.add(I.conv2d(o,t.conv0.filters,r?[2,2]:[1,1],"same"),t.conv0.bias):H(o,t.conv0,r?[2,2]:[1,1])),a=H(n,t.conv1,[1,1]),s=I.relu(I.add(n,a)),i=H(s,t.conv2,[1,1]),c=I.relu(I.add(n,I.add(a,i))),m=H(c,t.conv3,[1,1]);return I.relu(I.add(n,I.add(a,I.add(i,m))))})}var It=v(x());function qt(o,t,e="same",r=!1){return It.tidy(()=>{let n=It.add(It.conv2d(o,t.filters,[1,1],e),t.bias);return r?It.relu(n):n})}function B(o,t){Object.keys(o).forEach(e=>{t.some(r=>r.originalPath===e)||o[e].dispose()})}var fr=v(x());function be(o,t){return(e,r,n,a)=>{let s=fr.tensor4d(o(e*r*n*n),[n,n,e,r]),i=fr.tensor1d(o(r));return t.push({paramPath:`${a}/filters`},{paramPath:`${a}/bias`}),{filters:s,bias:i}}}var lr=v(x());function dr(o,t){return(e,r,n)=>{let a=lr.tensor2d(o(e*r),[e,r]),s=lr.tensor1d(o(r));return t.push({paramPath:`${n}/weights`},{paramPath:`${n}/bias`}),{weights:a,bias:s}}}var Re=v(x());var Be=class{constructor(t,e,r){this.depthwise_filter=t;this.pointwise_filter=e;this.bias=r}};function ge(o,t){return(e,r,n)=>{let a=Re.tensor4d(o(9*e),[3,3,e,1]),s=Re.tensor4d(o(e*r),[1,1,e,r]),i=Re.tensor1d(o(r));return t.push({paramPath:`${n}/depthwise_filter`},{paramPath:`${n}/pointwise_filter`},{paramPath:`${n}/bias`}),new Be(a,s,i)}}function xe(o){return t=>{let e=o(`${t}/depthwise_filter`,4),r=o(`${t}/pointwise_filter`,4),n=o(`${t}/bias`,1);return new Be(e,r,n)}}function Y(o,t){return(e,r,n)=>{let a=o[e];if(!Ot(a,r))throw new Error(`expected weightMap[${e}] to be a Tensor${r}D, instead have ${a}`);return t.push({originalPath:e,paramPath:n||e}),a}}function R(o){let t=o;function e(n){let a=t.slice(0,n);return t=t.slice(n),a}function r(){return t}return{extractWeights:e,getRemainingWeights:r}}function hr(o,t){let e=be(o,t),r=ge(o,t);function n(s,i,c,m=!1){let p=m?e(s,i,3,`${c}/conv0`):r(s,i,`${c}/conv0`),u=r(i,i,`${c}/conv1`),f=r(i,i,`${c}/conv2`);return{conv0:p,conv1:u,conv2:f}}function a(s,i,c,m=!1){let{conv0:p,conv1:u,conv2:f}=n(s,i,c,m),l=r(i,i,`${c}/conv3`);return{conv0:p,conv1:u,conv2:f,conv3:l}}return{extractDenseBlock3Params:n,extractDenseBlock4Params:a}}function Eo(o){let t=[],{extractWeights:e,getRemainingWeights:r}=R(o),{extractDenseBlock4Params:n}=hr(e,t),a=n(3,32,"dense0",!0),s=n(32,64,"dense1"),i=n(64,128,"dense2"),c=n(128,256,"dense3");if(r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{paramMappings:t,params:{dense0:a,dense1:s,dense2:i,dense3:c}}}function br(o){return t=>{let e=o(`${t}/filters`,4),r=o(`${t}/bias`,1);return{filters:e,bias:r}}}function gr(o,t){let e=Y(o,t),r=br(e),n=xe(e);function a(i,c=!1){let m=c?r(`${i}/conv0`):n(`${i}/conv0`),p=n(`${i}/conv1`),u=n(`${i}/conv2`);return{conv0:m,conv1:p,conv2:u}}function s(i,c=!1){let m=c?r(`${i}/conv0`):n(`${i}/conv0`),p=n(`${i}/conv1`),u=n(`${i}/conv2`),f=n(`${i}/conv3`);return{conv0:m,conv1:p,conv2:u,conv3:f}}return{extractDenseBlock3Params:a,extractDenseBlock4Params:s}}function Mo(o){let t=[],{extractDenseBlock4Params:e}=gr(o,t),r={dense0:e("dense0",!0),dense1:e("dense1"),dense2:e("dense2"),dense3:e("dense3")};return B(o,t),{params:r,paramMappings:t}}var ve=class extends A{constructor(){super("FaceFeatureExtractor")}forwardInput(t){let{params:e}=this;if(!e)throw new Error("FaceFeatureExtractor - load model before inference");return ye.tidy(()=>{let r=ye.cast(t.toBatchTensor(112,!0),"float32"),a=rt(r,[122.782,117.001,104.298]).div(255),s=ke(a,e.dense0,!0);return s=ke(s,e.dense1),s=ke(s,e.dense2),s=ke(s,e.dense3),s=ye.avgPool(s,[7,7],[2,2],"valid"),s})}async forward(t){return this.forwardInput(await C(t))}getDefaultModelName(){return"face_feature_extractor_model"}extractParamsFromWeightMap(t){return Mo(t)}extractParams(t){return Eo(t)}};var No=v(x());var _e=v(x());function $e(o,t){return _e.tidy(()=>_e.add(_e.matMul(o,t.weights),t.bias))}function Co(o,t,e){let r=[],{extractWeights:n,getRemainingWeights:a}=R(o),i=dr(n,r)(t,e,"fc");if(a().length!==0)throw new Error(`weights remaing after extract: ${a().length}`);return{paramMappings:r,params:{fc:i}}}function Io(o){let t=[],e=Y(o,t);function r(a){let s=e(`${a}/weights`,2),i=e(`${a}/bias`,1);return{weights:s,bias:i}}let n={fc:r("fc")};return B(o,t),{params:n,paramMappings:t}}function xr(o){let t={},e={};return Object.keys(o).forEach(r=>{let n=r.startsWith("fc")?e:t;n[r]=o[r]}),{featureExtractorMap:t,classifierMap:e}}var Te=class extends A{constructor(e,r){super(e);this._faceFeatureExtractor=r}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(e){let{params:r}=this;if(!r)throw new Error(`${this._name} - load model before inference`);return No.tidy(()=>{let n=e instanceof ut?this.faceFeatureExtractor.forwardInput(e):e;return $e(n.as2D(n.shape[0],-1),r.fc)})}dispose(e=!0){this.faceFeatureExtractor.dispose(e),super.dispose(e)}loadClassifierParams(e){let{params:r,paramMappings:n}=this.extractClassifierParams(e);this._params=r,this._paramMappings=n}extractClassifierParams(e){return Co(e,this.getClassifierChannelsIn(),this.getClassifierChannelsOut())}extractParamsFromWeightMap(e){let{featureExtractorMap:r,classifierMap:n}=xr(e);return this.faceFeatureExtractor.loadFromWeightMap(r),Io(n)}extractParams(e){let r=this.getClassifierChannelsIn(),n=this.getClassifierChannelsOut(),a=n*r+n,s=e.slice(0,e.length-a),i=e.slice(e.length-a);return this.faceFeatureExtractor.extractWeights(s),this.extractClassifierParams(i)}};var ao=["neutral","happy","sad","angry","fearful","disgusted","surprised"],yt=class{constructor(t){this.neutral=0;this.happy=0;this.sad=0;this.angry=0;this.fearful=0;this.disgusted=0;this.surprised=0;if(t.length!==7)throw new Error(`FaceExpressions.constructor - expected probabilities.length to be 7, have: ${t.length}`);ao.forEach((e,r)=>{this[e]=t[r]})}asSortedArray(){return ao.map(t=>({expression:t,probability:this[t]})).sort((t,e)=>e.probability-t.probability)}};var Oe=class extends Te{constructor(t=new ve){super("FaceExpressionNet",t)}forwardInput(t){return Pe.tidy(()=>Pe.softmax(this.runNet(t)))}async forward(t){return this.forwardInput(await C(t))}async predictExpressions(t){let e=await C(t),r=await this.forwardInput(e),n=await Promise.all(Pe.unstack(r).map(async s=>{let i=s.dataSync();return s.dispose(),i}));r.dispose();let a=n.map(s=>new yt(s));return e.isBatchInput?a:a[0]}getDefaultModelName(){return"face_expression_model"}getClassifierChannelsIn(){return 256}getClassifierChannelsOut(){return 7}};function so(o){return o.expressions instanceof yt}function vr(o,t){return{...o,...{expressions:t}}}function Rn(o,t,e=.1,r){(Array.isArray(t)?t:[t]).forEach(a=>{let s=a instanceof yt?a:so(a)?a.expressions:void 0;if(!s)throw new Error("drawFaceExpressions - expected faceExpressions to be FaceExpressions | WithFaceExpressions<{}> or array thereof");let c=s.asSortedArray().filter(u=>u.probability>e),m=pt(a)?a.detection.box.bottomLeft:r||new b(0,0);new gt(c.map(u=>`${u.expression} (${Ht(u.probability)})`),m).draw(o)})}function Zt(o){return pt(o)&&o.landmarks instanceof z&&o.unshiftedLandmarks instanceof z&&o.alignedRect instanceof M}function $n(o){let t=(i,c,m,p)=>Math.atan2(p-c,m-i)%Math.PI,e=i=>i*180/Math.PI,r={roll:void 0,pitch:void 0,yaw:void 0};if(!o||!o._positions||o._positions.length!==68)return r;let n=o._positions;r.roll=-t(n[36]._x,n[36]._y,n[45]._x,n[45]._y),r.pitch=t(0,Math.abs(n[0]._x-n[30]._x)/n[30]._x,Math.PI,Math.abs(n[16]._x-n[30]._x)/n[30]._x);let a=n.reduce((i,c)=>ii>c._y?i:c._y,-1/0);return r.yaw=Math.PI*(o._imgDims._height/(s-a)/1.4-1),r}function we(o,t){let{box:e}=o.detection,r=t.shiftBy(e.x,e.y),n=r.align(),{imageDims:a}=o.detection,s=new M(o.detection.score,n.rescale(a.reverse()),a),i=$n(t);return{...o,...{landmarks:r,unshiftedLandmarks:t,alignedRect:s,angle:i}}}var yr=class{constructor(t={}){let{drawLines:e=!0,drawPoints:r=!0,lineWidth:n,lineColor:a,pointSize:s,pointColor:i}=t;this.drawLines=e,this.drawPoints=r,this.lineWidth=n||1,this.pointSize=s||2,this.lineColor=a||"rgba(0, 255, 255, 1)",this.pointColor=i||"rgba(255, 0, 255, 1)"}},_r=class{constructor(t,e={}){this.faceLandmarks=t,this.options=new yr(e)}draw(t){let e=O(t),{drawLines:r,drawPoints:n,lineWidth:a,lineColor:s,pointSize:i,pointColor:c}=this.options;if(r&&this.faceLandmarks instanceof Gt&&(e.strokeStyle=s,e.lineWidth=a,dt(e,this.faceLandmarks.getJawOutline()),dt(e,this.faceLandmarks.getLeftEyeBrow()),dt(e,this.faceLandmarks.getRightEyeBrow()),dt(e,this.faceLandmarks.getNose()),dt(e,this.faceLandmarks.getLeftEye(),!0),dt(e,this.faceLandmarks.getRightEye(),!0),dt(e,this.faceLandmarks.getMouth(),!0)),n){e.strokeStyle=c,e.fillStyle=c;let m=p=>{e.beginPath(),e.arc(p.x,p.y,i,0,2*Math.PI),e.fill()};this.faceLandmarks.positions.forEach(m)}}};function On(o,t){(Array.isArray(t)?t:[t]).forEach(r=>{let n=r instanceof z?r:Zt(r)?r.landmarks:void 0;if(!n)throw new Error("drawFaceLandmarks - expected faceExpressions to be FaceLandmarks | WithFaceLandmarks> or array thereof");new _r(n).draw(o)})}var So="1.7.1";var ft=v(x());var S=v(x());function Vn(o,t){let e=be(o,t),r=ge(o,t);function n(s,i,c){let m=r(s,i,`${c}/separable_conv0`),p=r(i,i,`${c}/separable_conv1`),u=e(s,i,1,`${c}/expansion_conv`);return{separable_conv0:m,separable_conv1:p,expansion_conv:u}}function a(s,i){let c=r(s,s,`${i}/separable_conv0`),m=r(s,s,`${i}/separable_conv1`),p=r(s,s,`${i}/separable_conv2`);return{separable_conv0:c,separable_conv1:m,separable_conv2:p}}return{extractConvParams:e,extractSeparableConvParams:r,extractReductionBlockParams:n,extractMainBlockParams:a}}function Lo(o,t){let e=[],{extractWeights:r,getRemainingWeights:n}=R(o),{extractConvParams:a,extractSeparableConvParams:s,extractReductionBlockParams:i,extractMainBlockParams:c}=Vn(r,e),m=a(3,32,3,"entry_flow/conv_in"),p=i(32,64,"entry_flow/reduction_block_0"),u=i(64,128,"entry_flow/reduction_block_1"),f={conv_in:m,reduction_block_0:p,reduction_block_1:u},l={};it(t,0,1).forEach(h=>{l[`main_block_${h}`]=c(128,`middle_flow/main_block_${h}`)});let g=i(128,256,"exit_flow/reduction_block"),T=s(256,512,"exit_flow/separable_conv"),D={reduction_block:g,separable_conv:T};if(n().length!==0)throw new Error(`weights remaing after extract: ${n().length}`);return{paramMappings:e,params:{entry_flow:f,middle_flow:l,exit_flow:D}}}function Yn(o,t){let e=Y(o,t),r=br(e),n=xe(e);function a(i){let c=n(`${i}/separable_conv0`),m=n(`${i}/separable_conv1`),p=r(`${i}/expansion_conv`);return{separable_conv0:c,separable_conv1:m,expansion_conv:p}}function s(i){let c=n(`${i}/separable_conv0`),m=n(`${i}/separable_conv1`),p=n(`${i}/separable_conv2`);return{separable_conv0:c,separable_conv1:m,separable_conv2:p}}return{extractConvParams:r,extractSeparableConvParams:n,extractReductionBlockParams:a,extractMainBlockParams:s}}function Ao(o,t){let e=[],{extractConvParams:r,extractSeparableConvParams:n,extractReductionBlockParams:a,extractMainBlockParams:s}=Yn(o,e),i=r("entry_flow/conv_in"),c=a("entry_flow/reduction_block_0"),m=a("entry_flow/reduction_block_1"),p={conv_in:i,reduction_block_0:c,reduction_block_1:m},u={};it(t,0,1).forEach(T=>{u[`main_block_${T}`]=s(`middle_flow/main_block_${T}`)});let f=a("exit_flow/reduction_block"),l=n("exit_flow/separable_conv"),g={reduction_block:f,separable_conv:l};return B(o,e),{params:{entry_flow:p,middle_flow:u,exit_flow:g},paramMappings:e}}function Wo(o,t,e){return S.add(S.conv2d(o,t.filters,e,"same"),t.bias)}function co(o,t,e=!0){let r=e?S.relu(o):o;return r=H(r,t.separable_conv0,[1,1]),r=H(S.relu(r),t.separable_conv1,[1,1]),r=S.maxPool(r,[3,3],[2,2],"same"),r=S.add(r,Wo(o,t.expansion_conv,[2,2])),r}function Gn(o,t){let e=H(S.relu(o),t.separable_conv0,[1,1]);return e=H(S.relu(e),t.separable_conv1,[1,1]),e=H(S.relu(e),t.separable_conv2,[1,1]),e=S.add(e,o),e}var Tr=class extends A{constructor(e){super("TinyXception");this._numMainBlocks=e}forwardInput(e){let{params:r}=this;if(!r)throw new Error("TinyXception - load model before inference");return S.tidy(()=>{let n=S.cast(e.toBatchTensor(112,!0),"float32"),s=rt(n,[122.782,117.001,104.298]).div(255),i=S.relu(Wo(s,r.entry_flow.conv_in,[2,2]));return i=co(i,r.entry_flow.reduction_block_0,!1),i=co(i,r.entry_flow.reduction_block_1),it(this._numMainBlocks,0,1).forEach(c=>{i=Gn(i,r.middle_flow[`main_block_${c}`])}),i=co(i,r.exit_flow.reduction_block),i=S.relu(H(i,r.exit_flow.separable_conv,[1,1])),i})}async forward(e){return this.forwardInput(await C(e))}getDefaultModelName(){return"tiny_xception_model"}extractParamsFromWeightMap(e){return Ao(e,this._numMainBlocks)}extractParams(e){return Lo(e,this._numMainBlocks)}};function ko(o){let t=[],{extractWeights:e,getRemainingWeights:r}=R(o),n=dr(e,t),a=n(512,1,"fc/age"),s=n(512,2,"fc/gender");if(r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{paramMappings:t,params:{fc:{age:a,gender:s}}}}function Bo(o){let t=[],e=Y(o,t);function r(a){let s=e(`${a}/weights`,2),i=e(`${a}/bias`,1);return{weights:s,bias:i}}let n={fc:{age:r("fc/age"),gender:r("fc/gender")}};return B(o,t),{params:n,paramMappings:t}}var Pr=(e=>(e.FEMALE="female",e.MALE="male",e))(Pr||{});var He=class extends A{constructor(e=new Tr(2)){super("AgeGenderNet");this._faceFeatureExtractor=e}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(e){let{params:r}=this;if(!r)throw new Error(`${this._name} - load model before inference`);return ft.tidy(()=>{let n=e instanceof ut?this.faceFeatureExtractor.forwardInput(e):e,a=ft.avgPool(n,[7,7],[2,2],"valid").as2D(n.shape[0],-1),s=$e(a,r.fc.age).as1D(),i=$e(a,r.fc.gender);return{age:s,gender:i}})}forwardInput(e){return ft.tidy(()=>{let{age:r,gender:n}=this.runNet(e);return{age:r,gender:ft.softmax(n)}})}async forward(e){return this.forwardInput(await C(e))}async predictAgeAndGender(e){let r=await C(e),n=await this.forwardInput(r),a=ft.unstack(n.age),s=ft.unstack(n.gender),i=a.map((m,p)=>({ageTensor:m,genderTensor:s[p]})),c=await Promise.all(i.map(async({ageTensor:m,genderTensor:p})=>{let u=m.dataSync()[0],f=p.dataSync()[0],l=f>.5,g=l?"male":"female",T=l?f:1-f;return m.dispose(),p.dispose(),{age:u,gender:g,genderProbability:T}}));return n.age.dispose(),n.gender.dispose(),r.isBatchInput?c:c[0]}getDefaultModelName(){return"age_gender_model"}dispose(e=!0){this.faceFeatureExtractor.dispose(e),super.dispose(e)}loadClassifierParams(e){let{params:r,paramMappings:n}=this.extractClassifierParams(e);this._params=r,this._paramMappings=n}extractClassifierParams(e){return ko(e)}extractParamsFromWeightMap(e){let{featureExtractorMap:r,classifierMap:n}=xr(e);return this.faceFeatureExtractor.loadFromWeightMap(r),Bo(n)}extractParams(e){let n=e.slice(0,e.length-1539),a=e.slice(e.length-1539);return this.faceFeatureExtractor.extractWeights(n),this.extractClassifierParams(a)}};var G=v(x());var Fe=class extends Te{postProcess(t,e,r){let n=r.map(({width:s,height:i})=>{let c=e/Math.max(i,s);return{width:s*c,height:i*c}}),a=n.length;return G.tidy(()=>{let s=(u,f)=>G.stack([G.fill([68],u,"float32"),G.fill([68],f,"float32")],1).as2D(1,136).as1D(),i=(u,f)=>{let{width:l,height:g}=n[u];return f(l,g)?Math.abs(l-g)/2:0},c=u=>i(u,(f,l)=>fi(u,(f,l)=>ls(c(f),m(f))))).div(G.stack(Array.from(Array(a),(u,f)=>s(n[f].width,n[f].height))))})}forwardInput(t){return G.tidy(()=>{let e=this.runNet(t);return this.postProcess(e,t.inputSize,t.inputDimensions.map(([r,n])=>({height:r,width:n})))})}async forward(t){return this.forwardInput(await C(t))}async detectLandmarks(t){let e=await C(t),r=G.tidy(()=>G.unstack(this.forwardInput(e))),n=await Promise.all(r.map(async(a,s)=>{let i=Array.from(a.dataSync()),c=i.filter((p,u)=>or(u)),m=i.filter((p,u)=>!or(u));return new Gt(Array(68).fill(0).map((p,u)=>new b(c[u],m[u])),{height:e.getInputHeight(s),width:e.getInputWidth(s)})}));return r.forEach(a=>a.dispose()),e.isBatchInput?n:n[0]}getClassifierChannelsOut(){return 136}};var Kt=class extends Fe{constructor(t=new ve){super("FaceLandmark68Net",t)}getDefaultModelName(){return"face_landmark_68_model"}getClassifierChannelsIn(){return 256}};var De=v(x());function Ro(o){let t=[],{extractDenseBlock3Params:e}=gr(o,t),r={dense0:e("dense0",!0),dense1:e("dense1"),dense2:e("dense2")};return B(o,t),{params:r,paramMappings:t}}function $o(o){let t=[],{extractWeights:e,getRemainingWeights:r}=R(o),{extractDenseBlock3Params:n}=hr(e,t),a=n(3,32,"dense0",!0),s=n(32,64,"dense1"),i=n(64,128,"dense2");if(r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{paramMappings:t,params:{dense0:a,dense1:s,dense2:i}}}var wr=class extends A{constructor(){super("TinyFaceFeatureExtractor")}forwardInput(t){let{params:e}=this;if(!e)throw new Error("TinyFaceFeatureExtractor - load model before inference");return De.tidy(()=>{let r=De.cast(t.toBatchTensor(112,!0),"float32"),a=rt(r,[122.782,117.001,104.298]).div(255),s=ur(a,e.dense0,!0);return s=ur(s,e.dense1),s=ur(s,e.dense2),s=De.avgPool(s,[14,14],[2,2],"valid"),s})}async forward(t){return this.forwardInput(await C(t))}getDefaultModelName(){return"face_feature_extractor_tiny_model"}extractParamsFromWeightMap(t){return Ro(t)}extractParams(t){return $o(t)}};var ze=class extends Fe{constructor(t=new wr){super("FaceLandmark68TinyNet",t)}getDefaultModelName(){return"face_landmark_68_tiny_model"}getClassifierChannelsIn(){return 128}};var mo=class extends Kt{};var nt=v(x());var Ee=v(x());var Fr=v(x());function Oo(o,t){return Fr.add(Fr.mul(o,t.weights),t.biases)}function po(o,t,e,r,n="same"){let{filters:a,bias:s}=t.conv,i=Ee.conv2d(o,a,e,n);return i=Ee.add(i,s),i=Oo(i,t.scale),r?Ee.relu(i):i}function Ho(o,t){return po(o,t,[1,1],!0)}function uo(o,t){return po(o,t,[1,1],!1)}function Dr(o,t){return po(o,t,[2,2],!0,"valid")}var j=v(x());function jn(o,t){function e(i,c,m){let p=o(i),u=p.length/(c*m*m);if(Rr(u))throw new Error(`depth has to be an integer: ${u}, weights.length: ${p.length}, numFilters: ${c}, filterSize: ${m}`);return j.tidy(()=>j.transpose(j.tensor4d(p,[c,u,m,m]),[2,3,1,0]))}function r(i,c,m,p){let u=e(i,c,m),f=j.tensor1d(o(c));return t.push({paramPath:`${p}/filters`},{paramPath:`${p}/bias`}),{filters:u,bias:f}}function n(i,c){let m=j.tensor1d(o(i)),p=j.tensor1d(o(i));return t.push({paramPath:`${c}/weights`},{paramPath:`${c}/biases`}),{weights:m,biases:p}}function a(i,c,m,p){let u=r(i,c,m,`${p}/conv`),f=n(c,`${p}/scale`);return{conv:u,scale:f}}function s(i,c,m,p,u=!1){let f=a((u?.5:1)*i,c,m,`${p}/conv1`),l=a(i,c,m,`${p}/conv2`);return{conv1:f,conv2:l}}return{extractConvLayerParams:a,extractResidualLayerParams:s}}function zo(o){let{extractWeights:t,getRemainingWeights:e}=R(o),r=[],{extractConvLayerParams:n,extractResidualLayerParams:a}=jn(t,r),s=n(4704,32,7,"conv32_down"),i=a(9216,32,3,"conv32_1"),c=a(9216,32,3,"conv32_2"),m=a(9216,32,3,"conv32_3"),p=a(36864,64,3,"conv64_down",!0),u=a(36864,64,3,"conv64_1"),f=a(36864,64,3,"conv64_2"),l=a(36864,64,3,"conv64_3"),g=a(147456,128,3,"conv128_down",!0),T=a(147456,128,3,"conv128_1"),D=a(147456,128,3,"conv128_2"),h=a(589824,256,3,"conv256_down",!0),_=a(589824,256,3,"conv256_1"),y=a(589824,256,3,"conv256_2"),E=a(589824,256,3,"conv256_down_out"),W=j.tidy(()=>j.transpose(j.tensor2d(t(256*128),[128,256]),[1,0]));if(r.push({paramPath:"fc"}),e().length!==0)throw new Error(`weights remaing after extract: ${e().length}`);return{params:{conv32_down:s,conv32_1:i,conv32_2:c,conv32_3:m,conv64_down:p,conv64_1:u,conv64_2:f,conv64_3:l,conv128_down:g,conv128_1:T,conv128_2:D,conv256_down:h,conv256_1:_,conv256_2:y,conv256_down_out:E,fc:W},paramMappings:r}}function Un(o,t){let e=Y(o,t);function r(s){let i=e(`${s}/scale/weights`,1),c=e(`${s}/scale/biases`,1);return{weights:i,biases:c}}function n(s){let i=e(`${s}/conv/filters`,4),c=e(`${s}/conv/bias`,1),m=r(s);return{conv:{filters:i,bias:c},scale:m}}function a(s){return{conv1:n(`${s}/conv1`),conv2:n(`${s}/conv2`)}}return{extractConvLayerParams:n,extractResidualLayerParams:a}}function Vo(o){let t=[],{extractConvLayerParams:e,extractResidualLayerParams:r}=Un(o,t),n=e("conv32_down"),a=r("conv32_1"),s=r("conv32_2"),i=r("conv32_3"),c=r("conv64_down"),m=r("conv64_1"),p=r("conv64_2"),u=r("conv64_3"),f=r("conv128_down"),l=r("conv128_1"),g=r("conv128_2"),T=r("conv256_down"),D=r("conv256_1"),h=r("conv256_2"),_=r("conv256_down_out"),{fc:y}=o;if(t.push({originalPath:"fc",paramPath:"fc"}),!Br(y))throw new Error(`expected weightMap[fc] to be a Tensor2D, instead have ${y}`);let E={conv32_down:n,conv32_1:a,conv32_2:s,conv32_3:i,conv64_down:c,conv64_1:m,conv64_2:p,conv64_3:u,conv128_down:f,conv128_1:l,conv128_2:g,conv256_down:T,conv256_1:D,conv256_2:h,conv256_down_out:_,fc:y};return B(o,t),{params:E,paramMappings:t}}var $=v(x());function ot(o,t){let e=Ho(o,t.conv1);return e=uo(e,t.conv2),e=$.add(e,o),e=$.relu(e),e}function Ve(o,t){let e=Dr(o,t.conv1);e=uo(e,t.conv2);let r=$.avgPool(o,2,2,"valid"),n=$.zeros(r.shape),a=r.shape[3]!==e.shape[3];if(r.shape[1]!==e.shape[1]||r.shape[2]!==e.shape[2]){let i=[...e.shape];i[1]=1;let c=$.zeros(i);e=$.concat([e,c],1);let m=[...e.shape];m[2]=1;let p=$.zeros(m);e=$.concat([e,p],2)}return r=a?$.concat([r,n],3):r,e=$.add(r,e),e=$.relu(e),e}var Qt=class extends A{constructor(){super("FaceRecognitionNet")}forwardInput(t){let{params:e}=this;if(!e)throw new Error("FaceRecognitionNet - load model before inference");return nt.tidy(()=>{let r=nt.cast(t.toBatchTensor(150,!0),"float32"),a=rt(r,[122.782,117.001,104.298]).div(255),s=Dr(a,e.conv32_down);s=nt.maxPool(s,3,2,"valid"),s=ot(s,e.conv32_1),s=ot(s,e.conv32_2),s=ot(s,e.conv32_3),s=Ve(s,e.conv64_down),s=ot(s,e.conv64_1),s=ot(s,e.conv64_2),s=ot(s,e.conv64_3),s=Ve(s,e.conv128_down),s=ot(s,e.conv128_1),s=ot(s,e.conv128_2),s=Ve(s,e.conv256_down),s=ot(s,e.conv256_1),s=ot(s,e.conv256_2),s=Ve(s,e.conv256_down_out);let i=s.mean([1,2]);return nt.matMul(i,e.fc)})}async forward(t){return this.forwardInput(await C(t))}async computeFaceDescriptor(t){var a;if((a=t==null?void 0:t.shape)!=null&&a.some(s=>s<=0))return new Float32Array(128);let e=await C(t),r=nt.tidy(()=>nt.unstack(this.forwardInput(e))),n=await Promise.all(r.map(s=>s.data()));return r.forEach(s=>s.dispose()),e.isBatchInput?n:n[0]}getDefaultModelName(){return"face_recognition_model"}extractParamsFromWeightMap(t){return Vo(t)}extractParams(t){return zo(t)}};function Xn(o){let t=new Qt;return t.extractWeights(o),t}function Er(o,t){return{...o,...{descriptor:t}}}function Jn(o){return typeof o.age=="number"}function Mr(o,t){return{...o,...{age:t}}}function qn(o){return(o.gender==="male"||o.gender==="female")&&me(o.genderProbability)}function Cr(o,t,e){return{...o,...{gender:t,genderProbability:e}}}var Lt=v(x());var at=v(x());function Zn(o,t){function e(c,m){let p=at.tensor4d(o(9*c),[3,3,c,1]),u=at.tensor1d(o(c)),f=at.tensor1d(o(c)),l=at.tensor1d(o(c)),g=at.tensor1d(o(c));return t.push({paramPath:`${m}/filters`},{paramPath:`${m}/batch_norm_scale`},{paramPath:`${m}/batch_norm_offset`},{paramPath:`${m}/batch_norm_mean`},{paramPath:`${m}/batch_norm_variance`}),{filters:p,batch_norm_scale:u,batch_norm_offset:f,batch_norm_mean:l,batch_norm_variance:g}}function r(c,m,p,u,f){let l=at.tensor4d(o(c*m*p*p),[p,p,c,m]),g=at.tensor1d(o(m));return t.push({paramPath:`${u}/filters`},{paramPath:`${u}/${f?"batch_norm_offset":"bias"}`}),{filters:l,bias:g}}function n(c,m,p,u){let{filters:f,bias:l}=r(c,m,p,u,!0);return{filters:f,batch_norm_offset:l}}function a(c,m,p){let u=e(c,`${p}/depthwise_conv`),f=n(c,m,1,`${p}/pointwise_conv`);return{depthwise_conv:u,pointwise_conv:f}}function s(){let c=n(3,32,3,"mobilenetv1/conv_0"),m=a(32,64,"mobilenetv1/conv_1"),p=a(64,128,"mobilenetv1/conv_2"),u=a(128,128,"mobilenetv1/conv_3"),f=a(128,256,"mobilenetv1/conv_4"),l=a(256,256,"mobilenetv1/conv_5"),g=a(256,512,"mobilenetv1/conv_6"),T=a(512,512,"mobilenetv1/conv_7"),D=a(512,512,"mobilenetv1/conv_8"),h=a(512,512,"mobilenetv1/conv_9"),_=a(512,512,"mobilenetv1/conv_10"),y=a(512,512,"mobilenetv1/conv_11"),E=a(512,1024,"mobilenetv1/conv_12"),W=a(1024,1024,"mobilenetv1/conv_13");return{conv_0:c,conv_1:m,conv_2:p,conv_3:u,conv_4:f,conv_5:l,conv_6:g,conv_7:T,conv_8:D,conv_9:h,conv_10:_,conv_11:y,conv_12:E,conv_13:W}}function i(){let c=n(1024,256,1,"prediction_layer/conv_0"),m=n(256,512,3,"prediction_layer/conv_1"),p=n(512,128,1,"prediction_layer/conv_2"),u=n(128,256,3,"prediction_layer/conv_3"),f=n(256,128,1,"prediction_layer/conv_4"),l=n(128,256,3,"prediction_layer/conv_5"),g=n(256,64,1,"prediction_layer/conv_6"),T=n(64,128,3,"prediction_layer/conv_7"),D=r(512,12,1,"prediction_layer/box_predictor_0/box_encoding_predictor"),h=r(512,9,1,"prediction_layer/box_predictor_0/class_predictor"),_=r(1024,24,1,"prediction_layer/box_predictor_1/box_encoding_predictor"),y=r(1024,18,1,"prediction_layer/box_predictor_1/class_predictor"),E=r(512,24,1,"prediction_layer/box_predictor_2/box_encoding_predictor"),W=r(512,18,1,"prediction_layer/box_predictor_2/class_predictor"),tt=r(256,24,1,"prediction_layer/box_predictor_3/box_encoding_predictor"),lt=r(256,18,1,"prediction_layer/box_predictor_3/class_predictor"),q=r(256,24,1,"prediction_layer/box_predictor_4/box_encoding_predictor"),Dt=r(256,18,1,"prediction_layer/box_predictor_4/class_predictor"),Et=r(128,24,1,"prediction_layer/box_predictor_5/box_encoding_predictor"),Mt=r(128,18,1,"prediction_layer/box_predictor_5/class_predictor");return{conv_0:c,conv_1:m,conv_2:p,conv_3:u,conv_4:f,conv_5:l,conv_6:g,conv_7:T,box_predictor_0:{box_encoding_predictor:D,class_predictor:h},box_predictor_1:{box_encoding_predictor:_,class_predictor:y},box_predictor_2:{box_encoding_predictor:E,class_predictor:W},box_predictor_3:{box_encoding_predictor:tt,class_predictor:lt},box_predictor_4:{box_encoding_predictor:q,class_predictor:Dt},box_predictor_5:{box_encoding_predictor:Et,class_predictor:Mt}}}return{extractMobilenetV1Params:s,extractPredictionLayerParams:i}}function Yo(o){let t=[],{extractWeights:e,getRemainingWeights:r}=R(o),{extractMobilenetV1Params:n,extractPredictionLayerParams:a}=Zn(e,t),s=n(),i=a(),m={extra_dim:at.tensor3d(e(5118*4),[1,5118,4])};if(t.push({paramPath:"output_layer/extra_dim"}),r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{params:{mobilenetv1:s,prediction_layer:i,output_layer:m},paramMappings:t}}function Kn(o,t){let e=Y(o,t);function r(m,p,u){let f=e(`${m}/Conv2d_${p}_pointwise/weights`,4,`${u}/filters`),l=e(`${m}/Conv2d_${p}_pointwise/convolution_bn_offset`,1,`${u}/batch_norm_offset`);return{filters:f,batch_norm_offset:l}}function n(m){let p=`mobilenetv1/conv_${m}`,u=`MobilenetV1/Conv2d_${m}_depthwise`,f=`${p}/depthwise_conv`,l=`${p}/pointwise_conv`,g=e(`${u}/depthwise_weights`,4,`${f}/filters`),T=e(`${u}/BatchNorm/gamma`,1,`${f}/batch_norm_scale`),D=e(`${u}/BatchNorm/beta`,1,`${f}/batch_norm_offset`),h=e(`${u}/BatchNorm/moving_mean`,1,`${f}/batch_norm_mean`),_=e(`${u}/BatchNorm/moving_variance`,1,`${f}/batch_norm_variance`);return{depthwise_conv:{filters:g,batch_norm_scale:T,batch_norm_offset:D,batch_norm_mean:h,batch_norm_variance:_},pointwise_conv:r("MobilenetV1",m,l)}}function a(){return{conv_0:r("MobilenetV1",0,"mobilenetv1/conv_0"),conv_1:n(1),conv_2:n(2),conv_3:n(3),conv_4:n(4),conv_5:n(5),conv_6:n(6),conv_7:n(7),conv_8:n(8),conv_9:n(9),conv_10:n(10),conv_11:n(11),conv_12:n(12),conv_13:n(13)}}function s(m,p){let u=e(`${m}/weights`,4,`${p}/filters`),f=e(`${m}/biases`,1,`${p}/bias`);return{filters:u,bias:f}}function i(m){let p=s(`Prediction/BoxPredictor_${m}/BoxEncodingPredictor`,`prediction_layer/box_predictor_${m}/box_encoding_predictor`),u=s(`Prediction/BoxPredictor_${m}/ClassPredictor`,`prediction_layer/box_predictor_${m}/class_predictor`);return{box_encoding_predictor:p,class_predictor:u}}function c(){return{conv_0:r("Prediction",0,"prediction_layer/conv_0"),conv_1:r("Prediction",1,"prediction_layer/conv_1"),conv_2:r("Prediction",2,"prediction_layer/conv_2"),conv_3:r("Prediction",3,"prediction_layer/conv_3"),conv_4:r("Prediction",4,"prediction_layer/conv_4"),conv_5:r("Prediction",5,"prediction_layer/conv_5"),conv_6:r("Prediction",6,"prediction_layer/conv_6"),conv_7:r("Prediction",7,"prediction_layer/conv_7"),box_predictor_0:i(0),box_predictor_1:i(1),box_predictor_2:i(2),box_predictor_3:i(3),box_predictor_4:i(4),box_predictor_5:i(5)}}return{extractMobilenetV1Params:a,extractPredictionLayerParams:c}}function Go(o){let t=[],{extractMobilenetV1Params:e,extractPredictionLayerParams:r}=Kn(o,t),n=o["Output/extra_dim"];if(t.push({originalPath:"Output/extra_dim",paramPath:"output_layer/extra_dim"}),!ht(n))throw new Error(`expected weightMap['Output/extra_dim'] to be a Tensor3D, instead have ${n}`);let a={mobilenetv1:e(),prediction_layer:r(),output_layer:{extra_dim:n}};return B(o,t),{params:a,paramMappings:t}}var _t=v(x());var Nt=v(x());function Z(o,t,e){return Nt.tidy(()=>{let r=Nt.conv2d(o,t.filters,e,"same");return r=Nt.add(r,t.batch_norm_offset),Nt.clipByValue(r,0,6)})}var Qn=.0010000000474974513;function ta(o,t,e){return _t.tidy(()=>{let r=_t.depthwiseConv2d(o,t.filters,e,"same");return r=_t.batchNorm(r,t.batch_norm_mean,t.batch_norm_variance,t.batch_norm_offset,t.batch_norm_scale,Qn),_t.clipByValue(r,0,6)})}function ea(o){return[2,4,6,12].some(t=>t===o)?[2,2]:[1,1]}function jo(o,t){return _t.tidy(()=>{let e,r=Z(o,t.conv_0,[2,2]);if([t.conv_1,t.conv_2,t.conv_3,t.conv_4,t.conv_5,t.conv_6,t.conv_7,t.conv_8,t.conv_9,t.conv_10,t.conv_11,t.conv_12,t.conv_13].forEach((a,s)=>{let i=s+1,c=ea(i);r=ta(r,a.depthwise_conv,c),r=Z(r,a.pointwise_conv,[1,1]),i===11&&(e=r)}),e===null)throw new Error("mobileNetV1 - output of conv layer 11 is null");return{out:r,conv11:e}})}function ra(o,t,e){let r=o.arraySync(),n=Math.min(r[t][0],r[t][2]),a=Math.min(r[t][1],r[t][3]),s=Math.max(r[t][0],r[t][2]),i=Math.max(r[t][1],r[t][3]),c=Math.min(r[e][0],r[e][2]),m=Math.min(r[e][1],r[e][3]),p=Math.max(r[e][0],r[e][2]),u=Math.max(r[e][1],r[e][3]),f=(s-n)*(i-a),l=(p-c)*(u-m);if(f<=0||l<=0)return 0;let g=Math.max(n,c),T=Math.max(a,m),D=Math.min(s,p),h=Math.min(i,u),_=Math.max(D-g,0)*Math.max(h-T,0);return _/(f+l-_)}function Uo(o,t,e,r,n){let a=o.shape[0],s=Math.min(e,a),i=t.map((p,u)=>({score:p,boxIndex:u})).filter(p=>p.score>n).sort((p,u)=>u.score-p.score),c=p=>p<=r?1:0,m=[];return i.forEach(p=>{if(m.length>=s)return;let u=p.score;for(let f=m.length-1;f>=0;--f){let l=ra(o,p.boxIndex,m[f]);if(l!==0&&(p.score*=c(l),p.score<=n))break}u===p.score&&m.push(p.boxIndex)}),m}var d=v(x());function oa(o){let t=d.unstack(d.transpose(o,[1,0])),e=[d.sub(t[2],t[0]),d.sub(t[3],t[1])],r=[d.add(t[0],d.div(e[0],2)),d.add(t[1],d.div(e[1],2))];return{sizes:e,centers:r}}function na(o,t){let{sizes:e,centers:r}=oa(o),n=d.unstack(d.transpose(t,[1,0])),a=d.div(d.mul(d.exp(d.div(n[2],5)),e[0]),2),s=d.add(d.mul(d.div(n[0],10),e[0]),r[0]),i=d.div(d.mul(d.exp(d.div(n[3],5)),e[1]),2),c=d.add(d.mul(d.div(n[1],10),e[1]),r[1]);return d.transpose(d.stack([d.sub(s,a),d.sub(c,i),d.add(s,a),d.add(c,i)]),[1,0])}function Xo(o,t,e){return d.tidy(()=>{let r=o.shape[0],n=na(d.reshape(d.tile(e.extra_dim,[r,1,1]),[-1,4]),d.reshape(o,[-1,4]));n=d.reshape(n,[r,n.shape[0]/r,4]);let a=d.sigmoid(d.slice(t,[0,0,1],[-1,-1,-1])),s=d.slice(a,[0,0,0],[-1,-1,1]);s=d.reshape(s,[r,s.shape[1]]);let i=d.unstack(n),c=d.unstack(s);return{boxes:i,scores:c}})}var Ge=v(x());var Ye=v(x());function te(o,t){return Ye.tidy(()=>{let e=o.shape[0],r=Ye.reshape(qt(o,t.box_encoding_predictor),[e,-1,1,4]),n=Ye.reshape(qt(o,t.class_predictor),[e,-1,3]);return{boxPredictionEncoding:r,classPrediction:n}})}function Jo(o,t,e){return Ge.tidy(()=>{let r=Z(o,e.conv_0,[1,1]),n=Z(r,e.conv_1,[2,2]),a=Z(n,e.conv_2,[1,1]),s=Z(a,e.conv_3,[2,2]),i=Z(s,e.conv_4,[1,1]),c=Z(i,e.conv_5,[2,2]),m=Z(c,e.conv_6,[1,1]),p=Z(m,e.conv_7,[2,2]),u=te(t,e.box_predictor_0),f=te(o,e.box_predictor_1),l=te(n,e.box_predictor_2),g=te(s,e.box_predictor_3),T=te(c,e.box_predictor_4),D=te(p,e.box_predictor_5),h=Ge.concat([u.boxPredictionEncoding,f.boxPredictionEncoding,l.boxPredictionEncoding,g.boxPredictionEncoding,T.boxPredictionEncoding,D.boxPredictionEncoding],1),_=Ge.concat([u.classPrediction,f.classPrediction,l.classPrediction,g.classPrediction,T.classPrediction,D.classPrediction],1);return{boxPredictions:h,classPredictions:_}})}var X=class{constructor({minConfidence:t,maxResults:e}={}){this._name="SsdMobilenetv1Options";if(this._minConfidence=t||.5,this._maxResults=e||100,typeof this._minConfidence!="number"||this._minConfidence<=0||this._minConfidence>=1)throw new Error(`${this._name} - expected minConfidence to be a number between 0 and 1`);if(typeof this._maxResults!="number")throw new Error(`${this._name} - expected maxResults to be a number`)}get minConfidence(){return this._minConfidence}get maxResults(){return this._maxResults}};var St=class extends A{constructor(){super("SsdMobilenetv1")}forwardInput(t){let{params:e}=this;if(!e)throw new Error("SsdMobilenetv1 - load model before inference");return Lt.tidy(()=>{let r=Lt.cast(t.toBatchTensor(512,!1),"float32"),n=Lt.sub(Lt.div(r,127.5),1),a=jo(n,e.mobilenetv1),{boxPredictions:s,classPredictions:i}=Jo(a.out,a.conv11,e.prediction_layer);return Xo(s,i,e.output_layer)})}async forward(t){return this.forwardInput(await C(t))}async locateFaces(t,e={}){let{maxResults:r,minConfidence:n}=new X(e),a=await C(t),{boxes:s,scores:i}=this.forwardInput(a),c=s[0],m=i[0];for(let y=1;y{let[E,W]=[Math.max(0,h[y][0]),Math.min(1,h[y][2])].map(q=>q*D),[tt,lt]=[Math.max(0,h[y][1]),Math.min(1,h[y][3])].map(q=>q*T);return new M(p[y],new Yt(tt,E,lt-tt,W-E),{height:a.getInputHeight(0),width:a.getInputWidth(0)})});return c.dispose(),m.dispose(),_}getDefaultModelName(){return"ssd_mobilenetv1_model"}extractParamsFromWeightMap(t){return Go(t)}extractParams(t){return Yo(t)}};function qo(o){let t=new St;return t.extractWeights(o),t}function aa(o){return qo(o)}var fo=class extends St{};var Zo=.4,Ko=[new b(.738768,.874946),new b(2.42204,2.65704),new b(4.30971,7.04493),new b(10.246,4.59428),new b(12.6868,11.8741)],Qo=[new b(1.603231,2.094468),new b(6.041143,7.080126),new b(2.882459,3.518061),new b(4.266906,5.178857),new b(9.041765,10.66308)],tn=[117.001,114.697,97.404],en="tiny_yolov2_model",rn="tiny_yolov2_separable_conv_model";var N=v(x());var Ir=o=>typeof o=="number";function lo(o){if(!o)throw new Error(`invalid config: ${o}`);if(typeof o.withSeparableConvs!="boolean")throw new Error(`config.withSeparableConvs has to be a boolean, have: ${o.withSeparableConvs}`);if(!Ir(o.iouThreshold)||o.iouThreshold<0||o.iouThreshold>1)throw new Error(`config.iouThreshold has to be a number between [0, 1], have: ${o.iouThreshold}`);if(!Array.isArray(o.classes)||!o.classes.length||!o.classes.every(t=>typeof t=="string"))throw new Error(`config.classes has to be an array class names: string[], have: ${JSON.stringify(o.classes)}`);if(!Array.isArray(o.anchors)||!o.anchors.length||!o.anchors.map(t=>t||{}).every(t=>Ir(t.x)&&Ir(t.y)))throw new Error(`config.anchors has to be an array of { x: number, y: number }, have: ${JSON.stringify(o.anchors)}`);if(o.meanRgb&&(!Array.isArray(o.meanRgb)||o.meanRgb.length!==3||!o.meanRgb.every(Ir)))throw new Error(`config.meanRgb has to be an array of shape [number, number, number], have: ${JSON.stringify(o.meanRgb)}`)}var Q=v(x());var K=v(x());function Me(o){return K.tidy(()=>{let t=K.mul(o,K.scalar(.10000000149011612));return K.add(K.relu(K.sub(o,t)),t)})}function Tt(o,t){return Q.tidy(()=>{let e=Q.pad(o,[[0,0],[1,1],[1,1],[0,0]]);return e=Q.conv2d(e,t.conv.filters,[1,1],"valid"),e=Q.sub(e,t.bn.sub),e=Q.mul(e,t.bn.truediv),e=Q.add(e,t.conv.bias),Me(e)})}var At=v(x());function Pt(o,t){return At.tidy(()=>{let e=At.pad(o,[[0,0],[1,1],[1,1],[0,0]]);return e=At.separableConv2d(e,t.depthwise_filter,t.pointwise_filter,[1,1],"valid"),e=At.add(e,t.bias),Me(e)})}var ho=v(x());function sa(o,t){let e=be(o,t);function r(s,i){let c=ho.tensor1d(o(s)),m=ho.tensor1d(o(s));return t.push({paramPath:`${i}/sub`},{paramPath:`${i}/truediv`}),{sub:c,truediv:m}}function n(s,i,c){let m=e(s,i,3,`${c}/conv`),p=r(i,`${c}/bn`);return{conv:m,bn:p}}let a=ge(o,t);return{extractConvParams:e,extractConvWithBatchNormParams:n,extractSeparableConvParams:a}}function on(o,t,e,r){let{extractWeights:n,getRemainingWeights:a}=R(o),s=[],{extractConvParams:i,extractConvWithBatchNormParams:c,extractSeparableConvParams:m}=sa(n,s),p;if(t.withSeparableConvs){let[u,f,l,g,T,D,h,_,y]=r,E=t.isFirstLayerConv2d?i(u,f,3,"conv0"):m(u,f,"conv0"),W=m(f,l,"conv1"),tt=m(l,g,"conv2"),lt=m(g,T,"conv3"),q=m(T,D,"conv4"),Dt=m(D,h,"conv5"),Et=_?m(h,_,"conv6"):void 0,Mt=y?m(_,y,"conv7"):void 0,$t=i(y||_||h,5*e,1,"conv8");p={conv0:E,conv1:W,conv2:tt,conv3:lt,conv4:q,conv5:Dt,conv6:Et,conv7:Mt,conv8:$t}}else{let[u,f,l,g,T,D,h,_,y]=r,E=c(u,f,"conv0"),W=c(f,l,"conv1"),tt=c(l,g,"conv2"),lt=c(g,T,"conv3"),q=c(T,D,"conv4"),Dt=c(D,h,"conv5"),Et=c(h,_,"conv6"),Mt=c(_,y,"conv7"),$t=i(y,5*e,1,"conv8");p={conv0:E,conv1:W,conv2:tt,conv3:lt,conv4:q,conv5:Dt,conv6:Et,conv7:Mt,conv8:$t}}if(a().length!==0)throw new Error(`weights remaing after extract: ${a().length}`);return{params:p,paramMappings:s}}function ia(o,t){let e=Y(o,t);function r(i){let c=e(`${i}/sub`,1),m=e(`${i}/truediv`,1);return{sub:c,truediv:m}}function n(i){let c=e(`${i}/filters`,4),m=e(`${i}/bias`,1);return{filters:c,bias:m}}function a(i){let c=n(`${i}/conv`),m=r(`${i}/bn`);return{conv:c,bn:m}}let s=xe(e);return{extractConvParams:n,extractConvWithBatchNormParams:a,extractSeparableConvParams:s}}function nn(o,t){let e=[],{extractConvParams:r,extractConvWithBatchNormParams:n,extractSeparableConvParams:a}=ia(o,e),s;if(t.withSeparableConvs){let i=t.filterSizes&&t.filterSizes.length||9;s={conv0:t.isFirstLayerConv2d?r("conv0"):a("conv0"),conv1:a("conv1"),conv2:a("conv2"),conv3:a("conv3"),conv4:a("conv4"),conv5:a("conv5"),conv6:i>7?a("conv6"):void 0,conv7:i>8?a("conv7"):void 0,conv8:r("conv8")}}else s={conv0:n("conv0"),conv1:n("conv1"),conv2:n("conv2"),conv3:n("conv3"),conv4:n("conv4"),conv5:n("conv5"),conv6:n("conv6"),conv7:n("conv7"),conv8:r("conv8")};return B(o,e),{params:s,paramMappings:e}}var st=class{constructor({inputSize:t,scoreThreshold:e}={}){this._name="TinyYolov2Options";if(this._inputSize=t||416,this._scoreThreshold=e||.5,typeof this._inputSize!="number"||this._inputSize%32!==0)throw new Error(`${this._name} - expected inputSize to be a number divisible by 32`);if(typeof this._scoreThreshold!="number"||this._scoreThreshold<=0||this._scoreThreshold>=1)throw new Error(`${this._name} - expected scoreThreshold to be a number between 0 and 1`)}get inputSize(){return this._inputSize}get scoreThreshold(){return this._scoreThreshold}};var bo=class extends A{constructor(e){super("TinyYolov2");lo(e),this._config=e}get config(){return this._config}get withClassScores(){return this.config.withClassScores||this.config.classes.length>1}get boxEncodingSize(){return 5+(this.withClassScores?this.config.classes.length:0)}runTinyYolov2(e,r){let n=Tt(e,r.conv0);return n=N.maxPool(n,[2,2],[2,2],"same"),n=Tt(n,r.conv1),n=N.maxPool(n,[2,2],[2,2],"same"),n=Tt(n,r.conv2),n=N.maxPool(n,[2,2],[2,2],"same"),n=Tt(n,r.conv3),n=N.maxPool(n,[2,2],[2,2],"same"),n=Tt(n,r.conv4),n=N.maxPool(n,[2,2],[2,2],"same"),n=Tt(n,r.conv5),n=N.maxPool(n,[2,2],[1,1],"same"),n=Tt(n,r.conv6),n=Tt(n,r.conv7),qt(n,r.conv8,"valid",!1)}runMobilenet(e,r){let n=this.config.isFirstLayerConv2d?Me(qt(e,r.conv0,"valid",!1)):Pt(e,r.conv0);return n=N.maxPool(n,[2,2],[2,2],"same"),n=Pt(n,r.conv1),n=N.maxPool(n,[2,2],[2,2],"same"),n=Pt(n,r.conv2),n=N.maxPool(n,[2,2],[2,2],"same"),n=Pt(n,r.conv3),n=N.maxPool(n,[2,2],[2,2],"same"),n=Pt(n,r.conv4),n=N.maxPool(n,[2,2],[2,2],"same"),n=Pt(n,r.conv5),n=N.maxPool(n,[2,2],[1,1],"same"),n=r.conv6?Pt(n,r.conv6):n,n=r.conv7?Pt(n,r.conv7):n,qt(n,r.conv8,"valid",!1)}forwardInput(e,r){let{params:n}=this;if(!n)throw new Error("TinyYolov2 - load model before inference");return N.tidy(()=>{let a=N.cast(e.toBatchTensor(r,!1),"float32");return a=this.config.meanRgb?rt(a,this.config.meanRgb):a,a=a.div(255),this.config.withSeparableConvs?this.runMobilenet(a,n):this.runTinyYolov2(a,n)})}async forward(e,r){return this.forwardInput(await C(e),r)}async detect(e,r={}){let{inputSize:n,scoreThreshold:a}=new st(r),s=await C(e),i=await this.forwardInput(s,n),c=N.tidy(()=>N.unstack(i)[0].expandDims()),m={width:s.getInputWidth(0),height:s.getInputHeight(0)},p=await this.extractBoxes(c,s.getReshapedInputDimensions(0),a);i.dispose(),c.dispose();let u=p.map(h=>h.box),f=p.map(h=>h.score),l=p.map(h=>h.classScore),g=p.map(h=>this.config.classes[h.label]);return Vr(u.map(h=>h.rescale(n)),f,this.config.iouThreshold,!0).map(h=>new bt(f[h],l[h],g[h],u[h],m))}getDefaultModelName(){return""}extractParamsFromWeightMap(e){return nn(e,this.config)}extractParams(e){let r=this.config.filterSizes||bo.DEFAULT_FILTER_SIZES,n=r?r.length:void 0;if(n!==7&&n!==8&&n!==9)throw new Error(`TinyYolov2 - expected 7 | 8 | 9 convolutional filters, but found ${n} filterSizes in config`);return on(e,this.config,this.boxEncodingSize,r)}async extractBoxes(e,r,n){let{width:a,height:s}=r,i=Math.max(a,s),c=i/a,m=i/s,p=e.shape[1],u=this.config.anchors.length,[f,l,g]=N.tidy(()=>{let _=e.reshape([p,p,u,this.boxEncodingSize]),y=_.slice([0,0,0,0],[p,p,u,4]),E=_.slice([0,0,0,4],[p,p,u,1]),W=this.withClassScores?N.softmax(_.slice([0,0,0,5],[p,p,u,this.config.classes.length]),3):N.scalar(0);return[y,E,W]}),T=[],D=await l.array(),h=await f.array();for(let _=0;_n){let tt=(y+Ne(h[_][y][E][0]))/p*c,lt=(_+Ne(h[_][y][E][1]))/p*m,q=Math.exp(h[_][y][E][2])*this.config.anchors[E].x/p*c,Dt=Math.exp(h[_][y][E][3])*this.config.anchors[E].y/p*m,Et=tt-q/2,Mt=lt-Dt/2,$t={row:_,col:y,anchor:E},{classScore:vo,label:yo}=this.withClassScores?await this.extractPredictedClass(g,$t):{classScore:1,label:0};T.push({box:new Vt(Et,Mt,Et+q,Mt+Dt),score:W,classScore:W*vo,label:yo,...$t})}}return f.dispose(),l.dispose(),g.dispose(),T}async extractPredictedClass(e,r){let{row:n,col:a,anchor:s}=r,i=await e.array();return Array(this.config.classes.length).fill(0).map((c,m)=>i[n][a][s][m]).map((c,m)=>({classScore:c,label:m})).reduce((c,m)=>c.classScore>m.classScore?c:m)}},ee=bo;ee.DEFAULT_FILTER_SIZES=[3,16,32,64,128,256,512,1024,1024];var re=class extends ee{constructor(t=!0){let e={withSeparableConvs:t,iouThreshold:Zo,classes:["face"],...t?{anchors:Qo,meanRgb:tn}:{anchors:Ko,withClassScores:!0}};super(e)}get withSeparableConvs(){return this.config.withSeparableConvs}get anchors(){return this.config.anchors}async locateFaces(t,e){return(await this.detect(t,e)).map(n=>new M(n.score,n.relativeBox,{width:n.imageWidth,height:n.imageHeight}))}getDefaultModelName(){return this.withSeparableConvs?rn:en}extractParamsFromWeightMap(t){return super.extractParamsFromWeightMap(t)}};function ca(o,t=!0){let e=new re(t);return e.extractWeights(o),e}var je=class extends st{constructor(){super(...arguments);this._name="TinyFaceDetectorOptions"}};var J=class{async then(t){return t(await this.run())}async run(){throw new Error("ComposableTask - run is not implemented")}};var Xe=v(x());var go=v(x());async function oe(o,t,e,r,n=({alignedRect:a})=>a){let a=o.map(c=>Zt(c)?n(c):c.detection),s=r||(t instanceof go.Tensor?await de(t,a):await le(t,a)),i=await e(s);return s.forEach(c=>c instanceof go.Tensor&&c.dispose()),i}async function Ce(o,t,e,r,n){return oe([o],t,async a=>e(a[0]),r,n)}var an=.4,sn=[new b(1.603231,2.094468),new b(6.041143,7.080126),new b(2.882459,3.518061),new b(4.266906,5.178857),new b(9.041765,10.66308)],cn=[117.001,114.697,97.404];var ne=class extends ee{constructor(){let t={withSeparableConvs:!0,iouThreshold:an,classes:["face"],anchors:sn,meanRgb:cn,isFirstLayerConv2d:!0,filterSizes:[3,16,32,64,128,256,512]};super(t)}get anchors(){return this.config.anchors}async locateFaces(t,e){return(await this.detect(t,e)).map(n=>new M(n.score,n.relativeBox,{width:n.imageWidth,height:n.imageHeight}))}getDefaultModelName(){return"tiny_face_detector_model"}extractParamsFromWeightMap(t){return super.extractParamsFromWeightMap(t)}};var w={ssdMobilenetv1:new St,tinyFaceDetector:new ne,tinyYolov2:new re,faceLandmark68Net:new Kt,faceLandmark68TinyNet:new ze,faceRecognitionNet:new Qt,faceExpressionNet:new Oe,ageGenderNet:new He},mn=(o,t)=>w.ssdMobilenetv1.locateFaces(o,t),ma=(o,t)=>w.tinyFaceDetector.locateFaces(o,t),pa=(o,t)=>w.tinyYolov2.locateFaces(o,t),pn=o=>w.faceLandmark68Net.detectLandmarks(o),ua=o=>w.faceLandmark68TinyNet.detectLandmarks(o),fa=o=>w.faceRecognitionNet.computeFaceDescriptor(o),la=o=>w.faceExpressionNet.predictExpressions(o),da=o=>w.ageGenderNet.predictAgeAndGender(o),un=o=>w.ssdMobilenetv1.load(o),ha=o=>w.tinyFaceDetector.load(o),ba=o=>w.tinyYolov2.load(o),ga=o=>w.faceLandmark68Net.load(o),xa=o=>w.faceLandmark68TinyNet.load(o),va=o=>w.faceRecognitionNet.load(o),ya=o=>w.faceExpressionNet.load(o),_a=o=>w.ageGenderNet.load(o),Ta=un,Pa=mn,wa=pn;var Nr=class extends J{constructor(e,r,n){super();this.parentTask=e;this.input=r;this.extractedFaces=n}},ae=class extends Nr{async run(){let t=await this.parentTask,e=await oe(t,this.input,async r=>Promise.all(r.map(n=>w.faceExpressionNet.predictExpressions(n))),this.extractedFaces);return t.map((r,n)=>vr(r,e[n]))}withAgeAndGender(){return new ie(this,this.input)}},se=class extends Nr{async run(){let t=await this.parentTask;if(!t)return;let e=await Ce(t,this.input,r=>w.faceExpressionNet.predictExpressions(r),this.extractedFaces);return vr(t,e)}withAgeAndGender(){return new ce(this,this.input)}},Wt=class extends ae{withAgeAndGender(){return new Bt(this,this.input)}withFaceDescriptors(){return new wt(this,this.input)}},kt=class extends se{withAgeAndGender(){return new Rt(this,this.input)}withFaceDescriptor(){return new Ft(this,this.input)}};var Sr=class extends J{constructor(e,r,n){super();this.parentTask=e;this.input=r;this.extractedFaces=n}},ie=class extends Sr{async run(){let t=await this.parentTask,e=await oe(t,this.input,async r=>Promise.all(r.map(n=>w.ageGenderNet.predictAgeAndGender(n))),this.extractedFaces);return t.map((r,n)=>{let{age:a,gender:s,genderProbability:i}=e[n];return Mr(Cr(r,s,i),a)})}withFaceExpressions(){return new ae(this,this.input)}},ce=class extends Sr{async run(){let t=await this.parentTask;if(!t)return;let{age:e,gender:r,genderProbability:n}=await Ce(t,this.input,a=>w.ageGenderNet.predictAgeAndGender(a),this.extractedFaces);return Mr(Cr(t,r,n),e)}withFaceExpressions(){return new se(this,this.input)}},Bt=class extends ie{withFaceExpressions(){return new Wt(this,this.input)}withFaceDescriptors(){return new wt(this,this.input)}},Rt=class extends ce{withFaceExpressions(){return new kt(this,this.input)}withFaceDescriptor(){return new Ft(this,this.input)}};var Ue=class extends J{constructor(e,r){super();this.parentTask=e;this.input=r}},wt=class extends Ue{async run(){let t=await this.parentTask;return(await oe(t,this.input,r=>Promise.all(r.map(n=>w.faceRecognitionNet.computeFaceDescriptor(n))),null,r=>r.landmarks.align(null,{useDlibAlignment:!0}))).map((r,n)=>Er(t[n],r))}withFaceExpressions(){return new Wt(this,this.input)}withAgeAndGender(){return new Bt(this,this.input)}},Ft=class extends Ue{async run(){let t=await this.parentTask;if(!t)return;let e=await Ce(t,this.input,r=>w.faceRecognitionNet.computeFaceDescriptor(r),null,r=>r.landmarks.align(null,{useDlibAlignment:!0}));return Er(t,e)}withFaceExpressions(){return new kt(this,this.input)}withAgeAndGender(){return new Rt(this,this.input)}};var Je=class extends J{constructor(e,r,n){super();this.parentTask=e;this.input=r;this.useTinyLandmarkNet=n}get landmarkNet(){return this.useTinyLandmarkNet?w.faceLandmark68TinyNet:w.faceLandmark68Net}},qe=class extends Je{async run(){let t=await this.parentTask,e=t.map(s=>s.detection),r=this.input instanceof Xe.Tensor?await de(this.input,e):await le(this.input,e),n=await Promise.all(r.map(s=>this.landmarkNet.detectLandmarks(s)));return r.forEach(s=>s instanceof Xe.Tensor&&s.dispose()),t.filter((s,i)=>n[i]).map((s,i)=>we(s,n[i]))}withFaceExpressions(){return new Wt(this,this.input)}withAgeAndGender(){return new Bt(this,this.input)}withFaceDescriptors(){return new wt(this,this.input)}},Ze=class extends Je{async run(){let t=await this.parentTask;if(!t)return;let{detection:e}=t,r=this.input instanceof Xe.Tensor?await de(this.input,[e]):await le(this.input,[e]),n=await this.landmarkNet.detectLandmarks(r[0]);return r.forEach(a=>a instanceof Xe.Tensor&&a.dispose()),we(t,n)}withFaceExpressions(){return new kt(this,this.input)}withAgeAndGender(){return new Rt(this,this.input)}withFaceDescriptor(){return new Ft(this,this.input)}};var Ke=class extends J{constructor(e,r=new X){super();this.input=e;this.options=r}},Ie=class extends Ke{async run(){let{input:t,options:e}=this,r;if(e instanceof je)r=w.tinyFaceDetector.locateFaces(t,e);else if(e instanceof X)r=w.ssdMobilenetv1.locateFaces(t,e);else if(e instanceof st)r=w.tinyYolov2.locateFaces(t,e);else throw new Error("detectFaces - expected options to be instance of TinyFaceDetectorOptions | SsdMobilenetv1Options | TinyYolov2Options");return r}runAndExtendWithFaceDetections(){return new Promise((t,e)=>{this.run().then(r=>t(r.map(n=>jt({},n)))).catch(r=>e(r))})}withFaceLandmarks(t=!1){return new qe(this.runAndExtendWithFaceDetections(),this.input,t)}withFaceExpressions(){return new ae(this.runAndExtendWithFaceDetections(),this.input)}withAgeAndGender(){return new ie(this.runAndExtendWithFaceDetections(),this.input)}},Qe=class extends Ke{async run(){let t=await new Ie(this.input,this.options),e=t[0];return t.forEach(r=>{r.score>e.score&&(e=r)}),e}runAndExtendWithFaceDetection(){return new Promise(async t=>{let e=await this.run();t(e?jt({},e):void 0)})}withFaceLandmarks(t=!1){return new Ze(this.runAndExtendWithFaceDetection(),this.input,t)}withFaceExpressions(){return new se(this.runAndExtendWithFaceDetection(),this.input)}withAgeAndGender(){return new ce(this.runAndExtendWithFaceDetection(),this.input)}};function Fa(o,t=new X){return new Qe(o,t)}function Lr(o,t=new X){return new Ie(o,t)}async function fn(o,t){return Lr(o,new X(t?{minConfidence:t}:{})).withFaceLandmarks().withFaceDescriptors()}async function Da(o,t={}){return Lr(o,new st(t)).withFaceLandmarks().withFaceDescriptors()}var Ea=fn;function xo(o,t){if(o.length!==t.length)throw new Error("euclideanDistance: arr1.length !== arr2.length");let e=Array.from(o),r=Array.from(t);return Math.sqrt(e.map((n,a)=>n-r[a]).reduce((n,a)=>n+a**2,0))}var tr=class{constructor(t,e=.6){this._distanceThreshold=e;let r=Array.isArray(t)?t:[t];if(!r.length)throw new Error("FaceRecognizer.constructor - expected atleast one input");let n=1,a=()=>`person ${n++}`;this._labeledDescriptors=r.map(s=>{if(s instanceof mt)return s;if(s instanceof Float32Array)return new mt(a(),[s]);if(s.descriptor&&s.descriptor instanceof Float32Array)return new mt(a(),[s.descriptor]);throw new Error("FaceRecognizer.constructor - expected inputs to be of type LabeledFaceDescriptors | WithFaceDescriptor | Float32Array | Array | Float32Array>")})}get labeledDescriptors(){return this._labeledDescriptors}get distanceThreshold(){return this._distanceThreshold}computeMeanDistance(t,e){return e.map(r=>xo(r,t)).reduce((r,n)=>r+n,0)/(e.length||1)}matchDescriptor(t){return this.labeledDescriptors.map(({descriptors:e,label:r})=>new pe(r,this.computeMeanDistance(t,e))).reduce((e,r)=>e.distancet.toJSON())}}static fromJSON(t){let e=t.labeledDescriptors.map(r=>mt.fromJSON(r));return new tr(e,t.distanceThreshold)}};function Ma(o){let t=new ne;return t.extractWeights(o),t}function ln(o,t){let{width:e,height:r}=new k(t.width,t.height);if(e<=0||r<=0)throw new Error(`resizeResults - invalid dimensions: ${JSON.stringify({width:e,height:r})}`);if(Array.isArray(o))return o.map(n=>ln(n,{width:e,height:r}));if(Zt(o)){let n=o.detection.forSize(e,r),a=o.unshiftedLandmarks.forSize(n.box.width,n.box.height);return we(jt(o,n),a)}return pt(o)?jt(o,o.detection.forSize(e,r)):o instanceof z||o instanceof M?o.forSize(e,r):o}var Ia=So;0&&(module.exports={AgeGenderNet,BoundingBox,Box,ComposableTask,ComputeAllFaceDescriptorsTask,ComputeFaceDescriptorsTaskBase,ComputeSingleFaceDescriptorTask,DetectAllFaceLandmarksTask,DetectAllFacesTask,DetectFaceLandmarksTaskBase,DetectFacesTaskBase,DetectSingleFaceLandmarksTask,DetectSingleFaceTask,Dimensions,FACE_EXPRESSION_LABELS,FaceDetection,FaceDetectionNet,FaceExpressionNet,FaceExpressions,FaceLandmark68Net,FaceLandmark68TinyNet,FaceLandmarkNet,FaceLandmarks,FaceLandmarks5,FaceLandmarks68,FaceMatch,FaceMatcher,FaceRecognitionNet,Gender,LabeledBox,LabeledFaceDescriptors,NetInput,NeuralNetwork,ObjectDetection,Point,PredictedBox,Rect,SsdMobilenetv1,SsdMobilenetv1Options,TinyFaceDetector,TinyFaceDetectorOptions,TinyYolov2,TinyYolov2Options,allFaces,allFacesSsdMobilenetv1,allFacesTinyYolov2,awaitMediaLoaded,bufferToImage,computeFaceDescriptor,createCanvas,createCanvasFromMedia,createFaceDetectionNet,createFaceRecognitionNet,createSsdMobilenetv1,createTinyFaceDetector,createTinyYolov2,detectAllFaces,detectFaceLandmarks,detectFaceLandmarksTiny,detectLandmarks,detectSingleFace,draw,env,euclideanDistance,extendWithAge,extendWithFaceDescriptor,extendWithFaceDetection,extendWithFaceExpressions,extendWithFaceLandmarks,extendWithGender,extractFaceTensors,extractFaces,fetchImage,fetchJson,fetchNetWeights,fetchOrThrow,fetchVideo,getContext2dOrThrow,getMediaDimensions,imageTensorToCanvas,imageToSquare,inverseSigmoid,iou,isMediaElement,isMediaLoaded,isWithAge,isWithFaceDetection,isWithFaceExpressions,isWithFaceLandmarks,isWithGender,loadAgeGenderModel,loadFaceDetectionModel,loadFaceExpressionModel,loadFaceLandmarkModel,loadFaceLandmarkTinyModel,loadFaceRecognitionModel,loadSsdMobilenetv1Model,loadTinyFaceDetectorModel,loadTinyYolov2Model,loadWeightMap,locateFaces,matchDimensions,minBbox,nets,nonMaxSuppression,normalize,padToSquare,predictAgeAndGender,recognizeFaceExpressions,resizeResults,resolveInput,shuffleArray,sigmoid,ssdMobilenetv1,tf,tinyFaceDetector,tinyYolov2,toNetInput,utils,validateConfig,version}); +"use strict";var dn=Object.create;var er=Object.defineProperty;var hn=Object.getOwnPropertyDescriptor;var bn=Object.getOwnPropertyNames;var gn=Object.getPrototypeOf,xn=Object.prototype.hasOwnProperty;var vn=(o,t)=>()=>(t||o((t={exports:{}}).exports,t),t.exports),Ar=(o,t)=>{for(var e in t)er(o,e,{get:t[e],enumerable:!0})},_o=(o,t,e,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of bn(t))!xn.call(o,n)&&n!==e&&er(o,n,{get:()=>t[n],enumerable:!(r=hn(t,n))||r.enumerable});return o};var v=(o,t,e)=>(e=o!=null?dn(gn(o)):{},_o(t||!o||!o.__esModule?er(e,"default",{value:o,enumerable:!0}):e,o)),yn=o=>_o(er({},"__esModule",{value:!0}),o);var x=vn((ka,rr)=>{"use strict";var To=Object.defineProperty,_n=Object.getOwnPropertyDescriptor,Tn=Object.getOwnPropertyNames,Pn=Object.prototype.hasOwnProperty,Wr=(o,t,e,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Tn(t))!Pn.call(o,n)&&n!==e&&To(o,n,{get:()=>t[n],enumerable:!(r=_n(t,n))||r.enumerable});return o},Po=(o,t,e)=>(Wr(o,t,"default"),e&&Wr(e,t,"default")),wn=o=>Wr(To({},"__esModule",{value:!0}),o),kr={};rr.exports=wn(kr);Po(kr,require("@tensorflow/tfjs"),rr.exports);Po(kr,require("@tensorflow/tfjs-backend-wasm"),rr.exports)});var Na={};Ar(Na,{AgeGenderNet:()=>He,BoundingBox:()=>Vt,Box:()=>F,ComposableTask:()=>J,ComputeAllFaceDescriptorsTask:()=>wt,ComputeFaceDescriptorsTaskBase:()=>Ue,ComputeSingleFaceDescriptorTask:()=>Ft,DetectAllFaceLandmarksTask:()=>qe,DetectAllFacesTask:()=>Ie,DetectFaceLandmarksTaskBase:()=>Je,DetectFacesTaskBase:()=>Ke,DetectSingleFaceLandmarksTask:()=>Ze,DetectSingleFaceTask:()=>Qe,Dimensions:()=>k,FACE_EXPRESSION_LABELS:()=>ao,FaceDetection:()=>M,FaceDetectionNet:()=>fo,FaceExpressionNet:()=>Oe,FaceExpressions:()=>yt,FaceLandmark68Net:()=>Kt,FaceLandmark68TinyNet:()=>ze,FaceLandmarkNet:()=>mo,FaceLandmarks:()=>z,FaceLandmarks5:()=>Gr,FaceLandmarks68:()=>Gt,FaceMatch:()=>pe,FaceMatcher:()=>tr,FaceRecognitionNet:()=>Qt,Gender:()=>Pr,LabeledBox:()=>ue,LabeledFaceDescriptors:()=>mt,NetInput:()=>ut,NeuralNetwork:()=>A,ObjectDetection:()=>bt,Point:()=>b,PredictedBox:()=>jr,Rect:()=>Yt,SsdMobilenetv1:()=>St,SsdMobilenetv1Options:()=>X,TinyFaceDetector:()=>ne,TinyFaceDetectorOptions:()=>je,TinyYolov2:()=>re,TinyYolov2Options:()=>st,allFaces:()=>Ea,allFacesSsdMobilenetv1:()=>fn,allFacesTinyYolov2:()=>Da,awaitMediaLoaded:()=>Qr,bufferToImage:()=>to,computeFaceDescriptor:()=>fa,createCanvas:()=>Jt,createCanvasFromMedia:()=>We,createFaceDetectionNet:()=>aa,createFaceRecognitionNet:()=>Xn,createSsdMobilenetv1:()=>qo,createTinyFaceDetector:()=>Ma,createTinyYolov2:()=>ca,detectAllFaces:()=>Lr,detectFaceLandmarks:()=>pn,detectFaceLandmarksTiny:()=>ua,detectLandmarks:()=>wa,detectSingleFace:()=>Fa,draw:()=>io,env:()=>P,euclideanDistance:()=>xo,extendWithAge:()=>Mr,extendWithFaceDescriptor:()=>Er,extendWithFaceDetection:()=>jt,extendWithFaceExpressions:()=>vr,extendWithFaceLandmarks:()=>we,extendWithGender:()=>Cr,extractFaceTensors:()=>de,extractFaces:()=>le,fetchImage:()=>An,fetchJson:()=>oo,fetchNetWeights:()=>Wn,fetchOrThrow:()=>xt,fetchVideo:()=>kn,getContext2dOrThrow:()=>O,getMediaDimensions:()=>Xt,imageTensorToCanvas:()=>eo,imageToSquare:()=>ro,inverseSigmoid:()=>En,iou:()=>Hr,isMediaElement:()=>cr,isMediaLoaded:()=>Ae,isWithAge:()=>Jn,isWithFaceDetection:()=>pt,isWithFaceExpressions:()=>so,isWithFaceLandmarks:()=>Zt,isWithGender:()=>qn,loadAgeGenderModel:()=>_a,loadFaceDetectionModel:()=>Ta,loadFaceExpressionModel:()=>ya,loadFaceLandmarkModel:()=>ga,loadFaceLandmarkTinyModel:()=>xa,loadFaceRecognitionModel:()=>va,loadSsdMobilenetv1Model:()=>un,loadTinyFaceDetectorModel:()=>ha,loadTinyYolov2Model:()=>ba,loadWeightMap:()=>no,locateFaces:()=>Pa,matchDimensions:()=>Bn,minBbox:()=>zr,nets:()=>w,nonMaxSuppression:()=>Vr,normalize:()=>rt,padToSquare:()=>Yr,predictAgeAndGender:()=>da,recognizeFaceExpressions:()=>la,resizeResults:()=>ln,resolveInput:()=>Ut,shuffleArray:()=>Dn,sigmoid:()=>Ne,ssdMobilenetv1:()=>mn,tf:()=>Ca,tinyFaceDetector:()=>ma,tinyYolov2:()=>pa,toNetInput:()=>C,utils:()=>Or,validateConfig:()=>lo,version:()=>Ia});module.exports=yn(Na);var Ca=v(x());var io={};Ar(io,{AnchorPosition:()=>Kr,DrawBox:()=>Le,DrawBoxOptions:()=>sr,DrawFaceLandmarks:()=>_r,DrawFaceLandmarksOptions:()=>yr,DrawTextField:()=>gt,DrawTextFieldOptions:()=>fe,drawContour:()=>dt,drawDetections:()=>Ln,drawFaceExpressions:()=>Rn,drawFaceLandmarks:()=>On});function dt(o,t,e=!1){if(o.beginPath(),t.slice(1).forEach(({x:r,y:n},a)=>{let s=t[a];o.moveTo(s.x,s.y),o.lineTo(r,n)}),e){let r=t[t.length-1],n=t[0];if(!r||!n)return;o.moveTo(r.x,r.y),o.lineTo(n.x,n.y)}o.stroke()}var Or={};Ar(Or,{computeReshapedDimensions:()=>$r,getCenterPoint:()=>zt,isDimensions:()=>nr,isEven:()=>or,isFloat:()=>Rr,isTensor:()=>Ot,isTensor1D:()=>Fn,isTensor2D:()=>Br,isTensor3D:()=>ht,isTensor4D:()=>U,isValidNumber:()=>et,isValidProbablitiy:()=>me,range:()=>it,round:()=>Ht});var wo=v(x());var k=class{constructor(t,e){if(!et(t)||!et(e))throw new Error(`Dimensions.constructor - expected width and height to be valid numbers, instead have ${JSON.stringify({width:t,height:e})}`);this._width=t,this._height=e}get width(){return this._width}get height(){return this._height}reverse(){return new k(1/this.width,1/this.height)}};function Ot(o,t){return o instanceof wo.Tensor&&o.shape.length===t}function Fn(o){return Ot(o,1)}function Br(o){return Ot(o,2)}function ht(o){return Ot(o,3)}function U(o){return Ot(o,4)}function Rr(o){return o%1!==0}function or(o){return o%2===0}function Ht(o,t=2){let e=10**t;return Math.floor(o*e)/e}function nr(o){return o&&o.width&&o.height}function $r({width:o,height:t},e){let r=e/Math.max(t,o);return new k(Math.round(o*r),Math.round(t*r))}function zt(o){return o.reduce((t,e)=>t.add(e),new b(0,0)).div(new b(o.length,o.length))}function it(o,t,e){return Array(o).fill(0).map((r,n)=>t+n*e)}function et(o){return!!o&&o!==1/0&&o!==-1/0&&!Number.isNaN(o)||o===0}function me(o){return et(o)&&o>=0&&o<=1}var b=class{constructor(t,e){this._x=t,this._y=e}get x(){return this._x}get y(){return this._y}add(t){return new b(this.x+t.x,this.y+t.y)}sub(t){return new b(this.x-t.x,this.y-t.y)}mul(t){return new b(this.x*t.x,this.y*t.y)}div(t){return new b(this.x/t.x,this.y/t.y)}abs(){return new b(Math.abs(this.x),Math.abs(this.y))}magnitude(){return Math.sqrt(this.x**2+this.y**2)}floor(){return new b(Math.floor(this.x),Math.floor(this.y))}};var F=class{static isRect(t){return!!t&&[t.x,t.y,t.width,t.height].every(et)}static assertIsValidBox(t,e,r=!1){if(!F.isRect(t))throw new Error(`${e} - invalid box: ${JSON.stringify(t)}, expected object with properties x, y, width, height`);if(!r&&(t.width<0||t.height<0))throw new Error(`${e} - width (${t.width}) and height (${t.height}) must be positive numbers`)}constructor(t,e=!0){let r=t||{},n=[r.left,r.top,r.right,r.bottom].every(et),a=[r.x,r.y,r.width,r.height].every(et);if(!a&&!n)throw new Error(`Box.constructor - expected box to be IBoundingBox | IRect, instead have ${JSON.stringify(r)}`);let[s,i,c,m]=a?[r.x,r.y,r.width,r.height]:[r.left,r.top,r.right-r.left,r.bottom-r.top];F.assertIsValidBox({x:s,y:i,width:c,height:m},"Box.constructor",e),this._x=s,this._y=i,this._width=c,this._height=m}get x(){return this._x}get y(){return this._y}get width(){return this._width}get height(){return this._height}get left(){return this.x}get top(){return this.y}get right(){return this.x+this.width}get bottom(){return this.y+this.height}get area(){return this.width*this.height}get topLeft(){return new b(this.left,this.top)}get topRight(){return new b(this.right,this.top)}get bottomLeft(){return new b(this.left,this.bottom)}get bottomRight(){return new b(this.right,this.bottom)}round(){let[t,e,r,n]=[this.x,this.y,this.width,this.height].map(a=>Math.round(a));return new F({x:t,y:e,width:r,height:n})}floor(){let[t,e,r,n]=[this.x,this.y,this.width,this.height].map(a=>Math.floor(a));return new F({x:t,y:e,width:r,height:n})}toSquare(){let{x:t,y:e,width:r,height:n}=this,a=Math.abs(r-n);return re&&(i=-u+e+r,u=e),f>t&&(c=-f+t+n,f=t),m<1&&(c=2-m,m=1),p<1&&(c=2-p,p=1),{dy:s,edy:c,dx:a,edx:i,y:p,ey:f,x:m,ex:u,w:r,h:n}}calibrate(t){return new F({left:this.left+t.left*this.width,top:this.top+t.top*this.height,right:this.right+t.right*this.width,bottom:this.bottom+t.bottom*this.height}).toSquare().round()}};var Vt=class extends F{constructor(t,e,r,n,a=!1){super({left:t,top:e,right:r,bottom:n},a)}};var bt=class{constructor(t,e,r,n,a){this._imageDims=new k(a.width,a.height),this._score=t,this._classScore=e,this._className=r,this._box=new F(n).rescale(this._imageDims)}get score(){return this._score}get classScore(){return this._classScore}get className(){return this._className}get box(){return this._box}get imageDims(){return this._imageDims}get imageWidth(){return this.imageDims.width}get imageHeight(){return this.imageDims.height}get relativeBox(){return new F(this._box).rescale(this.imageDims.reverse())}forSize(t,e){return new bt(this.score,this.classScore,this.className,this.relativeBox,{width:t,height:e})}};var M=class extends bt{constructor(t,e,r){super(t,t,"",e,r)}forSize(t,e){let{score:r,relativeBox:n,imageDims:a}=super.forSize(t,e);return new M(r,n,a)}};function Hr(o,t,e=!0){let r=Math.max(0,Math.min(o.right,t.right)-Math.max(o.left,t.left)),n=Math.max(0,Math.min(o.bottom,t.bottom)-Math.max(o.top,t.top)),a=r*n;return e?a/(o.area+t.area-a):a/Math.min(o.area,t.area)}function zr(o){let t=o.map(i=>i.x),e=o.map(i=>i.y),r=t.reduce((i,c)=>ccii({score:s,boxIndex:i})).sort((s,i)=>s.score-i.score).map(s=>s.boxIndex),a=[];for(;n.length>0;){let s=n.pop();a.push(s);let i=n,c=[];for(let m=0;mc[p]<=e)}return a}var ct=v(x());function rt(o,t){return ct.tidy(()=>{let[e,r,n]=t,a=ct.fill([...o.shape.slice(0,3),1],e,"float32"),s=ct.fill([...o.shape.slice(0,3),1],r,"float32"),i=ct.fill([...o.shape.slice(0,3),1],n,"float32"),c=ct.concat([a,s,i],3);return ct.sub(o,c)})}var Ct=v(x());function Yr(o,t=!1){return Ct.tidy(()=>{let[e,r]=o.shape.slice(1);if(e===r)return o;let n=Math.abs(e-r),a=Math.round(n*(t?.5:1)),s=e>r?2:1,i=f=>{let l=o.shape.slice();return l[s]=f,Ct.fill(l,0,"float32")},c=i(a),m=n-c.shape[s],u=[t&&m?i(m):null,o,c].filter(f=>!!f).map(f=>Ct.cast(f,"float32"));return Ct.concat(u,s)})}function Dn(o){let t=o.slice();for(let e=t.length-1;e>0;e--){let r=Math.floor(Math.random()*(e+1)),n=t[e];t[e]=t[r],t[r]=n}return t}function Ne(o){return 1/(1+Math.exp(-o))}function En(o){return Math.log(o/(1-o))}var Yt=class extends F{constructor(t,e,r,n,a=!1){super({x:t,y:e,width:r,height:n},a)}};var Mn=.5,Cn=.43,In=.45,z=class{constructor(t,e,r=new b(0,0)){let{width:n,height:a}=e;this._imgDims=new k(n,a),this._shift=r,this._positions=t.map(s=>s.mul(new b(n,a)).add(r))}get shift(){return new b(this._shift.x,this._shift.y)}get imageWidth(){return this._imgDims.width}get imageHeight(){return this._imgDims.height}get positions(){return this._positions}get relativePositions(){return this._positions.map(t=>t.sub(this._shift).div(new b(this.imageWidth,this.imageHeight)))}forSize(t,e){return new this.constructor(this.relativePositions,{width:t,height:e})}shiftBy(t,e){return new this.constructor(this.relativePositions,this._imgDims,new b(t,e))}shiftByPoint(t){return this.shiftBy(t.x,t.y)}align(t,e={}){if(t){let a=t instanceof M?t.box.floor():new F(t);return this.shiftBy(a.x,a.y).align(null,e)}let{useDlibAlignment:r,minBoxPadding:n}={useDlibAlignment:!1,minBoxPadding:.2,...e};return r?this.alignDlib():this.alignMinBbox(n)}alignDlib(){let t=this.getRefPointsForAlignment(),[e,r,n]=t,a=u=>n.sub(u).magnitude(),s=(a(e)+a(r))/2,i=Math.floor(s/In),c=zt(t),m=Math.floor(Math.max(0,c.x-Mn*i)),p=Math.floor(Math.max(0,c.y-Cn*i));return new Yt(m,p,Math.min(i,this.imageWidth+m),Math.min(i,this.imageHeight+p))}alignMinBbox(t){let e=zr(this.positions);return e.pad(e.width*t,e.height*t)}getRefPointsForAlignment(){throw new Error("getRefPointsForAlignment not implemented by base class")}};var Gr=class extends z{getRefPointsForAlignment(){let t=this.positions;return[t[0],t[1],zt([t[3],t[4]])]}};var Gt=class extends z{getJawOutline(){return this.positions.slice(0,17)}getLeftEyeBrow(){return this.positions.slice(17,22)}getRightEyeBrow(){return this.positions.slice(22,27)}getNose(){return this.positions.slice(27,36)}getLeftEye(){return this.positions.slice(36,42)}getRightEye(){return this.positions.slice(42,48)}getMouth(){return this.positions.slice(48,68)}getRefPointsForAlignment(){return[this.getLeftEye(),this.getRightEye(),this.getMouth()].map(zt)}};var pe=class{constructor(t,e){this._label=t,this._distance=e}get label(){return this._label}get distance(){return this._distance}toString(t=!0){return`${this.label}${t?` (${Ht(this.distance)})`:""}`}};var ue=class extends F{constructor(e,r){super(e);this._label=r}static assertIsValidLabeledBox(e,r){if(F.assertIsValidBox(e,r),!et(e.label))throw new Error(`${r} - expected property label (${e.label}) to be a number`)}get label(){return this._label}};var mt=class{constructor(t,e){if(typeof t!="string")throw new Error("LabeledFaceDescriptors - constructor expected label to be a string");if(!Array.isArray(e)||e.some(r=>!(r instanceof Float32Array)))throw new Error("LabeledFaceDescriptors - constructor expected descriptors to be an array of Float32Array");this._label=t,this._descriptors=e}get label(){return this._label}get descriptors(){return this._descriptors}toJSON(){return{label:this.label,descriptors:this.descriptors.map(t=>Array.from(t))}}static fromJSON(t){let e=t.descriptors.map(r=>new Float32Array(r));return new mt(t.label,e)}};var jr=class extends ue{constructor(e,r,n,a){super(e,r);this._score=n,this._classScore=a}static assertIsValidPredictedBox(e,r){if(ue.assertIsValidLabeledBox(e,r),!me(e.score)||!me(e.classScore))throw new Error(`${r} - expected properties score (${e.score}) and (${e.classScore}) to be a number between [0, 1]`)}get score(){return this._score}get classScore(){return this._classScore}};function pt(o){return o.detection instanceof M}function jt(o,t){return{...o,...{detection:t}}}function Ur(){let o=window.fetch;if(!o)throw new Error("fetch - missing fetch implementation for browser environment");return{Canvas:HTMLCanvasElement,CanvasRenderingContext2D,Image:HTMLImageElement,ImageData,Video:HTMLVideoElement,createCanvasElement:()=>document.createElement("canvas"),createImageElement:()=>document.createElement("img"),createVideoElement:()=>document.createElement("video"),fetch:o,readFile:()=>{throw new Error("readFile - filesystem not available for browser environment")}}}function Se(){return typeof global=="object"&&typeof process!="undefined"&&process.versions!=null&&process.versions.node!=null}function ar(o){let t="";if(!o&&Se())try{o=require("fs")}catch(r){t=r.toString()}return{readFile:o?r=>new Promise((n,a)=>{o.readFile(r,(s,i)=>s?a(s):n(i))}):()=>{throw new Error(`readFile - failed to require fs in nodejs environment with error: ${t}`)}}}function Xr(){let o=global.Canvas||global.HTMLCanvasElement,t=global.Image||global.HTMLImageElement,e=global.Video||global.HTMLVideoElement,r=()=>{if(o)return new o;throw new Error("createCanvasElement - missing Canvas implementation for nodejs environment")},n=()=>{if(t)return new t;throw new Error("createImageElement - missing Image implementation for nodejs environment")},a=()=>{if(e)return new e;throw new Error("createVideoElement - missing Video implementation for nodejs environment")},s=global.fetch,i=ar();return{Canvas:o||class{},CanvasRenderingContext2D:global.CanvasRenderingContext2D||class{},Image:t||class{},ImageData:global.ImageData||class{},Video:global.HTMLVideoElement||class{},createCanvasElement:r,createImageElement:n,createVideoElement:a,fetch:s,...i}}function Jr(){return typeof window=="object"&&typeof document!="undefined"&&typeof HTMLImageElement!="undefined"&&typeof HTMLCanvasElement!="undefined"&&typeof HTMLVideoElement!="undefined"&&typeof ImageData!="undefined"&&typeof CanvasRenderingContext2D!="undefined"}var L;function Nn(){if(!L)throw new Error("getEnv - environment is not defined, check isNodejs() and isBrowser()");return L}function qr(o){L=o}function Zr(){return Jr()?qr(Ur()):Se()?qr(Xr()):null}function Sn(o){if(L||Zr(),!L)throw new Error("monkeyPatch - environment is not defined, check isNodejs() and isBrowser()");let{Canvas:t=L.Canvas,Image:e=L.Image}=o;L.Canvas=t,L.Image=e,L.createCanvasElement=o.createCanvasElement||(()=>new t),L.createImageElement=o.createImageElement||(()=>new e),L.ImageData=o.ImageData||L.ImageData,L.Video=o.Video||L.Video,L.fetch=o.fetch||L.fetch,L.readFile=o.readFile||L.readFile}var P={getEnv:Nn,setEnv:qr,initialize:Zr,createBrowserEnv:Ur,createFileSystem:ar,createNodejsEnv:Xr,monkeyPatch:Sn,isBrowser:Jr,isNodejs:Se};Zr();function Ut(o){return!P.isNodejs()&&typeof o=="string"?document.getElementById(o):o}function O(o){let{Canvas:t,CanvasRenderingContext2D:e}=P.getEnv();if(o instanceof e)return o;let r=Ut(o);if(!(r instanceof t))throw new Error("resolveContext2d - expected canvas to be of instance of Canvas");let n=r.getContext("2d");if(!n)throw new Error("resolveContext2d - canvas 2d context is null");return n}var Kr=(n=>(n.TOP_LEFT="TOP_LEFT",n.TOP_RIGHT="TOP_RIGHT",n.BOTTOM_LEFT="BOTTOM_LEFT",n.BOTTOM_RIGHT="BOTTOM_RIGHT",n))(Kr||{}),fe=class{constructor(t={}){let{anchorPosition:e,backgroundColor:r,fontColor:n,fontSize:a,fontStyle:s,padding:i}=t;this.anchorPosition=e||"TOP_LEFT",this.backgroundColor=r||"rgba(0, 0, 0, 0.5)",this.fontColor=n||"rgba(255, 255, 255, 1)",this.fontSize=a||14,this.fontStyle=s||"Georgia",this.padding=i||4}},gt=class{constructor(t,e,r={}){this.text=typeof t=="string"?[t]:t instanceof gt?t.text:t,this.anchor=e,this.options=new fe(r)}measureWidth(t){let{padding:e}=this.options;return this.text.map(r=>t.measureText(r).width).reduce((r,n)=>r{let g=c+u.x,T=c+u.y+(l+1)*s;r.fillText(f,g,T)})}};var sr=class{constructor(t={}){let{boxColor:e,lineWidth:r,label:n,drawLabelOptions:a}=t;this.boxColor=e||"rgba(0, 0, 255, 1)",this.lineWidth=r||2,this.label=n;let s={anchorPosition:"BOTTOM_LEFT",backgroundColor:this.boxColor};this.drawLabelOptions=new fe({...s,...a})}},Le=class{constructor(t,e={}){this.box=new F(t),this.options=new sr(e)}draw(t){let e=O(t),{boxColor:r,lineWidth:n}=this.options,{x:a,y:s,width:i,height:c}=this.box;e.strokeStyle=r,e.lineWidth=n,e.strokeRect(a,s,i,c);let{label:m}=this.options;m&&new gt([m],{x:a-n/2,y:s},this.options.drawLabelOptions).draw(t)}};function Ln(o,t){(Array.isArray(t)?t:[t]).forEach(r=>{let n=r instanceof M?r.score:pt(r)?r.detection.score:void 0,a=r instanceof M?r.box:pt(r)?r.detection.box:new F(r),s=n?`${Ht(n)}`:void 0;new Le(a,{label:s}).draw(o)})}var Pe=v(x());function Ae(o){let{Image:t,Video:e}=P.getEnv();return o instanceof t&&o.complete||o instanceof e&&o.readyState>=3}function Qr(o){return new Promise((t,e)=>{(o instanceof P.getEnv().Canvas||Ae(o))&&t(null);function r(a){!a.currentTarget||(a.currentTarget.removeEventListener("load",n),a.currentTarget.removeEventListener("error",r),e(a))}function n(a){!a.currentTarget||(a.currentTarget.removeEventListener("load",n),a.currentTarget.removeEventListener("error",r),t(a))}o.addEventListener("load",n),o.addEventListener("error",r)})}function to(o){return new Promise((t,e)=>{o instanceof Blob||e(new Error("bufferToImage - expected buf to be of type: Blob"));let r=new FileReader;r.onload=()=>{typeof r.result!="string"&&e(new Error("bufferToImage - expected reader.result to be a string, in onload"));let n=P.getEnv().createImageElement();n.onload=()=>t(n),n.onerror=e,n.src=r.result},r.onerror=e,r.readAsDataURL(o)})}function Xt(o){let{Image:t,Video:e}=P.getEnv();return o instanceof t?new k(o.naturalWidth,o.naturalHeight):o instanceof e?new k(o.videoWidth,o.videoHeight):new k(o.width,o.height)}function Jt({width:o,height:t}){let{createCanvasElement:e}=P.getEnv(),r=e();return r.width=o,r.height=t,r}function We(o,t){let{ImageData:e}=P.getEnv();if(!(o instanceof e)&&!Ae(o))throw new Error("createCanvasFromMedia - media has not finished loading yet");let{width:r,height:n}=t||Xt(o),a=Jt({width:r,height:n});return o instanceof e?O(a).putImageData(o,0,0):O(a).drawImage(o,0,0,r,n),a}var ir=v(x());async function eo(o,t){let e=t||P.getEnv().createCanvasElement(),[r,n,a]=o.shape.slice(U(o)?1:0),s=ir.tidy(()=>o.as3D(r,n,a).toInt());return await ir.browser.toPixels(s,e),s.dispose(),e}function cr(o){let{Image:t,Canvas:e,Video:r}=P.getEnv();return o instanceof t||o instanceof e||o instanceof r}var V=v(x());function ro(o,t,e=!1){let{Image:r,Canvas:n}=P.getEnv();if(!(o instanceof r||o instanceof n))throw new Error("imageToSquare - expected arg0 to be HTMLImageElement | HTMLCanvasElement");if(t<=0)return Jt({width:1,height:1});let a=Xt(o),s=t/Math.max(a.height,a.width),i=s*a.width,c=s*a.height,m=Jt({width:t,height:t}),p=o instanceof n?o:We(o),u=Math.abs(i-c)/2,f=e&&i0&&p.height>0&&O(m).drawImage(p,f,l,i,c),m}var ut=class{constructor(t,e=!1){this._imageTensors=[];this._canvases=[];this._treatAsBatchInput=!1;this._inputDimensions=[];this._inputSize=0;if(!Array.isArray(t))throw new Error(`NetInput.constructor - expected inputs to be an Array of TResolvedNetInput or to be instanceof tf.Tensor4D, instead have ${t}`);this._treatAsBatchInput=e,this._batchSize=t.length,t.forEach((r,n)=>{if(ht(r)){this._imageTensors[n]=r,this._inputDimensions[n]=r.shape;return}if(U(r)){let s=r.shape[0];if(s!==1)throw new Error(`NetInput - tf.Tensor4D with batchSize ${s} passed, but not supported in input array`);this._imageTensors[n]=r,this._inputDimensions[n]=r.shape.slice(1);return}let a=r instanceof P.getEnv().Canvas?r:We(r);this._canvases[n]=a,this._inputDimensions[n]=[a.height,a.width,3]})}get imageTensors(){return this._imageTensors}get canvases(){return this._canvases}get isBatchInput(){return this.batchSize>1||this._treatAsBatchInput}get batchSize(){return this._batchSize}get inputDimensions(){return this._inputDimensions}get inputSize(){return this._inputSize}get reshapedInputDimensions(){return it(this.batchSize,0,1).map((t,e)=>this.getReshapedInputDimensions(e))}getInput(t){return this.canvases[t]||this.imageTensors[t]}getInputDimensions(t){return this._inputDimensions[t]}getInputHeight(t){return this._inputDimensions[t][0]}getInputWidth(t){return this._inputDimensions[t][1]}getReshapedInputDimensions(t){if(typeof this.inputSize!="number")throw new Error("getReshapedInputDimensions - inputSize not set, toBatchTensor has not been called yet");let e=this.getInputWidth(t),r=this.getInputHeight(t);return $r({width:e,height:r},this.inputSize)}toBatchTensor(t,e=!0){return this._inputSize=t,V.tidy(()=>{let r=it(this.batchSize,0,1).map(a=>{let s=this.getInput(a);if(s instanceof V.Tensor){let i=U(s)?s:V.expandDims(s);return i=Yr(i,e),(i.shape[1]!==t||i.shape[2]!==t)&&(i=V.image.resizeBilinear(i,[t,t],!1,!1)),i.as3D(t,t,3)}if(s instanceof P.getEnv().Canvas)return V.browser.fromPixels(ro(s,t,e));throw new Error(`toBatchTensor - at batchIdx ${a}, expected input to be instanceof tf.Tensor or instanceof HTMLCanvasElement, instead have ${s}`)});return V.stack(r.map(a=>V.cast(a,"float32"))).as4D(this.batchSize,t,t,3)})}};async function C(o){if(o instanceof ut)return o;let t=Array.isArray(o)?o:[o];if(!t.length)throw new Error("toNetInput - empty array passed as input");let e=n=>Array.isArray(o)?` at input index ${n}:`:"",r=t.map(Ut);return r.forEach((n,a)=>{if(!cr(n)&&!ht(n)&&!U(n))throw typeof t[a]=="string"?new Error(`toNetInput -${e(a)} string passed, but could not resolve HTMLElement for element id ${t[a]}`):new Error(`toNetInput -${e(a)} expected media to be of type HTMLImageElement | HTMLVideoElement | HTMLCanvasElement | tf.Tensor3D, or to be an element id`);if(U(n)){let s=n.shape[0];if(s!==1)throw new Error(`toNetInput -${e(a)} tf.Tensor4D with batchSize ${s} passed, but not supported in input array`)}}),await Promise.all(r.map(n=>cr(n)&&Qr(n))),new ut(r,Array.isArray(o))}async function le(o,t){let{Canvas:e}=P.getEnv(),r=o;if(!(o instanceof e)){let s=await C(o);if(s.batchSize>1)throw new Error("extractFaces - batchSize > 1 not supported");let i=s.getInput(0);r=i instanceof e?i:await eo(i)}let n=O(r);return t.map(s=>s instanceof M?s.forSize(r.width,r.height).box.floor():s).map(s=>s.clipAtImageBorders(r.width,r.height)).map(({x:s,y:i,width:c,height:m})=>{let p=Jt({width:c,height:m});return c>0&&m>0&&O(p).putImageData(n.getImageData(s,i,c,m),0,0),p})}var mr=v(x());async function de(o,t){if(!ht(o)&&!U(o))throw new Error("extractFaceTensors - expected image tensor to be 3D or 4D");if(U(o)&&o.shape[0]>1)throw new Error("extractFaceTensors - batchSize > 1 not supported");return mr.tidy(()=>{let[e,r,n]=o.shape.slice(U(o)?1:0);return t.map(i=>i instanceof M?i.forSize(r,e).box:i).map(i=>i.clipAtImageBorders(r,e)).filter(i=>i.width>0&&i.height>0).map(({x:i,y:c,width:m,height:p})=>mr.slice3d(o.as3D(e,r,n),[c,i,0],[p,m,n]))})}async function xt(o,t){let{fetch:e}=P.getEnv(),r=await e(o,t);if(!(r.status<400))throw new Error(`failed to fetch: (${r.status}) ${r.statusText}, from url: ${r.url}`);return r}async function An(o){let t=await xt(o),e=await t.blob();if(!e.type.startsWith("image/"))throw new Error(`fetchImage - expected blob type to be of type image/*, instead have: ${e.type}, for url: ${t.url}`);return to(e)}async function oo(o){return(await xt(o)).json()}async function Wn(o){return new Float32Array(await(await xt(o)).arrayBuffer())}function Fo(o){return new Promise((t,e)=>{o instanceof Blob||e(new Error("bufferToVideo - expected buf to be of type: Blob"));let r=P.getEnv().createVideoElement();r.oncanplay=()=>t(r),r.onerror=e,r.playsInline=!0,r.muted=!0,r.src=URL.createObjectURL(o),r.play()})}async function kn(o){let t=await xt(o),e=await t.blob();if(!e.type.startsWith("video/"))throw new Error(`fetchVideo - expected blob type to be of type video/*, instead have: ${e.type}, for url: ${t.url}`);return Fo(e)}var Do=v(x());function pr(o,t){let e=`${t}-weights_manifest.json`;if(!o)return{modelBaseUri:"",manifestUri:e};if(o==="/")return{modelBaseUri:"/",manifestUri:`/${e}`};let r=o.startsWith("http://")?"http://":o.startsWith("https://")?"https://":"";o=o.replace(r,"");let n=o.split("/").filter(i=>i),a=o.endsWith(".json")?n[n.length-1]:e,s=r+(o.endsWith(".json")?n.slice(0,n.length-1):n).join("/");return s=o.startsWith("/")?`/${s}`:s,{modelBaseUri:s,manifestUri:s==="/"?`/${a}`:`${s}/${a}`}}async function no(o,t){let{manifestUri:e,modelBaseUri:r}=pr(o,t),n=await oo(e);return Do.io.loadWeights(n,r)}function Bn(o,t,e=!1){let{width:r,height:n}=e?Xt(t):t;return o.width=r,o.height=n,{width:r,height:n}}var ye=v(x());var vt=v(x());var A=class{constructor(t){this._params=void 0;this._paramMappings=[];this._name=t}get params(){return this._params}get paramMappings(){return this._paramMappings}get isLoaded(){return!!this.params}getParamFromPath(t){let{obj:e,objProp:r}=this.traversePropertyPath(t);return e[r]}reassignParamFromPath(t,e){let{obj:r,objProp:n}=this.traversePropertyPath(t);r[n].dispose(),r[n]=e}getParamList(){return this._paramMappings.map(({paramPath:t})=>({path:t,tensor:this.getParamFromPath(t)}))}getTrainableParams(){return this.getParamList().filter(t=>t.tensor instanceof vt.Variable)}getFrozenParams(){return this.getParamList().filter(t=>!(t.tensor instanceof vt.Variable))}variable(){this.getFrozenParams().forEach(({path:t,tensor:e})=>{this.reassignParamFromPath(t,e.variable())})}freeze(){this.getTrainableParams().forEach(({path:t,tensor:e})=>{let r=vt.tensor(e.dataSync());e.dispose(),this.reassignParamFromPath(t,r)})}dispose(t=!0){this.getParamList().forEach(e=>{if(t&&e.tensor.isDisposed)throw new Error(`param tensor has already been disposed for path ${e.path}`);e.tensor.dispose()}),this._params=void 0}serializeParams(){return new Float32Array(this.getParamList().map(({tensor:t})=>Array.from(t.dataSync())).reduce((t,e)=>t.concat(e)))}async load(t){if(t instanceof Float32Array){this.extractWeights(t);return}await this.loadFromUri(t)}async loadFromUri(t){if(t&&typeof t!="string")throw new Error(`${this._name}.loadFromUri - expected model uri`);let e=await no(t,this.getDefaultModelName());this.loadFromWeightMap(e)}async loadFromDisk(t){if(t&&typeof t!="string")throw new Error(`${this._name}.loadFromDisk - expected model file path`);let{readFile:e}=P.getEnv(),{manifestUri:r,modelBaseUri:n}=pr(t,this.getDefaultModelName()),a=m=>Promise.all(m.map(p=>e(p).then(u=>u.buffer))),s=vt.io.weightsLoaderFactory(a),i=JSON.parse((await e(r)).toString()),c=await s(i,n);this.loadFromWeightMap(c)}loadFromWeightMap(t){let{paramMappings:e,params:r}=this.extractParamsFromWeightMap(t);this._paramMappings=e,this._params=r}extractWeights(t){let{paramMappings:e,params:r}=this.extractParams(t);this._paramMappings=e,this._params=r}traversePropertyPath(t){if(!this.params)throw new Error("traversePropertyPath - model has no loaded params");let e=t.split("/").reduce((a,s)=>{if(!a.nextObj.hasOwnProperty(s))throw new Error(`traversePropertyPath - object does not have property ${s}, for path ${t}`);return{obj:a.nextObj,objProp:s,nextObj:a.nextObj[s]}},{nextObj:this.params}),{obj:r,objProp:n}=e;if(!r||!n||!(r[n]instanceof vt.Tensor))throw new Error(`traversePropertyPath - parameter is not a tensor, for path ${t}`);return{obj:r,objProp:n}}};var I=v(x());var he=v(x());function H(o,t,e){return he.tidy(()=>{let r=he.separableConv2d(o,t.depthwise_filter,t.pointwise_filter,e,"same");return r=he.add(r,t.bias),r})}function ur(o,t,e=!1){return I.tidy(()=>{let r=I.relu(e?I.add(I.conv2d(o,t.conv0.filters,[2,2],"same"),t.conv0.bias):H(o,t.conv0,[2,2])),n=H(r,t.conv1,[1,1]),a=I.relu(I.add(r,n)),s=H(a,t.conv2,[1,1]);return I.relu(I.add(r,I.add(n,s)))})}function ke(o,t,e=!1,r=!0){return I.tidy(()=>{let n=I.relu(e?I.add(I.conv2d(o,t.conv0.filters,r?[2,2]:[1,1],"same"),t.conv0.bias):H(o,t.conv0,r?[2,2]:[1,1])),a=H(n,t.conv1,[1,1]),s=I.relu(I.add(n,a)),i=H(s,t.conv2,[1,1]),c=I.relu(I.add(n,I.add(a,i))),m=H(c,t.conv3,[1,1]);return I.relu(I.add(n,I.add(a,I.add(i,m))))})}var It=v(x());function qt(o,t,e="same",r=!1){return It.tidy(()=>{let n=It.add(It.conv2d(o,t.filters,[1,1],e),t.bias);return r?It.relu(n):n})}function B(o,t){Object.keys(o).forEach(e=>{t.some(r=>r.originalPath===e)||o[e].dispose()})}var fr=v(x());function be(o,t){return(e,r,n,a)=>{let s=fr.tensor4d(o(e*r*n*n),[n,n,e,r]),i=fr.tensor1d(o(r));return t.push({paramPath:`${a}/filters`},{paramPath:`${a}/bias`}),{filters:s,bias:i}}}var lr=v(x());function dr(o,t){return(e,r,n)=>{let a=lr.tensor2d(o(e*r),[e,r]),s=lr.tensor1d(o(r));return t.push({paramPath:`${n}/weights`},{paramPath:`${n}/bias`}),{weights:a,bias:s}}}var Re=v(x());var Be=class{constructor(t,e,r){this.depthwise_filter=t;this.pointwise_filter=e;this.bias=r}};function ge(o,t){return(e,r,n)=>{let a=Re.tensor4d(o(9*e),[3,3,e,1]),s=Re.tensor4d(o(e*r),[1,1,e,r]),i=Re.tensor1d(o(r));return t.push({paramPath:`${n}/depthwise_filter`},{paramPath:`${n}/pointwise_filter`},{paramPath:`${n}/bias`}),new Be(a,s,i)}}function xe(o){return t=>{let e=o(`${t}/depthwise_filter`,4),r=o(`${t}/pointwise_filter`,4),n=o(`${t}/bias`,1);return new Be(e,r,n)}}function Y(o,t){return(e,r,n)=>{let a=o[e];if(!Ot(a,r))throw new Error(`expected weightMap[${e}] to be a Tensor${r}D, instead have ${a}`);return t.push({originalPath:e,paramPath:n||e}),a}}function R(o){let t=o;function e(n){let a=t.slice(0,n);return t=t.slice(n),a}function r(){return t}return{extractWeights:e,getRemainingWeights:r}}function hr(o,t){let e=be(o,t),r=ge(o,t);function n(s,i,c,m=!1){let p=m?e(s,i,3,`${c}/conv0`):r(s,i,`${c}/conv0`),u=r(i,i,`${c}/conv1`),f=r(i,i,`${c}/conv2`);return{conv0:p,conv1:u,conv2:f}}function a(s,i,c,m=!1){let{conv0:p,conv1:u,conv2:f}=n(s,i,c,m),l=r(i,i,`${c}/conv3`);return{conv0:p,conv1:u,conv2:f,conv3:l}}return{extractDenseBlock3Params:n,extractDenseBlock4Params:a}}function Eo(o){let t=[],{extractWeights:e,getRemainingWeights:r}=R(o),{extractDenseBlock4Params:n}=hr(e,t),a=n(3,32,"dense0",!0),s=n(32,64,"dense1"),i=n(64,128,"dense2"),c=n(128,256,"dense3");if(r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{paramMappings:t,params:{dense0:a,dense1:s,dense2:i,dense3:c}}}function br(o){return t=>{let e=o(`${t}/filters`,4),r=o(`${t}/bias`,1);return{filters:e,bias:r}}}function gr(o,t){let e=Y(o,t),r=br(e),n=xe(e);function a(i,c=!1){let m=c?r(`${i}/conv0`):n(`${i}/conv0`),p=n(`${i}/conv1`),u=n(`${i}/conv2`);return{conv0:m,conv1:p,conv2:u}}function s(i,c=!1){let m=c?r(`${i}/conv0`):n(`${i}/conv0`),p=n(`${i}/conv1`),u=n(`${i}/conv2`),f=n(`${i}/conv3`);return{conv0:m,conv1:p,conv2:u,conv3:f}}return{extractDenseBlock3Params:a,extractDenseBlock4Params:s}}function Mo(o){let t=[],{extractDenseBlock4Params:e}=gr(o,t),r={dense0:e("dense0",!0),dense1:e("dense1"),dense2:e("dense2"),dense3:e("dense3")};return B(o,t),{params:r,paramMappings:t}}var ve=class extends A{constructor(){super("FaceFeatureExtractor")}forwardInput(t){let{params:e}=this;if(!e)throw new Error("FaceFeatureExtractor - load model before inference");return ye.tidy(()=>{let r=ye.cast(t.toBatchTensor(112,!0),"float32"),a=rt(r,[122.782,117.001,104.298]).div(255),s=ke(a,e.dense0,!0);return s=ke(s,e.dense1),s=ke(s,e.dense2),s=ke(s,e.dense3),s=ye.avgPool(s,[7,7],[2,2],"valid"),s})}async forward(t){return this.forwardInput(await C(t))}getDefaultModelName(){return"face_feature_extractor_model"}extractParamsFromWeightMap(t){return Mo(t)}extractParams(t){return Eo(t)}};var No=v(x());var _e=v(x());function $e(o,t){return _e.tidy(()=>_e.add(_e.matMul(o,t.weights),t.bias))}function Co(o,t,e){let r=[],{extractWeights:n,getRemainingWeights:a}=R(o),i=dr(n,r)(t,e,"fc");if(a().length!==0)throw new Error(`weights remaing after extract: ${a().length}`);return{paramMappings:r,params:{fc:i}}}function Io(o){let t=[],e=Y(o,t);function r(a){let s=e(`${a}/weights`,2),i=e(`${a}/bias`,1);return{weights:s,bias:i}}let n={fc:r("fc")};return B(o,t),{params:n,paramMappings:t}}function xr(o){let t={},e={};return Object.keys(o).forEach(r=>{let n=r.startsWith("fc")?e:t;n[r]=o[r]}),{featureExtractorMap:t,classifierMap:e}}var Te=class extends A{constructor(e,r){super(e);this._faceFeatureExtractor=r}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(e){let{params:r}=this;if(!r)throw new Error(`${this._name} - load model before inference`);return No.tidy(()=>{let n=e instanceof ut?this.faceFeatureExtractor.forwardInput(e):e;return $e(n.as2D(n.shape[0],-1),r.fc)})}dispose(e=!0){this.faceFeatureExtractor.dispose(e),super.dispose(e)}loadClassifierParams(e){let{params:r,paramMappings:n}=this.extractClassifierParams(e);this._params=r,this._paramMappings=n}extractClassifierParams(e){return Co(e,this.getClassifierChannelsIn(),this.getClassifierChannelsOut())}extractParamsFromWeightMap(e){let{featureExtractorMap:r,classifierMap:n}=xr(e);return this.faceFeatureExtractor.loadFromWeightMap(r),Io(n)}extractParams(e){let r=this.getClassifierChannelsIn(),n=this.getClassifierChannelsOut(),a=n*r+n,s=e.slice(0,e.length-a),i=e.slice(e.length-a);return this.faceFeatureExtractor.extractWeights(s),this.extractClassifierParams(i)}};var ao=["neutral","happy","sad","angry","fearful","disgusted","surprised"],yt=class{constructor(t){this.neutral=0;this.happy=0;this.sad=0;this.angry=0;this.fearful=0;this.disgusted=0;this.surprised=0;if(t.length!==7)throw new Error(`FaceExpressions.constructor - expected probabilities.length to be 7, have: ${t.length}`);ao.forEach((e,r)=>{this[e]=t[r]})}asSortedArray(){return ao.map(t=>({expression:t,probability:this[t]})).sort((t,e)=>e.probability-t.probability)}};var Oe=class extends Te{constructor(t=new ve){super("FaceExpressionNet",t)}forwardInput(t){return Pe.tidy(()=>Pe.softmax(this.runNet(t)))}async forward(t){return this.forwardInput(await C(t))}async predictExpressions(t){let e=await C(t),r=await this.forwardInput(e),n=await Promise.all(Pe.unstack(r).map(async s=>{let i=s.dataSync();return s.dispose(),i}));r.dispose();let a=n.map(s=>new yt(s));return e.isBatchInput?a:a[0]}getDefaultModelName(){return"face_expression_model"}getClassifierChannelsIn(){return 256}getClassifierChannelsOut(){return 7}};function so(o){return o.expressions instanceof yt}function vr(o,t){return{...o,...{expressions:t}}}function Rn(o,t,e=.1,r){(Array.isArray(t)?t:[t]).forEach(a=>{let s=a instanceof yt?a:so(a)?a.expressions:void 0;if(!s)throw new Error("drawFaceExpressions - expected faceExpressions to be FaceExpressions | WithFaceExpressions<{}> or array thereof");let c=s.asSortedArray().filter(u=>u.probability>e),m=pt(a)?a.detection.box.bottomLeft:r||new b(0,0);new gt(c.map(u=>`${u.expression} (${Ht(u.probability)})`),m).draw(o)})}function Zt(o){return pt(o)&&o.landmarks instanceof z&&o.unshiftedLandmarks instanceof z&&o.alignedRect instanceof M}function $n(o){let t=(i,c,m,p)=>Math.atan2(p-c,m-i)%Math.PI,e=i=>i*180/Math.PI,r={roll:void 0,pitch:void 0,yaw:void 0};if(!o||!o._positions||o._positions.length!==68)return r;let n=o._positions;r.roll=-t(n[36]._x,n[36]._y,n[45]._x,n[45]._y),r.pitch=t(0,Math.abs(n[0]._x-n[30]._x)/n[30]._x,Math.PI,Math.abs(n[16]._x-n[30]._x)/n[30]._x);let a=n.reduce((i,c)=>ii>c._y?i:c._y,-1/0);return r.yaw=Math.PI*(o._imgDims._height/(s-a)/1.4-1),r}function we(o,t){let{box:e}=o.detection,r=t.shiftBy(e.x,e.y),n=r.align(),{imageDims:a}=o.detection,s=new M(o.detection.score,n.rescale(a.reverse()),a),i=$n(t);return{...o,...{landmarks:r,unshiftedLandmarks:t,alignedRect:s,angle:i}}}var yr=class{constructor(t={}){let{drawLines:e=!0,drawPoints:r=!0,lineWidth:n,lineColor:a,pointSize:s,pointColor:i}=t;this.drawLines=e,this.drawPoints=r,this.lineWidth=n||1,this.pointSize=s||2,this.lineColor=a||"rgba(0, 255, 255, 1)",this.pointColor=i||"rgba(255, 0, 255, 1)"}},_r=class{constructor(t,e={}){this.faceLandmarks=t,this.options=new yr(e)}draw(t){let e=O(t),{drawLines:r,drawPoints:n,lineWidth:a,lineColor:s,pointSize:i,pointColor:c}=this.options;if(r&&this.faceLandmarks instanceof Gt&&(e.strokeStyle=s,e.lineWidth=a,dt(e,this.faceLandmarks.getJawOutline()),dt(e,this.faceLandmarks.getLeftEyeBrow()),dt(e,this.faceLandmarks.getRightEyeBrow()),dt(e,this.faceLandmarks.getNose()),dt(e,this.faceLandmarks.getLeftEye(),!0),dt(e,this.faceLandmarks.getRightEye(),!0),dt(e,this.faceLandmarks.getMouth(),!0)),n){e.strokeStyle=c,e.fillStyle=c;let m=p=>{e.beginPath(),e.arc(p.x,p.y,i,0,2*Math.PI),e.fill()};this.faceLandmarks.positions.forEach(m)}}};function On(o,t){(Array.isArray(t)?t:[t]).forEach(r=>{let n=r instanceof z?r:Zt(r)?r.landmarks:void 0;if(!n)throw new Error("drawFaceLandmarks - expected faceExpressions to be FaceLandmarks | WithFaceLandmarks> or array thereof");new _r(n).draw(o)})}var So="1.7.2";var ft=v(x());var S=v(x());function Vn(o,t){let e=be(o,t),r=ge(o,t);function n(s,i,c){let m=r(s,i,`${c}/separable_conv0`),p=r(i,i,`${c}/separable_conv1`),u=e(s,i,1,`${c}/expansion_conv`);return{separable_conv0:m,separable_conv1:p,expansion_conv:u}}function a(s,i){let c=r(s,s,`${i}/separable_conv0`),m=r(s,s,`${i}/separable_conv1`),p=r(s,s,`${i}/separable_conv2`);return{separable_conv0:c,separable_conv1:m,separable_conv2:p}}return{extractConvParams:e,extractSeparableConvParams:r,extractReductionBlockParams:n,extractMainBlockParams:a}}function Lo(o,t){let e=[],{extractWeights:r,getRemainingWeights:n}=R(o),{extractConvParams:a,extractSeparableConvParams:s,extractReductionBlockParams:i,extractMainBlockParams:c}=Vn(r,e),m=a(3,32,3,"entry_flow/conv_in"),p=i(32,64,"entry_flow/reduction_block_0"),u=i(64,128,"entry_flow/reduction_block_1"),f={conv_in:m,reduction_block_0:p,reduction_block_1:u},l={};it(t,0,1).forEach(h=>{l[`main_block_${h}`]=c(128,`middle_flow/main_block_${h}`)});let g=i(128,256,"exit_flow/reduction_block"),T=s(256,512,"exit_flow/separable_conv"),D={reduction_block:g,separable_conv:T};if(n().length!==0)throw new Error(`weights remaing after extract: ${n().length}`);return{paramMappings:e,params:{entry_flow:f,middle_flow:l,exit_flow:D}}}function Yn(o,t){let e=Y(o,t),r=br(e),n=xe(e);function a(i){let c=n(`${i}/separable_conv0`),m=n(`${i}/separable_conv1`),p=r(`${i}/expansion_conv`);return{separable_conv0:c,separable_conv1:m,expansion_conv:p}}function s(i){let c=n(`${i}/separable_conv0`),m=n(`${i}/separable_conv1`),p=n(`${i}/separable_conv2`);return{separable_conv0:c,separable_conv1:m,separable_conv2:p}}return{extractConvParams:r,extractSeparableConvParams:n,extractReductionBlockParams:a,extractMainBlockParams:s}}function Ao(o,t){let e=[],{extractConvParams:r,extractSeparableConvParams:n,extractReductionBlockParams:a,extractMainBlockParams:s}=Yn(o,e),i=r("entry_flow/conv_in"),c=a("entry_flow/reduction_block_0"),m=a("entry_flow/reduction_block_1"),p={conv_in:i,reduction_block_0:c,reduction_block_1:m},u={};it(t,0,1).forEach(T=>{u[`main_block_${T}`]=s(`middle_flow/main_block_${T}`)});let f=a("exit_flow/reduction_block"),l=n("exit_flow/separable_conv"),g={reduction_block:f,separable_conv:l};return B(o,e),{params:{entry_flow:p,middle_flow:u,exit_flow:g},paramMappings:e}}function Wo(o,t,e){return S.add(S.conv2d(o,t.filters,e,"same"),t.bias)}function co(o,t,e=!0){let r=e?S.relu(o):o;return r=H(r,t.separable_conv0,[1,1]),r=H(S.relu(r),t.separable_conv1,[1,1]),r=S.maxPool(r,[3,3],[2,2],"same"),r=S.add(r,Wo(o,t.expansion_conv,[2,2])),r}function Gn(o,t){let e=H(S.relu(o),t.separable_conv0,[1,1]);return e=H(S.relu(e),t.separable_conv1,[1,1]),e=H(S.relu(e),t.separable_conv2,[1,1]),e=S.add(e,o),e}var Tr=class extends A{constructor(e){super("TinyXception");this._numMainBlocks=e}forwardInput(e){let{params:r}=this;if(!r)throw new Error("TinyXception - load model before inference");return S.tidy(()=>{let n=S.cast(e.toBatchTensor(112,!0),"float32"),s=rt(n,[122.782,117.001,104.298]).div(255),i=S.relu(Wo(s,r.entry_flow.conv_in,[2,2]));return i=co(i,r.entry_flow.reduction_block_0,!1),i=co(i,r.entry_flow.reduction_block_1),it(this._numMainBlocks,0,1).forEach(c=>{i=Gn(i,r.middle_flow[`main_block_${c}`])}),i=co(i,r.exit_flow.reduction_block),i=S.relu(H(i,r.exit_flow.separable_conv,[1,1])),i})}async forward(e){return this.forwardInput(await C(e))}getDefaultModelName(){return"tiny_xception_model"}extractParamsFromWeightMap(e){return Ao(e,this._numMainBlocks)}extractParams(e){return Lo(e,this._numMainBlocks)}};function ko(o){let t=[],{extractWeights:e,getRemainingWeights:r}=R(o),n=dr(e,t),a=n(512,1,"fc/age"),s=n(512,2,"fc/gender");if(r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{paramMappings:t,params:{fc:{age:a,gender:s}}}}function Bo(o){let t=[],e=Y(o,t);function r(a){let s=e(`${a}/weights`,2),i=e(`${a}/bias`,1);return{weights:s,bias:i}}let n={fc:{age:r("fc/age"),gender:r("fc/gender")}};return B(o,t),{params:n,paramMappings:t}}var Pr=(e=>(e.FEMALE="female",e.MALE="male",e))(Pr||{});var He=class extends A{constructor(e=new Tr(2)){super("AgeGenderNet");this._faceFeatureExtractor=e}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(e){let{params:r}=this;if(!r)throw new Error(`${this._name} - load model before inference`);return ft.tidy(()=>{let n=e instanceof ut?this.faceFeatureExtractor.forwardInput(e):e,a=ft.avgPool(n,[7,7],[2,2],"valid").as2D(n.shape[0],-1),s=$e(a,r.fc.age).as1D(),i=$e(a,r.fc.gender);return{age:s,gender:i}})}forwardInput(e){return ft.tidy(()=>{let{age:r,gender:n}=this.runNet(e);return{age:r,gender:ft.softmax(n)}})}async forward(e){return this.forwardInput(await C(e))}async predictAgeAndGender(e){let r=await C(e),n=await this.forwardInput(r),a=ft.unstack(n.age),s=ft.unstack(n.gender),i=a.map((m,p)=>({ageTensor:m,genderTensor:s[p]})),c=await Promise.all(i.map(async({ageTensor:m,genderTensor:p})=>{let u=m.dataSync()[0],f=p.dataSync()[0],l=f>.5,g=l?"male":"female",T=l?f:1-f;return m.dispose(),p.dispose(),{age:u,gender:g,genderProbability:T}}));return n.age.dispose(),n.gender.dispose(),r.isBatchInput?c:c[0]}getDefaultModelName(){return"age_gender_model"}dispose(e=!0){this.faceFeatureExtractor.dispose(e),super.dispose(e)}loadClassifierParams(e){let{params:r,paramMappings:n}=this.extractClassifierParams(e);this._params=r,this._paramMappings=n}extractClassifierParams(e){return ko(e)}extractParamsFromWeightMap(e){let{featureExtractorMap:r,classifierMap:n}=xr(e);return this.faceFeatureExtractor.loadFromWeightMap(r),Bo(n)}extractParams(e){let n=e.slice(0,e.length-1539),a=e.slice(e.length-1539);return this.faceFeatureExtractor.extractWeights(n),this.extractClassifierParams(a)}};var G=v(x());var Fe=class extends Te{postProcess(t,e,r){let n=r.map(({width:s,height:i})=>{let c=e/Math.max(i,s);return{width:s*c,height:i*c}}),a=n.length;return G.tidy(()=>{let s=(u,f)=>G.stack([G.fill([68],u,"float32"),G.fill([68],f,"float32")],1).as2D(1,136).as1D(),i=(u,f)=>{let{width:l,height:g}=n[u];return f(l,g)?Math.abs(l-g)/2:0},c=u=>i(u,(f,l)=>fi(u,(f,l)=>ls(c(f),m(f))))).div(G.stack(Array.from(Array(a),(u,f)=>s(n[f].width,n[f].height))))})}forwardInput(t){return G.tidy(()=>{let e=this.runNet(t);return this.postProcess(e,t.inputSize,t.inputDimensions.map(([r,n])=>({height:r,width:n})))})}async forward(t){return this.forwardInput(await C(t))}async detectLandmarks(t){let e=await C(t),r=G.tidy(()=>G.unstack(this.forwardInput(e))),n=await Promise.all(r.map(async(a,s)=>{let i=Array.from(a.dataSync()),c=i.filter((p,u)=>or(u)),m=i.filter((p,u)=>!or(u));return new Gt(Array(68).fill(0).map((p,u)=>new b(c[u],m[u])),{height:e.getInputHeight(s),width:e.getInputWidth(s)})}));return r.forEach(a=>a.dispose()),e.isBatchInput?n:n[0]}getClassifierChannelsOut(){return 136}};var Kt=class extends Fe{constructor(t=new ve){super("FaceLandmark68Net",t)}getDefaultModelName(){return"face_landmark_68_model"}getClassifierChannelsIn(){return 256}};var De=v(x());function Ro(o){let t=[],{extractDenseBlock3Params:e}=gr(o,t),r={dense0:e("dense0",!0),dense1:e("dense1"),dense2:e("dense2")};return B(o,t),{params:r,paramMappings:t}}function $o(o){let t=[],{extractWeights:e,getRemainingWeights:r}=R(o),{extractDenseBlock3Params:n}=hr(e,t),a=n(3,32,"dense0",!0),s=n(32,64,"dense1"),i=n(64,128,"dense2");if(r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{paramMappings:t,params:{dense0:a,dense1:s,dense2:i}}}var wr=class extends A{constructor(){super("TinyFaceFeatureExtractor")}forwardInput(t){let{params:e}=this;if(!e)throw new Error("TinyFaceFeatureExtractor - load model before inference");return De.tidy(()=>{let r=De.cast(t.toBatchTensor(112,!0),"float32"),a=rt(r,[122.782,117.001,104.298]).div(255),s=ur(a,e.dense0,!0);return s=ur(s,e.dense1),s=ur(s,e.dense2),s=De.avgPool(s,[14,14],[2,2],"valid"),s})}async forward(t){return this.forwardInput(await C(t))}getDefaultModelName(){return"face_feature_extractor_tiny_model"}extractParamsFromWeightMap(t){return Ro(t)}extractParams(t){return $o(t)}};var ze=class extends Fe{constructor(t=new wr){super("FaceLandmark68TinyNet",t)}getDefaultModelName(){return"face_landmark_68_tiny_model"}getClassifierChannelsIn(){return 128}};var mo=class extends Kt{};var nt=v(x());var Ee=v(x());var Fr=v(x());function Oo(o,t){return Fr.add(Fr.mul(o,t.weights),t.biases)}function po(o,t,e,r,n="same"){let{filters:a,bias:s}=t.conv,i=Ee.conv2d(o,a,e,n);return i=Ee.add(i,s),i=Oo(i,t.scale),r?Ee.relu(i):i}function Ho(o,t){return po(o,t,[1,1],!0)}function uo(o,t){return po(o,t,[1,1],!1)}function Dr(o,t){return po(o,t,[2,2],!0,"valid")}var j=v(x());function jn(o,t){function e(i,c,m){let p=o(i),u=p.length/(c*m*m);if(Rr(u))throw new Error(`depth has to be an integer: ${u}, weights.length: ${p.length}, numFilters: ${c}, filterSize: ${m}`);return j.tidy(()=>j.transpose(j.tensor4d(p,[c,u,m,m]),[2,3,1,0]))}function r(i,c,m,p){let u=e(i,c,m),f=j.tensor1d(o(c));return t.push({paramPath:`${p}/filters`},{paramPath:`${p}/bias`}),{filters:u,bias:f}}function n(i,c){let m=j.tensor1d(o(i)),p=j.tensor1d(o(i));return t.push({paramPath:`${c}/weights`},{paramPath:`${c}/biases`}),{weights:m,biases:p}}function a(i,c,m,p){let u=r(i,c,m,`${p}/conv`),f=n(c,`${p}/scale`);return{conv:u,scale:f}}function s(i,c,m,p,u=!1){let f=a((u?.5:1)*i,c,m,`${p}/conv1`),l=a(i,c,m,`${p}/conv2`);return{conv1:f,conv2:l}}return{extractConvLayerParams:a,extractResidualLayerParams:s}}function zo(o){let{extractWeights:t,getRemainingWeights:e}=R(o),r=[],{extractConvLayerParams:n,extractResidualLayerParams:a}=jn(t,r),s=n(4704,32,7,"conv32_down"),i=a(9216,32,3,"conv32_1"),c=a(9216,32,3,"conv32_2"),m=a(9216,32,3,"conv32_3"),p=a(36864,64,3,"conv64_down",!0),u=a(36864,64,3,"conv64_1"),f=a(36864,64,3,"conv64_2"),l=a(36864,64,3,"conv64_3"),g=a(147456,128,3,"conv128_down",!0),T=a(147456,128,3,"conv128_1"),D=a(147456,128,3,"conv128_2"),h=a(589824,256,3,"conv256_down",!0),_=a(589824,256,3,"conv256_1"),y=a(589824,256,3,"conv256_2"),E=a(589824,256,3,"conv256_down_out"),W=j.tidy(()=>j.transpose(j.tensor2d(t(256*128),[128,256]),[1,0]));if(r.push({paramPath:"fc"}),e().length!==0)throw new Error(`weights remaing after extract: ${e().length}`);return{params:{conv32_down:s,conv32_1:i,conv32_2:c,conv32_3:m,conv64_down:p,conv64_1:u,conv64_2:f,conv64_3:l,conv128_down:g,conv128_1:T,conv128_2:D,conv256_down:h,conv256_1:_,conv256_2:y,conv256_down_out:E,fc:W},paramMappings:r}}function Un(o,t){let e=Y(o,t);function r(s){let i=e(`${s}/scale/weights`,1),c=e(`${s}/scale/biases`,1);return{weights:i,biases:c}}function n(s){let i=e(`${s}/conv/filters`,4),c=e(`${s}/conv/bias`,1),m=r(s);return{conv:{filters:i,bias:c},scale:m}}function a(s){return{conv1:n(`${s}/conv1`),conv2:n(`${s}/conv2`)}}return{extractConvLayerParams:n,extractResidualLayerParams:a}}function Vo(o){let t=[],{extractConvLayerParams:e,extractResidualLayerParams:r}=Un(o,t),n=e("conv32_down"),a=r("conv32_1"),s=r("conv32_2"),i=r("conv32_3"),c=r("conv64_down"),m=r("conv64_1"),p=r("conv64_2"),u=r("conv64_3"),f=r("conv128_down"),l=r("conv128_1"),g=r("conv128_2"),T=r("conv256_down"),D=r("conv256_1"),h=r("conv256_2"),_=r("conv256_down_out"),{fc:y}=o;if(t.push({originalPath:"fc",paramPath:"fc"}),!Br(y))throw new Error(`expected weightMap[fc] to be a Tensor2D, instead have ${y}`);let E={conv32_down:n,conv32_1:a,conv32_2:s,conv32_3:i,conv64_down:c,conv64_1:m,conv64_2:p,conv64_3:u,conv128_down:f,conv128_1:l,conv128_2:g,conv256_down:T,conv256_1:D,conv256_2:h,conv256_down_out:_,fc:y};return B(o,t),{params:E,paramMappings:t}}var $=v(x());function ot(o,t){let e=Ho(o,t.conv1);return e=uo(e,t.conv2),e=$.add(e,o),e=$.relu(e),e}function Ve(o,t){let e=Dr(o,t.conv1);e=uo(e,t.conv2);let r=$.avgPool(o,2,2,"valid"),n=$.zeros(r.shape),a=r.shape[3]!==e.shape[3];if(r.shape[1]!==e.shape[1]||r.shape[2]!==e.shape[2]){let i=[...e.shape];i[1]=1;let c=$.zeros(i);e=$.concat([e,c],1);let m=[...e.shape];m[2]=1;let p=$.zeros(m);e=$.concat([e,p],2)}return r=a?$.concat([r,n],3):r,e=$.add(r,e),e=$.relu(e),e}var Qt=class extends A{constructor(){super("FaceRecognitionNet")}forwardInput(t){let{params:e}=this;if(!e)throw new Error("FaceRecognitionNet - load model before inference");return nt.tidy(()=>{let r=nt.cast(t.toBatchTensor(150,!0),"float32"),a=rt(r,[122.782,117.001,104.298]).div(255),s=Dr(a,e.conv32_down);s=nt.maxPool(s,3,2,"valid"),s=ot(s,e.conv32_1),s=ot(s,e.conv32_2),s=ot(s,e.conv32_3),s=Ve(s,e.conv64_down),s=ot(s,e.conv64_1),s=ot(s,e.conv64_2),s=ot(s,e.conv64_3),s=Ve(s,e.conv128_down),s=ot(s,e.conv128_1),s=ot(s,e.conv128_2),s=Ve(s,e.conv256_down),s=ot(s,e.conv256_1),s=ot(s,e.conv256_2),s=Ve(s,e.conv256_down_out);let i=s.mean([1,2]);return nt.matMul(i,e.fc)})}async forward(t){return this.forwardInput(await C(t))}async computeFaceDescriptor(t){var a;if((a=t==null?void 0:t.shape)!=null&&a.some(s=>s<=0))return new Float32Array(128);let e=await C(t),r=nt.tidy(()=>nt.unstack(this.forwardInput(e))),n=await Promise.all(r.map(s=>s.data()));return r.forEach(s=>s.dispose()),e.isBatchInput?n:n[0]}getDefaultModelName(){return"face_recognition_model"}extractParamsFromWeightMap(t){return Vo(t)}extractParams(t){return zo(t)}};function Xn(o){let t=new Qt;return t.extractWeights(o),t}function Er(o,t){return{...o,...{descriptor:t}}}function Jn(o){return typeof o.age=="number"}function Mr(o,t){return{...o,...{age:t}}}function qn(o){return(o.gender==="male"||o.gender==="female")&&me(o.genderProbability)}function Cr(o,t,e){return{...o,...{gender:t,genderProbability:e}}}var Lt=v(x());var at=v(x());function Zn(o,t){function e(c,m){let p=at.tensor4d(o(9*c),[3,3,c,1]),u=at.tensor1d(o(c)),f=at.tensor1d(o(c)),l=at.tensor1d(o(c)),g=at.tensor1d(o(c));return t.push({paramPath:`${m}/filters`},{paramPath:`${m}/batch_norm_scale`},{paramPath:`${m}/batch_norm_offset`},{paramPath:`${m}/batch_norm_mean`},{paramPath:`${m}/batch_norm_variance`}),{filters:p,batch_norm_scale:u,batch_norm_offset:f,batch_norm_mean:l,batch_norm_variance:g}}function r(c,m,p,u,f){let l=at.tensor4d(o(c*m*p*p),[p,p,c,m]),g=at.tensor1d(o(m));return t.push({paramPath:`${u}/filters`},{paramPath:`${u}/${f?"batch_norm_offset":"bias"}`}),{filters:l,bias:g}}function n(c,m,p,u){let{filters:f,bias:l}=r(c,m,p,u,!0);return{filters:f,batch_norm_offset:l}}function a(c,m,p){let u=e(c,`${p}/depthwise_conv`),f=n(c,m,1,`${p}/pointwise_conv`);return{depthwise_conv:u,pointwise_conv:f}}function s(){let c=n(3,32,3,"mobilenetv1/conv_0"),m=a(32,64,"mobilenetv1/conv_1"),p=a(64,128,"mobilenetv1/conv_2"),u=a(128,128,"mobilenetv1/conv_3"),f=a(128,256,"mobilenetv1/conv_4"),l=a(256,256,"mobilenetv1/conv_5"),g=a(256,512,"mobilenetv1/conv_6"),T=a(512,512,"mobilenetv1/conv_7"),D=a(512,512,"mobilenetv1/conv_8"),h=a(512,512,"mobilenetv1/conv_9"),_=a(512,512,"mobilenetv1/conv_10"),y=a(512,512,"mobilenetv1/conv_11"),E=a(512,1024,"mobilenetv1/conv_12"),W=a(1024,1024,"mobilenetv1/conv_13");return{conv_0:c,conv_1:m,conv_2:p,conv_3:u,conv_4:f,conv_5:l,conv_6:g,conv_7:T,conv_8:D,conv_9:h,conv_10:_,conv_11:y,conv_12:E,conv_13:W}}function i(){let c=n(1024,256,1,"prediction_layer/conv_0"),m=n(256,512,3,"prediction_layer/conv_1"),p=n(512,128,1,"prediction_layer/conv_2"),u=n(128,256,3,"prediction_layer/conv_3"),f=n(256,128,1,"prediction_layer/conv_4"),l=n(128,256,3,"prediction_layer/conv_5"),g=n(256,64,1,"prediction_layer/conv_6"),T=n(64,128,3,"prediction_layer/conv_7"),D=r(512,12,1,"prediction_layer/box_predictor_0/box_encoding_predictor"),h=r(512,9,1,"prediction_layer/box_predictor_0/class_predictor"),_=r(1024,24,1,"prediction_layer/box_predictor_1/box_encoding_predictor"),y=r(1024,18,1,"prediction_layer/box_predictor_1/class_predictor"),E=r(512,24,1,"prediction_layer/box_predictor_2/box_encoding_predictor"),W=r(512,18,1,"prediction_layer/box_predictor_2/class_predictor"),tt=r(256,24,1,"prediction_layer/box_predictor_3/box_encoding_predictor"),lt=r(256,18,1,"prediction_layer/box_predictor_3/class_predictor"),q=r(256,24,1,"prediction_layer/box_predictor_4/box_encoding_predictor"),Dt=r(256,18,1,"prediction_layer/box_predictor_4/class_predictor"),Et=r(128,24,1,"prediction_layer/box_predictor_5/box_encoding_predictor"),Mt=r(128,18,1,"prediction_layer/box_predictor_5/class_predictor");return{conv_0:c,conv_1:m,conv_2:p,conv_3:u,conv_4:f,conv_5:l,conv_6:g,conv_7:T,box_predictor_0:{box_encoding_predictor:D,class_predictor:h},box_predictor_1:{box_encoding_predictor:_,class_predictor:y},box_predictor_2:{box_encoding_predictor:E,class_predictor:W},box_predictor_3:{box_encoding_predictor:tt,class_predictor:lt},box_predictor_4:{box_encoding_predictor:q,class_predictor:Dt},box_predictor_5:{box_encoding_predictor:Et,class_predictor:Mt}}}return{extractMobilenetV1Params:s,extractPredictionLayerParams:i}}function Yo(o){let t=[],{extractWeights:e,getRemainingWeights:r}=R(o),{extractMobilenetV1Params:n,extractPredictionLayerParams:a}=Zn(e,t),s=n(),i=a(),m={extra_dim:at.tensor3d(e(5118*4),[1,5118,4])};if(t.push({paramPath:"output_layer/extra_dim"}),r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{params:{mobilenetv1:s,prediction_layer:i,output_layer:m},paramMappings:t}}function Kn(o,t){let e=Y(o,t);function r(m,p,u){let f=e(`${m}/Conv2d_${p}_pointwise/weights`,4,`${u}/filters`),l=e(`${m}/Conv2d_${p}_pointwise/convolution_bn_offset`,1,`${u}/batch_norm_offset`);return{filters:f,batch_norm_offset:l}}function n(m){let p=`mobilenetv1/conv_${m}`,u=`MobilenetV1/Conv2d_${m}_depthwise`,f=`${p}/depthwise_conv`,l=`${p}/pointwise_conv`,g=e(`${u}/depthwise_weights`,4,`${f}/filters`),T=e(`${u}/BatchNorm/gamma`,1,`${f}/batch_norm_scale`),D=e(`${u}/BatchNorm/beta`,1,`${f}/batch_norm_offset`),h=e(`${u}/BatchNorm/moving_mean`,1,`${f}/batch_norm_mean`),_=e(`${u}/BatchNorm/moving_variance`,1,`${f}/batch_norm_variance`);return{depthwise_conv:{filters:g,batch_norm_scale:T,batch_norm_offset:D,batch_norm_mean:h,batch_norm_variance:_},pointwise_conv:r("MobilenetV1",m,l)}}function a(){return{conv_0:r("MobilenetV1",0,"mobilenetv1/conv_0"),conv_1:n(1),conv_2:n(2),conv_3:n(3),conv_4:n(4),conv_5:n(5),conv_6:n(6),conv_7:n(7),conv_8:n(8),conv_9:n(9),conv_10:n(10),conv_11:n(11),conv_12:n(12),conv_13:n(13)}}function s(m,p){let u=e(`${m}/weights`,4,`${p}/filters`),f=e(`${m}/biases`,1,`${p}/bias`);return{filters:u,bias:f}}function i(m){let p=s(`Prediction/BoxPredictor_${m}/BoxEncodingPredictor`,`prediction_layer/box_predictor_${m}/box_encoding_predictor`),u=s(`Prediction/BoxPredictor_${m}/ClassPredictor`,`prediction_layer/box_predictor_${m}/class_predictor`);return{box_encoding_predictor:p,class_predictor:u}}function c(){return{conv_0:r("Prediction",0,"prediction_layer/conv_0"),conv_1:r("Prediction",1,"prediction_layer/conv_1"),conv_2:r("Prediction",2,"prediction_layer/conv_2"),conv_3:r("Prediction",3,"prediction_layer/conv_3"),conv_4:r("Prediction",4,"prediction_layer/conv_4"),conv_5:r("Prediction",5,"prediction_layer/conv_5"),conv_6:r("Prediction",6,"prediction_layer/conv_6"),conv_7:r("Prediction",7,"prediction_layer/conv_7"),box_predictor_0:i(0),box_predictor_1:i(1),box_predictor_2:i(2),box_predictor_3:i(3),box_predictor_4:i(4),box_predictor_5:i(5)}}return{extractMobilenetV1Params:a,extractPredictionLayerParams:c}}function Go(o){let t=[],{extractMobilenetV1Params:e,extractPredictionLayerParams:r}=Kn(o,t),n=o["Output/extra_dim"];if(t.push({originalPath:"Output/extra_dim",paramPath:"output_layer/extra_dim"}),!ht(n))throw new Error(`expected weightMap['Output/extra_dim'] to be a Tensor3D, instead have ${n}`);let a={mobilenetv1:e(),prediction_layer:r(),output_layer:{extra_dim:n}};return B(o,t),{params:a,paramMappings:t}}var _t=v(x());var Nt=v(x());function Z(o,t,e){return Nt.tidy(()=>{let r=Nt.conv2d(o,t.filters,e,"same");return r=Nt.add(r,t.batch_norm_offset),Nt.clipByValue(r,0,6)})}var Qn=.0010000000474974513;function ta(o,t,e){return _t.tidy(()=>{let r=_t.depthwiseConv2d(o,t.filters,e,"same");return r=_t.batchNorm(r,t.batch_norm_mean,t.batch_norm_variance,t.batch_norm_offset,t.batch_norm_scale,Qn),_t.clipByValue(r,0,6)})}function ea(o){return[2,4,6,12].some(t=>t===o)?[2,2]:[1,1]}function jo(o,t){return _t.tidy(()=>{let e,r=Z(o,t.conv_0,[2,2]);if([t.conv_1,t.conv_2,t.conv_3,t.conv_4,t.conv_5,t.conv_6,t.conv_7,t.conv_8,t.conv_9,t.conv_10,t.conv_11,t.conv_12,t.conv_13].forEach((a,s)=>{let i=s+1,c=ea(i);r=ta(r,a.depthwise_conv,c),r=Z(r,a.pointwise_conv,[1,1]),i===11&&(e=r)}),e===null)throw new Error("mobileNetV1 - output of conv layer 11 is null");return{out:r,conv11:e}})}function ra(o,t,e){let r=o.arraySync(),n=Math.min(r[t][0],r[t][2]),a=Math.min(r[t][1],r[t][3]),s=Math.max(r[t][0],r[t][2]),i=Math.max(r[t][1],r[t][3]),c=Math.min(r[e][0],r[e][2]),m=Math.min(r[e][1],r[e][3]),p=Math.max(r[e][0],r[e][2]),u=Math.max(r[e][1],r[e][3]),f=(s-n)*(i-a),l=(p-c)*(u-m);if(f<=0||l<=0)return 0;let g=Math.max(n,c),T=Math.max(a,m),D=Math.min(s,p),h=Math.min(i,u),_=Math.max(D-g,0)*Math.max(h-T,0);return _/(f+l-_)}function Uo(o,t,e,r,n){let a=o.shape[0],s=Math.min(e,a),i=t.map((p,u)=>({score:p,boxIndex:u})).filter(p=>p.score>n).sort((p,u)=>u.score-p.score),c=p=>p<=r?1:0,m=[];return i.forEach(p=>{if(m.length>=s)return;let u=p.score;for(let f=m.length-1;f>=0;--f){let l=ra(o,p.boxIndex,m[f]);if(l!==0&&(p.score*=c(l),p.score<=n))break}u===p.score&&m.push(p.boxIndex)}),m}var d=v(x());function oa(o){let t=d.unstack(d.transpose(o,[1,0])),e=[d.sub(t[2],t[0]),d.sub(t[3],t[1])],r=[d.add(t[0],d.div(e[0],2)),d.add(t[1],d.div(e[1],2))];return{sizes:e,centers:r}}function na(o,t){let{sizes:e,centers:r}=oa(o),n=d.unstack(d.transpose(t,[1,0])),a=d.div(d.mul(d.exp(d.div(n[2],5)),e[0]),2),s=d.add(d.mul(d.div(n[0],10),e[0]),r[0]),i=d.div(d.mul(d.exp(d.div(n[3],5)),e[1]),2),c=d.add(d.mul(d.div(n[1],10),e[1]),r[1]);return d.transpose(d.stack([d.sub(s,a),d.sub(c,i),d.add(s,a),d.add(c,i)]),[1,0])}function Xo(o,t,e){return d.tidy(()=>{let r=o.shape[0],n=na(d.reshape(d.tile(e.extra_dim,[r,1,1]),[-1,4]),d.reshape(o,[-1,4]));n=d.reshape(n,[r,n.shape[0]/r,4]);let a=d.sigmoid(d.slice(t,[0,0,1],[-1,-1,-1])),s=d.slice(a,[0,0,0],[-1,-1,1]);s=d.reshape(s,[r,s.shape[1]]);let i=d.unstack(n),c=d.unstack(s);return{boxes:i,scores:c}})}var Ge=v(x());var Ye=v(x());function te(o,t){return Ye.tidy(()=>{let e=o.shape[0],r=Ye.reshape(qt(o,t.box_encoding_predictor),[e,-1,1,4]),n=Ye.reshape(qt(o,t.class_predictor),[e,-1,3]);return{boxPredictionEncoding:r,classPrediction:n}})}function Jo(o,t,e){return Ge.tidy(()=>{let r=Z(o,e.conv_0,[1,1]),n=Z(r,e.conv_1,[2,2]),a=Z(n,e.conv_2,[1,1]),s=Z(a,e.conv_3,[2,2]),i=Z(s,e.conv_4,[1,1]),c=Z(i,e.conv_5,[2,2]),m=Z(c,e.conv_6,[1,1]),p=Z(m,e.conv_7,[2,2]),u=te(t,e.box_predictor_0),f=te(o,e.box_predictor_1),l=te(n,e.box_predictor_2),g=te(s,e.box_predictor_3),T=te(c,e.box_predictor_4),D=te(p,e.box_predictor_5),h=Ge.concat([u.boxPredictionEncoding,f.boxPredictionEncoding,l.boxPredictionEncoding,g.boxPredictionEncoding,T.boxPredictionEncoding,D.boxPredictionEncoding],1),_=Ge.concat([u.classPrediction,f.classPrediction,l.classPrediction,g.classPrediction,T.classPrediction,D.classPrediction],1);return{boxPredictions:h,classPredictions:_}})}var X=class{constructor({minConfidence:t,maxResults:e}={}){this._name="SsdMobilenetv1Options";if(this._minConfidence=t||.5,this._maxResults=e||100,typeof this._minConfidence!="number"||this._minConfidence<=0||this._minConfidence>=1)throw new Error(`${this._name} - expected minConfidence to be a number between 0 and 1`);if(typeof this._maxResults!="number")throw new Error(`${this._name} - expected maxResults to be a number`)}get minConfidence(){return this._minConfidence}get maxResults(){return this._maxResults}};var St=class extends A{constructor(){super("SsdMobilenetv1")}forwardInput(t){let{params:e}=this;if(!e)throw new Error("SsdMobilenetv1 - load model before inference");return Lt.tidy(()=>{let r=Lt.cast(t.toBatchTensor(512,!1),"float32"),n=Lt.sub(Lt.div(r,127.5),1),a=jo(n,e.mobilenetv1),{boxPredictions:s,classPredictions:i}=Jo(a.out,a.conv11,e.prediction_layer);return Xo(s,i,e.output_layer)})}async forward(t){return this.forwardInput(await C(t))}async locateFaces(t,e={}){let{maxResults:r,minConfidence:n}=new X(e),a=await C(t),{boxes:s,scores:i}=this.forwardInput(a),c=s[0],m=i[0];for(let y=1;y{let[E,W]=[Math.max(0,h[y][0]),Math.min(1,h[y][2])].map(q=>q*D),[tt,lt]=[Math.max(0,h[y][1]),Math.min(1,h[y][3])].map(q=>q*T);return new M(p[y],new Yt(tt,E,lt-tt,W-E),{height:a.getInputHeight(0),width:a.getInputWidth(0)})});return c.dispose(),m.dispose(),_}getDefaultModelName(){return"ssd_mobilenetv1_model"}extractParamsFromWeightMap(t){return Go(t)}extractParams(t){return Yo(t)}};function qo(o){let t=new St;return t.extractWeights(o),t}function aa(o){return qo(o)}var fo=class extends St{};var Zo=.4,Ko=[new b(.738768,.874946),new b(2.42204,2.65704),new b(4.30971,7.04493),new b(10.246,4.59428),new b(12.6868,11.8741)],Qo=[new b(1.603231,2.094468),new b(6.041143,7.080126),new b(2.882459,3.518061),new b(4.266906,5.178857),new b(9.041765,10.66308)],tn=[117.001,114.697,97.404],en="tiny_yolov2_model",rn="tiny_yolov2_separable_conv_model";var N=v(x());var Ir=o=>typeof o=="number";function lo(o){if(!o)throw new Error(`invalid config: ${o}`);if(typeof o.withSeparableConvs!="boolean")throw new Error(`config.withSeparableConvs has to be a boolean, have: ${o.withSeparableConvs}`);if(!Ir(o.iouThreshold)||o.iouThreshold<0||o.iouThreshold>1)throw new Error(`config.iouThreshold has to be a number between [0, 1], have: ${o.iouThreshold}`);if(!Array.isArray(o.classes)||!o.classes.length||!o.classes.every(t=>typeof t=="string"))throw new Error(`config.classes has to be an array class names: string[], have: ${JSON.stringify(o.classes)}`);if(!Array.isArray(o.anchors)||!o.anchors.length||!o.anchors.map(t=>t||{}).every(t=>Ir(t.x)&&Ir(t.y)))throw new Error(`config.anchors has to be an array of { x: number, y: number }, have: ${JSON.stringify(o.anchors)}`);if(o.meanRgb&&(!Array.isArray(o.meanRgb)||o.meanRgb.length!==3||!o.meanRgb.every(Ir)))throw new Error(`config.meanRgb has to be an array of shape [number, number, number], have: ${JSON.stringify(o.meanRgb)}`)}var Q=v(x());var K=v(x());function Me(o){return K.tidy(()=>{let t=K.mul(o,K.scalar(.10000000149011612));return K.add(K.relu(K.sub(o,t)),t)})}function Tt(o,t){return Q.tidy(()=>{let e=Q.pad(o,[[0,0],[1,1],[1,1],[0,0]]);return e=Q.conv2d(e,t.conv.filters,[1,1],"valid"),e=Q.sub(e,t.bn.sub),e=Q.mul(e,t.bn.truediv),e=Q.add(e,t.conv.bias),Me(e)})}var At=v(x());function Pt(o,t){return At.tidy(()=>{let e=At.pad(o,[[0,0],[1,1],[1,1],[0,0]]);return e=At.separableConv2d(e,t.depthwise_filter,t.pointwise_filter,[1,1],"valid"),e=At.add(e,t.bias),Me(e)})}var ho=v(x());function sa(o,t){let e=be(o,t);function r(s,i){let c=ho.tensor1d(o(s)),m=ho.tensor1d(o(s));return t.push({paramPath:`${i}/sub`},{paramPath:`${i}/truediv`}),{sub:c,truediv:m}}function n(s,i,c){let m=e(s,i,3,`${c}/conv`),p=r(i,`${c}/bn`);return{conv:m,bn:p}}let a=ge(o,t);return{extractConvParams:e,extractConvWithBatchNormParams:n,extractSeparableConvParams:a}}function on(o,t,e,r){let{extractWeights:n,getRemainingWeights:a}=R(o),s=[],{extractConvParams:i,extractConvWithBatchNormParams:c,extractSeparableConvParams:m}=sa(n,s),p;if(t.withSeparableConvs){let[u,f,l,g,T,D,h,_,y]=r,E=t.isFirstLayerConv2d?i(u,f,3,"conv0"):m(u,f,"conv0"),W=m(f,l,"conv1"),tt=m(l,g,"conv2"),lt=m(g,T,"conv3"),q=m(T,D,"conv4"),Dt=m(D,h,"conv5"),Et=_?m(h,_,"conv6"):void 0,Mt=y?m(_,y,"conv7"):void 0,$t=i(y||_||h,5*e,1,"conv8");p={conv0:E,conv1:W,conv2:tt,conv3:lt,conv4:q,conv5:Dt,conv6:Et,conv7:Mt,conv8:$t}}else{let[u,f,l,g,T,D,h,_,y]=r,E=c(u,f,"conv0"),W=c(f,l,"conv1"),tt=c(l,g,"conv2"),lt=c(g,T,"conv3"),q=c(T,D,"conv4"),Dt=c(D,h,"conv5"),Et=c(h,_,"conv6"),Mt=c(_,y,"conv7"),$t=i(y,5*e,1,"conv8");p={conv0:E,conv1:W,conv2:tt,conv3:lt,conv4:q,conv5:Dt,conv6:Et,conv7:Mt,conv8:$t}}if(a().length!==0)throw new Error(`weights remaing after extract: ${a().length}`);return{params:p,paramMappings:s}}function ia(o,t){let e=Y(o,t);function r(i){let c=e(`${i}/sub`,1),m=e(`${i}/truediv`,1);return{sub:c,truediv:m}}function n(i){let c=e(`${i}/filters`,4),m=e(`${i}/bias`,1);return{filters:c,bias:m}}function a(i){let c=n(`${i}/conv`),m=r(`${i}/bn`);return{conv:c,bn:m}}let s=xe(e);return{extractConvParams:n,extractConvWithBatchNormParams:a,extractSeparableConvParams:s}}function nn(o,t){let e=[],{extractConvParams:r,extractConvWithBatchNormParams:n,extractSeparableConvParams:a}=ia(o,e),s;if(t.withSeparableConvs){let i=t.filterSizes&&t.filterSizes.length||9;s={conv0:t.isFirstLayerConv2d?r("conv0"):a("conv0"),conv1:a("conv1"),conv2:a("conv2"),conv3:a("conv3"),conv4:a("conv4"),conv5:a("conv5"),conv6:i>7?a("conv6"):void 0,conv7:i>8?a("conv7"):void 0,conv8:r("conv8")}}else s={conv0:n("conv0"),conv1:n("conv1"),conv2:n("conv2"),conv3:n("conv3"),conv4:n("conv4"),conv5:n("conv5"),conv6:n("conv6"),conv7:n("conv7"),conv8:r("conv8")};return B(o,e),{params:s,paramMappings:e}}var st=class{constructor({inputSize:t,scoreThreshold:e}={}){this._name="TinyYolov2Options";if(this._inputSize=t||416,this._scoreThreshold=e||.5,typeof this._inputSize!="number"||this._inputSize%32!==0)throw new Error(`${this._name} - expected inputSize to be a number divisible by 32`);if(typeof this._scoreThreshold!="number"||this._scoreThreshold<=0||this._scoreThreshold>=1)throw new Error(`${this._name} - expected scoreThreshold to be a number between 0 and 1`)}get inputSize(){return this._inputSize}get scoreThreshold(){return this._scoreThreshold}};var bo=class extends A{constructor(e){super("TinyYolov2");lo(e),this._config=e}get config(){return this._config}get withClassScores(){return this.config.withClassScores||this.config.classes.length>1}get boxEncodingSize(){return 5+(this.withClassScores?this.config.classes.length:0)}runTinyYolov2(e,r){let n=Tt(e,r.conv0);return n=N.maxPool(n,[2,2],[2,2],"same"),n=Tt(n,r.conv1),n=N.maxPool(n,[2,2],[2,2],"same"),n=Tt(n,r.conv2),n=N.maxPool(n,[2,2],[2,2],"same"),n=Tt(n,r.conv3),n=N.maxPool(n,[2,2],[2,2],"same"),n=Tt(n,r.conv4),n=N.maxPool(n,[2,2],[2,2],"same"),n=Tt(n,r.conv5),n=N.maxPool(n,[2,2],[1,1],"same"),n=Tt(n,r.conv6),n=Tt(n,r.conv7),qt(n,r.conv8,"valid",!1)}runMobilenet(e,r){let n=this.config.isFirstLayerConv2d?Me(qt(e,r.conv0,"valid",!1)):Pt(e,r.conv0);return n=N.maxPool(n,[2,2],[2,2],"same"),n=Pt(n,r.conv1),n=N.maxPool(n,[2,2],[2,2],"same"),n=Pt(n,r.conv2),n=N.maxPool(n,[2,2],[2,2],"same"),n=Pt(n,r.conv3),n=N.maxPool(n,[2,2],[2,2],"same"),n=Pt(n,r.conv4),n=N.maxPool(n,[2,2],[2,2],"same"),n=Pt(n,r.conv5),n=N.maxPool(n,[2,2],[1,1],"same"),n=r.conv6?Pt(n,r.conv6):n,n=r.conv7?Pt(n,r.conv7):n,qt(n,r.conv8,"valid",!1)}forwardInput(e,r){let{params:n}=this;if(!n)throw new Error("TinyYolov2 - load model before inference");return N.tidy(()=>{let a=N.cast(e.toBatchTensor(r,!1),"float32");return a=this.config.meanRgb?rt(a,this.config.meanRgb):a,a=a.div(255),this.config.withSeparableConvs?this.runMobilenet(a,n):this.runTinyYolov2(a,n)})}async forward(e,r){return this.forwardInput(await C(e),r)}async detect(e,r={}){let{inputSize:n,scoreThreshold:a}=new st(r),s=await C(e),i=await this.forwardInput(s,n),c=N.tidy(()=>N.unstack(i)[0].expandDims()),m={width:s.getInputWidth(0),height:s.getInputHeight(0)},p=await this.extractBoxes(c,s.getReshapedInputDimensions(0),a);i.dispose(),c.dispose();let u=p.map(h=>h.box),f=p.map(h=>h.score),l=p.map(h=>h.classScore),g=p.map(h=>this.config.classes[h.label]);return Vr(u.map(h=>h.rescale(n)),f,this.config.iouThreshold,!0).map(h=>new bt(f[h],l[h],g[h],u[h],m))}getDefaultModelName(){return""}extractParamsFromWeightMap(e){return nn(e,this.config)}extractParams(e){let r=this.config.filterSizes||bo.DEFAULT_FILTER_SIZES,n=r?r.length:void 0;if(n!==7&&n!==8&&n!==9)throw new Error(`TinyYolov2 - expected 7 | 8 | 9 convolutional filters, but found ${n} filterSizes in config`);return on(e,this.config,this.boxEncodingSize,r)}async extractBoxes(e,r,n){let{width:a,height:s}=r,i=Math.max(a,s),c=i/a,m=i/s,p=e.shape[1],u=this.config.anchors.length,[f,l,g]=N.tidy(()=>{let _=e.reshape([p,p,u,this.boxEncodingSize]),y=_.slice([0,0,0,0],[p,p,u,4]),E=_.slice([0,0,0,4],[p,p,u,1]),W=this.withClassScores?N.softmax(_.slice([0,0,0,5],[p,p,u,this.config.classes.length]),3):N.scalar(0);return[y,E,W]}),T=[],D=await l.array(),h=await f.array();for(let _=0;_n){let tt=(y+Ne(h[_][y][E][0]))/p*c,lt=(_+Ne(h[_][y][E][1]))/p*m,q=Math.exp(h[_][y][E][2])*this.config.anchors[E].x/p*c,Dt=Math.exp(h[_][y][E][3])*this.config.anchors[E].y/p*m,Et=tt-q/2,Mt=lt-Dt/2,$t={row:_,col:y,anchor:E},{classScore:vo,label:yo}=this.withClassScores?await this.extractPredictedClass(g,$t):{classScore:1,label:0};T.push({box:new Vt(Et,Mt,Et+q,Mt+Dt),score:W,classScore:W*vo,label:yo,...$t})}}return f.dispose(),l.dispose(),g.dispose(),T}async extractPredictedClass(e,r){let{row:n,col:a,anchor:s}=r,i=await e.array();return Array(this.config.classes.length).fill(0).map((c,m)=>i[n][a][s][m]).map((c,m)=>({classScore:c,label:m})).reduce((c,m)=>c.classScore>m.classScore?c:m)}},ee=bo;ee.DEFAULT_FILTER_SIZES=[3,16,32,64,128,256,512,1024,1024];var re=class extends ee{constructor(t=!0){let e={withSeparableConvs:t,iouThreshold:Zo,classes:["face"],...t?{anchors:Qo,meanRgb:tn}:{anchors:Ko,withClassScores:!0}};super(e)}get withSeparableConvs(){return this.config.withSeparableConvs}get anchors(){return this.config.anchors}async locateFaces(t,e){return(await this.detect(t,e)).map(n=>new M(n.score,n.relativeBox,{width:n.imageWidth,height:n.imageHeight}))}getDefaultModelName(){return this.withSeparableConvs?rn:en}extractParamsFromWeightMap(t){return super.extractParamsFromWeightMap(t)}};function ca(o,t=!0){let e=new re(t);return e.extractWeights(o),e}var je=class extends st{constructor(){super(...arguments);this._name="TinyFaceDetectorOptions"}};var J=class{async then(t){return t(await this.run())}async run(){throw new Error("ComposableTask - run is not implemented")}};var Xe=v(x());var go=v(x());async function oe(o,t,e,r,n=({alignedRect:a})=>a){let a=o.map(c=>Zt(c)?n(c):c.detection),s=r||(t instanceof go.Tensor?await de(t,a):await le(t,a)),i=await e(s);return s.forEach(c=>c instanceof go.Tensor&&c.dispose()),i}async function Ce(o,t,e,r,n){return oe([o],t,async a=>e(a[0]),r,n)}var an=.4,sn=[new b(1.603231,2.094468),new b(6.041143,7.080126),new b(2.882459,3.518061),new b(4.266906,5.178857),new b(9.041765,10.66308)],cn=[117.001,114.697,97.404];var ne=class extends ee{constructor(){let t={withSeparableConvs:!0,iouThreshold:an,classes:["face"],anchors:sn,meanRgb:cn,isFirstLayerConv2d:!0,filterSizes:[3,16,32,64,128,256,512]};super(t)}get anchors(){return this.config.anchors}async locateFaces(t,e){return(await this.detect(t,e)).map(n=>new M(n.score,n.relativeBox,{width:n.imageWidth,height:n.imageHeight}))}getDefaultModelName(){return"tiny_face_detector_model"}extractParamsFromWeightMap(t){return super.extractParamsFromWeightMap(t)}};var w={ssdMobilenetv1:new St,tinyFaceDetector:new ne,tinyYolov2:new re,faceLandmark68Net:new Kt,faceLandmark68TinyNet:new ze,faceRecognitionNet:new Qt,faceExpressionNet:new Oe,ageGenderNet:new He},mn=(o,t)=>w.ssdMobilenetv1.locateFaces(o,t),ma=(o,t)=>w.tinyFaceDetector.locateFaces(o,t),pa=(o,t)=>w.tinyYolov2.locateFaces(o,t),pn=o=>w.faceLandmark68Net.detectLandmarks(o),ua=o=>w.faceLandmark68TinyNet.detectLandmarks(o),fa=o=>w.faceRecognitionNet.computeFaceDescriptor(o),la=o=>w.faceExpressionNet.predictExpressions(o),da=o=>w.ageGenderNet.predictAgeAndGender(o),un=o=>w.ssdMobilenetv1.load(o),ha=o=>w.tinyFaceDetector.load(o),ba=o=>w.tinyYolov2.load(o),ga=o=>w.faceLandmark68Net.load(o),xa=o=>w.faceLandmark68TinyNet.load(o),va=o=>w.faceRecognitionNet.load(o),ya=o=>w.faceExpressionNet.load(o),_a=o=>w.ageGenderNet.load(o),Ta=un,Pa=mn,wa=pn;var Nr=class extends J{constructor(e,r,n){super();this.parentTask=e;this.input=r;this.extractedFaces=n}},ae=class extends Nr{async run(){let t=await this.parentTask,e=await oe(t,this.input,async r=>Promise.all(r.map(n=>w.faceExpressionNet.predictExpressions(n))),this.extractedFaces);return t.map((r,n)=>vr(r,e[n]))}withAgeAndGender(){return new ie(this,this.input)}},se=class extends Nr{async run(){let t=await this.parentTask;if(!t)return;let e=await Ce(t,this.input,r=>w.faceExpressionNet.predictExpressions(r),this.extractedFaces);return vr(t,e)}withAgeAndGender(){return new ce(this,this.input)}},Wt=class extends ae{withAgeAndGender(){return new Bt(this,this.input)}withFaceDescriptors(){return new wt(this,this.input)}},kt=class extends se{withAgeAndGender(){return new Rt(this,this.input)}withFaceDescriptor(){return new Ft(this,this.input)}};var Sr=class extends J{constructor(e,r,n){super();this.parentTask=e;this.input=r;this.extractedFaces=n}},ie=class extends Sr{async run(){let t=await this.parentTask,e=await oe(t,this.input,async r=>Promise.all(r.map(n=>w.ageGenderNet.predictAgeAndGender(n))),this.extractedFaces);return t.map((r,n)=>{let{age:a,gender:s,genderProbability:i}=e[n];return Mr(Cr(r,s,i),a)})}withFaceExpressions(){return new ae(this,this.input)}},ce=class extends Sr{async run(){let t=await this.parentTask;if(!t)return;let{age:e,gender:r,genderProbability:n}=await Ce(t,this.input,a=>w.ageGenderNet.predictAgeAndGender(a),this.extractedFaces);return Mr(Cr(t,r,n),e)}withFaceExpressions(){return new se(this,this.input)}},Bt=class extends ie{withFaceExpressions(){return new Wt(this,this.input)}withFaceDescriptors(){return new wt(this,this.input)}},Rt=class extends ce{withFaceExpressions(){return new kt(this,this.input)}withFaceDescriptor(){return new Ft(this,this.input)}};var Ue=class extends J{constructor(e,r){super();this.parentTask=e;this.input=r}},wt=class extends Ue{async run(){let t=await this.parentTask;return(await oe(t,this.input,r=>Promise.all(r.map(n=>w.faceRecognitionNet.computeFaceDescriptor(n))),null,r=>r.landmarks.align(null,{useDlibAlignment:!0}))).map((r,n)=>Er(t[n],r))}withFaceExpressions(){return new Wt(this,this.input)}withAgeAndGender(){return new Bt(this,this.input)}},Ft=class extends Ue{async run(){let t=await this.parentTask;if(!t)return;let e=await Ce(t,this.input,r=>w.faceRecognitionNet.computeFaceDescriptor(r),null,r=>r.landmarks.align(null,{useDlibAlignment:!0}));return Er(t,e)}withFaceExpressions(){return new kt(this,this.input)}withAgeAndGender(){return new Rt(this,this.input)}};var Je=class extends J{constructor(e,r,n){super();this.parentTask=e;this.input=r;this.useTinyLandmarkNet=n}get landmarkNet(){return this.useTinyLandmarkNet?w.faceLandmark68TinyNet:w.faceLandmark68Net}},qe=class extends Je{async run(){let t=await this.parentTask,e=t.map(s=>s.detection),r=this.input instanceof Xe.Tensor?await de(this.input,e):await le(this.input,e),n=await Promise.all(r.map(s=>this.landmarkNet.detectLandmarks(s)));return r.forEach(s=>s instanceof Xe.Tensor&&s.dispose()),t.filter((s,i)=>n[i]).map((s,i)=>we(s,n[i]))}withFaceExpressions(){return new Wt(this,this.input)}withAgeAndGender(){return new Bt(this,this.input)}withFaceDescriptors(){return new wt(this,this.input)}},Ze=class extends Je{async run(){let t=await this.parentTask;if(!t)return;let{detection:e}=t,r=this.input instanceof Xe.Tensor?await de(this.input,[e]):await le(this.input,[e]),n=await this.landmarkNet.detectLandmarks(r[0]);return r.forEach(a=>a instanceof Xe.Tensor&&a.dispose()),we(t,n)}withFaceExpressions(){return new kt(this,this.input)}withAgeAndGender(){return new Rt(this,this.input)}withFaceDescriptor(){return new Ft(this,this.input)}};var Ke=class extends J{constructor(e,r=new X){super();this.input=e;this.options=r}},Ie=class extends Ke{async run(){let{input:t,options:e}=this,r;if(e instanceof je)r=w.tinyFaceDetector.locateFaces(t,e);else if(e instanceof X)r=w.ssdMobilenetv1.locateFaces(t,e);else if(e instanceof st)r=w.tinyYolov2.locateFaces(t,e);else throw new Error("detectFaces - expected options to be instance of TinyFaceDetectorOptions | SsdMobilenetv1Options | TinyYolov2Options");return r}runAndExtendWithFaceDetections(){return new Promise((t,e)=>{this.run().then(r=>t(r.map(n=>jt({},n)))).catch(r=>e(r))})}withFaceLandmarks(t=!1){return new qe(this.runAndExtendWithFaceDetections(),this.input,t)}withFaceExpressions(){return new ae(this.runAndExtendWithFaceDetections(),this.input)}withAgeAndGender(){return new ie(this.runAndExtendWithFaceDetections(),this.input)}},Qe=class extends Ke{async run(){let t=await new Ie(this.input,this.options),e=t[0];return t.forEach(r=>{r.score>e.score&&(e=r)}),e}runAndExtendWithFaceDetection(){return new Promise(async t=>{let e=await this.run();t(e?jt({},e):void 0)})}withFaceLandmarks(t=!1){return new Ze(this.runAndExtendWithFaceDetection(),this.input,t)}withFaceExpressions(){return new se(this.runAndExtendWithFaceDetection(),this.input)}withAgeAndGender(){return new ce(this.runAndExtendWithFaceDetection(),this.input)}};function Fa(o,t=new X){return new Qe(o,t)}function Lr(o,t=new X){return new Ie(o,t)}async function fn(o,t){return Lr(o,new X(t?{minConfidence:t}:{})).withFaceLandmarks().withFaceDescriptors()}async function Da(o,t={}){return Lr(o,new st(t)).withFaceLandmarks().withFaceDescriptors()}var Ea=fn;function xo(o,t){if(o.length!==t.length)throw new Error("euclideanDistance: arr1.length !== arr2.length");let e=Array.from(o),r=Array.from(t);return Math.sqrt(e.map((n,a)=>n-r[a]).reduce((n,a)=>n+a**2,0))}var tr=class{constructor(t,e=.6){this._distanceThreshold=e;let r=Array.isArray(t)?t:[t];if(!r.length)throw new Error("FaceRecognizer.constructor - expected atleast one input");let n=1,a=()=>`person ${n++}`;this._labeledDescriptors=r.map(s=>{if(s instanceof mt)return s;if(s instanceof Float32Array)return new mt(a(),[s]);if(s.descriptor&&s.descriptor instanceof Float32Array)return new mt(a(),[s.descriptor]);throw new Error("FaceRecognizer.constructor - expected inputs to be of type LabeledFaceDescriptors | WithFaceDescriptor | Float32Array | Array | Float32Array>")})}get labeledDescriptors(){return this._labeledDescriptors}get distanceThreshold(){return this._distanceThreshold}computeMeanDistance(t,e){return e.map(r=>xo(r,t)).reduce((r,n)=>r+n,0)/(e.length||1)}matchDescriptor(t){return this.labeledDescriptors.map(({descriptors:e,label:r})=>new pe(r,this.computeMeanDistance(t,e))).reduce((e,r)=>e.distancet.toJSON())}}static fromJSON(t){let e=t.labeledDescriptors.map(r=>mt.fromJSON(r));return new tr(e,t.distanceThreshold)}};function Ma(o){let t=new ne;return t.extractWeights(o),t}function ln(o,t){let{width:e,height:r}=new k(t.width,t.height);if(e<=0||r<=0)throw new Error(`resizeResults - invalid dimensions: ${JSON.stringify({width:e,height:r})}`);if(Array.isArray(o))return o.map(n=>ln(n,{width:e,height:r}));if(Zt(o)){let n=o.detection.forSize(e,r),a=o.unshiftedLandmarks.forSize(n.box.width,n.box.height);return we(jt(o,n),a)}return pt(o)?jt(o,o.detection.forSize(e,r)):o instanceof z||o instanceof M?o.forSize(e,r):o}var Ia=So;0&&(module.exports={AgeGenderNet,BoundingBox,Box,ComposableTask,ComputeAllFaceDescriptorsTask,ComputeFaceDescriptorsTaskBase,ComputeSingleFaceDescriptorTask,DetectAllFaceLandmarksTask,DetectAllFacesTask,DetectFaceLandmarksTaskBase,DetectFacesTaskBase,DetectSingleFaceLandmarksTask,DetectSingleFaceTask,Dimensions,FACE_EXPRESSION_LABELS,FaceDetection,FaceDetectionNet,FaceExpressionNet,FaceExpressions,FaceLandmark68Net,FaceLandmark68TinyNet,FaceLandmarkNet,FaceLandmarks,FaceLandmarks5,FaceLandmarks68,FaceMatch,FaceMatcher,FaceRecognitionNet,Gender,LabeledBox,LabeledFaceDescriptors,NetInput,NeuralNetwork,ObjectDetection,Point,PredictedBox,Rect,SsdMobilenetv1,SsdMobilenetv1Options,TinyFaceDetector,TinyFaceDetectorOptions,TinyYolov2,TinyYolov2Options,allFaces,allFacesSsdMobilenetv1,allFacesTinyYolov2,awaitMediaLoaded,bufferToImage,computeFaceDescriptor,createCanvas,createCanvasFromMedia,createFaceDetectionNet,createFaceRecognitionNet,createSsdMobilenetv1,createTinyFaceDetector,createTinyYolov2,detectAllFaces,detectFaceLandmarks,detectFaceLandmarksTiny,detectLandmarks,detectSingleFace,draw,env,euclideanDistance,extendWithAge,extendWithFaceDescriptor,extendWithFaceDetection,extendWithFaceExpressions,extendWithFaceLandmarks,extendWithGender,extractFaceTensors,extractFaces,fetchImage,fetchJson,fetchNetWeights,fetchOrThrow,fetchVideo,getContext2dOrThrow,getMediaDimensions,imageTensorToCanvas,imageToSquare,inverseSigmoid,iou,isMediaElement,isMediaLoaded,isWithAge,isWithFaceDetection,isWithFaceExpressions,isWithFaceLandmarks,isWithGender,loadAgeGenderModel,loadFaceDetectionModel,loadFaceExpressionModel,loadFaceLandmarkModel,loadFaceLandmarkTinyModel,loadFaceRecognitionModel,loadSsdMobilenetv1Model,loadTinyFaceDetectorModel,loadTinyYolov2Model,loadWeightMap,locateFaces,matchDimensions,minBbox,nets,nonMaxSuppression,normalize,padToSquare,predictAgeAndGender,recognizeFaceExpressions,resizeResults,resolveInput,shuffleArray,sigmoid,ssdMobilenetv1,tf,tinyFaceDetector,tinyYolov2,toNetInput,utils,validateConfig,version}); diff --git a/dist/face-api.node.js b/dist/face-api.node.js index aa28585..09b3d39 100644 --- a/dist/face-api.node.js +++ b/dist/face-api.node.js @@ -4,4 +4,4 @@ author: ' */ -"use strict";var ln=Object.create;var er=Object.defineProperty;var dn=Object.getOwnPropertyDescriptor;var hn=Object.getOwnPropertyNames;var bn=Object.getPrototypeOf,gn=Object.prototype.hasOwnProperty;var xn=(o,t)=>()=>(t||o((t={exports:{}}).exports,t),t.exports),Lr=(o,t)=>{for(var e in t)er(o,e,{get:t[e],enumerable:!0})},yo=(o,t,e,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of hn(t))!gn.call(o,n)&&n!==e&&er(o,n,{get:()=>t[n],enumerable:!(r=dn(t,n))||r.enumerable});return o};var v=(o,t,e)=>(e=o!=null?ln(bn(o)):{},yo(t||!o||!o.__esModule?er(e,"default",{value:o,enumerable:!0}):e,o)),vn=o=>yo(er({},"__esModule",{value:!0}),o);var x=xn((ka,Wr)=>{"use strict";var _o=Object.defineProperty,yn=Object.getOwnPropertyDescriptor,_n=Object.getOwnPropertyNames,Tn=Object.prototype.hasOwnProperty,Ar=(o,t,e,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of _n(t))!Tn.call(o,n)&&n!==e&&_o(o,n,{get:()=>t[n],enumerable:!(r=yn(t,n))||r.enumerable});return o},Pn=(o,t,e)=>(Ar(o,t,"default"),e&&Ar(e,t,"default")),wn=o=>Ar(_o({},"__esModule",{value:!0}),o),To={};Wr.exports=wn(To);Pn(To,require("@tensorflow/tfjs-node"),Wr.exports)});var Na={};Lr(Na,{AgeGenderNet:()=>He,BoundingBox:()=>Vt,Box:()=>F,ComposableTask:()=>J,ComputeAllFaceDescriptorsTask:()=>wt,ComputeFaceDescriptorsTaskBase:()=>Ue,ComputeSingleFaceDescriptorTask:()=>Ft,DetectAllFaceLandmarksTask:()=>qe,DetectAllFacesTask:()=>Ie,DetectFaceLandmarksTaskBase:()=>Je,DetectFacesTaskBase:()=>Ke,DetectSingleFaceLandmarksTask:()=>Ze,DetectSingleFaceTask:()=>Qe,Dimensions:()=>k,FACE_EXPRESSION_LABELS:()=>no,FaceDetection:()=>M,FaceDetectionNet:()=>uo,FaceExpressionNet:()=>Oe,FaceExpressions:()=>yt,FaceLandmark68Net:()=>Kt,FaceLandmark68TinyNet:()=>ze,FaceLandmarkNet:()=>co,FaceLandmarks:()=>z,FaceLandmarks5:()=>Yr,FaceLandmarks68:()=>Gt,FaceMatch:()=>pe,FaceMatcher:()=>tr,FaceRecognitionNet:()=>Qt,Gender:()=>Tr,LabeledBox:()=>ue,LabeledFaceDescriptors:()=>mt,NetInput:()=>ut,NeuralNetwork:()=>A,ObjectDetection:()=>bt,Point:()=>b,PredictedBox:()=>Gr,Rect:()=>Yt,SsdMobilenetv1:()=>St,SsdMobilenetv1Options:()=>X,TinyFaceDetector:()=>ne,TinyFaceDetectorOptions:()=>je,TinyYolov2:()=>re,TinyYolov2Options:()=>st,allFaces:()=>Ea,allFacesSsdMobilenetv1:()=>un,allFacesTinyYolov2:()=>Da,awaitMediaLoaded:()=>Kr,bufferToImage:()=>Qr,computeFaceDescriptor:()=>fa,createCanvas:()=>Jt,createCanvasFromMedia:()=>We,createFaceDetectionNet:()=>aa,createFaceRecognitionNet:()=>Xn,createSsdMobilenetv1:()=>Jo,createTinyFaceDetector:()=>Ma,createTinyYolov2:()=>ca,detectAllFaces:()=>Sr,detectFaceLandmarks:()=>mn,detectFaceLandmarksTiny:()=>ua,detectLandmarks:()=>wa,detectSingleFace:()=>Fa,draw:()=>so,env:()=>P,euclideanDistance:()=>go,extendWithAge:()=>Er,extendWithFaceDescriptor:()=>Dr,extendWithFaceDetection:()=>jt,extendWithFaceExpressions:()=>xr,extendWithFaceLandmarks:()=>we,extendWithGender:()=>Mr,extractFaceTensors:()=>de,extractFaces:()=>le,fetchImage:()=>An,fetchJson:()=>ro,fetchNetWeights:()=>Wn,fetchOrThrow:()=>xt,fetchVideo:()=>kn,getContext2dOrThrow:()=>O,getMediaDimensions:()=>Xt,imageTensorToCanvas:()=>to,imageToSquare:()=>eo,inverseSigmoid:()=>En,iou:()=>Or,isMediaElement:()=>ir,isMediaLoaded:()=>Ae,isWithAge:()=>Jn,isWithFaceDetection:()=>pt,isWithFaceExpressions:()=>ao,isWithFaceLandmarks:()=>Zt,isWithGender:()=>qn,loadAgeGenderModel:()=>_a,loadFaceDetectionModel:()=>Ta,loadFaceExpressionModel:()=>ya,loadFaceLandmarkModel:()=>ga,loadFaceLandmarkTinyModel:()=>xa,loadFaceRecognitionModel:()=>va,loadSsdMobilenetv1Model:()=>pn,loadTinyFaceDetectorModel:()=>ha,loadTinyYolov2Model:()=>ba,loadWeightMap:()=>oo,locateFaces:()=>Pa,matchDimensions:()=>Bn,minBbox:()=>Hr,nets:()=>w,nonMaxSuppression:()=>zr,normalize:()=>rt,padToSquare:()=>Vr,predictAgeAndGender:()=>da,recognizeFaceExpressions:()=>la,resizeResults:()=>fn,resolveInput:()=>Ut,shuffleArray:()=>Dn,sigmoid:()=>Ne,ssdMobilenetv1:()=>cn,tf:()=>Ca,tinyFaceDetector:()=>ma,tinyYolov2:()=>pa,toNetInput:()=>C,utils:()=>$r,validateConfig:()=>fo,version:()=>Ia});module.exports=vn(Na);var Ca=v(x());var so={};Lr(so,{AnchorPosition:()=>Zr,DrawBox:()=>Le,DrawBoxOptions:()=>ar,DrawFaceLandmarks:()=>yr,DrawFaceLandmarksOptions:()=>vr,DrawTextField:()=>gt,DrawTextFieldOptions:()=>fe,drawContour:()=>dt,drawDetections:()=>Ln,drawFaceExpressions:()=>Rn,drawFaceLandmarks:()=>On});function dt(o,t,e=!1){if(o.beginPath(),t.slice(1).forEach(({x:r,y:n},a)=>{let s=t[a];o.moveTo(s.x,s.y),o.lineTo(r,n)}),e){let r=t[t.length-1],n=t[0];if(!r||!n)return;o.moveTo(r.x,r.y),o.lineTo(n.x,n.y)}o.stroke()}var $r={};Lr($r,{computeReshapedDimensions:()=>Rr,getCenterPoint:()=>zt,isDimensions:()=>or,isEven:()=>rr,isFloat:()=>Br,isTensor:()=>Ot,isTensor1D:()=>Fn,isTensor2D:()=>kr,isTensor3D:()=>ht,isTensor4D:()=>U,isValidNumber:()=>et,isValidProbablitiy:()=>me,range:()=>it,round:()=>Ht});var Po=v(x());var k=class{constructor(t,e){if(!et(t)||!et(e))throw new Error(`Dimensions.constructor - expected width and height to be valid numbers, instead have ${JSON.stringify({width:t,height:e})}`);this._width=t,this._height=e}get width(){return this._width}get height(){return this._height}reverse(){return new k(1/this.width,1/this.height)}};function Ot(o,t){return o instanceof Po.Tensor&&o.shape.length===t}function Fn(o){return Ot(o,1)}function kr(o){return Ot(o,2)}function ht(o){return Ot(o,3)}function U(o){return Ot(o,4)}function Br(o){return o%1!==0}function rr(o){return o%2===0}function Ht(o,t=2){let e=10**t;return Math.floor(o*e)/e}function or(o){return o&&o.width&&o.height}function Rr({width:o,height:t},e){let r=e/Math.max(t,o);return new k(Math.round(o*r),Math.round(t*r))}function zt(o){return o.reduce((t,e)=>t.add(e),new b(0,0)).div(new b(o.length,o.length))}function it(o,t,e){return Array(o).fill(0).map((r,n)=>t+n*e)}function et(o){return!!o&&o!==1/0&&o!==-1/0&&!Number.isNaN(o)||o===0}function me(o){return et(o)&&o>=0&&o<=1}var b=class{constructor(t,e){this._x=t,this._y=e}get x(){return this._x}get y(){return this._y}add(t){return new b(this.x+t.x,this.y+t.y)}sub(t){return new b(this.x-t.x,this.y-t.y)}mul(t){return new b(this.x*t.x,this.y*t.y)}div(t){return new b(this.x/t.x,this.y/t.y)}abs(){return new b(Math.abs(this.x),Math.abs(this.y))}magnitude(){return Math.sqrt(this.x**2+this.y**2)}floor(){return new b(Math.floor(this.x),Math.floor(this.y))}};var F=class{static isRect(t){return!!t&&[t.x,t.y,t.width,t.height].every(et)}static assertIsValidBox(t,e,r=!1){if(!F.isRect(t))throw new Error(`${e} - invalid box: ${JSON.stringify(t)}, expected object with properties x, y, width, height`);if(!r&&(t.width<0||t.height<0))throw new Error(`${e} - width (${t.width}) and height (${t.height}) must be positive numbers`)}constructor(t,e=!0){let r=t||{},n=[r.left,r.top,r.right,r.bottom].every(et),a=[r.x,r.y,r.width,r.height].every(et);if(!a&&!n)throw new Error(`Box.constructor - expected box to be IBoundingBox | IRect, instead have ${JSON.stringify(r)}`);let[s,i,c,m]=a?[r.x,r.y,r.width,r.height]:[r.left,r.top,r.right-r.left,r.bottom-r.top];F.assertIsValidBox({x:s,y:i,width:c,height:m},"Box.constructor",e),this._x=s,this._y=i,this._width=c,this._height=m}get x(){return this._x}get y(){return this._y}get width(){return this._width}get height(){return this._height}get left(){return this.x}get top(){return this.y}get right(){return this.x+this.width}get bottom(){return this.y+this.height}get area(){return this.width*this.height}get topLeft(){return new b(this.left,this.top)}get topRight(){return new b(this.right,this.top)}get bottomLeft(){return new b(this.left,this.bottom)}get bottomRight(){return new b(this.right,this.bottom)}round(){let[t,e,r,n]=[this.x,this.y,this.width,this.height].map(a=>Math.round(a));return new F({x:t,y:e,width:r,height:n})}floor(){let[t,e,r,n]=[this.x,this.y,this.width,this.height].map(a=>Math.floor(a));return new F({x:t,y:e,width:r,height:n})}toSquare(){let{x:t,y:e,width:r,height:n}=this,a=Math.abs(r-n);return re&&(i=-u+e+r,u=e),f>t&&(c=-f+t+n,f=t),m<1&&(c=2-m,m=1),p<1&&(c=2-p,p=1),{dy:s,edy:c,dx:a,edx:i,y:p,ey:f,x:m,ex:u,w:r,h:n}}calibrate(t){return new F({left:this.left+t.left*this.width,top:this.top+t.top*this.height,right:this.right+t.right*this.width,bottom:this.bottom+t.bottom*this.height}).toSquare().round()}};var Vt=class extends F{constructor(t,e,r,n,a=!1){super({left:t,top:e,right:r,bottom:n},a)}};var bt=class{constructor(t,e,r,n,a){this._imageDims=new k(a.width,a.height),this._score=t,this._classScore=e,this._className=r,this._box=new F(n).rescale(this._imageDims)}get score(){return this._score}get classScore(){return this._classScore}get className(){return this._className}get box(){return this._box}get imageDims(){return this._imageDims}get imageWidth(){return this.imageDims.width}get imageHeight(){return this.imageDims.height}get relativeBox(){return new F(this._box).rescale(this.imageDims.reverse())}forSize(t,e){return new bt(this.score,this.classScore,this.className,this.relativeBox,{width:t,height:e})}};var M=class extends bt{constructor(t,e,r){super(t,t,"",e,r)}forSize(t,e){let{score:r,relativeBox:n,imageDims:a}=super.forSize(t,e);return new M(r,n,a)}};function Or(o,t,e=!0){let r=Math.max(0,Math.min(o.right,t.right)-Math.max(o.left,t.left)),n=Math.max(0,Math.min(o.bottom,t.bottom)-Math.max(o.top,t.top)),a=r*n;return e?a/(o.area+t.area-a):a/Math.min(o.area,t.area)}function Hr(o){let t=o.map(i=>i.x),e=o.map(i=>i.y),r=t.reduce((i,c)=>ccii({score:s,boxIndex:i})).sort((s,i)=>s.score-i.score).map(s=>s.boxIndex),a=[];for(;n.length>0;){let s=n.pop();a.push(s);let i=n,c=[];for(let m=0;mc[p]<=e)}return a}var ct=v(x());function rt(o,t){return ct.tidy(()=>{let[e,r,n]=t,a=ct.fill([...o.shape.slice(0,3),1],e,"float32"),s=ct.fill([...o.shape.slice(0,3),1],r,"float32"),i=ct.fill([...o.shape.slice(0,3),1],n,"float32"),c=ct.concat([a,s,i],3);return ct.sub(o,c)})}var Ct=v(x());function Vr(o,t=!1){return Ct.tidy(()=>{let[e,r]=o.shape.slice(1);if(e===r)return o;let n=Math.abs(e-r),a=Math.round(n*(t?.5:1)),s=e>r?2:1,i=f=>{let l=o.shape.slice();return l[s]=f,Ct.fill(l,0,"float32")},c=i(a),m=n-c.shape[s],u=[t&&m?i(m):null,o,c].filter(f=>!!f).map(f=>Ct.cast(f,"float32"));return Ct.concat(u,s)})}function Dn(o){let t=o.slice();for(let e=t.length-1;e>0;e--){let r=Math.floor(Math.random()*(e+1)),n=t[e];t[e]=t[r],t[r]=n}return t}function Ne(o){return 1/(1+Math.exp(-o))}function En(o){return Math.log(o/(1-o))}var Yt=class extends F{constructor(t,e,r,n,a=!1){super({x:t,y:e,width:r,height:n},a)}};var Mn=.5,Cn=.43,In=.45,z=class{constructor(t,e,r=new b(0,0)){let{width:n,height:a}=e;this._imgDims=new k(n,a),this._shift=r,this._positions=t.map(s=>s.mul(new b(n,a)).add(r))}get shift(){return new b(this._shift.x,this._shift.y)}get imageWidth(){return this._imgDims.width}get imageHeight(){return this._imgDims.height}get positions(){return this._positions}get relativePositions(){return this._positions.map(t=>t.sub(this._shift).div(new b(this.imageWidth,this.imageHeight)))}forSize(t,e){return new this.constructor(this.relativePositions,{width:t,height:e})}shiftBy(t,e){return new this.constructor(this.relativePositions,this._imgDims,new b(t,e))}shiftByPoint(t){return this.shiftBy(t.x,t.y)}align(t,e={}){if(t){let a=t instanceof M?t.box.floor():new F(t);return this.shiftBy(a.x,a.y).align(null,e)}let{useDlibAlignment:r,minBoxPadding:n}={useDlibAlignment:!1,minBoxPadding:.2,...e};return r?this.alignDlib():this.alignMinBbox(n)}alignDlib(){let t=this.getRefPointsForAlignment(),[e,r,n]=t,a=u=>n.sub(u).magnitude(),s=(a(e)+a(r))/2,i=Math.floor(s/In),c=zt(t),m=Math.floor(Math.max(0,c.x-Mn*i)),p=Math.floor(Math.max(0,c.y-Cn*i));return new Yt(m,p,Math.min(i,this.imageWidth+m),Math.min(i,this.imageHeight+p))}alignMinBbox(t){let e=Hr(this.positions);return e.pad(e.width*t,e.height*t)}getRefPointsForAlignment(){throw new Error("getRefPointsForAlignment not implemented by base class")}};var Yr=class extends z{getRefPointsForAlignment(){let t=this.positions;return[t[0],t[1],zt([t[3],t[4]])]}};var Gt=class extends z{getJawOutline(){return this.positions.slice(0,17)}getLeftEyeBrow(){return this.positions.slice(17,22)}getRightEyeBrow(){return this.positions.slice(22,27)}getNose(){return this.positions.slice(27,36)}getLeftEye(){return this.positions.slice(36,42)}getRightEye(){return this.positions.slice(42,48)}getMouth(){return this.positions.slice(48,68)}getRefPointsForAlignment(){return[this.getLeftEye(),this.getRightEye(),this.getMouth()].map(zt)}};var pe=class{constructor(t,e){this._label=t,this._distance=e}get label(){return this._label}get distance(){return this._distance}toString(t=!0){return`${this.label}${t?` (${Ht(this.distance)})`:""}`}};var ue=class extends F{constructor(e,r){super(e);this._label=r}static assertIsValidLabeledBox(e,r){if(F.assertIsValidBox(e,r),!et(e.label))throw new Error(`${r} - expected property label (${e.label}) to be a number`)}get label(){return this._label}};var mt=class{constructor(t,e){if(typeof t!="string")throw new Error("LabeledFaceDescriptors - constructor expected label to be a string");if(!Array.isArray(e)||e.some(r=>!(r instanceof Float32Array)))throw new Error("LabeledFaceDescriptors - constructor expected descriptors to be an array of Float32Array");this._label=t,this._descriptors=e}get label(){return this._label}get descriptors(){return this._descriptors}toJSON(){return{label:this.label,descriptors:this.descriptors.map(t=>Array.from(t))}}static fromJSON(t){let e=t.descriptors.map(r=>new Float32Array(r));return new mt(t.label,e)}};var Gr=class extends ue{constructor(e,r,n,a){super(e,r);this._score=n,this._classScore=a}static assertIsValidPredictedBox(e,r){if(ue.assertIsValidLabeledBox(e,r),!me(e.score)||!me(e.classScore))throw new Error(`${r} - expected properties score (${e.score}) and (${e.classScore}) to be a number between [0, 1]`)}get score(){return this._score}get classScore(){return this._classScore}};function pt(o){return o.detection instanceof M}function jt(o,t){return{...o,...{detection:t}}}function jr(){let o=window.fetch;if(!o)throw new Error("fetch - missing fetch implementation for browser environment");return{Canvas:HTMLCanvasElement,CanvasRenderingContext2D,Image:HTMLImageElement,ImageData,Video:HTMLVideoElement,createCanvasElement:()=>document.createElement("canvas"),createImageElement:()=>document.createElement("img"),createVideoElement:()=>document.createElement("video"),fetch:o,readFile:()=>{throw new Error("readFile - filesystem not available for browser environment")}}}function Se(){return typeof global=="object"&&typeof process!="undefined"&&process.versions!=null&&process.versions.node!=null}function nr(o){let t="";if(!o&&Se())try{o=require("fs")}catch(r){t=r.toString()}return{readFile:o?r=>new Promise((n,a)=>{o.readFile(r,(s,i)=>s?a(s):n(i))}):()=>{throw new Error(`readFile - failed to require fs in nodejs environment with error: ${t}`)}}}function Ur(){let o=global.Canvas||global.HTMLCanvasElement,t=global.Image||global.HTMLImageElement,e=global.Video||global.HTMLVideoElement,r=()=>{if(o)return new o;throw new Error("createCanvasElement - missing Canvas implementation for nodejs environment")},n=()=>{if(t)return new t;throw new Error("createImageElement - missing Image implementation for nodejs environment")},a=()=>{if(e)return new e;throw new Error("createVideoElement - missing Video implementation for nodejs environment")},s=global.fetch,i=nr();return{Canvas:o||class{},CanvasRenderingContext2D:global.CanvasRenderingContext2D||class{},Image:t||class{},ImageData:global.ImageData||class{},Video:global.HTMLVideoElement||class{},createCanvasElement:r,createImageElement:n,createVideoElement:a,fetch:s,...i}}function Xr(){return typeof window=="object"&&typeof document!="undefined"&&typeof HTMLImageElement!="undefined"&&typeof HTMLCanvasElement!="undefined"&&typeof HTMLVideoElement!="undefined"&&typeof ImageData!="undefined"&&typeof CanvasRenderingContext2D!="undefined"}var L;function Nn(){if(!L)throw new Error("getEnv - environment is not defined, check isNodejs() and isBrowser()");return L}function Jr(o){L=o}function qr(){return Xr()?Jr(jr()):Se()?Jr(Ur()):null}function Sn(o){if(L||qr(),!L)throw new Error("monkeyPatch - environment is not defined, check isNodejs() and isBrowser()");let{Canvas:t=L.Canvas,Image:e=L.Image}=o;L.Canvas=t,L.Image=e,L.createCanvasElement=o.createCanvasElement||(()=>new t),L.createImageElement=o.createImageElement||(()=>new e),L.ImageData=o.ImageData||L.ImageData,L.Video=o.Video||L.Video,L.fetch=o.fetch||L.fetch,L.readFile=o.readFile||L.readFile}var P={getEnv:Nn,setEnv:Jr,initialize:qr,createBrowserEnv:jr,createFileSystem:nr,createNodejsEnv:Ur,monkeyPatch:Sn,isBrowser:Xr,isNodejs:Se};qr();function Ut(o){return!P.isNodejs()&&typeof o=="string"?document.getElementById(o):o}function O(o){let{Canvas:t,CanvasRenderingContext2D:e}=P.getEnv();if(o instanceof e)return o;let r=Ut(o);if(!(r instanceof t))throw new Error("resolveContext2d - expected canvas to be of instance of Canvas");let n=r.getContext("2d");if(!n)throw new Error("resolveContext2d - canvas 2d context is null");return n}var Zr=(n=>(n.TOP_LEFT="TOP_LEFT",n.TOP_RIGHT="TOP_RIGHT",n.BOTTOM_LEFT="BOTTOM_LEFT",n.BOTTOM_RIGHT="BOTTOM_RIGHT",n))(Zr||{}),fe=class{constructor(t={}){let{anchorPosition:e,backgroundColor:r,fontColor:n,fontSize:a,fontStyle:s,padding:i}=t;this.anchorPosition=e||"TOP_LEFT",this.backgroundColor=r||"rgba(0, 0, 0, 0.5)",this.fontColor=n||"rgba(255, 255, 255, 1)",this.fontSize=a||14,this.fontStyle=s||"Georgia",this.padding=i||4}},gt=class{constructor(t,e,r={}){this.text=typeof t=="string"?[t]:t instanceof gt?t.text:t,this.anchor=e,this.options=new fe(r)}measureWidth(t){let{padding:e}=this.options;return this.text.map(r=>t.measureText(r).width).reduce((r,n)=>r{let g=c+u.x,T=c+u.y+(l+1)*s;r.fillText(f,g,T)})}};var ar=class{constructor(t={}){let{boxColor:e,lineWidth:r,label:n,drawLabelOptions:a}=t;this.boxColor=e||"rgba(0, 0, 255, 1)",this.lineWidth=r||2,this.label=n;let s={anchorPosition:"BOTTOM_LEFT",backgroundColor:this.boxColor};this.drawLabelOptions=new fe({...s,...a})}},Le=class{constructor(t,e={}){this.box=new F(t),this.options=new ar(e)}draw(t){let e=O(t),{boxColor:r,lineWidth:n}=this.options,{x:a,y:s,width:i,height:c}=this.box;e.strokeStyle=r,e.lineWidth=n,e.strokeRect(a,s,i,c);let{label:m}=this.options;m&&new gt([m],{x:a-n/2,y:s},this.options.drawLabelOptions).draw(t)}};function Ln(o,t){(Array.isArray(t)?t:[t]).forEach(r=>{let n=r instanceof M?r.score:pt(r)?r.detection.score:void 0,a=r instanceof M?r.box:pt(r)?r.detection.box:new F(r),s=n?`${Ht(n)}`:void 0;new Le(a,{label:s}).draw(o)})}var Pe=v(x());function Ae(o){let{Image:t,Video:e}=P.getEnv();return o instanceof t&&o.complete||o instanceof e&&o.readyState>=3}function Kr(o){return new Promise((t,e)=>{(o instanceof P.getEnv().Canvas||Ae(o))&&t(null);function r(a){!a.currentTarget||(a.currentTarget.removeEventListener("load",n),a.currentTarget.removeEventListener("error",r),e(a))}function n(a){!a.currentTarget||(a.currentTarget.removeEventListener("load",n),a.currentTarget.removeEventListener("error",r),t(a))}o.addEventListener("load",n),o.addEventListener("error",r)})}function Qr(o){return new Promise((t,e)=>{o instanceof Blob||e(new Error("bufferToImage - expected buf to be of type: Blob"));let r=new FileReader;r.onload=()=>{typeof r.result!="string"&&e(new Error("bufferToImage - expected reader.result to be a string, in onload"));let n=P.getEnv().createImageElement();n.onload=()=>t(n),n.onerror=e,n.src=r.result},r.onerror=e,r.readAsDataURL(o)})}function Xt(o){let{Image:t,Video:e}=P.getEnv();return o instanceof t?new k(o.naturalWidth,o.naturalHeight):o instanceof e?new k(o.videoWidth,o.videoHeight):new k(o.width,o.height)}function Jt({width:o,height:t}){let{createCanvasElement:e}=P.getEnv(),r=e();return r.width=o,r.height=t,r}function We(o,t){let{ImageData:e}=P.getEnv();if(!(o instanceof e)&&!Ae(o))throw new Error("createCanvasFromMedia - media has not finished loading yet");let{width:r,height:n}=t||Xt(o),a=Jt({width:r,height:n});return o instanceof e?O(a).putImageData(o,0,0):O(a).drawImage(o,0,0,r,n),a}var sr=v(x());async function to(o,t){let e=t||P.getEnv().createCanvasElement(),[r,n,a]=o.shape.slice(U(o)?1:0),s=sr.tidy(()=>o.as3D(r,n,a).toInt());return await sr.browser.toPixels(s,e),s.dispose(),e}function ir(o){let{Image:t,Canvas:e,Video:r}=P.getEnv();return o instanceof t||o instanceof e||o instanceof r}var V=v(x());function eo(o,t,e=!1){let{Image:r,Canvas:n}=P.getEnv();if(!(o instanceof r||o instanceof n))throw new Error("imageToSquare - expected arg0 to be HTMLImageElement | HTMLCanvasElement");if(t<=0)return Jt({width:1,height:1});let a=Xt(o),s=t/Math.max(a.height,a.width),i=s*a.width,c=s*a.height,m=Jt({width:t,height:t}),p=o instanceof n?o:We(o),u=Math.abs(i-c)/2,f=e&&i0&&p.height>0&&O(m).drawImage(p,f,l,i,c),m}var ut=class{constructor(t,e=!1){this._imageTensors=[];this._canvases=[];this._treatAsBatchInput=!1;this._inputDimensions=[];this._inputSize=0;if(!Array.isArray(t))throw new Error(`NetInput.constructor - expected inputs to be an Array of TResolvedNetInput or to be instanceof tf.Tensor4D, instead have ${t}`);this._treatAsBatchInput=e,this._batchSize=t.length,t.forEach((r,n)=>{if(ht(r)){this._imageTensors[n]=r,this._inputDimensions[n]=r.shape;return}if(U(r)){let s=r.shape[0];if(s!==1)throw new Error(`NetInput - tf.Tensor4D with batchSize ${s} passed, but not supported in input array`);this._imageTensors[n]=r,this._inputDimensions[n]=r.shape.slice(1);return}let a=r instanceof P.getEnv().Canvas?r:We(r);this._canvases[n]=a,this._inputDimensions[n]=[a.height,a.width,3]})}get imageTensors(){return this._imageTensors}get canvases(){return this._canvases}get isBatchInput(){return this.batchSize>1||this._treatAsBatchInput}get batchSize(){return this._batchSize}get inputDimensions(){return this._inputDimensions}get inputSize(){return this._inputSize}get reshapedInputDimensions(){return it(this.batchSize,0,1).map((t,e)=>this.getReshapedInputDimensions(e))}getInput(t){return this.canvases[t]||this.imageTensors[t]}getInputDimensions(t){return this._inputDimensions[t]}getInputHeight(t){return this._inputDimensions[t][0]}getInputWidth(t){return this._inputDimensions[t][1]}getReshapedInputDimensions(t){if(typeof this.inputSize!="number")throw new Error("getReshapedInputDimensions - inputSize not set, toBatchTensor has not been called yet");let e=this.getInputWidth(t),r=this.getInputHeight(t);return Rr({width:e,height:r},this.inputSize)}toBatchTensor(t,e=!0){return this._inputSize=t,V.tidy(()=>{let r=it(this.batchSize,0,1).map(a=>{let s=this.getInput(a);if(s instanceof V.Tensor){let i=U(s)?s:V.expandDims(s);return i=Vr(i,e),(i.shape[1]!==t||i.shape[2]!==t)&&(i=V.image.resizeBilinear(i,[t,t],!1,!1)),i.as3D(t,t,3)}if(s instanceof P.getEnv().Canvas)return V.browser.fromPixels(eo(s,t,e));throw new Error(`toBatchTensor - at batchIdx ${a}, expected input to be instanceof tf.Tensor or instanceof HTMLCanvasElement, instead have ${s}`)});return V.stack(r.map(a=>V.cast(a,"float32"))).as4D(this.batchSize,t,t,3)})}};async function C(o){if(o instanceof ut)return o;let t=Array.isArray(o)?o:[o];if(!t.length)throw new Error("toNetInput - empty array passed as input");let e=n=>Array.isArray(o)?` at input index ${n}:`:"",r=t.map(Ut);return r.forEach((n,a)=>{if(!ir(n)&&!ht(n)&&!U(n))throw typeof t[a]=="string"?new Error(`toNetInput -${e(a)} string passed, but could not resolve HTMLElement for element id ${t[a]}`):new Error(`toNetInput -${e(a)} expected media to be of type HTMLImageElement | HTMLVideoElement | HTMLCanvasElement | tf.Tensor3D, or to be an element id`);if(U(n)){let s=n.shape[0];if(s!==1)throw new Error(`toNetInput -${e(a)} tf.Tensor4D with batchSize ${s} passed, but not supported in input array`)}}),await Promise.all(r.map(n=>ir(n)&&Kr(n))),new ut(r,Array.isArray(o))}async function le(o,t){let{Canvas:e}=P.getEnv(),r=o;if(!(o instanceof e)){let s=await C(o);if(s.batchSize>1)throw new Error("extractFaces - batchSize > 1 not supported");let i=s.getInput(0);r=i instanceof e?i:await to(i)}let n=O(r);return t.map(s=>s instanceof M?s.forSize(r.width,r.height).box.floor():s).map(s=>s.clipAtImageBorders(r.width,r.height)).map(({x:s,y:i,width:c,height:m})=>{let p=Jt({width:c,height:m});return c>0&&m>0&&O(p).putImageData(n.getImageData(s,i,c,m),0,0),p})}var cr=v(x());async function de(o,t){if(!ht(o)&&!U(o))throw new Error("extractFaceTensors - expected image tensor to be 3D or 4D");if(U(o)&&o.shape[0]>1)throw new Error("extractFaceTensors - batchSize > 1 not supported");return cr.tidy(()=>{let[e,r,n]=o.shape.slice(U(o)?1:0);return t.map(i=>i instanceof M?i.forSize(r,e).box:i).map(i=>i.clipAtImageBorders(r,e)).filter(i=>i.width>0&&i.height>0).map(({x:i,y:c,width:m,height:p})=>cr.slice3d(o.as3D(e,r,n),[c,i,0],[p,m,n]))})}async function xt(o,t){let{fetch:e}=P.getEnv(),r=await e(o,t);if(!(r.status<400))throw new Error(`failed to fetch: (${r.status}) ${r.statusText}, from url: ${r.url}`);return r}async function An(o){let t=await xt(o),e=await t.blob();if(!e.type.startsWith("image/"))throw new Error(`fetchImage - expected blob type to be of type image/*, instead have: ${e.type}, for url: ${t.url}`);return Qr(e)}async function ro(o){return(await xt(o)).json()}async function Wn(o){return new Float32Array(await(await xt(o)).arrayBuffer())}function wo(o){return new Promise((t,e)=>{o instanceof Blob||e(new Error("bufferToVideo - expected buf to be of type: Blob"));let r=P.getEnv().createVideoElement();r.oncanplay=()=>t(r),r.onerror=e,r.playsInline=!0,r.muted=!0,r.src=URL.createObjectURL(o),r.play()})}async function kn(o){let t=await xt(o),e=await t.blob();if(!e.type.startsWith("video/"))throw new Error(`fetchVideo - expected blob type to be of type video/*, instead have: ${e.type}, for url: ${t.url}`);return wo(e)}var Fo=v(x());function mr(o,t){let e=`${t}-weights_manifest.json`;if(!o)return{modelBaseUri:"",manifestUri:e};if(o==="/")return{modelBaseUri:"/",manifestUri:`/${e}`};let r=o.startsWith("http://")?"http://":o.startsWith("https://")?"https://":"";o=o.replace(r,"");let n=o.split("/").filter(i=>i),a=o.endsWith(".json")?n[n.length-1]:e,s=r+(o.endsWith(".json")?n.slice(0,n.length-1):n).join("/");return s=o.startsWith("/")?`/${s}`:s,{modelBaseUri:s,manifestUri:s==="/"?`/${a}`:`${s}/${a}`}}async function oo(o,t){let{manifestUri:e,modelBaseUri:r}=mr(o,t),n=await ro(e);return Fo.io.loadWeights(n,r)}function Bn(o,t,e=!1){let{width:r,height:n}=e?Xt(t):t;return o.width=r,o.height=n,{width:r,height:n}}var ye=v(x());var vt=v(x());var A=class{constructor(t){this._params=void 0;this._paramMappings=[];this._name=t}get params(){return this._params}get paramMappings(){return this._paramMappings}get isLoaded(){return!!this.params}getParamFromPath(t){let{obj:e,objProp:r}=this.traversePropertyPath(t);return e[r]}reassignParamFromPath(t,e){let{obj:r,objProp:n}=this.traversePropertyPath(t);r[n].dispose(),r[n]=e}getParamList(){return this._paramMappings.map(({paramPath:t})=>({path:t,tensor:this.getParamFromPath(t)}))}getTrainableParams(){return this.getParamList().filter(t=>t.tensor instanceof vt.Variable)}getFrozenParams(){return this.getParamList().filter(t=>!(t.tensor instanceof vt.Variable))}variable(){this.getFrozenParams().forEach(({path:t,tensor:e})=>{this.reassignParamFromPath(t,e.variable())})}freeze(){this.getTrainableParams().forEach(({path:t,tensor:e})=>{let r=vt.tensor(e.dataSync());e.dispose(),this.reassignParamFromPath(t,r)})}dispose(t=!0){this.getParamList().forEach(e=>{if(t&&e.tensor.isDisposed)throw new Error(`param tensor has already been disposed for path ${e.path}`);e.tensor.dispose()}),this._params=void 0}serializeParams(){return new Float32Array(this.getParamList().map(({tensor:t})=>Array.from(t.dataSync())).reduce((t,e)=>t.concat(e)))}async load(t){if(t instanceof Float32Array){this.extractWeights(t);return}await this.loadFromUri(t)}async loadFromUri(t){if(t&&typeof t!="string")throw new Error(`${this._name}.loadFromUri - expected model uri`);let e=await oo(t,this.getDefaultModelName());this.loadFromWeightMap(e)}async loadFromDisk(t){if(t&&typeof t!="string")throw new Error(`${this._name}.loadFromDisk - expected model file path`);let{readFile:e}=P.getEnv(),{manifestUri:r,modelBaseUri:n}=mr(t,this.getDefaultModelName()),a=m=>Promise.all(m.map(p=>e(p).then(u=>u.buffer))),s=vt.io.weightsLoaderFactory(a),i=JSON.parse((await e(r)).toString()),c=await s(i,n);this.loadFromWeightMap(c)}loadFromWeightMap(t){let{paramMappings:e,params:r}=this.extractParamsFromWeightMap(t);this._paramMappings=e,this._params=r}extractWeights(t){let{paramMappings:e,params:r}=this.extractParams(t);this._paramMappings=e,this._params=r}traversePropertyPath(t){if(!this.params)throw new Error("traversePropertyPath - model has no loaded params");let e=t.split("/").reduce((a,s)=>{if(!a.nextObj.hasOwnProperty(s))throw new Error(`traversePropertyPath - object does not have property ${s}, for path ${t}`);return{obj:a.nextObj,objProp:s,nextObj:a.nextObj[s]}},{nextObj:this.params}),{obj:r,objProp:n}=e;if(!r||!n||!(r[n]instanceof vt.Tensor))throw new Error(`traversePropertyPath - parameter is not a tensor, for path ${t}`);return{obj:r,objProp:n}}};var I=v(x());var he=v(x());function H(o,t,e){return he.tidy(()=>{let r=he.separableConv2d(o,t.depthwise_filter,t.pointwise_filter,e,"same");return r=he.add(r,t.bias),r})}function pr(o,t,e=!1){return I.tidy(()=>{let r=I.relu(e?I.add(I.conv2d(o,t.conv0.filters,[2,2],"same"),t.conv0.bias):H(o,t.conv0,[2,2])),n=H(r,t.conv1,[1,1]),a=I.relu(I.add(r,n)),s=H(a,t.conv2,[1,1]);return I.relu(I.add(r,I.add(n,s)))})}function ke(o,t,e=!1,r=!0){return I.tidy(()=>{let n=I.relu(e?I.add(I.conv2d(o,t.conv0.filters,r?[2,2]:[1,1],"same"),t.conv0.bias):H(o,t.conv0,r?[2,2]:[1,1])),a=H(n,t.conv1,[1,1]),s=I.relu(I.add(n,a)),i=H(s,t.conv2,[1,1]),c=I.relu(I.add(n,I.add(a,i))),m=H(c,t.conv3,[1,1]);return I.relu(I.add(n,I.add(a,I.add(i,m))))})}var It=v(x());function qt(o,t,e="same",r=!1){return It.tidy(()=>{let n=It.add(It.conv2d(o,t.filters,[1,1],e),t.bias);return r?It.relu(n):n})}function B(o,t){Object.keys(o).forEach(e=>{t.some(r=>r.originalPath===e)||o[e].dispose()})}var ur=v(x());function be(o,t){return(e,r,n,a)=>{let s=ur.tensor4d(o(e*r*n*n),[n,n,e,r]),i=ur.tensor1d(o(r));return t.push({paramPath:`${a}/filters`},{paramPath:`${a}/bias`}),{filters:s,bias:i}}}var fr=v(x());function lr(o,t){return(e,r,n)=>{let a=fr.tensor2d(o(e*r),[e,r]),s=fr.tensor1d(o(r));return t.push({paramPath:`${n}/weights`},{paramPath:`${n}/bias`}),{weights:a,bias:s}}}var Re=v(x());var Be=class{constructor(t,e,r){this.depthwise_filter=t;this.pointwise_filter=e;this.bias=r}};function ge(o,t){return(e,r,n)=>{let a=Re.tensor4d(o(9*e),[3,3,e,1]),s=Re.tensor4d(o(e*r),[1,1,e,r]),i=Re.tensor1d(o(r));return t.push({paramPath:`${n}/depthwise_filter`},{paramPath:`${n}/pointwise_filter`},{paramPath:`${n}/bias`}),new Be(a,s,i)}}function xe(o){return t=>{let e=o(`${t}/depthwise_filter`,4),r=o(`${t}/pointwise_filter`,4),n=o(`${t}/bias`,1);return new Be(e,r,n)}}function Y(o,t){return(e,r,n)=>{let a=o[e];if(!Ot(a,r))throw new Error(`expected weightMap[${e}] to be a Tensor${r}D, instead have ${a}`);return t.push({originalPath:e,paramPath:n||e}),a}}function R(o){let t=o;function e(n){let a=t.slice(0,n);return t=t.slice(n),a}function r(){return t}return{extractWeights:e,getRemainingWeights:r}}function dr(o,t){let e=be(o,t),r=ge(o,t);function n(s,i,c,m=!1){let p=m?e(s,i,3,`${c}/conv0`):r(s,i,`${c}/conv0`),u=r(i,i,`${c}/conv1`),f=r(i,i,`${c}/conv2`);return{conv0:p,conv1:u,conv2:f}}function a(s,i,c,m=!1){let{conv0:p,conv1:u,conv2:f}=n(s,i,c,m),l=r(i,i,`${c}/conv3`);return{conv0:p,conv1:u,conv2:f,conv3:l}}return{extractDenseBlock3Params:n,extractDenseBlock4Params:a}}function Do(o){let t=[],{extractWeights:e,getRemainingWeights:r}=R(o),{extractDenseBlock4Params:n}=dr(e,t),a=n(3,32,"dense0",!0),s=n(32,64,"dense1"),i=n(64,128,"dense2"),c=n(128,256,"dense3");if(r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{paramMappings:t,params:{dense0:a,dense1:s,dense2:i,dense3:c}}}function hr(o){return t=>{let e=o(`${t}/filters`,4),r=o(`${t}/bias`,1);return{filters:e,bias:r}}}function br(o,t){let e=Y(o,t),r=hr(e),n=xe(e);function a(i,c=!1){let m=c?r(`${i}/conv0`):n(`${i}/conv0`),p=n(`${i}/conv1`),u=n(`${i}/conv2`);return{conv0:m,conv1:p,conv2:u}}function s(i,c=!1){let m=c?r(`${i}/conv0`):n(`${i}/conv0`),p=n(`${i}/conv1`),u=n(`${i}/conv2`),f=n(`${i}/conv3`);return{conv0:m,conv1:p,conv2:u,conv3:f}}return{extractDenseBlock3Params:a,extractDenseBlock4Params:s}}function Eo(o){let t=[],{extractDenseBlock4Params:e}=br(o,t),r={dense0:e("dense0",!0),dense1:e("dense1"),dense2:e("dense2"),dense3:e("dense3")};return B(o,t),{params:r,paramMappings:t}}var ve=class extends A{constructor(){super("FaceFeatureExtractor")}forwardInput(t){let{params:e}=this;if(!e)throw new Error("FaceFeatureExtractor - load model before inference");return ye.tidy(()=>{let r=ye.cast(t.toBatchTensor(112,!0),"float32"),a=rt(r,[122.782,117.001,104.298]).div(255),s=ke(a,e.dense0,!0);return s=ke(s,e.dense1),s=ke(s,e.dense2),s=ke(s,e.dense3),s=ye.avgPool(s,[7,7],[2,2],"valid"),s})}async forward(t){return this.forwardInput(await C(t))}getDefaultModelName(){return"face_feature_extractor_model"}extractParamsFromWeightMap(t){return Eo(t)}extractParams(t){return Do(t)}};var Io=v(x());var _e=v(x());function $e(o,t){return _e.tidy(()=>_e.add(_e.matMul(o,t.weights),t.bias))}function Mo(o,t,e){let r=[],{extractWeights:n,getRemainingWeights:a}=R(o),i=lr(n,r)(t,e,"fc");if(a().length!==0)throw new Error(`weights remaing after extract: ${a().length}`);return{paramMappings:r,params:{fc:i}}}function Co(o){let t=[],e=Y(o,t);function r(a){let s=e(`${a}/weights`,2),i=e(`${a}/bias`,1);return{weights:s,bias:i}}let n={fc:r("fc")};return B(o,t),{params:n,paramMappings:t}}function gr(o){let t={},e={};return Object.keys(o).forEach(r=>{let n=r.startsWith("fc")?e:t;n[r]=o[r]}),{featureExtractorMap:t,classifierMap:e}}var Te=class extends A{constructor(e,r){super(e);this._faceFeatureExtractor=r}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(e){let{params:r}=this;if(!r)throw new Error(`${this._name} - load model before inference`);return Io.tidy(()=>{let n=e instanceof ut?this.faceFeatureExtractor.forwardInput(e):e;return $e(n.as2D(n.shape[0],-1),r.fc)})}dispose(e=!0){this.faceFeatureExtractor.dispose(e),super.dispose(e)}loadClassifierParams(e){let{params:r,paramMappings:n}=this.extractClassifierParams(e);this._params=r,this._paramMappings=n}extractClassifierParams(e){return Mo(e,this.getClassifierChannelsIn(),this.getClassifierChannelsOut())}extractParamsFromWeightMap(e){let{featureExtractorMap:r,classifierMap:n}=gr(e);return this.faceFeatureExtractor.loadFromWeightMap(r),Co(n)}extractParams(e){let r=this.getClassifierChannelsIn(),n=this.getClassifierChannelsOut(),a=n*r+n,s=e.slice(0,e.length-a),i=e.slice(e.length-a);return this.faceFeatureExtractor.extractWeights(s),this.extractClassifierParams(i)}};var no=["neutral","happy","sad","angry","fearful","disgusted","surprised"],yt=class{constructor(t){this.neutral=0;this.happy=0;this.sad=0;this.angry=0;this.fearful=0;this.disgusted=0;this.surprised=0;if(t.length!==7)throw new Error(`FaceExpressions.constructor - expected probabilities.length to be 7, have: ${t.length}`);no.forEach((e,r)=>{this[e]=t[r]})}asSortedArray(){return no.map(t=>({expression:t,probability:this[t]})).sort((t,e)=>e.probability-t.probability)}};var Oe=class extends Te{constructor(t=new ve){super("FaceExpressionNet",t)}forwardInput(t){return Pe.tidy(()=>Pe.softmax(this.runNet(t)))}async forward(t){return this.forwardInput(await C(t))}async predictExpressions(t){let e=await C(t),r=await this.forwardInput(e),n=await Promise.all(Pe.unstack(r).map(async s=>{let i=s.dataSync();return s.dispose(),i}));r.dispose();let a=n.map(s=>new yt(s));return e.isBatchInput?a:a[0]}getDefaultModelName(){return"face_expression_model"}getClassifierChannelsIn(){return 256}getClassifierChannelsOut(){return 7}};function ao(o){return o.expressions instanceof yt}function xr(o,t){return{...o,...{expressions:t}}}function Rn(o,t,e=.1,r){(Array.isArray(t)?t:[t]).forEach(a=>{let s=a instanceof yt?a:ao(a)?a.expressions:void 0;if(!s)throw new Error("drawFaceExpressions - expected faceExpressions to be FaceExpressions | WithFaceExpressions<{}> or array thereof");let c=s.asSortedArray().filter(u=>u.probability>e),m=pt(a)?a.detection.box.bottomLeft:r||new b(0,0);new gt(c.map(u=>`${u.expression} (${Ht(u.probability)})`),m).draw(o)})}function Zt(o){return pt(o)&&o.landmarks instanceof z&&o.unshiftedLandmarks instanceof z&&o.alignedRect instanceof M}function $n(o){let t=(i,c,m,p)=>Math.atan2(p-c,m-i)%Math.PI,e=i=>i*180/Math.PI,r={roll:void 0,pitch:void 0,yaw:void 0};if(!o||!o._positions||o._positions.length!==68)return r;let n=o._positions;r.roll=-t(n[36]._x,n[36]._y,n[45]._x,n[45]._y),r.pitch=t(0,Math.abs(n[0]._x-n[30]._x)/n[30]._x,Math.PI,Math.abs(n[16]._x-n[30]._x)/n[30]._x);let a=n.reduce((i,c)=>ii>c._y?i:c._y,-1/0);return r.yaw=Math.PI*(o._imgDims._height/(s-a)/1.4-1),r}function we(o,t){let{box:e}=o.detection,r=t.shiftBy(e.x,e.y),n=r.align(),{imageDims:a}=o.detection,s=new M(o.detection.score,n.rescale(a.reverse()),a),i=$n(t);return{...o,...{landmarks:r,unshiftedLandmarks:t,alignedRect:s,angle:i}}}var vr=class{constructor(t={}){let{drawLines:e=!0,drawPoints:r=!0,lineWidth:n,lineColor:a,pointSize:s,pointColor:i}=t;this.drawLines=e,this.drawPoints=r,this.lineWidth=n||1,this.pointSize=s||2,this.lineColor=a||"rgba(0, 255, 255, 1)",this.pointColor=i||"rgba(255, 0, 255, 1)"}},yr=class{constructor(t,e={}){this.faceLandmarks=t,this.options=new vr(e)}draw(t){let e=O(t),{drawLines:r,drawPoints:n,lineWidth:a,lineColor:s,pointSize:i,pointColor:c}=this.options;if(r&&this.faceLandmarks instanceof Gt&&(e.strokeStyle=s,e.lineWidth=a,dt(e,this.faceLandmarks.getJawOutline()),dt(e,this.faceLandmarks.getLeftEyeBrow()),dt(e,this.faceLandmarks.getRightEyeBrow()),dt(e,this.faceLandmarks.getNose()),dt(e,this.faceLandmarks.getLeftEye(),!0),dt(e,this.faceLandmarks.getRightEye(),!0),dt(e,this.faceLandmarks.getMouth(),!0)),n){e.strokeStyle=c,e.fillStyle=c;let m=p=>{e.beginPath(),e.arc(p.x,p.y,i,0,2*Math.PI),e.fill()};this.faceLandmarks.positions.forEach(m)}}};function On(o,t){(Array.isArray(t)?t:[t]).forEach(r=>{let n=r instanceof z?r:Zt(r)?r.landmarks:void 0;if(!n)throw new Error("drawFaceLandmarks - expected faceExpressions to be FaceLandmarks | WithFaceLandmarks> or array thereof");new yr(n).draw(o)})}var No="1.7.1";var ft=v(x());var S=v(x());function Vn(o,t){let e=be(o,t),r=ge(o,t);function n(s,i,c){let m=r(s,i,`${c}/separable_conv0`),p=r(i,i,`${c}/separable_conv1`),u=e(s,i,1,`${c}/expansion_conv`);return{separable_conv0:m,separable_conv1:p,expansion_conv:u}}function a(s,i){let c=r(s,s,`${i}/separable_conv0`),m=r(s,s,`${i}/separable_conv1`),p=r(s,s,`${i}/separable_conv2`);return{separable_conv0:c,separable_conv1:m,separable_conv2:p}}return{extractConvParams:e,extractSeparableConvParams:r,extractReductionBlockParams:n,extractMainBlockParams:a}}function So(o,t){let e=[],{extractWeights:r,getRemainingWeights:n}=R(o),{extractConvParams:a,extractSeparableConvParams:s,extractReductionBlockParams:i,extractMainBlockParams:c}=Vn(r,e),m=a(3,32,3,"entry_flow/conv_in"),p=i(32,64,"entry_flow/reduction_block_0"),u=i(64,128,"entry_flow/reduction_block_1"),f={conv_in:m,reduction_block_0:p,reduction_block_1:u},l={};it(t,0,1).forEach(h=>{l[`main_block_${h}`]=c(128,`middle_flow/main_block_${h}`)});let g=i(128,256,"exit_flow/reduction_block"),T=s(256,512,"exit_flow/separable_conv"),D={reduction_block:g,separable_conv:T};if(n().length!==0)throw new Error(`weights remaing after extract: ${n().length}`);return{paramMappings:e,params:{entry_flow:f,middle_flow:l,exit_flow:D}}}function Yn(o,t){let e=Y(o,t),r=hr(e),n=xe(e);function a(i){let c=n(`${i}/separable_conv0`),m=n(`${i}/separable_conv1`),p=r(`${i}/expansion_conv`);return{separable_conv0:c,separable_conv1:m,expansion_conv:p}}function s(i){let c=n(`${i}/separable_conv0`),m=n(`${i}/separable_conv1`),p=n(`${i}/separable_conv2`);return{separable_conv0:c,separable_conv1:m,separable_conv2:p}}return{extractConvParams:r,extractSeparableConvParams:n,extractReductionBlockParams:a,extractMainBlockParams:s}}function Lo(o,t){let e=[],{extractConvParams:r,extractSeparableConvParams:n,extractReductionBlockParams:a,extractMainBlockParams:s}=Yn(o,e),i=r("entry_flow/conv_in"),c=a("entry_flow/reduction_block_0"),m=a("entry_flow/reduction_block_1"),p={conv_in:i,reduction_block_0:c,reduction_block_1:m},u={};it(t,0,1).forEach(T=>{u[`main_block_${T}`]=s(`middle_flow/main_block_${T}`)});let f=a("exit_flow/reduction_block"),l=n("exit_flow/separable_conv"),g={reduction_block:f,separable_conv:l};return B(o,e),{params:{entry_flow:p,middle_flow:u,exit_flow:g},paramMappings:e}}function Ao(o,t,e){return S.add(S.conv2d(o,t.filters,e,"same"),t.bias)}function io(o,t,e=!0){let r=e?S.relu(o):o;return r=H(r,t.separable_conv0,[1,1]),r=H(S.relu(r),t.separable_conv1,[1,1]),r=S.maxPool(r,[3,3],[2,2],"same"),r=S.add(r,Ao(o,t.expansion_conv,[2,2])),r}function Gn(o,t){let e=H(S.relu(o),t.separable_conv0,[1,1]);return e=H(S.relu(e),t.separable_conv1,[1,1]),e=H(S.relu(e),t.separable_conv2,[1,1]),e=S.add(e,o),e}var _r=class extends A{constructor(e){super("TinyXception");this._numMainBlocks=e}forwardInput(e){let{params:r}=this;if(!r)throw new Error("TinyXception - load model before inference");return S.tidy(()=>{let n=S.cast(e.toBatchTensor(112,!0),"float32"),s=rt(n,[122.782,117.001,104.298]).div(255),i=S.relu(Ao(s,r.entry_flow.conv_in,[2,2]));return i=io(i,r.entry_flow.reduction_block_0,!1),i=io(i,r.entry_flow.reduction_block_1),it(this._numMainBlocks,0,1).forEach(c=>{i=Gn(i,r.middle_flow[`main_block_${c}`])}),i=io(i,r.exit_flow.reduction_block),i=S.relu(H(i,r.exit_flow.separable_conv,[1,1])),i})}async forward(e){return this.forwardInput(await C(e))}getDefaultModelName(){return"tiny_xception_model"}extractParamsFromWeightMap(e){return Lo(e,this._numMainBlocks)}extractParams(e){return So(e,this._numMainBlocks)}};function Wo(o){let t=[],{extractWeights:e,getRemainingWeights:r}=R(o),n=lr(e,t),a=n(512,1,"fc/age"),s=n(512,2,"fc/gender");if(r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{paramMappings:t,params:{fc:{age:a,gender:s}}}}function ko(o){let t=[],e=Y(o,t);function r(a){let s=e(`${a}/weights`,2),i=e(`${a}/bias`,1);return{weights:s,bias:i}}let n={fc:{age:r("fc/age"),gender:r("fc/gender")}};return B(o,t),{params:n,paramMappings:t}}var Tr=(e=>(e.FEMALE="female",e.MALE="male",e))(Tr||{});var He=class extends A{constructor(e=new _r(2)){super("AgeGenderNet");this._faceFeatureExtractor=e}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(e){let{params:r}=this;if(!r)throw new Error(`${this._name} - load model before inference`);return ft.tidy(()=>{let n=e instanceof ut?this.faceFeatureExtractor.forwardInput(e):e,a=ft.avgPool(n,[7,7],[2,2],"valid").as2D(n.shape[0],-1),s=$e(a,r.fc.age).as1D(),i=$e(a,r.fc.gender);return{age:s,gender:i}})}forwardInput(e){return ft.tidy(()=>{let{age:r,gender:n}=this.runNet(e);return{age:r,gender:ft.softmax(n)}})}async forward(e){return this.forwardInput(await C(e))}async predictAgeAndGender(e){let r=await C(e),n=await this.forwardInput(r),a=ft.unstack(n.age),s=ft.unstack(n.gender),i=a.map((m,p)=>({ageTensor:m,genderTensor:s[p]})),c=await Promise.all(i.map(async({ageTensor:m,genderTensor:p})=>{let u=m.dataSync()[0],f=p.dataSync()[0],l=f>.5,g=l?"male":"female",T=l?f:1-f;return m.dispose(),p.dispose(),{age:u,gender:g,genderProbability:T}}));return n.age.dispose(),n.gender.dispose(),r.isBatchInput?c:c[0]}getDefaultModelName(){return"age_gender_model"}dispose(e=!0){this.faceFeatureExtractor.dispose(e),super.dispose(e)}loadClassifierParams(e){let{params:r,paramMappings:n}=this.extractClassifierParams(e);this._params=r,this._paramMappings=n}extractClassifierParams(e){return Wo(e)}extractParamsFromWeightMap(e){let{featureExtractorMap:r,classifierMap:n}=gr(e);return this.faceFeatureExtractor.loadFromWeightMap(r),ko(n)}extractParams(e){let n=e.slice(0,e.length-1539),a=e.slice(e.length-1539);return this.faceFeatureExtractor.extractWeights(n),this.extractClassifierParams(a)}};var G=v(x());var Fe=class extends Te{postProcess(t,e,r){let n=r.map(({width:s,height:i})=>{let c=e/Math.max(i,s);return{width:s*c,height:i*c}}),a=n.length;return G.tidy(()=>{let s=(u,f)=>G.stack([G.fill([68],u,"float32"),G.fill([68],f,"float32")],1).as2D(1,136).as1D(),i=(u,f)=>{let{width:l,height:g}=n[u];return f(l,g)?Math.abs(l-g)/2:0},c=u=>i(u,(f,l)=>fi(u,(f,l)=>ls(c(f),m(f))))).div(G.stack(Array.from(Array(a),(u,f)=>s(n[f].width,n[f].height))))})}forwardInput(t){return G.tidy(()=>{let e=this.runNet(t);return this.postProcess(e,t.inputSize,t.inputDimensions.map(([r,n])=>({height:r,width:n})))})}async forward(t){return this.forwardInput(await C(t))}async detectLandmarks(t){let e=await C(t),r=G.tidy(()=>G.unstack(this.forwardInput(e))),n=await Promise.all(r.map(async(a,s)=>{let i=Array.from(a.dataSync()),c=i.filter((p,u)=>rr(u)),m=i.filter((p,u)=>!rr(u));return new Gt(Array(68).fill(0).map((p,u)=>new b(c[u],m[u])),{height:e.getInputHeight(s),width:e.getInputWidth(s)})}));return r.forEach(a=>a.dispose()),e.isBatchInput?n:n[0]}getClassifierChannelsOut(){return 136}};var Kt=class extends Fe{constructor(t=new ve){super("FaceLandmark68Net",t)}getDefaultModelName(){return"face_landmark_68_model"}getClassifierChannelsIn(){return 256}};var De=v(x());function Bo(o){let t=[],{extractDenseBlock3Params:e}=br(o,t),r={dense0:e("dense0",!0),dense1:e("dense1"),dense2:e("dense2")};return B(o,t),{params:r,paramMappings:t}}function Ro(o){let t=[],{extractWeights:e,getRemainingWeights:r}=R(o),{extractDenseBlock3Params:n}=dr(e,t),a=n(3,32,"dense0",!0),s=n(32,64,"dense1"),i=n(64,128,"dense2");if(r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{paramMappings:t,params:{dense0:a,dense1:s,dense2:i}}}var Pr=class extends A{constructor(){super("TinyFaceFeatureExtractor")}forwardInput(t){let{params:e}=this;if(!e)throw new Error("TinyFaceFeatureExtractor - load model before inference");return De.tidy(()=>{let r=De.cast(t.toBatchTensor(112,!0),"float32"),a=rt(r,[122.782,117.001,104.298]).div(255),s=pr(a,e.dense0,!0);return s=pr(s,e.dense1),s=pr(s,e.dense2),s=De.avgPool(s,[14,14],[2,2],"valid"),s})}async forward(t){return this.forwardInput(await C(t))}getDefaultModelName(){return"face_feature_extractor_tiny_model"}extractParamsFromWeightMap(t){return Bo(t)}extractParams(t){return Ro(t)}};var ze=class extends Fe{constructor(t=new Pr){super("FaceLandmark68TinyNet",t)}getDefaultModelName(){return"face_landmark_68_tiny_model"}getClassifierChannelsIn(){return 128}};var co=class extends Kt{};var nt=v(x());var Ee=v(x());var wr=v(x());function $o(o,t){return wr.add(wr.mul(o,t.weights),t.biases)}function mo(o,t,e,r,n="same"){let{filters:a,bias:s}=t.conv,i=Ee.conv2d(o,a,e,n);return i=Ee.add(i,s),i=$o(i,t.scale),r?Ee.relu(i):i}function Oo(o,t){return mo(o,t,[1,1],!0)}function po(o,t){return mo(o,t,[1,1],!1)}function Fr(o,t){return mo(o,t,[2,2],!0,"valid")}var j=v(x());function jn(o,t){function e(i,c,m){let p=o(i),u=p.length/(c*m*m);if(Br(u))throw new Error(`depth has to be an integer: ${u}, weights.length: ${p.length}, numFilters: ${c}, filterSize: ${m}`);return j.tidy(()=>j.transpose(j.tensor4d(p,[c,u,m,m]),[2,3,1,0]))}function r(i,c,m,p){let u=e(i,c,m),f=j.tensor1d(o(c));return t.push({paramPath:`${p}/filters`},{paramPath:`${p}/bias`}),{filters:u,bias:f}}function n(i,c){let m=j.tensor1d(o(i)),p=j.tensor1d(o(i));return t.push({paramPath:`${c}/weights`},{paramPath:`${c}/biases`}),{weights:m,biases:p}}function a(i,c,m,p){let u=r(i,c,m,`${p}/conv`),f=n(c,`${p}/scale`);return{conv:u,scale:f}}function s(i,c,m,p,u=!1){let f=a((u?.5:1)*i,c,m,`${p}/conv1`),l=a(i,c,m,`${p}/conv2`);return{conv1:f,conv2:l}}return{extractConvLayerParams:a,extractResidualLayerParams:s}}function Ho(o){let{extractWeights:t,getRemainingWeights:e}=R(o),r=[],{extractConvLayerParams:n,extractResidualLayerParams:a}=jn(t,r),s=n(4704,32,7,"conv32_down"),i=a(9216,32,3,"conv32_1"),c=a(9216,32,3,"conv32_2"),m=a(9216,32,3,"conv32_3"),p=a(36864,64,3,"conv64_down",!0),u=a(36864,64,3,"conv64_1"),f=a(36864,64,3,"conv64_2"),l=a(36864,64,3,"conv64_3"),g=a(147456,128,3,"conv128_down",!0),T=a(147456,128,3,"conv128_1"),D=a(147456,128,3,"conv128_2"),h=a(589824,256,3,"conv256_down",!0),_=a(589824,256,3,"conv256_1"),y=a(589824,256,3,"conv256_2"),E=a(589824,256,3,"conv256_down_out"),W=j.tidy(()=>j.transpose(j.tensor2d(t(256*128),[128,256]),[1,0]));if(r.push({paramPath:"fc"}),e().length!==0)throw new Error(`weights remaing after extract: ${e().length}`);return{params:{conv32_down:s,conv32_1:i,conv32_2:c,conv32_3:m,conv64_down:p,conv64_1:u,conv64_2:f,conv64_3:l,conv128_down:g,conv128_1:T,conv128_2:D,conv256_down:h,conv256_1:_,conv256_2:y,conv256_down_out:E,fc:W},paramMappings:r}}function Un(o,t){let e=Y(o,t);function r(s){let i=e(`${s}/scale/weights`,1),c=e(`${s}/scale/biases`,1);return{weights:i,biases:c}}function n(s){let i=e(`${s}/conv/filters`,4),c=e(`${s}/conv/bias`,1),m=r(s);return{conv:{filters:i,bias:c},scale:m}}function a(s){return{conv1:n(`${s}/conv1`),conv2:n(`${s}/conv2`)}}return{extractConvLayerParams:n,extractResidualLayerParams:a}}function zo(o){let t=[],{extractConvLayerParams:e,extractResidualLayerParams:r}=Un(o,t),n=e("conv32_down"),a=r("conv32_1"),s=r("conv32_2"),i=r("conv32_3"),c=r("conv64_down"),m=r("conv64_1"),p=r("conv64_2"),u=r("conv64_3"),f=r("conv128_down"),l=r("conv128_1"),g=r("conv128_2"),T=r("conv256_down"),D=r("conv256_1"),h=r("conv256_2"),_=r("conv256_down_out"),{fc:y}=o;if(t.push({originalPath:"fc",paramPath:"fc"}),!kr(y))throw new Error(`expected weightMap[fc] to be a Tensor2D, instead have ${y}`);let E={conv32_down:n,conv32_1:a,conv32_2:s,conv32_3:i,conv64_down:c,conv64_1:m,conv64_2:p,conv64_3:u,conv128_down:f,conv128_1:l,conv128_2:g,conv256_down:T,conv256_1:D,conv256_2:h,conv256_down_out:_,fc:y};return B(o,t),{params:E,paramMappings:t}}var $=v(x());function ot(o,t){let e=Oo(o,t.conv1);return e=po(e,t.conv2),e=$.add(e,o),e=$.relu(e),e}function Ve(o,t){let e=Fr(o,t.conv1);e=po(e,t.conv2);let r=$.avgPool(o,2,2,"valid"),n=$.zeros(r.shape),a=r.shape[3]!==e.shape[3];if(r.shape[1]!==e.shape[1]||r.shape[2]!==e.shape[2]){let i=[...e.shape];i[1]=1;let c=$.zeros(i);e=$.concat([e,c],1);let m=[...e.shape];m[2]=1;let p=$.zeros(m);e=$.concat([e,p],2)}return r=a?$.concat([r,n],3):r,e=$.add(r,e),e=$.relu(e),e}var Qt=class extends A{constructor(){super("FaceRecognitionNet")}forwardInput(t){let{params:e}=this;if(!e)throw new Error("FaceRecognitionNet - load model before inference");return nt.tidy(()=>{let r=nt.cast(t.toBatchTensor(150,!0),"float32"),a=rt(r,[122.782,117.001,104.298]).div(255),s=Fr(a,e.conv32_down);s=nt.maxPool(s,3,2,"valid"),s=ot(s,e.conv32_1),s=ot(s,e.conv32_2),s=ot(s,e.conv32_3),s=Ve(s,e.conv64_down),s=ot(s,e.conv64_1),s=ot(s,e.conv64_2),s=ot(s,e.conv64_3),s=Ve(s,e.conv128_down),s=ot(s,e.conv128_1),s=ot(s,e.conv128_2),s=Ve(s,e.conv256_down),s=ot(s,e.conv256_1),s=ot(s,e.conv256_2),s=Ve(s,e.conv256_down_out);let i=s.mean([1,2]);return nt.matMul(i,e.fc)})}async forward(t){return this.forwardInput(await C(t))}async computeFaceDescriptor(t){var a;if((a=t==null?void 0:t.shape)!=null&&a.some(s=>s<=0))return new Float32Array(128);let e=await C(t),r=nt.tidy(()=>nt.unstack(this.forwardInput(e))),n=await Promise.all(r.map(s=>s.data()));return r.forEach(s=>s.dispose()),e.isBatchInput?n:n[0]}getDefaultModelName(){return"face_recognition_model"}extractParamsFromWeightMap(t){return zo(t)}extractParams(t){return Ho(t)}};function Xn(o){let t=new Qt;return t.extractWeights(o),t}function Dr(o,t){return{...o,...{descriptor:t}}}function Jn(o){return typeof o.age=="number"}function Er(o,t){return{...o,...{age:t}}}function qn(o){return(o.gender==="male"||o.gender==="female")&&me(o.genderProbability)}function Mr(o,t,e){return{...o,...{gender:t,genderProbability:e}}}var Lt=v(x());var at=v(x());function Zn(o,t){function e(c,m){let p=at.tensor4d(o(9*c),[3,3,c,1]),u=at.tensor1d(o(c)),f=at.tensor1d(o(c)),l=at.tensor1d(o(c)),g=at.tensor1d(o(c));return t.push({paramPath:`${m}/filters`},{paramPath:`${m}/batch_norm_scale`},{paramPath:`${m}/batch_norm_offset`},{paramPath:`${m}/batch_norm_mean`},{paramPath:`${m}/batch_norm_variance`}),{filters:p,batch_norm_scale:u,batch_norm_offset:f,batch_norm_mean:l,batch_norm_variance:g}}function r(c,m,p,u,f){let l=at.tensor4d(o(c*m*p*p),[p,p,c,m]),g=at.tensor1d(o(m));return t.push({paramPath:`${u}/filters`},{paramPath:`${u}/${f?"batch_norm_offset":"bias"}`}),{filters:l,bias:g}}function n(c,m,p,u){let{filters:f,bias:l}=r(c,m,p,u,!0);return{filters:f,batch_norm_offset:l}}function a(c,m,p){let u=e(c,`${p}/depthwise_conv`),f=n(c,m,1,`${p}/pointwise_conv`);return{depthwise_conv:u,pointwise_conv:f}}function s(){let c=n(3,32,3,"mobilenetv1/conv_0"),m=a(32,64,"mobilenetv1/conv_1"),p=a(64,128,"mobilenetv1/conv_2"),u=a(128,128,"mobilenetv1/conv_3"),f=a(128,256,"mobilenetv1/conv_4"),l=a(256,256,"mobilenetv1/conv_5"),g=a(256,512,"mobilenetv1/conv_6"),T=a(512,512,"mobilenetv1/conv_7"),D=a(512,512,"mobilenetv1/conv_8"),h=a(512,512,"mobilenetv1/conv_9"),_=a(512,512,"mobilenetv1/conv_10"),y=a(512,512,"mobilenetv1/conv_11"),E=a(512,1024,"mobilenetv1/conv_12"),W=a(1024,1024,"mobilenetv1/conv_13");return{conv_0:c,conv_1:m,conv_2:p,conv_3:u,conv_4:f,conv_5:l,conv_6:g,conv_7:T,conv_8:D,conv_9:h,conv_10:_,conv_11:y,conv_12:E,conv_13:W}}function i(){let c=n(1024,256,1,"prediction_layer/conv_0"),m=n(256,512,3,"prediction_layer/conv_1"),p=n(512,128,1,"prediction_layer/conv_2"),u=n(128,256,3,"prediction_layer/conv_3"),f=n(256,128,1,"prediction_layer/conv_4"),l=n(128,256,3,"prediction_layer/conv_5"),g=n(256,64,1,"prediction_layer/conv_6"),T=n(64,128,3,"prediction_layer/conv_7"),D=r(512,12,1,"prediction_layer/box_predictor_0/box_encoding_predictor"),h=r(512,9,1,"prediction_layer/box_predictor_0/class_predictor"),_=r(1024,24,1,"prediction_layer/box_predictor_1/box_encoding_predictor"),y=r(1024,18,1,"prediction_layer/box_predictor_1/class_predictor"),E=r(512,24,1,"prediction_layer/box_predictor_2/box_encoding_predictor"),W=r(512,18,1,"prediction_layer/box_predictor_2/class_predictor"),tt=r(256,24,1,"prediction_layer/box_predictor_3/box_encoding_predictor"),lt=r(256,18,1,"prediction_layer/box_predictor_3/class_predictor"),q=r(256,24,1,"prediction_layer/box_predictor_4/box_encoding_predictor"),Dt=r(256,18,1,"prediction_layer/box_predictor_4/class_predictor"),Et=r(128,24,1,"prediction_layer/box_predictor_5/box_encoding_predictor"),Mt=r(128,18,1,"prediction_layer/box_predictor_5/class_predictor");return{conv_0:c,conv_1:m,conv_2:p,conv_3:u,conv_4:f,conv_5:l,conv_6:g,conv_7:T,box_predictor_0:{box_encoding_predictor:D,class_predictor:h},box_predictor_1:{box_encoding_predictor:_,class_predictor:y},box_predictor_2:{box_encoding_predictor:E,class_predictor:W},box_predictor_3:{box_encoding_predictor:tt,class_predictor:lt},box_predictor_4:{box_encoding_predictor:q,class_predictor:Dt},box_predictor_5:{box_encoding_predictor:Et,class_predictor:Mt}}}return{extractMobilenetV1Params:s,extractPredictionLayerParams:i}}function Vo(o){let t=[],{extractWeights:e,getRemainingWeights:r}=R(o),{extractMobilenetV1Params:n,extractPredictionLayerParams:a}=Zn(e,t),s=n(),i=a(),m={extra_dim:at.tensor3d(e(5118*4),[1,5118,4])};if(t.push({paramPath:"output_layer/extra_dim"}),r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{params:{mobilenetv1:s,prediction_layer:i,output_layer:m},paramMappings:t}}function Kn(o,t){let e=Y(o,t);function r(m,p,u){let f=e(`${m}/Conv2d_${p}_pointwise/weights`,4,`${u}/filters`),l=e(`${m}/Conv2d_${p}_pointwise/convolution_bn_offset`,1,`${u}/batch_norm_offset`);return{filters:f,batch_norm_offset:l}}function n(m){let p=`mobilenetv1/conv_${m}`,u=`MobilenetV1/Conv2d_${m}_depthwise`,f=`${p}/depthwise_conv`,l=`${p}/pointwise_conv`,g=e(`${u}/depthwise_weights`,4,`${f}/filters`),T=e(`${u}/BatchNorm/gamma`,1,`${f}/batch_norm_scale`),D=e(`${u}/BatchNorm/beta`,1,`${f}/batch_norm_offset`),h=e(`${u}/BatchNorm/moving_mean`,1,`${f}/batch_norm_mean`),_=e(`${u}/BatchNorm/moving_variance`,1,`${f}/batch_norm_variance`);return{depthwise_conv:{filters:g,batch_norm_scale:T,batch_norm_offset:D,batch_norm_mean:h,batch_norm_variance:_},pointwise_conv:r("MobilenetV1",m,l)}}function a(){return{conv_0:r("MobilenetV1",0,"mobilenetv1/conv_0"),conv_1:n(1),conv_2:n(2),conv_3:n(3),conv_4:n(4),conv_5:n(5),conv_6:n(6),conv_7:n(7),conv_8:n(8),conv_9:n(9),conv_10:n(10),conv_11:n(11),conv_12:n(12),conv_13:n(13)}}function s(m,p){let u=e(`${m}/weights`,4,`${p}/filters`),f=e(`${m}/biases`,1,`${p}/bias`);return{filters:u,bias:f}}function i(m){let p=s(`Prediction/BoxPredictor_${m}/BoxEncodingPredictor`,`prediction_layer/box_predictor_${m}/box_encoding_predictor`),u=s(`Prediction/BoxPredictor_${m}/ClassPredictor`,`prediction_layer/box_predictor_${m}/class_predictor`);return{box_encoding_predictor:p,class_predictor:u}}function c(){return{conv_0:r("Prediction",0,"prediction_layer/conv_0"),conv_1:r("Prediction",1,"prediction_layer/conv_1"),conv_2:r("Prediction",2,"prediction_layer/conv_2"),conv_3:r("Prediction",3,"prediction_layer/conv_3"),conv_4:r("Prediction",4,"prediction_layer/conv_4"),conv_5:r("Prediction",5,"prediction_layer/conv_5"),conv_6:r("Prediction",6,"prediction_layer/conv_6"),conv_7:r("Prediction",7,"prediction_layer/conv_7"),box_predictor_0:i(0),box_predictor_1:i(1),box_predictor_2:i(2),box_predictor_3:i(3),box_predictor_4:i(4),box_predictor_5:i(5)}}return{extractMobilenetV1Params:a,extractPredictionLayerParams:c}}function Yo(o){let t=[],{extractMobilenetV1Params:e,extractPredictionLayerParams:r}=Kn(o,t),n=o["Output/extra_dim"];if(t.push({originalPath:"Output/extra_dim",paramPath:"output_layer/extra_dim"}),!ht(n))throw new Error(`expected weightMap['Output/extra_dim'] to be a Tensor3D, instead have ${n}`);let a={mobilenetv1:e(),prediction_layer:r(),output_layer:{extra_dim:n}};return B(o,t),{params:a,paramMappings:t}}var _t=v(x());var Nt=v(x());function Z(o,t,e){return Nt.tidy(()=>{let r=Nt.conv2d(o,t.filters,e,"same");return r=Nt.add(r,t.batch_norm_offset),Nt.clipByValue(r,0,6)})}var Qn=.0010000000474974513;function ta(o,t,e){return _t.tidy(()=>{let r=_t.depthwiseConv2d(o,t.filters,e,"same");return r=_t.batchNorm(r,t.batch_norm_mean,t.batch_norm_variance,t.batch_norm_offset,t.batch_norm_scale,Qn),_t.clipByValue(r,0,6)})}function ea(o){return[2,4,6,12].some(t=>t===o)?[2,2]:[1,1]}function Go(o,t){return _t.tidy(()=>{let e,r=Z(o,t.conv_0,[2,2]);if([t.conv_1,t.conv_2,t.conv_3,t.conv_4,t.conv_5,t.conv_6,t.conv_7,t.conv_8,t.conv_9,t.conv_10,t.conv_11,t.conv_12,t.conv_13].forEach((a,s)=>{let i=s+1,c=ea(i);r=ta(r,a.depthwise_conv,c),r=Z(r,a.pointwise_conv,[1,1]),i===11&&(e=r)}),e===null)throw new Error("mobileNetV1 - output of conv layer 11 is null");return{out:r,conv11:e}})}function ra(o,t,e){let r=o.arraySync(),n=Math.min(r[t][0],r[t][2]),a=Math.min(r[t][1],r[t][3]),s=Math.max(r[t][0],r[t][2]),i=Math.max(r[t][1],r[t][3]),c=Math.min(r[e][0],r[e][2]),m=Math.min(r[e][1],r[e][3]),p=Math.max(r[e][0],r[e][2]),u=Math.max(r[e][1],r[e][3]),f=(s-n)*(i-a),l=(p-c)*(u-m);if(f<=0||l<=0)return 0;let g=Math.max(n,c),T=Math.max(a,m),D=Math.min(s,p),h=Math.min(i,u),_=Math.max(D-g,0)*Math.max(h-T,0);return _/(f+l-_)}function jo(o,t,e,r,n){let a=o.shape[0],s=Math.min(e,a),i=t.map((p,u)=>({score:p,boxIndex:u})).filter(p=>p.score>n).sort((p,u)=>u.score-p.score),c=p=>p<=r?1:0,m=[];return i.forEach(p=>{if(m.length>=s)return;let u=p.score;for(let f=m.length-1;f>=0;--f){let l=ra(o,p.boxIndex,m[f]);if(l!==0&&(p.score*=c(l),p.score<=n))break}u===p.score&&m.push(p.boxIndex)}),m}var d=v(x());function oa(o){let t=d.unstack(d.transpose(o,[1,0])),e=[d.sub(t[2],t[0]),d.sub(t[3],t[1])],r=[d.add(t[0],d.div(e[0],2)),d.add(t[1],d.div(e[1],2))];return{sizes:e,centers:r}}function na(o,t){let{sizes:e,centers:r}=oa(o),n=d.unstack(d.transpose(t,[1,0])),a=d.div(d.mul(d.exp(d.div(n[2],5)),e[0]),2),s=d.add(d.mul(d.div(n[0],10),e[0]),r[0]),i=d.div(d.mul(d.exp(d.div(n[3],5)),e[1]),2),c=d.add(d.mul(d.div(n[1],10),e[1]),r[1]);return d.transpose(d.stack([d.sub(s,a),d.sub(c,i),d.add(s,a),d.add(c,i)]),[1,0])}function Uo(o,t,e){return d.tidy(()=>{let r=o.shape[0],n=na(d.reshape(d.tile(e.extra_dim,[r,1,1]),[-1,4]),d.reshape(o,[-1,4]));n=d.reshape(n,[r,n.shape[0]/r,4]);let a=d.sigmoid(d.slice(t,[0,0,1],[-1,-1,-1])),s=d.slice(a,[0,0,0],[-1,-1,1]);s=d.reshape(s,[r,s.shape[1]]);let i=d.unstack(n),c=d.unstack(s);return{boxes:i,scores:c}})}var Ge=v(x());var Ye=v(x());function te(o,t){return Ye.tidy(()=>{let e=o.shape[0],r=Ye.reshape(qt(o,t.box_encoding_predictor),[e,-1,1,4]),n=Ye.reshape(qt(o,t.class_predictor),[e,-1,3]);return{boxPredictionEncoding:r,classPrediction:n}})}function Xo(o,t,e){return Ge.tidy(()=>{let r=Z(o,e.conv_0,[1,1]),n=Z(r,e.conv_1,[2,2]),a=Z(n,e.conv_2,[1,1]),s=Z(a,e.conv_3,[2,2]),i=Z(s,e.conv_4,[1,1]),c=Z(i,e.conv_5,[2,2]),m=Z(c,e.conv_6,[1,1]),p=Z(m,e.conv_7,[2,2]),u=te(t,e.box_predictor_0),f=te(o,e.box_predictor_1),l=te(n,e.box_predictor_2),g=te(s,e.box_predictor_3),T=te(c,e.box_predictor_4),D=te(p,e.box_predictor_5),h=Ge.concat([u.boxPredictionEncoding,f.boxPredictionEncoding,l.boxPredictionEncoding,g.boxPredictionEncoding,T.boxPredictionEncoding,D.boxPredictionEncoding],1),_=Ge.concat([u.classPrediction,f.classPrediction,l.classPrediction,g.classPrediction,T.classPrediction,D.classPrediction],1);return{boxPredictions:h,classPredictions:_}})}var X=class{constructor({minConfidence:t,maxResults:e}={}){this._name="SsdMobilenetv1Options";if(this._minConfidence=t||.5,this._maxResults=e||100,typeof this._minConfidence!="number"||this._minConfidence<=0||this._minConfidence>=1)throw new Error(`${this._name} - expected minConfidence to be a number between 0 and 1`);if(typeof this._maxResults!="number")throw new Error(`${this._name} - expected maxResults to be a number`)}get minConfidence(){return this._minConfidence}get maxResults(){return this._maxResults}};var St=class extends A{constructor(){super("SsdMobilenetv1")}forwardInput(t){let{params:e}=this;if(!e)throw new Error("SsdMobilenetv1 - load model before inference");return Lt.tidy(()=>{let r=Lt.cast(t.toBatchTensor(512,!1),"float32"),n=Lt.sub(Lt.div(r,127.5),1),a=Go(n,e.mobilenetv1),{boxPredictions:s,classPredictions:i}=Xo(a.out,a.conv11,e.prediction_layer);return Uo(s,i,e.output_layer)})}async forward(t){return this.forwardInput(await C(t))}async locateFaces(t,e={}){let{maxResults:r,minConfidence:n}=new X(e),a=await C(t),{boxes:s,scores:i}=this.forwardInput(a),c=s[0],m=i[0];for(let y=1;y{let[E,W]=[Math.max(0,h[y][0]),Math.min(1,h[y][2])].map(q=>q*D),[tt,lt]=[Math.max(0,h[y][1]),Math.min(1,h[y][3])].map(q=>q*T);return new M(p[y],new Yt(tt,E,lt-tt,W-E),{height:a.getInputHeight(0),width:a.getInputWidth(0)})});return c.dispose(),m.dispose(),_}getDefaultModelName(){return"ssd_mobilenetv1_model"}extractParamsFromWeightMap(t){return Yo(t)}extractParams(t){return Vo(t)}};function Jo(o){let t=new St;return t.extractWeights(o),t}function aa(o){return Jo(o)}var uo=class extends St{};var qo=.4,Zo=[new b(.738768,.874946),new b(2.42204,2.65704),new b(4.30971,7.04493),new b(10.246,4.59428),new b(12.6868,11.8741)],Ko=[new b(1.603231,2.094468),new b(6.041143,7.080126),new b(2.882459,3.518061),new b(4.266906,5.178857),new b(9.041765,10.66308)],Qo=[117.001,114.697,97.404],tn="tiny_yolov2_model",en="tiny_yolov2_separable_conv_model";var N=v(x());var Cr=o=>typeof o=="number";function fo(o){if(!o)throw new Error(`invalid config: ${o}`);if(typeof o.withSeparableConvs!="boolean")throw new Error(`config.withSeparableConvs has to be a boolean, have: ${o.withSeparableConvs}`);if(!Cr(o.iouThreshold)||o.iouThreshold<0||o.iouThreshold>1)throw new Error(`config.iouThreshold has to be a number between [0, 1], have: ${o.iouThreshold}`);if(!Array.isArray(o.classes)||!o.classes.length||!o.classes.every(t=>typeof t=="string"))throw new Error(`config.classes has to be an array class names: string[], have: ${JSON.stringify(o.classes)}`);if(!Array.isArray(o.anchors)||!o.anchors.length||!o.anchors.map(t=>t||{}).every(t=>Cr(t.x)&&Cr(t.y)))throw new Error(`config.anchors has to be an array of { x: number, y: number }, have: ${JSON.stringify(o.anchors)}`);if(o.meanRgb&&(!Array.isArray(o.meanRgb)||o.meanRgb.length!==3||!o.meanRgb.every(Cr)))throw new Error(`config.meanRgb has to be an array of shape [number, number, number], have: ${JSON.stringify(o.meanRgb)}`)}var Q=v(x());var K=v(x());function Me(o){return K.tidy(()=>{let t=K.mul(o,K.scalar(.10000000149011612));return K.add(K.relu(K.sub(o,t)),t)})}function Tt(o,t){return Q.tidy(()=>{let e=Q.pad(o,[[0,0],[1,1],[1,1],[0,0]]);return e=Q.conv2d(e,t.conv.filters,[1,1],"valid"),e=Q.sub(e,t.bn.sub),e=Q.mul(e,t.bn.truediv),e=Q.add(e,t.conv.bias),Me(e)})}var At=v(x());function Pt(o,t){return At.tidy(()=>{let e=At.pad(o,[[0,0],[1,1],[1,1],[0,0]]);return e=At.separableConv2d(e,t.depthwise_filter,t.pointwise_filter,[1,1],"valid"),e=At.add(e,t.bias),Me(e)})}var lo=v(x());function sa(o,t){let e=be(o,t);function r(s,i){let c=lo.tensor1d(o(s)),m=lo.tensor1d(o(s));return t.push({paramPath:`${i}/sub`},{paramPath:`${i}/truediv`}),{sub:c,truediv:m}}function n(s,i,c){let m=e(s,i,3,`${c}/conv`),p=r(i,`${c}/bn`);return{conv:m,bn:p}}let a=ge(o,t);return{extractConvParams:e,extractConvWithBatchNormParams:n,extractSeparableConvParams:a}}function rn(o,t,e,r){let{extractWeights:n,getRemainingWeights:a}=R(o),s=[],{extractConvParams:i,extractConvWithBatchNormParams:c,extractSeparableConvParams:m}=sa(n,s),p;if(t.withSeparableConvs){let[u,f,l,g,T,D,h,_,y]=r,E=t.isFirstLayerConv2d?i(u,f,3,"conv0"):m(u,f,"conv0"),W=m(f,l,"conv1"),tt=m(l,g,"conv2"),lt=m(g,T,"conv3"),q=m(T,D,"conv4"),Dt=m(D,h,"conv5"),Et=_?m(h,_,"conv6"):void 0,Mt=y?m(_,y,"conv7"):void 0,$t=i(y||_||h,5*e,1,"conv8");p={conv0:E,conv1:W,conv2:tt,conv3:lt,conv4:q,conv5:Dt,conv6:Et,conv7:Mt,conv8:$t}}else{let[u,f,l,g,T,D,h,_,y]=r,E=c(u,f,"conv0"),W=c(f,l,"conv1"),tt=c(l,g,"conv2"),lt=c(g,T,"conv3"),q=c(T,D,"conv4"),Dt=c(D,h,"conv5"),Et=c(h,_,"conv6"),Mt=c(_,y,"conv7"),$t=i(y,5*e,1,"conv8");p={conv0:E,conv1:W,conv2:tt,conv3:lt,conv4:q,conv5:Dt,conv6:Et,conv7:Mt,conv8:$t}}if(a().length!==0)throw new Error(`weights remaing after extract: ${a().length}`);return{params:p,paramMappings:s}}function ia(o,t){let e=Y(o,t);function r(i){let c=e(`${i}/sub`,1),m=e(`${i}/truediv`,1);return{sub:c,truediv:m}}function n(i){let c=e(`${i}/filters`,4),m=e(`${i}/bias`,1);return{filters:c,bias:m}}function a(i){let c=n(`${i}/conv`),m=r(`${i}/bn`);return{conv:c,bn:m}}let s=xe(e);return{extractConvParams:n,extractConvWithBatchNormParams:a,extractSeparableConvParams:s}}function on(o,t){let e=[],{extractConvParams:r,extractConvWithBatchNormParams:n,extractSeparableConvParams:a}=ia(o,e),s;if(t.withSeparableConvs){let i=t.filterSizes&&t.filterSizes.length||9;s={conv0:t.isFirstLayerConv2d?r("conv0"):a("conv0"),conv1:a("conv1"),conv2:a("conv2"),conv3:a("conv3"),conv4:a("conv4"),conv5:a("conv5"),conv6:i>7?a("conv6"):void 0,conv7:i>8?a("conv7"):void 0,conv8:r("conv8")}}else s={conv0:n("conv0"),conv1:n("conv1"),conv2:n("conv2"),conv3:n("conv3"),conv4:n("conv4"),conv5:n("conv5"),conv6:n("conv6"),conv7:n("conv7"),conv8:r("conv8")};return B(o,e),{params:s,paramMappings:e}}var st=class{constructor({inputSize:t,scoreThreshold:e}={}){this._name="TinyYolov2Options";if(this._inputSize=t||416,this._scoreThreshold=e||.5,typeof this._inputSize!="number"||this._inputSize%32!==0)throw new Error(`${this._name} - expected inputSize to be a number divisible by 32`);if(typeof this._scoreThreshold!="number"||this._scoreThreshold<=0||this._scoreThreshold>=1)throw new Error(`${this._name} - expected scoreThreshold to be a number between 0 and 1`)}get inputSize(){return this._inputSize}get scoreThreshold(){return this._scoreThreshold}};var ho=class extends A{constructor(e){super("TinyYolov2");fo(e),this._config=e}get config(){return this._config}get withClassScores(){return this.config.withClassScores||this.config.classes.length>1}get boxEncodingSize(){return 5+(this.withClassScores?this.config.classes.length:0)}runTinyYolov2(e,r){let n=Tt(e,r.conv0);return n=N.maxPool(n,[2,2],[2,2],"same"),n=Tt(n,r.conv1),n=N.maxPool(n,[2,2],[2,2],"same"),n=Tt(n,r.conv2),n=N.maxPool(n,[2,2],[2,2],"same"),n=Tt(n,r.conv3),n=N.maxPool(n,[2,2],[2,2],"same"),n=Tt(n,r.conv4),n=N.maxPool(n,[2,2],[2,2],"same"),n=Tt(n,r.conv5),n=N.maxPool(n,[2,2],[1,1],"same"),n=Tt(n,r.conv6),n=Tt(n,r.conv7),qt(n,r.conv8,"valid",!1)}runMobilenet(e,r){let n=this.config.isFirstLayerConv2d?Me(qt(e,r.conv0,"valid",!1)):Pt(e,r.conv0);return n=N.maxPool(n,[2,2],[2,2],"same"),n=Pt(n,r.conv1),n=N.maxPool(n,[2,2],[2,2],"same"),n=Pt(n,r.conv2),n=N.maxPool(n,[2,2],[2,2],"same"),n=Pt(n,r.conv3),n=N.maxPool(n,[2,2],[2,2],"same"),n=Pt(n,r.conv4),n=N.maxPool(n,[2,2],[2,2],"same"),n=Pt(n,r.conv5),n=N.maxPool(n,[2,2],[1,1],"same"),n=r.conv6?Pt(n,r.conv6):n,n=r.conv7?Pt(n,r.conv7):n,qt(n,r.conv8,"valid",!1)}forwardInput(e,r){let{params:n}=this;if(!n)throw new Error("TinyYolov2 - load model before inference");return N.tidy(()=>{let a=N.cast(e.toBatchTensor(r,!1),"float32");return a=this.config.meanRgb?rt(a,this.config.meanRgb):a,a=a.div(255),this.config.withSeparableConvs?this.runMobilenet(a,n):this.runTinyYolov2(a,n)})}async forward(e,r){return this.forwardInput(await C(e),r)}async detect(e,r={}){let{inputSize:n,scoreThreshold:a}=new st(r),s=await C(e),i=await this.forwardInput(s,n),c=N.tidy(()=>N.unstack(i)[0].expandDims()),m={width:s.getInputWidth(0),height:s.getInputHeight(0)},p=await this.extractBoxes(c,s.getReshapedInputDimensions(0),a);i.dispose(),c.dispose();let u=p.map(h=>h.box),f=p.map(h=>h.score),l=p.map(h=>h.classScore),g=p.map(h=>this.config.classes[h.label]);return zr(u.map(h=>h.rescale(n)),f,this.config.iouThreshold,!0).map(h=>new bt(f[h],l[h],g[h],u[h],m))}getDefaultModelName(){return""}extractParamsFromWeightMap(e){return on(e,this.config)}extractParams(e){let r=this.config.filterSizes||ho.DEFAULT_FILTER_SIZES,n=r?r.length:void 0;if(n!==7&&n!==8&&n!==9)throw new Error(`TinyYolov2 - expected 7 | 8 | 9 convolutional filters, but found ${n} filterSizes in config`);return rn(e,this.config,this.boxEncodingSize,r)}async extractBoxes(e,r,n){let{width:a,height:s}=r,i=Math.max(a,s),c=i/a,m=i/s,p=e.shape[1],u=this.config.anchors.length,[f,l,g]=N.tidy(()=>{let _=e.reshape([p,p,u,this.boxEncodingSize]),y=_.slice([0,0,0,0],[p,p,u,4]),E=_.slice([0,0,0,4],[p,p,u,1]),W=this.withClassScores?N.softmax(_.slice([0,0,0,5],[p,p,u,this.config.classes.length]),3):N.scalar(0);return[y,E,W]}),T=[],D=await l.array(),h=await f.array();for(let _=0;_n){let tt=(y+Ne(h[_][y][E][0]))/p*c,lt=(_+Ne(h[_][y][E][1]))/p*m,q=Math.exp(h[_][y][E][2])*this.config.anchors[E].x/p*c,Dt=Math.exp(h[_][y][E][3])*this.config.anchors[E].y/p*m,Et=tt-q/2,Mt=lt-Dt/2,$t={row:_,col:y,anchor:E},{classScore:xo,label:vo}=this.withClassScores?await this.extractPredictedClass(g,$t):{classScore:1,label:0};T.push({box:new Vt(Et,Mt,Et+q,Mt+Dt),score:W,classScore:W*xo,label:vo,...$t})}}return f.dispose(),l.dispose(),g.dispose(),T}async extractPredictedClass(e,r){let{row:n,col:a,anchor:s}=r,i=await e.array();return Array(this.config.classes.length).fill(0).map((c,m)=>i[n][a][s][m]).map((c,m)=>({classScore:c,label:m})).reduce((c,m)=>c.classScore>m.classScore?c:m)}},ee=ho;ee.DEFAULT_FILTER_SIZES=[3,16,32,64,128,256,512,1024,1024];var re=class extends ee{constructor(t=!0){let e={withSeparableConvs:t,iouThreshold:qo,classes:["face"],...t?{anchors:Ko,meanRgb:Qo}:{anchors:Zo,withClassScores:!0}};super(e)}get withSeparableConvs(){return this.config.withSeparableConvs}get anchors(){return this.config.anchors}async locateFaces(t,e){return(await this.detect(t,e)).map(n=>new M(n.score,n.relativeBox,{width:n.imageWidth,height:n.imageHeight}))}getDefaultModelName(){return this.withSeparableConvs?en:tn}extractParamsFromWeightMap(t){return super.extractParamsFromWeightMap(t)}};function ca(o,t=!0){let e=new re(t);return e.extractWeights(o),e}var je=class extends st{constructor(){super(...arguments);this._name="TinyFaceDetectorOptions"}};var J=class{async then(t){return t(await this.run())}async run(){throw new Error("ComposableTask - run is not implemented")}};var Xe=v(x());var bo=v(x());async function oe(o,t,e,r,n=({alignedRect:a})=>a){let a=o.map(c=>Zt(c)?n(c):c.detection),s=r||(t instanceof bo.Tensor?await de(t,a):await le(t,a)),i=await e(s);return s.forEach(c=>c instanceof bo.Tensor&&c.dispose()),i}async function Ce(o,t,e,r,n){return oe([o],t,async a=>e(a[0]),r,n)}var nn=.4,an=[new b(1.603231,2.094468),new b(6.041143,7.080126),new b(2.882459,3.518061),new b(4.266906,5.178857),new b(9.041765,10.66308)],sn=[117.001,114.697,97.404];var ne=class extends ee{constructor(){let t={withSeparableConvs:!0,iouThreshold:nn,classes:["face"],anchors:an,meanRgb:sn,isFirstLayerConv2d:!0,filterSizes:[3,16,32,64,128,256,512]};super(t)}get anchors(){return this.config.anchors}async locateFaces(t,e){return(await this.detect(t,e)).map(n=>new M(n.score,n.relativeBox,{width:n.imageWidth,height:n.imageHeight}))}getDefaultModelName(){return"tiny_face_detector_model"}extractParamsFromWeightMap(t){return super.extractParamsFromWeightMap(t)}};var w={ssdMobilenetv1:new St,tinyFaceDetector:new ne,tinyYolov2:new re,faceLandmark68Net:new Kt,faceLandmark68TinyNet:new ze,faceRecognitionNet:new Qt,faceExpressionNet:new Oe,ageGenderNet:new He},cn=(o,t)=>w.ssdMobilenetv1.locateFaces(o,t),ma=(o,t)=>w.tinyFaceDetector.locateFaces(o,t),pa=(o,t)=>w.tinyYolov2.locateFaces(o,t),mn=o=>w.faceLandmark68Net.detectLandmarks(o),ua=o=>w.faceLandmark68TinyNet.detectLandmarks(o),fa=o=>w.faceRecognitionNet.computeFaceDescriptor(o),la=o=>w.faceExpressionNet.predictExpressions(o),da=o=>w.ageGenderNet.predictAgeAndGender(o),pn=o=>w.ssdMobilenetv1.load(o),ha=o=>w.tinyFaceDetector.load(o),ba=o=>w.tinyYolov2.load(o),ga=o=>w.faceLandmark68Net.load(o),xa=o=>w.faceLandmark68TinyNet.load(o),va=o=>w.faceRecognitionNet.load(o),ya=o=>w.faceExpressionNet.load(o),_a=o=>w.ageGenderNet.load(o),Ta=pn,Pa=cn,wa=mn;var Ir=class extends J{constructor(e,r,n){super();this.parentTask=e;this.input=r;this.extractedFaces=n}},ae=class extends Ir{async run(){let t=await this.parentTask,e=await oe(t,this.input,async r=>Promise.all(r.map(n=>w.faceExpressionNet.predictExpressions(n))),this.extractedFaces);return t.map((r,n)=>xr(r,e[n]))}withAgeAndGender(){return new ie(this,this.input)}},se=class extends Ir{async run(){let t=await this.parentTask;if(!t)return;let e=await Ce(t,this.input,r=>w.faceExpressionNet.predictExpressions(r),this.extractedFaces);return xr(t,e)}withAgeAndGender(){return new ce(this,this.input)}},Wt=class extends ae{withAgeAndGender(){return new Bt(this,this.input)}withFaceDescriptors(){return new wt(this,this.input)}},kt=class extends se{withAgeAndGender(){return new Rt(this,this.input)}withFaceDescriptor(){return new Ft(this,this.input)}};var Nr=class extends J{constructor(e,r,n){super();this.parentTask=e;this.input=r;this.extractedFaces=n}},ie=class extends Nr{async run(){let t=await this.parentTask,e=await oe(t,this.input,async r=>Promise.all(r.map(n=>w.ageGenderNet.predictAgeAndGender(n))),this.extractedFaces);return t.map((r,n)=>{let{age:a,gender:s,genderProbability:i}=e[n];return Er(Mr(r,s,i),a)})}withFaceExpressions(){return new ae(this,this.input)}},ce=class extends Nr{async run(){let t=await this.parentTask;if(!t)return;let{age:e,gender:r,genderProbability:n}=await Ce(t,this.input,a=>w.ageGenderNet.predictAgeAndGender(a),this.extractedFaces);return Er(Mr(t,r,n),e)}withFaceExpressions(){return new se(this,this.input)}},Bt=class extends ie{withFaceExpressions(){return new Wt(this,this.input)}withFaceDescriptors(){return new wt(this,this.input)}},Rt=class extends ce{withFaceExpressions(){return new kt(this,this.input)}withFaceDescriptor(){return new Ft(this,this.input)}};var Ue=class extends J{constructor(e,r){super();this.parentTask=e;this.input=r}},wt=class extends Ue{async run(){let t=await this.parentTask;return(await oe(t,this.input,r=>Promise.all(r.map(n=>w.faceRecognitionNet.computeFaceDescriptor(n))),null,r=>r.landmarks.align(null,{useDlibAlignment:!0}))).map((r,n)=>Dr(t[n],r))}withFaceExpressions(){return new Wt(this,this.input)}withAgeAndGender(){return new Bt(this,this.input)}},Ft=class extends Ue{async run(){let t=await this.parentTask;if(!t)return;let e=await Ce(t,this.input,r=>w.faceRecognitionNet.computeFaceDescriptor(r),null,r=>r.landmarks.align(null,{useDlibAlignment:!0}));return Dr(t,e)}withFaceExpressions(){return new kt(this,this.input)}withAgeAndGender(){return new Rt(this,this.input)}};var Je=class extends J{constructor(e,r,n){super();this.parentTask=e;this.input=r;this.useTinyLandmarkNet=n}get landmarkNet(){return this.useTinyLandmarkNet?w.faceLandmark68TinyNet:w.faceLandmark68Net}},qe=class extends Je{async run(){let t=await this.parentTask,e=t.map(s=>s.detection),r=this.input instanceof Xe.Tensor?await de(this.input,e):await le(this.input,e),n=await Promise.all(r.map(s=>this.landmarkNet.detectLandmarks(s)));return r.forEach(s=>s instanceof Xe.Tensor&&s.dispose()),t.filter((s,i)=>n[i]).map((s,i)=>we(s,n[i]))}withFaceExpressions(){return new Wt(this,this.input)}withAgeAndGender(){return new Bt(this,this.input)}withFaceDescriptors(){return new wt(this,this.input)}},Ze=class extends Je{async run(){let t=await this.parentTask;if(!t)return;let{detection:e}=t,r=this.input instanceof Xe.Tensor?await de(this.input,[e]):await le(this.input,[e]),n=await this.landmarkNet.detectLandmarks(r[0]);return r.forEach(a=>a instanceof Xe.Tensor&&a.dispose()),we(t,n)}withFaceExpressions(){return new kt(this,this.input)}withAgeAndGender(){return new Rt(this,this.input)}withFaceDescriptor(){return new Ft(this,this.input)}};var Ke=class extends J{constructor(e,r=new X){super();this.input=e;this.options=r}},Ie=class extends Ke{async run(){let{input:t,options:e}=this,r;if(e instanceof je)r=w.tinyFaceDetector.locateFaces(t,e);else if(e instanceof X)r=w.ssdMobilenetv1.locateFaces(t,e);else if(e instanceof st)r=w.tinyYolov2.locateFaces(t,e);else throw new Error("detectFaces - expected options to be instance of TinyFaceDetectorOptions | SsdMobilenetv1Options | TinyYolov2Options");return r}runAndExtendWithFaceDetections(){return new Promise((t,e)=>{this.run().then(r=>t(r.map(n=>jt({},n)))).catch(r=>e(r))})}withFaceLandmarks(t=!1){return new qe(this.runAndExtendWithFaceDetections(),this.input,t)}withFaceExpressions(){return new ae(this.runAndExtendWithFaceDetections(),this.input)}withAgeAndGender(){return new ie(this.runAndExtendWithFaceDetections(),this.input)}},Qe=class extends Ke{async run(){let t=await new Ie(this.input,this.options),e=t[0];return t.forEach(r=>{r.score>e.score&&(e=r)}),e}runAndExtendWithFaceDetection(){return new Promise(async t=>{let e=await this.run();t(e?jt({},e):void 0)})}withFaceLandmarks(t=!1){return new Ze(this.runAndExtendWithFaceDetection(),this.input,t)}withFaceExpressions(){return new se(this.runAndExtendWithFaceDetection(),this.input)}withAgeAndGender(){return new ce(this.runAndExtendWithFaceDetection(),this.input)}};function Fa(o,t=new X){return new Qe(o,t)}function Sr(o,t=new X){return new Ie(o,t)}async function un(o,t){return Sr(o,new X(t?{minConfidence:t}:{})).withFaceLandmarks().withFaceDescriptors()}async function Da(o,t={}){return Sr(o,new st(t)).withFaceLandmarks().withFaceDescriptors()}var Ea=un;function go(o,t){if(o.length!==t.length)throw new Error("euclideanDistance: arr1.length !== arr2.length");let e=Array.from(o),r=Array.from(t);return Math.sqrt(e.map((n,a)=>n-r[a]).reduce((n,a)=>n+a**2,0))}var tr=class{constructor(t,e=.6){this._distanceThreshold=e;let r=Array.isArray(t)?t:[t];if(!r.length)throw new Error("FaceRecognizer.constructor - expected atleast one input");let n=1,a=()=>`person ${n++}`;this._labeledDescriptors=r.map(s=>{if(s instanceof mt)return s;if(s instanceof Float32Array)return new mt(a(),[s]);if(s.descriptor&&s.descriptor instanceof Float32Array)return new mt(a(),[s.descriptor]);throw new Error("FaceRecognizer.constructor - expected inputs to be of type LabeledFaceDescriptors | WithFaceDescriptor | Float32Array | Array | Float32Array>")})}get labeledDescriptors(){return this._labeledDescriptors}get distanceThreshold(){return this._distanceThreshold}computeMeanDistance(t,e){return e.map(r=>go(r,t)).reduce((r,n)=>r+n,0)/(e.length||1)}matchDescriptor(t){return this.labeledDescriptors.map(({descriptors:e,label:r})=>new pe(r,this.computeMeanDistance(t,e))).reduce((e,r)=>e.distancet.toJSON())}}static fromJSON(t){let e=t.labeledDescriptors.map(r=>mt.fromJSON(r));return new tr(e,t.distanceThreshold)}};function Ma(o){let t=new ne;return t.extractWeights(o),t}function fn(o,t){let{width:e,height:r}=new k(t.width,t.height);if(e<=0||r<=0)throw new Error(`resizeResults - invalid dimensions: ${JSON.stringify({width:e,height:r})}`);if(Array.isArray(o))return o.map(n=>fn(n,{width:e,height:r}));if(Zt(o)){let n=o.detection.forSize(e,r),a=o.unshiftedLandmarks.forSize(n.box.width,n.box.height);return we(jt(o,n),a)}return pt(o)?jt(o,o.detection.forSize(e,r)):o instanceof z||o instanceof M?o.forSize(e,r):o}var Ia=No;0&&(module.exports={AgeGenderNet,BoundingBox,Box,ComposableTask,ComputeAllFaceDescriptorsTask,ComputeFaceDescriptorsTaskBase,ComputeSingleFaceDescriptorTask,DetectAllFaceLandmarksTask,DetectAllFacesTask,DetectFaceLandmarksTaskBase,DetectFacesTaskBase,DetectSingleFaceLandmarksTask,DetectSingleFaceTask,Dimensions,FACE_EXPRESSION_LABELS,FaceDetection,FaceDetectionNet,FaceExpressionNet,FaceExpressions,FaceLandmark68Net,FaceLandmark68TinyNet,FaceLandmarkNet,FaceLandmarks,FaceLandmarks5,FaceLandmarks68,FaceMatch,FaceMatcher,FaceRecognitionNet,Gender,LabeledBox,LabeledFaceDescriptors,NetInput,NeuralNetwork,ObjectDetection,Point,PredictedBox,Rect,SsdMobilenetv1,SsdMobilenetv1Options,TinyFaceDetector,TinyFaceDetectorOptions,TinyYolov2,TinyYolov2Options,allFaces,allFacesSsdMobilenetv1,allFacesTinyYolov2,awaitMediaLoaded,bufferToImage,computeFaceDescriptor,createCanvas,createCanvasFromMedia,createFaceDetectionNet,createFaceRecognitionNet,createSsdMobilenetv1,createTinyFaceDetector,createTinyYolov2,detectAllFaces,detectFaceLandmarks,detectFaceLandmarksTiny,detectLandmarks,detectSingleFace,draw,env,euclideanDistance,extendWithAge,extendWithFaceDescriptor,extendWithFaceDetection,extendWithFaceExpressions,extendWithFaceLandmarks,extendWithGender,extractFaceTensors,extractFaces,fetchImage,fetchJson,fetchNetWeights,fetchOrThrow,fetchVideo,getContext2dOrThrow,getMediaDimensions,imageTensorToCanvas,imageToSquare,inverseSigmoid,iou,isMediaElement,isMediaLoaded,isWithAge,isWithFaceDetection,isWithFaceExpressions,isWithFaceLandmarks,isWithGender,loadAgeGenderModel,loadFaceDetectionModel,loadFaceExpressionModel,loadFaceLandmarkModel,loadFaceLandmarkTinyModel,loadFaceRecognitionModel,loadSsdMobilenetv1Model,loadTinyFaceDetectorModel,loadTinyYolov2Model,loadWeightMap,locateFaces,matchDimensions,minBbox,nets,nonMaxSuppression,normalize,padToSquare,predictAgeAndGender,recognizeFaceExpressions,resizeResults,resolveInput,shuffleArray,sigmoid,ssdMobilenetv1,tf,tinyFaceDetector,tinyYolov2,toNetInput,utils,validateConfig,version}); +"use strict";var ln=Object.create;var er=Object.defineProperty;var dn=Object.getOwnPropertyDescriptor;var hn=Object.getOwnPropertyNames;var bn=Object.getPrototypeOf,gn=Object.prototype.hasOwnProperty;var xn=(o,t)=>()=>(t||o((t={exports:{}}).exports,t),t.exports),Lr=(o,t)=>{for(var e in t)er(o,e,{get:t[e],enumerable:!0})},yo=(o,t,e,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of hn(t))!gn.call(o,n)&&n!==e&&er(o,n,{get:()=>t[n],enumerable:!(r=dn(t,n))||r.enumerable});return o};var v=(o,t,e)=>(e=o!=null?ln(bn(o)):{},yo(t||!o||!o.__esModule?er(e,"default",{value:o,enumerable:!0}):e,o)),vn=o=>yo(er({},"__esModule",{value:!0}),o);var x=xn((ka,Wr)=>{"use strict";var _o=Object.defineProperty,yn=Object.getOwnPropertyDescriptor,_n=Object.getOwnPropertyNames,Tn=Object.prototype.hasOwnProperty,Ar=(o,t,e,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of _n(t))!Tn.call(o,n)&&n!==e&&_o(o,n,{get:()=>t[n],enumerable:!(r=yn(t,n))||r.enumerable});return o},Pn=(o,t,e)=>(Ar(o,t,"default"),e&&Ar(e,t,"default")),wn=o=>Ar(_o({},"__esModule",{value:!0}),o),To={};Wr.exports=wn(To);Pn(To,require("@tensorflow/tfjs-node"),Wr.exports)});var Na={};Lr(Na,{AgeGenderNet:()=>He,BoundingBox:()=>Vt,Box:()=>F,ComposableTask:()=>J,ComputeAllFaceDescriptorsTask:()=>wt,ComputeFaceDescriptorsTaskBase:()=>Ue,ComputeSingleFaceDescriptorTask:()=>Ft,DetectAllFaceLandmarksTask:()=>qe,DetectAllFacesTask:()=>Ie,DetectFaceLandmarksTaskBase:()=>Je,DetectFacesTaskBase:()=>Ke,DetectSingleFaceLandmarksTask:()=>Ze,DetectSingleFaceTask:()=>Qe,Dimensions:()=>k,FACE_EXPRESSION_LABELS:()=>no,FaceDetection:()=>M,FaceDetectionNet:()=>uo,FaceExpressionNet:()=>Oe,FaceExpressions:()=>yt,FaceLandmark68Net:()=>Kt,FaceLandmark68TinyNet:()=>ze,FaceLandmarkNet:()=>co,FaceLandmarks:()=>z,FaceLandmarks5:()=>Yr,FaceLandmarks68:()=>Gt,FaceMatch:()=>pe,FaceMatcher:()=>tr,FaceRecognitionNet:()=>Qt,Gender:()=>Tr,LabeledBox:()=>ue,LabeledFaceDescriptors:()=>mt,NetInput:()=>ut,NeuralNetwork:()=>A,ObjectDetection:()=>bt,Point:()=>b,PredictedBox:()=>Gr,Rect:()=>Yt,SsdMobilenetv1:()=>St,SsdMobilenetv1Options:()=>X,TinyFaceDetector:()=>ne,TinyFaceDetectorOptions:()=>je,TinyYolov2:()=>re,TinyYolov2Options:()=>st,allFaces:()=>Ea,allFacesSsdMobilenetv1:()=>un,allFacesTinyYolov2:()=>Da,awaitMediaLoaded:()=>Kr,bufferToImage:()=>Qr,computeFaceDescriptor:()=>fa,createCanvas:()=>Jt,createCanvasFromMedia:()=>We,createFaceDetectionNet:()=>aa,createFaceRecognitionNet:()=>Xn,createSsdMobilenetv1:()=>Jo,createTinyFaceDetector:()=>Ma,createTinyYolov2:()=>ca,detectAllFaces:()=>Sr,detectFaceLandmarks:()=>mn,detectFaceLandmarksTiny:()=>ua,detectLandmarks:()=>wa,detectSingleFace:()=>Fa,draw:()=>so,env:()=>P,euclideanDistance:()=>go,extendWithAge:()=>Er,extendWithFaceDescriptor:()=>Dr,extendWithFaceDetection:()=>jt,extendWithFaceExpressions:()=>xr,extendWithFaceLandmarks:()=>we,extendWithGender:()=>Mr,extractFaceTensors:()=>de,extractFaces:()=>le,fetchImage:()=>An,fetchJson:()=>ro,fetchNetWeights:()=>Wn,fetchOrThrow:()=>xt,fetchVideo:()=>kn,getContext2dOrThrow:()=>O,getMediaDimensions:()=>Xt,imageTensorToCanvas:()=>to,imageToSquare:()=>eo,inverseSigmoid:()=>En,iou:()=>Or,isMediaElement:()=>ir,isMediaLoaded:()=>Ae,isWithAge:()=>Jn,isWithFaceDetection:()=>pt,isWithFaceExpressions:()=>ao,isWithFaceLandmarks:()=>Zt,isWithGender:()=>qn,loadAgeGenderModel:()=>_a,loadFaceDetectionModel:()=>Ta,loadFaceExpressionModel:()=>ya,loadFaceLandmarkModel:()=>ga,loadFaceLandmarkTinyModel:()=>xa,loadFaceRecognitionModel:()=>va,loadSsdMobilenetv1Model:()=>pn,loadTinyFaceDetectorModel:()=>ha,loadTinyYolov2Model:()=>ba,loadWeightMap:()=>oo,locateFaces:()=>Pa,matchDimensions:()=>Bn,minBbox:()=>Hr,nets:()=>w,nonMaxSuppression:()=>zr,normalize:()=>rt,padToSquare:()=>Vr,predictAgeAndGender:()=>da,recognizeFaceExpressions:()=>la,resizeResults:()=>fn,resolveInput:()=>Ut,shuffleArray:()=>Dn,sigmoid:()=>Ne,ssdMobilenetv1:()=>cn,tf:()=>Ca,tinyFaceDetector:()=>ma,tinyYolov2:()=>pa,toNetInput:()=>C,utils:()=>$r,validateConfig:()=>fo,version:()=>Ia});module.exports=vn(Na);var Ca=v(x());var so={};Lr(so,{AnchorPosition:()=>Zr,DrawBox:()=>Le,DrawBoxOptions:()=>ar,DrawFaceLandmarks:()=>yr,DrawFaceLandmarksOptions:()=>vr,DrawTextField:()=>gt,DrawTextFieldOptions:()=>fe,drawContour:()=>dt,drawDetections:()=>Ln,drawFaceExpressions:()=>Rn,drawFaceLandmarks:()=>On});function dt(o,t,e=!1){if(o.beginPath(),t.slice(1).forEach(({x:r,y:n},a)=>{let s=t[a];o.moveTo(s.x,s.y),o.lineTo(r,n)}),e){let r=t[t.length-1],n=t[0];if(!r||!n)return;o.moveTo(r.x,r.y),o.lineTo(n.x,n.y)}o.stroke()}var $r={};Lr($r,{computeReshapedDimensions:()=>Rr,getCenterPoint:()=>zt,isDimensions:()=>or,isEven:()=>rr,isFloat:()=>Br,isTensor:()=>Ot,isTensor1D:()=>Fn,isTensor2D:()=>kr,isTensor3D:()=>ht,isTensor4D:()=>U,isValidNumber:()=>et,isValidProbablitiy:()=>me,range:()=>it,round:()=>Ht});var Po=v(x());var k=class{constructor(t,e){if(!et(t)||!et(e))throw new Error(`Dimensions.constructor - expected width and height to be valid numbers, instead have ${JSON.stringify({width:t,height:e})}`);this._width=t,this._height=e}get width(){return this._width}get height(){return this._height}reverse(){return new k(1/this.width,1/this.height)}};function Ot(o,t){return o instanceof Po.Tensor&&o.shape.length===t}function Fn(o){return Ot(o,1)}function kr(o){return Ot(o,2)}function ht(o){return Ot(o,3)}function U(o){return Ot(o,4)}function Br(o){return o%1!==0}function rr(o){return o%2===0}function Ht(o,t=2){let e=10**t;return Math.floor(o*e)/e}function or(o){return o&&o.width&&o.height}function Rr({width:o,height:t},e){let r=e/Math.max(t,o);return new k(Math.round(o*r),Math.round(t*r))}function zt(o){return o.reduce((t,e)=>t.add(e),new b(0,0)).div(new b(o.length,o.length))}function it(o,t,e){return Array(o).fill(0).map((r,n)=>t+n*e)}function et(o){return!!o&&o!==1/0&&o!==-1/0&&!Number.isNaN(o)||o===0}function me(o){return et(o)&&o>=0&&o<=1}var b=class{constructor(t,e){this._x=t,this._y=e}get x(){return this._x}get y(){return this._y}add(t){return new b(this.x+t.x,this.y+t.y)}sub(t){return new b(this.x-t.x,this.y-t.y)}mul(t){return new b(this.x*t.x,this.y*t.y)}div(t){return new b(this.x/t.x,this.y/t.y)}abs(){return new b(Math.abs(this.x),Math.abs(this.y))}magnitude(){return Math.sqrt(this.x**2+this.y**2)}floor(){return new b(Math.floor(this.x),Math.floor(this.y))}};var F=class{static isRect(t){return!!t&&[t.x,t.y,t.width,t.height].every(et)}static assertIsValidBox(t,e,r=!1){if(!F.isRect(t))throw new Error(`${e} - invalid box: ${JSON.stringify(t)}, expected object with properties x, y, width, height`);if(!r&&(t.width<0||t.height<0))throw new Error(`${e} - width (${t.width}) and height (${t.height}) must be positive numbers`)}constructor(t,e=!0){let r=t||{},n=[r.left,r.top,r.right,r.bottom].every(et),a=[r.x,r.y,r.width,r.height].every(et);if(!a&&!n)throw new Error(`Box.constructor - expected box to be IBoundingBox | IRect, instead have ${JSON.stringify(r)}`);let[s,i,c,m]=a?[r.x,r.y,r.width,r.height]:[r.left,r.top,r.right-r.left,r.bottom-r.top];F.assertIsValidBox({x:s,y:i,width:c,height:m},"Box.constructor",e),this._x=s,this._y=i,this._width=c,this._height=m}get x(){return this._x}get y(){return this._y}get width(){return this._width}get height(){return this._height}get left(){return this.x}get top(){return this.y}get right(){return this.x+this.width}get bottom(){return this.y+this.height}get area(){return this.width*this.height}get topLeft(){return new b(this.left,this.top)}get topRight(){return new b(this.right,this.top)}get bottomLeft(){return new b(this.left,this.bottom)}get bottomRight(){return new b(this.right,this.bottom)}round(){let[t,e,r,n]=[this.x,this.y,this.width,this.height].map(a=>Math.round(a));return new F({x:t,y:e,width:r,height:n})}floor(){let[t,e,r,n]=[this.x,this.y,this.width,this.height].map(a=>Math.floor(a));return new F({x:t,y:e,width:r,height:n})}toSquare(){let{x:t,y:e,width:r,height:n}=this,a=Math.abs(r-n);return re&&(i=-u+e+r,u=e),f>t&&(c=-f+t+n,f=t),m<1&&(c=2-m,m=1),p<1&&(c=2-p,p=1),{dy:s,edy:c,dx:a,edx:i,y:p,ey:f,x:m,ex:u,w:r,h:n}}calibrate(t){return new F({left:this.left+t.left*this.width,top:this.top+t.top*this.height,right:this.right+t.right*this.width,bottom:this.bottom+t.bottom*this.height}).toSquare().round()}};var Vt=class extends F{constructor(t,e,r,n,a=!1){super({left:t,top:e,right:r,bottom:n},a)}};var bt=class{constructor(t,e,r,n,a){this._imageDims=new k(a.width,a.height),this._score=t,this._classScore=e,this._className=r,this._box=new F(n).rescale(this._imageDims)}get score(){return this._score}get classScore(){return this._classScore}get className(){return this._className}get box(){return this._box}get imageDims(){return this._imageDims}get imageWidth(){return this.imageDims.width}get imageHeight(){return this.imageDims.height}get relativeBox(){return new F(this._box).rescale(this.imageDims.reverse())}forSize(t,e){return new bt(this.score,this.classScore,this.className,this.relativeBox,{width:t,height:e})}};var M=class extends bt{constructor(t,e,r){super(t,t,"",e,r)}forSize(t,e){let{score:r,relativeBox:n,imageDims:a}=super.forSize(t,e);return new M(r,n,a)}};function Or(o,t,e=!0){let r=Math.max(0,Math.min(o.right,t.right)-Math.max(o.left,t.left)),n=Math.max(0,Math.min(o.bottom,t.bottom)-Math.max(o.top,t.top)),a=r*n;return e?a/(o.area+t.area-a):a/Math.min(o.area,t.area)}function Hr(o){let t=o.map(i=>i.x),e=o.map(i=>i.y),r=t.reduce((i,c)=>ccii({score:s,boxIndex:i})).sort((s,i)=>s.score-i.score).map(s=>s.boxIndex),a=[];for(;n.length>0;){let s=n.pop();a.push(s);let i=n,c=[];for(let m=0;mc[p]<=e)}return a}var ct=v(x());function rt(o,t){return ct.tidy(()=>{let[e,r,n]=t,a=ct.fill([...o.shape.slice(0,3),1],e,"float32"),s=ct.fill([...o.shape.slice(0,3),1],r,"float32"),i=ct.fill([...o.shape.slice(0,3),1],n,"float32"),c=ct.concat([a,s,i],3);return ct.sub(o,c)})}var Ct=v(x());function Vr(o,t=!1){return Ct.tidy(()=>{let[e,r]=o.shape.slice(1);if(e===r)return o;let n=Math.abs(e-r),a=Math.round(n*(t?.5:1)),s=e>r?2:1,i=f=>{let l=o.shape.slice();return l[s]=f,Ct.fill(l,0,"float32")},c=i(a),m=n-c.shape[s],u=[t&&m?i(m):null,o,c].filter(f=>!!f).map(f=>Ct.cast(f,"float32"));return Ct.concat(u,s)})}function Dn(o){let t=o.slice();for(let e=t.length-1;e>0;e--){let r=Math.floor(Math.random()*(e+1)),n=t[e];t[e]=t[r],t[r]=n}return t}function Ne(o){return 1/(1+Math.exp(-o))}function En(o){return Math.log(o/(1-o))}var Yt=class extends F{constructor(t,e,r,n,a=!1){super({x:t,y:e,width:r,height:n},a)}};var Mn=.5,Cn=.43,In=.45,z=class{constructor(t,e,r=new b(0,0)){let{width:n,height:a}=e;this._imgDims=new k(n,a),this._shift=r,this._positions=t.map(s=>s.mul(new b(n,a)).add(r))}get shift(){return new b(this._shift.x,this._shift.y)}get imageWidth(){return this._imgDims.width}get imageHeight(){return this._imgDims.height}get positions(){return this._positions}get relativePositions(){return this._positions.map(t=>t.sub(this._shift).div(new b(this.imageWidth,this.imageHeight)))}forSize(t,e){return new this.constructor(this.relativePositions,{width:t,height:e})}shiftBy(t,e){return new this.constructor(this.relativePositions,this._imgDims,new b(t,e))}shiftByPoint(t){return this.shiftBy(t.x,t.y)}align(t,e={}){if(t){let a=t instanceof M?t.box.floor():new F(t);return this.shiftBy(a.x,a.y).align(null,e)}let{useDlibAlignment:r,minBoxPadding:n}={useDlibAlignment:!1,minBoxPadding:.2,...e};return r?this.alignDlib():this.alignMinBbox(n)}alignDlib(){let t=this.getRefPointsForAlignment(),[e,r,n]=t,a=u=>n.sub(u).magnitude(),s=(a(e)+a(r))/2,i=Math.floor(s/In),c=zt(t),m=Math.floor(Math.max(0,c.x-Mn*i)),p=Math.floor(Math.max(0,c.y-Cn*i));return new Yt(m,p,Math.min(i,this.imageWidth+m),Math.min(i,this.imageHeight+p))}alignMinBbox(t){let e=Hr(this.positions);return e.pad(e.width*t,e.height*t)}getRefPointsForAlignment(){throw new Error("getRefPointsForAlignment not implemented by base class")}};var Yr=class extends z{getRefPointsForAlignment(){let t=this.positions;return[t[0],t[1],zt([t[3],t[4]])]}};var Gt=class extends z{getJawOutline(){return this.positions.slice(0,17)}getLeftEyeBrow(){return this.positions.slice(17,22)}getRightEyeBrow(){return this.positions.slice(22,27)}getNose(){return this.positions.slice(27,36)}getLeftEye(){return this.positions.slice(36,42)}getRightEye(){return this.positions.slice(42,48)}getMouth(){return this.positions.slice(48,68)}getRefPointsForAlignment(){return[this.getLeftEye(),this.getRightEye(),this.getMouth()].map(zt)}};var pe=class{constructor(t,e){this._label=t,this._distance=e}get label(){return this._label}get distance(){return this._distance}toString(t=!0){return`${this.label}${t?` (${Ht(this.distance)})`:""}`}};var ue=class extends F{constructor(e,r){super(e);this._label=r}static assertIsValidLabeledBox(e,r){if(F.assertIsValidBox(e,r),!et(e.label))throw new Error(`${r} - expected property label (${e.label}) to be a number`)}get label(){return this._label}};var mt=class{constructor(t,e){if(typeof t!="string")throw new Error("LabeledFaceDescriptors - constructor expected label to be a string");if(!Array.isArray(e)||e.some(r=>!(r instanceof Float32Array)))throw new Error("LabeledFaceDescriptors - constructor expected descriptors to be an array of Float32Array");this._label=t,this._descriptors=e}get label(){return this._label}get descriptors(){return this._descriptors}toJSON(){return{label:this.label,descriptors:this.descriptors.map(t=>Array.from(t))}}static fromJSON(t){let e=t.descriptors.map(r=>new Float32Array(r));return new mt(t.label,e)}};var Gr=class extends ue{constructor(e,r,n,a){super(e,r);this._score=n,this._classScore=a}static assertIsValidPredictedBox(e,r){if(ue.assertIsValidLabeledBox(e,r),!me(e.score)||!me(e.classScore))throw new Error(`${r} - expected properties score (${e.score}) and (${e.classScore}) to be a number between [0, 1]`)}get score(){return this._score}get classScore(){return this._classScore}};function pt(o){return o.detection instanceof M}function jt(o,t){return{...o,...{detection:t}}}function jr(){let o=window.fetch;if(!o)throw new Error("fetch - missing fetch implementation for browser environment");return{Canvas:HTMLCanvasElement,CanvasRenderingContext2D,Image:HTMLImageElement,ImageData,Video:HTMLVideoElement,createCanvasElement:()=>document.createElement("canvas"),createImageElement:()=>document.createElement("img"),createVideoElement:()=>document.createElement("video"),fetch:o,readFile:()=>{throw new Error("readFile - filesystem not available for browser environment")}}}function Se(){return typeof global=="object"&&typeof process!="undefined"&&process.versions!=null&&process.versions.node!=null}function nr(o){let t="";if(!o&&Se())try{o=require("fs")}catch(r){t=r.toString()}return{readFile:o?r=>new Promise((n,a)=>{o.readFile(r,(s,i)=>s?a(s):n(i))}):()=>{throw new Error(`readFile - failed to require fs in nodejs environment with error: ${t}`)}}}function Ur(){let o=global.Canvas||global.HTMLCanvasElement,t=global.Image||global.HTMLImageElement,e=global.Video||global.HTMLVideoElement,r=()=>{if(o)return new o;throw new Error("createCanvasElement - missing Canvas implementation for nodejs environment")},n=()=>{if(t)return new t;throw new Error("createImageElement - missing Image implementation for nodejs environment")},a=()=>{if(e)return new e;throw new Error("createVideoElement - missing Video implementation for nodejs environment")},s=global.fetch,i=nr();return{Canvas:o||class{},CanvasRenderingContext2D:global.CanvasRenderingContext2D||class{},Image:t||class{},ImageData:global.ImageData||class{},Video:global.HTMLVideoElement||class{},createCanvasElement:r,createImageElement:n,createVideoElement:a,fetch:s,...i}}function Xr(){return typeof window=="object"&&typeof document!="undefined"&&typeof HTMLImageElement!="undefined"&&typeof HTMLCanvasElement!="undefined"&&typeof HTMLVideoElement!="undefined"&&typeof ImageData!="undefined"&&typeof CanvasRenderingContext2D!="undefined"}var L;function Nn(){if(!L)throw new Error("getEnv - environment is not defined, check isNodejs() and isBrowser()");return L}function Jr(o){L=o}function qr(){return Xr()?Jr(jr()):Se()?Jr(Ur()):null}function Sn(o){if(L||qr(),!L)throw new Error("monkeyPatch - environment is not defined, check isNodejs() and isBrowser()");let{Canvas:t=L.Canvas,Image:e=L.Image}=o;L.Canvas=t,L.Image=e,L.createCanvasElement=o.createCanvasElement||(()=>new t),L.createImageElement=o.createImageElement||(()=>new e),L.ImageData=o.ImageData||L.ImageData,L.Video=o.Video||L.Video,L.fetch=o.fetch||L.fetch,L.readFile=o.readFile||L.readFile}var P={getEnv:Nn,setEnv:Jr,initialize:qr,createBrowserEnv:jr,createFileSystem:nr,createNodejsEnv:Ur,monkeyPatch:Sn,isBrowser:Xr,isNodejs:Se};qr();function Ut(o){return!P.isNodejs()&&typeof o=="string"?document.getElementById(o):o}function O(o){let{Canvas:t,CanvasRenderingContext2D:e}=P.getEnv();if(o instanceof e)return o;let r=Ut(o);if(!(r instanceof t))throw new Error("resolveContext2d - expected canvas to be of instance of Canvas");let n=r.getContext("2d");if(!n)throw new Error("resolveContext2d - canvas 2d context is null");return n}var Zr=(n=>(n.TOP_LEFT="TOP_LEFT",n.TOP_RIGHT="TOP_RIGHT",n.BOTTOM_LEFT="BOTTOM_LEFT",n.BOTTOM_RIGHT="BOTTOM_RIGHT",n))(Zr||{}),fe=class{constructor(t={}){let{anchorPosition:e,backgroundColor:r,fontColor:n,fontSize:a,fontStyle:s,padding:i}=t;this.anchorPosition=e||"TOP_LEFT",this.backgroundColor=r||"rgba(0, 0, 0, 0.5)",this.fontColor=n||"rgba(255, 255, 255, 1)",this.fontSize=a||14,this.fontStyle=s||"Georgia",this.padding=i||4}},gt=class{constructor(t,e,r={}){this.text=typeof t=="string"?[t]:t instanceof gt?t.text:t,this.anchor=e,this.options=new fe(r)}measureWidth(t){let{padding:e}=this.options;return this.text.map(r=>t.measureText(r).width).reduce((r,n)=>r{let g=c+u.x,T=c+u.y+(l+1)*s;r.fillText(f,g,T)})}};var ar=class{constructor(t={}){let{boxColor:e,lineWidth:r,label:n,drawLabelOptions:a}=t;this.boxColor=e||"rgba(0, 0, 255, 1)",this.lineWidth=r||2,this.label=n;let s={anchorPosition:"BOTTOM_LEFT",backgroundColor:this.boxColor};this.drawLabelOptions=new fe({...s,...a})}},Le=class{constructor(t,e={}){this.box=new F(t),this.options=new ar(e)}draw(t){let e=O(t),{boxColor:r,lineWidth:n}=this.options,{x:a,y:s,width:i,height:c}=this.box;e.strokeStyle=r,e.lineWidth=n,e.strokeRect(a,s,i,c);let{label:m}=this.options;m&&new gt([m],{x:a-n/2,y:s},this.options.drawLabelOptions).draw(t)}};function Ln(o,t){(Array.isArray(t)?t:[t]).forEach(r=>{let n=r instanceof M?r.score:pt(r)?r.detection.score:void 0,a=r instanceof M?r.box:pt(r)?r.detection.box:new F(r),s=n?`${Ht(n)}`:void 0;new Le(a,{label:s}).draw(o)})}var Pe=v(x());function Ae(o){let{Image:t,Video:e}=P.getEnv();return o instanceof t&&o.complete||o instanceof e&&o.readyState>=3}function Kr(o){return new Promise((t,e)=>{(o instanceof P.getEnv().Canvas||Ae(o))&&t(null);function r(a){!a.currentTarget||(a.currentTarget.removeEventListener("load",n),a.currentTarget.removeEventListener("error",r),e(a))}function n(a){!a.currentTarget||(a.currentTarget.removeEventListener("load",n),a.currentTarget.removeEventListener("error",r),t(a))}o.addEventListener("load",n),o.addEventListener("error",r)})}function Qr(o){return new Promise((t,e)=>{o instanceof Blob||e(new Error("bufferToImage - expected buf to be of type: Blob"));let r=new FileReader;r.onload=()=>{typeof r.result!="string"&&e(new Error("bufferToImage - expected reader.result to be a string, in onload"));let n=P.getEnv().createImageElement();n.onload=()=>t(n),n.onerror=e,n.src=r.result},r.onerror=e,r.readAsDataURL(o)})}function Xt(o){let{Image:t,Video:e}=P.getEnv();return o instanceof t?new k(o.naturalWidth,o.naturalHeight):o instanceof e?new k(o.videoWidth,o.videoHeight):new k(o.width,o.height)}function Jt({width:o,height:t}){let{createCanvasElement:e}=P.getEnv(),r=e();return r.width=o,r.height=t,r}function We(o,t){let{ImageData:e}=P.getEnv();if(!(o instanceof e)&&!Ae(o))throw new Error("createCanvasFromMedia - media has not finished loading yet");let{width:r,height:n}=t||Xt(o),a=Jt({width:r,height:n});return o instanceof e?O(a).putImageData(o,0,0):O(a).drawImage(o,0,0,r,n),a}var sr=v(x());async function to(o,t){let e=t||P.getEnv().createCanvasElement(),[r,n,a]=o.shape.slice(U(o)?1:0),s=sr.tidy(()=>o.as3D(r,n,a).toInt());return await sr.browser.toPixels(s,e),s.dispose(),e}function ir(o){let{Image:t,Canvas:e,Video:r}=P.getEnv();return o instanceof t||o instanceof e||o instanceof r}var V=v(x());function eo(o,t,e=!1){let{Image:r,Canvas:n}=P.getEnv();if(!(o instanceof r||o instanceof n))throw new Error("imageToSquare - expected arg0 to be HTMLImageElement | HTMLCanvasElement");if(t<=0)return Jt({width:1,height:1});let a=Xt(o),s=t/Math.max(a.height,a.width),i=s*a.width,c=s*a.height,m=Jt({width:t,height:t}),p=o instanceof n?o:We(o),u=Math.abs(i-c)/2,f=e&&i0&&p.height>0&&O(m).drawImage(p,f,l,i,c),m}var ut=class{constructor(t,e=!1){this._imageTensors=[];this._canvases=[];this._treatAsBatchInput=!1;this._inputDimensions=[];this._inputSize=0;if(!Array.isArray(t))throw new Error(`NetInput.constructor - expected inputs to be an Array of TResolvedNetInput or to be instanceof tf.Tensor4D, instead have ${t}`);this._treatAsBatchInput=e,this._batchSize=t.length,t.forEach((r,n)=>{if(ht(r)){this._imageTensors[n]=r,this._inputDimensions[n]=r.shape;return}if(U(r)){let s=r.shape[0];if(s!==1)throw new Error(`NetInput - tf.Tensor4D with batchSize ${s} passed, but not supported in input array`);this._imageTensors[n]=r,this._inputDimensions[n]=r.shape.slice(1);return}let a=r instanceof P.getEnv().Canvas?r:We(r);this._canvases[n]=a,this._inputDimensions[n]=[a.height,a.width,3]})}get imageTensors(){return this._imageTensors}get canvases(){return this._canvases}get isBatchInput(){return this.batchSize>1||this._treatAsBatchInput}get batchSize(){return this._batchSize}get inputDimensions(){return this._inputDimensions}get inputSize(){return this._inputSize}get reshapedInputDimensions(){return it(this.batchSize,0,1).map((t,e)=>this.getReshapedInputDimensions(e))}getInput(t){return this.canvases[t]||this.imageTensors[t]}getInputDimensions(t){return this._inputDimensions[t]}getInputHeight(t){return this._inputDimensions[t][0]}getInputWidth(t){return this._inputDimensions[t][1]}getReshapedInputDimensions(t){if(typeof this.inputSize!="number")throw new Error("getReshapedInputDimensions - inputSize not set, toBatchTensor has not been called yet");let e=this.getInputWidth(t),r=this.getInputHeight(t);return Rr({width:e,height:r},this.inputSize)}toBatchTensor(t,e=!0){return this._inputSize=t,V.tidy(()=>{let r=it(this.batchSize,0,1).map(a=>{let s=this.getInput(a);if(s instanceof V.Tensor){let i=U(s)?s:V.expandDims(s);return i=Vr(i,e),(i.shape[1]!==t||i.shape[2]!==t)&&(i=V.image.resizeBilinear(i,[t,t],!1,!1)),i.as3D(t,t,3)}if(s instanceof P.getEnv().Canvas)return V.browser.fromPixels(eo(s,t,e));throw new Error(`toBatchTensor - at batchIdx ${a}, expected input to be instanceof tf.Tensor or instanceof HTMLCanvasElement, instead have ${s}`)});return V.stack(r.map(a=>V.cast(a,"float32"))).as4D(this.batchSize,t,t,3)})}};async function C(o){if(o instanceof ut)return o;let t=Array.isArray(o)?o:[o];if(!t.length)throw new Error("toNetInput - empty array passed as input");let e=n=>Array.isArray(o)?` at input index ${n}:`:"",r=t.map(Ut);return r.forEach((n,a)=>{if(!ir(n)&&!ht(n)&&!U(n))throw typeof t[a]=="string"?new Error(`toNetInput -${e(a)} string passed, but could not resolve HTMLElement for element id ${t[a]}`):new Error(`toNetInput -${e(a)} expected media to be of type HTMLImageElement | HTMLVideoElement | HTMLCanvasElement | tf.Tensor3D, or to be an element id`);if(U(n)){let s=n.shape[0];if(s!==1)throw new Error(`toNetInput -${e(a)} tf.Tensor4D with batchSize ${s} passed, but not supported in input array`)}}),await Promise.all(r.map(n=>ir(n)&&Kr(n))),new ut(r,Array.isArray(o))}async function le(o,t){let{Canvas:e}=P.getEnv(),r=o;if(!(o instanceof e)){let s=await C(o);if(s.batchSize>1)throw new Error("extractFaces - batchSize > 1 not supported");let i=s.getInput(0);r=i instanceof e?i:await to(i)}let n=O(r);return t.map(s=>s instanceof M?s.forSize(r.width,r.height).box.floor():s).map(s=>s.clipAtImageBorders(r.width,r.height)).map(({x:s,y:i,width:c,height:m})=>{let p=Jt({width:c,height:m});return c>0&&m>0&&O(p).putImageData(n.getImageData(s,i,c,m),0,0),p})}var cr=v(x());async function de(o,t){if(!ht(o)&&!U(o))throw new Error("extractFaceTensors - expected image tensor to be 3D or 4D");if(U(o)&&o.shape[0]>1)throw new Error("extractFaceTensors - batchSize > 1 not supported");return cr.tidy(()=>{let[e,r,n]=o.shape.slice(U(o)?1:0);return t.map(i=>i instanceof M?i.forSize(r,e).box:i).map(i=>i.clipAtImageBorders(r,e)).filter(i=>i.width>0&&i.height>0).map(({x:i,y:c,width:m,height:p})=>cr.slice3d(o.as3D(e,r,n),[c,i,0],[p,m,n]))})}async function xt(o,t){let{fetch:e}=P.getEnv(),r=await e(o,t);if(!(r.status<400))throw new Error(`failed to fetch: (${r.status}) ${r.statusText}, from url: ${r.url}`);return r}async function An(o){let t=await xt(o),e=await t.blob();if(!e.type.startsWith("image/"))throw new Error(`fetchImage - expected blob type to be of type image/*, instead have: ${e.type}, for url: ${t.url}`);return Qr(e)}async function ro(o){return(await xt(o)).json()}async function Wn(o){return new Float32Array(await(await xt(o)).arrayBuffer())}function wo(o){return new Promise((t,e)=>{o instanceof Blob||e(new Error("bufferToVideo - expected buf to be of type: Blob"));let r=P.getEnv().createVideoElement();r.oncanplay=()=>t(r),r.onerror=e,r.playsInline=!0,r.muted=!0,r.src=URL.createObjectURL(o),r.play()})}async function kn(o){let t=await xt(o),e=await t.blob();if(!e.type.startsWith("video/"))throw new Error(`fetchVideo - expected blob type to be of type video/*, instead have: ${e.type}, for url: ${t.url}`);return wo(e)}var Fo=v(x());function mr(o,t){let e=`${t}-weights_manifest.json`;if(!o)return{modelBaseUri:"",manifestUri:e};if(o==="/")return{modelBaseUri:"/",manifestUri:`/${e}`};let r=o.startsWith("http://")?"http://":o.startsWith("https://")?"https://":"";o=o.replace(r,"");let n=o.split("/").filter(i=>i),a=o.endsWith(".json")?n[n.length-1]:e,s=r+(o.endsWith(".json")?n.slice(0,n.length-1):n).join("/");return s=o.startsWith("/")?`/${s}`:s,{modelBaseUri:s,manifestUri:s==="/"?`/${a}`:`${s}/${a}`}}async function oo(o,t){let{manifestUri:e,modelBaseUri:r}=mr(o,t),n=await ro(e);return Fo.io.loadWeights(n,r)}function Bn(o,t,e=!1){let{width:r,height:n}=e?Xt(t):t;return o.width=r,o.height=n,{width:r,height:n}}var ye=v(x());var vt=v(x());var A=class{constructor(t){this._params=void 0;this._paramMappings=[];this._name=t}get params(){return this._params}get paramMappings(){return this._paramMappings}get isLoaded(){return!!this.params}getParamFromPath(t){let{obj:e,objProp:r}=this.traversePropertyPath(t);return e[r]}reassignParamFromPath(t,e){let{obj:r,objProp:n}=this.traversePropertyPath(t);r[n].dispose(),r[n]=e}getParamList(){return this._paramMappings.map(({paramPath:t})=>({path:t,tensor:this.getParamFromPath(t)}))}getTrainableParams(){return this.getParamList().filter(t=>t.tensor instanceof vt.Variable)}getFrozenParams(){return this.getParamList().filter(t=>!(t.tensor instanceof vt.Variable))}variable(){this.getFrozenParams().forEach(({path:t,tensor:e})=>{this.reassignParamFromPath(t,e.variable())})}freeze(){this.getTrainableParams().forEach(({path:t,tensor:e})=>{let r=vt.tensor(e.dataSync());e.dispose(),this.reassignParamFromPath(t,r)})}dispose(t=!0){this.getParamList().forEach(e=>{if(t&&e.tensor.isDisposed)throw new Error(`param tensor has already been disposed for path ${e.path}`);e.tensor.dispose()}),this._params=void 0}serializeParams(){return new Float32Array(this.getParamList().map(({tensor:t})=>Array.from(t.dataSync())).reduce((t,e)=>t.concat(e)))}async load(t){if(t instanceof Float32Array){this.extractWeights(t);return}await this.loadFromUri(t)}async loadFromUri(t){if(t&&typeof t!="string")throw new Error(`${this._name}.loadFromUri - expected model uri`);let e=await oo(t,this.getDefaultModelName());this.loadFromWeightMap(e)}async loadFromDisk(t){if(t&&typeof t!="string")throw new Error(`${this._name}.loadFromDisk - expected model file path`);let{readFile:e}=P.getEnv(),{manifestUri:r,modelBaseUri:n}=mr(t,this.getDefaultModelName()),a=m=>Promise.all(m.map(p=>e(p).then(u=>u.buffer))),s=vt.io.weightsLoaderFactory(a),i=JSON.parse((await e(r)).toString()),c=await s(i,n);this.loadFromWeightMap(c)}loadFromWeightMap(t){let{paramMappings:e,params:r}=this.extractParamsFromWeightMap(t);this._paramMappings=e,this._params=r}extractWeights(t){let{paramMappings:e,params:r}=this.extractParams(t);this._paramMappings=e,this._params=r}traversePropertyPath(t){if(!this.params)throw new Error("traversePropertyPath - model has no loaded params");let e=t.split("/").reduce((a,s)=>{if(!a.nextObj.hasOwnProperty(s))throw new Error(`traversePropertyPath - object does not have property ${s}, for path ${t}`);return{obj:a.nextObj,objProp:s,nextObj:a.nextObj[s]}},{nextObj:this.params}),{obj:r,objProp:n}=e;if(!r||!n||!(r[n]instanceof vt.Tensor))throw new Error(`traversePropertyPath - parameter is not a tensor, for path ${t}`);return{obj:r,objProp:n}}};var I=v(x());var he=v(x());function H(o,t,e){return he.tidy(()=>{let r=he.separableConv2d(o,t.depthwise_filter,t.pointwise_filter,e,"same");return r=he.add(r,t.bias),r})}function pr(o,t,e=!1){return I.tidy(()=>{let r=I.relu(e?I.add(I.conv2d(o,t.conv0.filters,[2,2],"same"),t.conv0.bias):H(o,t.conv0,[2,2])),n=H(r,t.conv1,[1,1]),a=I.relu(I.add(r,n)),s=H(a,t.conv2,[1,1]);return I.relu(I.add(r,I.add(n,s)))})}function ke(o,t,e=!1,r=!0){return I.tidy(()=>{let n=I.relu(e?I.add(I.conv2d(o,t.conv0.filters,r?[2,2]:[1,1],"same"),t.conv0.bias):H(o,t.conv0,r?[2,2]:[1,1])),a=H(n,t.conv1,[1,1]),s=I.relu(I.add(n,a)),i=H(s,t.conv2,[1,1]),c=I.relu(I.add(n,I.add(a,i))),m=H(c,t.conv3,[1,1]);return I.relu(I.add(n,I.add(a,I.add(i,m))))})}var It=v(x());function qt(o,t,e="same",r=!1){return It.tidy(()=>{let n=It.add(It.conv2d(o,t.filters,[1,1],e),t.bias);return r?It.relu(n):n})}function B(o,t){Object.keys(o).forEach(e=>{t.some(r=>r.originalPath===e)||o[e].dispose()})}var ur=v(x());function be(o,t){return(e,r,n,a)=>{let s=ur.tensor4d(o(e*r*n*n),[n,n,e,r]),i=ur.tensor1d(o(r));return t.push({paramPath:`${a}/filters`},{paramPath:`${a}/bias`}),{filters:s,bias:i}}}var fr=v(x());function lr(o,t){return(e,r,n)=>{let a=fr.tensor2d(o(e*r),[e,r]),s=fr.tensor1d(o(r));return t.push({paramPath:`${n}/weights`},{paramPath:`${n}/bias`}),{weights:a,bias:s}}}var Re=v(x());var Be=class{constructor(t,e,r){this.depthwise_filter=t;this.pointwise_filter=e;this.bias=r}};function ge(o,t){return(e,r,n)=>{let a=Re.tensor4d(o(9*e),[3,3,e,1]),s=Re.tensor4d(o(e*r),[1,1,e,r]),i=Re.tensor1d(o(r));return t.push({paramPath:`${n}/depthwise_filter`},{paramPath:`${n}/pointwise_filter`},{paramPath:`${n}/bias`}),new Be(a,s,i)}}function xe(o){return t=>{let e=o(`${t}/depthwise_filter`,4),r=o(`${t}/pointwise_filter`,4),n=o(`${t}/bias`,1);return new Be(e,r,n)}}function Y(o,t){return(e,r,n)=>{let a=o[e];if(!Ot(a,r))throw new Error(`expected weightMap[${e}] to be a Tensor${r}D, instead have ${a}`);return t.push({originalPath:e,paramPath:n||e}),a}}function R(o){let t=o;function e(n){let a=t.slice(0,n);return t=t.slice(n),a}function r(){return t}return{extractWeights:e,getRemainingWeights:r}}function dr(o,t){let e=be(o,t),r=ge(o,t);function n(s,i,c,m=!1){let p=m?e(s,i,3,`${c}/conv0`):r(s,i,`${c}/conv0`),u=r(i,i,`${c}/conv1`),f=r(i,i,`${c}/conv2`);return{conv0:p,conv1:u,conv2:f}}function a(s,i,c,m=!1){let{conv0:p,conv1:u,conv2:f}=n(s,i,c,m),l=r(i,i,`${c}/conv3`);return{conv0:p,conv1:u,conv2:f,conv3:l}}return{extractDenseBlock3Params:n,extractDenseBlock4Params:a}}function Do(o){let t=[],{extractWeights:e,getRemainingWeights:r}=R(o),{extractDenseBlock4Params:n}=dr(e,t),a=n(3,32,"dense0",!0),s=n(32,64,"dense1"),i=n(64,128,"dense2"),c=n(128,256,"dense3");if(r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{paramMappings:t,params:{dense0:a,dense1:s,dense2:i,dense3:c}}}function hr(o){return t=>{let e=o(`${t}/filters`,4),r=o(`${t}/bias`,1);return{filters:e,bias:r}}}function br(o,t){let e=Y(o,t),r=hr(e),n=xe(e);function a(i,c=!1){let m=c?r(`${i}/conv0`):n(`${i}/conv0`),p=n(`${i}/conv1`),u=n(`${i}/conv2`);return{conv0:m,conv1:p,conv2:u}}function s(i,c=!1){let m=c?r(`${i}/conv0`):n(`${i}/conv0`),p=n(`${i}/conv1`),u=n(`${i}/conv2`),f=n(`${i}/conv3`);return{conv0:m,conv1:p,conv2:u,conv3:f}}return{extractDenseBlock3Params:a,extractDenseBlock4Params:s}}function Eo(o){let t=[],{extractDenseBlock4Params:e}=br(o,t),r={dense0:e("dense0",!0),dense1:e("dense1"),dense2:e("dense2"),dense3:e("dense3")};return B(o,t),{params:r,paramMappings:t}}var ve=class extends A{constructor(){super("FaceFeatureExtractor")}forwardInput(t){let{params:e}=this;if(!e)throw new Error("FaceFeatureExtractor - load model before inference");return ye.tidy(()=>{let r=ye.cast(t.toBatchTensor(112,!0),"float32"),a=rt(r,[122.782,117.001,104.298]).div(255),s=ke(a,e.dense0,!0);return s=ke(s,e.dense1),s=ke(s,e.dense2),s=ke(s,e.dense3),s=ye.avgPool(s,[7,7],[2,2],"valid"),s})}async forward(t){return this.forwardInput(await C(t))}getDefaultModelName(){return"face_feature_extractor_model"}extractParamsFromWeightMap(t){return Eo(t)}extractParams(t){return Do(t)}};var Io=v(x());var _e=v(x());function $e(o,t){return _e.tidy(()=>_e.add(_e.matMul(o,t.weights),t.bias))}function Mo(o,t,e){let r=[],{extractWeights:n,getRemainingWeights:a}=R(o),i=lr(n,r)(t,e,"fc");if(a().length!==0)throw new Error(`weights remaing after extract: ${a().length}`);return{paramMappings:r,params:{fc:i}}}function Co(o){let t=[],e=Y(o,t);function r(a){let s=e(`${a}/weights`,2),i=e(`${a}/bias`,1);return{weights:s,bias:i}}let n={fc:r("fc")};return B(o,t),{params:n,paramMappings:t}}function gr(o){let t={},e={};return Object.keys(o).forEach(r=>{let n=r.startsWith("fc")?e:t;n[r]=o[r]}),{featureExtractorMap:t,classifierMap:e}}var Te=class extends A{constructor(e,r){super(e);this._faceFeatureExtractor=r}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(e){let{params:r}=this;if(!r)throw new Error(`${this._name} - load model before inference`);return Io.tidy(()=>{let n=e instanceof ut?this.faceFeatureExtractor.forwardInput(e):e;return $e(n.as2D(n.shape[0],-1),r.fc)})}dispose(e=!0){this.faceFeatureExtractor.dispose(e),super.dispose(e)}loadClassifierParams(e){let{params:r,paramMappings:n}=this.extractClassifierParams(e);this._params=r,this._paramMappings=n}extractClassifierParams(e){return Mo(e,this.getClassifierChannelsIn(),this.getClassifierChannelsOut())}extractParamsFromWeightMap(e){let{featureExtractorMap:r,classifierMap:n}=gr(e);return this.faceFeatureExtractor.loadFromWeightMap(r),Co(n)}extractParams(e){let r=this.getClassifierChannelsIn(),n=this.getClassifierChannelsOut(),a=n*r+n,s=e.slice(0,e.length-a),i=e.slice(e.length-a);return this.faceFeatureExtractor.extractWeights(s),this.extractClassifierParams(i)}};var no=["neutral","happy","sad","angry","fearful","disgusted","surprised"],yt=class{constructor(t){this.neutral=0;this.happy=0;this.sad=0;this.angry=0;this.fearful=0;this.disgusted=0;this.surprised=0;if(t.length!==7)throw new Error(`FaceExpressions.constructor - expected probabilities.length to be 7, have: ${t.length}`);no.forEach((e,r)=>{this[e]=t[r]})}asSortedArray(){return no.map(t=>({expression:t,probability:this[t]})).sort((t,e)=>e.probability-t.probability)}};var Oe=class extends Te{constructor(t=new ve){super("FaceExpressionNet",t)}forwardInput(t){return Pe.tidy(()=>Pe.softmax(this.runNet(t)))}async forward(t){return this.forwardInput(await C(t))}async predictExpressions(t){let e=await C(t),r=await this.forwardInput(e),n=await Promise.all(Pe.unstack(r).map(async s=>{let i=s.dataSync();return s.dispose(),i}));r.dispose();let a=n.map(s=>new yt(s));return e.isBatchInput?a:a[0]}getDefaultModelName(){return"face_expression_model"}getClassifierChannelsIn(){return 256}getClassifierChannelsOut(){return 7}};function ao(o){return o.expressions instanceof yt}function xr(o,t){return{...o,...{expressions:t}}}function Rn(o,t,e=.1,r){(Array.isArray(t)?t:[t]).forEach(a=>{let s=a instanceof yt?a:ao(a)?a.expressions:void 0;if(!s)throw new Error("drawFaceExpressions - expected faceExpressions to be FaceExpressions | WithFaceExpressions<{}> or array thereof");let c=s.asSortedArray().filter(u=>u.probability>e),m=pt(a)?a.detection.box.bottomLeft:r||new b(0,0);new gt(c.map(u=>`${u.expression} (${Ht(u.probability)})`),m).draw(o)})}function Zt(o){return pt(o)&&o.landmarks instanceof z&&o.unshiftedLandmarks instanceof z&&o.alignedRect instanceof M}function $n(o){let t=(i,c,m,p)=>Math.atan2(p-c,m-i)%Math.PI,e=i=>i*180/Math.PI,r={roll:void 0,pitch:void 0,yaw:void 0};if(!o||!o._positions||o._positions.length!==68)return r;let n=o._positions;r.roll=-t(n[36]._x,n[36]._y,n[45]._x,n[45]._y),r.pitch=t(0,Math.abs(n[0]._x-n[30]._x)/n[30]._x,Math.PI,Math.abs(n[16]._x-n[30]._x)/n[30]._x);let a=n.reduce((i,c)=>ii>c._y?i:c._y,-1/0);return r.yaw=Math.PI*(o._imgDims._height/(s-a)/1.4-1),r}function we(o,t){let{box:e}=o.detection,r=t.shiftBy(e.x,e.y),n=r.align(),{imageDims:a}=o.detection,s=new M(o.detection.score,n.rescale(a.reverse()),a),i=$n(t);return{...o,...{landmarks:r,unshiftedLandmarks:t,alignedRect:s,angle:i}}}var vr=class{constructor(t={}){let{drawLines:e=!0,drawPoints:r=!0,lineWidth:n,lineColor:a,pointSize:s,pointColor:i}=t;this.drawLines=e,this.drawPoints=r,this.lineWidth=n||1,this.pointSize=s||2,this.lineColor=a||"rgba(0, 255, 255, 1)",this.pointColor=i||"rgba(255, 0, 255, 1)"}},yr=class{constructor(t,e={}){this.faceLandmarks=t,this.options=new vr(e)}draw(t){let e=O(t),{drawLines:r,drawPoints:n,lineWidth:a,lineColor:s,pointSize:i,pointColor:c}=this.options;if(r&&this.faceLandmarks instanceof Gt&&(e.strokeStyle=s,e.lineWidth=a,dt(e,this.faceLandmarks.getJawOutline()),dt(e,this.faceLandmarks.getLeftEyeBrow()),dt(e,this.faceLandmarks.getRightEyeBrow()),dt(e,this.faceLandmarks.getNose()),dt(e,this.faceLandmarks.getLeftEye(),!0),dt(e,this.faceLandmarks.getRightEye(),!0),dt(e,this.faceLandmarks.getMouth(),!0)),n){e.strokeStyle=c,e.fillStyle=c;let m=p=>{e.beginPath(),e.arc(p.x,p.y,i,0,2*Math.PI),e.fill()};this.faceLandmarks.positions.forEach(m)}}};function On(o,t){(Array.isArray(t)?t:[t]).forEach(r=>{let n=r instanceof z?r:Zt(r)?r.landmarks:void 0;if(!n)throw new Error("drawFaceLandmarks - expected faceExpressions to be FaceLandmarks | WithFaceLandmarks> or array thereof");new yr(n).draw(o)})}var No="1.7.2";var ft=v(x());var S=v(x());function Vn(o,t){let e=be(o,t),r=ge(o,t);function n(s,i,c){let m=r(s,i,`${c}/separable_conv0`),p=r(i,i,`${c}/separable_conv1`),u=e(s,i,1,`${c}/expansion_conv`);return{separable_conv0:m,separable_conv1:p,expansion_conv:u}}function a(s,i){let c=r(s,s,`${i}/separable_conv0`),m=r(s,s,`${i}/separable_conv1`),p=r(s,s,`${i}/separable_conv2`);return{separable_conv0:c,separable_conv1:m,separable_conv2:p}}return{extractConvParams:e,extractSeparableConvParams:r,extractReductionBlockParams:n,extractMainBlockParams:a}}function So(o,t){let e=[],{extractWeights:r,getRemainingWeights:n}=R(o),{extractConvParams:a,extractSeparableConvParams:s,extractReductionBlockParams:i,extractMainBlockParams:c}=Vn(r,e),m=a(3,32,3,"entry_flow/conv_in"),p=i(32,64,"entry_flow/reduction_block_0"),u=i(64,128,"entry_flow/reduction_block_1"),f={conv_in:m,reduction_block_0:p,reduction_block_1:u},l={};it(t,0,1).forEach(h=>{l[`main_block_${h}`]=c(128,`middle_flow/main_block_${h}`)});let g=i(128,256,"exit_flow/reduction_block"),T=s(256,512,"exit_flow/separable_conv"),D={reduction_block:g,separable_conv:T};if(n().length!==0)throw new Error(`weights remaing after extract: ${n().length}`);return{paramMappings:e,params:{entry_flow:f,middle_flow:l,exit_flow:D}}}function Yn(o,t){let e=Y(o,t),r=hr(e),n=xe(e);function a(i){let c=n(`${i}/separable_conv0`),m=n(`${i}/separable_conv1`),p=r(`${i}/expansion_conv`);return{separable_conv0:c,separable_conv1:m,expansion_conv:p}}function s(i){let c=n(`${i}/separable_conv0`),m=n(`${i}/separable_conv1`),p=n(`${i}/separable_conv2`);return{separable_conv0:c,separable_conv1:m,separable_conv2:p}}return{extractConvParams:r,extractSeparableConvParams:n,extractReductionBlockParams:a,extractMainBlockParams:s}}function Lo(o,t){let e=[],{extractConvParams:r,extractSeparableConvParams:n,extractReductionBlockParams:a,extractMainBlockParams:s}=Yn(o,e),i=r("entry_flow/conv_in"),c=a("entry_flow/reduction_block_0"),m=a("entry_flow/reduction_block_1"),p={conv_in:i,reduction_block_0:c,reduction_block_1:m},u={};it(t,0,1).forEach(T=>{u[`main_block_${T}`]=s(`middle_flow/main_block_${T}`)});let f=a("exit_flow/reduction_block"),l=n("exit_flow/separable_conv"),g={reduction_block:f,separable_conv:l};return B(o,e),{params:{entry_flow:p,middle_flow:u,exit_flow:g},paramMappings:e}}function Ao(o,t,e){return S.add(S.conv2d(o,t.filters,e,"same"),t.bias)}function io(o,t,e=!0){let r=e?S.relu(o):o;return r=H(r,t.separable_conv0,[1,1]),r=H(S.relu(r),t.separable_conv1,[1,1]),r=S.maxPool(r,[3,3],[2,2],"same"),r=S.add(r,Ao(o,t.expansion_conv,[2,2])),r}function Gn(o,t){let e=H(S.relu(o),t.separable_conv0,[1,1]);return e=H(S.relu(e),t.separable_conv1,[1,1]),e=H(S.relu(e),t.separable_conv2,[1,1]),e=S.add(e,o),e}var _r=class extends A{constructor(e){super("TinyXception");this._numMainBlocks=e}forwardInput(e){let{params:r}=this;if(!r)throw new Error("TinyXception - load model before inference");return S.tidy(()=>{let n=S.cast(e.toBatchTensor(112,!0),"float32"),s=rt(n,[122.782,117.001,104.298]).div(255),i=S.relu(Ao(s,r.entry_flow.conv_in,[2,2]));return i=io(i,r.entry_flow.reduction_block_0,!1),i=io(i,r.entry_flow.reduction_block_1),it(this._numMainBlocks,0,1).forEach(c=>{i=Gn(i,r.middle_flow[`main_block_${c}`])}),i=io(i,r.exit_flow.reduction_block),i=S.relu(H(i,r.exit_flow.separable_conv,[1,1])),i})}async forward(e){return this.forwardInput(await C(e))}getDefaultModelName(){return"tiny_xception_model"}extractParamsFromWeightMap(e){return Lo(e,this._numMainBlocks)}extractParams(e){return So(e,this._numMainBlocks)}};function Wo(o){let t=[],{extractWeights:e,getRemainingWeights:r}=R(o),n=lr(e,t),a=n(512,1,"fc/age"),s=n(512,2,"fc/gender");if(r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{paramMappings:t,params:{fc:{age:a,gender:s}}}}function ko(o){let t=[],e=Y(o,t);function r(a){let s=e(`${a}/weights`,2),i=e(`${a}/bias`,1);return{weights:s,bias:i}}let n={fc:{age:r("fc/age"),gender:r("fc/gender")}};return B(o,t),{params:n,paramMappings:t}}var Tr=(e=>(e.FEMALE="female",e.MALE="male",e))(Tr||{});var He=class extends A{constructor(e=new _r(2)){super("AgeGenderNet");this._faceFeatureExtractor=e}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(e){let{params:r}=this;if(!r)throw new Error(`${this._name} - load model before inference`);return ft.tidy(()=>{let n=e instanceof ut?this.faceFeatureExtractor.forwardInput(e):e,a=ft.avgPool(n,[7,7],[2,2],"valid").as2D(n.shape[0],-1),s=$e(a,r.fc.age).as1D(),i=$e(a,r.fc.gender);return{age:s,gender:i}})}forwardInput(e){return ft.tidy(()=>{let{age:r,gender:n}=this.runNet(e);return{age:r,gender:ft.softmax(n)}})}async forward(e){return this.forwardInput(await C(e))}async predictAgeAndGender(e){let r=await C(e),n=await this.forwardInput(r),a=ft.unstack(n.age),s=ft.unstack(n.gender),i=a.map((m,p)=>({ageTensor:m,genderTensor:s[p]})),c=await Promise.all(i.map(async({ageTensor:m,genderTensor:p})=>{let u=m.dataSync()[0],f=p.dataSync()[0],l=f>.5,g=l?"male":"female",T=l?f:1-f;return m.dispose(),p.dispose(),{age:u,gender:g,genderProbability:T}}));return n.age.dispose(),n.gender.dispose(),r.isBatchInput?c:c[0]}getDefaultModelName(){return"age_gender_model"}dispose(e=!0){this.faceFeatureExtractor.dispose(e),super.dispose(e)}loadClassifierParams(e){let{params:r,paramMappings:n}=this.extractClassifierParams(e);this._params=r,this._paramMappings=n}extractClassifierParams(e){return Wo(e)}extractParamsFromWeightMap(e){let{featureExtractorMap:r,classifierMap:n}=gr(e);return this.faceFeatureExtractor.loadFromWeightMap(r),ko(n)}extractParams(e){let n=e.slice(0,e.length-1539),a=e.slice(e.length-1539);return this.faceFeatureExtractor.extractWeights(n),this.extractClassifierParams(a)}};var G=v(x());var Fe=class extends Te{postProcess(t,e,r){let n=r.map(({width:s,height:i})=>{let c=e/Math.max(i,s);return{width:s*c,height:i*c}}),a=n.length;return G.tidy(()=>{let s=(u,f)=>G.stack([G.fill([68],u,"float32"),G.fill([68],f,"float32")],1).as2D(1,136).as1D(),i=(u,f)=>{let{width:l,height:g}=n[u];return f(l,g)?Math.abs(l-g)/2:0},c=u=>i(u,(f,l)=>fi(u,(f,l)=>ls(c(f),m(f))))).div(G.stack(Array.from(Array(a),(u,f)=>s(n[f].width,n[f].height))))})}forwardInput(t){return G.tidy(()=>{let e=this.runNet(t);return this.postProcess(e,t.inputSize,t.inputDimensions.map(([r,n])=>({height:r,width:n})))})}async forward(t){return this.forwardInput(await C(t))}async detectLandmarks(t){let e=await C(t),r=G.tidy(()=>G.unstack(this.forwardInput(e))),n=await Promise.all(r.map(async(a,s)=>{let i=Array.from(a.dataSync()),c=i.filter((p,u)=>rr(u)),m=i.filter((p,u)=>!rr(u));return new Gt(Array(68).fill(0).map((p,u)=>new b(c[u],m[u])),{height:e.getInputHeight(s),width:e.getInputWidth(s)})}));return r.forEach(a=>a.dispose()),e.isBatchInput?n:n[0]}getClassifierChannelsOut(){return 136}};var Kt=class extends Fe{constructor(t=new ve){super("FaceLandmark68Net",t)}getDefaultModelName(){return"face_landmark_68_model"}getClassifierChannelsIn(){return 256}};var De=v(x());function Bo(o){let t=[],{extractDenseBlock3Params:e}=br(o,t),r={dense0:e("dense0",!0),dense1:e("dense1"),dense2:e("dense2")};return B(o,t),{params:r,paramMappings:t}}function Ro(o){let t=[],{extractWeights:e,getRemainingWeights:r}=R(o),{extractDenseBlock3Params:n}=dr(e,t),a=n(3,32,"dense0",!0),s=n(32,64,"dense1"),i=n(64,128,"dense2");if(r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{paramMappings:t,params:{dense0:a,dense1:s,dense2:i}}}var Pr=class extends A{constructor(){super("TinyFaceFeatureExtractor")}forwardInput(t){let{params:e}=this;if(!e)throw new Error("TinyFaceFeatureExtractor - load model before inference");return De.tidy(()=>{let r=De.cast(t.toBatchTensor(112,!0),"float32"),a=rt(r,[122.782,117.001,104.298]).div(255),s=pr(a,e.dense0,!0);return s=pr(s,e.dense1),s=pr(s,e.dense2),s=De.avgPool(s,[14,14],[2,2],"valid"),s})}async forward(t){return this.forwardInput(await C(t))}getDefaultModelName(){return"face_feature_extractor_tiny_model"}extractParamsFromWeightMap(t){return Bo(t)}extractParams(t){return Ro(t)}};var ze=class extends Fe{constructor(t=new Pr){super("FaceLandmark68TinyNet",t)}getDefaultModelName(){return"face_landmark_68_tiny_model"}getClassifierChannelsIn(){return 128}};var co=class extends Kt{};var nt=v(x());var Ee=v(x());var wr=v(x());function $o(o,t){return wr.add(wr.mul(o,t.weights),t.biases)}function mo(o,t,e,r,n="same"){let{filters:a,bias:s}=t.conv,i=Ee.conv2d(o,a,e,n);return i=Ee.add(i,s),i=$o(i,t.scale),r?Ee.relu(i):i}function Oo(o,t){return mo(o,t,[1,1],!0)}function po(o,t){return mo(o,t,[1,1],!1)}function Fr(o,t){return mo(o,t,[2,2],!0,"valid")}var j=v(x());function jn(o,t){function e(i,c,m){let p=o(i),u=p.length/(c*m*m);if(Br(u))throw new Error(`depth has to be an integer: ${u}, weights.length: ${p.length}, numFilters: ${c}, filterSize: ${m}`);return j.tidy(()=>j.transpose(j.tensor4d(p,[c,u,m,m]),[2,3,1,0]))}function r(i,c,m,p){let u=e(i,c,m),f=j.tensor1d(o(c));return t.push({paramPath:`${p}/filters`},{paramPath:`${p}/bias`}),{filters:u,bias:f}}function n(i,c){let m=j.tensor1d(o(i)),p=j.tensor1d(o(i));return t.push({paramPath:`${c}/weights`},{paramPath:`${c}/biases`}),{weights:m,biases:p}}function a(i,c,m,p){let u=r(i,c,m,`${p}/conv`),f=n(c,`${p}/scale`);return{conv:u,scale:f}}function s(i,c,m,p,u=!1){let f=a((u?.5:1)*i,c,m,`${p}/conv1`),l=a(i,c,m,`${p}/conv2`);return{conv1:f,conv2:l}}return{extractConvLayerParams:a,extractResidualLayerParams:s}}function Ho(o){let{extractWeights:t,getRemainingWeights:e}=R(o),r=[],{extractConvLayerParams:n,extractResidualLayerParams:a}=jn(t,r),s=n(4704,32,7,"conv32_down"),i=a(9216,32,3,"conv32_1"),c=a(9216,32,3,"conv32_2"),m=a(9216,32,3,"conv32_3"),p=a(36864,64,3,"conv64_down",!0),u=a(36864,64,3,"conv64_1"),f=a(36864,64,3,"conv64_2"),l=a(36864,64,3,"conv64_3"),g=a(147456,128,3,"conv128_down",!0),T=a(147456,128,3,"conv128_1"),D=a(147456,128,3,"conv128_2"),h=a(589824,256,3,"conv256_down",!0),_=a(589824,256,3,"conv256_1"),y=a(589824,256,3,"conv256_2"),E=a(589824,256,3,"conv256_down_out"),W=j.tidy(()=>j.transpose(j.tensor2d(t(256*128),[128,256]),[1,0]));if(r.push({paramPath:"fc"}),e().length!==0)throw new Error(`weights remaing after extract: ${e().length}`);return{params:{conv32_down:s,conv32_1:i,conv32_2:c,conv32_3:m,conv64_down:p,conv64_1:u,conv64_2:f,conv64_3:l,conv128_down:g,conv128_1:T,conv128_2:D,conv256_down:h,conv256_1:_,conv256_2:y,conv256_down_out:E,fc:W},paramMappings:r}}function Un(o,t){let e=Y(o,t);function r(s){let i=e(`${s}/scale/weights`,1),c=e(`${s}/scale/biases`,1);return{weights:i,biases:c}}function n(s){let i=e(`${s}/conv/filters`,4),c=e(`${s}/conv/bias`,1),m=r(s);return{conv:{filters:i,bias:c},scale:m}}function a(s){return{conv1:n(`${s}/conv1`),conv2:n(`${s}/conv2`)}}return{extractConvLayerParams:n,extractResidualLayerParams:a}}function zo(o){let t=[],{extractConvLayerParams:e,extractResidualLayerParams:r}=Un(o,t),n=e("conv32_down"),a=r("conv32_1"),s=r("conv32_2"),i=r("conv32_3"),c=r("conv64_down"),m=r("conv64_1"),p=r("conv64_2"),u=r("conv64_3"),f=r("conv128_down"),l=r("conv128_1"),g=r("conv128_2"),T=r("conv256_down"),D=r("conv256_1"),h=r("conv256_2"),_=r("conv256_down_out"),{fc:y}=o;if(t.push({originalPath:"fc",paramPath:"fc"}),!kr(y))throw new Error(`expected weightMap[fc] to be a Tensor2D, instead have ${y}`);let E={conv32_down:n,conv32_1:a,conv32_2:s,conv32_3:i,conv64_down:c,conv64_1:m,conv64_2:p,conv64_3:u,conv128_down:f,conv128_1:l,conv128_2:g,conv256_down:T,conv256_1:D,conv256_2:h,conv256_down_out:_,fc:y};return B(o,t),{params:E,paramMappings:t}}var $=v(x());function ot(o,t){let e=Oo(o,t.conv1);return e=po(e,t.conv2),e=$.add(e,o),e=$.relu(e),e}function Ve(o,t){let e=Fr(o,t.conv1);e=po(e,t.conv2);let r=$.avgPool(o,2,2,"valid"),n=$.zeros(r.shape),a=r.shape[3]!==e.shape[3];if(r.shape[1]!==e.shape[1]||r.shape[2]!==e.shape[2]){let i=[...e.shape];i[1]=1;let c=$.zeros(i);e=$.concat([e,c],1);let m=[...e.shape];m[2]=1;let p=$.zeros(m);e=$.concat([e,p],2)}return r=a?$.concat([r,n],3):r,e=$.add(r,e),e=$.relu(e),e}var Qt=class extends A{constructor(){super("FaceRecognitionNet")}forwardInput(t){let{params:e}=this;if(!e)throw new Error("FaceRecognitionNet - load model before inference");return nt.tidy(()=>{let r=nt.cast(t.toBatchTensor(150,!0),"float32"),a=rt(r,[122.782,117.001,104.298]).div(255),s=Fr(a,e.conv32_down);s=nt.maxPool(s,3,2,"valid"),s=ot(s,e.conv32_1),s=ot(s,e.conv32_2),s=ot(s,e.conv32_3),s=Ve(s,e.conv64_down),s=ot(s,e.conv64_1),s=ot(s,e.conv64_2),s=ot(s,e.conv64_3),s=Ve(s,e.conv128_down),s=ot(s,e.conv128_1),s=ot(s,e.conv128_2),s=Ve(s,e.conv256_down),s=ot(s,e.conv256_1),s=ot(s,e.conv256_2),s=Ve(s,e.conv256_down_out);let i=s.mean([1,2]);return nt.matMul(i,e.fc)})}async forward(t){return this.forwardInput(await C(t))}async computeFaceDescriptor(t){var a;if((a=t==null?void 0:t.shape)!=null&&a.some(s=>s<=0))return new Float32Array(128);let e=await C(t),r=nt.tidy(()=>nt.unstack(this.forwardInput(e))),n=await Promise.all(r.map(s=>s.data()));return r.forEach(s=>s.dispose()),e.isBatchInput?n:n[0]}getDefaultModelName(){return"face_recognition_model"}extractParamsFromWeightMap(t){return zo(t)}extractParams(t){return Ho(t)}};function Xn(o){let t=new Qt;return t.extractWeights(o),t}function Dr(o,t){return{...o,...{descriptor:t}}}function Jn(o){return typeof o.age=="number"}function Er(o,t){return{...o,...{age:t}}}function qn(o){return(o.gender==="male"||o.gender==="female")&&me(o.genderProbability)}function Mr(o,t,e){return{...o,...{gender:t,genderProbability:e}}}var Lt=v(x());var at=v(x());function Zn(o,t){function e(c,m){let p=at.tensor4d(o(9*c),[3,3,c,1]),u=at.tensor1d(o(c)),f=at.tensor1d(o(c)),l=at.tensor1d(o(c)),g=at.tensor1d(o(c));return t.push({paramPath:`${m}/filters`},{paramPath:`${m}/batch_norm_scale`},{paramPath:`${m}/batch_norm_offset`},{paramPath:`${m}/batch_norm_mean`},{paramPath:`${m}/batch_norm_variance`}),{filters:p,batch_norm_scale:u,batch_norm_offset:f,batch_norm_mean:l,batch_norm_variance:g}}function r(c,m,p,u,f){let l=at.tensor4d(o(c*m*p*p),[p,p,c,m]),g=at.tensor1d(o(m));return t.push({paramPath:`${u}/filters`},{paramPath:`${u}/${f?"batch_norm_offset":"bias"}`}),{filters:l,bias:g}}function n(c,m,p,u){let{filters:f,bias:l}=r(c,m,p,u,!0);return{filters:f,batch_norm_offset:l}}function a(c,m,p){let u=e(c,`${p}/depthwise_conv`),f=n(c,m,1,`${p}/pointwise_conv`);return{depthwise_conv:u,pointwise_conv:f}}function s(){let c=n(3,32,3,"mobilenetv1/conv_0"),m=a(32,64,"mobilenetv1/conv_1"),p=a(64,128,"mobilenetv1/conv_2"),u=a(128,128,"mobilenetv1/conv_3"),f=a(128,256,"mobilenetv1/conv_4"),l=a(256,256,"mobilenetv1/conv_5"),g=a(256,512,"mobilenetv1/conv_6"),T=a(512,512,"mobilenetv1/conv_7"),D=a(512,512,"mobilenetv1/conv_8"),h=a(512,512,"mobilenetv1/conv_9"),_=a(512,512,"mobilenetv1/conv_10"),y=a(512,512,"mobilenetv1/conv_11"),E=a(512,1024,"mobilenetv1/conv_12"),W=a(1024,1024,"mobilenetv1/conv_13");return{conv_0:c,conv_1:m,conv_2:p,conv_3:u,conv_4:f,conv_5:l,conv_6:g,conv_7:T,conv_8:D,conv_9:h,conv_10:_,conv_11:y,conv_12:E,conv_13:W}}function i(){let c=n(1024,256,1,"prediction_layer/conv_0"),m=n(256,512,3,"prediction_layer/conv_1"),p=n(512,128,1,"prediction_layer/conv_2"),u=n(128,256,3,"prediction_layer/conv_3"),f=n(256,128,1,"prediction_layer/conv_4"),l=n(128,256,3,"prediction_layer/conv_5"),g=n(256,64,1,"prediction_layer/conv_6"),T=n(64,128,3,"prediction_layer/conv_7"),D=r(512,12,1,"prediction_layer/box_predictor_0/box_encoding_predictor"),h=r(512,9,1,"prediction_layer/box_predictor_0/class_predictor"),_=r(1024,24,1,"prediction_layer/box_predictor_1/box_encoding_predictor"),y=r(1024,18,1,"prediction_layer/box_predictor_1/class_predictor"),E=r(512,24,1,"prediction_layer/box_predictor_2/box_encoding_predictor"),W=r(512,18,1,"prediction_layer/box_predictor_2/class_predictor"),tt=r(256,24,1,"prediction_layer/box_predictor_3/box_encoding_predictor"),lt=r(256,18,1,"prediction_layer/box_predictor_3/class_predictor"),q=r(256,24,1,"prediction_layer/box_predictor_4/box_encoding_predictor"),Dt=r(256,18,1,"prediction_layer/box_predictor_4/class_predictor"),Et=r(128,24,1,"prediction_layer/box_predictor_5/box_encoding_predictor"),Mt=r(128,18,1,"prediction_layer/box_predictor_5/class_predictor");return{conv_0:c,conv_1:m,conv_2:p,conv_3:u,conv_4:f,conv_5:l,conv_6:g,conv_7:T,box_predictor_0:{box_encoding_predictor:D,class_predictor:h},box_predictor_1:{box_encoding_predictor:_,class_predictor:y},box_predictor_2:{box_encoding_predictor:E,class_predictor:W},box_predictor_3:{box_encoding_predictor:tt,class_predictor:lt},box_predictor_4:{box_encoding_predictor:q,class_predictor:Dt},box_predictor_5:{box_encoding_predictor:Et,class_predictor:Mt}}}return{extractMobilenetV1Params:s,extractPredictionLayerParams:i}}function Vo(o){let t=[],{extractWeights:e,getRemainingWeights:r}=R(o),{extractMobilenetV1Params:n,extractPredictionLayerParams:a}=Zn(e,t),s=n(),i=a(),m={extra_dim:at.tensor3d(e(5118*4),[1,5118,4])};if(t.push({paramPath:"output_layer/extra_dim"}),r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{params:{mobilenetv1:s,prediction_layer:i,output_layer:m},paramMappings:t}}function Kn(o,t){let e=Y(o,t);function r(m,p,u){let f=e(`${m}/Conv2d_${p}_pointwise/weights`,4,`${u}/filters`),l=e(`${m}/Conv2d_${p}_pointwise/convolution_bn_offset`,1,`${u}/batch_norm_offset`);return{filters:f,batch_norm_offset:l}}function n(m){let p=`mobilenetv1/conv_${m}`,u=`MobilenetV1/Conv2d_${m}_depthwise`,f=`${p}/depthwise_conv`,l=`${p}/pointwise_conv`,g=e(`${u}/depthwise_weights`,4,`${f}/filters`),T=e(`${u}/BatchNorm/gamma`,1,`${f}/batch_norm_scale`),D=e(`${u}/BatchNorm/beta`,1,`${f}/batch_norm_offset`),h=e(`${u}/BatchNorm/moving_mean`,1,`${f}/batch_norm_mean`),_=e(`${u}/BatchNorm/moving_variance`,1,`${f}/batch_norm_variance`);return{depthwise_conv:{filters:g,batch_norm_scale:T,batch_norm_offset:D,batch_norm_mean:h,batch_norm_variance:_},pointwise_conv:r("MobilenetV1",m,l)}}function a(){return{conv_0:r("MobilenetV1",0,"mobilenetv1/conv_0"),conv_1:n(1),conv_2:n(2),conv_3:n(3),conv_4:n(4),conv_5:n(5),conv_6:n(6),conv_7:n(7),conv_8:n(8),conv_9:n(9),conv_10:n(10),conv_11:n(11),conv_12:n(12),conv_13:n(13)}}function s(m,p){let u=e(`${m}/weights`,4,`${p}/filters`),f=e(`${m}/biases`,1,`${p}/bias`);return{filters:u,bias:f}}function i(m){let p=s(`Prediction/BoxPredictor_${m}/BoxEncodingPredictor`,`prediction_layer/box_predictor_${m}/box_encoding_predictor`),u=s(`Prediction/BoxPredictor_${m}/ClassPredictor`,`prediction_layer/box_predictor_${m}/class_predictor`);return{box_encoding_predictor:p,class_predictor:u}}function c(){return{conv_0:r("Prediction",0,"prediction_layer/conv_0"),conv_1:r("Prediction",1,"prediction_layer/conv_1"),conv_2:r("Prediction",2,"prediction_layer/conv_2"),conv_3:r("Prediction",3,"prediction_layer/conv_3"),conv_4:r("Prediction",4,"prediction_layer/conv_4"),conv_5:r("Prediction",5,"prediction_layer/conv_5"),conv_6:r("Prediction",6,"prediction_layer/conv_6"),conv_7:r("Prediction",7,"prediction_layer/conv_7"),box_predictor_0:i(0),box_predictor_1:i(1),box_predictor_2:i(2),box_predictor_3:i(3),box_predictor_4:i(4),box_predictor_5:i(5)}}return{extractMobilenetV1Params:a,extractPredictionLayerParams:c}}function Yo(o){let t=[],{extractMobilenetV1Params:e,extractPredictionLayerParams:r}=Kn(o,t),n=o["Output/extra_dim"];if(t.push({originalPath:"Output/extra_dim",paramPath:"output_layer/extra_dim"}),!ht(n))throw new Error(`expected weightMap['Output/extra_dim'] to be a Tensor3D, instead have ${n}`);let a={mobilenetv1:e(),prediction_layer:r(),output_layer:{extra_dim:n}};return B(o,t),{params:a,paramMappings:t}}var _t=v(x());var Nt=v(x());function Z(o,t,e){return Nt.tidy(()=>{let r=Nt.conv2d(o,t.filters,e,"same");return r=Nt.add(r,t.batch_norm_offset),Nt.clipByValue(r,0,6)})}var Qn=.0010000000474974513;function ta(o,t,e){return _t.tidy(()=>{let r=_t.depthwiseConv2d(o,t.filters,e,"same");return r=_t.batchNorm(r,t.batch_norm_mean,t.batch_norm_variance,t.batch_norm_offset,t.batch_norm_scale,Qn),_t.clipByValue(r,0,6)})}function ea(o){return[2,4,6,12].some(t=>t===o)?[2,2]:[1,1]}function Go(o,t){return _t.tidy(()=>{let e,r=Z(o,t.conv_0,[2,2]);if([t.conv_1,t.conv_2,t.conv_3,t.conv_4,t.conv_5,t.conv_6,t.conv_7,t.conv_8,t.conv_9,t.conv_10,t.conv_11,t.conv_12,t.conv_13].forEach((a,s)=>{let i=s+1,c=ea(i);r=ta(r,a.depthwise_conv,c),r=Z(r,a.pointwise_conv,[1,1]),i===11&&(e=r)}),e===null)throw new Error("mobileNetV1 - output of conv layer 11 is null");return{out:r,conv11:e}})}function ra(o,t,e){let r=o.arraySync(),n=Math.min(r[t][0],r[t][2]),a=Math.min(r[t][1],r[t][3]),s=Math.max(r[t][0],r[t][2]),i=Math.max(r[t][1],r[t][3]),c=Math.min(r[e][0],r[e][2]),m=Math.min(r[e][1],r[e][3]),p=Math.max(r[e][0],r[e][2]),u=Math.max(r[e][1],r[e][3]),f=(s-n)*(i-a),l=(p-c)*(u-m);if(f<=0||l<=0)return 0;let g=Math.max(n,c),T=Math.max(a,m),D=Math.min(s,p),h=Math.min(i,u),_=Math.max(D-g,0)*Math.max(h-T,0);return _/(f+l-_)}function jo(o,t,e,r,n){let a=o.shape[0],s=Math.min(e,a),i=t.map((p,u)=>({score:p,boxIndex:u})).filter(p=>p.score>n).sort((p,u)=>u.score-p.score),c=p=>p<=r?1:0,m=[];return i.forEach(p=>{if(m.length>=s)return;let u=p.score;for(let f=m.length-1;f>=0;--f){let l=ra(o,p.boxIndex,m[f]);if(l!==0&&(p.score*=c(l),p.score<=n))break}u===p.score&&m.push(p.boxIndex)}),m}var d=v(x());function oa(o){let t=d.unstack(d.transpose(o,[1,0])),e=[d.sub(t[2],t[0]),d.sub(t[3],t[1])],r=[d.add(t[0],d.div(e[0],2)),d.add(t[1],d.div(e[1],2))];return{sizes:e,centers:r}}function na(o,t){let{sizes:e,centers:r}=oa(o),n=d.unstack(d.transpose(t,[1,0])),a=d.div(d.mul(d.exp(d.div(n[2],5)),e[0]),2),s=d.add(d.mul(d.div(n[0],10),e[0]),r[0]),i=d.div(d.mul(d.exp(d.div(n[3],5)),e[1]),2),c=d.add(d.mul(d.div(n[1],10),e[1]),r[1]);return d.transpose(d.stack([d.sub(s,a),d.sub(c,i),d.add(s,a),d.add(c,i)]),[1,0])}function Uo(o,t,e){return d.tidy(()=>{let r=o.shape[0],n=na(d.reshape(d.tile(e.extra_dim,[r,1,1]),[-1,4]),d.reshape(o,[-1,4]));n=d.reshape(n,[r,n.shape[0]/r,4]);let a=d.sigmoid(d.slice(t,[0,0,1],[-1,-1,-1])),s=d.slice(a,[0,0,0],[-1,-1,1]);s=d.reshape(s,[r,s.shape[1]]);let i=d.unstack(n),c=d.unstack(s);return{boxes:i,scores:c}})}var Ge=v(x());var Ye=v(x());function te(o,t){return Ye.tidy(()=>{let e=o.shape[0],r=Ye.reshape(qt(o,t.box_encoding_predictor),[e,-1,1,4]),n=Ye.reshape(qt(o,t.class_predictor),[e,-1,3]);return{boxPredictionEncoding:r,classPrediction:n}})}function Xo(o,t,e){return Ge.tidy(()=>{let r=Z(o,e.conv_0,[1,1]),n=Z(r,e.conv_1,[2,2]),a=Z(n,e.conv_2,[1,1]),s=Z(a,e.conv_3,[2,2]),i=Z(s,e.conv_4,[1,1]),c=Z(i,e.conv_5,[2,2]),m=Z(c,e.conv_6,[1,1]),p=Z(m,e.conv_7,[2,2]),u=te(t,e.box_predictor_0),f=te(o,e.box_predictor_1),l=te(n,e.box_predictor_2),g=te(s,e.box_predictor_3),T=te(c,e.box_predictor_4),D=te(p,e.box_predictor_5),h=Ge.concat([u.boxPredictionEncoding,f.boxPredictionEncoding,l.boxPredictionEncoding,g.boxPredictionEncoding,T.boxPredictionEncoding,D.boxPredictionEncoding],1),_=Ge.concat([u.classPrediction,f.classPrediction,l.classPrediction,g.classPrediction,T.classPrediction,D.classPrediction],1);return{boxPredictions:h,classPredictions:_}})}var X=class{constructor({minConfidence:t,maxResults:e}={}){this._name="SsdMobilenetv1Options";if(this._minConfidence=t||.5,this._maxResults=e||100,typeof this._minConfidence!="number"||this._minConfidence<=0||this._minConfidence>=1)throw new Error(`${this._name} - expected minConfidence to be a number between 0 and 1`);if(typeof this._maxResults!="number")throw new Error(`${this._name} - expected maxResults to be a number`)}get minConfidence(){return this._minConfidence}get maxResults(){return this._maxResults}};var St=class extends A{constructor(){super("SsdMobilenetv1")}forwardInput(t){let{params:e}=this;if(!e)throw new Error("SsdMobilenetv1 - load model before inference");return Lt.tidy(()=>{let r=Lt.cast(t.toBatchTensor(512,!1),"float32"),n=Lt.sub(Lt.div(r,127.5),1),a=Go(n,e.mobilenetv1),{boxPredictions:s,classPredictions:i}=Xo(a.out,a.conv11,e.prediction_layer);return Uo(s,i,e.output_layer)})}async forward(t){return this.forwardInput(await C(t))}async locateFaces(t,e={}){let{maxResults:r,minConfidence:n}=new X(e),a=await C(t),{boxes:s,scores:i}=this.forwardInput(a),c=s[0],m=i[0];for(let y=1;y{let[E,W]=[Math.max(0,h[y][0]),Math.min(1,h[y][2])].map(q=>q*D),[tt,lt]=[Math.max(0,h[y][1]),Math.min(1,h[y][3])].map(q=>q*T);return new M(p[y],new Yt(tt,E,lt-tt,W-E),{height:a.getInputHeight(0),width:a.getInputWidth(0)})});return c.dispose(),m.dispose(),_}getDefaultModelName(){return"ssd_mobilenetv1_model"}extractParamsFromWeightMap(t){return Yo(t)}extractParams(t){return Vo(t)}};function Jo(o){let t=new St;return t.extractWeights(o),t}function aa(o){return Jo(o)}var uo=class extends St{};var qo=.4,Zo=[new b(.738768,.874946),new b(2.42204,2.65704),new b(4.30971,7.04493),new b(10.246,4.59428),new b(12.6868,11.8741)],Ko=[new b(1.603231,2.094468),new b(6.041143,7.080126),new b(2.882459,3.518061),new b(4.266906,5.178857),new b(9.041765,10.66308)],Qo=[117.001,114.697,97.404],tn="tiny_yolov2_model",en="tiny_yolov2_separable_conv_model";var N=v(x());var Cr=o=>typeof o=="number";function fo(o){if(!o)throw new Error(`invalid config: ${o}`);if(typeof o.withSeparableConvs!="boolean")throw new Error(`config.withSeparableConvs has to be a boolean, have: ${o.withSeparableConvs}`);if(!Cr(o.iouThreshold)||o.iouThreshold<0||o.iouThreshold>1)throw new Error(`config.iouThreshold has to be a number between [0, 1], have: ${o.iouThreshold}`);if(!Array.isArray(o.classes)||!o.classes.length||!o.classes.every(t=>typeof t=="string"))throw new Error(`config.classes has to be an array class names: string[], have: ${JSON.stringify(o.classes)}`);if(!Array.isArray(o.anchors)||!o.anchors.length||!o.anchors.map(t=>t||{}).every(t=>Cr(t.x)&&Cr(t.y)))throw new Error(`config.anchors has to be an array of { x: number, y: number }, have: ${JSON.stringify(o.anchors)}`);if(o.meanRgb&&(!Array.isArray(o.meanRgb)||o.meanRgb.length!==3||!o.meanRgb.every(Cr)))throw new Error(`config.meanRgb has to be an array of shape [number, number, number], have: ${JSON.stringify(o.meanRgb)}`)}var Q=v(x());var K=v(x());function Me(o){return K.tidy(()=>{let t=K.mul(o,K.scalar(.10000000149011612));return K.add(K.relu(K.sub(o,t)),t)})}function Tt(o,t){return Q.tidy(()=>{let e=Q.pad(o,[[0,0],[1,1],[1,1],[0,0]]);return e=Q.conv2d(e,t.conv.filters,[1,1],"valid"),e=Q.sub(e,t.bn.sub),e=Q.mul(e,t.bn.truediv),e=Q.add(e,t.conv.bias),Me(e)})}var At=v(x());function Pt(o,t){return At.tidy(()=>{let e=At.pad(o,[[0,0],[1,1],[1,1],[0,0]]);return e=At.separableConv2d(e,t.depthwise_filter,t.pointwise_filter,[1,1],"valid"),e=At.add(e,t.bias),Me(e)})}var lo=v(x());function sa(o,t){let e=be(o,t);function r(s,i){let c=lo.tensor1d(o(s)),m=lo.tensor1d(o(s));return t.push({paramPath:`${i}/sub`},{paramPath:`${i}/truediv`}),{sub:c,truediv:m}}function n(s,i,c){let m=e(s,i,3,`${c}/conv`),p=r(i,`${c}/bn`);return{conv:m,bn:p}}let a=ge(o,t);return{extractConvParams:e,extractConvWithBatchNormParams:n,extractSeparableConvParams:a}}function rn(o,t,e,r){let{extractWeights:n,getRemainingWeights:a}=R(o),s=[],{extractConvParams:i,extractConvWithBatchNormParams:c,extractSeparableConvParams:m}=sa(n,s),p;if(t.withSeparableConvs){let[u,f,l,g,T,D,h,_,y]=r,E=t.isFirstLayerConv2d?i(u,f,3,"conv0"):m(u,f,"conv0"),W=m(f,l,"conv1"),tt=m(l,g,"conv2"),lt=m(g,T,"conv3"),q=m(T,D,"conv4"),Dt=m(D,h,"conv5"),Et=_?m(h,_,"conv6"):void 0,Mt=y?m(_,y,"conv7"):void 0,$t=i(y||_||h,5*e,1,"conv8");p={conv0:E,conv1:W,conv2:tt,conv3:lt,conv4:q,conv5:Dt,conv6:Et,conv7:Mt,conv8:$t}}else{let[u,f,l,g,T,D,h,_,y]=r,E=c(u,f,"conv0"),W=c(f,l,"conv1"),tt=c(l,g,"conv2"),lt=c(g,T,"conv3"),q=c(T,D,"conv4"),Dt=c(D,h,"conv5"),Et=c(h,_,"conv6"),Mt=c(_,y,"conv7"),$t=i(y,5*e,1,"conv8");p={conv0:E,conv1:W,conv2:tt,conv3:lt,conv4:q,conv5:Dt,conv6:Et,conv7:Mt,conv8:$t}}if(a().length!==0)throw new Error(`weights remaing after extract: ${a().length}`);return{params:p,paramMappings:s}}function ia(o,t){let e=Y(o,t);function r(i){let c=e(`${i}/sub`,1),m=e(`${i}/truediv`,1);return{sub:c,truediv:m}}function n(i){let c=e(`${i}/filters`,4),m=e(`${i}/bias`,1);return{filters:c,bias:m}}function a(i){let c=n(`${i}/conv`),m=r(`${i}/bn`);return{conv:c,bn:m}}let s=xe(e);return{extractConvParams:n,extractConvWithBatchNormParams:a,extractSeparableConvParams:s}}function on(o,t){let e=[],{extractConvParams:r,extractConvWithBatchNormParams:n,extractSeparableConvParams:a}=ia(o,e),s;if(t.withSeparableConvs){let i=t.filterSizes&&t.filterSizes.length||9;s={conv0:t.isFirstLayerConv2d?r("conv0"):a("conv0"),conv1:a("conv1"),conv2:a("conv2"),conv3:a("conv3"),conv4:a("conv4"),conv5:a("conv5"),conv6:i>7?a("conv6"):void 0,conv7:i>8?a("conv7"):void 0,conv8:r("conv8")}}else s={conv0:n("conv0"),conv1:n("conv1"),conv2:n("conv2"),conv3:n("conv3"),conv4:n("conv4"),conv5:n("conv5"),conv6:n("conv6"),conv7:n("conv7"),conv8:r("conv8")};return B(o,e),{params:s,paramMappings:e}}var st=class{constructor({inputSize:t,scoreThreshold:e}={}){this._name="TinyYolov2Options";if(this._inputSize=t||416,this._scoreThreshold=e||.5,typeof this._inputSize!="number"||this._inputSize%32!==0)throw new Error(`${this._name} - expected inputSize to be a number divisible by 32`);if(typeof this._scoreThreshold!="number"||this._scoreThreshold<=0||this._scoreThreshold>=1)throw new Error(`${this._name} - expected scoreThreshold to be a number between 0 and 1`)}get inputSize(){return this._inputSize}get scoreThreshold(){return this._scoreThreshold}};var ho=class extends A{constructor(e){super("TinyYolov2");fo(e),this._config=e}get config(){return this._config}get withClassScores(){return this.config.withClassScores||this.config.classes.length>1}get boxEncodingSize(){return 5+(this.withClassScores?this.config.classes.length:0)}runTinyYolov2(e,r){let n=Tt(e,r.conv0);return n=N.maxPool(n,[2,2],[2,2],"same"),n=Tt(n,r.conv1),n=N.maxPool(n,[2,2],[2,2],"same"),n=Tt(n,r.conv2),n=N.maxPool(n,[2,2],[2,2],"same"),n=Tt(n,r.conv3),n=N.maxPool(n,[2,2],[2,2],"same"),n=Tt(n,r.conv4),n=N.maxPool(n,[2,2],[2,2],"same"),n=Tt(n,r.conv5),n=N.maxPool(n,[2,2],[1,1],"same"),n=Tt(n,r.conv6),n=Tt(n,r.conv7),qt(n,r.conv8,"valid",!1)}runMobilenet(e,r){let n=this.config.isFirstLayerConv2d?Me(qt(e,r.conv0,"valid",!1)):Pt(e,r.conv0);return n=N.maxPool(n,[2,2],[2,2],"same"),n=Pt(n,r.conv1),n=N.maxPool(n,[2,2],[2,2],"same"),n=Pt(n,r.conv2),n=N.maxPool(n,[2,2],[2,2],"same"),n=Pt(n,r.conv3),n=N.maxPool(n,[2,2],[2,2],"same"),n=Pt(n,r.conv4),n=N.maxPool(n,[2,2],[2,2],"same"),n=Pt(n,r.conv5),n=N.maxPool(n,[2,2],[1,1],"same"),n=r.conv6?Pt(n,r.conv6):n,n=r.conv7?Pt(n,r.conv7):n,qt(n,r.conv8,"valid",!1)}forwardInput(e,r){let{params:n}=this;if(!n)throw new Error("TinyYolov2 - load model before inference");return N.tidy(()=>{let a=N.cast(e.toBatchTensor(r,!1),"float32");return a=this.config.meanRgb?rt(a,this.config.meanRgb):a,a=a.div(255),this.config.withSeparableConvs?this.runMobilenet(a,n):this.runTinyYolov2(a,n)})}async forward(e,r){return this.forwardInput(await C(e),r)}async detect(e,r={}){let{inputSize:n,scoreThreshold:a}=new st(r),s=await C(e),i=await this.forwardInput(s,n),c=N.tidy(()=>N.unstack(i)[0].expandDims()),m={width:s.getInputWidth(0),height:s.getInputHeight(0)},p=await this.extractBoxes(c,s.getReshapedInputDimensions(0),a);i.dispose(),c.dispose();let u=p.map(h=>h.box),f=p.map(h=>h.score),l=p.map(h=>h.classScore),g=p.map(h=>this.config.classes[h.label]);return zr(u.map(h=>h.rescale(n)),f,this.config.iouThreshold,!0).map(h=>new bt(f[h],l[h],g[h],u[h],m))}getDefaultModelName(){return""}extractParamsFromWeightMap(e){return on(e,this.config)}extractParams(e){let r=this.config.filterSizes||ho.DEFAULT_FILTER_SIZES,n=r?r.length:void 0;if(n!==7&&n!==8&&n!==9)throw new Error(`TinyYolov2 - expected 7 | 8 | 9 convolutional filters, but found ${n} filterSizes in config`);return rn(e,this.config,this.boxEncodingSize,r)}async extractBoxes(e,r,n){let{width:a,height:s}=r,i=Math.max(a,s),c=i/a,m=i/s,p=e.shape[1],u=this.config.anchors.length,[f,l,g]=N.tidy(()=>{let _=e.reshape([p,p,u,this.boxEncodingSize]),y=_.slice([0,0,0,0],[p,p,u,4]),E=_.slice([0,0,0,4],[p,p,u,1]),W=this.withClassScores?N.softmax(_.slice([0,0,0,5],[p,p,u,this.config.classes.length]),3):N.scalar(0);return[y,E,W]}),T=[],D=await l.array(),h=await f.array();for(let _=0;_n){let tt=(y+Ne(h[_][y][E][0]))/p*c,lt=(_+Ne(h[_][y][E][1]))/p*m,q=Math.exp(h[_][y][E][2])*this.config.anchors[E].x/p*c,Dt=Math.exp(h[_][y][E][3])*this.config.anchors[E].y/p*m,Et=tt-q/2,Mt=lt-Dt/2,$t={row:_,col:y,anchor:E},{classScore:xo,label:vo}=this.withClassScores?await this.extractPredictedClass(g,$t):{classScore:1,label:0};T.push({box:new Vt(Et,Mt,Et+q,Mt+Dt),score:W,classScore:W*xo,label:vo,...$t})}}return f.dispose(),l.dispose(),g.dispose(),T}async extractPredictedClass(e,r){let{row:n,col:a,anchor:s}=r,i=await e.array();return Array(this.config.classes.length).fill(0).map((c,m)=>i[n][a][s][m]).map((c,m)=>({classScore:c,label:m})).reduce((c,m)=>c.classScore>m.classScore?c:m)}},ee=ho;ee.DEFAULT_FILTER_SIZES=[3,16,32,64,128,256,512,1024,1024];var re=class extends ee{constructor(t=!0){let e={withSeparableConvs:t,iouThreshold:qo,classes:["face"],...t?{anchors:Ko,meanRgb:Qo}:{anchors:Zo,withClassScores:!0}};super(e)}get withSeparableConvs(){return this.config.withSeparableConvs}get anchors(){return this.config.anchors}async locateFaces(t,e){return(await this.detect(t,e)).map(n=>new M(n.score,n.relativeBox,{width:n.imageWidth,height:n.imageHeight}))}getDefaultModelName(){return this.withSeparableConvs?en:tn}extractParamsFromWeightMap(t){return super.extractParamsFromWeightMap(t)}};function ca(o,t=!0){let e=new re(t);return e.extractWeights(o),e}var je=class extends st{constructor(){super(...arguments);this._name="TinyFaceDetectorOptions"}};var J=class{async then(t){return t(await this.run())}async run(){throw new Error("ComposableTask - run is not implemented")}};var Xe=v(x());var bo=v(x());async function oe(o,t,e,r,n=({alignedRect:a})=>a){let a=o.map(c=>Zt(c)?n(c):c.detection),s=r||(t instanceof bo.Tensor?await de(t,a):await le(t,a)),i=await e(s);return s.forEach(c=>c instanceof bo.Tensor&&c.dispose()),i}async function Ce(o,t,e,r,n){return oe([o],t,async a=>e(a[0]),r,n)}var nn=.4,an=[new b(1.603231,2.094468),new b(6.041143,7.080126),new b(2.882459,3.518061),new b(4.266906,5.178857),new b(9.041765,10.66308)],sn=[117.001,114.697,97.404];var ne=class extends ee{constructor(){let t={withSeparableConvs:!0,iouThreshold:nn,classes:["face"],anchors:an,meanRgb:sn,isFirstLayerConv2d:!0,filterSizes:[3,16,32,64,128,256,512]};super(t)}get anchors(){return this.config.anchors}async locateFaces(t,e){return(await this.detect(t,e)).map(n=>new M(n.score,n.relativeBox,{width:n.imageWidth,height:n.imageHeight}))}getDefaultModelName(){return"tiny_face_detector_model"}extractParamsFromWeightMap(t){return super.extractParamsFromWeightMap(t)}};var w={ssdMobilenetv1:new St,tinyFaceDetector:new ne,tinyYolov2:new re,faceLandmark68Net:new Kt,faceLandmark68TinyNet:new ze,faceRecognitionNet:new Qt,faceExpressionNet:new Oe,ageGenderNet:new He},cn=(o,t)=>w.ssdMobilenetv1.locateFaces(o,t),ma=(o,t)=>w.tinyFaceDetector.locateFaces(o,t),pa=(o,t)=>w.tinyYolov2.locateFaces(o,t),mn=o=>w.faceLandmark68Net.detectLandmarks(o),ua=o=>w.faceLandmark68TinyNet.detectLandmarks(o),fa=o=>w.faceRecognitionNet.computeFaceDescriptor(o),la=o=>w.faceExpressionNet.predictExpressions(o),da=o=>w.ageGenderNet.predictAgeAndGender(o),pn=o=>w.ssdMobilenetv1.load(o),ha=o=>w.tinyFaceDetector.load(o),ba=o=>w.tinyYolov2.load(o),ga=o=>w.faceLandmark68Net.load(o),xa=o=>w.faceLandmark68TinyNet.load(o),va=o=>w.faceRecognitionNet.load(o),ya=o=>w.faceExpressionNet.load(o),_a=o=>w.ageGenderNet.load(o),Ta=pn,Pa=cn,wa=mn;var Ir=class extends J{constructor(e,r,n){super();this.parentTask=e;this.input=r;this.extractedFaces=n}},ae=class extends Ir{async run(){let t=await this.parentTask,e=await oe(t,this.input,async r=>Promise.all(r.map(n=>w.faceExpressionNet.predictExpressions(n))),this.extractedFaces);return t.map((r,n)=>xr(r,e[n]))}withAgeAndGender(){return new ie(this,this.input)}},se=class extends Ir{async run(){let t=await this.parentTask;if(!t)return;let e=await Ce(t,this.input,r=>w.faceExpressionNet.predictExpressions(r),this.extractedFaces);return xr(t,e)}withAgeAndGender(){return new ce(this,this.input)}},Wt=class extends ae{withAgeAndGender(){return new Bt(this,this.input)}withFaceDescriptors(){return new wt(this,this.input)}},kt=class extends se{withAgeAndGender(){return new Rt(this,this.input)}withFaceDescriptor(){return new Ft(this,this.input)}};var Nr=class extends J{constructor(e,r,n){super();this.parentTask=e;this.input=r;this.extractedFaces=n}},ie=class extends Nr{async run(){let t=await this.parentTask,e=await oe(t,this.input,async r=>Promise.all(r.map(n=>w.ageGenderNet.predictAgeAndGender(n))),this.extractedFaces);return t.map((r,n)=>{let{age:a,gender:s,genderProbability:i}=e[n];return Er(Mr(r,s,i),a)})}withFaceExpressions(){return new ae(this,this.input)}},ce=class extends Nr{async run(){let t=await this.parentTask;if(!t)return;let{age:e,gender:r,genderProbability:n}=await Ce(t,this.input,a=>w.ageGenderNet.predictAgeAndGender(a),this.extractedFaces);return Er(Mr(t,r,n),e)}withFaceExpressions(){return new se(this,this.input)}},Bt=class extends ie{withFaceExpressions(){return new Wt(this,this.input)}withFaceDescriptors(){return new wt(this,this.input)}},Rt=class extends ce{withFaceExpressions(){return new kt(this,this.input)}withFaceDescriptor(){return new Ft(this,this.input)}};var Ue=class extends J{constructor(e,r){super();this.parentTask=e;this.input=r}},wt=class extends Ue{async run(){let t=await this.parentTask;return(await oe(t,this.input,r=>Promise.all(r.map(n=>w.faceRecognitionNet.computeFaceDescriptor(n))),null,r=>r.landmarks.align(null,{useDlibAlignment:!0}))).map((r,n)=>Dr(t[n],r))}withFaceExpressions(){return new Wt(this,this.input)}withAgeAndGender(){return new Bt(this,this.input)}},Ft=class extends Ue{async run(){let t=await this.parentTask;if(!t)return;let e=await Ce(t,this.input,r=>w.faceRecognitionNet.computeFaceDescriptor(r),null,r=>r.landmarks.align(null,{useDlibAlignment:!0}));return Dr(t,e)}withFaceExpressions(){return new kt(this,this.input)}withAgeAndGender(){return new Rt(this,this.input)}};var Je=class extends J{constructor(e,r,n){super();this.parentTask=e;this.input=r;this.useTinyLandmarkNet=n}get landmarkNet(){return this.useTinyLandmarkNet?w.faceLandmark68TinyNet:w.faceLandmark68Net}},qe=class extends Je{async run(){let t=await this.parentTask,e=t.map(s=>s.detection),r=this.input instanceof Xe.Tensor?await de(this.input,e):await le(this.input,e),n=await Promise.all(r.map(s=>this.landmarkNet.detectLandmarks(s)));return r.forEach(s=>s instanceof Xe.Tensor&&s.dispose()),t.filter((s,i)=>n[i]).map((s,i)=>we(s,n[i]))}withFaceExpressions(){return new Wt(this,this.input)}withAgeAndGender(){return new Bt(this,this.input)}withFaceDescriptors(){return new wt(this,this.input)}},Ze=class extends Je{async run(){let t=await this.parentTask;if(!t)return;let{detection:e}=t,r=this.input instanceof Xe.Tensor?await de(this.input,[e]):await le(this.input,[e]),n=await this.landmarkNet.detectLandmarks(r[0]);return r.forEach(a=>a instanceof Xe.Tensor&&a.dispose()),we(t,n)}withFaceExpressions(){return new kt(this,this.input)}withAgeAndGender(){return new Rt(this,this.input)}withFaceDescriptor(){return new Ft(this,this.input)}};var Ke=class extends J{constructor(e,r=new X){super();this.input=e;this.options=r}},Ie=class extends Ke{async run(){let{input:t,options:e}=this,r;if(e instanceof je)r=w.tinyFaceDetector.locateFaces(t,e);else if(e instanceof X)r=w.ssdMobilenetv1.locateFaces(t,e);else if(e instanceof st)r=w.tinyYolov2.locateFaces(t,e);else throw new Error("detectFaces - expected options to be instance of TinyFaceDetectorOptions | SsdMobilenetv1Options | TinyYolov2Options");return r}runAndExtendWithFaceDetections(){return new Promise((t,e)=>{this.run().then(r=>t(r.map(n=>jt({},n)))).catch(r=>e(r))})}withFaceLandmarks(t=!1){return new qe(this.runAndExtendWithFaceDetections(),this.input,t)}withFaceExpressions(){return new ae(this.runAndExtendWithFaceDetections(),this.input)}withAgeAndGender(){return new ie(this.runAndExtendWithFaceDetections(),this.input)}},Qe=class extends Ke{async run(){let t=await new Ie(this.input,this.options),e=t[0];return t.forEach(r=>{r.score>e.score&&(e=r)}),e}runAndExtendWithFaceDetection(){return new Promise(async t=>{let e=await this.run();t(e?jt({},e):void 0)})}withFaceLandmarks(t=!1){return new Ze(this.runAndExtendWithFaceDetection(),this.input,t)}withFaceExpressions(){return new se(this.runAndExtendWithFaceDetection(),this.input)}withAgeAndGender(){return new ce(this.runAndExtendWithFaceDetection(),this.input)}};function Fa(o,t=new X){return new Qe(o,t)}function Sr(o,t=new X){return new Ie(o,t)}async function un(o,t){return Sr(o,new X(t?{minConfidence:t}:{})).withFaceLandmarks().withFaceDescriptors()}async function Da(o,t={}){return Sr(o,new st(t)).withFaceLandmarks().withFaceDescriptors()}var Ea=un;function go(o,t){if(o.length!==t.length)throw new Error("euclideanDistance: arr1.length !== arr2.length");let e=Array.from(o),r=Array.from(t);return Math.sqrt(e.map((n,a)=>n-r[a]).reduce((n,a)=>n+a**2,0))}var tr=class{constructor(t,e=.6){this._distanceThreshold=e;let r=Array.isArray(t)?t:[t];if(!r.length)throw new Error("FaceRecognizer.constructor - expected atleast one input");let n=1,a=()=>`person ${n++}`;this._labeledDescriptors=r.map(s=>{if(s instanceof mt)return s;if(s instanceof Float32Array)return new mt(a(),[s]);if(s.descriptor&&s.descriptor instanceof Float32Array)return new mt(a(),[s.descriptor]);throw new Error("FaceRecognizer.constructor - expected inputs to be of type LabeledFaceDescriptors | WithFaceDescriptor | Float32Array | Array | Float32Array>")})}get labeledDescriptors(){return this._labeledDescriptors}get distanceThreshold(){return this._distanceThreshold}computeMeanDistance(t,e){return e.map(r=>go(r,t)).reduce((r,n)=>r+n,0)/(e.length||1)}matchDescriptor(t){return this.labeledDescriptors.map(({descriptors:e,label:r})=>new pe(r,this.computeMeanDistance(t,e))).reduce((e,r)=>e.distancet.toJSON())}}static fromJSON(t){let e=t.labeledDescriptors.map(r=>mt.fromJSON(r));return new tr(e,t.distanceThreshold)}};function Ma(o){let t=new ne;return t.extractWeights(o),t}function fn(o,t){let{width:e,height:r}=new k(t.width,t.height);if(e<=0||r<=0)throw new Error(`resizeResults - invalid dimensions: ${JSON.stringify({width:e,height:r})}`);if(Array.isArray(o))return o.map(n=>fn(n,{width:e,height:r}));if(Zt(o)){let n=o.detection.forSize(e,r),a=o.unshiftedLandmarks.forSize(n.box.width,n.box.height);return we(jt(o,n),a)}return pt(o)?jt(o,o.detection.forSize(e,r)):o instanceof z||o instanceof M?o.forSize(e,r):o}var Ia=No;0&&(module.exports={AgeGenderNet,BoundingBox,Box,ComposableTask,ComputeAllFaceDescriptorsTask,ComputeFaceDescriptorsTaskBase,ComputeSingleFaceDescriptorTask,DetectAllFaceLandmarksTask,DetectAllFacesTask,DetectFaceLandmarksTaskBase,DetectFacesTaskBase,DetectSingleFaceLandmarksTask,DetectSingleFaceTask,Dimensions,FACE_EXPRESSION_LABELS,FaceDetection,FaceDetectionNet,FaceExpressionNet,FaceExpressions,FaceLandmark68Net,FaceLandmark68TinyNet,FaceLandmarkNet,FaceLandmarks,FaceLandmarks5,FaceLandmarks68,FaceMatch,FaceMatcher,FaceRecognitionNet,Gender,LabeledBox,LabeledFaceDescriptors,NetInput,NeuralNetwork,ObjectDetection,Point,PredictedBox,Rect,SsdMobilenetv1,SsdMobilenetv1Options,TinyFaceDetector,TinyFaceDetectorOptions,TinyYolov2,TinyYolov2Options,allFaces,allFacesSsdMobilenetv1,allFacesTinyYolov2,awaitMediaLoaded,bufferToImage,computeFaceDescriptor,createCanvas,createCanvasFromMedia,createFaceDetectionNet,createFaceRecognitionNet,createSsdMobilenetv1,createTinyFaceDetector,createTinyYolov2,detectAllFaces,detectFaceLandmarks,detectFaceLandmarksTiny,detectLandmarks,detectSingleFace,draw,env,euclideanDistance,extendWithAge,extendWithFaceDescriptor,extendWithFaceDetection,extendWithFaceExpressions,extendWithFaceLandmarks,extendWithGender,extractFaceTensors,extractFaces,fetchImage,fetchJson,fetchNetWeights,fetchOrThrow,fetchVideo,getContext2dOrThrow,getMediaDimensions,imageTensorToCanvas,imageToSquare,inverseSigmoid,iou,isMediaElement,isMediaLoaded,isWithAge,isWithFaceDetection,isWithFaceExpressions,isWithFaceLandmarks,isWithGender,loadAgeGenderModel,loadFaceDetectionModel,loadFaceExpressionModel,loadFaceLandmarkModel,loadFaceLandmarkTinyModel,loadFaceRecognitionModel,loadSsdMobilenetv1Model,loadTinyFaceDetectorModel,loadTinyYolov2Model,loadWeightMap,locateFaces,matchDimensions,minBbox,nets,nonMaxSuppression,normalize,padToSquare,predictAgeAndGender,recognizeFaceExpressions,resizeResults,resolveInput,shuffleArray,sigmoid,ssdMobilenetv1,tf,tinyFaceDetector,tinyYolov2,toNetInput,utils,validateConfig,version}); diff --git a/typedoc/classes/AgeGenderNet.html b/typedoc/classes/AgeGenderNet.html index f386b7d..b7ed703 100644 --- a/typedoc/classes/AgeGenderNet.html +++ b/typedoc/classes/AgeGenderNet.html @@ -1,16 +1,16 @@ -AgeGenderNet | @vladmandic/face-api - v1.7.1
+AgeGenderNet | @vladmandic/face-api - v1.7.2
+
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -394,7 +394,7 @@

    Modules

    diff --git a/typedoc/classes/BoundingBox.html b/typedoc/classes/BoundingBox.html index 05d25a7..5bd5200 100644 --- a/typedoc/classes/BoundingBox.html +++ b/typedoc/classes/BoundingBox.html @@ -1,16 +1,16 @@ -BoundingBox | @vladmandic/face-api - v1.7.1
    +BoundingBox | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -401,7 +401,7 @@

    Modules

    diff --git a/typedoc/classes/Box.html b/typedoc/classes/Box.html index 3141002..e5c2f21 100644 --- a/typedoc/classes/Box.html +++ b/typedoc/classes/Box.html @@ -1,16 +1,16 @@ -Box | @vladmandic/face-api - v1.7.1
    +Box | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -387,7 +387,7 @@

    Modules

    diff --git a/typedoc/classes/ComposableTask.html b/typedoc/classes/ComposableTask.html index 66a4fca..8c7e73b 100644 --- a/typedoc/classes/ComposableTask.html +++ b/typedoc/classes/ComposableTask.html @@ -1,16 +1,16 @@ -ComposableTask | @vladmandic/face-api - v1.7.1
    +ComposableTask | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -105,7 +105,7 @@

    Modules

    diff --git a/typedoc/classes/ComputeAllFaceDescriptorsTask.html b/typedoc/classes/ComputeAllFaceDescriptorsTask.html index 9fcbc84..333a34b 100644 --- a/typedoc/classes/ComputeAllFaceDescriptorsTask.html +++ b/typedoc/classes/ComputeAllFaceDescriptorsTask.html @@ -1,16 +1,16 @@ -ComputeAllFaceDescriptorsTask | @vladmandic/face-api - v1.7.1
    +ComputeAllFaceDescriptorsTask | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -133,7 +133,7 @@

    Modules

    diff --git a/typedoc/classes/ComputeFaceDescriptorsTaskBase.html b/typedoc/classes/ComputeFaceDescriptorsTaskBase.html index ea090e0..903a663 100644 --- a/typedoc/classes/ComputeFaceDescriptorsTaskBase.html +++ b/typedoc/classes/ComputeFaceDescriptorsTaskBase.html @@ -1,16 +1,16 @@ -ComputeFaceDescriptorsTaskBase | @vladmandic/face-api - v1.7.1
    +ComputeFaceDescriptorsTaskBase | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2

    Class ComputeFaceDescriptorsTaskBase<TReturn, TParentReturn>

    @@ -122,7 +122,7 @@

    Modules

    diff --git a/typedoc/classes/ComputeSingleFaceDescriptorTask.html b/typedoc/classes/ComputeSingleFaceDescriptorTask.html index 832fcf7..69a6b1d 100644 --- a/typedoc/classes/ComputeSingleFaceDescriptorTask.html +++ b/typedoc/classes/ComputeSingleFaceDescriptorTask.html @@ -1,16 +1,16 @@ -ComputeSingleFaceDescriptorTask | @vladmandic/face-api - v1.7.1
    +ComputeSingleFaceDescriptorTask | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -133,7 +133,7 @@

    Modules

    diff --git a/typedoc/classes/DetectAllFaceLandmarksTask.html b/typedoc/classes/DetectAllFaceLandmarksTask.html index 38bc970..a12008a 100644 --- a/typedoc/classes/DetectAllFaceLandmarksTask.html +++ b/typedoc/classes/DetectAllFaceLandmarksTask.html @@ -1,16 +1,16 @@ -DetectAllFaceLandmarksTask | @vladmandic/face-api - v1.7.1
    +DetectAllFaceLandmarksTask | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -144,7 +144,7 @@

    Modules

    diff --git a/typedoc/classes/DetectAllFacesTask.html b/typedoc/classes/DetectAllFacesTask.html index a01d510..216a2f1 100644 --- a/typedoc/classes/DetectAllFacesTask.html +++ b/typedoc/classes/DetectAllFacesTask.html @@ -1,16 +1,16 @@ -DetectAllFacesTask | @vladmandic/face-api - v1.7.1
    +DetectAllFacesTask | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -137,7 +137,7 @@

    Modules

    diff --git a/typedoc/classes/DetectFaceLandmarksTaskBase.html b/typedoc/classes/DetectFaceLandmarksTaskBase.html index fec6ec0..24bcc25 100644 --- a/typedoc/classes/DetectFaceLandmarksTaskBase.html +++ b/typedoc/classes/DetectFaceLandmarksTaskBase.html @@ -1,16 +1,16 @@ -DetectFaceLandmarksTaskBase | @vladmandic/face-api - v1.7.1
    +DetectFaceLandmarksTaskBase | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2

    Class DetectFaceLandmarksTaskBase<TReturn, TParentReturn>

    @@ -124,7 +124,7 @@

    Modules

    diff --git a/typedoc/classes/DetectFacesTaskBase.html b/typedoc/classes/DetectFacesTaskBase.html index 5d13956..2040af4 100644 --- a/typedoc/classes/DetectFacesTaskBase.html +++ b/typedoc/classes/DetectFacesTaskBase.html @@ -1,16 +1,16 @@ -DetectFacesTaskBase | @vladmandic/face-api - v1.7.1
    +DetectFacesTaskBase | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -118,7 +118,7 @@

    Modules

    diff --git a/typedoc/classes/DetectSingleFaceLandmarksTask.html b/typedoc/classes/DetectSingleFaceLandmarksTask.html index 18ef30e..a0396c4 100644 --- a/typedoc/classes/DetectSingleFaceLandmarksTask.html +++ b/typedoc/classes/DetectSingleFaceLandmarksTask.html @@ -1,16 +1,16 @@ -DetectSingleFaceLandmarksTask | @vladmandic/face-api - v1.7.1
    +DetectSingleFaceLandmarksTask | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -144,7 +144,7 @@

    Modules

    diff --git a/typedoc/classes/DetectSingleFaceTask.html b/typedoc/classes/DetectSingleFaceTask.html index 9b3ea1e..f6be378 100644 --- a/typedoc/classes/DetectSingleFaceTask.html +++ b/typedoc/classes/DetectSingleFaceTask.html @@ -1,16 +1,16 @@ -DetectSingleFaceTask | @vladmandic/face-api - v1.7.1
    +DetectSingleFaceTask | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -137,7 +137,7 @@

    Modules

    diff --git a/typedoc/classes/Dimensions.html b/typedoc/classes/Dimensions.html index d035bda..536d599 100644 --- a/typedoc/classes/Dimensions.html +++ b/typedoc/classes/Dimensions.html @@ -1,16 +1,16 @@ -Dimensions | @vladmandic/face-api - v1.7.1
    +Dimensions | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -104,7 +104,7 @@

    Modules

    diff --git a/typedoc/classes/FaceDetection.html b/typedoc/classes/FaceDetection.html index b30fd03..c207389 100644 --- a/typedoc/classes/FaceDetection.html +++ b/typedoc/classes/FaceDetection.html @@ -1,16 +1,16 @@ -FaceDetection | @vladmandic/face-api - v1.7.1
    +FaceDetection | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -179,7 +179,7 @@

    Modules

    diff --git a/typedoc/classes/FaceDetectionNet.html b/typedoc/classes/FaceDetectionNet.html index 0e0c97d..06af33b 100644 --- a/typedoc/classes/FaceDetectionNet.html +++ b/typedoc/classes/FaceDetectionNet.html @@ -1,16 +1,16 @@ -FaceDetectionNet | @vladmandic/face-api - v1.7.1
    +FaceDetectionNet | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -338,7 +338,7 @@

    Modules

    diff --git a/typedoc/classes/FaceExpressionNet.html b/typedoc/classes/FaceExpressionNet.html index f7c5eaf..be0026b 100644 --- a/typedoc/classes/FaceExpressionNet.html +++ b/typedoc/classes/FaceExpressionNet.html @@ -1,16 +1,16 @@ -FaceExpressionNet | @vladmandic/face-api - v1.7.1
    +FaceExpressionNet | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -398,7 +398,7 @@

    Modules

    diff --git a/typedoc/classes/FaceExpressions.html b/typedoc/classes/FaceExpressions.html index ba642b9..9aa1dd4 100644 --- a/typedoc/classes/FaceExpressions.html +++ b/typedoc/classes/FaceExpressions.html @@ -1,16 +1,16 @@ -FaceExpressions | @vladmandic/face-api - v1.7.1
    +FaceExpressions | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -120,7 +120,7 @@

    Modules

    diff --git a/typedoc/classes/FaceLandmark68Net.html b/typedoc/classes/FaceLandmark68Net.html index 842d831..2b20146 100644 --- a/typedoc/classes/FaceLandmark68Net.html +++ b/typedoc/classes/FaceLandmark68Net.html @@ -1,16 +1,16 @@ -FaceLandmark68Net | @vladmandic/face-api - v1.7.1
    +FaceLandmark68Net | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -422,7 +422,7 @@

    Modules

    diff --git a/typedoc/classes/FaceLandmark68TinyNet.html b/typedoc/classes/FaceLandmark68TinyNet.html index c69459a..c9fd8e1 100644 --- a/typedoc/classes/FaceLandmark68TinyNet.html +++ b/typedoc/classes/FaceLandmark68TinyNet.html @@ -1,16 +1,16 @@ -FaceLandmark68TinyNet | @vladmandic/face-api - v1.7.1
    +FaceLandmark68TinyNet | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -420,7 +420,7 @@

    Modules

    diff --git a/typedoc/classes/FaceLandmarkNet.html b/typedoc/classes/FaceLandmarkNet.html index 98f2b0f..e358857 100644 --- a/typedoc/classes/FaceLandmarkNet.html +++ b/typedoc/classes/FaceLandmarkNet.html @@ -1,16 +1,16 @@ -FaceLandmarkNet | @vladmandic/face-api - v1.7.1
    +FaceLandmarkNet | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -420,7 +420,7 @@

    Modules

    diff --git a/typedoc/classes/FaceLandmarks.html b/typedoc/classes/FaceLandmarks.html index 74e740a..58a4293 100644 --- a/typedoc/classes/FaceLandmarks.html +++ b/typedoc/classes/FaceLandmarks.html @@ -1,16 +1,16 @@ -FaceLandmarks | @vladmandic/face-api - v1.7.1
    +FaceLandmarks | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -220,7 +220,7 @@ it's current shift.

    Modules

    diff --git a/typedoc/classes/FaceLandmarks5.html b/typedoc/classes/FaceLandmarks5.html index 5dd21e5..8f310d0 100644 --- a/typedoc/classes/FaceLandmarks5.html +++ b/typedoc/classes/FaceLandmarks5.html @@ -1,16 +1,16 @@ -FaceLandmarks5 | @vladmandic/face-api - v1.7.1
    +FaceLandmarks5 | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -223,7 +223,7 @@ it's current shift.

    Modules

    diff --git a/typedoc/classes/FaceLandmarks68.html b/typedoc/classes/FaceLandmarks68.html index bb52031..7fd1e19 100644 --- a/typedoc/classes/FaceLandmarks68.html +++ b/typedoc/classes/FaceLandmarks68.html @@ -1,16 +1,16 @@ -FaceLandmarks68 | @vladmandic/face-api - v1.7.1
    +FaceLandmarks68 | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -286,7 +286,7 @@ it's current shift.

    Modules

    diff --git a/typedoc/classes/FaceMatch.html b/typedoc/classes/FaceMatch.html index b73e7aa..7703532 100644 --- a/typedoc/classes/FaceMatch.html +++ b/typedoc/classes/FaceMatch.html @@ -1,16 +1,16 @@ -FaceMatch | @vladmandic/face-api - v1.7.1
    +FaceMatch | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -109,7 +109,7 @@

    Modules

    diff --git a/typedoc/classes/FaceMatcher.html b/typedoc/classes/FaceMatcher.html index 84ec202..6013d72 100644 --- a/typedoc/classes/FaceMatcher.html +++ b/typedoc/classes/FaceMatcher.html @@ -1,16 +1,16 @@ -FaceMatcher | @vladmandic/face-api - v1.7.1
    +FaceMatcher | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -156,7 +156,7 @@

    Modules

    diff --git a/typedoc/classes/FaceRecognitionNet.html b/typedoc/classes/FaceRecognitionNet.html index d1e533f..1bfcf58 100644 --- a/typedoc/classes/FaceRecognitionNet.html +++ b/typedoc/classes/FaceRecognitionNet.html @@ -1,16 +1,16 @@ -FaceRecognitionNet | @vladmandic/face-api - v1.7.1
    +FaceRecognitionNet | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -333,7 +333,7 @@

    Modules

    diff --git a/typedoc/classes/LabeledBox.html b/typedoc/classes/LabeledBox.html index e0e287f..2ae2e9a 100644 --- a/typedoc/classes/LabeledBox.html +++ b/typedoc/classes/LabeledBox.html @@ -1,16 +1,16 @@ -LabeledBox | @vladmandic/face-api - v1.7.1
    +LabeledBox | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -414,7 +414,7 @@

    Modules

    diff --git a/typedoc/classes/LabeledFaceDescriptors.html b/typedoc/classes/LabeledFaceDescriptors.html index fc04e31..afc6cc5 100644 --- a/typedoc/classes/LabeledFaceDescriptors.html +++ b/typedoc/classes/LabeledFaceDescriptors.html @@ -1,16 +1,16 @@ -LabeledFaceDescriptors | @vladmandic/face-api - v1.7.1
    +LabeledFaceDescriptors | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -112,7 +112,7 @@

    Modules

    diff --git a/typedoc/classes/NetInput.html b/typedoc/classes/NetInput.html index 2a333af..5cc9b66 100644 --- a/typedoc/classes/NetInput.html +++ b/typedoc/classes/NetInput.html @@ -1,16 +1,16 @@ -NetInput | @vladmandic/face-api - v1.7.1
    +NetInput | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -227,7 +227,7 @@ with size [batchSize, inputSize, inputSize, 3].

    Modules

    diff --git a/typedoc/classes/NeuralNetwork.html b/typedoc/classes/NeuralNetwork.html index add336e..78ca5fe 100644 --- a/typedoc/classes/NeuralNetwork.html +++ b/typedoc/classes/NeuralNetwork.html @@ -1,16 +1,16 @@ -NeuralNetwork | @vladmandic/face-api - v1.7.1
    +NeuralNetwork | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -289,7 +289,7 @@

    Modules

    diff --git a/typedoc/classes/ObjectDetection.html b/typedoc/classes/ObjectDetection.html index ff756d9..ff179ea 100644 --- a/typedoc/classes/ObjectDetection.html +++ b/typedoc/classes/ObjectDetection.html @@ -1,16 +1,16 @@ -ObjectDetection | @vladmandic/face-api - v1.7.1
    +ObjectDetection | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -167,7 +167,7 @@

    Modules

    diff --git a/typedoc/classes/Point.html b/typedoc/classes/Point.html index 2092191..c56b609 100644 --- a/typedoc/classes/Point.html +++ b/typedoc/classes/Point.html @@ -1,16 +1,16 @@ -Point | @vladmandic/face-api - v1.7.1
    +Point | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -178,7 +178,7 @@

    Modules

    diff --git a/typedoc/classes/PredictedBox.html b/typedoc/classes/PredictedBox.html index 56c5d25..b86c7d4 100644 --- a/typedoc/classes/PredictedBox.html +++ b/typedoc/classes/PredictedBox.html @@ -1,16 +1,16 @@ -PredictedBox | @vladmandic/face-api - v1.7.1
    +PredictedBox | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -452,7 +452,7 @@

    Modules

    diff --git a/typedoc/classes/Rect.html b/typedoc/classes/Rect.html index 085b98d..26ca957 100644 --- a/typedoc/classes/Rect.html +++ b/typedoc/classes/Rect.html @@ -1,16 +1,16 @@ -Rect | @vladmandic/face-api - v1.7.1
    +Rect | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -401,7 +401,7 @@

    Modules

    diff --git a/typedoc/classes/SsdMobilenetv1.html b/typedoc/classes/SsdMobilenetv1.html index f8c30fc..3f3db13 100644 --- a/typedoc/classes/SsdMobilenetv1.html +++ b/typedoc/classes/SsdMobilenetv1.html @@ -1,16 +1,16 @@ -SsdMobilenetv1 | @vladmandic/face-api - v1.7.1
    +SsdMobilenetv1 | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -337,7 +337,7 @@

    Modules

    diff --git a/typedoc/classes/SsdMobilenetv1Options.html b/typedoc/classes/SsdMobilenetv1Options.html index 1896063..39a1883 100644 --- a/typedoc/classes/SsdMobilenetv1Options.html +++ b/typedoc/classes/SsdMobilenetv1Options.html @@ -1,16 +1,16 @@ -SsdMobilenetv1Options | @vladmandic/face-api - v1.7.1
    +SsdMobilenetv1Options | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -82,7 +82,7 @@

    Modules

    diff --git a/typedoc/classes/TinyFaceDetector.html b/typedoc/classes/TinyFaceDetector.html index 039b481..498d012 100644 --- a/typedoc/classes/TinyFaceDetector.html +++ b/typedoc/classes/TinyFaceDetector.html @@ -1,16 +1,16 @@ -TinyFaceDetector | @vladmandic/face-api - v1.7.1
    +TinyFaceDetector | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -438,7 +438,7 @@

    Modules

    diff --git a/typedoc/classes/TinyFaceDetectorOptions.html b/typedoc/classes/TinyFaceDetectorOptions.html index 6bba5db..a8abc9d 100644 --- a/typedoc/classes/TinyFaceDetectorOptions.html +++ b/typedoc/classes/TinyFaceDetectorOptions.html @@ -1,16 +1,16 @@ -TinyFaceDetectorOptions | @vladmandic/face-api - v1.7.1
    +TinyFaceDetectorOptions | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -87,7 +87,7 @@

    Modules

    diff --git a/typedoc/classes/TinyYolov2.html b/typedoc/classes/TinyYolov2.html index 4573140..a0243fb 100644 --- a/typedoc/classes/TinyYolov2.html +++ b/typedoc/classes/TinyYolov2.html @@ -1,16 +1,16 @@ -TinyYolov2 | @vladmandic/face-api - v1.7.1
    +TinyYolov2 | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -452,7 +452,7 @@

    Modules

    diff --git a/typedoc/classes/TinyYolov2Options.html b/typedoc/classes/TinyYolov2Options.html index 1a993e1..8f479d4 100644 --- a/typedoc/classes/TinyYolov2Options.html +++ b/typedoc/classes/TinyYolov2Options.html @@ -1,16 +1,16 @@ -TinyYolov2Options | @vladmandic/face-api - v1.7.1
    +TinyYolov2Options | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -84,7 +84,7 @@

    Modules

    diff --git a/typedoc/classes/draw.DrawBox.html b/typedoc/classes/draw.DrawBox.html index b8a3649..da7a3f1 100644 --- a/typedoc/classes/draw.DrawBox.html +++ b/typedoc/classes/draw.DrawBox.html @@ -1,16 +1,16 @@ -DrawBox | @vladmandic/face-api - v1.7.1
    +DrawBox | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -98,7 +98,7 @@

    Modules

    diff --git a/typedoc/classes/draw.DrawBoxOptions.html b/typedoc/classes/draw.DrawBoxOptions.html index b8fd93b..61f386a 100644 --- a/typedoc/classes/draw.DrawBoxOptions.html +++ b/typedoc/classes/draw.DrawBoxOptions.html @@ -1,16 +1,16 @@ -DrawBoxOptions | @vladmandic/face-api - v1.7.1
    +DrawBoxOptions | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -89,7 +89,7 @@

    Modules

    diff --git a/typedoc/classes/draw.DrawFaceLandmarks.html b/typedoc/classes/draw.DrawFaceLandmarks.html index b178ce0..6731595 100644 --- a/typedoc/classes/draw.DrawFaceLandmarks.html +++ b/typedoc/classes/draw.DrawFaceLandmarks.html @@ -1,16 +1,16 @@ -DrawFaceLandmarks | @vladmandic/face-api - v1.7.1
    +DrawFaceLandmarks | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -98,7 +98,7 @@

    Modules

    diff --git a/typedoc/classes/draw.DrawFaceLandmarksOptions.html b/typedoc/classes/draw.DrawFaceLandmarksOptions.html index bcd76c4..8a74fb4 100644 --- a/typedoc/classes/draw.DrawFaceLandmarksOptions.html +++ b/typedoc/classes/draw.DrawFaceLandmarksOptions.html @@ -1,16 +1,16 @@ -DrawFaceLandmarksOptions | @vladmandic/face-api - v1.7.1
    +DrawFaceLandmarksOptions | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -101,7 +101,7 @@

    Modules

    diff --git a/typedoc/classes/draw.DrawTextField.html b/typedoc/classes/draw.DrawTextField.html index 1743b69..6a3b50f 100644 --- a/typedoc/classes/draw.DrawTextField.html +++ b/typedoc/classes/draw.DrawTextField.html @@ -1,16 +1,16 @@ -DrawTextField | @vladmandic/face-api - v1.7.1
    +DrawTextField | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -145,7 +145,7 @@

    Modules

    diff --git a/typedoc/classes/draw.DrawTextFieldOptions.html b/typedoc/classes/draw.DrawTextFieldOptions.html index 3f7c1cc..c2e9a61 100644 --- a/typedoc/classes/draw.DrawTextFieldOptions.html +++ b/typedoc/classes/draw.DrawTextFieldOptions.html @@ -1,16 +1,16 @@ -DrawTextFieldOptions | @vladmandic/face-api - v1.7.1
    +DrawTextFieldOptions | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -111,7 +111,7 @@

    Modules

    diff --git a/typedoc/enums/Gender.html b/typedoc/enums/Gender.html index a238d75..8be80f3 100644 --- a/typedoc/enums/Gender.html +++ b/typedoc/enums/Gender.html @@ -1,16 +1,16 @@ -Gender | @vladmandic/face-api - v1.7.1
    +Gender | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -43,7 +43,7 @@

    Modules

    diff --git a/typedoc/functions/allFacesSsdMobilenetv1.html b/typedoc/functions/allFacesSsdMobilenetv1.html index eed2995..a5ff0a9 100644 --- a/typedoc/functions/allFacesSsdMobilenetv1.html +++ b/typedoc/functions/allFacesSsdMobilenetv1.html @@ -1,16 +1,16 @@ -allFacesSsdMobilenetv1 | @vladmandic/face-api - v1.7.1
    +allFacesSsdMobilenetv1 | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -43,7 +43,7 @@

    Modules

    diff --git a/typedoc/functions/allFacesTinyYolov2.html b/typedoc/functions/allFacesTinyYolov2.html index 734fd77..b58568f 100644 --- a/typedoc/functions/allFacesTinyYolov2.html +++ b/typedoc/functions/allFacesTinyYolov2.html @@ -1,16 +1,16 @@ -allFacesTinyYolov2 | @vladmandic/face-api - v1.7.1
    +allFacesTinyYolov2 | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -43,7 +43,7 @@

    Modules

    diff --git a/typedoc/functions/awaitMediaLoaded.html b/typedoc/functions/awaitMediaLoaded.html index ea30272..38d45ec 100644 --- a/typedoc/functions/awaitMediaLoaded.html +++ b/typedoc/functions/awaitMediaLoaded.html @@ -1,16 +1,16 @@ -awaitMediaLoaded | @vladmandic/face-api - v1.7.1
    +awaitMediaLoaded | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -41,7 +41,7 @@

    Modules

    diff --git a/typedoc/functions/bufferToImage.html b/typedoc/functions/bufferToImage.html index 21fabe0..513400f 100644 --- a/typedoc/functions/bufferToImage.html +++ b/typedoc/functions/bufferToImage.html @@ -1,16 +1,16 @@ -bufferToImage | @vladmandic/face-api - v1.7.1
    +bufferToImage | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -41,7 +41,7 @@

    Modules

    diff --git a/typedoc/functions/computeFaceDescriptor.html b/typedoc/functions/computeFaceDescriptor.html index 07481cd..cc25bfd 100644 --- a/typedoc/functions/computeFaceDescriptor.html +++ b/typedoc/functions/computeFaceDescriptor.html @@ -1,16 +1,16 @@ -computeFaceDescriptor | @vladmandic/face-api - v1.7.1
    +computeFaceDescriptor | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -48,7 +48,7 @@ face descriptors.

    Modules

    diff --git a/typedoc/functions/createCanvas.html b/typedoc/functions/createCanvas.html index 3e5c683..9029b30 100644 --- a/typedoc/functions/createCanvas.html +++ b/typedoc/functions/createCanvas.html @@ -1,16 +1,16 @@ -createCanvas | @vladmandic/face-api - v1.7.1
    +createCanvas | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -41,7 +41,7 @@

    Modules

    diff --git a/typedoc/functions/createCanvasFromMedia.html b/typedoc/functions/createCanvasFromMedia.html index 11a92b4..835cbe5 100644 --- a/typedoc/functions/createCanvasFromMedia.html +++ b/typedoc/functions/createCanvasFromMedia.html @@ -1,16 +1,16 @@ -createCanvasFromMedia | @vladmandic/face-api - v1.7.1
    +createCanvasFromMedia | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -43,7 +43,7 @@

    Modules

    diff --git a/typedoc/functions/createFaceDetectionNet.html b/typedoc/functions/createFaceDetectionNet.html index bbb3a23..1d17458 100644 --- a/typedoc/functions/createFaceDetectionNet.html +++ b/typedoc/functions/createFaceDetectionNet.html @@ -1,16 +1,16 @@ -createFaceDetectionNet | @vladmandic/face-api - v1.7.1
    +createFaceDetectionNet | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -41,7 +41,7 @@

    Modules

    diff --git a/typedoc/functions/createFaceRecognitionNet.html b/typedoc/functions/createFaceRecognitionNet.html index 5df1944..65d140b 100644 --- a/typedoc/functions/createFaceRecognitionNet.html +++ b/typedoc/functions/createFaceRecognitionNet.html @@ -1,16 +1,16 @@ -createFaceRecognitionNet | @vladmandic/face-api - v1.7.1
    +createFaceRecognitionNet | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -41,7 +41,7 @@

    Modules

    diff --git a/typedoc/functions/createSsdMobilenetv1.html b/typedoc/functions/createSsdMobilenetv1.html index 6503840..be2cfe5 100644 --- a/typedoc/functions/createSsdMobilenetv1.html +++ b/typedoc/functions/createSsdMobilenetv1.html @@ -1,16 +1,16 @@ -createSsdMobilenetv1 | @vladmandic/face-api - v1.7.1
    +createSsdMobilenetv1 | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -41,7 +41,7 @@

    Modules

    diff --git a/typedoc/functions/createTinyFaceDetector.html b/typedoc/functions/createTinyFaceDetector.html index 31d5dfc..655ba14 100644 --- a/typedoc/functions/createTinyFaceDetector.html +++ b/typedoc/functions/createTinyFaceDetector.html @@ -1,16 +1,16 @@ -createTinyFaceDetector | @vladmandic/face-api - v1.7.1
    +createTinyFaceDetector | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -41,7 +41,7 @@

    Modules

    diff --git a/typedoc/functions/createTinyYolov2.html b/typedoc/functions/createTinyYolov2.html index 7ba9ad1..a58537c 100644 --- a/typedoc/functions/createTinyYolov2.html +++ b/typedoc/functions/createTinyYolov2.html @@ -1,16 +1,16 @@ -createTinyYolov2 | @vladmandic/face-api - v1.7.1
    +createTinyYolov2 | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -43,7 +43,7 @@

    Modules

    diff --git a/typedoc/functions/detectAllFaces.html b/typedoc/functions/detectAllFaces.html index b0da57a..c52e97e 100644 --- a/typedoc/functions/detectAllFaces.html +++ b/typedoc/functions/detectAllFaces.html @@ -1,16 +1,16 @@ -detectAllFaces | @vladmandic/face-api - v1.7.1
    +detectAllFaces | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -43,7 +43,7 @@

    Modules

    diff --git a/typedoc/functions/detectFaceLandmarks.html b/typedoc/functions/detectFaceLandmarks.html index 2674ee2..16b78c1 100644 --- a/typedoc/functions/detectFaceLandmarks.html +++ b/typedoc/functions/detectFaceLandmarks.html @@ -1,16 +1,16 @@ -detectFaceLandmarks | @vladmandic/face-api - v1.7.1
    +detectFaceLandmarks | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -45,7 +45,7 @@

    Modules

    diff --git a/typedoc/functions/detectFaceLandmarksTiny.html b/typedoc/functions/detectFaceLandmarksTiny.html index 49c3965..6516fe7 100644 --- a/typedoc/functions/detectFaceLandmarksTiny.html +++ b/typedoc/functions/detectFaceLandmarksTiny.html @@ -1,16 +1,16 @@ -detectFaceLandmarksTiny | @vladmandic/face-api - v1.7.1
    +detectFaceLandmarksTiny | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -47,7 +47,7 @@ faster at inference, but also slightly less accurate.

    Modules

    diff --git a/typedoc/functions/detectLandmarks.html b/typedoc/functions/detectLandmarks.html index 8b3a7a4..2f91498 100644 --- a/typedoc/functions/detectLandmarks.html +++ b/typedoc/functions/detectLandmarks.html @@ -1,16 +1,16 @@ -detectLandmarks | @vladmandic/face-api - v1.7.1
    +detectLandmarks | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -45,7 +45,7 @@

    Modules

    diff --git a/typedoc/functions/detectSingleFace.html b/typedoc/functions/detectSingleFace.html index 32601d5..47ac0fa 100644 --- a/typedoc/functions/detectSingleFace.html +++ b/typedoc/functions/detectSingleFace.html @@ -1,16 +1,16 @@ -detectSingleFace | @vladmandic/face-api - v1.7.1
    +detectSingleFace | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -43,7 +43,7 @@

    Modules

    diff --git a/typedoc/functions/draw.drawContour.html b/typedoc/functions/draw.drawContour.html index 46aea94..2624693 100644 --- a/typedoc/functions/draw.drawContour.html +++ b/typedoc/functions/draw.drawContour.html @@ -1,16 +1,16 @@ -drawContour | @vladmandic/face-api - v1.7.1
    +drawContour | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -46,7 +46,7 @@

    Modules

    diff --git a/typedoc/functions/draw.drawDetections.html b/typedoc/functions/draw.drawDetections.html index efac342..bf67adf 100644 --- a/typedoc/functions/draw.drawDetections.html +++ b/typedoc/functions/draw.drawDetections.html @@ -1,16 +1,16 @@ -drawDetections | @vladmandic/face-api - v1.7.1
    +drawDetections | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -44,7 +44,7 @@

    Modules

    diff --git a/typedoc/functions/draw.drawFaceExpressions.html b/typedoc/functions/draw.drawFaceExpressions.html index aa45cff..ff6d67d 100644 --- a/typedoc/functions/draw.drawFaceExpressions.html +++ b/typedoc/functions/draw.drawFaceExpressions.html @@ -1,16 +1,16 @@ -drawFaceExpressions | @vladmandic/face-api - v1.7.1
    +drawFaceExpressions | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -48,7 +48,7 @@

    Modules

    diff --git a/typedoc/functions/draw.drawFaceLandmarks-1.html b/typedoc/functions/draw.drawFaceLandmarks-1.html index c2fef6f..00985ef 100644 --- a/typedoc/functions/draw.drawFaceLandmarks-1.html +++ b/typedoc/functions/draw.drawFaceLandmarks-1.html @@ -1,16 +1,16 @@ -drawFaceLandmarks | @vladmandic/face-api - v1.7.1
    +drawFaceLandmarks | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -44,7 +44,7 @@

    Modules

    diff --git a/typedoc/functions/euclideanDistance.html b/typedoc/functions/euclideanDistance.html index 11650da..809f3e6 100644 --- a/typedoc/functions/euclideanDistance.html +++ b/typedoc/functions/euclideanDistance.html @@ -1,16 +1,16 @@ -euclideanDistance | @vladmandic/face-api - v1.7.1
    +euclideanDistance | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -43,7 +43,7 @@

    Modules

    diff --git a/typedoc/functions/extendWithAge.html b/typedoc/functions/extendWithAge.html index 0e15c97..fd8fb4f 100644 --- a/typedoc/functions/extendWithAge.html +++ b/typedoc/functions/extendWithAge.html @@ -1,16 +1,16 @@ -extendWithAge | @vladmandic/face-api - v1.7.1
    +extendWithAge | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -48,7 +48,7 @@

    Modules

    diff --git a/typedoc/functions/extendWithFaceDescriptor.html b/typedoc/functions/extendWithFaceDescriptor.html index 17b7a15..482af93 100644 --- a/typedoc/functions/extendWithFaceDescriptor.html +++ b/typedoc/functions/extendWithFaceDescriptor.html @@ -1,16 +1,16 @@ -extendWithFaceDescriptor | @vladmandic/face-api - v1.7.1
    +extendWithFaceDescriptor | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -48,7 +48,7 @@

    Modules

    diff --git a/typedoc/functions/extendWithFaceDetection.html b/typedoc/functions/extendWithFaceDetection.html index dbf8f35..884a0d2 100644 --- a/typedoc/functions/extendWithFaceDetection.html +++ b/typedoc/functions/extendWithFaceDetection.html @@ -1,16 +1,16 @@ -extendWithFaceDetection | @vladmandic/face-api - v1.7.1
    +extendWithFaceDetection | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -48,7 +48,7 @@

    Modules

    diff --git a/typedoc/functions/extendWithFaceExpressions.html b/typedoc/functions/extendWithFaceExpressions.html index 047290a..12bd7cf 100644 --- a/typedoc/functions/extendWithFaceExpressions.html +++ b/typedoc/functions/extendWithFaceExpressions.html @@ -1,16 +1,16 @@ -extendWithFaceExpressions | @vladmandic/face-api - v1.7.1
    +extendWithFaceExpressions | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -48,7 +48,7 @@

    Modules

    diff --git a/typedoc/functions/extendWithFaceLandmarks.html b/typedoc/functions/extendWithFaceLandmarks.html index 154101a..cda2023 100644 --- a/typedoc/functions/extendWithFaceLandmarks.html +++ b/typedoc/functions/extendWithFaceLandmarks.html @@ -1,16 +1,16 @@ -extendWithFaceLandmarks | @vladmandic/face-api - v1.7.1
    +extendWithFaceLandmarks | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -50,7 +50,7 @@

    Modules

    diff --git a/typedoc/functions/extendWithGender.html b/typedoc/functions/extendWithGender.html index 67df00f..8588aff 100644 --- a/typedoc/functions/extendWithGender.html +++ b/typedoc/functions/extendWithGender.html @@ -1,16 +1,16 @@ -extendWithGender | @vladmandic/face-api - v1.7.1
    +extendWithGender | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -50,7 +50,7 @@

    Modules

    diff --git a/typedoc/functions/extractFaceTensors.html b/typedoc/functions/extractFaceTensors.html index 4fb4611..fbfa2c8 100644 --- a/typedoc/functions/extractFaceTensors.html +++ b/typedoc/functions/extractFaceTensors.html @@ -1,16 +1,16 @@ -extractFaceTensors | @vladmandic/face-api - v1.7.1
    +extractFaceTensors | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -54,7 +54,7 @@ converting them to tensors individually.

    Modules

    diff --git a/typedoc/functions/extractFaces.html b/typedoc/functions/extractFaces.html index 36851cb..445db0b 100644 --- a/typedoc/functions/extractFaces.html +++ b/typedoc/functions/extractFaces.html @@ -1,16 +1,16 @@ -extractFaces | @vladmandic/face-api - v1.7.1
    +extractFaces | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -51,7 +51,7 @@

    Modules

    diff --git a/typedoc/functions/fetchImage.html b/typedoc/functions/fetchImage.html index 4d5e34b..a20e1e9 100644 --- a/typedoc/functions/fetchImage.html +++ b/typedoc/functions/fetchImage.html @@ -1,16 +1,16 @@ -fetchImage | @vladmandic/face-api - v1.7.1
    +fetchImage | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -41,7 +41,7 @@

    Modules

    diff --git a/typedoc/functions/fetchJson.html b/typedoc/functions/fetchJson.html index c2d4352..0da6ffd 100644 --- a/typedoc/functions/fetchJson.html +++ b/typedoc/functions/fetchJson.html @@ -1,16 +1,16 @@ -fetchJson | @vladmandic/face-api - v1.7.1
    +fetchJson | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -46,7 +46,7 @@

    Modules

    diff --git a/typedoc/functions/fetchNetWeights.html b/typedoc/functions/fetchNetWeights.html index ddf1ae2..a5a740d 100644 --- a/typedoc/functions/fetchNetWeights.html +++ b/typedoc/functions/fetchNetWeights.html @@ -1,16 +1,16 @@ -fetchNetWeights | @vladmandic/face-api - v1.7.1
    +fetchNetWeights | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -41,7 +41,7 @@

    Modules

    diff --git a/typedoc/functions/fetchOrThrow.html b/typedoc/functions/fetchOrThrow.html index 2707883..1d2a645 100644 --- a/typedoc/functions/fetchOrThrow.html +++ b/typedoc/functions/fetchOrThrow.html @@ -1,16 +1,16 @@ -fetchOrThrow | @vladmandic/face-api - v1.7.1
    +fetchOrThrow | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -43,7 +43,7 @@

    Modules

    diff --git a/typedoc/functions/fetchVideo.html b/typedoc/functions/fetchVideo.html index 7e000ac..e07e246 100644 --- a/typedoc/functions/fetchVideo.html +++ b/typedoc/functions/fetchVideo.html @@ -1,16 +1,16 @@ -fetchVideo | @vladmandic/face-api - v1.7.1
    +fetchVideo | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -41,7 +41,7 @@

    Modules

    diff --git a/typedoc/functions/getContext2dOrThrow.html b/typedoc/functions/getContext2dOrThrow.html index 8ee6f2a..3b08543 100644 --- a/typedoc/functions/getContext2dOrThrow.html +++ b/typedoc/functions/getContext2dOrThrow.html @@ -1,16 +1,16 @@ -getContext2dOrThrow | @vladmandic/face-api - v1.7.1
    +getContext2dOrThrow | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -41,7 +41,7 @@

    Modules

    diff --git a/typedoc/functions/getMediaDimensions.html b/typedoc/functions/getMediaDimensions.html index d963263..07fa2d2 100644 --- a/typedoc/functions/getMediaDimensions.html +++ b/typedoc/functions/getMediaDimensions.html @@ -1,16 +1,16 @@ -getMediaDimensions | @vladmandic/face-api - v1.7.1
    +getMediaDimensions | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -41,7 +41,7 @@

    Modules

    diff --git a/typedoc/functions/imageTensorToCanvas.html b/typedoc/functions/imageTensorToCanvas.html index 7e52088..d656fea 100644 --- a/typedoc/functions/imageTensorToCanvas.html +++ b/typedoc/functions/imageTensorToCanvas.html @@ -1,16 +1,16 @@ -imageTensorToCanvas | @vladmandic/face-api - v1.7.1
    +imageTensorToCanvas | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -43,7 +43,7 @@

    Modules

    diff --git a/typedoc/functions/imageToSquare.html b/typedoc/functions/imageToSquare.html index 82e253e..98466a3 100644 --- a/typedoc/functions/imageToSquare.html +++ b/typedoc/functions/imageToSquare.html @@ -1,16 +1,16 @@ -imageToSquare | @vladmandic/face-api - v1.7.1
    +imageToSquare | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -45,7 +45,7 @@

    Modules

    diff --git a/typedoc/functions/inverseSigmoid.html b/typedoc/functions/inverseSigmoid.html index 5a16cc1..9d49907 100644 --- a/typedoc/functions/inverseSigmoid.html +++ b/typedoc/functions/inverseSigmoid.html @@ -1,16 +1,16 @@ -inverseSigmoid | @vladmandic/face-api - v1.7.1
    +inverseSigmoid | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -41,7 +41,7 @@

    Modules

    diff --git a/typedoc/functions/iou.html b/typedoc/functions/iou.html index 2e8cb71..357b5ba 100644 --- a/typedoc/functions/iou.html +++ b/typedoc/functions/iou.html @@ -1,16 +1,16 @@ -iou | @vladmandic/face-api - v1.7.1
    +iou | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -45,7 +45,7 @@

    Modules

    diff --git a/typedoc/functions/isMediaElement.html b/typedoc/functions/isMediaElement.html index 54c15cb..449abeb 100644 --- a/typedoc/functions/isMediaElement.html +++ b/typedoc/functions/isMediaElement.html @@ -1,16 +1,16 @@ -isMediaElement | @vladmandic/face-api - v1.7.1
    +isMediaElement | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -41,7 +41,7 @@

    Modules

    diff --git a/typedoc/functions/isMediaLoaded.html b/typedoc/functions/isMediaLoaded.html index f3b6f8e..4bbe940 100644 --- a/typedoc/functions/isMediaLoaded.html +++ b/typedoc/functions/isMediaLoaded.html @@ -1,16 +1,16 @@ -isMediaLoaded | @vladmandic/face-api - v1.7.1
    +isMediaLoaded | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -41,7 +41,7 @@

    Modules

    diff --git a/typedoc/functions/isWithAge.html b/typedoc/functions/isWithAge.html index 7142bef..4e8627a 100644 --- a/typedoc/functions/isWithAge.html +++ b/typedoc/functions/isWithAge.html @@ -1,16 +1,16 @@ -isWithAge | @vladmandic/face-api - v1.7.1
    +isWithAge | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -41,7 +41,7 @@

    Modules

    diff --git a/typedoc/functions/isWithFaceDetection.html b/typedoc/functions/isWithFaceDetection.html index 4274755..7d2524e 100644 --- a/typedoc/functions/isWithFaceDetection.html +++ b/typedoc/functions/isWithFaceDetection.html @@ -1,16 +1,16 @@ -isWithFaceDetection | @vladmandic/face-api - v1.7.1
    +isWithFaceDetection | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -41,7 +41,7 @@

    Modules

    diff --git a/typedoc/functions/isWithFaceExpressions.html b/typedoc/functions/isWithFaceExpressions.html index ac558ad..5982d02 100644 --- a/typedoc/functions/isWithFaceExpressions.html +++ b/typedoc/functions/isWithFaceExpressions.html @@ -1,16 +1,16 @@ -isWithFaceExpressions | @vladmandic/face-api - v1.7.1
    +isWithFaceExpressions | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -41,7 +41,7 @@

    Modules

    diff --git a/typedoc/functions/isWithFaceLandmarks.html b/typedoc/functions/isWithFaceLandmarks.html index bd50c63..b56d923 100644 --- a/typedoc/functions/isWithFaceLandmarks.html +++ b/typedoc/functions/isWithFaceLandmarks.html @@ -1,16 +1,16 @@ -isWithFaceLandmarks | @vladmandic/face-api - v1.7.1
    +isWithFaceLandmarks | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -41,7 +41,7 @@

    Modules

    diff --git a/typedoc/functions/isWithGender.html b/typedoc/functions/isWithGender.html index eac6e4a..f76ffe3 100644 --- a/typedoc/functions/isWithGender.html +++ b/typedoc/functions/isWithGender.html @@ -1,16 +1,16 @@ -isWithGender | @vladmandic/face-api - v1.7.1
    +isWithGender | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -41,7 +41,7 @@

    Modules

    diff --git a/typedoc/functions/loadAgeGenderModel.html b/typedoc/functions/loadAgeGenderModel.html index 3ab2806..23977c5 100644 --- a/typedoc/functions/loadAgeGenderModel.html +++ b/typedoc/functions/loadAgeGenderModel.html @@ -1,16 +1,16 @@ -loadAgeGenderModel | @vladmandic/face-api - v1.7.1
    +loadAgeGenderModel | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -41,7 +41,7 @@

    Modules

    diff --git a/typedoc/functions/loadFaceDetectionModel.html b/typedoc/functions/loadFaceDetectionModel.html index 41690db..4254d95 100644 --- a/typedoc/functions/loadFaceDetectionModel.html +++ b/typedoc/functions/loadFaceDetectionModel.html @@ -1,16 +1,16 @@ -loadFaceDetectionModel | @vladmandic/face-api - v1.7.1
    +loadFaceDetectionModel | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -41,7 +41,7 @@

    Modules

    diff --git a/typedoc/functions/loadFaceExpressionModel.html b/typedoc/functions/loadFaceExpressionModel.html index 5630795..451b931 100644 --- a/typedoc/functions/loadFaceExpressionModel.html +++ b/typedoc/functions/loadFaceExpressionModel.html @@ -1,16 +1,16 @@ -loadFaceExpressionModel | @vladmandic/face-api - v1.7.1
    +loadFaceExpressionModel | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -41,7 +41,7 @@

    Modules

    diff --git a/typedoc/functions/loadFaceLandmarkModel.html b/typedoc/functions/loadFaceLandmarkModel.html index a6b4f6d..72b13d6 100644 --- a/typedoc/functions/loadFaceLandmarkModel.html +++ b/typedoc/functions/loadFaceLandmarkModel.html @@ -1,16 +1,16 @@ -loadFaceLandmarkModel | @vladmandic/face-api - v1.7.1
    +loadFaceLandmarkModel | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -41,7 +41,7 @@

    Modules

    diff --git a/typedoc/functions/loadFaceLandmarkTinyModel.html b/typedoc/functions/loadFaceLandmarkTinyModel.html index 4184316..e0796e3 100644 --- a/typedoc/functions/loadFaceLandmarkTinyModel.html +++ b/typedoc/functions/loadFaceLandmarkTinyModel.html @@ -1,16 +1,16 @@ -loadFaceLandmarkTinyModel | @vladmandic/face-api - v1.7.1
    +loadFaceLandmarkTinyModel | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -41,7 +41,7 @@

    Modules

    diff --git a/typedoc/functions/loadFaceRecognitionModel.html b/typedoc/functions/loadFaceRecognitionModel.html index 947d17f..344dde4 100644 --- a/typedoc/functions/loadFaceRecognitionModel.html +++ b/typedoc/functions/loadFaceRecognitionModel.html @@ -1,16 +1,16 @@ -loadFaceRecognitionModel | @vladmandic/face-api - v1.7.1
    +loadFaceRecognitionModel | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -41,7 +41,7 @@

    Modules

    diff --git a/typedoc/functions/loadSsdMobilenetv1Model.html b/typedoc/functions/loadSsdMobilenetv1Model.html index 43671e2..df14c8d 100644 --- a/typedoc/functions/loadSsdMobilenetv1Model.html +++ b/typedoc/functions/loadSsdMobilenetv1Model.html @@ -1,16 +1,16 @@ -loadSsdMobilenetv1Model | @vladmandic/face-api - v1.7.1
    +loadSsdMobilenetv1Model | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -41,7 +41,7 @@

    Modules

    diff --git a/typedoc/functions/loadTinyFaceDetectorModel.html b/typedoc/functions/loadTinyFaceDetectorModel.html index ccba3a7..f7d71ae 100644 --- a/typedoc/functions/loadTinyFaceDetectorModel.html +++ b/typedoc/functions/loadTinyFaceDetectorModel.html @@ -1,16 +1,16 @@ -loadTinyFaceDetectorModel | @vladmandic/face-api - v1.7.1
    +loadTinyFaceDetectorModel | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -41,7 +41,7 @@

    Modules

    diff --git a/typedoc/functions/loadTinyYolov2Model.html b/typedoc/functions/loadTinyYolov2Model.html index d426c35..c9931a5 100644 --- a/typedoc/functions/loadTinyYolov2Model.html +++ b/typedoc/functions/loadTinyYolov2Model.html @@ -1,16 +1,16 @@ -loadTinyYolov2Model | @vladmandic/face-api - v1.7.1
    +loadTinyYolov2Model | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -41,7 +41,7 @@

    Modules

    diff --git a/typedoc/functions/loadWeightMap.html b/typedoc/functions/loadWeightMap.html index 326da37..d6f83e9 100644 --- a/typedoc/functions/loadWeightMap.html +++ b/typedoc/functions/loadWeightMap.html @@ -1,16 +1,16 @@ -loadWeightMap | @vladmandic/face-api - v1.7.1
    +loadWeightMap | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -43,7 +43,7 @@

    Modules

    diff --git a/typedoc/functions/locateFaces.html b/typedoc/functions/locateFaces.html index 606c6bc..4058041 100644 --- a/typedoc/functions/locateFaces.html +++ b/typedoc/functions/locateFaces.html @@ -1,16 +1,16 @@ -locateFaces | @vladmandic/face-api - v1.7.1
    +locateFaces | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -51,7 +51,7 @@

    Modules

    diff --git a/typedoc/functions/matchDimensions.html b/typedoc/functions/matchDimensions.html index 73e9334..8e66e35 100644 --- a/typedoc/functions/matchDimensions.html +++ b/typedoc/functions/matchDimensions.html @@ -1,16 +1,16 @@ -matchDimensions | @vladmandic/face-api - v1.7.1
    +matchDimensions | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -50,7 +50,7 @@

    Modules

    diff --git a/typedoc/functions/minBbox.html b/typedoc/functions/minBbox.html index e0b3ecd..0f866ba 100644 --- a/typedoc/functions/minBbox.html +++ b/typedoc/functions/minBbox.html @@ -1,16 +1,16 @@ -minBbox | @vladmandic/face-api - v1.7.1
    +minBbox | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -41,7 +41,7 @@

    Modules

    diff --git a/typedoc/functions/nonMaxSuppression.html b/typedoc/functions/nonMaxSuppression.html index 1e588ee..6c642a1 100644 --- a/typedoc/functions/nonMaxSuppression.html +++ b/typedoc/functions/nonMaxSuppression.html @@ -1,16 +1,16 @@ -nonMaxSuppression | @vladmandic/face-api - v1.7.1
    +nonMaxSuppression | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -47,7 +47,7 @@

    Modules

    diff --git a/typedoc/functions/normalize.html b/typedoc/functions/normalize.html index b837154..abbca27 100644 --- a/typedoc/functions/normalize.html +++ b/typedoc/functions/normalize.html @@ -1,16 +1,16 @@ -normalize | @vladmandic/face-api - v1.7.1
    +normalize | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -43,7 +43,7 @@

    Modules

    diff --git a/typedoc/functions/padToSquare.html b/typedoc/functions/padToSquare.html index 373006d..e0c3756 100644 --- a/typedoc/functions/padToSquare.html +++ b/typedoc/functions/padToSquare.html @@ -1,16 +1,16 @@ -padToSquare | @vladmandic/face-api - v1.7.1
    +padToSquare | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -52,7 +52,7 @@ both sides of the minor dimension oof the image.

    Modules

    diff --git a/typedoc/functions/predictAgeAndGender.html b/typedoc/functions/predictAgeAndGender.html index ac78f98..f2fd139 100644 --- a/typedoc/functions/predictAgeAndGender.html +++ b/typedoc/functions/predictAgeAndGender.html @@ -1,16 +1,16 @@ -predictAgeAndGender | @vladmandic/face-api - v1.7.1
    +predictAgeAndGender | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -45,7 +45,7 @@

    Modules

    diff --git a/typedoc/functions/recognizeFaceExpressions.html b/typedoc/functions/recognizeFaceExpressions.html index 3bbd32b..2d4fbf2 100644 --- a/typedoc/functions/recognizeFaceExpressions.html +++ b/typedoc/functions/recognizeFaceExpressions.html @@ -1,16 +1,16 @@ -recognizeFaceExpressions | @vladmandic/face-api - v1.7.1
    +recognizeFaceExpressions | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -45,7 +45,7 @@

    Modules

    diff --git a/typedoc/functions/resizeResults.html b/typedoc/functions/resizeResults.html index e55ba66..01551eb 100644 --- a/typedoc/functions/resizeResults.html +++ b/typedoc/functions/resizeResults.html @@ -1,16 +1,16 @@ -resizeResults | @vladmandic/face-api - v1.7.1
    +resizeResults | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -48,7 +48,7 @@

    Modules

    diff --git a/typedoc/functions/resolveInput.html b/typedoc/functions/resolveInput.html index b043d0d..30b2883 100644 --- a/typedoc/functions/resolveInput.html +++ b/typedoc/functions/resolveInput.html @@ -1,16 +1,16 @@ -resolveInput | @vladmandic/face-api - v1.7.1
    +resolveInput | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -41,7 +41,7 @@

    Modules

    diff --git a/typedoc/functions/shuffleArray.html b/typedoc/functions/shuffleArray.html index 8594d6a..e7a715d 100644 --- a/typedoc/functions/shuffleArray.html +++ b/typedoc/functions/shuffleArray.html @@ -1,16 +1,16 @@ -shuffleArray | @vladmandic/face-api - v1.7.1
    +shuffleArray | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -41,7 +41,7 @@

    Modules

    diff --git a/typedoc/functions/sigmoid.html b/typedoc/functions/sigmoid.html index a96fbdc..9902b8a 100644 --- a/typedoc/functions/sigmoid.html +++ b/typedoc/functions/sigmoid.html @@ -1,16 +1,16 @@ -sigmoid | @vladmandic/face-api - v1.7.1
    +sigmoid | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -41,7 +41,7 @@

    Modules

    diff --git a/typedoc/functions/ssdMobilenetv1-1.html b/typedoc/functions/ssdMobilenetv1-1.html index 8804e99..329a479 100644 --- a/typedoc/functions/ssdMobilenetv1-1.html +++ b/typedoc/functions/ssdMobilenetv1-1.html @@ -1,16 +1,16 @@ -ssdMobilenetv1 | @vladmandic/face-api - v1.7.1
    +ssdMobilenetv1 | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -51,7 +51,7 @@

    Modules

    diff --git a/typedoc/functions/tinyFaceDetector-1.html b/typedoc/functions/tinyFaceDetector-1.html index aa1bc0d..7c55b77 100644 --- a/typedoc/functions/tinyFaceDetector-1.html +++ b/typedoc/functions/tinyFaceDetector-1.html @@ -1,16 +1,16 @@ -tinyFaceDetector | @vladmandic/face-api - v1.7.1
    +tinyFaceDetector | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -51,7 +51,7 @@

    Modules

    diff --git a/typedoc/functions/tinyYolov2-1.html b/typedoc/functions/tinyYolov2-1.html index 798088e..3bf96f7 100644 --- a/typedoc/functions/tinyYolov2-1.html +++ b/typedoc/functions/tinyYolov2-1.html @@ -1,16 +1,16 @@ -tinyYolov2 | @vladmandic/face-api - v1.7.1
    +tinyYolov2 | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -51,7 +51,7 @@

    Modules

    diff --git a/typedoc/functions/toNetInput.html b/typedoc/functions/toNetInput.html index 557f6fd..970c0f4 100644 --- a/typedoc/functions/toNetInput.html +++ b/typedoc/functions/toNetInput.html @@ -1,16 +1,16 @@ -toNetInput | @vladmandic/face-api - v1.7.1
    +toNetInput | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -46,7 +46,7 @@ to be finished loading.

    Modules

    diff --git a/typedoc/functions/utils.computeReshapedDimensions.html b/typedoc/functions/utils.computeReshapedDimensions.html index 6aeb402..65807da 100644 --- a/typedoc/functions/utils.computeReshapedDimensions.html +++ b/typedoc/functions/utils.computeReshapedDimensions.html @@ -1,16 +1,16 @@ -computeReshapedDimensions | @vladmandic/face-api - v1.7.1
    +computeReshapedDimensions | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -44,7 +44,7 @@

    Modules

    diff --git a/typedoc/functions/utils.getCenterPoint.html b/typedoc/functions/utils.getCenterPoint.html index f769202..ff9deb6 100644 --- a/typedoc/functions/utils.getCenterPoint.html +++ b/typedoc/functions/utils.getCenterPoint.html @@ -1,16 +1,16 @@ -getCenterPoint | @vladmandic/face-api - v1.7.1
    +getCenterPoint | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -42,7 +42,7 @@

    Modules

    diff --git a/typedoc/functions/utils.isDimensions.html b/typedoc/functions/utils.isDimensions.html index 900ca37..dc21f76 100644 --- a/typedoc/functions/utils.isDimensions.html +++ b/typedoc/functions/utils.isDimensions.html @@ -1,16 +1,16 @@ -isDimensions | @vladmandic/face-api - v1.7.1
    +isDimensions | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -42,7 +42,7 @@

    Modules

    diff --git a/typedoc/functions/utils.isEven.html b/typedoc/functions/utils.isEven.html index e3e4c74..ef6a9df 100644 --- a/typedoc/functions/utils.isEven.html +++ b/typedoc/functions/utils.isEven.html @@ -1,16 +1,16 @@ -isEven | @vladmandic/face-api - v1.7.1
    +isEven | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -42,7 +42,7 @@

    Modules

    diff --git a/typedoc/functions/utils.isFloat.html b/typedoc/functions/utils.isFloat.html index 6cf4482..db7e04d 100644 --- a/typedoc/functions/utils.isFloat.html +++ b/typedoc/functions/utils.isFloat.html @@ -1,16 +1,16 @@ -isFloat | @vladmandic/face-api - v1.7.1
    +isFloat | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -42,7 +42,7 @@

    Modules

    diff --git a/typedoc/functions/utils.isTensor.html b/typedoc/functions/utils.isTensor.html index bc8f45f..087d4fc 100644 --- a/typedoc/functions/utils.isTensor.html +++ b/typedoc/functions/utils.isTensor.html @@ -1,16 +1,16 @@ -isTensor | @vladmandic/face-api - v1.7.1
    +isTensor | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -44,7 +44,7 @@

    Modules

    diff --git a/typedoc/functions/utils.isTensor1D.html b/typedoc/functions/utils.isTensor1D.html index 2d95c44..3b567b8 100644 --- a/typedoc/functions/utils.isTensor1D.html +++ b/typedoc/functions/utils.isTensor1D.html @@ -1,16 +1,16 @@ -isTensor1D | @vladmandic/face-api - v1.7.1
    +isTensor1D | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -42,7 +42,7 @@

    Modules

    diff --git a/typedoc/functions/utils.isTensor2D.html b/typedoc/functions/utils.isTensor2D.html index 6957aac..3bd26ec 100644 --- a/typedoc/functions/utils.isTensor2D.html +++ b/typedoc/functions/utils.isTensor2D.html @@ -1,16 +1,16 @@ -isTensor2D | @vladmandic/face-api - v1.7.1
    +isTensor2D | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -42,7 +42,7 @@

    Modules

    diff --git a/typedoc/functions/utils.isTensor3D.html b/typedoc/functions/utils.isTensor3D.html index 918b25c..aadd980 100644 --- a/typedoc/functions/utils.isTensor3D.html +++ b/typedoc/functions/utils.isTensor3D.html @@ -1,16 +1,16 @@ -isTensor3D | @vladmandic/face-api - v1.7.1
    +isTensor3D | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -42,7 +42,7 @@

    Modules

    diff --git a/typedoc/functions/utils.isTensor4D.html b/typedoc/functions/utils.isTensor4D.html index 0d2952d..68d4e00 100644 --- a/typedoc/functions/utils.isTensor4D.html +++ b/typedoc/functions/utils.isTensor4D.html @@ -1,16 +1,16 @@ -isTensor4D | @vladmandic/face-api - v1.7.1
    +isTensor4D | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -42,7 +42,7 @@

    Modules

    diff --git a/typedoc/functions/utils.isValidNumber.html b/typedoc/functions/utils.isValidNumber.html index e6f41dc..1672676 100644 --- a/typedoc/functions/utils.isValidNumber.html +++ b/typedoc/functions/utils.isValidNumber.html @@ -1,16 +1,16 @@ -isValidNumber | @vladmandic/face-api - v1.7.1
    +isValidNumber | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -42,7 +42,7 @@

    Modules

    diff --git a/typedoc/functions/utils.isValidProbablitiy.html b/typedoc/functions/utils.isValidProbablitiy.html index b7ce718..54588ae 100644 --- a/typedoc/functions/utils.isValidProbablitiy.html +++ b/typedoc/functions/utils.isValidProbablitiy.html @@ -1,16 +1,16 @@ -isValidProbablitiy | @vladmandic/face-api - v1.7.1
    +isValidProbablitiy | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -42,7 +42,7 @@

    Modules

    diff --git a/typedoc/functions/utils.range.html b/typedoc/functions/utils.range.html index 685e082..286f7d8 100644 --- a/typedoc/functions/utils.range.html +++ b/typedoc/functions/utils.range.html @@ -1,16 +1,16 @@ -range | @vladmandic/face-api - v1.7.1
    +range | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -46,7 +46,7 @@

    Modules

    diff --git a/typedoc/functions/utils.round.html b/typedoc/functions/utils.round.html index aab0ce0..5561b33 100644 --- a/typedoc/functions/utils.round.html +++ b/typedoc/functions/utils.round.html @@ -1,16 +1,16 @@ -round | @vladmandic/face-api - v1.7.1
    +round | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -44,7 +44,7 @@

    Modules

    diff --git a/typedoc/functions/validateConfig.html b/typedoc/functions/validateConfig.html index 8ae1892..f5f76cb 100644 --- a/typedoc/functions/validateConfig.html +++ b/typedoc/functions/validateConfig.html @@ -1,16 +1,16 @@ -validateConfig | @vladmandic/face-api - v1.7.1
    +validateConfig | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -41,7 +41,7 @@

    Modules

    diff --git a/typedoc/index.html b/typedoc/index.html index 21e3b50..97c3c16 100644 --- a/typedoc/index.html +++ b/typedoc/index.html @@ -1,15 +1,15 @@ -@vladmandic/face-api - v1.7.1
    +@vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    -

    @vladmandic/face-api - v1.7.1

    +

    @vladmandic/face-api - v1.7.2

    @@ -214,7 +214,7 @@

    Modules

    diff --git a/typedoc/interfaces/IBoundingBox.html b/typedoc/interfaces/IBoundingBox.html index 9d97c37..ecc2ae0 100644 --- a/typedoc/interfaces/IBoundingBox.html +++ b/typedoc/interfaces/IBoundingBox.html @@ -1,16 +1,16 @@ -IBoundingBox | @vladmandic/face-api - v1.7.1
    +IBoundingBox | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -74,7 +74,7 @@

    Modules

    diff --git a/typedoc/interfaces/IDimensions.html b/typedoc/interfaces/IDimensions.html index 6459c7a..d1c7036 100644 --- a/typedoc/interfaces/IDimensions.html +++ b/typedoc/interfaces/IDimensions.html @@ -1,16 +1,16 @@ -IDimensions | @vladmandic/face-api - v1.7.1
    +IDimensions | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -61,7 +61,7 @@

    Modules

    diff --git a/typedoc/interfaces/IFaceDetecion.html b/typedoc/interfaces/IFaceDetecion.html index 6d66177..9f6f0e3 100644 --- a/typedoc/interfaces/IFaceDetecion.html +++ b/typedoc/interfaces/IFaceDetecion.html @@ -1,16 +1,16 @@ -IFaceDetecion | @vladmandic/face-api - v1.7.1
    +IFaceDetecion | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -61,7 +61,7 @@

    Modules

    diff --git a/typedoc/interfaces/IFaceLandmarks.html b/typedoc/interfaces/IFaceLandmarks.html index 96b32a1..bcb7787 100644 --- a/typedoc/interfaces/IFaceLandmarks.html +++ b/typedoc/interfaces/IFaceLandmarks.html @@ -1,16 +1,16 @@ -IFaceLandmarks | @vladmandic/face-api - v1.7.1
    +IFaceLandmarks | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -61,7 +61,7 @@

    Modules

    diff --git a/typedoc/interfaces/IFaceMatch.html b/typedoc/interfaces/IFaceMatch.html index 867aae6..a8c7b74 100644 --- a/typedoc/interfaces/IFaceMatch.html +++ b/typedoc/interfaces/IFaceMatch.html @@ -1,16 +1,16 @@ -IFaceMatch | @vladmandic/face-api - v1.7.1
    +IFaceMatch | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -61,7 +61,7 @@

    Modules

    diff --git a/typedoc/interfaces/IPoint.html b/typedoc/interfaces/IPoint.html index c8fc3f4..5c2adef 100644 --- a/typedoc/interfaces/IPoint.html +++ b/typedoc/interfaces/IPoint.html @@ -1,16 +1,16 @@ -IPoint | @vladmandic/face-api - v1.7.1
    +IPoint | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -61,7 +61,7 @@

    Modules

    diff --git a/typedoc/interfaces/IRect.html b/typedoc/interfaces/IRect.html index 76dc3f3..82e5bbd 100644 --- a/typedoc/interfaces/IRect.html +++ b/typedoc/interfaces/IRect.html @@ -1,16 +1,16 @@ -IRect | @vladmandic/face-api - v1.7.1
    +IRect | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -74,7 +74,7 @@

    Modules

    diff --git a/typedoc/interfaces/ISsdMobilenetv1Options.html b/typedoc/interfaces/ISsdMobilenetv1Options.html index bb3543b..f4bdfc8 100644 --- a/typedoc/interfaces/ISsdMobilenetv1Options.html +++ b/typedoc/interfaces/ISsdMobilenetv1Options.html @@ -1,16 +1,16 @@ -ISsdMobilenetv1Options | @vladmandic/face-api - v1.7.1
    +ISsdMobilenetv1Options | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -57,7 +57,7 @@

    Modules

    diff --git a/typedoc/interfaces/ITinyYolov2Options.html b/typedoc/interfaces/ITinyYolov2Options.html index 120b9a7..a15026b 100644 --- a/typedoc/interfaces/ITinyYolov2Options.html +++ b/typedoc/interfaces/ITinyYolov2Options.html @@ -1,16 +1,16 @@ -ITinyYolov2Options | @vladmandic/face-api - v1.7.1
    +ITinyYolov2Options | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -57,7 +57,7 @@

    Modules

    diff --git a/typedoc/interfaces/draw.IDrawBoxOptions.html b/typedoc/interfaces/draw.IDrawBoxOptions.html index e784297..a2f80d7 100644 --- a/typedoc/interfaces/draw.IDrawBoxOptions.html +++ b/typedoc/interfaces/draw.IDrawBoxOptions.html @@ -1,16 +1,16 @@ -IDrawBoxOptions | @vladmandic/face-api - v1.7.1
    +IDrawBoxOptions | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -70,7 +70,7 @@

    Modules

    diff --git a/typedoc/interfaces/draw.IDrawFaceLandmarksOptions.html b/typedoc/interfaces/draw.IDrawFaceLandmarksOptions.html index c525747..0db2678 100644 --- a/typedoc/interfaces/draw.IDrawFaceLandmarksOptions.html +++ b/typedoc/interfaces/draw.IDrawFaceLandmarksOptions.html @@ -1,16 +1,16 @@ -IDrawFaceLandmarksOptions | @vladmandic/face-api - v1.7.1
    +IDrawFaceLandmarksOptions | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -82,7 +82,7 @@

    Modules

    diff --git a/typedoc/interfaces/draw.IDrawTextFieldOptions.html b/typedoc/interfaces/draw.IDrawTextFieldOptions.html index 7b091c5..7eac8ea 100644 --- a/typedoc/interfaces/draw.IDrawTextFieldOptions.html +++ b/typedoc/interfaces/draw.IDrawTextFieldOptions.html @@ -1,16 +1,16 @@ -IDrawTextFieldOptions | @vladmandic/face-api - v1.7.1
    +IDrawTextFieldOptions | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -86,7 +86,7 @@

    Modules

    diff --git a/typedoc/modules/draw.html b/typedoc/modules/draw.html index 0beb110..7ea90c0 100644 --- a/typedoc/modules/draw.html +++ b/typedoc/modules/draw.html @@ -1,16 +1,16 @@ -draw | @vladmandic/face-api - v1.7.1
    +draw | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    AgeAndGenderPrediction: { age: number; gender: Gender; genderProbability: number }
    @@ -41,7 +41,7 @@

    Modules

    diff --git a/typedoc/types/BatchNorm.html b/typedoc/types/BatchNorm.html index cf07b81..de6e6c4 100644 --- a/typedoc/types/BatchNorm.html +++ b/typedoc/types/BatchNorm.html @@ -1,16 +1,16 @@ -BatchNorm | @vladmandic/face-api - v1.7.1
    +BatchNorm | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    BatchNorm: { sub: tf.Tensor1D; truediv: tf.Tensor1D }
    @@ -39,7 +39,7 @@

    Modules

    diff --git a/typedoc/types/ConvWithBatchNorm.html b/typedoc/types/ConvWithBatchNorm.html index 83c8f9f..02b851f 100644 --- a/typedoc/types/ConvWithBatchNorm.html +++ b/typedoc/types/ConvWithBatchNorm.html @@ -1,16 +1,16 @@ -ConvWithBatchNorm | @vladmandic/face-api - v1.7.1
    +ConvWithBatchNorm | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    ConvWithBatchNorm: { bn: BatchNorm; conv: ConvParams }
    @@ -39,7 +39,7 @@

    Modules

    diff --git a/typedoc/types/DefaultTinyYolov2NetParams.html b/typedoc/types/DefaultTinyYolov2NetParams.html index 344c646..252e123 100644 --- a/typedoc/types/DefaultTinyYolov2NetParams.html +++ b/typedoc/types/DefaultTinyYolov2NetParams.html @@ -1,16 +1,16 @@ -DefaultTinyYolov2NetParams | @vladmandic/face-api - v1.7.1
    +DefaultTinyYolov2NetParams | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    DefaultTinyYolov2NetParams: { conv0: ConvWithBatchNorm; conv1: ConvWithBatchNorm; conv2: ConvWithBatchNorm; conv3: ConvWithBatchNorm; conv4: ConvWithBatchNorm; conv5: ConvWithBatchNorm; conv6: ConvWithBatchNorm; conv7: ConvWithBatchNorm; conv8: ConvParams }
    @@ -53,7 +53,7 @@

    Modules

    diff --git a/typedoc/types/Environment.html b/typedoc/types/Environment.html index c9c5473..c8dd3b4 100644 --- a/typedoc/types/Environment.html +++ b/typedoc/types/Environment.html @@ -1,16 +1,16 @@ -Environment | @vladmandic/face-api - v1.7.1
    +Environment | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    Environment: FileSystem & { Canvas: typeof HTMLCanvasElement; CanvasRenderingContext2D: typeof CanvasRenderingContext2D; Image: typeof HTMLImageElement; ImageData: typeof ImageData; Video: typeof HTMLVideoElement; createCanvasElement: (() => HTMLCanvasElement); createImageElement: (() => HTMLImageElement); createVideoElement: (() => HTMLVideoElement); fetch: ((url: string, init?: RequestInit) => Promise<Response>) }
    FaceDetectionFunction: ((input: TNetInput) => Promise<FaceDetection[]>)
    @@ -45,7 +45,7 @@

    Modules

    diff --git a/typedoc/types/FaceDetectionOptions.html b/typedoc/types/FaceDetectionOptions.html index 865bb6e..9ae4411 100644 --- a/typedoc/types/FaceDetectionOptions.html +++ b/typedoc/types/FaceDetectionOptions.html @@ -1,16 +1,16 @@ -FaceDetectionOptions | @vladmandic/face-api - v1.7.1
    +FaceDetectionOptions | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    FileSystem: { readFile: ((filePath: string) => Promise<any>) }
    @@ -48,7 +48,7 @@

    Modules

    diff --git a/typedoc/types/ITinyFaceDetectorOptions.html b/typedoc/types/ITinyFaceDetectorOptions.html index e7888b8..469cf6d 100644 --- a/typedoc/types/ITinyFaceDetectorOptions.html +++ b/typedoc/types/ITinyFaceDetectorOptions.html @@ -1,16 +1,16 @@ -ITinyFaceDetectorOptions | @vladmandic/face-api - v1.7.1
    +ITinyFaceDetectorOptions | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    ITinyFaceDetectorOptions: ITinyYolov2Options
    MobilenetParams: { conv0: SeparableConvParams | ConvParams; conv1: SeparableConvParams; conv2: SeparableConvParams; conv3: SeparableConvParams; conv4: SeparableConvParams; conv5: SeparableConvParams; conv6?: SeparableConvParams; conv7?: SeparableConvParams; conv8: ConvParams }
    @@ -53,7 +53,7 @@

    Modules

    diff --git a/typedoc/types/NetOutput.html b/typedoc/types/NetOutput.html index be334f2..29b770d 100644 --- a/typedoc/types/NetOutput.html +++ b/typedoc/types/NetOutput.html @@ -1,16 +1,16 @@ -NetOutput | @vladmandic/face-api - v1.7.1
    +NetOutput | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    NetOutput: { age: tf.Tensor1D; gender: tf.Tensor2D }
    @@ -39,7 +39,7 @@

    Modules

    diff --git a/typedoc/types/NetParams.html b/typedoc/types/NetParams.html index 2f0f134..847b043 100644 --- a/typedoc/types/NetParams.html +++ b/typedoc/types/NetParams.html @@ -1,16 +1,16 @@ -NetParams | @vladmandic/face-api - v1.7.1
    +NetParams | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    NetParams: { fc: { age: FCParams; gender: FCParams } }
    @@ -42,7 +42,7 @@

    Modules

    diff --git a/typedoc/types/TMediaElement.html b/typedoc/types/TMediaElement.html index 7d0fd8b..fc67e15 100644 --- a/typedoc/types/TMediaElement.html +++ b/typedoc/types/TMediaElement.html @@ -1,16 +1,16 @@ -TMediaElement | @vladmandic/face-api - v1.7.1
    +TMediaElement | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    TMediaElement: HTMLImageElement | HTMLVideoElement | HTMLCanvasElement
    TNetInput: TNetInputArg | TNetInputArg[] | NetInput | tf.Tensor4D
    TNetInputArg: string | TResolvedNetInput
    TResolvedNetInput: TMediaElement | tf.Tensor3D | tf.Tensor4D
    TinyYolov2Config: { anchors: Point[]; classes: string[]; filterSizes?: number[]; iouThreshold: number; isFirstLayerConv2d?: boolean; meanRgb?: [number, number, number]; withClassScores?: boolean; withSeparableConvs: boolean }
    @@ -51,7 +51,7 @@

    Modules

    diff --git a/typedoc/types/TinyYolov2NetParams.html b/typedoc/types/TinyYolov2NetParams.html index 079268d..e11cb61 100644 --- a/typedoc/types/TinyYolov2NetParams.html +++ b/typedoc/types/TinyYolov2NetParams.html @@ -1,16 +1,16 @@ -TinyYolov2NetParams | @vladmandic/face-api - v1.7.1
    +TinyYolov2NetParams | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    WithAge<TSource>: TSource & { age: number }
    @@ -36,7 +36,7 @@

    Modules

    diff --git a/typedoc/types/WithFaceDescriptor.html b/typedoc/types/WithFaceDescriptor.html index 464a0d4..7354c25 100644 --- a/typedoc/types/WithFaceDescriptor.html +++ b/typedoc/types/WithFaceDescriptor.html @@ -1,16 +1,16 @@ -WithFaceDescriptor | @vladmandic/face-api - v1.7.1
    +WithFaceDescriptor | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    WithFaceDescriptor<TSource>: TSource & { descriptor: Float32Array }
    @@ -36,7 +36,7 @@

    Modules

    diff --git a/typedoc/types/WithFaceDetection.html b/typedoc/types/WithFaceDetection.html index d49c608..1d9e07c 100644 --- a/typedoc/types/WithFaceDetection.html +++ b/typedoc/types/WithFaceDetection.html @@ -1,16 +1,16 @@ -WithFaceDetection | @vladmandic/face-api - v1.7.1
    +WithFaceDetection | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    WithFaceDetection<TSource>: TSource & { detection: FaceDetection }
    @@ -36,7 +36,7 @@

    Modules

    diff --git a/typedoc/types/WithFaceExpressions.html b/typedoc/types/WithFaceExpressions.html index cf534b9..5ec800e 100644 --- a/typedoc/types/WithFaceExpressions.html +++ b/typedoc/types/WithFaceExpressions.html @@ -1,16 +1,16 @@ -WithFaceExpressions | @vladmandic/face-api - v1.7.1
    +WithFaceExpressions | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    WithFaceExpressions<TSource>: TSource & { expressions: FaceExpressions }
    @@ -36,7 +36,7 @@

    Modules

    diff --git a/typedoc/types/WithFaceLandmarks.html b/typedoc/types/WithFaceLandmarks.html index b2cbb2d..b1a79f3 100644 --- a/typedoc/types/WithFaceLandmarks.html +++ b/typedoc/types/WithFaceLandmarks.html @@ -1,16 +1,16 @@ -WithFaceLandmarks | @vladmandic/face-api - v1.7.1
    +WithFaceLandmarks | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2

    Type alias WithFaceLandmarks<TSource, TFaceLandmarks>

    WithFaceLandmarks<TSource, TFaceLandmarks>: TSource & { alignedRect: FaceDetection; angle: { pitch: number | undefined; roll: number | undefined; yaw: number | undefined }; landmarks: TFaceLandmarks; unshiftedLandmarks: TFaceLandmarks }
    @@ -38,7 +38,7 @@

    Modules

    diff --git a/typedoc/types/WithGender.html b/typedoc/types/WithGender.html index 60e6c6b..9c25063 100644 --- a/typedoc/types/WithGender.html +++ b/typedoc/types/WithGender.html @@ -1,16 +1,16 @@ -WithGender | @vladmandic/face-api - v1.7.1
    +WithGender | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    WithGender<TSource>: TSource & { gender: Gender; genderProbability: number }
    @@ -36,7 +36,7 @@

    Modules

    diff --git a/typedoc/types/draw.DrawFaceExpressionsInput.html b/typedoc/types/draw.DrawFaceExpressionsInput.html index f7174ad..275d6dc 100644 --- a/typedoc/types/draw.DrawFaceExpressionsInput.html +++ b/typedoc/types/draw.DrawFaceExpressionsInput.html @@ -1,16 +1,16 @@ -DrawFaceExpressionsInput | @vladmandic/face-api - v1.7.1
    +DrawFaceExpressionsInput | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -33,7 +33,7 @@

    Modules

    diff --git a/typedoc/types/draw.DrawFaceLandmarksInput.html b/typedoc/types/draw.DrawFaceLandmarksInput.html index ef57852..b68918f 100644 --- a/typedoc/types/draw.DrawFaceLandmarksInput.html +++ b/typedoc/types/draw.DrawFaceLandmarksInput.html @@ -1,16 +1,16 @@ -DrawFaceLandmarksInput | @vladmandic/face-api - v1.7.1
    +DrawFaceLandmarksInput | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -33,7 +33,7 @@

    Modules

    diff --git a/typedoc/types/draw.TDrawDetectionsInput.html b/typedoc/types/draw.TDrawDetectionsInput.html index 1295a14..f7896c2 100644 --- a/typedoc/types/draw.TDrawDetectionsInput.html +++ b/typedoc/types/draw.TDrawDetectionsInput.html @@ -1,16 +1,16 @@ -TDrawDetectionsInput | @vladmandic/face-api - v1.7.1
    +TDrawDetectionsInput | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    @@ -33,7 +33,7 @@

    Modules

    diff --git a/typedoc/variables/FACE_EXPRESSION_LABELS.html b/typedoc/variables/FACE_EXPRESSION_LABELS.html index 0c0bf09..a978c7e 100644 --- a/typedoc/variables/FACE_EXPRESSION_LABELS.html +++ b/typedoc/variables/FACE_EXPRESSION_LABELS.html @@ -1,16 +1,16 @@ -FACE_EXPRESSION_LABELS | @vladmandic/face-api - v1.7.1
    +FACE_EXPRESSION_LABELS | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    FACE_EXPRESSION_LABELS: string[] = ...
    env: { createBrowserEnv: (() => Environment); createFileSystem: ((fs?: any) => FileSystem); createNodejsEnv: (() => Environment); getEnv: (() => Environment); initialize: (() => null | void); isBrowser: (() => boolean); isNodejs: (() => boolean); monkeyPatch: ((env: Partial<Environment>) => void); setEnv: ((env: Environment) => void) } = ...
    @@ -122,7 +122,7 @@

    Modules

    diff --git a/typedoc/variables/nets.html b/typedoc/variables/nets.html index 7c5c05f..7d88b29 100644 --- a/typedoc/variables/nets.html +++ b/typedoc/variables/nets.html @@ -1,16 +1,16 @@ -nets | @vladmandic/face-api - v1.7.1
    +nets | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2
    nets: { ageGenderNet: AgeGenderNet; faceExpressionNet: FaceExpressionNet; faceLandmark68Net: FaceLandmark68Net; faceLandmark68TinyNet: FaceLandmark68TinyNet; faceRecognitionNet: FaceRecognitionNet; ssdMobilenetv1: SsdMobilenetv1; tinyFaceDetector: TinyFaceDetector; tinyYolov2: TinyYolov2 } = ...
    @@ -51,7 +51,7 @@

    Modules

    diff --git a/typedoc/variables/version.html b/typedoc/variables/version.html index 4f85e80..4669da2 100644 --- a/typedoc/variables/version.html +++ b/typedoc/variables/version.html @@ -1,16 +1,16 @@ -version | @vladmandic/face-api - v1.7.1
    +version | @vladmandic/face-api - v1.7.2
    +
  • The search index is not available
  • @vladmandic/face-api - v1.7.2