= "+s[u-1]+") {\n return getChannel(\n getT"+u+"("+Ii(a,c,f)+"),\n vec2("+Ii(l,c,f)+"));\n }"}var d=s.length,v=s[s.length-1];p+="\n return getChannel(\n getT"+d+"("+Ii(a,c,v)+"),\n vec2("+Ii(l,c,v)+"));",this.userCode="\n float getValue("+a.map(function(t){return"int "+t})+") {\n "+p+"\n }\n\n void main() {\n "+o+" coords = getOutputCoords();\n vec4 result = vec4(getValue("+i+"), 0., 0., 0.);\n\n "+i[r-1]+" = "+i[r-1]+" + 1;\n if ("+i[r-1]+" < "+n[r-1]+") {\n result.g = getValue("+i+");\n }\n\n "+i[r-2]+" = "+i[r-2]+" + 1;\n if ("+i[r-2]+" < "+n[r-2]+") {\n result.a = getValue("+i+");\n }\n\n "+i[r-1]+" = "+i[r-1]+" - 1;\n if ("+i[r-2]+" < "+n[r-2]+" &&\n "+i[r-1]+" < "+n[r-1]+") {\n result.b = getValue("+i+");\n }\n setOutput(result);\n }\n "}var mi="return a + b;",gi="return a - b;",yi="return a * b;",xi="return (a < 0.) ? b * a : a;",bi="\n vec4 aLessThanZero = vec4(lessThan(a, vec4(0.)));\n return (aLessThanZero * (b * a)) + ((vec4(1.0) - aLessThanZero) * a);\n",wi=(_i.prototype.getCustomSetupFunc=function(n,r){var o=this;return function(t,e){null==o.minLoc&&(o.minLoc=t.getUniformLocationNoThrow(e,"minVal"),o.maxLoc=t.getUniformLocationNoThrow(e,"maxVal")),t.gl.uniform1f(o.minLoc,n),t.gl.uniform1f(o.maxLoc,r)}},_i),Ci=(Ei.prototype.getCustomSetupFunc=function(n,r){var o=this;return function(t,e){null==o.minLoc&&(o.minLoc=t.getUniformLocationNoThrow(e,"minVal"),o.maxLoc=t.getUniformLocationNoThrow(e,"maxVal")),t.gl.uniform1f(o.minLoc,n),t.gl.uniform1f(o.maxLoc,r)}},Ei);function Ei(t){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=t,this.userCode="\n uniform float minVal;\n uniform float maxVal;\n\n void main() {\n vec4 value = getAAtOutCoords();\n\n if (any(isnan(value))) {\n setOutput(value);\n return;\n }\n\n setOutput(clamp(value, vec4(minVal), vec4(maxVal)));\n }\n "}function _i(t){this.variableNames=["A"],this.outputShape=t,this.userCode="\n uniform float minVal;\n uniform float maxVal;\n\n void main() {\n float value = getAAtOutCoords();\n if (isnan(value)) {\n setOutput(value);\n return;\n }\n\n setOutput(clamp(value, minVal, maxVal));\n }\n "}function Ii(t,e,n){var r=t.indexOf(e);return t.map(function(t,e){return e===r?t+" - "+n:t}).join()}function Ri(t){this.variableNames=["x","dy"],this.outputShape=t.filterShape;var e=t.strideHeight,n=t.strideWidth,r=t.padInfo.top,o=t.padInfo.left,i="channelsLast"===t.dataFormat;this.userCode="\n void main() {\n ivec4 coords = getOutputCoords();\n int wR = coords.x;\n int wC = coords.y;\n int d1 = coords.z;\n int d2 = coords.w;\n\n // Convolve x(?, ?, d1) with dy(:, :, d2) to get dw(wR, wC, d1, d2).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n\n for (int b = 0; b < "+t.batchSize+"; b++) {\n for (int yR = 0; yR < "+t.outHeight+"; yR++) {\n int xR = wR + yR * "+e+" - "+r+";\n\n if (xR < 0 || xR >= "+t.inHeight+") {\n continue;\n }\n\n for (int yC = 0; yC < "+t.outWidth+"; yC++) {\n int xC = wC + yC * "+n+" - "+o+";\n\n if (xC < 0 || xC >= "+t.inWidth+") {\n continue;\n }\n\n if ("+i+") {\n float dyValue = getDy(b, yR, yC, d2);\n float xValue = getX(b, xR, xC, d1);\n dotProd += (xValue * dyValue);\n } else {\n float dyValue = getDy(b, d2, yR, yC);\n float xValue = getX(b, d1, xR, xC);\n dotProd += (xValue * dyValue);\n }\n\n }\n }\n }\n setOutput(dotProd);\n }\n "}function ki(t){this.variableNames=["dy","W"],this.outputShape=t.inShape;var e=t.filterHeight,n=t.filterWidth,r=t.strideHeight,o=t.strideWidth,i="channelsLast"===t.dataFormat,a=e-1-t.padInfo.top,s=n-1-t.padInfo.left,u=i?1:2,c=i?2:3,l=i?3:1;this.userCode="\n const ivec2 pads = ivec2("+a+", "+s+");\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords[0];\n int d1 = coords["+l+"];\n\n ivec2 dyCorner = ivec2(coords["+u+"], coords["+c+"]) - pads;\n int dyRCorner = dyCorner.x;\n int dyCCorner = dyCorner.y;\n\n // Convolve dy(?, ?, d2) with w(:, :, d1, d2) to compute dx(xR, xC, d1).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n for (int wR = 0; wR < "+e+"; wR++) {\n float dyR = float(dyRCorner + wR) / "+r+".0;\n\n if (dyR < 0.0 || dyR >= "+t.outHeight+".0 || fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n int wRPerm = "+e+" - 1 - wR;\n\n for (int wC = 0; wC < "+n+"; wC++) {\n float dyC = float(dyCCorner + wC) / "+o+".0;\n\n if (dyC < 0.0 || dyC >= "+t.outWidth+".0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n int wCPerm = "+n+" - 1 - wC;\n\n for (int d2 = 0; d2 < "+t.outChannels+"; d2++) {\n\n if ("+i+") {\n float xValue = getDy(batch, idyR, idyC, d2);\n float wValue = getW(wRPerm, wCPerm, d1, d2);\n dotProd += xValue * wValue;\n } else {\n float xValue = getDy(batch, d2, idyR, idyC);\n float wValue = getW(wRPerm, wCPerm, d1, d2);\n dotProd += xValue * wValue;\n }\n\n }\n }\n }\n setOutput(dotProd);\n }\n "}function Si(t){this.variableNames=["x","dy"],this.outputShape=t.filterShape;var e=t.strideDepth,n=t.strideHeight,r=t.strideWidth,o=t.padInfo.front,i=t.padInfo.top,a=t.padInfo.left;this.userCode="\n void main() {\n ivec5 coords = getOutputCoords();\n int wF = coords.x;\n int wR = coords.y;\n int wC = coords.z;\n int d1 = coords.w;\n int d2 = coords.u;\n\n float dotProd = 0.0;\n\n for (int b = 0; b < "+t.batchSize+"; b++) {\n for (int yF = 0; yF < "+t.outDepth+"; yF++) {\n int xF = wF + yF * "+e+" - "+o+";\n\n if (xF < 0 || xF >= "+t.inDepth+") {\n continue;\n }\n\n for (int yR = 0; yR < "+t.outHeight+"; yR++) {\n int xR = wR + yR * "+n+" - "+i+";\n\n if (xR < 0 || xR >= "+t.inHeight+") {\n continue;\n }\n\n for (int yC = 0; yC < "+t.outWidth+"; yC++) {\n int xC = wC + yC * "+r+" - "+a+";\n\n if (xC < 0 || xC >= "+t.inWidth+") {\n continue;\n }\n\n float dyValue = getDy(b, yF, yR, yC, d2);\n float xValue = getX(b, xF, xR, xC, d1);\n dotProd += (xValue * dyValue);\n }\n }\n }\n }\n setOutput(dotProd);\n }\n "}function Di(t){this.variableNames=["dy","W"],this.outputShape=t.inShape;var e=t.filterDepth,n=t.filterHeight,r=t.filterWidth,o=t.strideDepth,i=t.strideHeight,a=t.strideWidth,s=e-1-t.padInfo.front,u=n-1-t.padInfo.top,c=r-1-t.padInfo.left;this.userCode="\n const ivec3 pads = ivec3("+s+", "+u+", "+c+");\n\n void main() {\n ivec5 coords = getOutputCoords();\n int batch = coords.x;\n int d1 = coords.u;\n\n\n ivec3 dyCorner = ivec3(coords.y, coords.z, coords.w) - pads;\n int dyFCorner = dyCorner.x;\n int dyRCorner = dyCorner.y;\n int dyCCorner = dyCorner.z;\n\n float dotProd = 0.0;\n for (int wF = 0; wF < "+e+"; wF++) {\n float dyF = float(dyFCorner + wF) / "+o+".0;\n\n if (dyF < 0.0 || dyF >= "+t.outDepth+".0 || fract(dyF) > 0.0) {\n continue;\n }\n int idyF = int(dyF);\n\n int wFPerm = "+e+" - 1 - wF;\n\n for (int wR = 0; wR < "+n+"; wR++) {\n float dyR = float(dyRCorner + wR) / "+i+".0;\n\n if (dyR < 0.0 || dyR >= "+t.outHeight+".0 ||\n fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n int wRPerm = "+n+" - 1 - wR;\n\n for (int wC = 0; wC < "+r+"; wC++) {\n float dyC = float(dyCCorner + wC) / "+a+".0;\n\n if (dyC < 0.0 || dyC >= "+t.outWidth+".0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n int wCPerm = "+r+" - 1 - wC;\n\n for (int d2 = 0; d2 < "+t.outChannels+"; d2++) {\n float xValue = getDy(batch, idyF, idyR, idyC, d2);\n float wValue = getW(wFPerm, wRPerm, wCPerm, d1, d2);\n dotProd += xValue * wValue;\n }\n }\n }\n }\n setOutput(dotProd);\n }\n "}function Ai(t){this.variableNames=["x","dy"],this.outputShape=t.filterShape;var e=t.strideHeight,n=t.strideWidth,r=t.padInfo.top,o=t.padInfo.left,i=t.outChannels/t.inChannels;this.userCode="\n void main() {\n ivec4 coords = getOutputCoords();\n int wR = coords.x;\n int wC = coords.y;\n int d1 = coords.z;\n int dm = coords.w;\n int d2 = d1 * "+i+" + dm;\n\n float dotProd = 0.0;\n\n // TO DO: Vec4 over the batch size\n for (int b = 0; b < "+t.batchSize+"; b++) {\n for (int yR = 0; yR < "+t.outHeight+"; yR++) {\n int xR = wR + yR * "+e+" - "+r+";\n\n if (xR < 0 || xR >= "+t.inHeight+") {\n continue;\n }\n\n for (int yC = 0; yC < "+t.outWidth+"; yC++) {\n int xC = wC + yC * "+n+" - "+o+";\n\n if (xC < 0 || xC >= "+t.inWidth+") {\n continue;\n }\n\n float dyValue = getDy(b, yR, yC, d2);\n float xValue = getX(b, xR, xC, d1);\n dotProd += (xValue * dyValue);\n }\n }\n }\n setOutput(dotProd);\n }\n "}function Ti(t){this.variableNames=["dy","W"],this.outputShape=t.inShape;var e=t.filterHeight,n=t.filterWidth,r=t.strideHeight,o=t.strideWidth,i=e-1-t.padInfo.top,a=n-1-t.padInfo.left,s=t.outChannels/t.inChannels;this.userCode="\n const ivec2 pads = ivec2("+i+", "+a+");\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords[0];\n int d1 = coords[3];\n ivec2 dyCorner = coords.yz - pads;\n int dyRCorner = dyCorner.x;\n int dyCCorner = dyCorner.y;\n\n float dotProd = 0.0;\n\n for (int wR = 0; wR < "+e+"; wR++) {\n float dyR = float(dyRCorner + wR) / "+r+".0;\n\n if (dyR < 0.0 || dyR >= "+t.outHeight+".0 || fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n int wRPerm = "+e+" - 1 - wR;\n\n for (int wC = 0; wC < "+n+"; wC++) {\n float dyC = float(dyCCorner + wC) / "+o+".0;\n\n if (dyC < 0.0 || dyC >= "+t.outWidth+".0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n int wCPerm = "+n+" - 1 - wC;\n\n // TO DO: Vec4 over the channelMul\n for (int dm = 0; dm < "+s+"; dm++) {\n int d2 = d1 * "+s+" + dm;\n float xValue = getDy(batch, idyR, idyC, d2);\n float wValue = getW(wRPerm, wCPerm, d1, dm);\n dotProd += xValue * wValue;\n }\n }\n }\n setOutput(dotProd);\n }\n "}function Ni(t,e,n,r){void 0===e&&(e=!1),void 0===n&&(n=null),void 0===r&&(r=!1),this.variableNames=["x","W"],this.outputShape=t.outShape;var o=t.padInfo.top,i=t.padInfo.left,a=t.strideHeight,s=t.strideWidth,u=t.dilationHeight,c=t.dilationWidth,l=t.filterHeight,h=t.filterWidth,p=4*Math.floor(t.inChannels/4),f=t.inChannels%4,d="channelsLast"===t.dataFormat,v=d?1:2,m=d?2:3,g=d?3:1,y="",x="";n&&(y=r?"float activation(float a) {\n float b = getPreluActivationWeightsAtOutCoords();\n "+n+"\n }":"\n float activation(float x) {\n "+n+"\n }\n ",x="result = activation(result);");var b=e?"result += getBiasAtOutCoords();":"";e&&this.variableNames.push("bias"),r&&this.variableNames.push("preluActivationWeights"),this.userCode="\n "+y+"\n\n const ivec2 strides = ivec2("+a+", "+s+");\n const ivec2 pads = ivec2("+o+", "+i+");\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords[0];\n int d2 = coords["+g+"];\n\n ivec2 xRCCorner =\n ivec2(coords["+v+"], coords["+m+"]) * strides - pads;\n int xRCorner = xRCCorner.x;\n int xCCorner = xRCCorner.y;\n\n // Convolve x(?, ?, d1) with w(:, :, d1, d2) to get y(yR, yC, d2).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n for (int wR = 0; wR < "+l+"; wR++) {\n int xR = xRCorner + wR * "+u+";\n\n if (xR < 0 || xR >= "+t.inHeight+") {\n continue;\n }\n\n for (int wC = 0; wC < "+h+"; wC++) {\n int xC = xCCorner + wC * "+c+";\n\n if (xC < 0 || xC >= "+t.inWidth+") {\n continue;\n }\n\n for (int d1 = 0; d1 < "+p+"; d1 += 4) {\n vec4 wValues = vec4(\n getW(wR, wC, d1, d2),\n getW(wR, wC, d1 + 1, d2),\n getW(wR, wC, d1 + 2, d2),\n getW(wR, wC, d1 + 3, d2)\n );\n\n if ("+d+") {\n vec4 xValues = vec4(\n getX(batch, xR, xC, d1),\n getX(batch, xR, xC, d1 + 1),\n getX(batch, xR, xC, d1 + 2),\n getX(batch, xR, xC, d1 + 3)\n );\n dotProd += dot(xValues, wValues);\n } else {\n vec4 xValues = vec4(\n getX(batch, d1, xR, xC),\n getX(batch, d1 + 1, xR, xC),\n getX(batch, d1 + 2, xR, xC),\n getX(batch, d1 + 3, xR, xC)\n );\n dotProd += dot(xValues, wValues);\n }\n }\n\n if ("+(1==f)+") {\n\n if ("+d+") {\n dotProd +=\n getX(batch, xR, xC, "+p+") *\n getW(wR, wC, "+p+", d2);\n } else {\n dotProd +=\n getX(batch, "+p+", xR, xC) *\n getW(wR, wC, "+p+", d2);\n }\n\n } else if ("+(2==f)+") {\n vec2 wValues = vec2(\n getW(wR, wC, "+p+", d2),\n getW(wR, wC, "+p+" + 1, d2)\n );\n\n if ("+d+") {\n vec2 xValues = vec2(\n getX(batch, xR, xC, "+p+"),\n getX(batch, xR, xC, "+p+" + 1)\n );\n dotProd += dot(xValues, wValues);\n } else {\n vec2 xValues = vec2(\n getX(batch, "+p+", xR, xC),\n getX(batch, "+p+" + 1, xR, xC)\n );\n dotProd += dot(xValues, wValues);\n }\n\n } else if ("+(3==f)+") {\n vec3 wValues = vec3(\n getW(wR, wC, "+p+", d2),\n getW(wR, wC, "+p+" + 1, d2),\n getW(wR, wC, "+p+" + 2, d2)\n );\n\n if ("+d+") {\n vec3 xValues = vec3(\n getX(batch, xR, xC, "+p+"),\n getX(batch, xR, xC, "+p+" + 1),\n getX(batch, xR, xC, "+p+" + 2)\n );\n dotProd += dot(xValues, wValues);\n } else {\n vec3 xValues = vec3(\n getX(batch, "+p+", xR, xC),\n getX(batch, "+p+" + 1, xR, xC),\n getX(batch, "+p+" + 2, xR, xC)\n );\n dotProd += dot(xValues, wValues);\n }\n\n }\n }\n }\n\n float result = dotProd;\n "+b+"\n "+x+"\n setOutput(result);\n }\n "}function Fi(t){this.variableNames=["x","W"],this.outputShape=t.outShape;var e=t.padInfo.front,n=t.padInfo.top,r=t.padInfo.left,o=t.strideDepth,i=t.strideHeight,a=t.strideWidth,s=t.dilationDepth,u=t.dilationHeight,c=t.dilationWidth,l=t.filterDepth,h=t.filterHeight,p=t.filterWidth,f=4*Math.floor(t.inChannels/4),d=t.inChannels%4;this.userCode="\n const ivec3 strides = ivec3("+o+", "+i+", "+a+");\n const ivec3 pads = ivec3("+e+", "+n+", "+r+");\n\n void main() {\n ivec5 coords = getOutputCoords();\n int batch = coords.x;\n int d2 = coords.u;\n\n ivec3 xFRCCorner = ivec3(coords.y, coords.z, coords.w) * strides - pads;\n int xFCorner = xFRCCorner.x;\n int xRCorner = xFRCCorner.y;\n int xCCorner = xFRCCorner.z;\n\n // Convolve x(?, ?, ?, d1) with w(:, :, :, d1, d2) to get\n // y(yF, yR, yC, d2). ? = to be determined. : = across all\n // values in that axis.\n float dotProd = 0.0;\n for (int wF = 0; wF < "+l+"; wF++) {\n int xF = xFCorner + wF * "+s+";\n\n if (xF < 0 || xF >= "+t.inDepth+") {\n continue;\n }\n\n for (int wR = 0; wR < "+h+"; wR++) {\n int xR = xRCorner + wR * "+u+";\n\n if (xR < 0 || xR >= "+t.inHeight+") {\n continue;\n }\n\n for (int wC = 0; wC < "+p+"; wC++) {\n int xC = xCCorner + wC * "+c+";\n\n if (xC < 0 || xC >= "+t.inWidth+") {\n continue;\n }\n\n for (int d1 = 0; d1 < "+f+"; d1 += 4) {\n vec4 xValues = vec4(\n getX(batch, xF, xR, xC, d1),\n getX(batch, xF, xR, xC, d1 + 1),\n getX(batch, xF, xR, xC, d1 + 2),\n getX(batch, xF, xR, xC, d1 + 3)\n );\n vec4 wValues = vec4(\n getW(wF, wR, wC, d1, d2),\n getW(wF, wR, wC, d1 + 1, d2),\n getW(wF, wR, wC, d1 + 2, d2),\n getW(wF, wR, wC, d1 + 3, d2)\n );\n\n dotProd += dot(xValues, wValues);\n }\n\n if ("+(1==d)+") {\n dotProd +=\n getX(batch, xF, xR, xC, "+f+") *\n getW(wF, wR, wC, "+f+", d2);\n } else if ("+(2==d)+") {\n vec2 xValues = vec2(\n getX(batch, xF, xR, xC, "+f+"),\n getX(batch, xF, xR, xC, "+f+" + 1)\n );\n vec2 wValues = vec2(\n getW(wF, wR, wC, "+f+", d2),\n getW(wF, wR, wC, "+f+" + 1, d2)\n );\n dotProd += dot(xValues, wValues);\n } else if ("+(3==d)+") {\n vec3 xValues = vec3(\n getX(batch, xF, xR, xC, "+f+"),\n getX(batch, xF, xR, xC, "+f+" + 1),\n getX(batch, xF, xR, xC, "+f+" + 2)\n );\n vec3 wValues = vec3(\n getW(wF, wR, wC, "+f+", d2),\n getW(wF, wR, wC, "+f+" + 1, d2),\n getW(wF, wR, wC, "+f+" + 2, d2)\n );\n dotProd += dot(xValues, wValues);\n }\n }\n }\n }\n setOutput(dotProd);\n }\n "}function Mi(t,e,n,r){void 0===e&&(e=!1),void 0===n&&(n=null),void 0===r&&(r=!1),this.variableNames=["x","W"],this.outputShape=t.outShape;var o=t.inHeight,i=t.inWidth,a=t.padInfo.top,s=t.padInfo.left,u=t.strideHeight,c=t.strideWidth,l=t.dilationHeight,h=t.dilationWidth,p=t.filterHeight,f=t.filterWidth,d=t.outChannels/t.inChannels,v="",m="";n&&(v=r?"float activation(float a) {\n float b = getPreluActivationWeightsAtOutCoords();\n "+n+"\n }":"\n float activation(float x) {\n "+n+"\n }\n ",m="result = activation(result);");var g=e?"result += getBiasAtOutCoords();":"";e&&this.variableNames.push("bias"),r&&this.variableNames.push("preluActivationWeights"),this.userCode="\n "+v+"\n\n const ivec2 strides = ivec2("+u+", "+c+");\n const ivec2 pads = ivec2("+a+", "+s+");\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords.x;\n ivec2 xRCCorner = coords.yz * strides - pads;\n int d2 = coords.w;\n int d1 = d2 / "+d+";\n int q = d2 - d1 * "+d+";\n\n int xRCorner = xRCCorner.x;\n int xCCorner = xRCCorner.y;\n\n // Convolve x(?, ?, d1) with w(:, :, d1, q) to get y(yR, yC, d2).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n // TO DO(dsmilkov): Flatten the two for loops and vec4 the operations.\n for (int wR = 0; wR < "+p+"; wR++) {\n int xR = xRCorner + wR * "+l+";\n\n if (xR < 0 || xR >= "+o+") {\n continue;\n }\n\n for (int wC = 0; wC < "+f+"; wC++) {\n int xC = xCCorner + wC * "+h+";\n\n if (xC < 0 || xC >= "+i+") {\n continue;\n }\n\n float xVal = getX(batch, xR, xC, d1);\n float wVal = getW(wR, wC, d1, q);\n dotProd += xVal * wVal;\n }\n }\n\n float result = dotProd;\n "+g+"\n "+m+"\n setOutput(result);\n }\n "}function Oi(t,e,n,r){void 0===e&&(e=!1),void 0===n&&(n=null),void 0===r&&(r=!1),this.variableNames=["x","W"],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=t.outShape;for(var o=t.inHeight,i=t.inWidth,a=t.padInfo.top,s=t.padInfo.left,u=t.strideHeight,c=t.strideWidth,l=t.dilationHeight,h=t.dilationWidth,p=t.filterHeight,f=t.filterWidth,d=f,v="int xR; int xC; int xCOffset;",m=0;m= 0 && xR < "+o+" && xCOffset >= 0 && xCOffset < "+i+") {\n xTexelR"+m+"C"+g+" = getX(batch, xR, xCOffset, d1);\n } else {\n xTexelR"+m+"C"+g+" = vec4(0.);\n }\n\n xCOffset = xC + 1 - 2;\n if(xR >= 0 && xR < "+o+" && xCOffset >= 0 && xCOffset < "+i+") {\n vec4 previous = getX(batch, xR, xCOffset, d1);\n xR"+m+"C"+g+" = vec4(previous.zw, xTexelR"+m+"C"+g+".xy);\n } else {\n xR"+m+"C"+g+" = vec4(0, 0, xTexelR"+m+"C"+g+".xy);\n }\n ":"\n if(xR >= 0 && xR < "+o+" && xC >= 0 && xC < "+i+") {\n xTexelR"+m+"C"+g+" = getX(batch, xR, xC, d1);\n } else {\n xTexelR"+m+"C"+g+" = vec4(0.);\n }\n\n xR"+m+"C"+g+" = xTexelR"+m+"C"+g+";\n ",g+1= 0 && xR < "+o+" &&\n xCOffset >= 0 && xCOffset < "+i+") {\n xTexelR"+m+"C"+(g+2)+" = getX(batch, xR, xCOffset, d1);\n }\n ",1= 0 && xR < "+o+" &&\n xCOffset >= 0 && xCOffset < "+i+") {\n xTexelR"+m+"C"+g+" = getX(batch, xR, xCOffset, d1);\n } else {\n xTexelR"+m+"C"+g+" = vec4(0.);\n }\n "),v+="\n xR"+m+"C"+(g+1)+" = vec4(\n xTexelR"+m+"C"+g+".zw, xTexelR"+m+"C"+(g+2)+".xy);\n "):v+="\n xCOffset = xC + "+x+";\n\n if(xR >= 0 && xR < "+o+" &&\n xCOffset >= 0 && xCOffset < "+i+") {\n xTexelR"+m+"C"+(g+2)+" = getX(batch, xR, xCOffset, d1);\n }\n\n xR"+m+"C"+(g+1)+" = xTexelR"+m+"C"+(g+2)+";\n "}}else g= 0 && xR < "+o+") {\n ",s%2==1?(v+="\n xCOffset = xC + 1 - "+c+";\n if(xCOffset >= 0 && xCOffset < "+i+") {\n xTexelR"+m+"C"+g+" = getX(batch, xR, xCOffset, d1);\n } else {\n xTexelR"+m+"C"+g+" = vec4(0.);\n }\n\n if(xC + 1 >= 0 && xC + 1 < "+i+") {\n xTexelR"+m+"C"+(g+2)+" = getX(batch, xR, xC + 1, d1);\n } else {\n xTexelR"+m+"C"+(g+2)+" = vec4(0.);\n }\n\n xR"+m+"C"+g+" = vec4(\n xTexelR"+m+"C"+g+".zw, xTexelR"+m+"C"+(g+2)+".zw);\n ",g+1= 0 && xCOffset < "+i+") {\n final = getX(batch, xR, xCOffset, d1);\n }\n xR"+m+"C"+(g+1)+" = vec4(xTexelR"+m+"C"+(g+2)+".xy, final.xy);\n ")):(v+="\n if(xC >= 0 && xC < "+i+") {\n xTexelR"+m+"C"+g+" = getX(batch, xR, xC, d1);\n } else {\n xTexelR"+m+"C"+g+" = vec4(0.);\n }\n\n xCOffset = xC + "+c+";\n if(xCOffset >= 0 && xCOffset < "+i+") {\n xTexelR"+m+"C"+(g+2)+" = getX(batch, xR, xCOffset, d1);\n } else {\n xTexelR"+m+"C"+(g+2)+" = vec4(0.);\n }\n\n xR"+m+"C"+g+" = vec4(\n xTexelR"+m+"C"+g+".xy, xTexelR"+m+"C"+(g+2)+".xy);\n ",g+1= "+i+") {\n return;\n }\n\n float height_scale = "+y+";\n float width_scale = "+C+";\n\n float in_y = "+x+";\n if( in_y < 0.0 || in_y > "+d+" ) {\n setOutput(float("+o+"));\n return;\n }\n float in_x = "+E+";\n if( in_x < 0.0 || in_x > "+v+" ) {\n setOutput(float("+o+"));\n return;\n }\n\n vec2 sourceFracIndexCR = vec2(in_x,in_y);\n if("+p+" == 1) {\n // Compute the four integer indices.\n ivec2 sourceFloorCR = ivec2(sourceFracIndexCR);\n ivec2 sourceCeilCR = ivec2(ceil(sourceFracIndexCR));\n\n float topLeft = getImage(b, sourceFloorCR.y, sourceFloorCR.x, d);\n float bottomLeft = getImage(b, sourceCeilCR.y, sourceFloorCR.x, d);\n float topRight = getImage(b, sourceFloorCR.y, sourceCeilCR.x, d);\n float bottomRight = getImage(b, sourceCeilCR.y, sourceCeilCR.x, d);\n\n vec2 fracCR = sourceFracIndexCR - vec2(sourceFloorCR);\n\n float top = topLeft + (topRight - topLeft) * fracCR.x;\n float bottom = bottomLeft + (bottomRight - bottomLeft) * fracCR.x;\n float newValue = top + (bottom - top) * fracCR.y;\n setOutput(newValue);\n } else {\n // Compute the coordinators of nearest neighbor point.\n ivec2 sourceNearestCR = ivec2(floor(\n sourceFracIndexCR + vec2(0.5,0.5)));\n float newValue = getImage(b, sourceNearestCR.y, sourceNearestCR.x, d);\n setOutput(newValue);\n }\n }\n "}function Bi(t,e,n){this.variableNames=["x"];var r=(this.outputShape=t).length,o=t[t.length-1],i=n?"<":">";this.userCode="\n int getIndex(int i) {\n "+(n?"return "+o+" -i - 1;":"return i;")+"\n }\n\n void main() {\n "+ni(r)+" coords = getOutputCoords();\n int end = "+Li(r,"coords")+";\n float val = 0.0;\n for (int i = "+o+" - 1; i >= 0; i -= 1) {\n int idx = getIndex(i);\n if (idx "+i+" end) {\n continue;\n }\n if (idx == end && "+e+") {\n continue;\n }\n "+Li(r,"coords")+" = idx;\n val += getX("+function(t,e){if(1===r)return e;if(2===r)return e+".x, "+e+".y";if(3===r)return"coords.x, coords.y, coords.z";if(4===r)return"coords.x, coords.y, coords.z, coords.w";throw Error("Cumulative sum for rank "+r+" is not yet supported")}(0,"coords")+");\n }\n setOutput(val);\n }\n "}function Li(t,e){if(1===t)return""+e;if(2===t)return e+".y";if(3===t)return e+".z";if(4===t)return e+".w";throw Error("Cumulative sum for rank "+t+" is not yet supported")}function Wi(t){this.variableNames=["A"],this.packedInputs=!1,this.packedOutput=!0,this.outPackingScheme=Xt.DENSE;var e=ie(t),n=Yo();this.outputShape=t,this.userCode="\n ivec3 outCoordsFromFlatIndex(int index) {\n "+$o(["r","c","d"],t)+"\n return ivec3(r, c, d);\n }\n\n void main() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2("+e[0]+", "+e[1]+"));\n int index = 4 * (resTexRC.x * "+e[1]+" + resTexRC.y);\n\n vec4 result = vec4(0.);\n\n for (int i=0; i<4; i++) {\n int flatIndex = index + i;\n ivec3 rc = outCoordsFromFlatIndex(flatIndex);\n result[i] = getA(rc.x, rc.y, rc.z);\n }\n\n "+n.output+" = result;\n }\n "}function zi(t){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!0,this.outPackingScheme=Xt.DENSE;var e=ie(t),n=Yo();this.outputShape=t,this.userCode="\n ivec3 outCoordsFromFlatIndex(int index) {\n "+$o(["r","c","d"],t)+"\n return ivec3(r, c, d);\n }\n\n void main() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2("+e[0]+", "+e[1]+"));\n int index = 4 * (resTexRC.x * "+e[1]+" + resTexRC.y);\n\n vec4 result = vec4(0.);\n\n for (int i=0; i<4; i++) {\n int flatIndex = index + i;\n ivec3 rc = outCoordsFromFlatIndex(flatIndex);\n result[i] = getChannel(getA(rc.x, rc.y, rc.z), vec2(rc.y, rc.z));\n }\n\n "+n.output+" = result;\n }\n "}function Ui(t){this.variableNames=["X"],this.outputShape=[t,t],this.userCode="\n void main() {\n ivec2 coords = getOutputCoords();\n float val = coords[0] == coords[1] ? getX(coords[0]) : 0.0;\n setOutput(val);\n }\n "}function Vi(t){this.variableNames=["A"],this.outTexUsage=Yt.DOWNLOAD;var e=Yo();this.outputShape=t,this.userCode="\n "+Qo+"\n\n void main() {\n float x = getAAtOutCoords();\n "+e.output+" = encode_float(x);\n }\n "}function Gi(t){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!1,this.outTexUsage=Yt.DOWNLOAD;var e=Yo();this.outputShape=t,this.userCode="\n "+Qo+"\n\n void main() {\n ivec3 coords = getOutputCoords();\n float x = getChannel(getAAtOutCoords(), vec2(coords.y, coords.z));\n "+e.output+" = encode_float(x);\n }\n "}function Hi(t,e,n){void 0===n&&(n=!1),this.variableNames=["A"];var r=Yo(),o=e[0],i=e[1];this.outputShape=t;var a="result";n&&(a="floor(result * 255. + 0.5)"),this.userCode="\n "+Jo(t)+"\n\n void main() {\n ivec3 coords = getOutputCoords();\n\n int flatIndex = getFlatIndex(coords);\n int offset = imod(flatIndex, 4);\n\n flatIndex = idiv(flatIndex, 4, 1.);\n \n int r = flatIndex / "+i+";\n int c = imod(flatIndex, "+i+");\n vec2 uv = (vec2(c, r) + halfCR) / vec2("+i+".0, "+o+".0);\n vec4 values = "+r.texture2D+"(A, uv);\n\n float result;\n\n if(offset == 0) {\n result = values[0];\n } else if(offset == 1) {\n result = values[1];\n } else if(offset == 2) {\n result = values[2];\n } else {\n result = values[3];\n }\n\n "+r.output+" = vec4("+a+", 0., 0., 0.);\n }\n "}function qi(t,e,n){void 0===n&&(n=!1),this.variableNames=["A"],this.packedInputs=!1,this.packedOutput=!0;var r=Yo(),o=e[0],i=e[1];this.outputShape=t;var a="",s="result";n&&(s="floor(result * 255. + 0.5)");for(var u=0;u<=1;u++)for(var c=0;c<=1;c++){var l=2*u+c;a+="\n localCoords = coords;\n if(localCoords[2] + "+c+" < "+t[2]+") {\n localCoords[2] += "+c+";\n if(localCoords[1] + "+u+" < "+t[1]+") {\n localCoords[1] += "+u+";\n\n flatIndex = getFlatIndex(localCoords);\n offset = imod(flatIndex, 4);\n\n flatIndex = idiv(flatIndex, 4, 1.);\n\n r = flatIndex / "+i+";\n c = imod(flatIndex, "+i+");\n uv = (vec2(c, r) + halfCR) / vec2("+i+".0, "+o+".0);\n values = "+r.texture2D+"(A, uv);\n\n if(offset == 0) {\n result["+l+"] = values[0];\n } else if(offset == 1) {\n result["+l+"] = values[1];\n } else if(offset == 2) {\n result["+l+"] = values[2];\n } else {\n result["+l+"] = values[3];\n }\n }\n }\n "}this.userCode="\n "+Jo(t)+"\n\n void main() {\n ivec3 coords = getOutputCoords();\n\n vec4 result = vec4(0.);\n int flatIndex, r, c, offset;\n ivec3 localCoords;\n vec2 uv;\n vec4 values;\n\n "+a+"\n\n "+r.output+" = "+s+";\n }\n "}function ji(t,e,n){this.variableNames=["real","imag"];var r=e[1];this.outputShape=e;var o=n?"2.0 * "+Math.PI:"-2.0 * "+Math.PI,i=n?r+".0":"1.0";this.userCode="\n const float exponentMultiplier = "+o+";\n\n float unaryOpComplex(float real, float expR, float imag, float expI) {\n "+t+"\n }\n\n float mulMatDFT(int batch, int index) {\n float indexRatio = float(index) / float("+r+");\n float exponentMultiplierTimesIndexRatio =\n exponentMultiplier * indexRatio;\n\n float result = 0.0;\n\n for (int i = 0; i < "+r+"; i++) {\n // x = (-2|2 * PI / N) * index * i;\n float x = exponentMultiplierTimesIndexRatio * float(i);\n float expR = cos(x);\n float expI = sin(x);\n float real = getReal(batch, i);\n float imag = getImag(batch, i);\n\n result +=\n unaryOpComplex(real, expR, imag, expI) / "+i+";\n }\n\n return result;\n }\n\n void main() {\n ivec2 coords = getOutputCoords();\n setOutput(mulMatDFT(coords[0], coords[1]));\n }\n "}function Ki(t,e,n){this.variableNames=["A","indices"];var r=t.slice();r[n]=e,this.outputShape=r,this.rank=r.length;var o=ni(this.rank),i=function(t,e){var n=t.length;if(4= 0) {\n\n offsetX = int(mod(float(blockIndex), "+u+".) * "+i+". - "+p+".);\n d1 = offsetX + "+c+" * (int(mod(float(pos), "+d+".) / "+o+".));\n\n if(d1 < "+e[y]+" && d1 >= 0) {\n\n ch = int(mod(float(pos), "+o+".));\n\n if ("+m+") {\n innerDims = vec2(d1, ch);\n result["+(2*b+w)+"] = getChannel(\n getA(d0, int(innerDims.x),\n int(innerDims.y)), innerDims);\n } else {\n innerDims = vec2(d0, d1);\n result["+(2*b+w)+"] = getChannel(\n getA(ch, int(innerDims.x),\n int(innerDims.y)), innerDims);\n }\n }\n }\n }\n ";this.userCode="\n void main() {\n ivec2 rc = getOutputCoords();\n\n vec4 result = vec4(0);\n\n int blockIndex, pos, offsetY, d0, offsetX, d1, ch;\n vec2 innerDims;\n\n "+x+"\n\n "+v.output+" = result;\n }\n "}function wa(t,e,n,r,o){this.variableNames=["x"],this.outputShape=[];var i,a=e,s=t[3]-1;this.outputShape=t;var u="float("+n+") + float("+r+") * sum";i=.5===o?"inversesqrt("+u+")":1===o?"1.0/("+u+")":"exp(log("+u+") * float(-"+o+"));",this.userCode="\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int r = coords[1];\n int c = coords[2];\n int d = coords[3];\n float x = getX(b, r, c, d);\n float sum = 0.0;\n for (int j = -"+a+"; j <= "+a+"; j++) {\n int idx = d + j;\n if (idx >= 0 && idx <= "+s+") {\n float z = getX(b, r, c, idx);\n sum += z * z;\n }\n }\n float val = x * "+i+";\n setOutput(val);\n }\n "}function Ca(t,e,n,r,o){this.variableNames=["inputImage","outputImage","dy"],this.outputShape=[],this.outputShape=t,this.depth=t[3],this.depthRadius=e,this.bias=n,this.alpha=r,this.beta=o,this.userCode="\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int r = coords[1];\n int c = coords[2];\n\n float result = 0.0;\n for (int d = 0; d < "+this.depth+"; ++d) {\n int depthBegin = int(max(0.0, float(d - "+e+")));\n int depthEnd = int(min(float("+this.depth+"),\n float(d + "+e+" + 1)));\n\n const int MIN_DEPTH_BEGIN = 0;\n const int MAX_DEPTH_END = "+this.depth+";\n\n float norm = 0.0;\n for (int k = MIN_DEPTH_BEGIN; k < MAX_DEPTH_END; ++k) {\n if (k < depthBegin){\n continue;\n }\n else if (k >= depthBegin && k < depthEnd) {\n norm += getInputImage(b, r, c, k) * getInputImage(b, r, c, k);\n }\n else {\n break;\n }\n }\n\n norm = float("+r+") * norm + float("+n+");\n\n for(int k = MIN_DEPTH_BEGIN; k < MAX_DEPTH_END; ++k){\n if (k < depthBegin){\n continue;\n }\n else if (k >= depthBegin && k < depthEnd){\n float dyi = -2.0 * float("+r+")\n * float("+o+")\n * getInputImage(b ,r ,c, k) * getOutputImage(b, r, c, d)\n / norm;\n if (k == d) {\n dyi += pow(norm, -1.0 * "+o+");\n }\n if (k == coords[3]) {\n dyi *= getDy(b, r, c, d);\n result += dyi;\n }\n }\n else {\n break;\n }\n }\n }\n setOutput(result);\n }\n "}function Ea(t,e,n,r,o){this.variableNames=["x"],this.outputShape=[],this.packedInputs=!0,this.packedOutput=!0;var i,a=e,s=t[3]-1;this.outputShape=t;var u="float("+n+") + float("+r+") * sum";i=.5===o?"inversesqrt("+u+")":1===o?"1.0/("+u+")":"exp(log("+u+") * float(-"+o+"));",this.userCode="\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords.x;\n int r = coords.y;\n int c = coords.z;\n int d = coords.w;\n\n bool hasNextCol = d < "+this.outputShape[3]+";\n bool hasNextRow = c < "+this.outputShape[2]+";\n\n vec4 sum = vec4(0.);\n vec4 xFragAtOutputCoords = getX(b, r, c, d);\n\n vec4 xAtOutputCoords = vec4(\n getChannel(xFragAtOutputCoords, vec2(c, d)),\n hasNextCol ?\n getChannel(xFragAtOutputCoords, vec2(c, d + 1)) : 0.0,\n hasNextRow ?\n getChannel(xFragAtOutputCoords , vec2(c + 1, d)) : 0.0,\n (hasNextRow && hasNextCol) ?\n getChannel(xFragAtOutputCoords, vec2(c + 1, d + 1)) : 0.0\n );\n\n int firstChannel = d - "+a+";\n vec2 cache = vec2(0.);\n if(firstChannel >= 0){\n vec4 firstChannelFrag = getX(b, r, c, firstChannel);\n cache.x = getChannel(firstChannelFrag, vec2(c, firstChannel));\n if(hasNextRow){\n cache.y = getChannel(firstChannelFrag, vec2(c + 1, firstChannel));\n }\n }\n\n ivec2 depth = ivec2(d, d + 1);\n for (int j = - "+a+"; j <= "+a+"; j++) {\n ivec2 idx = depth + j;\n bvec2 aboveLowerBound = greaterThanEqual(idx, ivec2(0));\n bvec2 belowUpperBound = lessThanEqual(idx, ivec2("+s+"));\n\n bool depthInRange = aboveLowerBound.x && belowUpperBound.x;\n bool depthPlusOneInRange = aboveLowerBound.y && belowUpperBound.y;\n\n if(depthInRange || depthPlusOneInRange){\n vec4 z = vec4(0.);\n vec4 xFragAtCurrentDepth;\n z.xz = cache.xy;\n if(depthPlusOneInRange && hasNextCol){\n xFragAtCurrentDepth = idx.y != d ?\n getX(b, r, c, idx.y) : xFragAtOutputCoords;\n z.y = getChannel(xFragAtCurrentDepth, vec2(c, idx.y));\n if(hasNextRow){\n z.w = getChannel(xFragAtCurrentDepth, vec2(c + 1, idx.y));\n }\n }\n cache.xy = z.yw;\n sum += z * z;\n }\n }\n vec4 result = xAtOutputCoords * "+i+";\n setOutput(result);\n }\n "}function _a(t){this.variableNames=["dy","maxPos"],this.outputShape=t.inShape;var e=t.strideHeight,n=t.strideWidth,r=t.dilationHeight,o=t.effectiveFilterHeight,i=t.effectiveFilterWidth,a=o-1-t.padInfo.top,s=i-1-t.padInfo.left,u=o*i-1;this.userCode="\n const ivec2 pads = ivec2("+a+", "+s+");\n\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n\n ivec2 dyRCCorner = coords.yz - pads;\n int dyRCorner = dyRCCorner.x;\n int dyCCorner = dyRCCorner.y;\n\n // Convolve dy(?, ?, d) with pos mask(:, :, d) to get dx(xR, xC, d).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n for (int wR = 0; wR < "+o+";\n wR += "+r+") {\n float dyR = float(dyRCorner + wR) / "+e+".0;\n\n if (dyR < 0.0 || dyR >= "+t.outHeight+".0 || fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n for (int wC = 0; wC < "+i+"; wC++) {\n float dyC = float(dyCCorner + wC) / "+n+".0;\n\n if (dyC < 0.0 || dyC >= "+t.outWidth+".0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n float dyValue = getDy(b, idyR, idyC, d);\n int maxPosValue = "+u+" - int(getMaxPos(b, idyR, idyC, d));\n\n // Get the current value, check it against the value from the\n // position matrix.\n int curPosValue = wR * "+i+" + wC;\n float mask = float(maxPosValue == curPosValue ? 1.0 : 0.0);\n\n dotProd += dyValue * mask;\n }\n }\n setOutput(dotProd);\n }\n "}function Ia(t){this.variableNames=["dy","maxPos"],this.outputShape=t.inShape;var e=t.strideDepth,n=t.strideHeight,r=t.strideWidth,o=t.dilationDepth,i=t.dilationHeight,a=t.dilationWidth,s=t.effectiveFilterDepth,u=t.effectiveFilterHeight,c=t.effectiveFilterWidth,l=s-1-t.padInfo.front,h=u-1-t.padInfo.top,p=c-1-t.padInfo.left,f=s*u*c-1;this.userCode="\n const ivec3 pads = ivec3("+l+", "+h+", "+p+");\n\n void main() {\n ivec5 coords = getOutputCoords();\n int batch = coords.x;\n int ch = coords.u;\n\n ivec3 dyCorner = ivec3(coords.y, coords.z, coords.w) - pads;\n int dyDCorner = dyCorner.x;\n int dyRCorner = dyCorner.y;\n int dyCCorner = dyCorner.z;\n\n // Convolve dy(?, ?, ?, ch) with pos mask(:, :, :, d) to get\n // dx(xD, xR, xC, ch).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n\n for (int wD = 0; wD < "+s+";\n wD += "+o+") {\n float dyD = float(dyDCorner + wD) / "+e+".0;\n\n if (dyD < 0.0 || dyD >= "+t.outDepth+".0 || fract(dyD) > 0.0) {\n continue;\n }\n int idyD = int(dyD);\n\n for (int wR = 0; wR < "+u+";\n wR += "+i+") {\n float dyR = float(dyRCorner + wR) / "+n+".0;\n\n if (dyR < 0.0 || dyR >= "+t.outHeight+".0 ||\n fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n for (int wC = 0; wC < "+c+";\n wC += "+a+") {\n float dyC = float(dyCCorner + wC) / "+r+".0;\n\n if (dyC < 0.0 || dyC >= "+t.outWidth+".0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n float dyValue = getDy(batch, idyD, idyR, idyC, ch);\n int maxPosValue = "+f+" -\n int(getMaxPos(batch, idyD, idyR, idyC, ch));\n\n // Get the current value, check it against the value from the\n // position matrix.\n int curPosValue =\n wD * "+u+" * "+c+" +\n wR * "+c+" + wC;\n float mask = float(maxPosValue == curPosValue ? 1.0 : 0.0);\n\n dotProd += dyValue * mask;\n }\n }\n }\n setOutput(dotProd);\n }\n "}function Ra(t,e,n,r,o,i,a){void 0===n&&(n=!1),void 0===r&&(r=!1),void 0===o&&(o=!1),void 0===i&&(i=null),void 0===a&&(a=!1),this.variableNames=["matrixA","matrixB"],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=e;var s=n?t[1]:t[2],u=Math.ceil(s/2),c=n?"i * 2, rc.y":"rc.y, i * 2",l=r?"rc.z, i * 2":"i * 2, rc.z",h=n?["a.xxyy","a.zzww"]:["a.xxzz","a.yyww"],p=r?["b.xzxz","b.ywyw"]:["b.xyxy","b.zwzw"],f="",d="";i&&(f=a?"vec4 activation(vec4 a) {\n vec4 b = getPreluActivationWeightsAtOutCoords();\n "+i+"\n }":"vec4 activation(vec4 x) {\n "+i+"\n }",d="result = activation(result);");var v=o?"result += getBiasAtOutCoords();":"";o&&this.variableNames.push("bias"),a&&this.variableNames.push("preluActivationWeights"),this.userCode="\n "+f+"\n\n const float sharedDimension = "+u+".0;\n\n vec4 dot2x2ARowBCol(ivec3 rc) {\n vec4 result = vec4(0);\n for (int i = 0; i < "+u+"; i++) {\n vec4 a = getMatrixA(rc.x, "+c+");\n vec4 b = getMatrixB(rc.x, "+l+");\n\n // These swizzled products need to be separately added.\n // See: https://github.com/tensorflow/tfjs/issues/1735\n result += ("+h[0]+" * "+p[0]+");\n result += ("+h[1]+" * "+p[1]+");\n }\n return result;\n }\n\n void main() {\n ivec3 rc = getOutputCoords();\n vec4 result = dot2x2ARowBCol(rc);\n\n "+v+"\n\n "+d+"\n\n setOutput(result);\n }\n "}function ka(t,e,n,r){this.variableNames=["indices"],this.outputShape=[t,e],this.userCode="\n void main() {\n ivec2 coords = getOutputCoords();\n int index = round(getIndices(coords.x));\n setOutput(mix(float("+r+"), float("+n+"),\n float(index == coords.y)));\n }\n "}function Sa(t){this.variableNames=["A"],this.packedInputs=!1,this.packedOutput=!0;var e,n,r,o,i=(this.outputShape=t).length;if(0===i)this.userCode="\n void main() {\n setOutput(vec4(getA(), 0., 0., 0.));\n }\n ";else{var a=Xo("rc",i),s=ni(i),u=function(t,e,n){if(1===t)return"rc > "+e[0];for(var r="",o=t-2;o= "+e[o],o= "+e+";\n bool rEdge = rp1 >= "+n+";\n "}(i,t[t.length-1],t[t.length-2]),l=(n=a,r=(e=t).length,o=function(t,e){for(var n=[],r=0;r<=1;r++)for(var o=0;o<=1;o++){for(var i=(0===r?"r":"rp1")+", "+(0===o?"c":"cp1"),a=2;a= "+e[0]+" ? 0. : getA(rc + 1),\n 0, 0":"getA("+o[0]+"),\n cEdge ? 0. : getA("+o[1]+"),\n rEdge ? 0. : getA("+o[2]+"),\n rEdge || cEdge ? 0. : getA("+o[3]+")");this.userCode="\n void main() {\n "+s+" rc = getOutputCoords();\n\n if("+u+") {\n setOutput(vec4(0));\n } else {\n "+c+"\n\n setOutput(vec4("+l+"));\n }\n }\n "}}var Da=(Aa.prototype.getCustomSetupFunc=function(n){var r=this;return function(t,e){null==r.seedLoc&&(r.seedLoc=t.getUniformLocation(e,"seed")),t.gl.uniform1f(r.seedLoc,n)}},Aa);function Aa(t,e,n){this.variableNames=["probs"],this.outputShape=[t,n],this.userCode="\n uniform float seed;\n\n void main() {\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n\n float r = random(seed);\n float cdf = 0.0;\n\n for (int i = 0; i < "+(e-1)+"; i++) {\n cdf += getProbs(batch, i);\n\n if (r < cdf) {\n setOutput(float(i));\n return;\n }\n }\n\n // If no other event happened, last event happened.\n setOutput(float("+(e-1)+"));\n }\n "}function Ta(n,t,e){this.variableNames=["x"],this.outputShape=t.map(function(t,e){return t[0]+n[e]+t[1]});var r=n.length,o=ni(r),i=t.map(function(t){return t[0]}).join(","),a=t.map(function(t,e){return t[0]+n[e]}).join(","),s=["coords[0]","coords[1]","coords[2]","coords[3]"].slice(0,r);this.userCode=1!==r?"\n "+o+" start = "+o+"("+i+");\n "+o+" end = "+o+"("+a+");\n\n void main() {\n "+o+" outC = getOutputCoords();\n if (any(lessThan(outC, start)) || any(greaterThanEqual(outC, end))) {\n setOutput(float("+e+"));\n } else {\n "+o+" coords = outC - start;\n setOutput(getX("+s+"));\n }\n }\n ":"\n int start = "+i+";\n int end = "+a+";\n\n void main() {\n int outC = getOutputCoords();\n if (outC < start || outC >= end) {\n setOutput(float("+e+"));\n } else {\n setOutput(getX(outC - start));\n }\n }\n "}function Na(n,t,e){this.variableNames=["x"],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=t.map(function(t,e){return t[0]+n[e]+t[1]});for(var r=n.length,o=ni(r),i=t.map(function(t){return t[0]}).join(","),a=t.map(function(t,e){return t[0]+n[e]}).join(","),s=Xo("rc",r),u=Xo("source",r),c=s[r-1]+" < "+this.outputShape[r-1],l=1===r?"source":"vec2("+u.slice(-2).join()+")",h=[o+" rc = outputLoc;",s[r-1]+" += 1;\n if("+c+") {\n ",1===r?"":"}\n rc = outputLoc;\n "+s[r-2]+" += 1;\n if("+s[r-2]+" < "+this.outputShape[r-2]+") {",1===r?"":" "+s[r-1]+" += 1;\n if("+c+") {"],p=1===r?"rc < start || rc >= end":"any(lessThan(rc, start)) || any(greaterThanEqual(rc, end))",f="",d=0,v=1===r?2:4;d= "+t.inHeight+") {\n continue;\n }\n\n for (int wC = 0; wC < "+c+";\n wC += "+s+") {\n int xC = xCCorner + wC;\n\n if (xC < 0 || xC >= "+t.inWidth+") {\n continue;\n }\n\n float value = getX(batch, xR, xC, d);\n\n // If a min / max value has already been found, use it. If not,\n // use the current value.\n float currMinMaxValue = mix(\n value, minMaxValue, minMaxValueFound);\n if (value >= currMinMaxValue) {\n minMaxValue = value;\n minMaxValueFound = 1.0;\n minMaxPosition = wR * "+c+" + wC;\n }\n }\n }\n setOutput(float(minMaxPosition));\n }\n ";else{var d=e+"("+e+"("+e+"(minMaxValue[0], minMaxValue[1]), minMaxValue[2]), minMaxValue[3])";"avg"===e&&(d="avgValue / count");var v=4*Math.floor(r/4),m=r%4,g="\n if ("+p+") {\n avgValue += dot(values, ones);\n } else {\n minMaxValue = max(values, minMaxValue);\n }\n ";this.userCode="\n const ivec2 strides = ivec2("+o+", "+i+");\n const ivec2 pads = ivec2("+l+", "+h+");\n const float initializationValue = "+f+";\n const vec4 ones = vec4(1.0, 1.0, 1.0, 1.0);\n\n float count = 0.0;\n\n float getValue(int batch, int xR, int xC, int d) {\n if (xC < 0 || xC >= "+t.inWidth+") {\n return initializationValue;\n }\n count += 1.0;\n return getX(batch, xR, xC, d);\n }\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords[0];\n int d = coords[3];\n\n ivec2 xRCCorner = coords.yz * strides - pads;\n int xRCorner = xRCCorner.x;\n int xCCorner = xRCCorner.y;\n\n // max/min x(?, ?, d) to get y(yR, yC, d).\n // ? = to be determined\n vec4 minMaxValue = vec4("+f+");\n float avgValue = 0.0;\n count = 0.0;\n\n for (int wR = 0; wR < "+u+";\n wR += "+a+") {\n int xR = xRCorner + wR;\n\n if (xR < 0 || xR >= "+t.inHeight+") {\n continue;\n }\n\n for (int wC = 0; wC < "+v+"; wC += 4) {\n int xC = xCCorner + wC * "+s+";\n\n vec4 values = vec4(\n getValue(batch, xR, xC, d),\n getValue(batch, xR, xC + "+s+", d),\n getValue(batch, xR, xC + 2 * "+s+", d),\n getValue(batch, xR, xC + 3 * "+s+", d)\n );\n\n "+g+"\n }\n\n int xC = xCCorner + "+v+";\n if ("+(1==m)+") {\n vec4 values = vec4(\n getValue(batch, xR, xC, d),\n initializationValue,\n initializationValue,\n initializationValue\n );\n\n "+g+"\n } else if ("+(2==m)+") {\n vec4 values = vec4(\n getValue(batch, xR, xC, d),\n getValue(batch, xR, xC + "+s+", d),\n initializationValue,\n initializationValue\n );\n\n "+g+"\n } else if ("+(3==m)+") {\n vec4 values = vec4(\n getValue(batch, xR, xC, d),\n getValue(batch, xR, xC + "+s+", d),\n getValue(batch, xR, xC + 2 * "+s+", d),\n initializationValue\n );\n\n "+g+"\n }\n }\n setOutput("+d+");\n }\n "}}function Ma(t,e,n){if(this.variableNames=["x"],"avg"===e&&n)throw new Error("Cannot compute positions for average pool.");var r=t.filterWidth,o=t.strideDepth,i=t.strideHeight,a=t.strideWidth,s=t.dilationDepth,u=t.dilationHeight,c=t.dilationWidth,l=t.effectiveFilterDepth,h=t.effectiveFilterHeight,p=t.effectiveFilterWidth,f=t.padInfo.front,d=t.padInfo.top,v=t.padInfo.left;this.outputShape=t.outShape;var m="avg"===e,g="0.0";if(m||(g="-1.0 / 1e-20"),n)this.userCode="\n const ivec3 strides =\n ivec3("+o+", "+i+", "+a+");\n const ivec3 pads = ivec3("+f+", "+d+", "+v+");\n\n void main() {\n ivec5 coords = getOutputCoords();\n int batch = coords.x;\n int ch = coords.u;\n\n ivec3 xCorner = ivec3(coords.y, coords.z, coords.w) * strides - pads;\n int xDCorner = xCorner.x;\n int xRCorner = xCorner.y;\n int xCCorner = xCorner.z;\n\n // max/min x(?, ?, ?, ch) to get y(yD, yR, yC, ch).\n // ? = to be determined\n float minMaxValue = 0.0;\n float minMaxValueFound = 0.0;\n int minMaxPosition = 0;\n\n for (int wD = 0; wD < "+l+";\n wD += "+s+") {\n int xD = xDCorner + wD;\n\n if (xD < 0 || xD >= "+t.inDepth+") {\n continue;\n }\n\n for (int wR = 0; wR < "+h+";\n wR += "+u+") {\n int xR = xRCorner + wR;\n\n if (xR < 0 || xR >= "+t.inHeight+") {\n continue;\n }\n\n for (int wC = 0; wC < "+p+";\n wC += "+c+") {\n int xC = xCCorner + wC;\n\n if (xC < 0 || xC >= "+t.inWidth+") {\n continue;\n }\n\n float value = getX(batch, xD, xR, xC, ch);\n\n // If a min / max value has already been found, use it. If not,\n // use the current value.\n float currMinMaxValue = mix(\n value, minMaxValue, minMaxValueFound);\n if (value >= currMinMaxValue) {\n minMaxValue = value;\n minMaxValueFound = 1.0;\n minMaxPosition =\n wD * "+h+" * "+p+" +\n wR * "+p+" + wC;;\n }\n }\n }\n }\n setOutput(float(minMaxPosition));\n }\n ";else{var y=e+"("+e+"("+e+"(minMaxValue[0], minMaxValue[1]), minMaxValue[2]), minMaxValue[3])";"avg"===e&&(y="avgValue / count");var x=4*Math.floor(r/4),b=r%4,w="\n if ("+m+") {\n avgValue += dot(values, ones);\n } else {\n minMaxValue = max(values, minMaxValue);\n }\n ";this.userCode="\n const ivec3 strides =\n ivec3("+o+", "+i+", "+a+");\n const ivec3 pads = ivec3("+f+", "+d+", "+v+");\n const float initializationValue = "+g+";\n const vec4 ones = vec4(1.0, 1.0, 1.0, 1.0);\n\n float count = 0.0;\n\n float getValue(int batch, int xD, int xR, int xC, int ch) {\n if (xC < 0 || xC >= "+t.inWidth+") {\n return initializationValue;\n }\n count += 1.0;\n return getX(batch, xD, xR, xC, ch);\n }\n\n void main() {\n ivec5 coords = getOutputCoords();\n int batch = coords.x;\n int ch = coords.u;\n\n ivec3 xCorner = ivec3(coords.y, coords.z, coords.w) * strides - pads;\n int xDCorner = xCorner.x;\n int xRCorner = xCorner.y;\n int xCCorner = xCorner.z;\n\n // max/min x(?, ?, ?, d) to get y(yD, yR, yC, ch).\n // ? = to be determined\n vec4 minMaxValue = vec4("+g+");\n float avgValue = 0.0;\n count = 0.0;\n\n for (int wD = 0; wD < "+l+";\n wD += "+s+") {\n int xD = xDCorner + wD;\n\n if (xD < 0 || xD >= "+t.inDepth+") {\n continue;\n }\n\n for (int wR = 0; wR < "+h+";\n wR += "+u+") {\n int xR = xRCorner + wR;\n\n if (xR < 0 || xR >= "+t.inHeight+") {\n continue;\n }\n\n for (int wC = 0; wC < "+x+"; wC += 4) {\n int xC = xCCorner + wC * "+c+";\n\n vec4 values = vec4(\n getValue(batch, xD, xR, xC, ch),\n getValue(batch, xD, xR, xC + "+c+", ch),\n getValue(batch, xD, xR, xC + 2 * "+c+", ch),\n getValue(batch, xD, xR, xC + 3 * "+c+", ch)\n );\n\n "+w+"\n }\n\n int xC = xCCorner + "+x+";\n if ("+(1==b)+") {\n vec4 values = vec4(\n getValue(batch, xD, xR, xC, ch),\n initializationValue,\n initializationValue,\n initializationValue\n );\n\n "+w+"\n } else if ("+(2==b)+") {\n vec4 values = vec4(\n getValue(batch, xD, xR, xC, ch),\n getValue(batch, xD, xR, xC + "+c+", ch),\n initializationValue,\n initializationValue\n );\n\n "+w+"\n } else if ("+(3==b)+") {\n vec4 values = vec4(\n getValue(batch, xD, xR, xC, ch),\n getValue(batch, xD, xR, xC + "+c+", ch),\n getValue(batch, xD, xR, xC + 2 * "+c+", ch),\n initializationValue\n );\n\n "+w+"\n }\n }\n setOutput("+y+");\n }\n }\n "}}function Oa(t,e){this.variableNames=["x"];var n=t.windowSize,r=t.batchSize,o=t.inSize,i=Math.ceil(o/n);this.outputShape=[r,i];var a="0.0",s="";"prod"===e?a="1.0":"min"===e?(a="1.0 / 1e-20",s="min"):"max"===e&&(a="-1.0 / 1e-20",s="max");var u=e+"("+e+"("+e+"(minMaxValue[0], minMaxValue[1]), minMaxValue[2]), minMaxValue[3])";"sum"===e?u="sumValue":"prod"===e?u="prodValue":"all"===e?u="allValue":"any"===e&&(u="anyValue");var c=4*Math.floor(n/4),l=n%4,h="\n if ("+("sum"===e)+") {\n sumValue += dot(values, ones);\n } else if ("+("prod"===e)+") {\n vec2 tmp = vec2(values[0], values[1]) * vec2(values[2], values[3]);\n prodValue *= tmp[0] * tmp[1];\n } else {\n minMaxValue = "+s+"(values, minMaxValue);\n }\n ",p="vec4";"all"===e?(a="1.0",h="\n bool reducedAllValue = all(values);\n float floatedReducedAllValue = float(reducedAllValue);\n allValue = float(allValue >= 1.0 && floatedReducedAllValue >= 1.0);\n ",p="bvec4"):"any"===e&&(a="0.0",h="\n bool reducedAnyValue = any(values);\n float floatedReducedAnyValue = float(reducedAnyValue);\n anyValue = float(anyValue >= 1.0 || floatedReducedAnyValue >= 1.0);\n ",p="bvec4");var f="";0= "+o+") {\n return initializationValue;\n }\n "),this.userCode="\n const float initializationValue = "+a+";\n const vec4 ones = vec4(1.0, 1.0, 1.0, 1.0);\n\n float getValue(int batch, int inIdx) {\n "+f+"\n return getX(batch, inIdx);\n }\n\n void main() {\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n int outIdx = coords[1];\n int inOffset = outIdx * "+n+";\n\n vec4 minMaxValue = vec4("+a+");\n float prodValue = 1.0;\n float sumValue = 0.0;\n float allValue = 1.0;\n float anyValue = 0.0;\n\n for (int i = 0; i < "+c+"; i += 4) {\n int inIdx = inOffset + i;\n "+p+" values = "+p+"(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n getValue(batch, inIdx + 2),\n getValue(batch, inIdx + 3)\n );\n\n "+h+"\n }\n\n int inIdx = inOffset + "+c+";\n if ("+(1==l)+") {\n "+p+" values = "+p+"(\n getValue(batch, inIdx),\n initializationValue,\n initializationValue,\n initializationValue\n );\n\n "+h+"\n } else if ("+(2==l)+") {\n "+p+" values = "+p+"(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n initializationValue,\n initializationValue\n );\n\n "+h+"\n } else if ("+(3==l)+") {\n "+p+" values = "+p+"(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n getValue(batch, inIdx + 2),\n initializationValue\n );\n\n "+h+"\n }\n setOutput("+u+");\n }\n "}function Pa(t,e){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=t;for(var n="",r=0;r<4;r++){var o="thisRC = rc;";r%2==1&&(o+="thisRC.z += 1;"),1= "+s+") {\n continue;\n }\n\n for (int dyCOffset = 0; dyCOffset < winWidth; dyCOffset++) {\n int dyC = dyCOffset + startDyC;\n\n // Guard against the window exceeding the bounds of dy\n if (dyC < 0 || dyC >= "+u+") {\n continue;\n }\n\n float dxR = float(dyR) * heightScale;\n int topDxRIndex = int(floor(dxR));\n int bottomDxRIndex = int(min(ceil(dxR), "+(o-1)+".0));\n float dxRLerp = dxR - float(topDxRIndex);\n float inverseDxRLerp = 1.0 - dxRLerp;\n\n float dxC = float(dyC) * widthScale;\n int leftDxCIndex = int(floor(dxC));\n int rightDxCIndex = int(min(ceil(dxC), "+(i-1)+".0));\n float dxCLerp = dxC - float(leftDxCIndex);\n float inverseDxCLerp = 1.0 - dxCLerp;\n\n if (r == topDxRIndex && c == leftDxCIndex) {\n // topLeft\n accumulator +=\n getDy(b, dyR, dyC, d) * inverseDxRLerp * inverseDxCLerp;\n }\n\n if (r == topDxRIndex && c == rightDxCIndex) {\n // topRight\n accumulator += getDy(b, dyR, dyC, d) * inverseDxRLerp * dxCLerp;\n }\n\n if (r == bottomDxRIndex && c == leftDxCIndex) {\n // bottomLeft\n accumulator += getDy(b, dyR, dyC, d) * dxRLerp * inverseDxCLerp;\n }\n\n if (r == bottomDxRIndex && c == rightDxCIndex) {\n // bottomRight\n accumulator += getDy(b, dyR, dyC, d) * dxRLerp * dxCLerp;\n }\n }\n }\n // End loop over dy\n\n setOutput(accumulator);\n }\n "}function La(t,e,n,r){this.variableNames=["A"],this.outputShape=[];var o=t[0],i=t[1],a=t[2],s=t[3];this.outputShape=[o,e,n,s];var u=[r&&1= "+s+") {\n continue;\n }\n\n for (int dyCOffset = 0; dyCOffset < winWidth; dyCOffset++) {\n int dyC = dyCOffset + startDyC;\n\n // Guard against the window exceeding the bounds of dy\n if (dyC < 0 || dyC >= "+u+") {\n continue;\n }\n\n float sourceFracRow =\n float("+c[0]+") *\n (float(dyR) / float("+l[0]+"));\n\n float sourceFracCol =\n float("+c[1]+") *\n (float(dyC) / float("+l[1]+"));\n\n int sourceNearestRow = int(min(\n float(int("+o+") - 1),\n "+n+" ? float(round(sourceFracRow)) :\n float(floor(sourceFracRow))));\n\n int sourceNearestCol = int(min(\n float(int("+i+") - 1),\n "+n+" ? float(round(sourceFracCol)) :\n float(floor(sourceFracCol))));\n\n if (r == sourceNearestRow && c == sourceNearestCol) {\n accumulator += getDy(b, dyR, dyC, d);\n }\n }\n }\n // End loop over dy\n\n setOutput(accumulator);\n }\n "}function Ua(t,e,n,r){this.variableNames=["A"],this.outputShape=[];var o=t[0],i=t[1],a=t[2],s=t[3];this.outputShape=[o,e,n,s];var u=[r&&1= "+o+") {\n return initializationValue;\n }\n ");var h="";0= "+o+") {\n return -1.0;\n }\n "),this.userCode="\n const float initializationValue = 0.0;\n\n float getValue(int batch, int inIdx) {\n "+l+"\n return getX(batch, inIdx);\n }\n\n float getSegmentIdAtIndex(int inIdx) {\n "+h+"\n return getSegmentIds(inIdx);\n }\n\n void main() {\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n int outIdx = coords[1];\n int inOffset = int(floor(float(outIdx) / float(\n "+i+")) * float("+n+"));\n int currentSeg = int(mod(float(outIdx), float("+i+")));\n\n float sumValue = 0.0;\n\n for (int i = 0; i < "+s+"; i += 4) {\n int inIdx = inOffset + i;\n vec4 values = vec4(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n getValue(batch, inIdx + 2),\n getValue(batch, inIdx + 3)\n );\n\n vec4 segFilter = vec4(\n int(getSegmentIdAtIndex(inIdx)) == currentSeg ? 1 : 0,\n int(getSegmentIdAtIndex(inIdx + 1)) == currentSeg ? 1 : 0,\n int(getSegmentIdAtIndex(inIdx + 2)) == currentSeg ? 1 : 0,\n int(getSegmentIdAtIndex(inIdx + 3)) == currentSeg ? 1 : 0\n );\n\n "+c+"\n }\n\n int inIdx = inOffset + "+s+";\n if ("+(1==u)+") {\n vec4 values = vec4(\n getValue(batch, inIdx),\n initializationValue,\n initializationValue,\n initializationValue\n );\n\n int inIdxSeg = int(getSegmentIdAtIndex(inIdx));\n\n vec4 segFilter = vec4(\n int(getSegmentIdAtIndex(inIdx)) == currentSeg ? 1 : 0,\n 0,\n 0,\n 0\n );\n\n "+c+"\n } else if ("+(2==u)+") {\n vec4 values = vec4(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n initializationValue,\n initializationValue\n );\n\n vec4 segFilter = vec4(\n int(getSegmentIdAtIndex(inIdx)) == currentSeg ? 1 : 0,\n int(getSegmentIdAtIndex(inIdx + 1)) == currentSeg ? 1 : 0,\n 0,\n 0\n );\n\n "+c+"\n } else if ("+(3==u)+") {\n vec4 values = vec4(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n getValue(batch, inIdx + 2),\n initializationValue\n );\n\n vec4 segFilter = vec4(\n int(getSegmentIdAtIndex(inIdx)) == currentSeg ? 1 : 0,\n int(getSegmentIdAtIndex(inIdx + 1)) == currentSeg ? 1 : 0,\n int(getSegmentIdAtIndex(inIdx + 2)) == currentSeg ? 1 : 0,\n 0\n );\n\n "+c+"\n }\n setOutput(sumValue);\n }\n "}function ja(t,e,n){var r,o;if(this.variableNames=["c","a","b"],this.outputShape=e,4= 1.0) {\n setOutput(getA("+o+"));\n } else {\n setOutput(getB("+o+"));\n }\n }\n "}var Ka=(Ya.prototype.getCustomSetupFunc=function(n){var r=this;if(n.length!==this.rank)throw Error("The rank ("+this.rank+") of the program must match the length of start ("+n.length+")");return function(t,e){null==r.startLoc&&(r.startLoc=t.getUniformLocationNoThrow(e,"start"),null==r.startLoc)||t.gl.uniform1iv(r.startLoc,n)}},Ya),Xa=["x","y","z","w","u","v"];function Ya(t){this.variableNames=["source"],this.outputShape=t,this.rank=t.length;var e,n=ni(this.rank),r="uniform int start["+this.rank+"];",o=function(t){if(1===t)return"sourceLoc";if(t<=6)return Xa.slice(0,t).map(function(t){return"sourceLoc."+t}).join(",");throw Error("Slicing for rank "+t+" is not yet supported")}(this.rank);e="\n "+n+" sourceLoc;\n "+n+" coords = getOutputCoords();\n "+t.map(function(t,e){return"sourceLoc."+Xa[e]+" = start["+e+"] + coords."+Xa[e]+";"}).join("\n")+"\n ",this.userCode="\n "+r+"\n void main() {\n "+e+"\n setOutput(getSource("+o+"));\n }\n "}function $a(t,e,n){this.variableNames=["x"];var r=(this.outputShape=n).length,o=ni(n.length),i=ni(n.length),a="";if(1===r)a="coords * strides + begin";else{var s=0;a=n.map(function(t,e){return s++,1===n.length?"coords * strides["+e+"] + begin["+e+"]":"coords["+(s-1)+"] * strides["+e+"] + begin["+e+"]"}).join(",")}this.userCode="\n "+o+" begin = "+o+"("+t+");\n "+o+" strides = "+o+"("+e+");\n\n void main() {\n "+i+" coords = getOutputCoords();\n setOutput(getX("+a+"));\n }\n "}var Ja=(ts.prototype.getCustomSetupFunc=function(n){var r=this;if(n.length!==this.rank)throw Error("The rank ("+this.rank+") of the program must match the length of start ("+n.length+")");return function(t,e){null==r.startLoc&&(r.startLoc=t.getUniformLocationNoThrow(e,"start"),null==r.startLoc)||t.gl.uniform1iv(r.startLoc,n)}},ts),Qa=(Za.prototype.acquireTexture=function(t,e,n){var r,o=es(e,n),i=ns(t,o,n);if(i in this.freeTextures||(this.freeTextures[i]=[]),i in this.usedTextures||(this.usedTextures[i]=[]),0= 0.0) ? x : (exp(x) - 1.0);",ms="return -x;",gs="return ceil(x);",ys="return floor(x);",xs="return exp(x);",bs="return exp(x) - 1.0;",ws="return x;",Cs="\n vec4 result = x * vec4(greaterThanEqual(x, vec4(0.0)));\n bvec4 isNaN = isnan(x);\n\n result.r = isNaN.r ? x.r : result.r;\n result.g = isNaN.g ? x.g : result.g;\n result.b = isNaN.b ? x.b : result.b;\n result.a = isNaN.a ? x.a : result.a;\n\n return result;\n",Es="\n vec4 result = min(x, vec4(6.)) * vec4(greaterThanEqual(x, vec4(0.0)));\n bvec4 isNaN = isnan(x);\n\n result.r = isNaN.r ? x.r : result.r;\n result.g = isNaN.g ? x.g : result.g;\n result.b = isNaN.b ? x.b : result.b;\n result.a = isNaN.a ? x.a : result.a;\n\n return result;\n",_s="\n vec4 result;\n\n result.r = (x.r >= 0.0) ? x.r : (exp(x.r) - 1.0);\n result.g = (x.g >= 0.0) ? x.g : (exp(x.g) - 1.0);\n result.b = (x.b >= 0.0) ? x.b : (exp(x.b) - 1.0);\n result.a = (x.a >= 0.0) ? x.a : (exp(x.a) - 1.0);\n\n return result;\n",Is={};function Rs(t,e){if(void 0===e&&(e=!1),"linear"===t)return"return x;";if("relu"===t)return e?Cs:fs;if("elu"===t)return e?_s:vs;if("relu6"===t)return e?Es:ds;if("prelu"===t)return e?bi:xi;throw new Error("Activation "+t+" has not been implemented for the WebGL backend.")}var ks,Ss=(t(Ds,ks=uo),Ds.prototype.numDataIds=function(){return this.texData.numDataIds()+(this.cpuBackend?this.cpuBackend.numDataIds():0)-this.pendingDeletes},Ds.prototype.write=function(t,e,n){if(_().getBool("DEBUG")&&this.checkNumericalProblems(t),"complex64"===n&&null!=t)throw new Error("Cannot write to a complex64 dtype. Please use tf.complex(real, imag).");var r={};return this.texData.set(r,{shape:e,dtype:n,values:t,usage:Yt.UPLOAD}),r},Ds.prototype.move=function(t,e,n,r){if(_().getBool("DEBUG")&&this.checkNumericalProblems(e),"complex64"===r)throw new Error("Cannot write to a complex64 dtype. Please use tf.complex(real, imag).");this.texData.set(t,{shape:n,dtype:r,values:e,usage:Yt.UPLOAD})},Ds.prototype.readSync=function(t){var e=this.texData.get(t),n=e.values,r=e.dtype,o=e.complexTensors,i=e.slice,a=e.shape,s=e.isPacked;if(null!=i){var u;u=s?new ss(a,ws):new as(a,ws);var c=this.runWebGLProgram(u,[{dataId:t,shape:a,dtype:r}],r),l=this.readSync(c.dataId);return this.disposeData(c.dataId),l}if(null!=n)return this.convertAndCacheOnCPU(t);if("string"===r)return n;var h,p,f=null!=this.activeTimers;return f&&(h=tt()),p="complex64"===r?No(o.real.dataSync(),o.imag.dataSync()):this.getValuesFromTexture(t),f&&(this.downloadWaitMs+=tt()-h),this.convertAndCacheOnCPU(t,p)},Ds.prototype.read=function(E){return y(this,void 0,void 0,function(){var e,n,r,o,i,a,s,u,c,l,h,p,f,d,v,m,g,y,x,b,w,C;return R(this,function(t){switch(t.label){case 0:if(this.pendingRead.has(E))return e=this.pendingRead.get(E),[2,new Promise(function(t){return e.push(t)})];if(n=this.texData.get(E),r=n.values,o=n.shape,i=n.slice,a=n.dtype,s=n.complexTensors,u=n.isPacked,null!=i)return c=u?new ss(o,ws):new as(o,ws),l=this.runWebGLProgram(c,[{dataId:E,shape:o,dtype:a}],a),h=this.read(l.dataId),this.disposeData(l.dataId),[2,h];if(null!=r)return[2,this.convertAndCacheOnCPU(E)];if(!_().getBool("WEBGL_DOWNLOAD_FLOAT_ENABLED")&&2===_().getNumber("WEBGL_VERSION"))throw new Error("tensor.data() with WEBGL_DOWNLOAD_FLOAT_ENABLED=false and WEBGL_VERSION=2 not yet supported.");return p=null,"complex64"!==a&&_().get("WEBGL_BUFFER_SUPPORTED")&&(f=this.decode(E),d=this.texData.get(f.dataId),p=(C=this.gpgpu).createBufferFromTexture.apply(C,[d.texture].concat(ie(o)))),this.pendingRead.set(E,[]),"complex64"===a?[3,2]:[4,this.gpgpu.createAndWaitForFence()];case 1:t.sent(),t.label=2;case 2:return"complex64"!==a?[3,4]:[4,Promise.all([s.real.data(),s.imag.data()])];case 3:return m=t.sent(),g=m[0],y=m[1],v=No(g,y),[3,5];case 4:v=null==p?this.getValuesFromTexture(E):(x=L(o),this.gpgpu.downloadFloat32MatrixFromBuffer(p,x)),t.label=5;case 5:return null!=f&&this.disposeData(f.dataId),b=this.convertAndCacheOnCPU(E,v),w=this.pendingRead.get(E),this.pendingRead.delete(E),w.forEach(function(t){return t(b)}),this.pendingDisposal.has(E)&&(this.pendingDisposal.delete(E),this.disposeData(E),this.pendingDeletes--),[2,b]}})})},Ds.prototype.checkNumericalProblems=function(t){if(null!=t)for(var e=0;e_().getNumber("WEBGL_MAX_TEXTURES_IN_SHADER")){var o=Math.floor(t.length/2),i=this.concat(t.slice(0,o),e),a=this.concat(t.slice(o),e);return this.concat([i,a],e)}if(_().getBool("WEBGL_PACK_ARRAY_OPERATIONS")&&1 4 with a WebGL backend not implemented yet"});var r=e.reduce(function(t,e){return t*e}),o=Pr(t.shape,e,r),i=Br(o.length,e.length),a=Lr(t.shape,e,r),s=Wr(n,e.length),u=zr(a,n,e.length);return t.reshape(o).transpose(i).reshape(a).slice(s,u)},Ds.prototype.spaceToBatchND=function(t,e,n){P(t.rank<=4,function(){return"spaceToBatchND for rank > 4 with a WebGL backend not implemented yet"});var r=e.reduce(function(t,e){return t*e}),o=[[0,0]];o.push.apply(o,n);for(var i=1+e.length;i b);",t.shape,e.shape);return this.compileAndRun(n,[t,e],"bool")},Ds.prototype.greaterEqual=function(t,e){if(_().getBool("WEBGL_PACK_BINARY_OPERATIONS"))return this.packedBinaryOp(t,e,"\n return vec4(greaterThanEqual(a, b));\n","bool");var n=new hi("return float(a >= b);",t.shape,e.shape);return this.compileAndRun(n,[t,e],"bool")},Ds.prototype.logicalNot=function(t){var e=new as(t.shape,"return float(!(x >= 1.0));");return this.compileAndRun(e,[t])},Ds.prototype.logicalAnd=function(t,e){if(_().getBool("WEBGL_PACK_BINARY_OPERATIONS"))return this.packedBinaryOp(t,e,"\n return vec4(\n vec4(greaterThanEqual(a, vec4(1.0))) *\n vec4(greaterThanEqual(b, vec4(1.0))));\n","bool");var n=new hi("return float(a >= 1.0 && b >= 1.0);",t.shape,e.shape);return this.compileAndRun(n,[t,e],"bool")},Ds.prototype.logicalOr=function(t,e){if(_().getBool("WEBGL_PACK_BINARY_OPERATIONS"))return this.packedBinaryOp(t,e,"\n return min(\n vec4(greaterThanEqual(a, vec4(1.0))) +\n vec4(greaterThanEqual(b, vec4(1.0))),\n vec4(1.0));\n","bool");var n=new hi("return float(a >= 1.0 || b >= 1.0);",t.shape,e.shape);return this.compileAndRun(n,[t,e],"bool")},Ds.prototype.select=function(t,e,n){var r=new ja(t.rank,e.shape,e.rank);return this.compileAndRun(r,[t,e,n],Mt(e.dtype,n.dtype))},Ds.prototype.where=function(t){rn("tf.where() in webgl locks the UI thread. Call tf.whereAsync() instead");var e=t.dataSync();return Go(t.shape,e)},Ds.prototype.topk=function(t,e,n){return Vo(t.dataSync(),t.shape,t.dtype,e)},Ds.prototype.min=function(t,e){fn("min",e,t.rank);var n=hn(t.shape,e),r=n[0],o=L(n[1]),i=t.as2D(-1,o);return this.reduce(i,"min",i.dtype).reshape(r)},Ds.prototype.minimum=function(t,e){if(this.shouldExecuteOnCPU([t,e]))return this.cpuBackend.minimum(t,e);var n=_().getBool("WEBGL_PACK_BINARY_OPERATIONS")?new pi("\n vec4 result = vec4(min(a, b));\n vec4 isNaN = min(vec4(isnan(a)) + vec4(isnan(b)), vec4(1.0));\n \n result.r = isNaN.r > 0. ? NAN : result.r;\n result.g = isNaN.g > 0. ? NAN : result.g;\n result.b = isNaN.b > 0. ? NAN : result.b;\n result.a = isNaN.a > 0. ? NAN : result.a;\n\n return result;\n",t.shape,e.shape):new hi("\n if (isnan(a)) return a;\n if (isnan(b)) return b;\n\n return min(a, b);\n",t.shape,e.shape);return this.compileAndRun(n,[t,e])},Ds.prototype.mod=function(t,e){var n=_().getBool("WEBGL_PACK_BINARY_OPERATIONS")?new pi("\n vec4 result = mod(a, b);\n vec4 isNaN = vec4(equal(b, vec4(0.0)));\n \n result.r = isNaN.r > 0. ? NAN : result.r;\n result.g = isNaN.g > 0. ? NAN : result.g;\n result.b = isNaN.b > 0. ? NAN : result.b;\n result.a = isNaN.a > 0. ? NAN : result.a;\n\n return result;\n",t.shape,e.shape):new hi("if (b == 0.0) return NAN;\n return mod(a, b);",t.shape,e.shape);return this.compileAndRun(n,[t,e])},Ds.prototype.max=function(t,e){if(this.shouldExecuteOnCPU([t]))return this.cpuBackend.max(t,e);fn("max",e,t.rank);var n=hn(t.shape,e),r=n[0],o=L(n[1]),i=t.as2D(-1,o);return this.reduce(i,"max",i.dtype).reshape(r)},Ds.prototype.maximum=function(t,e){if(this.shouldExecuteOnCPU([t,e]))return this.cpuBackend.maximum(t,e);var n=_().getBool("WEBGL_PACK_BINARY_OPERATIONS")?new pi("\n vec4 result = vec4(max(a, b));\n vec4 isNaN = min(vec4(isnan(a)) + vec4(isnan(b)), vec4(1.0));\n \n result.r = isNaN.r > 0. ? NAN : result.r;\n result.g = isNaN.g > 0. ? NAN : result.g;\n result.b = isNaN.b > 0. ? NAN : result.b;\n result.a = isNaN.a > 0. ? NAN : result.a;\n\n return result;\n",t.shape,e.shape):new hi("\n if (isnan(a)) return a;\n if (isnan(b)) return b;\n\n return max(a, b);\n",t.shape,e.shape);return this.compileAndRun(n,[t,e])},Ds.prototype.all=function(t,e){fn("all",e,t.rank);var n=hn(t.shape,e),r=n[0],o=L(n[1]),i=t.as2D(-1,o);return this.reduce(i,"all",i.dtype).reshape(r)},Ds.prototype.any=function(t,e){fn("any",e,t.rank);var n=hn(t.shape,e),r=n[0],o=L(n[1]),i=t.as2D(-1,o);return this.reduce(i,"any",i.dtype).reshape(r)},Ds.prototype.squaredDifference=function(t,e){var n=_().getBool("WEBGL_PACK_BINARY_OPERATIONS")?new pi("return (a - b) * (a - b);",t.shape,e.shape):new hi("return (a - b) * (a - b);",t.shape,e.shape);return this.compileAndRun(n,[t,e])},Ds.prototype.realDivide=function(t,e){if(_().getBool("WEBGL_PACK_BINARY_OPERATIONS"))return this.packedBinaryOp(t,e,"\n // vec4 one = vec4(equal(a, b));\n // return one + (vec4(1.0) - one) * a / b;\n vec4 result = a / b;\n if(a.x == b.x) {\n result.x = 1.;\n }\n if(a.y == b.y) {\n result.y = 1.;\n }\n if(a.z == b.z) {\n result.z = 1.;\n }\n if(a.w == b.w) {\n result.w = 1.;\n }\n\n return result;\n","float32",!0);var n=new hi("\nif (a == b) {\n return 1.0;\n};\nreturn a / b;",t.shape,e.shape);return this.compileAndRun(n,[t,e],"float32")},Ds.prototype.floorDiv=function(t,e){if(_().getBool("WEBGL_PACK_BINARY_OPERATIONS"))return this.packedBinaryOp(t,e,"\n ivec4 ia = round(a);\n ivec4 ib = round(b);\n bvec4 cond = notEqual(ib, ivec4(0));\n ivec4 result = ivec4(0);\n vec4 s = sign(a) * sign(b);\n\n // Windows (D3D) wants guaranteed non-zero int division at compile-time.\n if (cond[0]) {\n result[0] = idiv(ia[0], ib[0], s[0]);\n }\n if (cond[1]) {\n result[1] = idiv(ia[1], ib[1], s[1]);\n }\n if (cond[2]) {\n result[2] = idiv(ia[2], ib[2], s[2]);\n }\n if (cond[3]) {\n result[3] = idiv(ia[3], ib[3], s[3]);\n }\n return vec4(result);\n","int32");var n=new hi("\n float s = sign(a) * sign(b);\n int ia = round(a);\n int ib = round(b);\n if (ib != 0) {\n // Windows (D3D) wants guaranteed non-zero int division at compile-time.\n return float(idiv(ia, ib, s));\n } else {\n return NAN;\n }\n",t.shape,e.shape);return this.compileAndRun(n,[t,e],"int32")},Ds.prototype.add=function(t,e){if("complex64"===t.dtype&&"complex64"===e.dtype)return this.complexSeparableBinaryOp(t,e,mi);if(this.shouldExecuteOnCPU([t,e]))return this.cpuBackend.add(t,e);var n=Mt(t.dtype,e.dtype);if(_().getBool("WEBGL_PACK_BINARY_OPERATIONS"))return this.packedBinaryOp(t,e,mi,n);var r=new hi(mi,t.shape,e.shape);return this.compileAndRun(r,[t,e],n)},Ds.prototype.packedUnaryOp=function(t,e,n){var r=new ss(t.shape,e);return this.compileAndRun(r,[t],n)},Ds.prototype.packedBinaryOp=function(t,e,n,r,o){void 0===o&&(o=!1);var i=new pi(n,t.shape,e.shape,o);return this.compileAndRun(i,[t,e],r)},Ds.prototype.complexSeparableBinaryOp=function(a,s,u){var c=this,t=this.texData.get(a.dataId),e=this.texData.get(s.dataId),n=[[t.complexTensors.real,e.complexTensors.real],[t.complexTensors.imag,e.complexTensors.imag]].map(function(t){var e=t[0],n=t[1],r=c.makeComplexComponentTensorInfo(a,e),o=c.makeComplexComponentTensorInfo(s,n),i=new hi(u,a.shape,s.shape);return c.compileAndRun(i,[r,o],Mt(e.dtype,n.dtype))}),r=n[0],o=n[1],i=this.complex(r,o);return r.dispose(),o.dispose(),i},Ds.prototype.makeComplexComponentTensorInfo=function(t,e){return{dataId:e.dataId,dtype:e.dtype,shape:t.shape}},Ds.prototype.addN=function(t){if(1===t.length)return t[0];if(t.length>_().get("WEBGL_MAX_TEXTURES_IN_SHADER")){var e=Math.floor(t.length/2),n=this.addN(t.slice(0,e)),r=this.addN(t.slice(e));return this.addN([n,r])}var o=t.map(function(t){return t.dtype}).reduce(function(t,e){return Mt(t,e)}),i=t.map(function(t){return t.shape}),a=_().getBool("WEBGL_PACK")?new qo(t[0].shape,i):new Ho(t[0].shape,i);return this.compileAndRun(a,t,o)},Ds.prototype.subtract=function(t,e){if("complex64"===t.dtype&&"complex64"===e.dtype)return this.complexSeparableBinaryOp(t,e,gi);if(this.shouldExecuteOnCPU([t,e]))return this.cpuBackend.subtract(t,e);var n=Mt(t.dtype,e.dtype);if(_().getBool("WEBGL_PACK_BINARY_OPERATIONS"))return this.packedBinaryOp(t,e,gi,t.dtype);var r=new hi(gi,t.shape,e.shape);return this.compileAndRun(r,[t,e],n)},Ds.prototype.pow=function(t,e){var n=_().getBool("WEBGL_PACK_BINARY_OPERATIONS")?new pi("\n // isModRound1 has 1 for components with round(mod(b, 2.0)) == 1, 0 otherwise.\n vec4 isModRound1 = vec4(equal(round(mod(b, 2.0)), ivec4(1)));\n vec4 multiplier = sign(a) * isModRound1 + (vec4(1.0) - isModRound1);\n vec4 result = multiplier * pow(abs(a), b);\n\n // Ensure that a^0 = 1, including 0^0 = 1 as this correspond to TF and JS\n bvec4 isExpZero = equal(b, vec4(0.0));\n result.r = isExpZero.r ? 1.0 : result.r;\n result.g = isExpZero.g ? 1.0 : result.g;\n result.b = isExpZero.b ? 1.0 : result.b;\n result.a = isExpZero.a ? 1.0 : result.a;\n\n vec4 isNaN = vec4(lessThan(a, vec4(0.0))) * vec4(lessThan(floor(b), b));\n \n result.r = isNaN.r > 0. ? NAN : result.r;\n result.g = isNaN.g > 0. ? NAN : result.g;\n result.b = isNaN.b > 0. ? NAN : result.b;\n result.a = isNaN.a > 0. ? NAN : result.a;\n\n return result;\n",t.shape,e.shape):new hi("\nif(a < 0.0 && floor(b) < b){\n return NAN;\n}\nif (b == 0.0) {\n return 1.0;\n}\nreturn (round(mod(b, 2.0)) != 1) ?\n pow(abs(a), b) : sign(a) * pow(abs(a), b);\n",t.shape,e.shape),r=Mt(t.dtype,e.dtype);return this.compileAndRun(n,[t,e],r)},Ds.prototype.ceil=function(t){if(this.shouldExecuteOnCPU([t]))return this.cpuBackend.ceil(t);if(_().getBool("WEBGL_PACK_UNARY_OPERATIONS"))return this.packedUnaryOp(t,gs,t.dtype);var e=new as(t.shape,gs);return this.compileAndRun(e,[t])},Ds.prototype.floor=function(t){if(this.shouldExecuteOnCPU([t]))return this.cpuBackend.floor(t);if(_().getBool("WEBGL_PACK_UNARY_OPERATIONS"))return this.packedUnaryOp(t,ys,t.dtype);var e=new as(t.shape,ys);return this.compileAndRun(e,[t])},Ds.prototype.sign=function(t){var e=new as(t.shape,"\n if (isnan(x)) { return 0.0; }\n return sign(x);\n");return this.compileAndRun(e,[t])},Ds.prototype.isNaN=function(t){var e=new as(t.shape,"return float(isnan(x));");return this.compileAndRun(e,[t],"bool")},Ds.prototype.isInf=function(t){var e=new as(t.shape,"return float(isinf(x));");return this.compileAndRun(e,[t],"bool")},Ds.prototype.isFinite=function(t){var e=new as(t.shape,"return float(!isnan(x) && !isinf(x));");return this.compileAndRun(e,[t],"bool")},Ds.prototype.round=function(t){var e=new as(t.shape,"\n // OpenGL ES does not support round function.\n // The algorithm is based on banker's rounding.\n float base = floor(x);\n if ((x - base) < 0.5) {\n return floor(x);\n } else if ((x - base) > 0.5) {\n return ceil(x);\n } else {\n if (mod(base, 2.0) == 0.0) {\n return base;\n } else {\n return base + 1.0;\n }\n }\n");return this.compileAndRun(e,[t])},Ds.prototype.exp=function(t){if(this.shouldExecuteOnCPU([t]))return this.cpuBackend.exp(t);if(_().getBool("WEBGL_PACK_UNARY_OPERATIONS"))return this.packedUnaryOp(t,xs,t.dtype);var e=new as(t.shape,xs);return this.compileAndRun(e,[t])},Ds.prototype.expm1=function(t){if(this.shouldExecuteOnCPU([t]))return this.cpuBackend.expm1(t);if(_().getBool("WEBGL_PACK_UNARY_OPERATIONS"))return this.packedUnaryOp(t,bs,t.dtype);var e=new as(t.shape,bs);return this.compileAndRun(e,[t])},Ds.prototype.log=function(t){if(this.shouldExecuteOnCPU([t]))return this.cpuBackend.log(t);if(_().getBool("WEBGL_PACK_UNARY_OPERATIONS"))return this.packedUnaryOp(t,"\n vec4 result = log(x);\n vec4 isNaN = vec4(lessThan(x, vec4(0.0)));\n result.r = isNaN.r == 1.0 ? NAN : result.r;\n result.g = isNaN.g == 1.0 ? NAN : result.g;\n result.b = isNaN.b == 1.0 ? NAN : result.b;\n result.a = isNaN.a == 1.0 ? NAN : result.a;\n\n return result;\n",t.dtype);var e=new as(t.shape,"if (x < 0.0) return NAN;\n return log(x);");return this.compileAndRun(e,[t])},Ds.prototype.log1p=function(t){var e=new as(t.shape,"return log(1.0 + x);");return this.compileAndRun(e,[t])},Ds.prototype.sqrt=function(t){var e=new as(t.shape,"return sqrt(x);");return this.compileAndRun(e,[t])},Ds.prototype.rsqrt=function(t){if(this.shouldExecuteOnCPU([t]))return this.cpuBackend.rsqrt(t);var e=new as(t.shape,"return inversesqrt(x);");return this.compileAndRun(e,[t])},Ds.prototype.reciprocal=function(t){var e=new as(t.shape,"return 1.0 / x;");return this.compileAndRun(e,[t])},Ds.prototype.relu=function(t){var e;return e=_().getBool("WEBGL_PACK")?new ss(t.shape,Cs):new as(t.shape,fs),this.compileAndRun(e,[t])},Ds.prototype.relu6=function(t){var e;return e=_().getBool("WEBGL_PACK")?new ss(t.shape,Es):new as(t.shape,ds),this.compileAndRun(e,[t])},Ds.prototype.prelu=function(t,e){var n=_().getBool("WEBGL_PACK_BINARY_OPERATIONS")?new pi(bi,t.shape,e.shape):new hi(xi,t.shape,e.shape);return this.compileAndRun(n,[t,e])},Ds.prototype.elu=function(t){if(_().getBool("WEBGL_PACK_UNARY_OPERATIONS"))return this.packedUnaryOp(t,_s,t.dtype);var e=new as(t.shape,vs);return this.compileAndRun(e,[t])},Ds.prototype.eluDer=function(t,e){var n=_().getBool("WEBGL_PACK_BINARY_OPERATIONS")?new pi("\n vec4 bGTEZero = vec4(greaterThanEqual(b, vec4(0.)));\n return (bGTEZero * a) + ((vec4(1.0) - bGTEZero) * (a * (b + vec4(1.0))));\n",t.shape,e.shape):new hi("return (b >= 1.0) ? a : a * (b + 1.0);",t.shape,e.shape);return this.compileAndRun(n,[t,e])},Ds.prototype.selu=function(t){var e=new as(t.shape,"\n // Stable and Attracting Fixed Point (0, 1) for Normalized Weights.\n // see: https://arxiv.org/abs/1706.02515\n float scaleAlpha = 1.7580993408473768;\n float scale = 1.0507009873554805;\n return (x >= 0.0) ? scale * x : scaleAlpha * (exp(x) - 1.0);\n");return this.compileAndRun(e,[t])},Ds.prototype.int=function(t){var e=new as(t.shape,"return float(int(x));");return this.compileAndRun(e,[t],"int32")},Ds.prototype.clip=function(t,e,n){var r,o=(r=_().getBool("WEBGL_PACK_CLIP")?new Ci(t.shape):new wi(t.shape)).getCustomSetupFunc(e,n);return this.compileAndRun(r,[t],null,o)},Ds.prototype.abs=function(t){if(this.shouldExecuteOnCPU([t]))return this.cpuBackend.abs(t);if(_().getBool("WEBGL_PACK_UNARY_OPERATIONS"))return this.packedUnaryOp(t,ps,t.dtype);var e=new as(t.shape,ps);return this.compileAndRun(e,[t])},Ds.prototype.complexAbs=function(t){var e=this.texData.get(t.dataId),n=new fi(t.shape),r=[this.makeComplexComponentTensorInfo(t,e.complexTensors.real),this.makeComplexComponentTensorInfo(t,e.complexTensors.imag)];return this.compileAndRun(n,r)},Ds.prototype.sigmoid=function(t){var e=new as(t.shape,"return 1.0 / (1.0 + exp(-1.0 * x));");return this.compileAndRun(e,[t])},Ds.prototype.softplus=function(t){var e=new as(t.shape,"\n float epsilon = 1.1920928955078125e-7;\n float threshold = log(epsilon) + 2.0;\n\n bool too_large = x > -threshold;\n bool too_small = x < threshold;\n\n float result;\n float exp_x = exp(x);\n\n if (too_large){\n result = x;\n }\n else if (too_small){\n result = exp_x;\n }\n else{\n result = log(exp_x + 1.0);\n }\n return result;\n");return this.compileAndRun(e,[t])},Ds.prototype.sin=function(t){var e=new as(t.shape,"if (isnan(x)) return x;\n return sin(x);\n");return this.compileAndRun(e,[t])},Ds.prototype.cos=function(t){var e=new as(t.shape,"if (isnan(x)) return x;\n return cos(x);\n");return this.compileAndRun(e,[t])},Ds.prototype.tan=function(t){var e=new as(t.shape,"return tan(x);");return this.compileAndRun(e,[t])},Ds.prototype.asin=function(t){var e=new as(t.shape,"if (isnan(x)) return x;\n if (abs(x) > 1.) {\n return NAN;\n }\n return asin(x);\n");return this.compileAndRun(e,[t])},Ds.prototype.acos=function(t){var e=new as(t.shape,"if (isnan(x)) return x;\n if (abs(x) > 1.) {\n return NAN;\n }\n return acos(x);\n");return this.compileAndRun(e,[t])},Ds.prototype.atan=function(t){var e=new as(t.shape,"if (isnan(x)) return x;\n return atan(x);\n");return this.compileAndRun(e,[t])},Ds.prototype.atan2=function(t,e){var n=_().getBool("WEBGL_PACK_BINARY_OPERATIONS")?new pi("\n vec4 result = atan(a, b);\n vec4 isNaN = min(vec4(isnan(a)) + vec4(isnan(b)), vec4(1.0));\n \n result.r = isNaN.r > 0. ? NAN : result.r;\n result.g = isNaN.g > 0. ? NAN : result.g;\n result.b = isNaN.b > 0. ? NAN : result.b;\n result.a = isNaN.a > 0. ? NAN : result.a;\n\n return result;\n",t.shape,e.shape):new hi("\n if (isnan(a)) return a;\n if (isnan(b)) return b;\n\n return atan(a, b);\n",t.shape,e.shape);return this.compileAndRun(n,[t,e])},Ds.prototype.sinh=function(t){var e=new as(t.shape,"\n float e2x = exp(x);\n return (e2x - 1.0 / e2x) / 2.0;\n");return this.compileAndRun(e,[t])},Ds.prototype.cosh=function(t){var e=new as(t.shape,"\n float e2x = exp(-x);\n return (e2x + 1.0 / e2x) / 2.0;\n");return this.compileAndRun(e,[t])},Ds.prototype.tanh=function(t){var e=new as(t.shape,"\n float e2x = exp(-2.0 * abs(x));\n return sign(x) * (1.0 - e2x) / (1.0 + e2x);\n");return this.compileAndRun(e,[t])},Ds.prototype.asinh=function(t){var e=new as(t.shape,"if (isnan(x)) return x;return log(x + sqrt(x * x + 1.0));");return this.compileAndRun(e,[t])},Ds.prototype.acosh=function(t){var e=new as(t.shape,"if (isnan(x)) return x;\n if (x < 1.0) return NAN;\n return log(x + sqrt(x * x - 1.0));");return this.compileAndRun(e,[t])},Ds.prototype.atanh=function(t){var e=new as(t.shape,"if (isnan(x)) return x;\n if ((x < -1.0) || (x > 1.0)) return NAN;\n return (log(1.0 + x) - log(1.0 - x)) / 2.0;");return this.compileAndRun(e,[t])},Ds.prototype.erf=function(t){var e=new as(t.shape,'\n // Error function is calculated approximately with elementary function.\n // See "Handbook of Mathematical Functions with Formulas,\n // Graphs, and Mathematical Tables", Abramowitz and Stegun.\n float p = 0.3275911;\n float a1 = 0.254829592;\n float a2 = -0.284496736;\n float a3 = 1.421413741;\n float a4 = -1.453152027;\n float a5 = 1.061405429;\n\n float sign = sign(x);\n x = abs(x);\n float t = 1.0 / (1.0 + p * x);\n return sign * (1.0 - (((((a5*t + a4)*t) + a3)*t + a2)*t + a1)*t*exp(-x*x));\n');return this.compileAndRun(e,[t])},Ds.prototype.step=function(t,e){var n,r=new as(t.shape,(void 0===(n=e)&&(n=0),hs+"\n return x > 0.0 ? 1.0 : float("+n+");\n "));return this.compileAndRun(r,[t])},Ds.prototype.conv2dByMatMul=function(t,e,n,r,o,i){var a=t.shape,s=this.texData.get(t.dataId),u=n.inChannels,c=a[0]*a[1]*a[2],l=n.outChannels,h="channelsLast"===n.dataFormat,p=(1==c||1===l)&&1e3 1 for depthToSpace, but was: "+e});var r=t.shape[0],o="NHWC"===n?t.shape[1]:t.shape[2],i="NHWC"===n?t.shape[2]:t.shape[3],a="NHWC"===n?t.shape[3]:t.shape[1],s=o*e,u=i*e,c=a/(e*e),l=new Xi("NHWC"===n?[r,s,u,c]:[r,c,s,u],e,n);return this.compileAndRun(l,[t])},Ds.prototype.split=function(t,e,n){return zo(t,e,n)},Ds.prototype.scatterND=function(t,e,n){var r=jr(0,t,n),o=r.sliceRank,i=r.numUpdates,a=r.sliceSize,s=r.strides,u=r.outputSize,c=[u/a,a],l=t.reshape([i,o]),h=e.reshape([i,a]);if(0===u)return Do(En([]),n);var p=In(0),f=new Ha(i,o,l.rank,h.rank,s,c);return this.compileAndRun(f,[h,l,p]).reshape(n)},Ds.prototype.sparseToDense=function(t,e,n,r){var o=jr(0,t,n),i=o.sliceRank,a=o.numUpdates,s=o.strides,u=o.outputSize,c=new Ha(a,i,t.rank,e.rank,s,[u,1],!1);return this.compileAndRun(c,[e,t,r]).reshape(n)},Ds.prototype.fft=function(t){return this.fftImpl(t,!1)},Ds.prototype.ifft=function(t){return this.fftImpl(t,!0)},Ds.prototype.fftImpl=function(t,e){var n=this.texData.get(t.dataId),r=new ji("return real * expR - imag * expI;",t.shape,e),o=new ji("return real * expI + imag * expR;",t.shape,e),i=[this.makeComplexComponentTensorInfo(t,n.complexTensors.real),this.makeComplexComponentTensorInfo(t,n.complexTensors.imag)],a=this.compileAndRun(r,i),s=this.compileAndRun(o,i),u=this.complex(a,s).as2D(t.shape[0],t.shape[1]);return a.dispose(),s.dispose(),u},Ds.prototype.gatherND=function(t,e){var n=e.shape,r=n[n.length-1],o=Ur(t,e),i=o[0],a=o[1],s=o[2],u=o[3],c=e.reshape([a,r]),l=t.reshape([t.size/s,s]),h=new Qi(r,u,[a,s]);return this.compileAndRun(h,[l,c]).reshape(i)},Ds.prototype.fill=function(t,e,n){if("string"===(n=n||j(e))){var r=F(n,L(t));return r.fill(e),qt.makeTensor(r,t,n,this)}var o=new Yi(t,e),i=o.getCustomSetupFunc(e);return this.compileAndRun(o,[],n,i)},Ds.prototype.onesLike=function(t){if("string"===t.dtype)throw new Error("onesLike is not supported under string dtype");return this.fill(t.shape,1,t.dtype)},Ds.prototype.zerosLike=function(t){return this.fill(t.shape,"string"===t.dtype?"":0,t.dtype)},Ds.prototype.linspace=function(t,e,n){return Ao(t,e,n)},Ds.prototype.makeTensorInfo=function(t,e){var n=this.write(null,t,e);return this.texData.get(n).usage=null,{dataId:n,shape:t,dtype:e}},Ds.prototype.makeOutput=function(t,e){var n=this.makeTensorInfo(t,e).dataId;return qt.makeTensorFromDataId(n,t,e,this)},Ds.prototype.unpackTensor=function(t){var e=new us(t.shape);return this.runWebGLProgram(e,[t],t.dtype)},Ds.prototype.packTensor=function(t){var e=new Sa(t.shape);return this.runWebGLProgram(e,[t],t.dtype,null,!0)},Ds.prototype.packedReshape=function(t,e){var n=[Pe(t.shape)].concat(Be(t.shape)),r={dtype:t.dtype,shape:n,dataId:t.dataId},o=[Pe(e)].concat(Be(e)),i=new Pa(o,n),a=this.runWebGLProgram(i,[r],t.dtype,null,!0);return{dataId:a.dataId,shape:e,dtype:a.dtype}},Ds.prototype.decode=function(t){var e,n=this.texData.get(t),r=n.isPacked,o=n.shape,i=n.dtype,a=Le(o);return e=r?new zi(a):new Wi(a),{dtype:i,shape:o,dataId:this.runWebGLProgram(e,[{shape:a,dtype:i,dataId:t}],i,null,!0).dataId}},Ds.prototype.runWebGLProgram=function(o,t,e,n,r){var i=this;void 0===r&&(r=!1);var a=this.makeTensorInfo(o.outputShape,e),s=this.texData.get(a.dataId);if(o.packedOutput&&(s.isPacked=!0),o.outPackingScheme===Xt.DENSE){var u=ie(o.outputShape);s.texShape=u.map(function(t){return 2*t})}if(null!=o.outTexUsage&&(s.usage=o.outTexUsage),0===L(a.shape))return s.values=N(a.dtype,0),a;var c=[],l=t.map(function(t){if("complex64"===t.dtype)throw new Error("GPGPUProgram does not support complex64 input. For complex64 dtypes, please separate the program into real and imaginary parts.");var e=i.texData.get(t.dataId);if(null==e.texture){if(!o.packedInputs&&L(t.shape)<=_().getNumber("WEBGL_SIZE_UPLOAD_UNIFORM"))return{shape:t.shape,texData:null,isUniform:!0,uniformValues:e.values};o.packedInputs&&(e.isPacked=!0,e.shape=t.shape)}else if(!!e.isPacked!=!!o.packedInputs)t=e.isPacked?i.unpackTensor(t):i.packTensor(t),c.push(t),e=i.texData.get(t.dataId);else if(e.isPacked&&!Ue(e.shape,t.shape)){var n=t,r=t.shape;t.shape=e.shape,t=i.packedReshape(t,r),c.push(t),e=i.texData.get(t.dataId),n.shape=r}return i.uploadToGPU(t.dataId),{shape:t.shape,texData:e,isUniform:!1}});this.uploadToGPU(a.dataId);var h,p={shape:a.shape,texData:s,isUniform:!1},f=function(t,e,n){var r="";l.concat(n).forEach(function(t){var e=null!=t.texData&&null!=t.texData.slice&&01024*this.numMBBeforeWarning*1024){var o=(this.numBytesInGPU/1024/1024).toFixed(2);this.warnedAboutMemory=!0,console.warn("High memory usage in GPU: "+o+" MB, most likely due to a memory leak")}return this.textureManager.acquireTexture(t,e,r)},Ds.prototype.computeBytes=function(t,e){return t[0]*t[1]*U(e)},Ds);function Ds(t){var e,n=ks.call(this)||this;if(n.pendingRead=new WeakMap,n.pendingDisposal=new WeakSet,n.dataRefCount=new WeakMap,n.numBytesInGPU=0,n.uploadWaitMs=0,n.downloadWaitMs=0,n.warnedAboutMemory=!1,n.pendingDeletes=0,n.disposed=!1,!_().getBool("HAS_WEBGL"))throw new Error("WebGL is not supported on this device");if(null==t){var r=re(_().getNumber("WEBGL_VERSION"));n.binaryCache=((e=_().getNumber("WEBGL_VERSION"))in Is||(Is[e]={}),Is[e]),n.gpgpu=new ga(r),n.canvas=r.canvas,n.gpgpuCreatedLocally=!0}else n.gpgpu=t,n.binaryCache={},n.gpgpuCreatedLocally=!1,n.canvas=t.gl.canvas;return n.textureManager=new Qa(n.gpgpu),n.numMBBeforeWarning=null==_().global.screen?1024:_().global.screen.height*_().global.screen.width*window.devicePixelRatio*600/1024/1024,n.texData=new so(n,qt),n}jt()&&qt.registerBackend("webgl",function(){return new Ss},2),h({kernelName:"Square",gradFunc:function(t,e){var n=e[0];return{x:function(){return t.mul(n.toFloat().mul(2))}}}});var As=xn({square_:function(t){var n=sn(t,"x","square"),e=[n];return qt.runKernelFunc(function(t,e){return e([n]),t.square(n)},{x:n},null,"Square",{},e,[])}}),Ts=xn({abs_:function(t){var r=sn(t,"x","abs");return"complex64"===r.dtype?qt.runKernelFunc(function(t){return t.complexAbs(r)},{$x:r}):qt.runKernelFunc(function(t,e){var n=t.abs(r);return e([r]),n},{x:r},function(t,e){var n=e[0];return{x:function(){return t.mul(n.toFloat().step(-1))}}},"Abs")}}),Ns=xn({acos_:function(t){var r=sn(t,"x","acos");return qt.runKernelFunc(function(t,e){var n=t.acos(r);return e([r]),n},{$x:r},function(t,e){var n=e[0];return{$x:function(){return t.divStrict(In(1).sub(n.toFloat().square()).sqrt()).neg()}}})}}),Fs=xn({acosh_:function(t){var r=sn(t,"x","acosh");return qt.runKernelFunc(function(t,e){var n=t.acosh(r);return e([r]),n},{$x:r},function(t,e){var n=e[0];return{$x:function(){return t.divStrict(n.toFloat().square().sub(1).sqrt())}}})}}),Ms=xn({asin_:function(t){var r=sn(t,"x","asin");return qt.runKernelFunc(function(t,e){var n=t.asin(r);return e([r]),n},{$x:r},function(t,e){var n=e[0];return{$x:function(){return t.divStrict(In(1).sub(n.toFloat().square()).sqrt())}}})}}),Os=xn({asinh_:function(t){var r=sn(t,"x","asinh");return qt.runKernelFunc(function(t,e){var n=t.asinh(r);return e([r]),n},{$x:r},function(t,e){var n=e[0];return{$x:function(){return t.divStrict(In(1).add(n.toFloat().square()).sqrt())}}})}}),Ps=xn({atan_:function(t){var r=sn(t,"x","atan");return qt.runKernelFunc(function(t,e){var n=t.atan(r);return e([r]),n},{$x:r},function(t,e){var n=e[0];return{$x:function(){return t.div(n.toFloat().square().add(1))}}})}}),Bs=xn({atanh_:function(t){var r=sn(t,"x","atanh");return qt.runKernelFunc(function(t,e){var n=t.atanh(r);return e([r]),n},{$x:r},function(t,e){var n=e[0];return{$x:function(){return t.div(In(1).sub(n.toFloat().square()))}}})}}),Ls=xn({ceil_:function(t){var e=sn(t,"x","ceil");return qt.runKernelFunc(function(t){return t.ceil(e)},{$x:e},function(t){return{$x:function(){return Wn(t)}}})}}),Ws=xn({clipByValue_:function(t,r,o){var i=sn(t,"x","clipByValue");P(r<=o,function(){return"Error in clip: min ("+r+") must be less than or equal to max ("+o+")."});var e=[i],n={min:r,max:o};return qt.runKernelFunc(function(t,e){var n=t.clip(i,r,o);return e([i]),n},{x:i},function(t,e){var n=e[0];return{x:function(){return t.where(n.greaterEqual(r).logicalAnd(n.lessEqual(o)),Wn(t))}}},"ClipByValue",n,e)}}),zs=xn({cos_:function(t){var r=sn(t,"x","cos"),e=[r];return qt.runKernelFunc(function(t,e){var n=t.cos(r);return e([r]),n},{x:r},function(t,e){var n=e[0];return{x:function(){return n.toFloat().sin().neg().mul(t)}}},"Cos",{},e)}}),Us=xn({cosh_:function(t){var r=sn(t,"x","cosh");return qt.runKernelFunc(function(t,e){var n=t.cosh(r);return e([r]),n},{$x:r},function(t,e){var n=e[0];return{$x:function(){return n.toFloat().sinh().mulStrict(t)}}})}}),Vs=xn({erf_:function(t){var r=sn(t,"x","erf");return P("int32"===r.dtype||"float32"===r.dtype,function(){return"Input dtype must be `int32` or `float32`."}),"int32"===r.dtype&&(r=r.toFloat()),qt.runKernelFunc(function(t,e){var n=t.erf(r);return e([r]),n},{$x:r},function(t,e){var n=e[0];return{$x:function(){return t.mul(n.square().neg().exp().mul(2/Math.sqrt(Math.PI)))}}})}}),Gs=xn({exp_:function(t){var r=sn(t,"x","exp");return qt.runKernelFunc(function(t,e){var n=t.exp(r);return e([n]),n},{x:r},function(t,e){return{x:function(){return t.mulStrict(e[0])}}},"Exp",{},[],[!0])}}),Hs=xn({expm1_:function(t){var r=sn(t,"x","expm1");return qt.runKernelFunc(function(t,e){var n=t.expm1(r);return e([r]),n},{$x:r},function(t,e){var n=e[0];return{$x:function(){return t.mul(n.exp())}}})}}),qs=xn({floor_:function(t){var e=sn(t,"x","floor");return qt.runKernelFunc(function(t){return t.floor(e)},{$x:e},function(t){return{$x:function(){return Wn(t)}}})}}),js=xn({log_:function(t){var r=sn(t,"x","log"),e=[r];return qt.runKernelFunc(function(t,e){var n=t.log(r);return e([r]),n},{x:r},function(t,e){var n=e[0];return{x:function(){return t.div(n.toFloat())}}},"Log",{},e)}}),Ks=xn({log1p_:function(t){var r=sn(t,"x","log1p");return qt.runKernelFunc(function(t,e){var n=t.log1p(r);return e([r]),n},{$x:r},function(t,e){var n=e[0];return{$x:function(){return t.div(n.add(1))}}})}}),Xs=xn({logSigmoid_:function(t){var r=sn(t,"x","logSigmoid");return qt.runKernelFunc(function(t,e){var n=t.softplus(r.neg()).neg();return e([r]),n},{$x:r},function(t,e){var n=e[0];return{$x:function(){return t.mul(n.neg().sigmoid())}}})}}),Ys=xn({neg_:function(t){var e=sn(t,"x","neg");return qt.runKernelFunc(function(t){return t.neg(e)},{$x:e},function(t){return{$x:function(){return t.neg()}}})}}),$s=xn({reciprocal_:function(t){var r=sn(t,"x","reciprocal");return qt.runKernelFunc(function(t,e){var n=t.reciprocal(r);return e([r]),n},{$x:r},function(t,e){var n=e[0];return{$x:function(){return t.div(n.square().neg())}}})}}),Js=xn({round_:function(t){var e=sn(t,"x","round");return qt.runKernelFunc(function(t){return t.round(e)},{$x:e},function(t){return{$x:function(){return Wn(t)}}})}}),Qs=xn({rsqrt_:function(t){var r=sn(t,"x","rsqrt"),e=[r];return qt.runKernelFunc(function(t,e){var n=t.rsqrt(r);return e([r]),n},{x:r},function(t,e){var n=e[0];return{x:function(){return t.div(n.pow(1.5).mul(2)).neg()}}},"Rsqrt",{},e)}}),Zs=xn({sigmoid_:function(t){var r=sn(t,"x","sigmoid");return qt.runKernelFunc(function(t,e){var n=t.sigmoid(r);return e([n]),n},{x:r},function(t,e){var n=e[0];return{x:function(){return t.mul(n.mul(In(1).sub(n)))}}},"Sigmoid")}}),tu=xn({sign_:function(t){var e=sn(t,"x","sign");return qt.runKernelFunc(function(t){return t.sign(e)},{$x:e},function(t){return{$x:function(){return Wn(t)}}})}}),eu=xn({isNaN_:function(t){var e=sn(t,"x","isNaN");return qt.runKernelFunc(function(t){return t.isNaN(e)},{$x:e},function(t){return{$x:function(){return Wn(t)}}})}}),nu=xn({isInf_:function(t){var e=sn(t,"x","isInf");return qt.runKernelFunc(function(t){return t.isInf(e)},{$x:e},function(t){return{$x:function(){return Wn(t)}}})}}),ru=xn({isFinite_:function(t){var e=sn(t,"x","isFinite");return qt.runKernelFunc(function(t){return t.isFinite(e)},{$x:e},function(t){return{$x:function(){return Wn(t)}}})}}),ou=xn({sin_:function(t){var r=sn(t,"x","sin"),e=[r];return qt.runKernelFunc(function(t,e){var n=t.sin(r);return e([r]),n},{x:r},function(t,e){var n=e[0];return{x:function(){return n.toFloat().cos().mul(t)}}},"Sin",{},e)}}),iu=xn({sinh_:function(t){var r=sn(t,"x","sinh");return qt.runKernelFunc(function(t,e){var n=t.sinh(r);return e([r]),n},{$x:r},function(t,e){var n=e[0];return{$x:function(){return n.toFloat().cosh().mulStrict(t)}}})}}),au=xn({softplus_:function(t){var r=sn(t,"x","softplus");return qt.runKernelFunc(function(t,e){var n=t.softplus(r);return e([r]),n},{$x:r},function(t,e){var n=e[0];return{$x:function(){return t.mul(n.sigmoid())}}})}}),su=xn({sqrt_:function(t){var r=sn(t,"x","sqrt");return qt.runKernelFunc(function(t,e){var n=t.sqrt(r);return e([r]),n},{$x:r},function(t,e){var n=e[0];return{$x:function(){return t.div(n.toFloat().sqrt().mul(2))}}})}}),uu=xn({step_:function(t,e){void 0===e&&(e=0);var n=sn(t,"x","step");return qt.runKernelFunc(function(t){return t.step(n,e)},{$x:n},function(t){return{$x:function(){return Wn(t)}}})}}),cu=xn({tan_:function(t){var r=sn(t,"x","tan");return qt.runKernelFunc(function(t,e){var n=t.tan(r);return e([r]),n},{$x:r},function(t,e){var n=e[0];return{$x:function(){return t.div(n.cos().square())}}})}}),lu=xn({tanh_:function(t){var r=sn(t,"x","tanh");return qt.runKernelFunc(function(t,e){var n=t.tanh(r);return e([n]),n},{x:r},function(t,e){var n=e[0];return{x:function(){return In(1).sub(n.square()).mulStrict(t)}}},"Tanh",{},null,[!0])}});function hu(t,e,n,r,o,i){var a,s,u=sn(t,"x","batchNorm"),c=sn(e,"mean","batchNorm"),l=sn(n,"variance","batchNorm");return null!=o&&(a=sn(o,"scale","batchNorm")),null!=r&&(s=sn(r,"offset","batchNorm")),P(2===u.rank,function(){return"Error in batchNorm3D: x must be rank 3 but got rank "+u.rank+"."}),P(2===c.rank||1===c.rank,function(){return"Error in batchNorm2D: mean must be rank 2 or rank 1 but got rank "+c.rank+"."}),P(2===l.rank||1===l.rank,function(){return"Error in batchNorm2D: variance must be rank 2 or rank 1 but got rank "+l.rank+"."}),null!=a&&P(2===a.rank||1===a.rank,function(){return"Error in batchNorm2D: scale must be rank 2 or rank 1 but got rank "+a.rank+"."}),null!=s&&P(2===s.rank||1===s.rank,function(){return"Error in batchNorm2D: offset must be rank 2 or rank 1 but got rank "+s.rank+"."}),du(u,c,l,s,a,i)}function pu(t,e,n,r,o,i){var a,s,u=sn(t,"x","batchNorm"),c=sn(e,"mean","batchNorm"),l=sn(n,"variance","batchNorm");return null!=o&&(a=sn(o,"scale","batchNorm")),null!=r&&(s=sn(r,"offset","batchNorm")),P(3===u.rank,function(){return"Error in batchNorm3D: x must be rank 3 but got rank "+u.rank+"."}),P(3===c.rank||1===c.rank,function(){return"Error in batchNorm3D: mean must be rank 3 or rank 1 but got rank "+c.rank+"."}),P(3===l.rank||1===l.rank,function(){return"Error in batchNorm3D: variance must be rank 3 or rank 1 but got rank "+l.rank+"."}),null!=a&&P(3===a.rank||1===a.rank,function(){return"Error in batchNorm3D: scale must be rank 3 or rank 1 but got rank "+a.rank+"."}),null!=s&&P(3===s.rank||1===s.rank,function(){return"Error in batchNorm3D: offset must be rank 3 or rank 1 but got rank "+s.rank+"."}),du(u,c,l,s,a,i)}function fu(t,e,n,r,o,i){var a,s,u=sn(t,"x","batchNorm"),c=sn(e,"mean","batchNorm"),l=sn(n,"variance","batchNorm");return null!=o&&(a=sn(o,"scale","batchNorm")),null!=r&&(s=sn(r,"offset","batchNorm")),P(4===u.rank,function(){return"Error in batchNorm4D: x must be rank 4 but got rank "+u.rank+"."}),P(4===c.rank||1===c.rank,function(){return"Error in batchNorm4D: mean must be rank 4 or rank 1 but got rank "+c.rank+"."}),P(4===l.rank||1===l.rank,function(){return"Error in batchNorm4D: variance must be rank 4 or rank 1 but got rank "+l.rank+"."}),null!=a&&P(4===a.rank||1===a.rank,function(){return"Error in batchNorm4D: scale must be rank 4 or rank 1 but got rank "+a.rank+"."}),null!=s&&P(4===s.rank||1===s.rank,function(){return"Error in batchNorm4D: offset must be rank 4 or rank 1 but got rank "+s.rank+"."}),du(u,c,l,s,a,i)}function du(t,e,n,r,o,v){null==v&&(v=.001);var i,a,m,s=sn(t,"x","batchNorm"),u=sn(e,"mean","batchNorm"),c=sn(n,"variance","batchNorm");null!=o&&(i=sn(o,"scale","batchNorm")),null!=r&&(a=sn(r,"offset","batchNorm")),P(u.rank===c.rank,function(){return"Batch normalization gradient requires mean and variance to have equal ranks."}),P(null==a||u.rank===a.rank,function(){return"Batch normalization gradient requires mean and offset to have equal ranks."}),P(null==i||u.rank===i.rank,function(){return"Batch normalization gradient requires mean and scale to have equal ranks."}),m=0===s.rank||1===s.rank?s.as4D(1,1,1,s.size):2===s.rank?s.as4D(1,1,s.shape[0],s.shape[1]):3===s.rank?s.as4D(1,s.shape[0],s.shape[1],s.shape[2]):s;var l=[s,u,c,i];return qt.runKernelFunc(function(t,e){var n=t.batchNormalization(m,vu(u),vu(c),v,vu(i),vu(a));return e([s,u,c,i]),n},{x:s,mean:u,variance:c,scale:i,offset:a},function(n,t){var e=t,r=e[0],o=e[1],i=e[2],a=e[3],s=null==a?In(1):a,u=fo(o.shape,m.shape),c=[];if(1===o.rank){for(var l=0;l 0 && <= the predictions last dimension ("+r+"), but got "+g}),[4,e.data()];case 1:return o=t.sent(),[4,n.data()];case 2:for(i=t.sent(),a=[o.length/r,r],u=a[1],c=N("bool",s=a[0]),l=0;l= 2, but got rank "+t.rank);if(2===t.rank)return Jl(t,o);var e=t.shape.slice(0,t.shape.length-2).reduce(function(t,e){return t*e}),n=Or(t.reshape([e,t.shape[t.shape.length-2],t.shape[t.shape.length-1]]),0),i=[],a=[];return n.forEach(function(t){var e=Jl(t,o),n=e[0],r=e[1];i.push(n),a.push(r)}),[Nr(i,0).reshape(t.shape),Nr(a,0).reshape(t.shape)]}}),eh=Object.freeze({bandPart:Ql,gramSchmidt:Zl,qr:th});function nh(t,e,n,r,o,i){null==r&&(r=.5),null==o&&(o=Number.NEGATIVE_INFINITY),null==i&&(i=0);var a=t.shape[0];return n=Math.min(n,a),P(0<=r&&r<=1,function(){return"iouThreshold must be in [0, 1], but was '"+r+"'"}),P(2===t.rank,function(){return"boxes must be a 2D tensor, but was of rank '"+t.rank+"'"}),P(4===t.shape[1],function(){return"boxes must have 4 columns, but 2nd dimension was "+t.shape[1]}),P(1===e.rank,function(){return"scores must be a 1D tensor"}),P(e.shape[0]===a,function(){return"scores has incompatible shape with boxes. Expected "+a+", but was "+e.shape[0]}),P(0<=i&&i<=1,function(){return"softNmsSigma must be in [0, 1], but was '"+i+"'"}),{maxOutputSize:n,iouThreshold:r,scoreThreshold:o,softNmsSigma:i}}function rh(t,e){return!(0-e,s=r[o]=n.inHeight))for(var A=S*e.strides[0],T=E+D*p,N=0;N=n.inWidth))for(var B=T+P*f,L=A+O*e.strides[1],W=0;W=n.inDepth))for(var _=C*e.strides[0],I=g+E*t.strides[1],R=0;R=n.inHeight))for(var T=_+D*e.strides[1],N=I+A*t.strides[2],F=0;F=n.inWidth))for(var L=T+P*e.strides[2],W=N+B*n.inChannels,z=L,U=0;U=n.inHeight))for(var C=b*e.strides[0],E=v+w*t.strides[1],_=0;_=n.inWidth))for(var D=C+k*e.strides[1],A=E+S*n.inChannels,T=I,N=D,F=0;F=r.outHeight||Math.floor(_)!==_))for(var I=0;I=r.outWidth||Math.floor(R)!==R)){var k=c*l-1-d.get(m,_,R,g)===E*l+I?1:0;0!=k&&(C+=v.get(m,_,R,g)*k)}}}f.set(C,m,y,x,g)}return f.toTensor()},Ch.prototype.avgPoolBackprop=function(t,e,n){yh([t,e],"avgPoolBackprop");for(var r=n.strideHeight,o=n.strideWidth,i=n.filterHeight,a=n.filterWidth,s=n.dilationHeight,u=n.dilationWidth,c=n.effectiveFilterHeight,l=n.effectiveFilterWidth,h=l-1-n.padInfo.left,p=c-1-n.padInfo.top,f=sr(e.shape,"float32"),d=1/(i*a),v=this.bufferSync(t),m=0;m=n.outHeight||Math.floor(_)!==_))for(var I=0;I=n.outWidth||Math.floor(R)!==R||(C+=v.get(m,_,R,g))}}f.set(C*d,m,y,x,g)}return f.toTensor()},Ch.prototype.pool3d=function(t,e,n){yh(t,"pool3d");for(var r=e.strideDepth,o=e.strideHeight,i=e.strideWidth,a=e.dilationDepth,s=e.dilationHeight,u=e.dilationWidth,c=e.effectiveFilterDepth,l=e.effectiveFilterHeight,h=e.effectiveFilterWidth,p=e.padInfo.front,f=e.padInfo.top,d=e.padInfo.left,v="max"===n?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY,m=this.readSync(t.dataId),g=sr(e.outShape,t.dtype),y=g.values,x=e.outShape[1]*e.outShape[2]*e.outShape[3]*e.outShape[4],b=e.outShape[2]*e.outShape[3]*e.outShape[4],w=e.outShape[3]*e.outShape[4],C=e.outShape[4],E=0;E=n.outDepth||Math.floor(T)!==T))for(var N=0;N=n.outHeight||Math.floor(F)!==F))for(var M=0;M=n.outWidth||Math.floor(O)!==O||(D+=b.get(w,T,F,O,C))}}}y.set(D*x,w,E,_,I,C)}return y.toTensor()},Ch.prototype.maxPool3d=function(t,e){return yh(t,"maxPool3d"),this.pool3d(t,e,"max").toFloat()},Ch.prototype.maxPool3dPositions=function(t,e){for(var n=sr(e.outShape,"int32"),r=e.strideDepth,o=e.strideHeight,i=e.strideWidth,a=e.dilationDepth,s=e.dilationHeight,u=e.dilationWidth,c=e.effectiveFilterDepth,l=e.effectiveFilterHeight,h=e.effectiveFilterWidth,p=e.padInfo.front,f=e.padInfo.top,d=e.padInfo.left,v=this.bufferSync(t),m=0;m=r.outDepth||Math.floor(A)!==A))for(var T=0;T=r.outHeight||Math.floor(N)!==N))for(var F=0;F=r.outWidth||Math.floor(M)!==M)){var O=h*p*f-1-y.get(b,A,N,M,w)===D*p*f+T*f+F?1:0;0!=O&&(S+=x.get(b,A,N,M,w)*O)}}}}g.set(S,b,C,E,_,w)}return g.toTensor()},Ch.prototype.cast=function(t,e){return So(t,e,this)},Ch.prototype.reshape=function(t,e){return Do(t,e)},Ch.prototype.avgPool=function(t,e){return yh(t,"avgPool"),this.pool(t,e,"avg").toFloat()},Ch.prototype.resizeBilinear=function(t,e,n,r){yh(t,"resizeBilinear");for(var o=t.shape,i=o[0],a=o[1],s=o[2],u=o[3],c=this.readSync(t.dataId),l=new Float32Array(L([i,e,n,u])),h=[r&&1 1 for depthToSpace, but was: "+e});for(var r=t.shape[0],o=t.shape[1],i=t.shape[2],a=t.shape[3],s=o*e,u=i*e,c=a/(e*e),l=this.readSync(t.dataId),h=new Float32Array(r*s*u*c),p=0,f=0;f=t.size/s)throw new Error("Invalid indices: "+f+" does not index into "+t.shape);for(var g=0;g element.");if(null!=g("FromPixels",qt.backendName))return qt.runKernel("FromPixels",{pixels:t},{numChannels:e});var s,u,c=o?[t.videoWidth,t.videoHeight]:[t.width,t.height],l=c[0],h=c[1];if(a?s=t.getContext("2d").getImageData(0,0,l,h).data:r||n?s=t.data:(i||o)&&(null==Np&&(Np=document.createElement("canvas").getContext("2d")),Np.canvas.width=l,Np.canvas.height=h,Np.drawImage(t,0,0,l,h),s=Np.getImageData(0,0,l,h).data),4===e)u=new Int32Array(s);else{var p=l*h;u=new Int32Array(p*e);for(var f=0;fn)}var Kp,Xp=Object.freeze({TEST_EPSILON_FLOAT16:.1,expectArraysClose:function(t,e,n){return null==n&&(n=Hp()),qp(t,e,function(t,e){return jp(t,e,n)})},testEpsilon:Hp,expectPromiseToFail:function(t,e){t().then(function(){return e.fail()},function(){return e()})},expectArraysEqual:function(t,e){var n="string"==typeof e||"number"==typeof e||"boolean"==typeof e?[e]:e;return G(t)||G(t[0])||G(e)||G(e[0])?qp(t,n,function(t,e){return t==e}):qp(t,e,function(t,e){return jp(t,e,0)})},expectNumbersClose:function(t,e,n){if(null==n&&(n=Hp()),!jp(t,e,n))throw new Error("Numbers differ: actual === "+t+", expected === "+e)},expectValuesInRange:function(t,e,n){for(var r=0;rn)throw new Error("Value out of range:"+t[r]+" low: "+e+", high: "+n)},expectArrayBuffersEqual:function(t,e){expect(new Float32Array(t)).toEqual(new Float32Array(e))}}),Yp=Object.freeze({gpgpu_util:ma,webgl_util:Je,forceHalfFloat:function(){_().set("WEBGL_FORCE_F16_TEXTURES",!0)},MathBackendWebGL:Ss,setWebGLContext:ne,GPGPUContext:ga}),$p=(t(Jp,Kp=Lp),Jp.prototype.minimize=function(t,e,n){void 0===e&&(e=!1);var r=this.computeGradients(t,n),o=r.value,i=r.grads;if(null!=n){var a=n.map(function(t){return{name:t.name,tensor:i[t.name]}});this.applyGradients(a)}else this.applyGradients(i);return en(i),e?o:(o.dispose(),null)},Object.defineProperty(Jp.prototype,"iterations",{get:function(){return null==this.iterations_&&(this.iterations_=0),this.iterations_},enumerable:!0,configurable:!0}),Jp.prototype.incrementIterations=function(){this.iterations_=this.iterations+1},Jp.prototype.computeGradients=function(t,e){return no(t,e)},Jp.prototype.dispose=function(){null!=this.iterations_&&en(this.iterations_)},Jp.prototype.saveIterations=function(){return y(this,void 0,void 0,function(){return R(this,function(t){return null==this.iterations_&&(this.iterations_=0),[2,{name:"iter",tensor:In(this.iterations_,"int32")}]})})},Jp.prototype.getWeights=function(){return y(this,void 0,void 0,function(){return R(this,function(t){throw new Error("getWeights() is not implemented for this optimizer yet.")})})},Jp.prototype.setWeights=function(t){return y(this,void 0,void 0,function(){return R(this,function(t){throw new Error("setWeights() is not implemented for this optimizer class "+this.getClassName())})})},Jp.prototype.extractIterations=function(n){return y(this,void 0,void 0,function(){var e;return R(this,function(t){switch(t.label){case 0:return e=this,[4,n[0].tensor.data()];case 1:return e.iterations_=t.sent()[0],[2,n.slice(1)]}})})},Jp);function Jp(){return null!==Kp&&Kp.apply(this,arguments)||this}Object.defineProperty($p,Symbol.hasInstance,{value:function(t){return null!=t.minimize&&null!=t.computeGradients&&null!=t.applyGradients}});var Qp,Zp=(t(tf,Qp=$p),tf.prototype.applyGradients=function(n){var u=this;(Array.isArray(n)?n.map(function(t){return t.name}):Object.keys(n)).forEach(function(t,e){var o=qt.registeredVariables[t];null==u.accumulatedGrads[e]&&(u.accumulatedGrads[e]={originalName:t+"/accum_grad",variable:tn(function(){return Wn(o).variable(!1)})}),null==u.accumulatedUpdates[e]&&(u.accumulatedUpdates[e]={originalName:t+"/accum_var",variable:tn(function(){return Wn(o).variable(!1)})});var i=Array.isArray(n)?n[e].tensor:n[t];if(null!=i){var a=u.accumulatedGrads[e].variable,s=u.accumulatedUpdates[e].variable;tn(function(){var t=a.mul(u.rho).add(i.square().mul(1-u.rho)),e=s.add(u.epsilon).sqrt().div(a.add(u.epsilon).sqrt()).mul(i),n=s.mul(u.rho).add(e.square().mul(1-u.rho));a.assign(t),s.assign(n);var r=e.mul(-u.learningRate).add(o);o.assign(r)})}}),this.incrementIterations()},tf.prototype.dispose=function(){null!=this.accumulatedUpdates&&(en(this.accumulatedGrads.map(function(t){return t.variable})),en(this.accumulatedUpdates.map(function(t){return t.variable})))},tf.prototype.getWeights=function(){return y(this,void 0,void 0,function(){var e;return R(this,function(t){switch(t.label){case 0:return e=this.accumulatedGrads.concat(this.accumulatedUpdates),[4,this.saveIterations()];case 1:return[2,[t.sent()].concat(e.map(function(t){return{name:t.originalName,tensor:t.variable}}))]}})})},tf.prototype.setWeights=function(n){return y(this,void 0,void 0,function(){var e;return R(this,function(t){switch(t.label){case 0:return[4,this.extractIterations(n)];case 1:return n=t.sent(),e=n.length/2,this.accumulatedGrads=n.slice(0,e).map(function(t){return{originalName:t.name,variable:t.tensor.variable(!1)}}),this.accumulatedUpdates=n.slice(e,2*e).map(function(t){return{originalName:t.name,variable:t.tensor.variable(!1)}}),[2]}})})},tf.prototype.getConfig=function(){return{learningRate:this.learningRate,rho:this.rho,epsilon:this.epsilon}},tf.fromConfig=function(t,e){return new t(e.learningRate,e.rho,e.epsilon)},tf.className="Adadelta",tf);function tf(t,e,n){void 0===n&&(n=null);var r=Qp.call(this)||this;return r.learningRate=t,r.rho=e,r.epsilon=n,r.accumulatedGrads=[],r.accumulatedUpdates=[],null==n&&(r.epsilon=qt.backend.epsilon()),r}Vp(Zp);var ef,nf=(t(rf,ef=$p),rf.prototype.applyGradients=function(i){var a=this;(Array.isArray(i)?i.map(function(t){return t.name}):Object.keys(i)).forEach(function(t,e){var n=qt.registeredVariables[t];null==a.accumulatedGrads[e]&&(a.accumulatedGrads[e]={originalName:t+"/accumulator",variable:tn(function(){return On(n.shape,a.initialAccumulatorValue).variable(!1)})});var r=Array.isArray(i)?i[e].tensor:i[t];if(null!=r){var o=a.accumulatedGrads[e].variable;tn(function(){var t=o.add(r.square());o.assign(t);var e=r.div(t.add(qt.backend.epsilon()).sqrt()).mul(-a.learningRate).add(n);n.assign(e)})}}),this.incrementIterations()},rf.prototype.dispose=function(){null!=this.accumulatedGrads&&en(this.accumulatedGrads.map(function(t){return t.variable}))},rf.prototype.getWeights=function(){return y(this,void 0,void 0,function(){return R(this,function(t){switch(t.label){case 0:return[4,this.saveIterations()];case 1:return[2,[t.sent()].concat(this.accumulatedGrads.map(function(t){return{name:t.originalName,tensor:t.variable}}))]}})})},rf.prototype.setWeights=function(e){return y(this,void 0,void 0,function(){return R(this,function(t){switch(t.label){case 0:return[4,this.extractIterations(e)];case 1:return e=t.sent(),this.accumulatedGrads=e.map(function(t){return{originalName:t.name,variable:t.tensor.variable(!1)}}),[2]}})})},rf.prototype.getConfig=function(){return{learningRate:this.learningRate,initialAccumulatorValue:this.initialAccumulatorValue}},rf.fromConfig=function(t,e){return new t(e.learningRate,e.initialAccumulatorValue)},rf.className="Adagrad",rf);function rf(t,e){void 0===e&&(e=.1);var n=ef.call(this)||this;return n.learningRate=t,n.initialAccumulatorValue=e,n.accumulatedGrads=[],n}Vp(nf);var of,af=(t(sf,of=$p),sf.prototype.applyGradients=function(f){var d=this,t=Array.isArray(f)?f.map(function(t){return t.name}):Object.keys(f);tn(function(){var h=Ju(1,d.accBeta1),p=Ju(1,d.accBeta2);t.forEach(function(t,e){var n=qt.registeredVariables[t];null==d.accumulatedFirstMoment[e]&&(d.accumulatedFirstMoment[e]={originalName:t+"/m",variable:tn(function(){return Wn(n).variable(!1)})}),null==d.accumulatedSecondMoment[e]&&(d.accumulatedSecondMoment[e]={originalName:t+"/v",variable:tn(function(){return Wn(n).variable(!1)})});var r=Array.isArray(f)?f[e].tensor:f[t];if(null!=r){var o=d.accumulatedFirstMoment[e].variable,i=d.accumulatedSecondMoment[e].variable,a=o.mul(d.beta1).add(r.mul(1-d.beta1)),s=i.mul(d.beta2).add(r.square().mul(1-d.beta2)),u=a.div(h),c=s.div(p);o.assign(a),i.assign(s);var l=u.div(c.sqrt().add(d.epsilon)).mul(-d.learningRate).add(n);n.assign(l)}}),d.accBeta1.assign(d.accBeta1.mul(d.beta1)),d.accBeta2.assign(d.accBeta2.mul(d.beta2))}),this.incrementIterations()},sf.prototype.dispose=function(){this.accBeta1.dispose(),this.accBeta2.dispose(),null!=this.accumulatedFirstMoment&&en(this.accumulatedFirstMoment.map(function(t){return t.variable})),null!=this.accumulatedSecondMoment&&en(this.accumulatedSecondMoment.map(function(t){return t.variable}))},sf.prototype.getWeights=function(){return y(this,void 0,void 0,function(){var e;return R(this,function(t){switch(t.label){case 0:return e=this.accumulatedFirstMoment.concat(this.accumulatedSecondMoment),[4,this.saveIterations()];case 1:return[2,[t.sent()].concat(e.map(function(t){return{name:t.originalName,tensor:t.variable}}))]}})})},sf.prototype.setWeights=function(r){return y(this,void 0,void 0,function(){var e,n=this;return R(this,function(t){switch(t.label){case 0:return[4,this.extractIterations(r)];case 1:return r=t.sent(),tn(function(){n.accBeta1.assign(Ku(n.beta1,n.iterations_+1)),n.accBeta2.assign(Ku(n.beta2,n.iterations_+1))}),e=r.length/2,this.accumulatedFirstMoment=r.slice(0,e).map(function(t){return{originalName:t.name,variable:t.tensor.variable(!1)}}),this.accumulatedSecondMoment=r.slice(e,2*e).map(function(t){return{originalName:t.name,variable:t.tensor.variable(!1)}}),[2]}})})},sf.prototype.getConfig=function(){return{learningRate:this.learningRate,beta1:this.beta1,beta2:this.beta2,epsilon:this.epsilon}},sf.fromConfig=function(t,e){return new t(e.learningRate,e.beta1,e.beta2,e.epsilon)},sf.className="Adam",sf);function sf(t,e,n,r){void 0===r&&(r=null);var o=of.call(this)||this;return o.learningRate=t,o.beta1=e,o.beta2=n,o.epsilon=r,o.accumulatedFirstMoment=[],o.accumulatedSecondMoment=[],tn(function(){o.accBeta1=In(e).variable(),o.accBeta2=In(n).variable()}),null==r&&(o.epsilon=qt.backend.epsilon()),o}Vp(af);var uf,cf=(t(lf,uf=$p),lf.prototype.applyGradients=function(f){var d=this,t=Array.isArray(f)?f.map(function(t){return t.name}):Object.keys(f);tn(function(){var h=Ju(1,d.accBeta1),p=Ou(-d.learningRate,d.iteration.mul(d.decay).add(1));t.forEach(function(t,e){var n=qt.registeredVariables[t];null==d.accumulatedFirstMoment[e]&&(d.accumulatedFirstMoment[e]={originalName:t+"/m",variable:Wn(n).variable(!1)}),null==d.accumulatedWeightedInfNorm[e]&&(d.accumulatedWeightedInfNorm[e]={originalName:t+"/v",variable:Wn(n).variable(!1)});var r=Array.isArray(f)?f[e].tensor:f[t];if(null!=r){var o=d.accumulatedFirstMoment[e].variable,i=d.accumulatedWeightedInfNorm[e].variable,a=o.mul(d.beta1).add(r.mul(1-d.beta1)),s=i.mul(d.beta2),u=r.abs(),c=s.maximum(u);o.assign(a),i.assign(c);var l=p.div(h).mul(a.div(c.add(d.epsilon))).add(n);n.assign(l)}}),d.iteration.assign(d.iteration.add(1)),d.accBeta1.assign(d.accBeta1.mul(d.beta1))}),this.incrementIterations()},lf.prototype.dispose=function(){this.accBeta1.dispose(),this.iteration.dispose(),null!=this.accumulatedFirstMoment&&en(this.accumulatedFirstMoment.map(function(t){return t.variable})),null!=this.accumulatedWeightedInfNorm&&en(this.accumulatedWeightedInfNorm.map(function(t){return t.variable}))},lf.prototype.getWeights=function(){return y(this,void 0,void 0,function(){return R(this,function(t){throw new Error("getWeights() is not implemented for Adamax yet.")})})},lf.prototype.setWeights=function(t){return y(this,void 0,void 0,function(){return R(this,function(t){throw new Error("setWeights() is not implemented for Adamax yet.")})})},lf.prototype.getConfig=function(){return{learningRate:this.learningRate,beta1:this.beta1,beta2:this.beta2,epsilon:this.epsilon,decay:this.decay}},lf.fromConfig=function(t,e){return new t(e.learningRate,e.beta1,e.beta2,e.epsilon,e.decay)},lf.className="Adamax",lf);function lf(t,e,n,r,o){void 0===r&&(r=null),void 0===o&&(o=0);var i=uf.call(this)||this;return i.learningRate=t,i.beta1=e,i.beta2=n,i.epsilon=r,i.decay=o,i.accumulatedFirstMoment=[],i.accumulatedWeightedInfNorm=[],tn(function(){i.iteration=In(0).variable(),i.accBeta1=In(e).variable()}),null==r&&(i.epsilon=qt.backend.epsilon()),i}Vp(cf);var hf,pf=(t(ff,hf=$p),ff.prototype.applyGradients=function(o){var i=this;(Array.isArray(o)?o.map(function(t){return t.name}):Object.keys(o)).forEach(function(t,e){var n=Array.isArray(o)?o[e].tensor:o[t];if(null!=n){var r=qt.registeredVariables[t];tn(function(){var t=i.c.mul(n).add(r);r.assign(t)})}}),this.incrementIterations()},ff.prototype.setLearningRate=function(t){this.learningRate=t,null!=this.c&&this.c.dispose(),this.c=nn(In(-t))},ff.prototype.dispose=function(){this.c.dispose()},ff.prototype.getWeights=function(){return y(this,void 0,void 0,function(){return R(this,function(t){switch(t.label){case 0:return[4,this.saveIterations()];case 1:return[2,[t.sent()]]}})})},ff.prototype.setWeights=function(e){return y(this,void 0,void 0,function(){return R(this,function(t){switch(t.label){case 0:return[4,this.extractIterations(e)];case 1:if(0!==(e=t.sent()).length)throw new Error("SGD optimizer does not have settable weights.");return[2]}})})},ff.prototype.getConfig=function(){return{learningRate:this.learningRate}},ff.fromConfig=function(t,e){return new t(e.learningRate)},ff.className="SGD",ff);function ff(t){var e=hf.call(this)||this;return e.learningRate=t,e.setLearningRate(t),e}Vp(pf);var df,vf=(t(mf,df=pf),mf.prototype.applyGradients=function(i){var a=this;(Array.isArray(i)?i.map(function(t){return t.name}):Object.keys(i)).forEach(function(t,e){var n=qt.registeredVariables[t];null==a.accumulations[e]&&(a.accumulations[e]={originalName:t+"/momentum",variable:tn(function(){return Wn(n).variable(!1)})});var r=a.accumulations[e].variable,o=Array.isArray(i)?i[e].tensor:i[t];null!=o&&tn(function(){var t,e=a.m.mul(r).add(o);t=a.useNesterov?a.c.mul(o.add(e.mul(a.m))).add(n):a.c.mul(e).add(n),r.assign(e),n.assign(t)})}),this.incrementIterations()},mf.prototype.dispose=function(){this.m.dispose(),null!=this.accumulations&&en(this.accumulations.map(function(t){return t.variable}))},mf.prototype.setMomentum=function(t){this.momentum=t},mf.prototype.getWeights=function(){return y(this,void 0,void 0,function(){return R(this,function(t){switch(t.label){case 0:return[4,this.saveIterations()];case 1:return[2,[t.sent()].concat(this.accumulations.map(function(t){return{name:t.originalName,tensor:t.variable}}))]}})})},mf.prototype.setWeights=function(e){return y(this,void 0,void 0,function(){return R(this,function(t){switch(t.label){case 0:return[4,this.extractIterations(e)];case 1:return e=t.sent(),this.accumulations=e.map(function(t){return{originalName:t.name,variable:t.tensor.variable(!1)}}),[2]}})})},mf.prototype.getConfig=function(){return{learningRate:this.learningRate,momentum:this.momentum,useNesterov:this.useNesterov}},mf.fromConfig=function(t,e){return new t(e.learningRate,e.momentum,e.useNesterov)},mf.className="Momentum",mf);function mf(t,e,n){void 0===n&&(n=!1);var r=df.call(this,t)||this;return r.learningRate=t,r.momentum=e,r.useNesterov=n,r.accumulations=[],r.m=In(r.momentum),r}Vp(vf);var gf,yf=(t(xf,gf=$p),xf.prototype.applyGradients=function(e){var h=this;(Array.isArray(e)?e.map(function(t){return t.name}):Object.keys(e)).forEach(function(t,a){var s=qt.registeredVariables[t];null==h.accumulatedMeanSquares[a]&&(h.accumulatedMeanSquares[a]={originalName:t+"/rms",variable:tn(function(){return Wn(s).variable(!1)})}),null==h.accumulatedMoments[a]&&(h.accumulatedMoments[a]={originalName:t+"/momentum",variable:tn(function(){return Wn(s).variable(!1)})}),null==h.accumulatedMeanGrads[a]&&h.centered&&(h.accumulatedMeanGrads[a]={originalName:t+"/mg",variable:tn(function(){return Wn(s).variable(!1)})});var u=Array.isArray(e)?e[a].tensor:e[t];if(null!=u){var c=h.accumulatedMeanSquares[a].variable,l=h.accumulatedMoments[a].variable;tn(function(){var t=c.mul(h.decay).add(u.square().mul(1-h.decay));if(h.centered){var e=h.accumulatedMeanGrads[a].variable,n=e.mul(h.decay).add(u.mul(1-h.decay)),r=l.mul(h.momentum).add(u.mul(h.learningRate).div(t.sub(n.square().add(h.epsilon)).sqrt()));c.assign(t),e.assign(n),l.assign(r);var o=s.sub(r);s.assign(o)}else{var i=c.mul(h.decay).add(u.square().mul(1-h.decay));r=l.mul(h.momentum).add(u.mul(h.learningRate).div(i.add(h.epsilon).sqrt())),c.assign(i),l.assign(r),o=s.sub(r),s.assign(o)}})}}),this.incrementIterations()},xf.prototype.dispose=function(){null!=this.accumulatedMeanSquares&&en(this.accumulatedMeanSquares.map(function(t){return t.variable})),null!=this.accumulatedMeanGrads&&this.centered&&en(this.accumulatedMeanGrads.map(function(t){return t.variable})),null!=this.accumulatedMoments&&en(this.accumulatedMoments.map(function(t){return t.variable}))},xf.prototype.getWeights=function(){return y(this,void 0,void 0,function(){var e;return R(this,function(t){switch(t.label){case 0:return e=this.accumulatedMeanSquares.concat(this.accumulatedMoments),this.centered&&e.push.apply(e,this.accumulatedMeanGrads),[4,this.saveIterations()];case 1:return[2,[t.sent()].concat(e.map(function(t){return{name:t.originalName,tensor:t.variable}}))]}})})},xf.prototype.setWeights=function(n){return y(this,void 0,void 0,function(){var e;return R(this,function(t){switch(t.label){case 0:return[4,this.extractIterations(n)];case 1:return n=t.sent(),e=this.centered?n.length/3:n.length/2,this.accumulatedMeanSquares=n.slice(0,e).map(function(t){return{originalName:t.name,variable:t.tensor.variable(!1)}}),this.accumulatedMoments=n.slice(e,2*e).map(function(t){return{originalName:t.name,variable:t.tensor.variable(!1)}}),this.centered&&(this.accumulatedMeanGrads=n.slice(2*e,3*e).map(function(t){return{originalName:t.name,variable:t.tensor.variable(!1)}})),[2]}})})},xf.prototype.getConfig=function(){return{learningRate:this.learningRate,decay:this.decay,momentum:this.momentum,epsilon:this.epsilon,centered:this.centered}},xf.fromConfig=function(t,e){return new t(e.learningRate,e.decay,e.momentum,e.epsilon,e.centered)},xf.className="RMSProp",xf);function xf(t,e,n,r,o){void 0===e&&(e=.9),void 0===n&&(n=0),void 0===r&&(r=null),void 0===o&&(o=!1);var i=gf.call(this)||this;if(i.learningRate=t,i.decay=e,i.momentum=n,i.epsilon=r,i.accumulatedMeanSquares=[],i.accumulatedMoments=[],i.accumulatedMeanGrads=[],i.centered=o,null==r&&(i.epsilon=qt.backend.epsilon()),null==t)throw new Error("learningRate for RMSPropOptimizer must be defined.");return i}Vp(yf);var bf=(Ef.sgd=function(t){return new pf(t)},Ef.momentum=function(t,e,n){return void 0===n&&(n=!1),new vf(t,e,n)},Ef.rmsprop=function(t,e,n,r,o){return void 0===e&&(e=.9),void 0===n&&(n=0),void 0===r&&(r=null),void 0===o&&(o=!1),new yf(t,e,n,r,o)},Ef.adam=function(t,e,n,r){return void 0===t&&(t=.001),void 0===e&&(e=.9),void 0===n&&(n=.999),void 0===r&&(r=null),new af(t,e,n,r)},Ef.adadelta=function(t,e,n){return void 0===t&&(t=.001),void 0===e&&(e=.95),void 0===n&&(n=null),new Zp(t,e,n)},Ef.adamax=function(t,e,n,r,o){return void 0===t&&(t=.002),void 0===e&&(e=.9),void 0===n&&(n=.999),void 0===r&&(r=null),void 0===o&&(o=0),new cf(t,e,n,r,o)},Ef.adagrad=function(t,e){return void 0===e&&(e=.1),new nf(t,e)},Ef),wf={sgd:bf.sgd,momentum:bf.momentum,adadelta:bf.adadelta,adagrad:bf.adagrad,rmsprop:bf.rmsprop,adamax:bf.adamax,adam:bf.adam},Cf="undefined"!=typeof requestAnimationFrame?requestAnimationFrame:"undefined"!=typeof setImmediate?setImmediate:function(t){return t()};function Ef(){}vt=gh;var _f=Object.freeze({__proto__:null,AdadeltaOptimizer:Zp,AdagradOptimizer:nf,AdamOptimizer:af,AdamaxOptimizer:cf,DataStorage:so,get ENV(){return i},Environment:o,KernelBackend:uo,MomentumOptimizer:vf,Optimizer:$p,RMSPropOptimizer:yf,get Rank(){return bt},get Reduction(){return Ml},SGDOptimizer:pf,Tensor:yt,TensorBuffer:ft,Variable:Tt,abs:Ts,acos:Ns,acosh:Fs,add:Tu,addN:Nu,addStrict:Fu,all:Jc,any:Qc,argMax:Zc,argMin:tl,asin:Ms,asinh:Os,atan:Ps,atan2:Mu,atanh:Bs,avgPool:Uc,avgPool3d:Hc,backend:function(){return qt.backend},backend_util:To,basicLSTMCell:gl,batchNorm:Cu,batchNorm2d:Eu,batchNorm3d:_u,batchNorm4d:Iu,batchNormalization:wu,batchNormalization2d:yu,batchNormalization3d:xu,batchNormalization4d:bu,batchToSpaceND:lr,booleanMaskAsync:fc,broadcastTo:hr,browser:Bp,buffer:sr,cast:pr,ceil:Ls,clipByValue:Ws,clone:fr,complex:bn,concat:zn,concat1d:Un,concat2d:Vn,concat3d:Gn,concat4d:Hn,conv1d:xc,conv2d:bc,conv2dTranspose:Sc,conv3d:wc,conv3dTranspose:Dc,cos:zs,cosh:Us,cumsum:dr,customGrad:ro,deprecationWarn:Ze,depthToSpace:vr,depthwiseConv2d:_c,diag:Al,disableDeprecationWarnings:function(){_().set("DEPRECATION_WARNINGS_ENABLED",!1),console.warn("TensorFlow.js deprecation warnings have been disabled.")},dispose:en,disposeVariables:function(){qt.disposeVariables()},div:Ou,divNoNan:Pu,divStrict:Bu,dot:Tc,dropout:Tl,elu:ul,enableDebugMode:function(){_().set("DEBUG",!0)},enableProdMode:function(){_().set("PROD",!0)},engine:function(){return qt},env:_,equal:Zu,equalStrict:tc,erf:Vs,exp:Gs,expandDims:mr,expm1:Hs,eye:gr,fft:El,fill:On,findBackend:function(t){return qt.findBackend(t)},findBackendFactory:function(t){return qt.findBackendFactory(t)},floor:qs,floorDiv:Lu,frame:Ll,fused:mh,gather:dc,gatherND:Dl,gather_util:Vr,getBackend:function(){return qt.backendName},getGradient:l,getKernel:g,getKernelsForBackend:a,grad:function(i){return P(K(i),function(){return"The f passed in grad(f) must be a function"}),function(t,e){var r=sn(t,"x","tf.grad",null),o=null!=e?sn(e,"dy","tf.grad"):null;return qt.tidy(function(){var t=qt.gradients(function(){return i(r)},[r],o),e=t.value,n=t.grads;return null!=o&&x(e.shape,o.shape,"The shape of dy passed in grad(f)(x, dy) must match the shape returned by f(x)"),oo(n),n[0]})}},grads:function(i){return P(K(i),function(){return"The f passed in grads(f) must be a function"}),function(t,e){P(Array.isArray(t),function(){return"The args passed in grads(f)(args) must be an array of `Tensor`s or `TensorLike`s"});var r=un(t,"args","tf.grads",null),o=null!=e?sn(e,"dy","tf.grads"):null;return qt.tidy(function(){var t=qt.gradients(function(){return i.apply(void 0,r)},r,o),e=t.value,n=t.grads;return null!=o&&x(e.shape,o.shape,"The shape of dy passed in grads(f)([x1,...], dy) must match the shape returned by f([x1,...])"),oo(n),n})}},greater:ec,greaterEqual:nc,greaterEqualStrict:rc,greaterStrict:oc,hammingWindow:Bl,hannWindow:Pl,ifft:_l,imag:Cn,image:ph,inTopKAsync:Fl,io:Fp,irfft:Rl,isFinite:ru,isInf:nu,isNaN:eu,keep:nn,leakyRelu:cl,less:ic,lessEqual:ac,lessEqualStrict:sc,lessStrict:uc,linalg:eh,linspace:Pn,localResponseNormalization:vl,log:js,log1p:Ks,logSigmoid:Xs,logSoftmax:ao,logSumExp:el,logicalAnd:Ru,logicalNot:ku,logicalOr:Su,logicalXor:Du,losses:$l,matMul:Ac,math:Op,max:nl,maxPool:zc,maxPool3d:Gc,maximum:Wu,maximumStrict:zu,mean:rl,memory:function(){return qt.memory()},min:ol,minimum:Uu,minimumStrict:Vu,mod:Gu,modStrict:Hu,moments:il,movingAverage:xl,mul:qu,mulStrict:ju,multiRNNCell:yl,multinomial:yr,neg:Ys,nextFrame:function(){return new Promise(function(t){return Cf(function(){return t()})})},norm:ml,notEqual:cc,notEqualStrict:lc,oneHot:xr,ones:Fn,onesLike:Ln,op:xn,outerProduct:Nc,pad:br,pad1d:wr,pad2d:Cr,pad3d:Er,pad4d:_r,pool:Vc,pow:Ku,powStrict:Xu,prelu:ll,print:ur,prod:sl,profile:function(t){return qt.profile(t)},rand:Ir,randomGamma:kr,randomNormal:Rr,randomUniform:Sr,range:Bn,ready:function(){return qt.ready()},real:wn,reciprocal:$s,registerBackend:function(t,e,n){return void 0===n&&(n=1),qt.registerBackend(t,e,n)},registerGradient:h,registerKernel:s,relu:hl,relu6:pl,removeBackend:function(t){qt.removeBackend(t)},reshape:Dr,reverse:Fc,reverse1d:Mc,reverse2d:Oc,reverse3d:Pc,reverse4d:Bc,rfft:Il,round:Js,rsqrt:Qs,scalar:In,scatterND:Cl,scatter_util:Kr,selu:fl,separableConv2d:kc,serialization:Gp,setBackend:function(t){return qt.setBackend(t)},setPlatform:function(t,e){_().setPlatform(t,e)},setdiff1dAsync:cr,sigmoid:Zs,sign:tu,signal:zl,sin:ou,sinh:iu,slice:qc,slice1d:jc,slice2d:Kc,slice3d:Xc,slice4d:Yc,slice_util:eo,softmax:io,softplus:au,spaceToBatchND:Ar,sparseToDense:Sl,spectral:kl,split:qn,sqrt:su,square:As,squaredDifference:Yu,squaredDifferenceStrict:$u,squeeze:Tr,stack:Nr,step:uu,stft:Wl,stridedSlice:bl,sub:Ju,subStrict:Qu,sum:al,sumOutType:Ot,tan:cu,tanh:lu,tensor:En,tensor1d:Rn,tensor2d:kn,tensor3d:Sn,tensor4d:Dn,tensor5d:An,tensor6d:Tn,tensor_util:zt,test_util:Xp,tidy:tn,tile:Fr,time:function(t){return qt.time(t)},topk:wl,train:wf,transpose:dl,truncatedNormal:Mr,unregisterGradient:function(t){if(!n.has(t))throw new Error("The gradient '"+t+"' for backend is not registered");n.delete(t)},unregisterKernel:function(t,e){var n=p(t,e);if(!u.has(n))throw new Error("The kernel '"+t+"' for backend '"+e+"' is not registered");u.delete(n)},unsortedSegmentSum:vc,unstack:Or,util:ot,valueAndGrad:function(i){return P(K(i),function(){return"The f passed in valueAndGrad(f) must be a function"}),function(t,e){P(t instanceof yt,function(){return"The x passed in valueAndGrad(f)(x) must be a tensor"}),P(null==e||e instanceof yt,function(){return"The dy passed in valueAndGrad(f)(x, dy) must be a tensor"});var n=qt.gradients(function(){return i(t)},[t],e),r=n.grads,o=n.value;return oo(r),{grad:r[0],value:o}}},valueAndGrads:function(r){return P(K(r),function(){return"The f passed in valueAndGrads(f) must be a function"}),function(t,e){P(Array.isArray(t)&&t.every(function(t){return t instanceof yt}),function(){return"The args passed in valueAndGrads(f)(args) must be array of tensors"}),P(null==e||e instanceof yt,function(){return"The dy passed in valueAndGrads(f)(args, dy) must be a tensor"});var n=qt.gradients(function(){return r.apply(void 0,t)},t,e);return null!=e&&x(n.value.shape,e.shape,"The shape of dy passed in valueAndGrads(f)([x1,...], dy) must match the shape returned by f([x1,...])"),oo(n.grads),n}},variable:Nn,variableGrads:no,version_core:"1.5.2",webgl:Yp,where:Au,whereAsync:gu,zeros:Mn,zerosLike:Wn});function If(i,a,t){if(void 0===t&&(t=!1),i.beginPath(),a.slice(1).forEach(function(t,e){var n=t.x,r=t.y,o=a[e];i.moveTo(o.x,o.y),i.lineTo(n,r)}),t){var e=a[a.length-1],n=a[0];if(!e||!n)return;i.moveTo(e.x,e.y),i.lineTo(n.x,n.y)}i.stroke()}var Rf=function(t,e){return(Rf=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])})(t,e)};function kf(t,e){function n(){this.constructor=t}Rf(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)}var Sf=function(){return(Sf=Object.assign||function(t){for(var e,n=1,r=arguments.length;na[0]&&e[1] 1 not supported");return(o=r.getInput(0))instanceof e?(i=o,[3,4]):[3,2];case 2:return[4,av(o)];case 3:i=t.sent(),t.label=4;case 4:n=i,t.label=5;case 5:return a=Kd(n),[2,u.map(function(t){return t instanceof od?t.forSize(n.width,n.height).box.floor():t}).map(function(t){return t.clipAtImageBorders(n.width,n.height)}).map(function(t){var e=t.x,n=t.y,r=t.width,o=t.height,i=ov({width:r,height:o});return Kd(i).putImageData(a.getImageData(e,n,r,o),0,0),i})]}})})}function fv(u,e){return Df(this,void 0,void 0,function(){return Af(this,function(t){if(!Pf(u)&&!Bf(u))throw new Error("extractFaceTensors - expected image tensor to be 3D or 4D");if(Bf(u)&&1 1 not supported");return[2,tn(function(){var t=u.shape.slice(Bf(u)?1:0),i=t[0],a=t[1],s=t[2];return e.map(function(t){return t instanceof od?t.forSize(a,i).box:t}).map(function(t){return t.clipAtImageBorders(a,i)}).map(function(t){var e=t.x,n=t.y,r=t.width,o=t.height;return Xc(u.as3D(i,a,s),[n,e,0],[o,r,s])})})]})})}function dv(n,r){return Df(this,void 0,void 0,function(){var e;return Af(this,function(t){switch(t.label){case 0:return[4,(0,qd.getEnv().fetch)(n,r)];case 1:if(!((e=t.sent()).status<400))throw new Error("failed to fetch: ("+e.status+") "+e.statusText+", from url: "+e.url);return[2,e]}})})}function vv(e){return Df(this,void 0,void 0,function(){return Af(this,function(t){switch(t.label){case 0:return[4,dv(e)];case 1:return[2,t.sent().json()]}})})}function mv(t,e){var n=e+"-weights_manifest.json";if(!t)return{modelBaseUri:"",manifestUri:n};if("/"===t)return{modelBaseUri:"/",manifestUri:"/"+n};var r=t.startsWith("http://")?"http://":t.startsWith("https://")?"https://":"",o=(t=t.replace(r,"")).split("/").filter(function(t){return t}),i=t.endsWith(".json")?o[o.length-1]:n,a=r+(t.endsWith(".json")?o.slice(0,o.length-1):o).join("/");return{modelBaseUri:a=t.startsWith("/")?"/"+a:a,manifestUri:"/"===a?"/"+i:a+"/"+i}}function gv(i,a){return Df(this,void 0,void 0,function(){var e,n,r,o;return Af(this,function(t){switch(t.label){case 0:return e=mv(i,a),n=e.manifestUri,r=e.modelBaseUri,[4,vv(n)];case 1:return o=t.sent(),[2,Fp.loadWeights(o,r)]}})})}var yv=(Object.defineProperty(xv.prototype,"params",{get:function(){return this._params},enumerable:!0,configurable:!0}),Object.defineProperty(xv.prototype,"paramMappings",{get:function(){return this._paramMappings},enumerable:!0,configurable:!0}),Object.defineProperty(xv.prototype,"isLoaded",{get:function(){return!!this.params},enumerable:!0,configurable:!0}),xv.prototype.getParamFromPath=function(t){var e=this.traversePropertyPath(t);return e.obj[e.objProp]},xv.prototype.reassignParamFromPath=function(t,e){var n=this.traversePropertyPath(t),r=n.obj,o=n.objProp;r[o].dispose(),r[o]=e},xv.prototype.getParamList=function(){var n=this;return this._paramMappings.map(function(t){var e=t.paramPath;return{path:e,tensor:n.getParamFromPath(e)}})},xv.prototype.getTrainableParams=function(){return this.getParamList().filter(function(t){return t.tensor instanceof Tt})},xv.prototype.getFrozenParams=function(){return this.getParamList().filter(function(t){return!(t.tensor instanceof Tt)})},xv.prototype.variable=function(){var r=this;this.getFrozenParams().forEach(function(t){var e=t.path,n=t.tensor;r.reassignParamFromPath(e,n.variable())})},xv.prototype.freeze=function(){var o=this;this.getTrainableParams().forEach(function(t){var e=t.path,n=t.tensor,r=En(n.dataSync());n.dispose(),o.reassignParamFromPath(e,r)})},xv.prototype.dispose=function(e){void 0===e&&(e=!0),this.getParamList().forEach(function(t){if(e&&t.tensor.isDisposed)throw new Error("param tensor has already been disposed for path "+t.path);t.tensor.dispose()}),this._params=void 0},xv.prototype.serializeParams=function(){return new Float32Array(this.getParamList().map(function(t){var e=t.tensor;return Array.from(e.dataSync())}).reduce(function(t,e){return t.concat(e)}))},xv.prototype.load=function(e){return Df(this,void 0,void 0,function(){return Af(this,function(t){switch(t.label){case 0:return e instanceof Float32Array?(this.extractWeights(e),[2]):[4,this.loadFromUri(e)];case 1:return t.sent(),[2]}})})},xv.prototype.loadFromUri=function(n){return Df(this,void 0,void 0,function(){var e;return Af(this,function(t){switch(t.label){case 0:if(n&&"string"!=typeof n)throw new Error(this._name+".loadFromUri - expected model uri");return[4,gv(n,this.getDefaultModelName())];case 1:return e=t.sent(),this.loadFromWeightMap(e),[2]}})})},xv.prototype.loadFromDisk=function(h){return Df(this,void 0,void 0,function(){var e,n,r,o,i,a,s,u,c,l;return Af(this,function(t){switch(t.label){case 0:if(h&&"string"!=typeof h)throw new Error(this._name+".loadFromDisk - expected model file path");return e=qd.getEnv().readFile,n=mv(h,this.getDefaultModelName()),r=n.manifestUri,o=n.modelBaseUri,i=function(t){return Promise.all(t.map(function(t){return e(t).then(function(t){return t.buffer})}))},a=Fp.weightsLoaderFactory(i),c=(u=JSON).parse,[4,e(r)];case 1:return s=c.apply(u,[t.sent().toString()]),[4,a(s,o)];case 2:return l=t.sent(),this.loadFromWeightMap(l),[2]}})})},xv.prototype.loadFromWeightMap=function(t){var e=this.extractParamsFromWeigthMap(t),n=e.paramMappings,r=e.params;this._paramMappings=n,this._params=r},xv.prototype.extractWeights=function(t){var e=this.extractParams(t),n=e.paramMappings,r=e.params;this._paramMappings=n,this._params=r},xv.prototype.traversePropertyPath=function(n){if(!this.params)throw new Error("traversePropertyPath - model has no loaded params");var t=n.split("/").reduce(function(t,e){if(!t.nextObj.hasOwnProperty(e))throw new Error("traversePropertyPath - object does not have property "+e+", for path "+n);return{obj:t.nextObj,objProp:e,nextObj:t.nextObj[e]}},{nextObj:this.params}),e=t.obj,r=t.objProp;if(!(e&&r&&e[r]instanceof yt))throw new Error("traversePropertyPath - parameter is not a tensor, for path "+n);return{obj:e,objProp:r}},xv);function xv(t){this._name=t,this._params=void 0,this._paramMappings=[]}function bv(e,n,r){return tn(function(){var t=kc(e,n.depthwise_filter,n.pointwise_filter,r,"same");return t=Tu(t,n.bias)})}function wv(r,o,i){return void 0===i&&(i=!1),tn(function(){var t=hl(i?Tu(bc(r,o.conv0.filters,[2,2],"same"),o.conv0.bias):bv(r,o.conv0,[2,2])),e=bv(t,o.conv1,[1,1]),n=bv(hl(Tu(t,e)),o.conv2,[1,1]);return hl(Tu(t,Tu(e,n)))})}function Cv(o,i,a,s){return void 0===a&&(a=!1),void 0===s&&(s=!0),tn(function(){var t=hl(a?Tu(bc(o,i.conv0.filters,s?[2,2]:[1,1],"same"),i.conv0.bias):bv(o,i.conv0,s?[2,2]:[1,1])),e=bv(t,i.conv1,[1,1]),n=bv(hl(Tu(t,e)),i.conv2,[1,1]),r=bv(hl(Tu(t,Tu(e,n))),i.conv3,[1,1]);return hl(Tu(t,Tu(e,Tu(n,r))))})}function Ev(e,n,r,o){return void 0===r&&(r="same"),void 0===o&&(o=!1),tn(function(){var t=Tu(bc(e,n.filters,[1,1],r),n.bias);return o?hl(t):t})}function _v(t,n){Object.keys(t).forEach(function(e){n.some(function(t){return t.originalPath===e})||t[e].dispose()})}function Iv(a,s){return function(t,e,n,r){var o=Dn(a(t*e*n*n),[n,n,t,e]),i=Rn(a(e));return s.push({paramPath:r+"/filters"},{paramPath:r+"/bias"}),{filters:o,bias:i}}}function Rv(i,a){return function(t,e,n){var r=kn(i(t*e),[t,e]),o=Rn(i(e));return a.push({paramPath:n+"/weights"},{paramPath:n+"/bias"}),{weights:r,bias:o}}}var kv=function(t,e,n){this.depthwise_filter=t,this.pointwise_filter=e,this.bias=n};function Sv(a,s){return function(t,e,n){var r=Dn(a(9*t),[3,3,t,1]),o=Dn(a(t*e),[1,1,t,e]),i=Rn(a(e));return s.push({paramPath:n+"/depthwise_filter"},{paramPath:n+"/pointwise_filter"},{paramPath:n+"/bias"}),new kv(r,o,i)}}function Dv(o){return function(t){var e=o(t+"/depthwise_filter",4),n=o(t+"/pointwise_filter",4),r=o(t+"/bias",1);return new kv(e,n,r)}}function Av(o,i){return function(t,e,n){var r=o[t];if(!Mf(r,e))throw new Error("expected weightMap["+t+"] to be a Tensor"+e+"D, instead have "+r);return i.push({originalPath:t,paramPath:n||t}),r}}function Tv(t){var n=t;return{extractWeights:function(t){var e=n.slice(0,t);return n=n.slice(t),e},getRemainingWeights:function(){return n}}}function Nv(t,e){var o=Iv(t,e),i=Sv(t,e);function a(t,e,n,r){return void 0===r&&(r=!1),{conv0:r?o(t,e,3,n+"/conv0"):i(t,e,n+"/conv0"),conv1:i(e,e,n+"/conv1"),conv2:i(e,e,n+"/conv2")}}return{extractDenseBlock3Params:a,extractDenseBlock4Params:function(t,e,n,r){void 0===r&&(r=!1);var o=a(t,e,n,r);return{conv0:o.conv0,conv1:o.conv1,conv2:o.conv2,conv3:i(e,e,n+"/conv3")}}}}function Fv(e){return function(t){return{filters:e(t+"/filters",4),bias:e(t+"/bias",1)}}}function Mv(t,e){var n=Av(t,e),r=Fv(n),o=Dv(n);return{extractDenseBlock3Params:function(t,e){return void 0===e&&(e=!1),{conv0:e?r(t+"/conv0"):o(t+"/conv0"),conv1:o(t+"/conv1"),conv2:o(t+"/conv2")}},extractDenseBlock4Params:function(t,e){return void 0===e&&(e=!1),{conv0:e?r(t+"/conv0"):o(t+"/conv0"),conv1:o(t+"/conv1"),conv2:o(t+"/conv2"),conv3:o(t+"/conv3")}}}}var Ov,Pv=(kf(Bv,Ov=yv),Bv.prototype.forwardInput=function(e){var n=this.params;if(!n)throw new Error("FaceFeatureExtractor - load model before inference");return tn(function(){var t=Cv(cd(e.toBatchTensor(112,!0),[122.782,117.001,104.298]).div(In(255)),n.dense0,!0);return t=Cv(t=Cv(t=Cv(t,n.dense1),n.dense2),n.dense3),t=Uc(t,[7,7],[2,2],"valid")})},Bv.prototype.forward=function(n){return Df(this,void 0,void 0,function(){var e;return Af(this,function(t){switch(t.label){case 0:return e=this.forwardInput,[4,hv(n)];case 1:return[2,e.apply(this,[t.sent()])]}})})},Bv.prototype.getDefaultModelName=function(){return"face_feature_extractor_model"},Bv.prototype.extractParamsFromWeigthMap=function(t){return function(t){var e=[],n=Mv(t,e).extractDenseBlock4Params,r={dense0:n("dense0",!0),dense1:n("dense1"),dense2:n("dense2"),dense3:n("dense3")};return _v(t,e),{params:r,paramMappings:e}}(t)},Bv.prototype.extractParams=function(t){return function(t){var e=[],n=Tv(t),r=n.extractWeights,o=n.getRemainingWeights,i=Nv(r,e).extractDenseBlock4Params,a=i(3,32,"dense0",!0),s=i(32,64,"dense1"),u=i(64,128,"dense2"),c=i(128,256,"dense3");if(0!==o().length)throw new Error("weights remaing after extract: "+o().length);return{paramMappings:e,params:{dense0:a,dense1:s,dense2:u,dense3:c}}}(t)},Bv);function Bv(){return Ov.call(this,"FaceFeatureExtractor")||this}function Lv(t,e){return tn(function(){return Tu(Ac(t,e.weights),e.bias)})}function Wv(e){var n={},r={};return Object.keys(e).forEach(function(t){(t.startsWith("fc")?r:n)[t]=e[t]}),{featureExtractorMap:n,classifierMap:r}}var zv,Uv=(kf(Vv,zv=yv),Object.defineProperty(Vv.prototype,"faceFeatureExtractor",{get:function(){return this._faceFeatureExtractor},enumerable:!0,configurable:!0}),Vv.prototype.runNet=function(e){var n=this,r=this.params;if(!r)throw new Error(this._name+" - load model before inference");return tn(function(){var t=e instanceof cv?n.faceFeatureExtractor.forwardInput(e):e;return Lv(t.as2D(t.shape[0],-1),r.fc)})},Vv.prototype.dispose=function(t){void 0===t&&(t=!0),this.faceFeatureExtractor.dispose(t),zv.prototype.dispose.call(this,t)},Vv.prototype.loadClassifierParams=function(t){var e=this.extractClassifierParams(t),n=e.params,r=e.paramMappings;this._params=n,this._paramMappings=r},Vv.prototype.extractClassifierParams=function(t){return function(t,e,n){var r=[],o=Tv(t),i=o.extractWeights,a=o.getRemainingWeights,s=Rv(i,r)(e,n,"fc");if(0!==a().length)throw new Error("weights remaing after extract: "+a().length);return{paramMappings:r,params:{fc:s}}}(t,this.getClassifierChannelsIn(),this.getClassifierChannelsOut())},Vv.prototype.extractParamsFromWeigthMap=function(t){var e=Wv(t),n=e.featureExtractorMap,r=e.classifierMap;return this.faceFeatureExtractor.loadFromWeightMap(n),function(t){var e,n=[],r=Av(t,n),o={fc:(e="fc",{weights:r(e+"/weights",2),bias:r(e+"/bias",1)})};return _v(t,n),{params:o,paramMappings:n}}(r)},Vv.prototype.extractParams=function(t){var e=this.getClassifierChannelsIn(),n=this.getClassifierChannelsOut(),r=n*e+n,o=t.slice(0,t.length-r),i=t.slice(t.length-r);return this.faceFeatureExtractor.extractWeights(o),this.extractClassifierParams(i)},Vv);function Vv(t,e){var n=zv.call(this,t)||this;return n._faceFeatureExtractor=e,n}var Gv=["neutral","happy","sad","angry","fearful","disgusted","surprised"],Hv=(qv.prototype.asSortedArray=function(){var e=this;return Gv.map(function(t){return{expression:t,probability:e[t]}}).sort(function(t,e){return e.probability-t.probability})},qv);function qv(n){var r=this;if(7!==n.length)throw new Error("FaceExpressions.constructor - expected probabilities.length to be 7, have: "+n.length);Gv.forEach(function(t,e){r[t]=n[e]})}var jv,Kv=(kf(Xv,jv=Uv),Xv.prototype.forwardInput=function(t){var e=this;return tn(function(){return io(e.runNet(t))})},Xv.prototype.forward=function(n){return Df(this,void 0,void 0,function(){var e;return Af(this,function(t){switch(t.label){case 0:return e=this.forwardInput,[4,hv(n)];case 1:return[2,e.apply(this,[t.sent()])]}})})},Xv.prototype.predictExpressions=function(a){return Df(this,void 0,void 0,function(){var e,n,r,o,i=this;return Af(this,function(t){switch(t.label){case 0:return[4,hv(a)];case 1:return e=t.sent(),[4,this.forwardInput(e)];case 2:return n=t.sent(),[4,Promise.all(Or(n).map(function(n){return Df(i,void 0,void 0,function(){var e;return Af(this,function(t){switch(t.label){case 0:return[4,n.data()];case 1:return e=t.sent(),n.dispose(),[2,e]}})})}))];case 3:return r=t.sent(),n.dispose(),o=r.map(function(t){return new Hv(t)}),[2,e.isBatchInput?o:o[0]]}})})},Xv.prototype.getDefaultModelName=function(){return"face_expression_model"},Xv.prototype.getClassifierChannelsIn=function(){return 256},Xv.prototype.getClassifierChannelsOut=function(){return 7},Xv);function Xv(t){return void 0===t&&(t=new Pv),jv.call(this,"FaceExpressionNet",t)||this}function Yv(t){return t.expressions instanceof Hv}function $v(t,e){var n={expressions:e};return Object.assign({},t,n)}function Jv(t){return Md(t)&&t.landmarks instanceof vd&&t.unshiftedLandmarks instanceof vd&&t.alignedRect instanceof od}function Qv(t,e){var n=t.detection.box,r=e.shiftBy(n.x,n.y),o=r.align(),i=t.detection.imageDims,a={landmarks:r,unshiftedLandmarks:e,alignedRect:new od(t.detection.score,o.rescale(i.reverse()),i)};return Object.assign({},t,a)}var Zv=function(t){void 0===t&&(t={});var e=t.drawLines,n=void 0===e||e,r=t.drawPoints,o=void 0===r||r,i=t.lineWidth,a=t.lineColor,s=t.pointSize,u=t.pointColor;this.drawLines=n,this.drawPoints=o,this.lineWidth=i||1,this.pointSize=s||2,this.lineColor=a||"rgba(0, 255, 255, 1)",this.pointColor=u||"rgba(255, 0, 255, 1)"},tm=(em.prototype.draw=function(t){var e=Kd(t),n=this.options,r=n.drawLines,o=n.drawPoints,i=n.lineWidth,a=n.lineColor,s=n.pointSize,u=n.pointColor;r&&this.faceLandmarks instanceof wd&&(e.strokeStyle=a,e.lineWidth=i,If(e,this.faceLandmarks.getJawOutline()),If(e,this.faceLandmarks.getLeftEyeBrow()),If(e,this.faceLandmarks.getRightEyeBrow()),If(e,this.faceLandmarks.getNose()),If(e,this.faceLandmarks.getLeftEye(),!0),If(e,this.faceLandmarks.getRightEye(),!0),If(e,this.faceLandmarks.getMouth(),!0)),o&&(e.strokeStyle=u,e.fillStyle=u,this.faceLandmarks.positions.forEach(function(t){e.beginPath(),e.arc(t.x,t.y,s,0,2*Math.PI),e.fill()}))},em);function em(t,e){void 0===e&&(e={}),this.faceLandmarks=t,this.options=new Zv(e)}var nm=Object.freeze({__proto__:null,drawContour:If,drawDetections:function(o,t){(Array.isArray(t)?t:[t]).forEach(function(t){var e=t instanceof od?t.score:Md(t)?t.detection.score:void 0,n=t instanceof od?t.box:Md(t)?t.detection.box:new $f(t),r=e?""+zf(e):void 0;new Qd(n,{label:r}).draw(o)})},drawFaceExpressions:function(o,t,i,a){void 0===i&&(i=.1),(Array.isArray(t)?t:[t]).forEach(function(t){var e=t instanceof Hv?t:Yv(t)?t.expressions:void 0;if(!e)throw new Error("drawFaceExpressions - expected faceExpressions to be FaceExpressions | WithFaceExpressions<{}> or array thereof");var n=e.asSortedArray().filter(function(t){return t.probability>i}),r=Md(t)?t.detection.box.bottomLeft:a||new Xf(0,0);new Yd(n.map(function(t){return t.expression+" ("+zf(t.probability)+")"}),r).draw(o)})},DrawBoxOptions:Jd,DrawBox:Qd,DrawFaceLandmarksOptions:Zv,DrawFaceLandmarks:tm,drawFaceLandmarks:function(n,t){(Array.isArray(t)?t:[t]).forEach(function(t){var e=t instanceof vd?t:Jv(t)?t.landmarks:void 0;if(!e)throw new Error("drawFaceLandmarks - expected faceExpressions to be FaceLandmarks | WithFaceLandmarks> or array thereof");new tm(e).draw(n)})},get AnchorPosition(){return Gd},DrawTextFieldOptions:Xd,DrawTextField:Yd});function rm(t,e){var n=[],r=Tv(t),o=r.extractWeights,i=r.getRemainingWeights,a=function(t,e){var r=Iv(t,e),o=Sv(t,e);return{extractConvParams:r,extractSeparableConvParams:o,extractReductionBlockParams:function(t,e,n){return{separable_conv0:o(t,e,n+"/separable_conv0"),separable_conv1:o(e,e,n+"/separable_conv1"),expansion_conv:r(t,e,1,n+"/expansion_conv")}},extractMainBlockParams:function(t,e){return{separable_conv0:o(t,t,e+"/separable_conv0"),separable_conv1:o(t,t,e+"/separable_conv1"),separable_conv2:o(t,t,e+"/separable_conv2")}}}}(o,n),s=a.extractConvParams,u=a.extractSeparableConvParams,c=a.extractReductionBlockParams,l=a.extractMainBlockParams,h={conv_in:s(3,32,3,"entry_flow/conv_in"),reduction_block_0:c(32,64,"entry_flow/reduction_block_0"),reduction_block_1:c(64,128,"entry_flow/reduction_block_1")},p={};Hf(e,0,1).forEach(function(t){p["main_block_"+t]=l(128,"middle_flow/main_block_"+t)});var f={reduction_block:c(128,256,"exit_flow/reduction_block"),separable_conv:u(256,512,"exit_flow/separable_conv")};if(0!==i().length)throw new Error("weights remaing after extract: "+i().length);return{paramMappings:n,params:{entry_flow:h,middle_flow:p,exit_flow:f}}}function om(t,e){var n=[],r=function(t,e){var n=Av(t,e),r=Fv(n),o=Dv(n);return{extractConvParams:r,extractSeparableConvParams:o,extractReductionBlockParams:function(t){return{separable_conv0:o(t+"/separable_conv0"),separable_conv1:o(t+"/separable_conv1"),expansion_conv:r(t+"/expansion_conv")}},extractMainBlockParams:function(t){return{separable_conv0:o(t+"/separable_conv0"),separable_conv1:o(t+"/separable_conv1"),separable_conv2:o(t+"/separable_conv2")}}}}(t,n),o=r.extractConvParams,i=r.extractSeparableConvParams,a=r.extractReductionBlockParams,s=r.extractMainBlockParams,u={conv_in:o("entry_flow/conv_in"),reduction_block_0:a("entry_flow/reduction_block_0"),reduction_block_1:a("entry_flow/reduction_block_1")},c={};Hf(e,0,1).forEach(function(t){c["main_block_"+t]=s("middle_flow/main_block_"+t)});var l={reduction_block:a("exit_flow/reduction_block"),separable_conv:i("exit_flow/separable_conv")};return _v(t,n),{params:{entry_flow:u,middle_flow:c,exit_flow:l},paramMappings:n}}function im(t,e,n){return Tu(bc(t,e.filters,n,"same"),e.bias)}function am(t,e,n){void 0===n&&(n=!0);var r=n?hl(t):t;return r=bv(r,e.separable_conv0,[1,1]),r=bv(hl(r),e.separable_conv1,[1,1]),r=zc(r,[3,3],[2,2],"same"),r=Tu(r,im(t,e.expansion_conv,[2,2]))}var sm,um,cm=(kf(lm,sm=yv),lm.prototype.forwardInput=function(n){var r=this,o=this.params;if(!o)throw new Error("TinyXception - load model before inference");return tn(function(){var t=cd(n.toBatchTensor(112,!0),[122.782,117.001,104.298]).div(In(256)),e=hl(im(t,o.entry_flow.conv_in,[2,2]));return e=am(e=am(e,o.entry_flow.reduction_block_0,!1),o.entry_flow.reduction_block_1),Hf(r._numMainBlocks,0,1).forEach(function(t){e=function(t,e){var n=bv(hl(t),e.separable_conv0,[1,1]);return n=bv(hl(n),e.separable_conv1,[1,1]),n=bv(hl(n),e.separable_conv2,[1,1]),n=Tu(n,t)}(e,o.middle_flow["main_block_"+t])}),e=am(e,o.exit_flow.reduction_block),e=hl(bv(e,o.exit_flow.separable_conv,[1,1]))})},lm.prototype.forward=function(n){return Df(this,void 0,void 0,function(){var e;return Af(this,function(t){switch(t.label){case 0:return e=this.forwardInput,[4,hv(n)];case 1:return[2,e.apply(this,[t.sent()])]}})})},lm.prototype.getDefaultModelName=function(){return"tiny_xception_model"},lm.prototype.extractParamsFromWeigthMap=function(t){return om(t,this._numMainBlocks)},lm.prototype.extractParams=function(t){return rm(t,this._numMainBlocks)},lm);function lm(t){var e=sm.call(this,"TinyXception")||this;return e._numMainBlocks=t,e}(um=c.Gender||(c.Gender={})).FEMALE="female",um.MALE="male";var hm,pm=(kf(fm,hm=yv),Object.defineProperty(fm.prototype,"faceFeatureExtractor",{get:function(){return this._faceFeatureExtractor},enumerable:!0,configurable:!0}),fm.prototype.runNet=function(n){var r=this,o=this.params;if(!o)throw new Error(this._name+" - load model before inference");return tn(function(){var t=n instanceof cv?r.faceFeatureExtractor.forwardInput(n):n,e=Uc(t,[7,7],[2,2],"valid").as2D(t.shape[0],-1);return{age:Lv(e,o.fc.age).as1D(),gender:Lv(e,o.fc.gender)}})},fm.prototype.forwardInput=function(r){var o=this;return tn(function(){var t=o.runNet(r),e=t.age,n=t.gender;return{age:e,gender:io(n)}})},fm.prototype.forward=function(n){return Df(this,void 0,void 0,function(){var e;return Af(this,function(t){switch(t.label){case 0:return e=this.forwardInput,[4,hv(n)];case 1:return[2,e.apply(this,[t.sent()])]}})})},fm.prototype.predictAgeAndGender=function(s){return Df(this,void 0,void 0,function(){var e,n,r,o,i,a,u=this;return Af(this,function(t){switch(t.label){case 0:return[4,hv(s)];case 1:return e=t.sent(),[4,this.forwardInput(e)];case 2:return n=t.sent(),r=Or(n.age),o=Or(n.gender),i=r.map(function(t,e){return{ageTensor:t,genderTensor:o[e]}}),[4,Promise.all(i.map(function(t){var a=t.ageTensor,s=t.genderTensor;return Df(u,void 0,void 0,function(){var e,n,r,o,i;return Af(this,function(t){switch(t.label){case 0:return[4,a.data()];case 1:return e=t.sent()[0],[4,s.data()];case 2:return n=t.sent()[0],o=(r=.5 0");if("number"!=typeof this._scaleFactor||this._scaleFactor<=0||1<=this._scaleFactor)throw new Error(this._name+" - expected scaleFactor to be a number between 0 and 1");if("number"!=typeof this._maxNumScales||this._maxNumScales<0)throw new Error(this._name+" - expected maxNumScales to be a number > 0");if(!Array.isArray(this._scoreThresholds)||3!==this._scoreThresholds.length||this._scoreThresholds.some(function(t){return"number"!=typeof t}))throw new Error(this._name+" - expected scoreThresholds to be an array of numbers of length 3");if(this._scaleSteps&&(!Array.isArray(this._scaleSteps)||this._scaleSteps.some(function(t){return"number"!=typeof t})))throw new Error(this._name+" - expected scaleSteps to be an array of numbers")}function Hm(s,u){function i(t,e,n,r,o){var i=Dn(s(t*e*n*n),[n,n,t,e]),a=Rn(s(e));return u.push({paramPath:r+"/filters"},{paramPath:r+"/"+(o?"batch_norm_offset":"bias")}),{filters:i,bias:a}}function r(t,e,n,r){var o=i(t,e,n,r,!0);return{filters:o.filters,batch_norm_offset:o.bias}}function t(t,e,n){return{depthwise_conv:function(t,e){var n=Dn(s(9*t),[3,3,t,1]),r=Rn(s(t)),o=Rn(s(t)),i=Rn(s(t)),a=Rn(s(t));return u.push({paramPath:e+"/filters"},{paramPath:e+"/batch_norm_scale"},{paramPath:e+"/batch_norm_offset"},{paramPath:e+"/batch_norm_mean"},{paramPath:e+"/batch_norm_variance"}),{filters:n,batch_norm_scale:r,batch_norm_offset:o,batch_norm_mean:i,batch_norm_variance:a}}(t,n+"/depthwise_conv"),pointwise_conv:r(t,e,1,n+"/pointwise_conv")}}return{extractMobilenetV1Params:function(){return{conv_0:r(3,32,3,"mobilenetv1/conv_0"),conv_1:t(32,64,"mobilenetv1/conv_1"),conv_2:t(64,128,"mobilenetv1/conv_2"),conv_3:t(128,128,"mobilenetv1/conv_3"),conv_4:t(128,256,"mobilenetv1/conv_4"),conv_5:t(256,256,"mobilenetv1/conv_5"),conv_6:t(256,512,"mobilenetv1/conv_6"),conv_7:t(512,512,"mobilenetv1/conv_7"),conv_8:t(512,512,"mobilenetv1/conv_8"),conv_9:t(512,512,"mobilenetv1/conv_9"),conv_10:t(512,512,"mobilenetv1/conv_10"),conv_11:t(512,512,"mobilenetv1/conv_11"),conv_12:t(512,1024,"mobilenetv1/conv_12"),conv_13:t(1024,1024,"mobilenetv1/conv_13")}},extractPredictionLayerParams:function(){return{conv_0:r(1024,256,1,"prediction_layer/conv_0"),conv_1:r(256,512,3,"prediction_layer/conv_1"),conv_2:r(512,128,1,"prediction_layer/conv_2"),conv_3:r(128,256,3,"prediction_layer/conv_3"),conv_4:r(256,128,1,"prediction_layer/conv_4"),conv_5:r(128,256,3,"prediction_layer/conv_5"),conv_6:r(256,64,1,"prediction_layer/conv_6"),conv_7:r(64,128,3,"prediction_layer/conv_7"),box_predictor_0:{box_encoding_predictor:i(512,12,1,"prediction_layer/box_predictor_0/box_encoding_predictor"),class_predictor:i(512,9,1,"prediction_layer/box_predictor_0/class_predictor")},box_predictor_1:{box_encoding_predictor:i(1024,24,1,"prediction_layer/box_predictor_1/box_encoding_predictor"),class_predictor:i(1024,18,1,"prediction_layer/box_predictor_1/class_predictor")},box_predictor_2:{box_encoding_predictor:i(512,24,1,"prediction_layer/box_predictor_2/box_encoding_predictor"),class_predictor:i(512,18,1,"prediction_layer/box_predictor_2/class_predictor")},box_predictor_3:{box_encoding_predictor:i(256,24,1,"prediction_layer/box_predictor_3/box_encoding_predictor"),class_predictor:i(256,18,1,"prediction_layer/box_predictor_3/class_predictor")},box_predictor_4:{box_encoding_predictor:i(256,24,1,"prediction_layer/box_predictor_4/box_encoding_predictor"),class_predictor:i(256,18,1,"prediction_layer/box_predictor_4/class_predictor")},box_predictor_5:{box_encoding_predictor:i(128,24,1,"prediction_layer/box_predictor_5/box_encoding_predictor"),class_predictor:i(128,18,1,"prediction_layer/box_predictor_5/class_predictor")}}}}}function qm(t){var e=[],n=function(t,e){var i=Av(t,e);function a(t,e,n){return{filters:i(t+"/Conv2d_"+e+"_pointwise/weights",4,n+"/filters"),batch_norm_offset:i(t+"/Conv2d_"+e+"_pointwise/convolution_bn_offset",1,n+"/batch_norm_offset")}}function n(t){var e="mobilenetv1/conv_"+t,n="MobilenetV1/Conv2d_"+t+"_depthwise",r=e+"/depthwise_conv",o=e+"/pointwise_conv";return{depthwise_conv:{filters:i(n+"/depthwise_weights",4,r+"/filters"),batch_norm_scale:i(n+"/BatchNorm/gamma",1,r+"/batch_norm_scale"),batch_norm_offset:i(n+"/BatchNorm/beta",1,r+"/batch_norm_offset"),batch_norm_mean:i(n+"/BatchNorm/moving_mean",1,r+"/batch_norm_mean"),batch_norm_variance:i(n+"/BatchNorm/moving_variance",1,r+"/batch_norm_variance")},pointwise_conv:a("MobilenetV1",t,o)}}function r(t,e){return{filters:i(t+"/weights",4,e+"/filters"),bias:i(t+"/biases",1,e+"/bias")}}function o(t){return{box_encoding_predictor:r("Prediction/BoxPredictor_"+t+"/BoxEncodingPredictor","prediction_layer/box_predictor_"+t+"/box_encoding_predictor"),class_predictor:r("Prediction/BoxPredictor_"+t+"/ClassPredictor","prediction_layer/box_predictor_"+t+"/class_predictor")}}return{extractMobilenetV1Params:function(){return{conv_0:a("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)}},extractPredictionLayerParams:function(){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)}}}}(t,e),r=n.extractMobilenetV1Params,o=n.extractPredictionLayerParams,i=t["Output/extra_dim"];if(e.push({originalPath:"Output/extra_dim",paramPath:"output_layer/extra_dim"}),!Pf(i))throw new Error("expected weightMap['Output/extra_dim'] to be a Tensor3D, instead have "+i);var a={mobilenetv1:r(),prediction_layer:o(),output_layer:{extra_dim:i}};return _v(t,e),{params:a,paramMappings:e}}function jm(e,n,r){return tn(function(){var t=bc(e,n.filters,r,"same");return t=Tu(t,n.batch_norm_offset),Ws(t,0,6)})}var Km=.0010000000474974513;function Xm(t,e){return tn(function(){var o=null,i=jm(t,e.conv_0,[2,2]);if([e.conv_1,e.conv_2,e.conv_3,e.conv_4,e.conv_5,e.conv_6,e.conv_7,e.conv_8,e.conv_9,e.conv_10,e.conv_11,e.conv_12,e.conv_13].forEach(function(t,e){var n=e+1,r=function(e){return[2,4,6,12].some(function(t){return t===e})?[2,2]:[1,1]}(n);i=jm(i=function(e,n,r){return tn(function(){var t=_c(e,n.filters,r,"same");return t=Cu(t,n.batch_norm_mean,n.batch_norm_variance,n.batch_norm_offset,n.batch_norm_scale,Km),Ws(t,0,6)})}(i,t.depthwise_conv,r),t.pointwise_conv,[1,1]),11===n&&(o=i)}),null===o)throw new Error("mobileNetV1 - output of conv layer 11 is null");return{out:i,conv11:o}})}function Ym(t,e,n){var r=t.arraySync(),o=Math.min(r[e][0],r[e][2]),i=Math.min(r[e][1],r[e][3]),a=Math.max(r[e][0],r[e][2]),s=Math.max(r[e][1],r[e][3]),u=Math.min(r[n][0],r[n][2]),c=Math.min(r[n][1],r[n][3]),l=Math.max(r[n][0],r[n][2]),h=Math.max(r[n][1],r[n][3]),p=(a-o)*(s-i),f=(l-u)*(h-c);if(p<=0||f<=0)return 0;var d=Math.max(o,u),v=Math.max(i,c),m=Math.min(a,l),g=Math.min(s,h),y=Math.max(m-d,0)*Math.max(g-v,0);return y/(p+f-y)}function $m(t,e){var n=function(t){var e=Or(dl(t,[1,0])),n=[Ju(e[2],e[0]),Ju(e[3],e[1])];return{sizes:n,centers:[Tu(e[0],Ou(n[0],In(2))),Tu(e[1],Ou(n[1],In(2)))]}}(t),r=n.sizes,o=n.centers,i=Or(dl(e,[1,0])),a=Ou(qu(Gs(Ou(i[2],In(5))),r[0]),In(2)),s=Tu(qu(Ou(i[0],In(10)),r[0]),o[0]),u=Ou(qu(Gs(Ou(i[3],In(5))),r[1]),In(2)),c=Tu(qu(Ou(i[1],In(10)),r[1]),o[1]);return dl(Nr([Ju(s,a),Ju(c,u),Tu(s,a),Tu(c,u)]),[1,0])}function Jm(e,n){return tn(function(){var t=e.shape[0];return{boxPredictionEncoding:Dr(Ev(e,n.box_encoding_predictor),[t,-1,1,4]),classPrediction:Dr(Ev(e,n.class_predictor),[t,-1,3])}})}var Qm=(Object.defineProperty(Zm.prototype,"minConfidence",{get:function(){return this._minConfidence},enumerable:!0,configurable:!0}),Object.defineProperty(Zm.prototype,"maxResults",{get:function(){return this._maxResults},enumerable:!0,configurable:!0}),Zm);function Zm(t){var e=void 0===t?{}:t,n=e.minConfidence,r=e.maxResults;if(this._name="SsdMobilenetv1Options",this._minConfidence=n||.5,this._maxResults=r||100,"number"!=typeof this._minConfidence||this._minConfidence<=0||1<=this._minConfidence)throw new Error(this._name+" - expected minConfidence to be a number between 0 and 1");if("number"!=typeof this._maxResults)throw new Error(this._name+" - expected maxResults to be a number")}var tg,eg=(kf(ng,tg=yv),ng.prototype.forwardInput=function(r){var o=this.params;if(!o)throw new Error("SsdMobilenetv1 - load model before inference");return tn(function(){var t=r.toBatchTensor(512,!1).toFloat(),e=Xm(Ju(qu(t,In(.007843137718737125)),In(1)),o.mobilenetv1),n=function(l,h,p){return tn(function(){var t=jm(jm(l,p.conv_0,[1,1]),p.conv_1,[2,2]),e=jm(jm(t,p.conv_2,[1,1]),p.conv_3,[2,2]),n=jm(jm(e,p.conv_4,[1,1]),p.conv_5,[2,2]),r=jm(jm(n,p.conv_6,[1,1]),p.conv_7,[2,2]),o=Jm(h,p.box_predictor_0),i=Jm(l,p.box_predictor_1),a=Jm(t,p.box_predictor_2),s=Jm(e,p.box_predictor_3),u=Jm(n,p.box_predictor_4),c=Jm(r,p.box_predictor_5);return{boxPredictions:zn([o.boxPredictionEncoding,i.boxPredictionEncoding,a.boxPredictionEncoding,s.boxPredictionEncoding,u.boxPredictionEncoding,c.boxPredictionEncoding],1),classPredictions:zn([o.classPrediction,i.classPrediction,a.classPrediction,s.classPrediction,u.classPrediction,c.classPrediction],1)}})}(e.out,e.conv11,o.prediction_layer);return function(o,i,a){return tn(function(){var t=o.shape[0],e=$m(Dr(Fr(a.extra_dim,[t,1,1]),[-1,4]),Dr(o,[-1,4]));e=Dr(e,[t,e.shape[0]/t,4]);var n=Zs(qc(i,[0,0,1],[-1,-1,-1])),r=qc(n,[0,0,0],[-1,-1,1]);return r=Dr(r,[t,r.shape[1]]),{boxes:Or(e),scores:Or(r)}})}(n.boxPredictions,n.classPredictions,o.output_layer)})},ng.prototype.forward=function(n){return Df(this,void 0,void 0,function(){var e;return Af(this,function(t){switch(t.label){case 0:return e=this.forwardInput,[4,hv(n)];case 1:return[2,e.apply(this,[t.sent()])]}})})},ng.prototype.locateFaces=function(w,C){return void 0===C&&(C={}),Df(this,void 0,void 0,function(){var e,n,r,s,o,i,a,u,c,l,h,p,f,d,v,m,g,y,x,b;return Af(this,function(t){switch(t.label){case 0:return e=new Qm(C),n=e.maxResults,r=e.minConfidence,[4,hv(w)];case 1:for(s=t.sent(),o=this.forwardInput(s),i=o.boxes,a=o.scores,u=i[0],c=a[0],l=1;la}).sort(function(t,e){return e.score-t.score}),u=[];return r.forEach(function(t){if(!(u.length>=s)){for(var e=t.score,n=u.length-1;0<=n;--n){var r=Ym(o,t.boxIndex,u[n]);if(0!==r&&(t.score*=r<=i?1:0,t.score<=a))break}e===t.score&&u.push(t.boxIndex)}}),u}(u,h,n,.5,r),v=s.getReshapedInputDimensions(0),m=s.inputSize,g=m/v.width,y=m/v.height,x=u.arraySync(),b=d.map(function(t){var e=[Math.max(0,x[t][0]),Math.min(1,x[t][2])].map(function(t){return t*y}),n=e[0],r=e[1],o=[Math.max(0,x[t][1]),Math.min(1,x[t][3])].map(function(t){return t*g}),i=o[0],a=o[1];return new od(h[t],new fd(i,n,a-i,r-n),{height:s.getInputHeight(0),width:s.getInputWidth(0)})}),u.dispose(),c.dispose(),[2,b]}})})},ng.prototype.getDefaultModelName=function(){return"ssd_mobilenetv1_model"},ng.prototype.extractParamsFromWeigthMap=function(t){return qm(t)},ng.prototype.extractParams=function(t){return function(t){var e=[],n=Tv(t),r=n.extractWeights,o=n.getRemainingWeights,i=Hm(r,e),a=i.extractMobilenetV1Params,s=i.extractPredictionLayerParams,u=a(),c=s(),l={extra_dim:Sn(r(20472),[1,5118,4])};if(e.push({paramPath:"output_layer/extra_dim"}),0!==o().length)throw new Error("weights remaing after extract: "+o().length);return{params:{mobilenetv1:u,prediction_layer:c,output_layer:l},paramMappings:e}}(t)},ng);function ng(){return tg.call(this,"SsdMobilenetv1")||this}function rg(t){var e=new eg;return e.extractWeights(t),e}var og,ig=(kf(ag,og=eg),ag);function ag(){return null!==og&&og.apply(this,arguments)||this}var sg,ug=[new Xf(.738768,.874946),new Xf(2.42204,2.65704),new Xf(4.30971,7.04493),new Xf(10.246,4.59428),new Xf(12.6868,11.8741)],cg=[new Xf(1.603231,2.094468),new Xf(6.041143,7.080126),new Xf(2.882459,3.518061),new Xf(4.266906,5.178857),new Xf(9.041765,10.66308)],lg=[117.001,114.697,97.404],hg=function(t){return"number"==typeof t};function pg(t){if(!t)throw new Error("invalid config: "+t);if("boolean"!=typeof t.withSeparableConvs)throw new Error("config.withSeparableConvs has to be a boolean, have: "+t.withSeparableConvs);if(!hg(t.iouThreshold)||t.iouThreshold<0||1e.classScore?t:e})]}})})},Cg.DEFAULT_FILTER_SIZES=[3,16,32,64,128,256,512,1024,1024],Cg);function Cg(t){var e=bg.call(this,"TinyYolov2")||this;return pg(t),e._config=t,e}var Eg,_g=(kf(Ig,Eg=wg),Object.defineProperty(Ig.prototype,"withSeparableConvs",{get:function(){return this.config.withSeparableConvs},enumerable:!0,configurable:!0}),Object.defineProperty(Ig.prototype,"anchors",{get:function(){return this.config.anchors},enumerable:!0,configurable:!0}),Ig.prototype.locateFaces=function(e,n){return Df(this,void 0,void 0,function(){return Af(this,function(t){switch(t.label){case 0:return[4,this.detect(e,n)];case 1:return[2,t.sent().map(function(t){return new od(t.score,t.relativeBox,{width:t.imageWidth,height:t.imageHeight})})]}})})},Ig.prototype.getDefaultModelName=function(){return this.withSeparableConvs?"tiny_yolov2_separable_conv_model":"tiny_yolov2_model"},Ig.prototype.extractParamsFromWeigthMap=function(t){return Eg.prototype.extractParamsFromWeigthMap.call(this,t)},Ig);function Ig(t){void 0===t&&(t=!0);var e=Object.assign({},{withSeparableConvs:t,iouThreshold:.4,classes:["face"]},t?{anchors:cg,meanRgb:lg}:{anchors:ug,withClassScores:!0});return Eg.call(this,e)||this}var Rg,kg=(kf(Sg,Rg=yg),Sg);function Sg(){var t=null!==Rg&&Rg.apply(this,arguments)||this;return t._name="TinyFaceDetectorOptions",t}var Dg=(Ag.prototype.then=function(n){return Df(this,void 0,void 0,function(){var e;return Af(this,function(t){switch(t.label){case 0:return e=n,[4,this.run()];case 1:return[2,e.apply(void 0,[t.sent()])]}})})},Ag.prototype.run=function(){return Df(this,void 0,void 0,function(){return Af(this,function(t){throw new Error("ComposableTask - run is not implemented")})})},Ag);function Ag(){}function Tg(a,s,u,c,l){return void 0===l&&(l=function(t){return t.alignedRect}),Df(this,void 0,void 0,function(){var e,n,r,o,i;return Af(this,function(t){switch(t.label){case 0:return e=a.map(function(t){return Jv(t)?l(t):t.detection}),(r=c)?[3,5]:s instanceof yt?[4,fv(s,e)]:[3,2];case 1:return o=t.sent(),[3,4];case 2:return[4,pv(s,e)];case 3:o=t.sent(),t.label=4;case 4:r=o,t.label=5;case 5:return[4,u(n=r)];case 6:return i=t.sent(),n.forEach(function(t){return t instanceof yt&&t.dispose()}),[2,i]}})})}function Ng(e,r,o,i,a){return Df(this,void 0,void 0,function(){var n=this;return Af(this,function(t){return[2,Tg([e],r,function(e){return Df(n,void 0,void 0,function(){return Af(this,function(t){return[2,o(e[0])]})})},i,a)]})})}var Fg=2,Mg=12;function Og(t){var e=Tv(t),n=e.extractWeights,r=e.getRemainingWeights,o=[],i=function(r,o){var u=Iv(r,o),c=Rv(r,o);function l(t,e){var n=Rn(r(t));return o.push({paramPath:e}),n}function h(t,e,n){return void 0===n&&(n=!1),{conv1:u(t[0],t[1],3,e+"/conv1"),prelu1_alpha:l(t[1],e+"/prelu1_alpha"),conv2:u(t[1],t[2],3,e+"/conv2"),prelu2_alpha:l(t[2],e+"/prelu2_alpha"),conv3:u(t[2],t[3],n?2:3,e+"/conv3"),prelu3_alpha:l(t[3],e+"/prelu3_alpha")}}return{extractPNetParams:function(){var t=h([3,10,16,32],"pnet"),e=u(32,2,1,"pnet/conv4_1"),n=u(32,4,1,"pnet/conv4_2");return Sf(Sf({},t),{conv4_1:e,conv4_2:n})},extractRNetParams:function(){var t=h([3,28,48,64],"rnet",!0),e=c(576,128,"rnet/fc1"),n=l(128,"rnet/prelu4_alpha"),r=c(128,2,"rnet/fc2_1"),o=c(128,4,"rnet/fc2_2");return Sf(Sf({},t),{fc1:e,prelu4_alpha:n,fc2_1:r,fc2_2:o})},extractONetParams:function(){var t=h([3,32,64,64],"onet"),e=u(64,128,2,"onet/conv4"),n=l(128,"onet/prelu4_alpha"),r=c(1152,256,"onet/fc1"),o=l(256,"onet/prelu5_alpha"),i=c(256,2,"onet/fc2_1"),a=c(256,4,"onet/fc2_2"),s=c(256,10,"onet/fc2_3");return Sf(Sf({},t),{conv4:e,prelu4_alpha:n,fc1:r,prelu5_alpha:o,fc2_1:i,fc2_2:a,fc2_3:s})}}}(n,o),a=i.extractPNetParams,s=i.extractRNetParams,u=i.extractONetParams,c=a(),l=s(),h=u();if(0!==r().length)throw new Error("weights remaing after extract: "+r().length);return{params:{pnet:c,rnet:l,onet:h},paramMappings:o}}function Pg(t){var e=[],n=function(t,e){var n=Av(t,e);function u(t){return{filters:n(t+"/weights",4,t+"/filters"),bias:n(t+"/bias",1)}}function c(t){return{weights:n(t+"/weights",2),bias:n(t+"/bias",1)}}function l(t){return n(t,1)}function h(t){return{conv1:u(t+"/conv1"),prelu1_alpha:l(t+"/prelu1_alpha"),conv2:u(t+"/conv2"),prelu2_alpha:l(t+"/prelu2_alpha"),conv3:u(t+"/conv3"),prelu3_alpha:l(t+"/prelu3_alpha")}}return{extractPNetParams:function(){var t=h("pnet"),e=u("pnet/conv4_1"),n=u("pnet/conv4_2");return Sf(Sf({},t),{conv4_1:e,conv4_2:n})},extractRNetParams:function(){var t=h("rnet"),e=c("rnet/fc1"),n=l("rnet/prelu4_alpha"),r=c("rnet/fc2_1"),o=c("rnet/fc2_2");return Sf(Sf({},t),{fc1:e,prelu4_alpha:n,fc2_1:r,fc2_2:o})},extractONetParams:function(){var t=h("onet"),e=u("onet/conv4"),n=l("onet/prelu4_alpha"),r=c("onet/fc1"),o=l("onet/prelu5_alpha"),i=c("onet/fc2_1"),a=c("onet/fc2_2"),s=c("onet/fc2_3");return Sf(Sf({},t),{conv4:e,prelu4_alpha:n,fc1:r,prelu5_alpha:o,fc2_1:i,fc2_2:a,fc2_3:s})}}}(t,e),r=n.extractPNetParams,o=n.extractRNetParams,i=n.extractONetParams,a=r(),s=o(),u=i();return _v(t,e),{params:{pnet:a,rnet:s,onet:u},paramMappings:e}}function Bg(t,e){var n=e[0],r=e[1];return{height:Math.floor(n*t),width:Math.floor(r*t)}}var Lg,Wg=(kf(zg,Lg=$f),zg);function zg(t,e,n,r){return Lg.call(this,{left:t,top:e,right:n,bottom:r},!0)||this}function Ug(t){return tn(function(){return qu(Ju(t,In(127.5)),In(.0078125))})}function Vg(t,e){return tn(function(){return Tu(hl(t),qu(e,Ys(hl(Ys(t)))))})}function Gg(e,n,r){return void 0===r&&(r=!1),tn(function(){var t=Ev(e,n.conv1,"valid");return t=Vg(t,n.prelu1_alpha),t=Vg(t=Ev(t=zc(t,r?[2,2]:[3,3],[2,2],"same"),n.conv2,"valid"),n.prelu2_alpha),t=Vg(t=Ev(t=r?t:zc(t,[3,3],[2,2],"valid"),n.conv3,"valid"),n.prelu3_alpha)})}function Hg(s,t,u,c,l){l.stage1=[];var e=t.map(function(a){return tn(function(){var t={scale:a},e=function(o,i){return tn(function(){var t=Bg(i,o.shape.slice(1)),e=t.height,n=t.width,r=Ug(ph.resizeBilinear(o,[e,n]));return dl(r,[0,2,1,3])})}(s,a),n=Date.now(),r=function(r,o){return tn(function(){var t=Gg(r,o,!0),e=Ev(t,o.conv4_1,"valid"),n=mr(nl(e,3),3);return{prob:io(Ju(e,n),3),regions:Ev(t,o.conv4_2,"valid")}})}(e,c),o=r.prob,i=r.regions;return t.pnet=Date.now()-n,{scoresTensor:Or(Or(o,3)[1])[0],regionsTensor:Or(i)[0],scale:a,statsForScale:t}})}).map(function(t){var e=t.scoresTensor,n=t.regionsTensor,r=t.scale,o=t.statsForScale,i=function(t,o,i,e){for(var n=[],a=t.arraySync(),r=0;r=e&&n.push(new Xf(s,r));return n.map(function(t){var e=new Zf(Math.round((t.y*Fg+1)/i),Math.round((t.x*Fg+1)/i),Math.round((t.y*Fg+Mg)/i),Math.round((t.x*Fg+Mg)/i)),n=a[t.y][t.x],r=o.arraySync();return{cell:e,score:n,region:new Wg(r[t.y][t.x][0],r[t.y][t.x][1],r[t.y][t.x][2],r[t.y][t.x][3])}})}(e,n,r,u);if(e.dispose(),n.dispose(),!i.length)return l.stage1.push(o),[];var a=Date.now(),s=ud(i.map(function(t){return t.cell}),i.map(function(t){return t.score}),.5);return o.nms=Date.now()-a,o.numBoxes=s.length,l.stage1.push(o),s.map(function(t){return i[t]})}).reduce(function(t,e){return t.concat(e)},[]),n=[],r=[];if(0g}).map(function(t){return t.idx}),c=u.map(function(t){return m[t]}),l=u.map(function(t){return i[t]}),h=[],p=[],0y}).map(function(t){return t.idx}),c=u.map(function(t){var e=i[t].regions.arraySync();return new Wg(e[0][0],e[0][1],e[0][2],e[0][3])}),l=u.map(function(t,e){return g[t].calibrate(c[e])}),h=u.map(function(t){return o[t]}),p=[],f=[],d=[],0Mg}).slice(0,f),r.scales=m,r.pyramid=m.map(function(t){return Bg(t,[u,c])}),g=Date.now(),[4,Hg(i,m,d[0],e.pnet,r)];case 1:return y=t.sent(),r.total_stage1=Date.now()-g,y.boxes.length?(r.stage2_numInputBoxes=y.boxes.length,g=Date.now(),[4,jg(n,y.boxes,d[1],e.rnet,r)]):[2,a({results:[],stats:r})];case 2:return x=t.sent(),r.total_stage2=Date.now()-g,x.boxes.length?(r.stage3_numInputBoxes=x.boxes.length,g=Date.now(),[4,Kg(n,x.boxes,d[2],e.onet,r)]):[2,a({results:[],stats:r})];case 3:return b=t.sent(),r.total_stage3=Date.now()-g,w=b.boxes.map(function(e,t){return Qv(Od({},new od(b.scores[t],new fd(e.left/c,e.top/u,e.width/c,e.height/u),{height:u,width:c})),new yd(b.points[t].map(function(t){return t.sub(new Xf(e.left,e.top)).div(new Xf(e.width,e.height))}),{width:e.width,height:e.height}))}),[2,a({results:w,stats:r})]}})})},$g.prototype.forward=function(n,r){return void 0===r&&(r={}),Df(this,void 0,void 0,function(){var e;return Af(this,function(t){switch(t.label){case 0:return e=this.forwardInput,[4,hv(n)];case 1:return[4,e.apply(this,[t.sent(),r])];case 2:return[2,t.sent().results]}})})},$g.prototype.forwardWithStats=function(n,r){return void 0===r&&(r={}),Df(this,void 0,void 0,function(){var e;return Af(this,function(t){switch(t.label){case 0:return e=this.forwardInput,[4,hv(n)];case 1:return[2,e.apply(this,[t.sent(),r])]}})})},$g.prototype.getDefaultModelName=function(){return"mtcnn_model"},$g.prototype.extractParamsFromWeigthMap=function(t){return Pg(t)},$g.prototype.extractParams=function(t){return Og(t)},$g);function $g(){return Xg.call(this,"Mtcnn")||this}var Jg,Qg=[new Xf(1.603231,2.094468),new Xf(6.041143,7.080126),new Xf(2.882459,3.518061),new Xf(4.266906,5.178857),new Xf(9.041765,10.66308)],Zg=[117.001,114.697,97.404],ty=(kf(ey,Jg=wg),Object.defineProperty(ey.prototype,"anchors",{get:function(){return this.config.anchors},enumerable:!0,configurable:!0}),ey.prototype.locateFaces=function(e,n){return Df(this,void 0,void 0,function(){return Af(this,function(t){switch(t.label){case 0:return[4,this.detect(e,n)];case 1:return[2,t.sent().map(function(t){return new od(t.score,t.relativeBox,{width:t.imageWidth,height:t.imageHeight})})]}})})},ey.prototype.getDefaultModelName=function(){return"tiny_face_detector_model"},ey.prototype.extractParamsFromWeigthMap=function(t){return Jg.prototype.extractParamsFromWeigthMap.call(this,t)},ey);function ey(){var t={withSeparableConvs:!0,iouThreshold:.4,classes:["face"],anchors:Qg,meanRgb:Zg,isFirstLayerConv2d:!0,filterSizes:[3,16,32,64,128,256,512]};return Jg.call(this,t)||this}function ny(t,e){return ay.ssdMobilenetv1.locateFaces(t,e)}function ry(t){return ay.faceLandmark68Net.detectLandmarks(t)}function oy(t){return ay.ssdMobilenetv1.load(t)}var iy,ay={ssdMobilenetv1:new eg,tinyFaceDetector:new ty,tinyYolov2:new _g,mtcnn:new Yg,faceLandmark68Net:new ym,faceLandmark68TinyNet:new _m,faceRecognitionNet:new Bm,faceExpressionNet:new Kv,ageGenderNet:new pm},sy=oy,uy=ny,cy=ry,ly=(kf(hy,iy=Dg),hy);function hy(t,e,n){var r=iy.call(this)||this;return r.parentTask=t,r.input=e,r.extractedFaces=n,r}var py,fy=(kf(dy,py=ly),dy.prototype.run=function(){return Df(this,void 0,void 0,function(){var e,n,r=this;return Af(this,function(t){switch(t.label){case 0:return[4,this.parentTask];case 1:return[4,Tg(e=t.sent(),this.input,function(e){return Df(r,void 0,void 0,function(){return Af(this,function(t){switch(t.label){case 0:return[4,Promise.all(e.map(function(t){return ay.faceExpressionNet.predictExpressions(t)}))];case 1:return[2,t.sent()]}})})},this.extractedFaces)];case 2:return n=t.sent(),[2,e.map(function(t,e){return $v(t,n[e])})]}})})},dy.prototype.withAgeAndGender=function(){return new Sy(this,this.input)},dy);function dy(){return null!==py&&py.apply(this,arguments)||this}var vy,my=(kf(gy,vy=ly),gy.prototype.run=function(){return Df(this,void 0,void 0,function(){var e,n;return Af(this,function(t){switch(t.label){case 0:return[4,this.parentTask];case 1:return(e=t.sent())?[4,Ng(e,this.input,function(t){return ay.faceExpressionNet.predictExpressions(t)},this.extractedFaces)]:[2];case 2:return n=t.sent(),[2,$v(e,n)]}})})},gy.prototype.withAgeAndGender=function(){return new Ty(this,this.input)},gy);function gy(){return null!==vy&&vy.apply(this,arguments)||this}var yy,xy=(kf(by,yy=fy),by.prototype.withAgeAndGender=function(){return new My(this,this.input)},by.prototype.withFaceDescriptors=function(){return new Gy(this,this.input)},by);function by(){return null!==yy&&yy.apply(this,arguments)||this}var wy,Cy=(kf(Ey,wy=my),Ey.prototype.withAgeAndGender=function(){return new By(this,this.input)},Ey.prototype.withFaceDescriptor=function(){return new jy(this,this.input)},Ey);function Ey(){return null!==wy&&wy.apply(this,arguments)||this}var _y,Iy=(kf(Ry,_y=Dg),Ry);function Ry(t,e,n){var r=_y.call(this)||this;return r.parentTask=t,r.input=e,r.extractedFaces=n,r}var ky,Sy=(kf(Dy,ky=Iy),Dy.prototype.run=function(){return Df(this,void 0,void 0,function(){var e,o,n=this;return Af(this,function(t){switch(t.label){case 0:return[4,this.parentTask];case 1:return[4,Tg(e=t.sent(),this.input,function(e){return Df(n,void 0,void 0,function(){return Af(this,function(t){switch(t.label){case 0:return[4,Promise.all(e.map(function(t){return ay.ageGenderNet.predictAgeAndGender(t)}))];case 1:return[2,t.sent()]}})})},this.extractedFaces)];case 2:return o=t.sent(),[2,e.map(function(t,e){var n=o[e],r=n.age;return zm(Um(t,n.gender,n.genderProbability),r)})]}})})},Dy.prototype.withFaceExpressions=function(){return new fy(this,this.input)},Dy);function Dy(){return null!==ky&&ky.apply(this,arguments)||this}var Ay,Ty=(kf(Ny,Ay=Iy),Ny.prototype.run=function(){return Df(this,void 0,void 0,function(){var e,n,r,o,i;return Af(this,function(t){switch(t.label){case 0:return[4,this.parentTask];case 1:return(e=t.sent())?[4,Ng(e,this.input,function(t){return ay.ageGenderNet.predictAgeAndGender(t)},this.extractedFaces)]:[2];case 2:return n=t.sent(),r=n.age,o=n.gender,i=n.genderProbability,[2,zm(Um(e,o,i),r)]}})})},Ny.prototype.withFaceExpressions=function(){return new my(this,this.input)},Ny);function Ny(){return null!==Ay&&Ay.apply(this,arguments)||this}var Fy,My=(kf(Oy,Fy=Sy),Oy.prototype.withFaceExpressions=function(){return new xy(this,this.input)},Oy.prototype.withFaceDescriptors=function(){return new Gy(this,this.input)},Oy);function Oy(){return null!==Fy&&Fy.apply(this,arguments)||this}var Py,By=(kf(Ly,Py=Ty),Ly.prototype.withFaceExpressions=function(){return new Cy(this,this.input)},Ly.prototype.withFaceDescriptor=function(){return new jy(this,this.input)},Ly);function Ly(){return null!==Py&&Py.apply(this,arguments)||this}var Wy,zy=(kf(Uy,Wy=Dg),Uy);function Uy(t,e){var n=Wy.call(this)||this;return n.parentTask=t,n.input=e,n}var Vy,Gy=(kf(Hy,Vy=zy),Hy.prototype.run=function(){return Df(this,void 0,void 0,function(){var n;return Af(this,function(t){switch(t.label){case 0:return[4,this.parentTask];case 1:return[4,Tg(n=t.sent(),this.input,function(t){return Promise.all(t.map(function(t){return ay.faceRecognitionNet.computeFaceDescriptor(t)}))},null,function(t){return t.landmarks.align(null,{useDlibAlignment:!0})})];case 2:return[2,t.sent().map(function(t,e){return Wm(n[e],t)})]}})})},Hy.prototype.withFaceExpressions=function(){return new xy(this,this.input)},Hy.prototype.withAgeAndGender=function(){return new My(this,this.input)},Hy);function Hy(){return null!==Vy&&Vy.apply(this,arguments)||this}var qy,jy=(kf(Ky,qy=zy),Ky.prototype.run=function(){return Df(this,void 0,void 0,function(){var e,n;return Af(this,function(t){switch(t.label){case 0:return[4,this.parentTask];case 1:return(e=t.sent())?[4,Ng(e,this.input,function(t){return ay.faceRecognitionNet.computeFaceDescriptor(t)},null,function(t){return t.landmarks.align(null,{useDlibAlignment:!0})})]:[2];case 2:return n=t.sent(),[2,Wm(e,n)]}})})},Ky.prototype.withFaceExpressions=function(){return new Cy(this,this.input)},Ky.prototype.withAgeAndGender=function(){return new By(this,this.input)},Ky);function Ky(){return null!==qy&&qy.apply(this,arguments)||this}var Xy,Yy=(kf($y,Xy=Dg),Object.defineProperty($y.prototype,"landmarkNet",{get:function(){return this.useTinyLandmarkNet?ay.faceLandmark68TinyNet:ay.faceLandmark68Net},enumerable:!0,configurable:!0}),$y);function $y(t,e,n){var r=Xy.call(this)||this;return r.parentTask=t,r.input=e,r.useTinyLandmarkNet=n,r}var Jy,Qy=(kf(Zy,Jy=Yy),Zy.prototype.run=function(){return Df(this,void 0,void 0,function(){var e,n,r,o,i,a=this;return Af(this,function(t){switch(t.label){case 0:return[4,this.parentTask];case 1:return e=t.sent(),n=e.map(function(t){return t.detection}),this.input instanceof yt?[4,fv(this.input,n)]:[3,3];case 2:return o=t.sent(),[3,5];case 3:return[4,pv(this.input,n)];case 4:o=t.sent(),t.label=5;case 5:return r=o,[4,Promise.all(r.map(function(t){return a.landmarkNet.detectLandmarks(t)}))];case 6:return i=t.sent(),r.forEach(function(t){return t instanceof yt&&t.dispose()}),[2,e.map(function(t,e){return Qv(t,i[e])})]}})})},Zy.prototype.withFaceExpressions=function(){return new xy(this,this.input)},Zy.prototype.withAgeAndGender=function(){return new My(this,this.input)},Zy.prototype.withFaceDescriptors=function(){return new Gy(this,this.input)},Zy);function Zy(){return null!==Jy&&Jy.apply(this,arguments)||this}var tx,ex=(kf(nx,tx=Yy),nx.prototype.run=function(){return Df(this,void 0,void 0,function(){var e,n,r,o,i;return Af(this,function(t){switch(t.label){case 0:return[4,this.parentTask];case 1:return(e=t.sent())?(n=e.detection,this.input instanceof yt?[4,fv(this.input,[n])]:[3,3]):[2];case 2:return o=t.sent(),[3,5];case 3:return[4,pv(this.input,[n])];case 4:o=t.sent(),t.label=5;case 5:return r=o,[4,this.landmarkNet.detectLandmarks(r[0])];case 6:return i=t.sent(),r.forEach(function(t){return t instanceof yt&&t.dispose()}),[2,Qv(e,i)]}})})},nx.prototype.withFaceExpressions=function(){return new Cy(this,this.input)},nx.prototype.withAgeAndGender=function(){return new By(this,this.input)},nx.prototype.withFaceDescriptor=function(){return new jy(this,this.input)},nx);function nx(){return null!==tx&&tx.apply(this,arguments)||this}var rx,ox=(kf(ix,rx=Dg),ix);function ix(t,e){void 0===e&&(e=new Qm);var n=rx.call(this)||this;return n.input=t,n.options=e,n}var ax,sx=(kf(ux,ax=ox),ux.prototype.run=function(){return Df(this,void 0,void 0,function(){var e,n,r,o;return Af(this,function(t){switch(t.label){case 0:return n=(e=this).input,(r=e.options)instanceof Vm?[4,ay.mtcnn.forward(n,r)]:[3,2];case 1:return[2,t.sent().map(function(t){return t.detection})];case 2:if(!(o=r instanceof kg?function(t){return ay.tinyFaceDetector.locateFaces(t,r)}:r instanceof Qm?function(t){return ay.ssdMobilenetv1.locateFaces(t,r)}:r instanceof yg?function(t){return ay.tinyYolov2.locateFaces(t,r)}:null))throw new Error("detectFaces - expected options to be instance of TinyFaceDetectorOptions | SsdMobilenetv1Options | MtcnnOptions | TinyYolov2Options");return[2,o(n)]}})})},ux.prototype.runAndExtendWithFaceDetections=function(){var t=this;return new Promise(function(n){return Df(t,void 0,void 0,function(){var e;return Af(this,function(t){switch(t.label){case 0:return[4,this.run()];case 1:return e=t.sent(),[2,n(e.map(function(t){return Od({},t)}))]}})})})},ux.prototype.withFaceLandmarks=function(t){return void 0===t&&(t=!1),new Qy(this.runAndExtendWithFaceDetections(),this.input,t)},ux.prototype.withFaceExpressions=function(){return new fy(this.runAndExtendWithFaceDetections(),this.input)},ux.prototype.withAgeAndGender=function(){return new Sy(this.runAndExtendWithFaceDetections(),this.input)},ux);function ux(){return null!==ax&&ax.apply(this,arguments)||this}var cx,lx=(kf(hx,cx=ox),hx.prototype.run=function(){return Df(this,void 0,void 0,function(){var e,n;return Af(this,function(t){switch(t.label){case 0:return[4,new sx(this.input,this.options)];case 1:return e=t.sent(),n=e[0],e.forEach(function(t){t.score>n.score&&(n=t)}),[2,n]}})})},hx.prototype.runAndExtendWithFaceDetection=function(){var t=this;return new Promise(function(n){return Df(t,void 0,void 0,function(){var e;return Af(this,function(t){switch(t.label){case 0:return[4,this.run()];case 1:return e=t.sent(),[2,n(e?Od({},e):void 0)]}})})})},hx.prototype.withFaceLandmarks=function(t){return void 0===t&&(t=!1),new ex(this.runAndExtendWithFaceDetection(),this.input,t)},hx.prototype.withFaceExpressions=function(){return new my(this.runAndExtendWithFaceDetection(),this.input)},hx.prototype.withAgeAndGender=function(){return new Ty(this.runAndExtendWithFaceDetection(),this.input)},hx);function hx(){return null!==cx&&cx.apply(this,arguments)||this}function px(t,e){return void 0===e&&(e=new Qm),new sx(t,e)}function fx(e,n){return Df(this,void 0,void 0,function(){return Af(this,function(t){switch(t.label){case 0:return console.warn("allFacesSsdMobilenetv1 is deprecated and will be removed soon, use the high level api instead"),[4,px(e,new Qm(n?{minConfidence:n}:{})).withFaceLandmarks().withFaceDescriptors()];case 1:return[2,t.sent()]}})})}var dx=fx;function vx(t,e){if(t.length!==e.length)throw new Error("euclideanDistance: arr1.length !== arr2.length");var n=Array.from(t),r=Array.from(e);return Math.sqrt(n.map(function(t,e){return t-r[e]}).reduce(function(t,e){return t+Math.pow(e,2)},0))}var mx=(Object.defineProperty(gx.prototype,"labeledDescriptors",{get:function(){return this._labeledDescriptors},enumerable:!0,configurable:!0}),Object.defineProperty(gx.prototype,"distanceThreshold",{get:function(){return this._distanceThreshold},enumerable:!0,configurable:!0}),gx.prototype.computeMeanDistance=function(e,t){return t.map(function(t){return vx(t,e)}).reduce(function(t,e){return t+e},0)/(t.length||1)},gx.prototype.matchDescriptor=function(r){var o=this;return this.labeledDescriptors.map(function(t){var e=t.descriptors,n=t.label;return new Ed(n,o.computeMeanDistance(r,e))}).reduce(function(t,e){return t.distance | Float32Array | Array | Float32Array>")})}c.AgeGenderNet=pm,c.BoundingBox=Zf,c.Box=$f,c.ComposableTask=Dg,c.ComputeAllFaceDescriptorsTask=Gy,c.ComputeFaceDescriptorsTaskBase=zy,c.ComputeSingleFaceDescriptorTask=jy,c.DetectAllFaceLandmarksTask=Qy,c.DetectAllFacesTask=sx,c.DetectFaceLandmarksTaskBase=Yy,c.DetectFacesTaskBase=ox,c.DetectSingleFaceLandmarksTask=ex,c.DetectSingleFaceTask=lx,c.Dimensions=Nf,c.FACE_EXPRESSION_LABELS=Gv,c.FaceDetection=od,c.FaceDetectionNet=ig,c.FaceExpressionNet=Kv,c.FaceExpressions=Hv,c.FaceLandmark68Net=ym,c.FaceLandmark68TinyNet=_m,c.FaceLandmarkNet=km,c.FaceLandmarks=vd,c.FaceLandmarks5=yd,c.FaceLandmarks68=wd,c.FaceMatch=Ed,c.FaceMatcher=mx,c.FaceRecognitionNet=Bm,c.LabeledBox=Rd,c.LabeledFaceDescriptors=Sd,c.Mtcnn=Yg,c.MtcnnOptions=Vm,c.NetInput=cv,c.NeuralNetwork=yv,c.ObjectDetection=ed,c.Point=Xf,c.PredictedBox=Nd,c.Rect=fd,c.SsdMobilenetv1=eg,c.SsdMobilenetv1Options=Qm,c.TinyFaceDetector=ty,c.TinyFaceDetectorOptions=kg,c.TinyYolov2=_g,c.TinyYolov2Options=yg,c.allFaces=dx,c.allFacesMtcnn=function(e,n){return void 0===n&&(n={}),Df(this,void 0,void 0,function(){return Af(this,function(t){switch(t.label){case 0:return console.warn("allFacesMtcnn is deprecated and will be removed soon, use the high level api instead"),[4,px(e,new Vm(n)).withFaceLandmarks().withFaceDescriptors()];case 1:return[2,t.sent()]}})})},c.allFacesSsdMobilenetv1=fx,c.allFacesTinyYolov2=function(e,n){return void 0===n&&(n={}),Df(this,void 0,void 0,function(){return Af(this,function(t){switch(t.label){case 0:return console.warn("allFacesTinyYolov2 is deprecated and will be removed soon, use the high level api instead"),[4,px(e,new yg(n)).withFaceLandmarks().withFaceDescriptors()];case 1:return[2,t.sent()]}})})},c.awaitMediaLoaded=ev,c.bufferToImage=nv,c.computeFaceDescriptor=function(t){return ay.faceRecognitionNet.computeFaceDescriptor(t)},c.createCanvas=ov,c.createCanvasFromMedia=iv,c.createFaceDetectionNet=function(t){return rg(t)},c.createFaceRecognitionNet=function(t){var e=new Bm;return e.extractWeights(t),e},c.createMtcnn=function(t){var e=new Yg;return e.extractWeights(t),e},c.createSsdMobilenetv1=rg,c.createTinyFaceDetector=function(t){var e=new ty;return e.extractWeights(t),e},c.createTinyYolov2=function(t,e){void 0===e&&(e=!0);var n=new _g(e);return n.extractWeights(t),n},c.detectAllFaces=px,c.detectFaceLandmarks=ry,c.detectFaceLandmarksTiny=function(t){return ay.faceLandmark68TinyNet.detectLandmarks(t)},c.detectLandmarks=cy,c.detectSingleFace=function(t,e){return void 0===e&&(e=new Qm),new lx(t,e)},c.draw=nm,c.env=qd,c.euclideanDistance=vx,c.extendWithAge=zm,c.extendWithFaceDescriptor=Wm,c.extendWithFaceDetection=Od,c.extendWithFaceExpressions=$v,c.extendWithFaceLandmarks=Qv,c.extendWithGender=Um,c.extractFaceTensors=fv,c.extractFaces=pv,c.fetchImage=function(r){return Df(this,void 0,void 0,function(){var e,n;return Af(this,function(t){switch(t.label){case 0:return[4,dv(r)];case 1:return[4,(e=t.sent()).blob()];case 2:if(!(n=t.sent()).type.startsWith("image/"))throw new Error("fetchImage - expected blob type to be of type image/*, instead have: "+n.type+", for url: "+e.url);return[2,nv(n)]}})})},c.fetchJson=vv,c.fetchNetWeights=function(n){return Df(this,void 0,void 0,function(){var e;return Af(this,function(t){switch(t.label){case 0:return e=Float32Array.bind,[4,dv(n)];case 1:return[4,t.sent().arrayBuffer()];case 2:return[2,new(e.apply(Float32Array,[void 0,t.sent()]))]}})})},c.fetchOrThrow=dv,c.getContext2dOrThrow=Kd,c.getMediaDimensions=rv,c.imageTensorToCanvas=av,c.imageToSquare=uv,c.inverseSigmoid=function(t){return Math.log(t/(1-t))},c.iou=ad,c.isMediaElement=sv,c.isMediaLoaded=tv,c.isWithAge=function(t){return"number"==typeof t.age},c.isWithFaceDetection=Md,c.isWithFaceExpressions=Yv,c.isWithFaceLandmarks=Jv,c.isWithGender=function(t){return(t.gender===c.Gender.MALE||t.gender===c.Gender.FEMALE)&&jf(t.genderProbability)},c.loadAgeGenderModel=function(t){return ay.ageGenderNet.load(t)},c.loadFaceDetectionModel=sy,c.loadFaceExpressionModel=function(t){return ay.faceExpressionNet.load(t)},c.loadFaceLandmarkModel=function(t){return ay.faceLandmark68Net.load(t)},c.loadFaceLandmarkTinyModel=function(t){return ay.faceLandmark68TinyNet.load(t)},c.loadFaceRecognitionModel=function(t){return ay.faceRecognitionNet.load(t)},c.loadMtcnnModel=function(t){return ay.mtcnn.load(t)},c.loadSsdMobilenetv1Model=oy,c.loadTinyFaceDetectorModel=function(t){return ay.tinyFaceDetector.load(t)},c.loadTinyYolov2Model=function(t){return ay.tinyYolov2.load(t)},c.loadWeightMap=gv,c.locateFaces=uy,c.matchDimensions=function(t,e,n){void 0===n&&(n=!1);var r=n?rv(e):e,o=r.width,i=r.height;return{width:t.width=o,height:t.height=i}},c.minBbox=sd,c.mtcnn=function(t,e){return ay.mtcnn.forward(t,e)},c.nets=ay,c.nonMaxSuppression=ud,c.normalize=cd,c.padToSquare=ld,c.predictAgeAndGender=function(t){return ay.ageGenderNet.predictAgeAndGender(t)},c.recognizeFaceExpressions=function(t){return ay.faceExpressionNet.predictExpressions(t)},c.resizeResults=function e(t,n){var r=new Nf(n.width,n.height),o=r.width,i=r.height;if(o<=0||i<=0)throw new Error("resizeResults - invalid dimensions: "+JSON.stringify({width:o,height:i}));if(Array.isArray(t))return t.map(function(t){return e(t,{width:o,height:i})});if(Jv(t)){var a=t.detection.forSize(o,i),s=t.unshiftedLandmarks.forSize(a.box.width,a.box.height);return Qv(Od(t,a),s)}return Md(t)?Od(t,t.detection.forSize(o,i)):t instanceof vd||t instanceof od?t.forSize(o,i):t},c.resolveInput=jd,c.shuffleArray=function(t){for(var e=t.slice(),n=e.length-1;0 {
+ // === UPLOAD PAGE LOGIC ===
+ const uploadInput = document.getElementById('photoUpload');
+ const submitBtn = document.getElementById('submitBtn');
+ const nameInput = document.getElementById('userName');
+
+ if (submitBtn && uploadInput) {
+ submitBtn.addEventListener('click', () => {
+ const file = uploadInput.files[0];
+ let userName = "You";
+ if (nameInput) {
+ userName = nameInput.value.trim() || "You";
+ sessionStorage.setItem("userName", userName);
+ }
+ if (!file) {
+ alert("Upload your face first.");
+ return;
+ }
+ if (file.size > 10 * 1024 * 1024) {
+ alert("File too big! Must be under 10MB.");
+ return;
+ }
+ const reader = new FileReader();
+ reader.onload = function (e) {
+ sessionStorage.setItem("uploadedImage", e.target.result);
+ sessionStorage.removeItem("matchResult");
+ window.location.href = "processing.html";
+ };
+ reader.readAsDataURL(file);
+ });
+ }
+
+ // === PROCESSING PAGE LOGIC ===
+ if (document.body.classList.contains("processing-page")) {
+ setTimeout(() => {
+ const veggies = [
+ {
+ name: "🥔 You are a Potato",
+ roast: "Congratulations, you radiate the energy of a forgotten sack in a damp cellar. People would rather get a disease than eat you raw. Even instant mashed potatoes have more ambition.",
+ img: "images/potato.png",
+ theme: { gradient: "linear-gradient(135deg, #e4c16f 0%, #b5884d 100%)", accent: "#a27641" }
+ },
+ {
+ name: "🍅 You are a Tomato",
+ roast: "You’re soft, squishy, and people make faces if they see you in a salad. The only time anyone likes you is after you’re completely pulverized—with seasoning, lots and lots of seasoning.",
+ img: "images/tomato.png",
+ theme: { gradient: "linear-gradient(135deg, #ff6a5b 0%, #a72128 100%)", accent: "#ff3a1a" }
+ },
+ {
+ name: "🥕 You are Carrot",
+ roast: "So boring, you’re best known as rabbit food. The highlight of your existence is making people’s vision slightly less terrible—too bad you can’t do anything about personalities.",
+ img: "images/carrot.png",
+ theme: { gradient: "linear-gradient(135deg, #faa700 0%, #f75d57 100%)", accent: "#fa6b24" }
+ },
+ {
+ name: "🍈 You are Jackfruit",
+ roast: "Spiky, confusing, and massive—yet still somehow unappetizing. People look at you and have questions about evolution.",
+ img: "images/jackfruit.png",
+ theme: { gradient: "linear-gradient(135deg, #eaff6e 0%, #84ab2a 100%)", accent: "#c4c844" }
+ },
+ {
+ name: "🍆 You are Eggplant",
+ roast: "People only acknowledge you as a bad emoji. Anyone who bites you raw regrets every decision that led them there.",
+ img: "images/eggplant.png",
+ theme: { gradient: "linear-gradient(135deg, #b86cc0 0%, #683197 100%)", accent: "#a060c6" }
+ },
+ {
+ name: "🍉 You are Watermelon",
+ roast: "You’re basically water, but somehow manage to be sticky and annoying. No one remembers you, except as that thing full of seeds and disappointment.",
+ img: "images/watermelon.png",
+ theme: { gradient: "linear-gradient(135deg, #f63a51 0%, #37e197 100%)", accent: "#37e197" }
+ },
+ {
+ name: "🧅 You are Onion",
+ roast: "You bring people to tears by simply existing. Peeling away your layers is like therapy: expensive, laborious, and ultimately unrewarding.",
+ img: "images/onion.png",
+ theme: { gradient: "linear-gradient(135deg, #fff0be 0%, #debbc2 100%)", accent: "#b67e99" }
+ },
+ {
+ name: "🥒 You are Bittergourd",
+ roast: "People actively avoid you. The only time they want you is when someone tells them it's 'good for health'—which is the vegetable world’s lowest compliment.",
+ img: "images/bittergourd.png",
+ theme: { gradient: "linear-gradient(135deg, #8afa77 0%, #2d4d37 100%)", accent: "#34734b" }
+ },
+ {
+ name: "🥒 You are Cucumber",
+ roast: "No taste, no presence, no flair. You’re the backup dancer of vegetables: always there, never wanted.",
+ img: "images/cucumber.png",
+ theme: { gradient: "linear-gradient(135deg, #b2fcd1 0%, #41905b 100%)", accent: "#399e69" }
+ },
+ {
+ name: "🥚 You are Egg",
+ roast: "You crumble under the slightest pressure. People can’t even agree if you count as breakfast or a cholesterol risk.",
+ img: "images/egg.png",
+ theme: { gradient: "linear-gradient(135deg, #fffbe0 0%, #e6e2b7 100%)", accent: "#fed86e" }
+ },
+ {
+ name: "🥬 You are Drumstick",
+ roast: "Stringy, forgettable, and no one actually likes you except people who can't admit to bad decisions in life.",
+ img: "images/drumstick.png",
+ theme: { gradient: "linear-gradient(135deg, #baeba7 0%, #216a2a 100%)", accent: "#4fb269" }
+ },
+ {
+ name: "🍍 You are Pineapple",
+ roast: "Rough outside, unwelcoming spikes, and only good after someone suffers to reach your mediocre interior. Even pizza says 'keep away.'",
+ img: "images/pineapple.png",
+ theme: { gradient: "linear-gradient(135deg, #ffd46e 0%, #e6be29 100%)", accent: "#ffb300" }
+ },
+ {
+ name: "🎃 You are Pumpkin",
+ roast: "Annoying trend every October, but the rest of the year? More dead inside than a Thanksgiving centerpiece.",
+ img: "images/pumpkin.png",
+ theme: { gradient: "linear-gradient(135deg, #ffdd7e 0%, #ff923a 100%)", accent: "#f87e07" }
+ },
+ {
+ name: "🌶️ You are Red Chilli",
+ roast: "All heat, no substance. People only remember you when you ruin their day—or their digestive system.",
+ img: "images/redchilli.png",
+ theme: { gradient: "linear-gradient(135deg, #fe4e50 0%, #a10024 100%)", accent: "#fe1616" }
+ }
+ ];
+ const randomMatch = veggies[Math.floor(Math.random() * veggies.length)];
+ sessionStorage.setItem("matchResult", JSON.stringify(randomMatch));
+ window.location.href = "output.html";
+ }, 4000);
+ }
+
+ // === OUTPUT PAGE LOGIC & CERTIFICATE ===
+ if (document.body.classList.contains("output-page")) {
+ const imageData = sessionStorage.getItem("uploadedImage");
+ const userFace = document.getElementById("userFace");
+ const veggiePic = document.getElementById("veggiePic");
+ const fruitNameEl = document.querySelector('.fruit-name');
+ const roastTextEl = document.querySelector('.roast-text');
+ const overlay = document.getElementById("outputOverlay");
+ // Matching array (same as above)
+ const veggies = [
+ {
+ name: "🥔 You are a Potato",
+ roast: "Congratulations, you radiate the energy of a forgotten sack in a damp cellar. People would rather get a disease than eat you raw. Even instant mashed potatoes have more ambition.",
+ img: "images/potato.png",
+ theme: { gradient: "linear-gradient(135deg, #e4c16f 0%, #b5884d 100%)", accent: "#a27641" }
+ },
+ // ... repeat all other veggie objects exactly as above ...
+ {
+ name: "🌶️ You are Red Chilli",
+ roast: "All heat, no substance. People only remember you when you ruin their day—or their digestive system.",
+ img: "images/redchilli.png",
+ theme: { gradient: "linear-gradient(135deg, #fe4e50 0%, #a10024 100%)", accent: "#fe1616" }
+ }
+ ];
+
+ if (userFace && imageData) {
+ userFace.src = imageData;
+ userFace.style.display = "block";
+ }
+
+ userFace.onload = async () => {
+ try {
+ await faceapi.nets.tinyFaceDetector.loadFromUri('models/');
+ await faceapi.nets.faceLandmark68Net.loadFromUri('models/');
+ const detection = await faceapi
+ .detectSingleFace(userFace, new faceapi.TinyFaceDetectorOptions())
+ .withFaceLandmarks();
+ let match;
+ if (detection) {
+ const landmarks = detection.landmarks;
+ const jaw = landmarks.getJawOutline();
+ const leftBrow = landmarks.getLeftEyeBrow();
+ const faceWidth = jaw[16].x - jaw[0].x;
+ const faceHeight = jaw[8].y - leftBrow[0].y;
+ const aspectRatio = faceWidth / faceHeight;
+ if (aspectRatio > 1.15) {
+ match = veggies.find(v => v.name.includes("Jackfruit")) || veggies[0];
+ } else if (aspectRatio < 0.85) {
+ match = veggies.find(v => v.name.includes("Drumstick")) ||
+ veggies.find(v => v.name.includes("Cucumber")) ||
+ veggies.find(v => v.name.includes("Carrot")) || veggies[0];
+ } else if (faceHeight > 190) {
+ match = veggies.find(v => v.name.includes("Eggplant")) ||
+ veggies.find(v => v.name.includes("Pumpkin")) || veggies[0];
+ } else if (faceWidth < 120) {
+ match = veggies.find(v => v.name.includes("Red Chilli")) || veggies[0];
+ } else {
+ match = veggies[Math.floor(Math.random() * veggies.length)];
+ }
+ } else {
+ match = veggies[Math.floor(Math.random() * veggies.length)];
+ }
+
+ if (veggiePic && match.img) { veggiePic.src = match.img; veggiePic.style.display = "block"; }
+ fruitNameEl.textContent = match.name;
+ roastTextEl.textContent = match.roast;
+
+ if (match.theme && overlay) {
+ overlay.style.background = match.theme.gradient;
+ fruitNameEl.style.color = match.theme.accent;
+ document.dispatchEvent(new CustomEvent('fruitThemeUpdate', { detail: match.theme }));
+ }
+
+ speechSynthesis.cancel();
+ const msg = new SpeechSynthesisUtterance(match.roast);
+ msg.pitch = 0.8;
+ msg.rate = 1;
+ speechSynthesis.speak(msg);
+
+ } catch (err) {
+ const fallback = veggies[Math.floor(Math.random() * veggies.length)];
+ if (veggiePic && fallback.img) { veggiePic.src = fallback.img; veggiePic.style.display = "block"; }
+ fruitNameEl.textContent = fallback.name;
+ roastTextEl.textContent = fallback.roast;
+ if (fallback.theme && overlay) {
+ overlay.style.background = fallback.theme.gradient;
+ fruitNameEl.style.color = fallback.theme.accent;
+ document.dispatchEvent(new CustomEvent('fruitThemeUpdate', { detail: fallback.theme }));
+ }
+ speechSynthesis.cancel();
+ const msg = new SpeechSynthesisUtterance(fallback.roast);
+ msg.pitch = 0.8;
+ msg.rate = 1;
+ speechSynthesis.speak(msg);
+ }
+ };
+ if (userFace && userFace.complete) userFace.onload();
+
+ // === Certificate Download Logic (with classic stamp) ===
+ document.getElementById('downloadCertBtn')?.addEventListener('click', function() {
+ const userName = sessionStorage.getItem("userName") || "You";
+ const fruitName = document.querySelector('.fruit-name')?.textContent || "";
+ const roast = document.querySelector('.roast-text')?.textContent || "";
+ const veggieImgSrc = document.getElementById('veggiePic')?.src || "";
+
+ const canvas = document.createElement('canvas');
+ canvas.width = 680;
+ canvas.height = 480;
+ const ctx = canvas.getContext('2d');
+
+ // Comic pop-art background
+ ctx.fillStyle = "#fbeab8";
+ ctx.fillRect(0, 0, canvas.width, canvas.height);
+ ctx.save();
+ ctx.translate(340,180);
+ for(let i=0;i<24;i++){
+ ctx.rotate(Math.PI/12);
+ ctx.fillStyle = i%2? "#ff8c00":"#fed700";
+ ctx.beginPath();
+ ctx.moveTo(0,0); ctx.lineTo(0,-180); ctx.lineTo(12,-160); ctx.closePath(); ctx.fill();
+ }
+ ctx.restore();
+ ctx.strokeStyle = "#fe4e50";
+ ctx.lineWidth = 7;
+ ctx.strokeRect(12,12,canvas.width-24,canvas.height-24);
+
+ let img = new window.Image();
+ img.crossOrigin='anonymous';
+ img.onload = function() {
+ ctx.save();
+ ctx.beginPath();
+ ctx.arc(110, 155, 68, 0, 2*Math.PI);
+ ctx.clip();
+ ctx.drawImage(img, 42, 87, 136, 136);
+ ctx.restore();
+
+ ctx.font = "900 35px Montserrat, sans-serif";
+ ctx.fillStyle = "#d40032";
+ ctx.textAlign = "center";
+ ctx.fillText("Face-to-Fruit Certificate", canvas.width/2, 60);
+
+ ctx.font = "bold 31px Montserrat, sans-serif";
+ ctx.fillStyle = "#0f0243";
+ ctx.fillText(" ", 340, 225);
+
+ ctx.font = "24px Montserrat, sans-serif";
+ ctx.fillStyle = "#e26ee5";
+ ctx.fillText(fruitName, 340, 270);
+
+ ctx.font = "18px 'Fira Sans', sans-serif";
+ ctx.fillStyle = "#374750";
+ let roastLines = ctx.measureText(roast).width > 520
+ ? roast.match(/.{1,44}(\s|$)/g) : [roast];
+ roastLines && roastLines.forEach((l,i)=>
+ ctx.fillText(l,340, 310+30*i));
+
+ // "ROASTED" badge
+ ctx.beginPath();
+ ctx.arc(570,85,38,0,2*Math.PI);
+ ctx.closePath();
+ ctx.fillStyle="#ff6a5b";
+ ctx.fill();
+ ctx.font="900 19px Montserrat,sans-serif";
+ ctx.fillStyle="#fff";
+ ctx.fillText("ROASTED!",570, 92);
+
+ // --- Certificate "stamp" with checkmark and CERTIFIED ---
+ ctx.save();
+ ctx.globalAlpha = 0.87;
+ ctx.beginPath();
+ ctx.arc(90, 385, 48, 0, 2 * Math.PI);
+ ctx.fillStyle = "#ff9125";
+ ctx.shadowColor = "#e46e15";
+ ctx.shadowBlur = 9;
+ ctx.fill();
+ ctx.restore();
+
+ ctx.save();
+ ctx.translate(90, 388);
+ ctx.rotate(-Math.PI / 14);
+ ctx.font = "bold 21px Montserrat, sans-serif";
+ ctx.fillStyle = "#fff";
+ ctx.textAlign = "center";
+ ctx.shadowColor = "#000";
+ ctx.shadowBlur = 2.5;
+ ctx.fillText("CERTIFIED", 0, 6);
+ ctx.restore();
+
+ ctx.save();
+ ctx.strokeStyle = "#fff";
+ ctx.lineWidth = 5.5;
+ ctx.lineCap = "round";
+ ctx.beginPath();
+ ctx.moveTo(70, 388);
+ ctx.lineTo(85, 400);
+ ctx.lineTo(110, 370);
+ ctx.stroke();
+ ctx.restore();
+
+ let link = document.createElement('a');
+ link.download = `${userName}_FaceToFruit_Certificate.png`;
+ link.href = canvas.toDataURL();
+ link.click();
+ };
+ img.src = veggieImgSrc;
+ });
+ }
+});
diff --git a/models/face_landmark_68_model-shard1.bin b/models/face_landmark_68_model-shard1.bin
new file mode 100644
index 000000000..fcaca474f
Binary files /dev/null and b/models/face_landmark_68_model-shard1.bin differ
diff --git a/models/face_landmark_68_model-weights_manifest.json b/models/face_landmark_68_model-weights_manifest.json
new file mode 100644
index 000000000..0fe27075f
--- /dev/null
+++ b/models/face_landmark_68_model-weights_manifest.json
@@ -0,0 +1 @@
+[{"weights":[{"name":"dense0/conv0/filters","shape":[3,3,3,32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.004853619781194949,"min":-0.5872879935245888}},{"name":"dense0/conv0/bias","shape":[32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.004396426443960153,"min":-0.7298067896973853}},{"name":"dense0/conv1/depthwise_filter","shape":[3,3,32,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.00635151559231328,"min":-0.5589333721235686}},{"name":"dense0/conv1/pointwise_filter","shape":[1,1,32,32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.009354315552057004,"min":-1.2628325995276957}},{"name":"dense0/conv1/bias","shape":[32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0029380727048013726,"min":-0.5846764682554731}},{"name":"dense0/conv2/depthwise_filter","shape":[3,3,32,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0049374802439820535,"min":-0.6171850304977566}},{"name":"dense0/conv2/pointwise_filter","shape":[1,1,32,32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.009941946758943446,"min":-1.3421628124573652}},{"name":"dense0/conv2/bias","shape":[32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0030300481062309416,"min":-0.5272283704841838}},{"name":"dense0/conv3/depthwise_filter","shape":[3,3,32,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.005672684837790097,"min":-0.7431217137505026}},{"name":"dense0/conv3/pointwise_filter","shape":[1,1,32,32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.010712201455060173,"min":-1.5639814124387852}},{"name":"dense0/conv3/bias","shape":[32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0030966934035806097,"min":-0.3839899820439956}},{"name":"dense1/conv0/depthwise_filter","shape":[3,3,32,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0039155554537679636,"min":-0.48161332081345953}},{"name":"dense1/conv0/pointwise_filter","shape":[1,1,32,64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.01023082966898002,"min":-1.094698774580862}},{"name":"dense1/conv0/bias","shape":[64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0027264176630506327,"min":-0.3871513081531898}},{"name":"dense1/conv1/depthwise_filter","shape":[3,3,64,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.004583378632863362,"min":-0.5454220573107401}},{"name":"dense1/conv1/pointwise_filter","shape":[1,1,64,64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.00915846403907327,"min":-1.117332612766939}},{"name":"dense1/conv1/bias","shape":[64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.003091680419211294,"min":-0.5966943209077797}},{"name":"dense1/conv2/depthwise_filter","shape":[3,3,64,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.005407439727409214,"min":-0.708374604290607}},{"name":"dense1/conv2/pointwise_filter","shape":[1,1,64,64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.00946493943532308,"min":-1.2399070660273235}},{"name":"dense1/conv2/bias","shape":[64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.004409168514550901,"min":-0.9788354102303}},{"name":"dense1/conv3/depthwise_filter","shape":[3,3,64,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.004478132958505668,"min":-0.6493292789833219}},{"name":"dense1/conv3/pointwise_filter","shape":[1,1,64,64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.011063695888893277,"min":-1.2501976354449402}},{"name":"dense1/conv3/bias","shape":[64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.003909627596537272,"min":-0.6646366914113363}},{"name":"dense2/conv0/depthwise_filter","shape":[3,3,64,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.003213915404151468,"min":-0.3374611174359041}},{"name":"dense2/conv0/pointwise_filter","shape":[1,1,64,128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.010917326048308728,"min":-1.4520043644250609}},{"name":"dense2/conv0/bias","shape":[128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.002800439152063108,"min":-0.38085972468058266}},{"name":"dense2/conv1/depthwise_filter","shape":[3,3,128,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0050568851770139206,"min":-0.6927932692509071}},{"name":"dense2/conv1/pointwise_filter","shape":[1,1,128,128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.01074961213504567,"min":-1.3222022926106174}},{"name":"dense2/conv1/bias","shape":[128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0030654204242369708,"min":-0.5487102559384177}},{"name":"dense2/conv2/depthwise_filter","shape":[3,3,128,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.00591809165244009,"min":-0.917304206128214}},{"name":"dense2/conv2/pointwise_filter","shape":[1,1,128,128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.01092823346455892,"min":-1.366029183069865}},{"name":"dense2/conv2/bias","shape":[128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.002681120470458386,"min":-0.36463238398234055}},{"name":"dense2/conv3/depthwise_filter","shape":[3,3,128,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0048311497650894465,"min":-0.5797379718107336}},{"name":"dense2/conv3/pointwise_filter","shape":[1,1,128,128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.011227761062921263,"min":-1.4483811771168429}},{"name":"dense2/conv3/bias","shape":[128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0034643323982463162,"min":-0.3360402426298927}},{"name":"dense3/conv0/depthwise_filter","shape":[3,3,128,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.003394978887894574,"min":-0.49227193874471326}},{"name":"dense3/conv0/pointwise_filter","shape":[1,1,128,256],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.010051267287310432,"min":-1.2765109454884247}},{"name":"dense3/conv0/bias","shape":[256],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.003142924752889895,"min":-0.4588670139219247}},{"name":"dense3/conv1/depthwise_filter","shape":[3,3,256,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.00448304671867221,"min":-0.5872791201460595}},{"name":"dense3/conv1/pointwise_filter","shape":[1,1,256,256],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.016063522357566685,"min":-2.3613377865623026}},{"name":"dense3/conv1/bias","shape":[256],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.00287135781026354,"min":-0.47664539650374765}},{"name":"dense3/conv2/depthwise_filter","shape":[3,3,256,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.006002906724518421,"min":-0.7923836876364315}},{"name":"dense3/conv2/pointwise_filter","shape":[1,1,256,256],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.017087187019048954,"min":-1.6061955797906016}},{"name":"dense3/conv2/bias","shape":[256],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.003124481205846749,"min":-0.46242321846531886}},{"name":"dense3/conv3/depthwise_filter","shape":[3,3,256,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.006576311588287353,"min":-1.0193282961845398}},{"name":"dense3/conv3/pointwise_filter","shape":[1,1,256,256],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.015590153955945782,"min":-1.99553970636106}},{"name":"dense3/conv3/bias","shape":[256],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.004453541601405424,"min":-0.6546706154065973}},{"name":"fc/weights","shape":[256,136],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.010417488509533453,"min":-1.500118345372817}},{"name":"fc/bias","shape":[136],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0025084222648658005,"min":0.07683877646923065}}],"paths":["face_landmark_68_model-shard1"]}]
\ No newline at end of file
diff --git a/models/tiny_face_detector_model-shard1.bin b/models/tiny_face_detector_model-shard1.bin
new file mode 100644
index 000000000..a3f113a54
Binary files /dev/null and b/models/tiny_face_detector_model-shard1.bin differ
diff --git a/models/tiny_face_detector_model-weights_manifest.json b/models/tiny_face_detector_model-weights_manifest.json
new file mode 100644
index 000000000..7d3b222d0
--- /dev/null
+++ b/models/tiny_face_detector_model-weights_manifest.json
@@ -0,0 +1 @@
+[{"weights":[{"name":"conv0/filters","shape":[3,3,3,16],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.009007044399485869,"min":-1.2069439495311063}},{"name":"conv0/bias","shape":[16],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.005263455241334205,"min":-0.9211046672334858}},{"name":"conv1/depthwise_filter","shape":[3,3,16,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.004001977630690033,"min":-0.5042491814669441}},{"name":"conv1/pointwise_filter","shape":[1,1,16,32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.013836609615999109,"min":-1.411334180831909}},{"name":"conv1/bias","shape":[32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0015159862590771096,"min":-0.30926119685173037}},{"name":"conv2/depthwise_filter","shape":[3,3,32,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.002666276225856706,"min":-0.317286870876948}},{"name":"conv2/pointwise_filter","shape":[1,1,32,64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.015265831292844286,"min":-1.6792414422128714}},{"name":"conv2/bias","shape":[64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0020280554598453,"min":-0.37113414915168985}},{"name":"conv3/depthwise_filter","shape":[3,3,64,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.006100742489683862,"min":-0.8907084034938438}},{"name":"conv3/pointwise_filter","shape":[1,1,64,128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.016276211832083907,"min":-2.0508026908425725}},{"name":"conv3/bias","shape":[128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.003394414279975143,"min":-0.7637432129944072}},{"name":"conv4/depthwise_filter","shape":[3,3,128,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.006716050119961009,"min":-0.8059260143953211}},{"name":"conv4/pointwise_filter","shape":[1,1,128,256],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.021875603993733724,"min":-2.8875797271728514}},{"name":"conv4/bias","shape":[256],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0041141652009066415,"min":-0.8187188749804216}},{"name":"conv5/depthwise_filter","shape":[3,3,256,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.008423839597141042,"min":-0.9013508368940915}},{"name":"conv5/pointwise_filter","shape":[1,1,256,512],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.030007277283014035,"min":-3.8709387695088107}},{"name":"conv5/bias","shape":[512],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.008402082966823203,"min":-1.4871686851277068}},{"name":"conv8/filters","shape":[1,1,512,25],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.028336129469030042,"min":-4.675461362389957}},{"name":"conv8/bias","shape":[25],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.002268134028303857,"min":-0.41053225912299807}}],"paths":["tiny_face_detector_model-shard1"]}]
\ No newline at end of file
diff --git a/output.html b/output.html
new file mode 100644
index 000000000..bd1cc3a77
--- /dev/null
+++ b/output.html
@@ -0,0 +1,115 @@
+
+
+
+
+
+ Face-to-Fruit Results
+
+
+
+
+
+
+
+
+
![Your uploaded photo]()
+
![Matched fruit or veggie]()
+
+
+
+
+
+
+
+
+
+
+
diff --git a/processing.html b/processing.html
new file mode 100644
index 000000000..e9c07d5d4
--- /dev/null
+++ b/processing.html
@@ -0,0 +1,25 @@
+
+
+
+
+
+ Analyzing...
+
+
+
+
+
+
Analyzing your disappointing pixels...
+
+
+
+
+
+
+
+
+
+
diff --git a/script.js b/script.js
new file mode 100644
index 000000000..8f4fd8e01
--- /dev/null
+++ b/script.js
@@ -0,0 +1,75 @@
+// 1️⃣ Load face-api models
+async function loadModels() {
+ const MODEL_URL = '/models';
+ await faceapi.nets.tinyFaceDetector.loadFromUri(MODEL_URL);
+ await faceapi.nets.faceLandmark68Net.loadFromUri(MODEL_URL);
+ console.log("✅ Models loaded");
+}
+loadModels(); // call it right away
+
+// 2️⃣ Image upload + preview
+const imageUpload = document.getElementById('imageUpload');
+const previewImg = document.getElementById('preview');
+
+imageUpload.addEventListener('change', async () => {
+ const file = imageUpload.files[0];
+ const image = await faceapi.bufferToImage(file);
+ previewImg.src = image.src;
+ detectFace(previewImg);
+});
+
+// 3️⃣ Detect face and get landmarks
+async function detectFace(image) {
+ const detection = await faceapi
+ .detectSingleFace(image, new faceapi.TinyFaceDetectorOptions())
+ .withFaceLandmarks();
+
+ if (!detection) {
+ alert("No face found 😢");
+ return;
+ }
+
+ const landmarks = detection.landmarks;
+ const matchedVeggie = getMatchingVeggie(landmarks);
+ showResult(matchedVeggie);
+}
+
+// 4️⃣ Match veggie based on face shape (dummy logic)
+function getMatchingVeggie(landmarks) {
+ const jaw = landmarks.getJawOutline();
+ const leftEye = landmarks.getLeftEye();
+ const rightEye = landmarks.getRightEye();
+ const nose = landmarks.getNose();
+ const mouth = landmarks.getMouth();
+ const leftBrow = landmarks.getLeftEyeBrow();
+ const rightBrow = landmarks.getRightEyeBrow();
+
+ const faceWidth = jaw[16].x - jaw[0].x;
+ const faceHeight = jaw[8].y - leftBrow[0].y;
+ const eyeGap = rightEye[0].x - leftEye[3].x;
+ const noseLength = nose[6].y - nose[0].y;
+ const mouthWidth = mouth[6].x - mouth[0].x;
+ const eyebrowTilt = leftBrow[4].y - leftBrow[0].y;
+ const jawAsymmetry = Math.abs(jaw[1].y - jaw[15].y);
+
+ // Simple logic for grocery-matching:
+ if (faceWidth < 100 && eyeGap > 40) return "🥕 You are a Carrot!";
+ if (faceWidth < 120 && noseLength < 30) return "🍅 You are a Tomato!";
+ if (faceWidth > 140 && faceHeight < 180) return "🥔 You are a Potato!";
+ if (faceHeight > 200 && eyeGap < 30) return "🥒 You are a Cucumber!";
+ if (faceHeight < 160 && mouthWidth > 60) return "🍌 You are a Banana!";
+ if (eyeGap > 50 && faceWidth < 130) return "🧅 You are an Onion!";
+ if (noseLength < 25 && mouthWidth < 50) return "🥬 You are a Beetroot!";
+ if (jawAsymmetry > 15 && faceHeight > 200) return "🍍 You are a Pineapple!";
+ if (faceWidth < 100 && faceHeight < 150) return "🫐 You are a Blueberry!";
+ if (eyebrowTilt > 10 && jawAsymmetry > 10) return "🍆 You are an Eggplant!";
+
+ // Fallback option
+ return "🍇 You are a Grape — mysterious and undefined!";
+}
+
+
+// 5️⃣ Show result
+function showResult(veggie) {
+ document.getElementById('result').innerText = `You're a ${veggie}!`;
+}
diff --git a/style.css b/style.css
new file mode 100644
index 000000000..48b77b37c
--- /dev/null
+++ b/style.css
@@ -0,0 +1,162 @@
+/* === GLOBAL FONTS & BASE === */
+@import url('https://fonts.googleapis.com/css2?family=Montserrat:wght@700&family=Fira+Sans:wght@400;600&display=swap');
+
+body {
+ margin: 0;
+ padding: 0;
+ font-family: 'Fira Sans', Arial, sans-serif;
+ background: #fff;
+}
+
+/* === UPLOAD PAGE === */
+body.upload-page {
+ height: 100vh;
+ background: linear-gradient(45deg, #fceabb 0%, #ffdde1 100%);
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+.container {
+ background: rgba(255,255,255,0.88);
+ padding: 2.3rem 2.2rem 2rem 2.2rem;
+ border-radius: 2rem;
+ box-shadow: 0 3px 33px -10px #cc73b3, 0 2px 9px #fec1ee;
+ text-align: center;
+ max-width: 420px;
+ width: 100%;
+}
+
+.container h1 {
+ font-family: 'Montserrat', sans-serif;
+ font-size: 1.7rem;
+ margin-bottom: .7rem;
+ color: #ee1ec7;
+ letter-spacing: 1px;
+}
+
+.warning {
+ font-size: 0.92rem;
+ margin-bottom: 1rem;
+ color: #aa0000;
+}
+
+input[type="file"] {
+ padding: 0.9rem;
+ font-size: 1rem;
+ border-radius: 12px;
+ border: 1.5px solid #dab0f9;
+ margin-bottom: 1.3rem;
+ background: #fff5fe;
+ cursor: pointer;
+}
+
+#submitBtn {
+ margin-top: 1rem;
+ padding: 0.9rem 1.7rem;
+ font-size: 1.05rem;
+ background: linear-gradient(90deg,#e26ee5,#fdc3ee 85%);
+ color: #fff;
+ border: none;
+ border-radius: 13px;
+ box-shadow: 0 2px 12px #ffecf9;
+ cursor: pointer;
+ transition: background 0.2s, transform 0.18s;
+}
+
+#submitBtn:hover,
+#submitBtn:focus {
+ background: linear-gradient(90deg,#fa2eb8 10%,#d86ef5 90%);
+ outline: 2.7px solid #f7a9e3;
+ outline-offset: 3px;
+ transform: scale(1.045);
+}
+
+/* === PROCESSING PAGE === */
+body.processing-page {
+ height: 100vh;
+ margin: 0;
+ background: #080019;
+ color: #fff;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-family: 'Fira Sans', Arial, sans-serif;
+}
+
+.processing-container {
+ text-align: center;
+}
+
+.processing-text {
+ margin-top: 1.4rem;
+ font-size: 1.18rem;
+ color: #ffe9fb;
+ text-shadow: 0 3px 14px #be57e955;
+ font-family: 'Fira Sans', sans-serif;
+ letter-spacing: .15px;
+}
+
+/* SVG circular loader */
+.progress-circle {
+ width: 120px;
+ height: 120px;
+ display: block;
+ margin: 0 auto;
+}
+circle.bg {
+ fill: none;
+ stroke: #372955;
+ stroke-width: 10;
+}
+circle.progress {
+ fill: none;
+ stroke: #e26ee5;
+ stroke-width: 10;
+ stroke-dasharray: 283;
+ stroke-dashoffset: 283;
+ animation: progressAnim 4s linear forwards;
+}
+@keyframes progressAnim {
+ to { stroke-dashoffset: 0; }
+}
+
+/* === OUTPUT PAGE === */
+body.output-page {
+ min-height: 100vh;
+ margin: 0;
+ background: linear-gradient(135deg, #fceabb 0%, #ffdde1 100%);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-family: 'Fira Sans', Arial, sans-serif;
+}
+
+.output-overlay {
+ background: rgba(30,20,40,0.88);
+ color: #fff;
+ padding: 2.5rem 2rem 2rem 2rem;
+ border-radius: 2rem;
+ box-shadow: 0 4px 32px 0 rgba(100,30,120,0.16), 0 1.5px 6px #f7a9e3;
+ text-align: center;
+ max-width: 370px;
+ width: 90vw;
+ position: relative;
+ animation: fade-in 1s cubic-bezier(0.5,1.5,0.5,1);
+ margin: 0;
+}
+
+@keyframes fade-in {
+ from { opacity: 0; transform: scale(0.91);}
+ to { opacity: 1; transform: scale(1);}
+}
+
+#userFace {
+ width: 140px;
+ height: 140px;
+ border-radius: 50%;
+ object-fit: cover;
+ box-shadow: 0 0 30px #ffb8e7, 0 0 0 8px #fff8fa;
+ margin-bottom: 1.7rem;
+ border: 2.5px solid #ff98b5;
+ background
diff --git a/upload.html b/upload.html
new file mode 100644
index 000000000..7358bb7cc
--- /dev/null
+++ b/upload.html
@@ -0,0 +1,43 @@
+
+
+
+
+
+ Face to Fruit
+
+
+
+
+
🍌 Find Your Inner Fruit 🍓
+
Max file size: 10MB | Face only plz 😬
+
+
+
+
+
+
+
+